]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/commitdiff
Merge remote-tracking branch 'origin/next' into install-raid
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 20 Aug 2014 19:46:49 +0000 (21:46 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 20 Aug 2014 19:46:49 +0000 (21:46 +0200)
261 files changed:
config/dracut/dracut.conf [new file with mode: 0644]
config/etc/fstab
config/grub/grub.conf [deleted file]
config/grub/ipfire.xpm.gz [deleted file]
config/grub2/default [new file with mode: 0644]
config/install/fstab [deleted file]
config/install/group [deleted file]
config/install/halt [deleted file]
config/install/hosts [deleted file]
config/install/nsswitch.conf [deleted file]
config/install/passwd [deleted file]
config/install/profile [deleted file]
config/install/rc_installer [deleted file]
config/install/shells [deleted file]
config/rootfiles/common/armv5tel/dracut [deleted file]
config/rootfiles/common/armv5tel/initscripts
config/rootfiles/common/armv5tel/linux-kirkwood
config/rootfiles/common/armv5tel/linux-multi
config/rootfiles/common/armv5tel/linux-rpi
config/rootfiles/common/bash
config/rootfiles/common/cmake
config/rootfiles/common/coreutils
config/rootfiles/common/dracut [new file with mode: 0644]
config/rootfiles/common/hostname
config/rootfiles/common/i586/dracut [deleted file]
config/rootfiles/common/i586/grub
config/rootfiles/common/i586/initscripts
config/rootfiles/common/i586/linux
config/rootfiles/common/installer [new file with mode: 0644]
config/rootfiles/common/libcap
config/rootfiles/common/libsmooth [new file with mode: 0644]
config/rootfiles/common/mdadm [moved from config/rootfiles/packages/mdadm with 55% similarity]
config/rootfiles/common/mktemp [deleted file]
config/rootfiles/common/newt
config/rootfiles/common/parted [moved from config/rootfiles/packages/parted with 84% similarity]
config/rootfiles/common/patch
config/rootfiles/common/readline
config/rootfiles/common/setup
config/rootfiles/common/slang
config/rootfiles/installer/coreutils [deleted symlink]
config/rootfiles/installer/dhcpcd [deleted symlink]
config/rootfiles/installer/e2fsprogs [deleted symlink]
config/rootfiles/installer/files [deleted file]
config/rootfiles/installer/findutils [deleted symlink]
config/rootfiles/installer/gawk [deleted symlink]
config/rootfiles/installer/glibc [deleted symlink]
config/rootfiles/installer/grep [deleted symlink]
config/rootfiles/installer/gzip [deleted symlink]
config/rootfiles/installer/hwdata [deleted symlink]
config/rootfiles/installer/iproute2 [deleted symlink]
config/rootfiles/installer/kbd [deleted symlink]
config/rootfiles/installer/libidn [deleted symlink]
config/rootfiles/installer/libusb [deleted symlink]
config/rootfiles/installer/misc-progs [deleted file]
config/rootfiles/installer/ncurses [deleted symlink]
config/rootfiles/installer/newt [deleted symlink]
config/rootfiles/installer/openssl [deleted symlink]
config/rootfiles/installer/parted [deleted symlink]
config/rootfiles/installer/pciutils [deleted symlink]
config/rootfiles/installer/pcmciautils [deleted symlink]
config/rootfiles/installer/pcre [deleted symlink]
config/rootfiles/installer/popt [deleted symlink]
config/rootfiles/installer/reboot [deleted file]
config/rootfiles/installer/reiserfsprogs [deleted symlink]
config/rootfiles/installer/sed [deleted symlink]
config/rootfiles/installer/slang [deleted symlink]
config/rootfiles/installer/sysfsutils [deleted symlink]
config/rootfiles/installer/tar [deleted symlink]
config/rootfiles/installer/usbutils [deleted symlink]
config/rootfiles/installer/util-linux [deleted symlink]
config/rootfiles/installer/vim [deleted symlink]
config/rootfiles/installer/wget [deleted symlink]
config/rootfiles/installer/xz [deleted symlink]
config/rootfiles/installer/zlib [deleted symlink]
config/rootfiles/packages/linux-pae
langs/de/install/lang_de.c
langs/en/install/lang_en.c
langs/es/install/lang_es.c
langs/fr/install/lang_fr.c
langs/nl/install/lang_nl.c
langs/pl/install/lang_pl.c
langs/ru/install/lang_ru.c
langs/tr/install/lang_tr.c
lfs/bash
lfs/cdrom
lfs/coreutils
lfs/dracut
lfs/grub
lfs/initrd [deleted file]
lfs/installer
lfs/libsmooth [moved from lfs/mktemp with 70% similarity]
lfs/linux
lfs/mdadm
lfs/misc-progs
lfs/newt
lfs/parted
lfs/patch
lfs/readline
lfs/setup
lfs/slang
make.sh
src/dracut/dracut.conf [deleted file]
src/dracut/switch_root.c [deleted file]
src/initscripts/init.d/firstsetup
src/install+setup/install/config.c [deleted file]
src/install+setup/install/install.h [deleted file]
src/install+setup/install/main.c [deleted file]
src/install+setup/install/mountsource.sh [deleted file]
src/install+setup/libsmooth/langs.h.temp [deleted file]
src/install+setup/libsmooth/libsmooth.h [deleted file]
src/install+setup/libsmooth/makelangs.pl [deleted file]
src/install+setup/setup/setup.h [deleted file]
src/installer/Makefile [moved from src/install+setup/install/Makefile with 92% similarity]
src/installer/Makefile.am [new file with mode: 0644]
src/installer/autogen.sh [new file with mode: 0755]
src/installer/configure.ac [new file with mode: 0644]
src/installer/downloadsource.sh [moved from src/install+setup/install/downloadsource.sh with 90% similarity]
src/installer/dracut-module/70-dhcpcd.exe [new file with mode: 0755]
src/installer/dracut-module/fake-root.sh [new file with mode: 0644]
src/installer/dracut-module/module-setup.sh [new file with mode: 0755]
src/installer/dracut-module/run-installer.sh [new file with mode: 0644]
src/installer/hw.c [new file with mode: 0644]
src/installer/hw.h [new file with mode: 0644]
src/installer/install.h [new file with mode: 0644]
src/installer/m4/attributes.m4 [new file with mode: 0644]
src/installer/main.c [new file with mode: 0644]
src/installer/mountdest.sh [moved from src/install+setup/install/mountdest.sh with 100% similarity]
src/installer/po/LINGUAS [new file with mode: 0644]
src/installer/po/Makevars [new file with mode: 0644]
src/installer/po/POTFILES.in [new file with mode: 0644]
src/installer/po/de.po [new file with mode: 0644]
src/installer/unattended.c [moved from src/install+setup/install/unattended.c with 94% similarity]
src/libsmooth/Makefile [moved from src/install+setup/libsmooth/Makefile with 100% similarity]
src/libsmooth/Makefile.am [new file with mode: 0644]
src/libsmooth/autogen.sh [new file with mode: 0755]
src/libsmooth/configure.ac [new file with mode: 0644]
src/libsmooth/libsmooth.h [new file with mode: 0644]
src/libsmooth/libsmooth.pc.in [new file with mode: 0644]
src/libsmooth/m4/attributes.m4 [new file with mode: 0644]
src/libsmooth/main.c [moved from src/install+setup/libsmooth/main.c with 58% similarity]
src/libsmooth/varval.c [moved from src/install+setup/libsmooth/varval.c with 100% similarity]
src/misc-progs/Makefile
src/patches/bash-3.2-ssh_source_bash.patch
src/patches/bash-4.0-paths-1.patch
src/patches/bash/bash32-001 [deleted file]
src/patches/bash/bash32-002 [deleted file]
src/patches/bash/bash32-003 [deleted file]
src/patches/bash/bash32-004 [deleted file]
src/patches/bash/bash32-005 [deleted file]
src/patches/bash/bash32-006 [deleted file]
src/patches/bash/bash32-007 [deleted file]
src/patches/bash/bash32-008 [deleted file]
src/patches/bash/bash32-009 [deleted file]
src/patches/bash/bash32-010 [deleted file]
src/patches/bash/bash32-011 [deleted file]
src/patches/bash/bash32-012 [deleted file]
src/patches/bash/bash32-013 [deleted file]
src/patches/bash/bash32-014 [deleted file]
src/patches/bash/bash32-015 [deleted file]
src/patches/bash/bash32-016 [deleted file]
src/patches/bash/bash32-017 [deleted file]
src/patches/bash/bash32-018 [deleted file]
src/patches/bash/bash32-019 [deleted file]
src/patches/bash/bash32-020 [deleted file]
src/patches/bash/bash32-021 [deleted file]
src/patches/bash/bash32-022 [deleted file]
src/patches/bash/bash32-023 [deleted file]
src/patches/bash/bash32-024 [deleted file]
src/patches/bash/bash32-025 [deleted file]
src/patches/bash/bash32-026 [deleted file]
src/patches/bash/bash32-027 [deleted file]
src/patches/bash/bash32-028 [deleted file]
src/patches/bash/bash32-029 [deleted file]
src/patches/bash/bash32-030 [deleted file]
src/patches/bash/bash32-031 [deleted file]
src/patches/bash/bash32-032 [deleted file]
src/patches/bash/bash32-033 [deleted file]
src/patches/bash/bash32-034 [deleted file]
src/patches/bash/bash32-035 [deleted file]
src/patches/bash/bash32-036 [deleted file]
src/patches/bash/bash32-037 [deleted file]
src/patches/bash/bash32-038 [deleted file]
src/patches/bash/bash32-039 [deleted file]
src/patches/bash/bash32-040 [deleted file]
src/patches/bash/bash32-041 [deleted file]
src/patches/bash/bash32-042 [deleted file]
src/patches/bash/bash32-043 [deleted file]
src/patches/bash/bash32-044 [deleted file]
src/patches/bash/bash32-045 [deleted file]
src/patches/bash/bash32-046 [deleted file]
src/patches/bash/bash32-047 [deleted file]
src/patches/bash/bash32-048 [deleted file]
src/patches/bash/bash32-049 [deleted file]
src/patches/bash/bash32-050 [deleted file]
src/patches/bash/bash32-051 [deleted file]
src/patches/bash/bash43-001 [new file with mode: 0644]
src/patches/bash/bash43-002 [new file with mode: 0644]
src/patches/bash/bash43-003 [new file with mode: 0644]
src/patches/bash/bash43-004 [new file with mode: 0644]
src/patches/bash/bash43-005 [new file with mode: 0644]
src/patches/bash/bash43-006 [new file with mode: 0644]
src/patches/bash/bash43-007 [new file with mode: 0644]
src/patches/bash/bash43-008 [new file with mode: 0644]
src/patches/bash/bash43-009 [new file with mode: 0644]
src/patches/bash/bash43-010 [new file with mode: 0644]
src/patches/bash/bash43-011 [new file with mode: 0644]
src/patches/bash/bash43-012 [new file with mode: 0644]
src/patches/bash/bash43-013 [new file with mode: 0644]
src/patches/bash/bash43-014 [new file with mode: 0644]
src/patches/bash/bash43-015 [new file with mode: 0644]
src/patches/bash/bash43-016 [new file with mode: 0644]
src/patches/bash/bash43-017 [new file with mode: 0644]
src/patches/bash/bash43-018 [new file with mode: 0644]
src/patches/coreutils-5.96-futimes.patch [deleted file]
src/patches/coreutils-5.96-i18n-1.patch [deleted file]
src/patches/coreutils-5.96-rename-tee.patch [deleted file]
src/patches/coreutils-5.96-suppress_uptime_kill_su-1.patch [deleted file]
src/patches/coreutils-5.96-uname-1.patch [deleted file]
src/patches/dracut-006_add_run_dir.patch [deleted file]
src/patches/dracut-006_lzma.patch [deleted file]
src/patches/dracut-006_remove_cdrom_wait.patch [deleted file]
src/patches/dracut-006_remove_scsi_wait.patch [deleted file]
src/patches/dracut-init_start_ipfireinstaller.patch [deleted file]
src/patches/mdadm-3.3.1-Assemble-Only-fail-auto-assemble-in-face-of-mdadm.co.patch [new file with mode: 0644]
src/patches/mktemp-1.5-add_tempfile-3.patch [deleted file]
src/patches/newt-0.51.6-if1close.patch [deleted file]
src/patches/readline/readline62-001 [deleted file]
src/patches/readline/readline62-002 [deleted file]
src/patches/readline/readline62-003 [deleted file]
src/patches/readline/readline62-004 [deleted file]
src/patches/readline/readline63-001 [new file with mode: 0644]
src/patches/readline/readline63-002 [new file with mode: 0644]
src/patches/readline/readline63-003 [new file with mode: 0644]
src/patches/readline/readline63-004 [new file with mode: 0644]
src/patches/readline/readline63-005 [new file with mode: 0644]
src/patches/readline/readline63-006 [new file with mode: 0644]
src/patches/slang-1.4.5-utf8-segv.patch [deleted file]
src/patches/slang-debian-utf8.patch [deleted file]
src/patches/slang-utf8-acs.patch [deleted file]
src/patches/slang-utf8-fix.patch [deleted file]
src/setup/Makefile [moved from src/install+setup/setup/Makefile with 96% similarity]
src/setup/Makefile.am [new file with mode: 0644]
src/setup/autogen.sh [new file with mode: 0755]
src/setup/configure.ac [new file with mode: 0644]
src/setup/dhcp.c [moved from src/install+setup/setup/dhcp.c with 78% similarity]
src/setup/domainname.c [moved from src/install+setup/setup/domainname.c with 73% similarity]
src/setup/hostname.c [moved from src/install+setup/setup/hostname.c with 76% similarity]
src/setup/keymap.c [moved from src/install+setup/setup/keymap.c with 90% similarity]
src/setup/m4/attributes.m4 [new file with mode: 0644]
src/setup/main.c [moved from src/install+setup/setup/main.c with 75% similarity]
src/setup/misc.c [moved from src/install+setup/setup/misc.c with 81% similarity]
src/setup/netstuff.c [moved from src/install+setup/libsmooth/netstuff.c with 88% similarity]
src/setup/networking.c [moved from src/install+setup/setup/networking.c with 71% similarity]
src/setup/passwords.c [moved from src/install+setup/setup/passwords.c with 66% similarity]
src/setup/po/LINGUAS [new file with mode: 0644]
src/setup/po/Makevars [new file with mode: 0644]
src/setup/po/POTFILES.in [new file with mode: 0644]
src/setup/po/de.po [new file with mode: 0644]
src/setup/probenic.sh [moved from src/install+setup/install/probenic.sh with 100% similarity]
src/setup/setup.h [new file with mode: 0644]
src/setup/timezone.c [moved from src/install+setup/setup/timezone.c with 90% similarity]

diff --git a/config/dracut/dracut.conf b/config/dracut/dracut.conf
new file mode 100644 (file)
index 0000000..34e6a66
--- /dev/null
@@ -0,0 +1,51 @@
+# PUT YOUR CONFIG HERE OR IN separate files named *.conf
+# in /etc/dracut.conf.d
+# SEE man dracut.conf(5)
+
+# Sample dracut config file
+
+#logfile=/var/log/dracut.log
+#fileloglvl=6
+
+# Exact list of dracut modules to use.  Modules not listed here are not going
+# to be included.  If you only want to add some optional modules use
+# add_dracutmodules option instead.
+#dracutmodules+=""
+
+# dracut modules to omit
+#omit_dracutmodules+=""
+
+# dracut modules to add to the default
+#add_dracutmodules+=""
+
+# additional kernel modules to the default
+#add_drivers+=""
+
+# list of kernel filesystem modules to be included in the generic initramfs
+filesystems+="reiserfs vfat xfs"
+
+# build initrd only to boot current hardware
+#hostonly="yes"
+#
+
+# install local /etc/mdadm.conf
+#mdadmconf="no"
+
+# install local /etc/lvm/lvm.conf
+#lvmconf="no"
+
+# A list of fsck tools to install. If it's not specified, module's hardcoded
+# default is used, currently: "umount mount /sbin/fsck* xfs_db xfs_check
+# xfs_repair e2fsck jfs_fsck reiserfsck btrfsck". The installation is
+# opportunistic, so non-existing tools are just ignored.
+#fscks=""
+
+# inhibit installation of any fsck tools
+#nofscks="yes"
+
+# mount / and /usr read-only by default
+#ro_mnt="no"
+
+# set the directory for temporary files
+# default: /var/tmp
+#tmpdir=/tmp
index 0cd30ebe9b604d3bab63cbdde753a20f23e52eee..775f619b04e04e931821600a62094886827b37a5 100644 (file)
@@ -1,9 +1,9 @@
 #
 # file system  mount-point  type     options         dump  fsck
 #                                                        order
-DEVICE1        /boot   ext2    defaults        1       2
+DEVICE1        /boot   auto    defaults        1       2
 DEVICE2         swap   swap    pri=1   0       0
-DEVICE3        /       FSTYPE  defaults        1       1
-DEVICE4        /var    FSTYPE  defaults        1       1
+DEVICE3        /       auto    defaults        1       1
+DEVICE4        /var    auto    defaults        1       1
 none   /var/log/rrd    tmpfs   defaults,size=64M       0       0
 none   /var/lock       tmpfs   defaults,size=8M        0       0
diff --git a/config/grub/grub.conf b/config/grub/grub.conf
deleted file mode 100644 (file)
index 2199bf1..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-timeout 10
-default saved
-foreground = 6d6963
-background = ffffff
-#hiddenmenu
-# *** If you want use serial console comment next line
-splashimage (hd0,0)/grub/ipfire.xpm.gz
-# *** add "console=ttyS0,115200n8" to kernel cmdline,
-# *** uncomment following lines and check also inittab
-#serial --unit=0 --speed=115200
-#terminal --timeout=1 serial console
-title IPFire
-  root (hd0,0)
-  kernel /vmlinuz-KVER-ipfire root=ROOT panic=10 MOUNT
-  initrd /ipfirerd-KVER.img
-  savedefault 0
-title IPFire (vesafb 1024x768)
-  root (hd0,0)
-  kernel /vmlinuz-KVER-ipfire root=ROOT panic=10 vga=791 MOUNT
-  initrd /ipfirerd-KVER.img
-  savedefault 1
diff --git a/config/grub/ipfire.xpm.gz b/config/grub/ipfire.xpm.gz
deleted file mode 100644 (file)
index ff94776..0000000
+++ /dev/null
@@ -1,497 +0,0 @@
-/* XPM */
-static char * Bootsplash_xpm[] = {
-"640 480 14 1",
-".     c #030303",
-"+     c #171717",
-"@     c #272727",
-"#     c #383838",
-"$     c #4A4A4A",
-"%     c #575757",
-"&     c #6F6F6F",
-"*     c #888888",
-"=     c #989898",
-"-     c #A8A8A8",
-";     c #B8B8B8",
-">     c #C7C7C7",
-",     c #D7D7D7",
-"'     c #E7E7E7",
-">;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>>;>>;>>;>>>;>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>,>>,>>,>,>>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,,>,,>,,>,,>,,,>,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,',,',,',,',',,',',,',',',',',',',',',',',',',',',','','','','','',''',''',''','",
-";>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>;>;>>;;>>>;>>;;>>>;;>;>;>;>;>;>;>;>;>>;>>;>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>,>>,>,>,>,>,>,>,>,>,>,,>,,>,,>,>>,>>,>>,>>,>,>,>>,>,>,>,>>,>,>,>,>,>,>,>,>,>,,>,,>,,>,,>,>,,>,,>,,>,,>,,,>,,,>,,,>,,,>,>,>,>,>,>,>,,>,,>,,>,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,',,',,',',',',',',',',','','','',',,',,',,',,',',',,',',',',,',',',',',',',',','','','','',','','','','',''',''',''','''",
-">>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>>>;;>;>>>;>>;>>>;>;>;>>>;>;>>>>>;>>>;>>>;>>>>>>>;>>>>>;>>>;>>;>>;>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>,>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>,>>>,>,>,>>,>,>>,>>>,,>>,>>,>,,>>,>,>,>,>,>,>,>,,>,>,>,>,>,>,,,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,,,,>,,,,,>,,>,,,,,,,,,,,,,,,>,,>,,>,,>,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,',,',,',,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,',,,',',',,',',,',,,'',,',,','',,',',',',',',','',',',',',',','',',',',',',',',',',',',',''",
-";>>;>;>;>>>;>>;>>;>>>;>>;>>;>>>;>>;>>;>>>;>>;>>;>>>;>>;>>;>>>;>>;>>;>>>;>>;>>;>>>;>>;>>;>>>;>>;>>;>>>;>>;>>;>>>;>>;>>;>>>;>>;>>;>>>;>>;>>;>>>;>>;>>;>>>;>;;>>>>>;;>>;;>;>;>>>;>>>;>>>;>;>>>;>>>;>>>;>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>,>>,>,>,>,>,>,>,>>,>>>,>,>>>,>>>>,>,>>,>,>>,>,>>,,>,>>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>>,,>,,,>,,,>,,,>,,,,,,,,,,,,,>,>,,,,,>,,,,,,,,>,>,,>,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,',,',,',',',',',',',,',,,',',,,',,,,',',,',',,',',,'',',,',,',',',',',',',',',',',',',',','',''',''',''',''''''''''''','",
-";>;>>;>>;;>;>;>;>;;;>;>;>;>;;;>;>;>;>;;;>;>;>;>;;;>;>;>;>;;;>;>;>;>;;;>;>;>;>;;;>;>;>;>;;;>;>;>;>;;;>;>;>;>;;;>;>;>;>;;;>;>;>;>;;;>;>;>;>;;;>;>;>;>;;;>;>>;>;;;>>;>;>>>;>>;>>>;;>>;>>>>;>;>>;>>>;>>>>>>;>;>>>;>;>>;>>>;>>>;>>>;>>>>>;>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>,>>,>>>>>,>>>>>,>>>>>>>>>>>>>>,>>,>>>>,>,>>,,>>,>>,>>>,>,>,>,>>,>,,>>,>,>,>,>,>,>,>,>,>,>,,,>,>,,>,,,,>,,>>,,>,>,>,,,>,>>,>,>,>>,,,,,>,>,,,>,>,,>,,,,,,,,,,,,,,,,,,>,,,,,>,,,,,,,,,>,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,',,',,,,,',,,,,',,,,,,,,,,,,,,',,',,,,',',,'',,',,',,,',',',',,','',,',',',',',',',',',',''',','','',',',,'',,'',','',',',',',','''",
-";>;>;>;;>>;>;>;>;>>>;>;>;>;>>>;>;>;>;>>>;>;>;>;>>>;>;>;>;>>>;>;>;>;>>>;>;>;>;>>>;>;>;>;>>>;>;>;>;>>>;>;>;>;>>>;>;>;>;>>>;>;>;>;>>>;>;>;>;>>>;>;>;>;>>>;>;>;>>>>>;>>;>;>>;>;>;>>>>;>;>;>>>>>>>>;>>>;>;>>>>>>>>>>>>>>;>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>,>>>>>>>>>,>>,>>,>>>>>>>,>>>>>>,>>>,>,>,>,>,>,>,>>>,>,>,>>>>,>>>,>>,>>,>,>>>,>,>,>>,>>,,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>>,>,>,,,>>,,,>,>,>,,,,>,>,,,,,,>,>,,,,>,,,,,,,>,,,>,>,,>,,>,,>,,,,,>,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,',,,,,,,,,',,',,',,,,,,,',,,,,,',,,',',',',',',',,,',',',,,,',,,',,',,'',,',,,',',,',,'',',',',',',',',',',',,'',',',',','''',''',,''',','','','','','",
-";>;>;>>;;>;>;>;>>;;>;>;>;>>;;>;>;>;>>;;>;>;>;>>;;>;>;>;>>;;>;>;>;>>;;>;>;>;>>;;>;>;>;>>;;>;>;>;>>;;>;>;>;>>;;>;>;>;>>;;>;>;>;>>;;>;>;>;>>;;>;>;>;>>;;>;>>>;;>;;>;>;>>;>>;>>>;>;>;>>>>>;>;>;>;>>>;>>>>>;>>;>;>>;>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>,>>>>>>>>>>>>>>>>>>>,>>>>>>,>,>>,>,>,>,>,>,>>,>,>>,>>,>,>,>>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,,>,>,,>,,,,>>,,,>,,>,>,,,,>,>,>,,,,,>,,>,>,>,,,,,>,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,',,,,,,,,,,,,,,,,,,,',,,,,,',',,',',',',',,,',,'',',,',',',,,',',',',',',',','','',',','',''',,'',',''','','','','','','''",
-">;>;>>;>>;>;>;>;;>>;>;>;>;;>>;>;>;>;;>>;>;>;>;;>>;>;>;>;;>>;>;>;>;;>>;>;>;>;;>>;>;>;>;;>>;>;>;>;;>>;>;>;>;;>>;>;>;>;;>>;>;>;>;;>>;>;>;>;;>>;>;>;>;;>>;>;;>>;>>>;>;>>;>;>>;>;>>>;>>;>;>>;>>>>>>;>>;>>;>>>>>>>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>,>>>,>>>>>>>>>,>,>,>,>,>,>,>,>>,>,>,>,>>>,>>>>,>>>,>>,>,>>,>,>,,>,>,>,>,>,>,>,>,>,>,>,>,,,>,>,>,>,>,>,,,>,>,>>,,>,>,,>,,,,>,>,>,,,,,>,>,,>,,,,,,,,>,,,,,>,,>,>,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,',,,',,,,,,,,,',',',',',',',',,',',',',,,',,',,,',,,',',',,,','',',',',',,',',',',',',',',',','',','',,''',','',',',''''','','',''','",
-">;>;;>;>;>>;>>;>>;>;>>>;>>;>;>>;>>;>>;>;>>>;>>;>;>>;>>;>>;>;>>>;>>;>;>>;>>;>>;>;>>>;>>;>;>>;>>;>>;>;>>>;>>;>;>>;>>;>>;>;>>>;>>;>;>>;>>;>>;>;>>>;>>;>;>>>;>>;>;>>>;>;>>;>>>>>;>>>;>;>>>>>>;>;>>;>>>>>>>;>>;>>;>>>>;>>;>>>;>>>>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>,>,>,>>>>>>>>>>>>>>>>>>,>>>,>>>,>,>>,>,>,>,>>,>>>,>>,>,>>>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,>,>,,,,>,,,>,,,,>,>,,,>,,>,>,,,,,>,,,>,>,>,,,,>,,,,,,,,,,>,,,,,,,,,,,,,>,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,',',',,,,,,,,,,,,,,,,,,',,,',,,',',,',,'',,'',,',,',',',,,',,',','',',',',',',','','','',',',','',,'''',','','',,''','','',''''",
-";>;>>;>;>;>;>;>;;>;>;;>;>;>;>;>;>;>;;>;>;;>;>;>;>;>;>;>;;>;>;;>;>;>;>;>;>;>;;>;>;;>;>;>;>;>;>;>;;>;>;;>;>;>;>;>;>;>;;>;>;;>;>;>;>;>;>;>;;>;>;>;>;;>>;;>;>;>;>>;;>;>>;>>;;>;>>;;>>>>;>;>;>>>>;>>>>;>;>>>;>>>>>;>>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>>>>>>,>>,>>>>>>>>,>>,>,>,>,>,>,>,>>,>,>>,>>>>,>>,>>>,>,>>,,>,>,>>>,,>,>,>>,>>,>,>,>,>,>,>,>,>,>,,>,>,,>,>,>,,,>,>,,>>,,>>,>,,,,>,,,>,,,,>,>,,,>,,,,,,,>,,,,,>,,>,,,,,,,,>,,>,,,>,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,,,,,,,,,',,',,,,,,,,',,',',',',',',',,',',,',,,,',,',,,',,,,',,',',,,'',',',,',,',',',',',',',',',,',,','','',''',,',''','','''','',''''',','",
-">>;;>;>;>;>;>;>>;>;>>;>;>;>;>;>;>;>>;>;>>;>;>;>;>;>;>;>>;>;>>;>;>;>;>;>;>;>>;>;>>;>;>;>;>;>;>;>>;>;>>;>;>;>;>;>;>;>>;>;>>;>;>;>;>;>;>;>>;>>;;>;>>;;>>;>>>;>>;>>>;>;>>;>>>>;>>>>;;>>>>>>>;>;>>>;>>>>>>;>>>>;>>>>;>>>>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>,>>>,>>>>>>>>>>>>>,>>>,>>>>>>>>>>>>>>>>>>,>>>>,>>,>,>>,>>,,>>>,>,>>>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,,,>>,>,>,,,,>,,,,,>,>,,>,,,>,>,,,,,>,,,>,>,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,',,,',,,,,,,,,,,,,',,,',,,,,,,,,,,,,,,,,,',,,,',,',',,',,'',,'',',',,,''',,',',',',',',',',',',',',',''',''',',','',','',',,'','',','','',',,'''''",
-";>>>;>;>;>;>;>;>;>>;;>;>;>;>;>;>;>;>;>>;;>;>;>;>;>;>;>;>;>>;;>;>;>;>;>;>;>;>;>>;;>;>;>;>;>;>;>;>;>>;;>;>;>;>;>;>;>;>;>>;;>;>;>;>;>;>;>>;>;;>>;>;>>;>;>;;>;>;>;;>>;>;>>>;;>>;>;>>;>;>;>;>>>>>;>>;>>;>>>>>;>>>;>>>>;>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>,>>,>>>,>>,>>>,>>>>,>,>,>,>,>,>,>,>>>>,>,>>,>>>,>>,>>>,,>>,>>,>>>,>,>,>>>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>>,,,,,,>,>>,,>,>,>,,,>,,>,>,,,,>,>,,,>,,,,,,>,,,>,,>,>,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,',,',,,',,',,,',,,',,',',',',',',',,,,',',,',,,',,',,,',,,',,,'',,,',',,,',',',',',',',',',',',',,'',,','',',',''',''',','',''',''',''''',','",
-";;;>;>;>;>;>;>;>>;>>;>;>>>;>;>;>;>;>>;>>;>;>>>;>;>;>;>;>>;>>;>;>>>;>;>;>;>;>>;>>;>;>>>;>;>;>;>;>>;>>;>;>>>;>;>;>;>;>>;>>;>;>>>;>;>;>;;>;>>;>;>>;;>;>;>>>;>>;>>>;>;>>;;>>>;>>>;>>>>>>;>>;>;>>>;>>>>>;>>;>>>>>>>>>>>>>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>,>,>>>>,>>,>>,>>,>,>>>,>>,>,>,>,>,>,>,>,>>>,>,>,>,>,>,>,>,>,,>,>,>,>,,,>,,,>>,>>,,>,,>,,,>,,>,,,>,,,,>,>,,,,>,,,>,>,,,,,>,,,,,,,,>,,,,,,>,,>,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',',,,,',,',,',,,'',,'',,'',,,'',,','',',,,',',',',',',',','''',,'',',,''','',,'',''',','','',','',',''''''",
-">>;>>;>>;>>;>>;;>;>;>;>;;>>;>;>;>>;;>;>;>;>;;>>;>;>;>>;;>;>;>;>;;>>;>;>;>>;;>;>;>;>;;>>;>;>;>>;;>;>;>;>;;>>;>;>;>>;;>;>;>;>;>;>;>>>;>>;>;;>>;;>>>;>;>;;>>;>>;;>>;>;>>>>;>>;;>>;>;;>>>>;>>>>;>>;>;>>>>>>>;>>;>;>>>;>>>>>>>>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>,>>,>>,>>>>,>>>,>,>,>,>,>,>>>>,>,>>,>,>>,>>,>>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>>,>,>,,>,,,>,,>,>,>,,>,>,>,,>,>,,,,,,>,,,>,,,,,,>,,,,,>,,>,,,,,,>,,,,,,,,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,',,',',,',,',',,',',',',',',,,,',',,',,',,,',,,',,,',,,',',,',,',,',',',',',',',',',',',,','','','',,'','''',',,'''','',''''',''',',','",
-";>>;>;>;>;>;>;>>;>;>>;>>;;>;>>>;;>>;>;>;>;>>;;>>;>>;>;>>;>;>>;>>;;>;>>>;;>>;>;>;>;>>;;>>;>>;>;>>;>;>>;>>;;>;>>>;;>>;>;>;>>;;>;>>;;>;>;>>>;;>>;;;>;>>>>;>;>;>>>;>;>>;>;>>;>>>;>>>>>;>;>>>;>>;>>>>>>;>;>>>>;>>>>>>>>>;>>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>,>>>>>>>>,>>>>>>>>>>>,>>>>>>>>>>>>,>,>>>,>>>>>,>>,>>,>,>>>,>,>>,>>>,>>,>>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,,>,,>,>,>,,>,,>,,,>,,,,,,>,,>,,>,>,>,,,>,,,>,>,,,,>,,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',',,,',,,',,',','',,'',,'',,',','',',,',',',',',',',',',','',',',',',','','',,','''',,''','',',,'',''''''''",
-">;;>;>;>;>;>;>;;>;>;;>;;>>;>;;>>;>;>;>;>;>;>>;;>>;;>;>;;>;>;;>;;>>;>;;>>;>;>;>;>;>;>>;;>>;;>;>;;>;>;;>;;>>;>;;>>;>;>;>;>;;>>;>;;>>;>;>;;>>;>;>>>;>;>;>;>>;>;>;>>;>;>>>;>>;>;>>;>;>>>>>;>>;>>>;>>;>>>>;>>>>>>>>;>>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>,>>>,>>>>>>,>>>,>>>>>,>,>,>>,>>>,>,>,>,>,>,>>>>,>>,>,>,>>>>,>,>>>,>,>>>>,>,>,>,>,>,>,>>>,>,>,>,>,>,>,>,>,>>,,>,>,>,,>,,>,,>,>,>,>,>,,>,>,>,,>,,>,,,,,,,>,,,>,,,,,>,,,,,>,,>,>,,,,,>,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,,,',,,',,',',',,',,,,,',',',',',,,,',,',',,',,,',,,',,,',,',',,',,,',',,',,,',',',',',',','',',',',',','',',''','',,''',,''',''''''',',',','",
-">>;>;>;>;>;>;>>;>;>>;>>>;>;>>;;>;>;>;>;>>;>;>>;;>>;>;>>;>;>>;>>>;>;>>;;>;>;>;>;>>;>;>>;;>>;>;>>;>;>>;>>>;>;>>;;>;>;>;>;>>;>;>>>;;>;>;>>;;>;>;>;>;>;>;>>;>;>>;>;>>>;>;>>;>>>>;>;>>;>;>>>>>>;>>>>>>>>>>>>;>;>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>>>>>>>,>>>,>>>>>>>>>>>>,>,>>,>>>,>>,>,>>>,>,>,>,>,,>>,>,>>,>,>,>,>,>,>,>,>,>,>,>,,,>,,>,>,,>,>>,,>,,>,>,,,>,,,>,,,,>,,>,,>,,>,>,>,,,>,,,>,,>,,,>,>,,,,,,,,,,,,,,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,',,,',,,,,',,,,,,,,,,,,,',',,,,,,,,,,',',,',,,,',,',,,'',,'',,',,,',','',,',',''',',',',',',',',,',''','','',','',','',''','''',',',',',,'''''''''",
-";;>>;>>;>;>>;>;>>;>;>;;;>>;>;>>;>;>;>;>;>;>;>;>>;;>>;>;>>;>;>;;;>>;>;>>;>;>;>;>;>;>;>;>>;;>>;>;>>;>;>;;;>>;>;>>;>;>;>;>;;>;>;>;>>;>>;>;>>;>;>;>;>;>;>;>>;>;>>;>;>>;>>;>>>;;>>>>>>>;>>;>;>>>;>;>;>;>>>;>>>>>>>>>>>>>>>;>>>>>;>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>>>>>>,>,>,>,>>,>>>>,>>>,>>>,>>>,>,>,>>>,>>>,>,>>,>,>>,>>,>,>,>,>,>,>,>,>,>,>,,>,>,>>,,,,>,>,>,,,>,>,,>,,>,>,,>,,>,,>,,,,,,,>,,,>,,,,,,,,,,,,>,,>,,,,>,,,,,>,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,',,,',,',,,,,',',',',,,,,',,',',,',',',,,',,,',,'',,',',,',',',,,,',',',',',',','',',',',',',','',',','',,',',',''''',''''',',',','",
-">>;;>;>;>;;>;>;;>;>;>>>;;>;>;>;>>;>;>;>;>;>;>;>;>>;;>>;;>;>;>>>;;>;>;>;>>;>;>;>;>;>;>;>;>>;;>>;;>;>;>>>;;>;>;>;>>;>>;>>>;>;>;>;;>;;>;>;;>;>;>;>;>;>>>;>;>>;;>>;>;>>;>>;;>>>;>;>;>>>>;>>>;>>>>>>>>>;>>>>;>>;>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>,>>>>>,>,>>>,>,>>,>,>>>>>>>>>,>>>,>>,>,>>,>,>>,>,>>>,>,>>,>,>>,,>,>,>,>,>,>,>,>,>,>,>,>,>>,>,>,>,>,,,>>>,,,>,,>>,,>,>,>,,,>,>,,,,>,,,>,>,>,,,>,,,>,>,,,>,,,,,,,,,,>,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,',,,,,,,,,',,,,,,',',,,,,,,,',',,',,,,',,,,,,',',,',,',,,',',,',',',','',',',',',',','',','',',','',''',',''',',''','''',',''',',''''''''''",
-";;>>;>;>;>>;>;>>;>;>;>;>>;>;>;>;;>>>;>;>>;>;>;>;>;>>;;>>;>;>;>;>>;>;>;>;;>>>;>;>>;>;>;>;>;>>;;>>;>;>;>;>>;>;>;>;;>;>;>;;>>;>;>>;>>;>;>>;>>;>;>;>>;>;;>>>;>>>;>;>>;>>;>>>;>;>;>>>;>;>>>;>>;>;>>;>>>>>;>>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>,>,>,>,>>>>,>>,>>,>>,>>>>,>>>,>,>>,>,>>>>,>>>,>,>>,>>>,>,>,>,>,>,>,>,,>,>,>,,,>>>,,,>>,,>,,,>,,,,>,,>,,,,>,>,,,>,,,,,,,>,,,>,,,,,>,,,>,,>,>,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,,,',,',',,,',,',,,,,,',',',,,,',,',',',,',',',,',',',',',',',',',,',,',,',',',',',',',','',,',',',',,','',','','',''',',''',',''',',',',','",
-">;>;>>;>;>;>>;>;>>;>;>;;>;>;>;>>>;;>;>;;>;>;>;>;>;;>>;>;>>;>;>;;>;>;>;>>>;;>;>;;>;>;>;>;>;;>>;>;>>;>;>;;>;>;>;>>;>;>;>>;;>;>;>;>;>;>;>;>;>;>;>;>;>>>>;;>>;;>;>>;>>;>>;>>;>>>>;>>>>;>;>>>>>>>;>>>;>;>>;>>;>>>>>>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>,>>>,>>>>>>>>>>>,>,>>>>,>>>,>>,>,>>,,>,>>,>>>,>,,>,>,>,>,>,>,,>,>,>,>,>,>,>,>>,>,>,,>>,,,,>>,,,>,>,>,,>>,,>,,>,>,,,>,>,,>,>,>,,,,>,,,>,,>,,,>,,,,,,,,>,,,,>,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,,',',',,,,,,',',,,,,,',,',',,,',',,',,',,',,,',',',',',',',',',',',',',,',',''','',''',',''',','',',','',','','',''''''''''''",
-";>;>;;>>;>;>;>;>;;>;>;>>;>;>;>;;;>>;>;>>;>;>;>>;>>;>;>;>;;>;>;>>;>;>;>;;;>>;>;>>;>;>;>>;>>;>;>;>;;>;>;>>;>;>>;>;>;>>;>;>>;>;>;>;>;>;>;>;>;>;>>;>;>;;>>;>;>>>>;>>;>>;>>;>>;>;>>;>;>>>>;>;>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>;>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>>>,>>>>,>>>>>,>>>,>>,>,>,>,>>>>,>,>>>,>>>,>>>,>>>>,>,>,>,>,>>>,>,>>,>,>,>>,>,>,>,>,>,>,>,>,,>,>>,,>>>,,,>>,,>,,>,>,,>,,>,,>,,>,,,,>,,,,,,>,>,,,>,,,,,,,,,,>,,,>,,,,>,,,,>,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,',,',',,,',,',',,,,,,,,,',',,,,,'',',,',,,,',',,,',,',,',,',',,,',',',',',',',',',',','',',',,',',',',''',,'',','',''','''','','',',',',',','",
-";>;>>;>;>>;>;>;>>;>;>>;>;>>>;>>>;;>>;>;>;>;>;>;>;>;>;>;>>;>;>>;>;>>>;>>>;;>>;>;>;>;>;>;>;>;>;>;>>;>;>>;>;>;>;>;>>;;>;>;>;>>;>;>;>>>;>;>;>;>>;>;>;>>;>>;>;>;;>;>>>;>>;>>;>>>;>>>>>;>>>>>>>>;>>>>>>;>>>;>;>>;>;>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>,>>>,>>>>>>,>>,>>>>>>>>,>>>>>,>,>>,>,>>,>>,>,>>>,>>,>>>,>,>>,,>,>>>,>,>>,>,>,>,>,>,>,,>,>,,>,,,,>>>,,,>,,>,,>,>,,>,,>,,>,>,>,,>,,>,>,,,,>,,,>,>,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,,,,,,,,,,,,,,,,,',,,,,,,,',',',',,,,',',,,,,',,,',',,,',',',',',,',',',',',,,',,,',',',',',',',,','''','',',',',,''',''',',','',',''','','''''''''''''",
-">>;>;>;>;;>;>;>;>;>>;;>;>;>;>;;>>;>;>;>>;>>;>;>;>;>;>;>;>;>>;;>;>;>;>;;>>;>;>;>>;>>;>;>;>;>;>>;>;>;>;>>;>;>;>;>;;>>;>;>;>;>>;>;>;;>>;>;>;>;>;>;>>;>;>;>>>;>>>>;;>>>;>>;>>;>>>;>;>>;>;>;>;>>;>>;>>>>;>>>>>>>>>>>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>,>>>>>>>,>,>,>>>,>,>>>,>>,>>>,>>,>>,>,>,>>,>,>,>,>,>>>,>,,>,>>,,>,>,>,>,>,>,>>,>,,>,>>>,,,,>,>,>,,>,,>,>,,>,,>,,,,,,>,,>,,,,,,>,,,>,,,,,,,>,,>,,,,,>,,,,>,,,,>,,,,,,>,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,,,,,',,,,,',,',,,,,,,,,,',,,,,',',',,',,',,',,',,',,,',',,,',',',''',',',',',',',',','',',,',','',','''',',',',''',',''',','''',',',',',',','",
-";>;>;>;>>;>;>;>;>;>;>>>;>;>;>>;;>;>;>;;>;>;>;>>;>;>;>;>;>>;;>>>;>;>;>>;;>;>;>;;>;>;>;>>;>;>;;>;>;>>;>;>;>;>;>;>>;>;>;>;>;>;>;>;>>;;>;>>>;>;>;>;>>;>>;>;;>>;;>;>>;;>>;>>;>;>;>>>>;>>>>>;>>>>>>>>;>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>,>>,>>>>>>,>>,>>,>>>>,>>>,>>>>>>>>,>>,>>>>>>>,>>>>>,>>>,>>,>>>,>>,>>>,>>,>,>>,>>,>,,>,>>>,>,>,>,>,>,>,>,>,>,,,,>>,>,,,,>>>,,,>,,>,>,,>,,>,,>,,>,>,>,,>,,,>,>,,,>,,,>,,>,,,,,,,>,,>,,,>,,,,>,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,',,',,,',,,,,,,,',',',',,,',',,,,',,',,',,',,',,',,',',,',',',',,',,,',',,',',',',',',,'',',',',,','',,'',''',',','''','''',','''','''''''''''",
-">;>;>>;>;>;>;>;>;>;>;;>;>;>;>;>>;>;>;>>;>;>;>;>>;>;>;>;>;;>>;;>;>;>;>;>>;>;>;>>;>;>;>;>>;>;>>;>;>;;>;;>>;>;>>;>;>;>;>;>;>;;>>;>;;>>;>;>;>;>;>;>;>>;>>;>>;>>;>>>>>>;>>;>>;>>>;>;>>>>;>>>>;>>;>>>>;>;>>>>;>>;>>>;>>>>>;>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>,>>>>>>,>,>,>>>,>,>>,>,>>,>,>,>>,>,>,>,>,>>>,>>,>>,>>,>,>,>,>,>,>,>,>,>,>,>,>>>,,,>,>,>>,,,>>,,>,,>,>,,>,,>,,>,,,>,,>,,,>,,,,,>,,,>,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,',,,,,,,,,,,,,,,',,',,',,,,,,,,,',,,,',',,',,',,',,',',',,',',,',',',,',',',',','',',',',',',',',''','''',','',',',',''','',','',',''',',''',',',',','",
-">;>;;>;>;>>>;>;>;>;>>;>;>;>;>;>;>;>>;>;>;>>;>;;>;>>>;>;>>;>;>>;>;>;>>;;>;>>;>;>;>;>;>;;>;>;>;>>;>>;>>>;>;>;;>;>;>;>>;>>;>>;>;>;>>;>;>;>;>;>;>;>;;>;>;>;>;>>;>;;>;>>;>>;>>;>>>>>;>;>>;>;>>;>>;>>>>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>,>>>>>,>,>>>>>>,>>,>>>>>>,>>>>>,>>>,>>>>>>,>>>>>,>>>>,>,>>,>,>,>,>,>,>,>>>,>,>,>,>,>,>,>,,,>>,>,,>,,>,>,,,>,>,,>,,>,>,,,>,,>,,,>,,>,,,>,>,,,>,,,>,>,,,,,,>,>,,>,,,,,,>,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,',,,',,',,',,,,,,,,,,',',',',,,',,,,',,,',,',,',,,',,',',,',,,',,',',',,',,',,',',',',',','',',,',',,',','',''','',,'',','',','','','',''''''''''''",
-";>;>>;>;>;;;>>;>>;>;;>;>;>;>;>;>>;>;>;>;>;;>;>>;>;;;>>;>;>;>;;>;>>;;>>>;>;>>;>;>;>;>;>>;>;>;>;>;>;>;;>;>>;>>;>;>>;>;>;;>;>;>>;>;;>>;>;>>;>;>;>>>>;>>>;>>;>;>>>>>>;>>;>>>;>>;>;>>>>;>>>>>>>>>>;>;>>>>;>>>;>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>>>>>>>>,>>,>>>>>>>,>>,>>>,>,>>>,>>,>,>,>>>,>,>>,,>,>,>,>>,>,>,>>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,>>,,>,>,,>,,>,,>,,>,,>>,,>,>,>,,,,,>,,,>,,,,,,,>,,,,,,,,>,,>,,,,>,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,',,',',,,,,,,,,,',,,',',,',,',,',,,',',',,,',,'',,'',,',,'',',,'',',',',',',',,','',',','',','',',','',',''','''''','',''',',',',',','",
-">;>;>;>;>>>;>;>;>;>>;>;>>;>>;>;;>;>;>;>;>>;>;>;>>>>;>;>;>;>>>;>;;>>;;;>;>;;>;>;>>>;>;>;>>;>;>;>;>;>>;>;;>;>;>>;;>;>;>>;>;>;;>;>>>;>;>;;>;>;>;>;;>>;;>>;>;>>;>;>;>>;>>;;>>;>>>>;>;>>;>;>;>>>>>>>>>;>>>>;>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>>>>>>>,>,>>>>>>>>>,>,>>>>,>>,>>>>>,>>,>>,>>>,>,>,>>,>>>,>>,>>,>>,>>,,,>,>>,>,>>,>,>,>,>,>,>,>,>,>,,>,>,>,,,,,>,,,>,>,>,,>,,>,,>,,,,,,,,,,>,>,,,>,,,>,,>,>,,,>,,>,,,,,,,,,,,,,,,,>,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,,',,,,',,,',,',,',,,,,,,,',',',',,,',,,,,',,',,,,,',',,,,',',',',,',,',',',,,',',,',',',',',','''',','','',','',',''','','',''',',','','',''''''''''''''",
-">>;>;>;>;>;>;>;>;>>;>;>;>;>;>;>>;>;>;>>;>;>;>;>;;>;>;>;>;>;;;>>>;>;>>>;>;>>;>;>;;;>>;>;>;>;>;>;>;>;;>;>>;>>;;>>;>;>;>;>;>;>>;>;;;>;>;>>;>;>>;>>;>;>>;>>;>;>>;>>>;>>;>>>;>>;>;>>>>>;>>>>>>;>>;>>;>>;>>>>>>>>>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>,>>>>>>,>>,>>,>>>>>,>,>>>>>,>,>>>,>>,>>,>,>>>>>,>>,,>>,>>,>,>,>,>>>>>,>,>,>,,>,>,>,>,>,>,>,>,>,>,>,,>,>>>,>,>,>,,,>,>,,>,,,,,>,>,>,>,>,,,,,>,,,>,,,,,,,,,,,,,,>,,,,,>,,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,,,,,,,,,,,,',,,',,,,,,,,,',,,',',,',,,',',,,','',',,',,,',',',',',',',','',',',',',',',,',',',',','',','',','','',',','',''','','',',',',',',','",
-";>;>;>;>;>;>;>;>;;>;>;>;>;>;>;>;>>;>;;>;>;>;>;>>;>;>;>;>;>>>>;;>;>;>;>;>;>;>>;>>>;;>;>;>;>;>;>>;>;>>;>;>;;>>;>;>>;>;>;>;>;>>;>>>;>;>;>;>>;>;>>;>>;>>;>;>>;>>;>;>>;>>;>>>;>>>>;>;>>>>;>;>>>;>>>>>>>>>;>>>>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>,>>>>>>>>>>>>>>>>>>>>,>>>>>>,>,>>>>>,>>>,>>,>>>>,>,>>,>,>>,>>,>,>>>,>,,>,,>,>,>>,>>,>,>,>,>,>,>,,>,,>,>,>,>,,,,,>,>,,>>,,,>,,>,>,>,,,>,,>,,,,>,>,,,>,,,>,,>,,>,>,,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,',,,,,,,',,',',,',,,,',,,',',',',,,',,',,',,',',,',',,,,,',',,'',,,',',,,',',',',,',',',',',','',','',','',,','',''',,'',''''',''',''',''''''''''''''''''",
-">;>>;>>;>;>;>;>;>>;>>>;>;>;>;>;>;;>>>;>>;>;>;>;;>;>;>>>;>;;;;>>;>;>;>;>;>;>;;>;>;>>;>;>;>;>;>;>;>;>;>;>;>>;;>;>;>>;>;>;>>;;>;>;;>;>;>;>;;>;>;>;>;>;>;>>;>;>>;>>;>>>;>>;>>>>;>>>>;>;>>>>;>>>>>>;>>;>>>>>>;>>>>>>>>;>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>,>>,>>,>,>>>>>,>,>>>>,>,>>>>,>>,>>>,>,>>>,>>,>>>,>,>>>,,>>,>>,>>,>>,>,>,,>,>,>,>,>,>,>,>,>,>,>,,>,>>,>,,,>,,,>,>,>,,,>,,,>,,>,,,,>,,,,,>,,,>,,,,,,,,,,>,,>,,,,,,,,,>,,,>,,>,,,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,,',,,,,,,,,,',,,,,',,,',,,,',,,,'',',,,',,,',',',',',,',,','',',',',',',',,',','',',''',','',,''','',,','',','','',',',',',',',',','",
-">;>;>;>;>;>>>;>;>;>;;>;>;>;>;>;>>;>;>;;>>;>>;>>;>;>;>;>;>>>>;>;>;>;>>;>;>;>>;>;>;>;>>;>>;>>;>;>;>;>;>;>;>;>>;>;>;>;>;>>;;>;>;>>;>;>;>>;>>;>>;>>;>>;>>;>;>>;>>;>>;;>>;>;>;>>>;>>>>>>;>>>>>;>>;>>>>>>;>>;>>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>>,>>>>>>>,>>>>>,>,>>,>>,>,>>>,>>,>>,>,>>>,>,>>>,>,>,>,>,>,>,>>,>,>,>,>,>,>,,>,>,>,,,>,>,>,,,>,>,>,>,,>,,,>,,,>,>,,,>,>,,,>,>,,,>,,,>,>,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,',,,,,,',,',',,,,,,,,,',',',',,,',',,,',,,',',,',',,,','',,'',,',,',','',',',,,',',',',',','',',',,',',,','',''',',',',''','','','','''''''''''''''''''",
-";>;>;>;>;>;;>>;>;>;>>;>;>>;>>;>;>;>;>>;>;>;;>>;>;>;>;>;>;;>;>;>;>>;;>>;>>;>;>;>;>;>;;>;>>;;>;>>;>>;>;>>;>;>;>;>;>;>>;>;>>;>>;>;>>;>>;;>;>;>;>;>;>;>;>>;>;>>;>>;>>>>;>>>>>>;>>;>;>;>>;>>;>>;>>;>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>,>>>>>>>>>>,>>,>,>>,>>>>,>,>,>>>,>,>>>>,>>,>>>,>,>>,>>,>>,>,>,>>>,>,>,>,>,>>,>>,>,>,>,>,>,>,>,>>,>,,>,>,>,>,,>,>,,>,>,>,>,,>>,,>,>,,,>>,,,,>,,,,,>,,,>,,,,,,,,>,,>,,>,>,,,>,,,,>,,,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,',,',,,,,,',,,,,,,,,,',',,',,,,,,,,,',,,,,',,',',,,',,',',',,,,',,,',,',',',,,',',''',',',',',',','',''','','','',',,'','',''','','','',''',',',',',',',',','",
-";>;>;>>>;>>;;>;>;>;;>;>;>;>;>;>;>;>;;>;>;>>;;>;>;>>;>;>>>;>;>;>>;;>>;>;>;>;>>;>;>;>>>;>;;>>>;;>;>;>>;>;>>;>;>;>;>;>;>;>;>;>;>;>;>;;>>;>;>;>>>;>>>;>;>;>>;>>>;>>;>;>>;>;>;>>;>>>>>;>>>>>>>>>>>>>>>>;>>>>>>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>,>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>,>>>>,>>,>>>>,>>,>,>,>>>,>,>,>,>,>>>,>>,>,>,>>,>,>,>,>,>,>,,>,,>,>,>,>,>,>,,>,>,,,,>,,>,,,>,,,,>,,,,>,>,,>,>,,,>,,,>,,>,,,,,,,,>,,,,,,,,,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,',,,,,',,,',,,,,,,,',',',',,',',',',,',,',,',,,,',,'',,',',,',',,','',',,',,',',',',',',',,',','',',',',''''','','',,'',''''','','','''''''''''''''''",
-">;>;>;>;>;;>>;>;>;>>;>;>;>;>;>;>;>;>>;>;>>;>>;>;>;;>;>;;;>;>;>;;>>;;>;>;>>;>;>;>;>;;;>;>>;>;>>;>;>;;>;>;;>;>;>;>;>;>;>;>>;>;>;>;>>;>;>;>;>;;>>;;>>>;>>;>>;;>>>;>>>;>;>>>>;>>>>;>>>>;>;>>>;>>>;>;>>>>>;>>>>;>>>>;>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>,>>,>>,>,>>,>>,>>>>,>,>,>>,>,>>>,>,>>,>>,>,>>,>>>,>>,,>>,>,>>>,>,>,>,,>,>,>,,>,>,>,>,>,>,>>,>,>,,>,>,>,,>,>,,,>>,>,,>,,>,,>,>,,>,>,,>,,,,,,,>,,>,>,,,,,>,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,',,,',,,',,',',,,,,,,',,,,',,,,,',,',,',,',',,',,',',,',',,',',',,,',',,',',',',',',','',',','',',',',',',','','''','',','','','''',',',',',','','",
-">;>>;;>;>>;>;>>;>;>;>>;>;>;>;>;>;>>;>;>;;>;>;>>;>>;>;>>>;>;>;>>;>;>>;>;>;>;>;>;>>;>>;>;>;;>;>;>;>>>;>;>>;>;>;>;>;>;>;>;;>;>>;>;>;>;>;>;>;>>>;>>;>;>>;>;>>>>;;>>;>>;>>;>>>>;>;>>;>;>>>>;>>>>;>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>,>>>,>>>,>>>,,>>,>>>,>>>,>,>,>,>,>>>,>>,>>,>,>,>,>,>,>,,>,>,,>,>,,,>,>,,>,>,,,>,>,,>,,>,,,>,,,,>,,,,>,>,>,,,,,,,,>,>,,,,,>,>,,>,,>,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,',,,,,,,,,,,',',',,,,',,,,',',,',,',,',,',',',,,',',,,'',',',,'',',',',',',',',',',',','',',',''',',',''',,'',,''',','','','',',''''''''''''''''",
-";>;;>>;>;>;>;>;>>;>;>;>;>;>;>>>;>;;>;>;>>;>;>;>;>;>;>;>;>;>>;>;>;>;;>;>;;>;>>;>;;>>;>;>;>>;>;>;>;;;>>;>;>;>>;>>;>;>;>;>>;>;;>;>;>;>;>>>;>>;;>>;>;>;;>>>;>;>>>;>>;>>>>>;>;>>>>>;>>>>;>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>,>>>>>,>,>,>,>,>>,>,>>>,>>,>>,>,>>>,>>,,>>,,>>,>>>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>>,>,>,>,>,>,>,,>>,,,>,>,,>,,>,,>,>,,>,>,,,,,,,,>,>,>,,,,,,>,,,,,,,,,,,,,,,,,>,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,',,,,,,,,',,,,,,,,,,,,,',,',,',,,,,,,,,,',,,',',,,',,',,',,',,',,,'',,','',,,',,',',,',,',',',',',',',','',',,',',',,'',''',,''',''',,'''','','',''''',',',',',','','",
-";>>;>;>;>;>>;>;;>;>;>;>>;>>;;;>;>>;>>>;;>;>;>;>;>;>;>;>;>>;>;>;>;>>;>;>>;>;>;>;>>;>;>;>;>;>;>>;>>>;;>;>;>;>;>;>;>>;>>;>;>;>>;>>;>;>;;;>;>;>>;>;>>>>>;;>>>;>;>>;>>;>;;>>>>;>;>>>;>;>>>;>;>>>>;>;>>>>;>>>>;>>;>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>,>>,>>,>>>>>>,>>>>>,>>>>>>>>>>>>>>>>>,>,>,>>,>>>,>,>>,>>>,>>>,>>,,>,>>>,>,>,>>,>,>,>,>,>,>,>>>,>,,>,,>,>,,>,,,>,,,,>>,,,>,,,>,>,,,>,>,,,>,>,>,>,,,,,,,,,>,,,,,>,,,>,,,>,,>,,,,,,,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,',',,,,,,,,,,,',',',',,,',,,,,',,',,,',,',,',,'',,,',,,,,'',',',',',',',',',',',',',',',','',','','','',,''',',','''',',''''','',','''''''''''''''''",
-";>;>;>;>;>;;>;>>;>;>;>;>;>;>>>>;>;>;>;>>;>;>;>;>;>;>;>;>;;>;>;>>;>;>>;>;>;>;>>;>;;>>;>;>;>;>;;>;>;>>;>;>;>;>;>>;>;>;;>;>;>;>;;>>;>;>>>;>>>;>;>>;;;>;>>;;>>;>>;>>;>>>>>;>>>;>>;>>>>>>>>>>>>;>>>>>>>>>>;>>>>>>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>,>>>>>>,>>>,>,>,>,>,>,>,>,>,>>>>>,>>>,>>>>,>>,>,>>,>,>,>>,>,,,>,>>,>,>,>,>,>,>,>,>,,,>,>,>,>,>,>,>,>,>,>>,,,>>,>,>,,>,,>,,,,,>,,,,,,,,>,>,>,>,,,,,>,,,>,,,>,,,,,,>,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,',',,',,,,,,,,,',,,',',,',,,',,',,,,,',,',',,'',',,,',',,',,',',',',',',',',',',',','',',',',','''',,''',',','','',','','''',',',',',',','','",
-">;>;>>;>;>>;>;>;>>;>;>;>;>;>;;>;>;>;>;;>;>;>;>>;>>;>;>;>>;>;>;;>;>;>;>;>>;>;;>;>>>;>;>;>;>;>>;>;>;>;>>;>;>;>;;>;>;>>;>;>;>;>>;>;>>;>;>;;;>>;>;>>>>;>;>>>;>>;>>;>>;;>;>>;>>>;>>>;>;>>;>>;>>>>;>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>>>>,>>>,>>,>>>>>>>>>>>>>>>>>>>>>>,>,>>,>,>>,>,>,>,>>,>,>>>,>,>>>>>,>>,>,>,>,>,>,>,>,>,>>,,>,>,,>,,>,>,,>,,>,,,>>,,,,,,>,,,>,>,>,>,,>,>,>,,,,,,,,,,>,,>,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,,',,,,,,,,',',',',,,',,,,',,',',,,,','',,',,,',',,','',',,',',',,',',',',',',',',''','',',','','',',,''',,''','','',','','',''''''''''''''''''''",
-">;>;>;>>;>;>>;>;>;>;>;>;>;>;>;>;>;>;>>>;>>>;>;>;>;>;>>;>;>;>;>>;>;>;>;>;;>;>>;>;;>;>>;>;>>;>;>;>;>;>;;>>>;>;>>;>;>;>>;>;>>;>;>;>;>;>;>>>>;>>;>>;;>>;>>;>>;>>;>>;>>>>>>>>>;>>>;>>>>;>>>>>>;>>>;>>>>;>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>,>>>>>,>>,>>>,>>>>>>>,>>>,>,>,>,>,>,>,>,>,>>>,>>,>>,>>>,>>>,>>,>,,>>,>,,,,>,>,>,>,>,>,>,>,>,>,>,,>,,>,>,,>>,,>,>,,>,,>,,,,>,>>,,,>,,,,>,,,>,,,,,,,>,>,>,>,,,,,,,>,,>,>,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,',,,,,,,,',,,,',,',,,,,,',',,,,,,,,,,',,',',,',,,,'',',,,,',,',',,,',,',,,,'',',',',,',',',',',',',',',','','',',',',''',,''',,'','','''','','',',',',',',','','','",
-">;>;>;;>;>;;>;>;>;>;>;>;>;>;>;>>;>;>;;>;;;>;>;>;>;>;>;>;>>;>;>;>>;>;>;>>;>;>;>;>;>;;>;>>;>;>;>;>;>;>>;>;>;>;>;>>;>;;>;>>;>;>;>;>;>;>;;>;>;>>;>;>>;>;>>>;>>;>>;>>;>;>;>;>>>;>>;>;>>>>>;>>>>>;>>>>>>>>;>>>>>>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>,>,>>>>>,>>>>>>>>>>>>>>>>>>,>>>,>>,>>,,>>,,>,>,>>>>,>,>>>>>>,>,>>>,>,>,>,>,>,>,>>,>>,>,>>,,>,>,,>,>,>,>,>>,>,,,>,,>,>,,,>,,,>,>,>,,>,,,,,,,>,,>,,,,,,,,,>,,,,>,,>,,,,,,,,,>,,,,>,,,>,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,',,,,,',',',',,,,,,,,',,',',,,,,',',,',',',',',,,''',,',,,','',',',',',',',',',',',,',','',''',',''',','',''','',''','''''''''''''''''''','''",
-">>;>;>>;>;>>;>;>;>>>;>>;>>;>;>;;>;>;>>;>>>;>;>;>;>;>;>;>;>>;>;>;;>;>>;>;>>;>;>>;>;>>;>;;>;>;>;>;>>;>;>;;>>;>;>;;>;>>;>;;>;>;>;>;>;>;>>;>>;>;>;>>;>>>;;>>>;>>;>>;>>>>>>>;>>>;>>>>>;>;>>;>;>>>>>;>>>>>>>;>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>,>>>>>>>,>>>>>,>,>,>,>,>,>,>,>,>,>>>>>,>>>,>>>>>,>>,,>>,>,>,,>,>,>,,>>,>,>,>,>,>,>,,>,,>,,,,>,>,>,>,,,>,,>,,,,>,>,,>,,>,,>,>,>,,,,,,>,,,>,>,>,,,,,,,,>,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,',,,,,,,,',,,,,,,,,',',',',,,',,,',',',,,',,',,',,',',',,',',',',,,,',',',',',',',',',','','',',',,'','',',''','',''','',''',',',',',',',',','''','",
-";>;>;>;>>;>;>>;>;>;>;>;>;>;>;>>;>;>;;>;>;>;>;>>;>>;>;>;>;;>;>;>>;>;>;>;>;>;>;>;>>;>;>>>;>;>;>;>>;;>>;>>;;>;>;>>;>;>>;>>;>;>;>;>;>;>;>;>;>;>>>;>;>;;>>>;>;>>;>;>>;>;>;>>>;>>>;>;>>>>>>>>>>;>>>>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>>,>>,>>,>>>,>>>,>>>,>>>>>>>>>>>>>>>>,>>>>,>,,>>>,>>,>,,,>>,>>>,>>>,>>,>,>>>>,,>,>,>,>,>,>,>,>,>,>,>>,>,>,,>,>,>,>,,>>,,,,>,,>,,,>,,,,,,>,>,,,,,>,,,,,,,,>,,>,,,,,,,>,,>,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,',,',,,,',',,,,,,',',',,,,,,,,,,',,,',,,,',,'',',,',,',,',,',',,',',',''',',',',',',',',''','',',,',',''','',','',,'','',','',','',''''''''''''''''''''''",
-">;>;>;>;;>;>;;>;>;>;>;>;>;>>;>;>>>;>>;>;>;>;>;>;>;>;>;>;>>;>>;>;>;>;>>;>;>>;>;>;;>;>;>;>;>>;>>;;>>;>;>;>>;>>;>;>>;;>;>;>;>;>;>>>;>;>>;>>;>;>;>>;>>>;>;>>>;>>;>>;>>>;>>;>>>;>>>>>>>;>>;>>>>>;>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>,>>>>>>>,>,>,>,>,>,>,>,>>,>,>>>>,>,>>,>,>>>>,>>,,>>,,,>,>,>>,,,>>,>,>,>,>,>,>,>,,>,>,>,>,,>,>,,>,,,>,>,,>,>>,,>,,,>,,>,>,>,,,,,>,>,,,,>,>,>,,,,,,>,,>,,,,,,,,>,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,,,,,',,,,,,,,,,,',,,,,,',,',,,,,,',',',',',',',,',',,',,,',',,',,',,,',',',,',',',,,',',',',',',',',',','',''','',',','',',''',''',''','''','''',',',',',','',','','",
-">;>;>;>>;>;>>;>>;>;>;>>;>;;>;>;;;>;>;>;>>;>;>;>;>;>;>;>;>;>;>;>;>;>;;>;>;;>;>;>>;>;>;>;>;;>>;;>>;;>;>;>;>;;>;>;;>>;>;>;>;>;>>;;>;>;;>>;>>>;>;>>;>;>>>;>;>>;>>;>>;>>>;>>;>>>;>;>;>>>>>>>;>;>>>;>>>>>;>>>;>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>,>>,>>>,>>>,>>,>>>>,>>,>>>>>>>>>>>>>>>>>,>>>,>,>>>>,>>,>>,>,>>,>>>,>>>>,>,>,>>>,,>,>,>,>,>,>,>,>>,,>,,>,,>,>,>,,>,>,,,>,,,>,,>,,>,,>,,,>,,>,>,>,,,,>,>,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,',,',,,,,,',',,,,,,,,,,,,,,',,,',,,,',,,,',',',',',',,,'',',,',',,',',',',',',',',',',,',',',','','',''',','','',','',','',','''''''''''''''''''''",
-";>;>>;>;>>;>;>;;>;>;>;>>;>>;>;>>>;>;>>;;>>;>;>;>;>>;>>;>;>;>;>;>>>;>>;>;>>>;>;>;>;>;>;>>>;;>>;>;>>;>;>;>;>>;>;>>;;>;>;>>>;>;;>>;>>>;>;>;;>>;>;>;>>;>;>>>;>>;>>;>>>;>>>;>>;>>>>>>;>;>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>,>,>,>,>,>,>,>>>,>,>>>,>,>>,>>,>,>>,>>,>,>,,>,>,>,>,,>>>,>,>,>,>,>,>,>,,>,>,>,>,>,,>,>,>,,>>,,>>,,>,,>,,>,,,>,,>,,,,,,>,>,,,,>,,,>,>,,>,,,,,>,,>,,>,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,',,,,,,,',,,,,',,,,,,,',,',,,,,',',',',',',',,',,',',,'',',,',,',',,,'',,,',',,','',',',',',',',','',''',','','','','',',','',',''''',''',''''',',',',',',','','','",
-">>;;>;>;;>;>;>>;>;>;>;;>;>;>>;>;>;>;>;>;>;>>;>;>;>;>;>;>;>;>;>;>;>;>;>>;;;>;>>;>>;>;>;;>;>>;>;>;;>;>;>;>>;>;>;>;>>>;>;>;>;>>;;>;;>;>>;>>;>;>>;>>;>>>>;>;>>>>;>>;>>>;>>>;>>>;>>>>>>>>>>>>;>>;>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>,>>>>>,>>>>>>>,>>,>>,>,>,>>>>>>>>>>>>>>>>>,>>,>>>,>>>,>>,>,>>,>>,>,>>,>>,>,>,>>,>>,,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,,>,,>,,,>,,,>,,>,,>,,>>,,>,,>,>,,,,,,>,,,,>,,,,,,,,,>,,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,,,,,,,',,,,',,',,,,,,',',,,,,,,,',,,',,',,',,,',,,,',',,',,,',',,''',,,'',',,',',',',',',',',',',,',',,','',',',',''','','',',,'','',','''''''''''''''''''''''",
-">;>>;>;>>;>;>;>>;>;>;>>;>;>;;>;>;>;>;>>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;;>>>;>;>;>;>;>;>>;>;;>;>;>>;>;>;>;;>;>;>;>;>;>;>;>;>;>>;>>;>;>;>>;>>;>;>;>>;;>;>>>;>;>>;>>>;>>>;>>>;>>;>;>>;>;>>;>>>>>;>>>>>>>>;>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>>,>>>>>>>,>,>,>,>,>,>,>,>>,>>>,>>,>>,>>,>>,>,>,>>>,>>,>,>>,>,>,>,>>,>,>,>,>,>,>,>,,>,>,>,,,>,>,>,,>,,>>,,>>,,>,,>,,>,,,>,,>,,,,,>,>,,,>,>,,,,>,,,>,,,,,>,,,>,,,,,,>,,,>,,,>,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,',,,,,',,,,,,,,,',,,,,,',',',,,,',,',,',,',',,'',,',',,',',',',,,,''',,,',',',',',',',',',',','','''',',','',''',,'',''',''''',','''',',',',',',','','','','",
-";>;>;>;>;>>;>;;>;>;>;>;>;>>>;>;>;>;>;>;>;>;>>;>;>;>;>>;>>;>;>>;>;>;>;>>;;>;>;>;>;>;>;>;>>>;>;>>;>;>;>;>>;>>>;>;>;>;>;>;>;>;>;>;>;>>>;>;>;>>>;>;>>>>;>>;>>;>;>>;>>>;>>>;>>;>>>>>>>>>>;>>>;>>>>>>>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>,>>>>>>,>>,>>>>>>>>>>>>>>>>,>>,>,>,>>,>>,>>,>>>,>,>,>,>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>>,>,,>,>>,>,,>,>,,>,,,>,,,>,,>,,>,,>,,,>,,>,>,,,,,>,,,,,,>,,,,>,,,>,,,,,>,,,>,,,,,,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,',,,,',',,',,,,',',,,,,,',',,,',,',,',,,,',,,',,,',',,',,','',',,,'',',',',',',',',',''','',',',,',''','',',''',',','',',''''',','''''''''''''''''''','''",
-">;>;>>;>;>;>;>>;>;>>;>>;>;;>>;>;>;>;>;>;>;>;>>;>;>;>;>;>;>;>;;>;>>;>;>;>>;>;>;>;>;>;>;>;>;>;>;>>;>;>>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>>>;>;;>>;>;>;>>;>>;>>;>>;>>;>>>;>>>>>;>>;>>;>>>>;>>>>>>;>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>>>>>,>>>>>>>>>>,>>,>>>>>>>>,>,>,>,>,>,>,>>>,>>>>>,>>,>>,>>,,>>>,>>,>>,>>,>>>,>,>,>>,>,>,>,>,>,>,>,,>,>,,>,,>,>,,>,>,,>,>,>,>,>,,,,,>,,,>,,,,,,,,>,>,,,>,>,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,,,,',,',,',',,,,,,',,,,,',,',',,'',,',',,',',,',',,',',',,',',',',',',',',',',','',','''',,'','',',',''','''','',,',''''',',',',',','',','''','",
-">;>;>;>>;>;>;>;>>;;>;;>;>;>;>;>;>;>;>;>;>;>;;>;>;>;>;>;>;>;>>;>;;>;>;>;>;>>;>;>>;>>;>;>;>;>;>;;>;>;>;>;>;;>;>;>;>;>;>;>>>;>;>;>;>;>;>;>;>>;>>;>>>;>>;>>;>>>;>>;>>;>>>;>;>>>;>>>>>;>>>>>;>>>>>>;>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>,>>>>>>>,>>>>,>>>>>>,>>,>>,>>>>>>>>>>>>>>,>>>,>,>>>,>>,>>,>>>,,>>,>>,>,>,>,,>,>,>,>,>,>,>,>,>,>,>,>,>,>>,>,>,,>,>,,>,,>,>,,>,,,>,>,,,>,>,>,>,>,>,,,,>,,,,,>,,,,,>,,>,,>,,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,',,,,',,',',',,,,,',,,,',,',,','',,,',,,,',,,',',,',,,',',',',',,',',,,',',',',',',',',',',,','',,,''',','','',',''',','',''''',',''''''''''''''''''''''''",
-";>;>;>;;>;>>;>;>;>>;>>;>;>;;>>;>>;>>;>;>;>;>>;>;>>>;>;>;>;>;>>;>>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>>;>;>;>;>;>>;>;>;>>;>>;>;>;>;>;>>;>>;>;>;>>;>;>>;;>>;>>;>>;;>>>>>;>>>;>>>>>;>>>>;>>>>>;>>>;>>>>>>>>;>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>>>>>>>,>,>,>,>,>,>>,>,>>,>,>>,>>,>>,,>>>,>>,>>,>,>,>>,>>>,>,>,>,>,>,>,>,>,>,>,,,,>,>,>,>,,>,>,>,,,>,,>>,,>,>,>,,,,,>,,,,,,,>,,,>,>,,,,>,,,>,,>,,,,,,>,,>,,,,,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,,,',,,,,,,,,,,,,',,,,',,',,',,,,',',,',',,',',,',',',',,',,',,,'',',''',',',',',',',',',','',',,''',,'',','',''',',','',''',',''''',',',',',','','',','','",
-">>;>;>>;>;;>;>;>;>;>;>;>;>>>;>;>;>;>;>>>;>;>;>>;;;>;>;>>>;>;;>;>;>>;>;>;>;>;>;>;>;>;>;>;;>;>;>;>>;>;>>;>;>;>>>;;>;>;>;;>;>;>;>;>;>>;>>>;>;>;>;>>;>>;>>;>>>;>;>>>;>>>;>;>>>;>>>>>;>;>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>,>>>>>,>>,>>,>,>>>>>>>>>>>>>,>>>>,>>>,>>>,>,>,>>,,>>,>,>,>>,>,>>,>,>,>>,>,>,>,>,>,>,>,,>,>>,>,,>,>,>,,,>,,>>,,>,,,>,,,,,>,>,>,,>,>,>,,,>,,,,,,>,,,,,,,,,,,,>,,,,,,,,,,>,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,',,',,,,,,,,',,',,',,',,,,',,',,,,,,',,,,,',,,,',,',',,,',,',',',',''',,',,,,,',',',',',',',''','',',''',,''',''',',',,''','','',','',',',''''''''''''''''''''''''",
-";>;>;>;>;>>;>;>;>;>;>;>;>;;;>;>;>;>;>;;;>>;>;>;>>>;>;>;>;>;>>>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>;>;;>>;>;>;>;>;>;>>;>;>;>>;>;>>;>>;>;>>;>;>>>;>;>>>>;>>;>>;>;>>>;>>;>;>>>>;>>>;>>;>>>>>>>>>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>,>>>>>>>>>>>>>,>>,>>>>>,>>>>>,>,>,>,>,>,>>>,>,>>,>>>,>>,>>>,>>,>,>>>,>,>>,>,,>,>,>,>,>,>,>,>,>,>,>,>,>,,,>,>,,>,,>>,,>,,>,>,>,>,,>,>,,>,,,>,,,,,,,>,,,>,>,,,>,>,,>,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,',,,,,,,,,',,',',,',,,',',',,'',,',',',,',,,',',,',,,',',,,,',',''',',',',',',',',',',',','',,''',',',',''',''','''''',''','''''',',',',','','',','','','",
-";>;>;>;>>;>;>;>;>;>>;>>;>>>;>;>;>;>;>>>;;>;>;>;>;>;>>;;>;>>;;>;>;>;>;>>;>>;>;>;>;>>>;>;>;>>;>;>>;>;>;>>;>;>;>;;>;>;>>;>;>>;>;;>;>>;>;>;>;>;>>;;>>>;>>;>>>>;>>>;>>>>;>;>>;>>>;>>>>;>;>;>>>>;>>>>;>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>,>>>>>>>>>,>>>>>,>,>>>>>>>>>>>>,>,>>>,>>,>,>>>,>,>>>,>>,>,>>,>,>,>>>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,,>,>,,,,>,,,>,,>,,,,>,>,,>,>,>,,,>,,,,,>,,,,,,,,,>,,,>,,>,,>,,,,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,,,,,,,,',,,,,,',,',,,,,,,,,,',,,',,,,,',,,,',,,',,',,'',',,',,',',,','',,',,,,',',',',',',',',',',','','',,'',''',',','',',',',','',''',','''''''''''',''''''''''''''",
-">;>;>;>;;>;>>>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>;>;>;>;;>>;>;;>;>>;>;>>;>;>;;>>>;>;>;>;>;>;>;;>>;>;>;>;>;;>>;>;>>>;>;>;;>;>;;>;>>>>;;>>>;>;>>>;>>>;;>>;>>>;>;>>;>>;>;>>>>;>>>>>>>;>>>>>>>>;>>>>>>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>,>>>>,>>,>,>>>>>,>>>>>,>,>,>,>,>,>>>>>,>>,>>>,>,>>,>,>,>>,>,>>,>,>,>,,>,>,>>,>,>,>,>,>,>,>,,>,>,>,,>,>,,>,>,>,,>,>>,,>>,,>,,>,>,,,,>,,,,,,,>,,,>,>,,,,,>,,>,,,,,,,,,,,,,,,>,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,',,',,,,,',',,,,,,,',,',',',,,',,,',',,',',,,',,',,',,,',',',',,,',',,',','',',',',',',',',','','',',',','','',,''','',','''',''','',',''',',',',',','''','','','',''",
-">;>;>;>>;>>;;>;>;>;>;>;>;>;>;>>>;>;>;>;>;>>;>;>;>;>>;>;>>>;>;;>;>;>;>;>>;>;;>;>>;;>;>;>;>>>;>;>;>;>;>>;;>;>;;;>;>;>>;>;>>;>;;>;>>>;;>;>>;;>;>;>>>;>>;;>>;>>>>>>>>>;>>>>;>;>>>>>;>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>,>>>>>>>>>>>>>>>>>>,>,>>>,>>>>>>>>>>>>>>,>,,>>,>>,>>>>,>,>>,>>,>>>,>,>>,>>>>,>,>>,>,>,>,>,>,>,>,>>,>,>,>>,>,,>,>,,>,>,,>,,>,,,>,,>,,>,>,>,,>,>,>,,,>,,,,,,>,>,,,,,,>,>,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,',,,,,,,,,,,,,,,,,',',',,,,,,,,,,',,,',,,,',,,',',,',,',,',,',,',,',',',',',,',,',',',',',',',',',,'',',',',',',',''',,'',''',',''',''','''','''''''''''''',''''''''',''''",
-";>;>>;>;>;;>>;>;>;>;>;>;>;>;>;;>>;>>;>;>;>;>;>;>>;>;>;>;;>>;>>;>;>;>;>;>>;>>;>;;>>;>>>;>;;;>;>;>;>>;>;>>;>;>>>;>>;>;>>;>;>;>>;>;>;>>>;>;>>>>;>>;>>;>>>;>>;>;>;>;>;>>;>>>>>;>;>>>>>>>;>>>>;>>>>>>>>;>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>,>>,>,>>,>>>>>>>>>,>,>,>,>,>,>>,>>>>,>>>,>>,>,>>>,>,>,>,>,>>,>,>,,,>,>>,,>,>,>,>,>,>,>,>,,,,>,,,,>,>>,>,,>,,,>,,>,,>,,>,,,>,,>,,,>,,,,>,,>,,,>,>,,,,,,>,>,,,,,>,>,>,,>,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,',,,,,,,,,',',',',,,',,,,',,',',,,',,,',,',',,',,,',,',,',',',',',,,',',',',',',','',','',','','',',',''',',,'','',',','',',''',',',',',',''','',',''''',''",
-">>;;>;>;>>;;>>;>>;>;>;>;>>>;>>;;>;;>;>;>;>;>;>;>;>;>;>;>;;>;>;>>;>;>;>;;>;;>;>>;>;>;;>;>>>;>;>;>;;>;>;>;>>;>;>;;>;>;;>;>;>;>;>>;>;>;>>>;>;>>;>>>;>>;>>;>>;>>>>>>>>;>>;>>>>>>>>;>;>>>>>;>>>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>,>>>,>>>>>>>>>>>>>>,>>,>,>>,>>,>>,>>,>,>>>>,>>>,>,>,>>>>,>,>,>>,>,>,>,>,>,>,>,>>>,,>>>,,,,>,,>,,>>,,>,,>,,>,,>,,,,,,>,,,>,,,,>,,,>,,,,>,,,,,,,,,>,,,,,,,,,,,,>,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,',,,,,,,,,',,,',,,,,,,,,,,',,,',,,',,,,',,',',,',',,',',',',',',',,',',,''',',',',',',',',',',',','',',','','',,',''','',''''','''',','''''''''''','''''''','''''''",
-";>>>;>;>;>>;>;>;;>>>;>;>;>;>;;>>;>>;>;>;>;>;>;>;>>;>;>>;>>;>;>;;>;>;>;>>;>>>;>;>;>;>>;>;>;>;>;>;>>;>;>;>;;>;>;>>;>;>>;>;>;>;>;>>;>;>;>;>;>;>>;;>>;>>;>>;>>>;>;>;>>>;>>;>>;>>;>>>>;>;>>>;>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>>>>>>>>>>>,>,>>>,>>>,>,>,>,>,>,>,>>,>>>>,>>,>>,>>>,>>>,,>,>,>,>>>,>,,,>>,>,>>,>,>,>,>,>,>,>,>,,,>>,,,>>,>,,>,>,,,>,>,>,>,,,>,,>>,>,,,>,,>,>,,,>,,,>,,,>,>,,>,,,,,>,,,,,,,,,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,,,,,,,,,,,,',,',,,',,,',,',',',',,,',,,',,',',,',,,,,',,,',,',',,,',',',',',',',,,,',',',',',',',','',',',,'','','',''''',',''',',','',',''''''',',',','''','',''''','',''",
-";;;>;>;>;;>;>;>>;>;>;>>;;>;>>;>;>;>;>>>;>>;>>;>;;>;>;>;>;>;>;>>;>>>;>;;>;>;;>>;>;>;;>;>;>;>>;>>;>;>>;>;>>;>;>;>;>>;>;>>;>;>>>;;>>>;>;>;>>>;>>>>;>>;>>;>>;>>>>>>;>;>>;>>;>>>>>>>>>>>>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>,>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>,>>,>>,>>,>,>,,>>>,>>,>,>,>,>>>,,>,>>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,>,>,,>,>,,,>,,,>,>,,>,,,,>,>,,>,,,,>,,,>,,,>,,,,,,,,,>,,,,,>,,,,>,,,,,,,,,,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,',,,',,,',',,,'',,',,,',',,,',,,',',,',''',',',',',',',',',','',''',,','',',',,'','','''','',''',',',','''''''','''''''','''''''''",
-">>>;>>;>>>;>;>;;>;>;>;>>;>;>;>;>;>;>;;;>;>;>;>;>>;>;>;>;>;>>;>;>;;>>;>>;>;>>;;>;>;>>;>;>;>;>;>;>;>;;>>;>;>;>;>;>;;>>;;>>;>;;>>>;;>>;>>;>;>>;>;>>;>>;>>;>>;>;>;>>>>>>>>>>>;>;>;>;>>;>>>>>>>>;>>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>>>>>>>,>>>,>>,>,>>,>,>,>,>,>,>,>,>>>,>>,>>>,>>>>>>,,>>,>>,>>,>>,,>>>,>,,>,>,>,>,>,>,>,>,,>,>,>,>,>>,,>,,>,>,,>>,,>,>,,,>,,,>,>,,,>,,,,>,,,>,,,>,,,,,>,,>,,,,,>,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,',',,',,,',,',',,',,,',',',',',,,',,,',,',,',',,','',,,',,'',,','',,''',,',',',,,',',',',',',',',',',',',,''',',''','','','',','','',',''''''',',',',''''','','''',',''''",
-";;>;>;>;;>;>;>>>;>;>;>;>;>;>;>;>;>;>>>;>;>;>;>;>;>>;>;>;>;;>;>;>>;;>;>;>;>;>>;>;>>;>;>;>;>;>;>;>;>>;;>;>;>;>;>;>>;;>>;;>;>>;;>>>>;>;>>;>;>>>;>;>>;>>;>>;>>>>>;>;>;>;>>;>>>>>>>>>>>>>;>>>>>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>>>>,>>>>>>>>>>>>>>,>>>,>>,>>,>,,>,>>>,>,>>,>,>,>>,>,>,>>>,>>,>,>,>,>,>,>>,>,,>,,>,,,>>,>,,,>,>,,>,>,,>,,>,>,,,,>>,,>,>,,,>,,,>,,,>,>,,,,,,>,,,,,,,,,,,,>,,,,,>,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,',,,,',,,,,',,,',,,,,,,,,',,,,,,,,',,'',',',',',',','','',','','',,''',','','',','','','','''',',',''''''''',',''''''','''''',''",
-">>;>;>;>;>>;>;;;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>;>;>;>;>>;>;>;>>;>;>>;>;;>;>;>;;>;>;>;>;>;>;>>;>;>>;>;>>;>>;>;>>;>;>>;>>;>>;;;>>;>;>>>;>;>>>>;>>;>>;>>>>;>>>>>>>;>>>>>>>>;>>;>>;>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>,>>>,>>,>>,>>>>,>,>,>,>,>,>,>>,>>,>>,>>>>,>>,>,>>>,>>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,,>>>,,>,>,>,,,>,,>,>,,>,,,,>,>,,,>,,,,,>,,,>,,,>,,,,,>,,>,,,,>,>,,,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,',,,,,,,,,,,,,',,',,,,,,,,,>,,,,,,',',,,,,,,,',,,,,,',,,,,,,,,,,',,,',,',',',',',',',',','',',',','',,'',','',,''','',''','',','''''',',',','''''',','''','''''''",
-";>;>;>>;>;>;>>>;>;>;>;>;>;>>>;>;>;>;>;>;>;>;>;>>;>;>>;>>;>;>>;>;;>;>;;>;>>;>;>>;>>>;>;>;>;>;>;;>;>;>;>>;;>>;>;>;;>;>;>;>;>;>>>>>;>;>;>;>>>;>;;>>;>>;>>;>;>>;>;>;>>>>;>;>;>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>,>>>>>>,>>,>>,>,>>>>>>>>>,>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>,>>,>>,>>,>,>>,>>,>,,>,>,>,>,>,>,>>>,>,>,>,>,>,>,>,>,>,>,>,,>>,,,,>,,,>,>,>,,>,,,>,,>,>>,,,>,,,,>,>,,,>,,,>,,,,>,,,,,,,,>,,,,,,>,,,,,,,>,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,',,',,,,,,,',,,,,,,,,,,,,,,,,,,,,,>,,>,,,,,,,',',',',,,,,,,,,,,,',,,,,,,,,,',,',',',',',',',',',',,',',',','''',','',''',,'','',''','''',',','''''''','','''''','''','''''",
-">;>;>;>>;>;>;;>>;>;>;>>;>>;;;>>;>>;>;>>;>>;>;>;;>;>;>;>;>;>;;>;>>>;>>;>;>;>>;>;>;;;>>;>>;>>>;>>;>;>;>;;>>;;>;>;>>;>;>;>;>;>;;>;;>>>;>;>;>;>>>>;>>;>>;>>>>;>>>>>>;>;>>>>>>>>;>>>>>>;>>>>>>;>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>,>>,>>,>>>>>,>,>,>,>,>,>>>>>,>>,>>,>>>,>,>>,>>>>,>>>,>,>>>,>,,>,>,>,>,>,>,>,>,>,>,,>,>>,,>,>>,>,>,,,>,>,,>>,,>,,,,,,>,,>,>,,,,,>,,,>,,,>,,,,,>,,>,,,,>,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,',,,,,,,,>,,>,,,,,,,',,,,,,',,',,,,,,,,',,,,,,,,,,',,,',',',',',',','','''',''',',,',''',',','''',''',','',','''''''',',',''''','','''',''''',''",
-">;>;>;;>;>;>>;;>;>;>;>;>;>>>;>;>;>;>;;>>;>;>;>>;>;>;>;>;>;>>;>;>;;>;>;>;>;;>;>;>>>;>;>;>;;;>;>;>>;>;>>;>;>>;>>;>;>>;>;>;>>>>;>>>;;>>>;>>>;>;>>;>>;>>;>;>>>;>;>>>>>;>>;>>;>>>;>;>>>>>;>>>>>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>,>>>,>,>>>>>>>>>>>>,>,>>,>>>,>>,>,>>,>,>,>,>>,,>,>>,,>,>>,>,>,>,>,>,>,>,>,>,>,>,,,>,>,>,,,>,,>,>,,>,>,,>,,>,>,>,,>,,,>,>,>,,,>,,,>,,>,,>,,,,,>,,,,,,,,,>,,,,,,,,,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,',,,,,,,,,,,,,,,,',,,,,,,,>,,>>,>,,,,',,,',',,,,,,,,',,,,,,,,,,,,,,',,,',',',',',',',',',',',,',',',''',',,',''',,','','''','','',',',','''''',''''''''','''''',''''",
-";>;>;>>;>>;>;>>>;>>;>;>;>;>;>;>;>;>>>;;>;>;>;>;>;>;>;>;>;>>;>;>;>>;>;>;>;>>;>;>;>;>;>;>;>>>;>;>;;>>;>;>;>;>;>;>;>;;>;>;>;;;>>;;>>>;;>>;>;>>>;>>;>>;>>>>;>;>>>;>;>>>>>>>>>;>>>>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>,>>>>>>>>>>,>>,>,>,>>>>>,>>>>,>,>,>,>,>,>>,>,>>>,>>>,>>>>,>>>>,>>,>>>,>,,>>>>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>>,,>>,,,>,>,,,>,,>,,,>,,>,,>,,,,,,,>,,,>,,,,,,,,,,>,,,>,,>,>,,,,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,,',,,,,,,,,,,,,,,,,,,,,,,,,,,>,>,,,,',,,',,',',',,,,,,,,,,,,,,,,,,,',,,,',',',',',',',',','',',',',','''','','','','',','','',''''''''',',''','','','''''','''''''",
-">>;>;>;>;>;>;>;;>;>;>;>;>;>;>;>;>;>;>>;>;>;>;>;>;>;>;>;>>;;>>;>;>;>>;>;>;>>;>;>;>;>;>;>>;;>;>;>>;;>;>;>;>;>;>;>;>>;>>>;>>>>;>>;>;>>;>>;>>;>>;>>;>>;>;>>>>>;>>>>>;>;>;>>>>>>;>>>>>;>>>;>>;>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>,>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>>>>>>>>,>>>>,>,>,>>,>,,>,>,,>>,>,>,>>>>,>,,>,>>,>,>,>,>,>,>,>,>,>,,>,>,,>,,>,>,,,,>>,,,,>>,,>,,>,,,>,,>,,>,>,>,,,>,,,>,>,,>,,>,,,,,,,,,,,,>,,,>,,>,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,',,,,,,,,,,,,,,,,,,>,>,>>,>,>,,,,,',,,',,,,,,,,,,,,,,,,,,,,,,,,,,,'',',',',',',',''',',','','','',','',',','','','',','','',',',',''''','''''',''','','''''',''",
-";>>;>;>;>;>;>;>>;>;>;>;>;>;>;>;>;>;;>;>;>>;>>;>;>>;>>;>;;>>;;>;>;>;>>;>;>;;>;>;>;>;>;>;;>>;>>;>;>>;>;>;>;>;>;>>;>;>;;;>;>;;>>;>;>>;>;>>>;>;>>;>>;>>>>>;>;>>>;>;>>>>>>;>>;>>>>>;>>>;>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>,>>>,>>,>>,>>>>>,>>>,>,>,>,>,>>,>>>,>,>>>>>,>>>>>>,>>,>,>>>,>,,>,>,>>,>,,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>>,,>,>>,,,>,,>,>,>,,>,,>,,,,,,>,,,>,,,,>,,,,,,,>,,>,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,',',,,,,,,',,,,,,,,,,,,,,,,,,,,,,,,,,,,>,,>,>,,,,,',,',,,',,,,,,,,,,,,,,>,,,,,,,,,,,,,,',',',',',',','',',',','','',','',''',''''','''','','''''''',',''',',''''''''''',''''''''",
-";;>;>;>;>;>;>;>;>>;>;>;>;>;>;>;>;>>>;>;>;>;;>;>;>;>;>;>>;>;>>>;>;>;;>;>;>>;>;>;>>;>>;>>;>;>;>;>;>;>>;>;>;>;>;;>;>;>>>;>>;>>;>;>>;>;>>;;>>>;>>;>>>;;>;>>>>;>>;>>;>>;>>>>>>;>>;>>>>>>>>>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>,>,>>>>>>>>>>>>>>,>>,>>,>>,>,,>>,>,,>,>>>,>>,,>>>>,>,>,>,>>>,,>,>,>,>,>,>,>,>,>,>,,>,>,,>,>,,,>,,,>,,>>,,>,,,,,>,,,>,,>,>,,,,>,,,>,,,,,>,,>,,,,,,,,,>,,,,,>,,,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,',',,,,,,>,>,,,,,,,,,>,>,>>,>>,,,,,,,,,,,',,,,,,,,,,,,,,>,,,,,,,,,,',',',',',',',',',',','',',',,',','','',',',',,'',','''''',',','''''','''''','',',','''','''','",
-">>;>;>>;>>;>;>;>;>>;>>;>>;>;>>>;>;;;>>;>;>>;>>;>;>;>;>;;>;>;>;>;>;>>;>>;>;>;>>;>;>;>;>;>;>;>;>;>;>;>>;>;>>>;>>;>;>;;>;>;>>;>;>>;>;>;>>>>;>>;>>;;>>>>>>;>>>;>>>;>>>>>>;>>>>;>>>>>>>;>>;>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>,>>,>>>>>>,>,>,>,>,>,>>>,>>,>>>,>>>>>,>>>>>>,,>>,>>>,>,,>>>,>,>,,>>>,>,>,>,>,>,>,>,,,>,>,,>,>>,,>,>,,>>,,>,,,>,,,>,>,,>,>,,>,,,>,>,,,>,,,>,>,,,,,,,>,,>,,,,,,>,,,,>,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,,',,,,,',,,,,,,>,>,,,,,,,,>,,>,>>,>,,,,',,',,,,,,,,,,,,>,>,,,,,>,,,,,,,,',,',,',',',',',',',','',','''','',','',','''',''''',,','''''',',',''','','''''''''''''','''''",
-";>;>;;>;>;>>;>;>;;>;>;>;>;>>;;>;>>>;;>;>;>;>;>;>;>;>;>>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>;>;>;>;>;>;>;;>;>>;;>;>;>>;>>;>;>>;>;>>;>;>>>;>;>>;>>;>>>>;>;>;>>;>>>;>>>;>;>>>>;>>>>>;>;>>>>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>,>>>>>>>,>>>>,>>,>>>>>>>>>>>>,>>>>>>>>>>>>>>>,>>>,>>,>>>,>,>>,>,,>,>>>,>,>,>,>>,,,>>,>>>,,,>,>,>,>,>,>,>,>,>,>,>>,>,,,>,>,>,,,,>,>,>,,>>,,,>,,,,,>,,,>,,,,>,,,>,,,,,,>,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,',,,,,,,,,,,',,,,,,,,,,,,,>,>,,,>,,>,>>>,>,>,,,,,,,,,,,,,,,,>,>,,,,>,,>,,,,,,,,,,,',,',',',',',''',',',,''',',',',''','','',','',',,'''',','','''''',''''''',',''',''''''''''''",
-">;>;>>;>;>;;>;>;>>;>;>;>;>;;>>;>;>;>>;>;>;>;>;>;>;>>;>;>>;>;>>;>;>;>;>;>;>;>;>;>;;>>;>;>>;>;>;>;>;>>;>;;>>;>;>;;>;;>>;>;>>;>;>;>;>;>;>;>>;>>;>;>>;>>>>;>>;>>>;>>>>;>>>>;>;>>>>>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>>>,>>>,>,>>>,>,>>,>,>,>,>,>>>,>>,>>,>,>>>,>>>>>,>,>,>>,>>,>,>>>,>,>,,>>>,>,>,>,>,>,>,>,>,>,,>,,>,>>,>,,,,>>,>,,,>,>,,,,>,,>>,>,,,>,,,,>,,,>,,,>,>,,,>,,,,,,>,,,,>,,,>,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,',,',,,',,,,,,',,,,,>,>,>,,,>,,,>,>,,>>,>,>,,,,,,,,',,,,>,,,,>>,,>,,,,>,,,,',,',,'',',',',',',,,''','',',',''',',',',''','''','''',','''','''',',''','',''''','''','''''','''",
-">;>>;>;>;>>;>;>;;>;>;>;>;>>;;>;>;>;;>;>;>;>;>>;>>;;>;>;;>;>;;>;>;>;>;>;>>>;>;>;>>;;>;>>;>;>;>;>;>;>>;>>;;>;>;>>;>>>;>;>;>>;>>>;>;>>>>>;>>;>>;>>;>>>;>>>;>>>;>>>;>>>;>>>>>>>;>>>;>>>>>;>>>>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>>>>>>,>>,>>,>>>,>,>>,>,,>>>,>,>>,>>,>>,,>>,>>>,,>>,>,>,>,>,>,>,>,>,>,>,>,,,,>,>,>>,,,>,>>,,,>,>,>,,,,,,>,>,,>,>,,,>,,>,,,,,,,,,,>,,>,,,,,,,,,,,,>,,,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,,,,,,,,,,',,',,,,,,,,,>,>,>,,,>,>,>>>,>>>,,>,>,,,,,,,,,,,,>,>,,>,,>,,,,,,,,,,,,,',,',',',',''''',,',',',',','',',''',','',','',''','','''',','''',''',''',''''','''','',''','",
-";>;;>;>;>;>;>>;>>;>;>;>>;>;>>;>>;>>;>>;>;>;>;;>;>>;>>;>>;>;>>;>>;>>;>;>;>;>;>;>;;>>;>;>;>>;>>;>>;>;>;>;>>;>>;>;>;;>;>>;>;>>;>;>>>;;>;>>;>>;>>;>>>;>>>;>>>;>>>;>>>>>>>;>>;>>>>>>>>>>>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>,>>,>>>,>>>>>>,>>,>>,>>>>,>,>,>,>>>>>>,>>,>>>>>,>>>>,>,>>>,>>,>,>,>>,,>,,>>,>,>,>,>,>,>,>,>,>,,>,,>,>>>>,,>,,,>,>,,,,>>,,>,,,,>,>,>,,,>,,,,,>,,,,,>,>,>,,>,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,',,,,,',,,',,,,,,,,,,,,>,>,>,>,,>,,>,>,,>>,,>>>,>,>,>,,,,,,,,>,,,,,,>,,,,,,,,,,',',,,',',',',',,',,''',',',','',',''',,'',','',''',','','',',''''',''','''''''',''''','''''''''''",
-";>>;>;>;>;>>;>;>;>>;>;>;>;>;>;;>;>;>;>;>>>;>>>;>;>;;>;>;>>;>;>;>;>;>>;>;>;>;>;>>;>;>;>;>;>;>;>;>;>;>;>;>;>;;>>;>>;>;>;>>;;>;>>;;>>>>;>>;>>;>>>;>>;>;>>>;>>;>>>>;>;>>>>;>>>;>>;>>;>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>>>>,>>>,>>,>>>>>>>>,>>>>>>>>>>>,>,>,>>,>,>,>,>>,,>,>>,,>,>,>>,>,>,>>>>,>,>,>,>,>,>,>,>,>,,>>,,>,>,,,,,>,>,>,,>,>,>,,,>,,>,>,>,,,,>,,,>,>,,,>,>,,,,,,,,,,>,,>,,>,,,,,,,>,,,,>,,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,',,',,,,,,>,>,>,,>>,>,>,,,>>>,,>>>,>,>,>,,,,,,,>,>>,>,>,>,,,,,,,,,,',',',',',','',',,,',',''',','',',''',','','',',''','','''',',''',''','','''''','''''''''''''''",
-";>;>>;>>;>;;>;>>;>;>;>;>;>;>;>>;>;>;>;>;>;>;;>;>;>>;>;>;>;>;>;>;>;>;>;>;>>;>>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>>;;>;;>;>>>;>>>;>;>>>;>;>>;>>;>>;;>;>>>>>>;>>;>>>;>>>>>;>>>>>;>>>>>>>>>>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>,>,>,>,>,>>,>>>,>>>>,>>>>,>>>>,>>>,>>>,>>,>>,>,,>,>>,>,>,>,>,>,>,>,>>,,>>,>,>,>>,>,,>,>,,>,>,,>,,>,>,,,,,>,>,,>,,,,,>,,,,>,>,>,,>,,,,,,,,,,>,,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,,,,>,>>>,>>,>>>,>,>,,,>>>>,>>,>>,>,>>,>,>,,,>,,>,,,,,,,',',',,',',',',',','',''''',',',''',','',',''',''','''','','''',''''',''','''''','','''','','','','''",
-">;>;>;;>;>>;>;;>;>;>;>;>;>;>;>;>>;>;>;>;>;>>;>;>;>;>;>>;>;>;>;>;>;>;>;>;;>;;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>>>>;>>;;>;>;>;>;>;>>>;>>;>>;>>>>>>;>;>;>>>>>;>>;>>;>>>;>>>>>>;>>>>>;>>>>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>,>>>,>,>>,>>>>>>,>,>>>>>>>>>>>>>>,>>>,>,>>,>,>,>,,>>,>>,>,>>,>,,>,>>,>,>,>>,>,>,>,>,>,>,,>,>,,,>,>,,>,>,,>,,>,,,>,>,>,,,,>,>>,,,,>,,>,>,,,>,,,,,,,,,,,,>,>,,>,,,,,>,,,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,',,,,,,,,,',',',,,,,,,,>>,>>>,>>>>>>>,>,>,,,>,>>>>,>,>,,>,>,,>>,,>,,>,>,,,,,,,,',',,',',',',',',',',,',',',','''',',',','','',',','''',',''',',''',''',',''''''',''''''''''''','",
-">;>;>>>;>;;>;>>;>;>;>;>>>;>;>>;;>>;>;>;>;>;;>;>;>;>;>;;>;>;>;>;>;>>;>;>>;>>;>>;>;>;>;>;>;>;>;>;>;>;>>>;>;>;>;;>;>;;>>>;>>;>>>;>;;>>;>;>>;>;>;>;>>>>>>;>;>>;>>>>>>>>>;>>;>>>>>;>>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>>>>>>>>>>>>,>>>>>,>,>,>,>,>,>,>>,>,>>>>,>>>,>>>,>,>,>>,>,>,>>>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,,>,,>>,,,,>,,>,>,,,,>,>,,>,,,,>,,,>,>,>,,>,>,,,,,,,,>,,,,,,,,,,,,,,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,,,,>>,>>>>>>>;>>>,>,,>,>>,,>,>>>,>>,>,>>,,>,,>,,>,,,,,,',',,,'',',',','','',',','',',',',,,'',''','',','','''',','''',''''','','''''','',''''',''''',''''''",
-">;>;;;>;>>;>;>;>>;>;>>;;>;>>;;>>;>;>;>;>;>>;>;>;>;>;>>;>;>>>;>;>;;>;>;>;>;>;>;>>;>;>>;>>;>>;>>;>;>>;;>;>;>;>>;>;>>;>;>;>>;>;>;>>>;>>>>;>>>;>>>>;>;>;>>>>;>>>;>;>>;>>>>>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>>>>>>>,>>,>>,>>,>>,>>>,>>>>>>>>>>>>>>>>,>>>,>,>>,>,>>,>>,>>>,>,>>,>,>,,>,>,>>>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,,,>,>,>,,,>>,>,>,,,,>,>,,,>,,,>,,,,>,,,,,,,>,,,,,>,,>,,,,,>,,,>,,>,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,',,,,,',,',,,',,,',,,,',,,>,>>>>>>;;;;;;;>>>,>,>,>>>>>,,>>,>,>,,>,,>,,>,,>,>,,,,,,,'',,',',',',,',','','',',''','''','',',','''''',',',''',',''',','''''',''''',''',''''',''''',''''",
-";>;>>>>;>;>;>>;;>>;>;;>>;>;>>;>;;>>;>;>>;>;>>;>>;>>;>;>;>;;;>>>;>>;>;>;>;>>;>;>;>;>;>;>;>;>;>;>;>;;>>;>;>;>;;>;>;>>;>>;>;>;>>>;>;>>;>;>>;>>;>;>>>>>>;>;>>>;>>>>>>>>>;>>;>>>>>>;>>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>>>,>>>>,>,>,>,>,>,>,>,>>,>>>>,>>>>>,>,>>,>,>>>,>>,>,>>>>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,>,,>,>>,>,,,>,>,,>,,,,,>,>,,,,>,,,>,,,>,,,>,>,>,,,,,>,,,,,,,,>,,,,,,,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,,,',,,,,,,,,,,',,,,',,,,,,,>>>>>;;>;;;;;;;>,>,>,>,>,,>>>,,>,>,>,>,>,>,,>,,>,,,,,',,,,'',',',','',',',',',',',,'',','',,''','',,','','''',''''','''''',',''','''''''','''''''''''''''",
-";>>;;;>;>;>>;;>>;>;>>;;>;>;;>;>>;>;>>;;>;>;>;>;>;>;>;>>;>>>;>;>;>;>>;>;>;;>;>;>;>;>;>;>;>;>;>;>;>>;>;>>;>;>>;>;>;>;>;>;>>>;>;>;>>;>;>>;>;>>;>>;>;>>>>>>;>>>;>>>;>>;>>;>>>>;>>>>>>;>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>,>,>>,>>>>,>>>>>>>>>>>>>>>>,>>,>,,>>,>,>,>>,>,>>,>,>>,>,>,,,,>>,>,>>,>,>,>,>,>,>,>>,>,>,>,,>,>,,,,,>,>,,,>,>,>,>,>,,,>,>,,>>,,,>,,>,,,,,,,>,,,,,,>,>,,>,,,,,>,,,,,,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,',,,,,,>;;;>;;;;---;;;>>,>,>,>>>,>>>,>,>,>,>,,,>,>,>,>,>,,,,',',,,',',',',',',',',','','',''',','','',''''',''',','',',''',',',''''',''','',''''',''','',''',''",
-">;;>>>;>;>;;>>;>;>;>;>>;>;>>>;>;>;>;;>>;>;>;>;>;>;>;>;;>;>;>;;>;>;>;>;>;>>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>>;>>;>>>;;>;>>;>>;>>>;>>;>>;>>>>;>>;>;>>>;>>>>;>>;>>>>>>;>>>>>>;>>>>>>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>>>>>>>>,>>>>>>>,>,>,>,>,>,>,>,>>,>>>>>>,>>>,>>,>>,>,>,>,>>,>>>>>>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,>,>,>>>>,,>,>,>,,,>,>,,>,>,>,,>,,,,>,,,,,>,>,>,,,>,,>,,,,,,,,,,>,,,>,,>,,,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,',,',,,,,',,,,',,,,,,,,>>>;;;;;;;----;;>>>,>,>,>,>,,>>,>>>,>,>>,,>,>,>,,,,,,',,,,',,',',',',',''','',','',',',''',',','',',''',','',''''','''''''','''',''''''',''''''''''''''''",
-">>;>;>;>;>>;>;>;>;>>;;>;>;>;>;>;>;>>;>;>>;>;>;>;>;>;>>;>;>;>>;>;>;>;>>;>;>;>;>>>;>;>>;>>;>;>>>;>;>;>;>;>>;;>>;;>;>>;>;>>;>>;>>;>>;>>;>>>;>>>;>>>;>>>>;>>>;>;>>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>,>>,>>>>>,>,>>>>>>>,>,>>>>>>>>,>>>>>>>>,>>,>,>,>>,>>,>,>,>>,>>>>,>,>,,,>,>,>,>,>,>,>,>,>,>,>,>,>,,>>,>,>,,>,,,,>,,,>,>,>,,,,>,,,>,,>,,>,>,,>,>,,,,,,,>,,,,,,,>,,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,',,,,,,,,,,,,,,',,,,',,,,',,',,,,>>;;----------;>>>,>>>,>,>>>,>>,>>,>,,>>,>>>>>>,,,,,,,',',',,,',',''',',',','',,''',',',''','',''',','''','',',''',',',',''''''''','',''''',''''''',''''",
-";;>;>;>>;>;>;>;>;>;;>>;>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>>;>;>;>;>;>;>;>>;>;>;>;;>>;>;;>;>>;>;>;>;>;>;>;>;;>;>;>>;>;>>;>;>>;;>;>>;>>;>>>;>>;;>>;>>>;>;>>>;>>>>>;>>;>>>>;>>;>>>>>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>>>>,>>>>>>>,>>,>>>>>>>>,>,>>>>>,>,>,>>,>>,>>>>,>>,>>>>>,>>,,>,>>>,>>,>,>>,>>,>,>,>,>,>,>,>,>,>,>,,>,,>,>,,>,>,>,>,,,>,>,>,,,>,,,,,>,,>,,,,,,,>,>,>,,,,>,>,,,,>,,,>,,,,,,,,,,,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,',,,,',,,,,,,,,,,,,,,>>;;;;---====-;;>>>,>,>>,>,,>>,>>>>>>,>,>>>>,>,>,,,',',,,,,'',,',',',',',',',''',','','',,'','',,'''',','',''''','''''''''','',','','''','''','','''''''",
-">;>;>;;>;>;>;>;>;>>;>;>>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;;>>;>;>;>;>;>;;>;>;>;>>;;>;>>>;;;>;>;>;>;>;>;>;>>>>;>;;>>;>;>;>>;>>>>;>>>;>>;;>>;>>>;>>;>>>>>;>>>;>>>>>>>>;>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>,>>,>>,>,>>>>>>>,>>,>>,>,>>,>,>,,,>>,>>>,>,,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,>,>,,,>,,>,>,,>,>,>,,>,>,,,>,,,>,>,>,,,,,,>,>,,,,,>,,,,>,,,>,,>,,>,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,',,,,,,,',,,,',,',',,',,,,,>>>;----=-===--;>>>>>>,>,>>,>,>,>>>>>>>>>>>>>>,,,,,,,,'',',,,',,,',',','','',,,','','',''','',''',',''',''',',''',',',',','''''''''''','''''''''''''',''",
-">>;>;>>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>>;>;>;>;>>;;>;>>;>>;>;>>;>;>>;>;>>;>;;;>>>>;>;>>;>;>;>;>;;>;>;>>;>>;>>;>;>;;;>>;;>>;>>>;>>>;>>>>>>;>;>>;>>>>;>>;>>>>;>>>>>>>;>>>>>>;>>>>;>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>,>>,>,>>>,>>>>>>>>>>>>,>,>,>>,>>>,>>>,>>>,>>>,>,>>,>,>>>,>,>>,>,>,>>>,>,>,>,>,>,>,>,>,,>,>,>,,>,>,,>,>,>,,>,,>,,,,,,>,,>,>,,,>,,,,,,,,>,>,,,,,,>,,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,,,,,,,',,,,',,,,,,,,,,,,,,,,,,>>;;--=====--;;>>>>,>>,>,>,>>>>>>>>>>>>>>>,>,>,,,,',,',,,,,,'',,','',',','''','',','',,'',''','','',''',''''',''''''''''',''',''',''''''''','''','''''",
-";>;>>;>;>;>>;>>;>;>;>;>;>;>;>>>;>;>>>;>;>;>;>;>;>;>;>;>;>>>;;>;>;>>;;>;>;>;>;>;>;>>>;>;;>;>;;>>;>>;>;>>;>;>;>>;;>;>>;>;>>>>;>>>;>>;>>;>;>>;>;>;>>>>;>>;>;>>>>>;>;>>;>>>>;>>>>>;>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>,>>,>>>>>>>>,>,>>,>>>>>>>>>>>,>,>,>,>,>,>>>>>>,>>,>>,>,>>,>>>,>>,>>,>,>>,,>>,>,>,>>>,,,>,>,>,>,>,>,>,>,>>,,>,,>,>,,>,,>,,,>>,,>,,>>,>>,,>,,,>,>,,>,>,>,>,,,,>,,>,,,,>,,,,>,,,>,,,,,,,,,,,,>,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,',,,,,,',,,',,,,',',,',',',,,,,,,>>>;--==**==-;;>>>>>>,>,>,>,,>>;;>;>>;>>>>>>,>,,,,',,,',,,,,,,',',','',',,,''',','',''',',','','','',','',',''',',','','''',''',''',''','''''','''''''",
-">;>;;>;>;>;>;>;>;>;>;>;>;>;>;;>>;>;;>>;>;>;>;>;>>;>>;>;>;;;>>;>;>;>>;>>;>;>;>;>;>;>;>;>>;>;>>;>;>;>;>;;>;>;>;>>>;>;>>;>>;;>>;>;>>;>>;>>>;>>;>>>;>;>>;>>>>>>;>>>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>,>,>>>>>>>>>>>>>,>,>,>>,>>,>>>>,>>,,>>,>,>,>>>,>>,>,>,>,>,,>>>>,>,>,>,>,>,>,>,,,>,>,>,>,>,>,>,,>>,,,,>,>,,,,,,>,,,>,,,,>,,,,,,,,,,>,,,,,>,,,,,>,,,>,,,,>,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,,,,,,,,',,,,,,>>;;--=***==--;>>>>>>,>,>,>>>>>>;;;;;>;;>>>>,,,,,,,',',,,,,,,',','',,'',''',',''','',,'',''','',''',''',''''','''''''''',''''''''''''''','''''''''''''",
-">;>>;>>>;>;>;>;>>;>>;>;>;>;>>;;>;>>;;>;>;>;>;>;>;>;>;>;>>>;>>;>;>;>;>;>;>;>;>;>;>;>;>;;>;>;>;>;>;>>;>>;>;>>;>;>>;>;>>;>;>>;>>>>;>>;>>;>;>>>>;>>>>>>>>;>>;>>>>;>>>>;>>>;>>>>>>>>>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>>>>>>,>>,>>>,>>>>>,>,>,>,>,>>>>>>>>,>>,>>,>,>>,>>>,>>>,>>,,>>,>,>,>,>>>>,,,>,>,>,>,>,>,>,>,>>,,>,,>,>,>,>,,>,,,>>,>,,>,>,>,,,>,>,>,>,,>,>,>,>,>,,,>,,,,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,,,,,,,,,',,,,,',,',,,',,,,',,,>,>;--==*****--;;;>>>>>,>,>,>,>>>;;;;;;;>;>>>>>,,,,,,,,',',,,,,,,',,'',',',,','',,'',''','',''','',',',''',',''',',',',''''','','',','''''''',''''',''''",
-">;>;>;>;>;>;>;>;>;>;>;>>;>>;;>>;>;;>>;>>;>>;>;>;>;>;>;>;>;>;;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>;>;>;>;>;>;>;>;;>;>;>>;>;>>;>>;>>;;>>>;>>;>>>>;>>>;>;>;>;>>>>>>;>>>>;>>>>>>>>;>>>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>,>>,>>>>>>>>>>>>>,>>>>>>>>>>>,>,>,>,>>,>>>,>>>,>>,>,>,,>>,>>>,>>,>>>,>,,,>>>,>,>,>,>,>,>,>,>,,>,>,>>,>,,,>,>,,>>,,,,,>,,>,,,>,>,,,,,>,,,,,,,,,,,,,>,,,,>,,,,,>,>,,>,,,,>,,,,,,,>,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,',,',,,',,,,,,,,',,,,',,,,,,>>;--==**&***=--;>;>>>>>,>,>,>>>>>;;;;;;;;>>>,>,,,,,,',,,,,>,,',','',','','',',''','',,'',',',''',''','',''''','''''''''','''''''''''',''''''''','''''''",
-">;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>>>;>;>;>;>;>>;>;>;>;>;>;>;>>;>;>;>;>;>>;>>;>>;>>;>;>;>;>>;>;>;>>;>;>;>>;>>;>>;>;>>>;;>>;>;>>>>;;>>;>;>;>>>;>>>>>>>>>;>;>>>>;>;>>;>>;>>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>,>>,>,>>>>>,>,>,>,>,>>>>>>>>,>>,>,>>,>>,>>,>>>>,>,>,>,>,>,,>,>>>,,>>,>,>,>,>,>,>,>,>,>,>,,,>,,>>,,,>,>,,>>,>,>,>,,>,,,,>,>,,,>,>,>,>,>,>,,,>,,,,,>,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,,,,,,,,,,,,',,',,,,',',,',,,,,>;-==**&*&**==--;;;>>>>>,>,>,>,>;;;-;;;;>;>>>>,>,,,,,,,',,,>,,,,',,',',',',''',','',''',',''',','',''','',',''',',',',',''',','',''''''','',''''''''''''",
-";>;>;>;>;>>;>>;>;>;>>;>;>;>;>;>;;;>;>;>>;>;>;>;>;>;>;>;>;>;>;>>;>;>;>;>;>;>;>;>;>;>;>;>;;>;>;>;;>;>;>;>;>;>;>>;>;;>>>;>;>>;>;>>>;>>>>;>>;>>>;>;>;>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>;>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>>,>>,>>>>>,>>>>>>>>>>>>>,>>>>>>>>>>>>>,>,>,>>>,>>>,>>,>>>>,>,>,>>>,>>,>>,>>>>,,>>,>,>>,>,>,>,>,>,>,>,,>,>>,>,>,,>,>,,,>,,,>,,,>,,>,,>,>,,,>,>,,,,,,,,,,,,>,,,,>,,,,>,,>,>,,,,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,',,,,,,,',,',,,,,,,',,,,,,,,,',,>>;;==***&&&&*==--;;;;>>>,>,>,>>>>>;-;--;;>;>>>,>,,,,,,,,,>,>,>,,,,'','','',',',',','',,'','','''',''','',''''',''''''''''''''''''',',''''''''','''''','''",
-";>;>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>>;>>;;>;>;>;>>;>>;>>>;>;>;>;>;>>;>;>;>;>;>;>;>;>;>;>>;>>>;>;>>;>;>>;;>>;>>;>;>>>;>;>;>>;>>;>;>>>;;>>;>>>;>>>>;>>>>;>>>>;>;>>>;>>;>>>;>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>,>,>>>,>>>,>,>,>,>,>,>>>>>>,>>>,>>>,>>,>,>>>,>,>,>>,>>,>,>,,>>,>,>,>,>,>,>,>,>,>,>,>,>,,,>,,>,>,>,,>>,,>>,,>>,,>,,>,>,,>,,>,,>,>,>,>,>,,,,>,>,,,>,,,,,,,,,>,,,,,,,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,',,,,',,',,,,,,,>>;-=*&&&&&***==--;;;;>>>>,,>,>>>>>;;--;;;;>>>>>,>,,,,,,,,,,>>>,,',,',,',','',''','',''','','',','',','''',',''',',',',''',','','''''''',''''''''','''''''",
-";>>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;;>>;>;>;>;>;>;>;>;>;>;>;>;>;;>>>;>;>;>;>;>;>>;>>;;>;;>>;>;;>>;>;>>;>;>;>>>;>;>;>;>;>>;>>>>;;>>>;>>>;>>;>;>>>>;>>;>>>>>>;>>>;>>;>>>>>>>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>,>,>,>,>,>>,>>,>>,>,>,>>>,>,>,>,>,>,>>,>,>>,>,>,>,>,>,>,>,>,>,>,>>,>,>,>,>,>,,,>,,,>,,,>,,>,,,,>,,>,,,,,,,,,,,,>,>,,,,,,,,,,,>,,>,,,,,>,,>,,,,,,>,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',',,,,>;;==**&&&&&**=---;;;;;>>>,>,>>>>>;;;---;;;;>>>>>,,>,,,,,,>>>>>,,,',''',',','',,'','',,'',''','''',''',',''''','''''''','''''''''','','''''','''''''''''''",
-">;>;>;>;>;>;>>>;>;>;>;>;>;>;>;>;>;>>;;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>;>;>;>>;>>;;>>;;>>;>;>;>>>;;>;>;>;;>;>;>;>;>;>>>;>>;>>;;>>>>;>>>;>>;>>>>>;>;>>;>>>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>,>>,>>,>>,>>>>>,>>,>>,>,>,>,>,>>>>>>,>>>,>>,>>>,>>>,>,>,>,>>,>>,>>,>,>,>,>,>>,>,>,>,>,>,>,>,>,,>,,>,,>,>,,,>,>,,>>,,>>,,>,,>,>,,>,,>,>,>,>,>,,,,,,>,,>,,>,,>,,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,',,,,,,,',',,',,,,,,',,,,,,,,,,,,>>;-=*&&&&&&&**=---;;;;>>>,>,>,>>>>;;----;;>>>>>,>>>,>>,>>>>>>>>,,,,,,,','',',''',',''',',',''',','','','',',''',',',''''',''',','''''''''','''',''''''''''",
-";>;>>;>>;>;>;;>>;>;>;>>;>>;>;>;>>;>;>>;>;>;>;>>;>;>;>>;>;>>;>;>;>;;>>;>>;>;>;;>>;;>>;>>;>;>;>;>>;>;>;>>;>;>;>;>>;>;>;>;>;>>>;>;>>;>;>;>>>;>;>>>>;>>>;>>;>>;>;>>;>>>;>>>>>>>;>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>>>,>,>,>>>,>>>,>>,>>,>,>>>,>>>,>>,>,>,>,>,>,>,>,,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,,,>,,,>,,,>,,,>,,>,,>,,,,,,,>,>,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,,,,,,,',,',,,,,,,,,,,,,,,,,,,,,,,,,,,>>;-=**&&&&&**==----;;;;>,>,>,>>>>>;;---;;;;;>>>>>,>>>>>>>>>>>>>,,,'''',',','',,'',',','','',',''','','''''''','''''',',''',''''''','''',''''''''',''',''''",
-";>;>;>;>;>;>>;;>;>>>;;>>;>;>;>;>;>;>;>>;>>;>;;>;>;>;;>;>;>;>;>>;>>;;>;;>;>;>>;>;>>;>;;>;>;>;>;>;>>;>;>;>>;>>>;>;>>;>>;>>>;>>;>>;>>;>>>;>>;>>>;>>>;>>>>>>;>>>>>>>>;>>>>>;>>>>>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>>>>>>>>,>>,>>>>>,>>>>>,>,>,>,>>>>>>>>,>>,>,>>,>>,>,>>,,>>,,>>,>>,>>,>,>>>,>,>>,>,>,>,>,>,>,>,,>,,>,>,>>,>,>,,,>,,>>,,>>,,>,,>,>,,>,,>,,>,>,>,,,,,,,>,>,,>,>,>,,>,,,,,>,,>,,>,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>,;;-=**&&&&&&**==--;-;;;;>>>,>,>>>>>;;----;;>;>>>>>>>>>>>>;>;>>>>,,,,,','','',''',''','','',''',','','',',',',''',','''''''''','','''',''''''','''''''''''''",
-">;>;>;>;>>;>;>>;>;;>>;;>;>>;>;>;>;>;>;>;>;>;>>;>;>;>>;>;>;>;>;>;>;>>>>;>;>;>;>;>;;>;>>;>;>;>;>;>;;>;>;>;>>;;>>;>>;>;>;>;>>;>>;>>;>>;>>>;>>>;>>>;>>>>;>>>>>>;>>;>>>>>;>>>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>>>>>,>,>>>,>,>>>>>>>>>,>,>,>,>>,>>>>,>>,>>>>,>>>,>>>,>,>,>,>>,>,>,>>>,>,>,>,>,>,>,>,>,>,>,,>,,,>,,>,>>,,>,,,>,,,>,,>,,,,,,,>,,>,,,,,,,>,>,>,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,>,>,,,,,,>,>;;-=*&&&%&&&*==----;-;;>>>,>,>,>>>;;----;;;;>;>;>>;>>;;;;;;;;;>>,,,',',',','',',',',','',',',''''','','''''''',''''','','','''''',''''''','''',''''''''''''",
-">;>;>;>;;>;>;>;>>;>;>>;>;;>;>;>;>;>;>;>;>;>;>;>>;>;>;>>;>;>>;;>;>;;;;>;>;>;>;>;>>;>;>;>>;>;>;>;>>;>;>;>>;>>>;>>;>;>>>>>;>;>;>>;>>;>>;>>>;>>>;>>>;>>>>>;>>;>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>,>>>>>>>>>>>>,>>>>>>>>>>>>>>,>,>,>,>>>>>>>,>>,>,>>,>>>,>,>,>,>>,,>>,>>,>,,>>,>,>,,>,>,>,>,>,>,>,>,>,>,>>,>,>,>,>,,,,>,>,>,,>>,,>,,>,>,>,,,>,,>,>,>,,,,,,,>,,,,,,>,,>,>,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,',,,,,,,,,,,,,,,>,>,,,,,,,>>;-=**&&%&%&**==--;-;;;>>>>,>,>>>>>;;-=--;;;>;;>;;;;;;;;;;;;;>;>>,,,',',','',',''',''','',''',',,''','',',',',''',',''''',''','''''','''''''''''','''''','''",
-";>;>;>;>>;>;>;>;>;>;>;>;>>>;>>;>>>;>;>;>;>;>;>;;>>;>;>;>;>;>>>;>;>>>>>;>>;>;>;>>;>;>;>;;>;>;>>;>;>;>>;>;>;>;>;;>>>;;;>;>>>>>;>>;>>;>>>;>>>;>>;>>>;>>;>>>>>>>>>>>;>>>>;>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>,>>,>>,>>,>>,>>>>>>>>>>,>,>>>,>>>>,>>,>,>>>,>,>,>>>,>>,>,>>,>,>,>,>>,>,>,>,>,>,>,>,>,,>,,,>,>,>,>,,>>,,>,>,>,,,,>,,>,,,>,,>,,>,,,,,,>,>,>,,,>,,>,,,,,,,,>,,>,,>,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,',,,,,',,,,,,,,,',,,>,>,>,>,>>>,,,,,,>>>;;-=*&&&%&&&&*=---;;;;;>>>,>,>,,>>>;--==--;;;>;;;;;;;;;;;;;;;;;>>,,,','',',,''',,'',',',''','''',',''','''''''','''''',''''''','','''','''',''''''',''''''''",
-">;>>;>>;>;>;>;>;>;>;>;>;>;;>;>;;;>;>;>>;>>;>;>>;>;>>;>;>;>;;;>;>>;;;;>;>;>>;>;;>;>;>;>>;>;>>;;>>;>;>;>;>>;>;>>>;;>>>>>;>;>;>>;>>;>>;>>>;>>>;>>;>>>>>>>;>;>>;>>;>>>;>>>>>>;>>>>>>>>>>;>>>>;>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>>,>>>>>>,>>>>>>>>>>>,>>>>>,>,>,>,>,>>>>,>>,>,,>>,>>>,>,>>>,>>,>>,>>,>>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>>,>,,>,,>,>,,>,,,>,,>>,,,>,,>,>,,>,,,,>,>,,,,,,,,>,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,>,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,',,,,,,,,,,,>,>>,>>>>>>,,,,,>>>;--**&%&%&&&*==-;;;;>>>>>>,>,>>>>>;;===---;;;;;;;;;---;-;;;;;;>;>>,,,',',''',,''',',''',','',',''',','',',','''',',',''','','''''''''''',''''','''''''''''''",
-">;>;>;;>;>;>;>;>;>;>;>;>;>>;>;>>>;>>;>;>;;>>;>;>;>;;>;>;>;>>>;>;;>>>>;>;>;>>;>>;>>>;>;>;>>;;>>;;>>;>;>>;;>>>;;>>;>;>;>>;>>>;>>;>>;>>>;>>>;>>>>>;>;>;>>>>>>>>>>>>>>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>,>>,>>>>>>,>>>>>>>>>>>>>,>>>,>>>>,>>>,>>,>,>,>>,>,>,>,>,>>,>,>>>,,>>,>,>,>,>,>,>,>,>,,>,,>,>,,>,>,,>,,>>,,>,,,>>,,,>,,,>,,>,>,,,,,>,>,>,,,>,,>,,,,,,,>,,>,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,',,,>,>>,>>,>;>>>,,,>,>>>--=*&&&%%&&&*==--;;>;>>>,>>,>,,>>;;-====--;;;;;;-;-;---;--;;;;;>>>',','',',''',',''',,',''','''','''','''''',','''''''''''''',','','''''''''''''''''''''''''",
-">;>;>>;>;>;>;>;>>>;>;>;>;;>;>;>;>;;>;>;>>;>;>;>;>;>>;>>;>;>;>;>>;>;;>;>;>;;>;>;>;;>;>;>;>;>>;>>;>;>;>;>>>;;>>>;>>;>>;>>>;;>>;>>;>>>;>>;>>;>;>;>>>>>>;>>;>;>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>,>>>>>>,>>>>>,>>,>>>>,>,>,>,>,>,>>,>,>>,>>>,>,>>>,>>,>,>,>>,>>,>,,>>>,,,>>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,,>,,,>,,>>,,,>,,>,>,,>,,,>,>,>,,,,,,>,,,,,,,>,>,,,,,,,,>,,,,,>,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,,>>>>>>>;;;>>>>,>>>;;--=*&&%&%&&**=--;;;>>>>>>,>,>>>>;;--====----;--;--------;-;;;;;;>>,,',,','',,'',',,''''','',','',','',',',''''',',','','','''''''''',''''','''',''''''',''''",
-">;>;>;>;>>;>>;>;>;>;>>>;>>;>>;>;>>;>;>;>;>;>;>;>;>;>>;;>;>;>;>;;>;>>;>;>;>>;>;>;>>;>;>;>;>;;>;;>;>;>;>;;>>>;>;>;>>;>>;;>>>;>>;>>>;>>;>>;>>>>>>>>;>>>>>>>>>>>>>>;>>>>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>,>>>>>>>>,>>>>>>>>>>>>>,>>>>,>>,>>>,>,>>,>>,>>>,>>,>>,>>,,>>>>,,>,>,>,>,>,>,>,>,>,>,>,,>,>>,>,>,,>,,>,>,>,,,>,>,>,,>,,>,,>,,,,,,,>,>,,,>,>,>,,,,,,,>,,>,,,,,,,,,,,,,,,>,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,',,,,,,',,',,,,,,,,,,',,,,',,,,>>>>;>>;;--;>,>>>>>;;-=**&&%%%&&&*=--;>>>>>>,>>,>,>>;;--=***==---------=-=----;;;;;;;>,,,,',',',''',''''',,',','',','''',''''''',','''''',''''''',''','''''',''',''''''',''''''''",
-">;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>;>;>;>;>;>;;>>;>;>;>;>>;>;;>;>;>;>;>;>;>;>;>;>;>;>>;>>;>;>;>>>>;>;>;>;>>;>;>>>>;>>>;>>;;>>>>>;>>>;>;>;>>>>;>>;>>;>;>>;>>>;>>>;>>>>;>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>>>>>>>>>>,>>,>>,>>>>,>,>>>>,>,>,>,>,>,>>>,>,>>,>>,>>>>,>>,>>,>,>>,>>,>,>>>,,>,>>,>,>,>,>,>,>,>,>,>,,>,>,>,,>,>,>,>,>,>,>,,>>,,,,,,,,,>,,>,,>,>,>,,,,,>,,,,,,,,>,,>,,,,,,,,,>,,>,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,,,,',,,,,,,>>;>;;;;----;>>>>>;;-==*&&%&%&&&**=--;;;>>>>>>>,>>>>;;-===**==------=-===-=---;-;;-;;;>,,',','',','',,','',''''''''',','',',',''''',',''''',',''''',''','''''''''''''''''''''''''",
-">;>>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;;>;>;>;>;>;>>;>>;>;>;>;>>;>;>;>>>;>>;>;>;>;>;>;>>;>>;>;>;>;>;>;>;;>;>;>>;>>;;>>>;>;>>;;>>;>>>>;>;>>>;>>>>>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>,>>>>>,>>>>>>>>>>>>>,>,>>>,>>,>,>,>>,>,>,>>,>,>,>,>,>,,>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,,,>,,>,,>,,,>,,,>,>,>>,>,,>,,>,,,,,,>,>,,,>,>,,>,,,,,,,>,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',',,,,,,,,',,,,>>;-;-;--==-;;>>>>;--=*&&&%%%%&&**=--;;>;>>;>>,>>>;;;-==*****==--=-=========-;-;;-;-;>>,,,,',,'',',''',','',',,',,',''',''''''',','''''',''''',','''''''','''''','',''''''''','''",
-">;;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>>;>>;>;>;>;>;>;>>>;;>;>;>;>;>;;>;>;>>;>>;>;;>>;>;>;>;>;>>;>>>;>;>>;>>;>>>;;>>>;>>>>;>>;>;>>>>;>>>;>;>;>;>>>>>>>;>;>;>>>>;>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>>,>>,>>>>>>>>>,>,>>,>>>>,>>>>,>,>,>,>,>>>>>>,>>,>>>>>>,>>,>>>,>,>>,>>>,>>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>>,>,>,>,,>>,,>>,,,>,,,,>,,,>,,>,>,,,,,,>,,,,,,,,,>,,>,,,,,,,,,,,,,,,>,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,,,>>;;----==**=-;;;;;;--=**&%&%%&&&&*==--;;;;;;>>>>>;-==**&&&&&&**=======*====---;-;--;-;>>,,,,',,''',',''',''''''''''','',',',','''',',',''',''''''','','''''',''''''''''''''''''''",
-">>;>>;>>;>>;>;>;>>;>;>;>>;>;>;>;>;>>;>;>;>;>;>;>;>;>;>;;;>>>;>>;>;;>>>;>>;>;>;;>;>>;;>;>;>;>;>;>;;>;>>>;>;>;>;;>>>;>;>>;>;>>;>>>;>;>>>;>>;>>>>>>>>;>;>>>>>>>;>>>>>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>,>>>>>>>>>>,>,>,>>,>>>,,>,>>,>>,>,>>>,>,>,>,>,>>,>>,>,,>>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,,>,,,>,,,>,,,,>,,>,>,,,>,,,>,,,,>,>,,,>,>,>,,>,,,,,,,,,>,,,,>,,>,,,,,,,>,,,,,,,,>,,>,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,,,,,,,,,,',,',,,,>>;---===****=-;;;;--=**&&%%%%%&&**==-----=------==***&&&%%%%%%&&&*********==-;------;;;>>,,,,',,',',',,',',,',',',',','''''''''','''''''''',''','''''''''''''''''''','''','''''''",
-";>;>;>;>;;>;>;>;>;>;>>;;>;>>>;>;>;;>;>;>;>;>;>;>;>;>;>>>>;;>;;>;>>>;;>;;>;>;>>;>;>;>>;>>;>;>;>;>>;>>;;>;>>>;>>>;;>>;>;>>>;>;>;>>>>>;>>;>>>>;>;>>;>>>>>>;>>>>>>>>;>>>>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>,>>>>>,>>,>>>>,>>>>,>,>,>,>,>>>>>,>>>,>,>>>,>>,>>,>>,,>>>,>>>,>,>,>,>,>>>,,>,>,>,>,>,>,>,>,,>,,>,>,,>,>,,>,>,>,>,>,>>,>,,,,>,>,,>,,,>,>,,,,>,,,,,,,,,,,>,>,,>,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,,',,,,,,,,,,,,,>;;======*&&&*=-----==**&&&%%%&&&***=-===**&*===----;----==**&&%%%%%&&***=*==-------;;;;;;>>,,,',''','''','''',''','''',',',',',''',','',''''',''','',''','','','',''''','''''''''",
-">;>;>;>;>>>;>>;>;>>;;>>>;>;;>>;>;>>;>;>;>;>>>;>;>;>;>;;;;>;>>>;>;;;>>;>>;>;>;>>;>;>;;>;;>>;>>;>;>;>;>>>;>;;>>;>>>;>>>>;;>>>>>>;>;>>>;>>>>;>>>>;>>>>>;>>>>;>>>;>>>>>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>>>,>>>>,>>>>>>>>>>>>,>,>>,>,>>>>,>>,>,>,>,>>>,,>>,,>>,>,>,>>,>,,>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,,,>,,>,,,,,>,>,,,,>,>,>,,,,>,>,,,,>,>,>,>,,,,,,,,,>,,,,,,,,>,,,,,,,,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,',,,,',,',,,,>;-==*****&&&&*=--===**&&&%%%%%&&&**=**&%%%&*-;>,,',,''',,>;;;--*&&%%%%&****===--==--;-;;;>>>,,,,,','',','',','',''',','''''''''',''',''''',''''''''''''''''''''''''''''''''',''''",
-">;>;>;>;>;;>;>;>;;>>;;;>;>>;;>;>;>>;>;>;>>;;>;>>>;>;>>>>;>>;;>;>>>;;>;>>;>;>;;>;>;>>;>>;>;>;>;>;>>;>;>;>>>>;>;>;>>;>;>>>;>;;>>>>>;>>>;>;>>;>>>>>>;>>>;>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>>>>>>>>>>>>>>,>,>>>>>,>>>,>,>,>,>,>>>>>>,>>>,>,>>,>>>>>,>>,>,>>>,>>>,>,>,>>,>,>>>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,,>,>,>,>,,>,>,>,,,>,>,,>,,,,>,,,,,,>,>,,,,,,,,,>,,,>,,,,,,,,>,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,',,,>;-=**&*&&&&&&&*====***&&%%%%%%&&&*&&&&%%&*->,,',','','',,>>;;;>>;-*&&%%%&**=====*=--;-;;;;>>,,,,,'',','','''','',,'''',',',',',''',''',''''','',',''','''''''''''''''''''''''''''",
-";>;>;>;>;>;>;>;>>;>;>>>;>;;>>;>>;;>>;>;>;;>>;>;;>>;>;;>;>;;>>;>;>;>>;>;;>;>;>>;>;>;>;>;>;>;>;>>;>;>>;>>;>;;>>;>>>;>>>;>;>>>;>;>;>>>;>>>>;>>;>>;>>>;>>>>;>>>>>>>;>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>,>>>,>>>>>>>,>>>>>>>>>>>>>>>,>,>,>>>,>>>,>>,>,>,>>,>>,>>,>>,,>,>>,>,>,>>,,,>,>,>,>,>,>,>,>,,,>,,>,>,>,,>,>,,,>,,,>,>,>,,,>,,>,>,,,,>,,>,>,>,,,,,>,>,,>,,,,>,,,,>,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,,,,',,,,,,>>;-**&&&&&%%%&&**=****&&&&%%%%%%&&&&%$%&*->,,',',''''',',,>>>>;>;>>>;=*&%$%&*=*=**=---;--;;;>>,,',,,''','',','','''',,''''''''''','''''',','''''''''''''','',','''''''''''''''''''",
-">;>>;>;>>;>>;>>;>;>;;>;>>>;>;>;>>;;>;>;>>;;>;>>;;>;>>;>;>>;>;>>;>;>;>;>>>;>;>;>>;>;>;>;>;>;>;;>;>;>;>;>;>>>;>;>;>>;>>;>>;>>>>>>;>;>>;>;>>>>>>>>;>>>>;>>>>;>>>>>>>>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>,>>,>>>>,>>,>,>,>,>,>>>>>>>,>,>>,>>,>>>>>,>,>,>>,>,>,>>,>,>>,>,>,>>>,>,>,>,>,>,>,>,>,>,>,>,>,,>>,>,,>>,,>>,,,>,,>,,>,,,,,>,>,,,,,,,,,>,>,,,,,,,,,>,,,,,>,,,,,,,,>,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,,,,,,',,',,,,,',,,,,>--**&&&&&%%%%%&&***&*&&&%%%%%&%&%%%%%&=;,,',','',',''''',,>>>;>;>;;>;;=*%%$%&****=-------;;>>,,,,',',','''','',','''',',',',',''',',''''''',','','',''''''''''','''''''''''''''''",
-">;>;>>;>;>;;>;;>;>;>>;>;;;>>;>;;>>>;>>;>;>>;>;;>>>;>;>;>;>;>;;>;>;>>;>;;;>>;>;>;>;>;>;>;>;>;>>;>>;>>;>;>;>;>;>>>;>>;>>;>>;>;>;>>>>;>>>>>;>;>;>>>>>;>>>;>>>>;>>>;>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>>>>>>>,>>>,>>>>>>>,>>>,>>>>>>>>>>,>,>,>,>>>,>>,>>,>,>,>>>,>,>>,>>>>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,,>,>,,,>,,,>>,,>,,>,,>,>,>,,>,>,>,>,>,,,,,>,>,,>,,,,>,>,,,,,,,>,,,,,,>,,,,,>,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,',,,>>-=*&&&%%%%%%%%&&&&*&&&&&&%%%%%%%%$%&*=;;,,,,',',''''',',,,,>>>>>>>>;>;;;=&%%%%&&**---;-----;;>,,,,',''',','','''',',''''''''''','''',''','''''''''''''','''''''''',''',''',''''''",
-">;>;;>;>;>>;>>;>;>;>;>>;>>;>;>>;;;>;>;>;>;>;>>;>;;>>;>;>;>;>>;>;>;;>;>>>;>;>>;>;>;>>;>>;>>;>;>;>;>;>>>;>>;>>;>;>>;>>;>>;>>>;>>;>>>>;>;>>>>>>>>;>>>>>;>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>,>>>>>>>>,>>,>>>>>>>>,>,>,>>,>>>>>>>>,>>,>>>,>>>,>,>,>>>,>>,>,,>,>>,>,>,>>,>,>,>,>,>,>,>,>,>,,>,>,,,>,>>>,,,>,>,,>>,,,>,,>,,>,,,>,,>,,,,,,,,,,>,>,,,,,,,,,>,,,,,,,>,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,>>-=*&&%%%&%%$%%%&&&&&&&%%%%%%%%$$%%&*=-;>>,',','',',''''',,,,,>>>>>>>>;;;;-*&%%%&**=--------;;>>,',',,,'',','',',''',',',',','''',''''',''','',',''''',''','',''''''''''''''''''''",
-";>;>>;>;>;;>>;>;>;>;>;>;>;;>;>;>>>;>;>;>;>>;>;>;>>;;>;>;>;>;>;>;>>;>;>;;>;>;;>;>;>;;>;>;>;>;>;>>>;>;>;>>;>;>>;>;>>;>>>;>>;>>>>>;>;>>>>>;>;>>;>>;>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>,>>>>>>>>,>>,>>>>>>>,>>>>,>,>,>>,>>,>,>>,>>>>,>,,>,>,>,>>,>,>>,>>,>,>>,>,>,>,>,>,>,>,>,>,>,>>,,>,,,>,>,>,>,,,>,>,>,,>,,,>,,>,,>,>,>,>,>,,,,>,>,>,>,,,,,,,>,,,,,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,',,,,,,,,',,,,,,',,',,,,>-=&&&%%%%%$%$$%%%&&&&%&&%%%%$$$%%&*=--;>>,,,',',''',',','',,,,,,,>>>>>>>;;-*&%$$&*==----=----;>,,,,''','''','','',''''''''''',''',','''''''''''''',''''''''''''''''''''''''''''''",
-";>;>>;>;>>>;;>>;>;>;>;>;>>;>;>;>;>;>;>;>;;>;>;>;;>>;>;>;>;>;>;>>;>;>>;>>;>;>>>;>;>>>;>;>;>>;>;;>>;>;>>;>;>>;>>>;>>;>;>>;>;>;>;>>>>;>;>>>>>>>>>>>>>;>>>>>>;>>>>>>>>;>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>,>,>>,>>>>>>,>,>>>>>,>>>>>>,>>>,>>>>,>>,,>,>>>>,>>,>>,>>,>,>,>,>>,,>>,>,>,>,>,>,>,>,,>,,>,,>,>,>,>,,,>,,>>,,,>,,>,,>,>,,,,>,,,,,,,,,,>,,,,,,,,,,,>,>,>,,,>,,,,,,,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,',,,,,',',,,,,,',,>>;=*%%%%$%$$%$%%%%%%%&%%%%%%$$$$&&===--;>>,,,,,',,,',',',,,',,,,,,,>>>>;>;;;-*&%$$&*====-====--;>,,',''',','','','',',',',',''','''''','',','','','''''''''''','''''''''''''''''''",
-">;>;;>;>;;>>;>;>;>;>;>>;>;>;>;>;>;>;>>>;>>;>;>>>;>;>;>;>>>;>;>;;>;>;;>;;>;>;;>>;>;;;>;>;>;;>;>>;>>;>;;>>;>;>>;>>;>>;>>;>>>>>>>>;>>>;>>;>>;>;>>;>>>>>;>>>>>>;>>;>>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>>>>,>>,>>>>>>,>>>>>>>>>,>>,>>>>,>,>,>>,>,>,>>,>>,>,>>,>>,>>>,,>>>,>>,>>,>,>,>>,>,>>,>,>,>,>,>,>,>,>,>,>,,>>,>,>,,>,>,,>,,,>>,,>,,,>,,,>,>,,>,>,>,>,>,,,>,>,>,,>,,,,,,,,,,,,>,,>,,,,,>,,,,,,>,,,>,,,,,,>,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,,,,,,,,',',,,,,>>-**&%%%%$%$$$$$%%%%%%&%%%%$$$%%&**=--;>>>,,,,,,,',,,,,,,',,,,,,,,,,,>>>>;;;;-*&%$%%*=====-===--;>,,',',''',''','',''''''','',''','','''''''''''''''''','','''''','''',''','''''''",
-">;>>;>;>>;;>;>;>;>;>>;;>>;>;>;>;>;>;>;>;>;>>;;;>;>;>>>;;;>;>;>>;>;>>;>>;>;>>;;>;>>>;>>;>;>>>;>>;>;>>>>;>>;>;>>;>>;>>;>>;>;>;>;>>;>>>;>>;>>>>>>>>;>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>>>,>>,>>>>>>>>>,>>>>>>>,>>>>>>,>>,>>>,>>>>>,>,>>>,,>>,>,>,>,>>,,>,>,>,>,>,>,>,>,>,>,>,>,,>>,,>,>,>,>,,>,>,>,,,,>,,>,,>,>,,,>,,,,,,,,,,,>,,,,,,,,,,,>,,,>,,>,,,,,,,,>,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,',,,,,',,,,>;=*&%%$%$$%$%$$%%%%%%%%%%%$$$%&**==-;;>>>,,,,,,,,,,,,,,,,,,,,,,,>,>,,>>>>;;--=*&$$%&**=========;;,,,''',''',''','',',',''',''',''''''','','','''''','''''''''''''''''''''''''''''",
-">;>;>>;>;>>;>;>;>;>;>>;;>>;>;>;>;>;>;>;>;>;>>>>;>;>;;>>>;>>;>;>;>>;>;>;>>;>;>>;>;>;>;>>;>;;;>;;>>>;;>;>;>;>>;>>;>>;>>;>;>>>>>>;>>>;>>>>>>>>;>>;>>;>>>>>;>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>,>>,>>>>>>>,>>,>,>>>,>,>,>>>,>,>,>>,>>>,>>>,>,>>,>,,>>,>,>>>,>,>,>>>,>,>,>,>,>,>,>,>,>,>,>,>>,,>,,>,,>,,>,>,,>,>>,>,,>,>,,>,,>,,,>,>,>,>,>,,,>,>,>,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,',,,,,',,,,,',,,,,,>>-=&&%$%$%$$$$$$$$%%%%%%%$$$$%&&*==-;;>>>>,>>,,,>,>,,,,>,,>,,,>,>,>,>>>>>>;;;--=*&$$$%**====**===;>,,,,''',',','','''''','''','','',','''''''','',''''',''',''''''''''''''''''''''",
-">;>;;>;>;>;>>;>;>>;>;>>;;>;>>;>>;>>;>;>;>;>;;;>;>;>>;;;>>;>;>;>;>;>;>>;;>;>;>;>>;>;>;;>;>>>;>>>;;>>>;>>;>>;>>;>>;>>;>>>>;>;>>>>;>>>;>;>;>;>>>>>>>>;>>>>>>;>>>>>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>,>>>>>>>>>,>>,>>>>>>>>>,>>>>>>,>>>>>>>,>>,>>,>,>,>>,>>>>>,>>>,>,>,>>,>,,>>>,>>,>,>,>,>,>,>,>,,>,,,>,>,>,>,>,>,,>,,>,,,>,>,,,,,,,>,,>,>,,,,,,,,,>,,,,,,,,,,,,,,,>,>,,>,,>,,>,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,,,,,,',,,',,,,,',,',,>;=*&%%$$$%$%$%$$$$%$%%$%$$$$%&**=--;;>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>;;;---=*%$$%%*****=**==-;,,'',',''''','',','''',','''''''''''',','''''''''''''','''''''','''''''''''''''",
-";>;>>;>;>;>;>>;>;>;>;;>>>;>;>>;;>;;>;>;>;>;>>>;>;>;;>>>;>;>>;>;>;>;>;;>>;>;>;>;;>;>;>>;>;>;>;>;>>;;>;>;>;>>;>>;>>;>>>;;>>>>;>>;>>;>>>>>>>>>>;>;>>>>;>>>>>>>>;>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>>>>>>>>>,>>>>>>>,>,>>,>>>>,>,>>>>,>,>,>>>,>>,>>>>>,>,>,,>,>,>,>,>>,>,>,>>,,>,>,>,>,>,>,>,>,>,>,>,>>,,>,,>,>,,,>,>,>,,>,,>,>,>>,>,,,>,,,>,>,>,>,,,>,>,>,>,,>,,>,,,,,,,,,,,,,,,>,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,,,,,,,,,',,,,,,,,>;=*&%%$%$$$$$$%$%$$%$$$$$$%%&&*=--;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;>;;;-=-=&%$$$&&*******=-;>,','''',','','''',','''''',',''',','''''',''','','''''''','''''''','''''''''''",
-";>;>>;>;>;>;;>;>;>;>>;;;>;>;;>>;>>;>;>;>;>;;>;>>;>>;>;;>;>;>;>;>;>;>>;>;>>;>;>>;>;>;;>;>;>;>>;>;>>>;>>;>>;>>;>>;>>;;>>>;>;>>;>>>;>>;>;>>;>>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>,>>>>>>,>,>>>>>>>>>,>,>>>>,>,>>>>>,>,>>,>>,>,>>,>>,>>,>>,>>>,>,>>,>,>,>>,>>,>,>,>,>,>,>,>,>,,>,,>,>>,>,,>>,,,>,,>,>,,>,,,,,,>,>,,>,,,,,,,,,>,,,,,,,,,,,,,,,>,,>,>,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,',,',,,,,,,',,',,,',,',,,>>-*&%%$$%$$%$$$$$%$$%$$$$$%&&**=-;;;;>>;>;>>;>>>>>>>>>>>>>>>>>>>>;>>>;>;>;;;----==&$$$%&********=;>,,',',','','','''''',',',''''','''''',''''''''''''',''''''''''''''''''''''''''",
-">;>;;>;>;>;>>;>>;>;>;>>>;>;>>;;>>;>;>;>;>;>>;>;>;>;>;>>;>;>;>;>;>>;>;>;>;;>>;>;>;>;>>;>;>;>>;>>;>;>;>;>;>>;>>;>>;>>>>;>>>>;>>>;>>;>>>>>>>>;>>>;>>>;>>>;>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>,>>>>>,>>>,>,>>>>>>>,>>>>>>,>,>>>,>>>,>>>,>>,>>>,>>,>,>,>>,>,>,>>,>,>,,>,>,>,>,>,>,>,>,>,>,>,>,,,>,>,,>,>,,>,,>,>,,>,>,>,,,>,,>,>,>,>,,,>,>,>,,>,>,>,,,,,,,,,>,,>,,>,,,,,>,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,;-*&%%%$$$$$$%$%$$$$$%$$$$%&**=--;;;;-;;-;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;--==&%$$$$&&&&&&**=-;,,,',''','','',',','''''',','''''',''''',',''''','''',''''''''''''',''''''''''",
-">;>>;>;>;>;>;>;>;>;>;;>;>>;;>>>;;>>;>;>;>;>;>>;>;>;>;>;>;>;>>;>;;>;>;>;>>;;>;>;>>>;>;>>;>;>;>;>>>;>>;>>;>>;>>;>>;>;>>;>;>>>;>>>>>>;>;>;>;>>;>>>>>>>>>>>>>>>;>;>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>>>>>>>>,>>>>>,>>>>>,>,>,>>>,>,>>>>>,>>,>,>>,>>>,>>,,>>,>>>,>>,>,>,>>,>,>,>>>,>,>,>,>,>,>,>,,>,>,>,,>>,>,>,,>,,>,>,,>,,>,,,>,,>,,>,,>,,,,,,>,,,,,,,>,,,,,,,>,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',',,',',,',,,,,>-=&%%$%$%$%$$$$$%$$$$$$$%&&*=---;--=*******=--;-;;;;;;;;;;;;;;;;;;;;;;;;;;-;---==*&$$$$%&&**&**=-;,,,'',''',''''''''',',''''''','',''',','''''',''''''''''''','','''''''''''''''",
-">;>;>>;>>;>;>;;>>;>;>>;>;;>>;;>>;;>>;>>>;>;>;;>;>;>;>;>>;>;>;>;>>;>;>;>>;>>;>;>;;;>;>;;>;>;>>;>;;>>;>>;>;>>;>>;>>;>;>>>>>;>>;>;>;>>>>>>>>>>>;>>;>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>,>>>>>>>>,>>>>>,>,>>,>>>>,>>,,>>,>>>,>>,,>>,>,>>,>,,>,>>,>,,>,>,>,>,>,>,>,>,>,,>,>>,,,>,,>,>,>,,>,>,,>,,>,,>,,>,,>,,>,>,>,,,>,>,>,,,,,,>,,,,,,>,,,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,',,,',,,,,,,,,,,,,,,,,>,>;-*&%$$$$$$$$$$$$$$$$$$$%&**=---=*&&%&%%&%&&&*=----------;----;--;--;-;-;-;-----==&$$$$$&&&&&**=->>,',',',''',',',','''',','','''''''''''''''''''''''''','''''''''''''''''''''''",
-">;>;;>>;>;>;>>>;>;>;>;>;>>;>;>;>>;;>;;;>;>;>>;>;>;>;>;;>;>;>;>>;>;>;>>;;>;>;>;>>>;>>;>>>;>>;>>;>>;>;>;>>;>>;>>;>>>>;>;>;>>>>>>;>>;>>>;>>;>>>>>>>>>>;>>>>>>>>>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>,>>>>,>>,>,>>>>>,>>>>>,>,>,>>>,>,>>,>>,>>,>,>>,>>>,>,>,>,>,>>,>,>>,>,>>>,>,>,>>,>,>,>,>,>,>,>,>,,>,>,,,>>,>,>,,,>,>,,,>,>,,>,,,,>,,>,,,,,,,,,>,,,,,,,,>,>,,,,>,,,,,>,,,,,>,,>,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,',,,,,,,,',,,,',,',,',,',,',,,,>>-=&%%$%$$%$$%$$$$$$$$$$%&**==*&&%&&&&**&&&&%%&&=---;-------;-----------------===**%$$$$%%&&&**=-;,,,'','','','''''','''''','''','','','','','''','','''''''''''''''''''''''''''",
-";>;>>;;>;>;>;;;>;>>;>>;>;;>>;>;>;>>;>>>;>>;>;>;>>;>>;>>;>;>;>;;>;>;>;;>>;>;>;>;;>;>;>;;;>;>;>;>>;>>;>>;>>;>>;>>;;>>;>>>>>;>;>>>>>>;>>>>>>;>>;>;>>>>>;>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>,>>>>>>,>>>,>>>>,>>>,>>>,>>,>,>>>,>>,>>>,>>,>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>>,,>,>>,,>,,,>>,,,,>,>,,,>,,>,>,,>,,,>,>,>,>,,,>,>,>,,,,,,>,,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,',,,,>>-*&%$$$$$$$$$%$$$$$$$%&**==*&%%&&*=***=***&&%%&*=----------------------------==**%$$$$$%&&&**=-;,,,,',',',''',',''',',','''',''''''''''''''','''''''''''''''''''''''''''''''''",
-";>;>;>>;>>;>>>;>;;>;;>;>>>;>;>;>;>;>;;>;>;>;>>;>;>;>;>;>>;>;>>;>>>;>>;>;>>;>;>>;>;>;>>>>>;>>;>;>;>;>;>>;>>;>>;>>>;>>;>;>>;>>;>;>;>>;>>;>>>>>>>>>;>>>>>>;>>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>,>>,>>>>>>>>>>>,>,>>>,>>>>,>>>,>,>>,>>,>>>>,,>>,>>,,>>,>>,>>,>,>,>,>,>>,>,>,>,>,>,>,>,,>,,>,>,,>,,>,>,,,>>>,>,,>>,,>,,,>,,,>,,>,,,,,,>,,,,,,,>,,,>,,,>,,,,>,,>,,>,,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,',',,',,',,',,,,,,,>>;=&%$%$$$%$$$$$$$$$#$%&***&%%&&***&&%%%%&%&&%%$&&*=============================**&$$$$$%%&&**=->>,',',','',''''','''''''',''''','','',''''''''''''','''',''''','''''''''''''''",
-">;>;>;;>;>;>;;>;>>;>>;>;;;>;>;>;>;>;>>;>;>;>;;>;>;>>;>;>;>>;>;>;>;>;;>;>;;>>;>;>;>;>;;;>;>;>>;>;>>>;>;>>;>>>;>>;>>;>>>>;>>>;>>>>>>>>>>>>>>;>>;>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>,>>>>,>>>>>>>>,>>>,>,>>>>>,>>>,>,>>>,>>>>,>>,>>,>,>>,>,>,>>>,>>,>,>,>>,>>,>,>,,>,>,>,>,>,>,>,>,>,>,,>,>,>>,,>,>,,,,,,>,,,>,,,>,,>>,,>,,,>,>,,,>,>,>,,,>,,,,,,,,>,,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,',,,,,,,,,,,,',,,,,,,',,,,,>;=&%$$%$$$%$$$$$#$$$#&&**&%%&&*&%###$$$###@$%$%%%&=============================**&%#$$$$%&&&*=-;,,,,',','''',',''',',','''',','',''''''',''','','''''''''''''''','''''''''''''",
-">;>;>>;>;>;>>;>;>;>;>;>>>;>;>;>;>;>;>;>;>>;>>;>;>;;>;>;>;;>;>;>;>;>>;>;>>;>;>;>>;>;>>>;>;>>;>>>;>;>;>>;>>;;>>;>>;>>;>>>>;>>>>;>;>;>>;>>;>>>;>>>;>>>>>>>>>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>,>>,>>>,>>>>>,>,>>,>>>>>,>>,>,>>>,>>,>>>,>>>,>>,>,>,>,>>,>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>>,>,>,,>,>,,>,>>,>,,>>,,>,>,,,,,>,,>,,,,,>,,,,,,,>,,,,>,,>,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,,,,,,',,,',,',,,,,',,,,,,',,,,;=&%$$$$$$$$$$$$#$##$&&*&%%&&&$#@@$%&*&&&$@+@@#$$$&*====*=====****&*&*****==*=***&%#$$$$$&&**=;;,,'',,',,','''',''''''',''''''''''','','''''''''',''''''''',''''''''''''''''''",
-";>>;>;>;>>;>;>;>;>;>>;>;;>;>;>>>;>;>;>;>;>;>;>;>;>>;>;>;>>>;>;>;>;>;>>;>;>;>;>;;>>;>;;>>;>;>;;>;>>;>;>>;>>>;>>;>>;>>;>;>>>;>;>>>>>;>>>>>;>>>>>>>;>>>>;>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>>,>>>>>>>>,>,>>>,>>,>,>>,>>>,>>,,>>,>,>>,>>>,,>>,>>,>>>,>,>,>,>,>,>,>,>,>,,>,,,,>,,>,>,,,>,>,,,>,>,,,>,,>,,>,>,,>,,,>,>,,,>,>,>,,,>,,,,,,,,>,,,>,,>,,>,,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,,,,,,,,,,,',,,,,,,,',,,,,',',,,,,>;=&%%$%$$$%$$$##$#$#$&&&%%%&%#@@$&-;,,,,;=&$++++@@#&*********&&%&%&&&%&%&&&******&%#$$$$$%&**=-;,,,,',,',''',''',',',''','',''',',''''''','''''''''','''''''''''''''''''''''''",
-";>;>;>>;;>;>;>;>;>;;>;>>;>;>>;;>;>;>>;>;>;>;>>;>;>;>>;>;>;;>>;>;>;>;;>;>;>;>;>>;>;>;>>;>>;>>>;>>;>;>>;>>;>>;>>;>>>;>>>>;>>;>>>;>>>>>;>>>>>;>;>>>>>;>>>>>>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>,>>>>,>>>>,>>>>>,>>,>>>,>,>,>>>>>,>>>,>>>,>>>,>>,>,>>,>>>>,>>,,>>>,>,>,>,,>,>>,>,>,>,>,>,>,>,>,>,>>,>,>,,>,>,>,,>,,>,,>,,,>,,>,,,>,,,>,,,,,>,,,,,,,>,,,,>,>,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,',',,',,,',,,,,,,,,,,>;=&%$$$$$$$$$$#$####%&&$$%%$@+#&->'''''''',-&#+..++#&*****&%%%%&&******&&&%%&****&%##$$$$$&&*=-;>,',',,,',''',''''''',''''''',''''','''''''','','''''''','''''''''''''''''''''",
-">;>;>;;>>;>;>;>;>>>;>;>;>;>;;>>;>;>;>>;>;>;>;;>>;>;>;>;>;>>;;>;>;>;>>;>;>;>>;>;>;>;>;;>;>>;>;>;>>;>>;>>;>>>;>>;>;>>>;>>>;>>>;>>>>;>>>;>>;>>>>>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>,>>>>>>>>>>>>>>>>,>,>>>>,>>>>>>>,>>>>>>,>,>>>,>,>>,>>>,>>,>>>>,>>,,>,>,>>>,,,>,>,>,>>>>,,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,,>,,>,>,,>,>,>,,,,>,>,,>>,,>,>,,,>,>,>,,,>,,,,,,,,,,,>,,,>,,,,,,,,>,,,,,,,,>,,,,,>,,>,,,,,,,,,,,,,,,,,,,',,,,,',,,,,',,',,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,>;*&%$%$%$$$$$##$####%&%$$%$++$=>''''''''''''>*$....@$&&*&&$#%&******=*==**&%$$&&&&$###$$$$%&*=->>,,,,,,,,'',''',',',''','',''''',''''','''''''''''''''''''''''''''''''''''''''",
-">;>;>>;>;>>;>>>;;;>;>;>;>;>>;>;>>;>;;>;>;>;>>;>;>>;>;>;>;;>>;>;>>>;;>;>;>;>;>;>;>>;>>>>;;>;>>>;;>>;>>;>>;;>>;>>>;>;>>;>>>;>>>;>;>>;>>>>>>>>;>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>,>>>>,>,>>>>,>,>>>>>>,>>>>>,>>,>,>,>>,,>>,>>>,>>>,>,>>>,>,>>>,,,,>>,>,>,>,>,>,>,>,,>,,>,,>,>,>,,>,,>,>,,>,>,,,>,>,,,,>,,,,>,,,,>,,,,,,,>,,,,>,,>,>,,>,,,>,,,>,,>,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,',',,',,',,',,,,,,,>-=&%%$$$$%$$$#####@@%%$$$$++$*-,''''''''''''',=$....@%&&$##$&&&%%%%%%%%&&**&%$#%&&$@##$$$$%&**=;>,,',,>,,,''','''''',''''''',''''','''''',''',''',''''''''''',''''''''''''''''",
-">>;>;>;>;>;>;>;>>>>;>>;>;>;>;>;>;>;>>;>;>>;>;>;>;;>;>>;>>;>;>;>;;>>>;>;>;>;>>;>;>;>;;;>>>>>;;>>;>;>;>>;>>>;>>;>;>>>;>>>;>>>;>>>>>>>>;>;>;>>>>>>;>>>>>>>;>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>>>,>>>>,>>>>>>>,>>>>,>,>,>>>,>,>>>,>>>>>,>>>,>>,,>>,,>,>>,,>>,>,,>>>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,,>,>,>,,>,,>,,,>>,,>,>,>,,,>,>,,,>,,,>,>,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,',,,,,,,,,,,',,,,,,,,,,,,,,>>;=&%%$$$$$$$#$$##@@@$$#$$@+#*=;>'''''''''''''',=#...+$%$@@$$$###@@@@++@@#%&*&&##%%$@###$$$$&&*=->,,>,>>,,'',''',','''','',''''',''','''''','''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;>;>;;>;;>;>;>;>;>;>;>;>;;>;>;>;>;>;>;>>;>;>;>;>;>>;>>;;;>>;>>;>;;>;>;>;>>>;>;;;>>>;>>;>>>;>>;>>>;>>>;>>>>;>>>;>>;>;>>>;>>>>>>>;>>>>>>>;>>>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>,>>>>>>>,>>>>,>>>>,>>,>>>,>>>>>>>>,>>,>>,>,>>,>,>>,>>,>,>>,>>>>>,>>>,>,>>,,>,>>,>,>,>,>,>,>,,>,>,,>,>,>,>,>,,>,,>,,>,>,>,,,>,,,>,,>,,>,,,>,,>,,,,,,,>,,,,>,>,,>,,>,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,',,,,,,,,,,',,',,,,,,',,,,,,,,>,,,,>-=&%%$%$$$$$######+@###$@++&=-;;>,'''''''''''''>*@...@@+@#@@@@@#$$#$###@@+@$&&&#@##+@#$$$$$%&*=-;>,>>>>>,,'',''''',''''''','','''''''',''''''',''''',''''','''''''''''''''''''",
-">;>;>;>;>;>;>;>>;>>;>;>>>;>;>;>;>;>>;>;>;>;>;>;>;;>;>;>;>;>;;>;;>>>;>;>;>;>>;>>;>;>;>;>>>>;;>>;>;>;>>;>>;>;>>;>>;>;>>;>>>;>>>>;>>>>>>;>>>>;>;>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>,>>>>>,>>>>,>>>>>>,>>>>,>,>,>>>,>>>,>>>>,>>>>,>,>>,>>,>>,,>,>,,>,>>,>>,>,>,>,>,>,>,>,>,>>,>,>,,>,>,>,>,>,,>,>,>,,,>,,>,,,>,,>,,>,,,>,,>,,,>,>,>,,,>,,,,,,,,,,,,,,,>,,>,,>,,,,>,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,,,',,',,,,',,,,,>>,>,>>;=*%%$$%$$$$#$###@++@#$#@+%=-;;>,>''''''''''''',-%+.+@++.+++$&=;>>,,,>;=*%@+@%%%@+@+@###$$$%&**=;>>>;;;,,,''',',''','',''''''''',''''''''','''''''''',''''''''''''''''''''''''",
-">;>>;>>;>;>;>;>;>;>;>;>;>;>;>>;>>;>;>>;>;>;>;>;>>;>;>;>;>;>>;>>;>;>;>;>;>;>;>;>;>;>;>>;;>>>;>;>>;>>;>>;>>;>>;>;>>>>;>>;>>>;>;>>;>>;>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>>>>>>,>>>>>>>>>,>>>>,>>,>>,>,>>>>>>,>>>>,>>,>,>,>,>>>>,>,>,>>,>>>,>>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,,>,>,>,>,,>,,>,>,,,>,>>,,>,>,>,,>,,>,,>,,>,,,,>,,,,,,>,,,,>,,,>,,>,>,,,,,,,,,,,,,,,,,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,,,,,',,,,',,,,,,,,,',,,,,,>,>>,,,>>;=&&%$$$$%$$####@@+++##@.#*--;>>,,,'''''''''''''>*#..++...#&=->''''''''',;*%@@$%$.+++##$$$$$%&*=------;>,'','''','''''',','','''''','''''''',''','''''''''''''''''''''''''''''",
-";>;>>;;>;>;>;>;>;>;>;>;;>>;>;>;>;>;>;;>;>>>;>;>;>;>>;>;>;>;>;>;>;>;>;>;>>;>;>;>;>>;>;>>;>;>;>>;>>;>>;>>;>>;>>>>>>;>>>;>>;>>>>>>>>>>>>;>>>>>>>>>;>>>;>>>;>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>,>>,>>>>,>>>>>>>>>>>,>,>,>>>,>,>>,>>>,>>>,,>,>>>>,>,>,>,>,>,>,>,>,>,>>>,>,>,>,>,>,>,>>,>,>,>,,>,>,,>>,,,>>,,,,>,>,,,,,,>,,,,>,,>,,,,>,,>,>,>,,,>,,,,>,,,,,,,>,,,,,,,,,>,,,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,,,,,,,',,',',,,,,,,,,>>>>>,,>>-=&%%$%$$$$$$###@@+++##@+%=-;>>,,,,'''''''''''',,;%+.@+.+%*--;>,'''''''''',-&@+#$+..+@##$$$$&&&=======;>',''',''',',''''''''','',''''','''''''''''''''''''''''''''''''''''''''",
-">;>;;>>>;>;>;>;>;>;>;>>;;>;>;>;>;>;>>;>>;;>;>>;>;>;>;>>>;>;>;>;>;>;>;>;;>;>;>;>>;>;>>;>>;>>;>;>;>>;>>;>>;>>;>;;>>>;>>>;>>>;>>;>>;>;>>>>;>;>>>>>>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>>>>>>>,>>>>>>,>>>>,>>,>>,>>>>>>>>,>>>>>,>>,>>>,>>>>>,>,,>>>,>>,>>,>,>>>,>,>>,,>,>,>,>,>,>,>,,>,>,,>,>,>,>>,,,>>,,,>>,,,>,>>,>>,,>,>,,>,,>,>,,,,,,,,,>,,,,>,,,,,>,,,,,,,>,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,,,,,,',,,,',,',,,,,,,,',,',,,>>>>>>,,>;=*&%%$$$$$$#$###@++++#@+@*-;;>>,,,,'''''''''''',,;*@+++@%=-;;;>>,'''''''''''>*#@#@.++@##$$$$%&&****&*=;,,'','',''''',','','''''''',''''',''''''''''''''','''''''''''''''''''''",
-";>;>>;;>>;>;>;>;>;>>;>;>>;>;>;>;>>;>;>;;>>;>;>>;>;>;>;;>>;>;>;>;>;>>>;>>;>;>;>;;>>;>;>>;>;>;>>;>>;>>;>>;>>;>>>>>;>>>;>>>;>>>>>;>>>>>;>>>>>;>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>,>>>>>>,>>,>,>,>,>>>,>,>>>,>>,>,>,>,>,>>>,,>>,>>,>>,>,,,>>,>,>>,>,>,>,>,>,>,>>,,>,>,>,,>,,,>>,,,>>,,,>,>,,,,,,,,>,,,>,,>,,,,,>,>,>,>,,,>,,,,>,>,,>,,,>,,,,,,,,,,,,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,,,',,',,,,,,,,,,>;;>>,>;=*&&%%$%$$$$$###@@+++@#@.$=;;>>,,,,','''''''''',,,>=$+@#&=-;;>,>,,'''''''''''';*@@+..+@##$$$$%%&&&&&&*=>,',''''',','''''''','',',''''''''','','''''''''''''''''''''''''''''''''",
-";>;>;>;>;>>;>;>;>;>;>;>;>;>;>;>;;>;>;>>;;>;>;;>;>;>;>>;;>;>;>;>;>>;;>;>;>>;>;>>;>;>>;>;>>;>>;>>;>>;>>;>>;>>;;>;>>;>>>;>>>;>;>>>>>;>>>>;>>>>>;>>>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>,>>>,>>>>>>>>,>,>>>>>>>>>>>>>,>>>,>,>>,>>>>>,>>>>,,>>>,>>,>,>,>>>>,>,>>,>,>>,>,>,>,>,>,,>>,>,>,>,>,>>,,,>,,,,>>,>,,>>,>,>,,,>,,>,,,>,>,,,,,,,,,>,,,,>,,,,,,,,,>,,,,,>,,,>,,,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,',,,,,,,,',,',,,,,,',',,,,,>>;;>>>>-*&%%%$$%$%$$$###@@+.++#@+&-;;;>,,,',',''''''''',,>>-&@@%=-;;>>,,,,,''''''''''''>&++..++@#$$$$%%%%&%&&*->,'',','''''','',''''''''''''',''''''''''',''',''''','''''''''''''''''''",
-">;>;>>;>;>;>>;>>;>;>;>;>;>;>>>;>>;>;>>;>>;>;>>;>;>;>;;>>;>>>;>;>;>;>>;>;>;>;>;>;>>;>;>>;>;>;>;>>;>>;>>;>>;>>>>>;>>>;>>>;>>>>>>;>>>>;>>>;>>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>,>>>>>>>>>>>,>>,>>>>>>,>,>,>,>,>,>>,>,>>>,>>,,>,>>>,,>>>>,>,>,>>>,>,,>,>,>,,>,>,,>,>,>,>,>,>>,,,>,,>,>,>,,>,>,>>,>,,,,>,,,>,,,>,>,,>,,>,,,,,>,>,>,>,,,>,,,,,>,,,>,,,,,>,,,,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,,,,,>>;;-;>>;=&%%%$%$$$$$#$$$#@+++++@+@*;;;>>,,',',',''''''',;----&##*=;;>,,,,,'''''''''''''',-%....@@##$$$$%%%%%%&=;,',''''',','''''','','',''','''''''''','''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>;>;;>;>;>>;>>;>>;;>;>;>>;;>;>;>;>;>>;>>;>>;>;>;;>;>>;;>;;>;>;>;>;>;>;>;>>;>;>>;>;>>;>>;>>;>>;>>;>;>>>;>>>;>>;>;>>;>>;>>>>;>>>>;>>>>>>;>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>>,>>>>,>>,>>>>>>,>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>,,>>,>,,>,>>>,>,>,>>,>,>>,>>>,>>,>,>,>,>,>,,>,>,>,>,,>,,>,>,>,,,>,>,>,>,>,,>,,>,,>,,>,>,>,>,,,,,,,,>,,,,>,,,,,>,,,,,,,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,',,,,,,',,,',',,',,,,',,,',,,>>;---;;-*&%%%$$$$$$$$####@@..++@+$=;>>>>,,,,',','','''>*&*-==*$&**=->,,''',,''''''''''''';*@..++@#$$$$$%%%%%&&-,,'',',''''','','''''''''',''''','','''''''''''''''''''''''''''''''''''''",
-";>;>;>>;>;>;>>>;>>;>;>;;>;;>>;>;>;;>>;>;>>;>;>;>;>;>;>;>;>>;>;>>>;>>;>;>;>;>;>;>;>;>>;>;>>;>;>>;>>;>>;>>>;>>>>;>>>;>>;>>>>>>>>>>;>>>>>>>>>;>>>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>,>>>>,>>,>,>,>,>,>,>,>,>,>,>>>,>,>>>,>,>>>>>,>,>>,>>,>>,>,>>,>,>,,>,>,>,>,>,>>,>,>,,>,>,>>,>,>,,>,,>,>,,>,,>,,>,,>,,>,,,,,,,,,,>,>,>,,,>,,,,,>,,,,,>,>,,,,,,,>,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,,,,,,,,',,,',,,,,,,>;-=---=*&%$$$$%$$$$$$$##@+++.+++$->;>>,,,,',',,,',',,=@#;',=&&&%%*=-,,,,''',''''''''''',>=$...+@##$$$$$$%%%&=;,',''''',',''''''',','',''''',''''''''''''''''','''''''''''''''''''''''''",
-";>;>;;>;>;>;;;>;;>;>;>>;>>;;>;>;>>;>;>;>;>;>;>;>;>;>;>;>;;>;>;;;>;>;>>;>>;>>;>>>;>;>;>>;>;>>;>>;>>>;>>;;>>;>;>>>;>>>>>;>;>;>>>;>>>;>>;>>>>>>;>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>>>>>,>>>>>>>>,>>>>>>>,>>>>>>>>>>>,>>>,>,>>>,>,>>>,>,>,>,>,>,>,>,,>>>,,>,>,>>,>,>,>,>,>,,>,>,,>,>,>,,,,>,,>,>,,>,,>,,>,,>,,>,,,>,,>,>,>,>,,,,,,,>,,,,>,,,,,>,,,,,,,,>,,,,,,>,,,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,',',,,,,,,,',,,,,>;-*===*&%%$$$$$$%$$$####@++.++.+%->>;>>,,,,,,',,',,'>%+.#=>-&&%@%>,-;,',,',',''''''''''>;=&..+++##$$$$%$%%%*->,'',','''''','','''''''''''''''''','',''''','''''''''''''''''''''''''''''",
-">;>;>>;>;>;>>>;>>;>;>;>;>;>>;>>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>>>;>;>;>;>;>;;>;>;>>;>>;>>;>>;>;>>;;>>;>>>;>>>>>;>>>;>;>>>>>>;>>>>;>>>>>;>>>>>>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>,>>>>>,>>>,>,>>,>>>>>,>,>>>>,>,>,>,>,>>>,>>,>>,>>>>>,>>,>,>>>>,>>,>,>>,,,>>,>>,>,>,>,>,>,>>,>,>,>,>,,>,>>,>,,>,,,>,,>,,>,,>,,>,,,>,,,>,,,,,,,,>,>,>,,,>,,,>,,>,,,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,',,,,,,,',,,,',,',,,,,,,,,,',',,',,,,,,,>;=****&&%$%$$%$$$$$#$$#@@++.....%->>>>>,,',',,',,,,,=#..+%=*%%#++%;;*>,'',',',''''''',,>;=&+..+@@#$$$$$$%%&=>,',''''',','''''''''',',','''''',''''''',''''''''','''''''''''''''''''''''",
-">;>;>;>>;>;>;>;>;>>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>>;>>;>;>;>;>;>;>;>;>;>>;>;>>;>>;>;>;>;>>>;>>>>;>>;>>>;>;>>>;>>;>>>;>;>>>>;>>>>>;>>>>;>>>>;>>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>>>,>>>>>>>>>>>>,>>>,>>>,>,>,,>,>,>>>,,>,>,>>>,>,>>>,>,,>,>,>,>,>,>,,>,>,>,>,>,>,,,>,>,>,>>,,>,>,,>,,>,,,>,,>,>,,>,>,>,>,,,,,,>,,,,,,,,,,,>,,,,,>,,,>,,>,,,,>,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,',,,,,,,,,,',',,,,,;-*&&&%%%$$$$$$%$$$$####@+......%;>>>>,,,,,,',,,',',*$+..@$@#$#..+&*%=,,',',',''''''',,;;-&+..++##$$$$%$%&=>,''',',''''','','',',''''''','','''''''''''''''''''''''''''''''''''''''''''",
-";>>;>;>;>;>;>;>;>;;>;>;>;>;>;>;>;>;>;>;>;>>>;>;>;>;>;>;;>;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>>;>;>>;>;>>;>>;>;>>>>;>>;>>>;>>>>>;>>>>>>;>>>>>>>>;>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>>,>>,>>>,>>,>>>,>,>,>,>,>,>,>,>>>,>>,>>>>,>>>,,>>>,>>>,,>,>>,,>>,>>,>,>,>,>,>,>>,>,,,>,>,>,>,>,>,>,,,,>,,>,>,,>,,>,>,>,,>,,>,,,,,,,>,,>,,,>,,>,,>,>,,,,,>,,,>,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,,',,',,',,,,,,,,,,,;-*&&%%%$$%$$$$$$$$#$##@@++.....%;>>>>>,,,,,,,',,,,,&%+.....+##+..@++*',,,,,,',,'''',,>>--&+..++@#$$$$$%%*;,,',''''',',''''''''''''''''''''''''',''''''''''''''''''''''''''''''''''''''",
-";>;>>;>;>;>;>;>;>>;>;>;>;>;>;>;>;>>>;>;>>;;>;>;>;>;>;>>;>>>;>;>;>;>;>;>;>;>;>>;>>;>;>>>;>;>>;>>>;>>;>>;>>;>;>>;>>>;>>;>>;>>>;>>;>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>,>>>>>,>>>>>>>>>,>>>>>>,>>>>>,>>>>>>>>>>>>,>>>,>,>>,>>,>,>>,,>>>,,>>,,>>,>,>,>>,>,>,>>,>,>,>,>,,>,>>>,>,,>,,>,>,,,>,>>,,>,,,>,>,,,>,,,,>,,>,,>,>,>,,,>,,>,,,,,,,,,,,,>,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,',,,,',',,,,,,,,,,',',',,,,,>-*&%%%%$$$%$%$$$$$#$##@@+......%->>,>>,,,',,,,,,,,,*%#.....+#%@.....&,,',',,,,,,',,,,>;;=&+..++@##$$$%%&-,,''',',''''''',',',''',','''''''''','''',''''''','''''''''''''''''''''''''''",
-">;>;;>;>>;>>;>;>;>;>>;>>>;>;>;>;>;;>>;>;;>>;>;>;>>;>;>;>;;;>;>>>;>>;>>;>;>;>;>;>;>>;>;;>>>;>>;;>>;>>;>>>;>>>;>>>;>>>;>>>>>>>>;>>>>;>>;>;>>>>>>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>>>>>,>>>>,>,>>>,>,>,>,>,>>>>,>>>>,>>>,>>>,>>>>,>>>,>>>>,>,>>,>,>,>,>,,>,>,>,>,>>,>,,,>,>,>,>,>,>,>,,,>,>,>,>,,>,>,,>,>,,,,,>,,,,,,,>,,,,,>,>,>,>,,>,,,,,,,,,,>,,>,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,,,,,,,,,,,,,,,,',',',,,,,,,,,,,>;=&&%%$$$$$$$$%$$$$###@+++.....%->>>>,>,,,,,,,,,,,,*&%+....+$%#....+*',,,,,',',,,,,,>>;-=&+..++@#$$$$$&*>,'',''''',',','''''','''''',','',''''''''''',''''''''''''''''''''''''''''''''",
-">;>>;>;;>>;>;>;>;>>;>;;;>>;>>;>;>>;;>;>>;;>>;>>;;>;>;>;>>>;>>;;>;>;>;>;>;>;>>;>>;>;>>>>;;>>;>>>;>>;>>;;>>;>>>;>>>;>>>>;>;>>;>>>>;>>>>>>>>>;>>>>>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>>,>>,>>>,>>>>>,>>>>>>>>>>>,>,>>,>,>>,>>>,>,>,>,>,>,>>,,>,>>,,>,>,>>>,>>,>,>,>,>,,>,>,>,>,>,,>,,>,>,,>,,>,,,>,,>,,,>,,,,>,>>,,,>,>,>,,,>,>,,,,,,,,,,,,,>,,,,>,,,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,',,,,,,,,,',,,',,',,,,,,,,',',,',,,,,>=*%%%$%$%$$$$$$$$#$##@@+......$->>,>>>,,,,,,,,,,,,=&&#....@$&&@...@-,,,,,,,,,,,,,,,>>;-=%...++@##$$$$&-,,,'',','''''''''','''',''''''''''',''',''''''''''''',''''''''''''''''''''''''",
-";>;;>>>;;>;>>;>;>;;>;>>>;>;>;>;>;;>>>;>;>>;>;>;>>;>;>;>;>;>;;>>;>;>;>;>>>;>;>>;>;>>;;>;>>;>>>;>>;>>;>>>;>>>;>>>;>>;>;>>>>>>>>>;>>;>>>>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>>>>,>>>>>>>>>>>>>>>>>,>,>,>,>,>>,>>,>>>,>>,>,>>>,>,>,>>,>,>>,>,>>,>>,>,>,>,,>,>,>,>,>>,>,>,,,>,>,>,>,,>,>,>,,>>,>,>,,>,,>,>,,,,>,>,,,,,,,>,,,,,>,>,,,>,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',',,,,',,,',,,',,,',,,,,',,,,,,,>;*&%%$$%$$%$$$$$#$###@++......#=;>>,>,>,,,,,,,,,,,>&&&#++@##%*%#++&>,,,',,,,,',,,,>>;;-*$....+@#$$$$$*;,'','''',','',','''','''',''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>;;>>;>;;>;>;>>;>;>;>;>;>;>;>>>;;>;>;>;;>;>;>;>>;>;>;>;>>;;>;>;>;>;>;>;>>;>;>>;>>;>;>>>;;>>;>>;>>;>>>;>>>;>>;>>>>>;>>>;>>;>>>>>>;>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>,>>>>,>,>>,>,>>,>,>,>>>>>>>>>>>>>,>>,>>,>>,>>,,>>>,>>,>>,>,>,>,>,>,>,>,>,>>,>,>,>,>,,>,>,,>>,>,>,>,>,>,,>,,>,,,,,>,>,,>,,,>,>,,,,>,>,>,>,,,>,>,,,,,>,,,,,,>,,,,,,>,,>,,>,,,,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,>;-*%%%$%%$%$%$$$$#$##@++......+*;>>,>>,,,,,,,,,,,>,-**&%$$$@#&&&%&=,,,,,,,,,,,,,,>>>;;=&@...++@@#$$$$*>,'',''''''','''''''''',''''','',''''','''''''''','''''''''''''''''''''''''''''",
-">;;;>;>;>;>>;>>;>;>;>;>;>;>;>;>;;;>>;>;>;>>;>;>;>;;>>;>;>;>;>>;>;>;>;>;>;>;;>>;>;>;>>;>;;>>>;>>;>>;>>;>>>;>>>;>>>;>;>>>;>>>>>>>>;>>>;>>>>>>>>>>>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>,>>>>>>>>>>>>>>>,>>>>>>>>>>,>>>>>>>,>,>,>,>,>,>>,>>,>>,>>>>>>,>,>>,>,>>,>>>,>,>,>>>,>,>,,>,>,>,>,>>,>,>>,,,>,,>,,>,,>,>,>,,>>,>,,,>,,,>,,,,>,>,,,,,,,,,>,,,,,,>,,,,>,>,,,,>,>,,,,,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,,,',,,,',,',,',,,,',,,',',,,,,,,,>-=&&$%$$%%$$%$$#$###@++......+%->>>,>>,>,,,,,,,,,>;=&&&%&#+#%&&*=>>>,,,,,,,,,,,>>>;;-=$.....+@##$$$$*>,',',',',''''',','',''''','''''''','''''''',''''''''''''''''''''''''''''''''''",
-">>>;>>;>;>;>;>;>;>>;>;>;>;>>>;>>>;;>;>;>;>>;>;>;>>;>;>;>>;>;>;>>;>;>>;>;>>>>;>;>>>;>;>>>>;>>>;>>;>>;>>;>>>;>>>;>>>>>>;>>>>;>>;>>>>>>>>>>>;>;>>>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>,>>>>>>>>>,>>,>>>>>>>,>,>,>>>>>>>>>>>,>>>,>>,>>,>,,>>,>>,>>>,>>>,,>,>>>,,,>>>,>>,>,>,>,>,,>,>,,,>>,>,>,>,>,>,,,>,>,,>,,>>,,>,,>,>,,>,,>,>,>,>,,,>,>,>,,,>,,,,,,>,,,,,,,,,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,',,,,,',,,,,,,,,,',,,,',,,,',,,,,,,,>-*&%%%%%%$$$$$$$###@++.......#=>>>,>>,>,>,>,>,>,>>;=*&*&#.+%*=-;>>>>>,,,,>,>>>>>>;;=&+.....++##$$$#&>,,',',,'',''''''''''',''''''''',''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;;>;>;>;>;>;>;;>;>;>;>;;;>;>;>>;>;>;>;;>;>>;>;>;>;>;;>;>;>;>>;>;;>;>;;;>>;>;>;>;>>;;>>;;>>;>>;>>;>>;>;>>;>>>;>;>>>>>;>>;>>>>;>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>,>>,>>>>>>>>>,>,>,>,>,>>,>>,>>>,>>>,>,>>,>,>,>,>,>>,>,,>>>>,,>,>,>,>,>,>,>>,>,>>,,,>,>,>,,>,,>>,,>,>,,>,,,>,,>,,>,>,,>,,,,,,,,,>,,,,,,,,,,,,,>,,,,,,,>,,>,,,,,,,,,,,,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,',,,,,,,,,,,,',',,',,,,,',,',',,,,,>,>,,>>-=&&%%%%%$$%$#$$#@@+........+&->,>,>>,>,,,,,>,>>>;-=*&&#@#$&*-;;>>>>>>>>>>,>>>>>;-&@......+@@##$$$%;,,,,,',,',',''','',''','','','''''',''',''''''''',''''''''''''''''''''''''''''",
-";>;>>;>>;>>;>;>;>>;>>;>>;>>>;>;>;>;>>;>;>>;>>;>;>;>;>;>>;>;>;>;;>;>>;>;>>>;>;>>;>;>>;>>>;>>>;>>;>>;>>>>>>>;>>>;>>>>;>>;>>>>>>>;>>>;>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>>>,>>>>>>>,>>,>>>,>>>,>,>,>,>>>>>>>>>>,>>,>>,>>,>,>>,>,>,>>,>>,>,>,>>>,,>,>>,>,>,>,>,>,>,,>,>,,>>>,>,,>,>,>,,,,>,,,>,>,>,,,>,,>,,,,>,,>,>,>,>,,,>,>,>,,>,,>,,,,>,,>,,,,,,,,,,>,,>,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,',,',,,,,,,,,',,,,,,,,,,',,,,,>,,>>;-*&&%&&%$$$$$$#$#@+.........%=>>>,,>>>>>>>,>>>;==*&*&***&****==;;>>,>,>,>>,>>>;=&#........+##$$$$%->,,>,>,,,''',''''''''''''''''''''''''''''''''','''''''''''''''''''''''''''''''",
-">;>;>;>;>;;>;>>;>;>;>;>;>;>;>;>;>;>;;>>;>;>;;>;>;>;>;>;>>;>;>;>>>;>;>;>;>;>>;>;>>;>;>;>;>>;>>;>>;>>;;>;>;>>>;>>;>;>>>>>>>>;>;>>>>>>>>>>>>;>>>;>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>,>>>>>>>>,>>>>>>,>>>>>>>>>>>>>,>,>,>,>,>>,>>,>>,>>>>,>>,>>>,>>,>>,>,>,>,>>,>,>>,>,>,>,>,>,>>,>,>,,,,>,>,,>,>,>>,>,,>,>,,,>,>,,>,,>,>,,>,,,,,,,,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,,,,,,,,,,,',,',',,,',',',',',,,,,>,>,,,,>>-*&&&&%$%$$$$##@@++........@&;;>>,>,>,>,>>>-**&&*==;;>>,>>>;-=*=-;>,>,>,,>>>-=&#........++@##$$$$*;;>;;>>>,,,,''',',','',''''','',''',''''',''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>>;>;>;>;>;>;>;>;>;>>;>;>;>>;>;>;>;>;>;>;>>>;>;;>;>;>;>;;>>;>;>;>>;>>;>;>>>;>>>;>>;>>;>>>;>>>>>>>;>>>;>>>;>>;>>;>>>>>>>;>>>>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>,>>>>>>,>>,>,>,>,>>>>>>>>>>,>>>,>>,>>,>,>>,>>,,>>,>>,>,>>,>,>,>,>,,>,>,>,>,>,>,,>,>,,>>,>,,>>,>,>,,,>,>,>,,>>,,,>,,,>,,,>,,,>,>,>,>,,,>,>,>,,>,,>,,,,>,>,,,>,,>,,,,,,>,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,',,,,,',,,,,,,,,,,,,,,,,,,,,',,,,,>>,,,,,>>-**&&%$$$$$$$##++..........$=;>>>>,>>>>>;=&&&*--;>>>,,'''''''>-*=->>,>>>>;=*$+..........+@##$$$$&=------;>>',','''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>>;>;>;>;>;>;>;>;>;>;>;>;;>;>>;>;>;>;>>;>>;>;>;;>>;>>;>;>;>;>>;;>;>>;>;>;>>;>;;>>;;>>;>;>>;>;>>;>>;>;>>>;>>>;>>>>>;>>>>;>;>>>>>>;>>>>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>>,>>>,>>,>>>>>>>>>>>>>,>,>,>,>,>>,>>,>>,>>>,>,>,>>>,>,>,>>>,>>,>,>,>,>>,>,>,>,>,>,>>,>,>>,,>,>,,>,,>,,>,,>,,,>,,,>,,>,>,,,>,,>,>,,,,,,,,>,,,,,,>,,,,,,>,,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',',,,',',,',',',',,',,,,>>>>,,,,>;-**&%%%$$$$###++..........+%=;>>>>>>>;;=%%&**=--;;>>,,''''''''>==-;>>;-*&%#............+@@$#$$$%&*****==-;>,,','','','''','''''','''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>;>;>;>;>;>;>;>>;>>;>;>>;>>;>;>;>;>;;>;>;>>;>>;;>;>;>>;>;>;;>>;>>;>;>;>>;>;>>;>;>>;>>>>;>>>;>>>;>>>>;>>>;>>>;>;>>>>>;>>>>;>>>;>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>,>>>>>>>>>>>>>,>>>,>>,>>,>,>,>>>>>>>>>>,>>,>>,>>,>>>,>>,>,>>,>>,>,>,,>,>>>,>>,>,>,>,>,>,>,,>,>,,>,>,,>,>,>,>,>,>,,>>,,>>,,>,,,>,>,,>,,,,>,>,>,,,,>,>,,,,,>,,,,,,>,,,,,,,,,,>,,,,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,',,,,,,,,',',,,,,',,,,,,,,,,,,,',,,,,>>>>>>,,,,>;==*%%$$$$$$#@++...........#&-;>>>>>>;*&$$%&&**=-;;>>,,'''''''''=*=-==&$@+.............+@@#$$$$$&&&&&&**=-;,,'','''''',''''','''''',''''''','''','''''''''''''''''''''''''''''",
-">;;>;>;>;>>>;>;>>;>;>;;>>;>;>;;>;>;>;>;>>;>;>;;>;;>>>;>;>;>>;>>;>;>;;>;>>;>;>>>;>>;>>;>>;;>>;>;>>;>>;>;>>;>>>;>>>>>>;>;>>>>>>>;>>>>>>;>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>>>>,>>,>>>,>,>>>>>>>>>>,>>>>>>>>,>,>,>,>>,>>,>>>>,>,>>,>,>>,>>,>>,>,>>,>,,>,>,>,>,>,>,>,>,>>,>,,>,>,>>,,>,>,,>,,,>,,,>,,,>,,,>,,,,>,,>,>,,,,,,>,>,,,,>,>,,,>,,>,,,,,>,,,>,,,,,,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,',,,,,,,,,',,,,,,,',',',',,,,',,,>>;;>>>>>>>;-=*&%%$$$$##@@.............#&-;;>;>;-&%%%%%%%&**=-;;>>,''''''''>***=**$+...............+@##$$$$%%%&&&&&*=-;>,,'',','''''''''''',''''','''''''''''''''''''''''''''''''''''''''",
-">>;>;>;>>;;>;>>;>;>;>>;;>;>;>>;>;>;>>>;;>;>;>>;>>>;;>;>;>;;>>;>;>;>>;>>;>>;>;;>>;>;>>>;>>>;>>>>;>>;>>>>;>>;>>>;>>;>>>>>>>;>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>,>>,>>>,>,>,>,>>>>>>>,>>>,>>,>,>>>,>,>>,>>,>,>,>,>>,>,>>,>>,>>,>,>,>,>,>,,>,>,>,,>,,,>,>,,>,,>>,,>>,,>>,,>>,,>,>,,>,,,>,>,>,,,,,>,,,,,,,,,,,,,,>,,,,,>,,,,,,>,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,',,,,',,,',,',,,,,,,,,',,,,,,,,>;;;>>,>>>>;-*%%%$$$$##@++............+$*=-;;;;-&&&%%%%&%&&**--;;>>,'''''',*=---==%#.............++@##$$$$$%%%%%%%&&=->,,'',''',''',''',''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;;>>;>;;>;>;>;>>;>;>;>;>;>;>;;>>>;>>;>;>;;;>>;>;>;>>;;>>;>;>;>;>>;>;>>;>;>>;>;>>;>;>>;;>>;>>;>;>>>>>;>;>>>>>>>;>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>,>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>,>,>,>>,>,>>>,>>>,>,>>>,>,>,>>>,>>,>,>,>>,>,,>,>>,>,>,>,>,>>,>,>,>,>,>>,>,>>,>,,,>,,,>,,,>,,,,>,,,>,,,>,,,,,,,>,>,,,>,,>,>,,>,>,,,>,,,,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,',,,,,,,,,,,',,,,,,,,,,',,',',',,',',,,,>;;-;;>;>;;;;-*&%$$$$$##++............+$&=-=----=&&&&%%%%%%%&&&=-;;>>,,''''-*-;>>>;-*$+............++###$$$$$%$%%%%&&*=;>,,'''''',''','''''''''''''''',''''''''''''''''''''''''''''''''''",
-";>>;>;>>;;>;>>;>;>;>;>;>;>>;>;>;>;>>;;;>;;>;>;>>>;;>;>;>;>;>;;>;>;>;>;;>;>>;>>>;>;>>;>>;>>;>>>;>>>>>>>;>;>>>>>>;>>;>>>>>>>;>>;>>>>>>>;>>;>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>,>>>,>,>>>>>>,>>,>,>,>,>>>>>>>>,>>>,>,>>,>>,>>,,>>>,>>,,>>,>,>,>>,>,>>>,>,>,>,>,>,>,,>,>,,>,>,,>,,>,,,,>,>,,>>,,>>,,>,>,,>,,,>,>,,>,>,>,,,,>,,,>,,,,,,,,,,,,,,>,,,,,,,>,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,',',,,,,',,',,',,,,,,,,,,,,,,,,,,,,>>;---;;;;;;;-*&%%$$$##@++............%=;;;--===*&%**%%&%&&%&&&&*=-;;>>,,,;&=>,,,',,>-&+...........++@##$$$$$$$%%%%&&&*-;,,,',',''''''''''',''','''''''''''''''''''''''''''''''''''''''''",
-">;;>>;>;>>>;>;>;>;>;>;>>;>;>;>;>>;>;>>>;>>;>;>;>;>>;>;>>;>>;>>;>;>;>;>>>>;>;>;;>>>;>>;>>;>>;>;>>;>;>;>>>>;>;>;>>;>>;>>;>;>>>>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>,>>>>>,>>,>>>,>>>>>>>>,>,>,>,>>,>,>>>,>>,>>,>>>,,>>,>>>,>>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,>>,>,>,>,,,>,,,>,,,,>,,>,>,,,>,,,,,,,,>,,,>,,,,,>,>,,>,,>,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',',',',',',,',,,,>;-===------;=*%$%%$$##@+............%-,,,,>;---=*&%**%%%%%&%%&%&*=-;;;>>;**;,,'''''',>&@...........+@@#$$$%$%$$$%%%%&*=->,',''',','','',''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>;>;>;;>;>;>;>;>;>;;>;>;>;>;>;>;>;;>;>;>>;>;>;;>;>>;>;;>;>;>>;>>>;>;;>>>;>>>;;>>;>>;>>;>>>;>>>>;>>>;>>>>>>>>>>>>>>>>>>>>;>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>,>,>>,>>>>>>>,>>>>>>>>>>>>,>,>,>>>>>>>>>,>>>>,>>,>>,>>,>,>>>,>,>,>>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,,,>,,>>,,>>,,>>,,,>,,,,>,,>,>,>,>,,,>,,,>,,>,,,,,,,,,,,,,,,,>,,,,>,,,,,,>,,,>,,>,,,,,,>,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,',,,,,,,,,,',',,',,',,,,,,,,,,,,',,,,,,>>>-=======---=*%%%%$$##@+...........$;'''',,,>;;-=*%&*&&%&%&%&&&%&&*=-;;-**->''''''''''>*@..........++@##$$%$%$%$%%%&&&*=;>,',,,'',''''''''''''''','''','''''''''''''''''''''''''''''''''",
-";;>;>;>;>>;>;>;>>;>>;>>;>;>>>;>;>;>;>>;>;>;;>;>;>>;>;;>;>>;>;>;;>;;>>;>>;;>>;>;>>;>>;>>>;>>;>>;;>>>>;>>>;>;>;>>;>>>;>>;>;>>>;>>>>>>;>>>>>>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>,>,>,>>,>>>>>>>,>,>,>,>>,>,>>,>>,>>>>,>>,>,>>>,>,>>,>,>,,>>>,>,>,>,>,>,>,>>,>,>,,>,>,>,>,>,,>,>>,,>,,,>,,,>,,,,>,,>,>,,>,,,,,,,,,>,,,>,,,,,,,,,>,>,>,>,,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,',,,,,,,,',,,,,',,',',',',,,,,,,,,>>;-=***====-=*&%&%$$##@++..........#;''''''',,,>>;-*%&*&%%&%&%%&&&&&*=--*&=>'''''''''''',*@..........++###$%%%$$$%%%%&&*=;>,,',,,,'',''''',''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>>;>;>;>;>;>;>;>;;>;>;>;>;>>;>;>>;>;>>;>;>>;>;>;>;>>>;>>;>;>;>>>;>;>;>>>;>>;>>;>>;>>>>;>;>>;>>;>>>>;>>>;>>>>>>>;>>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>,>>>>>>>>>>>>>>>,>,>,>>>>>>>>,>>>,>>>,>>,>,>>,>>,>,,>>>,>,>>,>>,>,>,>>>,>,>,>,>,,>,>,>,>,,>,,>,,>>,>,,,>,>,>,,>>,,>,>,>,,,>,,>,,>,>,>,>,,,>,,,>,>,,>,,,,,,,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,,,,,,,,,,,,,,',',,,,,,',,,,,,,,,,,,,',',,,,>,>>;-***&****=*&%%&%%$#@@+..........@-'''''''''',,,>;-*&&*&%%%&&%&%&&&&*=*&=>,''''''''''''''*@.........++@##$%%&%%$%%%&&&**-;>,,,,,',''',''''''',''''''''''''''''''''''''''''''''''''''''''",
-";>>;>>;>;>;>>;>;>;>;>;>;>;>>;>;>;>;>;;>;>;>>;>;;>>;>;>;>;>>;;>;>;;>>>;>>;;>;>>>;;>>>;>;>>;>>;>>;>>>>>>;>>>;>>>>;>>>;>;>>>>>>>>;>>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>>>>>,>>>,>>,>>,>>,>>>>>>>,>,>,>>>,>,>>,>>>,>>,>,>>,>>>>,,>>,>,>>,>,>,>>,,,>,>,>,>,>>,>,>,>,>,>,>,>,,,>,,>,,>,>,>,,,>,,,,>,,>,,>,,>,,,,,,,,,>,,>,,,,,,,,,,>,,,>,,,,,,,,,>,,,,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,',,',,,',,',',',',',,,,,,,,,>>;;-**&&&&****%%&&%$##@++.........+=''''''''''''',,,>-*&**&&%&%&%&%&%&&&&*;,''''''''''''''',*+.........++@##%&&%%%%%%%&&*==;>>,,,,,',''','''''''''',''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;;>;>;>;>;>;>;>;>;>>;>;>;>>;>;>;;>;>>;;>;>;>;>;>;>;>;>>>;;>>;>>;>>;;>>>;;>>>;>>;>>;>>>>;>;>>>;>>>;>>>>>>>>>>>;>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>,>>>,>,>,>>>>>>,>>>>>,>>,>>,>>,>>,>,>,,>>>,>,>,,>,>,>,>,>>>,>,>,>,,,>,>,>,,>,>,,>,>>>,,>,,>,,,>,,>>,,>>,,,>,,>,,>,,>,>,>,>,,,,,,>,,>,,>,,,,,>,,,>,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,>>>>;--*&&&&&&&&%%&&&%$#@++.........+&'''''''''''''''',,>-*&&*&%&%&%&&%&%&%*->,'''''''''''''''',&+........+++##%&&&&%%%&&&***=;;>>>,,,',''''''','''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>>;>;>;>;>;>;>;>;>;;>>>;>;>;>>;>>>;>;>>;>;>>;>;>>;>;>;>;>>;;>;>>;>>;>;>>>>;>>;>>;>;>;>;>>>>;>>>;>>>;>>;>;>>;>>>;>>>>>>>;>>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>>>,>>>>>>,>>,>>>>,>>,>>>>>,>>>>>>,>>,>,>>,>,>>,>>,>>,>,>,>>,>>>,>,>>,>>>,>>>,>,>>,,>,>,>,>>,>,>,>,>,,>,>,,,,,>>,>,,>>,,>,,,>,,,,>,,>,,,,>,,,,,,,,,>,>,>,,,,,,,,>,>,,,,,,,,,,,,,,>,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,',,,,,,,,,,,',,',,',',,',,,',',',',,,,,,,,,>>;>--=&&&&&&&%%&&*&%$@@+..........%,'''''''''''''''',,,>-*&**&&%&%&%&%%%&->'''''''''''''''''''>%..........+@#$&***&%%&&&**=--;;>>>,,,','',''''''''''','''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>;>>;>>;>>;>>>;>;>>>;;>;>;>;>;>;;>;>;>;>>;;>;>;;>;>;>;>;>>>>;>;>;>;>>;>;>>;>>;>>>>>>>>>;>;>>>;>>>;>>>>>>>>>>>;>>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>,>>>>>>,>>,>>>,>,>>>,>>>>,>>>,>>,>>>,>>>>>,>>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>>>,>,,,>,>,,>,>,>,>,>,,>,,,>,>,,>,>,>,>,,,,,,,>,>,,>,,,,,,>,,,>,,>,,,>,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,,,',,,,,,,,,,,,,,,,',,,,,,,,,,',,,,>>>>;;--*&&%%%%%%&&*&*%#@++.........#;'''''''''''''''''',,,>;*&&**%&%&%%&%&-;,'''''''''''''''''''';#.........++@$&*===*%&***==-;;;>>>,,,',''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>>;>;>;>;>;>;>;>;>;>;;;>>;>;>;>;>;>>;>;>;>;>>;>>;>>;>;>;>>;>;;>>;>>;>>;>>;>;>>;>>;;>;>;>;>>>>>;>>>;>>>>;>>>;>;>>>>>>;>>>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>,>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>,>>>>,>>>,>>,>>,>,>>,>,>>>,,>,>,>>,>>,>>>,>,>,>,>,>>,>>,>,>,>,>,>,>,>>,,>,,>,>,,,>,,>,>,,,>,,>,,>,,,>,>,>,>,,,>,,,,,,,>,>,>,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,',',,',,',,,,',',',,,,,,,>,>>>>;-==&&&&%%%&&***&$#++.........@='''''''''''''''''',,'',>;*&***&%%&%%&=;,''''''''''''''''''''''*+..........+#%*==-=*&&*==--;;>>>>>,,,,',''''',''''''''''''''''''''''''''''''''''''''''''''",
-">>;>;>>;;>>;>;>;>;>;>;>;>;>>>;;>;>;>;>;>;;>;>;>;>;;>>;>;>;>>;>;>;>>>;>;>;>>;>>;>>>;>>;>>>>>;>>>>;>;>>;>;>>>>;>>;>>>>>;>>>;>>>>>>>>>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>,>>>>>,>>,>>>>,>,>>>,>>>>,>>>,>>,>>>>,>>>,>,>>,>,>>,>>,>>,,>,>,>>,>,>,>,,>,>,>,>,>,>,>,,>,>,>,>,>,>,>,>,,,>>,,>,,>,,>,,,,,,>,,>,,,>,>,>,,,,,,,>,,>,>,,,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,',,',,,,,,,',,,,,,,,,,',,,',,,,,,,',,,,,,>,>>;;;-=*&&%%%%&&****&#@+.........+&>''''''''''''''''''',,',,>-*&***&&%%&=;>,'''''''''''''''''''''',&.........++@$*=--;-*&=--;;;;>>>,>,,,,''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>;;>>;;>;>;>>;>;>;>>;>;>;>>;>;>>>;>;>>;>;>>;>>;;>;>;>;>;>;>>>;;>;>>>;>;>;>>>;>>;>;>;>;>>;>;>>>>;>>>>>;>>>>>>>;>>>>;>>>>>>;>>>>>>;>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>,>>>>>>>,>>>>>>,>>>,>>>,>>>,>>,>,>>>,>>>>>,>>>,>,>,>,>>>,>>,>,>,>>,>>>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,,>>,,,>,>,>,>,,>,>,>,,,,>,>,,,,,,,>,>,>,,,,,,,>,,>,,,,,>,,>,,,,,,>,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,',,,,,',,,',,,,,,,,',',',,,,,,,,,>>>>;;-==*&&&%%%***=**%@++.........#-''''''''''''''''''',,,''',>;*&***&&&*;>'''''''''''''''''''''''''-#..........+#&*=--;;*&*-;;;>>>>>>,,,,,','''''',''',''''''''''''''''''''''''''''''''''''''",
-";>;>;>>;>>;>;>;;>;>;>;;>;>;>;>;>>;;;>>;>;>;>>;>;>;>>;>;>>;>;>;;>;>>>;>;>>;>>;>;>;>>>>>>;>;>>>>>;>;>>>;>;>>;>>;>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>,>>>,>,>>>>>,>>,>>>,>>>,>>>,>>,>>>,>,>>,>,>,>,>,>>>>,>>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,>,,,>>,,,>,,,>,,>,,,>,>,,,,>,>,>,,,,,,,,>,>,,,,,,,,,>,,,,,,,,>,,,,,,,,,,>,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,,',,,',,',',,,,,,',,',,,>,,>>>;;-=**&&%%&****=*&#+..........+*,''''''''''''''''''',,,'''',>;*&&*&&*;>>''''''''''''''''''''''''''&+.........+@$*=---;;=*=;;>>>>,>,,,,,''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>;;>;>>;>;>>;>;>;>>;>>;>;>;>;>>;>;>;>;>;;>;>;>;;>;>;;>;>>>;>>;;>>;>;>;>;>;>>>;;>;;>>>>>;>;>>>>>;>>>>>>>>>>>;>>>>;>>;>>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>,>>>>,>>>>>,>>>,>>>>>>>,>>>,>>>,>>>,>>>,>>>>>,>,>>>,>>,>>>>,>>,,>,>>,>>>,>,>>>,,>,>,>,>,>,>,>,>,>,>,,>,>,,>,,>,>,,,>>,,,>>,,>,>,>,,,>,,>,>,>,,,,,,>,>,>,>,,,,,>,,>,,>,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,',,,',,,,,,,,,',,,,,,,,',',,,,,,,,,>,>>>;;-=**&&%%&&***=**%@+..........%>'''''''''''''''''''',>,,'''',,>-*&*=;;>''''''''''''''''''''''''''';$..........+@%&==-;;;=&*->>,>,>>>,,,,'',''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>>;>;;>;>>;>;>;>;>;>;>;>;>;>;>>;>;>;>;>>;>;>;>>;>;>>;>>;;>>;>>>;>;>;>>;>>>;>>>>>>>;>;>>;>>>;>;>>;>;>>;>;>>>>>;>>>>>>>>>>;>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>,>>,>>>>>>>>,>>>,>>>,>>>,>,>>>>,>>,>>>,,>,>,>>>,>,>,>,>,>>,,>>,>,>,>,>,>,>,>,>,>,>>,>,>,>,>,>,,>>,,,>,,,>,>,,,,>,>,,>,,,>,,>,>,,,,,,,,,,>,,>,,,,,,,,,>,,,,>,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,,,,,,,,,',,',',,,,,',,',,,,,',',,,,,,,,>,>;--=*&&%%&***=*=&$@+..........@=,'''''''''''''''''''',,,,''''',,>>;;>>>,''''''''''''''''''''''''''''*+..........+@$&==--;;-&&->>>,>,>,,,,'''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>>;>;;>;>;>;>;>;;>>;>;>;>;;>;>;>>;>;>;>>;>;>>;>;>;;>;>;>;>;>;>>>;>>;>;>;>;>;;>>;>;>>>;>>>>>>>;>>>>>>;>>;>>>;>>>;>>>>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>,>,>>>,>>>,>>>,>>>>,>,>,>>,>,>>>>>>>,,>>,>>,>,>>,,>>,>>,>>>,>,>,>,>,>,>,>,>,,>,>,>,>,>,,>,>,>,>,,>,>,>,,,,>,,,>,,>,,,,>,>,>,>,>,,,,,,,>,>,>,,,,,,,,,>,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,,,,',',,,,,,',,,,>,>>;;-=**&%&*******&#+...........+%>'''''''''''''''''''',,>>,'''''''',,>>>>'''''''''''''''''''''''''''''>%...........++@&*=--;;-*%->>,>,,,,,',''',''',''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>>>;>>;>>;>;>>>;>;>;>;>>;>;>;>;>;>>;;>;>;>;>;>;>>>;>;>>;>>;>;>;>>;>>>;>>;>>;>>>>;>>>;>;>;>>>>;>>;>>>>>>;>>>;>>>;>>>>>>>;>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>,>>>,>>>>>,>>,>>>>>>>>>,>>>,>>>,>>,>,>>>,>>,>>>>,,>,,>,>>,>>,>>,>,>>>,>,,>,>,>,>,>,>,>,>,>,,,>,>,,>,,>,,>,,,>,>,,>,,>,,>,>,>,,>,>,,,,>,>,,,,,,,,,,>,>,,>,,,,,,,>,>,,,,,,,>,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,',,',,,,',,',,',,',,,,',,,,,',',,,,,',,,,,>;;-=*&%&*=**=**&@++...........@=,''''''''''''''''''''>-==;,''''''',,,>>,''''''''''''''''''''''''''''''=@...........+++%*=--;;;*&=>,,,>,,,''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;;;>;>;>;>;>;;;;>>;>>;>;>;>;>;>;>;;>>;>;>;>;>;>;>;>>;>;>>;>;>;>;>>>;>>;>>>>>;>;>>>;>>;>>>;>;>>>>>>;>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>,>>>>>,>>>>>>>>>>,>>>>>>>,>>,>>,>>>,>>>,>>>>>,>>,>>>>>,>,>>>,>>>>,>>,>,>,>,>,,>,>>>,>,>,>,>,>,>,>,>,>>,>,>,>,>,>,>,>>,,>,,>,>,,>,,,,>,,>,,,>,>,,,,,,>,>,>,>,,,,,,,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,',',,,,',',,,,,,,>>;-=*&%*===***&$@++............%>''''''''''''''''''''-&%%%&='''''''',>>,''''''''''''''''''''''''''''''';$............+.+#&*--;;>=*=>,,,,,'',''''''''',''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>>>;>;>;>;>;>>>>>;>;>;>;>>;>;>;>;>>;>>;>;>;>;>;>;>;>>;>;>;>>;>>;>;>>;>>;>;;>>;>>>;>>>>>;>>>>>;>>;>>>>>>;>>;>>>>>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>,>,>,>>>>>,>>>,>>>,>>>,>,>>,>>,>,,>>>,>,>>,,>,>,>>,>>,>,>>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,,>,,,,>,,>,,,>,>,>,>,,>,,>,,,>,>,>,>,,,,,,,,>,,>,>,,>,,,,>,,,>,,,>,,,,,>,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,,',,,,,,',,',,,,,',,,,,',,,,,,,',,,,,>>;-*&&*==****&$@++............@*,'''''''''''''''''''-&%%%&&&-''''''',,>,,,''''''''''''''''''''''''''''',*+............+.+@%*=-;;>;*->,,'',''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>>>;>;;>;>>;>;>;>;>;;;>;>;>>;>;>>;>>;>;>;;>>;>;>;>;>;>>;>;>>>;>;>>;>>;>;>>>;>>>>;>>>;>>>;>;>>>;>;>>>>>;>>>;>>>>>>>;>>>>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>,>>>>>>>>,>>>>>,>>>,>>>,>>>>,>>>,>>>>>,>>,>,>>>>>,>>,>>,>>,>,>,>,>>>,>,>,>,>,>,>,>,>>,>,,,>,,>,>,>>,>,,>,>>,>,,>,,,>,,,>,,>,,>,,,,,,,>,>,>,,,,,,,,,,,>,,,>,,,,,,,,>,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,,,',,,',,,,',,,',',,,',',,',,,,,,,>>;-&&=-=*=**%@+++++...........$;'''''''''''''''''''>&%%%=;,,'''''''',;-;,,''''''''''''''''''''''''''''''-#...........++...+$*==;;>>->,,,''','','''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;;;>;>>;>>;>;>;>;>;>>>;>;>;;>;>;;>;>;>>;>>;;>;>>;>>;>;;>>;>;;>>>;;>;>>>>>;;>>;>;>>;>>;>;>>>>;>>>>>>;>>>>>;>>>;>>>>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>>>,>>>>>,>>>>>>>,>>>>>>,>,>>>,>>>,>>>,>>>,>>,>,>,>>,>>>,>,,>>,>,>,>,>,>>,>>,>,,>,>,>,>,>,>,>,>,,>,,>>,>,>,>,>,,>,>,>,,,,>,,>,>,,>,,,>,,,,,>,>,>,,,,,,,>,>,,>,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,',,,,,,,',,,,,,,,,',,,,,,,,','',,,>>-&*---==*&%@+++@+++.........+&>''''''''''',,'',;,,;&%%*>>'''''''''';=*;,,''''''''''''''''''''''''''''''>%+........+++++....#&=--;>>>,,',''''''''','''''''''''''''''''''''''''''''''''''''''''",
-";>;>>>;>;>;;>;>>;>>;>;>;;>;>;>>;>;>>;>;>;>;>;>>;>;>>;;>>>;>;>>>>;;>>>>>;;>;>>>;>;>>>;>;>>>>;>;>>>;>;>>>;>>;>>;>>>;>;>>>>>>;>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>,>>>>>>>,>>>>,>>,>>>>>,>>>,>>>,>>>,>>,>>,>>>>,>>,>,>>>,>>,>>>,>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,,,>,>,,>,,>,,,>,,>,>,,>,,,>,,>>,,>>,>,,,,,,,>,>,>,,,,,,,,,,,,,>,,,>,,,>,,,,,,,,,,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,',,',,',,,,,',,',,,,',',',',,,',',',,',,,',,,;**-;-==*&$@+++@@@@+++.......#=''''''''''',>>,',-->-&%&=>,'''''''''>=&*>,,'''''''''''''''''''''''''''''',*@........++++......@%*-;>,,>,,''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;;>;>;>>;>;;>;>;>>;>>;>;>;>;>>;;>;>;>;>;>;;>;>;;>>;;;>;>>;;;>>>;;>;>>>>;>;>>>>;>;>>>;>>>>>>;>>;>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>,>>>>>>>>>,>,>>>,>>>>>>>,>,>>>,>>>,>>>,>>,>>,>>,>,>>,>,>>,,>>,>>,,>,>>>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,>,>,,>,,>,,,>,,,>,,,,>,>,>,>,,,,,,>,,>,>,,>,>,,,,>,,,>,,,>,,,,,>,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,,,',,'',,',>-*;;;-=*%#+++.++###@++.......$;'''''''''',>;>>',-*--&%&=;,'''''''''-&%*;,>,'''''',,,,'''''''''''''''''''';$......++@@+++......+$*-;,,,,,,'''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;;>>;>>;>;>;>>;>;>;>;;>>;>;>>;;>>>;>;>;>;>;>>>;>>;>;>>>;>;>>>>;;>>;>;>;;>>;>>;>;>>>>;>>>;>;>>>;>>>>;>>;>;>>>;>;>>>>>>;>>>>;>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>,>>,>>>>>>,>>>,>>>,>>,>>,>>>,>>>>,>>>,>>,>,>,>>>>>,,,>,>>>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>>,,>,,,>,,,,>,,>,>,,,>,,>,>,,,>,,,,,,,,,,>,>,,,,,,,,,,,,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,,,,,,,,,,',',,',',,,,,,',,',,,',',',,,,',,',,,;=;>;-=*%@@+++.+@#$$#@++.....+&,'''''','''>;;>,,,;**=&&&*>>,,,,'''',*&&&>,>;,''',,,>,,''''''''''''''''''',>&+.....++@@@@+++......#*->,,,,,,'','''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>;>;>;>;>;>;>;>;>;>>;>;>>;;>>;;>;>;>;>;>;>;>;;>;>;>;>;>>;;>>>;>;>>;>>>;>>;>;>>;;>>>;>>>>>;>>>;>;>>>>>>>>;>>>>>;>>>>>>;>>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>>>>>>>>>>>,>>,>,>>>>>>>,>,>>>,>>>,>>>,>>,>>,>>,>,>,>,>,>>>,>>>,>,>,>>>,>>,,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,>,>>,,>>,>,>,>,,>,>,,,,,,>,>,,>,>,>,>,,,,,>,>,,>,>,,>,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,',,,,,,,,,,,',,',,,,,',,,,,,,,',','',',>;;;;;-*$@@++..++@$%%$#@++....@=,''''',,,,,>>>>,,,>=&*&&&*--=***;''',*&&=>,;--;>>>>,,,''',','''''''''''''''>*@....++@@@@@@++.......#*;>,,,,,,''''','''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>;>;>;>;>;>;;>;>;;>>;;>>;>>>;>;>;>;;>>>;>;>;>;>;>>>;>;>>;>;>>;>>>;>>>;>>>;>>;>;>;>>>;>>>>>;>;>>;>>>>;>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>,>>>>,>>>>>>>>>>,>>,>>>>,>>>,>>>,>>>,>>,>,>>>,>>>>,>>,,>>,,>>,>,>,>,>,,>>>>,>,>,>,>,>,>,>,>,>,>,>,,>,,>,>,,,,>,,,>,,,>,,>,,>,>,>,>,,,>,,,,,,,,,>,>,,,,,,,,,,,,,>,>,,>,,,>,,>,,,>,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,',,,,,,,,,,,,',,',,,,,,,',',,,',',',,,,',',',,;>>>;-*#@+++.+.+#%%%%$#@++....$;''',>>>>',;;-;;;;;>;*&&&&&**&&&&*,'',;**;'';**-;>,,,>>>,,,,,,,'''''''''''',,;#....++@##@#$$#++......#=;,,',,,'''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>;>;>>;>;>>>;>;>>;>;>>;>;;;>;>;>;>>;;;>;>;>;>>>;;>;>>;>;>>;>>>;;>>;>>;>;>>;>>>>>>;>;>>;>>>>>>>>>>>;>>>>>;>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>,>>>,>>>>>>,>>>,>>>,>>>,>>>>>>>>,>>>,>,>>,>>>,>>>,>,>,>,>,>>>,,,>,>,>,>,>,>,>,>,>,,>,,>>,>,>,>,>,>,>,>,,>,,>,,>,,,,>,,,,>,,,>,>,>,>,,,,,>,,>,,>,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,,',',,,,,,',,',,,,,',,,,,,,',,,',',''>>,>;-*$@+++++@#$%&&%%$##@+....&;,''=**=>,>********=;-=*&*&&*&**&*>''',>>,''>=**-;;;===;>>>>>>;;;;;>'''''''',;%+...+@@##@#%&&%#@+....+$=>,,',,,''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;>;>;>>;>;;;>>;>;>;>;;>;>>>;>;>>;>;>>>>;>>;>;;>>;>>;;>>>;>>;;>>>>;>;>>>>;>>;>;>;>>>>;>>>;>>;>;>;>>>>>;>>>;>>>>>>>>;>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>>>>>,>>>>>>>>>>>>>,>>>,>>,>>>,>>>,>>>,>,>>,>,,>,>>,>,>>>,>>,,>>,>,>>>,>,>>,>,,>>>>>,>,>,>,>,>,>,>,>,,>>,,,>,>,,>,>,,,>,,>,>,,>,,>,>,,>,>,>,>,,,,,,,,>,>,,,>,,,,,,,,>,,,>,,,,,,,,,,,>,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,,,,,',,',,,,,,,,,',,',',',,,',,,',',,,,>>;*%@+++@#$%%&&&%%%%$@@+...+*,'',=**=,,;**&******->;=*********-''''>>-;,'>=***==**=;,>>>>-=******-;''''',,>&+...++#####%***&%##+...@%=>,,,>,,'''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>>>;>;>>;>;>;>>>;;>;>;>;>>;>>;;>;>;>;>;>;;;>;>;>>>;>>;>;>>;;>;>>>>;>;>>>>;;>>>>>>>;>>;>;>>;>>>>>>>>>>;>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>,>>>,>>>>>,>>,>>>>>>>>>>,>>>,>>>,>>>>>,>>,>>>,>>,>>,>,>,>>>,>,>,>,>>>,>,>,>>,,,,>,>,>,>,>,>,>,>,>>,,,>>,>,,>,>,,>>,,>,>,,>,>,,,,>,,>,,,,,>,>,>,>,,,,,>,,,,,>,,>,,,,>,,,>,,,,,,>,,,,,>,,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,,,,,,,,,,,,',',,',,,',,,,,,',,,,',','',,,>>=&#@+@#$%%&&=;-&&%$$#@+...#=>,',=**=,,;***->;***-,,;-*****--;,''''>==;''>-*******->>>>>-**********-,''''>>=@...+@#####&-;-=*&%%#+.+#&;,,',>,,''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;;>>;>;;>;>;>;>;>>;>;>>;>;>;>>;>>;>;>;>;>>>;>;>;;>;>;>;>>;>>>;>;>;>>>;>;>>;>;>;>;>>>>>>>>>>>;>;>>;>>>>>>>>>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>,>>>>,>>>,>>>,>,>>>,>>>,>>,>>>,>>>,>>,>>,>>,>>,,,>,>>,>,>>>>,>,>,>,>,>,>,>,>,,>>>,,,>,>,>,>,,,,>,,>,>,,,>,>,,>,,,>,>,,,,,,,,,>,>,,,>,>,,,,,,>,,,,,,,>,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,,,',,,,',,',,',',,,,,,,,',,,,',,',,,,',,',',,,,,,-*%##$$%&&*->,>;&%%%##@++..$;,'',-**-,,;=*=->>===-,'>;=**=,'''''''>-==,'',-=**=*==;,>;;;==*==---==*=;,,',,>-#...+@####$&-;>>;-*&%$#+@$*-,,,>>','''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>>;;>;>>;>;>;>;>;>;>>;;>;>;>;;>;>;>>;>;>;>;>;>;>>;>>;>>;>;>;>;>>;>>;>>;>>;>>>;>>>>;>;>;>;>;>>>>>>>>;>;>>;>>>;>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>,>>,>>>>>>,>>>>,>>>,>>>>>,>>>,>>>,>>,>>>,>>,>,>,>>,>>,>>>>,>,>,>,>,,>,>,>,>,>,>,>,>,,>,,,,>>,>,>,,,>,>>,>,,>,,>,,>,,>,,>,>,,>,>,>,>,>,,,,>,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,',',,',,,,',,',',,',,'',,',,>=*%%%%&&*;,,,,>;*&%%$#@++.+%;>'',-==-,>;===-;-===;,',;-===,'''''''>==-,''';====-->,,>;--===->,,,-===;,,,,,>;$+.++@####$&-;>,,,>;=&%$##%*;,,;;,''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;;>>>;>;>;>;>;>;>;>;;>>;>;>;>>;>;>;>>;>;>;>;>>;>;>;>>;>>;>>;>>;>>;>>;>>;>>>;>>>;>>>;>>>>>>>>;>>;>>>>>>;>>;>>>>>>>;>>>>;>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>,>>>,>>>,>>>>>>>>>>,>,>>>>,>>>,>>>>,>,>>>,>>,>,>>>,>,>,>,>>>,>,>>,>,>,,>>,>,>>,>>>,>,>,>,>,>,>,>,>,>,>>>,,>,,>,>,>,,,,>,>,,>,>,,>,,,>,,,>,,,,,,,,,,,>,,,>,,>,,,>,,>,,,,>,,,,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,',,,,,,,,,,,',,,',,,,,,,,,,,',',,,,,,,',,',,',,',>;=**&&&=;,,,,,,>;&&%%$#@++.+&;,,',-==-,>;-===---=-,''>>-==-,'''''',;-=;''',;==-->,,''>---===>''',;-=-;>>,,>>>%+.++@##$#$&-;>>,,',>;*&&%%&=;>;;>,'''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>>;>;;>>;>;>;>;>;>;>>;>;>>;>;>;>;>;>;>;>;>;>;;>;>;>>;>;>;>;>>;>>;>>;>>;>>;>;>>;>>;>>>;>;>;>;>>>>>;>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>,>,>>>>>>,>>>,>>>,>,>>>>>,>,>>,>>,>,>>>>>>,>,>>>,>>,>>,>>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,,,>,,>>,>,,,>,>>,,,>,>,,,>,,>,,,>,,,>,>,>,>,>,,,>,,,,,,,,,,,,,,>,,,,,>,,>,,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,,,,,',,,',,,',,',,',',,,,',',',,,',,',',,,,>;-*&**;,,,,',',,;*&%%%##++.@*;,,'>;--;'>;-------;>''',;----,''''',>;---,''';---;>,''',;=----,'',>--;;;;>,',>>&@.+@@$#$#%*-;>>,,,'''>-*&&&&*--->''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>;>;>;;>>;>;>;>;>>;>;>;>;>;>;>>;>;>;>;>;>;>;>>;>>;>;>>;>>;>;;>;>>;>>;>>>;>>>;>>>>>;>;>>>>>>>>>;>>>>>>>;>>>;>>;>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>>>>>>>>>>>>,>>>>,>>>,>>>>>,>,>>>>,>>>,>>>,>,,>,>,>,,>,>,>>,>,>,>>,,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,,>,>>,>,,,>,>,,,>,>,,,>,>,,>,>,,,,,,,,,>,,,>,>,,>,,>,,>,,,,,>,,,,,,,,,,,,,,>,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,,,,,',,',,,',,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,,>,>>--*=;>,,,',,,,,>>*&&%%#@@+.#*>>,,>---;',;---;>>,'''''>;----''''',>;---;''',;---;>>'''';----;>,,,>>;;;;;;,,,>>*@.++##$#$$*-;>>,,',''',>-**&&&&-,''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>>;>>;>;>;>;>>;>;>;>;>;>;>;;>;>;>;>;>>;>>;>;>;>;>;>;>;>>>>;>>;>>;>>;;>>;>>>;>;>>>>>>;>;>;>>>>>;>>;>>>>>>>>>>>;>>>>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>>>>,>>,>>,>>>,>>>>,>>>>,>>>,>,>>>>,>,>>,>,>>,>>>>>,>>>>>>>,>>,>,>,>,>,>>>,>,>,>,>,>,>,>,>,>,,,>,>,>,>>,>,,,,,,>>,,>,>>,,,,>,>,,>,,>,,>,>,>,,>,,>,,,,,>,,,,,>,,,>,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,,,,,,,',,',,',,',',,',,,',',',,','',',,>>;;--;>,,',',',',,,>=&%&%$@@++#->>,,;;--;',>;-;>''''''''>;;;-;,''''>;;;;-;,''';-;-;;>,''',;-;-;;>>>;>;;;;;>'',>>=#.+@##$$$%*-;>>,,,'''''',>-=**=>,''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>;>;;>;>>>;>;;>;>;>;>>;>>;>>;>;>;>;>;>;>;>;>;>>>;>>>;>;>;>>;>>;>>;>>>;>;>;>>>>>;>;>;>>>>>>;>;>>>>>>;>;>>>;>>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>,>>>,>,>>>,>>>>>>,>>>>,>>>>,>>>,>,>,>,,>,,>,>,>>>,>,>,>,>,>,>>>,>,>,>,>,>,>,>>,,>,>,>,,>,>,>>>,,,>,,,,,>>,>,,,>,,>,,>,,,,,,>,,,,,,,>,,,,,>,,,,,,,,,,>,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,,',,,,,,,',,,',,,,,,,',,,,',,,>>;;;>,',',,,',',,,,>=&&%%$#@++$->>,>;-;;>''>;;;>''''''',>;;;;>'''',,;-;;;;''',;;;;;;>'''''>;;;;;;;;;;;;;;;,'',>>-#++@#$$#$%=;;>>,,,','''''',,>>>''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;;>;>;>>;>;>;>;>>;>;>;>;;>;;>;>;>>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>>;>>;>>;>>>>;>>;>;>>>>>>>;>;>>>>>>>;>>;>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>,>>>>>>>,>>>>,>>,>>>,>>>>>>>>>,>>>,>,>,>>,>,>>,>,>>,>,>>,>>>>,>>>>,>>,,>,>>>,>,>,>>,,>,>,>,>,>,>,>,,,>,>,,,>,>,,>,,,,>,>,>>,>,,,,,>,,,>,,,,,>,>,,,,>,>,>,,,>,,>,,,>,,>,,>,,,,,,,,,,,,>,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,,,,',,',,,,,',',,,,',',,,,',,,',',',,,',',,,',,,,,,',',,'',,,,',,,>-&&&%$#@++%;>>,,>;;;;'',;;>>''''''',;;;;;>''''',>;;;;;,'''>;;;;;,'''''',>;;;;;>;;;;;;>,'',>>-#++@##$$$&=-;>>,,''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>;>;>;>;>;>;>>;>;>;>;>>;>>;>;>;;>>;>>;>;>;>>;>;>>;>;>>;>;>>;>;>>;>>;>>;;>>>>>;>>;>;>;>>;>>>;>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>>>>>>>>>,>>,>>,>>>,>>>>>>>,>>>>,>>>>,>>>>,>>,,>>>,,>>,>>>,>,,>>,>,>,,>>,>,>,>,>,>,>,>>>,,>,>>,,>,>,>,>,>,,,,>,,>,>,>,,>,,,>,>,,,,>,>,,,,,,>,,,,,,,,,,,,,>,,,,,,,,>,,,,,,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,,,,',',,,,,,,,,,,,',',,,',,,,,,',',,,,',,,',,,',,,',,,'',',,,,,;*%&%$#@@@%;>>,',,,,''',,,,,''''''',>>;>>''''''',>;>>>''''>;>>>>'''''''',,>>>>;>>>;>>,''',>>;$++##$$$%&-;;>,,,,,',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>>;>;>;>;>;;>>;>>;>;>;>;>>;>>;;>>;>;>;>;;>;>;>;>>;>;>>;>;>>;>>;>;>;>>>;;>;>>;>>>;>>>>>>;>>>>>>;>;>>;>>>>;>>>;>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>,>>>>>,>>,>>,>>>>>>,>>>,>>>,>,>,>>,>,>>,>,>>,>,>,>,>>,,>>>,>,>,>,>>,>,>>,>>,,>,>,>,>,>,>,>,,,,>,>,,>>,>,,,>,>,,>>,,>,,>,,,,>,,>,>,,>,>,,,,,>,>,>,,>,,>,,>,>,,>,,,,,>,>,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,',,',,,,,,,,',,',',,,,,,,,',,,',',,,,,',',',',,,',',',',',,,,',,',,>>*&&&%##@@&;>>,'''''''''''''',,,,,,,>>>>,'''''''',,>>,''''',>>,''''''''''',,>>>>>>>,,'''',>>;$+@##$$$%*-;;>>,,'''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>>;>;>;>>;>;>;>;>;>;>;;>;>>;;>;>>;>;>>>;>>;>>;>>;>;>>;>>;>;>>>>>>;>>>>>>>>;>>>;>;>;>>>;>;>>>>>;>>>>>>>;>>>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>,>>>,>>>>>>>,>>>,>>,>>,>>>,>>>,>>>,,>>,>,>>>,,>>,>,>>,>>,>,>,>,>,>,>,>,>>,>,>,,,>,>,>,,,>,,,>,,>,,>>,>,,>,,,>,,,,,>,>,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,',,,,,,,,,',',',,,,',,,,,',',,',,,,,',',,,,,',,','',,',,,,,>=&&&%$@@@&;>>''''''''''''','',,,,',,,,'''''''''''','''''''''''''''''''''''',',',''''''''>>>;$+@##$$%%*-;;>,,,,','',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;;>;>;>;>;;>;>;>;>;>;>>;>;>;>>;>;>;>>;;>;>;>;>;>;>>;>;>;>>>>;;>;;>>;>;>;>;>>;>>>>>>>>>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>,>,>>,>>,>>>,>,>>>,>>>,>,>,>>,>>>,>>,>>,>>,>,>>,>>>>,>>>,,,>>,>,>,>,>,>,,>,>,>,>,>,>,>,,>,,>,>>,>,>,,>>,,>>,,>,>,,,,,,>,,>,,,>,>,,,,,>,>,>,,>,>,>,>,,>,,,>,,,,,,,,>,,,,>,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,',,',,,,,',,,,,',,',,',,,,,,',',,',,',,,',,,','',,,,','',,',',,,',',',,,>-*&&%$#@@&;>>,''''''''''''',,,,>,,,,'''''''''''''''''''''''''''''''''''''''''''''''''''',;>;%@@#$$%&&=;;>>>,,'','''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>>;>>;>;>>>;>;>;>;>>;>;>;>;>;;>;>;>;;>>;>>;>>;>>;>;>;>>>;>;>>;>>>>;>>>>>>>>>>;>;>;>;>>;>>;>>;>>;>>>>>>>;>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>,>>>>>>>>>,>>>>>>,>>>>>,>>>,>>>>>>>>,>,>>>,>>,>>,>,>,>,>,,>>,,>>>>,>,>,>>,>,>,>>,>,>,>,>,>,,>,>,>,,>,,,,>,>,,,>,,>,>,,,>,>,>,,>,,>,>,,,,>,>,,,,,,>,,,,,,,,,,,>,,,,,,,,>,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',',,,,,,,,,,,,,',,,,,,,',,',,,',',,,,,',',,,',',,,'',,',,',,,>;**&&%##@&;;>,''''''''''',,',,>>>>,,,'''''''''''''''''''''''''''''''''''''''''''''''''''>>;;$@##$$&%&-;;>>,,,,''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>;>;>;>;>;>;;;>;>>>;>;>;>;>>;>;>>;>;>;>>;;>;>;>;>;>>;>;>>;;>>>;>>>;>;>;>;>;>;>;>>>>>>>>>;>>>>>>>>>>>;>>>;>>>>>>>;>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>>>>>,>>>>>>,>,>>>>>>>,>>>>>>,>>>,>>>>,>,>,>>,>>,>>>,>>,>>>,>>,>>>,>,>>,,>,>,>>,>,>>,>,>,>,>,>,>,>,>,>,>,>>,>,>>,>,,>>,,>,,,>,>,,,>,,>,,>,,,>,>,,,,,>,>,,,,,>,,,>,,>,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,',,,,,,,,,,,,,,,',',,',,',',,',',',,,,,,',,,,,',',',,',',,,',',,,',,',',,,>>***&%$##&;>>>''''''''',,',,,,>>>>,,,,''''''''''''''''''''''''''''''''''''''''''''''''''>>>;%@##%%&&*-;;>>,,',,,'',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>;>;>;>;>;>>>;>;;>>;>;>;>;;>>;>;>;>>;>;>>;>>>;>>;>;>>>;>>;>;>>>;>>;>>>;>>>>>>>;>;>;>;>>>>;>>;>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>,>>>,>>,>>>,>>>,>,>>>>>>,>>,>,>,>>,>>,,>>,>>,>>,>>>,>>,>>,>,>,>,,>,>,>,>,>,>,>,>,>,,>,,,>,>,>,,>,,,>,,>,>,,>,>,,>,,,>,,>,,,,,>,>,,,,>,>,,,>,,,,,,,>,,,,,,,,,,,,,>,,>,,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,',,,,,,,,,,,,,,,,,,,,,',',,',',',,',,,,',,,'',,',,',',',',',,>>-&**%$##&;;>>'''''',',',,,,,,>>>;>>,,,','''''''''''',,,,,''''''''''''''''''''''''''''',>;;;%##$%&&&=;;>>>,,,''','',','''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>>;>;>;>;>;>;>;>>;;>;>;>;>>;;>;>;>;>;>;>;>;;>>;>>;>>;;>;>>>>;>;>>;>>;>>>>;>;>;>>>>>>>>>;>>>;>>>>>;>>>>>>>>>;>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>>>>>>,>>>,>>>>>,>,>,>>,>>>>>,>>>,>>>,>,>,>,>>,,>,>,>,>,>,>,>>>,>,>,>,>,>,>,>,,>,>,>>,>,,,>,,>,>,,>,>,>,>,,,>,,>,,,>,,>,>,,,,,>,,,,,,>,,,,>,,>,,,,>,,>,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,',,,,',,,,',,,',,',',',,',',',',',,,,',,,',,',,',',,'',,,',',',,,',,',,',,>;***&%##&;;>>,'''',',,,,,,,,,>;;;;>>>>,,>,,,'''',,,,,,>,,,,''''''''''''''''''''''''''',>>;;%##%&&&*-;;>>,,,,,,','','''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;>;>;>;>;;>>;>;>>;>;>>;>;>;>;>>;>;>>;>;>;>;>;>>>>;>;>;>>;>>;>>;>;>>>>>>>;>;>;>;>>>>>>>>;>>>>>>;>>;>>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>,>>,>>>>,>>>>,>>>>>>,>>,>>,>,>>>>,>>>,>,>>>>>>,>>>,>,>>>,>>>,>>,>>>,>,>>>,>,>,>,>,>>>,,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,,>,>,,>,,,>,,>,,,,>,>,,>,,,,,>,>,,,>,>,,,,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,',,,',,,',,,,',,',,',',',',',,,,>;=***%$$&-;;>,,,',,,,,,,,,,>,>>;;;;;>>>>>>>>,,,,',,>>>>;>>>,,,,,,,,',',',',,',','''',,>>;>-%#$&&*&*->>>>>,,,'',',''','''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>>;>>;>;>;>>;>;>>;;>;>;>;>>;>;>;;>;>;>;>>;>;>>;>;>;>;>>>>;>>;>>;>>>;>;>;>;>>>>>;>>>>;>;>>>>;>>;>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>>>>>>,>>>>,>>>>>>>>,>>>,>>>>>,>,>,>>,>>,>>,>,>,>,>,>>,,>>>,>,>,>>>,>>>,,,>>,>,>,>,>,>,>,>,>,>,,,>,>,,>,>,,>,>,,>,,>>,,>,,>,>,,,>,,,>,>,,,,,>,,,,,>,,,,,>,>,,>,>,,>,,,>,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,,,',,,,,,',,',,',,,',,',',',',',',,',',,',,',,,',,','',',,',',,',,',,',,,,>>-***&%$&-;;>,,,,,',,,,,,,,,>>>;----;;;;;;;;>,,,,,,>>;;;;>>,,,,,,,,,,,,,,,',,,',,,,,',,>;;-%$&&**&-;>>>,,,,',,',',''',''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>;>;>;>;>;>;>;>>;>;>;>;>>;>;>>;>;>>;>;>>>;>>;>;>>>;;>;>>;>>;>;>>>;>>>>>>>;>>>>>;>>>>>;>>>>>>>>>>>>;>>>>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>,>>>,>>,>>>,>,>>>>>>>>,>>,>>,>>>>>,>>>,>>>,,>,>>,>,>,>,,>>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,,>,,>,>,,,>,,>,>,,>,,>,>,,>,,>,>,,,>,>,,,,>,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,',,,,,,,,,,,,,,,,,',,,',,,,,,,,,,',,,,,,',,',',',,',,,,,,',',,,',,',',',,,,,>>;**=*&$&=;;;>,,,,,,,,,,,,,,,>>;-----;-;;-;-;>>,,,>>;;--;;>>>>,,,,,,,,',,,,,,,,,,,,,,,>>;>-&%&****;;>>>>,,,,'',',',,''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>;>;>;>;>;>;>;>;>>;>;>;;>;>;>;>;>;>>;>;;>>;>;>>;;>>>>;>>;>>>>;>;>>>;>;>;>>;>;>>>>>;>>>>;>;>>>;>>;>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>,>>>>>>,>>,>>>>,>>,>>>,>>>>>,>>>>>,>,>,>,>>,>>,>>,>,,>>,,>>,,>>>>>,>,>,>,>>,>,>>,>,>,>,>,>,>,>,>,,>,>,>,>,>,,>,,>,,>,>,,>>,,>,,,,>,,>,,,>,,,>,,,,>,,,,,>,>,,,>,,,>,,>,,>,,>,,,,,,,,>,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,',,,',,',',,,,,,,,',',',',,,,',',,,',,,,,',,','',',',,'',,',',,',',,,,>>>-****&&=;;>>,,,,,,,,,,>,>,,>>>;-===-=--=-=-;>>,,>;---=-->>>>>>>,>,,,,,,,,,,,,,,,,,,,>;;;=&****&=>>>>,>,,,,,',',''','''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>>>;>;>;>;>>>;>;>>;>;>;>;>;>;>>;>;>;>;>;>;>>;>>;>>;>;>>>;>;>>;>;>;;>>>>>;>>>>>>;>>>>>>;>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>,>>,>,>>>>>>>>>,>>,>>,>>>>>,>>,>,>>>,,>,>>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,,>,>,>,>,>,,,>,,,,>,,>,>,,>,,>,,,>,,,,>,,,>,>,,,,,,,,,>,,,,,,,,,,,,,,,,>,,,,,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,',,,,,,,,,,',,,',,,,,,,,',',,,,,',,,',',,',,,,,',,,',,',',,',',',',,,,>>;**=&*&=-;;>>,,>,>,>>,,,>,>,>;;-===========-;>>>>;-====-;;>>>>>>>>>,>,,,>,,,,,,,,,,>>>;>-******;;>>>,,,',',,',',',',''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;;;>;>;>>>;;;>;>;;>;>;>;>;>;>;>;>>;>;>;>;>>;>;>>;;>>>;>;>>>;>>>>>>>>;>;>>>;>;>;>>;>;>>>>;>>>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>,>,>>,>>>>>>>>>>>>,>,>,>,>>>,>>,>>,>,>>,>>>,>,>,>>>,>,>,>>>,>,>,>,>,>,>,>,>,>,>,>,>>,>,>,>,>,>,,>,,,>,>,>,>>,,>,,,,>,,>,,>,,,>,>,,,>,,,,>,,,>,>,,,,>,>,,,,,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,',,',,,,',,,,',',',,,,,',',,',',,,',,','',,',',',,,',',',',',,,,,,>>>-*****=-;;;>>,>,,>,,>,,,>,>,>;--*********==-;>;;;==***=-;>>>>>>>>>>>>>,>>>>>,>,>>,>;;;;-*===*->>>,>,,,,,',',,',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>>;>;>;;>>>>;>;>>;>;>;>;>;>;>;>;;>>>;>;>;>>;>;>>>;;>;>>>;>>;;>;;>;>>;>>;>>>>>>>>>>>>;>>>>;>>>>;>>>;>>;>>;>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>,>>>>>>>>,>>,>>>>>>>>,>,>,>,>,>,>>>>>>,>>,>>,>>>,>>>,>>,,>>,>>>,>,>,>,>,>,>,>>,>>,>,>,>,>,>,>,>,,,>,,>,,>,,>,>,,>,>,>,,>,,,>,,>,>,,,,>,,>,>,,,,,>,,,>,,,>,,,,,,>,,,,,>,,>,,>,,,,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,',,,,,',,,,,,',,,,,',,,,,,,',',,,,',,',,',,',,,,,',,',,,',',,,',,,',',,,,,,>>;*****=--;;>>>>>,>,>,>,>,,>>>>;-=*********=-;;>--=****=--;;;;;;>>>>,>>>>,>,>>,>,>>>>;>;-===**;>>,>,,,,,,,,,',',,'',''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";;;>;>>;>>;;;;>>;>;>;>>>;>>;>>;>;>>;>;>;>>>;>;>>;;>>>;>>;;>>;>>>>>>>;>>>;>>;>;>;>;>;>>>>>;>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>,>>>>>>>>>>>>>>,>,>>>>,>>,>>,>>,>,>>,>>>,>>,,>>,>>,>,>,>,>>,>,>,>>,>,>,>,>,>,>>,>,>,>,>,>,>,,>,>,,,>,,>,>,,>,,,>,>>,,>,,,,>,>,,,>,,,>,,,,>,,,,,,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,',,,,',',,,,',',,,',',',,,,',',,',,',,',,','',,',,'',',,',','',',,',,,>,,>>-****=;-;;;>>,>>>,>,>,,>,>>>>;;=***&&*&&**==-;-=*&&**=--;-;;;;;>>>>>>>>>>>>>>>,>>>;;>;-=-==->>>,,>,,,,''',','',,''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>;>;;>;;>>>;>;>;>;>;;;>;>;>;>;>;;>;>;>;>;>;>>;>>;>;>;>>>;>>;>;>;;>>>;>>>>>;>>>>>>>;>>;>>>>;>>>;>>>>>;>>>>>;>>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>>,>>,>>>>>>>,>>>>>>>>,>>,>,>,>,>>>>>,>,>>,>>,>>,>>>>,>>,>,>,>>>,>,>,>>>,>,>,,>,>,>,,>,>,>,>,>,>,>,,>,>,>,>,>,>,,>,>,>,>,,>,>,,,>,,,,,>,,>,>,,,,,>,,,>,,,>,,,,>,,>,,,,,>,,,,,,,>,,,,,,>,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,,,,,',,,,,,,,,,',,,,,,',,,,,,',,,,,,,,',,,,,,,',,',,,',,,,',',',,,',',,',,,',',,,,,,>,,>;=*=*=---;;>>>,>,>,>,>>,>,,>>>;-=**&&&&&&**=-==**&&&**=--;;-;;;;;;;>>>>>>>>>>>>>>>;>;;-=-==;>>,>,,,,',,,,',,,,''',''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";;>;>>;>>>;>;>;>>;>;>>>;>;>;>;>;>>>;>;>;>;>>;>;>;>;>>>;>;>>;>>>;>>>;;>>>;>;>>>;>;>;>>;>>>>;>>>>>>>>>>>>>;>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>>>>>>>>>>>>>>>,>>>,>,>>,>>>>>>>>>>>,>,>>>>>,>>>>>,>>,>,>>,>,>>>,>,>>>,>,>,>,>>>>,>>>,>>,>,>,>,>,>,>,,>,>,,>,,>,,>,>,,,>,,,>,>,,,>,>,>,>,,,>,,,,>,>,,,>,,,>,,,,>,,,,,,,>,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,,,,,,',,,,,,',,,,,,',,,,,',',',',,,',',',,',,',,',',,',,,',',,,',','',,,',',,,,,,,>>-**==----;;>>>>>>>,>,>,,>>>>>;-=**&&&&&&***==*&&&&&&==-------;;;;;>;>>>>>>>>>>>;>;;>;--=*;>>,,,,,,,,',',,''',,,'','''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;;;>;>;>;>>;>;>;>;>;>;>;>;;;>;>;>;>>;>>;>>;>;>;>>>;>>;;>>>;>>>>;>>>>>;>>;>>>>>>>>;>>>>;>;>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>,>>,>>>>,>>>>>>>>>>>,>,>,>,>>>>>,>>,>>,>,>>,>>,>>,>>>,,>,>>,,>>,>,>,>,,>,>,>,>,,,>,>,>,>,>,>,>,>,>,,>,>,>,,,>>,,>,>,,,>,>,,,,>,,,>,,>,>,,,,,>,,,>,,,>,,,,,>,>,,,>,,,,,,,,,,,,,>,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,',,,',,',,,,',',,,,,,,,',,,',,,',,',,',,,,',,'',,',',',,,',,''',,,',,,,,,,,;***=--;--;;>>>>,>>,>,>>,,>>>>;-=**&&&&&&&****&&&&&**==----;--;;;;;;;>;>>>>>>>;>;>>;;--*->>>>,,,,',,,','',,,''','''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>>>;>;>;>;;>;>;>;>;>>;>>;>>>;>;>;>>;>;>;>;>;>;>;>;>>>;>>;;>>;>;>>;>;>>>>>>;>>>;>>>>>;>>>>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>>,>>>>>>>>>>>,>>,>,>>,>>>>>>>>,>,>>,>>>,>,>>,>>,>>>,>,,>>>>,>>>>,>,>,>>>>,>,>,>,>>>,>,>,>,>,>,>,>,,>,>,>,>,>,>,,,>,>,>,>,>,,>,>,,>,,>,,,,,>,>,,,>,,,>,,,,>,,,,,,,,,,,,>,,,,,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,',,,,,,,,,,,',,,,,,',',',,,',,,',,,',,',,',',,',,,',,,',,'',',',,,',,,',,,,,,>>;***-----;;>>>>>,>,>,,>>,>>>>>;-**&&&%&&&&&&&&&%&&&*===------;;;;;>;;>;>;>>;>;>;;>;;-==;>,,>,,,,,',',,,','',,',','''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;>;>;>>;>;>;>;>;>;>;>;>;>;>>;>;>;>>>;>>>;>>>;>>;>>>>>>>;>>>>;>>>;>;;>>>;>>>;>;>>>;>>;>>>>>>>>>>;>>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>,>,>,>>>>>,>>>,>>>>,>>,>>,>,>>>>>,,>>,,>,>>>,>,,,>>,>,>,>,,>,>,>,>,>,>,,>,>,,>,>,>,,>,,>>,,>,,>,,>,,>,,,>,,>,>,>,>,,,,,>,,,>,,,>,,,>,,,>,>,,>,,,,,>,,>,,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,,,,',,,,,',,',,',,,,,',',,,,,,,',,,,',,',,',,,',,,',,'',,'',,',,,',',,'',',',,',,,,,>>=**--;--;;;;>>>>>>>>,>,>,>>>;;-=**&&&&&&&&&&&%&&&**====-------;;;;;;;>;>>;>;;;;>;>;-=;>>>>,,,,,',,,',',',,'',',''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>;>;>;>;>;>;>>;>;>;>;>;>;>;>;>;>;>>;>>;;>;>;>>;;>>;>;>;;>;>;>;>;>>>;>>>>>;>>>;>>>>>>>>>>>>>;>>;>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>,>>>>>,>>>>>>>,>>,>>,>>>>>>>>>,>,>>>>,>>,>,>>>>>,>>>,>,,>,>>,>>>,>,,>,>>>,,>>>,>>,>,>,>,>,>,>,>,>,,>>,>,,>,>,,>,,,>,,>,,>,,>,,>,,,>,,,,,>,,>,>,,,>,,,>,,,,,,,>,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,',,,,,',,,,,,,,,',,,,,,,',',',,,',,',,',,,',',',',',,,',,',','',,,',',,,',,',,'',,,>>;=*=----======--;;>>>>>>>>>>>;;-**&&%&&&&&&%&%&&&***=-==----;-;;;;;;-==****===-;>;-=->>,,,>,,,,',',',',''',','','''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;;>;>;>>;>>;>;>;;>>;>>;>;>;>;>;>;>;>;>;>;>>>>;>;>>>;>>;>>>>;>>>>>>>>;>>;>;>>>;>>>>>>;>;>>;>;>>>>>>>>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>>>,>>>>>>>>>>,>,>,>,>>>>,>,>>,>>,>>,>,>>,>>,>>>,>>,>,>,>>>>,>,>,>>,>,>,,>,>,>,>,>,>,>,>,>,,,>,>,,>,>,,>>,>,>,,>,>,,>,,>>,,,>,>,,,,,,,,>,,,>,,,>,>,,,,,,>,,>,,,,,>,,,,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,',,,,,',,,,,',,',',,,,',',',,,,,,,,',,,,',,',',,,,,,',,',',,',,',,,''',','',,,',',,',',,,>-****&&%&&&***====--;;>>>>>>;;-=**&&%&%&%&%&%&&&***===-------==*&&&&&&&&&%%%&&*=-=-;>,>>,,,,,,,',',',',',',','',''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>;>;>;>;>;>;>>;>;>;>;>;>;>;>>>;>;>;>>>;>;;>;>;>;>>>;>;>;>>;>;;>;>>>>>>>>;>>>;>>;>>>>>>>>>>>>;>>>>>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>>,>>>,>>>,>,>>,>>>>>>>>>>,>>>>>>,>>,>>,>>,>>>,>>,>,>>,>>>,>>,,,>>>,>,>,,>,>>,>,>,>,>,>,>,>,>,>>>,>,>>,>,>,,,>,,>,>,,,>,,,>,,,>,,>,,>,>,>,>,,,>,,,>,,,,,>,>,,,,,,,>,,,,,>,,>,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',',,,,,,,,,,',,,,,,,,,',,,,,,,',',',',,',',,',,,',',',,',,',,',,',,',',,,',,,',',,,'',',',,>>-*&&&%&&&&****====-=-=--;;;>>;;-**&&&&&&&&&&&&&&***===-----**&&%&&&&&*&&&&&%&&**=*--;>,>,,,,,,,,',','',','',',''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;>;>>;>;>;>;>;>>>;>;>;>;>;>;>;;>;>>>;>>>;>>;>>>>;>>;>>>>>>;>;>;>;>>;>>>;>>>;>>;>;>>;>>>>>;>>>>;>>>>>>>>;>>>>>>;>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>,>>>>>>>>>>>,>>>>>>>>,>,>,>,>,>>>,>,>>>,>>,>>,>>>,>>,>>,>,>>,,>>,>>>>,,,>>,>>>,>>,>>,>,>,>,>,>,>,,>,,,>,,,,>,,>,>,,>,,>,>,>,,>,,>,>,>,,,>,,,,,,,,>,,,>,,,,>,,,,,,,>,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,,,,,,,,',',,',,,',,',',,,,,,,,',,,,',,,',,',,,',',',',',',',,',',',',',','',',',',,,;-=**&&*=;;>;;--=---=---=-=--;;;;-=**&&&%&%&%&&&&***===-=--*&%%%%&%&&*&***-;>,>>--===--;;,>,,,',,',,',','',',',','''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>>;>;>;>;;>;>;>;>;>;>;>;>>;;>;>>>;>>;>>;>;>;;>>;>;>;>>;>>>;;>;>>>>>>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>,>>,>>>>,>>>,>>>>>>>>>>>>,>>>>,>>>,>>,>>,>,>>>,>,>>,>,>>,>,>,,>>>,>,>,,>,>,,,>,>,>,>,>,>,>,>,>,>,>>,>,>,,>,>,,>,,,>,,>,>,,,,,,,>,>,,>,>,>,,,>,,,>,,,,,>,,,>,,,,,,,,>,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,,,,,,,,,',',',,,,',,',',,',,',,',,,',,',,',,',',,',,',',,,,',',''',,;;----;,,,,''',,,>;----=--======-;-==*&&&&&&&&&&*&***===-=*&%%%&&&&&&**=;,''''''''',>;----;>,,,,,,,',','',''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>;>>;>;>;>;>;>;>;>;;>>;>;>;>>>;>;>;>>>>;>>>>;>;>>;;>>>>>>;>;>;>;>>>>>>;>;>;>;>>;>>;>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>,>,>,>>>,>>>>,>>,>>>,>>>,>,>>>,>,>>>,>>,>>>,>,>,>,>>,>,>>>,>,>,>,>,>,>,>,,>,>,,>,,>,>,>,,>,,>>,,>,,,,>,>,>,>,,,>,,,,,,,>,,,>,,,,>,,,>,,,,,>,,>,,,>,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,',,,,,,,,,,,',,,',,',,',',',',,,,,,,',',',,',,',,,',,',',,',,,',,',,,'','',',',',','',',,>>;;>>,,,,',,,',',,,,>;--=---===*==-==***&&&&&&&&&***===-=&&%&%&%&&&&*=>,'''''''''',',,,>;;-;>>,',',',',','','',,','''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>>;>>;>;>>;>;>;>>;>;>>>;>;>;>;>;;>>;>>>;;;>>;;>>>>>;>>>;>;>;>>>;>>>>;>;>>>>>>>>>>>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>,>,>>>>>,>>,>>>>>>>>>,>>>,>,>>,>>,>>,>,>>>,>,>>>,>,>>,>>,,>,>,>>>,>>,>,>,,>,>,>,>,>,>,,>,>,,>,>,>,>,,,,>,>,>,,>,>,>,,>,,,>,,>,,,>,>,>,,,>,,,>,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,',,,',,,',,,,,',,,,,,,,,',',',,,,,,',,',,',',,',,',','',,',',',,',,,,',',,',',',',,>,,,,',,,,,',,',,,,,,,,>---=--==****==**&&&&&&&******===*&%&%&&&&&&*=;,,,,''''''',',,,,,,,>;;;>>,,',','','',',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;>;>;;>>>;>;;>;>;;>;>;>;>>;>>;>>;;>>>>;>>>;;>;>>>;>>;>>>>;>>>>;>>>>>;>>;>>>;>;>>>>>>>;>>>>>;>>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>,>>>>>>,>,>>>>>>>>,>>>,>>>,>,>,>,>>>,>>>>,>>,>>,>>,>>,>>,>,>,>>,>,>,>>>,>,>,,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,,>,>>,,>,,,>,,>,,,>,,,>,,,>,,>,,,,,,>,,,>,,,,,,>,,>,,,>,,>,,,,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,',,,,,,,',',',,,,,,',',',,',,,',,,',,,',,',,,',,',',',,''',,',',,',',',,,,,,,,,,,,,,,,,,,,,,,,,>,>;--=-===*&&&*****&&&*&&&***==-*&%&%&&&&&&**;,,,,,,,,'',,,,,,,,,,,,>;;;>,,,',','','''',,',''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;>;>>;>;>;>>;>;>>;>;>;>;>;>;>;>;>>;;>>;>;>>>>;>;>>;>>;>;>>>;>;>>;>;>>>>>;>>>>>>;>>>;>>>>;>>>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>,>>>>>>>>>>>>>>>>>>,>>,>>>>,>>,>>,>>,>>,>>>,>>,>>,>>,,>,>>,>>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,,,>,,>,>,>,,>,,>,>,,>,,,>,,>,>,>,,>,,,>,,,,,,,,,,,,,,,,,>,,>,,>,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,',,,,',,',,',,,,',,',,,,,,,',',,,,,',,',,',,,',,,'',',,,'',',,',','',,,'',',',',',',',,,',,,,,,>,,>,>,,,>,>,>,>>;----===**&&&*****&*&*****===*&&&&&&&&&*&=->>,,,,,,,>,,,,,,,,,,,,,,,>>>>,,','','',','',''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>;>;>;>>;>;>;;>>;;>>;>;>;>;>;>;>>>;>>;>;>>;>>;>>;>;>>>;>>;>>>>>;>>>>>;>>>>;>>>>>;>>;>>;>>>>;>>>>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>,>>,>,>,>,>,>,>>>>>,>,>>>>>,>>>>>,>>,,>,>,>,>>,>>,>,>,>,>>,>,>,,>,>,,>,>,>,>,>,,>,,,>,>,,>,,,>,>,>,,>,,,>,,>,,,,>,>,>,,>,,,,,,,,,,>,,>,>,,>,,>,,>,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,,,,,,,,,,,,,,',',',,,,',',,,',,,,',',',',,,,,'',,,',',,',',,',',,,,',',',,,',,',,,,,>>>>>>>>>>>>>>>,,>,,>;-=--===*&&%&&***&*****===-*&%&&&&&*&***->>>>>>>>>>>>>>>>>>>>,>,,,,,>>>,',','','''','','''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;;>;>;>>;;>>;;>;>;>;>;>;>>;;>>;>;>>;>;>>>;>>;>;>>;>>;>;>;>>;>;>>>;>>>>;>;>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>,>>>,>>,>>,>>,>>>>>>>>>>>>>>>>>>>,>,>>>>,>,,>>>,>,>>,>>>>>,>>>,>,>>,>>,>,>>,>,>>>>,>,>>,>,>,>,>,,>,>,>,>,>>,>>,>,,>,,>,,>>,,>,,>,>,,,,,>,,,>,>,>,>,>,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,>,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,',,',',',',,,,,,,,',,,,,',,,',',,,',,,',''',,,',,',,',',,',',','',',',,',',',,,,>>>>>>;>;;;;>;>>>>>>>>,>>;---===**&%%&*********====&&&&&*&******;>>>>>>>>>>;;;;;;>;>;>>>>,,,,,>,,,'',''',,',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>>>;>>;>;>;>>;>;>>;>;>;>>>;>;>>;>;>>;>;>>>;;>>;>>;>;>>;>>>>>>>;>>>>;>>;>>>>>>;>>;>>;>>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>>>>>>>>>>>>>,>>,>>,>>,>,>,>,>>>>,>,>>>>,>,>>,>,>>,>,,>>,,>>>,>,>,>>,>,>,>>,,,,>,>,,>,>,>,>,>>,>,>,,>,,,>,,,,>,>,>,>,,,>,,,>,,,>,>,>,,>,,,,,,,,,,,>,>,,>,>,>,>,,>,,,,>,,>,,>,,,,,,,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,',,,,',,,,,,,,',,',,,,',,,',,,,,,,,,,,',',',',,',',,,',',,,,',,,,',,,,,',',',,',,',',,',',',,,,',',,,',,,,,>>>;;;;;;;;;;;;;;;;>>>>>>>;-----==*&&%%&******===-=*&&&&&*&*&***-;>>>>>>;;;;;;;;;;;;;;;;>>>>,,>,,,',''',''',',','''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>>;;>;>;>>;>;;>;>;>;>;>>;;;>;>;>>;>;>>;>;>;>>>;>>>>;>>;>>;>;>;>>>>;>>>;>>>;>>>>>>>>>>>>;>>;>>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>,>>,>>>>>,>>>>>>>>>>>>,>>>>,>,>>>>>,>>>>,>,>>>,>>>,,>>>,>,,>>,>,>,>>>>,>,>>,>,>,>,>,,>,>,>,>,>>,,>>>,,,>,,,>,>,>,>,,>,,,>,,,>,,>,>,>,>,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,,,,,,,,,',,,,,,,',',,,',,,,,,,,,,,,,,,',,',,',',',',',',',,',',,',',,','',',,','',',,,,,,,,,,>>>;;;------------;;;;>>>>>>;---=-==**&%%&****====--*&&&********==-;>>>;;;;---------------;;>>>,,,,,,','''','',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;;>>;>;>;;>;>>;>;>;>>;>;>>>;>;>;>>;>;>>>;>;>;>>;>;>>;>>;>>;>>>;>;>>;>>>>;>>>;>>;>>;>;>>>>>>>>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>,>>>>>>,>>>>>>,>,>,>,>,>>>,>>>,>>,>,>>,>,>>>>,,>>,,>>,>,>,>>,>,>>,>,>,,>,>,,>,>,>,>,>,>,,,>,>,>,,>,,,,>>,>,>,>,,>,,,>,>,>,,,>,,>,,,,,,,,,,>,>,>,,,>,,,>,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,,,,',,,,,,',',',',',',,',,,',,,,,',,,,,',',,',,',,',',',,,',',,,,,,,,,,'',,,>>;--=--=-=-=-=-=-----;;;>>>>;-----===*&&%%&*=====--=*&*&*&****====;;;;;;;;----=-=-==-=-------;>>>,,,,,',,''',',',''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;;>;>;>>;>>;>;>;>;;>;>;>;>;>>>;>;>>;;>;>>>>;>>;>>;>>;>>;>>>;>>>;>>>;>>>>>;>>>>>;>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>,>>>>>>>>>>,>>>>>>,>>,>>>>>>>>>>,>>>,>>>,>>>,>>>>,>,,>>>,>>>,>>,>>,>>,>,,>,>,>>,>,>>,>,>,>,>,>,>,>,>,,>,>,>>,>,,,,,>,,>,>,>,,,,,,>,>,,>,,,>,>,>,,>,,,,,,>,,,,>,,,,,,,,,,,>,>,,>,,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,',,,,,,',,,',,,,,',,',,,,,,,,,,,,',,',,',',',,','',,,',,',',',,',,',',',,'',',,'>,,,,,,>>;--=================---;;;;>;-----===**&&%**===--=-=*&******=*===-->;;;;--==================--;>>,,,,,''',','','','''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>>;>>;>;>;;>;>;>;>>;>;>;>;>;>;>>>;>>;>>;;;>>;>>;>>;>>;>>>;>>>;>>>;>>;>;>>>>>;>>>>>>;>>>>>;>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>,>,>,>,>>>>,>,>,>>>,>,>,>,>>>>>,>>,,>>,>,>,>,,>>>>,>>,>,>,>,,>,>,>,>,>,>,>,>,>,,>,>,,>,,>,>,>,>,,,>,,>>,>,,,,>,,,>,,,,,,>,,,>,>,,,,>,,,,,,>,>,,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,,,,,',,,,,,,,,,',,,,,,',',',',',',,,,,',,',,,,',,,,'',,',,',,,',',',',,,',,,,,,,,>,,',,>>;-=*==***=*=*=**=*=*====-;;;;;;------==*&&&&*=-=----=*******=====---;;;---====*=*=**=*******==--;>>>,,,,',',',,','''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>;>>;>>>;>;>;>>;>;>;>;>;>;>;>>;>;>>>;>>;>>;>>;>>;>>>;>>>;>>;>>>>>;>>;>>>;>>;>>>>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>,>>,>>>>>>>>,>,>>>>>>>>>>,>,>>>>>,>,>>>>>,>>,>,,>,>,>>,>>>,>,>>>,,,>>,>,>,>,>,>,>,>,>,>,,>,>,,>,>,>,,>,,>,>,>,,,>,>,,>,,,,>,>,>,,>,,>,>,,,,,>,,,,,>,,,,>,,>,,,,,,,,,,,,,,,>,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,',,',,,,',',,,,,,,,,,,,,,',',,',,',',,',',,,',',',,',',,',,',',,,,,,,>,>>,,,,>>;-==*******************===--;;-;------===*&&&*=------******====------;;--==********************==--;;;>>,,,',',,,',''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>>;>;>;;>>;>;>;;>;>;>>>;>;>;>;>>;>>;>>;>>;>>;>>;>>;>>>;>>>;>>>;>>>>>>>>>>>;>>>;>>;>>>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>,>>>>>>>>>>,>>,>,>>>>>>>,>,>,>,>>>>,>,>,>>>,,>,>>>>,>>>,>>>,>>,,>>>,>,,>>>,,>,>>,>,>,>,>,>,>,>,>,,>,>,>,>,>,>,>,,>,,>,>,,,>,,>,>,,>,,,>,,>,,,,,>,>,,,,>,,,,>,,,>,,,>,,,,,,>,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,,,',,,,,,,,,,,,',,,,,,,',',',',',',,,,',,,,',,,',,,,',,',,',',,',',',',,',,,,,>>>>;,,,,>--=**&*&**&**&*****&******==-----;---=--==**&*=-----;-*****=====---------==***&****&***&**&*&*&***===---->,,,,,,,,,,''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>>;>;;>;>;>>;;>;>;>>;>>>;;>;>>;>>;>;>;>>>;>>;>>;>>;>>;>>;>>>;>>>;>>>;>;>;>>;>>>>>>>>>>>>;>>>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>>>>>>>,>>,>>>>>>>>>,>>>>>>>>,>>>>>,>,,>>,>>,>,>>,>>>,,>,>>,>,>>,>>,>,>,>,>,>,>,>,>,>,>,,>,,>,,>,,,>,,,>,>,,>>,,,>,,,>,,>,,>,,,,>,>,,,,>,>,,,>,,,,,,,,,,,,>,,>,,,,,,,,,,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,,,,,,,,,,',,,',,',,,,,',,,',,,,,,,,,,,,',',,',',,',,','',',',',,,',,',',',,',,,,,>>>>;;>>>>;;-=**&*&&&&*&&*&&&&*&&&&&&***=----;-----=-==***==-;-;;-=*======----;-;--==***&*&&&&&*&&&&&&&*&&&&&******==->,>,,,,,,,,'''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>;;>;>>;>;>;;>>;>>;>;>;>;>>;>>;>;>;>>;>;;>>;>>;>>;>>;>>>>>;>;>>;>>>;>>>>>>;>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>,>>,>>>>>>,>,>,>,>>>,>,>,>,>,>,>,>>>>>>,>,>>,>,>>,,>>>>,>,>,>,>>,,>,>,>,>,>,>,>,>,>,>,>>,>,>,>,>,>,>,>,,,>,,>,>,,,>,,>,,>,,>,>,,,,>,>,,,,>,,,,,>,,>,,>,,,,,,,,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,',,,,,,',,,',,,,',,,',,,,',',',',',',,,,',,,',,',,,,,',,,,,'',',',,,',',,,,,,,>>>>;;;>;;-=***&&&&&&&&&&&&*&&&&*&&&&&&***=---;--=--=-===*=--;;-;-=======--;-;---==***&&&&&*&&&&&&&&&&&&&&&&&&&&&&&&&*-;>>>>>>,,,,''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>>;>;>;>>;>>;>;>;>;>;>;>;>>;>;>>;>>;>>>>>;>>;>>;>>;>>;>;>>>>>;>>>;>>>;>>>>>>;>>>>>>;>;>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>,>>,>>>>,>>,>>>>>>>>,>>,>>>>>>>>,>>>>>>,>>>>>>>,>,>,>,>>,>,>>,>>>,>,,>,>,>,>,>,>>,>,>>,>,>,>,>,>,>,,>,,,>,>,>,>,>,,>,>,>,,,>,,>,>,,,,>,,,,,,,>,,,,,,>,,,,,>,,,,,,,,,,,>,,,,,,,>,,,>,,,,,,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,,',,,,,,,,,',,,,,,,,',,,,,,,,,,,,,',',,',,',,,','',,'',',,,',,',',',,',,,>>>>>;;;;---==*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&**=------=-=-====--;;;;;-=====-----;-;--=**&&&&&&&&&&&&&&&&&&&&&&&&&&%%&%&&%*=--;;>>>,,,,''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>>;;>;>;>;>;>;>;>;>;>;>;>>;>;>;>;>;;>>;>>;>>;>>>;>>>>;>;>>>;>>;>>>;>>;>>>>>>;>>>>>;>>>>;>;>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>,>>,>>>>>>>,>,>,>>>,>,>,>>>,>,>,>>,>>>,>>,>>>,>,>,>>,>>,>>>,>>,>,>,>,>,,>,>,>,>,>,>,>,,>>,>,,>,>,,,>,,,>,,>>,,,>,,,>,>,,>>,>,>,,,>,>,,,>,>,,,,,>,,>,,>,,,,>,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,',',,',,,',',',,',',',,,',,',,',',,,,',,,',,',,',',',,',,,,,,>>>;;;---***&&&&%&%&%&%&%&%&%&%&&%&%&&&&&&&&*=-;-----=-=====---;;;;;-==-----;-;--==**&&&&&&&%&%&%&%&&%&%&%%%%%%%%%%%$%%&*=--;;;>>>,,,'''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>>;;>>;>;>;>;>;>;>;>;>;>;>>;>;>>>;>;>>>;>>;>>;>>;>;>>;>>;>>>;>>;>>;>>>;>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>,>>>>>>>>>,>,>>>>>>>>,>>>>>>>,>,>>,>>,>>,>>,>>,>,>,>>>,>,>,>,>,>,>,>,>>,>,>>,>,>,>,>,>,,>,>,,>,,>,>,,>>,,>>,,>,,,>>,,>,,>,,>,,,,,,,>,,,,,>,,,,,>,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,',,,,,,,,,,,,',,,,,,,,',,,,,,,',,,,,,',,,',,',,,','',,'',,',',,',',',,,',,,>,>>>;;;-;=*&%&%%%%%%%%%%%%%%%%&%%%&%%%%%%%%%&&*=----====-===-----------==----;----=**&&%%%%%%%&%%%&%%%%&%%%&%%%%%%$$%$$%&**==-;;>>>,,,'''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;;>>;;>>;>;>>;>;>;>;>;>;>;>>;>;>;>>>;;>>;>>>;>>;>>>>>;>>>>;>>;>>>>>>>>>>>>>>>>;>>;>>>>;>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>,>>,>>>>>>>>,>>,>,>>>>>>>,>,>,>>>>,>,>,>>>,>>,>>,>>,>,>,>,>>>,>,>,>>>,>,>>,>,>>,,>,>,,>,>,>,>,>,>,>,>,>,>,,>,>,,,>,,,>,>,>,,,>,,>,,>,,>,>,>,,,>,>,,,>,>,,,,,,,>,,,,,>,>,,,,,,,,>,,>,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,',,',,,',',,,,,,',',,,,',',',,',',',,'',,',,,',,,,,',,,',,',',,',,',',,,,>,>>>;;;;--=*&%%%%%$%%%%%%%%%%%%%%%%%%%%%%%%%%&&**=--=-======-=-----------------;-==**&&%%%%%%%%%%%%%%%%%%%%%%%%%%%$$$$$%%***==--;;>>>,,,''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>;>;>>;;>>;;>;>>>;>;>>>;>>;>;>>;>;;>>>;>>;;>>;>>;>;;>>;>;>>>>>;>;>>;>>;>>;>;>>>>>>>;>>>>>;>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>>>>>>>,>>,>>>>>>>>,>>,>>>>>>>,>,>>>>>>,>>>,>>>>,>>>>,>>>,>,>,>>>,>,>,>,,>,>>,>>,>,>>,>,>,>,>,>,>,,>,,>,>>,>,,>>,,>>,,,>,>,>,,>,,>,,,,,,>,,>,,,,,>,,,,,>,,>,,,,>,,,,,,,,,>,,>,,,,,,,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,,,,,,,,,,',,,,,',,',,,,,',,,,,,,,,,,,,,',,,',,',',','',,'',,',,,',',',',,',,,,,>>>;;;---=**%$$$$$$%$%%%%%%%%%%%%%%%%%$$$%%$%%&*============-=-----------------==**&%%%%$$$%%%%%%%%%%%$%%$%$%$$$$$$$$%&**===---;;>>,,,,,'''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>>;;>>>;>;>;>;>;;>>;;>>>;>>;>>>;>>;>>>>;>>;>>>>>>>>>>;>;>>>>;>>>>>>>>>>>;>>>>>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>,>>>>>>>>,>>,>>>>>>>,>,>,>>>>>,>,>>,>,>>,>,>>,>,>>,,>>,>>>,>,>,>>,>>>,>,>,>,>,>,,>,>,>,>,>,>,>,>>,,>,,>,>,,,>,,,>>,,>,,,,,,>,,,>>,>,,,,,,>,>,,,>,>,,,,,>,,,,>,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,,,,,,,,',,,,,,,,,',,,',',',,',',',,,',,,',,,,',,,',,',','',',,',',',,,,,>,>>>>>;;---==*&&%&%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&**======*====-------;-;-;------==**&&&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&**===---;;;>>>,,,''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;>>;;>;>;>;>;>>;>;>>;;>;>>;>;>;>>;>;>>;>>;>;>;>;>;>>>>>;>>>>>>;>>;>>;>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>,>>,>>>>>>>,>>,>>>>>>,>>,>>>>>>>>,>,>>>>,>>>,>>>>,>>,>>,>>>,>>,,>,>>>,,>,>,>,>,>,>,>,>>,>,>,>,>,,,>,>,,>>,>,,>,,>>,,>>,,,>,,>>,>>,,>,,,,,>,>,>,,,,,>,,,,,,>,,,,,>,,,,,,,,>,,,>,,,>,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,',',,,',,,,',,',,',,,',,,,,',,,,,,,',,',',,',',,',,',,,',,,,,,',',,,',',,,,,>>>>;;;;----===**************&*&*&&*&&&&&&&&&&**==--==-=-=-------;---;-;;;;----==**&&&&&&&&&&&&&&&&*&*&**&********=*===-=---;;;>>>,>,',''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>;;>>;>;>;>>;>;>;>>;>>;>;>>;>>;>>;>>;>;>;>>>>>>>>>;>;>>>;>;>;>>;>>>>>>;>>>>>;>>>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>>>>>,>>>>>>,>,>,>,>>>>>>,>>>,>>,>,>>,>>>,>>,>,>,>>>>,,>>>,>,>,>>,>>,>,>,,>,>,>,>,>>,,>,,>,,,>,>,>,,,>,,,,>,,>,,,,,,,,>,>,>,,,,,,,>,>,,,>,>,,,,,>,,,,,>,,>,,,>,,,,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,,,,,,,',,',',,,,',',',,',,,,,',,,,',',,'',,','',',','',,',,,,,,,,>>>>;;;;-;---------=====*===*===**==*=**=*=**==--------------;--;;;-;;--;-;---=====**********==*=*==*=========--------;;;;;;>>>>,,,,','''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>>;>;>;>;>;>;>;>>;>>;>>>;;>;>>>;>>;>>>>>>;>;>;>;>>>>>;>>>>>>>>>>>;>>;>>>;>>>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>,>>>>>>,>,>>,>>>,>,>>>>>>>>>,>,>,>>,>>,>>>>,>>>,,>,>,>>>,>>,,>>>,,>,>,>>,>,>,>>,>>,>,>,>,>,,>>,>,>,>>,>,>,,>>,,>>,>,>,,>,>,>,>,,,>,,>,>,>,,,,,>,,,,,>,,>,,,>,,,,,,,,,,,,,,>,,,,,,>,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,,,',,,,,,,,,,,,',',,',,,,,,,,,',',,,,,',,','',,,',',,,',',,',',,,',,',,',,,',',,,>,>>>>>>;>;;;;;;;-;--;----------=--=-=-=-===-=-----;--------;-;-;;-;;;;;;;;;;-----====-==-=---=-=---=--------;;-;-;;;;;>;;>>>>>,,,,,',','''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>>;>>;>;>;>;>;>;>;>>;>;>;>>;;>>>>>;;>>;>>;>;;>;>>>;>>>>;>;>>;>>;>>;>>;>>>>>>>>>>;>>>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>,>>>>>>>>>>>,>>>>>>,>,>,>,>>>>>>,>>,>>,>,>,>,>>>,>>>,,>>,>>>,>,>>,>>,>,>,>,>,,>,>,>,>,>,>,>,,>,,>,,>,,>,>,,,>,,,>,,>,>,>,,,>,,>,,,>,,,>,,>,>,,,>,>,,,,,,,,,>,,>,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,,,,,,',,',,,,,,,,',,',',',,,,,',',,',,,,,',',,,',',,,',,',,',',',,',',',,,,,,,,,,,,>>>>>>>>>>;>;>;;;;;;;;;;-;;-;-;--;-;;--;--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;--;;--;-;--;-;-;;-;;;;;;;;>;;;>;>;>>>>>>>>>,>,,,,,,,''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;;>;>;>;>;>;>;>;;>>>;>;;>>;>;;;>>>;>>;>>>>>>;>;>>>;>>>>;>>>;>>>>>>>>>;>;>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>>>>>>,>>,>>,>>>>>,>>>>>>>>>>>>,>,>>>,>>,>>>,>>>,>>>,>,>>>,>,>,>,>,>>,>,>>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>>,,>,,>,>,,>,,>,,,>,,>,,>,,,,>,,,,>,,,,,,>,>,,>,,,,,,,,,>,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,',,,',,,',,',,,,,,,,,,,',',,,,,',,',',,',,',,',',',,',,',',,',',',',,',,,,,,,,,,,,,,,>,>>>>>>>>>>>>>>>>>>;>>;>;>>;>;;;>;;>;;;>>>>>>>>;>;>>>>>>>;>>>>;>>>>;;>;;;;>;;;>;>;;>>;>>>;>>>>>>>>>>>>,>>,>,,,,,,,,,,,'''','''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>>;>;>;>>;>>;>;>>;>;>>>>;>;>>>>>;>>;>>;;>;;>>>>>>;>>;>>>>;>>>>;>;>;>>>>>;>;>>>>>>>>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>,>,>,>,>>>>>,>>>,>>,>>,>>,>,>,>>,,>>,>,>>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,,>,,>,,>,>,>,,,>>,>,,>,,>,,,>,>,,>,,>,,>,>,,,,>,,,>,>,,,,,,,,,,>,>,,,,,,,,>,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,',,',',',',,,,',,',,,',,,',,,,',',,,',',',',,,',',',,',',,',',',,,,,,,,,,,,,,,,,,,,,,>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>,>>,>>,>,,,,,,,,,,,,,,,',,','',','''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>>;>;;>>;>;>;>;>;>;;>>;>>;;>;>>;>>;>>>>>>;>;>;>>;>>;>;>>>;>>>>>>>>;>>>>>>>>;>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>,>>,>>>,>>,>>,>>>>,>>>>>>>>>>>,>,>>>,>>>,>>,>>,>>>,>>,>>>,>>>,>>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,,>>,,,,>,,>,>,>,,,,>,,,>,,>,,,,>,>,,,>,,,,,>,,>,>,,,,,,,>,,,,,,,,,,,>,,>,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,,,,,,,,',',,',,',,,,,,,,,,,,',',,',,',',',,,'',,,,',',,,',,,',',',',',',,'',,,',,',,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,>,,,,,,,>,,,,>>,>,>,,,>,>,>,>,,,,>,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',',,',','''','''',''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>;>;>;;>>>;;>;>>;>;>;>>>;>;>>;>>;>;>>;>>>;>;>;>>>>>;>>;>>>>;>>>;>>;>>;>>>;>>>;>>>>;>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>,>>>>>>>>>>>>>>,>>>>>>,>>>>,>,>,>,>,>>>>,>>,>,>>,>>,>>>,>>,>>,>,>,,>>,>>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,,,,>,>,>,,>,,,>,>,,>>,,,>,,,>,,,,,>,,,>,>,,,,,,,,>,,>,,,,,>,,,,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,',,',,,,,',,,,,,,',,',',',,,,,,,,,',,,,',',,,',',,','',,'',',,',',,',',',,',',',,',',',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,',',,','','',''''','',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>>;>;>>;>;;>;>>>;>;>>;>;>;>>;>>;>>;>;>>;>>;>;>>>>>>;>>>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>,>>>>,>>>>>>,>>>>>,>>>>>>>>>>>>,>>>,>>>,>>>,>>,>>,>,>,>>,>>>>,>,>,>>,>,>,>,>,>>,>,>,>,>,>,>,>,,>,,>,,>,>,>,,>>,>,,>,,>,,>,,>,,>,,,>,,,>,,,>,>,,,>,,,,,,>,,>,,,,,,,,>,,,,,>,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,',',',',,,',',,,',',,,',,',,,',,,,',,',,',',',',',',,'',,,',,'',''','',,','',',',',',,,,,',,,,,,,',,,,',',',,,,'',,',,',,,',',',',,',,,'''','','','''','''',''','''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>>;>;>;;>;>;>>;>;>;>;>;>>;>>;>;>>;>>;>>>>;>>;>>>;>;>;>>;>;>>>;>>;>;>>;>;>>>>>>;>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>>,>>>>>,>,>,>,>,>>>,>>>,>>>,>>>,>>,>>>>,>,>>,,>>,>,>,>>,>>>,>,>,,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,,>,>,,>,,>,,>,,>,,,,>,>,>,,>,,,,,>,,,>,>,,,,,,>,>,,>,,,,,,,,,,,,,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,',,',,,,,,',',',',,,,,,,,',',,,,',,,,',,',',,',,',',',',',',,',',',','',,''','',,',,',','',',,',,',','''''',''''''','''''','''''','''''''''''',''''''''''','''''''''','''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>;>;>>;>;>;>;>>;>;>>;>;>;>;>>;>>>;>>;;>;>>;>>>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>;>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>,>,>>>>,>>>,>>>>>>>>>>>>>,>>>,>,>,>>,>>>,>>,,>,>>,>,>>,>>>,>,,>,>,>,>>>>,>,>,>,>,>,>,>,>,>,>,>,>>,>,,>,,>,,>,>,>,>,,>,,>,>,,,>,,>,,,>,>,,,>,,,,,>,,,,,,,,,,,>,,,>,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,',,',,',,,,,,,,,,,',,,,,,,,,,,',',',,,,,',',,',',,',,,',',',',',,,',',',',,',',',,',',,',,'','','',',','','''','',,',',',,',','',',','',','''',',',',',''''',',''',''''','','',''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;>;>;>>;;>>;>;>>;>>>;>;>>;;>>;>>>>>;>>>;>;>>>>>>>>;>;>;>;>>;>;>>;>;>>;>>>>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>>,>>>>>>>,>>>>>>,>>,>,>,>,>,>>>,>>>>>>,>,>,>>,>>>,>>,>>>,>>,,>>,>>>,>,>>,,,,>,>,>,>,>,>,>,>,,,>,>,>,,,>,>,>,,>,,>,,>,,>,,,,>,,,>,,,,,,>,,,,,>,,,,>,,,>,,>,,>,>,,,,,,,,>,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,',',',',,,,,,',',',',,,,,,,',',,',,',,,',,',',,',,',,,',',,,',',',,',,,'',','','',',',','',',','',,,'',''',''',''''''',''','',''',','',''''''''',''''','''','''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;>;>>;;>;>;>>;>;>;;>>>;>;>>;>>;>;;>>;>>;>>;>;>;>;>>>>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>,>>>>,>>>>>>>>>>,>>>,>,>,>>>>>,>>>,,>>,>,>,>>,>>,,>>,,>,>,>,>>>,>,>,>,>,>,>,>,,>>,,,>,>,>,>,>,,>,>,>,>,,>,,>,>,,>,>,>,>,>,,,>,>,,,>,,,,>,,,,,,,,,,,,,>,,,,,,,,,,>,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,',,,',,,,,,,,,,,,,,',',,,,,,,,,',',',,,,',,,',,',,,',',,',,',,'',,','',',,,'',','',,',',',,',',',',,',''',,'''',',','',,'',',,','','',''',''''''''',',',''''',''''','''','''''''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>;>;;>>>>;>>;>>>;>>;>;>>>>;>>;>>>>>;>;>>>;>>>>>>>;>>;>>;>;>>;>>;>>;>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>,>>>>>,>>>,>>,>>>,>>>>,>,>,>,>,>>>,>>,>>>,>,>>,>,>>>,>>,>>,>,>,>>,>,>>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,>,,>,>,,>,,>,,,>,,,>,,>,>,,,>,,,,,>,,,,>,,,,,>,,,>,,,,>,,>,,>,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,',,,,,',,',',',,,,,,,',,',',,',',',,,,',,',,',,,,',',,',',',,',',,',',',',',,','','',',,''',,',''',',''',',''',''','',',''',',',','''''',',''''','''''''','',''',''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>>>;>>;>;;>>;>;;>;>;>;>;>;>>>;>>;;>;>>>>;>>>>;>;>;>>;>>>>>>>;>>;>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>,>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>>>>>>>,>>,>>,>>,>>,>>>>,,>>,>>,>>,>>>,>,>,>,>>,>>>,>,>,>,>,>,>,>>,>,>,>>,>,>,,>,,>,>,>,,>,>,>,,,,,>,>,,>,>,,>,>,,,>,>,,>,,,,>,,,,,,,,,,,,,,,,>,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,,,',,,',,,',,,,',,,',,,,',,,,,,,',',',,',,,',,,,,,','',',',',,'',',,',,',',',,',','',',',','',',,','','',,,''',',,''',','','','',',''''',','''''''',',''''''',''''','','''''''','''','''',''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;>;;>;>>;;>>>>;>>>;>>;>>;;>>;>>>>;>;>>>;>;>>;>>>>>>;>>;>>>>>>>>;>>>>>>;>>>>>>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>,>>,>>>,>,>,>,>,>,>>,>>,>>,>>,>>,>,>>>,>,>,>,>>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,>,>,>,>,,,>,>,,>,,,>,>,>,,,,>,,,>,,,,,>,,,,,,,,>,,,,,>,,>,,>,>,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,,',,,,,,,',,,,,',',',,,,,,,,,',,',',',',,,,',,,',',,,',',',',',',',,',',,',',',',,',''',',','''',',''',',','','',''',''',',',''''',',','''','','''',','''''''''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>;>>;;>;>>>;>;>>>;;;>>;;>;>>;>>>>;>>;>;>>>>;>>>>>;>>>;>;>>>>>>;>;>>>>>>>;>>>>>>;>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>,>>,>>>>,>>>,>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>,>>>,>,>>>,>>>,>,>>,>>>,,>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,>,,>,>,,,>,>,>>,,>,,,>,>,,>,,,>,>,,,>,>,>,>,,,>,,,,,,,,,,,,,,,,,>,,,>,,,>,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,',,,,',,',,,,',',,,,,,',',',',,',,,,',,,,',',,'',,,',',,,',',',,',,'',','',',',','',',',',','',,,',',','',''',','',','',''',''',',''''''',','''''','''''',''''','',''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";;>>;>;>>;>;;;>;>;>;>>>;>>>;>;>>;>;>>;>>;>>;;>>>;>;>>>;>>>>>>>;>>>>>>;>;>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>>>>>>>,>>>,>>,>>,>>,>,>,>,>,>,>,>>>,>>,>>,>>,>>,>>,,>>,>,>>,>,>,,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,>,,>,>>,>,,,,,>,,,>,,>,,>,,>,,,,,>,,,,,,,,>,,,,,>,>,>,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,',,,,,,,,,,,,,,,',',,,,,,,,',,',',,'',',,,',,,'',,','',,',,',','',,,,',,',',',',',',','',',,''',',''','',,'',',''''','','',','''',',',''''',',''''''',''','''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>>>;>;>;>;>;>;>;>>>;>;>>;>>>;>>;>>>;>>;>>;>>>;>;>>;>>>;>>;>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>,>>,>>,>>>,>,>>,>>,>>>,>,>,>>,>,>,>,>,>,>,>,>,>,,>,,>>,>,>>,>,,>,,,,,,>,>>,,,>,>,>,,>,,>,>,>,>,,,>,>,>,,,,>,,,,,,,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,',,,,,',,,,,,,,,,,,,,,,',,',,',',,',,,,,',',',',,',,,',,,,,',',',',,,',,,,,','',,',,,,''',',',',',',',','',,',''',',''',,'',''',''',',','','','''',','''''',','''''',',',''',''''''''''''''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;;>>;>;>>;>>;>;>;>;>>>;>>;;>>>;>>;>>;>>>>>>;>>>>;>>;>>>>>>>;>>>>>>>>>>>;>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>,>>,>>>>>>>,>>,>>,>>,>,>,>,>,>,>,>,>>,>,>>,>,>>,>>,>>,,>>,>,>>,>>,,>,>>,>,>>,>>,>,>,>,>,>,>,>,>,>,,>,,>,,,>,>,>>,>>,,>,,>,>,,,,,>,,>,,,,,,,,,>,,,,,,,>,,,>,,,>,,,>,,,>,,,,,,,,,,>,,>,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,',,,,,,,,,,,',,',',,,,,,,,,',,,',,,',',,',,',,'',,'','',,,',','''',,,',',',',',',',',''',',,','',,''','',,'',,'',''','','',',''''',',''''','','''''''''''','','','''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>>;;>>>;>>;>;>>;>>;>;>>>;>>>;;>>;>>>>>;>;>;>>;>;>>>>>>;>>;>>>>;>>>>>;>>>>>>;>>>>>>>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>,>>>>>,>>>>>>>>>>>>>>>>>>>,>>>>,>,>>,>>,>>,>>>,>>>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,>,>,,,,,>,,>,,>,,,>,>,>,,>,,>,>,>,>,,,>,>,>,,,,,,,,>,,,>,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,',,,,,,,,',',',,,,,,',,,,',',',',,,',',',,',,',,',,',,,',,',,',',',',,,,,'',',',',',',',',',,'','','','',','',''',''','',''','',''',',','''',',''''''',''','','''''''''''',''''',''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>;>;>>;>>;;>;>;>>;>;>;>>;>;>;>>;>>>>;>>;>;>>>>>>;>>>>>>>>;>>>>>>;>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>,>>>>>,>>,>,>,>,>,>,>,>>,>,>>>>,>>,>>,>>,,>>,,>>,>>>,,>>,>>,>,>,>,>,>,>,>,>,>,>,>>,,>,,>,>,>,>,,>>,>,,>,>,,>>,,>,,,>,,,>,,,,,,,,>,,,,,,,>,>,>,,,,,,,,>,,,,,,,>,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,',,,,,,,,,',,',',,,,,,,,',',,,,,',,,,,,,,',',,,,,',,',,',,',,',',,',,',',',','','',,',',',',',',',','',,'',',,','',','',,'',',''',','',''','''''''',''''','',''',''''''''''''''',''''','''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>>;;>;>>;>>;>;>>;>>;>;>>>;>;>>;>;>>;>>>>;>;>;>>;>;>>;>>>>;>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>>>>,>>>>>>,>>>>>,>>>>,>>>>>>>>>>>>>>,>>>,>,>>>,>>,>>,>>>,>>>,>>,,>>>,>,>,>>,>>>,>,>,>,>,>,>,>,,>,>,>,>,,>,,>,>,,>,>,,,>,,,,>,,>,,,>,,,>,>,>,>,,,>,>,,,,,,,,,>,,>,,,,,>,,>,,,,>,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,,',,,,,,,,,,,',,,',,,,,',',,,',',',,,,,',',',,,,,',,',',',,',',',',,,',,,,',,,',',',',',',',','','',',','',',''',,''',','',','',''',','',',',''',',''',''''''','',','','','''''''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;;>>;>;>>;>>;>>;>>;>;>>;>>;>>;>>>;>>;>;>>;>>>>>>>>;>>>;>>>;>>;>>>>>>>;>>>>>>>;>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>>>>,>>>,>,>>>>,>>>>>,>,>,>,>,>,>>>,>>,>>,>>,>>>,>,>,>,>,>,>>>,,,>,>>,>,>,>,,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,,>,,>,>,>,>,>,,>,,>,>,>,>,,,,,,,,>,,,,,>,,>,,>,,,,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,',,,',,,,,',,,,,,',,,,',,',',,,,',,',',,',,,',,',,',,,',',','',',''',',',',',',',',',',',',',','',',,''',,'','',''','',',''',''''''','''','''','','''''''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>>>;>;>;;>;>;>>;>;>;>>;>>;>>>;>>;;>>;>>>>>>>;>;>;>;>>>>>>;>>>;>>;>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>>,>>>>>>>>>,>>>>,>,>>>>>>>>>>>>,>>,>>>,>>,>>,>,>>,>>>,>,>>,,>>>>,>,>,>,>,>>,>,>,>,>,>,>,>,>,,,>,,>,>,,>,>,,>,,,>,,,>,,,,,>,,,,,>,,>,>,>,,,,>,>,,,>,,,,,,,>,,,,>,,,,,,,,,,,>,,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,',,,,,,,,,,,,',,,,,',',,,',,,,,,',,',',,',',,',,'',,',,',,'',,',',,,',',,,',',',',',',',',',',',''',',,''''','''','','',''','''','',',',',''',''',''''''','','''',''''',''''','''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;;>;;>;>;>>;>>;>;;>>;>>;>>;>>;;>>;>>>>;>>;>;>;>>>>>>>>>;>;>>>>>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>,>>>,>>>>,>>>>>>,>,>,>,>>,>>,>>>,>>,>>>>>,>>,>,>,>>>,>>>,,>,>,>,>,>,>,,>,>,>,>,>,>,>,>,>,>,>,,>,>>,>,>,,>>,,>>,,>>,>,,,>,>,,,>,,,,,>,>,,,,>,,,,>,,>,,,,,,,,,>,,>,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,',,',,',,,',,',,,,',,,',',',,,',,,',,,,',,',,,',',',',,,'',',',',',',',',',',',',',','','',',,'','',',,',',,',','','','',','',''''''''','','''','',''''''','''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>;>;>;>;>;>>>>>;>;>;>;>>;>>>;>>;>;>>;>>>;>>>;>;>;>>>>>>>;>;>>>;>>>>>>>;>>>>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>>>>,>>>,>>>>,>>,>>>>>>>>,>>,>>,>,>,>>,>,>>,>,>>,>>,,>>,>,>>,>>,>>>,>,>>,>,>,>,>,>,>,>,,>,>,,>>,>,,,,>,,>,,,>,,,>,,,,>,>,,>,>,,,>,>,,,,,>,>,,>,,,,,,,>,,>,>,,,,,,,,,,,,,,>,,>,,,,,,,,>,,,,,>,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,,,,,,',,,',,,,,',,,,,,',,',',,',,,,,,,',',,',,',',,',,',,',,,',,',,,',,',',,',',',',',',',',',',',',','',',',','''',''','',''','',''',''',',',','''''','''''''',','''''''''',''','''''','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>;>;>;;;>;>;>>;>>;>>;>;>>;>>>;>>>;>>>;>>;>>>;>;>>;>>>>;>>>>>>>;>>>>>>;>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>>>,>>>>,>>,>>,>>>>>>>>,>>>,>>>>,>,>,>>>>>>,>>>>>,>>,>,>>,>>,>,>>>,,>>,>,>,>>,,>>,>,>,>,>,>,>,>,>,>,>,>,>,,,>,,>>,,>,,>,>,>,>,,>,>,,,>,,>,,>,,,,,>,>,,,,,,,,,>,>,,,,,,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,',,,,,,,,,,',,,,,,',,,,,,,,,,,,,,',',',,,,',,',,,',,',',',',',,','',',',',',,',,',',',',',',',','',',',','',''',,','','','',,'','','',',''''''''',',''','',','''''','','''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>;>>>;>>>>;>>;>;>;>>;>>>>;>;>;>>;>>>;>>>>>>;>>>>>>>>>>;>>;>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>>>>>,>>,>>>>>>>>,>,>>>>>>,>,>,>>,>,>>>,>>>>,>>,>>>,>,>>>,>,>,>,,>>,>,>>,>,>,>,>,>,>,>,,>,,>,>>,>,>,,,>,>,>,,>,,>,>,,,,>,,>,,,>,,>,>,,,,,>,>,>,,>,,,,,>,,>,,>,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,',,,,,,',,',,,',,',',',',',,,,,,',',,',,',,,',,',,',,',',',,,',,',','',',',',',',',',',',',','',',',',','','',','','''','','',''',',',',','''',''''''''','','''''',''''',''''','''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;;>>;>;;>>;>;>>>;>>>;;>>;>>>;>>>;>>>;>;>>>;>;>>;>;>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>>>,>>,>>,>>>>>,>,>>>>>>>,>>>,>,>>>,>,>,>>,,>>,>,>,>,>>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,,>,>>,,>,,,>,>,>,,,>,>,,>,,,>,,>,,,,,>,>,,,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,>,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,',',',,',,',,',,',,',,',,',,,,',,',,'',,',,,',',',',',',',',',',',','',',',','','','',',',','',''','',''''''''''',''',',''',''''''',''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>>;>>;>;>>>>;>;>>;;>>;;>>>>>>;;>>;>>>;>>;>>;>>>>>>>>>>>;>>>>>>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>,>>>>>,>>,>>>,>,>>>>>>,>>>,>,>>>>,>,>,>>,>,>>>,>,>>>,>>,>>>,>>>,>>>,,>>,>,>,>>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,,,>,,>>,,,>,,>,,>,,>,,>,,>,,,>,>,,,,,>,>,>,>,,,,,,,,,,,>,,,,,>,,,,,,,,,,,,>,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,,,,',,,,',,,',',,',',',',',',',,,,,,,',,',,',,',,',,',,',','',,','',,,',',',',',',',',',',',',''',',','',','','',',','','','''',''','',',',',',''',''''','''','','''',''',''''''''''''',''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;;>>;>;>;>;;>>>;>>>;>>>>;;>;>>>;>>;>>>;>>>>>>;>;>;>>;>>>;>>;>;>>>>>>;>>;>>>>;>>>;>>>;>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>>,>>>>>,>>>>>,>>>>>>>,>>>>,>,>>>,>,>>,>,>,>,,>>,,>>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>>,,>,,>,>,>,>,>,,,>,>,,>,>,,>,,>,,>,,,>,,,,,>,>,,,,,,,,>,,>,>,,>,,,,>,,,,>,,>,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,',,,',,,,',,,,,,,,,,,,,,,,,,,,,,,,,,,',',,,',,',,',,',,',',',,',,',',,,','',',',,,',',',',',',',',',,'',',','','',','',''','','',',',',''',''''''''',''',',''''',''''''''''''''''','',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>>;;>;>>;>;>>;;>>;;>>;>;>>>>;>;>>;>>;>>>;>;>;>>>>>>>>>;>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>>,>>>>>,>,>>>,>,>>,>,>,>>,>,>>,>>,>>,>>,>,>>,>>>>,>>,>>,>,>>,>,>,>,>,>,>,>,>,>,>,,>,,>,>,>,,>,>,>,,>>,,>,>,,,,>,,>,,>,,>,>,,>,>,,,,>,>,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,',,',',,,,',,',',',',,,,,',,,',,,,,',,',,',,',,',,,,',',',,',','',',,',',',',',',',''',','',',',','',',',',','',''',''',','',',',',''','''''',','''',''',''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>>;>>;>;>>;>>;>>;>>>;>>;>>;;>>>>;>>>>>;>>>;>>>;>>;>>;>>>>>>>>>>>;>>>>>>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>>,>>>>,>>>>>>>,>>>>>,>>>>>>,>>>>>>>>>>>,>>>,>>>,>>,>>>,>>>,>,>,>,>>,>,,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,,,>,,,>,,>,>,>,,>,,>,,,>,,,>,,,,,,>,,,,,,,,>,,>,,>,,,,>,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,,',,,',,',,,,,,',',,,',,,',',,',,',,,',',,'',',',,',',,,',,',',',',',',',','',,,'',',',',''',',''','',',''','''',''',''''''''',''',',''''''','','''''''''',''''''',''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;;>;>;>>>;>;>;>;>;;>>>;>>;>>>;;>>>;>;>>>;>>>;>>>;>>>>>>;>>;>>;>>>>>>>>;>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>>>,>>>,>>,>>>,>>,>>>,>,>,>,>,>>,>,>>,>>,>>,>,>,,>>>,>>,>,>,>>>>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,,>,,>>,,>>,,>>,,>,,,>,>,,,>,,>,>,,>,,,>,>,,,>,>,>,,,,,,,,,,>,,,,,>,,,,>,,,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,,,,,,,,,',,,,,,,',,',,,,',,,,,,',',,,,,'',,',',,',,,',,'',',,',,,',,'',,','',',',',',',',',',',',''',,',',','',,'''',,'','''',,'',','','',',',',',''',''''',''','''''','',''','''','''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>>;>;;>>;>>;>>>>;;>>>;>>;>>;>;>>;>>;>>;>>>;>>>>;>>;>>;>>>>>;>>>>;>>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>>,>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>,>>,>>,>>,>>>>,,>>>,>>>,>,,,>>,>,>>,>,>,>,>,>,>,>,>,,>,,>,>,>,>,,>,,,>,,,>,,>,>,,,,>,,,>,,,>,,,>,,,,,>,,,,,,>,,>,,>,,,,,>,,,,,>,,,,,,,,,>,,>,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,',,,,,,,,',,',,,,,,,',,,,',',',,,,',',,,,',,,',,,',,,',,,,',,',',',,',',',,,',,',',',',',',',',',,''',''',',''',,,''',',',,'''',''','',''''''''''','''',''','''''',''''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;;>>>;>;>;>;>;;>>>;;>>;>>>>>>;>>>;>>;>>;>>>;>>>>;>>>>>>>;>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>,>>,>>>,>>>>>>>,>,>>,>,>,>,>>,>,>,>,>,>>>,>>>,>>,>>,>>,,>>>>,,>,>,>,>>>,>,>>,,>,>,>,>,>,>,>,>,>>,,>,>,>,>,>,>,>>,,>>,,>,>,>,>,>,>,,,>,,>,>,,,>,>,,,>,>,,,>,,>,,>,>,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,,,',,,,,,,,,',,',,,,,,,,,,,,,,',,',,,',',,',,'',,',',',',',',,',,',',',,'',',',',',',',',',',''',,,'',,',',','''',',''','',','',''','',',',',',''',',''''''','',''''',''','''',''''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>>;>;>>>;>>>;>>>;>>>>;>>;;>;>>>;>>>>>>>>>;>>;>>>>>>;>>;>>>>;>>>>>;>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>>>>>>>>>>>>>,>,>>,>>,>>,>>,>>>,,>,>>>,>>,>,>,>,>,>>>,>,>,>,>,>,>,>,>,,>>,,>,,>,,>,>,,,>,,,>,,>,,,>,,,,>,>,,>,,,,,>,,,,,>,,,,>,,,,,,,,,,,,>,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',',,,,,,',,',',',',',',,,,,,',,,',,',,,,',,,',',,',,',,',,',','',,',',',',',',',',',',,'''',,'',',','',',''',,''',''',',','',''''''''''',''''','','''''''','''''''',''''''',''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>;>>;>;>;>;>;>;>>;>;>>;>>>>;>;>>>;>;>;>;>>>>>;>;>>>>>>>>;>>>>>>>>>>>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>,>>>>>>,>>>>>>>>,>>,>,>>>,>,>,>,>,>,>,>>>>,>>,>>>,>>,>>,,>>>,>,>>>,>>>,>,>>,>,,>>>,>,>,>,>,>,>,>,>,,>,>,>,>,>,,>>,,>>,,>,,>,>,,>,,,,>,,,>,>,,>,>,>,,,>,,,,>,,,>,,,,>,,,,,,,,,,>,,,,>,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,',,,,,,,,,,,',',,,,,,,,,,,,,,,,',',',,',,,',,',',,',',,',,,',',',',',,,,',,',,,',',',',',',','',,',''',',','',',',',''',,'','''''',''',',',',',''',','''''','','','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>;>;>>;>;>;>;>;>>;>>;>>;>;>>>;>;>>>>>>>;>;>>>>>;>>;>;>>>>>>>;>>>;>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>,>>>>>>>>,>>>>>>>>,>>>>>>>>>>>>>>>,>,>>,>>>,>>>>>,>>>>,>>,>,,>>,,,>>,>,>,>>,,,>,>,>,>,>,>,>,,>,>,,>,,>,>,>,,,>,,,>,,>>,,,>,,>,>,,>,>,,,>,,,,,,,>,,,>,,,>,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,,',,',',',',',,,,,,,',,',,,',,,',,',,',',',,',,',,,''',',',''',',',',',',','','',',,,',''','','','',,'''','',,','',',''''''''',''''','','''''''''''',''''''''','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>>>;>>;>;>>>;>>>;>>>;>>;>;>>;>>>>>;>;>;>>>>>>;>>>>>>>>>>;>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>,>,>>>>>>,>,>,>,>,>,>,>>>,>>>,>,>,>,>,>,,>,>,>>>>>,>>>>,>,>,>,>,>>,>,>,>,>,>,>,>>,>,>>,>,>,,>,>,>,>,>,,>,,,>,,>,,>,,>,,,>,>,,,>,>,>,,,>,,,,,,,>,,,,,>,,,,>,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,,,,,',,',,,,',,',',,,,,,,,,,,,,',',',,,',,',,,',,,',,',,,',',,,',''',,,,',',,,,',',',',',',',,',','''''',',','','','''',,''','''','','',',',',''',',''''''',','','','''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;;>;>;>>;>;>;>;>>;;>>>;>>>;>>>;>;>>;>>>;>;>;>>>>;>;>>;>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>,>>>>>,>>>,>>>>>>>>>>>>>>>,>>,>,>>>>,>>>,>>>>>>,>,,>,>,>,,>,>,>>,>>,>,>,>,>,>,>,>,,>,,>,,,>,>,>,,>,,>,,>,>,>,>,>,,>,,,>,,>,,,,,>,,,,,,,>,,,>,,>,,,,,>,,,,,,,,,,,,,>,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',',,,,,,,,,,',,,,,,,,,',,',',',',,,,,',,',,',',',,',',',,'',,',',',,,,,'',',','',',',',',',',',',',',',,,',',',','',',',,'',','',','','',''''''''',''''','',''''','''''''''',''''''','''''',''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>>;>>;>>;>;>>>;>>>>;;>>;>>>;>>>>>>>>;>>>>>>>>;>>>>>;>>;>>>>>>>>>;>>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>,>>>>>>>>,>>>>,>>>>>,>>>,>,>,>,>,>,>,>>,>>>,>,>>>,>>,>,,,>,>>>>,>>,>>,>>>,>,>,>,>,>,>,>,>,>,>>,,>,>,>>,,>,>,>,>,,>,,,>,,>,,,>,,>,,,>,>,>,>,,,>,>,,,,>,,,,,,>,,>,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,,,,',,,',,',,,,,,,,,,,,,,',',,,',,',,,,,',,',,,',',,',,,',','',',,',,',,',',',',',',',''',','','',',',''',',''','',''','','','''',',',','''',','''''',''''''',''',',''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;;>>;;>;>>;>;;>>;>;>>>>;>;>;>;>;>;>;>>>;>;>;>>>>;>>>>>>>>>>>>>>>>>;>>;>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>,>>>>>,>>>,>>>>>>>>>>>>>>>,>>>,>>>>,>,>>,>>>>,>>,>,>>,>,>,>,,>,>>,>,>,>,>,>,>,>,>,,>>,>,>,>,>,>,>,,,>,,>>,,>,,>>,,,,>,>,,,,>,,,,>,,,>,>,,,>,,>,,,,,,,,,,,,,,>,,>,,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,',',',',',,,,',,,',,'',',,',,',',,,,',',',,,',,',',',',',',',',',',',',,','',','',',',',','',',','',','','','',','''''''',','''','',''','',','','''''','''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>;>;>>>;>;>>>>;>>>;>;>;>>>>;>>>;>>>>;>>>>>>>;>>>>>;>>;>>>>;>;>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>>>>,>>>>>>>>>,>,>,>,>,>,>>>>,>>,>,,>>>,>>,>,>>,>>,>,>,>>,>,>>,>,>,>>,>,>,>,>,>,>,>>,,,>,,,>,,>,>,,>>,>,>,,>,>,,,,>,>,,,>,>,,,>,>,,,>,,,,>,,,,,,,>,>,,>,>,,,,,,,,,,>,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,',,,,,,,,',,',,',,,,,,,,,,,,,,,,',,,',,,',,,,,',,',,','',',,',,'',',',,',',',',,',',',',',',',',',',',',''','',','',''',''',''','','',',',',','''',''''''''''''''''''''''''''','''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;;>;>>;>;>>;>;;>>;;>>;>>>;>;>>>;>>>>;>>>;>;>>>>;>>;>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>,>>>>,>>,>>>>>>>>>>>,>>>>,>>,>>,>>>>>>>>>>>>,>,>>,>>>>>>,>>>,>,>,>>,>>,>>,>,>,>>,>,>,>,>>,>,>,>,>,>,>,,>>,,>>,>,>,>,>,,,>,,,>,,>,>,>,,>,,>,,>,,>,,,,,>,,,>,,,>,>,>,,,,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,',,',,',',',',',,,',,,',,,',',,',,',,,,',,',,',,,,',',',',',,',',',',',',',','','',',',',','',''','',,'',,''',''''','''''''''''',''',','','','','','''''''''''''''''''''',''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>;>;>;>>;>>>;>>>;>>;>>>;>;>>>;>;>>;>>;>>;>>>>;>>>>;>;>>>>>>>>>>>;>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>,>>>>,>>>,>>>>>>>>>,>,>,>,>,>,>>>,>>,>,>,>>,>,>>>,>>,>,>>,>>,>,>>,>,>>>,>,,>,>,>,>,>,>,>,>,,>,,>,>,,,>,,>,,>,>,,>,,,>,,>,,>,,>,,>,,>,>,,,,>,,>,,,,,,,,>,,>,>,,,>,,,,>,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,,,,,,,',',,',,,,,,',,,,,,,,,,',,,',,',',,,',,,',,'',,,',,',',',',,',',,,',',',',',',',',',',',,',''',',',',',,'',''',''',',',',''',',',',',',''','''''''''','''''','',''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>>>;>;>>;;>>>;>>;>>;;>>>>>;>>>>>>>;>>>>>;>>>>>>;>>>>>>>>;>>>;>>>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>,>>>>>>>>>,>>,>,>>>>>>>>>>>>>>>>,>>>>,>>,>>>,>,>>,>>,>,>,>>,>,>,>>,,,>>>,>,>,>,>,>,>,>,>,>,>,,>,>>,>,>,>,,>,>,,>>,,>,,>,,>,,,,,>,,,,>,>,,,,,,,>,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,',,,,',,,,,,,',,,,',,,,,,',',',',,,',,,',,,',',,',,',,,',',',,',',,',',',',',',,',',',',',',',',''',',',','',''''','',',',',''''','','','''''''''','''',',',''''''','''''',','','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>;>;>;>>>;>;>>;>>;>>>;>;;>>>;;>;>>>;>;>>>>;>;>>>>;>>>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>,>>,>>,>>>>>>>>,>,>,>,>,>,>,>>>,,>>>,>>,>,>>,>,>,>>>,>>,>,>,>,>,>>>,,>,>,>,>,>,>,>,>,>,>,>>,>,,>,,>,,>,>,,>,>,,>,,,>,,,>,>>,,>,>,,,,,>,>,>,,,,,,,>,,>,,,,,,,,>,,,>,,,>,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,,,,',,,,,',,,,,,,',,,',,',,,,,,,,,',,,',,',,,,,',,',,'',',,,',,',,',',',,',',,'',',',',',',',',',',',',','',',',,',',',''','',',''','','',',',','''',','''''',','',''''',''''''''',''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>;>>>;>;;>;>>;>>;>>;>;>>>>>;>>>;>>;>>>>>>;>>>>>;>>>;>>>>>>;>>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>,>>,>>>,>>>>>>,>,>>,>>>>>>>>>>>>>,>,>>>,>,>>,>>>,>>,>>>,,>>,,>>>,>,>,>,>,>>,>,>,>,>,>,>,>,>,,>,,,>,,>,>,,>,>,,,>,,>,,>,>,,,>,,,,,>,,,,,>,>,,,,,,>,>,,>,,,,,,>,,>,,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,',',',',,,',,',,','',,',,',,,,,'',',',,',',,',',',',,,',',',',',',','',','',',',,'','','',''',','','',','','','''''''',','''''',''''''''''','''''''''''''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>>;;>>>>;>>;>>;>>;>>>>;>;>>>>>>>;>>>;>;>>>>>;>>>>;>>>>>;>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>>>>>,>,>,>,>,>,>>>>,>,>>>>,>>,>,>,>>,,>>>,>>>,,>,>>>,>,>,>>,>,>,>,>,>,>,>,,>,>,>,>,>,,>,>,,,>>,,>,,>,,,>,>,>,>,>,,>,>,,,,,>,>,>,,,,,,,,>,>,,,,,,,>,,,,,,,>,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,',,,,,',,,,,,,,,,',,',',',,,,,,,,,,',,',,',,,,,',,',,','',,,,',,',',,',',',','',',',',',',',',',','',','','','','','',,','','',''','',''',',',','''',',''''','','',''''''''','','''''',''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>;>>>;;;>>;>>;>>>;>>;>;>>>>;>;>;>>>;>>>>>>;>>>>;>>>>>;>>>>>;>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>,>>,>>>>>>>>>,>>,>>>>,>>>,>,>>>>>>>>>>>>>,>,>>>,>,>>>,>>>,>,>>>,,>>,>,>>,>,,>>,>,>,,>,>,>,>,>,>,>,>>,>,>,>,>,>>,,,>>,,,>,,>,>,>,,>,,,>,,,>,,,,,>,>,,,,,,,,>,,>,,,,,,>,,>,,,,,,,>,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',',,',',,,,,,,,,,',',',',',,,,,,',,',',,',,',',,,',',',',,,'',',',,,',,',',',',',',',',',',,',',',',',',',',''''','',''','',''',''''''''',''''','',''''''''','''',''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>;;>>>>>;>>;>>;;>>;>;>>;>;>>>>>>;>>>;>;>>>>;>>>>;>>;>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>,>>>>>,>,>,>,>,>,>>>>,>>,>>,>>>,,>>>,>,>>>,>,>,>,>>>,,>,>>,>>,>,>,>,>,>,>,,,>,,>,,>,>,,,>>,,,>>,>,>,,,>,,,,>,,,>,,,>,>,,,,,>,>,>,>,,,,,,>,,,,,>,,,,,,,,,,,,,>,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,',',,',,,,,,,,,,,,',',',,',,,',,,',,',',,',',,,',',,',,,''',,',',',',',',',',','''','','',',''',''',',,,'','',',''',',',',',','''',','''''''','',''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;;>>>;>;>;>;>>;>>>>;>>>;>>>>;>;>;>>>;>>>>>;>>>>;>>>>>>>>>;>>>>;>>;>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>>>,>>,>>>>>>,>,>>>>,>>>>,>,>>>>>>>>>>>>,>,>>,>>,>,>,>>,>,>,>>,>,>>>,>,>,>,>>>,>,>,,>,>,>,>,>,>,>>,>,>,>,>,,>>>,,,>,,,>,,,>>,,>>,>,,>,,>,>,,,,>,>,,,,,,,,,>,>,,,,>,,,,,>,,,>,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,',,,,',,,,,,',,',,,,,,,,',',',',',',,,,,,',,',',,',,',,,',',,',',',',','',,,',',',',',',',',',',',,,',',','',',','',','''',''','',','',''''''''',',''''','',','''''',''''''''','''',''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;;>;>;>;>>;>>;>;>;>>;>>;>;>>>;>>;>>;>;>>>>>;>>>>;>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>,>>>>>,>>>>>>>>>>,>,>,>,>,>,>>>,>>>,>>>>>,>>>,>>>,>,>>,,>,>>,>,>,>,>>,>>,>,>,>,>,>,>,,>,,>,,>,,>,,,,>,>,>,,>,>,,,>,,,,,>,>,,>,,>,>,,,,,>,>,,>,,,,,,>,,,,>,,,,,>,,,,,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,,,,,',,,,',,,,,,,,',,',,,,,,,,,,,,,,,',',,,',,,,',,',,'',,',',,,',,,',',,',',',',,',',',',',','','''','',',,','',',','',','',,'',''',''',',',',''''',','''''''''',',''',''',''''','''''''''''','',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>;>>>;>;>>;>>;>>>;>;>;>>>>;>>>>>;>>>>;>>;>>>>;>>;>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>,>>,>,>>>>>>>>>>>>,>>,>,>>>,>,>>,,>>,,>>>,>,>>>,>,>,>,>,>,,>>,>,>,>,>,>,>,>,>,>,>>,>,>,>>,>,,>,>,>,,>>,,,>,>,,,,>,,>,,,,,>,>,,,,>,,,,,>,,,,>,,,>,,,,,,>,,,,,,,,,,,>,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',',,',,,,,,',,',',',',',',,,',',,',',,',,',,,,',,,'',,',',,',',',',,',',',',',',',',,',,',','','',','''','',',',''',''','',','''''''',','''''','','',''''''''''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;;>;>;>;>;>>;>>;>;>>>>>;>;>>>;>;>>>;>;>>>>>>;>>>>>>>>>>>;>>>>;>>>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>,>>>>>,>>>>>,>>,>>>>>>>,>,>,>,>,>,>>,>>>,>,>>>,>>>>,>>>,,>>>,>,>,>,>>>,>>,>>,,>,>,>,>,>,>,>,>,,>,,>,>,>,,,,>,,>,,,,>,,,>,,>,,>,>,,>,,>,>,,,,,>,>,,,>,>,,,>,,,,,,,,>,,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,,,,,,,,,,,,,,',,,,',,,,',,,',,'',',',',,',',',',,',',,',',',',',',',','','',',',,','','',,',',''','',''',''','''',',',','''',',','''''''''',''','',''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>;>;>>>;>>;>>;>>;>;>>>>>;>>>>>;>>>>>;>;>>>>;>>>;>>>>>>>;>>>>>>>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>,>>>,>>>>,>,>>>>>>>>>>>>>,>>>,>>,>>,>>>,,>>,,>>>,>,>,>>,>>,,,>,>,>,>>,>,>,>,>,>,>,>,>>,>,,>,>,>>>,,>,>,>>,,>,>,>,,,>,,,>,,,,,,,,>,>,,,,,>,,,,,,,,,,>,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,',,,,,,,,,',',,,,',,',',',',',',',,,',,',',,',',,',,,',,,',,',,,',','',,,'',,',',',',',',',',',','','',',,'',''''',','',''',',',''',',''''''''',''''''','','',''','''''''''','','''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>>>;>;>>;>>;>>;>;>>;>;>>>;>;>>>;>;>>>>>>;>>>>;>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>,>>>>>>>>,>>>,>>>>>>>,>>>>>,>,>,>,>,>,>>>,>,>>>>,>>,,>>>,>>>,>>,>>>,>,>,>>>,>,>>,>,>,>,>,>,>,>,>,,,,>,,>,>,,,,,,>,>,,,,>,,>,,,,>,,>,>,,>,>,>,>,,,,>,>,,,,>,,>,>,,,,,,,,,,,>,,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,',,,,,',,,',',,,,,',,,,,,,,,,,,,,,,,,',,',,,,',,,,',,',',,'',,',,'',',,',,'',,',',,',',',',',',',','',','',''',',',,','',',','',''',','''',',',',''',',''''''''''''''''''''',''''''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;;;>>;>;>>;>>;>>;>>;>>>;>>>;>>;>>>>>>>>;>>>>;>>>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>,>>>>>>,>>>>,>>,>>>>>,>>>>>>>>>>>>>>,>>>>,>,>>,>>>>,>>,,>,>,>,>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>>,>,>>,>,>>>>,>,,>,>,>,>,,>,>,,>,,,,>,,>,,,,,,>,,,,,>,>,,,,,,,>,,>,,>,>,,,>,,>,,,>,,,,>,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,,,,,,,',,,,',',,',',',',',',,,',,'',,',',,',,',',,,',,',,,,',',',,',',','',',',',',',',',',,'',',',,'',''','',','',',''','''',',''''''''',''''','','',',','','',''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>>;>>>;>>;>>>;>>;>;>;>>;>>>;>>>;>;>;>>>>;>>>>;>>;>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>,>>>>>>>,>,>>,>,>,>,>,>,>,>>,>,>>>,>>>,>,>,>,>>>,>>>,>>,>>,>,>,>,>>,>,>,>,>,>,>,>,>,,>,>,,,,>,,,,,>,>,,,>,,,>,>,,>,,>,>,,,>,,>,>,,,,>,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,',,,,',,,',,,,',,,,,,,',,,,,,,,,,',,',,,,',,,',,,',,,',',',','',',',,'',,',,',,',',',',',',''',''',',','',',','','','','''','',','','',',',',''',',''','',''''''''''''',''','',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;;>;>;>>;>>;>>>;>>>>>>>>>;>>>;>>>>>>>;>>>>;>>>>>>>>>;>>>>>>;>>>>>>>;>>>;>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>>>>>>>>,>>,>>,>>,>,>>>,>>>,>,>,>,>>,>,>,>>,>,>,,>,>,>,>,>,>,>,>,>>,,>,>>,>,>>,>,,,>>,,>>,>,,>,,>,,>,,>,,>,,,,>,>,,,,,,>,>,,,,>,,>,>,,>,,,,,,,,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,',,,,',,',,,,',',',',,,',,',',,,',,,',,'',,',,',,,,',,',',,,',',','',',',',',',',,',',,','',',''',','','','',','','',','','''''','','''','''''''''','',''''''''''''''''''',''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>>;>>>;>>;>;>;>>;>;>;>;>>>;>>;>;>>;>>>;>>>>;>>;>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>>,>>,>>>,>,>>>>>>>>,>>>,>,>,>,>,>,>,>>>,>>,>>,>>>,>,>>,,>>>,>>,>,>,>,>>,>,>>,>>,>,>,>,>,>,>,>,,,>,>,,>,,>,,>,,>>,,,>,,,,>,,,>,,,,,>,,>,,>,>,,,,>,>,>,,,,,>,,,,,,,,,,,,,>,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,',,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,',,,',',',',,',,,',,',,'',,',',,''',',',',,',',',',',','','','',',',',',''',,',',',''',''','''','',','''',''','''','','',''''''',''''','''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;;>>;>;>>;>>>;>>;>>>>>;>>;>>;>>>>>>>>>>>>;>>>>>>;>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>,>>,>,>>>>,>>>>>>>>>>>>>>>,>>>,>>,>>,>>,>,>>>,,>>,>>,>>>,>,,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,,>,>,>,>,>,>,,>>,>,,>,,>,,,,,,>,,,,,,,,>,,,,>,,>,,>,,>,,,,>,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,',,',',,',',,,,',',',',,,,',,',',,,',,,',,'',',',',,',',,',',,,',',,',',',',',',',',',',',',','',''',,''',''','',',',''','',''''',',''',''',''''''''''',',''''','''','',''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>;>;>>;>>;>>>;>>;>;>>>;>>>>>;>;>;>>;>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>,>>>>>>>>>>>>,>>>>,>,>,>,>,>,>,>>,>>>,>>,>>,>>>,>,>>>,>>,>>,,>,>>>>,>,>>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,,>,>,,,>,,,,,>,,,>,,>,>,>,,,>,>,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,',,,,,,',',,',,,,',,,',,',,,,',,',,',,,'',',',',',,',',',',',',',',',',',','',',',',''','',','',''''',','','',',''''',''','''',','','',''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;;>>>>;>>;>;>;>>;>>>>;>>>;>;>>>>>>;>>>>>>;>>;>>>>>>;>>;>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>,>>,>>,>>>>>,>>>>>>>>>>>>>>,>,>,>>,>>,>>>,>,>>,>,>,>,>,>>>>,,>,>>,>,>,,>,>,>,>,>,>,>,>,>,,,>,,>,>,>,>,>,,>,,>,,>,,>,>,>,,>,,>,,,,,,,>,,,,,,,>,,,,,>,,>,,>,,,>,,,,,>,,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,',,,',,,,',',,',',,',,,,,,,',',,,,',,',',,,',',,','',,',,',,'',,,',',',,,'',',',',',',',',',',''',','',',',',','','',','',','''','',''''',',''',''','''''''''''''','''''''''',''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>;;>>;>>>>;>>;>>;>;>>>;>>>>;>;>>>>>>;>>>>>>>>;>>;>>>>>>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>>>>>>>>>>>>>>>>>,>,>>,>,>,>,>,>,>,>>>>>,>>>,>>,>,>>,>>,>>>,>>>,>,,>>,>,>,>,>>,>,>,>,>,>,>,>,,>,,>>,>,>,>,,>,,,>,,>,,>,>,,,>,,,,>,,>,,>,>,>,,,>,>,>,,,,>,,,,,,,>,,,>,,,>,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,',,,,,,,,,,',,,,,,,,,,,,,',',,',,,,',,,,',,,',',,,,',,,,,',,',',,,,'',',,','',,',',',',',',',',','',,',',','',''','',',','','','',','','',',''''',''',''','',',',','',''','''','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;;>>>;>>;>;>>;>>;>>>>>;>>;>;>>>>>;>;>>>;>;>>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>,>>>,>>>>,>>,>,>>,>>>>>>>>>>>>>>>>>>>>,>,>,>>,>>,>>>,>,>,>>,,>>,>,>,>>,,>>,>>,>,>,>,>,>,>,>,>,>,>,>,,,>,>,,>,>,,>,>,>,>,,,>,>,,>,>,,>,,,,,,,,,,>,,,,,,>,>,,,,>,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,',',,,,,',,,',,,',',,',',,,',',,'',',',',,,'',',,',',,',',',,',',',',',',',',','',','',',',',','',''','',''',''',''','''',',''',''',''''''''''''''''''''''',''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>;>;>>;>>;>;>>;>>;>;>>;>>>>>;>;>>>>>;>>>>>>>>>>>;>>>>;>>>>>>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>,>>,>,>,>,>,>,>,>,>>>,>>,>>,>>,>>,>>>,>,>>,>,>,>,>,>>,>,>,>>,>,>,>,>,>,>,>,>,>,>>>,>,>,>,,>,>,,>,,,>,>,,,>,,,,>,,>,>,>,>,>,,,>,>,,,,,,,,>,,,,,>,,>,,,,,,,,,>,,,>,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,',,,,,',,',',,,,',,,,,',',,',,,',,,,,',,,,',,',,',,,',,',,'',,,',',,,'',',,,',',',',',',',','',','','',',','','','',','','',,'','',',''',''''',''','''','''','','','''''','''''',''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>>;>>;>>>>;>>;>>>>;>>>;>;>>>>>;>>>>;>>>;>;>;>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>,>>>,>,>>,>,>>>>>>>>>>>>>>>>>>>>>,>>,>>>,>>>,>>,>,>>,>>,>>>,>>,>,>,>,>,>,,>,>,>,>,>,>,>,>,,,>,,,,,>,,>,>,,,>,,>,>,>,,>,,>,>,,>,,,>,,,,,,,>,,,,>,>,,>,,,,,>,,,,,,,>,,,,>,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,',,,,,,,,,,,,,,,,',,,,,,',,,,,,,,',,,',',,',',,',,',,,',,',,',,,'',,',''',,,','',',',',',',',',',,'',',',','',',''',','',','','''',','''',,''',',''',''','''','''''''''''',''''''''''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>>;>>;;>>>;>>;>>>>;>>>>>;>;>>>>;>>>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>,>,>,>,>,>,>,>,>>>,>>,>,>>,>>,>>>,>,>,>>,>,>,>,>>,>>,>>>>,>,>,>,>,>,>,>,>,>,>,>>>,>,>,,>,>,>,>,,>,,>,,>,,,>,,,>,,,>,>,>,,,>,,,,,,,,,>,,>,,,>,,,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,',,,,,,',,',,,',',',,,',,,,,',,,',,',,,',',',',',',,,,',',,,,'',',,',',',',',',',','',',','',',','',',','',','','',','''',',''',''''',''','''','''',','',''','''''','','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>>;>>;>>>;;>>;>>;>;>>>;>;>>>>>>;>>>;>>>>;>>>>;>>>>;>>>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>,>>>>,>>>>>>>>>,>>,>>>>>>>>>>>>>>>>>>>,>,>>>,>>>,>>,>>,>,>>>>,>,>>>,>,>,>,>,>,,,,>,>,>,>,>,>,>,>,>,>,>,,,>,>,>,,>,>,,>,>,,>,>,,,>,,,>,>,>,,,,,,,>,,,>,>,>,,,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,',,',,,,,,,,,,,',',,,,,,,',,,,,,,',,,',',,,',,',,,',,,,',,,',,','',,',','',,,',',,',',',',',',',',',',',,','',',',''','','','','''',',''','''',',''',''','''','''''''','''''',''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>;>>;>;>>>;>>;>>>>;>>;>>>;>;>>>>>>>>;>>>>;>>>>;>>>>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>,>>>,>>>,>,>>>>>>,>,>>,>,>,>,>,>,>>>>,>,>>,>>>,>>,>,>,>,,>>>,>,>,>>>,>,>,>>>>,>,>,>,>,>,>,>,>,>,,>,>,>,,>,>,,,,>,,>,,>,,,,>>,,>>,,,,,>,>,>,>,,,>,,,,,,>,>,,>,,>,,,,>,,,,,,,>,,,,,,>,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,,,,,,',,',,,,',',',,',,,,',',,',,',',',',,'',,',,,,,',',',,,'',',',',',',',',',',','',','''',,',''',',',',',',''',',''',',''',''''',''',''',''''','','''''''''''''''''''''',''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>>;>>;>>;>>;>>>;>>>;>>>;>>>>>>;>>;>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>,>>>>>>>>,>>>>>,>>,>>>>>,>>>>>>>>>>>>,>,>>>>>,>>,>>,>>,>>,>>>,>,>,>>>,,,>,>>>,,>,>,>,>,>,>,>,>,>,,>,>,,>,>,>,,>,>>,>,>,,>,>,>,,,>,,,,>,>,,,,,,,,,>,,,>,>,,,,,,,,,,,>,,,,>,,,>,,,,,,>,,,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,',,',,,',,,',,,,,,,,',,,,,,',,,',,,,,',,,',,,',,,',,',',','',,',,','',,',',',',',',',',',',','',',,',''',','',','''','',','',','''',','',',''',''','''','''''''',''',''','','''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>>;>>;>>>;>>;>>;>>>;>>>;>;>>>>;>>>;>>>>>>>>;>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>,>,>,>,>>>>>,>,>,>>,>>,>>,>>,>>,,>>,>>>,,>>>,>>,,>>,>,>,>,>,>,>,>,>,,>,>,>,>,,>,>,>,,,,,>,,>,>,,,>,,,,>,>,,>,>,>,>,>,,,>,,,,,,>,,>,>,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,,',',,',,',',,,,',,',',',,',',,',,'',,',,,',',,,',',',',,',',,,',',',',',',',',',',''',',',','','''',,'','','',''',','','','''',''','''','''','',''''','''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>>;>>>;>>;>>;>>;>>>;>>>;>>>>;>>>>>>>>>>;>>;>>>>>>>>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>,>>,>>>>>,>,>>,>,>>>,>>>>>>>>>>>>>,>,>>,>>>,>>,>>>,>,>>,>>>,>>,>,>>,>,>,,>>,>>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,,>,>>,,>,,>,>,,>,>,>,,,>,,,,,,,,,,,>,,,>,>,,,,,,,,>,,>,,,,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,,,,',,,,',,',,,,,,,,,,,,,,',,,',,,,,',,,',,,,',,',,,',,',',,,',',,',,','',,','',',',',',',',','','',,,'',','',',',,''','','',''','''',''''''',''',''',''''','''''','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>;>>;;>>;>;>>>>>>;>>>;>>;>;>>>;>;>>;>;>>>>>>>>>;>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>>,>>>>>>>>>>>>>>>,>,>,>,>,>,>>>>,>>,>>>,>>,>>,>>,>,>,>>,>,>,>,>,>>>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,>,,>,>,>,,>,,>,,,>,,,,>,,>,,>,>,>,>,>,>,,,>,,,,>,,>,,,,,,,,,,,,,,,,,,>,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,',,,,,,',',,,',',',,,,',,,',',,',,',',,',,,',,',',,',',',',',',',,,',',,',',',',',',',',',','''',',','','','',,'','','','',','',',',',''',''','','','''',''''',''''''','','''','''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";;>>;>>>>;>>>;>;>;>>;>>>;>>>>>>>>>>;>>>>>>;>>;>>>>>;>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>,>>>>>>>>>>>>,>>,>>>,>>,>>>>>>>>>>>>,>,>>>>,>,>>,>>,>>,>>,>>,>,>>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>>,>,>,,>,>>,,,,>,,>,>,>,>,>,>,,>,,>,,,,,,,,,,,,,>,,,,>,,,,,>,,>,,>,,>,,>,,>,,,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,,,,,,,,,,,,',,,,,',,,,,,,',',,,',,,,,,,',,,,',,,',',',,',',,,',,,',',,','',,',',',',',',',',',',',',,,','',','','','',',','','',','',''''''''',''','''''''''','''','''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>;>;>>;>>>>;>>;>>;>>>;>;>>;>>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>,>>>>>>>>,>>>>>,>,>,>,>,>>>>>>,>,>>>>,>>,>>,>,>>,>,>>,>,>,>>>,>,>,>,>>,>>,>,>,>,>,>,>,>,,,>,,>>,>,,,>>>,,>,,>,,>,,,>,,>,,>,,>,>>,>,>,>,>,,,>,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,',,,,',,,,',,,,,',,',,,,,',,,',','',,',',,',',,,,',,',,'',,'',',,',',,,',',',',',',',',','','',''',',','',',','',''',''''','''','',',',',''',''','',','','''',''''''''',''''''''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>>>>;>;;>>>>>>>;>>;>>>>;>>>;>>;>>>;>;>>>>>>>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>,>>,>>>>,>>>>>>>>>>>>,>,>,>>>,>,>>,>>>,>>,>,>>>,>,>>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,,>>,>,>,,,,>>,,,,,>,>,,>,,>>,,>,,,>,,>,,,,,,,,,,,,,>,,,>,,,>,,>,,,,,>,,,>,,,,,,>,,,,,>,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,,',,,,,',,,,',,,,,',,,,,,,',',,,',,,,,,,',,',,',,,,',',',,',,,',,,,,'',','',',,',',',',',',',',',',',',','',','','','',,'',',','',','',''''''',''',''',''''''''',''','''''''''','',''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>;;>>;>>>;>;>;>>>;>>>;>>>>;>>>>>;>>>>>>;>>>>;>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>,>>,>>>>>>>>>>>>,>>>>>>>,>>>,>,>,>,>,>>>>>>,>,>>>,>>>,>,>,>>>,>,>>>,>>,>,>,>>>,>,>>,>,>,>,>,>,>,>,>,>,,>,>,>>>,,>,>,>,>,,>,,>,,,>,,>,,,>,,>,>,>,>,>,>,,,>,,,,,,,,,,>,,,,,,>,,,>,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,,',,,',,,,,',',,,,,,',,,',',',,,',,',,',',',,,',',',,',''',,',,,,',',',',',',',',',',','',',','',,'','',',',''','',''','''','',',',''',''',''''',','',''''''','',''','''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>>>;>>>>;>>>>>>;>>>;>>>;>>>>;>>>>>;>>>>>;>>>>>>>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>,>>>>>>,>,>>>>,>>>>>>>>>>,>,>,>>,>>,>>,>,>>>>>,,>>,>,,>>,>>,>,>,>,>,>,,>,>,,>,>,>,>,>,>,>,>,,>,,,>,>,>,>,,,>,,>>,,>,,,,>,>,,,>,,,,,,,,,,,,>,,,>,>,,>,,,,>,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,,,,',',,,,,,',',,,,',,,,',,',,',,',,',,,'',,',,',',',,,,','',',',',',',',',',',',',',,''',',,'','','',''',',',''','',','','''''',''',''',',''''''''''',''''''','''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>>;>;;>>>;>;>>>;>>>;>>>>;>>>;>;>>>>;>>>>>;>>>;>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>>>>>>,>>>,>>,>>>>>>>>>>,>,>,>,>>>>>>,>>>,>>,>>>,>,,>,>>,>>>>>,>,>,>>,>,>,>>,>>,>,>>,>,>,>,>,,>,>,>,>,>,>,,>,,,,>>,,>,,,>,,>,>,,,>,>,,>,>,>,>,>,>,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,>,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,,',,,,',,,',,',,,,,,',,',,,,',',,',,,,',,',,',,',,',',,',,',,,',,''',',,',',',,',,',',',',',','','',,',''',',',','',,'',''',',',''',''',','''',''','''''','',','',''','''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>>;>>>>>;>>>>>;>>>;>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>,>,>>,>>>>>>>>>,>,>>>>,>>,>>>,>>>>,>>,>>,,>,>>,>>,>,>,>,>,>,>,>,>,,>,>,>,>,>>,,,>,>,>,>,>,>,>>,,>,>,>,>,>,>,,,>,,>,,>,,,,,,,,,,,,>,,,,>,>,,,,,>,>,,>,,>,,>,,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,,,',,,,,,,,,,,,,,',,,,,,',',,,,,,,',',,',,',,,,,',,',,,',','',,',,,,,',',',,',','',',',',',',',',','',',,'','','',''','',','''''','',',''',',''',''',','''''''''''''''''''''','''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>>;>;>>>;>;>>>;>>;>>>>;>>;>;>>>>>;>>>;>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>,>>,>>>,>>,>>,>>>>>>>>,>,>,>,>>>>>,>,>,>>>,>,>,>,>>,>>,>>,>,>>,>,>>,>>>,>,>>>,>,>>,>,>,>,>,,>,>,>,,>,,>,>,,>,,>,,,>,,>,,>,,>,,>,,,>,,>,>,>,>,>,>,,>,,,,,,,>,>,,,,,,,,,,,,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,',,',,',,,,',,',,,,',',',,,,,',,',,',',,,',,'',,',,,,',',''',',',,',',',,',',',',',',','',','''',,'','','',,'',','',',','','''',''''',''','''''','',''','','''','','''''''''','''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>>;>;>>;>>;>>;>>;>>>;>>>>>>>>>>;>>>;>>>;>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>,>,>>>>>>>>>,>,>>>>>>,>,>>>,>>>,>,>,>,>>,>,>,>,>,>,,>>,>,,,>,>,,>,>,>,>,>>,>,,>,>,>,,>,>,,>,,>>,,>,,>,,,,,>,,,>,,>,,,,,,,,,,,,,,,>,,,>,,,,,,,,>,,>,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,,',,,,',,,,,,',,,',,,,',,,,,,,',',,',,,',,',',,',,,',,,'',,',',,,',,',',',','',',',',',',',','',',,,'',','',','',',''','',''','',',''',',''',''','','''''','''''',''''''''','',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;;>>>>;>>>>>;>>;>>>;>>>;>;>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>,>>>>,>>>>>>,>>>>>>>>>>,>,>,>,>>>>,>,>,>>>,>>>>,>>,>>>,>>,>>>,>>,>,>>>,,>>,>>>,>,>,>,>,>,>,,>,>,>,,>,>>,>,,>,,>,,,>,>,,>,>,>,,>,>,,,,>,>,>,>,>,>,>,,,,>,,,,>,,>,,,,,,,>,,,,,>,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,,,,,,,',,,,,',,,,,,,,,',,,',',',,,,,',,',,,',,,,',',',,'',,',,',,'',',',',,',',,',',',',','','',,',''',','',','',''',','',''','','''','''''',''',''''''',','''',''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>;>;>>;>;>>>;>>>;>>>;>>>>>>>;>>;>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>,>>>>,>>>,>>>>,>,>>>,>>>>>>>>>,>,>>>,>>,>>,>,>>,>>,,>>,>>,,>>,>>,>,,>>,>,>>,,>,>,>,>,>,>,>,,>,>,>,,>,,>,>,,>,,>,>,,>,>,,,>,,>,,,>,>,,,,,,,,,,,,,,,>,,,,>,,,,,,,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,',,,,,,,,',,,,',',,',,',,,,,,,,',',,,,',',,',',,',,',',,,',',,',,,',',',',,','',',',',',',',','',',','',',''','',,'',',''','','',','',',',''',''','','''''',''',''',''''','''''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>>;>>>>>>;>>>;>>>;>>>>>;>;>>>;>>>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>,>>>>>,>>,>,>,>,>>>>>,>>>,>>,>>>,>>,>,>>,>>,>>>,>,,>>>>,>,>,>,>>,>,>,>,>,>,>,>>,>,>,>>,>,>,,>,>,>,>,>,,>,,>,>,>,,>,,>,,>,>,>,>,>,>,>,,,>,,,,,>,,>,,,,,>,,,>,,,,,>,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,,,,,,,',,,',,,,,',,,,,,,',,',',',',,,',',',,,',,,',,',',,',',,,',','',,',,','',',,',',',',',',',','',',',','',',',','',''',',',''',''',''''''',''',''',''','''''''''''''''''''',','''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>>;>;>;>>>;>>>;>>>>;>>>>>>>>>>>;>>>>>>;>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>,>>>>>>>>,>>>,>>>>>,>>>>>,>>>>>>>>>>>,>,>>,>,>>,>>>,>>,>,>>>,>,>>,,>>,>>,,,,>,>>,>,>,>,>,>,>,>,>,>,,,>,,>,,,,>,>,>,,>,,,,>,>,,>,,,,,>,,>,,,>,,,,,,,,,,,,,>,,,,,>,,,,,,,>,,,,,,,,,>,,,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,,,,,,,,,,',,,,,',,,,,',',,,,,,,,,,,,',,,',,,,',,',',,',,,',,',',',,',,',',',,',,,'',',',',',',','',','',',',','',',''','',,''''',',''','''',',''',''',''''''','',','','''''',''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>;>>;>>>;>;>>>;>>;>;>>;>>;>>;>>;>>>>;>>>>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>>,>>>>,>,>,>,>,>>>>,>>>,>>,>,>>,>>>>,,>>>,>,>>,>>,>>>>>>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>>>,>,,,>,,>,>>,,,>,>,>,>,,,>,,>,>,,>,>,>,>,>,>,,,>,>,,,>,>,,,,,>,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,',,',,,,,',',,,',,,,,,,',',',',',,,',,,',',,',,,,',',',,',,,',',',',',',,',',',,',',',',',',',','',,',',''',',''',,'',''',','''',','',','''',''',''',',','''''''''''',',''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>>>;>>>>>;>>;>>>>>>>>>>;>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>>>,>>>>,>,>>>>>,>>>>>>>>>>>>,>>>,>>,>>,>>,>>,,>>>,>,>>>,>>,,>,>,,>,>,>,,>,>,>,>,>,>,>,>,>,>,,>,,,,>,>>,,>,>,,>,>,,>,,,,>,>,,,>,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,>,,,,,,,,,,>,,>,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,',,,',',,,',,',',,',,',',',',,,',',,',,'',',','',',',',',',','',','''',',,','',,''',',','',',','','',''',',''',''',''''''','','',',''''''','''','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>>;>>>;>;>>;>>>;>>;>>;>>>>>;>>>>>>>>>;>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>,>>,>>>,>>>>>>,>,>>>,>,>,>,>,>>>,>,>>>>,>>,>>,>>>,,>>,>,,>>,>>,>,>>,>,>,>>>,>,>,>,>,>,>,>,>,,>,>,>>,,>,,,>,>,,,>,,>,,>,>,,,,>,>,,>,,,>,>,>,>,>,,,,,>,,,>,>,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,,,,,',,,',,',,',',,,,,,,',',',',,,,',,',,',,,',,,',,,',,,',',,'',',',',',,',',,',',',',',',','',',',',,','''','''',',''',',''','','','',''''',''',''','''''''''''''''''''''''''''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;;>>>;>>>>;>>>;>>>>>;>>>>;>>>>;>>>>;>>>>>>>>;>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>>>>,>>>>,>,>>,>>,>>,,>>>>,>>>>,>>,>>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,,,>,>,,>,>,,,,>,>,,>,,>,,>,,,,,,,,,,>,>,,,>,,,,,,,,,,>,>,,,,>,,,,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,,,,,',,',',,,,,,,,',',,',,',,',',,',,',',',',,,',,,,,',,',',',,',',',',',',',',',,',',','',',,',',',,''',,'','','','','','',',''',''','''',','','',''','''','''''''','''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>;>>>;>>>>;>>>;>;>>>>>;>>;>>>>>;>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>,>>,>>>,>>>>>,>,>,>,>,>>>,>,>>>,>>>,>>>>>,>,,>>,,>>,>,>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,,>>,,,>,>,,>,>>,,,>,,,>,,>,,,>,>,>,>,,,,,,,,,,>,,,>,,>,,,,,,,,,,>,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,',,,,,,,,,',',',,',,,,',,,,',',',,,,,,,,,',,',,,,',,',',',,','',',',','',,',,',',',,',',',',',','',''',','','',''',''',''',''','',''''',''''''',''',''',''''''''',''',''','''','',''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>;>>;>>;>;>>>;>>>>;>>;>>>>>;>;>>>>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>,>>>>>,>>,>,>>>>>>>>>>>>,>>,>>>>>>>>>>>,>>>>,>,>>,>>>,>,>,>>>,>>,>,>>>,>,>,>>,>>,,>,>,>,>,>,>,>,>,>,,,>,>>,>,>,>,>,,,>>,>,,>,>,,,,>,,,>,,>,,,>,,,,,,,,>,>,>,,>,,,>,,,>,,,,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,,,,,,,,',,,,,',,,,,,,,',',',',,',,',',,',,,,,',',,,,,,',',',,',',',',',',',',',',',',',',','',',','',,'',,',','',,'',''',','',',',''',''',''','','',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>;>>>;>>>>;>>>;>>>>>>>>>;>>>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>>>>>>>,>>,>,>>,>>>>>>,>,>,>,>,>>>,>,>>>>,>>,>,>>,>>,>>,>>,>>,,>,>>>,,>,>,>>>,>,>,>,>,>,>,>,>,>,>,,,,>,,,>,,>>,,,,,>,>,,>,>,,>,>,,,,>,,>,>,>,>,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,,,,',,,',,',,,,',,,,',',',',,,,,,,,',,',,,',,,','',,,','',',',,',',',',',,,',',',',',',',',',',',',','',,''','''',','''','','','',''','',''',''','''''''''','','''''',''''''','''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>;>>>;>;>>>;>>>>;>;>;>>>>>;>>;>>>>>>;>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>,>,>>>>>>>>>>>>,>>>>,>,>>,>>>>,>>,>,>,>,>>,>>>,>,,>>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>>,>,>>,,>,,,,>>,>,,,>,,>,,>,,,>,>,>,,,,,,,,,>,>,>,>,>,>,,>,>,,>,>,,,,,,>,,>,,,>,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,',,,,',,,,,,,,,,,,,,,,,,',,,,,,,,,',',',',,,,,',,',',,',,,',',,,',,',',,',,',',''',',',',',',',',',',',',',',''',','',,'',',',''',','',''',''''',''',''',','',',''','',','''','',''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>>;>>>>>;>>>;>>>>>>>>;>>;>>>>>>>>;>>>>;>>>>>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>>,>>,>>>>>>>>,>,>,>,>,>,>>,>,>>>,>>,>,>>,>>,>,>>>,>,>,>,>>>,,>,>>,>,>,>,>,>,>,>,>,>,,>,,>,,>,>,,>,>,>>,>,,>,>,>,,,,>,,>,,>,,,,>,>,>,>,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,,',',,',,',',,,,',',',,,,,,,,,','',,,',,,,',,'',',,',,',,,',',',',,',,,,',',',',',',','',',','','',,'','',''',''',',','''','',','','''',''','''''''''''''''''''''''''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>>>;>;>>>;>>>;>>;>>>>>>>>;>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>>>>>>>>>,>>>>>,>,>>,>>>>>>>>>>>>>>>>,>>,>>,>>>>,>>,>>>>,>,>>>,>,>,>,>>,>,>>,>,>,>,>,>,>,>,>,>,,>,>,>,,>,>,,>,,,>,,>,,>,,>,>,,>,,>,,>,>,,,,,,,,,>,>,>,,>,,,>,,>,,>,,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,',,,',,,,,,,,,,,,,,,,,,,,,,',,,,,,',',',',,,,,',',,',',,',,,,,',',',',',',',',',,'',',',',',',',',','',''',',','',',',',',',',''''',','','','''',',''',''',',','',',''','''',''''','',''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>;>>>>>;>;>>;>>>>>;>;>;>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>,>>,>>>>>>,>>>,>>>>>>>>>,>,>,>,>,>,>,>,>>,>>,>>,>,>>,>,>,,>,>>,,>>>,>,>,>,>>,,>,>,>,>,>,>,>,>,>,>>,>,,>,>,>,>,,>,>,,>,,>,,>,,,>,,,>,,>,,,>,>,>,,>,,,,,,,,,,,>,,,,,,,,>,,,,,,,>,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,,',,,',',,',,',,,,',',',,,,,,,,',',,,,',,',,',,'',',',,,',,,',',,,','',,',',',',',',',',',,'',,',',',','''','','','',','''',''','',','''',''',''''''''''''',''',''''','''''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";;>>;>>;>;>>>>>>>>>;>>>>>>>>;>>>>>>>;>>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>,>>>,>,>>>>>>>>>>>>>>>>>,>>,>>>,>>>,>>>,>>>>>,>>>,,>>,>,>,>,,>>>>,>,>,>,>,>,>,>,>,,>,>,>,>,,>,>,,>,,>,,>,>,,>,,>,>,,>,,,>,,,,,,>,,>,>,>,>,>,,,>,,>,>,,,,,,,>,,,,,,>,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,,,,,,,,',,,,,,,,',',',',,,',',,',,',,',,,',,,'',,'',,','',,',,,',',',',',',',',','',,'',',','',',,'','',',',','',,''','',''''',''',''','',''','','''''''''''''''''','','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>>>;>>;>;>;>;>>>>;>>>;>>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>>>,>>>>>,>,>,>,>,>,>,>>>>,>>,>>,>,>>,>,>,>,,>>,>>>>,>,>>>,>>>,,,>,>,>,>,>,>,>,>,,>,>,>,>,,>,>,>,,>,>,>,,,>>,,>,,,>,,,>,>,,>,>,,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,',,,,,',,',',',,,,,',',',,,,,,,,,',,,',,,',,,',,'',,'',,,',,,',',,'',,'',',',',',',',',','','','',''',,'','',','','''''',''',','''',',''',''',''',''','''''','','''','''','''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>;>>>>;>>>>>>>>;>>>;>>>>;>>>>>;>>>;>>>>>;>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>,>>,>>>>>>>>>>,>>,>>>>>>,>>>>>>>>>>>>>>,>,>>>,>>,>>>,>>,>>,>>,>,>,,>,>,>,,>,>,,>>>,>,>,>,>,>,>,>,>>,,>,,>,>>,>,,>,>,,,>,>>,,,,>,,>,,>,>,,,>,,,,>,>,>,>,>,>,,>,,,>,>,,>,>,,,,,,,>,,,,,,,,>,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,,,',,,,,,,,,,,,,,,,,',,',,,,,,',',',',,',',,,',,,',,',,,',,,'',,',',',,',,'',,,,',',',',',',',',,',',',',','','','',',',',,','',','',',','''',''',''',''''''''',''''''','''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>;>>>>;>;>;>>>>;>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>>>>>,>,>>,>>>>>>>,>>,>>>,>,>,>,>,>,>>>>,>,>>,>>,>>>,>>,>>,>>>,>>>,>>,>>,>>,>>,,>,>,>,>,>,>,>,>,,>,>,>,>,,,,>,,>,,>,>,,,,>>,,>,,,>,,,>,>,,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',',,',,,,,,,,,,',',,,,,,,,,,',,,',',',',,',',',,',,,',',,',',',',,','',',',',',',',',''',',','',',',','',''','''','''','',''','',',''',''',''','','',''','',''''''''''','',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>>>;>;>>>>>>>;>>>>>>;>>;>>;>>>>>>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>>>>>>>>>,>,>>>>,>>>,>,>,>,>,>>,,>>,>,>,>>,>,>,>,>>>>,>,>,>,>,>,>,>,>,>,>,,>,>>>,>,,>,>,,,>>,,,>,>,>,,,>,,>,,,,>,>,>,>,>,>,>,,>,,,,,>,,>,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,',',,',',,,,,,',',',',,,',',,,',,,',,',,',',',',,',',,',',',',',,',',',',',',',',,','',',,',',''','',,',',,'',','','''',''''''',''','',''','''''','''''''',''',''''''''''''',''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>;>;>>>>;>;>>;>>>;>>>>>>>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>,>>>>>>>,>>,>>,>,>,>,>,>,>,>>>>,>,>>,>>>>,>>>,>>,>>>,>>,>>,,>,>,>,>,,>,,>,>,>,>,>,>,>,,>,,,>,>,>,,,,>,>,,,>>,,,>>,,,,,>,>,,>,,>,>,,,,,,,,,,,,,,,,,>,,,,,,,,,>,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,,,,,,,,,,,,',,,,,,,,,,,,',',',,,,,,,,',,,,,',,,',,',,,',,,',,,',,',',',,',,',,'',',',',',',',','','',','''','',,'','''',''',''',''',','',',',''','''''','''','',''','''''''''''','''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>>>;>;>>>>>>>>>>>;>>;>>;>>>>>;>>;>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>,>>>>>>>>>,>>>>>>,>,>>>>>>,>>>>>>>>,>>>>>>,>,>>>,>>,>,>>>,>>,>>,>,>,>>,>>>,>>,>>,>>,>>,>,>,>,>,>,>,>>,>>>,,>,,>>,>,,,>>,,,>>,,,>,>,>,,,>,,,>,,,>,,>,>,>,>,>,>,,,,,>,,>,>,,,,,,,>,,,,,,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,',,,,,,',,,,',,',,',',,,,,,,,',',',',,,',',,,',,',,',',',',',',',,',',',',',',,,',',',',',',',',',',',',,',','',',',','',','','',',''',','''',''',',',''''''''''''''','''','''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>;>>>>>;>;>;>>;>>>>>>>;>>>>;>>>>>>>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>,>,>>>>,>,>,>>>>,>,>>,>>,>>,>>,>>,>,>,>,>,>>,>>,>,,,>>,>,>,>,>,,>,>,>,>,>,>,>,,,>,,,>,>,>,,>,>>,,,>>,,,>,,,,>,,>,,>,>,,>,,,>,,,,,,,,,,,,>,>,,,,,,,,,,,>,,,,,,,,>,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,',,',,,',,,,,,,,,,,,',,',,,,,,,,,,',',,',',',,',,,',,',',,',,,',',',',',','',',',',',',',','','','','',',','',''',','','','','''',''''','''',''''''','',','','',''''','''',''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>>>;>;>>>>>>>>>;>;>;>>>>;>>>>>>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>,>>>>,>>>,>>>>>>>,>>>>>>>>,>>,>>>>,>>,>>,>>,>>,>>>,>>,>,>>,>>>>>,,>,>,>,>,>>,>,>,>,>,>,>,>,>,,>>,>,,>,>,,,,>>,,,>,>,>,>,,>,,>,,,,>,,,,,,>,>,>,>,>,,,,,,,,>,,>,,>,,,>,,,,>,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',',',,',,,',,',',',',',,,,,',,,,,',,',',,',,,',,',',,,',,,',',,,',',',',',',',',,',',',',',',',','',,'',','','','',',',',','',',''',',','''''''''''''',''''''''''','''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>;>>>>;>;>>;>>>>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>,>>>,>>,>>>>,>,>,>>>>>>,>,>>,>>,>>,>>,>>,,>>,>>>,>,>,,,>,>>>,>>>,>>,>,>,>,>,>,>,>,>,>,>,,>,>,>,,>>,,,,>,,>,>,,,>,,,>,,>,>,,>,>,,,,,,,,,,,,>,,>,,>,,,,,,,,,,,,,,>,,,,,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,',,,,,,,,,,,',,',,,,,,,,,,','',,',',,',,,,',,',',,',',,'',',',',,'',',',',',',',','',',',','','',''',''','','','','''',''''',''''''',''''''',','',','',''''',''''''',''',''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>>;>;>>>>;>>>>;>>>;>>>>>>>>;>>>>>;>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>,>>>,>>>>>>>>>>>,>>>>>>,>,>,>>>>,>>,>>,>>,>>,>>>>,>,>,>,>>>>>,>,>,>,>,>,,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,,,>>,>,>,,>,,>,,>,>,,>,,,>,,,,>,>,>,>,>,>,,,,,,,,,>,,>,>,,,,>,,,,>,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,',,',,',,,,',,,',,',,,,,,,',',',',,,,,,,',,,',,,',,',',,',',,',',,,',',,'',,,,',',',',',',',,',''',',',',',',',,'','','','',',''',',''',',','''',','''''''''''''','''','',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>>>>;>>>>>;>>>;>>>>;>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>,>>,>>>>,>>>,>>>>,>,>>,>>>>,>,>,>>>>>>>,>>>,>>,>>>>>,>>,,>,>>,>>>,>,,>,>>,>,>,>,>>,>,>,>,>,>,>,>,>,,>,,>>,>,,>,>>,,,>,,>,,>,>,,,>,,>,,>,,,>,>,,,,,,,,,,,,,>,>,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,',,,,,,,,,,,,,,,,,',,,,,,',,',,,,,,,,,',',',,',',,',',',,,',',,',',,',',',',',,''',',',',',',','','',,',',',','','''','',',',','',','','',',''''',','''','','',''',','''''''''''''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>;>>>;>;>>>;>>>>;>>>>>>>>>>;>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>>>>,>,>,>,>,>>,>>>,>,>>,>>,>>,>>,,>>,>>>,>,>,>,>>>,,>,>,>,>,>,>,>,>,>,>,>,,,>,>,>,,,>,,>,,>,,>,,>,,>,,,,>,>,,,,,,>,>,>,>,>,,,,,,,,,>,,>,,,,,,,,,,,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,',,,,',',,,',,',',',',,,',,,',,',,',,,,,',',,,',,',,',',',',,',',,,',',',',',',',',','',',''',',''',,',','','''','''',''','''',',''''','',''''''','''''',''''''','','''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>;>>;>>>>>>>>>>;>>>;>>;>>>>;>>>;>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>>,>>>>>,>>,>,>>>,>,>,>,>>>>>>>>>,>>>,>,>>,>>,>>>,>>,>>>,>,>,>,>,>>>,,,>>,>,>,>,>,>,>,>,,>,>,,>,>>,,>,,>,>,>,,>,>,>,,>,,,,>,>,,,>,>,>,,,,,,,,,,,,>,,>,,,,,,,,,>,,,,,>,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,,',,',,',,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,',,',,','',',,'',,',,',,,',',,',',',',',',',',',',',',','','',,','',,'''',','',',''',','','',',''''',','''''','','''''','''''',',''''''',''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>>;>>;>>;>>;>>>>>>>>>>>;>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>,>>>>,>>>>>>,>>>>>>>>>,>>>>>>>>>,>,>,>,>>,>,>>>,>>,>>,,>,>,>,,>>,>,>,>,>,,>>>,>,>,>,>,>,>,>,>,>,,>,>>,>,,>>,>,>,,>,>,,>,,,>,,>,>,,>,,>,,,,,,,>,>,>,>,>,,,,,,,>,>,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,,,,,,,,,,,,',,',',,,,',',',',',',',,',,',',,',,,',,,,,,',,,',',',',',',',',,',',',',',',',',',','',',',''',','',',,'''','',',',''','',''''',','''',',',''''','',''','',''''''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>>>>>;>>;>>;>>;>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>,>>>>>>,>,>,>>>>>>>,>>,>>>,>,>>,>>,>>>>>,>>>>,>>>,>,>>>>,,>>,>,>,>,>,>,>,>,>,>,>,,,>,,>,,>,,,,>,>,,>,,>>,,>,,,>,,,>,,>,>,>,,,,,,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,>,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,,,',,,,,',,,,,,,,,,,,,,,,,,',,,',,,',,',','',',',,',,',',',,',',',',',',',',',',',','',',',',,,',',''','',,,','','''','','',',',''''','''''''','''''''''''''''''''','','''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>;>;>>>>>>>>>;>>>>>;>>>;>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>>,>,>>>>>>>,>>,>>>>>>,>,>,>>>,>>>,>>>>,>>>,>>,,>,>>,,>>,,,>>>,,,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>>,>,>,>>,,>,,>,>,,,>,,,>,,>,>,,>,,,,,>,>,>,>,>,,,>,,,,>,,>,,>,>,,,>,,>,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,',,,,,',,,,,,,',,,',,',',',',',',',,,',,,',,',,',,,,',',,',,',,,',',,',',',,,',',',',',',',',,',',',''''',',,'','''',','',','','','','''',',''',',',''''',',',''','''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>>>>;>>;>>>>>>>;>;>>>>>>>;>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>,>>,>>>>,>>>>>>>>,>,>>>>>>>,>,>,>>>>>>,>>>,>>,>,>>>,>,>,>>>,>,>>>,>>>>,,>>>,>,>,>>,>,>,>,>,>,>,>,,>,,>,>,,,>,,>,,,>,,>,>,,>>,,>,>,>,,,,>,,>,>,,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,,,,,,,,,,,,',,',,,,,,,,,,,,,,,,,,,,,,',',,',',,',,,'',,',,',',',,',','',',,,',',',',',',',',','',''','',,,,''''','',',''','''',''','','','''''',''''''','','''''','''','',''''','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>;>>;>>>;>>;>>>>>>>;>>>>>>>>>;>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>,>,>>>>>>>>>,>,>>>,>>,>>>>,>,>>>,>,>,>>>,>,>,>,,>,>,>,>>,>,,>,>,>,>,>,>,>,>,,>>,>,>>,>,>,,>,>,>,,,>,,,,>,,,,,>,>,,>,,,,,>,>,>,>,>,,>,,,,,>,,>,>,,,>,,,,>,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,',,,,,,,',',,',',',',',',',',,,,',,,,',,,',,,',,',,',,',',',,,,',',',',',',',',',',','',',',',''''',',,',','',','',',',','',''''',',',''',',',''''''','''',''''''''',''''','''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>;>>;>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>,>>>,>>,>>>>>,>,>,>,>>>>>,>>,>>,>,,>>>>,>>,>>,>,,>>,>>,>>,>>,>,>,>,>>,>,>,>,>,>,>,>,>>,,,,>,,>,>,,>,>,,,>,>,>,>,,,>,>,,,,>,,>,>,>,,,,,,,,,,,,,,>,,,,,,,,,,>,,,>,,,,>,,,,,,,,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,',',,,,,,,,,,,,,,,,,,,,,,,',',,',',,',',',,',',',,',,,',,''',,',',,',',',',',',',',,',',',',,',,','''','',''',,''',''',''',',''''''','''''''',',''''','''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>;>>;>>>>>>>>>>>;>>>>>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>,>>>>>>,>>>>>>>>>>,>>,>>>>>>>>,>,>>>,>>,>>>>>,>,>>,>>,>>>>>,>>,>>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,,>>,>,>,,>,>>,,,>,>,>,,,>,>,>,,,>,>,,>,,,,,,>,>,>,>,>,,>,,,,>,>,,,>,,,,,,,,,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,,,,,',,,,,,,,',,,,,,,',,',,',',',',',',',',,,',,',,',,,,',',,,',',,'',,'',,,',',',',',',',',',',','','','','','','',,'','',,'',','''','','','',',',''',',',''''''','''',''',''',''''','''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>;>>>;>>;>>;>>>>>;>>>>>>>>>>;>>>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>,>>>>,>>,>>,>>>>>>>,>,>,>>>>>,>>>,>>,>,>>>>,>>,>,>,>,,>>,>,>,>,>>,>>>,>,>>,>,>,>,>,>,>,>,,>,,>,>,,>,>,,,>>,>,,,>,>,>,,,,>,>,,>,,,>,>,,,,,,,,,,,,>,,,>,,,,,>,,,,,,,,,,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,,,,,',,,,',,',,,,,,',,,,,,,,,,,,,,,,',,',,,',,',',,,',',,,',',,',,',',',',',',',',',',',',',',',',',',','',','',',''','''',',''','','','''''',''''''','',''''','''''''','''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>>>;>>>>>>;>>;>;>>>>>>>>>>;>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>,>>>>>,>>>,>>>>>>>,>>,>>>>>>>,>,>>>,>>,>>,>>,>,>>,>>>,>,>>>,>>>,>,>,>>,,,>,>,>,>,>,>,>,>,>,>,>,>>,,>,>,>,>>,,,,,>>,,>,>,,>,>,,,,>,,>,,,,>,>,>,>,>,>,,,,,,,>,,,,,,>,,,>,,>,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,',,,,,,,,',,,,,',',',',',',',,',,',',,,',,,'',,',',',,,',',',',',,,',',,',',',',',',','',',',',',',,''','',',','',,''',','','','''',',''',',',''''''',''''',''''''''''''',''',''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>>>>;>>>>>>>>>>>;>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>,>,>>>>,>>,>,>,>>>>>,>>,>>>,>>,>>>,>>,>,>>>,>,>,>,>,>>,>,>>>,>,>,>,>,>,>,>,>,>,>,>,,,>,>,>,,,,,>>,>,,,>,,,,>,>,,>,>,,>,,>,>,,,,,,,,,,,,,>,>,,,,,>,,>,,,>,,,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,,,,,,,,,',,',',,,',,,,,,,,,,,,,,,,',,',,,,',',,',,,',,,',',',,,',',,,',',',',',',',',',',',',',','','',''',,'',''','',''',''',','','',','''','''''''',',''''',''''',''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>;>>;>>;>>;>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>>,>>,>>>>>>,>>>>>>>>>>>,>,>>>,>>,>>>,>>,>>,>,>>,,>>,>,>,>>,>,>,>,>,>>>,>,>,>,>,>,>,>,>,,>,>>,>,>,>,>>,,>,,>>,>,>>,,,,,>,,,>,,,>,,,,,>,>,>,>,>,,,,,>,,>,,,,,,,,,,,,,,,,>,,,,,,>,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,',,,,,,,',,,',,,,,,,,,,,,,',',',',',',,',,',,,',',,,',,',',',',,,','',,',''',',',,',',',',',',',',','',',',',',,'',',',,',','',',','''','','''''',''',',',''''',','''',''''''''''','''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>>>>>>;>>>>>;>>>>;>>>>>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>,>>>>>>>>>>>>>,>>>>>>>,>>>>>>,>,>,>,>,>>>>,>>>,>>,>>>,>>,>>,>,>>>,>>>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,,>,,>,>,,>,,>,,,,>,,,>>,>,,>,,,>,>,,>,>,,,,,,,,,,>,,,,,,,,,,>,,>,,,,,>,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,',,,',',,,,,,,,,,,,,',,',,',,',,',,,',,',,',,'',,,,,',',,,,',',',',',',',',',',',',','','',''','','''''','',''''',',''','',',',''',''''''',''''''','''',''',''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>;>;>>>>>;>>>>;>>>>>>;>>>>;>>>>>>>>>>>>;>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>,>>,>>>>>>>,>>,>>>,>>,>>>>>>>>>>>>,>,>>,>>,>>,,>>,>>,>>,>>,>>,,>>,>>,>,>>>,>,>,>>,>,>,>,>,>,>,>,>,,>,>>,>,>,>,>,>,>,,>>,,>>,,,,,>,,>,>,,,>,,,,,>,>,>,>,,,>,,>,,>,>,,,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,',,,,,,',,,,,,,',',',',',,,',,,,,',,',,',',,',,',',,,'','',,','',',,',,',',',',',',','',',',',',',,'',',',',,'','',,',''',','''''''''','',',','''''','''',''''''''',''''''''',''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>;>>>>>;>>>>;>>>>>;>>>>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>>>>>>>>>>>,>>,>,>,>,>>>>>,>,>>,>>>,>>,>>,>>,>,>,>>,>>,>,>>,,>,>>,>,>,>,>,>,>,>,>,>,,>,>,,>,,>,,>,,,>,,>,,>,,,,>,>,,,>,,,>,>,,>,>,,,,,,,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,',',,,,',,',,,,,,,,,,,',,,','',,',,',,,,',',',,',',,,',,',',,',,',',',,',',',',',',,','',','','',','''',''',','''',','''',',,',',',''''''''','','''','''',''',''''','''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>;>>>;>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>,>,>>,>,>>>,>>>>>>>>,>>,>>>>,>>>,>>,>>>,>>,>>>,>>>,>,>>>,,>>>,>,>,>,>,>,>,>,>,>,>,>>,>,>,>,>,>,>,>,,>,,>,,>>,>,,,>,>,,>,,>,,,,,,,>,>,>,>,,,>,,>,>,,>,,,>,>,,,,>,,>,,,,>,,>,,>,,,,,>,,,,,,,,,,,,,,,,,,,,',,,,',,,',,,,,,,,,,',,,,,,',,,,,,,,,,,,,',',',',',,,,',,,,,',,',,',',,',,,',,',,',',',,',','',',','',',',',',','',','',',',','',',,'',,'',',','''',','''''''''''',',',','''''','''''''''''''''''',''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>>>>>>>;>>>>;>>>>>>;>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>,>>,>>>>,>>,>>>,>>>>>>>>>>>>>,>>>,>,>,>>>,>>>,>>>,>>>,>>,>,>,>,>,>>,,>>>,,,>>,>,>,>,>,>,>,>,>,>,>,>,>,,,,>,>,,>,,>,,,>,>,>,,>,,,>,,>,,,,>,,>,,>,>,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,',,',',',,,,,,,,,,,,,',',,,',',,',,',,,',,',',',',',',,,'',',',,,,',',,',',',',',','',',','',',',''','',''',''','',',''',',',',',','''''''''',','''','',','',''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>>>;>>;>>>>>>>;>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>,>,>>,>>>>,>>>>>>,>>>,>>,>,>,>,>>>,>>>,>>>,>,>>>,,>>>,>,>,>,>>>,>,>,>,>,>,>,>,>,>>,>,,>,>,>>,>>,,>,,>,>,>,>,>,,>,>,,>,,,>,,,,,,>,>,>,>,,,,>,,>,,>,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,,,,,,,,,,,',,',',',',,,,',',,,',,,',,',,',',,',,,',,,'',,,',,,'',',','',',',',',',','',',',','',',,'','',,'',,'','','',','','''''''',',',','''''',''''''''''''''''''','''',''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>;>>;>>>>;>>>>>>;>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>,>>>>,>,>>>,>>>,>>>,>>>,>,>>,>>,>,>,>>,,>>>,,>>,>>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,,>,,,>,,>,,>,,,>,,>,,,>,,,>,,>,>,,,>,>,,,,,,,,,>,,,,,,,,,,,,,,,,,>,,,,>,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,',,,,,,',,',,,',',,,,,,,,,,,',,,,,',,,,',,,',,',',,',,',',',',,'',',',,',',,',',',',',',',',,',',','',',''','',''',''','','','''','',',',',''''''''','''''','','''''',''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>>>>>>>;>>;>>>>>>>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>,>>>,>>,>>>>>,>>,>>>,>,>>>>,>>>>,>>>,>>,>,>>>>,>,>>,>>>,>>>>,>>,>,>,,>>,>,>>,>,>,>,>,>,>,>,,>,>,>,>,,>>,>,,>,>,>>,,>,,>,>,,>,,>,,,,,>,,,,>,>,>,>,,,>,,>,>,,>,,>,,>,,,,>,,,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,',,,,,,,,,',,,,,,',,,,,,,',',',',,,',',,,'',',,',,',,',,',,',,,',,',',,',','',,',',',',',',',',','',''',',,',',',','',',',','''','',','','''''''''',',','''','',''''',',''''''''''',''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>;>>;>>>>>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>,>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>,>,>>,>>,>>>>>,>,>>>>,>>,,>>,,>,>,>,>,>>>,>,>,>,>>,>,>,>,>,>,>>,>,,>,,>>,,>,,>,,,>,,,>,>,>,,,>,>,,,>,>>,,>,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,,',,,,',',,,,',,,',,,,,,,,',,,,,',,,,,,',,',,,,',',',',',,',,',',',',,',',,',',',',',',','',',',','''',''','',',','','',''','''','',',',',',''''''',''''''','''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>>>>>>>;>>>>>>;>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>,>>>>>>>>,>>>>>,>>,>,>,>,>>>,>>>>>>>>,>>>,>,>>,>>,>,>,>>,>,>>>>,>>,>>,,>,>>,>,>,,>,>,>,>,>,>,,>,>,,>>,,>,>,>,>,>,,>,,>,,>,>,,,,>,>,,,,>,,,,,,>,>,>,,,>,>,,>,,>,>,>,,,>,,,,,>,,>,,,,,,,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,',,,,,,,,,,',,,,',',',,,,',',,',',',,',,',',,,',,',,',',,',',',,',',','',',',',',',',','',',',',,,',',',',''','','','','',',''''''''''''''',',''''',',''''',''','''''','''''',''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>;>;>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>,>,>>>,>,>>>>>>>>>>>>,>>,>,>,>,>>,>,>>>,>>,>,>,>>,>>>,>,,>>,>,>,>>,>,>,>>,>,>,>,>,>,>,>,>,,>>,,,>,>,>,,,>,,>,>,,>,,,,>,>,,>,,>,>,,>,>,>,,,,,,>,,,,,,,,,,,,,,,,>,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,',,,',',,,,',,,,,,,',',,,,',,,',,',,',,,',',,',,',,',',',,,',',,',',,',',',',',',',',,',',''''','',''',',',','','','',''',',,',',',',',''''','',''''',''''''''',''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>>>>>>;>>>>;>>>>>>>>>;>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>,>>,>,>,>>,>>>>>>>>,>>>,>,>>,>>>>>>,>>,>,>>>,>,>,>,>,>,>>,>,,>>,>,>,>,>,>,>,>,>,,>>,,>,>,>>,,>,,>,>,,>>,>,,,>,,,>,,,,,,,,,,,>,>,,,>,,,>,,>,>,,,>,,,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,,,,,,,,,,,,,',,,,,,',,,,',',',,,,',',,,',,',,',,,',,',',',',',,,,',',',','',,',',',',',',',',''','',',,,',','',','',''',',','',''',''''''''''''''',','''''''',''''',','''''','',''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>;>>;>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>>>>,>>>>>>,>>,>>,>>,>>>>>>>>>>>>,>,>,>,>>,>>>>,>>>,>,,,>>,>,>,>,>>,>>,>,>>,>,>,>>,,>,>,>,>,>,>,>,,>,>,,>>,,,>,,,>,>,>,,>,>,,,,>,,>,>,,>,>,>,>,>,,,,,>,,,,>,,,,,,,,>,,,,,,,,,>,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,',,',,',,',,,,,',,,,,,',,,,,,,,',,,,,',',,,',,,',',',,,',,,',,''',,',',,',,,',',',',',',',',',,',',',''',','',','','',,''''',''',,'',',',',',',',''''','','''''',','''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>>>>>;>>>>>>>>>>;>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>,>>>>>>>>>>>,>,>,>,>>>>>>>>>>,>,>,>>,>,>>>>,>,>>>,>>>,>,>,>>,>,>,>,>>,>>,>,>,>,>,>,>,>,>,>,>,,>>,,>,>,,,>,,>,,,>,>,,>,,,,>,,>,,,,,,,,>,>,,,>,,,,,>,,>,,,,,>,,>,,,,,,,,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,',,,',,',,,',',',',,,',',,,,,',,',',,,,,'',,'',,',,,,'',',',,'',',,',',',',',',',','',',',','',','',','',''',,','',''','','''''''''''',',''''','','''''''','''''''''',''',''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>;>>>>;>>>>>>>>>>>>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>,>>>>>>>>>,>>,>>,>>>>>>>>>,>,>,>,>,>>>>>,>>>>,>,>>>>,>,>>,,>>>,>,>,>>,>,>>,>,,>,>,>,>,>,>,>,>,>,,>,>,,>>,,>,>,>,>,>,>,,,>,,>,>,,,>,,>,>,>,>,,,,>,,,>,,>,,,,,,>,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,,,,',,',,',',,,,,,,,,,',,,,,,,,',,,,,','',,',,,',',',,,',,,',',',',,',,'',,',',',',',',',','','',',''',',','','','',',',''''',',','','',',',',',',''''','''''''','''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>;>>;>>>>>;>>;>>;>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>>>,>>,>>>>>>,>>,>>>,>>>>>>,>,>,>,>>>>>>>>>>>,>,>>,>,>>>,>,,>>,>,>>>,>,>,>,>,>>,>,,>,>>,>,>,>,>,>,>,,,>,>,>,>,>,,,>,,>,,,,>,,>,>,,>,,>,,>,,>,,,,,,,,,,>,,,>,,,,,,,,>,,,,>,,,,,,,,>,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,',,',,,,,,,,,,,,',,',,',,,,,',',',,,',',,,,,',,,',,',,,'',,',',,,',,',',',,',',',',',',',',',',,',,',',,'',',',',','','','',,','''''',''','''''''''''',','','',',''',','''''',''','''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>;>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>,>>>>>>>>>,>,>,>,>,>,>>>,>>>,>,>>>>,>,>>,>,>,>,>>>,>,,>,>>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>>,,>,,>>,>,>,,,>,,,>,,>,>,,,>,>,>,>,>,,,>,,,>,>,,>,,,>,,,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',',,,,,,,',,,,',',,,',',,,,'',,,',',,'',,',,',,'',,',,',',',',',',','',''',''',,','','','',',''','''',',',''','',',',',',',''''''''''''''''''''',','''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>;>>>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>,>>>>>,>>,>>,>,>,>>,>>>>>>,>,>,>,>>>>>>>>,>>>,>,>>,>>,>>,,>>,>>,>,>>>,>,,>,>>>,>,>,>,>,>,>,>,>,>,>,>,,>,,>,>,,>,,>,,>,,,>,,,>>,,,>,,>,,,,,>,,,,,,,,,,,>,,>,,,,,,,,,,,,,>,,,,,>,,,,>,,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,',,,,,',,,',',',,,,,,',',',,',,',,,',',,,',',,,,',,',',,,',',',',,,',',',,,',',',',',',,',',',',''',','','',''',,'',','',''',',',''''''''''''',','','','','','','''''''''',''''','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>;>>>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>,>,>,>>,>>,>>,>>,>>,>>>,>>,>>>,>,>,>>,>>,,>>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>>,>,,>>,>,>,,>>,,,>,>,,,,>,>,>,>,>,>,>,>,,,,,,,,>,,>,,>,,>,,,>,,,,,>,,,,>,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,',,,,,,,',,,,',,,,,,,',',,,,,,,,,,',,',,',,',,',,',',',',,',',,',,','',',',,''',',',',',','',',',',',',',',',',',',''',','','','','''',',',',',','''''''''''''','''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>;>>>;>>>>>>>>>>>>>;>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>,>>,>>>,>,>,>,>,>>>>>>>>>,>>,>>,>>,>>>,>>,>,>,>,>,>>>,>>,>,,>>,,>,>,>,>,>,>,>,>,>,,>,>,>,,>,,,>,>,,,,,>,>,,,>,>,,,>,>,,>,,,,,,,,,,,,,,>,>,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,,,',,,,,,',',',',,,',,',,',,',,',,',',,,,',',,',',,',,',,',',,,',',',',',',,',',','',','',''',''',',',''','','','',','''''''''''',',',','',',''''','''''','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>;>>;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>,>>>,>>,>>>,>>>>>>>>>>>>>>>>>,>,>,>,>>>,>>>>>,>>,>>,>,>>>,>>,>,>,>,>,>>>,>,>,>>,>,>,>,>,>,>,>,>,>,,,>,>,>,>,,>,>,>,,,>,>,,,,>,,>,,>,,>,>,>,>,>,>,>,,,,,,>,,>,,>,>,,,,,,,>,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,,',,,,,,,,,,',,,,',,',,,,',',,,,,,,,,',,,',,',,',,',,',,,','',,,',',,'',',',',',',',',',',',','',''','',',',',',',',','',',','','','''''',',',',',','''''''''''''''',''''','''''''''''''''','''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>;>>;>>>>>>>>>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>>>>>>>>>>>>>>,>,>>>>,>,>,>>>>>>>>>,>,>>,>,>>,>>,>>,>,>,>>,>>,>>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>>,,>,>,>,,>,,>,,>,,>,,,,,,,,,,,,>,>,,,,,,,,,,,,>,>,,,,,>,,>,,,,,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,',,,,,,,',,,,,,,',,,,,,',',',',,,',,',,,,,',,',,,',',,,',',,,',,,',',',',',',',',',',',',,',',',','',',',''',','','','',''''',,',','''''''''''',',','',','','''','''',''''','''','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>;>>>;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>>,>>,>>>>>>,>>>>>>>,>,>,>,>>>>>,>>,>>>,>>>,>>>,>>,>>,>>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,>>,>,,,>,,,,,>,,,>,,>,,>,,>,,>,,>,>,>,>,>,,,,,,,>,>,,>,,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,',',,,,,',',,,,,,,,,,',,',,',',,',,,'',',,'',,','','',',,',',,,',',',',',',','',',',',',,',','','','','','','',',''''','',',',',',',''''''''''''''','''''''''','''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>;>>>>;>>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>,>>,>>>>>>>,>>,>>>,>,>,>>>>>>>>>,>,>>,>>,>>,>,>>,,>>,>,>,>,>>,>>,>>,>,,>>,>,>,>,>,>,>,>,>,>,>,>,>,,>,,,>,>,,>,>>,,>>,,>,,>,,>,,,>,,,,,,,,,,,,>,>,>,,,,,>,,,,,,>,,,>,>,,,,,,,>,,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,,,,,,,',,,,,',',,,,,',',',',',,',,,',,,',,,',,,,,',,,',',,,,,',',',,,''',,',',',',',',',',',',','','',',','',',','','','',',',''',''''''''''''',','','',','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>,>>>>>>>>>>>>>>>,>,>,>,>>,>>,>>,>>,>>>,>,>>,>,>>>,>>,>,>,>,>,>>>,>,>,>,>,>,>,>,>,>,,>,,>,>>,>,>,,>,>,,>,,>,,,>,,>,,>,,>,,,>,>,>,>,>,,,,,,,,>,,,,,,,>,,,,,>,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,',,',,,,',,,,',,,,,,,',,,,,,,,,,,,,,,',,,',,,',',','',,',,',,','',,,',',',,,',',',',',',',','',''','',',','','',''','',',''','''',',''',',',',',','''''''''''''','','''','','','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>>>>>>>;>>>>>>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>,>>>>>,>>,>>>>>>>>,>>,>>,>,>,>,>>>>>>>>>>>>,>>,>>,>>,>,>>>>,>>>,,>>,>>,>,>,>>,>,,>,>,>,>,>,>,>,>,>,>,>>,,>,,>,>,>,,>,>,,>,,>>,,>,,>,,,>,,>,>,,,,,,,,,>,>,>,,,>,,>,>,,,,>,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,',,,,',,,',',',',',',',,',',',',,,',,,',',',,',',,,',',',',',',',',',',',',',,',',,',',','',',',',',',','',','',','','',''''''''''''','','',''','''''''''''''''''',''''','''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>;>>>>>;>>>>;>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>>>>,>,>>>>>>>>,>>>>>>>>,>,>,>,>,>,>>,>>,>>,>>>>,,,>>,,>>>,>,>>,>,>>,>,>>,>>,>,>,>,>,>,>,>,>,,,>>,>,,>,>,,>,,,>,,>,>,,>,,>,,>,,,>,,,,>,>,>,>,,,,,,,>,,,,,,,,,>,,,,,,,,,>,,,,,,,,>,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,',,',,,,,,,',,',,,,,',,,,',,,,,,,,,,,,,,',,,',,,',,,,',,',,,',,',,'',',',,',',',,',',',',',','',','',',',',','',''',',''','''','''',''',',',',',',',','''''''','''',''''',''''''''''''',''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>;>>>>;>>>>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>>>,>>,>,>>>>>>>,>,>>>>>>,>>>>>,>>>>>,>>,>,>>>>,>>>,>,>>,>,>>>,,>,>,>,>,>,>,>,>,>,>,>,>,>>,,,>,>,,>,>,>,>,>,>,,,>,,>,,,,>,>,,>,>,,,,,,>,,>,>,>,,,,,>,,>,,,,,>,,,>,,,,,>,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,',,,,,,',,,,',,,,',,,,',',',',',',',,',,,',,',',,',,'',',',',,,',,',',',',',',',',',',',',',','','','',',',','''',',',','',',''',''''''''''''''''',',',''''',''','''''',''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>>>>>>>,>>,>>>>>,>,>>>>>,>,>>,>,>>>,>>>,>,>>,>,>>,>,>>,>,,>>,>>>,>>,>,>,>,>,>,>,>,>,,,>>,>,,>>,>,,,>,>,,,>,>,,>,,>,>,,,>,,>,,>,>,,,,>,,,,,,,>,,,,,,,,>,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,',,,,,,',,,',,,,',,,,,,,,,,,,,,',,',',,',,,',',',,,,',,,',','',,',,',,',',',',',',',','','',',',',','''',',,'',','',','',','',',',',',',',',',''''''',''''',''','''''',''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>;>>>>>>>>;>>>>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>>,>>>>>>,>,>>>>>,>,>,>>>>,>>,>,>>>,>>,>,>,>>,>>,>,>>,>>>,>,,>,>,>,>,>,>,>,>,>,>,>,>,,,>,>,,>,>>,,,,>>,,>,>,,>,>,,,>,,>,,>,,,,,>,,,>,>,>,,,>,,>,>,,,,>,,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,',,',,,',,,,,',,',',',',',',',,,',,,',,',',,,',,'',,',',,',,',',',',',',',',',',',',,',',,'','',',',,',''',',''','''','''','',''''''''''''''''''',''',','''''''','''''''''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>>;>>;>>>>;>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>,>>>>,>>>,>>>,>>>,>>,>>>>>>>>>>>,>>>,>,>>>>>,>,>>>>>>>>,>>>,>>>>,>,>>,>>,>>,>>,>>>,,>,,,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,,,>>,>,,>,>,,>,,,,>,>,,,>,,,>,>,,,>,,,,,,,>,,,,,,,,,>,,,,>,,,,,>,,,>,,>,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,,,,,,,',,',,,,,,,,,,,',,,,,,,,,,,,,,,,,,,',',,',,',,,,'',,',,,',',',',',',',',',',',',',',',','',',''',,',','',''',',''',',',',''',','','',',',',',',',',','''''''''','''''''',''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>,>>>>>>,>,>,>,>,>,>>,>,>>>,>>>,>>,>,>>,,>>,>>>>,>>,>>>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,,,,>,,>,,>,,>,>,,,,>,,,>,,,,,>,,,>,>,>,,,,,>,,>,,,,>,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,',,,,,,,,,,,',,',,',,,',',',',',',',',',',,,',,',,',',,,',,'',,',,,',',,,',',,,',,',',',',',',',',',,,'','',','',','',,'',',''',',''','','''''''''''''''''','','','''',','''''''','','','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>;>>>>;>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>,>>>>>>>,>,>>>>,>>,>,>,>>>>>>>>>>>>,>>>,>,>>,,>>,>,>>,>>>>,>,,>,>,>,,,>,>,>,>,>,>,>,>,>,,,>,>>,,>,>,,>,,>>,>,>,,>,>,,>,,>,>,>,>,,>,>,,,>,,,,,,,,>,>,,,,,,>,,,,,,,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,',,,',,,',',,',,,',,'',,,''',,,''',',',',',',',',','','''',',','',',''',''',''',','''','',''',',',',',',',',''''''''''','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>;>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>,>>,>>>>>>>>,>,>>>>>>,>>>,>>>>>>>>,>,>,>,,>,>>,>>>>,>>,>,>>,>,>>,,>>,>>>,>,>>>>>>,>,>,>,>,>,>,>,>>>,,,>,>,,>,>,>,,,,,>,,>,,,>,,>,,>,,,,,>,,,,,>,,,>,>,>,,,,,,,,>,,,,,,,>,,>,,>,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,,,,,,',,,',,,,,',,,,,',,',,',,,',,',',',',',,,,,',,',,,',,,',,',',,',',',,,'',,,,'',,,,',',',',',',',',',',',,'',',',,''',,'',,'',',''',','','',','''''''''''''''''','',','''''''''','',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>,>>>,>,>,>,>>>>>,>>>>>,>>,>,>>,>>>,>>>>,>,>>,>,>,>,>,>,,,,>,>,>,>,>,>,>,>,,,,>>,>,>,>,,>,,>>>,>,>,,>,>,,,,>,,>,>,,>,,>,,,>,,,,,,,>,,>,,>,,,>,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',',,,,,',,,',,,,,,,,,,,,,',',,',,,',',',,',,',,',',,,',',,'',',,'',',',',',',',',',',',','',,','','',,''',''',','','''',''','''',',',',',',','',''''''''','',''''''''''','''''''',''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>;>>>>;>>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>,>>>>>,>>>>,>>>>,>>>>>>>>>,>,>>>,>,>,>>,>>>,>>,>,>,,>,>,>>,>>,>,>>,>,>>>>>,>,>,>,>,>,>,>,>>,,,>,>,>,>,,>,,,,,,,>,>,,,>,>,,>,>,,>,,,>,,>,,,>,>,>,,,,,,,,>,,,,,>,,,>,,,,,,>,,,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,,',,,,,,,,,,,',,,,,,,,',',',',',',,,,,',',',,,,,',,',',',,,'',',,',,',',',,',,,',',',',',',',',',',''',','',''',','',,''','',,'',','',','''''''''''''','',',''','''''',''''''','''''','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>,>>>>>,>>>>,>>>>,>,>,>>>>>>,>>>>,>>,>>,>>>,>,>>>>>,>>>,>,,>,>,,>,>,>,,,>,>,>,>,>,>,>,,>,,>>,>,>,>,>,>,>,>,>>,,>,>,,,>,,,,,,>,,>,,,>,,,>,,,,,,,>,>,,,,,,>,,,,,>,,,>,,>,,,,>,,,,,,,>,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,,,,,,,,',,,,',,',,,,,,,,,,,,,,',',,,,,,',',',,',,,,,',',,,,',,'',,',',',',',',',',',',',',''',',,,',',,',','',',''',,'',''',''','''',',',',',',','''''''','''','''''',''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>,>>>>>>,>,>,>>,>,>>,>>,>>,>,>>,>,,>,>,>,>>>,>>,>>>>,>,>>,>,>,>,>,>,>,>,>,>>,,>,,,>,,>,,>,,>,,,>,,,>,>,,>,>,>,,>,,,>,,,>,,>,,>,>,,,,>,,>,,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',,',,,,',,,,,,,',,',',',',',,,,',',--*-->,,',,'',',,','',,',,',',',',',',',',',',',',',',',''''''',''','',','',,''','',','','',','''''''''''''','','''''',''',''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>;>>>>;>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>,>>>>>>,>>,>>,>>>,>>>>,>>>>,>,>>>>>>>>>>,>>,>>,>>,>>>,>>,>>>,>>,>>,>,>,>,>,,>,>>,>,>,>,>,>,>,>,>,>,,,>,>,>,>,>,>,,>,,>>,,>>,,,>,,,,>,,>,,>,,,>,,,,,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;**-,,',,,,,,,,',,,,',',,,,,,,,,,,,,,,',',,,=*&&&&&&-,,',,>=*-,,,,',',',',',,,',',',',',',',',',',',',',,',,',',,','''',''',,'','''','',''',',',',',',',''',''',','''''''',''''''',''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>>;>>>;>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>,>>>,>,>>>>,>,>,>,>,>>,>>>>>,>>,>,>,>>>,>>,>,>,>>>,>,>,>>>,>,>,>,>,>,>,>,>,>,>,>>,,>,>,>,>,,>,>,>,,>,>,,,>,,>,>,,>,,,>,,>,,,>,>,,,>,>,>,,,>,,>,,>,,,,,>,,>,,,>,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,;&&&&;,,',,,,,,,,,',,,,,,,',',',',',',,,,,,>*%&&&%&&&>,',,,*&&&-',',,,',,,','',,',,,',',',',',',',',',','','',','''',,,'',,''','',',''','','''''''''''''',''''''''''','',''''',''''''','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>>>>>>,>>,>>,>>>>>>>>>>>,>,>>>>>>>>>,>>>,>,>>>,>>>,>>,,>,>,>>,>>,,>,>>>,>,>,>,>,>,>,>,>,>,>,,,>,,>>,>,,>,,>,,>,>,,>,,,>,>,,>,,,>,,,>,,>,,,>,,,,,>,,,,,,,>,,,,,,,,,,,,>,,,,,,>,,,,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,*&&&&*,,,,',,',,,,,,',,',,,,,,,,,,,,,',',',&&&&%*&*&*,,','-&&&&&',,'',,'',',,'',',',',',',',',',',',',',,','',',',,'''',''',,'',''',','','',',',',',','''','',',''','''''''''''',''''''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>>,>>,>>>,>>>>>>,>>,>>>,>>>>>>,>,>,>,>>>,>>,>,>,>>,>>,>>>,>>>,>,>,>>,>,,,>,>,>,>>,>,>,>,>,>,>>,>,>,,,>,>,>,>,>,,,,>,>,>,,>,,>,,>,,>>,,>,,,>,,,>,>,,,>,>,,,,,,>,>,,>,>,,,,,,,,,,,,,,>,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*%&&&*,,,,,,,,',,',,,,,,',,',',',',',,,,,,=&&&&=,,,,,',,,,-&&&&*,',,',',,',,',,,',',',',',',',',','','''',','',',''',','',''','',','''','',''''''''''',',''''''','''','','',''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>;>>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>,>>>>,>>>,>>,>,>,>>>>>>>>,>,>,>>>>>>,>>,>>,>>,>,>>>,>,>>,>>>>,>,>>,,>,>,>,>,>,>,,>,>,,>>,>,>,>,>,,>>,,>,,,>>,,>,,>,>,,,,>,,>,,,>,,,,,>,,,,,,>,,>,,,,,,,,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',>&&&&;,,,,,,',,,,,,',,,,,,,,,,,,,,,,',','>*&&&=,,',,,,'',,,&&&&-,,',,',',',','',',',,',',',',',',',',',,',',,','',','',',',','''''',','','',',',',',''''',','''''',''','''''',''','''',''','''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>>>>>>>,>>>,>>>>>>>>>>>>>>>,>,>,>,>>>>>,>,>,>>,>,>,>,>,>>,,>>>,>,>,,>,>>,>,>>,>,>,>,>,>,>>,>,>>,,,,>,,,>,>,,,>,>,>,,,>,,>,,,,>,>,,>,,,>,,,>,>,,,,>,>,,,,,,,,>,,,>,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,>*=;,',,',,,,',',,,,',,',',',',',',,,,,,-&%&*,',,',',,,',',=*;,',,',',,',',,,',,','',',',',',',',',','''',''',','',',''',''',',',','',''',''''''''',',''''','',''''''''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>>>,>,>>,>,>>>,>>>,>>,>>,>,>,>>>>>>>>>>,>,>>>>,>>,>>>,>>>,>>,>>>,,>>,>>>,>,,>,>,>,>,>,>,>,>,>,,,>,,,>>>,>,>,>,,>>,,,,>,>,>,>,,>,>,,,,>,,>,,,>,,,,,>,>,,,,,,>,,>,,,>,,,,>,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,',',,,*&&&-,,',,,',',',',',,,',',,',',,'',',',',,',',',',',',',','',,,',',','','',',,'',,'',''''','','',',',','''''',''''''''','',''','',''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>;>>>;>>>>>>>>>>>;>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>>>>>,>,>,>,>,>>,>>,,>>>,>>,>>,,>>,>>,,>>>,,>,>,>>>,>>,>,>,>,>,>,>,>,>,>,>>>,,,>,>,>,>,,,>>,>,,>,,,,,>,,,>,>,,,>,,>,,,>,>,,,,,>,,>,,,,,>,,,,,,,,,,>,,,,,,,,>,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,',,,,,',,,',,,,',',,,',',',',,,,,','&&&&>,',,',,,,',,',,',',,',',',',,,',',','',',',',',','','',,''',',','',',''''',''',''',',''',','''''''',',','',''','',''''','''''''''''''''''''',''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>>,>>,>>,>>>>,>,>>>>>>>>>>>,>>,>>>,>,>>,>,>>>,>,>>>>,,>>>,>,>,,>>,>,>,>,>,>,>,>,>,>,>,,,,>>,>,>,,,>,>,,,>,>,,>>,>,,>,,,>,>,,>,,,>,,,,,>,>,,,,,,,>,,,,,>,>,,,,,,,,,,,>,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,',,,,',,,,,',,,',,,,,,',,,,,,,,',',,,,'&&&&>,,',,',',,',,',',,',,,',','',',,',,',,',',',',',',',','',,',','',''',',,',',',',','',','''',',','''''''',''','''''','''''','''',''''',''','''''''''=''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>,>>>,>>>>>>,>>>>,>>>>>,>,>,>,>,>>,>>,>,>>>>>,>>,>,>>,>,,>>,>,,>>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>==-=;>,>,>,,>,>,>->,>,,,,,>,,>;-==->-===>,>,>,,,,>,>;-,,,,,>,,,,,,-=-=;;===-,>,,,,,,,,,,->,,,,,,,,,,,,----,,,,,,,,,,,,',,,,,,,>>>>;>>>,,,,,',>>>>>,,>=****=>',',',,,,'>>>>&&&&->>>>,,','>>>>>>>>,,',',,,>>>>',',;=***=;,',',',',>-****=;,,'',',',,','','',''',''','''',','',-****=->','''''''','>>>>'','>=***=-'','''',;=***=->''*&*'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>,>>>,>>>>>>>,>>,>,>>>>>>>>>>>,>>>>>>>,>,>>,>>,>,>>,>>>,>>,>>,>,>,>,>>,>,>,>,>,>,>,>,>,,>,>,*&&%&,,>,,>,,,>,*&;,,>,>>,,>,,*%&&=,&&&&*,,,,>,,,,,,&&,>,,,,,>,,,>&&&&;;&&&&-,,,>,,,,,,>&*,,,,,,,,,,,-&%&&,,,,,,,,,',,,,,,,,,,&&&&&&&&',,,,,,*&&&*,*&&&&&&&&&-,,,,',,,*&&&&&&&&&&&&-,,,'*&&&&&&&>,',','-&&&&',;*&&&&&&>,',',',;*&&&&&&&&&*>,'','''','','',','',''',',''',>=&&&&&&&&&*>,'','',''>&&&&>'>=&&&&&&-''''''=*&&&&&&&&==&&&*,'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>;>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>,>>>>>>>>>,>,>,>,>,>>>,,>,>,>>>,>,>,>>,>,>>,>,>,>,,>,>>,>,>,>>,>,>,>,>,>,>,>,>,,>,=%&&&>>,>,,>>,>>&&*,>,,,,>,,>;&&%&;,*&%&&,>,,,>,>,,-&&-,>,>,,,>,,-&%&&,,&&%&*,,,,,>,,,,*&&>,>,,,,,,,,*&&&*,,,,,',,,,,,,,,,,,,'&&&&%&&*,,,',,,*&&&&*&&&%&&&&&&&*>',,,',*&&&&%&&&&&&&-'',,*&&&&&&&>,,',',-&&&*,;&&&&&&&*'',',',=&&&&&&&&&&&&&=','',','',','',''',',',''','-&&&&&&&&&&&&&='''''''',&&&&>>*&&&&&&*,''''>*&&&&&&&&&&&&&&*;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>,>>,>>>>,>>>,>,>,>,>>>>>>>>>>,>>>>>,>>,>>>>,>>,>>>,>,>>>,>>>,>>,>,>,>,>,,>,>,>,>,>,>,>,>,>,,>&&%%=,,>>,,,,>=&&&,>,>,,,>,,=%&&&,,-&&&&;,>,,,,,,,*%&*,,,,,,,,,,*&&&=,,=&&&&,,,,,,,,,,&&&=,,,,,,,,,,&&&&;,,,,,,,,,,,,,,,,',,,*&%&&&%*,,,,,,,*%&&&%&&*&&&&&&&&&&,,',,,*&&&&&&&%&&&&=,,',*&&&&&&&>',',',-&&&&;&&&&*&&&;,',','*&&&&&&*&*&&&&&&=',','',''',',','''','',','=&&&&&*****&&&&&=','',''>&&&&>*&&&***&-','',*&&&&&*=**&&&&&*,'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>,>>,>>>>>>>>,>>>,>>>>>>>>>>>>>,>,>,>,>,>,>,>,>>,>,>,,>>,>>,,>>,>,>,>,>,>,>,>>,>>,>>,>,>,>,>,>,>,,>,>,>>,&&&&&>,,,,>>,,&&%&=,,,,>,,,,&&%&=,>,&&%&*,,>,>,>,;&&%&;>,,>,,>,>&&%&;,,;&%&&->,,,,,,,-&&&&,,,,,,,,,;&%&&,,,,,,,,,,,,,,,,,,,,,=--*&&&&,,,,',,*&&&&&*;,',,-*&&&&&*,,',,--=-&&&&*-=-->',,'-=-=&&&&>,',',,-&&&*&&&=,,'>*,',','*&&&&*;,,',>=&&&&&='',',',,',''',',',''''''-&&&&*-,',',-*&&&&;'''',',&&&&*&&=,'',=>''''=&&&&=>''',-&&&&*,'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>;>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>,>>>>,>>>,>>,>>,>,>>>>>>>>>>>>>>>,>>,>>>>>>>,>,>>>>,>>>,>,>,>,>,>,>,>,>,,>,>,>,>,>,>,>,>,,>,,,>-%&%&>>>,>,,>-&%&&&,>>,,>,>>&&&&>,,,*&&&&,,,,,,,,=&&&&*,,,,,,,,-&&&&,,>,&&&&*,,,,,,,,*%&&&-,,,,,,,,*&&&=,,,,,,,,,,,',,,,,,,,,,,,-&&&*,,',,,,*&%&&;,,,,,',,-&&&&&;,,,,,,,'&&&&-,,,,,,',,',,>&&&&>,',,',-&&&&&&;,',',',',',=&&&&=,'',''''>*&&&*,','''''',',''','',',,',*&&&*>','''',>*&&&*,,''''>&&&&&&-'''''''''';&&&&*'''''''-&&&&-'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>,>,>,>,>,,>,>>,>>,>,>,>,>>,>,,>>,,>>,>,>>>,>>,>>,>,>>,>,>,>,>,>,>,,>,>,>>,,>*%&&=,,>,,>,*&&&%&;,,,>,,,*&%&*,>,>;&%&&;>,>,>,,&%&%&&,,>,>,,,&&%&=,,,,=%&%*>,,,>,,;&&&%&*,,,,,,,>&&%&;,,,,,,,,,,,,',,,,,',,,,,=&&%*,,,',,,*&&&*',,',,,,,'-&&&&*,,'',','&&&&-',',',',',,';&&&&>,,'',,-&&&&&-,',',',',',,*&&&=',',',,',,>*&&&='',,',,'','',''','''',=&&&&-'''','''';&&&&-'','',&&&&&=','''''',''=&&&*,''''''''*&&&*'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>;>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>,>>>>,>>,>,>>,>,>>,>>>>,>>>>>>>>>>>>>>>,>>>,>>>,>>,>,>>,>>,>>>,>>>,,,>>,>,,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,*&%&&,,>,>,>&%&%&&*>,,>,>,&&&%-,,,,>&&%&=,,,,,,-&&&&&&=,,,,,,>&&&&;,,,,>&&&&-,,,,,,*&%&&%&;,,,,,,-&&&&,,,,,',,,',,,,,,,',,,,',,-&&&&,,,,,,,*&&&*,,,,',',,',*&&&&>,,,,',,*&%&-,,,,',,,',',>&&&&>',,'',-&&&&*',',',',',',=&&&&','','','','=&&&*,''','','','',''',',''*&&&*',','','','*&&&*'''',,&&&&*,''','',''''*&&&='''''''''-&&&&,''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>,>>>>>>>>>>>>>>>>>>,>>>,>,>,>,>,>,>,>>,>,>>,>>,>>>>,>>,>>,,>>,>,>>>,>,>>,>>,>,>,>,>,>,>,>,>,>,,>,>,>,>-&&%&;,>,,>=&&&&%&&>>,,>,;&%&&>,>,,,=&&&&>,>,>,*%&%&%&&,,,>,,=&%&&,,,,,,&&%&*,,,,,,&&&&&&&*,,,,,,*&&&=,,,,,,,,,,,,,,,,,,,,,,,,,-%&&*,,,',,,*&%&*,,',,,,',,,;&%&&-',',,',&&&&-',',,',',,,';&&&&>,',,',-&%&&;,',',',',','&&&&-,',,',',',',>&&&&,,','',','','',',''',;&&&&;''''''','',-&&&&,,'''>&&&&='''''''''','*&&&-'''''''''>*&&&,''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>,>>>,>,>>,>,>>>>,>>>>>>>>>>>>>>,>>>>>,>>,>>,,,>>,>>,>>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,,>,>&&&%=,,>,>&&%&*&&&=,,,,>*&&&*,,,>,>;%&%&;,,,,>&&&&*&&&;>,,,>&&&&=,,,,,,=&&&&,,,,,-&%&&&&&&,,,,,>&&%&;,,,,,,,,,,,,,,,,,,,',,,,,-&&&&',,,',,*&&&*,,,,',,,,',,*&&&*,,',,,'*&&&=,,'',',,'',,>&&&&>,',',,-&&&&,,',',',',',>&&&&>''','',',',',*&&&>',',''',''','''','''=&&&*,',',','''''>&&&&;'',',&&&&>''''''''''''*&&&;'''''''''>&&&*>''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>,>>,>>>,>>>>,>>>>>>>>>>,>,>>,>,>,>,>,>,>,>>>,>,>>,>>,>>>>,>,>,>,>,>,>,>,>,>,>>>,>,>,>,>,>,>,>,>,>,>,,>,>,>,,>,*%&&&,>,,-&%&*,&%&&>,>,,&%&%-,>,,,,,&&&&=>,>,*&%&--&%&*,,,,>&&&&>,>,,,,>&%&&-,,,,*&&&>=%&&-,,,,-&&&*,,',,,,,,,,,,,',,,,,,',,,,-%&&&,',,,,,*%&&*,,',,',',,,,*&&%*,,,',,,*%&&-',,,,,',,,',>%&&&>',,','-&&&*,',',',',','-&&&*--------------&&&&-''',','',','',','','*&&&*,''''''',',',*&&&-'''',&&&&>',','','''''*&&&-''''''''',&&&&,''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">;>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>>>>>>>>>>,>,>,>>,>>,>>,>,>>,>>,>>,>>,>,>>,>>,>,>,>,>,>,>,>,>,>,>,,,>,>,>,,>>,>,;&%&&>>,,*&&%-,=&&&-,,,-&&&&,,,>,,,,=&%&&,,,,&&%&>,*%&&>,,,*&%&*,,,,>,,>*&&%*,,,;%&%*,>*&%&,,,,*&%&=,,,,,',,,,,,,,,,,',,,,,,',-&&&*,,,,,,,*&&&*,,,,,,,,',,,*%&&*,',,',,*&&&-,','',,'',,'>&&&&>,',',,-&&&*,',',',',','=&&&&&&&&&&&&&&&&&&&&&&-',''','','',','','',*&&&*',',','''''''*&&&*',''>&&&&>'''''''','''*&&&*''','''''-&&&&,''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>;>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>>>,>>>>,>>>,>>,>>>>>>>,>>,>>,>,>,>,>,>,>,>,>>>>>,>>,>>>,>,>>,>>,>>,>>,>>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>,,,>,>,&&%&=,>>&%&&,,;%&%*>>,*&%&*>,,,>,>,;&&&&;,,-&&&=,,-&&&=,,,&&&&-,,,,,,,,=&&&&,,,=&&&-,,*&&&;,,>&&&&>,,,,,,,,,,,,,,,,,,,,,,,,,,=&&&&,',',,,*&%&*',',',',,',,*&&%*,,',,,,&&&&-,',,,',,,',,>&&&&>',',',-&&&&',',',',',',*&&&&&&&&&&&&&&&&&&&&&&>,',',','','''','',''*&&&*''''''','',',*&&&*'',',&&&&>''''''''''''=&&&*,''''''''=&*&*'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>,>>>>>,>>>>>>>>>>,>>,>>>,>>>>,>>>>>>>>>>>>>>,>,>>,>>>,>>,>>,>,>,>,>>,>,,>,>,>,>,>,>,>>,>,>,>,>,>,>,>,>,>,,>,>>,>,,>=&%&&,,*&&&=>,,*&&&;,>&&&&-,>,,,,,,>&&%&=,,&&%&;,>,&&%*>,;&&%&>,,,,,,,,>&&&&;,>&&%*,,,;&&&*,,=&%&*,,,,,,,,',,,,,,,,,,,',,',,,-&%&*,,,,',,*&&&*,,,,,,,,,,',*&&&*,,,',',*%&&-,,'',,'',,',>&&&&>,,',',-&&&*,',',',',','*&&&&******************,'','''','',','','',,*&&&*',','''',''''*&&&*''''>&&*&,''','''''',';&&&&=''''''';&&&&-'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>,>>>>,>,>,>,>,>,>,>>>,>>>,>>,>>,>>,>>>>,>,>>>>,>>,>>,>,>,>,,>,>,>,>,>,>,>,>,,>,>,>,,>,>,>;&&&&>,&%&&,,,>-&%&*,-&%&&,,,>,>,>,,=&&&&,;&&&*,,,,*&&&-,=%&&*,,>,>,,,,,*&%&*,=&&&=,,,,*%&*>,&&&&-,,,,,,,,,,,,',,,',,,,,,,,,,=&&&&,,,,,,,*&%&*,,',',',',,,*&&&&',',,,'&&&&-',,,',,',',,>%&&&>',,','=&&&*',',',',',',*&&&*,,',','',''''',''',',',',''','''','''''*&&&*''''','''',',*&&&*,''',&&&&>,''''',''''''=&&&&=''''';&&&&*,'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>>,>>>>>>>,>,>>,>>>>>,>,>>>>>>>>>>>,>>,>>>,>,>,>>,>>,>>,,>,>>,>,,>>,>,>,>>,>>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,,,>,&%&&--&&&*,>,,>&&&&,*&%&*,,,,,,,,>,;&%&%>=%&%-,,>,>&&&*,&&&&-,,,,,,>,,,-&&&&,&&%*>,,,,-&&&=>&&%&>,,,,',,,,,,,,,,,,,,,,,,,,',-&&&*,,',,,,*&&&*,,,,,,,,,,',*&&&&',,',,'&&&&-,',,',,',,',>&&&&>,',','-&%&&',',',',',',=&&&&'',',',',',,'',',''',','',''',','',',',*&&&*',','',''''''&&&&-'','>&&&&,'''','''''''',*&&&&**--*&&&&&>''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>>>,>>>>>>>>,>,>>>>>>,>,>,>,>,>>>,>,>,>>>>>,>>,>,>,>>>>,>>,>>,,>,>>,>,>,>,>,>,>,>,>,>,>,,>,,>,>,>,>,>,>,>,=&%&&*&%&>,,>,,=&%&*&&&&;>,>,>,>,,,,&&&&=&&&&,,,,,,*&%&=&&&&,,,,,,,,,,,,&&&&=&&&*,,,,,,&&&&*&&&*,,,,,,,,,,,,,,,,',,',,',,,,,=&&%*,,,',,,*&%&*',',',',',,,&%&&*,',,','&&&&-,',',',,',,'>&&&&>,',,',-&&&*,',',',',','-&&&&>,',','','',',''',,'''','',',''','','''*&&&*''''''','',',&&&&-'''',&&&&>,'''''''''''''>*&&&&&&&&&&*&;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>,>,>>>,>>,>>>>>>>,>,>>>>>>>>>>>,>>>>>>,>,>,>>,>>,>>>,,>,>,>,>,>>>,,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,,>,;&&&%&%&*,>,,>,,&&&&&%&&,,,,,,,,>,,,-&%&&&%&->,,,,>;&&&%&%&*,,>,,,,,>,,,*&%&&%&&;,,,,,,=&&&&%&&-,,,,,,,,',,,,,,,,,,,,,,,,,,,-&&&&',,,,,,*&&&*,,,,,,,,,,'>&&&&=,,',,,,*&%&-,,,',,',',',>&&%&>,',',,-&&&*,',',',',',,>&&&&-,''',,','','',,''',,'','','',''','',''-&&&&>',','''''''-&&&&>''''>&&&&,'','''',''''''''-&&&&&&&&&*,''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>,>>>,>>>>>>>>>>>>>>>,>>,>>>>>>,>,>,>,>,>>,,>,>>,>>>>,>,>>,,>>,>>,>>,>>,,>>>,>>>,>,>,>,>,>,>,>,>,>,>,>,>,,,>,>,,>,,>,&%&&&&&;,,>,,,>=%&%&%&=>,>,>,>,,,>,>&&&%&&&,,,>,,,,*%&&&&&-,,,,>,,,,,,,-&&&&&%*,,,,,,,>&%&&&&&,,,,,,,,,,,',,,,,,,',,,,,',,,-%&&*,,,',,,*&%&*,',',',',,,=&&&&>,',,','&&&&-',',,',,',,,>&&&&>',',',-&&&&',',',',','''&&&&*',,'','','',''',','','',''','','','''',&&&&-''''','',',*&&&*'',''>*&&&>'''','''''''''';*&&&&**=->''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>,>>,>>,>>>>>,>,>,>>>>>>>>>>,>>>>,>>>,>,>>>,>,>>,>>,>>,>,>,>>,,>,>,>,>,>,>,>,>,>,>,>,,>,,>,,>>,>,,>,>,,>,=&%%&%*>,,,>,,>>&&%&&%>,,,,,,,>,,,,,*%&&%&*,,,,,>,,-&&%&%*>,,,,,,,,,,,,,&&%&&&-,,,,,,,,=&&%&&*,,,,,,,,,,,,,-**-,,,,',,,,,,,-&&%*,,,,',,*&&&*,,,,,,,,',;&&&&*,,,',,,,*&&&-,,',',',,','>&&&&>,,',',-&&&*,',',',',',,'-&&&&=',',',','',',','',','',';**=,','',',''*&&&*,',''''''';&&&&='''''>&&&&,''''''''''''',*&&=;,,'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>;>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>,>>>>>>>>,>>,>>>>>>>>>,>>>>,>>>>>>>,>,>,>,>,>>,>,>>,>,>>>,,>,>>>,>>,>,>>,>,>,,>>,>,>,>,>,>,>,>,>,>,>,>,,>,>,>,,>,>,,>,,>,,;&&&&%-,,>,,>,,>*&&&&&,,,>,>,,,>,>,>-&%&&&>,,>,,,,,,&&&&&=,,,,,>,,>,,,,,*&&%&&,,,,,,,,,;&&&&&-,',,,',,,,,,=&&&&*,,,,',,',,,=&&&*,,,,,,,*%&&*,,',',',,>*&%&&;,',,',',&&&&-',,',,',',,,>&&&&>,',','-&&&&',',',',','','&&&&&;,'','',','>>',',''','';&&&&*,','''',';&&&&=''','','>*&&&*,',''',&&&&>'''''''''''''*&&;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>,>>,>>>>>>>>,>>>,>>>>>>,>>>,>,>>>>>>>>>>>,>>>>,>>>>,>,>>>>>,,>>,>,>>,>,>>>>,>>,>,>,>,>,>,>,>,>,>,>,>>,>,>,>,>,,>,>,>,,>,>*%&%*>,>,>,,>,,-%%&&=,>,,,,>,,,,,,,,&&&%*,>,,,>,,>,*&%&%;,,>,,,,,,,,,,,;&&&&=,,,,,,,,,,*%&%*,,,,,,,,,,,,;&&%&&&;,,,,,,,,,'-&%&&,',',,,*&&&&=,,,,,,'=*%&&&*,,',,',,'*&&&-,',,',,,',',>&&&&>,',',,-&&&*,',',',',',''';&&&&&=>'',''',=*&''',','','*&&&&&='',',''''*&&&&=,'''''>*&&&&-''''''>&&&&>'','''''','',&&&-,',,;-**=*-,'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-";>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>,>>,>>>>,>>>>>,>,>,>,>,>>,>,>>,>,>>>>,>,,>>>,>>,>>,>,>,,>,>,>>,>>>,>,>,>,>,>,>,>,>,,,>,,>,>,>>,,,,>,>,,>-&%&*,,,,,>,,>,,&&%&;,,,>,,,>,>,>,,,*%&&-,,,,,,,,,,>&&&&,,,,,,,,,,>,,,,,&%&&>,,,,,,,,,,-&&&*,,,,,,,,,,,,=&&&&&&-,,,,,,,,,,-&&&*,,,,',,*&&&&&**--=*&&&&&&&>',,',,',,&&&&-',',,',',',,>&&&&>',,','-&&&&',',',',',',','=&&&&&**=--**&&&&=',''',''>&&&&&&*,'''''',',*&&&&*=---*&&&&&*','',''>*&&&>'''',''''''',*&&&&*&&&&&&&&&&=''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>;>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>,>>>>>>>>>>>>>,>>>>,>,>>>>>>>>>>,>>>,>>,>>,>,>>,>>,,>>,>>,>,>>>>,>,>,,>>,,>,>,>,>,>,>,>,>,,>>,>,>,,>,,,>>,>,,>,,>>&&&>>,>,,,>,,,,=&&*>,>,,>,,,,,,,,>,-&&&,,>,>,,,,,,,*&&=,,,,,>,,,,,,,,,,=&&=,,,,,,,,,,,,&&&;,,,,,,,,',,,;&%&&%&-,,',,',,,,=&&&&,,,,,,,*%&&&&&&&&&&&&&&&*>,,',,',,,'&&&&-,,',',,',,',>&&&&>,',,',-&&&*,',',',',',','',-&&&&&&&&&&&&&&&*,',''',',*&&&&&=',',','','>*&&&&&&&&&&&&&*''''''''>&&&&,'''''''''''''*&&&&&&&&&&&&&&&&*,''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>,>>,>,>>,>,>>>>>,>>>>>,>,>,>,>,>>,>>,>>>,>>>,>>,>>>,>,>,>>>,,>,>,>,>>,,>>,>,>,>,>,>,>,,>,>,,>,,>,>,>>,,>,,>,>,>,,*&*,,>,,>,,>,>,,&%-,,,,,,,>,>,>,,,,,&&=,,,,,>,,,,,,;%&>,,>,,,,,,,,,,,,,;%&;,,,,,,,,,,,,=&&,,,,',,,,,,,,,&&&&&&,,,,,,,,,',-%&&*,',,',,*&&&&&&&&&&&&&&&*>,',,,,,',',*%&&-,',,,',,'',,>&&&&>,',','-&&&&',',',',',',','',;*&&&&&&&&&&&*-,'',','',,=&&&&&;''''''''''',=&&&&&&&&&&*-''',''''',&&&&>,''''''''''''>=&&&&&&&****&&&&&=''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>,>>>>>>>>>>>>>>>>,>>>>,>,>>>>>>>>>>>,>>,>>,>>,>,>>,>>,>>,>>>,>,>>,>,>>>,>,>>,>,>,>,>,>,>,>>,>,>,,>,>,,>,,,>,,>,,,>,,>>-&;>,,>,,>,,,>,,=&>,>,>,>,,,,,,,,,,,*&,,>,,,,,>,,,,,*&,,,,,,,,,,,,>,,,,,&*,,,,,,,,,,,,,>*=,,,,,,,,,,,,,,>*%&*>,,,,,',,,,,-****,,,,,,,*&&&*>-*&&&%&**>,',,',',,',,,=***-,',',',,,'',>****>',',,,-***=',',',',','',','','-***&&&***;,'',''','''',=*&*;',',',',',''''>=**&&&**-,'',''',''',*==*,'','''',''''''';-=*-;,,'''>=&&&&,'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>,>>>>>,>>>>>>>>>>>,>,>>,>>>>,>>>>>>,>,>,>,>,>>,>>,>>,>>>>,>,>,>,>>,>,>,>,>,>>,,>,>>,,>,>,>,>,>,>,>,>,,>,>>,>,>>,>>,,>,,>,>,,>,,>;,,>,,>,,,>,,>,,;,,,,,,,>,,>,>,>,>,,>,,,,,,,,,,,,,,>>>,,,>,,>,,,,,,,,,,>>,,,,,,,,,,,,,,>,,,,,,',,,,,,,,,,>>,,,',,,,,,,',,,,,,,',,',,*%&&*,,,,>>>,,,,',,,',,',,,',,,,,',,',','',,,',,,,',,','','',',',',','',',',',',','',,>>>','',',',','',',',,>,',''''''''',','''''>,>,'',''''''',''''''''''''''''''''''''''''''''''''**&&;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>;>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>,>>,>,>>>>>>>>,>>>,>,>,>>>>>>>>>>,>>,>>,>>,>,>>>,>>>,>,>>,>>,>,>,>>,>,>,>>,>,>,>,>,>,>,,>,>,,,>,,>,,,,>,>,>,>,,>,,>,,>,,,>,,>,>,,,,>,,>,>,>,,,>,,,,,,,,,>,,>,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,',,,,,',*&&&*,,',,,,',,,,',,,',,',','',',',',,,,,'',','',,',',,',',',',',',',,',',',',','',',''',',''','','',''''',''''',',',',''''','',''''''''',''''''','''''''''','''''''''''''''''''''''*&&&='''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>,>>>>>,>>>>>>>>>>,>>,>>>,>>>>>>>,>,>,>,>,>>,>>,>>>,>>>,,>>,>,>>,>,>>,>>,>,>,>,>,>,>,>,>,>,>,>,>>,>,>>,>,>,,>>,>,,>,,>,,>,>,,>,>,>,,,>,,,>,>,,,,,,,,,>,,,,>,,,,>,,,,,,,,,>,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,',,,,,,,,,',,,,',,,,,,,,,',,,,*&&&*,,,,',',,'',,'',,,',,,,,',,',,,'',',,',',,',',','',',',',',',','''',',''',',','',',''',,'','','',,',''',','''''''',','',''''',''',''',''''''''','',''''''''''''''''''''''''''''**&&-'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>>,>>>>,>>>>>>>>>,>,>,>>>>>>>>>>,>>>,>>,>,>>,>>>,>,>,>>,>>,>,,>,>,>,>>>,>,>,>,>,>,>,>,,>,>,,>,>,>>,,>,>,,>,>,>,>,,>,,,,,>,>,,>,,,>,,>,>,>,,,,>,>,,,>,,,,>,>,,>,,,,,,,,,>,,,,,,,>,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,,',,',,',,,',,*%&&*,',,,,,',,,',,,',,','',,',,',',,',',',,',',',,',,',',',',',',',',,','',,',','',','',','',',''','''',',',''',',','''''''','',''',''''''','''''''''''''''''''''''''-;''''''''''',*&&&;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>,>>>>>>,>,>>>>>>>>>,>,>,>,>>>>,>>>,>>>,>>,,>>,>>>,>,>,>>>>,>>>,>,,>>,>,>,>,>,>,>,>,>,,>,>,,>,,>,,>,>,,>,,,>,,>,>,>,>,,,,>,,>,,>,,,,,,>,>,,,,,,,,,>,,,,,,,,,,,>,,,,,,>,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,',,,',,',,,',,,,,,,,,,,*&&&*,,,',',,,',,,',,',,,,',',',',,',,',,',',',,',',,',',',',',',',',''',','','',',''',,''','','','',','','''',''''''',',',''''''''''','',''','','',''',''''''',''''';&&*;'''''''';*&&&*''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>,>>>>>>>,>>,>>>>>>,>,>,>>>>>>>>>>,,>>,>,>>,>>>,>>>,>>,,>>>>,>,,,>,>,>,>>,,>>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,,>,,>,>,>,>,,,>,,>,>,,>,,>,,,>,>,,,,,>,>,,>,,,,,>,,>,>,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,',,',',',*&&&*,,,,,,',,',',,',,',',,,',,,',,',,',',',,',',',',',',',',',',',',',',','',,',',',''',,'','',',''''','',','',',',''''''','',''','''''''''''''''''',''''''','''''',*&&&&*--,>--*&&&&&-''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>>>>>>>>>,>>,>>>>>>>,>>,>>>>>>,>,>,>,>,>>>>,>>>>,>>,>>,>,>,>>>,,>,>>>>>>,>,>>,>>>,,>,>,>,>,>,>,>,>,,>,>,>,>,>,>,>,,>,>,,,,>,,>,,,>,,,>,,>,,,>,,,,,>,>,,,,>,,,,>,,,,,,,,,>,,,,>,,,,,>,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,',,,,',',,',,,,,,,,,,,*%&&*,',',',,',,,',,',,,',',',',',',',,',,',',',',',',',',',',',','',','',',''',''','',''',',','''',',''',''',''''''',',',''''',''''','',''''''''''''''','''''''''''-&&&&&&&&&&&&&&&&&='''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>>>,>>>>>>>>>,>,>>>>>>>>,>,>>>>>>>>>>>,>,>>,>,>>,>>,>>,>>,>,>>>,>,,>,,>,>,>,>,,>>,>,>,>,>,>,>,>,>>,>,>,,,>,>,,,>,>,,,>>,>,>,,>,,,>,,,>,,>,,,>,>,,,,,>,>,,,>,,,,>,,>,,,,,,,>,,,,>,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,',,,',,,,,,,,,',,,,',,,,,,,',,',,',',,*&&&*,,,,,',,,',,,',,',',,',,,',,,',,',',',',,',,,',',',',',',',',,',',',',',,',','',',',''','',','',',''',''',',',''''''',','''',','''''','','','''''''''''''''''''';*&&&&&&&&&&&&&*;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>>>>>>>>>,>>>>>,>>,>,>>>>>>,>,>,>,>,>>>>>,>>>,>>,>>,>>,>,>>,>,>>>>,>>,>>,>,>>,>,>,>,>,>,>,>,>,,,>,,>,>>,,>,>,>,,,>>,,,>,,,>,>,>,>,>,,,>,,>,,,,,>,>,,,,,,,,,,>,,,,,,>,,>,,,,>,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,',',,,,,,',,,,,,*&&&*',',,',',',',,,',,,',,'',,',',,',',',,',',',',',',',',',',',''',','',',''',',','','',','',''','','',''','''''',',','''''','''''',','''''''''',''''''''''',''''''''>=*&*&&*&&&*-''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>,>>>>>>>>>>,>,>>>>>>>>>>>,>,>,>>,>>,>>,>>,>>>,>>,>>,,>,>,>>,>,>,>,>>,>,>,>,>,>,>,>>,>,>,>,,>>,>,,>,>>,,,>,,>,>,,,,,>,,,>,>,,>,,,>,>,,,,>,>,,>,,>,,,>,,>,,,,,,,,,,,,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',',,,,,,',,,,,,,',',,,,',',,-=-=-,,,',,,,,,,',',,',,',,,,',',',',,',',',',,',',',',',',',',',',','',',',',',''',',',','','','',''','',,'',',','''''',''','''','''''''''''',''''','''''''''''''''''''''>;;--;>,''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>,>>>>>>>>>>,>>>,>>>>,>>>>,>>,>>>>>,>>,>>,>>>>>,>,>,>,>,>>,>>>,>>,>>,>>,>>,,>,>,>,>>>,>,>,,>,>,>,>,,>,>,>,>,>,>,>,>,,>,>,>,,,>,>,,>,,,>,>,>,,>,>,>,,,,>,,,>,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,>,,>,,,,,,,,,,,,>,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,',,,',,,,,,',,,',,,',,,,',,,',',',',,,',,',','',,',,,',',,',',',',',,',',',',',',',',',',,','',','',,'',''','','',',''','','''''''''''',','','''','''',''','','''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>>>>>>>>,>>>>>>>>>>>,>,>>>>>>>>>>,>>,>>>,>>,>>,>,>,>>>,>>>,>,>>,>>>,>>>,>>>>,>,>,>,>,>,>,>,,>,>,,>,>>,>,,>,,>,>,>,,,>,,,>,,>,>,,>,,,>,,,>,>,>,,,>,,>,>,>,,>,>,,>,,>,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,',,,,,,,,,',,,,,,,',,,,,,,,,,,,,,',,,',,,',,,,',,,,',,,',',,,,',,',',,,'',',',,',',',',',',',',',',','',''',,','',''','',',','','''','','',',',','',','''','''''''','''','''''',''',''''','''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>,>>>,>>,>>,>,>>>>>,>,>,>,>,>>>>,>,>>,>>>>>>,>>>,>>,>,>>,>,>,>,>,,>>,,,>,>,>,>,>,>,>,>,>,>,>,,>,,,>,>,,>,,>,,>,>,>>,,,>,,>,,>,>,,,>,,,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,',,',,,,,',,',,,,',',',,',',',,,',,',',,'',,',',',',,,,'',',',',,'',,,',,',',',',',',',',',',',',','',,''',','',,'',,''',','',','','','''''''','''''','''','',''','''''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>,>>>>>>>>,>>>>>>>>>>,>>>>>,>>>>>>>>>>>>,>,>>>,>>>,>,>,>>,,>>,>,>>,>>,>>,>,>>,,>>>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,,>,>,,>,,>,>,,,>,,>,,,>,,,>,>,,,>,>,,,,,,,,,>,,,>,,>,,>,,,,,,,>,,>,,>,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,',,,',,,',,,','',,,',,',,',,,'',,',',',,,',',',',',',',','',','',,','',,''',''','','',''','',''',',',',''',',''','''''''''''','''','''','''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>,>>,>>>>>>>,>>,>,>,>,>,>,>>>>>,>>,>,>>>,>,>>>,>>,>>,>>,>,,>,>,>>>,,>,>,>,>,>,>,>,>,,>,>,,>,>,>,>,>,,>,>,,>,,>,,>,,>,,>,>,,>,,,,,>,,,,>,>,>,>,,,,>,,,,,,,,>,,>,,,,,,,,,,,,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,',,,,,,,,,',,,,,',',',,',,',',',',,,',,,,',,,,',,',,,,',,,,,',,',,',,',',,'',,,',',',,',',',',',',',',',,','',',''',',',',',',','','',''','','''''','''',''','','','','''',''',''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>,>>>,>>>>>>>>>>>,>>>>>>>>>>>,>>,>>>>>>>>>>>>>>>>>,>,>,>>>,>>,>>,>>,,>>,>>,>,>,>>>,>>>,,,>>>,>,>,>,>,>,>,>,>,>,>>,>,>,>,,,>,>,,>,>,>,,>,,>,,>,,,,>,,>,>,,,>,>,,,,,,,,>,,,,,>,>,,,,,,,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,',',,,,,,,,,,,,,,,,,,',,,,',,,',',,',,',',,'',',',,',',',,',',,''',,',',',',',',',',',',','','',',',,'',''',',''','',',''',',','',',',''',''','''''','''''',''''''''''''''',''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>,>>>>>>>>>>>,>>,>>>>>>>,>>>>,>,>>>>>>>,>,>,>,>,>,>,>,>>,>>>>,>>,>>,>>,>>,>,>,>>,>,>,>,>,>,>>>,,>,>,>,>,>,>,>,>,>,,>,,,>,,>,>>,>,,,>,,>,,>,,>,,>,,>,>,,,>,,,,>,,,,,>,>,>,,,>,>,,,,,,>,,>,,,,,,>,,>,,>,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,,,',,',',,',',,,',',,',,',,',,,',,,',,,',,',',,,',,',',',,,',',',',',',',',',',',','',',','','',',','','','','''',',''''',''''''',''',''',',''','',''',''''','',''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>,>,>>>>>>>>>>>>>>>>>>,>>,>,>,>>>,>>,>>,>>>,>>,>>>,>,>,>,>,>,>>,>,>,>,>,>,>,>,>,,>,>,>,>,>,,,,,>,>,>,,,>,>,,>,,,>,,,>,>,,>,>,,,>,,,,,,,,,,,,,,,>,,>,,,,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',',',,,,,,,,,,,,',,,,,,,,,,,',,',',,',,',,',,',,'',,',',',,'',',',',,',',',',',','','',',','',',',''',','',','',','','',',''',',',''',''',''''''''''''''''',''''''''',''''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>,>>,>>>>>,>>,>,>,>,>,>,>,>>>,>>,>>>>,>>,>>,>>,,>>,>>,,>,>>,>,>,>,>,>>,>,>,>,>,>,>,>,>>,>,>,>,>,>>>>,,>,,,>>,,>,>,,,>,,>,>,,,>,,,,,>,,>,>,>,>,>,,,>,,,,,,,>,,,,,,,,,,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,',,',,',,,,,,,',,',,',,',,,,,,,,,,',,',',',,,',',',',',,,',,,,',,',,',',,',,,',,',,',',,,',,','',',',',',',',,',','',',,',','',','','',','''','','','',''''''',''',''','',''','',','''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>,>>>>>>>>>,>>>>>>>,>>>>>>>>>,>>>>>>>>>>>>>>>>>>>,>>>,>>,>,>,>>>,>,>,>>,>,>,>>>,>,>>,>>,>>,,>,>,>,>,>,>,>,>,,,>,,>,,,>,,,,,>,,>>,,,>,,,>,>,,>,,,,>,,>,>,>,,,,,,,,,,,,,,>,,,>,,>,,,,>,,,,>,,>,,,,>,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,',,',,,,,,,,,,,,,,',,',',,,,,,,,,',,,,,,,,',,',,,',',,',,',',,',',',',,',',','',,',',,',',',',',','',',',',''','',',','','',''',',','''','',',',',',''',''','''''','''''''',''','',''''',''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>,>>>>>>>,>>>>>>>,>>>>>>,>>,>>,>>>,>>,>,>,>,>,>,>,>,>>>,>>>>,>>>>>,>>,>>>,>>,>>>,>,>,>,>,>,>,>>>,>,>,>,>,>,>,>,>>,>,>,>,>,,>>,>,>,,,>>,,>,>,,,>,,>,>,,>,,,,,,,,>,>,>,>,,>,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,',,,,,,,,,',,',',,,,',',',,,',,',',,,',,',,,',',,,',,',',',,,',,'',,',',',',',',',','',',',',',','',''',',',',',',''',','',''''''''''',''',''''',''''','',''''''''''','''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>,>>>>>>>>>>>>>,>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>,,>>,>,,>>,>>,,>>,>>,,>>,>>,>,>,>,>,,>,>,>,>,>,>,>,>,,,>,>,>,>,>>,,>,,,>,>,,,>,>,,>,,>,,,,>,>,,>,>,>,,,,,,,,,>,,,>,,>,,>,,>,,,,,,,,,>,,,,,,,,>,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,',',,,,,,,,,,,',',,,,,,',,,',,,',',,',,'',,,',',',,',,,''',',',,',',',',',',',',',,','','',',','',','','',','''',''','''',',',',',''',''','',''','''''''','','''''''',''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>,>>,>,>>,>>,>>,>,>,>,>,>,>,>>>,>>>>>,>>>>,>>,>>>,>>,>>>>,>,>>,>,>>,>>,>,>,>,>,>,>,>,>>,>,,>,,>,>,,>,,>,>,>,,>>,,,>,,>,,>,>,,,,>,,,,,,,>,>,>,>,,,,,,,,,>,,,,,,>,,,,>,,,,,>,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,',,,,,,,,,',,,,,,',,,',',',,,,',',',,',',,',,,,',,',,,'',,',,,',,'',,,,',',',',,',',',',',',','',',',',',',','',',''',''',,'',','',','','''''''',''',''''',''',','','''''',''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>,>>>>>,>>>,>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>,>,>>>,>,>>,>,>,>,>,>,,>,>>,,>>>,>,>,>,>,>,>,>,>,>,>,,>,>,>,>,>,,>,>,>,,>,,>,,,>>,,>,,>,,,>,>,,,>,>,>,,>,,,,,,,>,>,,>,,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,',,',,,,',,,,,,,,',,',,,,,,',,',,,',,,,,,,',,,,,,,,,,,',,',',,',,,',,,,',',',',',','',,,',',,',',',',',',',','',','','','',',''',',',',''',''','','','',',',',''',''',''''''''''''''''''''','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>,>>>,>,>,>>,>,>,>,>,>,>,>,>>,>>,>>,>>>>,>>>,>>,>>,>>>>,>,>>,,>,>>,>,>>,>,>,>,>,>,>,>,>,>,>,>,>>,,>,,>,,>,,>>,,,>,,>,,,>,,,>,>,,,,,,>,,,,>,>,,,,,,,,,>,,,,>,,,,,,,,,>,,>,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,',,,,,,,,,,,,,',',,,',',',',',,,',,,',,,',,'',',,',,',,,',',,'',,','',',',',',',',',','',',',',','',',,'','','',','','','','',''''''''',''','','','','','',','''''''',''','''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>,>>>>>>>>>>>,>>>>,>>>>,>>,>>>,>>>>>>>>>>>>>>>>>>>>>>>,>>,>>,>>,>,>>,,>>,>>,>>,,>,>,>,>>,>,>,>>,>,>,>,>,>,>,>,>,,>,,,>,,>,,>,>,>,>,,>,,,>>,,>,,>,>,>,,,,>,>,>,,,>,>,,,,>,,>,>,,,,,>,,,,,>,,,,>,,,,,,>,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,',,,,,,,,,,,,,,,,',,,,,,,',,,',,',,',,',,,,,',,,,,,,,,,',',,',,,',',',,,',',,',,',',,',',',',,,',',',',',',',',',,',',',',',','''',',''',','','','','''',',',',',''','''''''''''''''''''','''''''','''''''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
-">>>>>>>>>>>>>>>>>>>>,>>>>>,>>>>>,>>>>>>,>>>>>>>,>,>>,>,>,>,>,>,>,>>,>>>,>>,>>>,>>>,>>,>>,>>>,>>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,,>,>,,>,,>,>,,>,,,>,,,>,,,,,>,>,,,,,,,>,,,,,,>,,,,,,,,,>,,,,,>,,,,>,,,,,,,,,,,,,,,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,',,,,',,,,',,',,,,,,,,,,,',,,,,',',,,',',',',',,,,',,',',,,',,',,',',,',,',',',,',','',,',',',',',',',','',''',','','',,',',',',''','','','',',''''''''''',''''','','','','',''''''','''''''',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''"};
diff --git a/config/grub2/default b/config/grub2/default
new file mode 100644 (file)
index 0000000..603e78f
--- /dev/null
@@ -0,0 +1,7 @@
+GRUB_TIMEOUT=5
+GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
+GRUB_DEFAULT=saved
+# GRUB_TERMINAL="serial console"
+# GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200"
+GRUB_CMDLINE_LINUX="quiet rhgb"
+GRUB_DISABLE_RECOVERY="true"
diff --git a/config/install/fstab b/config/install/fstab
deleted file mode 100644 (file)
index 58297c2..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-/dev/ram0      /       squashfs
-/proc          /proc   proc
-none           /sys    sysfs
-none           /tmp    tmpfs
-none           /dev    tmpfs
diff --git a/config/install/group b/config/install/group
deleted file mode 100644 (file)
index 465a9cf..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-root:x:0:root
-tty:x:5:
-disk:x:6:
-uucp:x:14:
diff --git a/config/install/halt b/config/install/halt
deleted file mode 100644 (file)
index 90a0c80..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-# Clear screen
-/usr/bin/clear
-echo "Shutting down..."
-echo "Sending all processes the TERM signal..."
-/sbin/killall5 -15
-sleep 3
-echo "Sending all processes the KILL signal..."
-/sbin/killall5 -9
-sleep 3
-echo "Unmounting filesystems..."
-/bin/umount -a > /dev/null 2>&1
-echo "Unmounting root..."
-/bin/mount -n -o remount,ro /
-echo "Rebooting..."
-/sbin/reboot -f
diff --git a/config/install/hosts b/config/install/hosts
deleted file mode 100644 (file)
index f4fb350..0000000
+++ /dev/null
@@ -1 +0,0 @@
-localhost      127.0.0.1
diff --git a/config/install/nsswitch.conf b/config/install/nsswitch.conf
deleted file mode 100644 (file)
index da516c6..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-passwd:     files 
-shadow:     files 
-group:      files 
-hosts:      files
-services:   files
-networks:   files
-protocols:  files
-rpc:        files
-ethers:     files
-netmasks:   files     
-bootparams: files
-automount:  files 
-aliases:    files
-netgroup:   files
-publickey:  files
diff --git a/config/install/passwd b/config/install/passwd
deleted file mode 100644 (file)
index 365a8d7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-root::0:0:root:/:/bin/ash
diff --git a/config/install/profile b/config/install/profile
deleted file mode 100644 (file)
index 02c63b9..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/ash
-
-TERM=linux
-LANG=en_US.UTF-8
-export TERM LANG
-
-/usr/bin/unicode_start
diff --git a/config/install/rc_installer b/config/install/rc_installer
deleted file mode 100644 (file)
index c1dd5b6..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# IPFire Installer RC
-#
-
-echo >/proc/sys/kernel/printk "1 4 1 7"
-echo -n -e "\033[9;0]"
-
-ln -snf /proc/self/fd/0 /dev/stdin
-ln -snf /proc/self/fd/1 /dev/stdout
-ln -snf /proc/self/fd/2 /dev/stderr
-ln -s /proc/kcore /dev/core
-mount tmpfs -t tmpfs /tmp
-
-echo "Starting shells on tty2 and tty3 ..."
-/usr/local/bin/iowrap /dev/tty2 /bin/bash &
-/usr/local/bin/iowrap /dev/tty3 /bin/bash &
-
-echo "Loading Installer..."
-/bin/bash --login -c "/bin/install /dev/tty2"
-
-/etc/halt
diff --git a/config/install/shells b/config/install/shells
deleted file mode 100644 (file)
index 006aa38..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/bin/ash
diff --git a/config/rootfiles/common/armv5tel/dracut b/config/rootfiles/common/armv5tel/dracut
deleted file mode 100644 (file)
index 9c41aba..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#boot/ipfirerd-KVER-kirkwood.img
-#boot/ipfirerd-KVER-multi.img
-#boot/uInit-ipfire-kirkwood
-#boot/uInit-ipfire-multi
-etc/dracut.conf
-etc/dracut.conf.d
-#etc/dracut.conf.d/dracut.conf
-sbin/dracut
-sbin/dracut-catimages
-sbin/dracut-gencmdline
-sbin/lsinitrd
-sbin/mkinitrd
-usr/share/dracut
-usr/share/dracut/dracut-functions
-usr/share/dracut/modules.d
-usr/share/dracut/modules.d/60xen
-usr/share/dracut/modules.d/60xen/check
-usr/share/dracut/modules.d/60xen/install
-usr/share/dracut/modules.d/60xen/installkernel
-usr/share/dracut/modules.d/60xen/xen-pre-udev.sh
-usr/share/dracut/modules.d/90kernel-modules
-usr/share/dracut/modules.d/90kernel-modules/install
-usr/share/dracut/modules.d/90kernel-modules/installkernel
-usr/share/dracut/modules.d/90kernel-modules/parse-kernel.sh
-usr/share/dracut/modules.d/95debug
-usr/share/dracut/modules.d/95debug/check
-usr/share/dracut/modules.d/95debug/install
-usr/share/dracut/modules.d/95rootfs-block
-usr/share/dracut/modules.d/95rootfs-block/block-genrules.sh
-usr/share/dracut/modules.d/95rootfs-block/install
-usr/share/dracut/modules.d/95rootfs-block/mount-root.sh
-usr/share/dracut/modules.d/95rootfs-block/parse-block.sh
-usr/share/dracut/modules.d/95terminfo
-usr/share/dracut/modules.d/95terminfo/install
-usr/share/dracut/modules.d/95udev-rules
-usr/share/dracut/modules.d/95udev-rules/01-ignore.rules
-usr/share/dracut/modules.d/95udev-rules/59-persistent-storage-volid.rules
-usr/share/dracut/modules.d/95udev-rules/59-persistent-storage.rules
-usr/share/dracut/modules.d/95udev-rules/61-persistent-storage.rules
-usr/share/dracut/modules.d/95udev-rules/install
-usr/share/dracut/modules.d/95udev-rules/load-modules.sh
-usr/share/dracut/modules.d/98syslog
-usr/share/dracut/modules.d/98syslog/README
-usr/share/dracut/modules.d/98syslog/check
-usr/share/dracut/modules.d/98syslog/install
-usr/share/dracut/modules.d/98syslog/parse-syslog-opts.sh
-usr/share/dracut/modules.d/98syslog/rsyslog.conf
-usr/share/dracut/modules.d/98syslog/rsyslogd-start.sh
-usr/share/dracut/modules.d/98syslog/rsyslogd-stop.sh
-usr/share/dracut/modules.d/98syslog/syslog-cleanup.sh
-usr/share/dracut/modules.d/98syslog/syslog-genrules.sh
-usr/share/dracut/modules.d/99base
-usr/share/dracut/modules.d/99base/check
-usr/share/dracut/modules.d/99base/dracut-lib.sh
-usr/share/dracut/modules.d/99base/init
-usr/share/dracut/modules.d/99base/initqueue
-#usr/share/dracut/modules.d/99base/init~
-usr/share/dracut/modules.d/99base/install
-usr/share/dracut/modules.d/99base/loginit
-usr/share/dracut/modules.d/99base/parse-blacklist.sh
-usr/share/dracut/modules.d/99base/parse-root-opts.sh
-#usr/share/man/man5/dracut.conf.5
-#usr/share/man/man8/dracut-catimages.8
-#usr/share/man/man8/dracut-gencmdline.8
-#usr/share/man/man8/dracut.8
-sbin/switch_root
index dfe2e4869e8e472a8fd725d18663c024158fa1ef..5e40079a9fa317dfac347f542c2a703f2364a13b 100644 (file)
@@ -44,7 +44,6 @@ etc/rc.d/init.d/ipsec
 etc/rc.d/init.d/leds
 etc/rc.d/init.d/localnet
 etc/rc.d/init.d/mISDN
-#etc/rc.d/init.d/mdadm
 #etc/rc.d/init.d/mediatomb
 #etc/rc.d/init.d/messagebus
 #etc/rc.d/init.d/miau
index 4880b60ffe7a6bd4f18da36d5b0cee16cd14f7be..bccf0fa77ba06644047690bb39b851f8e14e2cdb 100644 (file)
@@ -1,5 +1,4 @@
 boot/System.map-KVER-ipfire-kirkwood
-#boot/System.map-ipfire-kirkwood
 boot/config-KVER-ipfire-kirkwood
 boot/dtb-KVER-ipfire-kirkwood
 #boot/dtb-KVER-ipfire-kirkwood/kirkwood-cloudbox.dtb
index 3c20c523634f8b7bdbd6ce1f38f90ccf4d0b2b09..abc9e2454c9fc16c6dc6b8627190a119a09b3c1f 100644 (file)
@@ -1,5 +1,4 @@
 boot/System.map-KVER-ipfire-multi
-#boot/System.map-ipfire-multi
 boot/config-KVER-ipfire-multi
 boot/dtb-KVER-ipfire-multi
 #boot/dtb-KVER-ipfire-multi/am335x-bone.dtb
index 01f9312ee890ec7b24675bad898ca674b8bd95e9..c10b51cf6ba7336157dee58158e958bbbd86a779 100644 (file)
@@ -1,5 +1,4 @@
 boot/System.map-KVER-ipfire-rpi
-#boot/System.map-ipfire-rpi
 boot/config-KVER-ipfire-rpi
 boot/kernel.img
 boot/vmlinuz-KVER-ipfire-rpi
index ecaeb1bdd2a8ede5fd5636451e5b6231af57adc3..84f587f3cdb458ab43f156b7d985f57a1fe2ec4f 100644 (file)
@@ -1,6 +1,59 @@
 bin/sh
 bin/bash
 #bin/bashbug
+#usr/share/doc/bash
+#usr/share/doc/bash/CHANGES
+#usr/share/doc/bash/COMPAT
+#usr/share/doc/bash/FAQ
+#usr/share/doc/bash/INTRO
+#usr/share/doc/bash/NEWS
+#usr/share/doc/bash/POSIX
+#usr/share/doc/bash/RBASH
+#usr/share/doc/bash/README
+#usr/share/doc/bash/bash.html
+#usr/share/doc/bash/bashref.html
 #usr/share/info/bash.info
+#usr/share/locale/af/LC_MESSAGES/bash.mo
+#usr/share/locale/bg/LC_MESSAGES/bash.mo
+#usr/share/locale/ca/LC_MESSAGES/bash.mo
+#usr/share/locale/cs/LC_MESSAGES/bash.mo
+#usr/share/locale/da/LC_MESSAGES/bash.mo
+#usr/share/locale/de/LC_MESSAGES/bash.mo
+#usr/share/locale/el/LC_MESSAGES/bash.mo
+#usr/share/locale/en@boldquot
+#usr/share/locale/en@boldquot/LC_MESSAGES
+#usr/share/locale/en@boldquot/LC_MESSAGES/bash.mo
+#usr/share/locale/en@quot
+#usr/share/locale/en@quot/LC_MESSAGES
+#usr/share/locale/en@quot/LC_MESSAGES/bash.mo
+#usr/share/locale/eo/LC_MESSAGES/bash.mo
+#usr/share/locale/es/LC_MESSAGES/bash.mo
+#usr/share/locale/et/LC_MESSAGES/bash.mo
+#usr/share/locale/fi/LC_MESSAGES/bash.mo
+#usr/share/locale/fr/LC_MESSAGES/bash.mo
+#usr/share/locale/ga/LC_MESSAGES/bash.mo
+#usr/share/locale/gl/LC_MESSAGES/bash.mo
+#usr/share/locale/hr/LC_MESSAGES/bash.mo
+#usr/share/locale/hu/LC_MESSAGES/bash.mo
+#usr/share/locale/id/LC_MESSAGES/bash.mo
+#usr/share/locale/it/LC_MESSAGES/bash.mo
+#usr/share/locale/ja/LC_MESSAGES/bash.mo
+#usr/share/locale/lt/LC_MESSAGES/bash.mo
+#usr/share/locale/nl/LC_MESSAGES/bash.mo
+#usr/share/locale/pl/LC_MESSAGES/bash.mo
+#usr/share/locale/pt_BR/LC_MESSAGES/bash.mo
+#usr/share/locale/ro/LC_MESSAGES/bash.mo
+#usr/share/locale/ru/LC_MESSAGES/bash.mo
+#usr/share/locale/sk/LC_MESSAGES/bash.mo
+#usr/share/locale/sl/LC_MESSAGES/bash.mo
+#usr/share/locale/sr
+#usr/share/locale/sr/LC_MESSAGES
+#usr/share/locale/sr/LC_MESSAGES/bash.mo
+#usr/share/locale/sv/LC_MESSAGES/bash.mo
+#usr/share/locale/tr/LC_MESSAGES/bash.mo
+#usr/share/locale/uk/LC_MESSAGES/bash.mo
+#usr/share/locale/vi/LC_MESSAGES/bash.mo
+#usr/share/locale/zh_CN/LC_MESSAGES/bash.mo
+#usr/share/locale/zh_TW/LC_MESSAGES/bash.mo
 #usr/share/man/man1/bash.1
 #usr/share/man/man1/bashbug.1
index 81a953958aaea2980823ae55852f0f0ebe9f21a1..069d0c4f6d94f8e054ba8f47773d2719421df6d4 100644 (file)
@@ -2,6 +2,7 @@
 #usr/bin/cmake
 #usr/bin/cpack
 #usr/bin/ctest
+#usr/doc
 #usr/doc/cmake-2.6
 #usr/doc/cmake-2.6/ccmake.docbook
 #usr/doc/cmake-2.6/ccmake.html
index c08e228a94d388a0b0df6bbe1ac691cff117e723..d7f2c76768e443bd1fc12925babb7cfdd853832a 100644 (file)
@@ -1,4 +1,4 @@
-#bin/[
+bin/[
 bin/chgrp
 bin/chmod
 bin/chown
@@ -22,69 +22,244 @@ bin/true
 bin/uname
 etc/DIR_COLORS
 usr/bin/[
+usr/bin/arch
+usr/bin/base64
 usr/bin/basename
-#usr/bin/cksum
-#usr/bin/comm
-#usr/bin/csplit
+usr/bin/chcon
+usr/bin/cksum
+usr/bin/comm
+usr/bin/csplit
 usr/bin/cut
-#usr/bin/dir
+usr/bin/dir
 usr/bin/dircolors
 usr/bin/dirname
 usr/bin/du
 usr/bin/env
-#usr/bin/expand
+usr/bin/expand
 usr/bin/expr
-#usr/bin/factor
-#usr/bin/fmt
+usr/bin/factor
+usr/bin/fmt
 usr/bin/fold
 usr/bin/groups
 usr/bin/hostid
 usr/bin/id
 usr/bin/install
 usr/bin/join
-#usr/bin/link
-#usr/bin/logname
+usr/bin/link
+usr/bin/logname
 usr/bin/md5sum
 usr/bin/mkfifo
-#usr/bin/nl
+usr/bin/mktemp
+usr/bin/nl
 usr/bin/nohup
-#usr/bin/od
+usr/bin/nproc
+usr/bin/numfmt
+usr/bin/od
 usr/bin/paste
-#usr/bin/pathchk
-#usr/bin/pinky
-#usr/bin/pr
-#usr/bin/printenv
+usr/bin/pathchk
+usr/bin/pinky
+usr/bin/pr
+usr/bin/printenv
 usr/bin/printf
-#usr/bin/ptx
+usr/bin/ptx
 usr/bin/readlink
+usr/bin/realpath
+usr/bin/runcon
 usr/bin/seq
 usr/bin/sha1sum
+usr/bin/sha224sum
+usr/bin/sha256sum
+usr/bin/sha384sum
+usr/bin/sha512sum
 usr/bin/shred
+usr/bin/shuf
 usr/bin/sort
 usr/bin/split
 usr/bin/stat
-#usr/bin/sum
-#usr/bin/tac
+#usr/bin/stdbuf
+usr/bin/sum
+usr/bin/tac
 usr/bin/tail
 usr/bin/tee
 usr/bin/test
+usr/bin/timeout
 usr/bin/touch
 usr/bin/tr
-#usr/bin/tsort
+usr/bin/truncate
+usr/bin/tsort
 usr/bin/tty
 usr/bin/unexpand
 usr/bin/uniq
 usr/bin/unlink
-#usr/bin/users
-#usr/bin/vdir
+usr/bin/uptime
+usr/bin/users
+usr/bin/vdir
 usr/bin/wc
 usr/bin/who
 usr/bin/whoami
 usr/bin/yes
+#usr/libexec
+#usr/libexec/coreutils
+#usr/libexec/coreutils/libstdbuf.so
 usr/sbin/chroot
 #usr/share/info/coreutils.info
+#usr/share/locale/af
+#usr/share/locale/af/LC_MESSAGES
+#usr/share/locale/af/LC_MESSAGES/coreutils.mo
+#usr/share/locale/af/LC_TIME
+#usr/share/locale/af/LC_TIME/coreutils.mo
+#usr/share/locale/be/LC_MESSAGES/coreutils.mo
+#usr/share/locale/be/LC_TIME
+#usr/share/locale/be/LC_TIME/coreutils.mo
+#usr/share/locale/bg/LC_MESSAGES/coreutils.mo
+#usr/share/locale/bg/LC_TIME
+#usr/share/locale/bg/LC_TIME/coreutils.mo
+#usr/share/locale/ca/LC_MESSAGES/coreutils.mo
+#usr/share/locale/ca/LC_TIME
+#usr/share/locale/ca/LC_TIME/coreutils.mo
+#usr/share/locale/cs/LC_MESSAGES/coreutils.mo
+#usr/share/locale/cs/LC_TIME
+#usr/share/locale/cs/LC_TIME/coreutils.mo
+#usr/share/locale/da/LC_MESSAGES/coreutils.mo
+#usr/share/locale/da/LC_TIME
+#usr/share/locale/da/LC_TIME/coreutils.mo
+#usr/share/locale/de/LC_MESSAGES/coreutils.mo
+#usr/share/locale/de/LC_TIME
+#usr/share/locale/de/LC_TIME/coreutils.mo
+#usr/share/locale/el/LC_MESSAGES/coreutils.mo
+#usr/share/locale/el/LC_TIME
+#usr/share/locale/el/LC_TIME/coreutils.mo
+#usr/share/locale/eo
+#usr/share/locale/eo/LC_MESSAGES
+#usr/share/locale/eo/LC_MESSAGES/coreutils.mo
+#usr/share/locale/eo/LC_TIME
+#usr/share/locale/eo/LC_TIME/coreutils.mo
+#usr/share/locale/es/LC_MESSAGES/coreutils.mo
+#usr/share/locale/es/LC_TIME
+#usr/share/locale/es/LC_TIME/coreutils.mo
+#usr/share/locale/et
+#usr/share/locale/et/LC_MESSAGES
+#usr/share/locale/et/LC_MESSAGES/coreutils.mo
+#usr/share/locale/et/LC_TIME
+#usr/share/locale/et/LC_TIME/coreutils.mo
+#usr/share/locale/eu
+#usr/share/locale/eu/LC_MESSAGES
+#usr/share/locale/eu/LC_MESSAGES/coreutils.mo
+#usr/share/locale/eu/LC_TIME
+#usr/share/locale/eu/LC_TIME/coreutils.mo
+#usr/share/locale/fi/LC_MESSAGES/coreutils.mo
+#usr/share/locale/fi/LC_TIME
+#usr/share/locale/fi/LC_TIME/coreutils.mo
+#usr/share/locale/fr/LC_MESSAGES/coreutils.mo
+#usr/share/locale/fr/LC_TIME
+#usr/share/locale/fr/LC_TIME/coreutils.mo
+#usr/share/locale/ga
+#usr/share/locale/ga/LC_MESSAGES
+#usr/share/locale/ga/LC_MESSAGES/coreutils.mo
+#usr/share/locale/ga/LC_TIME
+#usr/share/locale/ga/LC_TIME/coreutils.mo
+#usr/share/locale/gl/LC_MESSAGES/coreutils.mo
+#usr/share/locale/gl/LC_TIME
+#usr/share/locale/gl/LC_TIME/coreutils.mo
+#usr/share/locale/hr/LC_MESSAGES/coreutils.mo
+#usr/share/locale/hr/LC_TIME
+#usr/share/locale/hr/LC_TIME/coreutils.mo
+#usr/share/locale/hu/LC_MESSAGES/coreutils.mo
+#usr/share/locale/hu/LC_TIME
+#usr/share/locale/hu/LC_TIME/coreutils.mo
+#usr/share/locale/ia
+#usr/share/locale/ia/LC_MESSAGES
+#usr/share/locale/ia/LC_MESSAGES/coreutils.mo
+#usr/share/locale/ia/LC_TIME
+#usr/share/locale/ia/LC_TIME/coreutils.mo
+#usr/share/locale/id/LC_MESSAGES/coreutils.mo
+#usr/share/locale/id/LC_TIME
+#usr/share/locale/id/LC_TIME/coreutils.mo
+#usr/share/locale/it/LC_MESSAGES/coreutils.mo
+#usr/share/locale/it/LC_TIME
+#usr/share/locale/it/LC_TIME/coreutils.mo
+#usr/share/locale/ja/LC_MESSAGES/coreutils.mo
+#usr/share/locale/ja/LC_TIME
+#usr/share/locale/ja/LC_TIME/coreutils.mo
+#usr/share/locale/kk
+#usr/share/locale/kk/LC_MESSAGES
+#usr/share/locale/kk/LC_MESSAGES/coreutils.mo
+#usr/share/locale/kk/LC_TIME
+#usr/share/locale/kk/LC_TIME/coreutils.mo
+#usr/share/locale/ko/LC_MESSAGES/coreutils.mo
+#usr/share/locale/ko/LC_TIME
+#usr/share/locale/ko/LC_TIME/coreutils.mo
+#usr/share/locale/lg
+#usr/share/locale/lg/LC_MESSAGES
+#usr/share/locale/lg/LC_MESSAGES/coreutils.mo
+#usr/share/locale/lg/LC_TIME
+#usr/share/locale/lg/LC_TIME/coreutils.mo
+#usr/share/locale/lt/LC_MESSAGES/coreutils.mo
+#usr/share/locale/lt/LC_TIME
+#usr/share/locale/lt/LC_TIME/coreutils.mo
+#usr/share/locale/ms
+#usr/share/locale/ms/LC_MESSAGES
+#usr/share/locale/ms/LC_MESSAGES/coreutils.mo
+#usr/share/locale/ms/LC_TIME
+#usr/share/locale/ms/LC_TIME/coreutils.mo
+#usr/share/locale/nb/LC_MESSAGES/coreutils.mo
+#usr/share/locale/nb/LC_TIME
+#usr/share/locale/nb/LC_TIME/coreutils.mo
+#usr/share/locale/nl/LC_MESSAGES/coreutils.mo
+#usr/share/locale/nl/LC_TIME
+#usr/share/locale/nl/LC_TIME/coreutils.mo
+#usr/share/locale/pl/LC_MESSAGES/coreutils.mo
+#usr/share/locale/pl/LC_TIME
+#usr/share/locale/pl/LC_TIME/coreutils.mo
+#usr/share/locale/pt
+#usr/share/locale/pt/LC_MESSAGES
+#usr/share/locale/pt/LC_MESSAGES/coreutils.mo
+#usr/share/locale/pt/LC_TIME
+#usr/share/locale/pt/LC_TIME/coreutils.mo
+#usr/share/locale/pt_BR/LC_MESSAGES/coreutils.mo
+#usr/share/locale/pt_BR/LC_TIME
+#usr/share/locale/pt_BR/LC_TIME/coreutils.mo
+#usr/share/locale/ro
+#usr/share/locale/ro/LC_MESSAGES
+#usr/share/locale/ro/LC_MESSAGES/coreutils.mo
+#usr/share/locale/ro/LC_TIME
+#usr/share/locale/ro/LC_TIME/coreutils.mo
+#usr/share/locale/ru/LC_MESSAGES/coreutils.mo
+#usr/share/locale/ru/LC_TIME
+#usr/share/locale/ru/LC_TIME/coreutils.mo
+#usr/share/locale/sk/LC_MESSAGES/coreutils.mo
+#usr/share/locale/sk/LC_TIME
+#usr/share/locale/sk/LC_TIME/coreutils.mo
+#usr/share/locale/sl
+#usr/share/locale/sl/LC_MESSAGES
+#usr/share/locale/sl/LC_MESSAGES/coreutils.mo
+#usr/share/locale/sl/LC_TIME
+#usr/share/locale/sl/LC_TIME/coreutils.mo
+#usr/share/locale/sv/LC_MESSAGES/coreutils.mo
+#usr/share/locale/sv/LC_TIME
+#usr/share/locale/sv/LC_TIME/coreutils.mo
+#usr/share/locale/tr/LC_MESSAGES/coreutils.mo
+#usr/share/locale/tr/LC_TIME
+#usr/share/locale/tr/LC_TIME/coreutils.mo
+#usr/share/locale/uk
+#usr/share/locale/uk/LC_MESSAGES
+#usr/share/locale/uk/LC_MESSAGES/coreutils.mo
+#usr/share/locale/uk/LC_TIME
+#usr/share/locale/uk/LC_TIME/coreutils.mo
+#usr/share/locale/vi/LC_MESSAGES/coreutils.mo
+#usr/share/locale/vi/LC_TIME
+#usr/share/locale/vi/LC_TIME/coreutils.mo
+#usr/share/locale/zh_CN/LC_MESSAGES/coreutils.mo
+#usr/share/locale/zh_CN/LC_TIME
+#usr/share/locale/zh_CN/LC_TIME/coreutils.mo
+#usr/share/locale/zh_TW/LC_MESSAGES/coreutils.mo
+#usr/share/locale/zh_TW/LC_TIME
+#usr/share/locale/zh_TW/LC_TIME/coreutils.mo
+#usr/share/man/man1/arch.1
+#usr/share/man/man1/base64.1
 #usr/share/man/man1/basename.1
 #usr/share/man/man1/cat.1
+#usr/share/man/man1/chcon.1
 #usr/share/man/man1/chroot.1
 #usr/share/man/man1/cksum.1
 #usr/share/man/man1/comm.1
@@ -103,15 +278,17 @@ usr/sbin/chroot
 #usr/share/man/man1/groups.1
 #usr/share/man/man1/head.1
 #usr/share/man/man1/hostid.1
-#usr/share/man/man1/hostname.1
 #usr/share/man/man1/id.1
 #usr/share/man/man1/join.1
 #usr/share/man/man1/link.1
 #usr/share/man/man1/logname.1
 #usr/share/man/man1/md5sum.1
+#usr/share/man/man1/mktemp.1
 #usr/share/man/man1/nice.1
 #usr/share/man/man1/nl.1
 #usr/share/man/man1/nohup.1
+#usr/share/man/man1/nproc.1
+#usr/share/man/man1/numfmt.1
 #usr/share/man/man1/od.1
 #usr/share/man/man1/paste.1
 #usr/share/man/man1/pathchk.1
@@ -122,13 +299,21 @@ usr/sbin/chroot
 #usr/share/man/man1/ptx.1
 #usr/share/man/man1/pwd.1
 #usr/share/man/man1/readlink.1
+#usr/share/man/man1/realpath.1
+#usr/share/man/man1/runcon.1
 #usr/share/man/man1/seq.1
 #usr/share/man/man1/sha1sum.1
+#usr/share/man/man1/sha224sum.1
+#usr/share/man/man1/sha256sum.1
+#usr/share/man/man1/sha384sum.1
+#usr/share/man/man1/sha512sum.1
 #usr/share/man/man1/shred.1
+#usr/share/man/man1/shuf.1
 #usr/share/man/man1/sleep.1
 #usr/share/man/man1/sort.1
 #usr/share/man/man1/split.1
 #usr/share/man/man1/stat.1
+#usr/share/man/man1/stdbuf.1
 #usr/share/man/man1/stty.1
 #usr/share/man/man1/sum.1
 #usr/share/man/man1/sync.1
@@ -136,14 +321,17 @@ usr/sbin/chroot
 #usr/share/man/man1/tail.1
 #usr/share/man/man1/tee.1
 #usr/share/man/man1/test.1
+#usr/share/man/man1/timeout.1
 #usr/share/man/man1/tr.1
 #usr/share/man/man1/true.1
+#usr/share/man/man1/truncate.1
 #usr/share/man/man1/tsort.1
 #usr/share/man/man1/tty.1
 #usr/share/man/man1/uname.1
 #usr/share/man/man1/unexpand.1
 #usr/share/man/man1/uniq.1
 #usr/share/man/man1/unlink.1
+#usr/share/man/man1/uptime.1
 #usr/share/man/man1/users.1
 #usr/share/man/man1/wc.1
 #usr/share/man/man1/who.1
diff --git a/config/rootfiles/common/dracut b/config/rootfiles/common/dracut
new file mode 100644 (file)
index 0000000..e2b9162
--- /dev/null
@@ -0,0 +1,137 @@
+etc/dracut.conf
+etc/dracut.conf.d
+usr/bin/dracut
+usr/bin/dracut-catimages
+#usr/bin/lsinitrd
+#usr/bin/mkinitrd
+usr/lib/dracut
+#usr/lib/dracut/dracut-functions
+#usr/lib/dracut/dracut-functions.sh
+#usr/lib/dracut/dracut-initramfs-restore
+#usr/lib/dracut/dracut-install
+#usr/lib/dracut/dracut-logger.sh
+#usr/lib/dracut/dracut-version.sh
+#usr/lib/dracut/dracut.conf.d
+#usr/lib/dracut/modules.d
+#usr/lib/dracut/modules.d/00bash
+#usr/lib/dracut/modules.d/00bash/module-setup.sh
+#usr/lib/dracut/modules.d/02caps
+#usr/lib/dracut/modules.d/02caps/README
+#usr/lib/dracut/modules.d/02caps/caps.sh
+#usr/lib/dracut/modules.d/02caps/module-setup.sh
+#usr/lib/dracut/modules.d/03rescue
+#usr/lib/dracut/modules.d/03rescue/module-setup.sh
+#usr/lib/dracut/modules.d/04watchdog
+#usr/lib/dracut/modules.d/04watchdog/module-setup.sh
+#usr/lib/dracut/modules.d/04watchdog/watchdog-stop.sh
+#usr/lib/dracut/modules.d/04watchdog/watchdog.sh
+#usr/lib/dracut/modules.d/10i18n
+#usr/lib/dracut/modules.d/10i18n/10-console.rules
+#usr/lib/dracut/modules.d/10i18n/README
+#usr/lib/dracut/modules.d/10i18n/console_init.sh
+#usr/lib/dracut/modules.d/10i18n/module-setup.sh
+#usr/lib/dracut/modules.d/10i18n/parse-i18n.sh
+#usr/lib/dracut/modules.d/50drm
+#usr/lib/dracut/modules.d/50drm/module-setup.sh
+#usr/lib/dracut/modules.d/90kernel-modules
+#usr/lib/dracut/modules.d/90kernel-modules/insmodpost.sh
+#usr/lib/dracut/modules.d/90kernel-modules/module-setup.sh
+#usr/lib/dracut/modules.d/90kernel-modules/parse-kernel.sh
+#usr/lib/dracut/modules.d/90mdraid
+#usr/lib/dracut/modules.d/90mdraid/59-persistent-storage-md.rules
+#usr/lib/dracut/modules.d/90mdraid/65-md-incremental-imsm.rules
+#usr/lib/dracut/modules.d/90mdraid/md-noddf.sh
+#usr/lib/dracut/modules.d/90mdraid/md-noimsm.sh
+#usr/lib/dracut/modules.d/90mdraid/md-shutdown.sh
+#usr/lib/dracut/modules.d/90mdraid/mdmon-pre-shutdown.sh
+#usr/lib/dracut/modules.d/90mdraid/mdmon-pre-udev.sh
+#usr/lib/dracut/modules.d/90mdraid/mdraid-cleanup.sh
+#usr/lib/dracut/modules.d/90mdraid/mdraid-needshutdown.sh
+#usr/lib/dracut/modules.d/90mdraid/mdraid-waitclean.sh
+#usr/lib/dracut/modules.d/90mdraid/mdraid_start.sh
+#usr/lib/dracut/modules.d/90mdraid/module-setup.sh
+#usr/lib/dracut/modules.d/90mdraid/parse-md.sh
+#usr/lib/dracut/modules.d/95debug
+#usr/lib/dracut/modules.d/95debug/module-setup.sh
+#usr/lib/dracut/modules.d/95fstab-sys
+#usr/lib/dracut/modules.d/95fstab-sys/module-setup.sh
+#usr/lib/dracut/modules.d/95fstab-sys/mount-sys.sh
+#usr/lib/dracut/modules.d/95rootfs-block
+#usr/lib/dracut/modules.d/95rootfs-block/block-genrules.sh
+#usr/lib/dracut/modules.d/95rootfs-block/module-setup.sh
+#usr/lib/dracut/modules.d/95rootfs-block/mount-root.sh
+#usr/lib/dracut/modules.d/95rootfs-block/parse-block.sh
+#usr/lib/dracut/modules.d/95rootfs-block/rootfallback.sh
+#usr/lib/dracut/modules.d/95terminfo
+#usr/lib/dracut/modules.d/95terminfo/module-setup.sh
+#usr/lib/dracut/modules.d/95udev-rules
+#usr/lib/dracut/modules.d/95udev-rules/59-persistent-storage.rules
+#usr/lib/dracut/modules.d/95udev-rules/61-persistent-storage.rules
+#usr/lib/dracut/modules.d/95udev-rules/load-modules.sh
+#usr/lib/dracut/modules.d/95udev-rules/module-setup.sh
+#usr/lib/dracut/modules.d/95virtfs
+#usr/lib/dracut/modules.d/95virtfs/module-setup.sh
+#usr/lib/dracut/modules.d/95virtfs/mount-virtfs.sh
+#usr/lib/dracut/modules.d/95virtfs/parse-virtfs.sh
+#usr/lib/dracut/modules.d/97biosdevname
+#usr/lib/dracut/modules.d/97biosdevname/module-setup.sh
+#usr/lib/dracut/modules.d/97biosdevname/parse-biosdevname.sh
+#usr/lib/dracut/modules.d/98integrity
+#usr/lib/dracut/modules.d/98integrity/README
+#usr/lib/dracut/modules.d/98integrity/evm-enable.sh
+#usr/lib/dracut/modules.d/98integrity/ima-policy-load.sh
+#usr/lib/dracut/modules.d/98integrity/module-setup.sh
+#usr/lib/dracut/modules.d/98pollcdrom
+#usr/lib/dracut/modules.d/98pollcdrom/module-setup.sh
+#usr/lib/dracut/modules.d/98pollcdrom/pollcdrom.sh
+#usr/lib/dracut/modules.d/98syslog
+#usr/lib/dracut/modules.d/98syslog/README
+#usr/lib/dracut/modules.d/98syslog/module-setup.sh
+#usr/lib/dracut/modules.d/98syslog/parse-syslog-opts.sh
+#usr/lib/dracut/modules.d/98syslog/rsyslog.conf
+#usr/lib/dracut/modules.d/98syslog/rsyslogd-start.sh
+#usr/lib/dracut/modules.d/98syslog/rsyslogd-stop.sh
+#usr/lib/dracut/modules.d/98syslog/syslog-cleanup.sh
+#usr/lib/dracut/modules.d/98syslog/syslog-genrules.sh
+#usr/lib/dracut/modules.d/99base
+#usr/lib/dracut/modules.d/99base/dracut-lib.sh
+#usr/lib/dracut/modules.d/99base/init.sh
+#usr/lib/dracut/modules.d/99base/initqueue.sh
+#usr/lib/dracut/modules.d/99base/loginit.sh
+#usr/lib/dracut/modules.d/99base/module-setup.sh
+#usr/lib/dracut/modules.d/99base/parse-root-opts.sh
+#usr/lib/dracut/modules.d/99base/rdsosreport.sh
+#usr/lib/dracut/modules.d/99fs-lib
+#usr/lib/dracut/modules.d/99fs-lib/fs-lib.sh
+#usr/lib/dracut/modules.d/99fs-lib/module-setup.sh
+#usr/lib/dracut/modules.d/99img-lib
+#usr/lib/dracut/modules.d/99img-lib/img-lib.sh
+#usr/lib/dracut/modules.d/99img-lib/module-setup.sh
+#usr/lib/dracut/modules.d/99shutdown
+#usr/lib/dracut/modules.d/99shutdown/module-setup.sh
+#usr/lib/dracut/modules.d/99shutdown/shutdown.sh
+#usr/lib/dracut/skipcpio
+#usr/lib/kernel
+#usr/lib/kernel/install.d
+#usr/lib/kernel/install.d/50-dracut.install
+#usr/lib/kernel/install.d/51-dracut-rescue.install
+#usr/share/bash-completion/completions/dracut
+#usr/share/bash-completion/completions/lsinitrd
+#usr/share/man/man1/lsinitrd.1
+#usr/share/man/man5/dracut.conf.5
+#usr/share/man/man7/dracut.bootup.7
+#usr/share/man/man7/dracut.cmdline.7
+#usr/share/man/man7/dracut.kernel.7
+#usr/share/man/man7/dracut.modules.7
+#usr/share/man/man8/dracut-catimages.8
+#usr/share/man/man8/dracut-cmdline.service.8
+#usr/share/man/man8/dracut-initqueue.service.8
+#usr/share/man/man8/dracut-mount.service.8
+#usr/share/man/man8/dracut-pre-mount.service.8
+#usr/share/man/man8/dracut-pre-pivot.service.8
+#usr/share/man/man8/dracut-pre-trigger.service.8
+#usr/share/man/man8/dracut-pre-udev.service.8
+#usr/share/man/man8/dracut-shutdown.service.8
+#usr/share/man/man8/dracut.8
+#usr/share/man/man8/mkinitrd-suse.8
+#usr/share/man/man8/mkinitrd.8
index 7c59b98f7373fcf016cf5a883291089744c49cef..83cbfc4508e5f75896f42b2f251c3aa854882494 100644 (file)
@@ -5,5 +5,6 @@ bin/nisdomainname
 bin/ypdomainname
 #usr/share/man/man1/dnsdomainname.1
 #usr/share/man/man1/domainname.1
+#usr/share/man/man1/hostname.1
 #usr/share/man/man1/nisdomainname.1
 #usr/share/man/man1/ypdomainname.1
diff --git a/config/rootfiles/common/i586/dracut b/config/rootfiles/common/i586/dracut
deleted file mode 100644 (file)
index 27d8243..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-#boot/ipfirerd-KVER.img
-etc/dracut.conf
-etc/dracut.conf.d
-#etc/dracut.conf.d/dracut.conf
-sbin/dracut
-sbin/dracut-catimages
-sbin/dracut-gencmdline
-sbin/lsinitrd
-sbin/mkinitrd
-usr/share/dracut
-usr/share/dracut/dracut-functions
-usr/share/dracut/modules.d
-usr/share/dracut/modules.d/60xen
-usr/share/dracut/modules.d/60xen/check
-usr/share/dracut/modules.d/60xen/install
-usr/share/dracut/modules.d/60xen/installkernel
-usr/share/dracut/modules.d/60xen/xen-pre-udev.sh
-usr/share/dracut/modules.d/90kernel-modules
-usr/share/dracut/modules.d/90kernel-modules/install
-usr/share/dracut/modules.d/90kernel-modules/installkernel
-usr/share/dracut/modules.d/90kernel-modules/parse-kernel.sh
-usr/share/dracut/modules.d/95debug
-usr/share/dracut/modules.d/95debug/check
-usr/share/dracut/modules.d/95debug/install
-usr/share/dracut/modules.d/95rootfs-block
-usr/share/dracut/modules.d/95rootfs-block/block-genrules.sh
-usr/share/dracut/modules.d/95rootfs-block/install
-usr/share/dracut/modules.d/95rootfs-block/mount-root.sh
-usr/share/dracut/modules.d/95rootfs-block/parse-block.sh
-usr/share/dracut/modules.d/95terminfo
-usr/share/dracut/modules.d/95terminfo/install
-usr/share/dracut/modules.d/95udev-rules
-usr/share/dracut/modules.d/95udev-rules/01-ignore.rules
-usr/share/dracut/modules.d/95udev-rules/59-persistent-storage-volid.rules
-usr/share/dracut/modules.d/95udev-rules/59-persistent-storage.rules
-usr/share/dracut/modules.d/95udev-rules/61-persistent-storage.rules
-usr/share/dracut/modules.d/95udev-rules/install
-usr/share/dracut/modules.d/95udev-rules/load-modules.sh
-usr/share/dracut/modules.d/98syslog
-usr/share/dracut/modules.d/98syslog/README
-usr/share/dracut/modules.d/98syslog/check
-usr/share/dracut/modules.d/98syslog/install
-usr/share/dracut/modules.d/98syslog/parse-syslog-opts.sh
-usr/share/dracut/modules.d/98syslog/rsyslog.conf
-usr/share/dracut/modules.d/98syslog/rsyslogd-start.sh
-usr/share/dracut/modules.d/98syslog/rsyslogd-stop.sh
-usr/share/dracut/modules.d/98syslog/syslog-cleanup.sh
-usr/share/dracut/modules.d/98syslog/syslog-genrules.sh
-usr/share/dracut/modules.d/99base
-usr/share/dracut/modules.d/99base/check
-usr/share/dracut/modules.d/99base/dracut-lib.sh
-usr/share/dracut/modules.d/99base/init
-usr/share/dracut/modules.d/99base/initqueue
-#usr/share/dracut/modules.d/99base/init~
-usr/share/dracut/modules.d/99base/install
-usr/share/dracut/modules.d/99base/loginit
-usr/share/dracut/modules.d/99base/parse-blacklist.sh
-usr/share/dracut/modules.d/99base/parse-root-opts.sh
-#usr/share/man/man5/dracut.conf.5
-#usr/share/man/man8/dracut-catimages.8
-#usr/share/man/man8/dracut-gencmdline.8
-#usr/share/man/man8/dracut.8
-sbin/switch_root
index de6a53b5cff18f3432acf5d080e0bc25034b758e..53301441039e138cc0f25ee02dc47ecbbc0d46df 100644 (file)
 #boot/grub
-boot/grub/default
-boot/grub/grub.conf
-boot/grub/ipfire.xpm.gz
-boot/grub/stage1
-boot/grub/stage2
-#usr/bin/mbchk
+boot/grub/grub.cfg
+#etc/bash_completion.d
+#etc/bash_completion.d/grub
+etc/default/grub
+etc/grub.d
+etc/grub.d/00_header
+etc/grub.d/10_linux
+etc/grub.d/20_linux_xen
+etc/grub.d/30_os-prober
+etc/grub.d/40_custom
+etc/grub.d/41_custom
+etc/grub.d/README
+etc/grub2.cfg
+usr/bin/grub-editenv
+usr/bin/grub-fstest
+usr/bin/grub-kbdcomp
+usr/bin/grub-menulst2cfg
+usr/bin/grub-mkimage
+usr/bin/grub-mklayout
+usr/bin/grub-mkpasswd-pbkdf2
+usr/bin/grub-mkrelpath
+usr/bin/grub-mkrescue
+usr/bin/grub-mkstandalone
+usr/bin/grub-script-check
 usr/lib/grub
-#usr/lib/grub/i386-pc
-#usr/lib/grub/i386-pc/e2fs_stage1_5
-#usr/lib/grub/i386-pc/fat_stage1_5
-#usr/lib/grub/i386-pc/ffs_stage1_5
-#usr/lib/grub/i386-pc/iso9660_stage1_5
-#usr/lib/grub/i386-pc/jfs_stage1_5
-#usr/lib/grub/i386-pc/minix_stage1_5
-#usr/lib/grub/i386-pc/reiserfs_stage1_5
-#usr/lib/grub/i386-pc/stage1
-#usr/lib/grub/i386-pc/stage2
-#usr/lib/grub/i386-pc/stage2_eltorito
-#usr/lib/grub/i386-pc/ufs2_stage1_5
-#usr/lib/grub/i386-pc/vstafs_stage1_5
-#usr/lib/grub/i386-pc/xfs_stage1_5
-usr/sbin/grub
+usr/lib/grub/i386-pc
+usr/lib/grub/i386-pc/acpi.mod
+usr/lib/grub/i386-pc/acpi.module
+usr/lib/grub/i386-pc/adler32.mod
+usr/lib/grub/i386-pc/adler32.module
+usr/lib/grub/i386-pc/affs.mod
+usr/lib/grub/i386-pc/affs.module
+usr/lib/grub/i386-pc/afs.mod
+usr/lib/grub/i386-pc/afs.module
+usr/lib/grub/i386-pc/ahci.mod
+usr/lib/grub/i386-pc/ahci.module
+usr/lib/grub/i386-pc/all_video.mod
+usr/lib/grub/i386-pc/all_video.module
+usr/lib/grub/i386-pc/aout.mod
+usr/lib/grub/i386-pc/aout.module
+usr/lib/grub/i386-pc/at_keyboard.mod
+usr/lib/grub/i386-pc/at_keyboard.module
+usr/lib/grub/i386-pc/ata.mod
+usr/lib/grub/i386-pc/ata.module
+usr/lib/grub/i386-pc/backtrace.mod
+usr/lib/grub/i386-pc/backtrace.module
+usr/lib/grub/i386-pc/bfs.mod
+usr/lib/grub/i386-pc/bfs.module
+usr/lib/grub/i386-pc/biosdisk.mod
+usr/lib/grub/i386-pc/biosdisk.module
+usr/lib/grub/i386-pc/bitmap.mod
+usr/lib/grub/i386-pc/bitmap.module
+usr/lib/grub/i386-pc/bitmap_scale.mod
+usr/lib/grub/i386-pc/bitmap_scale.module
+usr/lib/grub/i386-pc/blocklist.mod
+usr/lib/grub/i386-pc/blocklist.module
+usr/lib/grub/i386-pc/boot.image
+usr/lib/grub/i386-pc/boot.img
+usr/lib/grub/i386-pc/boot.mod
+usr/lib/grub/i386-pc/boot.module
+usr/lib/grub/i386-pc/bsd.mod
+usr/lib/grub/i386-pc/bsd.module
+usr/lib/grub/i386-pc/btrfs.mod
+usr/lib/grub/i386-pc/btrfs.module
+usr/lib/grub/i386-pc/bufio.mod
+usr/lib/grub/i386-pc/bufio.module
+usr/lib/grub/i386-pc/cat.mod
+usr/lib/grub/i386-pc/cat.module
+usr/lib/grub/i386-pc/cdboot.image
+usr/lib/grub/i386-pc/cdboot.img
+usr/lib/grub/i386-pc/chain.mod
+usr/lib/grub/i386-pc/chain.module
+usr/lib/grub/i386-pc/cmostest.mod
+usr/lib/grub/i386-pc/cmostest.module
+usr/lib/grub/i386-pc/cmp.mod
+usr/lib/grub/i386-pc/cmp.module
+usr/lib/grub/i386-pc/command.lst
+usr/lib/grub/i386-pc/config.h
+usr/lib/grub/i386-pc/configfile.mod
+usr/lib/grub/i386-pc/configfile.module
+usr/lib/grub/i386-pc/cpio.mod
+usr/lib/grub/i386-pc/cpio.module
+usr/lib/grub/i386-pc/cpio_be.mod
+usr/lib/grub/i386-pc/cpio_be.module
+usr/lib/grub/i386-pc/cpuid.mod
+usr/lib/grub/i386-pc/cpuid.module
+usr/lib/grub/i386-pc/crc64.mod
+usr/lib/grub/i386-pc/crc64.module
+usr/lib/grub/i386-pc/crypto.lst
+usr/lib/grub/i386-pc/crypto.mod
+usr/lib/grub/i386-pc/crypto.module
+usr/lib/grub/i386-pc/cryptodisk.mod
+usr/lib/grub/i386-pc/cryptodisk.module
+usr/lib/grub/i386-pc/cs5536.mod
+usr/lib/grub/i386-pc/cs5536.module
+usr/lib/grub/i386-pc/date.mod
+usr/lib/grub/i386-pc/date.module
+usr/lib/grub/i386-pc/datehook.mod
+usr/lib/grub/i386-pc/datehook.module
+usr/lib/grub/i386-pc/datetime.mod
+usr/lib/grub/i386-pc/datetime.module
+usr/lib/grub/i386-pc/diskboot.image
+usr/lib/grub/i386-pc/diskboot.img
+usr/lib/grub/i386-pc/diskfilter.mod
+usr/lib/grub/i386-pc/diskfilter.module
+usr/lib/grub/i386-pc/dm_nv.mod
+usr/lib/grub/i386-pc/dm_nv.module
+usr/lib/grub/i386-pc/drivemap.mod
+usr/lib/grub/i386-pc/drivemap.module
+usr/lib/grub/i386-pc/echo.mod
+usr/lib/grub/i386-pc/echo.module
+usr/lib/grub/i386-pc/efiemu.mod
+usr/lib/grub/i386-pc/efiemu.module
+usr/lib/grub/i386-pc/ehci.mod
+usr/lib/grub/i386-pc/ehci.module
+usr/lib/grub/i386-pc/elf.mod
+usr/lib/grub/i386-pc/elf.module
+usr/lib/grub/i386-pc/exfat.mod
+usr/lib/grub/i386-pc/exfat.module
+usr/lib/grub/i386-pc/exfctest.mod
+usr/lib/grub/i386-pc/exfctest.module
+usr/lib/grub/i386-pc/ext2.mod
+usr/lib/grub/i386-pc/ext2.module
+usr/lib/grub/i386-pc/extcmd.mod
+usr/lib/grub/i386-pc/extcmd.module
+usr/lib/grub/i386-pc/fat.mod
+usr/lib/grub/i386-pc/fat.module
+usr/lib/grub/i386-pc/font.mod
+usr/lib/grub/i386-pc/font.module
+usr/lib/grub/i386-pc/freedos.mod
+usr/lib/grub/i386-pc/freedos.module
+usr/lib/grub/i386-pc/fs.lst
+usr/lib/grub/i386-pc/fshelp.mod
+usr/lib/grub/i386-pc/fshelp.module
+usr/lib/grub/i386-pc/functional_test.mod
+usr/lib/grub/i386-pc/functional_test.module
+usr/lib/grub/i386-pc/gcry_arcfour.mod
+usr/lib/grub/i386-pc/gcry_arcfour.module
+usr/lib/grub/i386-pc/gcry_blowfish.mod
+usr/lib/grub/i386-pc/gcry_blowfish.module
+usr/lib/grub/i386-pc/gcry_camellia.mod
+usr/lib/grub/i386-pc/gcry_camellia.module
+usr/lib/grub/i386-pc/gcry_cast5.mod
+usr/lib/grub/i386-pc/gcry_cast5.module
+usr/lib/grub/i386-pc/gcry_crc.mod
+usr/lib/grub/i386-pc/gcry_crc.module
+usr/lib/grub/i386-pc/gcry_des.mod
+usr/lib/grub/i386-pc/gcry_des.module
+usr/lib/grub/i386-pc/gcry_md4.mod
+usr/lib/grub/i386-pc/gcry_md4.module
+usr/lib/grub/i386-pc/gcry_md5.mod
+usr/lib/grub/i386-pc/gcry_md5.module
+usr/lib/grub/i386-pc/gcry_rfc2268.mod
+usr/lib/grub/i386-pc/gcry_rfc2268.module
+usr/lib/grub/i386-pc/gcry_rijndael.mod
+usr/lib/grub/i386-pc/gcry_rijndael.module
+usr/lib/grub/i386-pc/gcry_rmd160.mod
+usr/lib/grub/i386-pc/gcry_rmd160.module
+usr/lib/grub/i386-pc/gcry_seed.mod
+usr/lib/grub/i386-pc/gcry_seed.module
+usr/lib/grub/i386-pc/gcry_serpent.mod
+usr/lib/grub/i386-pc/gcry_serpent.module
+usr/lib/grub/i386-pc/gcry_sha1.mod
+usr/lib/grub/i386-pc/gcry_sha1.module
+usr/lib/grub/i386-pc/gcry_sha256.mod
+usr/lib/grub/i386-pc/gcry_sha256.module
+usr/lib/grub/i386-pc/gcry_sha512.mod
+usr/lib/grub/i386-pc/gcry_sha512.module
+usr/lib/grub/i386-pc/gcry_tiger.mod
+usr/lib/grub/i386-pc/gcry_tiger.module
+usr/lib/grub/i386-pc/gcry_twofish.mod
+usr/lib/grub/i386-pc/gcry_twofish.module
+usr/lib/grub/i386-pc/gcry_whirlpool.mod
+usr/lib/grub/i386-pc/gcry_whirlpool.module
+usr/lib/grub/i386-pc/gdb.mod
+usr/lib/grub/i386-pc/gdb.module
+usr/lib/grub/i386-pc/gdb_grub
+usr/lib/grub/i386-pc/geli.mod
+usr/lib/grub/i386-pc/geli.module
+usr/lib/grub/i386-pc/gettext.mod
+usr/lib/grub/i386-pc/gettext.module
+usr/lib/grub/i386-pc/gfxmenu.mod
+usr/lib/grub/i386-pc/gfxmenu.module
+usr/lib/grub/i386-pc/gfxterm.mod
+usr/lib/grub/i386-pc/gfxterm.module
+usr/lib/grub/i386-pc/gmodule.pl
+usr/lib/grub/i386-pc/gptsync.mod
+usr/lib/grub/i386-pc/gptsync.module
+usr/lib/grub/i386-pc/gzio.mod
+usr/lib/grub/i386-pc/gzio.module
+usr/lib/grub/i386-pc/halt.mod
+usr/lib/grub/i386-pc/halt.module
+usr/lib/grub/i386-pc/hashsum.mod
+usr/lib/grub/i386-pc/hashsum.module
+usr/lib/grub/i386-pc/hdparm.mod
+usr/lib/grub/i386-pc/hdparm.module
+usr/lib/grub/i386-pc/hello.mod
+usr/lib/grub/i386-pc/hello.module
+usr/lib/grub/i386-pc/help.mod
+usr/lib/grub/i386-pc/help.module
+usr/lib/grub/i386-pc/hexdump.mod
+usr/lib/grub/i386-pc/hexdump.module
+usr/lib/grub/i386-pc/hfs.mod
+usr/lib/grub/i386-pc/hfs.module
+usr/lib/grub/i386-pc/hfsplus.mod
+usr/lib/grub/i386-pc/hfsplus.module
+usr/lib/grub/i386-pc/http.mod
+usr/lib/grub/i386-pc/http.module
+usr/lib/grub/i386-pc/iorw.mod
+usr/lib/grub/i386-pc/iorw.module
+usr/lib/grub/i386-pc/iso9660.mod
+usr/lib/grub/i386-pc/iso9660.module
+usr/lib/grub/i386-pc/jfs.mod
+usr/lib/grub/i386-pc/jfs.module
+usr/lib/grub/i386-pc/jpeg.mod
+usr/lib/grub/i386-pc/jpeg.module
+usr/lib/grub/i386-pc/kernel.exec
+usr/lib/grub/i386-pc/kernel.img
+usr/lib/grub/i386-pc/keylayouts.mod
+usr/lib/grub/i386-pc/keylayouts.module
+usr/lib/grub/i386-pc/keystatus.mod
+usr/lib/grub/i386-pc/keystatus.module
+usr/lib/grub/i386-pc/ldm.mod
+usr/lib/grub/i386-pc/ldm.module
+usr/lib/grub/i386-pc/legacycfg.mod
+usr/lib/grub/i386-pc/legacycfg.module
+usr/lib/grub/i386-pc/linux.mod
+usr/lib/grub/i386-pc/linux.module
+usr/lib/grub/i386-pc/linux16.mod
+usr/lib/grub/i386-pc/linux16.module
+usr/lib/grub/i386-pc/lnxboot.image
+usr/lib/grub/i386-pc/lnxboot.img
+usr/lib/grub/i386-pc/loadenv.mod
+usr/lib/grub/i386-pc/loadenv.module
+usr/lib/grub/i386-pc/loopback.mod
+usr/lib/grub/i386-pc/loopback.module
+usr/lib/grub/i386-pc/ls.mod
+usr/lib/grub/i386-pc/ls.module
+usr/lib/grub/i386-pc/lsacpi.mod
+usr/lib/grub/i386-pc/lsacpi.module
+usr/lib/grub/i386-pc/lsapm.mod
+usr/lib/grub/i386-pc/lsapm.module
+usr/lib/grub/i386-pc/lsmmap.mod
+usr/lib/grub/i386-pc/lsmmap.module
+usr/lib/grub/i386-pc/lspci.mod
+usr/lib/grub/i386-pc/lspci.module
+usr/lib/grub/i386-pc/luks.mod
+usr/lib/grub/i386-pc/luks.module
+usr/lib/grub/i386-pc/lvm.mod
+usr/lib/grub/i386-pc/lvm.module
+usr/lib/grub/i386-pc/lzma_decompress.image
+usr/lib/grub/i386-pc/lzma_decompress.img
+usr/lib/grub/i386-pc/lzopio.mod
+usr/lib/grub/i386-pc/lzopio.module
+usr/lib/grub/i386-pc/mdraid09.mod
+usr/lib/grub/i386-pc/mdraid09.module
+usr/lib/grub/i386-pc/mdraid09_be.mod
+usr/lib/grub/i386-pc/mdraid09_be.module
+usr/lib/grub/i386-pc/mdraid1x.mod
+usr/lib/grub/i386-pc/mdraid1x.module
+usr/lib/grub/i386-pc/memdisk.mod
+usr/lib/grub/i386-pc/memdisk.module
+usr/lib/grub/i386-pc/memrw.mod
+usr/lib/grub/i386-pc/memrw.module
+usr/lib/grub/i386-pc/minicmd.mod
+usr/lib/grub/i386-pc/minicmd.module
+usr/lib/grub/i386-pc/minix.mod
+usr/lib/grub/i386-pc/minix.module
+usr/lib/grub/i386-pc/minix2.mod
+usr/lib/grub/i386-pc/minix2.module
+usr/lib/grub/i386-pc/minix2_be.mod
+usr/lib/grub/i386-pc/minix2_be.module
+usr/lib/grub/i386-pc/minix3.mod
+usr/lib/grub/i386-pc/minix3.module
+usr/lib/grub/i386-pc/minix3_be.mod
+usr/lib/grub/i386-pc/minix3_be.module
+usr/lib/grub/i386-pc/minix_be.mod
+usr/lib/grub/i386-pc/minix_be.module
+usr/lib/grub/i386-pc/mmap.mod
+usr/lib/grub/i386-pc/mmap.module
+usr/lib/grub/i386-pc/moddep.lst
+usr/lib/grub/i386-pc/modinfo.sh
+usr/lib/grub/i386-pc/msdospart.mod
+usr/lib/grub/i386-pc/msdospart.module
+usr/lib/grub/i386-pc/multiboot.mod
+usr/lib/grub/i386-pc/multiboot.module
+usr/lib/grub/i386-pc/multiboot2.mod
+usr/lib/grub/i386-pc/multiboot2.module
+usr/lib/grub/i386-pc/net.mod
+usr/lib/grub/i386-pc/net.module
+usr/lib/grub/i386-pc/newc.mod
+usr/lib/grub/i386-pc/newc.module
+usr/lib/grub/i386-pc/nilfs2.mod
+usr/lib/grub/i386-pc/nilfs2.module
+usr/lib/grub/i386-pc/normal.mod
+usr/lib/grub/i386-pc/normal.module
+usr/lib/grub/i386-pc/ntfs.mod
+usr/lib/grub/i386-pc/ntfs.module
+usr/lib/grub/i386-pc/ntfscomp.mod
+usr/lib/grub/i386-pc/ntfscomp.module
+usr/lib/grub/i386-pc/ntldr.mod
+usr/lib/grub/i386-pc/ntldr.module
+usr/lib/grub/i386-pc/odc.mod
+usr/lib/grub/i386-pc/odc.module
+usr/lib/grub/i386-pc/ohci.mod
+usr/lib/grub/i386-pc/ohci.module
+usr/lib/grub/i386-pc/part_acorn.mod
+usr/lib/grub/i386-pc/part_acorn.module
+usr/lib/grub/i386-pc/part_amiga.mod
+usr/lib/grub/i386-pc/part_amiga.module
+usr/lib/grub/i386-pc/part_apple.mod
+usr/lib/grub/i386-pc/part_apple.module
+usr/lib/grub/i386-pc/part_bsd.mod
+usr/lib/grub/i386-pc/part_bsd.module
+usr/lib/grub/i386-pc/part_dvh.mod
+usr/lib/grub/i386-pc/part_dvh.module
+usr/lib/grub/i386-pc/part_gpt.mod
+usr/lib/grub/i386-pc/part_gpt.module
+usr/lib/grub/i386-pc/part_msdos.mod
+usr/lib/grub/i386-pc/part_msdos.module
+usr/lib/grub/i386-pc/part_plan.mod
+usr/lib/grub/i386-pc/part_plan.module
+usr/lib/grub/i386-pc/part_sun.mod
+usr/lib/grub/i386-pc/part_sun.module
+usr/lib/grub/i386-pc/part_sunpc.mod
+usr/lib/grub/i386-pc/part_sunpc.module
+usr/lib/grub/i386-pc/partmap.lst
+usr/lib/grub/i386-pc/parttool.lst
+usr/lib/grub/i386-pc/parttool.mod
+usr/lib/grub/i386-pc/parttool.module
+usr/lib/grub/i386-pc/password.mod
+usr/lib/grub/i386-pc/password.module
+usr/lib/grub/i386-pc/password_pbkdf2.mod
+usr/lib/grub/i386-pc/password_pbkdf2.module
+usr/lib/grub/i386-pc/pata.mod
+usr/lib/grub/i386-pc/pata.module
+usr/lib/grub/i386-pc/pbkdf2.mod
+usr/lib/grub/i386-pc/pbkdf2.module
+usr/lib/grub/i386-pc/pci.mod
+usr/lib/grub/i386-pc/pci.module
+usr/lib/grub/i386-pc/plan9.mod
+usr/lib/grub/i386-pc/plan9.module
+usr/lib/grub/i386-pc/play.mod
+usr/lib/grub/i386-pc/play.module
+usr/lib/grub/i386-pc/png.mod
+usr/lib/grub/i386-pc/png.module
+usr/lib/grub/i386-pc/priority_queue.mod
+usr/lib/grub/i386-pc/priority_queue.module
+usr/lib/grub/i386-pc/probe.mod
+usr/lib/grub/i386-pc/probe.module
+usr/lib/grub/i386-pc/pxe.mod
+usr/lib/grub/i386-pc/pxe.module
+usr/lib/grub/i386-pc/pxeboot.image
+usr/lib/grub/i386-pc/pxeboot.img
+usr/lib/grub/i386-pc/pxechain.mod
+usr/lib/grub/i386-pc/pxechain.module
+usr/lib/grub/i386-pc/raid5rec.mod
+usr/lib/grub/i386-pc/raid5rec.module
+usr/lib/grub/i386-pc/raid6rec.mod
+usr/lib/grub/i386-pc/raid6rec.module
+usr/lib/grub/i386-pc/read.mod
+usr/lib/grub/i386-pc/read.module
+usr/lib/grub/i386-pc/reboot.mod
+usr/lib/grub/i386-pc/reboot.module
+usr/lib/grub/i386-pc/regexp.mod
+usr/lib/grub/i386-pc/regexp.module
+usr/lib/grub/i386-pc/reiserfs.mod
+usr/lib/grub/i386-pc/reiserfs.module
+usr/lib/grub/i386-pc/relocator.mod
+usr/lib/grub/i386-pc/relocator.module
+usr/lib/grub/i386-pc/romfs.mod
+usr/lib/grub/i386-pc/romfs.module
+usr/lib/grub/i386-pc/scsi.mod
+usr/lib/grub/i386-pc/scsi.module
+usr/lib/grub/i386-pc/search.mod
+usr/lib/grub/i386-pc/search.module
+usr/lib/grub/i386-pc/search_fs_file.mod
+usr/lib/grub/i386-pc/search_fs_file.module
+usr/lib/grub/i386-pc/search_fs_uuid.mod
+usr/lib/grub/i386-pc/search_fs_uuid.module
+usr/lib/grub/i386-pc/search_label.mod
+usr/lib/grub/i386-pc/search_label.module
+usr/lib/grub/i386-pc/sendkey.mod
+usr/lib/grub/i386-pc/sendkey.module
+usr/lib/grub/i386-pc/serial.mod
+usr/lib/grub/i386-pc/serial.module
+usr/lib/grub/i386-pc/setjmp.mod
+usr/lib/grub/i386-pc/setjmp.module
+usr/lib/grub/i386-pc/setpci.mod
+usr/lib/grub/i386-pc/setpci.module
+usr/lib/grub/i386-pc/sfs.mod
+usr/lib/grub/i386-pc/sfs.module
+usr/lib/grub/i386-pc/sleep.mod
+usr/lib/grub/i386-pc/sleep.module
+usr/lib/grub/i386-pc/squash4.mod
+usr/lib/grub/i386-pc/squash4.module
+usr/lib/grub/i386-pc/tar.mod
+usr/lib/grub/i386-pc/tar.module
+usr/lib/grub/i386-pc/terminal.lst
+usr/lib/grub/i386-pc/terminal.mod
+usr/lib/grub/i386-pc/terminal.module
+usr/lib/grub/i386-pc/terminfo.mod
+usr/lib/grub/i386-pc/terminfo.module
+usr/lib/grub/i386-pc/test.mod
+usr/lib/grub/i386-pc/test.module
+usr/lib/grub/i386-pc/test_blockarg.mod
+usr/lib/grub/i386-pc/test_blockarg.module
+usr/lib/grub/i386-pc/testload.mod
+usr/lib/grub/i386-pc/testload.module
+usr/lib/grub/i386-pc/tftp.mod
+usr/lib/grub/i386-pc/tftp.module
+usr/lib/grub/i386-pc/tga.mod
+usr/lib/grub/i386-pc/tga.module
+usr/lib/grub/i386-pc/time.mod
+usr/lib/grub/i386-pc/time.module
+usr/lib/grub/i386-pc/trig.mod
+usr/lib/grub/i386-pc/trig.module
+usr/lib/grub/i386-pc/true.mod
+usr/lib/grub/i386-pc/true.module
+usr/lib/grub/i386-pc/udf.mod
+usr/lib/grub/i386-pc/udf.module
+usr/lib/grub/i386-pc/ufs1.mod
+usr/lib/grub/i386-pc/ufs1.module
+usr/lib/grub/i386-pc/ufs2.mod
+usr/lib/grub/i386-pc/ufs2.module
+usr/lib/grub/i386-pc/uhci.mod
+usr/lib/grub/i386-pc/uhci.module
+usr/lib/grub/i386-pc/usb.mod
+usr/lib/grub/i386-pc/usb.module
+usr/lib/grub/i386-pc/usb_keyboard.mod
+usr/lib/grub/i386-pc/usb_keyboard.module
+usr/lib/grub/i386-pc/usbms.mod
+usr/lib/grub/i386-pc/usbms.module
+usr/lib/grub/i386-pc/usbserial_common.mod
+usr/lib/grub/i386-pc/usbserial_common.module
+usr/lib/grub/i386-pc/usbserial_ftdi.mod
+usr/lib/grub/i386-pc/usbserial_ftdi.module
+usr/lib/grub/i386-pc/usbserial_pl2303.mod
+usr/lib/grub/i386-pc/usbserial_pl2303.module
+usr/lib/grub/i386-pc/usbtest.mod
+usr/lib/grub/i386-pc/usbtest.module
+usr/lib/grub/i386-pc/vbe.mod
+usr/lib/grub/i386-pc/vbe.module
+usr/lib/grub/i386-pc/vga.mod
+usr/lib/grub/i386-pc/vga.module
+usr/lib/grub/i386-pc/vga_text.mod
+usr/lib/grub/i386-pc/vga_text.module
+usr/lib/grub/i386-pc/video.lst
+usr/lib/grub/i386-pc/video.mod
+usr/lib/grub/i386-pc/video.module
+usr/lib/grub/i386-pc/video_bochs.mod
+usr/lib/grub/i386-pc/video_bochs.module
+usr/lib/grub/i386-pc/video_cirrus.mod
+usr/lib/grub/i386-pc/video_cirrus.module
+usr/lib/grub/i386-pc/video_fb.mod
+usr/lib/grub/i386-pc/video_fb.module
+usr/lib/grub/i386-pc/videoinfo.mod
+usr/lib/grub/i386-pc/videoinfo.module
+usr/lib/grub/i386-pc/videotest.mod
+usr/lib/grub/i386-pc/videotest.module
+usr/lib/grub/i386-pc/xfs.mod
+usr/lib/grub/i386-pc/xfs.module
+usr/lib/grub/i386-pc/xnu.mod
+usr/lib/grub/i386-pc/xnu.module
+usr/lib/grub/i386-pc/xnu_uuid.mod
+usr/lib/grub/i386-pc/xnu_uuid.module
+usr/lib/grub/i386-pc/xzio.mod
+usr/lib/grub/i386-pc/xzio.module
+usr/lib/grub/i386-pc/zfs.mod
+usr/lib/grub/i386-pc/zfs.module
+usr/lib/grub/i386-pc/zfscrypt.mod
+usr/lib/grub/i386-pc/zfscrypt.module
+usr/lib/grub/i386-pc/zfsinfo.mod
+usr/lib/grub/i386-pc/zfsinfo.module
+usr/sbin/grub-bios-setup
 usr/sbin/grub-install
-usr/sbin/grub-md5-crypt
+usr/sbin/grub-mkconfig
+usr/sbin/grub-mknetdir
+usr/sbin/grub-ofpathname
+usr/sbin/grub-probe
+usr/sbin/grub-reboot
 usr/sbin/grub-set-default
-usr/sbin/grub-terminfo
+usr/sbin/grub-sparc64-setup
+usr/share/grub
+usr/share/grub/grub-mkconfig_lib
+#usr/share/info/grub-dev.info
 #usr/share/info/grub.info
-#usr/share/info/multiboot.info
-#usr/share/man/man1/mbchk.1
-#usr/share/man/man8/grub-install.8
-#usr/share/man/man8/grub-md5-crypt.8
-#usr/share/man/man8/grub-terminfo.8
-#usr/share/man/man8/grub.8
+#usr/share/locale/ast
+#usr/share/locale/ast/LC_MESSAGES
+#usr/share/locale/ast/LC_MESSAGES/grub.mo
+#usr/share/locale/ca/LC_MESSAGES/grub.mo
+#usr/share/locale/da/LC_MESSAGES/grub.mo
+#usr/share/locale/de/LC_MESSAGES/grub.mo
+#usr/share/locale/de@hebrew
+#usr/share/locale/de@hebrew/LC_MESSAGES
+#usr/share/locale/de@hebrew/LC_MESSAGES/grub.mo
+#usr/share/locale/de_CH
+#usr/share/locale/de_CH/LC_MESSAGES
+#usr/share/locale/de_CH/LC_MESSAGES/grub.mo
+#usr/share/locale/en@arabic
+#usr/share/locale/en@arabic/LC_MESSAGES
+#usr/share/locale/en@arabic/LC_MESSAGES/grub.mo
+#usr/share/locale/en@cyrillic
+#usr/share/locale/en@cyrillic/LC_MESSAGES
+#usr/share/locale/en@cyrillic/LC_MESSAGES/grub.mo
+#usr/share/locale/en@greek
+#usr/share/locale/en@greek/LC_MESSAGES
+#usr/share/locale/en@greek/LC_MESSAGES/grub.mo
+#usr/share/locale/en@hebrew
+#usr/share/locale/en@hebrew/LC_MESSAGES
+#usr/share/locale/en@hebrew/LC_MESSAGES/grub.mo
+#usr/share/locale/en@piglatin
+#usr/share/locale/en@piglatin/LC_MESSAGES
+#usr/share/locale/en@piglatin/LC_MESSAGES/grub.mo
+#usr/share/locale/en@quot/LC_MESSAGES/grub.mo
+#usr/share/locale/eo/LC_MESSAGES/grub.mo
+#usr/share/locale/fi/LC_MESSAGES/grub.mo
+#usr/share/locale/fr/LC_MESSAGES/grub.mo
+#usr/share/locale/hu/LC_MESSAGES/grub.mo
+#usr/share/locale/id/LC_MESSAGES/grub.mo
+#usr/share/locale/it/LC_MESSAGES/grub.mo
+#usr/share/locale/ja/LC_MESSAGES/grub.mo
+#usr/share/locale/nl/LC_MESSAGES/grub.mo
+#usr/share/locale/pa
+#usr/share/locale/pa/LC_MESSAGES
+#usr/share/locale/pa/LC_MESSAGES/grub.mo
+#usr/share/locale/pl/LC_MESSAGES/grub.mo
+#usr/share/locale/ru/LC_MESSAGES/grub.mo
+#usr/share/locale/sv/LC_MESSAGES/grub.mo
+#usr/share/locale/uk/LC_MESSAGES/grub.mo
+#usr/share/locale/vi/LC_MESSAGES/grub.mo
+#usr/share/locale/zh_CN/LC_MESSAGES/grub.mo
+#usr/share/locale/zh_TW/LC_MESSAGES/grub.mo
index 622886fd647f909dc2bb340b1ca5682642789a5e..6704251d5a316b6078208c9260134c829626dd02 100644 (file)
@@ -46,7 +46,6 @@ etc/rc.d/init.d/ipsec
 etc/rc.d/init.d/leds
 etc/rc.d/init.d/localnet
 etc/rc.d/init.d/mISDN
-#etc/rc.d/init.d/mdadm
 #etc/rc.d/init.d/mediatomb
 #etc/rc.d/init.d/messagebus
 #etc/rc.d/init.d/miau
index 3f364aed55e54ad1ee68f0f475c1291b7bb1abc2..e6ce913364665af4def76f791aadca529861b70c 100644 (file)
@@ -1,8 +1,7 @@
 boot/System.map-KVER-ipfire
-boot/System.map-ipfire
 boot/config-KVER-ipfire
+boot/initramfs-KVER-ipfire.img
 boot/vmlinuz-KVER-ipfire
-boot/vmlinuz-ipfire
 etc/modprobe.d/framebuffer.conf
 etc/modprobe.d/ipv6.conf
 etc/modprobe.d/isdn.conf
@@ -2954,4 +2953,4 @@ lib/modules/KVER-ipfire
 #lib/modules/KVER-ipfire/modules.symbols.bin
 #lib/modules/KVER-ipfire/source
 sbin/gen_init_cpio
-boot/ipfirerd-KVER.img
+boot/initramfs-KVER-ipfire.img
diff --git a/config/rootfiles/common/installer b/config/rootfiles/common/installer
new file mode 100644 (file)
index 0000000..6738553
--- /dev/null
@@ -0,0 +1,8 @@
+#usr/bin/downloadsource.sh
+#usr/bin/installer
+#usr/lib/dracut/modules.d/99installer
+#usr/lib/dracut/modules.d/99installer/70-dhcpcd.exe
+#usr/lib/dracut/modules.d/99installer/fake-root.sh
+#usr/lib/dracut/modules.d/99installer/module-setup.sh
+#usr/lib/dracut/modules.d/99installer/run-installer.sh
+#usr/share/locale/de/LC_MESSAGES/installer.mo
index 90e23652886994cd447a6a62db78dc735d383998..f490c89f6b5d17a5290a7e3bc7b26f7d423302ff 100644 (file)
@@ -9,7 +9,6 @@ sbin/getcap
 sbin/getpcaps
 sbin/setcap
 #usr/include/sys/capability.h
-usr/lib/libnewt.so.0.51
 #usr/share/man/man1/capsh.1
 #usr/share/man/man3/cap_clear.3
 #usr/share/man/man3/cap_clear_flag.3
diff --git a/config/rootfiles/common/libsmooth b/config/rootfiles/common/libsmooth
new file mode 100644 (file)
index 0000000..8064831
--- /dev/null
@@ -0,0 +1,6 @@
+#usr/include/libsmooth.h
+#usr/lib/libsmooth.la
+#usr/lib/libsmooth.so
+usr/lib/libsmooth.so.1
+usr/lib/libsmooth.so.1.0.0
+#usr/lib/pkgconfig/libsmooth.pc
similarity index 55%
rename from config/rootfiles/packages/mdadm
rename to config/rootfiles/common/mdadm
index d593cac2541167f8574c68e5793b7df364cf8b82..00d38a8c864ca35cf98458a25548a7ea1dff1950 100644 (file)
@@ -1,12 +1,9 @@
-etc/rc.d/rc0.d/S85mdadm
-etc/rc.d/rc6.d/S75mdadm
-etc/rc.d/rcsysinit.d/S11mdadm
-lib/udev/rules.d/64-md-raid.rules
+lib/udev/rules.d/63-md-raid-arrays.rules
+lib/udev/rules.d/64-md-raid-assembly.rules
 sbin/mdadm
 sbin/mdmon
 #usr/share/man/man4/md.4
 #usr/share/man/man5/mdadm.conf.5
 #usr/share/man/man8/mdadm.8
 #usr/share/man/man8/mdmon.8
-etc/rc.d/init.d/mdadm
 srv/web/ipfire/cgi-bin/mdstat.cgi
diff --git a/config/rootfiles/common/mktemp b/config/rootfiles/common/mktemp
deleted file mode 100644 (file)
index e6328ab..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-usr/bin/mktemp
-#usr/bin/tempfile
-#usr/man/man1/mktemp.1
index 08fb2ce0c4ae45f1eba192b816b9153145bb5d8d..c7f7414fb9207a2b8055bb5cec6c223fe7628ff4 100644 (file)
@@ -1,8 +1,143 @@
 usr/bin/whiptail
 #usr/include/newt.h
 #usr/lib/libnewt.a
-usr/lib/libnewt.so
-usr/lib/libnewt.so.0.51
-usr/lib/libnewt.so.0.51.6
-#usr/lib/python2.7/site-packages/_snackmodule.so
+#usr/lib/libnewt.so
+usr/lib/libnewt.so.0.52
+usr/lib/libnewt.so.0.52.17
+#usr/lib/pkgconfig/libnewt.pc
+#usr/lib/python2.7/site-packages/_snack.so
 #usr/lib/python2.7/site-packages/snack.py
+#usr/share/locale/ar
+#usr/share/locale/ar/LC_MESSAGES
+#usr/share/locale/ar/LC_MESSAGES/newt.mo
+#usr/share/locale/as
+#usr/share/locale/as/LC_MESSAGES
+#usr/share/locale/as/LC_MESSAGES/newt.mo
+#usr/share/locale/ast/LC_MESSAGES/newt.mo
+#usr/share/locale/bal
+#usr/share/locale/bal/LC_MESSAGES
+#usr/share/locale/bal/LC_MESSAGES/newt.mo
+#usr/share/locale/bg/LC_MESSAGES/newt.mo
+#usr/share/locale/bn
+#usr/share/locale/bn/LC_MESSAGES
+#usr/share/locale/bn/LC_MESSAGES/newt.mo
+#usr/share/locale/bn_IN
+#usr/share/locale/bn_IN/LC_MESSAGES
+#usr/share/locale/bn_IN/LC_MESSAGES/newt.mo
+#usr/share/locale/bs/LC_MESSAGES/newt.mo
+#usr/share/locale/ca/LC_MESSAGES/newt.mo
+#usr/share/locale/cs/LC_MESSAGES/newt.mo
+#usr/share/locale/cy
+#usr/share/locale/cy/LC_MESSAGES
+#usr/share/locale/cy/LC_MESSAGES/newt.mo
+#usr/share/locale/da/LC_MESSAGES/newt.mo
+#usr/share/locale/de/LC_MESSAGES/newt.mo
+#usr/share/locale/dz
+#usr/share/locale/dz/LC_MESSAGES
+#usr/share/locale/dz/LC_MESSAGES/newt.mo
+#usr/share/locale/el/LC_MESSAGES/newt.mo
+#usr/share/locale/eo/LC_MESSAGES/newt.mo
+#usr/share/locale/es/LC_MESSAGES/newt.mo
+#usr/share/locale/et/LC_MESSAGES/newt.mo
+#usr/share/locale/eu/LC_MESSAGES/newt.mo
+#usr/share/locale/fa
+#usr/share/locale/fa/LC_MESSAGES
+#usr/share/locale/fa/LC_MESSAGES/newt.mo
+#usr/share/locale/fi/LC_MESSAGES/newt.mo
+#usr/share/locale/fr/LC_MESSAGES/newt.mo
+#usr/share/locale/ga/LC_MESSAGES/newt.mo
+#usr/share/locale/gl/LC_MESSAGES/newt.mo
+#usr/share/locale/gu
+#usr/share/locale/gu/LC_MESSAGES
+#usr/share/locale/gu/LC_MESSAGES/newt.mo
+#usr/share/locale/he
+#usr/share/locale/he/LC_MESSAGES
+#usr/share/locale/he/LC_MESSAGES/newt.mo
+#usr/share/locale/hi
+#usr/share/locale/hi/LC_MESSAGES
+#usr/share/locale/hi/LC_MESSAGES/newt.mo
+#usr/share/locale/hr/LC_MESSAGES/newt.mo
+#usr/share/locale/hu/LC_MESSAGES/newt.mo
+#usr/share/locale/ia/LC_MESSAGES/newt.mo
+#usr/share/locale/id/LC_MESSAGES/newt.mo
+#usr/share/locale/it/LC_MESSAGES/newt.mo
+#usr/share/locale/ja/LC_MESSAGES/newt.mo
+#usr/share/locale/km
+#usr/share/locale/km/LC_MESSAGES
+#usr/share/locale/km/LC_MESSAGES/newt.mo
+#usr/share/locale/kn
+#usr/share/locale/kn/LC_MESSAGES
+#usr/share/locale/kn/LC_MESSAGES/newt.mo
+#usr/share/locale/ko/LC_MESSAGES/newt.mo
+#usr/share/locale/ku
+#usr/share/locale/ku/LC_MESSAGES
+#usr/share/locale/ku/LC_MESSAGES/newt.mo
+#usr/share/locale/lt/LC_MESSAGES/newt.mo
+#usr/share/locale/lv
+#usr/share/locale/lv/LC_MESSAGES
+#usr/share/locale/lv/LC_MESSAGES/newt.mo
+#usr/share/locale/mg
+#usr/share/locale/mg/LC_MESSAGES
+#usr/share/locale/mg/LC_MESSAGES/newt.mo
+#usr/share/locale/mk
+#usr/share/locale/mk/LC_MESSAGES
+#usr/share/locale/mk/LC_MESSAGES/newt.mo
+#usr/share/locale/ml
+#usr/share/locale/ml/LC_MESSAGES
+#usr/share/locale/ml/LC_MESSAGES/newt.mo
+#usr/share/locale/mr
+#usr/share/locale/mr/LC_MESSAGES
+#usr/share/locale/mr/LC_MESSAGES/newt.mo
+#usr/share/locale/ms/LC_MESSAGES/newt.mo
+#usr/share/locale/nb/LC_MESSAGES/newt.mo
+#usr/share/locale/nds
+#usr/share/locale/nds/LC_MESSAGES
+#usr/share/locale/nds/LC_MESSAGES/newt.mo
+#usr/share/locale/ne
+#usr/share/locale/ne/LC_MESSAGES
+#usr/share/locale/ne/LC_MESSAGES/newt.mo
+#usr/share/locale/nl/LC_MESSAGES/newt.mo
+#usr/share/locale/nn
+#usr/share/locale/nn/LC_MESSAGES
+#usr/share/locale/nn/LC_MESSAGES/newt.mo
+#usr/share/locale/pa/LC_MESSAGES/newt.mo
+#usr/share/locale/pl/LC_MESSAGES/newt.mo
+#usr/share/locale/pt/LC_MESSAGES/newt.mo
+#usr/share/locale/pt_BR/LC_MESSAGES/newt.mo
+#usr/share/locale/ro/LC_MESSAGES/newt.mo
+#usr/share/locale/ru/LC_MESSAGES/newt.mo
+#usr/share/locale/sk/LC_MESSAGES/newt.mo
+#usr/share/locale/sl/LC_MESSAGES/newt.mo
+#usr/share/locale/sq/LC_MESSAGES/newt.mo
+#usr/share/locale/sr/LC_MESSAGES/newt.mo
+#usr/share/locale/sr@latin
+#usr/share/locale/sr@latin/LC_MESSAGES
+#usr/share/locale/sr@latin/LC_MESSAGES/newt.mo
+#usr/share/locale/sv/LC_MESSAGES/newt.mo
+#usr/share/locale/ta
+#usr/share/locale/ta/LC_MESSAGES
+#usr/share/locale/ta/LC_MESSAGES/newt.mo
+#usr/share/locale/te
+#usr/share/locale/te/LC_MESSAGES
+#usr/share/locale/te/LC_MESSAGES/newt.mo
+#usr/share/locale/tg
+#usr/share/locale/tg/LC_MESSAGES
+#usr/share/locale/tg/LC_MESSAGES/newt.mo
+#usr/share/locale/th
+#usr/share/locale/th/LC_MESSAGES
+#usr/share/locale/th/LC_MESSAGES/newt.mo
+#usr/share/locale/tl
+#usr/share/locale/tl/LC_MESSAGES
+#usr/share/locale/tl/LC_MESSAGES/newt.mo
+#usr/share/locale/tr/LC_MESSAGES/newt.mo
+#usr/share/locale/uk/LC_MESSAGES/newt.mo
+#usr/share/locale/vi/LC_MESSAGES/newt.mo
+#usr/share/locale/wo
+#usr/share/locale/wo/LC_MESSAGES
+#usr/share/locale/wo/LC_MESSAGES/newt.mo
+#usr/share/locale/xh
+#usr/share/locale/xh/LC_MESSAGES
+#usr/share/locale/xh/LC_MESSAGES/newt.mo
+#usr/share/locale/zh_CN/LC_MESSAGES/newt.mo
+#usr/share/locale/zh_TW/LC_MESSAGES/newt.mo
+#usr/share/man/man1/whiptail.1
similarity index 84%
rename from config/rootfiles/packages/parted
rename to config/rootfiles/common/parted
index 74164e0b7785f689f71824b23f041135379b86f3..223a580cb0831809e47444627bc6a48c14d68c53 100644 (file)
 #usr/include/parted/parted.h
 #usr/include/parted/timer.h
 #usr/include/parted/unit.h
+#usr/lib/libparted-fs-resize.a
+#usr/lib/libparted-fs-resize.la
+#usr/lib/libparted-fs-resize.so
+usr/lib/libparted-fs-resize.so.0
+usr/lib/libparted-fs-resize.so.0.0.0
 #usr/lib/libparted.a
 #usr/lib/libparted.la
 #usr/lib/libparted.so
-usr/lib/libparted.so.0
-usr/lib/libparted.so.0.0.1
+usr/lib/libparted.so.2
+usr/lib/libparted.so.2.0.0
 #usr/lib/pkgconfig/libparted.pc
 usr/sbin/parted
 usr/sbin/partprobe
@@ -38,6 +43,8 @@ usr/sbin/partprobe
 #usr/share/locale/ru/LC_MESSAGES/parted.mo
 #usr/share/locale/rw/LC_MESSAGES/parted.mo
 #usr/share/locale/sk/LC_MESSAGES/parted.mo
+#usr/share/locale/sl/LC_MESSAGES/parted.mo
+#usr/share/locale/sr/LC_MESSAGES/parted.mo
 #usr/share/locale/sv/LC_MESSAGES/parted.mo
 #usr/share/locale/tr/LC_MESSAGES/parted.mo
 #usr/share/locale/uk/LC_MESSAGES/parted.mo
index b3538ad1973a95002ba6c02104d5318dd0f23706..d144ca1b8637bbd2732573702db1e510b0a6e1be 100644 (file)
@@ -1,2 +1,2 @@
 usr/bin/patch
-#usr/man/man1/patch.1
+#usr/share/man/man1/patch.1
index 7bef2c18faf091d69ad3991e0e204af885f32aff..b2ac26dd4c37c9673e880de4b07ba6d13a44b572 100644 (file)
@@ -9,10 +9,14 @@
 #usr/include/readline/tilde.h
 #usr/lib/libhistory.so
 usr/lib/libhistory.so.6
-usr/lib/libhistory.so.6.2
+usr/lib/libhistory.so.6.3
 #usr/lib/libreadline.so
 usr/lib/libreadline.so.6
-usr/lib/libreadline.so.6.2
+usr/lib/libreadline.so.6.3
+#usr/share/doc/readline
+#usr/share/doc/readline/CHANGES
+#usr/share/doc/readline/INSTALL
+#usr/share/doc/readline/README
 #usr/share/info/history.info
 #usr/share/info/readline.info
 #usr/share/info/rluserman.info
index 1e33068123d1b5cf206834c1c4756507e0f6c6e6..334c243a4ef3de1d5055dcddb2134fc567040636 100644 (file)
@@ -1,2 +1,3 @@
-usr/local/sbin/setup
-bin/probenic.sh
+usr/bin/probenic.sh
+usr/sbin/setup
+usr/share/locale/de/LC_MESSAGES/setup.mo
index c6afc2c79758a2812440c8576b6cc01be0645466..0ebef78c70cfcd4c3d9b5af57d1176bda54e290f 100644 (file)
-#usr/doc
-#usr/doc/slang
-#usr/doc/slang/COPYING
-#usr/doc/slang/COPYING.ART
-#usr/doc/slang/COPYING.GPL
-#usr/doc/slang/COPYRIGHT
-#usr/doc/slang/changes.txt
-#usr/doc/slang/cref.txt
-#usr/doc/slang/cslang.txt
-#usr/doc/slang/slang.txt
-#usr/doc/slang/slangdoc.html
-#usr/doc/slang/slangfun.txt
+#etc/slsh.rc
+#usr/bin/slsh
 #usr/include/slang.h
 #usr/include/slcurses.h
-#usr/lib/libslang-utf8.a
-usr/lib/libslang-utf8.so
-usr/lib/libslang-utf8.so.1
-usr/lib/libslang-utf8.so.1.4.9
-#usr/lib/libslang.a
-usr/lib/libslang.so
+#usr/lib/libslang.so
+usr/lib/libslang.so.2
+usr/lib/libslang.so.2.2.4
+#usr/lib/pkgconfig/slang.pc
+#usr/lib/slang
+#usr/lib/slang/v2
+#usr/lib/slang/v2/modules
+usr/lib/slang/v2/modules/csv-module.so
+usr/lib/slang/v2/modules/fcntl-module.so
+usr/lib/slang/v2/modules/fork-module.so
+usr/lib/slang/v2/modules/iconv-module.so
+usr/lib/slang/v2/modules/pcre-module.so
+usr/lib/slang/v2/modules/png-module.so
+usr/lib/slang/v2/modules/rand-module.so
+usr/lib/slang/v2/modules/select-module.so
+usr/lib/slang/v2/modules/slsmg-module.so
+usr/lib/slang/v2/modules/socket-module.so
+usr/lib/slang/v2/modules/sysconf-module.so
+usr/lib/slang/v2/modules/termios-module.so
+usr/lib/slang/v2/modules/varray-module.so
+usr/lib/slang/v2/modules/zlib-module.so
+#usr/share/doc/slang
+#usr/share/doc/slang/v2
+#usr/share/doc/slang/v2/COPYING
+#usr/share/doc/slang/v2/changes.txt
+#usr/share/doc/slang/v2/cref.txt
+#usr/share/doc/slang/v2/cslang.txt
+#usr/share/doc/slang/v2/slang.txt
+#usr/share/doc/slang/v2/slangdoc.html
+#usr/share/doc/slang/v2/slangfun.txt
+#usr/share/doc/slsh
+#usr/share/doc/slsh/html
+#usr/share/doc/slsh/html/slshfun-1.html
+#usr/share/doc/slsh/html/slshfun-2.html
+#usr/share/doc/slsh/html/slshfun-3.html
+#usr/share/doc/slsh/html/slshfun-4.html
+#usr/share/doc/slsh/html/slshfun-5.html
+#usr/share/doc/slsh/html/slshfun-6.html
+#usr/share/doc/slsh/html/slshfun-7.html
+#usr/share/doc/slsh/html/slshfun-8.html
+#usr/share/doc/slsh/html/slshfun-9.html
+#usr/share/doc/slsh/html/slshfun.html
+#usr/share/man/man1/slsh.1
+#usr/share/slsh
+#usr/share/slsh/arrayfuns.sl
+#usr/share/slsh/autoload.sl
+#usr/share/slsh/cmaps
+#usr/share/slsh/cmaps/cool.map
+#usr/share/slsh/cmaps/coolwarm.map
+#usr/share/slsh/cmaps/copper.map
+#usr/share/slsh/cmaps/drywet.map
+#usr/share/slsh/cmaps/ds9b.map
+#usr/share/slsh/cmaps/ds9sls.map
+#usr/share/slsh/cmaps/gebco.map
+#usr/share/slsh/cmaps/globe.map
+#usr/share/slsh/cmaps/gray.map
+#usr/share/slsh/cmaps/haxby.map
+#usr/share/slsh/cmaps/hot.map
+#usr/share/slsh/cmaps/jet.map
+#usr/share/slsh/cmaps/no_green.map
+#usr/share/slsh/cmaps/ocean.map
+#usr/share/slsh/cmaps/polar.map
+#usr/share/slsh/cmaps/rainbow.map
+#usr/share/slsh/cmaps/red2green.map
+#usr/share/slsh/cmaps/relief.map
+#usr/share/slsh/cmaps/sealand.map
+#usr/share/slsh/cmaps/seis.map
+#usr/share/slsh/cmaps/split.map
+#usr/share/slsh/cmaps/topo.map
+#usr/share/slsh/cmaps/wysiwyg.map
+#usr/share/slsh/cmdopt.sl
+#usr/share/slsh/csv.sl
+#usr/share/slsh/fcntl.sl
+#usr/share/slsh/fork.sl
+#usr/share/slsh/glob.sl
+#usr/share/slsh/help
+#usr/share/slsh/help/arrayfuns.hlp
+#usr/share/slsh/help/cmdopt.hlp
+#usr/share/slsh/help/csvfuns.hlp
+#usr/share/slsh/help/forkfuns.hlp
+#usr/share/slsh/help/glob.hlp
+#usr/share/slsh/help/onigfuns.hlp
+#usr/share/slsh/help/pcrefuns.hlp
+#usr/share/slsh/help/pngfuns.hlp
+#usr/share/slsh/help/print.hlp
+#usr/share/slsh/help/process.hlp
+#usr/share/slsh/help/profile.hlp
+#usr/share/slsh/help/randfuns.hlp
+#usr/share/slsh/help/readascii.hlp
+#usr/share/slsh/help/require.hlp
+#usr/share/slsh/help/setfuns.hlp
+#usr/share/slsh/help/slsmg.hlp
+#usr/share/slsh/help/sockfuns.hlp
+#usr/share/slsh/help/structfuns.hlp
+#usr/share/slsh/iconv.sl
+#usr/share/slsh/local-packages
+#usr/share/slsh/onig.sl
+#usr/share/slsh/pcre.sl
+#usr/share/slsh/png.sl
+#usr/share/slsh/print.sl
+#usr/share/slsh/process.sl
+#usr/share/slsh/profile.sl
+#usr/share/slsh/rand.sl
+#usr/share/slsh/readascii.sl
+#usr/share/slsh/require.sl
+#usr/share/slsh/rline
+#usr/share/slsh/rline/complete.sl
+#usr/share/slsh/rline/editfuns.sl
+#usr/share/slsh/rline/editor.sl
+#usr/share/slsh/rline/emacskeys.sl
+#usr/share/slsh/rline/history.sl
+#usr/share/slsh/rline/histsrch.sl
+#usr/share/slsh/rline/slrline.rc
+#usr/share/slsh/rline/vikeys.sl
+#usr/share/slsh/scripts
+#usr/share/slsh/scripts/jpegsize
+#usr/share/slsh/scripts/lsrpm
+#usr/share/slsh/scripts/sldb
+#usr/share/slsh/scripts/slprof
+#usr/share/slsh/scripts/slstkchk
+#usr/share/slsh/scripts/svnsh
+#usr/share/slsh/select.sl
+#usr/share/slsh/setfuns.sl
+#usr/share/slsh/sldb.sl
+#usr/share/slsh/sldbcore.sl
+#usr/share/slsh/sldbsock.sl
+#usr/share/slsh/slshhelp.sl
+#usr/share/slsh/slshrl.sl
+#usr/share/slsh/slsmg.sl
+#usr/share/slsh/socket.sl
+#usr/share/slsh/stkcheck.sl
+#usr/share/slsh/structfuns.sl
+#usr/share/slsh/sysconf.sl
+#usr/share/slsh/termios.sl
+#usr/share/slsh/varray.sl
+#usr/share/slsh/zlib.sl
diff --git a/config/rootfiles/installer/coreutils b/config/rootfiles/installer/coreutils
deleted file mode 120000 (symlink)
index b41d95a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/coreutils
\ No newline at end of file
diff --git a/config/rootfiles/installer/dhcpcd b/config/rootfiles/installer/dhcpcd
deleted file mode 120000 (symlink)
index ea5996c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/dhcpcd
\ No newline at end of file
diff --git a/config/rootfiles/installer/e2fsprogs b/config/rootfiles/installer/e2fsprogs
deleted file mode 120000 (symlink)
index 2a6ee42..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/e2fsprogs
\ No newline at end of file
diff --git a/config/rootfiles/installer/files b/config/rootfiles/installer/files
deleted file mode 100644 (file)
index aba14d8..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-etc/host.conf
-etc/hosts
-etc/protocols
-
diff --git a/config/rootfiles/installer/findutils b/config/rootfiles/installer/findutils
deleted file mode 120000 (symlink)
index 1114c4c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/findutils
\ No newline at end of file
diff --git a/config/rootfiles/installer/gawk b/config/rootfiles/installer/gawk
deleted file mode 120000 (symlink)
index a7660cf..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/gawk
\ No newline at end of file
diff --git a/config/rootfiles/installer/glibc b/config/rootfiles/installer/glibc
deleted file mode 120000 (symlink)
index 4a46726..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/i586/glibc
\ No newline at end of file
diff --git a/config/rootfiles/installer/grep b/config/rootfiles/installer/grep
deleted file mode 120000 (symlink)
index f7bf2d9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/grep
\ No newline at end of file
diff --git a/config/rootfiles/installer/gzip b/config/rootfiles/installer/gzip
deleted file mode 120000 (symlink)
index 1cbc376..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/gzip
\ No newline at end of file
diff --git a/config/rootfiles/installer/hwdata b/config/rootfiles/installer/hwdata
deleted file mode 120000 (symlink)
index 7ed7e21..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/hwdata
\ No newline at end of file
diff --git a/config/rootfiles/installer/iproute2 b/config/rootfiles/installer/iproute2
deleted file mode 120000 (symlink)
index efe83c5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/iproute2
\ No newline at end of file
diff --git a/config/rootfiles/installer/kbd b/config/rootfiles/installer/kbd
deleted file mode 120000 (symlink)
index 3efe86a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/kbd
\ No newline at end of file
diff --git a/config/rootfiles/installer/libidn b/config/rootfiles/installer/libidn
deleted file mode 120000 (symlink)
index 9750546..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/libidn
\ No newline at end of file
diff --git a/config/rootfiles/installer/libusb b/config/rootfiles/installer/libusb
deleted file mode 120000 (symlink)
index efe4a28..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/libusb
\ No newline at end of file
diff --git a/config/rootfiles/installer/misc-progs b/config/rootfiles/installer/misc-progs
deleted file mode 100644 (file)
index 1e4226b..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-bin/ping
-usr/local/bin/iowrap
diff --git a/config/rootfiles/installer/ncurses b/config/rootfiles/installer/ncurses
deleted file mode 120000 (symlink)
index 7aac8a2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/ncurses
\ No newline at end of file
diff --git a/config/rootfiles/installer/newt b/config/rootfiles/installer/newt
deleted file mode 120000 (symlink)
index b63c480..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/newt
\ No newline at end of file
diff --git a/config/rootfiles/installer/openssl b/config/rootfiles/installer/openssl
deleted file mode 120000 (symlink)
index 8317ffd..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/openssl
\ No newline at end of file
diff --git a/config/rootfiles/installer/parted b/config/rootfiles/installer/parted
deleted file mode 120000 (symlink)
index dc69674..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../packages/parted
\ No newline at end of file
diff --git a/config/rootfiles/installer/pciutils b/config/rootfiles/installer/pciutils
deleted file mode 120000 (symlink)
index 903f124..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/pciutils
\ No newline at end of file
diff --git a/config/rootfiles/installer/pcmciautils b/config/rootfiles/installer/pcmciautils
deleted file mode 120000 (symlink)
index 47b2fe8..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/pcmciautils
\ No newline at end of file
diff --git a/config/rootfiles/installer/pcre b/config/rootfiles/installer/pcre
deleted file mode 120000 (symlink)
index ffd8616..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/pcre
\ No newline at end of file
diff --git a/config/rootfiles/installer/popt b/config/rootfiles/installer/popt
deleted file mode 120000 (symlink)
index d15b2c6..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/popt
\ No newline at end of file
diff --git a/config/rootfiles/installer/reboot b/config/rootfiles/installer/reboot
deleted file mode 100644 (file)
index f1f6d64..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-sbin/reboot
-sbin/halt
diff --git a/config/rootfiles/installer/reiserfsprogs b/config/rootfiles/installer/reiserfsprogs
deleted file mode 120000 (symlink)
index f596f68..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/reiserfsprogs
\ No newline at end of file
diff --git a/config/rootfiles/installer/sed b/config/rootfiles/installer/sed
deleted file mode 120000 (symlink)
index 4b0d3a3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/sed
\ No newline at end of file
diff --git a/config/rootfiles/installer/slang b/config/rootfiles/installer/slang
deleted file mode 120000 (symlink)
index 405fd40..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/slang
\ No newline at end of file
diff --git a/config/rootfiles/installer/sysfsutils b/config/rootfiles/installer/sysfsutils
deleted file mode 120000 (symlink)
index 9c56a9a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/sysfsutils
\ No newline at end of file
diff --git a/config/rootfiles/installer/tar b/config/rootfiles/installer/tar
deleted file mode 120000 (symlink)
index f994ef6..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/tar
\ No newline at end of file
diff --git a/config/rootfiles/installer/usbutils b/config/rootfiles/installer/usbutils
deleted file mode 120000 (symlink)
index dcc136f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/usbutils
\ No newline at end of file
diff --git a/config/rootfiles/installer/util-linux b/config/rootfiles/installer/util-linux
deleted file mode 120000 (symlink)
index f672071..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/i586/util-linux
\ No newline at end of file
diff --git a/config/rootfiles/installer/vim b/config/rootfiles/installer/vim
deleted file mode 120000 (symlink)
index 3ae92f3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/vim
\ No newline at end of file
diff --git a/config/rootfiles/installer/wget b/config/rootfiles/installer/wget
deleted file mode 120000 (symlink)
index b75cdbc..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/wget
\ No newline at end of file
diff --git a/config/rootfiles/installer/xz b/config/rootfiles/installer/xz
deleted file mode 120000 (symlink)
index 61772c7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/xz
\ No newline at end of file
diff --git a/config/rootfiles/installer/zlib b/config/rootfiles/installer/zlib
deleted file mode 120000 (symlink)
index fcdedec..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../common/zlib
\ No newline at end of file
index 9b198c2bdfbae9a082f2d3ef3455fb15abd8b6fd..60e0403d06e4d1def44d0d44881e1c8643c48fad 100644 (file)
@@ -1,8 +1,7 @@
 boot/System.map-KVER-ipfire-pae
-boot/System.map-ipfire-pae
 boot/config-KVER-ipfire-pae
+#boot/initramfs-KVER-ipfire-pae.img
 boot/vmlinuz-KVER-ipfire-pae
-boot/vmlinuz-ipfire-pae
 #lib/modules
 lib/modules/KVER-ipfire-pae
 #lib/modules/KVER-ipfire-pae/build
index 8c935865eacf57596dc31e1f27f8b737fc962dff..eac68059487a9276863b54ea9053fbe0f8b617bc 100644 (file)
@@ -333,6 +333,36 @@ char *de_tr[] = {
 "Keine GRÜNE Schnittstelle zugewiesen.",
 /* TR_NO_HARDDISK */
 "Keine Festplatte gefunden.",
+/* TR_DISK_SELECTION */
+"Festplattenauswahl",
+/* TR_DISK_SELECTION_MSG */
+"Wählen Sie die Festplatte(n), auf die Sie IPFire installieren möchten. Diese wird dann zuerst partitioniert und danach wird ein Dateisystem auf die Partitionen installiert.\n\nALLE DATEN AUF DER FESTPLATTE WERDEN GELÖSCHT.",
+/* TR_NO_DISK_SELECTED */
+"Es wurde kein Datenträger ausgewählt.\n\nBitte wählen Sie einen oder mehrere Festplatten aus, um mit der Installation fortzufahren.",
+/* TR_DISK_SETUP */
+"Festplatten-Setup",
+/* TR_DISK_SETUP_DESC */
+"Das Installationsprogramm wird nun die ausgewählte Festplatte vorbereiten:\n\n  %s\n\nMöchten Sie fortfahren?",
+/* TR_RAID_SETUP */
+"RAID-Setup",
+/* TR_RAID_SETUP_DESC */
+"Das Installationsprogramm wird nun eine RAID-Konfiguration auf den ausgewählten Festplatten anlegen:\n\n  %s\n  %s\n\nMöchten Sie fortfahren?",
+/* TR_DELETE_ALL_DATA */
+"Alle Daten löschen",
+/* TR_DISK_CONFIGURATION_NOT_SUPPORTED */
+"Ihre gewünschte Auswahl wird derzeit nicht unterstützt.",
+/* TR_CREATING_FILESYSTEMS */
+"Erstelle Dateisysteme...",
+/* TR_UNABLE_TO_CREATE_FILESYSTEMS */
+"Die Dateisysteme konnten nicht erstellt werden.",
+/* TR_MOUNTING_FILESYSTEMS */
+"Hänge Dateisysteme ein...",
+/* TR_UNABLE_TO_MOUNT_FILESYSTEMS */
+"Die Dateisysteme konnten nicht eingehangen werden.",
+/* TR_BUILDING_RAID */
+"Erstelle RAID...",
+/* TR_UNABLE_TO_BUILD_RAID */
+"Das RAID konnte nicht erstellt werden.",
 /* TR_NO_IPCOP_TARBALL_FOUND */
 "Auf dem Webserver wurde kein ipcop-Tarball gefunden.",
 /* TR_NO_ORANGE_INTERFACE */
@@ -575,14 +605,14 @@ char *de_tr[] = {
 "Ich akzeptiere diese Lizenz.",
 /* TR_LICENSE_NOT_ACCEPTED */
 "Die Lizenz wurde nicht akzeptiert. Abbruch!",
-/* TR_EXT2FS_DESCR */
-"Ext2 - Dateisystem ohne Journal (empfohlen für Flash)",
-/* TR_EXT3FS_DESCR */
-"Ext3 - Dateisystem mit Journal",
-/* TR_EXT4FS_DESCR */
-"Ext4 - Dateisystem mit Journal",
-/* TR_REISERFS_DESCR */
-"ReiserFS - Dateisystem mit Journal",
+/* TR_EXT4FS */
+"EXT4 - Dateisystem",
+/* TR_EXT4FS_WO_JOURNAL */
+"EXT4 - Dateisystem ohne Journal",
+/* TR_XFS */
+"XFS - Dateisystem",
+/* TR_REISERFS */
+"ReiserFS - Dateisystem",
 /* TR_NO_LOCAL_SOURCE */
 "Kein lokales Quellmedium gefunden. Starte Download.",
 /* TR_DOWNLOADING_ISO */
index 12ac4b5578b9509ca93fe7545ec4a4d1aa3cfa60..12321cdeb90d0efc1cf23852763749f9f75c1938 100644 (file)
@@ -329,6 +329,36 @@ char *en_tr[] = {
 "No GREEN interface assigned.",
 /* TR_NO_HARDDISK */
 "No hard disk found.",
+/* TR_DISK_SELECTION */
+"Disk Selection",
+/* TR_DISK_SELECTION_MSG */
+"Select the disk(s) you want to install IPFire on. First those will be partitioned, and then the partitions will have a filesystem put on them.\n\nALL DATA ON THE DISK WILL BE DESTROYED.",
+/* TR_NO_DISK_SELECTED */
+"No disk has been selected.\n\nPlease select one or more disks you want to install IPFire on.",
+/* TR_DISK_SETUP */
+"Disk Setup",
+/* TR_DISK_SETUP_DESC */
+"The installation program will now prepare the chosen harddisk:\n\n  %s\n\nDo you agree to continue?",
+/* TR_RAID_SETUP */
+"RAID Setup",
+/* TR_RAID_SETUP_DESC */
+"The installation program will now set up a RAID configuration on the selected harddisks:\n\n  %s\n  %s\n\nDo you agree to continue?",
+/* TR_DELETE_ALL_DATA */
+"Delete all data",
+/* TR_DISK_CONFIGURATION_NOT_SUPPORTED */
+"You disk configuration is currently not supported.",
+/* TR_CREATING_FILESYSTEMS */
+"Creating filesystems...",
+/* TR_UNABLE_TO_CREATE_FILESYSTEMS */
+"Unable to create filesystems.",
+/* TR_MOUNTING_FILESYSTEMS */
+"Mounting filesystems...",
+/* TR_UNABLE_TO_MOUNT_FILESYSTEMS */
+"Unable to mount filesystems.",
+/* TR_BUILDING_RAID */
+"Building RAID...",
+/* TR_UNABLE_TO_BUILD_RAID */
+"Unable to build RAID.",
 /* TR_NO_IPCOP_TARBALL_FOUND */
 "No ipcop tarball found on Web Server.",
 /* TR_NO_ORANGE_INTERFACE */
@@ -571,14 +601,14 @@ char *en_tr[] = {
 "I accept this license.",
 /* TR_LICENSE_NOT_ACCEPTED */
 "License not accepted. Exit!",
-/* TR_EXT2FS_DESCR */
-"Ext2 - Filesystem without journal (suggested for flashdrives)",
-/* TR_EXT3FS_DESCR */
-"Ext3 - Filesystem with journal",
-/* TR_EXT4FS_DESCR */
-"Ext4 - Filesystem with journal",
-/* TR_REISERFS_DESCR */
-"ReiserFS - Filesystem with journal",
+/* TR_EXT4FS */
+"EXT4 - Filesystem",
+/* TR_EXT4FS_WO_JOURNAL */
+"EXT4 - Filesystem without journal",
+/* TR_XFS */
+"XFS - Filesystem",
+/* TR_REISERFS */
+"ReiserFS - Filesystem",
 /* TR_NO_LOCAL_SOURCE */
 "No local source media found. Starting download.",
 /* TR_DOWNLOADING_ISO */
index 4a08748ccdbad94986228768e852ca1c9830d28d..b23bb573cf4f26d4052c155f0249320942856722 100644 (file)
@@ -325,6 +325,36 @@ char *es_tr[] = {
 "No se asignó interfaz GREEN.",
 /* TR_NO_HARDDISK */
 "No se encontró unidad de disco duro.",
+/* TR_DISK_SELECTION */
+"Disk Selection",
+/* TR_DISK_SELECTION_MSG */
+"Select the disk(s) you want to install IPFire on. First those will be partitioned, and then the partitions will have a filesystem put on them.\n\nALL DATA ON THE DISK WILL BE DESTROYED.",
+/* TR_NO_DISK_SELECTED */
+"No disk has been selected.\n\nPlease select one or more disks you want to install IPFire on.",
+/* TR_DISK_SETUP */
+"Disk Setup",
+/* TR_DISK_SETUP_DESC */
+"The installation program will now prepare the chosen harddisk:\n\n  %s\n\nDo you agree to continue?",
+/* TR_RAID_SETUP */
+"RAID Setup",
+/* TR_RAID_SETUP_DESC */
+"The installation program will now set up a RAID configuration on the selected harddisks:\n\n  %s\n  %s\n\nDo you agree to continue?",
+/* TR_DELETE_ALL_DATA */
+"Delete all data",
+/* TR_DISK_CONFIGURATION_NOT_SUPPORTED */
+"You disk configuration is currently not supported.",
+/* TR_CREATING_FILESYSTEMS */
+"Creating filesystems...",
+/* TR_UNABLE_TO_CREATE_FILESYSTEMS */
+"Unable to create filesystems.",
+/* TR_MOUNTING_FILESYSTEMS */
+"Mounting filesystems...",
+/* TR_UNABLE_TO_MOUNT_FILESYSTEMS */
+"Unable to mount filesystems.",
+/* TR_BUILDING_RAID */
+"Building RAID...",
+/* TR_UNABLE_TO_BUILD_RAID */
+"Unable to build RAID.",
 /* TR_NO_IPCOP_TARBALL_FOUND */
 "No se encontró ningun archivo tarball de ipcop en el servidor web",
 /* TR_NO_ORANGE_INTERFACE */
@@ -567,14 +597,14 @@ char *es_tr[] = {
 "I accept this license.",
 /* TR_LICENSE_NOT_ACCEPTED */
 "License not accepted. Exit!",
-/* TR_EXT2FS_DESCR */
-"Ext2 - Filesystem without journal (suggested for flashdrives)",
-/* TR_EXT3FS_DESCR */
-"Ext3 - Filesystem with journal",
-/* TR_EXT4FS_DESCR */
-"Ext4 - Filesystem with journal",
-/* TR_REISERFS_DESCR */
-"ReiserFS - Filesystem with journal",
+/* TR_EXT4FS */
+"EXT4 - Filesystem",
+/* TR_EXT4FS_WO_JOURNAL */
+"EXT4 - Filesystem without journal",
+/* TR_XFS */
+"XFS - Filesystem",
+/* TR_REISERFS */
+"ReiserFS - Filesystem",
 /* TR_NO_LOCAL_SOURCE */
 "No local source media found. Starting download.",
 /* TR_DOWNLOADING_ISO */
index 188e0fd1a5afcf1f4780518cef27a336bda0a1e1..a1702ef24f5bddbcc9a958895c1a5c8abc0c60f1 100644 (file)
@@ -325,6 +325,36 @@ char *fr_tr[] = {
 "Interface VERTE non attribuée.",
 /* TR_NO_HARDDISK */
 "Aucun disque dur trouvé.",
+/* TR_DISK_SELECTION */
+"Disk Selection",
+/* TR_DISK_SELECTION_MSG */
+"Select the disk(s) you want to install IPFire on. First those will be partitioned, and then the partitions will have a filesystem put on them.\n\nALL DATA ON THE DISK WILL BE DESTROYED.",
+/* TR_NO_DISK_SELECTED */
+"No disk has been selected.\n\nPlease select one or more disks you want to install IPFire on.",
+/* TR_DISK_SETUP */
+"Disk Setup",
+/* TR_DISK_SETUP_DESC */
+"The installation program will now prepare the chosen harddisk:\n\n  %s\n\nDo you agree to continue?",
+/* TR_RAID_SETUP */
+"RAID Setup",
+/* TR_RAID_SETUP_DESC */
+"The installation program will now set up a RAID configuration on the selected harddisks:\n\n  %s\n  %s\n\nDo you agree to continue?",
+/* TR_DELETE_ALL_DATA */
+"Delete all data",
+/* TR_DISK_CONFIGURATION_NOT_SUPPORTED */
+"You disk configuration is currently not supported.",
+/* TR_CREATING_FILESYSTEMS */
+"Creating filesystems...",
+/* TR_UNABLE_TO_CREATE_FILESYSTEMS */
+"Unable to create filesystems.",
+/* TR_MOUNTING_FILESYSTEMS */
+"Mounting filesystems...",
+/* TR_UNABLE_TO_MOUNT_FILESYSTEMS */
+"Unable to mount filesystems.",
+/* TR_BUILDING_RAID */
+"Building RAID...",
+/* TR_UNABLE_TO_BUILD_RAID */
+"Unable to build RAID.",
 /* TR_NO_IPCOP_TARBALL_FOUND */
 "Aucun tarball ipcop trouvé sur le serveur Web.",
 /* TR_NO_ORANGE_INTERFACE */
@@ -567,14 +597,14 @@ char *fr_tr[] = {
 "J'accepte les termes de cette licence.",
 /* TR_LICENSE_NOT_ACCEPTED */
 "Je n'accepte pas les termes de cette licence, quitter le programme d'installation.",
-/* TR_EXT2FS_DESCR */
-"Ext2 - Système de fichiers sans journal (suggéré pour les cartes flash)",
-/* TR_EXT3FS_DESCR */
-"Ext3 - Système de fichiers avec journal",
-/* TR_EXT4FS_DESCR */
-"Ext4 - Système de fichiers avec journal",
-/* TR_REISERFS_DESCR */
-"ReiserFS - Système de fichiers avec journal",
+/* TR_EXT4FS */
+"EXT4 - Filesystem",
+/* TR_EXT4FS_WO_JOURNAL */
+"EXT4 - Filesystem without journal",
+/* TR_XFS */
+"XFS - Filesystem",
+/* TR_REISERFS */
+"ReiserFS - Filesystem",
 /* TR_NO_LOCAL_SOURCE */
 "Pas de source locale trouvée. Démarrage du téléchargement.",
 /* TR_DOWNLOADING_ISO */
index cd43fc554c87962d2fa9cc29cb8761b7e3b2de04..36cd44335a36862684f42295198dbed8b9259636 100644 (file)
@@ -329,6 +329,36 @@ char *nl_tr[] = {
 "Er is geen GROENE interface toegewezen.",
 /* TR_NO_HARDDISK */
 "Geen vaste schijf gevonden.",
+/* TR_DISK_SELECTION */
+"Disk Selection",
+/* TR_DISK_SELECTION_MSG */
+"Select the disk(s) you want to install IPFire on. First those will be partitioned, and then the partitions will have a filesystem put on them.\n\nALL DATA ON THE DISK WILL BE DESTROYED.",
+/* TR_NO_DISK_SELECTED */
+"No disk has been selected.\n\nPlease select one or more disks you want to install IPFire on.",
+/* TR_DISK_SETUP */
+"Disk Setup",
+/* TR_DISK_SETUP_DESC */
+"The installation program will now prepare the chosen harddisk:\n\n  %s\n\nDo you agree to continue?",
+/* TR_RAID_SETUP */
+"RAID Setup",
+/* TR_RAID_SETUP_DESC */
+"The installation program will now set up a RAID configuration on the selected harddisks:\n\n  %s\n  %s\n\nDo you agree to continue?",
+/* TR_DELETE_ALL_DATA */
+"Delete all data",
+/* TR_DISK_CONFIGURATION_NOT_SUPPORTED */
+"You disk configuration is currently not supported.",
+/* TR_CREATING_FILESYSTEMS */
+"Creating filesystems...",
+/* TR_UNABLE_TO_CREATE_FILESYSTEMS */
+"Unable to create filesystems.",
+/* TR_MOUNTING_FILESYSTEMS */
+"Mounting filesystems...",
+/* TR_UNABLE_TO_MOUNT_FILESYSTEMS */
+"Unable to mount filesystems.",
+/* TR_BUILDING_RAID */
+"Building RAID...",
+/* TR_UNABLE_TO_BUILD_RAID */
+"Unable to build RAID.",
 /* TR_NO_IPCOP_TARBALL_FOUND */
 "Er is geen ipcop tarball gevonden op de webserver.",
 /* TR_NO_ORANGE_INTERFACE */
@@ -571,14 +601,14 @@ char *nl_tr[] = {
 "Ik accepteer deze licentie.",
 /* TR_LICENSE_NOT_ACCEPTED */
 "Licentie niet geaccepteerd. Stopt!",
-/* TR_EXT2FS_DESCR */
-"Ext2 - Bestandssysteem zonder journal (geschikt voor flashdrives)",
-/* TR_EXT3FS_DESCR */
-"Ext3 - Bestandssysteem met journal",
-/* TR_EXT4FS_DESCR */
-"Ext4 - Bestandssysteem met journal",
-/* TR_REISERFS_DESCR */
-"ReiserFS - Bestandssysteem met journal",
+/* TR_EXT4FS */
+"EXT4 - Filesystem",
+/* TR_EXT4FS_WO_JOURNAL */
+"EXT4 - Filesystem without journal",
+/* TR_XFS */
+"XFS - Filesystem",
+/* TR_REISERFS */
+"ReiserFS - Filesystem",
 /* TR_NO_LOCAL_SOURCE */
 "Geen lokale bronmedia gevonden. Start download.",
 /* TR_DOWNLOADING_ISO */
index dddf551a67604f93f30a42ecf0a97f5ae47b1a9b..21e705f9287fabe578075629816179756fde87b0 100644 (file)
@@ -325,6 +325,36 @@ char *pl_tr[] = {
 "Nie przypisano interfejsu GREEN.",
 /* TR_NO_HARDDISK */
 "Nie znaleziono dysku twardego.",
+/* TR_DISK_SELECTION */
+"Disk Selection",
+/* TR_DISK_SELECTION_MSG */
+"Select the disk(s) you want to install IPFire on. First those will be partitioned, and then the partitions will have a filesystem put on them.\n\nALL DATA ON THE DISK WILL BE DESTROYED.",
+/* TR_NO_DISK_SELECTED */
+"No disk has been selected.\n\nPlease select one or more disks you want to install IPFire on.",
+/* TR_DISK_SETUP */
+"Disk Setup",
+/* TR_DISK_SETUP_DESC */
+"The installation program will now prepare the chosen harddisk:\n\n  %s\n\nDo you agree to continue?",
+/* TR_RAID_SETUP */
+"RAID Setup",
+/* TR_RAID_SETUP_DESC */
+"The installation program will now set up a RAID configuration on the selected harddisks:\n\n  %s\n  %s\n\nDo you agree to continue?",
+/* TR_DELETE_ALL_DATA */
+"Delete all data",
+/* TR_DISK_CONFIGURATION_NOT_SUPPORTED */
+"You disk configuration is currently not supported.",
+/* TR_CREATING_FILESYSTEMS */
+"Creating filesystems...",
+/* TR_UNABLE_TO_CREATE_FILESYSTEMS */
+"Unable to create filesystems.",
+/* TR_MOUNTING_FILESYSTEMS */
+"Mounting filesystems...",
+/* TR_UNABLE_TO_MOUNT_FILESYSTEMS */
+"Unable to mount filesystems.",
+/* TR_BUILDING_RAID */
+"Building RAID...",
+/* TR_UNABLE_TO_BUILD_RAID */
+"Unable to build RAID.",
 /* TR_NO_IPCOP_TARBALL_FOUND */
 "Nie znaleziono archiwum tar ipcop na serwerze Web.",
 /* TR_NO_ORANGE_INTERFACE */
@@ -567,14 +597,14 @@ char *pl_tr[] = {
 "Akceptuję licencję.",
 /* TR_LICENSE_NOT_ACCEPTED */
 "Nie zaakceptowano licencji.Wyjście!",
-/* TR_EXT2FS_DESCR */
-"Ext2 - System plików bez dziennika (zalecany dla napędów flash)",
-/* TR_EXT3FS_DESCR */
-"Ext3 - System plików z dziennikiem",
-/* TR_EXT4FS_DESCR */
-"Ext4 - System plików z dziennikiem",
-/* TR_REISERFS_DESCR */
-"ReiserFS - System plików z dziennikiem",
+/* TR_EXT4FS */
+"EXT4 - Filesystem",
+/* TR_EXT4FS_WO_JOURNAL */
+"EXT4 - Filesystem without journal",
+/* TR_XFS */
+"XFS - Filesystem",
+/* TR_REISERFS */
+"ReiserFS - Filesystem",
 /* TR_NO_LOCAL_SOURCE */
 "Brak lokalnego źródła. Rozpoczynanie pobierania.",
 /* TR_DOWNLOADING_ISO */
index 40293a209c10e63e72716b235d0bf81714de22e9..8351668dfeca998e93750095e624ac07b736ec66 100644 (file)
@@ -323,6 +323,36 @@ char *ru_tr[] = {
 "Не назначен  GREEN интерфейс.",
 /* TR_NO_HARDDISK */
 "Не найден жсткий диск.",
+/* TR_DISK_SELECTION */
+"Disk Selection",
+/* TR_DISK_SELECTION_MSG */
+"Select the disk(s) you want to install IPFire on. First those will be partitioned, and then the partitions will have a filesystem put on them.\n\nALL DATA ON THE DISK WILL BE DESTROYED.",
+/* TR_NO_DISK_SELECTED */
+"No disk has been selected.\n\nPlease select one or more disks you want to install IPFire on.",
+/* TR_DISK_SETUP */
+"Disk Setup",
+/* TR_DISK_SETUP_DESC */
+"The installation program will now prepare the chosen harddisk:\n\n  %s\n\nDo you agree to continue?",
+/* TR_RAID_SETUP */
+"RAID Setup",
+/* TR_RAID_SETUP_DESC */
+"The installation program will now set up a RAID configuration on the selected harddisks:\n\n  %s\n  %s\n\nDo you agree to continue?",
+/* TR_DELETE_ALL_DATA */
+"Delete all data",
+/* TR_DISK_CONFIGURATION_NOT_SUPPORTED */
+"You disk configuration is currently not supported.",
+/* TR_CREATING_FILESYSTEMS */
+"Creating filesystems...",
+/* TR_UNABLE_TO_CREATE_FILESYSTEMS */
+"Unable to create filesystems.",
+/* TR_MOUNTING_FILESYSTEMS */
+"Mounting filesystems...",
+/* TR_UNABLE_TO_MOUNT_FILESYSTEMS */
+"Unable to mount filesystems.",
+/* TR_BUILDING_RAID */
+"Building RAID...",
+/* TR_UNABLE_TO_BUILD_RAID */
+"Unable to build RAID.",
 /* TR_NO_IPCOP_TARBALL_FOUND */
 "На сервере не найден архив ipcop.",
 /* TR_NO_ORANGE_INTERFACE */
@@ -565,14 +595,14 @@ char *ru_tr[] = {
 "Я принимаю эту лицензию.",
 /* TR_LICENSE_NOT_ACCEPTED */
 "Лицензия не принята. Выход!",
-/* TR_EXT2FS_DESCR */
-"Ext2 - Файловая система без журналирования (Рекомендуется для флеш-носителей)",
-/* TR_EXT3FS_DESCR */
-"Ext3 - Файловая система с журналированием",
-/* TR_EXT4FS_DESCR */
-"Ext4 - Файловая система с журналированием",
-/* TR_REISERFS_DESCR */
-"ReiserFS - Файловая система с журналированием",
+/* TR_EXT4FS */
+"EXT4 - Filesystem",
+/* TR_EXT4FS_WO_JOURNAL */
+"EXT4 - Filesystem without journal",
+/* TR_XFS */
+"XFS - Filesystem",
+/* TR_REISERFS */
+"ReiserFS - Filesystem",
 /* TR_NO_LOCAL_SOURCE */
 "Локальный источник не найден. Начинаю загрузку.",
 /* TR_DOWNLOADING_ISO */
index 814949a84e62a9b77618d9b3c4ad1d54e334d11f..1746dfa1663a0391721081d3ace60828a30aab48 100644 (file)
@@ -329,6 +329,36 @@ char *tr_tr[] = {
 "Hiçbir YEŞİL ara birim atanmamış.",
 /* TR_NO_HARDDISK */
 "Sabit disk bulunamadı.",
+/* TR_DISK_SELECTION */
+"Disk Selection",
+/* TR_DISK_SELECTION_MSG */
+"Select the disk(s) you want to install IPFire on. First those will be partitioned, and then the partitions will have a filesystem put on them.\n\nALL DATA ON THE DISK WILL BE DESTROYED.",
+/* TR_NO_DISK_SELECTED */
+"No disk has been selected.\n\nPlease select one or more disks you want to install IPFire on.",
+/* TR_DISK_SETUP */
+"Disk Setup",
+/* TR_DISK_SETUP_DESC */
+"The installation program will now prepare the chosen harddisk:\n\n  %s\n\nDo you agree to continue?",
+/* TR_RAID_SETUP */
+"RAID Setup",
+/* TR_RAID_SETUP_DESC */
+"The installation program will now set up a RAID configuration on the selected harddisks:\n\n  %s\n  %s\n\nDo you agree to continue?",
+/* TR_DELETE_ALL_DATA */
+"Delete all data",
+/* TR_DISK_CONFIGURATION_NOT_SUPPORTED */
+"You disk configuration is currently not supported.",
+/* TR_CREATING_FILESYSTEMS */
+"Creating filesystems...",
+/* TR_UNABLE_TO_CREATE_FILESYSTEMS */
+"Unable to create filesystems.",
+/* TR_MOUNTING_FILESYSTEMS */
+"Mounting filesystems...",
+/* TR_UNABLE_TO_MOUNT_FILESYSTEMS */
+"Unable to mount filesystems.",
+/* TR_BUILDING_RAID */
+"Building RAID...",
+/* TR_UNABLE_TO_BUILD_RAID */
+"Unable to build RAID.",
 /* TR_NO_IPCOP_TARBALL_FOUND */
 "Web sunucuda hiçbir ipfire arşivi bulunamadı.",
 /* TR_NO_ORANGE_INTERFACE */
@@ -571,14 +601,14 @@ char *tr_tr[] = {
 "Bu lisansı kabul ediyorum.",
 /* TR_LICENSE_NOT_ACCEPTED */
 "Lisans kabul edilmedi. Çık!",
-/* TR_EXT2FS_DESCR */
-"Ext2 - Günlük olmadan dosya sistemi (flash sürücüler için önerilen)",
-/* TR_EXT3FS_DESCR */
-"Ext3 - Günlük ile dosya sistemi",
-/* TR_EXT4FS_DESCR */
-"Ext4 - Günlük ile dosya sistemi",
-/* TR_REISERFS_DESCR */
-"ReiserFS - Günlük ile dosya sistemi",
+/* TR_EXT4FS */
+"EXT4 - Filesystem",
+/* TR_EXT4FS_WO_JOURNAL */
+"EXT4 - Filesystem without journal",
+/* TR_XFS */
+"XFS - Filesystem",
+/* TR_REISERFS */
+"ReiserFS - Filesystem",
 /* TR_NO_LOCAL_SOURCE */
 "Yerel kaynak medya bulunamadı. İndirme başlatılıyor​​.",
 /* TR_DOWNLOADING_ISO */
index c89ff545a99b6e1a6952f219b19abd8ffecbe4d6..862c94432e56282c592dc3ba6b4ce42c8bc2af92 100644 (file)
--- a/lfs/bash
+++ b/lfs/bash
@@ -24,7 +24,7 @@
 
 include Config
 
-VER        = 3.2
+VER        = 4.3
 
 THISAPP    = bash-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -35,20 +35,15 @@ DIR_APP    = $(DIR_SRC)/$(THISAPP)
 #
 ifeq "$(ROOT)" ""
   TARGET = $(DIR_INFO)/$(THISAPP)
-  EXTRA_CONFIG = --prefix=/usr --bindir=/bin \
-    --without-bash-malloc --with-installed-readline \
-    --disable-nls
-  EXTRA_MAKE =
-  EXTRA_INSTALL =
+  CONFIGURE_OPTIONS = --prefix=/usr --bindir=/bin \
+    --with-installed-readline
 else
   TARGET = $(DIR_INFO)/$(THISAPP)-tools
-  EXTRA_CONFIG = --prefix=/tools --without-bash-malloc \
-    --disable-nls
-  EXTRA_MAKE = 
-  EXTRA_INSTALL = 
+  CONFIGURE_OPTIONS = --prefix=/tools
 endif
 
-EXTRA_CONFIG += ac_cv_func_working_mktime=yes
+CONFIGURE_OPTIONS += \
+       --without-bash-malloc
 
 ###############################################################################
 # Top-level Rules
@@ -58,7 +53,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE)             = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5         = 00bfa16d58e034e3c2aa27f390390d30
+$(DL_FILE)_MD5         = 81348932d5da294953e15d4814c74dd1
 
 install : $(TARGET)
 
@@ -87,24 +82,31 @@ $(subst %,%_MD5,$(objects)) :
 
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
-       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zaxf $(DIR_DL)/$(DL_FILE)
 
-       for i in $$(seq 1 51); do \
-               cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/bash/bash32-$$(printf "%03d" "$${i}") || exit 1; \
+       sed -e "s/filename, RTLD_LAZY/filename, RTLD_NOW/" \
+               -i $(DIR_APP)/builtins/enable.def
+
+       for i in $$(seq 1 18); do \
+               cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/bash/bash43-$$(printf "%03d" "$${i}") || exit 1; \
        done
 
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/bash-4.0-paths-1.patch
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/bash-4.0-profile-1.patch
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/bash-3.2-ssh_source_bash.patch
-       cd $(DIR_APP) && ./configure $(EXTRA_CONFIG)
-       cd $(DIR_APP) && make $(EXTRA_MAKE)
-       cd $(DIR_APP) && make $(EXTRA_INSTALL) install
+
+       cd $(DIR_APP) && ./configure $(CONFIGURE_OPTIONS)
+       cd $(DIR_APP) && make $(MAKETUNING)
+       cd $(DIR_APP) && make install
+
        ln -sf bash /bin/sh
+
 ifneq "$(ROOT)" ""
        -mkdir -p $(ROOT)/bin
        -mkdir -p $(ROOT)/usr/bin
        ln -sf bash /tools/bin/sh
        -ln -sf /tools/bin/bash $(ROOT)/bin/sh
 endif
+
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
index 5a85002bae545d35d6b3bb75e086505bcaaaf796..7a569a0caab93290c4827cd088f355b95571bc1e 100644 (file)
--- a/lfs/cdrom
+++ b/lfs/cdrom
@@ -78,7 +78,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        tar -x -C /tmp -f /$(SNAME).tar
        rm -f /$(SNAME).tar
        @mkdir /tmp/sys
-       cd /tmp && tar  cf /install/cdrom/$(SNAME)-$(VERSION).tlz $(TAR_OPTIONS) * && rm -rf *
+       cd /tmp && tar  cf /install/cdrom/distro.img $(TAR_OPTIONS) * && rm -rf *
 
        # Other files
        touch /install/cdrom/$(SNAME)-$(VERSION)-core$(CORE).media
@@ -95,7 +95,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        dd if=/dev/zero  bs=1k count=2            > /install/cdrom/boot/isolinux/boot.catalog
 ifneq "$(MACHINE_TYPE)" "arm"
        cp /boot/vmlinuz-$(KVER)-ipfire             /install/cdrom/boot/isolinux/vmlinuz
-       cp /install/images/initrd                   /install/cdrom/boot/isolinux/instroot
+       dracut --force -a "installer" --strip --xz /install/cdrom/boot/isolinux/instroot $(KVER)-ipfire
        cp $(DIR_SRC)/config/syslinux/boot.png      /install/cdrom/boot/isolinux/boot.png
        cp /usr/lib/memtest86+/memtest.bin          /install/cdrom/boot/isolinux/memtest
        cp /usr/share/ipfire-netboot/ipxe.lkrn      /install/cdrom/boot/isolinux/netboot
@@ -109,8 +109,8 @@ endif
        cd /install/cdrom && find -type f ! -name md5sum.txt | grep -v "./boot" | \
                                                xargs md5sum > md5sum.txt
 
-ifeq "$(MACHINE_TYPE)" "arm"
        mkdir -p /install/images
+ifeq "$(MACHINE_TYPE)" "arm"
        cd /install/cdrom && mkisofs -J -r -V "$(NAME)_$(VERSION)" \
                . > /install/images/$(SNAME)-$(VERSION).$(MACHINE)-full-core$(CORE).iso
 else
index d0f35c205a080e9dfbdcd3f0db00479d6f3fcf99..63d0a889823900ce3170771a354a9d53f5c53fb0 100644 (file)
 
 include Config
 
-VER        = 5.96
+VER        = 8.23
 
 THISAPP    = coreutils-$(VER)
-DL_FILE    = $(THISAPP).tar.bz2
+DL_FILE    = $(THISAPP).tar.xz
 DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 
@@ -35,17 +35,22 @@ DIR_APP    = $(DIR_SRC)/$(THISAPP)
 #
 ifeq "$(ROOT)" ""
   TARGET = $(DIR_INFO)/$(THISAPP)
-  EXTRA_CONFIG = --prefix=/usr --disable-nls
-  EXTRA_MAKE =
-  EXTRA_INSTALL =
+  CONFIGURE_OPTIONS = --prefix=/usr
 else
   TARGET = $(DIR_INFO)/$(THISAPP)-tools
-  EXTRA_CONFIG = --prefix=/tools --disable-nls
-  EXTRA_MAKE = 
-  EXTRA_INSTALL = 
+  CONFIGURE_OPTIONS = --prefix=/tools
 endif
 
-EXTRA_CONFIG += ac_cv_func_working_mktime=yes
+CONFIGURE_OPTIONS += \
+       --disable-selinux \
+       --enable-largefile \
+       --disable-rpath \
+       --enable-install-program=arch \
+       --enable-no-install-program=hostname,kill \
+       --with-tty-group \
+       gl_cv_func_mknod_works=yes
+
+CFLAGS += -fno-strict-aliasing
 
 ###############################################################################
 # Top-level Rules
@@ -55,7 +60,7 @@ objects =$(DL_FILE)
 
 $(DL_FILE)                      = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5                  = bf55d069d82128fd754a090ce8b5acff
+$(DL_FILE)_MD5                  = abed135279f87ad6762ce57ff6d89c41
 
 install : $(TARGET)
 
@@ -84,24 +89,12 @@ $(subst %,%_MD5,$(objects)) :
 
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
-       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE)
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/coreutils-5.96-rename-tee.patch
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/coreutils-5.96-futimes.patch
-ifeq "$(ROOT)" ""
-ifeq "$(MACHINE)" "i586"
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/$(THISAPP)-uname-1.patch
-endif
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/$(THISAPP)-suppress_uptime_kill_su-1.patch
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/$(THISAPP)-i18n-1.patch
-       cd $(DIR_APP) && chmod +x tests/sort/sort-mb-tests
-       cd $(DIR_APP) && sed -i 's/_LEN 6/_LEN 20/' src/who.c
-endif
-       cd $(DIR_APP) && ./configure $(EXTRA_CONFIG)
-       cd $(DIR_APP) && make $(MAKETUNING) $(EXTRA_MAKE)
-       cd $(DIR_APP) && make $(EXTRA_INSTALL) install
-       #use hostname from inet-tools
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
+       cd $(DIR_APP) && ./configure $(CONFIGURE_OPTIONS)
+       cd $(DIR_APP) && make $(MAKETUNING)
+       cd $(DIR_APP) && make install
+
 ifeq "$(ROOT)" ""
-       rm /usr/bin/hostname
        mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin
        mv -v /usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} /bin
        mv -v /usr/bin/{rmdir,stty,sync,true,uname} /bin
@@ -110,8 +103,7 @@ ifeq "$(ROOT)" ""
        ln -sf test /bin/[
        #ln -sf ../../bin/install /usr/bin
        dircolors -p > /etc/DIR_COLORS
-else
-       rm /tools/bin/hostname
 endif
+
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
index aacf7474f69da3408d0a334c99a245d0615bd3ee..e03a021039809e26924cdb9e3dd09d4342774787 100644 (file)
 
 include Config
 
-VER        = 006
+VER        = 038
 
 THISAPP    = dracut-$(VER)
-DL_FILE    = $(THISAPP).tar.bz2
+DL_FILE    = $(THISAPP).tar.xz
 DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 TARGET     = $(DIR_INFO)/$(THISAPP)
@@ -40,7 +40,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = 016052b57001789ec2acf89d382a82f5
+$(DL_FILE)_MD5 = 4487bd98000cc536c5c3839a2f112831
 
 install : $(TARGET)
 
@@ -69,40 +69,14 @@ $(subst %,%_MD5,$(objects)) :
 
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
-       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE)
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
 
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dracut-006_lzma.patch
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dracut-006_remove_cdrom_wait.patch
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dracut-006_add_run_dir.patch
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dracut-006_remove_scsi_wait.patch
+       cd $(DIR_APP) && make $(MAKETUNING)
+       cd $(DIR_APP) && make install sbindir=/sbin sysconfdir=/etc
 
-       cd $(DIR_APP) && cp -vf $(DIR_SRC)/src/dracut/switch_root.c .
+       rm -rf /usr/lib/dracut/modules.d/*{bootchart,dash,fips*,modsign,busybox,convertfs,network,ifcfg,url-lib,gensplash,cms,plymouth,btrfs,crypt*,dm,dmraid,dmsquash-live,livenet,lvm,multipath,qemu*,cifs,dasd*,fcoe*,iscsi,nbd,nfs,resume,ssh-client,zfcp*,systemd*,znet,securityfs,masterkey,selinux,usrmount,uefi-lib}
 
-       cd $(DIR_APP) && make $(MAKETUNING) WITH_SWITCH_ROOT=1
-       cd $(DIR_APP) && make install WITH_SWITCH_ROOT=1 \
-               sbindir=/sbin sysconfdir=/etc
+       cp -vf $(DIR_SRC)/config/dracut/dracut.conf /etc/dracut.conf
 
-       cp -vf $(DIR_SRC)/src/dracut/dracut.conf /etc/dracut.conf.d/
-
-       rm -rf /usr/share/dracut/modules.d/*{dash,fips,redhat-i18n,rpmversion,network,ifcfg,plymouth,btrfs,crypt,dm,dmraid,dmsquash-live,lvm,mdraid,multipath,dasd,dasd_mod,fcoe,iscsi,nbd,nfs,resume,uswsusp,zfcp,znet,selinux}
-
-       sed -e "s/--resolve-names=never//g" -i \
-               /usr/share/dracut/modules.d/99base/init
-
-       # Build initramdisk
-       # Strip all binaries in that initrd, because no debugging code is
-       # needed.
-
-ifeq "$(MACHINE_TYPE)" "arm"
-       # kirkwood kernel
-       /sbin/dracut --force --verbose --strip /boot/ipfirerd-$(KVER)-kirkwood.img $(KVER)-ipfire-kirkwood
-       cd /boot && mkimage -A arm -T ramdisk -C lzma -d ipfirerd-$(KVER)-kirkwood.img uInit-ipfire-kirkwood
-       # arm7 multi kernel
-       /sbin/dracut --force --verbose --strip /boot/ipfirerd-$(KVER)-multi.img $(KVER)-ipfire-multi
-       cd /boot && mkimage -A arm -T ramdisk -C lzma -d ipfirerd-$(KVER)-multi.img uInit-ipfire-multi
-#      cd /boot && cp -f ipfirerd-$(KVER)-multi.img zInit-ipfire-multi
-else
-       /sbin/dracut --force --verbose --strip /boot/ipfirerd-$(KVER).img $(KVER)-ipfire
-endif
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
index 2b0544bd7c053cac6a754d2d2168b62f5410e5bc..23f6dd3fd25fdc86db2a04c6b102bb089c8a4f8e 100644 (file)
--- a/lfs/grub
+++ b/lfs/grub
@@ -1,7 +1,7 @@
 ###############################################################################
 #                                                                             #
 # IPFire.org - A linux based firewall                                         #
-# Copyright (C) 2007-2012  IPFire Team  <info@ipfire.org>                     #
+# Copyright (C) 2007-2014  IPFire Team  <info@ipfire.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        #
 
 include Config
 
-VER        = 0.97
+VER        = 2.00
 
 THISAPP    = grub-$(VER)
-DL_FILE    = $(THISAPP).tar.gz
+DL_FILE    = $(THISAPP).tar.xz
 DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 TARGET     = $(DIR_INFO)/$(THISAPP)
 SUP_ARCH   = i586
+
 CFLAGS     =
 CXXFLAGS   =
 
@@ -43,7 +44,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = cd3f3eb54446be6003156158d51f4884
+$(DL_FILE)_MD5 = a1043102fbc7bcedbf53e7ee3d17ab91
 
 install : $(TARGET)
 
@@ -72,31 +73,28 @@ $(subst %,%_MD5,$(objects)) :
 
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
-       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
-
-       # Applying patches.
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-gentoo-14.patch
-       cd $(DIR_APP) && autoreconf
-       cd $(DIR_APP) && autoconf
-
-       # Build.
-       cd $(DIR_APP) && CFLAGS="$(CFLAGS)" ./configure --prefix=/usr \
-               --disable-auto-linux-mem-opt
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
+       cd $(DIR_APP) && \
+               ./configure \
+                       --prefix=/usr \
+                       --sysconfdir=/etc \
+                       --with-platform=pc \
+                       --with-grubdir=grub \
+                       --program-transform-name=s,grub,grub, \
+                       --disable-grub-mount \
+                       --disable-werror
        cd $(DIR_APP) && make $(MAKETUNING)
        cd $(DIR_APP) && make install
 
-       # grub files
-       mkdir -vp /boot/grub
-       cp -v /usr/lib/grub/i386-pc/stage{1,2} /boot/grub
-       for i in $(DIR_SRC)/config/grub/*; do \
-           [ -f $$i ] && cp -f $$i /boot/grub; \
-       done
+       -mkdir -pv /boot/grub
+       touch /boot/grub/grub.cfg
+       ln -svf ../boot/grub/grub.cfg /etc/grub2.cfg
 
-       # generate default file
-       grub-set-default 0
+       -mkdir -pv /etc/default
+       install -m 644 $(DIR_SRC)/config/grub2/default /etc/default/grub
 
-       # Disable PaX mprotect for grub
-       paxctl -m /usr/sbin/grub
+       # Disable hardening.
+       paxctl -mpes /usr/sbin/grub-bios-setup /usr/sbin/grub-probe
 
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
diff --git a/lfs/initrd b/lfs/initrd
deleted file mode 100644 (file)
index 42da9bc..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-###############################################################################
-#                                                                             #
-# IPFire.org - A linux based firewall                                         #
-# Copyright (C) 2007-2014  IPFire Team  <info@ipfire.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 3 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, see <http://www.gnu.org/licenses/>.       #
-#                                                                             #
-###############################################################################
-
-###############################################################################
-# Definitions
-###############################################################################
-
-include Config
-
-VER = ipfire
-
-THISAPP    = initrd
-DIR_APP    = $(DIR_SRC)/$(THISAPP)
-TARGET     = $(DIR_INFO)/$(THISAPP)
-
-SUP_ARCH   = i586
-
-###############################################################################
-# Top-level Rules
-###############################################################################
-
-install : $(TARGET)
-
-check :
-
-download :
-
-md5 :
-
-###############################################################################
-# Installation Details
-###############################################################################
-
-$(TARGET) :
-       @$(PREBUILD)
-       rm -f /install/images/initrd
-
-       # Finish up initrd directory
-       -mkdir -p /install/initrd/{dev,etc,mnt,root,lib/modules/$(KVER)-ipfire/kernel/drivers,cdrom,dev,harddisk,proc,tmp,usr/share/terminfo/l,var/run,sys}
-       cd /install/initrd && lzma -d -c /boot/ipfirerd-$(KVER).img | cpio -i
-
-       # Copy Files packages for installer
-       find $(DIR_SRC)/config/rootfiles/installer/* -maxdepth 1 | xargs cat | grep -v "^#" > /tmp/ROOTFILES
-
-       # Patch Kernel Version to rootfiles
-       sed -e "s/KVER/$(KVER)/g" -i /tmp/ROOTFILES
-
-       -cd / && cpio -d -p /install/initrd < /tmp/ROOTFILES
-
-       # Copy hid and network modules (and deps)
-       cp -aRf /lib/modules/$(KVER)-ipfire/kernel/drivers/hid \
-               /install/initrd/lib/modules/$(KVER)-ipfire/kernel/drivers/
-       cp -aRf /lib/modules/$(KVER)-ipfire/kernel/drivers/net \
-               /install/initrd/lib/modules/$(KVER)-ipfire/kernel/drivers/
-       cp -aRf /lib/modules/$(KVER)-ipfire/kernel/drivers/pcmcia \
-               /install/initrd/lib/modules/$(KVER)-ipfire/kernel/drivers/
-       cp -aRf /lib/modules/$(KVER)-ipfire/kernel/drivers/ssb \
-               /install/initrd/lib/modules/$(KVER)-ipfire/kernel/drivers/
-       cp -aRf /lib/modules/$(KVER)-ipfire/kernel/drivers/uio \
-               /install/initrd/lib/modules/$(KVER)-ipfire/kernel/drivers/
-       cp -aRf /lib/modules/$(KVER)-ipfire/kernel/drivers/ptp \
-               /install/initrd/lib/modules/$(KVER)-ipfire/kernel/drivers/
-       cp -aRf /lib/modules/$(KVER)-ipfire/kernel/drivers/dca \
-               /install/initrd/lib/modules/$(KVER)-ipfire/kernel/drivers/
-       cp -aRf /lib/modules/$(KVER)-ipfire/kernel/drivers/pps \
-               /install/initrd/lib/modules/$(KVER)-ipfire/kernel/drivers/
-       # Remove wireless modules
-       rm -rf /install/initrd/lib/modules/$(KVER)-ipfire/kernel/drivers/net/wireless
-
-       cd /install/initrd/etc && rm -f fstab
-       cp -aRf $(DIR_SRC)/config/install/* /install/initrd/etc/
-       rm -rf /install/initrd/usr/share/man
-       chmod 755 /install/initrd/etc/halt /install/initrd/etc/rc_installer
-
-       cd /install/initrd/ && patch -Np0 < $(DIR_SRC)/src/patches/dracut-init_start_ipfireinstaller.patch
-
-       # Hide udev messages
-       sed -i -e "s|err|none|g" /install/initrd/etc/udev/udev.conf
-
-       # make new dependencies 
-       depmod -a -F /boot/System.map-$(KVER)-ipfire $(KVER)-ipfire
-
-       -mkdir -p /install/{images,mnt}
-       rm -rf /install/mnt/*
-
-       #Build Module deps for installer.
-       depmod -a -b /install/initrd/ -F /boot/System.map-$(KVER)-ipfire $(KVER)-ipfire
-
-       #Name service from dhcpcd
-       cp -f /etc/nsswitch.conf /install/initrd/etc/
-       cp -f $(DIR_SRC)/config/initrd/dhcpc/* /install/initrd/var/ipfire/dhcpc/dhcpcd-hooks/
-
-       # Install needed locales.
-       -mkdir -pv /install/initrd/usr/lib/locale
-       for lang in $(DIR_SRC)/langs/*; do \
-               for path in /usr/lib/locale/$${lang##*/}*; do \
-                       [ -d "$${path}" ] && cp -lrvf "$${path}" /install/initrd/usr/lib/locale/; \
-               done; \
-       done
-
-       cd /install/initrd && find . | cpio -o -H newc | lzma > /install/images/initrd
-       cd /install/initrd && find ./ -ls > $(DIR_INFO)/_build.initrd.log
-
-       @$(POSTBUILD)
index c02e0bac5c6f374212048e017b255f72e9eb3a1d..7f73222c1b87170742141379b46e50115896a564 100644 (file)
@@ -30,6 +30,8 @@ THISAPP    = installer
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 TARGET     = $(DIR_INFO)/$(THISAPP)
 
+SLOGAN     = An Open Source Firewall Solution
+
 ###############################################################################
 # Top-level Rules
 ###############################################################################
@@ -48,25 +50,20 @@ md5 :
 
 $(TARGET) :
        @$(PREBUILD)
-       -mkdir -p /install/initrd/bin
-       @rm -rf $(DIR_APP) && mkdir $(DIR_APP) && cp -R $(DIR_SRC)/src/install+setup/* $(DIR_APP)
-       for i in $(DIR_SRC)/langs/*/install/lang_*.c ; do \
-           cp $$i $(DIR_APP)/libsmooth; \
-       done
-       cd $(DIR_APP)/libsmooth && chmod 755 makelangs.pl
-       cd $(DIR_APP)/libsmooth && make CFLAGS="-Os -fomit-frame-pointer -Wall \
-           -DNAME='\"$(NAME)\"' -DSNAME='\"$(SNAME)\"' -DVERSION='\"$(VERSION)\"' \
-            -DSLOGAN='\"$(SLOGAN)\"' -DCONFIG_ROOT='\"$(CONFIG_ROOT)\"'" 
-       cd $(DIR_APP)/install && make CFLAGS="-Os -fomit-frame-pointer -Wall \
-           -DNAME='\"$(NAME)\"' -DSNAME='\"$(SNAME)\"' -DVERSION='\"$(VERSION)\"' \
-            -DSLOGAN='\"$(SLOGAN)\"' -DCONFIG_ROOT='\"$(CONFIG_ROOT)\"' -DKERNEL_VERSION='\"$(KVER)\"'"
-       cd $(DIR_APP)/install && install -v -m 0755 install probenic.sh \
-               downloadsource.sh mountsource.sh mountdest.sh /install/initrd/bin
+       @rm -rf $(DIR_APP) && mkdir $(DIR_APP) && cp -R $(DIR_SRC)/src/installer/* $(DIR_APP)
+
+       cd $(DIR_APP) && ./autogen.sh
+       cd $(DIR_APP) && ./configure \
+               --prefix=/usr \
+               --with-distro-name="$(NAME)" \
+               --with-distro-sname="$(SNAME)" \
+               --with-distro-slogan="$(SLOGAN)" \
+               --with-config-root="$(CONFIG_ROOT)"
+       cd $(DIR_APP) && make $(MAKETUNING)
+       cd $(DIR_APP) && make install
+
        #Patch ISO Name for download ...
-       sed -i -e "s|ipfire.iso|download.ipfire.org/releases/ipfire-2.x/$(VERSION)-core$(CORE)/$(SNAME)-$(VERSION).$(MACHINE)-full-core$(CORE).iso|g" \
-                               /install/initrd/bin/downloadsource.sh
-       #Patch version for mediacheck ...
-       sed -i -e "s|FullIPFireVersion|$(SNAME)-$(VERSION)-core$(CORE)|g" \
-                               /install/initrd/bin/mountsource.sh
+       #sed -i -e "s|ipfire.iso|download.ipfire.org/releases/ipfire-2.x/$(VERSION)-core$(CORE)/$(SNAME)-$(VERSION).$(MACHINE)-full-core$(CORE).iso|g" \
+       #                       /usr/bin/downloadsource.sh
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
similarity index 70%
rename from lfs/mktemp
rename to lfs/libsmooth
index 73d834424635638aba03ee4ab0a3bbdd69ebab80..0f7a13537ca11b1320a0a2f20e6036e625c0046f 100644 (file)
 
 include Config
 
-VER        = 1.5
+VER = ipfire
 
-THISAPP    = mktemp-$(VER)
-DL_FILE    = $(THISAPP).tar.bz2
-DL_FROM    = $(URL_IPFIRE)
+THISAPP    = libsmooth
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 TARGET     = $(DIR_INFO)/$(THISAPP)
 
@@ -36,44 +34,26 @@ TARGET     = $(DIR_INFO)/$(THISAPP)
 # Top-level Rules
 ###############################################################################
 
-objects = $(DL_FILE)
-
-$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-
-$(DL_FILE)_MD5 = 3359aa075083aeae3ed6ca67ec5d944b
-
 install : $(TARGET)
 
-check : $(patsubst %,$(DIR_CHK)/%,$(objects))
+check :
 
-download :$(patsubst %,$(DIR_DL)/%,$(objects))
+download :
 
-md5 : $(subst %,%_MD5,$(objects))
-
-###############################################################################
-# Downloading, checking, md5sum
-###############################################################################
-
-$(patsubst %,$(DIR_CHK)/%,$(objects)) :
-       @$(CHECK)
-
-$(patsubst %,$(DIR_DL)/%,$(objects)) :
-       @$(LOAD)
-
-$(subst %,%_MD5,$(objects)) :
-       @$(MD5)
+md5 :
 
 ###############################################################################
 # Installation Details
 ###############################################################################
 
-$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
+$(TARGET) :
        @$(PREBUILD)
-       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE)
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/$(THISAPP)-add_tempfile-3.patch
-       cd $(DIR_APP) && ./configure --prefix=/usr --with-libc
+       @rm -rf $(DIR_APP) && mkdir $(DIR_APP) && cp -R $(DIR_SRC)/src/libsmooth/* $(DIR_APP)
+
+       cd $(DIR_APP) && ./autogen.sh
+       cd $(DIR_APP) && ./configure --prefix=/usr
        cd $(DIR_APP) && make $(MAKETUNING)
        cd $(DIR_APP) && make install
-       cd $(DIR_APP) && make install-tempfile
+
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
index 6beb75c5707b21e7fc50057d66929e7cd3958dad..27621559533c2bbb0679b87fbcb29c7b2302032d 100644 (file)
--- a/lfs/linux
+++ b/lfs/linux
@@ -277,13 +277,11 @@ ifeq "$(KCFG)" "-rpi"
 else
        cd $(DIR_APP) && make $(MAKETUNING) bzImage modules
        cd $(DIR_APP) && cp -v arch/i386/boot/bzImage /boot/vmlinuz-$(VER)-$(VERSUFIX)
-       ln -sf vmlinuz-$(VER)-$(VERSUFIX) /boot/vmlinuz-$(VERSUFIX)
 endif
 endif
 endif
        cd $(DIR_APP) && cp -v System.map /boot/System.map-$(VER)-$(VERSUFIX)
        cd $(DIR_APP) && cp -v .config /boot/config-$(VER)-$(VERSUFIX)
-       ln -sf System.map-$(VER)-$(VERSUFIX) /boot/System.map-$(VERSUFIX)
        cd $(DIR_APP) && make $(MAKETUNING) modules_install
        cd $(DIR_APP) && make $(MAKETUNING) firmware_install
 
@@ -295,6 +293,17 @@ ifeq "$(MACHINE_TYPE)" "arm"
                        done
 endif
 
+       # Create initramfs images
+       dracut --force --verbose --strip /boot/initramfs-$(KVER)-$(VERSUFIX).img $(KVER)-$(VERSUFIX)
+
+ifeq "$(KCFG)" "-kirkwood"
+       cd /boot && mkimage -A arm -T ramdisk -C lzma -d initramfs-$(KVER)-kirkwood.img uInit-ipfire-kirkwood
+endif
+
+ifeq "$(KCFG)" "-multi"
+       cd /boot && mkimage -A arm -T ramdisk -C lzma -d initramfs-$(KVER)-multi.img uInit-ipfire-multi
+endif
+
 ifeq "$(LASTKERNEL)" "1"
        # Only do this once
        cd $(DIR_APP) && install -m 755 usr/gen_init_cpio /sbin/
index 5c4024700fccf823db6e3c8465982b43f06139c6..2970b004c74a6c858565a378d1d19cc44970ccfe 100644 (file)
--- a/lfs/mdadm
+++ b/lfs/mdadm
 
 include Config
 
-VER        = 3.2.1
+VER        = 3.3.1
 
 THISAPP    = mdadm-$(VER)
-DL_FILE    = $(THISAPP).tar.bz2
+DL_FILE    = $(THISAPP).tar.xz
 DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 TARGET     = $(DIR_INFO)/$(THISAPP)
-PROG       = mdadm
-PAK_VER    = 2
-
-DEPS       = ""
 
 ###############################################################################
 # Top-level Rules
@@ -44,7 +40,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = d1e2549202bd79d9e99f1498d1109530
+$(DL_FILE)_MD5 = 4227d48de62dfb217c92fa0c54171bbe
 
 install : $(TARGET)
 
@@ -76,11 +72,9 @@ $(subst %,%_MD5,$(objects)) :
 
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
-       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE)
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/mdadm-3.3.1-Assemble-Only-fail-auto-assemble-in-face-of-mdadm.co.patch
        cd $(DIR_APP) && make $(MAKETUNING)
        cd $(DIR_APP) && make install
-       ln -sf ../init.d/mdadm /etc/rc.d/rcsysinit.d/S11mdadm
-       ln -sf ../init.d/mdadm /etc/rc.d/rc0.d/S85mdadm
-       ln -sf ../init.d/mdadm /etc/rc.d/rc6.d/S75mdadm
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
index 6902ccac19165116982fce88e9e8bb5dc93a1bcc..c0e3919f5537f7c0895a842da29660389a099c1d 100644 (file)
@@ -48,16 +48,8 @@ md5 :
 
 $(TARGET) :
        @$(PREBUILD)
-       @rm -rf $(DIR_APP) $(DIR_SRC)/install+setup && cp -R $(DIR_SRC)/src/misc-progs/ $(DIR_SRC)
-       cp -R $(DIR_SRC)/src/install+setup/ $(DIR_SRC)
-       for i in $(DIR_SRC)/langs/*/install/lang_*.c ; do \
-           cp $$i $(DIR_SRC)/install+setup/libsmooth; \
-       done
-       cd $(DIR_SRC)/install+setup/libsmooth && chmod 755 makelangs.pl
-       cd $(DIR_SRC)/install+setup/libsmooth && make CFLAGS="$(CFLAGS) -Wall \
-           -DNAME='\"$(NAME)\"' -DSNAME='\"$(SNAME)\"' -DVERSION='\"$(VERSION)\"' \
-            -DSLOGAN='\"$(SLOGAN)\"' -DCONFIG_ROOT='\"$(CONFIG_ROOT)\"'" 
+       @rm -rf $(DIR_APP) && cp -R $(DIR_SRC)/src/misc-progs/ $(DIR_SRC)
        cd $(DIR_APP) && make CFLAGS="$(CFLAGS) -Wall -DCONFIG_ROOT='\"$(CONFIG_ROOT)\"' -DSNAME='\"$(SNAME)\"'"
        cd $(DIR_APP) && make install
-       @rm -rf $(DIR_APP) $(DIR_SRC)/install+setup
+       @rm -rf $(DIR_APP)
        @$(POSTBUILD)
index b5c57d0d6b017bc6b8c9f41589814b964b551c49..daad9dce9198f9714152ac2836395f8b0dfc1fdb 100644 (file)
--- a/lfs/newt
+++ b/lfs/newt
@@ -24,7 +24,7 @@
 
 include Config
 
-VER        = 0.51.6
+VER        = 0.52.17
 
 THISAPP    = newt-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -38,9 +38,9 @@ TARGET     = $(DIR_INFO)/$(THISAPP)
 
 objects = $(DL_FILE)
 
-$(DL_FILE)                 = $(DL_FROM)/$(DL_FILE)
+$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5             = 98567d5a18535e3a926dca5b4527b4a9
+$(DL_FILE)_MD5 = f36d4d908965a0c89fd6fd8b61a6118b
 
 install : $(TARGET)
 
@@ -69,13 +69,10 @@ $(subst %,%_MD5,$(objects)) :
 
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
-       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/newt-0.51.6-if1close.patch
-       cd $(DIR_APP) && ./configure --without-gpm-support
-       cd $(DIR_APP) && sed -i 's%^CFLAGS.*$$%CFLAGS = $(CFLAGS) -Wall -D_GNU_SOURCE%' Makefile
-       cd $(DIR_APP) && make
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
+       cd $(DIR_APP) && ./configure --prefix=/usr \
+               --without-gpm-support --without-tcl
+       cd $(DIR_APP) && make $(MAKETUNING)
        cd $(DIR_APP) && make install
-       cd $(DIR_APP) && install -m 0644 newt.h /usr/include
-       ln -sf libnewt.so.0.51 /usr/lib/libnewt.so
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
index 25db9e5c3d7658a6686dcee80de8bc52fc9929ec..6a3718a395ca5a776f88725954a1dae6381c84f1 100644 (file)
 
 include Config
 
-VER        = 2.3
+VER        = 3.1
 
 THISAPP    = parted-$(VER)
-DL_FILE    = $(THISAPP).tar.gz
+DL_FILE    = $(THISAPP).tar.xz
 DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 TARGET     = $(DIR_INFO)/$(THISAPP)
@@ -45,7 +45,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = 30ceb6df7e8681891e865e2fe5a7903d
+$(DL_FILE)_MD5 = 5d89d64d94bcfefa9ce8f59f4b81bdcb
 
 install : $(TARGET)
 
@@ -77,7 +77,7 @@ $(subst %,%_MD5,$(objects)) :
 
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
-       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
        cd $(DIR_APP) && ./configure --prefix=/usr --disable-device-mapper
        cd $(DIR_APP) && make $(MAKETUNING)
        cd $(DIR_APP) && make install
index 46036c8b8770f93c5dabedceae71641cb8189503..b5bd78771c5c56c38fac9d2e54f390ba771e82c8 100644 (file)
--- a/lfs/patch
+++ b/lfs/patch
 
 include Config
 
-VER        = 2.5.4
+VER        = 2.7.1
 
 THISAPP    = patch-$(VER)
-DL_FILE    = $(THISAPP).tar.gz
+DL_FILE    = $(THISAPP).tar.xz
 DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 
@@ -53,7 +53,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = ee5ae84d115f051d87fcaaef3b4ae782
+$(DL_FILE)_MD5 = e9ae5393426d3ad783a300a338c09b72
 
 install : $(TARGET)
 
@@ -82,8 +82,8 @@ $(subst %,%_MD5,$(objects)) :
 
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
-       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
-       cd $(DIR_APP) && CPPFLAGS=-D_GNU_SOURCE ./configure $(EXTRA_CONFIG)
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
+       cd $(DIR_APP) && ./configure $(EXTRA_CONFIG)
        cd $(DIR_APP) && make $(MAKETUNING) $(EXTRA_MAKE)
        cd $(DIR_APP) && make $(EXTRA_INSTALL) install
        @rm -rf $(DIR_APP)
index 7b88adff2c6c6aaed1416eb7469c7dc73425eee9..eb488e3363af3798335470e5dc0bdb97b3e7d31f 100644 (file)
@@ -24,7 +24,7 @@
 
 include Config
 
-VER        = 6.2
+VER        = 6.3
 
 THISAPP    = readline-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -40,7 +40,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = 67948acb2ca081f23359d0256e9a271c
+$(DL_FILE)_MD5 = 33c8fb279e981274f485fd91da77e94a
 
 install : $(TARGET)
 
@@ -71,8 +71,8 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
        @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
 
-       for i in $$(seq 1 4); do \
-               cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/readline/readline62-$$(printf "%03d" "$${i}") || exit 1; \
+       for i in $$(seq 1 6); do \
+               cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/readline/readline63-$$(printf "%03d" "$${i}") || exit 1; \
        done
 
        cd $(DIR_APP) && ./configure --prefix=/usr --disable-static
index 1b33b966c159401eec2d25da224bb80572c88733..764d0edb396a973f9f8b4e1908cc3f22b16dfff2 100644 (file)
--- a/lfs/setup
+++ b/lfs/setup
@@ -48,17 +48,15 @@ md5 :
 
 $(TARGET) :
        @$(PREBUILD)
-       @rm -rf $(DIR_APP) && mkdir $(DIR_APP) && cp -R $(DIR_SRC)/src/install+setup/* $(DIR_APP)
-
-       cd $(DIR_APP)/libsmooth && make CFLAGS="$(CFLAGS) -Wall \
-           -DNAME='\"$(NAME)\"' -DSNAME='\"$(SNAME)\"' -DVERSION='\"$(VERSION)\"' \
-            -DSLOGAN='\"$(SLOGAN)\"' -DCONFIG_ROOT='\"$(CONFIG_ROOT)\"'"
-
-       cd $(DIR_APP)/setup && make CFLAGS="$(CFLAGS) -Wall \
-           -DNAME='\"$(NAME)\"' -DSNAME='\"$(SNAME)\"' -DVERSION='\"$(VERSION)\"' \
-            -DSLOGAN='\"$(SLOGAN)\"' -DCONFIG_ROOT='\"$(CONFIG_ROOT)\"'"
-
-       cd $(DIR_APP)/setup && install -m 0755 setup /usr/local/sbin
-       install -m 0755 $(DIR_SRC)/src/install+setup/install/probenic.sh /bin
+       @rm -rf $(DIR_APP) && mkdir $(DIR_APP) && cp -R $(DIR_SRC)/src/setup/* $(DIR_APP)
+       cd $(DIR_APP) && bash autogen.sh
+       cd $(DIR_APP) && ./configure \
+               --prefix=/usr \
+               --with-distro-name="$(NAME)" \
+               --with-distro-sname="$(SNAME)" \
+               --with-distro-slogan="$(SLOGAN)" \
+               --with-config-root="$(CONFIG_ROOT)"
+       cd $(DIR_APP) && make $(MAKETUNING)
+       cd $(DIR_APP) && make install
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
index e6c8cc88d3d2f90d746240c120067f8ebdb65f60..55590f7cb2c8bff423d8f5328d7589a0ab9925e8 100644 (file)
--- a/lfs/slang
+++ b/lfs/slang
 
 include Config
 
-VER        = 1.4.9
+VER        = 2.2.4
 
 THISAPP    = slang-$(VER)
-DL_FILE    = $(THISAPP).tar.bz2
+DL_FILE    = $(THISAPP).tar.gz
 DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 TARGET     = $(DIR_INFO)/$(THISAPP)
@@ -40,7 +40,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = 4fbb1a7f1257e065ca830deefe13d350
+$(DL_FILE)_MD5 = 86cd8689cd71e281b4720fef8453ceeb
 
 install : $(TARGET)
 
@@ -69,17 +69,9 @@ $(subst %,%_MD5,$(objects)) :
 
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
-       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE)
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/slang-debian-utf8.patch
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/slang-utf8-acs.patch
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/slang-1.4.5-utf8-segv.patch
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/slang-utf8-fix.patch
-       perl -p -i -e 's/(ELF_CFLAGS=\"[^\"]*)-O2([^\"]*\".*)/$1'"$(CFLAGS)"' $2/gs' configure
-       cd $(DIR_APP) && ./configure --prefix=/usr
-       cd $(DIR_APP) && make elf all
-       cd $(DIR_APP) && make install-elf
-       ln -sf libslang-utf8.so.1.4.9 /usr/lib/libslang-utf8.so.1
-       ln -sf libslang-utf8.so /usr/lib/libslang.so
-       ln -sf libslang-utf8.a /usr/lib/libslang.a
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
+       cd $(DIR_APP) && ./configure --prefix=/usr --sysconfdir=/etc
+       cd $(DIR_APP) && make #$(MAKETUNING)
+       cd $(DIR_APP) && make install
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
diff --git a/make.sh b/make.sh
index 4cbdae4fad0040ffcf6aab447e246b0c3b70cef8..fa556194b78bedf93c5c092ddcd31b4103f9efde 100755 (executable)
--- a/make.sh
+++ b/make.sh
@@ -362,7 +362,6 @@ buildbase() {
     lfsmake2 less
     lfsmake2 make
     lfsmake2 man
-    lfsmake2 mktemp
     lfsmake2 kmod
     lfsmake2 net-tools
     lfsmake2 patch
@@ -398,6 +397,9 @@ buildipfire() {
   ipfiremake rpi-firmware
   ipfiremake bc
   ipfiremake u-boot
+  ipfiremake cpio
+  ipfiremake mdadm
+  ipfiremake dracut
 
   case "${TARGET_ARCH}" in
        i586)
@@ -466,8 +468,6 @@ buildipfire() {
   ipfiremake dhcpcd
   ipfiremake boost
   ipfiremake linux-atm
-  ipfiremake cpio
-  ipfiremake dracut
   ipfiremake expat
   ipfiremake gdbm
   ipfiremake pam
@@ -492,6 +492,7 @@ buildipfire() {
   ipfiremake pcre
   ipfiremake slang
   ipfiremake newt
+  ipfiremake libsmooth
   ipfiremake attr
   ipfiremake acl
   ipfiremake libcap
@@ -747,7 +748,6 @@ buildipfire() {
   ipfiremake usb_modeswitch
   ipfiremake usb_modeswitch_data
   ipfiremake zerofree
-  ipfiremake mdadm
   ipfiremake pound
   ipfiremake minicom
   ipfiremake ddrescue
@@ -823,7 +823,6 @@ buildinstaller() {
   ipfiremake memtest
   ipfiremake installer
   installmake strip
-  ipfiremake initrd
 }
 
 buildpackages() {
diff --git a/src/dracut/dracut.conf b/src/dracut/dracut.conf
deleted file mode 100644 (file)
index b671b7a..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-# dracut config file
-
-# Specific list of dracut modules to use
-#dracutmodules+=""
-
-# Dracut modules to omit
-#omit_dracutmodules+=""
-
-# Dracut modules to add to the default
-#add_dracutmodules+=""
-
-# additional kernel modules to the default
-#add_drivers+=""
-
-# list of kernel filesystem modules to be included in the generic initramfs
-filesystems+="ext2 ext3 ext4 reiserfs reiser4 iso9660 vfat"
-
-# build initrd only to boot current hardware
-#hostonly="yes"
-#
-
-# install local /etc/mdadm.conf
-mdadmconf="no"
-
-# install local /etc/lvm/lvm.conf
-lvmconf="no"
diff --git a/src/dracut/switch_root.c b/src/dracut/switch_root.c
deleted file mode 100644 (file)
index 1520387..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * switchroot.c - switch to new root directory and start init.
- *
- * Copyright 2002-2008 Red Hat, Inc.  All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- * Authors:
- *     Peter Jones <pjones@redhat.com>
- *     Jeremy Katz <katzj@redhat.com>
- */
-#include <sys/mount.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-#include <ctype.h>
-#include <dirent.h>
-
-#ifndef MS_MOVE
-#define MS_MOVE 8192
-#endif
-
-enum {
-       ok,
-       err_no_directory,
-       err_usage,
-};
-
-/* remove all files/directories below dirName -- don't cross mountpoints */
-static int
-recursiveRemove(char * dirName)
-{
-       struct stat sb,rb;
-       DIR * dir;
-       struct dirent * d;
-       char * strBuf = alloca(strlen(dirName) + 1024);
-
-       if (!(dir = opendir(dirName))) {
-               printf("error opening %s: %m\n", dirName);
-               return 0;
-       }
-
-       if (fstat(dirfd(dir),&rb)) {
-               printf("unable to stat %s: %m\n", dirName);
-               closedir(dir);
-               return 0;
-       }
-
-       errno = 0;
-
-       while ((d = readdir(dir))) {
-               errno = 0;
-
-               if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, "..")) {
-                       errno = 0;
-                       continue;
-               }
-
-               strcpy(strBuf, dirName);
-               strcat(strBuf, "/");
-               strcat(strBuf, d->d_name);
-
-               if (lstat(strBuf, &sb)) {
-                       printf("failed to stat %s: %m\n", strBuf);
-                       errno = 0;
-                       continue;
-               }
-
-               /* only descend into subdirectories if device is same as dir */
-               if (S_ISDIR(sb.st_mode)) {
-                       if (sb.st_dev == rb.st_dev) {
-                               recursiveRemove(strBuf);
-                               if (rmdir(strBuf))
-                                       printf("failed to rmdir %s: %m\n", strBuf);
-                       }
-                       errno = 0;
-                       continue;
-               }
-               if (unlink(strBuf)) {
-                       printf("failed to remove %s: %m\n", strBuf);
-                       errno = 0;
-                       continue;
-               }
-       }
-
-       if (errno) {
-               closedir(dir);
-               printf("error reading from %s: %m\n", dirName);
-               return 1;
-       }
-
-       closedir(dir);
-       return 0;
-}
-
-static int switchroot(const char *newroot)
-{
-       /*  Don't try to unmount the old "/", there's no way to do it. */
-       const char *umounts[] = { "/dev", "/proc", "/sys", NULL };
-       int errnum;
-       int i;
-
-       for (i = 0; umounts[i] != NULL; i++) {
-               char newmount[PATH_MAX];
-               strcpy(newmount, newroot);
-               strcat(newmount, umounts[i]);
-               if (mount(umounts[i], newmount, NULL, MS_MOVE, NULL) < 0) {
-                       fprintf(stderr, "Error mount moving old %s %s %m\n",
-                               umounts[i], newmount);
-                       fprintf(stderr, "Forcing unmount of %s\n", umounts[i]);
-                       umount2(umounts[i], MNT_FORCE);
-               }
-       }
-
-       if (chdir(newroot) < 0) {
-               errnum=errno;
-               fprintf(stderr, "switchroot: chdir failed: %m\n");
-               errno=errnum;
-               return -1;
-       }
-       recursiveRemove("/");
-       if (mount(newroot, "/", NULL, MS_MOVE, NULL) < 0) {
-               errnum = errno;
-               fprintf(stderr, "switchroot: mount failed: %m\n");
-               errno = errnum;
-               return -1;
-       }
-
-       if (chroot(".")) {
-               errnum = errno;
-               fprintf(stderr, "switchroot: chroot failed: %m\n");
-               errno = errnum;
-               return -2;
-       }
-       return 1;
-}
-
-static void usage(FILE *output)
-{
-       fprintf(output, "usage: switchroot <newrootdir> <init> <args to init>\n");
-       if (output == stderr)
-               exit(err_usage);
-       exit(ok);
-}
-
-int main(int argc, char *argv[])
-{
-       char *newroot = argv[1];
-       char *init = argv[2];
-       char **initargs = &argv[2];
-
-       if (newroot == NULL || newroot[0] == '\0' ||
-           init == NULL || init[0] == '\0' ) {
-               usage(stderr);
-       }
-
-       if (switchroot(newroot) < 0) {
-               fprintf(stderr, "switchroot has failed.  Sorry.\n");
-               return 1;
-       }
-       if (access(initargs[0], X_OK))
-               fprintf(stderr, "WARNING: can't access %s\n", initargs[0]);
-
-       /* get session leader */
-       setsid();
-       /* set controlling terminal */
-       ioctl (0, TIOCSCTTY, 1);
-
-       execv(initargs[0], initargs);
-}
-
index 32236e6cd761615d885f9a7c14ac73975c432945..dca3e40163caeb050dc546684ff0d00258171851 100644 (file)
@@ -28,7 +28,7 @@ ser_console $cmdline
 #
 /etc/init.d/sysklogd start
 export LANG=en_US.utf8
-/usr/local/sbin/setup /dev/tty2 INSTALL
+/usr/sbin/setup /dev/tty2 INSTALL
 if [ "${?}" == "1" ]; then
        echo Setup not finished. Rebooting ...
        reboot -f
diff --git a/src/install+setup/install/config.c b/src/install+setup/install/config.c
deleted file mode 100644 (file)
index b1d533e..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/* SmoothWall install program.
- *
- * This program is distributed under the terms of the GNU General Public
- * Licence.  See the file COPYING for details.
- *
- * (c) Lawrence Manning, 2001
- * Write the config and get password stuff.
- * 
- */
-
-#include "install.h"
-
-extern FILE *flog;
-extern char *mylog;
-
-extern char **ctr;
-
-int write_lang_configs( char *lang)
-{
-       struct keyvalue *kv = initkeyvalues();
-       
-       /* default stuff for main/settings. */
-       replacekeyvalue(kv, "LANGUAGE", lang);
-       replacekeyvalue(kv, "HOSTNAME", SNAME);
-       replacekeyvalue(kv, "THEME", "ipfire");
-       writekeyvalues(kv, "/harddisk" CONFIG_ROOT "/main/settings");
-       freekeyvalues(kv);
-       
-       return 1;
-}
-
-int write_ethernet_configs(struct keyvalue *ethernetkv)
-{
-       /* Write out the network settings we got from a few mins ago. */
-       writekeyvalues(ethernetkv, "/harddisk" CONFIG_ROOT "/ethernet/settings");
-       return 1;
-}
-
-/* Taken from the cdrom one. */
-int getpassword(char *password, char *text)
-{
-       char *values[] = {      NULL, NULL, NULL };     /* pointers for the values. */
-       struct newtWinEntry entries[] =
-       { 
-               { ctr[TR_PASSWORD_PROMPT], &values[0], 2 },
-               { ctr[TR_AGAIN_PROMPT], &values[1], 2 },
-               { NULL, NULL, 0 }
-       };
-       char title[STRING_SIZE];
-       int rc;
-       int done;
-       
-       do
-       {
-               done = 1;
-               sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);
-               rc = newtWinEntries(title, text,
-                       50, 5, 5, 20, entries, ctr[TR_OK], ctr[TR_CANCEL], NULL);
-               
-               if (rc != 2)
-               {
-                       if (strlen(values[0]) == 0 || strlen(values[1]) == 0)
-                       {
-                               errorbox(ctr[TR_PASSWORD_CANNOT_BE_BLANK]);
-                               done = 0;
-                               strcpy(values[0], "");
-                               strcpy(values[1], "");                          
-                       }
-                       else if (strcmp(values[0], values[1]) != 0)
-                       {
-                               errorbox(ctr[TR_PASSWORDS_DO_NOT_MATCH]);
-                               done = 0;
-                               strcpy(values[0], "");
-                               strcpy(values[1], "");                                  
-                       }
-               }
-       }
-       while (!done);
-
-       strncpy(password, values[0], STRING_SIZE);
-
-       if (values[0]) free(values[0]);
-       if (values[1]) free(values[1]);
-
-       return rc;
-}
-       
diff --git a/src/install+setup/install/install.h b/src/install+setup/install/install.h
deleted file mode 100644 (file)
index a6e110f..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/* SmoothWall install program.
- *
- * This program is distributed under the terms of the GNU General Public
- * Licence.  See the file COPYING for details.
- *
- * (c) Lawrence Manning, 2001
- * Main include file.
- * 
- */
-
-#include "../libsmooth/libsmooth.h"
-
-#define IDE_EMPTY 0
-#define IDE_CDROM 1
-#define IDE_HD 2
-#define IDE_UNKNOWN 3
-
-/* CDROMS and harddisks. */
-struct devparams
-{
-       char devnode_disk[30];          // when single partition is addressed
-       char devnode_part[30];          // when the RAID partition is addressed
-       char devnode_disk_run[30];      // the same dev but after installation 
-       char devnode_part_run[30];
-       char modulename[STRING_SIZE];
-       char options[STRING_SIZE];
-};
-
-/* config.c */
-int write_disk_configs(struct devparams *dp);
-int write_lang_configs( char *lang);
-int write_ethernet_configs(struct keyvalue *ethernetkv);
-
-/* unattended.c */
-int unattended_setup(struct keyvalue *unattendedkv);
diff --git a/src/install+setup/install/main.c b/src/install+setup/install/main.c
deleted file mode 100644 (file)
index 309e006..0000000
+++ /dev/null
@@ -1,633 +0,0 @@
-
-/* SmoothWall install program.
- *
- * This program is distributed under the terms of the GNU General Public
- * Licence.  See the file COPYING for details.
- *
- * (c) Lawrence Manning, 2001
- * Contains main entry point, and misc functions.6
- * 
- */
-
-#include "install.h"
-#define _GNU_SOURCE
-#define INST_FILECOUNT 21000
-#define UNATTENDED_CONF "/cdrom/boot/unattended.conf"
-#define LICENSE_FILE   "/cdrom/COPYING"
-
-#define EXT2 0
-#define EXT3 1
-#define EXT4 2
-#define REISERFS 3
-
-FILE *flog = NULL;
-char *mylog;
-
-char **ctr;
-
-extern char url[STRING_SIZE];
-
-struct  nic  nics[20] = { { "" , "" , "" } }; // only defined for compile
-struct knic knics[20] = { { "" , "" , "" , "" } }; // only defined for compile
-
-extern char *en_tr[];
-extern char *es_tr[];
-extern char *de_tr[];
-extern char *fr_tr[];
-extern char *nl_tr[];
-extern char *pl_tr[];
-extern char *ru_tr[];
-extern char *tr_tr[];
-
-int main(int argc, char *argv[])
-{
-
-       char discl_msg[40000] = "Disclaimer\n";
-
-       char *langnames[] = { "Deutsch", "English", "Français", "Español", "Nederlands", "Polski", "Русский", "Türkçe", NULL };
-       char *shortlangnames[] = { "de", "en", "fr", "es", "nl", "pl", "ru", "tr", NULL };
-       char **langtrs[] = { de_tr, en_tr, fr_tr, es_tr, nl_tr, pl_tr, ru_tr, tr_tr, NULL };
-       char hdletter;
-       char harddrive[30], sourcedrive[5];     /* Device holder. */
-       char harddrive_info[STRING_SIZE];       /* Additional infos about target */
-       struct devparams hdparams, cdromparams; /* Params for CDROM and HD */
-       int rc = 0;
-       char commandstring[STRING_SIZE];
-       char mkfscommand[STRING_SIZE];
-       char *fstypes[] = { "ext2", "ext3", "ext4", "ReiserFS", NULL };
-       int fstype = EXT4;
-       int choice;
-       int i;
-       int found = 0;
-       char shortlangname[10];
-       char message[1000];
-       char title[STRING_SIZE];
-       int allok = 0;
-       int allok_fastexit=0;
-       int raid_disk = 0;
-       struct keyvalue *ethernetkv = initkeyvalues();
-       FILE *handle, *cmdfile, *copying;
-       char line[STRING_SIZE];
-       char string[STRING_SIZE];
-       long memory = 0, disk = 0, free;
-       long system_partition, boot_partition, root_partition, swap_file;
-       int scsi_disk = 0;
-       char *yesnoharddisk[3]; //      char *yesnoharddisk = { "NO", "YES", NULL };
-               
-       int unattended = 0;
-       int serialconsole = 0;
-       struct keyvalue *unattendedkv = initkeyvalues();
-       int hardyn = 0;
-       char restore_file[STRING_SIZE] = "";
-
-       setlocale (LC_ALL, "");
-       sethostname( SNAME , 10);
-
-       memset(&hdparams, 0, sizeof(struct devparams));
-       memset(&cdromparams, 0, sizeof(struct devparams));
-
-       /* Log file/terminal stuff. */
-       if (argc >= 2)
-       {               
-               if (!(flog = fopen(argv[1], "w+")))
-                       return 0;
-       }
-       else
-               return 0;
-       
-       mylog = argv[1];
-       
-       fprintf(flog, "Install program started.\n");
-               
-       newtInit();
-       newtCls();
-
-       newtDrawRootText(14, 0, NAME " " VERSION " - " SLOGAN );
-       sprintf (title, "%s %s - %s", NAME, VERSION, SLOGAN);
-
-       if (! (cmdfile = fopen("/proc/cmdline", "r")))
-       {
-               fprintf(flog, "Couldn't open commandline: /proc/cmdline\n");
-       } else {
-               fgets(line, STRING_SIZE, cmdfile);
-               
-               // check if we have to make an unattended install
-               if (strstr (line, "unattended") != NULL) {
-                   unattended = 1;
-                   runcommandwithstatus("/bin/sleep 10", "WARNING: Unattended installation will start in 10 seconds...");
-               }               
-               // check if we have to patch for serial console
-               if (strstr (line, "console=ttyS0") != NULL) {
-                   serialconsole = 1;
-               }
-       }
-
-       // Load common modules
-       mysystem("/sbin/modprobe vfat"); // USB key
-       
-       /* German is the default */
-       for (choice = 0; langnames[choice]; choice++)
-       {
-               if (strcmp(langnames[choice], "English") == 0)
-                       break;
-       }
-       if (!langnames[choice])
-               goto EXIT;
-
-       if (!unattended) {
-           rc = newtWinMenu("Language selection", "Select the language you wish to use for the " NAME ".", 50, 5, 5, 8,
-                   langnames, &choice, "Ok", NULL);
-       }
-
-       ctr = langtrs[choice];
-       strcpy(shortlangname, shortlangnames[choice]);
-
-       newtPushHelpLine(ctr[TR_HELPLINE]);
-
-       if (!unattended) {
-               sprintf(message, ctr[TR_WELCOME], NAME);
-               newtWinMessage(title, ctr[TR_OK], message);
-       }
-
-       mysystem("/bin/mountsource.sh");
-
-       if ((handle = fopen("/tmp/source_device", "r")) == NULL) {
-               newtWinMessage(title, ctr[TR_OK], ctr[TR_NO_LOCAL_SOURCE]);
-               runcommandwithstatus("/bin/downloadsource.sh",ctr[TR_DOWNLOADING_ISO]);
-               if ((handle = fopen("/tmp/source_device", "r")) == NULL) {
-                       errorbox(ctr[TR_DOWNLOAD_ERROR]);
-                       goto EXIT;
-               }
-       }
-
-       fgets(sourcedrive, 5, handle);
-       fprintf(flog, "Source drive: %s\n", sourcedrive);
-       fclose(handle);
-
-       if (!unattended) {
-               // Read the license file.
-               if (!(copying = fopen(LICENSE_FILE, "r"))) {
-                       sprintf(discl_msg, "Could not open license file: %s\n", LICENSE_FILE);
-                       fprintf(flog, discl_msg);
-               } else {
-                       fread(discl_msg, 1, 40000, copying);
-                       fclose(copying);
-
-                       if (disclaimerbox(discl_msg)==0) {
-                               errorbox(ctr[TR_LICENSE_NOT_ACCEPTED]);
-                               goto EXIT;
-                       }
-               }
-       }
-
-       i = 0;
-       while (found == 0) {
-               i++;
-               fprintf(flog, "Harddisk scan pass %i\n", i);
-
-               switch (mysystem("/bin/mountdest.sh") % 255) {
-                       case 0: // Found IDE disk
-                               scsi_disk = 0;
-                               raid_disk = 0;
-                               found = 1;
-                               break;
-                       case 1: // Found SCSI disk
-                               scsi_disk = 1;
-                               raid_disk = 0;
-                               found = 1;
-                               break;
-                       case 2: // Found RAID disk
-                               scsi_disk = 0;
-                               raid_disk= 1;
-                               found = 1;
-                               break;
-                       case 10: // No harddisk found
-                               errorbox(ctr[TR_NO_HARDDISK]);
-                               goto EXIT;
-               }
-       }
-
-       if ((handle = fopen("/tmp/dest_device", "r")) == NULL) {
-               errorbox(ctr[TR_NO_HARDDISK]);
-               goto EXIT;
-       }
-       fgets(harddrive, 30, handle);
-       fclose(handle);
-       if ((handle = fopen("/tmp/dest_device_info", "r")) == NULL) {
-               sprintf(harddrive_info, "%s", harddrive);
-       }
-       fgets(harddrive_info, 70, handle);
-       fclose(handle);
-
-                       
-       /* load unattended configuration */
-       if (unattended) {
-           fprintf(flog, "unattended: Reading unattended.conf\n");
-
-           (void) readkeyvalues(unattendedkv, UNATTENDED_CONF);
-           findkey(unattendedkv, "RESTORE_FILE", restore_file);            
-       }
-       
-       /* Make the hdparms struct and print the contents.
-          With USB-KEY install and SCSI disk, while installing, the disk
-          is named 'sdb,sdc,...' (following keys)
-          On reboot, it will become 'sda'
-          To avoid many test, all names are built in the struct.
-       */
-       sprintf(hdparams.devnode_disk, "/dev/%s", harddrive);
-       /* Address the partition or raid partition (eg dev/sda or /dev/sdap1 */
-       sprintf(hdparams.devnode_part, "/dev/%s%s", harddrive,raid_disk ? "p" : "");
-       /* Now the names after the machine is booted. Only scsi is affected
-          and we only install on the first scsi disk. */
-
-       fprintf(flog, "Destination drive: %s\n", hdparams.devnode_disk);
-       
-       sprintf(message, ctr[TR_PREPARE_HARDDISK], harddrive_info);
-       if (unattended) {
-           hardyn = 1;
-       } else {
-               yesnoharddisk[0] = ctr[TR_NO];
-               yesnoharddisk[1] = ctr[TR_YES];
-               yesnoharddisk[2] = NULL;
-       }
-
-       while (! hardyn) {
-               rc = newtWinMenu(title, message,
-                                50, 5, 5, 6, yesnoharddisk,
-                                &hardyn, ctr[TR_OK],
-                                ctr[TR_CANCEL], NULL);
-               if (rc == 2)
-                       goto EXIT;
-       }
-       if (rc == 2)
-               goto EXIT;
-
-       fstypes[0]=ctr[TR_EXT2FS_DESCR];
-       fstypes[1]=ctr[TR_EXT3FS_DESCR];
-       fstypes[2]=ctr[TR_EXT4FS_DESCR];
-       fstypes[3]=ctr[TR_REISERFS_DESCR];
-       fstypes[4]=NULL;
-
-       if (!unattended) {              
-               sprintf(message, ctr[TR_CHOOSE_FILESYSTEM]);
-               rc = newtWinMenu( ctr[TR_CHOOSE_FILESYSTEM], message,
-                       50, 5, 5, 6, fstypes, &fstype, ctr[TR_OK],
-                       ctr[TR_CANCEL], NULL);
-       } else {
-           rc = 1;
-           fstype = EXT4;
-       }
-       if (rc == 2)
-               goto EXIT;
-
-       /* Calculate amount of memory in machine */
-        if ((handle = fopen("/proc/meminfo", "r")))
-        {
-            while (fgets(line, STRING_SIZE-1, handle)) {
-                if (sscanf (line, "MemTotal: %s kB", string)) {
-                    memory = atoi(string) / 1024 ;
-                }
-            }
-            fclose(handle);
-        }
-
-       /* Partition, mkswp, mkfs.
-        * before partitioning, first determine the sizes of each
-        * partition.  In order to do that we need to know the size of
-        * the disk. 
-        */
-       /* Don't use mysystem here so we can redirect output */
-       sprintf(commandstring, "/sbin/sfdisk -s /dev/%s > /tmp/disksize 2> /dev/null", harddrive);
-       system(commandstring);
-
-       /* Calculate amount of disk space */
-       if ((handle = fopen("/tmp/disksize", "r"))) {
-               fgets(line, STRING_SIZE-1, handle);
-               if (sscanf (line, "%s", string)) {
-                       disk = atoi(string) / 1024;
-               }
-               fclose(handle);
-       }
-       
-       fprintf(flog, "Disksize = %ld, memory = %ld", disk, memory);
-       
-        /* Calculating Swap-Size dependend of Ram Size */
-       if (memory <= 256)
-               swap_file = 128;
-       else if (memory <= 1024 && memory > 256)
-               swap_file = 256;
-       else 
-               swap_file = memory / 4;
-       
-  /* Calculating Root-Size dependend of Max Disk Space */
-  if ( disk < 2048 )
-               root_partition = 1024;
-       else if ( disk >= 2048 && disk <= 3072 )
-               root_partition = 1536;
-       else 
-               root_partition = 2048;
-               
-       
-  /* Calculating the amount of free space */
-       boot_partition = 64; /* in MB */
-       system_partition = disk - ( root_partition + swap_file + boot_partition );
-       
-       fprintf(flog, ", boot = %ld, swap = %ld, mylog = %ld, root = %ld\n",
-       boot_partition, swap_file, system_partition, root_partition);
-       rc = 0;
-
-       if ( (!unattended) && (((disk - (root_partition + swap_file + boot_partition)) < 256 ) && ((disk - (root_partition + boot_partition )) > 256)) ) {
-   rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], ctr[TR_CONTINUE_NO_SWAP]);
-    if (rc == 1){
-      swap_file = 0;
-      system_partition = disk - ( root_partition + swap_file + boot_partition );
-      fprintf(flog, "Changing Swap Size to 0 MB.\n");
-    }
-    else if (rc == 2){
-    fprintf(flog, "Disk is too small.\n");
-    errorbox(ctr[TR_DISK_TOO_SMALL]);goto EXIT;
-    }
-  } 
-  else if (disk - (root_partition + swap_file + boot_partition) >= 256) {
-  
-  }
-  else {
-   fprintf(flog, "Disk is too small.\n");
-   errorbox(ctr[TR_DISK_TOO_SMALL]);goto EXIT;
-  }
-        
-       handle = fopen("/tmp/partitiontable", "w");
-
-       /* Make swapfile */
-  if (swap_file) {
-     fprintf(handle, ",%ld,L,*\n,%ld,S,\n,%ld,L,\n,,L,\n",
-     boot_partition, swap_file, root_partition);
-  } else {
-     fprintf(handle, ",%ld,L,*\n,0,0,\n,%ld,L,\n,,L,\n",
-     boot_partition, root_partition);
-  }
-
-       fclose(handle);
-
-       if (disk < 2097150) {
-               // <2TB use sfdisk and normal mbr
-               snprintf(commandstring, STRING_SIZE, "/sbin/sfdisk -L -uM %s < /tmp/partitiontable", hdparams.devnode_disk);
-       } else {
-               // >2TB use parted with gpt
-               snprintf(commandstring, STRING_SIZE, "/usr/sbin/parted -s %s mklabel gpt mkpart boot ext2 1M 64M mkpart swap linux-swap 64M 1000M mkpart root ext4 1000M 5000M mkpart var ext4 5000M 100%% disk_set pmbr_boot on", hdparams.devnode_disk);
-       }
-
-       if (runcommandwithstatus(commandstring, ctr[TR_PARTITIONING_DISK]))
-       {
-               errorbox(ctr[TR_UNABLE_TO_PARTITION]);
-               goto EXIT;
-       }
-
-       if (fstype == EXT2) {
-//             mysystem("/sbin/modprobe ext2");
-               sprintf(mkfscommand, "/sbin/mke2fs -T ext2");
-       } else if (fstype == REISERFS) {
-               mysystem("/sbin/modprobe reiserfs");
-               sprintf(mkfscommand, "/sbin/mkreiserfs -f");
-       } else if (fstype == EXT3) {
-//             mysystem("/sbin/modprobe ext3");
-               sprintf(mkfscommand, "/sbin/mke2fs -T ext3");
-       } else if (fstype == EXT4) {
-//             mysystem("/sbin/modprobe ext4");
-               sprintf(mkfscommand, "/sbin/mke2fs -T ext4");
-       }
-
-       snprintf(commandstring, STRING_SIZE, "/sbin/mke2fs -T ext2 -I 128 %s1", hdparams.devnode_part);
-       if (runcommandwithstatus(commandstring, ctr[TR_MAKING_BOOT_FILESYSTEM]))
-       {
-               errorbox(ctr[TR_UNABLE_TO_MAKE_BOOT_FILESYSTEM]);
-               goto EXIT;
-       }
-
-       if (swap_file) {
-               snprintf(commandstring, STRING_SIZE, "/sbin/mkswap %s2", hdparams.devnode_part);
-               if (runcommandwithstatus(commandstring, ctr[TR_MAKING_SWAPSPACE]))
-               {
-                       errorbox(ctr[TR_UNABLE_TO_MAKE_SWAPSPACE]);
-                       goto EXIT;
-               }
-       }
-
-       snprintf(commandstring, STRING_SIZE, "%s %s3", mkfscommand, hdparams.devnode_part);
-       if (runcommandwithstatus(commandstring, ctr[TR_MAKING_ROOT_FILESYSTEM]))
-       {
-               errorbox(ctr[TR_UNABLE_TO_MAKE_ROOT_FILESYSTEM]);
-               goto EXIT;
-       }
-
-       snprintf(commandstring, STRING_SIZE, "%s %s4", mkfscommand, hdparams.devnode_part);     
-       if (runcommandwithstatus(commandstring, ctr[TR_MAKING_LOG_FILESYSTEM]))
-       {
-               errorbox(ctr[TR_UNABLE_TO_MAKE_LOG_FILESYSTEM]);
-               goto EXIT;
-       }
-
-       snprintf(commandstring, STRING_SIZE, "/bin/mount %s3 /harddisk", hdparams.devnode_part);
-       if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_ROOT_FILESYSTEM]))
-       {
-               errorbox(ctr[TR_UNABLE_TO_MOUNT_ROOT_FILESYSTEM]);
-               goto EXIT;
-       }
-
-       mkdir("/harddisk/boot", S_IRWXU|S_IRWXG|S_IRWXO);
-       mkdir("/harddisk/var", S_IRWXU|S_IRWXG|S_IRWXO);
-       mkdir("/harddisk/var/log", S_IRWXU|S_IRWXG|S_IRWXO);
-
-       snprintf(commandstring, STRING_SIZE, "/bin/mount %s1 /harddisk/boot", hdparams.devnode_part);
-       if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_BOOT_FILESYSTEM]))
-       {
-               errorbox(ctr[TR_UNABLE_TO_MOUNT_BOOT_FILESYSTEM]);
-               goto EXIT;
-       }
-       if (swap_file) {
-               snprintf(commandstring, STRING_SIZE, "/sbin/swapon %s2", hdparams.devnode_part);
-               if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_SWAP_PARTITION]))
-               {
-                       errorbox(ctr[TR_UNABLE_TO_MOUNT_SWAP_PARTITION]);
-                       goto EXIT;
-               }
-       }
-       snprintf(commandstring, STRING_SIZE, "/bin/mount %s4 /harddisk/var", hdparams.devnode_part);
-       if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_LOG_FILESYSTEM]))
-       {
-               errorbox(ctr[TR_UNABLE_TO_MOUNT_LOG_FILESYSTEM]);
-               goto EXIT;
-       }
-
-       snprintf(commandstring, STRING_SIZE,
-               "/bin/tar -C /harddisk  -xvf /cdrom/" SNAME "-" VERSION ".tlz --lzma 2>/dev/null");
-       
-       if (runcommandwithprogress(60, 4, title, commandstring, INST_FILECOUNT,
-               ctr[TR_INSTALLING_FILES]))
-       {
-               errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);
-               goto EXIT;
-       }
-       
-       /* Save language und local settings */
-       write_lang_configs(shortlangname);
-
-       /* mount proc filesystem */
-       mysystem("mkdir /harddisk/proc");
-       mysystem("/bin/mount --bind /proc /harddisk/proc");
-       mysystem("/bin/mount --bind /dev  /harddisk/dev");
-       mysystem("/bin/mount --bind /sys  /harddisk/sys");
-
-       /* Build cache lang file */
-       snprintf(commandstring, STRING_SIZE, "/usr/sbin/chroot /harddisk /usr/bin/perl -e \"require '" CONFIG_ROOT "/lang.pl'; &Lang::BuildCacheLang\"");
-       if (runcommandwithstatus(commandstring, ctr[TR_INSTALLING_LANG_CACHE]))
-       {
-               errorbox(ctr[TR_UNABLE_TO_INSTALL_LANG_CACHE]);
-               goto EXIT;
-       }
-
-       /* Update /etc/fstab */
-       snprintf(commandstring, STRING_SIZE, "/bin/sed -i -e \"s#DEVICE1#UUID=$(/sbin/blkid %s1 -sUUID | /usr/bin/cut -d'\"' -f2)#g\" /harddisk/etc/fstab", hdparams.devnode_part);
-       system(commandstring);
-       snprintf(commandstring, STRING_SIZE, "/bin/sed -i -e \"s#DEVICE2#UUID=$(/sbin/blkid %s2 -sUUID | /usr/bin/cut -d'\"' -f2)#g\" /harddisk/etc/fstab", hdparams.devnode_part);
-       system(commandstring);
-       snprintf(commandstring, STRING_SIZE, "/bin/sed -i -e \"s#DEVICE3#UUID=$(/sbin/blkid %s3 -sUUID | /usr/bin/cut -d'\"' -f2)#g\" /harddisk/etc/fstab", hdparams.devnode_part);
-       system(commandstring);
-       snprintf(commandstring, STRING_SIZE, "/bin/sed -i -e \"s#DEVICE4#UUID=$(/sbin/blkid %s4 -sUUID | /usr/bin/cut -d'\"' -f2)#g\" /harddisk/etc/fstab", hdparams.devnode_part);
-       system(commandstring);
-
-       if (fstype == EXT2) {
-               replace("/harddisk/etc/fstab", "FSTYPE", "ext2");
-               replace("/harddisk/boot/grub/grub.conf", "MOUNT", "ro");
-       } else if (fstype == REISERFS) {
-               replace("/harddisk/etc/fstab", "FSTYPE", "reiserfs");
-               replace("/harddisk/boot/grub/grub.conf", "MOUNT", "ro");
-       } else if (fstype == EXT3) {
-               replace("/harddisk/etc/fstab", "FSTYPE", "ext3");
-               replace("/harddisk/boot/grub/grub.conf", "MOUNT", "ro");
-       } else if (fstype == EXT4) {
-               replace("/harddisk/etc/fstab", "FSTYPE", "ext4");
-               replace("/harddisk/boot/grub/grub.conf", "MOUNT", "ro");
-       }
-
-       replace("/harddisk/boot/grub/grub.conf", "KVER", KERNEL_VERSION);
-
-       snprintf(commandstring, STRING_SIZE, "/bin/sed -i -e \"s#root=ROOT#root=UUID=$(/sbin/blkid %s3 -sUUID | /usr/bin/cut -d'\"' -f2)#g\" /harddisk/boot/grub/grub.conf", hdparams.devnode_part);
-       system(commandstring);
-
-       mysystem("ln -s grub.conf /harddisk/boot/grub/menu.lst");
-
-       system("/bin/sed -e 's#/harddisk#/#g' -e 's#//#/#g'  < /proc/mounts > /harddisk/etc/mtab");
-
-       /*
-        * Generate device.map to help grub finding the device to install itself on.
-        */
-       FILE *f = NULL;
-       if (f = fopen("/harddisk/boot/grub/device.map", "w")) {
-               fprintf(f, "(hd0) %s\n", hdparams.devnode_disk);
-               fclose(f);
-       }
-
-       snprintf(commandstring, STRING_SIZE, 
-                "/usr/sbin/chroot /harddisk /usr/sbin/grub-install --no-floppy %s", hdparams.devnode_disk);
-       if (runcommandwithstatus(commandstring, ctr[TR_INSTALLING_GRUB])) {
-               errorbox(ctr[TR_UNABLE_TO_INSTALL_GRUB]);
-               goto EXIT;
-       }
-
-       /* Serial console ? */
-       if (serialconsole) {
-               /* grub */
-               replace("/harddisk/boot/grub/grub.conf", "splashimage", "#splashimage");
-               replace("/harddisk/boot/grub/grub.conf", "#serial", "serial");
-               replace("/harddisk/boot/grub/grub.conf", "#terminal", "terminal");
-               replace("/harddisk/boot/grub/grub.conf", " panic=10 ", " console=ttyS0,115200n8 panic=10 ");
-
-               /*inittab*/
-               replace("/harddisk/etc/inittab", "1:2345:respawn:", "#1:2345:respawn:");
-               replace("/harddisk/etc/inittab", "2:2345:respawn:", "#2:2345:respawn:");
-               replace("/harddisk/etc/inittab", "3:2345:respawn:", "#3:2345:respawn:");
-               replace("/harddisk/etc/inittab", "4:2345:respawn:", "#4:2345:respawn:");
-               replace("/harddisk/etc/inittab", "5:2345:respawn:", "#5:2345:respawn:");
-               replace("/harddisk/etc/inittab", "6:2345:respawn:", "#6:2345:respawn:");
-               replace("/harddisk/etc/inittab", "#7:2345:respawn:", "7:2345:respawn:");
-       }
-
-       /* Set marker that the user has already accepted the gpl */
-       mysystem("/usr/bin/touch /harddisk/var/ipfire/main/gpl_accepted");
-
-       /* Copy restore file from cdrom */
-       if (unattended && (strlen(restore_file) > 0)) {
-               fprintf(flog, "unattended: Copy restore file\n");
-               snprintf(commandstring, STRING_SIZE, 
-                       "cp /cdrom/%s /harddisk/var/ipfire/backup", restore_file);
-               mysystem(commandstring);
-       }
-       
-       mysystem("umount /cdrom");
-       snprintf(commandstring, STRING_SIZE, "/usr/bin/eject /dev/%s", sourcedrive);
-       mysystem(commandstring);
-
-       if (!unattended) {
-               sprintf(message, ctr[TR_CONGRATULATIONS_LONG],
-                               NAME, SNAME, NAME);
-               newtWinMessage(ctr[TR_CONGRATULATIONS], ctr[TR_PRESS_OK_TO_REBOOT], message);
-       }
-
-       allok = 1;
-
-EXIT:
-       fprintf(flog, "Install program ended.\n");      
-
-       if (!(allok))
-               newtWinMessage(title, ctr[TR_OK], ctr[TR_PRESS_OK_TO_REBOOT]);  
-       
-       freekeyvalues(ethernetkv);
-
-       if (allok && !allok_fastexit)
-       {
-               if (unattended) {
-                       fprintf(flog, "Entering unattended setup\n");
-                       if (unattended_setup(unattendedkv)) {
-                               snprintf(commandstring, STRING_SIZE, "/bin/sleep 10");
-                               runcommandwithstatus(commandstring, "Unattended installation finished, system will reboot");
-                       } else {
-                               errorbox("Unattended setup failed.");
-                               goto EXIT;
-                       }
-               }
-
-               fflush(flog);
-               fclose(flog);
-               newtFinished();
-
-               if (system("/bin/umount /harddisk/proc"))
-                       printf("Unable to umount /harddisk/proc.\n"); 
-       } else {
-               fflush(flog);
-               fclose(flog);
-               newtFinished();
-       }
-
-       fcloseall();
-
-       if (swap_file) {
-               snprintf(commandstring, STRING_SIZE, "/bin/swapoff %s2", hdparams.devnode_part);
-       }
-
-       newtFinished();
-
-       system("/bin/umount /harddisk/proc >/dev/null 2>&1");
-       system("/bin/umount /harddisk/dev >/dev/null 2>&1");
-       system("/bin/umount /harddisk/sys >/dev/null 2>&1");
-
-       system("/bin/umount /harddisk/var >/dev/null 2>&1");
-       system("/bin/umount /harddisk/boot >/dev/null 2>&1");
-       system("/bin/umount /harddisk >/dev/null 2>&1");
-
-       if (!(allok))
-               system("/etc/halt");
-
-       return 0;
-}
diff --git a/src/install+setup/install/mountsource.sh b/src/install+setup/install/mountsource.sh
deleted file mode 100644 (file)
index c335020..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/bin/sh
-###############################################################################
-#                                                                             #
-# IPFire.org - A linux based firewall                                         #
-# Copyright (C) 2007-2014  IPFire Team  <info@ipfire.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 3 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, see <http://www.gnu.org/licenses/>.       #
-#                                                                             #
-###############################################################################
-
-#lfs patch source here...
-version=FullIPFireVersion
-#
-
-echo "Scanning source media"
-
-# scan all Block devices
-for DEVICE in `find /sys/block/* -maxdepth 0 ! -name fd* ! -name loop* ! -name ram* -exec basename {} \;`
-do
-               mount /dev/${DEVICE} /cdrom 2> /dev/null
-               if [ -n "$(ls /cdrom/${version}.media 2>/dev/null)" ]; then
-                       echo -n ${DEVICE} > /tmp/source_device
-                       echo "Found ${version} on ${DEVICE}"
-                       exit 0
-               else
-                       echo "not found on ${DEVICE} - SKIP"
-               fi
-               umount /cdrom 2> /dev/null
-done
-
-# scan all Partitions on block devices
-for DEVICE in `find /sys/block/* -maxdepth 0 ! -name fd* ! -name loop* ! -name ram* -exec basename {} \;`
-do
-       for DEVICEP in $(ls /dev/${DEVICE}? 2>/dev/null | sed "s/\/dev\///");do
-               mount /dev/${DEVICEP} /cdrom 2> /dev/null
-               if [ -n "$(ls /cdrom/${version}.media 2>/dev/null)" ]; then
-                       echo -n ${DEVICEP} > /tmp/source_device
-                       echo "Found ${version} on ${DEVICEP}"
-                       exit 0
-               else
-                       echo "not found on ${DEVICEP} - SKIP"
-               fi
-               umount /cdrom 2> /dev/null
-       done
-done
-
-# scan all Partitions on raid/mmc devices
-for DEVICE in `find /sys/block/* -maxdepth 0 ! -name fd* ! -name loop* ! -name ram* -exec basename {} \;`
-do
-       for DEVICEP in $(ls /dev/${DEVICE}p? 2>/dev/null | sed "s/\/dev\///");do
-               mount /dev/${DEVICEP} /cdrom 2> /dev/null
-               if [ -n "$(ls /cdrom/${version}.media 2>/dev/null)" ]; then
-                       echo -n ${DEVICEP} > /tmp/source_device
-                       echo "Found ${version} on ${DEVICEP}"
-                       exit 0
-               else
-                       echo "not found on ${DEVICEP} - SKIP"
-               fi
-               umount /cdrom 2> /dev/null
-       done
-done
-
-exit 10
diff --git a/src/install+setup/libsmooth/langs.h.temp b/src/install+setup/libsmooth/langs.h.temp
deleted file mode 100644 (file)
index 16d45d0..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/* SmoothWall libsmooth.
- *
- * This program is distributed under the terms of the GNU General Public
- * Licence.  See the file COPYING for details.
- *
- * (c) Lawrence Manning, 2001
- * This is a template (basically just a header). langs.h is generated via
- * the Makefile, from lang_en.c.
- * 
- * $Id: langs.h.temp,v 1.4 2003/12/11 11:25:53 riddles Exp $
- * 
- */
-
-enum trstrings
-{
diff --git a/src/install+setup/libsmooth/libsmooth.h b/src/install+setup/libsmooth/libsmooth.h
deleted file mode 100644 (file)
index fc166b2..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/* SmoothWall libsmooth.
- *
- * This program is distributed under the terms of the GNU General Public
- * Licence.  See the file COPYING for details.
- *
- * (c) Lawrence Manning, 2001
- * Contains prototypes for library functions.
- * 
- */
-
-#ifndef ___LIBSMOOTH_H
-#define ___LIBSMOOTH_H
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <wchar.h>
-#include <locale.h>
-#include <unistd.h>
-#include <sys/file.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <newt.h>
-#include <dirent.h>
-#include <sys/mount.h>
-
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#include <linux/cdrom.h>
-#include <sys/ioctl.h>
-
-#include "langs.h"
-
-#define STRING_SIZE 1024
-
-#define ADDRESS 0
-#define NETADDRESS 1
-#define NETMASK 2
-#define DHCP 3
-#define NETCHANGE_TOTAL 4
-
-#define SCANNED_NICS "/var/ipfire/ethernet/scanned_nics"
-#define SYSDIR "/sys/class/net"
-
-#define _GREEN_CARD_ 0
-#define _RED_CARD_ 1
-#define _ORANGE_CARD_ 2
-#define _BLUE_CARD_ 3
-
-struct keyvalue
-{
-       char key[STRING_SIZE];
-       char value[STRING_SIZE];
-       struct keyvalue *next;  
-};
-struct nic
-{
-       char driver[80];
-       char description[256];
-       char macaddr[20];
-       char nic[20];
-};
-
-struct knic
-{
-       char driver[80];
-       char description[256];
-       char macaddr[20];
-       char colour[20];
-};
-
-
-/* libsmooth.c */
-void reboot(void);
-void stripnl(char *s);
-int mysystem(char *command);
-void errorbox(char *message);
-int statuswindowscroll(int width, int height, char *title, char *text, ...);
-int disclaimerbox(char *message);
-void statuswindow(int width, int height, char *title, char *text, ...);
-int runcommandwithprogress(int width, int height, char *title, char *command,
-       int lines, char *text, ...);
-int runcommandwithstatus(char *command, char *message);
-int runhiddencommandwithstatus(char *command, char *message);
-int checkformodule(char *module); 
-int replace(char filename1[], char *from, char *to);
-char* get_version(void);
-                                
-/* netstuff.c */
-int changeaddress(struct keyvalue *kv, char *colour, int typeflag,
-       char *defaultdhcphostname);
-int gettype(char *type);
-int setnetaddress(struct keyvalue *kv, char *colour);
-void networkdialogcallbacktype(newtComponent cm, void *data);
-int interfacecheck(struct keyvalue *kv, char *colour);
-int rename_nics(void);
-int init_knics(void);
-int create_udev(void);
-int scan_network_cards(void);
-int nicmenu(int colour);
-int clear_card_entry(int cards);
-int ask_clear_card_entry(int cards);
-int manualdriver(char *driver, char *driveroptions);
-         
-/* varval.c */
-struct keyvalue *initkeyvalues(void);
-void freekeyvalues(struct keyvalue *head);
-int readkeyvalues(struct keyvalue *head, char *filename);
-int writekeyvalues(struct keyvalue *head, char *filename);
-int findkey(struct keyvalue *head, char *key, char *value);
-void appendkeyvalue(struct keyvalue *head, char *key, char *value);
-void replacekeyvalue(struct keyvalue *head, char *key, char *value);
-
-#endif
-
diff --git a/src/install+setup/libsmooth/makelangs.pl b/src/install+setup/libsmooth/makelangs.pl
deleted file mode 100644 (file)
index 6fc2098..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/perl
-###############################################################################
-#                                                                             #
-# IPFire.org - A linux based firewall                                         #
-# Copyright (C) 2007  Michael Tremer & Christian Schmidt                      #
-#                                                                             #
-# 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 3 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, see <http://www.gnu.org/licenses/>.       #
-#                                                                             #
-###############################################################################
-
-while (<>)
-{
-       if (/\/\* (TR_[A-Z0-9_]*)/) {
-               print "\t$1,\n"; }
-} 
-print "};\n";
diff --git a/src/install+setup/setup/setup.h b/src/install+setup/setup/setup.h
deleted file mode 100644 (file)
index e6a32a6..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/* SmoothWall setup program.
- *
- * This program is distributed under the terms of the GNU General Public
- * Licence.  See the file COPYING for details.
- *
- * (c) Lawrence Manning, 2001
- * Main include file.
- * 
- * $Id: setup.h,v 1.4 2003/12/11 11:25:54 riddles Exp $
- * 
- */
-
-#include "../libsmooth/libsmooth.h"
-
-/* hostname.c */
-int handlehostname(void);
-
-/* domainname.c */
-int handledomainname(void);
-
-/* networking.c */
-int handlenetworking(void);
-
-/* dhcp.c */
-int handledhcp(void);
-
-/* passwords.c */
-int handlerootpassword(void);
-int handlesetuppassword(void);
-int handleadminpassword(void);
-
-/* misc.c */
-int writehostsfiles(void);
-int handleisdn(void);
-
-/* keymap.c */
-int handlekeymap(void);
-
-/* timezone.c */
-int handletimezone(void);
similarity index 92%
rename from src/install+setup/install/Makefile
rename to src/installer/Makefile
index 89106de2280311a9e462bd2e592007963d6e8684..928520e41f4357621bdb25ea6cc4ed3e0489f409 100644 (file)
 
 
 CC      = gcc 
-CFLAGS  = -Os -Wall
+CFLAGS  = -O2 -Wall
 INCLUDE =
 
 LD      = gcc
 LDFLAGS =
-LIBS    = -lnewt -lslang -lpci
+LIBS    = -lnewt -lslang -lpci -ludev -lblkid -lsmooth
 
 COMPILE = $(CC) -c $(INCLUDE) $(CFLAGS)
 
@@ -33,16 +33,16 @@ LINK = $(LD) $(LDFLAGS)
 
 all : programs
 
-programs : install
+programs : installer
 
 clean :
        -rm -f *.o install core
 
 ######
 
-OBJS=main.o config.o ../libsmooth/libsmooth.o unattended.o
+OBJS=main.o unattended.o hw.o
 
-install: $(OBJS)
+installer: $(OBJS)
        $(LINK) $(OBJS) -o $@ $(LIBS)
 
 %.o : %.c
diff --git a/src/installer/Makefile.am b/src/installer/Makefile.am
new file mode 100644 (file)
index 0000000..259db06
--- /dev/null
@@ -0,0 +1,80 @@
+#  This file is part of the installer.
+#
+#  installer 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.
+
+ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
+AM_MAKEFLAGS = --no-print-directory
+AUTOMAKE_OPTIONS = color-tests parallel-tests
+
+SUBDIRS = . po
+
+# remove targets if the command fails
+.DELETE_ON_ERROR:
+
+# keep intermediate files
+.SECONDARY:
+
+CLEANFILES =
+EXTRA_DIST =
+dracutmoduledir = $(prefix)/lib/dracut/modules.d/99installer
+
+AM_CPPFLAGS = \
+       -include $(top_builddir)/config.h \
+       -I $(top_srcdir)/include \
+       $(OUR_CPPFLAGS)
+
+AM_CFLAGS = $(OUR_CFLAGS)
+AM_LDFLAGS = $(OUR_LDFLAGS)
+
+bin_PROGRAMS = \
+       installer
+
+bin_SCRIPTS = \
+       downloadsource.sh
+
+#- installer -------------------------------------------------------------------
+
+installer_SOURCES = \
+       hw.c \
+       hw.h \
+       main.c \
+       unattended.c
+
+installer_CFLAGS = \
+       $(BLKID_CFLAGS) \
+       $(LIBSMOOTH_CFLAGS) \
+       $(PCI_CFLAGS) \
+       $(UDEV_CFLAGS)
+
+installer_LDADD = \
+       $(BLKID_LIBS) \
+       $(LIBSMOOTH_LIBS) \
+       $(NEWT_LIBS) \
+       $(PCI_LIBS) \
+       $(UDEV_LIBS)
+
+dracutmodule_DATA = \
+       dracut-module/70-dhcpcd.exe \
+       dracut-module/fake-root.sh \
+       dracut-module/module-setup.sh \
+       dracut-module/run-installer.sh
+
+#-------------------------------------------------------------------------------
+
+substitutions = \
+       '|PACKAGE_NAME=$(PACKAGE_NAME)|' \
+       '|PACKAGE_VERSION=$(PACKAGE_VERSION)|' \
+       '|prefix=$(prefix)|' \
+       '|exec_prefix=$(exec_prefix)|' \
+       '|libdir=$(libdir)|' \
+       '|includedir=$(includedir)|'
+
+SED_PROCESS = \
+       $(AM_V_GEN)$(MKDIR_P) $(dir $@) && \
+       $(SED) $(subst '|,-e 's|@,$(subst =,\@|,$(subst |',|g',$(substitutions)))) < $< > $@
+
+%.pc: %.pc.in Makefile
+       $(SED_PROCESS)
diff --git a/src/installer/autogen.sh b/src/installer/autogen.sh
new file mode 100755 (executable)
index 0000000..3065488
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+autoreconf --force --install -I m4
diff --git a/src/installer/configure.ac b/src/installer/configure.ac
new file mode 100644 (file)
index 0000000..da968f6
--- /dev/null
@@ -0,0 +1,99 @@
+#  This file is part of the installer.
+#
+#  installer 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.
+
+AC_PREREQ([2.64])
+
+AC_INIT([installer],
+       [001],
+       [],
+       [installer],
+       [http://git.ipfire.org/?p=ipfire-2.x.git;a=summary])
+
+AC_CONFIG_MACRO_DIR([m4])
+AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_AUX_DIR([build-aux])
+
+AM_INIT_AUTOMAKE([
+       foreign
+       1.11
+       -Wall
+       -Wno-portability
+       silent-rules
+       tar-pax
+       no-dist-gzip
+       dist-xz
+       subdir-objects
+])
+AM_SILENT_RULES([yes])
+
+LT_PREREQ(2.2)
+LT_INIT([disable-static])
+
+AC_PROG_SED
+
+AC_PROG_CC
+AC_PROG_CC_C99
+AC_PROG_CC_C_O
+
+AC_PATH_PROG([M4], [m4])
+
+# Gettext
+AM_GNU_GETTEXT([external])
+AM_GNU_GETTEXT_VERSION([0.18])
+AC_CHECK_HEADERS([libintl.h])
+
+# This makes sure pkg.m4 is available.
+m4_pattern_forbid([^_?PKG_[A-Z_]+$],[*** pkg.m4 missing, please install pkg-config])
+
+save_LIBS="$LIBS"
+
+# newt
+LIBS=
+AC_SEARCH_LIBS([newtWinMenu], [newt], [], [AC_MSG_ERROR([*** newt library not found])])
+NEWT_LIBS="$LIBS"
+AC_SUBST(NEWT_LIBS)
+
+LIBS="$save_LIBS"
+
+PKG_CHECK_MODULES(BLKID, [blkid])
+PKG_CHECK_MODULES(PCI, [libpci])
+PKG_CHECK_MODULES(LIBSMOOTH, [libsmooth])
+PKG_CHECK_MODULES(UDEV, [libudev])
+
+AC_ARG_WITH([distro-name],
+       AS_HELP_STRING([--with-distro-name] [The name of the distribution]),
+       AC_DEFINE_UNQUOTED([NAME], "$withval", [The name of the distribution]),
+       AC_MSG_ERROR([*** you need to set the name with --with-distro-name=]))
+
+AC_ARG_WITH([distro-sname],
+       AS_HELP_STRING([--with-distro-sname] [The short name of the distribution]),
+       AC_DEFINE_UNQUOTED([SNAME], "$withval", [The sname of the distribution]),
+       AC_MSG_ERROR([*** you need to set the sname with --with-distro-sname=]))
+
+AC_ARG_WITH([distro-slogan],
+       AS_HELP_STRING([--with-distro-slogan] [The slogan of the distribution]),
+       AC_DEFINE_UNQUOTED([SLOGAN], "$withval", [The slogan of the distribution]),
+       AC_MSG_ERROR([*** you need to set the slogan with --with-distro-slogan=]))
+
+AC_ARG_WITH([config-root],
+       AS_HELP_STRING([--with-distro-config-root] [The configuration directory]),
+       AC_DEFINE_UNQUOTED([CONFIG_ROOT], "$withval", [The config-root]),
+       AC_MSG_ERROR([*** you need to set CONFIG_ROOT with --with-config-root=]))
+
+AC_CONFIG_FILES([
+       Makefile
+       po/Makefile.in
+])
+
+AC_OUTPUT
+AC_MSG_RESULT([
+       $PACKAGE_NAME $VERSION
+
+       CFLAGS:                 ${OUR_CFLAGS} ${CFLAGS}
+       CPPFLAGS:               ${OUR_CPPFLAGS} ${CPPFLAGS}
+       LDFLAGS:                ${OUR_LDFLAGS} ${LDFLAGS}
+])
similarity index 90%
rename from src/install+setup/install/downloadsource.sh
rename to src/installer/downloadsource.sh
index 5c6360dca16bfc540354bc70dd1818bc96593968..1f6c432dd826b72764a5be9f39633a5736e58906 100644 (file)
@@ -47,13 +47,8 @@ echo "Checking download..."
 md5_file=`md5sum /tmp/download.iso | cut -d" " -f1`
 md5_down=`cat /tmp/download.iso.md5 | cut -d" " -f1`
 if [ "$md5_file" == "$md5_down" ]; then
-       mount /tmp/download.iso -o loop /cdrom 2> /dev/null
-       if [ -n "$(ls /cdrom/ipfire-*.tlz 2>/dev/null)" ]; then
-               echo -n "null" > /tmp/source_device
-               echo "Found tarball in /tmp/download.iso"
-               exit 0
-       fi
-       umount /cdrom 2> /dev/null
+       echo -n "/tmp/download.iso" > /tmp/source_device
+       exit 0
 fi
 echo "Error - SKIP"
 exit 10
diff --git a/src/installer/dracut-module/70-dhcpcd.exe b/src/installer/dracut-module/70-dhcpcd.exe
new file mode 100755 (executable)
index 0000000..4100fc9
--- /dev/null
@@ -0,0 +1,32 @@
+#/bin/bash
+########################################################################
+# Begin
+#
+# Description : DHCP Client Script (initrd version)
+#
+# Authors     : Arne Fitzenreiter - arne_f@ipfire.org
+#
+# Version     : 02.00
+#
+# Notes       : 
+#
+########################################################################
+
+dhcpcd_up()
+{
+       set | grep "^new_" | sed "s|^new_||g" | \
+       sed "s|'||g" | \
+       sort > /var/ipfire/dhcpc/dhcpcd-$interface.info
+
+       DNS=`grep "domain_name_servers" /var/ipfire/dhcpc/dhcpcd-$interface.info | cut -d"=" -f2`
+       DNS1=`echo $DNS | cut -d" " -f1`
+       DNS2=`echo $DNS | cut -d" " -f2`
+
+       echo "nameserver $DNS1" > /etc/resolv.conf
+       echo "nameserver $DNS2" >> /etc/resolv.conf
+
+}
+
+case "$reason" in
+BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT|STATIC)       dhcpcd_up;;
+esac
diff --git a/src/installer/dracut-module/fake-root.sh b/src/installer/dracut-module/fake-root.sh
new file mode 100644 (file)
index 0000000..7c41f35
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+# Fake root so dracut will start our installer
+root="installer"
+rootok=1
diff --git a/src/installer/dracut-module/module-setup.sh b/src/installer/dracut-module/module-setup.sh
new file mode 100755 (executable)
index 0000000..cd8eebe
--- /dev/null
@@ -0,0 +1,73 @@
+#!/bin/bash
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+# called by dracut
+check() {
+    return 255
+}
+
+# called by dracut
+depends() {
+    echo base bash mdraid shutdown
+    return 0
+}
+
+# called by dracut
+install() {
+    inst /etc/system-release
+    inst /usr/bin/installer
+    inst /usr/bin/downloadsource.sh
+    inst /usr/local/bin/iowrap
+
+    # Kernel drivers
+    instmods =drivers/hid
+
+    # Network drivers
+    instmods =drivers/net/ethernet =drivers/net/usb
+    instmods virtio_net hv_netvsc vmxnet3
+
+    # Filesystem support
+    inst_multiple parted mkswap mke2fs mkreiserfs mkfs.xfs
+    instmods ext4 iso9660 reiserfs vfat xfs
+
+    # Extraction
+    inst_multiple tar gzip lzma xz
+
+    # DHCP Client
+    inst dhcpcd
+    inst /var/ipfire/dhcpc/dhcpcd-run-hooks
+    inst /var/ipfire/dhcpc/dhcpcd.conf
+    for file in /var/ipfire/dhcpc/dhcpcd-hooks/*; do
+        inst "${file}"
+    done
+    inst "$moddir/70-dhcpcd.exe" "/var/ipfire/dhcpc/dhcpcd-hooks/70-dhcpcd.exe"
+
+    # Misc. tools
+    inst_multiple eject ping wget
+    inst_multiple -o fdisk cfdisk df ps top
+
+    # Hardware IDs
+    inst /usr/share/hwdata/pci.ids /usr/share/hwdata/usb.ids
+
+    # Locales
+    for locale in de en es fr nl pl ru tr; do
+        for file in $(find /usr/lib/locale/${locale}*); do
+            inst "${file}"
+        done
+    done
+    for file in /usr/share/locale/*/LC_MESSAGES/installer.mo; do
+        inst "${file}"
+    done
+
+    # Bash start files
+    inst_multiple /etc/profile /root/.bash_profile /etc/bashrc /root/.bashrc
+    for file in /etc/profile.d/*.sh; do
+        inst "${file}"
+    done
+
+    inst_hook cmdline 99 "$moddir/fake-root.sh"
+    inst_hook pre-mount 99 "$moddir/run-installer.sh"
+
+    return 0
+}
diff --git a/src/installer/dracut-module/run-installer.sh b/src/installer/dracut-module/run-installer.sh
new file mode 100644 (file)
index 0000000..d0611ce
--- /dev/null
@@ -0,0 +1,29 @@
+#!/bin/sh
+#
+# IPFire Installer RC
+#
+
+# Silence the kernel
+echo >/proc/sys/kernel/printk "1 4 1 7"
+echo -n -e "\033[9;0]"
+
+echo "Starting shells on tty2 and tty3 ..."
+/usr/local/bin/iowrap /dev/tty2 /bin/bash &
+/usr/local/bin/iowrap /dev/tty3 /bin/bash &
+
+echo "Loading Installer..."
+/bin/bash --login -c "/usr/bin/installer /dev/tty2"
+ret=$?
+
+case "${ret}" in
+       0)
+               # The installer has finished without a problem.
+               ;;
+       *)
+               echo "The installer has crashed. You will be dropped to a debugging shell"
+               /bin/bash --login
+               ;;
+esac
+
+# Reboot the system
+/shutdown reboot
diff --git a/src/installer/hw.c b/src/installer/hw.c
new file mode 100644 (file)
index 0000000..0e65ae9
--- /dev/null
@@ -0,0 +1,1004 @@
+/*#############################################################################
+#                                                                             #
+# IPFire - An Open Source Firewall Distribution                               #
+# Copyright (C) 2014 IPFire development team                                  #
+#                                                                             #
+# 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 3 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, see <http://www.gnu.org/licenses/>.       #
+#                                                                             #
+#############################################################################*/
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <assert.h>
+#include <blkid/blkid.h>
+#include <fcntl.h>
+#include <libudev.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/mount.h>
+#include <sys/swap.h>
+#include <unistd.h>
+
+#include <linux/fs.h>
+
+#include <libsmooth.h>
+
+#include "hw.h"
+
+const char* other_filesystems[] = {
+       "/dev",
+       "/proc",
+       "/sys",
+       NULL
+};
+
+static int system_chroot(const char* output, const char* path, const char* cmd) {
+       char chroot_cmd[STRING_SIZE];
+
+       snprintf(chroot_cmd, sizeof(chroot_cmd), "/usr/sbin/chroot %s %s", path, cmd);
+
+       return mysystem(output, chroot_cmd);
+}
+
+struct hw* hw_init() {
+       struct hw* hw = malloc(sizeof(*hw));
+       assert(hw);
+
+       // Initialize libudev
+       hw->udev = udev_new();
+       if (!hw->udev) {
+               fprintf(stderr, "Could not create udev instance\n");
+               exit(1);
+       }
+
+       return hw;
+}
+
+void hw_free(struct hw* hw) {
+       if (hw->udev)
+               udev_unref(hw->udev);
+
+       free(hw);
+}
+
+static int strstartswith(const char* a, const char* b) {
+       return (strncmp(a, b, strlen(b)) == 0);
+}
+
+int hw_mount(const char* source, const char* target, const char* fs, int flags) {
+       // Create target if it does not exist
+       if (access(target, X_OK) != 0)
+               mkdir(target, S_IRWXU|S_IRWXG|S_IRWXO);
+
+       return mount(source, target, fs, flags, NULL);
+}
+
+int hw_umount(const char* target) {
+       return umount2(target, 0);
+}
+
+static int hw_test_source_medium(const char* path) {
+       int ret = hw_mount(path, SOURCE_MOUNT_PATH, "iso9660", MS_RDONLY);
+
+       // If the source could not be mounted we
+       // cannot proceed.
+       if (ret != 0)
+               return ret;
+
+       // Check if the test file exists.
+       ret = access(SOURCE_TEST_FILE, R_OK);
+
+       // Umount the test device.
+       hw_umount(SOURCE_MOUNT_PATH);
+
+       return (ret == 0);
+}
+
+char* hw_find_source_medium(struct hw* hw) {
+       char* ret = NULL;
+
+       struct udev_enumerate* enumerate = udev_enumerate_new(hw->udev);
+
+       udev_enumerate_add_match_subsystem(enumerate, "block");
+       udev_enumerate_scan_devices(enumerate);
+
+       struct udev_list_entry* devices = udev_enumerate_get_list_entry(enumerate);
+
+       struct udev_list_entry* dev_list_entry;
+       udev_list_entry_foreach(dev_list_entry, devices) {
+               const char* path = udev_list_entry_get_name(dev_list_entry);
+               struct udev_device* dev = udev_device_new_from_syspath(hw->udev, path);
+
+               const char* dev_path = udev_device_get_devnode(dev);
+
+               // Skip everything what we cannot work with
+               if (strstartswith(dev_path, "/dev/loop") || strstartswith(dev_path, "/dev/fd") ||
+                               strstartswith(dev_path, "/dev/ram") || strstartswith(dev_path, "/dev/md"))
+                       continue;
+
+               if (hw_test_source_medium(dev_path) == 0) {
+                       ret = strdup(dev_path);
+               }
+
+               udev_device_unref(dev);
+
+               // If a suitable device was found the search will end.
+               if (ret)
+                       break;
+       }
+
+       udev_enumerate_unref(enumerate);
+
+       return ret;
+}
+
+static struct hw_disk** hw_create_disks() {
+       struct hw_disk** ret = malloc(sizeof(*ret) * (HW_MAX_DISKS + 1));
+
+       return ret;
+}
+
+static unsigned long long hw_block_device_get_size(const char* dev) {
+       int fd = open(dev, O_RDONLY);
+       if (fd < 0)
+               return 0;
+
+       unsigned long long size = blkid_get_dev_size(fd);
+       close(fd);
+
+       return size;
+}
+
+struct hw_disk** hw_find_disks(struct hw* hw) {
+       struct hw_disk** ret = hw_create_disks();
+       struct hw_disk** disks = ret;
+
+       struct udev_enumerate* enumerate = udev_enumerate_new(hw->udev);
+
+       udev_enumerate_add_match_subsystem(enumerate, "block");
+       udev_enumerate_scan_devices(enumerate);
+
+       struct udev_list_entry* devices = udev_enumerate_get_list_entry(enumerate);
+
+       struct udev_list_entry* dev_list_entry;
+       unsigned int i = HW_MAX_DISKS;
+       udev_list_entry_foreach(dev_list_entry, devices) {
+               const char* path = udev_list_entry_get_name(dev_list_entry);
+               struct udev_device* dev = udev_device_new_from_syspath(hw->udev, path);
+
+               const char* dev_path = udev_device_get_devnode(dev);
+
+               // Skip everything what we cannot work with
+               if (strstartswith(dev_path, "/dev/loop") || strstartswith(dev_path, "/dev/fd") ||
+                               strstartswith(dev_path, "/dev/ram") || strstartswith(dev_path, "/dev/sr") ||
+                               strstartswith(dev_path, "/dev/md")) {
+                       udev_device_unref(dev);
+                       continue;
+               }
+
+               // DEVTYPE must be disk (otherwise we will see all sorts of partitions here)
+               const char* devtype = udev_device_get_property_value(dev, "DEVTYPE");
+               if (devtype && (strcmp(devtype, "disk") != 0)) {
+                       udev_device_unref(dev);
+                       continue;
+               }
+
+               // Skip all source mediums
+               if (hw_test_source_medium(dev_path) == 0) {
+                       udev_device_unref(dev);
+                       continue;
+               }
+
+               // Skip devices with a size of zero
+               unsigned long long size = hw_block_device_get_size(dev_path);
+               if (size == 0) {
+                       udev_device_unref(dev);
+                       continue;
+               }
+
+               struct hw_disk* disk = malloc(sizeof(*disk));
+               if (disk == NULL)
+                       return NULL;
+
+               disk->ref = 1;
+
+               strncpy(disk->path, dev_path, sizeof(disk->path));
+
+               disk->size = size;
+
+               // Vendor
+               const char* vendor = udev_device_get_property_value(dev, "ID_VENDOR");
+               if (!vendor)
+                       vendor = udev_device_get_sysattr_value(dev, "vendor");
+               if (!vendor)
+                       vendor = udev_device_get_sysattr_value(dev, "manufacturer");
+
+               if (vendor)
+                       strncpy(disk->vendor, vendor, sizeof(disk->vendor));
+               else
+                       *disk->vendor = '\0';
+
+               // Model
+               const char* model = udev_device_get_property_value(dev, "ID_MODEL");
+               if (!model)
+                       model = udev_device_get_sysattr_value(dev, "model");
+               if (!model)
+                       model = udev_device_get_sysattr_value(dev, "product");
+
+               if (model)
+                       strncpy(disk->model, model, sizeof(disk->model));
+               else
+                       *disk->model = '\0';
+
+               // Format description
+               char size_str[STRING_SIZE];
+               snprintf(size_str, sizeof(size_str), "%4.1fGB", (double)disk->size / pow(1024, 3));
+
+               if (*disk->vendor && *disk->model) {
+                       snprintf(disk->description, sizeof(disk->description),
+                               "%s - %s - %s", size_str, disk->vendor, disk->model);
+
+               } else if (*disk->vendor || *disk->model) {
+                       snprintf(disk->description, sizeof(disk->description),
+                               "%s - %s", size_str, (*disk->vendor) ? disk->vendor : disk->model);
+
+               } else {
+                       snprintf(disk->description, sizeof(disk->description),
+                               "%s - N/A", size_str);
+               }
+
+               *disks++ = disk;
+
+               if (--i == 0)
+                       break;
+
+               udev_device_unref(dev);
+       }
+
+       udev_enumerate_unref(enumerate);
+
+       *disks = NULL;
+
+       return ret;
+}
+
+void hw_free_disks(struct hw_disk** disks) {
+       struct hw_disk** disk = disks;
+
+       while (*disk != NULL) {
+               if (--(*disk)->ref == 0)
+                       free(*disk);
+
+               disk++;
+       }
+
+       free(disks);
+}
+
+unsigned int hw_count_disks(struct hw_disk** disks) {
+       unsigned int ret = 0;
+
+       while (*disks++)
+               ret++;
+
+       return ret;
+}
+
+struct hw_disk** hw_select_disks(struct hw_disk** disks, int* selection) {
+       struct hw_disk** ret = hw_create_disks();
+       struct hw_disk** selected_disks = ret;
+
+       unsigned int num_disks = hw_count_disks(disks);
+
+       for (unsigned int i = 0; i < num_disks; i++) {
+               if (selection && selection[i]) {
+                       struct hw_disk *selected_disk = disks[i];
+                       selected_disk->ref++;
+
+                       *selected_disks++ = selected_disk;
+               }
+       }
+
+       // Set sentinel
+       *selected_disks = NULL;
+
+       return ret;
+}
+
+static unsigned long long hw_swap_size(struct hw_destination* dest) {
+       unsigned long long memory = hw_memory();
+
+       unsigned long long swap_size = memory / 4;
+
+       // Min. swap size is 128MB
+       if (swap_size < MB2BYTES(128))
+               swap_size = MB2BYTES(128);
+
+       // Cap swap size to 1GB
+       else if (swap_size > MB2BYTES(1024))
+               swap_size = MB2BYTES(1024);
+
+       return swap_size;
+}
+
+static unsigned long long hw_root_size(struct hw_destination* dest) {
+       unsigned long long root_size;
+
+       if (dest->size < MB2BYTES(2048))
+               root_size = MB2BYTES(1024);
+
+       else if (dest->size >= MB2BYTES(2048) && dest->size <= MB2BYTES(3072))
+               root_size = MB2BYTES(1536);
+
+       else
+               root_size = MB2BYTES(2048);
+
+       return root_size;
+}
+
+static unsigned long long hw_boot_size(struct hw_destination* dest) {
+       return MB2BYTES(64);
+}
+
+static int hw_calculate_partition_table(struct hw_destination* dest) {
+       char path[DEV_SIZE];
+       int part_idx = 1;
+
+       snprintf(path, sizeof(path), "%s%s", dest->path, (dest->is_raid) ? "p" : "");
+       dest->part_boot_idx = 0;
+
+       // Determine the size of the target block device
+       if (dest->is_raid) {
+               dest->size = (dest->disk1->size >= dest->disk2->size) ?
+                       dest->disk2->size : dest->disk1->size;
+
+               // The RAID will install some metadata at the end of the disk
+               // and we will save up some space for that.
+               dest->size -= MB2BYTES(2);
+       } else {
+               dest->size = dest->disk1->size;
+       }
+
+       // As we add some extra space before the beginning of the first
+       // partition, we need to substract that here.
+       dest->size -= MB2BYTES(1);
+
+       // Add some more space for partition tables, etc.
+       dest->size -= MB2BYTES(1);
+
+       // Determine partition table
+       dest->part_table = HW_PART_TABLE_MSDOS;
+
+       // Disks over 2TB need to use GPT
+       if (dest->size >= MB2BYTES(2047 * 1024))
+               dest->part_table = HW_PART_TABLE_GPT;
+
+       // We also use GPT on raid disks by default
+       else if (dest->is_raid)
+               dest->part_table = HW_PART_TABLE_GPT;
+
+       // When using GPT, GRUB2 needs a little bit of space to put
+       // itself in.
+       if (dest->part_table == HW_PART_TABLE_GPT) {
+               snprintf(dest->part_bootldr, sizeof(dest->part_bootldr),
+                       "%s%d", path, part_idx);
+
+               dest->size_bootldr = MB2BYTES(4);
+
+               dest->part_boot_idx = part_idx++;
+       } else {
+               *dest->part_bootldr = '\0';
+               dest->size_bootldr = 0;
+       }
+
+       dest->size_boot = hw_boot_size(dest);
+       dest->size_swap = hw_swap_size(dest);
+       dest->size_root = hw_root_size(dest);
+
+       // Determine the size of the data partition.
+       unsigned long long used_space = dest->size_bootldr + dest->size_boot
+               + dest->size_swap + dest->size_root;
+
+       // Disk is way too small
+       if (used_space >= dest->size)
+               return -1;
+
+       dest->size_data = dest->size - used_space;
+
+       // If it gets too small, we remove the swap space.
+       if (dest->size_data <= MB2BYTES(256)) {
+               dest->size_data += dest->size_swap;
+               dest->size_swap = 0;
+       }
+
+       // Set partition names
+       if (dest->size_boot > 0) {
+               if (dest->part_boot_idx == 0)
+                       dest->part_boot_idx = part_idx;
+
+               snprintf(dest->part_boot, sizeof(dest->part_boot), "%s%d", path, part_idx++);
+       } else
+               *dest->part_boot = '\0';
+
+       if (dest->size_swap > 0)
+               snprintf(dest->part_swap, sizeof(dest->part_swap), "%s%d", path, part_idx++);
+       else
+               *dest->part_swap = '\0';
+
+       // There is always a root partition
+       if (dest->part_boot_idx == 0)
+               dest->part_boot_idx = part_idx;
+
+       snprintf(dest->part_root, sizeof(dest->part_root), "%s%d", path, part_idx++);
+
+       if (dest->size_data > 0)
+               snprintf(dest->part_data, sizeof(dest->part_data), "%s%d", path, part_idx++);
+       else
+               *dest->part_data = '\0';
+
+       return 0;
+}
+
+struct hw_destination* hw_make_destination(int part_type, struct hw_disk** disks) {
+       struct hw_destination* dest = malloc(sizeof(*dest));
+
+       if (part_type == HW_PART_TYPE_NORMAL) {
+               dest->disk1 = *disks;
+               dest->disk2 = NULL;
+
+               strncpy(dest->path, dest->disk1->path, sizeof(dest->path));
+
+       } else if (part_type == HW_PART_TYPE_RAID1) {
+               dest->disk1 = *disks++;
+               dest->disk2 = *disks;
+               dest->raid_level = 1;
+
+               snprintf(dest->path, sizeof(dest->path), "/dev/md0");
+       }
+
+       // Is this a RAID device?
+       dest->is_raid = (part_type > HW_PART_TYPE_NORMAL);
+
+       int r = hw_calculate_partition_table(dest);
+       if (r)
+               return NULL;
+
+       // Set default filesystem
+       dest->filesystem = HW_FS_DEFAULT;
+
+       return dest;
+}
+
+unsigned long long hw_memory() {
+       FILE* handle = NULL;
+       char line[STRING_SIZE];
+
+       unsigned long long memory = 0;
+
+       /* Calculate amount of memory in machine */
+       if ((handle = fopen("/proc/meminfo", "r"))) {
+               while (fgets(line, sizeof(line), handle)) {
+                       if (!sscanf (line, "MemTotal: %llu kB", &memory)) {
+                               memory = 0;
+                       }
+               }
+
+               fclose(handle);
+       }
+
+       return memory * 1024;
+}
+
+static int hw_zero_out_device(const char* path, int bytes) {
+       char block[512];
+       memset(block, 0, sizeof(block));
+
+       int blocks = bytes / sizeof(block);
+
+       int fd = open(path, O_WRONLY);
+       if (fd < 0)
+               return -1;
+
+       unsigned int bytes_written = 0;
+       while (blocks-- > 0) {
+               bytes_written += write(fd, block, sizeof(block));
+       }
+
+       fsync(fd);
+       close(fd);
+
+       return bytes_written;
+}
+
+int hw_create_partitions(struct hw_destination* dest, const char* output) {
+       // Before we write a new partition table to the disk, we will erase
+       // the first couple of megabytes at the beginning of the device to
+       // get rid of all left other things like bootloaders and partition tables.
+       // This solves some problems when changing from MBR to GPT partitions or
+       // the other way around.
+       int r = hw_zero_out_device(dest->path, MB2BYTES(10));
+       if (r <= 0)
+               return r;
+
+       char* cmd = NULL;
+       asprintf(&cmd, "/usr/sbin/parted -s %s -a optimal", dest->path);
+
+       // Set partition type
+       if (dest->part_table == HW_PART_TABLE_MSDOS)
+               asprintf(&cmd, "%s mklabel msdos", cmd);
+       else if (dest->part_table == HW_PART_TABLE_GPT)
+               asprintf(&cmd, "%s mklabel gpt", cmd);
+
+       unsigned long long part_start = MB2BYTES(1);
+
+       if (*dest->part_bootldr) {
+               asprintf(&cmd, "%s mkpart %s ext2 %lluB %lluB", cmd,
+                       (dest->part_table == HW_PART_TABLE_GPT) ? "BOOTLDR" : "primary",
+               part_start, part_start + dest->size_bootldr - 1);
+
+               part_start += dest->size_bootldr;
+       }
+
+       if (*dest->part_boot) {
+               asprintf(&cmd, "%s mkpart %s ext2 %lluB %lluB", cmd,
+                       (dest->part_table == HW_PART_TABLE_GPT) ? "BOOT" : "primary",
+                       part_start, part_start + dest->size_boot - 1);
+
+               part_start += dest->size_boot;
+       }
+
+       if (*dest->part_swap) {
+               asprintf(&cmd, "%s mkpart %s linux-swap %lluB %lluB", cmd,
+                       (dest->part_table == HW_PART_TABLE_GPT) ? "SWAP" : "primary",
+                       part_start, part_start + dest->size_swap - 1);
+
+               part_start += dest->size_swap;
+       }
+
+       if (*dest->part_root) {
+               asprintf(&cmd, "%s mkpart %s ext2 %lluB %lluB", cmd,
+                       (dest->part_table == HW_PART_TABLE_GPT) ? "ROOT" : "primary",
+                       part_start, part_start + dest->size_root - 1);
+
+               part_start += dest->size_root;
+       }
+
+       if (*dest->part_data) {
+               asprintf(&cmd, "%s mkpart %s ext2 %lluB %lluB", cmd,
+                       (dest->part_table == HW_PART_TABLE_GPT) ? "DATA" : "primary",
+                       part_start, part_start + dest->size_data - 1);
+
+               part_start += dest->size_data;
+       }
+
+       if (dest->part_boot_idx > 0)
+               asprintf(&cmd, "%s set %d boot on", cmd, dest->part_boot_idx);
+
+       if (dest->part_table == HW_PART_TABLE_GPT) {
+               if (*dest->part_bootldr) {
+                       asprintf(&cmd, "%s set %d bios_grub on", cmd, dest->part_boot_idx);
+               }
+               asprintf(&cmd, "%s disk_set pmbr_boot on", cmd);
+       }
+
+       r = mysystem(output, cmd);
+
+       // Wait until the system re-read the partition table
+       if (r == 0) {
+               unsigned int counter = 10;
+
+               while (counter-- > 0) {
+                       sleep(1);
+
+                       if (*dest->part_bootldr && (access(dest->part_bootldr, R_OK) != 0))
+                               continue;
+
+                       if (*dest->part_boot && (access(dest->part_boot, R_OK) != 0))
+                               continue;
+
+                       if (*dest->part_swap && (access(dest->part_swap, R_OK) != 0))
+                               continue;
+
+                       if (*dest->part_root && (access(dest->part_root, R_OK) != 0))
+                               continue;
+
+                       if (*dest->part_data && (access(dest->part_data, R_OK) != 0))
+                               continue;
+
+                       // All partitions do exist, exiting the loop.
+                       break;
+               }
+       }
+
+       if (cmd)
+               free(cmd);
+
+       return r;
+}
+
+static int hw_format_filesystem(const char* path, int fs, const char* output) {
+       char cmd[STRING_SIZE] = "\0";
+
+       // Swap
+       if (fs == HW_FS_SWAP) {
+               snprintf(cmd, sizeof(cmd), "/sbin/mkswap -v1 %s &>/dev/null", path);
+       // ReiserFS
+       } else if (fs == HW_FS_REISERFS) {
+               snprintf(cmd, sizeof(cmd), "/sbin/mkreiserfs -f %s ", path);
+
+       // EXT4
+       } else if (fs == HW_FS_EXT4) {
+               snprintf(cmd, sizeof(cmd), "/sbin/mke2fs -T ext4 %s", path);
+
+       // EXT4 w/o journal
+       } else if (fs == HW_FS_EXT4_WO_JOURNAL) {
+               snprintf(cmd, sizeof(cmd), "/sbin/mke2fs -T ext4 -O ^has_journal %s", path);
+
+       // XFS
+       } else if (fs == HW_FS_XFS) {
+               snprintf(cmd, sizeof(cmd), "/sbin/mkfs.xfs -f %s", path);
+       }
+
+       assert(*cmd);
+
+       int r = mysystem(output, cmd);
+
+       return r;
+}
+
+int hw_create_filesystems(struct hw_destination* dest, const char* output) {
+       int r;
+
+       // boot
+       if (*dest->part_boot) {
+               r = hw_format_filesystem(dest->part_boot, dest->filesystem, output);
+               if (r)
+                       return r;
+       }
+
+       // swap
+       if (*dest->part_swap) {
+               r = hw_format_filesystem(dest->part_swap, HW_FS_SWAP, output);
+               if (r)
+                       return r;
+       }
+
+       // root
+       r = hw_format_filesystem(dest->part_root, dest->filesystem, output);
+       if (r)
+               return r;
+
+       // data
+       if (*dest->part_data) {
+               r = hw_format_filesystem(dest->part_data, dest->filesystem, output);
+               if (r)
+                       return r;
+       }
+
+       return 0;
+}
+
+int hw_mount_filesystems(struct hw_destination* dest, const char* prefix) {
+       char target[STRING_SIZE];
+
+       assert(*prefix == '/');
+
+       const char* filesystem;
+       switch (dest->filesystem) {
+               case HW_FS_REISERFS:
+                       filesystem = "reiserfs";
+                       break;
+
+               case HW_FS_EXT4:
+               case HW_FS_EXT4_WO_JOURNAL:
+                       filesystem = "ext4";
+                       break;
+
+               case HW_FS_XFS:
+                       filesystem = "xfs";
+                       break;
+
+               default:
+                       assert(0);
+       }
+
+       // root
+       int r = hw_mount(dest->part_root, prefix, filesystem, 0);
+       if (r)
+               return r;
+
+       // boot
+       if (*dest->part_boot) {
+               snprintf(target, sizeof(target), "%s%s", prefix, HW_PATH_BOOT);
+               mkdir(target, S_IRWXU|S_IRWXG|S_IRWXO);
+
+               r = hw_mount(dest->part_boot, target, filesystem, 0);
+               if (r) {
+                       hw_umount_filesystems(dest, prefix);
+
+                       return r;
+               }
+       }
+
+       // data
+       if (*dest->part_data) {
+               snprintf(target, sizeof(target), "%s%s", prefix, HW_PATH_DATA);
+               mkdir(target, S_IRWXU|S_IRWXG|S_IRWXO);
+
+               r = hw_mount(dest->part_data, target, filesystem, 0);
+               if (r) {
+                       hw_umount_filesystems(dest, prefix);
+
+                       return r;
+               }
+       }
+
+       // swap
+       if (*dest->part_swap) {
+               r = swapon(dest->part_swap, 0);
+               if (r) {
+                       hw_umount_filesystems(dest, prefix);
+
+                       return r;
+               }
+       }
+
+       // bind-mount misc filesystems
+       char** otherfs = other_filesystems;
+       while (*otherfs) {
+               snprintf(target, sizeof(target), "%s%s", prefix, *otherfs);
+
+               mkdir(target, S_IRWXU|S_IRWXG|S_IRWXO);
+               r = hw_mount(*otherfs, target, NULL, MS_BIND);
+               if (r) {
+                       hw_umount_filesystems(dest, prefix);
+
+                       return r;
+               }
+
+               otherfs++;
+       }
+
+       return 0;
+}
+
+int hw_umount_filesystems(struct hw_destination* dest, const char* prefix) {
+       // Write all buffers to disk before umounting
+       hw_sync();
+
+       // boot
+       if (*dest->part_boot) {
+               hw_umount(dest->part_boot);
+       }
+
+       // data
+       if (*dest->part_data) {
+               hw_umount(dest->part_data);
+       }
+
+       // root
+       hw_umount(dest->part_root);
+
+       // swap
+       if (*dest->part_swap) {
+               swapoff(dest->part_swap);
+       }
+
+       // misc filesystems
+       char target[STRING_SIZE];
+       char** otherfs = other_filesystems;
+
+       while (*otherfs) {
+               snprintf(target, sizeof(target), "%s%s", prefix, *otherfs++);
+               hw_umount(target);
+       }
+
+       return 0;
+}
+
+static int hw_destroy_raid_superblocks(const struct hw_destination* dest, const char* output) {
+       char cmd[STRING_SIZE];
+
+       hw_stop_all_raid_arrays(output);
+       hw_stop_all_raid_arrays(output);
+
+       if (dest->disk1) {
+               snprintf(cmd, sizeof(cmd), "/sbin/mdadm --zero-superblock %s", dest->disk1->path);
+               mysystem(output, cmd);
+       }
+
+       if (dest->disk2) {
+               snprintf(cmd, sizeof(cmd), "/sbin/mdadm --zero-superblock %s", dest->disk2->path);
+               mysystem(output, cmd);
+       }
+
+       return 0;
+}
+
+int hw_setup_raid(struct hw_destination* dest, const char* output) {
+       char* cmd = NULL;
+       int r;
+
+       assert(dest->is_raid);
+
+       // Stop all RAID arrays that might be around (again).
+       // It seems that there is some sort of race-condition with udev re-enabling
+       // the raid arrays and therefore locking the disks.
+       r = hw_destroy_raid_superblocks(dest, output);
+
+       asprintf(&cmd, "echo \"y\" | /sbin/mdadm --create --verbose --metadata=%s --auto=mdp %s",
+               RAID_METADATA, dest->path);
+
+       switch (dest->raid_level) {
+               case 1:
+                       asprintf(&cmd, "%s --level=1 --raid-devices=2", cmd);
+                       break;
+
+               default:
+                       assert(0);
+       }
+
+       if (dest->disk1) {
+               asprintf(&cmd, "%s %s", cmd, dest->disk1->path);
+
+               // Clear all data at the beginning
+               r = hw_zero_out_device(dest->disk1->path, MB2BYTES(10));
+               if (r <= 0)
+                       return r;
+       }
+
+       if (dest->disk2) {
+               asprintf(&cmd, "%s %s", cmd, dest->disk2->path);
+
+               // Clear all data at the beginning
+               r = hw_zero_out_device(dest->disk2->path, MB2BYTES(10));
+               if (r <= 0)
+                       return r;
+       }
+
+       r = mysystem(output, cmd);
+       free(cmd);
+
+       // Wait a moment until the device has been properly brought up
+       if (r == 0) {
+               unsigned int counter = 10;
+               while (counter-- > 0) {
+                       sleep(1);
+
+                       // If the raid device has not yet been properly brought up,
+                       // opening it will fail with the message: Device or resource busy
+                       // Hence we will wait a bit until it becomes usable.
+                       FILE* f = fopen(dest->path, "r");
+                       if (f) {
+                               fclose(f);
+                               break;
+                       }
+               }
+       }
+
+       return r;
+}
+
+int hw_stop_all_raid_arrays(const char* output) {
+       return mysystem(output, "/sbin/mdadm --stop --scan --verbose");
+}
+
+int hw_install_bootloader(struct hw_destination* dest, const char* output) {
+       char cmd[STRING_SIZE];
+       int r;
+
+       // Generate configuration file
+       snprintf(cmd, sizeof(cmd), "/usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg");
+       r = system_chroot(output, DESTINATION_MOUNT_PATH, cmd);
+       if (r)
+               return r;
+
+       char cmd_grub[STRING_SIZE];
+       snprintf(cmd_grub, sizeof(cmd_grub), "/usr/sbin/grub-install --no-floppy --recheck");
+
+       if (dest->is_raid) {
+               snprintf(cmd, sizeof(cmd), "%s %s", cmd_grub, dest->disk1->path);
+               r = system_chroot(output, DESTINATION_MOUNT_PATH, cmd);
+               if (r)
+                       return r;
+
+               snprintf(cmd, sizeof(cmd), "%s %s", cmd_grub, dest->disk2->path);
+               r = system_chroot(output, DESTINATION_MOUNT_PATH, cmd);
+       } else {
+               snprintf(cmd, sizeof(cmd), "%s %s", cmd_grub, dest->path);
+               r = system_chroot(output, DESTINATION_MOUNT_PATH, cmd);
+       }
+
+       return r;
+}
+
+static char* hw_get_uuid(const char* dev) {
+       blkid_probe p = blkid_new_probe_from_filename(dev);
+       const char* buffer = NULL;
+       char* uuid = NULL;
+
+       if (!p)
+               return NULL;
+
+       blkid_do_probe(p);
+       blkid_probe_lookup_value(p, "UUID", &buffer, NULL);
+
+       if (buffer)
+               uuid = strdup(buffer);
+
+       blkid_free_probe(p);
+
+       return uuid;
+}
+
+int hw_write_fstab(struct hw_destination* dest) {
+       FILE* f = fopen(DESTINATION_MOUNT_PATH "/etc/fstab", "w");
+       if (!f)
+               return -1;
+
+       const char* fmt = "UUID=%s %-8s %-4s %-10s %d %d\n";
+       char* uuid = NULL;
+
+       // boot
+       if (*dest->part_boot) {
+               uuid = hw_get_uuid(dest->part_boot);
+
+               if (uuid) {
+                       fprintf(f, fmt, uuid, "/boot", "auto", "defaults", 1, 2);
+                       free(uuid);
+               }
+       }
+
+       // swap
+       if (*dest->part_swap) {
+               uuid = hw_get_uuid(dest->part_swap);
+
+               if (uuid) {
+                       fprintf(f, fmt, uuid, "swap", "swap", "defaults,pri=1", 0, 0);
+                       free(uuid);
+               }
+       }
+
+       // root
+       uuid = hw_get_uuid(dest->part_root);
+       if (uuid) {
+               fprintf(f, fmt, uuid, "/", "auto", "defaults", 1, 1);
+               free(uuid);
+       }
+
+       // data
+       if (*dest->part_data) {
+               uuid = hw_get_uuid(dest->part_data);
+
+               if (uuid) {
+                       fprintf(f, fmt, uuid, "/var", "auto", "defaults", 1, 1);
+                       free(uuid);
+               }
+       }
+
+       fclose(f);
+
+       return 0;
+}
+
+void hw_sync() {
+       sync();
+       sync();
+       sync();
+}
diff --git a/src/installer/hw.h b/src/installer/hw.h
new file mode 100644 (file)
index 0000000..bfafbe4
--- /dev/null
@@ -0,0 +1,129 @@
+/*#############################################################################
+#                                                                             #
+# IPFire - An Open Source Firewall Distribution                               #
+# Copyright (C) 2014 IPFire development team                                  #
+#                                                                             #
+# 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 3 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, see <http://www.gnu.org/licenses/>.       #
+#                                                                             #
+#############################################################################*/
+
+#ifndef HEADER_HW_H
+#define HEADER_HW_H
+
+#include <libudev.h>
+
+#define DESTINATION_MOUNT_PATH        "/harddisk"
+#define SOURCE_MOUNT_PATH "/cdrom"
+#define SOURCE_TEST_FILE  SOURCE_MOUNT_PATH "/" VERSION ".media"
+
+#define HW_MAX_DISKS                 32
+#define STRING_SIZE                1024
+#define DEV_SIZE                    128
+
+#define HW_PATH_BOOT                  "/boot"
+#define HW_PATH_DATA                  "/var"
+
+#define HW_PART_TYPE_NORMAL           0
+#define HW_PART_TYPE_RAID1            1
+
+#define HW_PART_TABLE_MSDOS           0
+#define HW_PART_TABLE_GPT             1
+
+#define HW_FS_SWAP                    0
+#define HW_FS_REISERFS                1
+#define HW_FS_EXT4                    2
+#define HW_FS_EXT4_WO_JOURNAL         3
+#define HW_FS_XFS                     4
+
+#define HW_FS_DEFAULT                 HW_FS_EXT4
+
+#define RAID_METADATA                 "1.0"
+
+#define BYTES2MB(x) ((x) / 1024 / 1024)
+#define MB2BYTES(x) ((unsigned long long)(x) * 1024 * 1024)
+
+struct hw {
+       struct udev *udev;
+};
+
+struct hw_disk {
+       char path[DEV_SIZE];
+       unsigned long long size;
+
+       char description[STRING_SIZE];
+       char vendor[STRING_SIZE];
+       char model[STRING_SIZE];
+
+       // Reference counter
+       int ref;
+};
+
+struct hw_destination {
+       char path[DEV_SIZE];
+
+       int is_raid;
+       int raid_level;
+       const struct hw_disk* disk1;
+       const struct hw_disk* disk2;
+
+       int part_table;
+       char part_bootldr[DEV_SIZE];
+       char part_boot[DEV_SIZE];
+       char part_swap[DEV_SIZE];
+       char part_root[DEV_SIZE];
+       char part_data[DEV_SIZE];
+       int part_boot_idx;
+
+       int filesystem;
+
+       unsigned long long size;
+       unsigned long long size_bootldr;
+       unsigned long long size_boot;
+       unsigned long long size_swap;
+       unsigned long long size_root;
+       unsigned long long size_data;
+};
+
+struct hw* hw_init();
+void hw_free(struct hw* hw);
+
+int hw_mount(const char* source, const char* target, const char* fs, int flags);
+int hw_umount(const char* target);
+
+char* hw_find_source_medium(struct hw* hw);
+
+struct hw_disk** hw_find_disks(struct hw* hw);
+void hw_free_disks(struct hw_disk** disks);
+unsigned int hw_count_disks(struct hw_disk** disks);
+struct hw_disk** hw_select_disks(struct hw_disk** disks, int* selection);
+
+struct hw_destination* hw_make_destination(int part_type, struct hw_disk** disks);
+
+unsigned long long hw_memory();
+
+int hw_create_partitions(struct hw_destination* dest, const char* output);
+int hw_create_filesystems(struct hw_destination* dest, const char* output);
+
+int hw_mount_filesystems(struct hw_destination* dest, const char* prefix);
+int hw_umount_filesystems(struct hw_destination* dest, const char* prefix);
+
+int hw_setup_raid(struct hw_destination* dest, const char* output);
+int hw_stop_all_raid_arrays(const char* output);
+
+int hw_install_bootloader(struct hw_destination* dest, const char* output);
+int hw_write_fstab(struct hw_destination* dest);
+
+void hw_sync();
+
+#endif /* HEADER_HW_H */
diff --git a/src/installer/install.h b/src/installer/install.h
new file mode 100644 (file)
index 0000000..8e59930
--- /dev/null
@@ -0,0 +1,14 @@
+/* SmoothWall install program.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence.  See the file COPYING for details.
+ *
+ * (c) Lawrence Manning, 2001
+ * Main include file.
+ * 
+ */
+
+#include <libsmooth.h>
+
+/* unattended.c */
+int unattended_setup(struct keyvalue *unattendedkv, const char* output);
diff --git a/src/installer/m4/attributes.m4 b/src/installer/m4/attributes.m4
new file mode 100644 (file)
index 0000000..7e080da
--- /dev/null
@@ -0,0 +1,288 @@
+dnl Macros to check the presence of generic (non-typed) symbols.
+dnl Copyright (c) 2006-2008 Diego Pettenò <flameeyes@gmail.com>
+dnl Copyright (c) 2006-2008 xine project
+dnl Copyright (c) 2012 Lucas De Marchi <lucas.de.marchi@gmail.com>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2, or (at your option)
+dnl any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+dnl 02110-1301, USA.
+dnl
+dnl As a special exception, the copyright owners of the
+dnl macro gives unlimited permission to copy, distribute and modify the
+dnl configure scripts that are the output of Autoconf when processing the
+dnl Macro. You need not follow the terms of the GNU General Public
+dnl License when using or distributing such scripts, even though portions
+dnl of the text of the Macro appear in them. The GNU General Public
+dnl License (GPL) does govern all other use of the material that
+dnl constitutes the Autoconf Macro.
+dnl
+dnl This special exception to the GPL applies to versions of the
+dnl Autoconf Macro released by this project. When you make and
+dnl distribute a modified version of the Autoconf Macro, you may extend
+dnl this special exception to the GPL to apply to your modified version as
+dnl well.
+
+dnl Check if FLAG in ENV-VAR is supported by compiler and append it
+dnl to WHERE-TO-APPEND variable
+dnl CC_CHECK_FLAG_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG])
+
+AC_DEFUN([CC_CHECK_FLAG_APPEND], [
+  AC_CACHE_CHECK([if $CC supports flag $3 in envvar $2],
+                 AS_TR_SH([cc_cv_$2_$3]),
+          [eval "AS_TR_SH([cc_save_$2])='${$2}'"
+           eval "AS_TR_SH([$2])='-Werror $3'"
+           AC_COMPILE_IFELSE([AC_LANG_SOURCE([int a = 0; int main(void) { return a; } ])],
+                                    [eval "AS_TR_SH([cc_cv_$2_$3])='yes'"],
+                                    [eval "AS_TR_SH([cc_cv_$2_$3])='no'"])
+           eval "AS_TR_SH([$2])='$cc_save_$2'"])
+
+  AS_IF([eval test x$]AS_TR_SH([cc_cv_$2_$3])[ = xyes],
+        [eval "$1='${$1} $3'"])
+])
+
+dnl CC_CHECK_FLAGS_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG1 FLAG2])
+AC_DEFUN([CC_CHECK_FLAGS_APPEND], [
+  for flag in $3; do
+    CC_CHECK_FLAG_APPEND($1, $2, $flag)
+  done
+])
+
+dnl Check if the flag is supported by linker (cacheable)
+dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
+
+AC_DEFUN([CC_CHECK_LDFLAGS], [
+  AC_CACHE_CHECK([if $CC supports $1 flag],
+    AS_TR_SH([cc_cv_ldflags_$1]),
+    [ac_save_LDFLAGS="$LDFLAGS"
+     LDFLAGS="$LDFLAGS $1"
+     AC_LINK_IFELSE([int main() { return 1; }],
+       [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"],
+       [eval "AS_TR_SH([cc_cv_ldflags_$1])="])
+     LDFLAGS="$ac_save_LDFLAGS"
+    ])
+
+  AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes],
+    [$2], [$3])
+])
+
+dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for
+dnl the current linker to avoid undefined references in a shared object.
+AC_DEFUN([CC_NOUNDEFINED], [
+  dnl We check $host for which systems to enable this for.
+  AC_REQUIRE([AC_CANONICAL_HOST])
+
+  case $host in
+     dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads
+     dnl are requested, as different implementations are present; to avoid problems
+     dnl use -Wl,-z,defs only for those platform not behaving this way.
+     *-freebsd* | *-openbsd*) ;;
+     *)
+        dnl First of all check for the --no-undefined variant of GNU ld. This allows
+        dnl for a much more readable commandline, so that people can understand what
+        dnl it does without going to look for what the heck -z defs does.
+        for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do
+           CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"])
+           break
+        done
+     ;;
+  esac
+
+  AC_SUBST([LDFLAGS_NOUNDEFINED])
+])
+
+dnl Check for a -Werror flag or equivalent. -Werror is the GCC
+dnl and ICC flag that tells the compiler to treat all the warnings
+dnl as fatal. We usually need this option to make sure that some
+dnl constructs (like attributes) are not simply ignored.
+dnl
+dnl Other compilers don't support -Werror per se, but they support
+dnl an equivalent flag:
+dnl  - Sun Studio compiler supports -errwarn=%all
+AC_DEFUN([CC_CHECK_WERROR], [
+  AC_CACHE_CHECK(
+    [for $CC way to treat warnings as errors],
+    [cc_cv_werror],
+    [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror],
+      [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])])
+    ])
+])
+
+AC_DEFUN([CC_CHECK_ATTRIBUTE], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))],
+    AS_TR_SH([cc_cv_attribute_$1]),
+    [ac_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])],
+       [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"],
+       [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"])
+     CFLAGS="$ac_save_CFLAGS"
+    ])
+
+  AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes],
+    [AC_DEFINE(
+       AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1,
+         [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))]
+         )
+     $4],
+    [$5])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [
+  CC_CHECK_ATTRIBUTE(
+    [constructor],,
+    [void __attribute__((constructor)) ctor() { int a; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_FORMAT], [
+  CC_CHECK_ATTRIBUTE(
+    [format], [format(printf, n, n)],
+    [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [
+  CC_CHECK_ATTRIBUTE(
+    [format_arg], [format_arg(printf)],
+    [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [
+  CC_CHECK_ATTRIBUTE(
+    [visibility_$1], [visibility("$1")],
+    [void __attribute__((visibility("$1"))) $1_function() { }],
+    [$2], [$3])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_NONNULL], [
+  CC_CHECK_ATTRIBUTE(
+    [nonnull], [nonnull()],
+    [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_UNUSED], [
+  CC_CHECK_ATTRIBUTE(
+    [unused], ,
+    [void some_function(void *foo, __attribute__((unused)) void *bar);],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [
+  CC_CHECK_ATTRIBUTE(
+    [sentinel], ,
+    [void some_function(void *foo, ...) __attribute__((sentinel));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [
+  CC_CHECK_ATTRIBUTE(
+    [deprecated], ,
+    [void some_function(void *foo, ...) __attribute__((deprecated));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_ALIAS], [
+  CC_CHECK_ATTRIBUTE(
+    [alias], [weak, alias],
+    [void other_function(void *foo) { }
+     void some_function(void *foo) __attribute__((weak, alias("other_function")));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_MALLOC], [
+  CC_CHECK_ATTRIBUTE(
+    [malloc], ,
+    [void * __attribute__((malloc)) my_alloc(int n);],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_PACKED], [
+  CC_CHECK_ATTRIBUTE(
+    [packed], ,
+    [struct astructure { char a; int b; long c; void *d; } __attribute__((packed));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_CONST], [
+  CC_CHECK_ATTRIBUTE(
+    [const], ,
+    [int __attribute__((const)) twopow(int n) { return 1 << n; } ],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_FLAG_VISIBILITY], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([if $CC supports -fvisibility=hidden],
+    [cc_cv_flag_visibility],
+    [cc_flag_visibility_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden],
+     cc_cv_flag_visibility='yes',
+     cc_cv_flag_visibility='no')
+     CFLAGS="$cc_flag_visibility_save_CFLAGS"])
+
+  AS_IF([test "x$cc_cv_flag_visibility" = "xyes"],
+    [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1,
+       [Define this if the compiler supports the -fvisibility flag])
+     $1],
+    [$2])
+])
+
+AC_DEFUN([CC_FUNC_EXPECT], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([if compiler has __builtin_expect function],
+    [cc_cv_func_expect],
+    [ac_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     AC_COMPILE_IFELSE([AC_LANG_SOURCE(
+       [int some_function() {
+        int a = 3;
+        return (int)__builtin_expect(a, 3);
+     }])],
+       [cc_cv_func_expect=yes],
+       [cc_cv_func_expect=no])
+     CFLAGS="$ac_save_CFLAGS"
+    ])
+
+  AS_IF([test "x$cc_cv_func_expect" = "xyes"],
+    [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1,
+     [Define this if the compiler supports __builtin_expect() function])
+     $1],
+    [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported],
+    [cc_cv_attribute_aligned],
+    [ac_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     for cc_attribute_align_try in 64 32 16 8 4 2; do
+        AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+          int main() {
+            static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0;
+            return c;
+          }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break])
+     done
+     CFLAGS="$ac_save_CFLAGS"
+  ])
+
+  if test "x$cc_cv_attribute_aligned" != "x"; then
+     AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned],
+       [Define the highest alignment supported])
+  fi
+])
diff --git a/src/installer/main.c b/src/installer/main.c
new file mode 100644 (file)
index 0000000..313b351
--- /dev/null
@@ -0,0 +1,696 @@
+/* SmoothWall install program.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence.  See the file COPYING for details.
+ *
+ * (c) Lawrence Manning, 2001
+ * Contains main entry point, and misc functions.6
+ * 
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mount.h>
+
+#include "hw.h"
+#include "install.h"
+
+// Translation
+#include <libintl.h>
+#define _(x) dgettext("installer", x)
+
+#define INST_FILECOUNT 21000
+#define UNATTENDED_CONF "/cdrom/boot/unattended.conf"
+#define LICENSE_FILE   "/cdrom/COPYING"
+
+extern char url[STRING_SIZE];
+
+static int newtChecklist(const char* title, const char* message,
+               unsigned int width, unsigned int height, unsigned int num_entries,
+               const char** entries, int* states) {
+       int ret;
+       const int list_height = 4;
+
+       char cbstates[num_entries];
+
+       for (unsigned int i = 0; i < num_entries; i++) {
+               cbstates[i] = states[i] ? '*' : ' ';
+       }
+
+       newtCenteredWindow(width, height, title);
+
+       newtComponent textbox = newtTextbox(1, 1, width - 2, height - 6 - list_height,
+               NEWT_FLAG_WRAP);
+       newtTextboxSetText(textbox, message);
+
+       int top = newtTextboxGetNumLines(textbox) + 2;
+
+       newtComponent form = newtForm(NULL, NULL, 0);
+
+       newtComponent sb = NULL;
+       if (list_height < num_entries) {
+               sb = newtVerticalScrollbar(
+                       width - 4, top + 1, list_height,
+                       NEWT_COLORSET_CHECKBOX, NEWT_COLORSET_ACTCHECKBOX);
+
+               newtFormAddComponent(form, sb);
+       }
+
+       newtComponent subform = newtForm(sb, NULL, 0);
+       newtFormSetBackground(subform, NEWT_COLORSET_CHECKBOX);
+
+       newtFormSetHeight(subform, list_height);
+       newtFormSetWidth(subform, width - 10);
+
+       for (unsigned int i = 0; i < num_entries; i++) {
+               newtComponent cb = newtCheckbox(4, top + i, entries[i], cbstates[i],
+                       NULL, &cbstates[i]);
+
+               newtFormAddComponent(subform, cb);
+       }
+
+       newtFormAddComponents(form, textbox, subform, NULL);
+
+       newtComponent btn_okay   = newtButton((width - 18) / 3, height - 4, _("OK"));
+       newtComponent btn_cancel = newtButton((width - 18) / 3 * 2 + 9, height - 4, _("Cancel"));
+       newtFormAddComponents(form, btn_okay, btn_cancel, NULL);
+
+       newtComponent answer = newtRunForm(form);
+
+       if ((answer == NULL) || (answer == btn_cancel)) {
+               ret = -1;
+       } else {
+               ret = 0;
+
+               for (unsigned int i = 0; i < num_entries; i++) {
+                       states[i] = (cbstates[i] != ' ');
+
+                       if (states[i])
+                               ret++;
+               }
+       }
+
+       newtFormDestroy(form);
+       newtPopWindow();
+
+       return ret;
+}
+
+static int newtWinOkCancel(const char* title, const char* message, int width, int height,
+               const char* btn_txt_ok, const char* btn_txt_cancel) {
+       int ret = 1;
+
+       newtCenteredWindow(width, height, title);
+
+       newtComponent form = newtForm(NULL, NULL, 0);
+
+       newtComponent textbox = newtTextbox(1, 1, width - 2, height - 6, NEWT_FLAG_WRAP);
+       newtTextboxSetText(textbox, message);
+       newtFormAddComponent(form, textbox);
+
+       newtComponent btn_ok = newtButton((width - 16) / 3, height - 4, btn_txt_ok);
+       newtComponent btn_cancel = newtButton((width - 16) / 3 * 2 + 9, height - 4,
+               btn_txt_cancel);
+
+       newtFormAddComponents(form, btn_ok, btn_cancel, NULL);
+
+       newtComponent answer = newtRunForm(form);
+
+       if (answer == btn_ok) {
+               ret = 0;
+       }
+
+       newtFormDestroy(form);
+       newtPopWindow();
+
+       return ret;
+}
+
+static int newtLicenseBox(const char* title, const char* text, int width, int height) {
+       int ret = 1;
+
+       newtCenteredWindow(width, height, title);
+
+       newtComponent form = newtForm(NULL, NULL, 0);
+
+       newtComponent textbox = newtTextbox(1, 1, width - 2, height - 7,
+               NEWT_FLAG_WRAP|NEWT_FLAG_SCROLL);
+       newtTextboxSetText(textbox, text);
+       newtFormAddComponent(form, textbox);
+
+       char choice;
+       newtComponent checkbox = newtCheckbox(3, height - 3, _("I accept this license"),
+               ' ', " *", &choice);
+
+       newtComponent btn = newtButton(width - 15, height - 4, _("OK"));
+
+       newtFormAddComponents(form, checkbox, btn, NULL);
+
+       newtComponent answer = newtRunForm(form);
+       if (answer == btn && choice == '*')
+               ret = 0;
+
+       newtFormDestroy(form);
+       newtPopWindow();
+
+       return ret;
+}
+
+int write_lang_configs(const char *lang) {
+       struct keyvalue *kv = initkeyvalues();
+
+       /* default stuff for main/settings. */
+       replacekeyvalue(kv, "LANGUAGE", lang);
+       replacekeyvalue(kv, "HOSTNAME", SNAME);
+       replacekeyvalue(kv, "THEME", "ipfire");
+       writekeyvalues(kv, "/harddisk" CONFIG_ROOT "/main/settings");
+       freekeyvalues(kv);
+
+       return 1;
+}
+
+static char* get_system_release() {
+       char system_release[STRING_SIZE] = "\0";
+
+       FILE* f = fopen("/etc/system-release", "r");
+       if (f) {
+               fgets(system_release, sizeof(system_release), f);
+               fclose(f);
+       }
+
+       return strdup(system_release);
+}
+
+static char* center_string(const char* str, int width) {
+       unsigned int str_len = strlen(str);
+
+       unsigned int indent_length = (width - str_len) / 2;
+       char indent[indent_length + 1];
+
+       for (unsigned int i = 0; i < indent_length; i++) {
+               indent[i] = ' ';
+       }
+       indent[indent_length] = '\0';
+
+       char* string = NULL;
+       if (asprintf(&string, "%s%s", indent, str) < 0)
+               return NULL;
+
+       return string;
+}
+
+#define DEFAULT_LANG "English"
+#define NUM_LANGS 8
+
+static struct lang {
+       const char* code;
+       char* name;
+} languages[NUM_LANGS + 1] = {
+       { "nl_NL.utf8", "Dutch (Nederlands)" },
+       { "en_US.utf8", "English" },
+       { "fr_FR.utf8", "French (Français)" },
+       { "de_DE.utf8", "German (Deutsch)" },
+       { "pl_PL.utf8", "Polish (Polski)" },
+       { "ru_RU.utf8", "Russian (Русский)" },
+       { "es_ES.utf8", "Spanish (Español)" },
+       { "tr_TR.utf8", "Turkish (Türkçe)" },
+       { NULL, NULL },
+};
+
+int main(int argc, char *argv[]) {
+       struct hw* hw = hw_init();
+       const char* logfile = NULL;
+
+       // Read /etc/system-release
+       char* system_release = get_system_release();
+
+       char discl_msg[40000] = "Disclaimer\n";
+
+       char* sourcedrive = NULL;
+       int rc = 0;
+       char commandstring[STRING_SIZE];
+       int choice;
+       char shortlangname[10];
+       char message[STRING_SIZE];
+       char title[STRING_SIZE];
+       int allok = 0;
+       FILE *handle, *cmdfile, *copying;
+       char line[STRING_SIZE];
+               
+       int unattended = 0;
+       int serialconsole = 0;
+       struct keyvalue *unattendedkv = initkeyvalues();
+       char restore_file[STRING_SIZE] = "";
+
+       setlocale (LC_ALL, "");
+       sethostname( SNAME , 10);
+
+       /* Log file/terminal stuff. */
+       FILE* flog = NULL;
+       if (argc >= 2) {
+               logfile = argv[1];
+
+               if (!(flog = fopen(logfile, "w+")))
+                       return 0;
+       } else {
+               return 0;
+       }
+
+       fprintf(flog, "Install program started.\n");
+               
+       newtInit();
+       newtCls();
+
+       // Determine the size of the screen
+       int screen_cols = 0;
+       int screen_rows = 0;
+
+       newtGetScreenSize(&screen_cols, &screen_rows);
+
+       // Draw title
+       char* roottext = center_string(system_release, screen_cols);
+       newtDrawRootText(0, 0, roottext);
+
+       snprintf(title, sizeof(title), "%s - %s", NAME, SLOGAN);
+
+       if (! (cmdfile = fopen("/proc/cmdline", "r")))
+       {
+               fprintf(flog, "Couldn't open commandline: /proc/cmdline\n");
+       } else {
+               fgets(line, STRING_SIZE, cmdfile);
+               
+               // check if we have to make an unattended install
+               if (strstr (line, "unattended") != NULL) {
+                   unattended = 1;
+                   runcommandwithstatus("/bin/sleep 10", title, "WARNING: Unattended installation will start in 10 seconds...", NULL);
+               }               
+               // check if we have to patch for serial console
+               if (strstr (line, "console=ttyS0") != NULL) {
+                   serialconsole = 1;
+               }
+       }
+
+       // Load common modules
+       mysystem(logfile, "/sbin/modprobe vfat"); // USB key
+       hw_stop_all_raid_arrays(logfile);
+
+       if (!unattended) {
+               // Language selection
+               char* langnames[NUM_LANGS + 1];
+
+               for (unsigned int i = 0; i < NUM_LANGS; i++) {
+                       if (strcmp(languages[i].name, DEFAULT_LANG) == 0)
+                               choice = i;
+
+                       langnames[i] = languages[i].name;
+               }
+               langnames[NUM_LANGS] = NULL;
+
+           rc = newtWinMenu(_("Language selection"), _("Select the language you wish to use for the installation."),
+                       50, 5, 5, 8, langnames, &choice, _("OK"), NULL);
+
+               assert(choice <= NUM_LANGS);
+
+               fprintf(flog, "Selected language: %s (%s)\n", languages[choice].name, languages[choice].code);
+
+               setenv("LANGUAGE", languages[choice].code, 1);
+               setlocale(LC_ALL, languages[choice].code);
+       }
+
+       char* helpline = center_string(_("<Tab>/<Alt-Tab> between elements | <Space> selects | <F12> next screen"), screen_cols);
+       newtPushHelpLine(helpline);
+
+       if (!unattended) {
+               snprintf(message, sizeof(message),
+                       _("Welcome to the %s installation program.\n\n"
+                       "Selecting Cancel on any of the following screens will reboot the computer."), NAME);
+               newtWinMessage(title, _("Start installation"), message);
+       }
+
+       /* Search for a source drive that holds the right
+        * version of the image we are going to install. */
+       sourcedrive = hw_find_source_medium(hw);
+
+       fprintf(flog, "Source drive: %s\n", sourcedrive);
+       if (!sourcedrive) {
+               newtWinMessage(title, _("OK"), _("No local source media found. Starting download."));
+               runcommandwithstatus("/bin/downloadsource.sh", title, _("Downloading installation image ..."), logfile);
+               if ((handle = fopen("/tmp/source_device", "r")) == NULL) {
+                       errorbox(_("Download error"));
+                       goto EXIT;
+               }
+
+               fgets(sourcedrive, 5, handle);
+               fclose(handle);
+       }
+
+       assert(sourcedrive);
+
+       int r = hw_mount(sourcedrive, SOURCE_MOUNT_PATH, "iso9660", MS_RDONLY);
+       if (r) {
+               fprintf(flog, "Could not mount %s to %s\n", sourcedrive, SOURCE_MOUNT_PATH);
+               fprintf(flog, strerror(errno));
+               exit(1);
+       }
+
+       /* load unattended configuration */
+       if (unattended) {
+           fprintf(flog, "unattended: Reading unattended.conf\n");
+
+           (void) readkeyvalues(unattendedkv, UNATTENDED_CONF);
+           findkey(unattendedkv, "RESTORE_FILE", restore_file);
+       }
+
+       if (!unattended) {
+               // Read the license file.
+               if (!(copying = fopen(LICENSE_FILE, "r"))) {
+                       sprintf(discl_msg, "Could not open license file: %s\n", LICENSE_FILE);
+                       fprintf(flog, discl_msg);
+               } else {
+                       fread(discl_msg, 1, 40000, copying);
+                       fclose(copying);
+
+                       if (newtLicenseBox(_("License Agreement"), discl_msg, 75, 20)) {
+                               errorbox(_("License not accepted!"));
+
+                               goto EXIT;
+                       }
+               }
+       }
+
+       int part_type = HW_PART_TYPE_NORMAL;
+
+       // Scan for disks to install on.
+       struct hw_disk** disks = hw_find_disks(hw);
+
+       struct hw_disk** selected_disks = NULL;
+       unsigned int num_selected_disks = 0;
+
+       // Check how many disks have been found and what
+       // we can do with them.
+       unsigned int num_disks = hw_count_disks(disks);
+
+       while (1) {
+               // no harddisks found
+               if (num_disks == 0) {
+                       errorbox(_("No hard disk found."));
+                       goto EXIT;
+
+               // exactly one disk has been found
+               } else if (num_disks == 1) {
+                       selected_disks = hw_select_disks(disks, NULL);
+
+               // more than one usable disk has been found and
+               // the user needs to choose what to do with them
+               } else {
+                       const char* disk_names[num_disks];
+                       int disk_selection[num_disks];
+
+                       for (unsigned int i = 0; i < num_disks; i++) {
+                               disk_names[i] = &disks[i]->description;
+                               disk_selection[i] = 0;
+                       }
+
+                       while (!selected_disks) {
+                               rc = newtChecklist(_("Disk Selection"),
+                                       _("Select the disk(s) you want to install IPFire on. "
+                                       "First those will be partitioned, and then the partitions will have a filesystem put on them.\n\n"
+                                       "ALL DATA ON THE DISK WILL BE DESTROYED."),
+                                       50, 20, num_disks, disk_names, disk_selection);
+
+                               // Error
+                               if (rc < 0) {
+                                       goto EXIT;
+
+                               // Nothing has been selected
+                               } else if (rc == 0) {
+                                       errorbox(_("No disk has been selected.\n\n"
+                                               "Please select one or more disks you want to install IPFire on."));
+
+                               } else {
+                                       selected_disks = hw_select_disks(disks, disk_selection);
+                               }
+                       }
+               }
+
+               num_selected_disks = hw_count_disks(selected_disks);
+
+               if (num_selected_disks == 1) {
+                       snprintf(message, sizeof(message),
+                               _("The installation program will now prepare the chosen harddisk:\n\n  %s\n\n"
+                               "Do you agree to continue?"), (*selected_disks)->description);
+                       rc = newtWinOkCancel(_("Disk Setup"), message, 50, 10,
+                               _("Delete all data"), _("Cancel"));
+
+                       if (rc == 0)
+                               break;
+
+               } else if (num_selected_disks == 2) {
+                       snprintf(message, sizeof(message),
+                               _("The installation program will now set up a RAID configuration on the selected harddisks:\n\n  %s\n  %s\n\n"
+                               "Do you agree to continue?"), (*selected_disks)->description, (*selected_disks + 1)->description);
+                       rc = newtWinOkCancel(_("RAID Setup"), message, 50, 14,
+                               _("Delete all data"), _("Cancel"));
+
+                       if (rc == 0) {
+                               part_type = HW_PART_TYPE_RAID1;
+
+                               break;
+                       }
+
+               // Currently not supported
+               } else {
+                       errorbox(_("You disk configuration is currently not supported."));
+               }
+
+               if (selected_disks) {
+                       hw_free_disks(selected_disks);
+                       selected_disks = NULL;
+               }
+       }
+
+       hw_free_disks(disks);
+
+       struct hw_destination* destination = hw_make_destination(part_type, selected_disks);
+
+       if (!destination) {
+               errorbox(_("Your harddisk is too small."));
+               goto EXIT;
+       }
+
+       fprintf(flog, "Destination drive: %s\n", destination->path);
+       fprintf(flog, "  bootldr: %s (%lluMB)\n", destination->part_bootldr, BYTES2MB(destination->size_bootldr));
+       fprintf(flog, "  boot   : %s (%lluMB)\n", destination->part_boot, BYTES2MB(destination->size_boot));
+       fprintf(flog, "  swap   : %s (%lluMB)\n", destination->part_swap, BYTES2MB(destination->size_swap));
+       fprintf(flog, "  root   : %s (%lluMB)\n", destination->part_root, BYTES2MB(destination->size_root));
+       fprintf(flog, "  data   : %s (%lluMB)\n", destination->part_data, BYTES2MB(destination->size_data));
+
+       // Warn the user if there is not enough space to create a swap partition
+       if (!unattended && !*destination->part_swap) {
+               rc = newtWinChoice(title, _("OK"), _("Cancel"),
+                       _("Your harddisk is very small, but you can continue without a swap partition."));
+
+               if (rc != 1)
+                       goto EXIT;
+       }
+
+       // Filesystem selection
+       if (!unattended) {
+               struct filesystems {
+                       int fstype;
+                       const char* description;
+               } filesystems[] = {
+                       { HW_FS_EXT4,            _("ext4 Filesystem") },
+                       { HW_FS_EXT4_WO_JOURNAL, _("ext4 Filesystem without journal") },
+                       { HW_FS_XFS,             _("XFS Filesystem") },
+                       { HW_FS_REISERFS,        _("ReiserFS Filesystem") },
+                       { 0, NULL },
+               };
+               unsigned int num_filesystems = sizeof(filesystems) / sizeof(*filesystems);
+
+               char* fs_names[num_filesystems];
+               int fs_choice = 0;
+               for (unsigned int i = 0; i < num_filesystems; i++) {
+                       if (HW_FS_DEFAULT == filesystems[i].fstype)
+                               fs_choice = i;
+
+                       fs_names[i] = filesystems[i].description;
+               }
+
+               rc = newtWinMenu(_("Filesystem Selection"), _("Please choose your filesystem:"),
+                       50, 5, 5, 6, fs_names, &fs_choice, _("OK"), _("Cancel"), NULL);
+
+               if (rc == 2)
+                       goto EXIT;
+
+               destination->filesystem = filesystems[fs_choice].fstype;
+       }
+
+       // Setting up RAID if needed.
+       if (destination->is_raid) {
+               statuswindow(60, 4, title, _("Building RAID..."));
+
+               rc = hw_setup_raid(destination, logfile);
+               if (rc) {
+                       errorbox(_("Unable to build the RAID."));
+                       goto EXIT;
+               }
+
+               newtPopWindow();
+       }
+
+       // Execute the partitioning...
+       statuswindow(60, 4, title, _("Partitioning disk..."));
+
+       rc = hw_create_partitions(destination, logfile);
+       if (rc) {
+               errorbox(_("Unable to partition the disk."));
+               goto EXIT;
+       }
+
+       newtPopWindow();
+
+       // Execute the formatting...
+       statuswindow(60, 4, title, _("Creating filesystems..."));
+
+       rc = hw_create_filesystems(destination, logfile);
+       if (rc) {
+               errorbox(_("Unable to create filesystems."));
+               goto EXIT;
+       }
+
+       rc = hw_mount_filesystems(destination, DESTINATION_MOUNT_PATH);
+       if (rc) {
+               errorbox(_("Unable to mount filesystems."));
+               goto EXIT;
+       }
+
+       newtPopWindow();
+
+       // Extract files...
+       snprintf(commandstring, STRING_SIZE,
+               "/bin/tar -C /harddisk  -xvf /cdrom/distro.img --lzma 2>/dev/null");
+
+       if (runcommandwithprogress(60, 4, title, commandstring, INST_FILECOUNT,
+                       _("Installing the system..."), logfile)) {
+               errorbox(_("Unable to install the system."));
+               goto EXIT;
+       }
+
+       // Write fstab
+       rc = hw_write_fstab(destination);
+       if (rc) {
+               fprintf(flog, "Could not write /etc/fstab\n");
+               goto EXIT;
+       }
+
+       /* Save language und local settings */
+       write_lang_configs(shortlangname);
+
+       /* Build cache lang file */
+       snprintf(commandstring, STRING_SIZE, "/usr/sbin/chroot /harddisk /usr/bin/perl -e \"require '" CONFIG_ROOT "/lang.pl'; &Lang::BuildCacheLang\"");
+       if (runcommandwithstatus(commandstring, title, _("Installing the language cache..."), logfile)) {
+               errorbox(_("Unable to install the language cache."));
+               goto EXIT;
+       }
+
+       // Installing bootloader...
+       statuswindow(60, 4, title, _("Installing the bootloader..."));
+
+       rc = hw_install_bootloader(destination, logfile);
+       if (rc) {
+               errorbox(_("Unable to install the bootloader."));
+               goto EXIT;
+       }
+
+       newtPopWindow();
+
+       /* Serial console ? */
+       if (serialconsole) {
+               /* grub */
+               replace("/harddisk/boot/grub/grub.conf", "splashimage", "#splashimage");
+               replace("/harddisk/boot/grub/grub.conf", "#serial", "serial");
+               replace("/harddisk/boot/grub/grub.conf", "#terminal", "terminal");
+               replace("/harddisk/boot/grub/grub.conf", " panic=10 ", " console=ttyS0,115200n8 panic=10 ");
+
+               /*inittab*/
+               replace("/harddisk/etc/inittab", "1:2345:respawn:", "#1:2345:respawn:");
+               replace("/harddisk/etc/inittab", "2:2345:respawn:", "#2:2345:respawn:");
+               replace("/harddisk/etc/inittab", "3:2345:respawn:", "#3:2345:respawn:");
+               replace("/harddisk/etc/inittab", "4:2345:respawn:", "#4:2345:respawn:");
+               replace("/harddisk/etc/inittab", "5:2345:respawn:", "#5:2345:respawn:");
+               replace("/harddisk/etc/inittab", "6:2345:respawn:", "#6:2345:respawn:");
+               replace("/harddisk/etc/inittab", "#7:2345:respawn:", "7:2345:respawn:");
+       }
+
+       /* Set marker that the user has already accepted the gpl */
+       mysystem(logfile, "/usr/bin/touch /harddisk/var/ipfire/main/gpl_accepted");
+
+       /* Copy restore file from cdrom */
+       if (unattended && (strlen(restore_file) > 0)) {
+               fprintf(flog, "unattended: Copy restore file\n");
+               snprintf(commandstring, STRING_SIZE, 
+                       "cp /cdrom/%s /harddisk/var/ipfire/backup", restore_file);
+               mysystem(logfile, commandstring);
+       }
+
+       // Umount the destination drive
+       hw_umount_filesystems(destination, DESTINATION_MOUNT_PATH);
+
+       // Stop the RAID array if we are using RAID
+       if (destination->is_raid)
+               hw_stop_all_raid_arrays(logfile);
+
+       // Umount source drive and eject
+       hw_umount(SOURCE_MOUNT_PATH);
+
+       snprintf(commandstring, STRING_SIZE, "/usr/bin/eject %s", sourcedrive);
+       mysystem(logfile, commandstring);
+
+       if (!unattended) {
+               snprintf(message, sizeof(message), _(
+                       "%s was successfully installed!\n\n"
+                       "Please remove any installation mediums from this system and hit the reboot button. "
+                       "Once the system has restarted you will be asked to setup networking and system passwords. "
+                       "After that, you should point your web browser at https://%s:444 (or what ever you name "
+                       "your %s) for the web configuration console."), NAME, SNAME, NAME);
+               newtWinMessage(_("Congratulations!"), _("Reboot"), message);
+       }
+
+       allok = 1;
+
+EXIT:
+       fprintf(flog, "Install program ended.\n");
+       fflush(flog);
+       fclose(flog);
+
+       if (!allok)
+               newtWinMessage(title, _("OK"), _("Setup has failed. Press Ok to reboot."));
+
+       newtFinished();
+
+       // Free resources
+       free(system_release);
+       free(roottext);
+       free(helpline);
+
+       free(sourcedrive);
+       free(destination);
+
+       hw_stop_all_raid_arrays(logfile);
+
+       if (selected_disks)
+               hw_free_disks(selected_disks);
+
+       hw_free(hw);
+
+       fcloseall();
+
+       if (allok == 1)
+               return 0;
+
+       return 1;
+}
diff --git a/src/installer/po/LINGUAS b/src/installer/po/LINGUAS
new file mode 100644 (file)
index 0000000..7673daa
--- /dev/null
@@ -0,0 +1 @@
+de
diff --git a/src/installer/po/Makevars b/src/installer/po/Makevars
new file mode 100644 (file)
index 0000000..cf8c600
--- /dev/null
@@ -0,0 +1,41 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = The IPFire Project (www.ipfire.org)
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS =
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
diff --git a/src/installer/po/POTFILES.in b/src/installer/po/POTFILES.in
new file mode 100644 (file)
index 0000000..e241137
--- /dev/null
@@ -0,0 +1 @@
+main.c
diff --git a/src/installer/po/de.po b/src/installer/po/de.po
new file mode 100644 (file)
index 0000000..51ec1e1
--- /dev/null
@@ -0,0 +1,229 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR The IPFire Project (www.ipfire.org)
+# This file is distributed under the same license as the PACKAGE package.
+# 
+# Translators:
+# Michael Tremer <michael.tremer@ipfire.org>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: IPFire Project\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-07-31 09:28+0000\n"
+"PO-Revision-Date: 2014-07-31 09:44+0000\n"
+"Last-Translator: Michael Tremer <michael.tremer@ipfire.org>\n"
+"Language-Team: German (http://www.transifex.com/projects/p/ipfire/language/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: main.c:82 main.c:153 main.c:320 main.c:474 main.c:505 main.c:643
+msgid "OK"
+msgstr "OK"
+
+#: main.c:83 main.c:427 main.c:437 main.c:474 main.c:505
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: main.c:150
+msgid "I accept this license"
+msgstr "Ich akzeptiere die Lizenz"
+
+#: main.c:304
+msgid "<Tab>/<Alt-Tab> between elements | <Space> selects | <F12> next screen"
+msgstr "<Tab>/<Alt-Tab> um zu wechseln | <Leertaste> wählt aus | <F12> nächster Bildschirm"
+
+#: main.c:309
+#, c-format
+msgid ""
+"Welcome to the %s installation program. Selecting Cancel on any of the "
+"following screens will reboot the computer."
+msgstr ""
+
+#: main.c:311
+msgid "Start installation"
+msgstr "Installation beginnen"
+
+#: main.c:320
+msgid "No local source media found. Starting download."
+msgstr ""
+
+#: main.c:321
+msgid "Downloading installation image ..."
+msgstr "Lade Installationsimage herunter..."
+
+#: main.c:323
+msgid "Download error"
+msgstr "Fehler beim Download"
+
+#: main.c:358
+msgid "License not accepted!"
+msgstr "Lizenz nicht akzeptiert!"
+
+#: main.c:380
+msgid "No hard disk found."
+msgstr "Es wurde keine Festplatte gefunden."
+
+#: main.c:399
+msgid "Disk Selection"
+msgstr "Festplattenauswahl"
+
+#: main.c:400
+msgid ""
+"Select the disk(s) you want to install IPFire on. First those will be partitioned, and then the partitions will have a filesystem put on them.\n"
+"\n"
+"ALL DATA ON THE DISK WILL BE DESTROYED."
+msgstr ""
+
+#: main.c:411
+msgid ""
+"No disk has been selected.\n"
+"\n"
+"Please select one or more disks you want to install IPFire on."
+msgstr ""
+
+#: main.c:424
+#, c-format
+msgid ""
+"The installation program will now prepare the chosen harddisk:\n"
+"\n"
+"  %s\n"
+"\n"
+"Do you agree to continue?"
+msgstr ""
+
+#: main.c:426
+msgid "Disk Setup"
+msgstr "Disk-Setup"
+
+#: main.c:427 main.c:437
+msgid "Delete all data"
+msgstr "Alle Daten löschen"
+
+#: main.c:434
+#, c-format
+msgid ""
+"The installation program will now set up a RAID configuration on the selected harddisks:\n"
+"\n"
+"  %s\n"
+"  %s\n"
+"\n"
+"Do you agree to continue?"
+msgstr ""
+
+#: main.c:436
+msgid "RAID Setup"
+msgstr "RAID-Setup"
+
+#: main.c:447
+msgid "You disk configuration is currently not supported."
+msgstr ""
+
+#: main.c:461
+msgid "Your harddisk is too small."
+msgstr "Ihre Festplatte ist zu klein."
+
+#: main.c:475
+msgid ""
+"Your harddisk is very small, but you can continue with an very small swap. "
+"(Use with caution)."
+msgstr ""
+
+#: main.c:487
+msgid "ext4 Filesystem"
+msgstr "ext4-Dateisystem"
+
+#: main.c:488
+msgid "ext4 Filesystem without journal"
+msgstr "ext4-Dateisystem ohne Journal"
+
+#: main.c:489
+msgid "XFS Filesystem"
+msgstr "XFS-Dateisystem"
+
+#: main.c:490
+msgid "ReiserFS Filesystem"
+msgstr "ReiserFS-Dateisystem"
+
+#: main.c:504
+msgid "Filesystem Selection"
+msgstr "Dateisystemauswahl"
+
+#: main.c:504
+msgid "Please choose your filesystem:"
+msgstr "Bitte wählen Sie ein Dateisystem:"
+
+#: main.c:515
+msgid "Building RAID..."
+msgstr "Erstelle RAID..."
+
+#: main.c:519
+msgid "Unable to build the RAID."
+msgstr "Das RAID konnte nicht erstellt werden."
+
+#: main.c:527
+msgid "Partitioning disk..."
+msgstr "Partitioniere die Festplatte..."
+
+#: main.c:531
+msgid "Unable to partition the disk."
+msgstr "Die Festplatte konnte nicht partitioniert werden."
+
+#: main.c:538
+msgid "Creating filesystems..."
+msgstr "Erstelle Dateisysteme..."
+
+#: main.c:542
+msgid "Unable to create filesystems."
+msgstr "Die Dateisysteme konnten nicht erstellt werden."
+
+#: main.c:548
+msgid "Unable to mount filesystems."
+msgstr "Die Dateisysteme konnten nicht eingehangen werden."
+
+#: main.c:559
+msgid "Installing the system..."
+msgstr "Installiere das System..."
+
+#: main.c:560
+msgid "Unable to install the system."
+msgstr "Das System konnte nicht installiert werden."
+
+#: main.c:576
+msgid "Installing the language cache..."
+msgstr "Installiere den Sprachdateicache..."
+
+#: main.c:577
+msgid "Unable to install the language cache."
+msgstr "Der Sprachdateicache konnte nicht erstellt werden."
+
+#: main.c:582
+msgid "Installing the bootloader..."
+msgstr "Installiere den Bootloader..."
+
+#: main.c:586
+msgid "Unable to install the bootloader."
+msgstr "Der Bootloader konnte nicht installiert werden."
+
+#: main.c:628
+#, c-format
+msgid ""
+"%s was successfully installed. Please remove any installation mediums from "
+"this system. Setup will now run where you may configure networking and the "
+"system passwords. After Setup has been completed, you should point your web "
+"browser at https://%s:444 (or whatever you name your %s), and configure "
+"dialup networking (if required) and remote access."
+msgstr ""
+
+#: main.c:634
+msgid "Congratulations!"
+msgstr "Herzlichen Glückwunsch!"
+
+#: main.c:634
+msgid "Reboot"
+msgstr "Neustarten"
+
+#: main.c:643
+msgid "Press Ok to reboot."
+msgstr "Drücken Sie OK um neuzustarten."
similarity index 94%
rename from src/install+setup/install/unattended.c
rename to src/installer/unattended.c
index 77e1eabbdc94f95d564173d14fa2504034992fd1..dd5388bde5194fc556da426814d5e1275b5b352f 100644 (file)
@@ -20,9 +20,9 @@
  */
 
 #include "install.h"
-extern FILE *flog;
 
-int unattended_setup(struct keyvalue *unattendedkv) {
+int unattended_setup(struct keyvalue *unattendedkv, const char* output) {
+    FILE* flog = fopen(output, "w+");
 
     struct keyvalue *mainsettings = initkeyvalues();
     struct keyvalue *ethernetkv = initkeyvalues();
@@ -80,7 +80,7 @@ int unattended_setup(struct keyvalue *unattendedkv) {
     replacekeyvalue(ethernetkv, "GREEN_BROADCAST", green_broadcast);
     replacekeyvalue(ethernetkv, "CONFIG_TYPE", "0");
     replacekeyvalue(ethernetkv, "GREEN_DEV", "eth0");
-    write_ethernet_configs(ethernetkv);
+    writekeyvalues(ethernetkv, "/harddisk" CONFIG_ROOT "/ethernet/settings");
     freekeyvalues(ethernetkv);
 
     /* timezone */
@@ -132,7 +132,7 @@ int unattended_setup(struct keyvalue *unattendedkv) {
     fprintf(flog, "unattended: setting root password\n");
     snprintf(commandstring, STRING_SIZE,
            "/usr/sbin/chroot /harddisk /bin/sh -c \"echo 'root:%s' | /usr/sbin/chpasswd\"", root_password);
-    if (mysystem(commandstring)) {
+    if (mysystem(NULL, commandstring)) {
        errorbox("unattended: ERROR setting root password");
        return 0;
     }
@@ -141,7 +141,7 @@ int unattended_setup(struct keyvalue *unattendedkv) {
     fprintf(flog, "unattended: setting admin password\n");
     snprintf(commandstring, STRING_SIZE,
            "/usr/sbin/chroot /harddisk /usr/sbin/htpasswd -c -m -b " CONFIG_ROOT "/auth/users admin '%s'", admin_password);
-    if (mysystem(commandstring)) {
+    if (mysystem(NULL, commandstring)) {
        errorbox("unattended: ERROR setting admin password");
        return 0;
     }
@@ -151,11 +151,13 @@ int unattended_setup(struct keyvalue *unattendedkv) {
                fprintf(flog, "unattended: Restoring Backup\n");
            snprintf(commandstring, STRING_SIZE,
                    "/usr/sbin/chroot /harddisk /bin/tar -xvzp -f /var/ipfire/backup/%s -C /", restore_file);
-           if (mysystem(commandstring)) {
+           if (mysystem(NULL, commandstring)) {
                errorbox("unattended: ERROR restoring backup");
            }
        }
 
     fprintf(flog, "unattended: Setup ended\n");
+    fclose(flog);
+
     return 1;
 }
diff --git a/src/libsmooth/Makefile.am b/src/libsmooth/Makefile.am
new file mode 100644 (file)
index 0000000..0a7f881
--- /dev/null
@@ -0,0 +1,81 @@
+#  This file is part of the libsmooth library.
+#
+#  libsmooth 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.
+
+ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
+AM_MAKEFLAGS = --no-print-directory
+AUTOMAKE_OPTIONS = color-tests parallel-tests
+
+SUBDIRS = .
+
+# remove targets if the command fails
+.DELETE_ON_ERROR:
+
+# keep intermediate files
+.SECONDARY:
+
+LIBSMOOTH_CURRENT=1
+LIBSMOOTH_REVISION=0
+LIBSMOOTH_AGE=0
+
+pkgconfiglibdir=$(libdir)/pkgconfig
+CLEANFILES =
+EXTRA_DIST =
+
+AM_CPPFLAGS = \
+       -include $(top_builddir)/config.h \
+       -I $(top_srcdir)/include \
+       $(OUR_CPPFLAGS)
+
+AM_CFLAGS = $(OUR_CFLAGS)
+AM_CXXFLAGS = $(OUR_CXXFLAGS)
+AM_LDFLAGS = $(OUR_LDFLAGS)
+
+lib_LTLIBRARIES =
+
+include_HEADERS =
+
+#- libsmooth -------------------------------------------------------------------
+
+lib_LTLIBRARIES += \
+       libsmooth.la
+
+libsmooth_la_SOURCES = \
+       main.c \
+       varval.c
+
+libsmooth_la_LDFLAGS = \
+       $(AM_LDFLAGS) \
+       -version-info $(LIBSMOOTH_CURRENT):$(LIBSMOOTH_REVISION):$(LIBSMOOTH_AGE)
+
+include_HEADERS += \
+       libsmooth.h
+
+pkgconfiglib_DATA = \
+       libsmooth.pc
+
+CLEANFILES += \
+       libsmooth.pc
+
+EXTRA_DIST += \
+       libsmooth.pc.in
+
+#-------------------------------------------------------------------------------
+
+substitutions = \
+       '|PACKAGE_NAME=$(PACKAGE_NAME)|' \
+       '|PACKAGE_VERSION=$(PACKAGE_VERSION)|' \
+       '|prefix=$(prefix)|' \
+       '|exec_prefix=$(exec_prefix)|' \
+       '|libdir=$(libdir)|' \
+       '|includedir=$(includedir)|'
+
+SED_PROCESS = \
+       $(AM_V_GEN)$(MKDIR_P) $(dir $@) && \
+       $(SED) $(subst '|,-e 's|@,$(subst =,\@|,$(subst |',|g',$(substitutions)))) < $< > $@
+
+%.pc: %.pc.in Makefile
+       $(SED_PROCESS)
diff --git a/src/libsmooth/autogen.sh b/src/libsmooth/autogen.sh
new file mode 100755 (executable)
index 0000000..3065488
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+autoreconf --force --install -I m4
diff --git a/src/libsmooth/configure.ac b/src/libsmooth/configure.ac
new file mode 100644 (file)
index 0000000..2247588
--- /dev/null
@@ -0,0 +1,58 @@
+#  This file is part of libsmooth.
+#
+#  libsmooth 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.
+
+AC_PREREQ([2.64])
+
+AC_INIT([libsmooth],
+       [001],
+       [],
+       [libsmooth],
+       [http://git.ipfire.org/?p=ipfire-2.x.git;a=summary])
+
+AC_CONFIG_MACRO_DIR([m4])
+AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_AUX_DIR([build-aux])
+
+AM_INIT_AUTOMAKE([
+       foreign
+       1.11
+       -Wall
+       -Wno-portability
+       silent-rules
+       tar-pax
+       no-dist-gzip
+       dist-xz
+       subdir-objects
+])
+AM_SILENT_RULES([yes])
+
+LT_PREREQ(2.2)
+LT_INIT([disable-static])
+
+AC_PROG_SED
+
+AC_PROG_CC
+AC_PROG_CC_C99
+AC_PROG_CC_C_O
+
+AC_PATH_PROG([M4], [m4])
+
+# This makes sure pkg.m4 is available.
+m4_pattern_forbid([^_?PKG_[A-Z_]+$],[*** pkg.m4 missing, please install pkg-config])
+
+AC_CONFIG_FILES([
+       Makefile
+])
+
+AC_OUTPUT
+AC_MSG_RESULT([
+       $PACKAGE_NAME $VERSION
+
+       CFLAGS:                 ${OUR_CFLAGS} ${CFLAGS}
+       CPPFLAGS:               ${OUR_CPPFLAGS} ${CPPFLAGS}
+       LDFLAGS:                ${OUR_LDFLAGS} ${LDFLAGS}
+])
diff --git a/src/libsmooth/libsmooth.h b/src/libsmooth/libsmooth.h
new file mode 100644 (file)
index 0000000..d731e54
--- /dev/null
@@ -0,0 +1,68 @@
+/* SmoothWall libsmooth.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence.  See the file COPYING for details.
+ *
+ * (c) Lawrence Manning, 2001
+ * Contains prototypes for library functions.
+ * 
+ */
+
+#ifndef ___LIBSMOOTH_H
+#define ___LIBSMOOTH_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <wchar.h>
+#include <locale.h>
+#include <unistd.h>
+#include <sys/file.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <newt.h>
+#include <dirent.h>
+#include <sys/mount.h>
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <linux/cdrom.h>
+#include <sys/ioctl.h>
+
+#define STRING_SIZE 1024
+
+struct keyvalue {
+       char key[STRING_SIZE];
+       char value[STRING_SIZE];
+       struct keyvalue *next;
+};
+
+/* libsmooth.c */
+void stripnl(char *s);
+int mysystem(const char* output, const char *command);
+void errorbox(char *message);
+int statuswindowscroll(int width, int height, const char *title, const char *text, ...);
+int disclaimerbox(char *message);
+void statuswindow(int width, int height, const char *title, const char *text, ...);
+int runcommandwithprogress(int width, int height, const char *title, const char *command,
+       int lines, char *text, ...);
+int runcommandwithstatus(const char *command, const char* title, const char *message, const char* output);
+int runhiddencommandwithstatus(const char *command, const char* title, const char *message, const char* output);
+int checkformodule(const char *module); 
+int replace(char filename1[], char *from, char *to);
+char* get_version(void);
+
+/* varval.c */
+struct keyvalue *initkeyvalues(void);
+void freekeyvalues(struct keyvalue *head);
+int readkeyvalues(struct keyvalue *head, char *filename);
+int writekeyvalues(struct keyvalue *head, char *filename);
+int findkey(struct keyvalue *head, char *key, char *value);
+void appendkeyvalue(struct keyvalue *head, char *key, char *value);
+void replacekeyvalue(struct keyvalue *head, char *key, char *value);
+
+#endif
diff --git a/src/libsmooth/libsmooth.pc.in b/src/libsmooth/libsmooth.pc.in
new file mode 100644 (file)
index 0000000..add59a1
--- /dev/null
@@ -0,0 +1,18 @@
+#  This file is part of the libsmooth library.
+#
+#  libsmooth 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.
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsmooth
+Description: libsmooth library
+URL: @PACKAGE_URL@
+Version: @PACKAGE_VERSION@
+Libs: -L${libdir} -lsmooth
+Cflags: -I${includedir}
diff --git a/src/libsmooth/m4/attributes.m4 b/src/libsmooth/m4/attributes.m4
new file mode 100644 (file)
index 0000000..7e080da
--- /dev/null
@@ -0,0 +1,288 @@
+dnl Macros to check the presence of generic (non-typed) symbols.
+dnl Copyright (c) 2006-2008 Diego Pettenò <flameeyes@gmail.com>
+dnl Copyright (c) 2006-2008 xine project
+dnl Copyright (c) 2012 Lucas De Marchi <lucas.de.marchi@gmail.com>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2, or (at your option)
+dnl any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+dnl 02110-1301, USA.
+dnl
+dnl As a special exception, the copyright owners of the
+dnl macro gives unlimited permission to copy, distribute and modify the
+dnl configure scripts that are the output of Autoconf when processing the
+dnl Macro. You need not follow the terms of the GNU General Public
+dnl License when using or distributing such scripts, even though portions
+dnl of the text of the Macro appear in them. The GNU General Public
+dnl License (GPL) does govern all other use of the material that
+dnl constitutes the Autoconf Macro.
+dnl
+dnl This special exception to the GPL applies to versions of the
+dnl Autoconf Macro released by this project. When you make and
+dnl distribute a modified version of the Autoconf Macro, you may extend
+dnl this special exception to the GPL to apply to your modified version as
+dnl well.
+
+dnl Check if FLAG in ENV-VAR is supported by compiler and append it
+dnl to WHERE-TO-APPEND variable
+dnl CC_CHECK_FLAG_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG])
+
+AC_DEFUN([CC_CHECK_FLAG_APPEND], [
+  AC_CACHE_CHECK([if $CC supports flag $3 in envvar $2],
+                 AS_TR_SH([cc_cv_$2_$3]),
+          [eval "AS_TR_SH([cc_save_$2])='${$2}'"
+           eval "AS_TR_SH([$2])='-Werror $3'"
+           AC_COMPILE_IFELSE([AC_LANG_SOURCE([int a = 0; int main(void) { return a; } ])],
+                                    [eval "AS_TR_SH([cc_cv_$2_$3])='yes'"],
+                                    [eval "AS_TR_SH([cc_cv_$2_$3])='no'"])
+           eval "AS_TR_SH([$2])='$cc_save_$2'"])
+
+  AS_IF([eval test x$]AS_TR_SH([cc_cv_$2_$3])[ = xyes],
+        [eval "$1='${$1} $3'"])
+])
+
+dnl CC_CHECK_FLAGS_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG1 FLAG2])
+AC_DEFUN([CC_CHECK_FLAGS_APPEND], [
+  for flag in $3; do
+    CC_CHECK_FLAG_APPEND($1, $2, $flag)
+  done
+])
+
+dnl Check if the flag is supported by linker (cacheable)
+dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
+
+AC_DEFUN([CC_CHECK_LDFLAGS], [
+  AC_CACHE_CHECK([if $CC supports $1 flag],
+    AS_TR_SH([cc_cv_ldflags_$1]),
+    [ac_save_LDFLAGS="$LDFLAGS"
+     LDFLAGS="$LDFLAGS $1"
+     AC_LINK_IFELSE([int main() { return 1; }],
+       [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"],
+       [eval "AS_TR_SH([cc_cv_ldflags_$1])="])
+     LDFLAGS="$ac_save_LDFLAGS"
+    ])
+
+  AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes],
+    [$2], [$3])
+])
+
+dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for
+dnl the current linker to avoid undefined references in a shared object.
+AC_DEFUN([CC_NOUNDEFINED], [
+  dnl We check $host for which systems to enable this for.
+  AC_REQUIRE([AC_CANONICAL_HOST])
+
+  case $host in
+     dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads
+     dnl are requested, as different implementations are present; to avoid problems
+     dnl use -Wl,-z,defs only for those platform not behaving this way.
+     *-freebsd* | *-openbsd*) ;;
+     *)
+        dnl First of all check for the --no-undefined variant of GNU ld. This allows
+        dnl for a much more readable commandline, so that people can understand what
+        dnl it does without going to look for what the heck -z defs does.
+        for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do
+           CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"])
+           break
+        done
+     ;;
+  esac
+
+  AC_SUBST([LDFLAGS_NOUNDEFINED])
+])
+
+dnl Check for a -Werror flag or equivalent. -Werror is the GCC
+dnl and ICC flag that tells the compiler to treat all the warnings
+dnl as fatal. We usually need this option to make sure that some
+dnl constructs (like attributes) are not simply ignored.
+dnl
+dnl Other compilers don't support -Werror per se, but they support
+dnl an equivalent flag:
+dnl  - Sun Studio compiler supports -errwarn=%all
+AC_DEFUN([CC_CHECK_WERROR], [
+  AC_CACHE_CHECK(
+    [for $CC way to treat warnings as errors],
+    [cc_cv_werror],
+    [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror],
+      [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])])
+    ])
+])
+
+AC_DEFUN([CC_CHECK_ATTRIBUTE], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))],
+    AS_TR_SH([cc_cv_attribute_$1]),
+    [ac_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])],
+       [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"],
+       [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"])
+     CFLAGS="$ac_save_CFLAGS"
+    ])
+
+  AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes],
+    [AC_DEFINE(
+       AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1,
+         [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))]
+         )
+     $4],
+    [$5])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [
+  CC_CHECK_ATTRIBUTE(
+    [constructor],,
+    [void __attribute__((constructor)) ctor() { int a; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_FORMAT], [
+  CC_CHECK_ATTRIBUTE(
+    [format], [format(printf, n, n)],
+    [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [
+  CC_CHECK_ATTRIBUTE(
+    [format_arg], [format_arg(printf)],
+    [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [
+  CC_CHECK_ATTRIBUTE(
+    [visibility_$1], [visibility("$1")],
+    [void __attribute__((visibility("$1"))) $1_function() { }],
+    [$2], [$3])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_NONNULL], [
+  CC_CHECK_ATTRIBUTE(
+    [nonnull], [nonnull()],
+    [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_UNUSED], [
+  CC_CHECK_ATTRIBUTE(
+    [unused], ,
+    [void some_function(void *foo, __attribute__((unused)) void *bar);],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [
+  CC_CHECK_ATTRIBUTE(
+    [sentinel], ,
+    [void some_function(void *foo, ...) __attribute__((sentinel));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [
+  CC_CHECK_ATTRIBUTE(
+    [deprecated], ,
+    [void some_function(void *foo, ...) __attribute__((deprecated));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_ALIAS], [
+  CC_CHECK_ATTRIBUTE(
+    [alias], [weak, alias],
+    [void other_function(void *foo) { }
+     void some_function(void *foo) __attribute__((weak, alias("other_function")));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_MALLOC], [
+  CC_CHECK_ATTRIBUTE(
+    [malloc], ,
+    [void * __attribute__((malloc)) my_alloc(int n);],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_PACKED], [
+  CC_CHECK_ATTRIBUTE(
+    [packed], ,
+    [struct astructure { char a; int b; long c; void *d; } __attribute__((packed));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_CONST], [
+  CC_CHECK_ATTRIBUTE(
+    [const], ,
+    [int __attribute__((const)) twopow(int n) { return 1 << n; } ],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_FLAG_VISIBILITY], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([if $CC supports -fvisibility=hidden],
+    [cc_cv_flag_visibility],
+    [cc_flag_visibility_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden],
+     cc_cv_flag_visibility='yes',
+     cc_cv_flag_visibility='no')
+     CFLAGS="$cc_flag_visibility_save_CFLAGS"])
+
+  AS_IF([test "x$cc_cv_flag_visibility" = "xyes"],
+    [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1,
+       [Define this if the compiler supports the -fvisibility flag])
+     $1],
+    [$2])
+])
+
+AC_DEFUN([CC_FUNC_EXPECT], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([if compiler has __builtin_expect function],
+    [cc_cv_func_expect],
+    [ac_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     AC_COMPILE_IFELSE([AC_LANG_SOURCE(
+       [int some_function() {
+        int a = 3;
+        return (int)__builtin_expect(a, 3);
+     }])],
+       [cc_cv_func_expect=yes],
+       [cc_cv_func_expect=no])
+     CFLAGS="$ac_save_CFLAGS"
+    ])
+
+  AS_IF([test "x$cc_cv_func_expect" = "xyes"],
+    [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1,
+     [Define this if the compiler supports __builtin_expect() function])
+     $1],
+    [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported],
+    [cc_cv_attribute_aligned],
+    [ac_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     for cc_attribute_align_try in 64 32 16 8 4 2; do
+        AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+          int main() {
+            static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0;
+            return c;
+          }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break])
+     done
+     CFLAGS="$ac_save_CFLAGS"
+  ])
+
+  if test "x$cc_cv_attribute_aligned" != "x"; then
+     AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned],
+       [Define the highest alignment supported])
+  fi
+])
similarity index 58%
rename from src/install+setup/libsmooth/main.c
rename to src/libsmooth/main.c
index aef3e93225159b6d99e37b90e6a2515f8a871134..1d2a5002e5e3090f0d2f5cb08431dd7b8f7beb19 100644 (file)
  *
  * (c) Lawrence Manning, 2001
  * Contains library functions.
- * 
- * $Id: main.c,v 1.6.2.9 2005/12/09 22:31:41 franck78 Exp $
- * 
  */
  
 #include "libsmooth.h"
 
-extern FILE *flog;
-extern char *mylog;
-
-extern char **ctr;
-  
-/* reboot().  reboots. */
-void reboot(void)
-{
-       mysystem("/etc/halt");
-}
+#include <libintl.h>
+#define _(x) dgettext("libsmooth", x)
 
 /* stripnl().  Replaces \n with \0 */
-void stripnl(char *s)
-{
+void stripnl(char *s) {
        char *t = strchr(s, '\n');
-       if (t) *t = '\0';
+       if (t)
+               *t = '\0';
 }
 
 /* Little wrapper. */
-int mysystem(char *command)
-{
+int mysystem(const char* output, const char *command) {
        char mycommand[STRING_SIZE];
-       
-       snprintf(mycommand, STRING_SIZE, "%s >>%s 2>>%s", command, mylog, mylog);
-       fprintf(flog, "Running command: %s\n", command);
-       return system(mycommand);
-}
-
-void errorbox(char *message)
-{
-       newtWinMessage(ctr[TR_ERROR], ctr[TR_OK], message);
-}
 
-int scrollmsgbox(int width, int height, char *title, char *text, ...)
-{
-       int rc = 0;
-       newtComponent t, f, b, c;
-       char *buf = NULL;
-       char checkbox;
-       int size = 0;
-       int i = 0;
-       va_list args;
+       if (output == NULL)
+               output = "/dev/null";
 
-       va_start(args, text);
+       snprintf(mycommand, sizeof(mycommand), "%s >>%s 2>&1", command, output);
 
-       do {
-               size += 40000;
-               if (buf) free(buf);
-               buf = malloc(size);
-               i = vsnprintf(buf, size, text, args);
-       } while (i == size);
-
-       va_end(args);
-
-       newtCenteredWindow(width, height, title);
-
-       b = newtCompactButton(width - 15 ,height - 2, ctr[TR_OK]);
-       c = newtCheckbox(3, height - 2, ctr[TR_LICENSE_ACCEPT], ' ', " *", &checkbox);
-
-       t = newtTextbox(1, 1, width - 2, height - 4, NEWT_TEXTBOX_WRAP+NEWT_TEXTBOX_SCROLL);
-       newtTextboxSetText(t, buf);
-
-       f = newtForm(NULL, NULL, 0);
-       free(buf);
-
-       newtFormAddComponent(f, c);
-       newtFormAddComponent(f, b);
-       newtFormAddComponent(f, t);
+       FILE* f = fopen(output, "w+");
+       fprintf(f, "Running command: %s\n", command);
+       fclose(f);
 
-       newtRunForm(f);
-       if (checkbox=='*') rc=1;
-       newtFormDestroy(f);
-       return rc;
+       return system(mycommand);
 }
 
-int disclaimerbox(char *message)
-{
-       int rc;
-       char title[STRING_SIZE];
-       
-       sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);
-       rc = scrollmsgbox(75, 20, title, message);
-       newtPopWindow();
-       
-       return rc;
+void errorbox(char *message) {
+       newtWinMessage(_("Error"), _("OK"), message);
 }
 
-
-void statuswindow(int width, int height, char *title, char *text, ...)
-{
+void statuswindow(int width, int height, const char *title, const char *text, ...) {
        newtComponent t, f;
        char *buf = NULL;
        int size = 0;
@@ -134,39 +72,27 @@ void statuswindow(int width, int height, char *title, char *text, ...)
        newtFormDestroy(f);
 }
 
-int runcommandwithstatus(char *command, char *message)
-{
-       int rc;
-       char title[STRING_SIZE];
-       
-       sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);
+int runcommandwithstatus(const char *command, const char* title, const char *message, const char* output) {
        statuswindow(60, 4, title, message);
-       rc = mysystem(command);
+
+       int rc = mysystem(output, command);
        newtPopWindow();
-       
+
        return rc;
 }
 
-int runhiddencommandwithstatus(char *command, char *message)
-{
-       int rc;
-       char title[STRING_SIZE];
-       char mycommand[STRING_SIZE];
-       
-       sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);
+int runhiddencommandwithstatus(const char *command, const char* title, const char *message, const char* output) {
        statuswindow(60, 4, title, message);
-       snprintf(mycommand, STRING_SIZE, "%s >>%s 2>>%s", command, mylog, mylog);
-       fprintf(flog, "Running command: ***** HIDDEN *****\n");
-       rc = system(mycommand);
+
+       int rc = mysystem(output, command);
        newtPopWindow();
-       
+
        return rc;
 }
 
 /* This one borrowed from redhat installer. */
-int runcommandwithprogress(int width, int height, char *title, char *command,
-       int lines, char *text, ...)
-{
+int runcommandwithprogress(int width, int height, const char *title, const char *command,
+       int lines, char *text, ...) {
        newtComponent t, f, s;
        char *buf = NULL;
        int size = 0;
@@ -206,10 +132,7 @@ int runcommandwithprogress(int width, int height, char *title, char *command,
 
        newtDrawForm(f);
        newtRefresh();
-       
-       snprintf(mycommand, STRING_SIZE, "%s 2>>%s", command, mylog);
-       fprintf(flog, "Running command: %s\n", command);
-       
+
        if (!(p = popen(command, "r")))
        {
                rc = 1;
@@ -217,13 +140,11 @@ int runcommandwithprogress(int width, int height, char *title, char *command,
        }
        setvbuf(p, NULL, _IOLBF, 255);
        
-       while (fgets(buffer, STRING_SIZE, p))
-       {
+       while (fgets(buffer, STRING_SIZE, p)) {
                newtScaleSet(s, ++progress);
                newtRefresh();  
-               fprintf(flog, "%s", buffer);
        }
-               
+
        rc = pclose(p);
        
 EXIT:
@@ -233,15 +154,14 @@ EXIT:
        return rc;
 }
 
-int checkformodule(char *module)
-{
+int checkformodule(const char *module) {
        FILE *file;
        char buffer[STRING_SIZE];
        int result = 0;
-       
+
        if (!(file = fopen("/proc/modules", "r")))
        {
-               fprintf(flog, "Unable to open /proc/modules in checkformodule()\n");
+               fprintf(stderr, "Unable to open /proc/modules in checkformodule()\n");
                return 0;
        }
        
@@ -294,8 +214,7 @@ int _replace_string(char string[], char *from, char *to)
        return 0;
 }
 
-int replace(char filename1[], char *from, char *to)
-{
+int replace(char filename1[], char *from, char *to) {
        FILE *file1, *file2;
        char filename2[1000];
        char temp[1000];
@@ -312,7 +231,6 @@ int replace(char filename1[], char *from, char *to)
 
        /* Start reading in lines */
        while (fgets (temp, 1000, file1) != NULL) {
-
                if (strlen(to) > 0) {
                        /* Replace string */
                        ret = _replace_string (temp, from, to);
@@ -336,20 +254,6 @@ int replace(char filename1[], char *from, char *to)
        return (ret);
 }
 
-/* Include enabled languages */
-#ifdef  LANG_EN_ONLY
-        #include "lang_en.c"
-#else
-       #include "lang_de.c"
-       #include "lang_en.c"
-       #include "lang_es.c"
-       #include "lang_fr.c"
-       #include "lang_pl.c"
-       #include "lang_ru.c"
-       #include "lang_nl.c"
-       #include "lang_tr.c"
-#endif
-
 // returns a pointer to the actual running version number of IPFire.
 // Successive updates increase effective version but not VERSION !
 char g_title[STRING_SIZE] = "";
@@ -359,8 +263,6 @@ char* get_version(void) {
                fgets (g_title, STRING_SIZE, f_title);
                fclose (f_title);
                if (g_title[strlen(g_title) - 1] == '\n') g_title[strlen(g_title) - 1] = '\0';
-       } else {
-               sprintf (g_title, "%s %s - %s", NAME, VERSION, SLOGAN);
        }
        return g_title;
 }
index b4474355ad53797c46608dda2cfd09a2d6aae549..f5802d26ac2c7918d43e4f998e100fb5f8f1a0a9 100644 (file)
 #                                                                             #
 ###############################################################################
 
-CC=gcc 
-CFLAGS=-O2 -Wall
-
-COMPILE=$(CC) $(CFLAGS)
+CC      = gcc
+CFLAGS ?= -O2 -Wall
+LIBS    = -lsmooth -lnewt
 
 PROGS = iowrap
 SUID_PROGS = squidctrl sshctrl ipfirereboot \
@@ -35,128 +34,24 @@ SUID_PROGS = squidctrl sshctrl ipfirereboot \
        getconntracktable wirelessclient dnsmasqctrl torctrl
 SUID_UPDX = updxsetperms
 
-install : all
+OBJS = $(patsubst %,%.o,$(PROGS) $(SUID_PROGS))
+
+install: all
        install -m 755  $(PROGS) /usr/local/bin
        install -m 4750 -g nobody $(SUID_PROGS) /usr/local/bin
 
-all : $(PROGS) $(SUID_PROGS)
+all: $(PROGS) $(SUID_PROGS)
 
-clean : 
+clean:
        -rm -f $(PROGS) $(SUID_PROGS) *.o core
 
 ######
 
-% : %.c
-       $(COMPILE) $< setuid.o -o $@
+%.o: %.c
+       $(CC) $(CFLAGS) -c $< -o $@
 
 setuid.o: setuid.c setuid.h
-       $(COMPILE) $< -c -o $@
-
-$(SUID_PROGS): setuid.o
-
-$(PROGS): setuid.o
-
-logwatch: logwatch.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ logwatch.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-openvpnctrl: openvpnctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ openvpnctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-qosctrl: qosctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ qosctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-redctrl: redctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ redctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-extrahdctrl: extrahdctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ extrahdctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-       
-upnpctrl: upnpctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ upnpctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-sambactrl: sambactrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ sambactrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-tripwirectrl: tripwirectrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ tripwirectrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-       
-smartctrl: smartctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ smartctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-clamavctrl: clamavctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ clamavctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-firewallctrl: firewallctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ firewallctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-timectrl: timectrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ timectrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-launch-ether-wake: launch-ether-wake.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ launch-ether-wake.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-rebuildhosts: rebuildhosts.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ rebuildhosts.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-applejuicectrl: applejuicectrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ applejuicectrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-dhcpctrl: dhcpctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ dhcpctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-sshctrl: sshctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ sshctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-squidctrl: squidctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ squidctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-snortctrl: snortctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ snortctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-wirelessctrl: wirelessctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ wirelessctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-ipsecctrl: ipsecctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ ipsecctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-getipstat: getipstat.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ getipstat.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-pakfire: pakfire.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ pakfire.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-mpfirectrl: mpfirectrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ mpfirectrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-backupctrl: backupctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ backupctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-addonctrl: addonctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ addonctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-syslogdctrl: syslogdctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ syslogdctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-wlanapctrl: wlanapctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ wlanapctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-setaliases: setaliases.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ setaliases.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-fireinfoctrl: fireinfoctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ fireinfoctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-rebuildroutes: rebuildroutes.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ rebuildroutes.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-getconntracktable: getconntracktable.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ getconntracktable.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-wirelessclient: wirelessclient.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ wirelessclient.c setuid.o ../install+setup/libsmooth/varval.o -o $@
-
-dnsmasqctrl: dnsmasqctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ dnsmasqctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
+       $(CC) $(CFLAGS) -c $< -o $@
 
-torctrl: torctrl.c setuid.o ../install+setup/libsmooth/varval.o
-       $(COMPILE) -I../install+setup/libsmooth/ torctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
+$(PROGS) $(SUID_PROGS): setuid.o | $(OBJS)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $@.o $< $(LIBS)
index 4b371326a3818747a70733dc6102d6b9ed3a12e3..5bd19ce9adf13373aa8f045defe6b1f5ddc28359 100644 (file)
@@ -1,9 +1,12 @@
-diff -up bash-3.2/config-top.h.ssh_source_bash bash-3.2/config-top.h
---- bash-3.2/config-top.h.ssh_source_bash      2008-10-23 15:08:04.000000000 +0200
-+++ bash-3.2/config-top.h      2008-10-23 15:08:33.000000000 +0200
-@@ -86,4 +86,4 @@
- /* Define this if you want bash to try to check whether it's being run by
-    sshd and source the .bashrc if so (like the rshd behavior). */
+diff -up bash-4.0/config-top.h.ssh_source_bash bash-4.0/config-top.h
+--- bash-4.0/config-top.h.ssh_source_bash      2009-01-21 15:20:06.000000000 +0100
++++ bash-4.0/config-top.h      2009-01-21 15:25:46.000000000 +0100
+@@ -90,7 +90,7 @@
+    sshd and source the .bashrc if so (like the rshd behavior).  This checks
+    for the presence of SSH_CLIENT or SSH2_CLIENT in the initial environment,
+    which can be fooled under certain not-uncommon circumstances. */
 -/* #define SSH_SOURCE_BASHRC */
 +#define SSH_SOURCE_BASHRC
+ /* Define if you want the case-capitalizing operators (~[~]) and the
+    `capcase' variable attribute (declare -c). */
index 735a3810f048d128cbb0cb3ef26ab6f24a561464..24ec5cc0ba2809e8ddcca66c1045a1601b6a308f 100644 (file)
@@ -1,25 +1,6 @@
---- bash-3.0/config.h.in.paths 2004-07-21 21:08:31.000000000 +0100
-+++ bash-3.0/config.h.in       2004-07-28 09:16:27.257884999 +0100
-@@ -197,7 +197,7 @@
- /* System paths */
--#define DEFAULT_MAIL_DIRECTORY "/usr/spool/mail"
-+#define DEFAULT_MAIL_DIRECTORY "/var/spool/mail"
- /* Characteristics of the system's header files and libraries that affect
-    the compilation environment. */
 --- bash-3.0/config-top.h.paths        2003-08-05 15:36:12.000000000 +0100
 +++ bash-3.0/config-top.h      2004-07-28 09:36:27.117205637 +0100
-@@ -52,14 +52,14 @@
- /* The default value of the PATH variable. */
- #ifndef DEFAULT_PATH_VALUE
- #define DEFAULT_PATH_VALUE \
--  "/usr/gnu/bin:/usr/local/bin:/bin:/usr/bin:."
-+  "/usr/local/bin:/bin:/usr/bin"
- #endif
- /* The value for PATH when invoking `command -p'.  This is only used when
+@@ -66,7 +66,7 @@
     the Posix.2 confstr () function, or CS_PATH define are not present. */
  #ifndef STANDARD_UTILS_PATH
  #define STANDARD_UTILS_PATH \
diff --git a/src/patches/bash/bash32-001 b/src/patches/bash/bash32-001
deleted file mode 100644 (file)
index b7d1f1e..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-001
-
-Bug-Reported-by:       Greg Schafer <gschafer@zip.com.au>
-Bug-Reference-ID:      <20061012084940.GA15768@tigers.local>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2006-10/msg00046.html
-
-Bug-Description:
-
-When using historical ``-style command substitution, bash incorrectly attempts
-to interpret shell comments while scanning for the closing backquote.
-
-Patch:
-
-*** ../bash-3.2/parse.y        Tue Sep 19 16:37:21 2006
---- parse.y    Thu Oct 12 10:30:57 2006
-***************
-*** 2736,2740 ****
-    count = 1;
-    pass_next_character = backq_backslash = was_dollar = in_comment = 0;
-!   check_comment = (flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0;
-  
-    /* RFLAGS is the set of flags we want to pass to recursive calls. */
---- 2736,2740 ----
-    count = 1;
-    pass_next_character = backq_backslash = was_dollar = in_comment = 0;
-!   check_comment = (flags & P_COMMAND) && qc != '`' && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0;
-  
-    /* RFLAGS is the set of flags we want to pass to recursive calls. */
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 0
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 1
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-002 b/src/patches/bash/bash32-002
deleted file mode 100644 (file)
index b934df9..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-002
-
-Bug-Reported-by:       Jim Gifford <jim@jg555.com>
-Bug-Reference-ID:      <12j2pc3aq35mb04@corp.supernews.com>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2006-10/msg00082.html
-
-Bug-Description:
-
-An incorrect encoding specification in the Content-Type header causes msgfmt
-to fail, which causes `make install' to fail.
-
-Patch:
-
-*** ../bash-3.2/po/ru.po        Tue Jan 10 17:51:03 2006
---- po/ru.po    Mon Oct 16 15:13:23 2006
-***************
-*** 13,17 ****
-  "Language-Team: Russian <ru@li.org>\n"
-  "MIME-Version: 1.0\n"
-! "Content-Type: text/plain; charset=UTF-8\n"
-  "Content-Transfer-Encoding: 8bit\n"
-  "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
---- 13,17 ----
-  "Language-Team: Russian <ru@li.org>\n"
-  "MIME-Version: 1.0\n"
-! "Content-Type: text/plain; charset=KOI8-R\n"
-  "Content-Transfer-Encoding: 8bit\n"
-  "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 1
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 2
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-003 b/src/patches/bash/bash32-003
deleted file mode 100644 (file)
index 922041b..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-003
-
-Bug-Reported-by:       John Gatewood Ham <zappaman@buraphalinux.org>
-Bug-Reference-ID:      <Pine.LNX.4.64.0610121334140.15558@www.buraphalinux.org>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2006-10/msg00045.html
-
-Bug-Description:
-
-When using the conditional command's `=~' operator to match regular
-expressions, the parser did not skip over shell metacharacters in the
-regular expression, leading to syntax errors.
-
-Patch:
-
-*** ../bash-3.2-patched/parse.y        Tue Oct 17 11:45:20 2006
---- parse.y    Sat Oct 14 14:56:16 2006
-***************
-*** 1029,1034 ****
---- 1029,1035 ----
-  #define PST_CMDTOKEN 0x1000          /* command token OK - unused */
-  #define PST_COMPASSIGN       0x2000          /* parsing x=(...) compound assignment */
-  #define PST_ASSIGNOK 0x4000          /* assignment statement ok in this context */
-+ #define PST_REGEXP   0x8000          /* parsing an ERE/BRE as a single word */
-  
-  /* Initial size to allocate for tokens, and the
-     amount to grow them by. */
-***************
-*** 2591,2596 ****
---- 2592,2600 ----
-        return (character);
-      }
-  
-+   if (parser_state & PST_REGEXP)
-+     goto tokword;
-+ 
-    /* Shell meta-characters. */
-    if MBTEST(shellmeta (character) && ((parser_state & PST_DBLPAREN) == 0))
-      {
-***************
-*** 2698,2703 ****
---- 2702,2708 ----
-    if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
-      return (character);
-  
-+ tokword:
-    /* Okay, if we got this far, we have to read a word.  Read one,
-       and then check it against the known ones. */
-    result = read_token_word (character);
-***************
-*** 3202,3209 ****
-        if (tok == WORD && test_binop (yylval.word->word))
-       op = yylval.word;
-  #if defined (COND_REGEXP)
-!       else if (tok == WORD && STREQ (yylval.word->word,"=~"))
-!      op = yylval.word;
-  #endif
-        else if (tok == '<' || tok == '>')
-       op = make_word_from_token (tok);  /* ( */
---- 3207,3217 ----
-        if (tok == WORD && test_binop (yylval.word->word))
-       op = yylval.word;
-  #if defined (COND_REGEXP)
-!       else if (tok == WORD && STREQ (yylval.word->word, "=~"))
-!      {
-!        op = yylval.word;
-!        parser_state |= PST_REGEXP;
-!      }
-  #endif
-        else if (tok == '<' || tok == '>')
-       op = make_word_from_token (tok);  /* ( */
-***************
-*** 3234,3239 ****
---- 3242,3248 ----
-  
-        /* rhs */
-        tok = read_token (READ);
-+       parser_state &= ~PST_REGEXP;
-        if (tok == WORD)
-       {
-         tright = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL);
-***************
-*** 3419,3427 ****
-         goto next_character;
-       }
-  
-  #ifdef EXTENDED_GLOB
-        /* Parse a ksh-style extended pattern matching specification. */
-!       if (extended_glob && PATTERN_CHAR (character))
-       {
-         peek_char = shell_getc (1);
-         if MBTEST(peek_char == '(')           /* ) */
---- 3428,3461 ----
-         goto next_character;
-       }
-  
-+ #ifdef COND_REGEXP
-+       /* When parsing a regexp as a single word inside a conditional command,
-+       we need to special-case characters special to both the shell and
-+       regular expressions.  Right now, that is only '(' and '|'. */ /*)*/
-+       if MBTEST((parser_state & PST_REGEXP) && (character == '(' || character == '|'))               /*)*/
-+         {
-+           if (character == '|')
-+             goto got_character;
-+ 
-+        push_delimiter (dstack, character);
-+        ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0);
-+        pop_delimiter (dstack);
-+        if (ttok == &matched_pair_error)
-+          return -1;          /* Bail immediately. */
-+        RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
-+                                token_buffer_size, TOKEN_DEFAULT_GROW_SIZE);
-+        token[token_index++] = character;
-+        strcpy (token + token_index, ttok);
-+        token_index += ttoklen;
-+        FREE (ttok);
-+        dollar_present = all_digit_token = 0;
-+        goto next_character;
-+         }
-+ #endif /* COND_REGEXP */
-+ 
-  #ifdef EXTENDED_GLOB
-        /* Parse a ksh-style extended pattern matching specification. */
-!       if MBTEST(extended_glob && PATTERN_CHAR (character))
-       {
-         peek_char = shell_getc (1);
-         if MBTEST(peek_char == '(')           /* ) */
-
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 2
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 3
-  
-  #endif /* _PATCHLEVEL_H_ */
-
diff --git a/src/patches/bash/bash32-004 b/src/patches/bash/bash32-004
deleted file mode 100644 (file)
index cd2accf..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-004
-
-Bug-Reported-by:       Stuart Shelton <srcshelton@gmail.com>
-Bug-Reference-ID:      <619141e40610261203y6cda5aa6i23cb24c7aeba996e@mail.gmail.com>
-Bug-Reference-URL:     
-
-Bug-Description:
-
-A bug in the parameter pattern substitution implementation treated a pattern
-whose first character was `/' (after expansion) as specifying global
-replacement.
-
-Patch:
-
-*** ../bash-3.2/subst.c        Tue Sep 19 08:35:09 2006
---- subst.c    Thu Oct 26 09:17:50 2006
-***************
-*** 5707,5712 ****
---- 5707,5717 ----
-    vtype &= ~VT_STARSUB;
-  
-    mflags = 0;
-+   if (patsub && *patsub == '/')
-+     {
-+       mflags |= MATCH_GLOBREP;
-+       patsub++;
-+     }
-  
-    /* Malloc this because expand_string_if_necessary or one of the expansion
-       functions in its call chain may free it on a substitution error. */
-***************
-*** 5741,5753 ****
-      }
-  
-    /* ksh93 doesn't allow the match specifier to be a part of the expanded
-!      pattern.  This is an extension. */
-    p = pat;
-!   if (pat && pat[0] == '/')
-!     {
-!       mflags |= MATCH_GLOBREP|MATCH_ANY;
-!       p++;
-!     }
-    else if (pat && pat[0] == '#')
-      {
-        mflags |= MATCH_BEG;
---- 5746,5757 ----
-      }
-  
-    /* ksh93 doesn't allow the match specifier to be a part of the expanded
-!      pattern.  This is an extension.  Make sure we don't anchor the pattern
-!      at the beginning or end of the string if we're doing global replacement,
-!      though. */
-    p = pat;
-!   if (mflags & MATCH_GLOBREP)
-!     mflags |= MATCH_ANY;
-    else if (pat && pat[0] == '#')
-      {
-        mflags |= MATCH_BEG;
-*** ../bash-3.2/tests/new-exp.right    Thu Aug 10 12:00:00 2006
---- tests/new-exp.right        Sun Oct 29 16:03:36 2006
-***************
-*** 430,436 ****
-  Case06---1---A B C::---
-  Case07---3---A:B:C---
-  Case08---3---A:B:C---
-! ./new-exp.tests: line 506: /${$(($#-1))}: bad substitution
-  argv[1] = <a>
-  argv[2] = <b>
-  argv[3] = <c>
---- 430,436 ----
-  Case06---1---A B C::---
-  Case07---3---A:B:C---
-  Case08---3---A:B:C---
-! ./new-exp.tests: line 506: ${$(($#-1))}: bad substitution
-  argv[1] = <a>
-  argv[2] = <b>
-  argv[3] = <c>
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 3
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 4
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-005 b/src/patches/bash/bash32-005
deleted file mode 100644 (file)
index 903ec58..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-005
-
-Bug-Reported-by:       Stuart Shelton <stuart@openobjects.com>
-Bug-Reference-ID:      <453F7CC8.6030907@openobjects.com>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2006-10/msg00127.html
-
-Bug-Description:
-
-A missing extern declaration for `asprintf' caused `double' arguments to be
-passed as `0', leading to incorrect results.  Additionally, a bug in the
-replacement asprintf/snprintf function caused an infinite loop when passed
-0 arguments to the floating point conversions under some circumstances.
-
-Patch:
-
-*** ../bash-3.2/builtins/printf.def    Mon Sep 18 08:48:42 2006
---- builtins/printf.def        Tue Oct 31 08:19:44 2006
-***************
-*** 49,54 ****
---- 49,60 ----
-  #  define INT_MIN            (-2147483647-1)
-  #endif
-  
-+ #if defined (PREFER_STDARG)
-+ #  include <stdarg.h>
-+ #else
-+ #  include <varargs.h>
-+ #endif
-+ 
-  #include <stdio.h>
-  #include <chartypes.h>
-  
-***************
-*** 151,156 ****
---- 157,166 ----
-  #define SKIP1 "#'-+ 0"
-  #define LENMODS "hjlLtz"
-  
-+ #ifndef HAVE_ASPRINTF
-+ extern int asprintf __P((char **, const char *, ...)) __attribute__((__format__ (printf, 2, 3)));
-+ #endif
-+ 
-  static void printf_erange __P((char *));
-  static int printstr __P((char *, char *, int, int, int));
-  static int tescape __P((char *, char *, int *));
-
-
-*** ../bash-3.2/lib/sh/snprintf.c      Thu Apr  6 09:48:40 2006
---- lib/sh/snprintf.c  Sat Oct 28 00:00:13 2006
-***************
-*** 471,476 ****
---- 476,483 ----
-         10^x ~= r
-   * log_10(200) = 2;
-   * log_10(250) = 2;
-+  *
-+  * NOTE: do not call this with r == 0 -- an infinite loop results.
-   */
-  static int
-  log_10(r)
-***************
-*** 576,583 ****
-      { 
-        integral_part[0] = '0';
-        integral_part[1] = '\0';
-!       fraction_part[0] = '0';
-!       fraction_part[1] = '\0';
-        if (fract)
-       *fract = fraction_part;
-        return integral_part;
---- 583,593 ----
-      { 
-        integral_part[0] = '0';
-        integral_part[1] = '\0';
-!       /* The fractional part has to take the precision into account */
-!       for (ch = 0; ch < precision-1; ch++)
-!      fraction_part[ch] = '0';
-!       fraction_part[ch] = '0';
-!       fraction_part[ch+1] = '\0';
-        if (fract)
-       *fract = fraction_part;
-        return integral_part;
-***************
-*** 805,810 ****
---- 815,821 ----
-        PUT_CHAR(*tmp, p);
-        tmp++;
-      }
-+ 
-    PAD_LEFT(p);
-  }
-  
-***************
-*** 972,982 ****
-    if ((p->flags & PF_THOUSANDS) && grouping && (t = groupnum (tmp)))
-      tmp = t;
-  
-    /* calculate the padding. 1 for the dot */
-    p->width = p->width -
-           ((d > 0. && p->justify == RIGHT) ? 1:0) -
-           ((p->flags & PF_SPACE) ? 1:0) -
-!          strlen(tmp) - p->precision - 1;
-    PAD_RIGHT(p);  
-    PUT_PLUS(d, p, 0.);
-    PUT_SPACE(d, p, 0.);
---- 983,1003 ----
-    if ((p->flags & PF_THOUSANDS) && grouping && (t = groupnum (tmp)))
-      tmp = t;
-  
-+   if ((*p->pf == 'g' || *p->pf == 'G') && (p->flags & PF_ALTFORM) == 0)
-+     {
-+       /* smash the trailing zeros unless altform */
-+       for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--)
-+         tmp2[i] = '\0'; 
-+       if (tmp2[0] == '\0')
-+      p->precision = 0;
-+     }
-+ 
-    /* calculate the padding. 1 for the dot */
-    p->width = p->width -
-           ((d > 0. && p->justify == RIGHT) ? 1:0) -
-           ((p->flags & PF_SPACE) ? 1:0) -
-!          strlen(tmp) - p->precision -
-!          ((p->precision != 0 || (p->flags & PF_ALTFORM)) ? 1 : 0);   /* radix char */
-    PAD_RIGHT(p);  
-    PUT_PLUS(d, p, 0.);
-    PUT_SPACE(d, p, 0.);
-***************
-*** 991,1001 ****
-    if (p->precision != 0 || (p->flags & PF_ALTFORM))
-      PUT_CHAR(decpoint, p);  /* put the '.' */
-  
--   if ((*p->pf == 'g' || *p->pf == 'G') && (p->flags & PF_ALTFORM) == 0)
--     /* smash the trailing zeros unless altform */
--     for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--)
--       tmp2[i] = '\0'; 
-- 
-    for (; *tmp2; tmp2++)
-      PUT_CHAR(*tmp2, p); /* the fraction */
-    
---- 1012,1017 ----
-***************
-*** 1011,1024 ****
-    char *tmp, *tmp2;
-    int j, i;
-  
-!   if (chkinfnan(p, d, 1) || chkinfnan(p, d, 2))
-      return;  /* already printed nan or inf */
-  
-    GETLOCALEDATA(decpoint, thoussep, grouping);
-    DEF_PREC(p);
-!   j = log_10(d);
-!   d = d / pow_10(j);  /* get the Mantissa */
-!   d = ROUND(d, p);             
-    tmp = dtoa(d, p->precision, &tmp2);
-  
-    /* 1 for unit, 1 for the '.', 1 for 'e|E',
---- 1027,1045 ----
-    char *tmp, *tmp2;
-    int j, i;
-  
-!   if (d != 0 && (chkinfnan(p, d, 1) || chkinfnan(p, d, 2)))
-      return;  /* already printed nan or inf */
-  
-    GETLOCALEDATA(decpoint, thoussep, grouping);
-    DEF_PREC(p);
-!   if (d == 0.)
-!     j = 0;
-!   else
-!     {
-!       j = log_10(d);
-!       d = d / pow_10(j);  /* get the Mantissa */
-!       d = ROUND(d, p);                 
-!     }
-    tmp = dtoa(d, p->precision, &tmp2);
-  
-    /* 1 for unit, 1 for the '.', 1 for 'e|E',
-***************
-*** 1076,1081 ****
---- 1097,1103 ----
-         PUT_CHAR(*tmp, p);
-         tmp++;
-       }
-+ 
-     PAD_LEFT(p);
-  }
-  #endif
-***************
-*** 1358,1364 ****
-               STAR_ARGS(data);
-               DEF_PREC(data);
-               d = GETDOUBLE(data);
-!              i = log_10(d);
-               /*
-                * for '%g|%G' ANSI: use f if exponent
-                * is in the range or [-4,p] exclusively
---- 1380,1386 ----
-               STAR_ARGS(data);
-               DEF_PREC(data);
-               d = GETDOUBLE(data);
-!              i = (d != 0.) ? log_10(d) : -1;
-               /*
-                * for '%g|%G' ANSI: use f if exponent
-                * is in the range or [-4,p] exclusively
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 4
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 5
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-006 b/src/patches/bash/bash32-006
deleted file mode 100644 (file)
index 589db9e..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-006
-
-Bug-Reported-by:       ebb9@byu.net
-Bug-Reference-ID:      <45540862.9030900@byu.net>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00017.html
-                       http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00016.html
-
-Bug-Description:
-
-In some cases, code that is intended to be used in the presence of multibyte
-characters is called when no such characters are present, leading to incorrect
-display position calculations and incorrect redisplay.
-
-Patch:
-
-*** ../bash-3.2-patched/lib/readline/display.c Thu Sep 14 14:20:12 2006
---- lib/readline/display.c     Mon Nov 13 17:55:57 2006
-***************
-*** 2381,2384 ****
---- 2409,2414 ----
-    if (end <= start)
-      return 0;
-+   if (MB_CUR_MAX == 1 || rl_byte_oriented)
-+     return (end - start);
-  
-    memset (&ps, 0, sizeof (mbstate_t));
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 5
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 6
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-007 b/src/patches/bash/bash32-007
deleted file mode 100644 (file)
index 9b86f4a..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-007
-
-Bug-Reported-by:       jidanni@jidanni.org
-Bug-Reference-ID:      <E1Gkg12-00017D-Fm@jidanni.org>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00039.html
-
-Bug-Description:
-
-When removing the current or previous job from the jobs list, bash incorrectly
-resets the current job under some circumstances.
-
-Patch:
-
-*** ../bash-3.2-patched/jobs.c Sat Jul 29 16:40:48 2006
---- jobs.c     Fri Nov 24 14:50:01 2006
-***************
-*** 985,990 ****
-    if (temp == 0)
-      return;
--   if (job_index == js.j_current || job_index == js.j_previous)
--     reset_current ();
-  
-    if ((dflags & DEL_NOBGPID) == 0)
---- 985,988 ----
-***************
-*** 1029,1032 ****
---- 1027,1033 ----
-    else if (jobs[js.j_firstj] == 0 || jobs[js.j_lastj] == 0)
-      reset_job_indices ();
-+ 
-+   if (job_index == js.j_current || job_index == js.j_previous)
-+     reset_current ();
-  }
-
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 6
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 7
-  
-  #endif /* _PATCHLEVEL_H_ */
-
-  
diff --git a/src/patches/bash/bash32-008 b/src/patches/bash/bash32-008
deleted file mode 100644 (file)
index 7ec07ff..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-008
-
-Bug-Reported-by:       Linda Walsh <bash@tlinx.org>
-Bug-Reference-ID:      <456041FD.8000605@tlinx.org>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00040.html
-
-Bug-Description:
-
-When checking pathnames from the command hash table (e.g., when the `checkhash'
-shell option is enabled), a bug causes bash to delete and re-lookup each
-command.
-
-Patch:
-
-*** ../bash-3.2-patched/findcmd.c      Wed Aug 17 16:49:54 2005
---- findcmd.c  Fri Nov 24 10:48:37 2006
-***************
-*** 309,313 ****
-      {
-        st = file_status (hashed_file);
-!       if ((st ^ (FS_EXISTS | FS_EXECABLE)) != 0)
-       {
-         phash_remove (pathname);
---- 309,313 ----
-      {
-        st = file_status (hashed_file);
-!       if ((st & (FS_EXISTS|FS_EXECABLE)) != (FS_EXISTS|FS_EXECABLE))
-       {
-         phash_remove (pathname);
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 7
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 8
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-009 b/src/patches/bash/bash32-009
deleted file mode 100644 (file)
index 9cfd16e..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-009
-
-Bug-Reported-by:       James.M.Botte@lowes.com
-Bug-Reference-ID:      <BA9FF90F7E5B424998F98EDA9F1F94BE01FA9853@msexchdb01.lowes.com>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2006-12/msg00000.html
-
-Bug-Description:
-
-When using its built-in replacement for snprintf/asprintf, bash does not
-treat the %x, %X, and %o format specifiers as unsigned numbers.
-
-Patch:
-
-*** ../bash-3.2-patched/lib/sh/snprintf.c      Mon Nov 13 08:58:52 2006
---- lib/sh/snprintf.c  Wed Dec  6 11:15:04 2006
-***************
-*** 669,673 ****
-  
-    sd = d;    /* signed for ' ' padding in base 10 */
-!   flags = (*p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
-    if (*p->pf == 'X')
-      flags |= FL_HEXUPPER;
---- 674,679 ----
-  
-    sd = d;    /* signed for ' ' padding in base 10 */
-!   flags = 0;
-!   flags = (*p->pf == 'x' || *p->pf == 'X' || *p->pf == 'o' || *p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
-    if (*p->pf == 'X')
-      flags |= FL_HEXUPPER;
-***************
-*** 739,743 ****
-  
-    sd = d;    /* signed for ' ' padding in base 10 */
-!   flags = (*p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
-    if (*p->pf == 'X')
-      flags |= FL_HEXUPPER;
---- 745,749 ----
-  
-    sd = d;    /* signed for ' ' padding in base 10 */
-!   flags = (*p->pf == 'x' || *p->pf == 'X' || *p->pf == 'o' || *p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
-    if (*p->pf == 'X')
-      flags |= FL_HEXUPPER;
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 8
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 9
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-010 b/src/patches/bash/bash32-010
deleted file mode 100644 (file)
index 88de575..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-010
-
-Bug-Reported-by:       Ryan Waldron <rew@erebor.com>
-Bug-Reference-ID:      <20070119065603.546D011E9C@kansas.erebor.com>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2007-01/msg00059.html
-
-Bug-Description:
-
-The glibc implementation of regcomp/regexec does not allow backslashes to
-escape "ordinary" pattern characters when matching.  Bash used backslashes
-to quote all characters when the pattern argument to the [[ special
-command's =~ operator was quoted.  This caused the match to fail on Linux
-and other systems using GNU libc.
-
-Patch:
-
-*** ../bash-3.2.9/pathexp.h    Sat Feb 19 17:23:18 2005
---- pathexp.h  Wed Jan 31 22:53:16 2007
-***************
-*** 1,5 ****
-  /* pathexp.h -- The shell interface to the globbing library. */
-  
-! /* Copyright (C) 1987-2005 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
---- 1,5 ----
-  /* pathexp.h -- The shell interface to the globbing library. */
-  
-! /* Copyright (C) 1987-2007 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
-***************
-*** 33,36 ****
---- 33,37 ----
-  #define QGLOB_CVTNULL        0x01    /* convert QUOTED_NULL strings to '\0' */
-  #define QGLOB_FILENAME       0x02    /* do correct quoting for matching filenames */
-+ #define QGLOB_REGEXP 0x04    /* quote an ERE for regcomp/regexec */
-  
-  #if defined (EXTENDED_GLOB)
-*** ../bash-3.2.9/pathexp.c    Mon May  6 13:43:05 2002
---- pathexp.c  Mon Feb 26 16:59:23 2007
-***************
-*** 1,5 ****
-  /* pathexp.c -- The shell interface to the globbing library. */
-  
-! /* Copyright (C) 1995-2002 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
---- 1,5 ----
-  /* pathexp.c -- The shell interface to the globbing library. */
-  
-! /* Copyright (C) 1995-2007 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
-***************
-*** 111,114 ****
---- 111,141 ----
-  }
-  
-+ /* Return 1 if C is a character that is `special' in a POSIX ERE and needs to
-+    be quoted to match itself. */
-+ static inline int
-+ ere_char (c)
-+      int c;
-+ {
-+   switch (c)
-+     {
-+     case '.':
-+     case '[':
-+     case '\\':
-+     case '(':
-+     case ')':
-+     case '*':
-+     case '+':
-+     case '?':
-+     case '{':
-+     case '|':
-+     case '^':
-+     case '$':
-+       return 1;
-+     default: 
-+       return 0;
-+     }
-+   return (0);
-+ }
-+ 
-  /* PATHNAME can contain characters prefixed by CTLESC; this indicates
-     that the character is to be quoted.  We quote it here in the style
-***************
-*** 143,146 ****
---- 170,175 ----
-         if ((qflags & QGLOB_FILENAME) && pathname[i+1] == '/')
-           continue;
-+        if ((qflags & QGLOB_REGEXP) && ere_char (pathname[i+1]) == 0)
-+          continue;
-         temp[j++] = '\\';
-         i++;
-*** ../bash-3.2.9/subst.c      Tue Nov  7 16:14:41 2006
---- subst.c    Wed Jan 31 23:09:58 2007
-***************
-*** 5,9 ****
-       beauty, but, hey, you're alright.'' */
-  
-! /* Copyright (C) 1987-2006 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
---- 5,9 ----
-       beauty, but, hey, you're alright.'' */
-  
-! /* Copyright (C) 1987-2007 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
-***************
-*** 2647,2655 ****
-  /* This needs better error handling. */
-  /* Expand W for use as an argument to a unary or binary operator in a
-!    [[...]] expression.  If SPECIAL is nonzero, this is the rhs argument
-     to the != or == operator, and should be treated as a pattern.  In
-!    this case, we quote the string specially for the globbing code.  The
-!    caller is responsible for removing the backslashes if the unquoted
-!    words is needed later. */   
-  char *
-  cond_expand_word (w, special)
---- 2647,2656 ----
-  /* This needs better error handling. */
-  /* Expand W for use as an argument to a unary or binary operator in a
-!    [[...]] expression.  If SPECIAL is 1, this is the rhs argument
-     to the != or == operator, and should be treated as a pattern.  In
-!    this case, we quote the string specially for the globbing code.  If
-!    SPECIAL is 2, this is an rhs argument for the =~ operator, and should
-!    be quoted appropriately for regcomp/regexec.  The caller is responsible
-!    for removing the backslashes if the unquoted word is needed later. */   
-  char *
-  cond_expand_word (w, special)
-***************
-*** 2659,2662 ****
---- 2660,2664 ----
-    char *r, *p;
-    WORD_LIST *l;
-+   int qflags;
-  
-    if (w->word == 0 || w->word[0] == '\0')
-***************
-*** 2673,2678 ****
-        else
-       {
-         p = string_list (l);
-!        r = quote_string_for_globbing (p, QGLOB_CVTNULL);
-         free (p);
-       }
---- 2675,2683 ----
-        else
-       {
-+        qflags = QGLOB_CVTNULL;
-+        if (special == 2)
-+          qflags |= QGLOB_REGEXP;
-         p = string_list (l);
-!        r = quote_string_for_globbing (p, qflags);
-         free (p);
-       }
-*** ../bash-3.2.9/execute_cmd.c        Sat Aug 26 00:23:17 2006
---- execute_cmd.c      Wed Jan 31 23:12:06 2007
-***************
-*** 1,5 ****
-  /* execute_cmd.c -- Execute a COMMAND structure. */
-  
-! /* Copyright (C) 1987-2005 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
---- 1,5 ----
-  /* execute_cmd.c -- Execute a COMMAND structure. */
-  
-! /* Copyright (C) 1987-2007 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
-***************
-*** 2547,2551 ****
-        if (arg1 == 0)
-       arg1 = nullstr;
-!       arg2 = cond_expand_word (cond->right->op, patmatch||rmatch);
-        if (arg2 == 0)
-       arg2 = nullstr;
---- 2547,2551 ----
-        if (arg1 == 0)
-       arg1 = nullstr;
-!       arg2 = cond_expand_word (cond->right->op, rmatch ? 2 : (patmatch ? 1 : 0));
-        if (arg2 == 0)
-       arg2 = nullstr;
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 9
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 10
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-011 b/src/patches/bash/bash32-011
deleted file mode 100644 (file)
index c021f52..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-011
-
-Bug-Reported-by: Petr Sumbera <Petr.Sumbera@Sun.COM>
-Bug-Reference-ID: <45AF5F4B.1020800@sun.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-01/msg00049.html
-
-Bug-Description:
-
-Under certain circumstances (loopback mounts), the bash getcwd does not
-return correct results.  This patch allows the use of the Solaris libc
-getcwd even though it doesn't dynamically allocate memory.
-
-Run `touch configure' to make sure make doesn't try to run autoconf.
-Then run configure with whatever options you like.
-
-Patch:
-
-*** ../bash-3.2-patched/configure.in   Tue Sep 26 11:05:45 2006
---- configure.in       Wed Jan 31 09:48:00 2007
-***************
-*** 6,10 ****
-  dnl Process this file with autoconf to produce a configure script.
-  
-! # Copyright (C) 1987-2006 Free Software Foundation, Inc.
-  
-  # This program is free software; you can redistribute it and/or modify
---- 6,10 ----
-  dnl Process this file with autoconf to produce a configure script.
-  
-! # Copyright (C) 1987-2007 Free Software Foundation, Inc.
-  
-  # This program is free software; you can redistribute it and/or modify
-***************
-*** 992,996 ****
-  sco3.2*)     LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;;
-  sunos4*)     LOCAL_CFLAGS=-DSunOS4 ;;
-! solaris2.5*) LOCAL_CFLAGS=-DSunOS5 ;;
-  lynxos*)     LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
-  linux*)              LOCAL_LDFLAGS=-rdynamic          # allow dynamic loading
---- 992,997 ----
-  sco3.2*)     LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;;
-  sunos4*)     LOCAL_CFLAGS=-DSunOS4 ;;
-! solaris2.5*) LOCAL_CFLAGS="-DSunOS5 -DSOLARIS" ;;
-! solaris2*)   LOCAL_CFLAGS=-DSOLARIS ;;
-  lynxos*)     LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
-  linux*)              LOCAL_LDFLAGS=-rdynamic          # allow dynamic loading
-*** ../bash-3.2-patched/config-bot.h   Tue Sep 12 16:43:04 2006
---- config-bot.h       Tue Mar  6 10:41:31 2007
-***************
-*** 2,6 ****
-  /* modify settings or make new ones based on what autoconf tells us. */
-  
-! /* Copyright (C) 1989-2002 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
---- 2,6 ----
-  /* modify settings or make new ones based on what autoconf tells us. */
-  
-! /* Copyright (C) 1989-2007 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
-***************
-*** 71,77 ****
-  #endif
-  
-! /* If we have a getcwd(3), but it calls popen(), #undef HAVE_GETCWD so
-!    the replacement in getcwd.c will be built. */
-! #if defined (HAVE_GETCWD) && defined (GETCWD_BROKEN)
-  #  undef HAVE_GETCWD
-  #endif
---- 71,79 ----
-  #endif
-  
-! /* If we have a getcwd(3), but one that does not dynamically allocate memory,
-!    #undef HAVE_GETCWD so the replacement in getcwd.c will be built.  We do
-!    not do this on Solaris, because their implementation of loopback mounts
-!    breaks the traditional file system assumptions that getcwd uses. */
-! #if defined (HAVE_GETCWD) && defined (GETCWD_BROKEN) && !defined (SOLARIS)
-  #  undef HAVE_GETCWD
-  #endif
-*** ../bash-3.2-patched/builtins/common.c      Thu Jul 27 09:39:51 2006
---- builtins/common.c  Tue Mar  6 10:43:27 2007
-***************
-*** 1,3 ****
-! /* Copyright (C) 1987-2005 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
---- 1,3 ----
-! /* Copyright (C) 1987-2007 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
-***************
-*** 476,480 ****
---- 476,484 ----
-    if (the_current_working_directory == 0)
-      {
-+ #if defined (GETCWD_BROKEN)
-+       the_current_working_directory = getcwd (0, PATH_MAX);
-+ #else
-        the_current_working_directory = getcwd (0, 0);
-+ #endif
-        if (the_current_working_directory == 0)
-       {
-*** ../bash-3.2-patched/configure      Tue Sep 26 11:06:01 2006
---- configure  Tue Mar  6 10:59:20 2007
-***************
-*** 27317,27321 ****
-  sco3.2*)     LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;;
-  sunos4*)     LOCAL_CFLAGS=-DSunOS4 ;;
-! solaris2.5*) LOCAL_CFLAGS=-DSunOS5 ;;
-  lynxos*)     LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
-  linux*)              LOCAL_LDFLAGS=-rdynamic          # allow dynamic loading
---- 27317,27322 ----
-  sco3.2*)     LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;;
-  sunos4*)     LOCAL_CFLAGS=-DSunOS4 ;;
-! solaris2.5*) LOCAL_CFLAGS="-DSunOS5 -DSOLARIS" ;;
-! solaris2*)   LOCAL_CFLAGS=-DSOLARIS ;;
-  lynxos*)     LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
-  linux*)              LOCAL_LDFLAGS=-rdynamic          # allow dynamic loading
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 10
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 11
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-012 b/src/patches/bash/bash32-012
deleted file mode 100644 (file)
index 8d669d2..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-012
-
-Bug-Reported-by: John Wyman <JohnWyman@celink.com>
-Bug-Reference-ID: <5E7DEFC094C35044B87FAE761D9F0EE20143A3B7@exchange2k.celink.com>
-Bug-Reference-URL: 
-
-Bug-Description:
-
-Some systems (AIX 4.x) don't implement the PRI_xxx macros correctly,
-causing syntax errors when attempting to compile bash on those systems.
-This patch adds support for the PRI_MACROS_BROKEN define.
-
-You will need to re-run `configure' after applying the patch.  Run
-`touch configure' so make doesn't try to run autoconf.
-
-Patch:
-
-*** ../bash-3.2.11/config.h.in Tue Sep 12 16:00:54 2006
---- config.h.in        Tue Mar  6 11:17:55 2007
-***************
-*** 1,5 ****
-  /* config.h -- Configuration file for bash. */
-  
-! /* Copyright (C) 1987-2006 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
---- 1,5 ----
-  /* config.h -- Configuration file for bash. */
-  
-! /* Copyright (C) 1987-2007 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
-***************
-*** 414,417 ****
---- 414,419 ----
-  #undef HAVE_DECL_STRTOLD
-  
-+ #undef PRI_MACROS_BROKEN
-+ 
-  #undef STRTOLD_BROKEN
-  
-***************
-*** 1007,1010 ****
---- 1009,1015 ----
-  #undef HAVE_DCGETTEXT
-  
-+ /* Define if you have the `localeconv' function. */
-+ #undef HAVE_LOCALECONV
-+ 
-  /* Define if your system has a working `malloc' function. */
-  /* #undef HAVE_MALLOC */
-*** ../bash-3.2.11/builtins/printf.def Mon Nov 13 08:58:52 2006
---- builtins/printf.def        Sun Feb  4 13:58:59 2007
-***************
-*** 2,6 ****
-  It implements the builtin "printf" in Bash.
-  
-! Copyright (C) 1997-2005 Free Software Foundation, Inc.
-  
-  This file is part of GNU Bash, the Bourne Again SHell.
---- 2,6 ----
-  It implements the builtin "printf" in Bash.
-  
-! Copyright (C) 1997-2007 Free Software Foundation, Inc.
-  
-  This file is part of GNU Bash, the Bourne Again SHell.
-***************
-*** 71,74 ****
---- 71,78 ----
-  #include "common.h"
-  
-+ #if defined (PRI_MACROS_BROKEN)
-+ #  undef PRIdMAX
-+ #endif
-+ 
-  #if !defined (PRIdMAX)
-  #  if HAVE_LONG_LONG
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 11
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 12
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-013 b/src/patches/bash/bash32-013
deleted file mode 100644 (file)
index d47bc1a..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-013
-
-Bug-Reported-by: Magnus Svensson <msvensson@mysql.com>
-Bug-Reference-ID: <45BDC44D.80609@mysql.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2007-01/msg00002.html
-
-Bug-Description:
-
-Readline neglects to reallocate the array it uses to keep track of wrapped
-screen lines when increasing its size.  This will eventually result in
-segmentation faults when given sufficiently long input.
-
-Patch:
-
-*** ../bash-3.2-patched/lib/readline/display.c Thu Sep 14 14:20:12 2006
---- lib/readline/display.c     Fri Feb  2 20:23:17 2007
-***************
-*** 561,574 ****
---- 561,586 ----
-        wrap_offset = prompt_invis_chars_first_line = 0;
-      }
-  
-+ #if defined (HANDLE_MULTIBYTE)
-  #define CHECK_INV_LBREAKS() \
-        do { \
-       if (newlines >= (inv_lbsize - 2)) \
-         { \
-           inv_lbsize *= 2; \
-           inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
-+          _rl_wrapped_line = (int *)xrealloc (_rl_wrapped_line, inv_lbsize * sizeof (int)); \
-         } \
-        } while (0)
-+ #else
-+ #define CHECK_INV_LBREAKS() \
-+       do { \
-+      if (newlines >= (inv_lbsize - 2)) \
-+        { \
-+          inv_lbsize *= 2; \
-+          inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
-+        } \
-+       } while (0)
-+ #endif /* HANDLE_MULTIBYTE */
-  
-  #if defined (HANDLE_MULTIBYTE)         
-  #define CHECK_LPOS() \
-
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 12
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 13
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-014 b/src/patches/bash/bash32-014
deleted file mode 100644 (file)
index b706505..0000000
+++ /dev/null
@@ -1,307 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-014
-
-Bug-Reported-by: Brett Stahlman <brettstahlman@comcast.net>
-Bug-Reference-ID: <000701c72d29$a227e0e0$5ec7cf47@computerroom>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-12/msg00065.html
-
-Bug-Description:
-
-Bash mishandles word splitting under certain circumstances when IFS is
-null (IFS=).  Constructs affected include ${param/pat/sub} and others
-when expanding arrays (array[@]).
-
-Patch:
-
-*** ../bash-3.2-patched/array.c        Wed Jun  1 16:39:22 2005
---- array.c    Mon Jan 15 22:58:00 2007
-***************
-*** 121,125 ****
-  }
-  
-- #ifdef INCLUDE_UNUSED
-  /*
-   * Make and return a new array composed of the elements in array A from
---- 121,124 ----
-***************
-*** 142,146 ****
-               n = array_create_element (element_index(p), element_value(p));
-               ADD_BEFORE(a->head, n);
-!              mi = element_index(ae);
-       }
-       a->num_elements = i;
---- 141,145 ----
-               n = array_create_element (element_index(p), element_value(p));
-               ADD_BEFORE(a->head, n);
-!              mi = element_index(n);
-       }
-       a->num_elements = i;
-***************
-*** 148,152 ****
-       return a;
-  }
-- #endif
-  
-  /*
---- 147,150 ----
-***************
-*** 301,304 ****
---- 299,319 ----
-  }
-  
-+ ARRAY        *
-+ array_quote_escapes(array)
-+ ARRAY        *array;
-+ {
-+      ARRAY_ELEMENT   *a;
-+      char    *t;
-+ 
-+      if (array == 0 || array_head(array) == 0 || array_empty(array))
-+              return (ARRAY *)NULL;
-+      for (a = element_forw(array->head); a != array->head; a = element_forw(a)) {
-+              t = quote_escapes (a->value);
-+              FREE(a->value);
-+              a->value = t;
-+      }
-+      return array;
-+ }
-+ 
-  /*
-   * Return a string whose elements are the members of array A beginning at
-***************
-*** 312,318 ****
-  int  starsub, quoted;
-  {
-       ARRAY_ELEMENT   *h, *p;
-       arrayind_t      i;
-!      char            *ifs, sep[2];
-  
-       p = a ? array_head (a) : 0;
---- 327,334 ----
-  int  starsub, quoted;
-  {
-+      ARRAY           *a2;
-       ARRAY_ELEMENT   *h, *p;
-       arrayind_t      i;
-!      char            *ifs, sep[2], *t;
-  
-       p = a ? array_head (a) : 0;
-***************
-*** 337,340 ****
---- 353,363 ----
-               ;
-  
-+      a2 = array_slice(a, h, p);
-+ 
-+      if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))
-+              array_quote(a2);
-+      else
-+              array_quote_escapes(a2);
-+ 
-       if (starsub && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) {
-               ifs = getifs();
-***************
-*** 344,348 ****
-       sep[1] = '\0';
-  
-!      return (array_to_string_internal (h, p, sep, quoted));
-  }
-  
---- 367,374 ----
-       sep[1] = '\0';
-  
-!      t = array_to_string (a2, sep, 0);
-!      array_dispose(a2);
-! 
-!      return t;
-  }
-  
-***************
-*** 368,372 ****
-  
-       if (mflags & MATCH_QUOTED)
-!              array_quote (a2);
-       if (mflags & MATCH_STARSUB) {
-               ifs = getifs();
---- 394,400 ----
-  
-       if (mflags & MATCH_QUOTED)
-!              array_quote(a2);
-!      else
-!              array_quote_escapes(a2);
-       if (mflags & MATCH_STARSUB) {
-               ifs = getifs();
-*** ../bash-3.2-patched/array.h        Sun Jun  1 15:50:30 2003
---- array.h    Mon Jan 15 22:35:35 2007
-***************
-*** 56,59 ****
---- 56,60 ----
-  extern int   array_shift_element __P((ARRAY *, char *));
-  extern ARRAY *array_quote __P((ARRAY *));
-+ extern ARRAY *array_quote_escapes __P((ARRAY *));
-  
-  extern char  *array_subrange __P((ARRAY *, arrayind_t, arrayind_t, int, int));
-*** ../bash-3.2-patched/subst.c        Fri Mar  2 16:20:50 2007
---- subst.c    Tue Mar  6 11:40:55 2007
-***************
-*** 1888,1892 ****
---- 1889,1899 ----
-  #endif
-  
-+   /* XXX -- why call quote_list if ifs == 0?  we can get away without doing
-+      it now that quote_escapes quotes spaces */
-+ #if 0
-    tlist = ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (ifs && *ifs == 0))
-+ #else
-+   tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
-+ #endif
-               ? quote_list (list)
-               : list_quote_escapes (list);
-***************
-*** 2922,2926 ****
-  /* Quote escape characters in string s, but no other characters.  This is
-     used to protect CTLESC and CTLNUL in variable values from the rest of
-!    the word expansion process after the variable is expanded. */
-  char *
-  quote_escapes (string)
---- 2935,2944 ----
-  /* Quote escape characters in string s, but no other characters.  This is
-     used to protect CTLESC and CTLNUL in variable values from the rest of
-!    the word expansion process after the variable is expanded.  If IFS is
-!    null, we quote spaces as well, just in case we split on spaces later
-!    (in the case of unquoted $@, we will eventually attempt to split the
-!    entire word on spaces).  Corresponding code exists in dequote_escapes.
-!    Even if we don't end up splitting on spaces, quoting spaces is not a
-!    problem. */
-  char *
-  quote_escapes (string)
-***************
-*** 2930,2933 ****
---- 2948,2952 ----
-    size_t slen;
-    char *result, *send;
-+   int quote_spaces;
-    DECLARE_MBSTATE; 
-  
-***************
-*** 2935,2938 ****
---- 2954,2958 ----
-    send = string + slen;
-  
-+   quote_spaces = (ifs_value && *ifs_value == 0);
-    t = result = (char *)xmalloc ((slen * 2) + 1);
-    s = string;
-***************
-*** 2940,2944 ****
-    while (*s)
-      {
-!       if (*s == CTLESC || *s == CTLNUL)
-       *t++ = CTLESC;
-        COPY_CHAR_P (t, s, send);
---- 2960,2964 ----
-    while (*s)
-      {
-!       if (*s == CTLESC || *s == CTLNUL || (quote_spaces && *s == ' '))
-       *t++ = CTLESC;
-        COPY_CHAR_P (t, s, send);
-***************
-*** 2982,2985 ****
---- 3002,3006 ----
-    size_t slen;
-    char *result, *send;
-+   int quote_spaces;
-    DECLARE_MBSTATE;
-  
-***************
-*** 2996,3002 ****
-      return (strcpy (result, s));
-  
-    while (*s)
-      {
-!       if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL))
-       {
-         s++;
---- 3017,3024 ----
-      return (strcpy (result, s));
-  
-+   quote_spaces = (ifs_value && *ifs_value == 0);
-    while (*s)
-      {
-!       if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL || (quote_spaces && s[1] == ' ')))
-       {
-         s++;
-***************
-*** 4462,4466 ****
-        RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size, DEFAULT_ARRAY_SIZE);
-  
-!       if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || c == CTLESC || c == CTLNUL)
-       istring[istring_index++] = CTLESC;
-  
---- 4498,4510 ----
-        RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size, DEFAULT_ARRAY_SIZE);
-  
-!       /* This is essentially quote_string inline */
-!       if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) /* || c == CTLESC || c == CTLNUL */)
-!      istring[istring_index++] = CTLESC;
-!       /* Escape CTLESC and CTLNUL in the output to protect those characters
-!       from the rest of the word expansions (word splitting and globbing.)
-!       This is essentially quote_escapes inline. */
-!       else if (c == CTLESC)
-!      istring[istring_index++] = CTLESC;
-!       else if (c == CTLNUL || (c == ' ' && (ifs_value && *ifs_value == 0)))
-       istring[istring_index++] = CTLESC;
-  
-***************
-*** 5552,5555 ****
---- 5610,5616 ----
-        rely on array_subrange to understand how to deal with them). */
-        tt = array_subrange (array_cell (v), e1, e2, starsub, quoted);
-+ #if 0
-+       /* array_subrange now calls array_quote_escapes as appropriate, so the
-+       caller no longer needs to. */
-        if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) == 0)
-       {
-***************
-*** 5558,5561 ****
---- 5619,5623 ----
-       }
-        else
-+ #endif
-       temp = tt;
-        break;
-***************
-*** 5808,5811 ****
---- 5870,5876 ----
-      case VT_ARRAYVAR:
-        temp = array_patsub (array_cell (v), p, rep, mflags);
-+ #if 0
-+       /* Don't need to do this anymore; array_patsub calls array_quote_escapes
-+       as appropriate before adding the space separators. */
-        if (temp && (mflags & MATCH_QUOTED) == 0)
-       {
-***************
-*** 5814,5817 ****
---- 5879,5883 ----
-         temp = tt;
-       }
-+ #endif
-        break;
-  #endif
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 13
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 14
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-015 b/src/patches/bash/bash32-015
deleted file mode 100644 (file)
index d887f6e..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-015
-
-Bug-Reported-by:
-Bug-Reference-ID:
-Bug-Reference-URL:
-
-Bug-Description:
-
-Under certain circumstances, when using FIFOs for process substitution,
-bash fails to unlink the FIFOs.  This leaves open file descriptors that
-can cause the shell to hang and litters the file system.
-
-Patch:
-
-*** ../bash-3.2-patched/execute_cmd.c  Fri Mar  2 16:20:50 2007
---- execute_cmd.c      Wed Jan 31 23:12:06 2007
-***************
-*** 3051,3054 ****
---- 3051,3059 ----
-      command_line = savestring (the_printed_command_except_trap);
-  
-+ #if defined (PROCESS_SUBSTITUTION)
-+   if ((subshell_environment & SUBSHELL_COMSUB) && (simple_command->flags & CMD_NO_FORK) && fifos_pending() > 0)
-+     simple_command->flags &= ~CMD_NO_FORK;
-+ #endif
-+ 
-    execute_disk_command (words, simple_command->redirects, command_line,
-                       pipe_in, pipe_out, async, fds_to_close,
-*** ../bash-3.2-patched/subst.c        Fri Mar  2 16:20:50 2007
---- subst.c    Tue Mar  6 11:40:55 2007
-***************
-*** 4129,4132 ****
---- 4151,4160 ----
-  }
-  
-+ int
-+ fifos_pending ()
-+ {
-+   return nfifo;
-+ }
-+ 
-  static char *
-  make_named_pipe ()
-***************
-*** 4178,4181 ****
---- 4206,4215 ----
-  }
-  
-+ int
-+ fifos_pending ()
-+ {
-+   return 0;  /* used for cleanup; not needed with /dev/fd */
-+ }
-+ 
-  void
-  unlink_fifo_list ()
-***************
-*** 4671,4674 ****
---- 4719,4725 ----
-        last_command_exit_value = rc;
-        rc = run_exit_trap ();
-+ #if defined (PROCESS_SUBSTITUTION)
-+       unlink_fifo_list ();
-+ #endif
-        exit (rc);
-      }
-*** ../bash-3.2-patched/subst.h        Tue Sep 19 08:34:41 2006
---- subst.h    Wed Jan 10 09:46:47 2007
-***************
-*** 223,226 ****
---- 223,227 ----
-  extern char *pat_subst __P((char *, char *, char *, int));
-  
-+ extern int fifos_pending __P((void));
-  extern void unlink_fifo_list __P((void));
-
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 14
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 15
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-016 b/src/patches/bash/bash32-016
deleted file mode 100644 (file)
index a0f065a..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-016
-
-Bug-Reported-by: Peter Volkov <torre_cremata@mail.ru>
-Bug-Reference-ID: <1171795523.8021.18.camel@localhost>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-02/msg00054.html
-
-Bug-Description:
-
-When moving the cursor, bash sometimes misplaces the cursor when the prompt
-contains two or more multibyte characters.  The particular circumstance that
-uncovered the problem was having the (multibyte) current directory name in
-the prompt string.
-
-Patch:
-
-*** ../bash-3.2/lib/readline/display.c Fri Jan 19 13:34:50 2007
---- lib/readline/display.c     Sat Mar 10 17:25:44 2007
-***************
-*** 1745,1749 ****
-      {
-        dpos = _rl_col_width (data, 0, new);
-!       if (dpos > prompt_last_invisible)              /* XXX - don't use woff here */
-       {
-         dpos -= woff;
---- 1745,1752 ----
-      {
-        dpos = _rl_col_width (data, 0, new);
-!       /* Use NEW when comparing against the last invisible character in the
-!       prompt string, since they're both buffer indices and DPOS is a
-!       desired display position. */
-!       if (new > prompt_last_invisible)               /* XXX - don't use woff here */
-       {
-         dpos -= woff;
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 15
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 16
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-017 b/src/patches/bash/bash32-017
deleted file mode 100644 (file)
index 99e5e70..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-017
-
-Bug-Reported-by: Peter Volkov <torre_cremata@mail.ru>
-Bug-Reference-ID: <1173636022.7039.36.camel@localhost>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-03/msg00039.html
-
-Bug-Description:
-
-When restoring the original prompt after finishing an incremental search,
-bash sometimes places the cursor incorrectly if the primary prompt contains
-invisible characters.
-
-Patch:
-
-*** ../bash-3.2.16/lib/readline/display.c      Fri Apr 20 13:30:16 2007
---- lib/readline/display.c     Fri Apr 20 15:17:01 2007
-***************
-*** 1599,1604 ****
-         if (temp > 0)
-           {
-             _rl_output_some_chars (nfd, temp);
-!            _rl_last_c_pos += _rl_col_width (nfd, 0, temp);;
-           }
-       }
---- 1599,1618 ----
-         if (temp > 0)
-           {
-+            /* If nfd begins at the prompt, or before the invisible
-+               characters in the prompt, we need to adjust _rl_last_c_pos
-+               in a multibyte locale to account for the wrap offset and
-+               set cpos_adjusted accordingly. */
-             _rl_output_some_chars (nfd, temp);
-!            if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
-!              {
-!                   _rl_last_c_pos += _rl_col_width (nfd, 0, temp);
-!                   if (current_line == 0 && wrap_offset &&  ((nfd - new) <= prompt_last_invisible))
-!                  {
-!                    _rl_last_c_pos -= wrap_offset;
-!                    cpos_adjusted = 1;
-!                  }
-!              }
-!               else
-!                 _rl_last_c_pos += temp;
-           }
-       }
-***************
-*** 1608,1613 ****
---- 1622,1639 ----
-         if (temp > 0)
-           {
-+            /* If nfd begins at the prompt, or before the invisible
-+               characters in the prompt, we need to adjust _rl_last_c_pos
-+               in a multibyte locale to account for the wrap offset and
-+               set cpos_adjusted accordingly. */
-             _rl_output_some_chars (nfd, temp);
-             _rl_last_c_pos += col_temp;               /* XXX */
-+            if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
-+              {
-+                if (current_line == 0 && wrap_offset &&  ((nfd - new) <= prompt_last_invisible))
-+                  {
-+                    _rl_last_c_pos -= wrap_offset;
-+                    cpos_adjusted = 1;
-+                  }
-+              }
-           }
-         lendiff = (oe - old) - (ne - new);
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 16
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 17
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-018 b/src/patches/bash/bash32-018
deleted file mode 100644 (file)
index d729aaf..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-018
-
-Bug-Reported-by:       osicka@post.cz
-Bug-Reference-ID:      <228.177-19682-1132061412-1179356692@post.cz>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2007-05/msg00061.html
-
-Bug-Description:
-
-In certain cases, bash can lose the saved status of a background job, though
-it should still be reported by `wait'.  Bash can also loop infinitely after
-creating and waiting for 4096 jobs.
-
-Patch:
-
-*** ../bash-20070510/jobs.c    Thu Mar  8 16:05:50 2007
---- jobs.c     Fri May 18 11:40:14 2007
-***************
-*** 784,792 ****
-      {
-        old = js.j_firstj++;
-        while (js.j_firstj != old)
-       {
-         if (js.j_firstj >= js.j_jobslots)
-           js.j_firstj = 0;
-!        if (jobs[js.j_firstj])
-           break;
-         js.j_firstj++;
---- 784,794 ----
-      {
-        old = js.j_firstj++;
-+       if (old >= js.j_jobslots)
-+      old = js.j_jobslots - 1;
-        while (js.j_firstj != old)
-       {
-         if (js.j_firstj >= js.j_jobslots)
-           js.j_firstj = 0;
-!        if (jobs[js.j_firstj] || js.j_firstj == old)  /* needed if old == 0 */
-           break;
-         js.j_firstj++;
-***************
-*** 798,806 ****
-      {
-        old = js.j_lastj--;
-        while (js.j_lastj != old)
-       {
-         if (js.j_lastj < 0)
-           js.j_lastj = js.j_jobslots - 1;
-!        if (jobs[js.j_lastj])
-           break;
-         js.j_lastj--;
---- 800,810 ----
-      {
-        old = js.j_lastj--;
-+       if (old < 0)
-+      old = 0;
-        while (js.j_lastj != old)
-       {
-         if (js.j_lastj < 0)
-           js.j_lastj = js.j_jobslots - 1;
-!        if (jobs[js.j_lastj] || js.j_lastj == old)    /* needed if old == js.j_jobslots */
-           break;
-         js.j_lastj--;
-***************
-*** 964,968 ****
-    realloc_jobs_list ();
-  
-!   return (js.j_lastj);
-  }
-  
---- 975,983 ----
-    realloc_jobs_list ();
-  
-! #ifdef DEBUG
-!   itrace("compact_jobs_list: returning %d", (js.j_lastj || jobs[js.j_lastj]) ? js.j_lastj + 1 : 0);
-! #endif
-! 
-!   return ((js.j_lastj || jobs[js.j_lastj]) ? js.j_lastj + 1 : 0);
-  }
-  
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 17
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 18
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-019 b/src/patches/bash/bash32-019
deleted file mode 100644 (file)
index 647bd1f..0000000
+++ /dev/null
@@ -1,343 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-019
-
-Bug-Reported-by:       Thomas Loeber <ifp@loeber1.de>
-Bug-Reference-ID:      <200703082223.08919.ifp@loeber1.de>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2007-03/msg00036.html
-
-Bug-Description:
-
-When rl_read_key returns -1, indicating that bash's controlling terminal
-has been invalidated for some reason (e.g., receiving a SIGHUP), the error
-status was not reported correctly to the caller.  This could cause input
-loops. 
-
-Patch:
-
-*** ../bash-3.2-patched/lib/readline/complete.c        Fri Jul 28 11:35:49 2006
---- lib/readline/complete.c    Tue Mar 13 08:50:16 2007
-***************
-*** 429,433 ****
-        if (c == 'n' || c == 'N' || c == RUBOUT)
-       return (0);
-!       if (c == ABORT_CHAR)
-       _rl_abort_internal ();
-        if (for_pager && (c == NEWLINE || c == RETURN))
---- 440,444 ----
-        if (c == 'n' || c == 'N' || c == RUBOUT)
-       return (0);
-!       if (c == ABORT_CHAR || c < 0)
-       _rl_abort_internal ();
-        if (for_pager && (c == NEWLINE || c == RETURN))
-*** ../bash-3.2-patched/lib/readline/input.c   Wed Aug 16 15:15:16 2006
---- lib/readline/input.c       Wed May  2 16:07:59 2007
-***************
-*** 514,518 ****
-       int size;
-  {
-!   int mb_len = 0;
-    size_t mbchar_bytes_length;
-    wchar_t wc;
---- 522,526 ----
-       int size;
-  {
-!   int mb_len, c;
-    size_t mbchar_bytes_length;
-    wchar_t wc;
-***************
-*** 521,531 ****
-    memset(&ps, 0, sizeof (mbstate_t));
-    memset(&ps_back, 0, sizeof (mbstate_t));
-!   
-    while (mb_len < size)
-      {
-        RL_SETSTATE(RL_STATE_MOREINPUT);
-!       mbchar[mb_len++] = rl_read_key ();
-        RL_UNSETSTATE(RL_STATE_MOREINPUT);
-  
-        mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps);
-        if (mbchar_bytes_length == (size_t)(-1))
---- 529,545 ----
-    memset(&ps, 0, sizeof (mbstate_t));
-    memset(&ps_back, 0, sizeof (mbstate_t));
-! 
-!   mb_len = 0;  
-    while (mb_len < size)
-      {
-        RL_SETSTATE(RL_STATE_MOREINPUT);
-!       c = rl_read_key ();
-        RL_UNSETSTATE(RL_STATE_MOREINPUT);
-  
-+       if (c < 0)
-+      break;
-+ 
-+       mbchar[mb_len++] = c;
-+ 
-        mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps);
-        if (mbchar_bytes_length == (size_t)(-1))
-***************
-*** 565,569 ****
-    c = first;
-    memset (mb, 0, mlen);
-!   for (i = 0; i < mlen; i++)
-      {
-        mb[i] = (char)c;
---- 579,583 ----
-    c = first;
-    memset (mb, 0, mlen);
-!   for (i = 0; c >= 0 && i < mlen; i++)
-      {
-        mb[i] = (char)c;
-*** ../bash-3.2-patched/lib/readline/isearch.c Mon Dec 26 17:18:53 2005
---- lib/readline/isearch.c     Fri Mar  9 14:30:59 2007
-***************
-*** 328,333 ****
-  
-    f = (rl_command_func_t *)NULL;
-!  
-!  /* Translate the keys we do something with to opcodes. */
-    if (c >= 0 && _rl_keymap[c].type == ISFUNC)
-      {
---- 328,340 ----
-  
-    f = (rl_command_func_t *)NULL;
-! 
-!   if (c < 0)
-!     {
-!       cxt->sflags |= SF_FAILED;
-!       cxt->history_pos = cxt->last_found_line;
-!       return -1;
-!     }
-! 
-!   /* Translate the keys we do something with to opcodes. */
-    if (c >= 0 && _rl_keymap[c].type == ISFUNC)
-      {
-*** ../bash-3.2-patched/lib/readline/misc.c    Mon Dec 26 17:20:46 2005
---- lib/readline/misc.c        Fri Mar  9 14:44:11 2007
-***************
-*** 147,150 ****
---- 147,152 ----
-         rl_clear_message ();
-         RL_UNSETSTATE(RL_STATE_NUMERICARG);
-+        if (key < 0)
-+          return -1;
-         return (_rl_dispatch (key, _rl_keymap));
-       }
-*** ../bash-3.2-patched/lib/readline/readline.c        Wed Aug 16 15:00:36 2006
---- lib/readline/readline.c    Fri Mar  9 14:47:24 2007
-***************
-*** 646,649 ****
---- 669,677 ----
-      {
-        nkey = _rl_subseq_getchar (cxt->okey);
-+       if (nkey < 0)
-+      {
-+        _rl_abort_internal ();
-+        return -1;
-+      }
-        r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg);
-        cxt->flags |= KSEQ_DISPATCHED;
-*** ../bash-3.2-patched/lib/readline/text.c    Fri Jul 28 11:55:27 2006
---- lib/readline/text.c        Sun Mar 25 13:41:38 2007
-***************
-*** 858,861 ****
---- 864,870 ----
-    RL_UNSETSTATE(RL_STATE_MOREINPUT);
-  
-+   if (c < 0)
-+     return -1;
-+ 
-  #if defined (HANDLE_SIGNALS)
-    if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
-***************
-*** 1521,1524 ****
---- 1530,1536 ----
-    mb_len = _rl_read_mbchar (mbchar, MB_LEN_MAX);
-  
-+   if (mb_len <= 0)
-+     return -1;
-+ 
-    if (count < 0)
-      return (_rl_char_search_internal (-count, bdir, mbchar, mb_len));
-***************
-*** 1537,1540 ****
---- 1549,1555 ----
-    RL_UNSETSTATE(RL_STATE_MOREINPUT);
-  
-+   if (c < 0)
-+     return -1;
-+ 
-    if (count < 0)
-      return (_rl_char_search_internal (-count, bdir, c));
-*** ../bash-3.2-patched/lib/readline/vi_mode.c Sat Jul 29 16:42:28 2006
---- lib/readline/vi_mode.c     Fri Mar  9 15:02:11 2007
-***************
-*** 887,890 ****
---- 887,897 ----
-    c = rl_read_key ();
-    RL_UNSETSTATE(RL_STATE_MOREINPUT);
-+ 
-+   if (c < 0)
-+     {
-+       *nextkey = 0;
-+       return -1;
-+     }
-+ 
-    *nextkey = c;
-  
-***************
-*** 903,906 ****
---- 910,918 ----
-         c = rl_read_key ();   /* real command */
-         RL_UNSETSTATE(RL_STATE_MOREINPUT);
-+        if (c < 0)
-+          {
-+            *nextkey = 0;
-+            return -1;
-+          }
-         *nextkey = c;
-       }
-***************
-*** 1225,1236 ****
-       _rl_callback_generic_arg *data;
-  {
-  #if defined (HANDLE_MULTIBYTE)
-!   _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
-  #else
-    RL_SETSTATE(RL_STATE_MOREINPUT);
-!   _rl_vi_last_search_char = rl_read_key ();
-    RL_UNSETSTATE(RL_STATE_MOREINPUT);
-  #endif
-  
-    _rl_callback_func = 0;
-    _rl_want_redisplay = 1;
---- 1243,1262 ----
-       _rl_callback_generic_arg *data;
-  {
-+   int c;
-  #if defined (HANDLE_MULTIBYTE)
-!   c = _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
-  #else
-    RL_SETSTATE(RL_STATE_MOREINPUT);
-!   c = rl_read_key ();
-    RL_UNSETSTATE(RL_STATE_MOREINPUT);
-  #endif
-  
-+   if (c <= 0)
-+     return -1;
-+ 
-+ #if !defined (HANDLE_MULTIBYTE)
-+   _rl_vi_last_search_char = c;
-+ #endif
-+ 
-    _rl_callback_func = 0;
-    _rl_want_redisplay = 1;
-***************
-*** 1248,1251 ****
---- 1274,1278 ----
-       int count, key;
-  {
-+   int c;
-  #if defined (HANDLE_MULTIBYTE)
-    static char *target;
-***************
-*** 1294,1302 ****
-       {
-  #if defined (HANDLE_MULTIBYTE)
-!        _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
-  #else
-         RL_SETSTATE(RL_STATE_MOREINPUT);
-!        _rl_vi_last_search_char = rl_read_key ();
-         RL_UNSETSTATE(RL_STATE_MOREINPUT);
-  #endif
-       }
---- 1321,1335 ----
-       {
-  #if defined (HANDLE_MULTIBYTE)
-!        c = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
-!        if (c <= 0)
-!          return -1;
-!        _rl_vi_last_search_mblen = c;
-  #else
-         RL_SETSTATE(RL_STATE_MOREINPUT);
-!        c = rl_read_key ();
-         RL_UNSETSTATE(RL_STATE_MOREINPUT);
-+        if (c < 0)
-+          return -1;
-+        _rl_vi_last_search_char = c;
-  #endif
-       }
-***************
-*** 1468,1471 ****
---- 1501,1507 ----
-    RL_UNSETSTATE(RL_STATE_MOREINPUT);
-  
-+   if (c < 0)
-+     return -1;
-+ 
-  #if defined (HANDLE_MULTIBYTE)
-    if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
-***************
-*** 1486,1489 ****
---- 1522,1528 ----
-    _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX);
-  
-+   if (c < 0)
-+     return -1;
-+ 
-    _rl_callback_func = 0;
-    _rl_want_redisplay = 1;
-***************
-*** 1517,1520 ****
---- 1556,1562 ----
-      _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX);
-  
-+   if (c < 0)
-+     return -1;
-+ 
-    return (_rl_vi_change_char (count, c, mb));
-  }
-***************
-*** 1651,1655 ****
-    RL_UNSETSTATE(RL_STATE_MOREINPUT);
-  
-!   if (ch < 'a' || ch > 'z')
-      {
-        rl_ding ();
---- 1693,1697 ----
-    RL_UNSETSTATE(RL_STATE_MOREINPUT);
-  
-!   if (ch < 0 || ch < 'a' || ch > 'z')        /* make test against 0 explicit */
-      {
-        rl_ding ();
-***************
-*** 1703,1707 ****
-        return 0;
-      }
-!   else if (ch < 'a' || ch > 'z')
-      {
-        rl_ding ();
---- 1745,1749 ----
-        return 0;
-      }
-!   else if (ch < 0 || ch < 'a' || ch > 'z')   /* make test against 0 explicit */
-      {
-        rl_ding ();
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 18
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 19
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-020 b/src/patches/bash/bash32-020
deleted file mode 100644 (file)
index 8c7e328..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-020
-
-Bug-Reported-by:       Ian A Watson <WATSON_IAN_A@LILLY.COM>
-Bug-Reference-ID:      <OFEC551808.69D02C7F-ON8525729A.0045708D-8525729A.0046150B@EliLilly.lilly.com>
-Bug-Reference-URL:
-
-Bug-Description:
-
-In some cases of error processing, a jump back to the top-level processing
-loop from a builtin command  would leave the shell in an inconsistent state.
-
-Patch:
-
-*** ../bash-3.2-patched/sig.c  Wed Jan 25 14:57:59 2006
---- sig.c      Sat Mar 10 11:11:30 2007
-***************
-*** 351,354 ****
---- 351,373 ----
-  #undef XHANDLER
-  
-+ /* Run some of the cleanups that should be performed when we run
-+    jump_to_top_level from a builtin command context.  XXX - might want to
-+    also call reset_parser here. */
-+ void
-+ top_level_cleanup ()
-+ {
-+   /* Clean up string parser environment. */
-+   while (parse_and_execute_level)
-+     parse_and_execute_cleanup ();
-+ 
-+ #if defined (PROCESS_SUBSTITUTION)
-+   unlink_fifo_list ();
-+ #endif /* PROCESS_SUBSTITUTION */
-+ 
-+   run_unwind_protects ();
-+   loop_level = continuing = breaking = 0;
-+   return_catch_flag = 0;
-+ }
-+ 
-  /* What to do when we've been interrupted, and it is safe to handle it. */
-  void
-*** ../bash-3.2-patched/sig.h  Wed Jan 25 14:50:27 2006
---- sig.h      Sat Mar 10 11:14:18 2007
-***************
-*** 122,125 ****
---- 122,126 ----
-  extern void initialize_terminating_signals __P((void));
-  extern void reset_terminating_signals __P((void));
-+ extern void top_level_cleanup __P((void));
-  extern void throw_to_top_level __P((void));
-  extern void jump_to_top_level __P((int)) __attribute__((__noreturn__));
-*** ../bash-3.2-patched/builtins/common.c      Tue Apr  3 16:47:13 2007
---- builtins/common.c  Mon Apr 30 15:01:33 2007
-***************
-*** 132,135 ****
---- 132,136 ----
-      {
-        builtin_error (_("too many arguments"));
-+       top_level_cleanup ();
-        jump_to_top_level (DISCARD);
-      }
-***************
-*** 396,400 ****
-           throw_to_top_level ();
-         else
-!          jump_to_top_level (DISCARD);
-       }
-        no_args (list->next);
---- 410,417 ----
-           throw_to_top_level ();
-         else
-!          {
-!            top_level_cleanup ();
-!            jump_to_top_level (DISCARD);
-!          }
-       }
-        no_args (list->next);
-*** ../bash-3.2-patched/subst.c        Tue Apr  3 16:47:19 2007
---- subst.c    Tue Jul 17 09:45:11 2007
-***************
-*** 1279,1283 ****
-        if (no_longjmp_on_fatal_error == 0)
-       {                       /* { */
-!        report_error ("bad substitution: no closing `%s' in %s", "}", string);
-         last_command_exit_value = EXECUTION_FAILURE;
-         exp_jump_to_top_level (DISCARD);
---- 1290,1294 ----
-        if (no_longjmp_on_fatal_error == 0)
-       {                       /* { */
-!        report_error (_("bad substitution: no closing `%s' in %s"), "}", string);
-         last_command_exit_value = EXECUTION_FAILURE;
-         exp_jump_to_top_level (DISCARD);
-***************
-*** 7662,7665 ****
---- 7706,7711 ----
-    expand_no_split_dollar_star = 0;   /* XXX */
-    expanding_redir = 0;
-+ 
-+   top_level_cleanup ();                      /* from sig.c */
-  
-    jump_to_top_level (v);
-***************
-*** 7880,7884 ****
-           {
-             report_error (_("no match: %s"), tlist->word->word);
-!            jump_to_top_level (DISCARD);
-           }
-         else if (allow_null_glob_expansion == 0)
---- 7927,7931 ----
-           {
-             report_error (_("no match: %s"), tlist->word->word);
-!            exp_jump_to_top_level (DISCARD);
-           }
-         else if (allow_null_glob_expansion == 0)
-*** ../bash-3.2-patched/arrayfunc.c    Thu Jul 27 09:37:59 2006
---- arrayfunc.c        Thu May 31 11:55:46 2007
-***************
-*** 619,622 ****
---- 619,624 ----
-      {
-        last_command_exit_value = EXECUTION_FAILURE;
-+ 
-+       top_level_cleanup ();      
-        jump_to_top_level (DISCARD);
-      }
-*** ../bash-3.2-patched/expr.c Wed Dec 28 17:47:03 2005
---- expr.c     Tue Apr 24 14:17:59 2007
-***************
-*** 930,933 ****
---- 930,934 ----
-       {
-         expr_unwind ();
-+        top_level_cleanup ();
-         jump_to_top_level (DISCARD);
-       }
-*** ../bash-3.2-patched/variables.c    Fri Sep  8 13:33:32 2006
---- variables.c        Tue Jul 17 09:54:59 2007
-***************
-*** 1822,1830 ****
-         lval = evalexp (oval, &expok);        /* ksh93 seems to do this */
-         if (expok == 0)
-!          jump_to_top_level (DISCARD);
-       }
-        rval = evalexp (value, &expok);
-        if (expok == 0)
-!      jump_to_top_level (DISCARD);
-        if (flags & ASS_APPEND)
-       rval += lval;
---- 1855,1869 ----
-         lval = evalexp (oval, &expok);        /* ksh93 seems to do this */
-         if (expok == 0)
-!          {
-!            top_level_cleanup ();
-!            jump_to_top_level (DISCARD);
-!          }
-       }
-        rval = evalexp (value, &expok);
-        if (expok == 0)
-!      {
-!        top_level_cleanup ();
-!        jump_to_top_level (DISCARD);
-!      }
-        if (flags & ASS_APPEND)
-       rval += lval;
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 19
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 20
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-021 b/src/patches/bash/bash32-021
deleted file mode 100644 (file)
index 003489c..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-021
-
-Bug-Reported-by:       BAGSHAW Paul RD-TECH-REN <paul.bagshaw@orange-ftgroup.com>
-Bug-Reference-ID:      <941BA0BF46DB8F4983FF7C8AFE800BC205EA7D4B@ftrdmel3.rd.francetelecom.fr>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2007-03/msg00065.html
-
-Bug-Description:
-
-When the parser read a backslash-escaped character that would be treated
-internally as an escape, it would double the number of escape characters.
-
-Patch:
-
-*** ../bash-3.2-patched/parse.y        Mon Oct 30 17:22:00 2006
---- parse.y    Sat Mar 24 17:13:20 2007
-***************
-*** 3377,3381 ****
-       {
-         pass_next_character = 0;
-!        goto got_character;
-       }
-  
---- 3377,3381 ----
-       {
-         pass_next_character = 0;
-!        goto got_escaped_character;
-       }
-  
-***************
-*** 3651,3660 ****
-      got_character:
-  
--       all_digit_token &= DIGIT (character);
--       dollar_present |= character == '$';
-- 
-        if (character == CTLESC || character == CTLNUL)
-       token[token_index++] = CTLESC;
-  
-        token[token_index++] = character;
-  
---- 3651,3662 ----
-      got_character:
-  
-        if (character == CTLESC || character == CTLNUL)
-       token[token_index++] = CTLESC;
-  
-+     got_escaped_character:
-+ 
-+       all_digit_token &= DIGIT (character);
-+       dollar_present |= character == '$';
-+ 
-        token[token_index++] = character;
-  
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 20
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 21
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-022 b/src/patches/bash/bash32-022
deleted file mode 100644 (file)
index d3679e6..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-022
-
-Bug-Reported-by:       Chet Ramey <chet.ramey@cwru.edu>
-Bug-Reference-ID:
-Bug-Reference-URL:
-
-Bug-Description:
-
-POSIX specifies that the `read' builtin invoked from an interative shell
-must prompt with $PS2 when a line is continued using a backslash while
-reading from a terminal.
-
-Patch:
-
-*** ../bash-3.2-patched/builtins/read.def      Tue Sep 19 08:45:48 2006
---- builtins/read.def  Thu May 24 16:03:30 2007
-***************
-*** 128,133 ****
-  {
-    register char *varname;
-!   int size, i, nr, pass_next, saw_escape, eof, opt, retval, code;
-!   int input_is_tty, input_is_pipe, unbuffered_read;
-    int raw, edit, nchars, silent, have_timeout, fd;
-    unsigned int tmout;
---- 131,136 ----
-  {
-    register char *varname;
-!   int size, i, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2;
-!   int input_is_tty, input_is_pipe, unbuffered_read, skip_ctlesc, skip_ctlnul;
-    int raw, edit, nchars, silent, have_timeout, fd;
-    unsigned int tmout;
-***************
-*** 135,139 ****
-    char c;
-    char *input_string, *orig_input_string, *ifs_chars, *prompt, *arrayname;
-!   char *e, *t, *t1;
-    struct stat tsb;
-    SHELL_VAR *var;
---- 138,142 ----
-    char c;
-    char *input_string, *orig_input_string, *ifs_chars, *prompt, *arrayname;
-!   char *e, *t, *t1, *ps2;
-    struct stat tsb;
-    SHELL_VAR *var;
-***************
-*** 149,152 ****
---- 152,156 ----
-    USE_VAR(i);
-    USE_VAR(pass_next);
-+   USE_VAR(print_ps2);
-    USE_VAR(saw_escape);
-    USE_VAR(input_is_pipe);
-***************
-*** 164,167 ****
---- 168,172 ----
-  #endif
-    USE_VAR(list);
-+   USE_VAR(ps2);
-  
-    i = 0;             /* Index into the string that we are reading. */
-***************
-*** 387,391 ****
-  #endif
-  
-!   for (eof = retval = 0;;)
-      {
-  #if defined (READLINE)
---- 394,399 ----
-  #endif
-  
-!   ps2 = 0;
-!   for (print_ps2 = eof = retval = 0;;)
-      {
-  #if defined (READLINE)
-***************
-*** 413,416 ****
---- 421,433 ----
-  #endif
-  
-+       if (print_ps2)
-+      {
-+        if (ps2 == 0)
-+          ps2 = get_string_value ("PS2");
-+        fprintf (stderr, "%s", ps2 ? ps2 : "");
-+        fflush (stderr);
-+        print_ps2 = 0;
-+      }
-+ 
-        if (unbuffered_read)
-       retval = zread (fd, &c, 1);
-***************
-*** 441,445 ****
-         pass_next = 0;
-         if (c == '\n')
-!          i--;                /* back up over the CTLESC */
-         else
-           goto add_char;
---- 458,466 ----
-         pass_next = 0;
-         if (c == '\n')
-!          {
-!            i--;              /* back up over the CTLESC */
-!            if (interactive && input_is_tty && raw == 0)
-!              print_ps2 = 1;
-!          }
-         else
-           goto add_char;
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 21
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 22
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-023 b/src/patches/bash/bash32-023
deleted file mode 100644 (file)
index 34a6394..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-023
-
-Bug-Reported-by:       Chet Ramey <chet.ramey@cwru.edu>
-Bug-Reference-ID:
-Bug-Reference-URL:
-
-Bug-Description:
-
-When an error occurs during the pattern removal word expansion, the shell
-can free unallocated memory or free memory multiple times.
-
-Patch:
-
-*** ../bash-3.2-patched/subst.c        Tue Apr  3 16:47:19 2007
---- subst.c    Tue Jul 17 09:45:11 2007
-***************
-*** 3975,3979 ****
-      patstr++;
-  
-!   pattern = getpattern (patstr, quoted, 1);
-  
-    temp1 = (char *)NULL;              /* shut up gcc */
---- 4008,4016 ----
-      patstr++;
-  
-!   /* Need to pass getpattern newly-allocated memory in case of expansion --
-!      the expansion code will free the passed string on an error. */
-!   temp1 = savestring (patstr);
-!   pattern = getpattern (temp1, quoted, 1);
-!   free (temp1);
-  
-    temp1 = (char *)NULL;              /* shut up gcc */
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 22
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 23
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-024 b/src/patches/bash/bash32-024
deleted file mode 100644 (file)
index 1575f37..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-024
-
-Bug-Reported-by:       Peter Volkov <torre_cremata@mail.ru>
-Bug-Reference-ID:      <1178376645.9063.25.camel@localhost>
-Bug-Reference-URL:     http://bugs.gentoo.org/177095
-
-Bug-Description:
-
-The readline display code miscalculated the screen position when performing
-a redisplay in which the new text occupies more screen space that the old,
-but takes fewer bytes to do so (e.g., when replacing a shorter string
-containing multibyte characters with a longer one containing only ASCII).
-
-Patch:
-
-*** ../bash-3.2-patched/lib/readline/display.c Thu Apr 26 11:38:22 2007
---- lib/readline/display.c     Thu Jul 12 23:10:10 2007
-***************
-*** 1519,1527 ****
-        /* Non-zero if we're increasing the number of lines. */
-        int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin;
-        /* Sometimes it is cheaper to print the characters rather than
-        use the terminal's capabilities.  If we're growing the number
-        of lines, make sure we actually cause the new line to wrap
-        around on auto-wrapping terminals. */
-!       if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl))
-       {
-         /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and
---- 1568,1596 ----
-        /* Non-zero if we're increasing the number of lines. */
-        int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin;
-+       /* If col_lendiff is > 0, implying that the new string takes up more
-+       screen real estate than the old, but lendiff is < 0, meaning that it
-+       takes fewer bytes, we need to just output the characters starting
-+       from the first difference.  These will overwrite what is on the
-+       display, so there's no reason to do a smart update.  This can really
-+       only happen in a multibyte environment. */
-+       if (lendiff < 0)
-+      {
-+        _rl_output_some_chars (nfd, temp);
-+        _rl_last_c_pos += _rl_col_width (nfd, 0, temp);
-+        /* If nfd begins before any invisible characters in the prompt,
-+           adjust _rl_last_c_pos to account for wrap_offset and set
-+           cpos_adjusted to let the caller know. */
-+        if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible))
-+          {
-+            _rl_last_c_pos -= wrap_offset;
-+            cpos_adjusted = 1;
-+          }
-+        return;
-+      }
-        /* Sometimes it is cheaper to print the characters rather than
-        use the terminal's capabilities.  If we're growing the number
-        of lines, make sure we actually cause the new line to wrap
-        around on auto-wrapping terminals. */
-!       else if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl))
-       {
-         /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 23
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 24
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-025 b/src/patches/bash/bash32-025
deleted file mode 100644 (file)
index 4d53d89..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-025
-
-Bug-Reported-by:       Tom Bjorkholm <tom.bjorkholm@ericsson.com>
-Bug-Reference-ID:      <AEA1A32F001C6B4F98614B5B80D7647D01C075E9@esealmw115.eemea.ericsson.se>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-readline/2007-04/msg00004.html
-
-Bug-Description:
-
-An off-by-one error in readline's input buffering caused readline to drop
-each 511th character of buffered input (e.g., when pasting a large amount
-of data into a terminal window).
-
-Patch:
-
-*** ../bash-3.2-patched/lib/readline/input.c   Wed Aug 16 15:15:16 2006
---- lib/readline/input.c       Tue Jul 17 09:24:21 2007
-***************
-*** 134,139 ****
-  
-    *key = ibuffer[pop_index++];
-! 
-    if (pop_index >= ibuffer_len)
-      pop_index = 0;
-  
---- 134,142 ----
-  
-    *key = ibuffer[pop_index++];
-! #if 0
-    if (pop_index >= ibuffer_len)
-+ #else
-+   if (pop_index > ibuffer_len)
-+ #endif
-      pop_index = 0;
-  
-***************
-*** 251,255 ****
-       {
-         k = (*rl_getc_function) (rl_instream);
-!        rl_stuff_char (k);
-         if (k == NEWLINE || k == RETURN)
-           break;
---- 254,259 ----
-       {
-         k = (*rl_getc_function) (rl_instream);
-!        if (rl_stuff_char (k) == 0)
-!          break;                      /* some problem; no more room */
-         if (k == NEWLINE || k == RETURN)
-           break;
-***************
-*** 374,378 ****
---- 378,386 ----
-      }
-    ibuffer[push_index++] = key;
-+ #if 0
-    if (push_index >= ibuffer_len)
-+ #else
-+   if (push_index > ibuffer_len)
-+ #endif
-      push_index = 0;
-  
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 24
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 25
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-026 b/src/patches/bash/bash32-026
deleted file mode 100644 (file)
index ba7de50..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-026
-
-Bug-Reported-by:       Chet Ramey <chet.ramey@case.edu>
-Bug-Reference-ID:
-Bug-Reference-URL:
-
-Bug-Description:
-
-This keeps the Apple linker from attempting to link bash against Apple's
-readline library "replacement" rather than the one shipped with bash.  It
-extends the configure workaround to Mac OS X Leopard (10.5).
-
-As a side effect, the patch updates the copyright date displayed in the
-version string.
-
-You must re-run configure after applying the patch, and before rebuilding
-bash.
-
-Patch:
-
-*** ../bash-3.2-patched/configure.in   2007-03-06 11:07:38.000000000 -0500
---- configure.in       2007-11-23 15:37:41.000000000 -0500
-***************
-*** 519,523 ****
-               # dynamic version
-               case "${host_os}" in
-!              darwin8*)       READLINE_LIB='${READLINE_LIBRARY}' ;;
-               *)              READLINE_LIB=-lreadline ;;
-               esac
---- 519,523 ----
-               # dynamic version
-               case "${host_os}" in
-!              darwin[[89]]*)  READLINE_LIB='${READLINE_LIBRARY}' ;;
-               *)              READLINE_LIB=-lreadline ;;
-               esac
-*** ../bash-3.2-patched/configure      2007-03-24 14:51:22.000000000 -0400
---- configure  2007-11-23 15:46:15.000000000 -0500
-***************
-*** 4872,4876 ****
-               # dynamic version
-               case "${host_os}" in
-!              darwin8*)       READLINE_LIB='${READLINE_LIBRARY}' ;;
-               *)              READLINE_LIB=-lreadline ;;
-               esac
---- 4872,4876 ----
-               # dynamic version
-               case "${host_os}" in
-!              darwin[89]*)    READLINE_LIB='${READLINE_LIBRARY}' ;;
-               *)              READLINE_LIB=-lreadline ;;
-               esac
-*** ../bash-3.2-patched/version.c      2005-05-16 11:58:34.000000000 -0400
---- version.c  2007-11-23 16:03:40.000000000 -0500
-***************
-*** 80,83 ****
-    printf ("GNU bash, version %s (%s)\n", shell_version_string (), MACHTYPE);
-    if (extended)
-!     printf (_("Copyright (C) 2005 Free Software Foundation, Inc.\n"));
-  }
---- 80,83 ----
-    printf ("GNU bash, version %s (%s)\n", shell_version_string (), MACHTYPE);
-    if (extended)
-!     printf (_("Copyright (C) 2007 Free Software Foundation, Inc.\n"));
-  }
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 25
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 26
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-027 b/src/patches/bash/bash32-027
deleted file mode 100644 (file)
index 5e110cb..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-027
-
-Bug-Reported-by:       dAniel hAhler <ubuntu@thequod.de>
-Bug-Reference-ID:      <4702ED8A.5000503@thequod.de>
-Bug-Reference-URL:     https://bugs.launchpad.net/ubuntu/+source/bash/+bug/119938
-
-Bug-Description:
-
-When updating the display after displaying, for instance, a list of possible
-completions, readline will place the cursor at the wrong position if the
-prompt contains invisible characters and a newline.
-
-Patch:
-
-*** ../bash-3.2.25/lib/readline/display.c      Mon Aug  6 14:26:29 2007
---- lib/readline/display.c     Wed Oct 10 22:43:58 2007
-***************
-*** 1049,1053 ****
-             else
-               tx = nleft;
-!            if (_rl_last_c_pos > tx)
-               {
-                 _rl_backspace (_rl_last_c_pos - tx);  /* XXX */
---- 1049,1053 ----
-             else
-               tx = nleft;
-!            if (tx >= 0 && _rl_last_c_pos > tx)
-               {
-                 _rl_backspace (_rl_last_c_pos - tx);  /* XXX */
-***************
-*** 1205,1209 ****
-  {
-    register char *ofd, *ols, *oe, *nfd, *nls, *ne;
-!   int temp, lendiff, wsatend, od, nd;
-    int current_invis_chars;
-    int col_lendiff, col_temp;
---- 1205,1209 ----
-  {
-    register char *ofd, *ols, *oe, *nfd, *nls, *ne;
-!   int temp, lendiff, wsatend, od, nd, o_cpos;
-    int current_invis_chars;
-    int col_lendiff, col_temp;
-***************
-*** 1466,1469 ****
---- 1466,1471 ----
-      }
-  
-+   o_cpos = _rl_last_c_pos;
-+ 
-    /* When this function returns, _rl_last_c_pos is correct, and an absolute
-       cursor postion in multibyte mode, but a buffer index when not in a
-***************
-*** 1475,1479 ****
-       invisible characters in the prompt string.  Let's see if setting this when
-       we make sure we're at the end of the drawn prompt string works. */
-!   if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 && _rl_last_c_pos == prompt_physical_chars)
-      cpos_adjusted = 1;
-  #endif
---- 1477,1483 ----
-       invisible characters in the prompt string.  Let's see if setting this when
-       we make sure we're at the end of the drawn prompt string works. */
-!   if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 && 
-!       (_rl_last_c_pos > 0 || o_cpos > 0) &&
-!       _rl_last_c_pos == prompt_physical_chars)
-      cpos_adjusted = 1;
-  #endif
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 26
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 27
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-028 b/src/patches/bash/bash32-028
deleted file mode 100644 (file)
index e818294..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-028
-
-Bug-Reported-by:       dAniel hAhler <ubuntu@thequod.de>
-Bug-Reference-ID:
-Bug-Reference-URL:
-
-Bug-Description:
-
-Under some circumstances, readline will incorrectly display a prompt string
-containing invisible characters after the final newline.
-
-Patch:
-
-*** ../bash-3.2-patched/lib/readline/display.c 2007-08-25 13:47:08.000000000 -0400
---- lib/readline/display.c     2007-11-10 17:51:29.000000000 -0500
-***************
-*** 392,396 ****
-        local_prompt = expand_prompt (p, &prompt_visible_length,
-                                      &prompt_last_invisible,
-!                                     (int *)NULL,
-                                      &prompt_physical_chars);
-        c = *t; *t = '\0';
---- 420,424 ----
-        local_prompt = expand_prompt (p, &prompt_visible_length,
-                                      &prompt_last_invisible,
-!                                     &prompt_invis_chars_first_line,
-                                      &prompt_physical_chars);
-        c = *t; *t = '\0';
-***************
-*** 399,403 ****
-        local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
-                                                  (int *)NULL,
-!                                                 &prompt_invis_chars_first_line,
-                                                  (int *)NULL);
-        *t = c;
---- 427,431 ----
-        local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
-                                                  (int *)NULL,
-!                                                 (int *)NULL,
-                                                  (int *)NULL);
-        *t = c;
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 27
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 28
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-029 b/src/patches/bash/bash32-029
deleted file mode 100644 (file)
index 9de2085..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-029
-
-Bug-Reported-by:       Tomas Janousek <tjanouse@redhat.com>
-Bug-Reference-ID:      <20071102104034.GA26893@redhat.com>
-Bug-Reference-URL:     https://bugzilla.redhat.com/show_bug.cgi?id=286861
-
-Bug-Description:
-
-When the bash arithmetic expression evaluator has temporarily turned off
-evalation, such as when parsing a pre- or post-decrement or -increment
-operator, and an error occurs, evaluation is not re-enabled.
-
-Patch:
-
-*** ../bash-3.2-patched/expr.c 2007-08-25 13:47:05.000000000 -0400
---- expr.c     2007-10-18 08:08:44.000000000 -0400
-***************
-*** 287,290 ****
---- 287,292 ----
-      }
-    free (expr_stack[expr_depth]);     /* free the allocated EXPR_CONTEXT */
-+ 
-+   noeval = 0;        /* XXX */
-  }
-  
-***************
-*** 320,323 ****
---- 322,326 ----
-  
-    val = 0;
-+   noeval = 0;
-  
-    FASTCOPY (evalbuf, oevalbuf, sizeof (evalbuf));
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 28
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 29
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-030 b/src/patches/bash/bash32-030
deleted file mode 100644 (file)
index 3f12c28..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-030
-
-Bug-Reported-by:       Paul Eggert <eggert@cs.ucla.edu> Andreas Schwab <schwab@suse.de>
-Bug-Reference-ID:      <877il0nu84.fsf_-_@penguin.cs.ucla.edu> <m28x5gparz.fsf@igel.home>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2007-11/msg00023.html http://lists.gnu.org/archive/html/bug-bash/2007-11/msg00022.htmlhttp://lists.gnu.org/archive/html/bug-bash/2007-11/msg00022.html
-
-Bug-Description:
-
-If redirections attached to a compound command fail, bash does not set the
-command's exit status correctly.  This only happens when the command is the
-first in a sequential list.
-
-Patch:
-
-*** ../bash-3.2-patched/execute_cmd.c  2007-03-24 14:51:05.000000000 -0400
---- execute_cmd.c      2007-11-05 22:31:14.000000000 -0500
-***************
-*** 615,619 ****
-        redirection_undo_list = (REDIRECT *)NULL;
-        dispose_exec_redirects ();
-!       return (EXECUTION_FAILURE);
-      }
-  
---- 620,624 ----
-        redirection_undo_list = (REDIRECT *)NULL;
-        dispose_exec_redirects ();
-!       return (last_command_exit_value = EXECUTION_FAILURE);
-      }
-
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 29
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 30
-  
-  #endif /* _PATCHLEVEL_H_ */
-
-  
diff --git a/src/patches/bash/bash32-031 b/src/patches/bash/bash32-031
deleted file mode 100644 (file)
index 6c96fb9..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-031
-
-Bug-Reported-by:       Miroslav Lichvar <mlichvar@redhat.com>
-Bug-Reference-ID:      Fri, 02 Nov 2007 14:07:45 +0100
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-readline/2007-11/msg00000.html
-
-Bug-Description:
-
-In certain cases when outputting characters at the end of the line,
-e.g., when displaying the prompt string, readline positions the cursor
-incorrectly if the prompt string contains invisible characters and the
-text being drawn begins before the last invisible character in the line.
-
-Patch:
-
-*** ../bash-3.2-patched/lib/readline/display.c 2007-08-25 13:47:08.000000000 -0400
---- lib/readline/display.c     2007-11-10 17:51:29.000000000 -0500
-***************
-*** 1566,1574 ****
-         else
-           {
--            /* We have horizontal scrolling and we are not inserting at
--               the end.  We have invisible characters in this line.  This
--               is a dumb update. */
-             _rl_output_some_chars (nfd, temp);
-             _rl_last_c_pos += col_temp;
-             return;
-           }
---- 1619,1632 ----
-         else
-           {
-             _rl_output_some_chars (nfd, temp);
-             _rl_last_c_pos += col_temp;
-+            /* If nfd begins before any invisible characters in the prompt,
-+               adjust _rl_last_c_pos to account for wrap_offset and set
-+               cpos_adjusted to let the caller know. */
-+            if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible))
-+              {
-+                _rl_last_c_pos -= wrap_offset;
-+                cpos_adjusted = 1;
-+              }
-             return;
-           }
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 30
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 31
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-032 b/src/patches/bash/bash32-032
deleted file mode 100644 (file)
index 5e53e29..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-032
-
-Bug-Reported-by:       Uwe Doering <gemini@geminix.org>
-Bug-Reference-ID:      <46F3DD72.2090801@geminix.org>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2007-09/msg00102.html
-
-Bug-Description:
-
-There is an off-by-one error in the code that buffers characters received
-very quickly in succession, causing characters to be dropped.
-
-Patch:
-
-*** ../bash-3.2-patched/lib/readline/input.c   2007-08-25 13:47:10.000000000 -0400
---- lib/readline/input.c       2007-10-12 22:55:25.000000000 -0400
-***************
-*** 155,159 ****
-        pop_index--;
-        if (pop_index < 0)
-!      pop_index = ibuffer_len - 1;
-        ibuffer[pop_index] = key;
-        return (1);
---- 155,159 ----
-        pop_index--;
-        if (pop_index < 0)
-!      pop_index = ibuffer_len;
-        ibuffer[pop_index] = key;
-        return (1);
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 31
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 32
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-033 b/src/patches/bash/bash32-033
deleted file mode 100644 (file)
index 0d69810..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-033
-
-Bug-Reported-by:       Christophe Martin <schplurtz@free.fr>
-Bug-Reference-ID:      <465ABA4A.3030805@free.fr>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2007-05/msg00104.html
-
-Bug-Description:
-
-References made within a function to an uninitialized local array variable
-using the [*] subscript in a double-quoted string  can result in spurious
-ASCII 127 characters in the expanded value.
-
-Patch:
-
-*** ../bash-3.2-patched/arrayfunc.c    2007-08-25 13:47:05.000000000 -0400
---- arrayfunc.c        2007-05-31 11:55:46.000000000 -0400
-***************
-*** 723,727 ****
-      {
-        if (rtype)
-!      *rtype = 1;
-        if (allow_all == 0)
-       {
---- 723,727 ----
-      {
-        if (rtype)
-!      *rtype = (t[0] == '*') ? 1 : 2;
-        if (allow_all == 0)
-       {
-*** ../bash-3.2-patched/subst.c        2007-08-25 13:47:08.000000000 -0400
---- subst.c    2007-11-14 15:43:00.000000000 -0500
-***************
-*** 4908,4915 ****
-    intmax_t arg_index;
-    SHELL_VAR *var;
-!   int atype;
-  
-    ret = 0;
-    temp = 0;
-  
-    /* Handle multiple digit arguments, as in ${11}. */  
---- 4973,4981 ----
-    intmax_t arg_index;
-    SHELL_VAR *var;
-!   int atype, rflags;
-  
-    ret = 0;
-    temp = 0;
-+   rflags = 0;
-  
-    /* Handle multiple digit arguments, as in ${11}. */  
-***************
-*** 4944,4947 ****
---- 5010,5015 ----
-                 ? quote_string (temp)
-                 : quote_escapes (temp);
-+       else if (atype == 1 && temp && QUOTED_NULL (temp) && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
-+      rflags |= W_HASQUOTEDNULL;
-      }
-  #endif
-***************
-*** 4971,4974 ****
---- 5039,5043 ----
-        ret = alloc_word_desc ();
-        ret->word = temp;
-+       ret->flags |= rflags;
-      }
-    return ret;
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 32
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 33
-  
-  #endif /* _PATCHLEVEL_H_ */
-
diff --git a/src/patches/bash/bash32-034 b/src/patches/bash/bash32-034
deleted file mode 100644 (file)
index 4f08162..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-034
-
-Bug-Reported-by:       Ian Campbell <ian.campbell@xensource.com>
-Bug-Reference-ID:      <EXCHPAFExU3l5bhn1ow00001dfe@rpc.xensource.com>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2007-10/msg00060.html
-
-Bug-Description:
-
-The bash getcwd replacement will write past the end of allocated memory
-when it allocates the buffer itself if it uses the buffer size passed as
-an argument, and that size is less than the length of the pathname.
-
-Patch:
-
-*** ../bash-3.2-patched/lib/sh/getcwd.c        2004-07-21 17:15:19.000000000 -0400
---- lib/sh/getcwd.c    2007-12-31 19:26:36.000000000 -0500
-***************
-*** 252,268 ****
-    {
-      size_t len = pathbuf + pathsize - pathp;
-      if (buf == NULL)
-        {
-!      if (len < (size_t) size)
-!        len = size;
-!      buf = (char *) malloc (len);
-       if (buf == NULL)
-         goto lose2;
-        }
-!     else if ((size_t) size < len)
-!       {
-!      errno = ERANGE;
-!      goto lose2;
-!       }
-      (void) memcpy((PTR_T) buf, (PTR_T) pathp, len);
-    }
---- 287,305 ----
-    {
-      size_t len = pathbuf + pathsize - pathp;
-+     if (buf == NULL && size <= 0)
-+       size = len;
-+ 
-+     if ((size_t) size < len)
-+       {
-+      errno = ERANGE;
-+      goto lose2;
-+       }
-      if (buf == NULL)
-        {
-!      buf = (char *) malloc (size);
-       if (buf == NULL)
-         goto lose2;
-        }
-! 
-      (void) memcpy((PTR_T) buf, (PTR_T) pathp, len);
-    }
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 33
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 34
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-035 b/src/patches/bash/bash32-035
deleted file mode 100644 (file)
index 55506ba..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-035
-
-Bug-Reported-by:       Ingo Molnar <mingo@elte.hu>
-Bug-Reference-ID:      <20071205202901.GA25202@elte.hu>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2007-12/msg00014.html
-
-Bug-Description:
-
-Bash incorrectly puts the second and subsequent children spawned by a
-shell forked to run a command substitution in the wrong process group.
-
-Patch:
-
-*** ../bash-3.2-patched/subst.c        2007-12-13 22:31:21.000000000 -0500
---- subst.c    2008-01-17 22:48:15.000000000 -0500
-***************
-*** 4621,4627 ****
-  
-  #if defined (JOB_CONTROL)
-    set_sigchld_handler ();
-    stop_making_children ();
-!   pipeline_pgrp = old_pipeline_pgrp;
-  #else
-    stop_making_children ();
---- 4721,4728 ----
-  
-  #if defined (JOB_CONTROL)
-    set_sigchld_handler ();
-    stop_making_children ();
-!   if (pid != 0)
-!     pipeline_pgrp = old_pipeline_pgrp;
-  #else
-    stop_making_children ();
-*** ../bash-3.2-patched/jobs.c 2007-08-25 13:46:59.000000000 -0400
---- jobs.c     2007-12-08 16:47:43.000000000 -0500
-***************
-*** 251,254 ****
---- 251,255 ----
-  static int set_job_status_and_cleanup __P((int));
-  
-+ static WAIT job_signal_status __P((int));
-  static WAIT raw_job_exit_status __P((int));
-  
-***************
-*** 2220,2223 ****
---- 2238,2261 ----
-  }
-  
-+ static WAIT
-+ job_signal_status (job)
-+      int job;
-+ {
-+   register PROCESS *p;
-+   WAIT s;
-+ 
-+   p = jobs[job]->pipe;
-+   do
-+     {
-+       s = p->status;
-+       if (WIFSIGNALED(s) || WIFSTOPPED(s))
-+      break;
-+       p = p->next;
-+     }
-+   while (p != jobs[job]->pipe);
-+ 
-+   return s;
-+ }
-+   
-  /* Return the exit status of the last process in the pipeline for job JOB.
-     This is the exit status of the entire job. */
-***************
-*** 2302,2310 ****
-       received, only if one of the jobs run is killed via SIGINT.  If
-       job control is not set, the job will be run in the same pgrp as
-!      the shell, and the shell will see any signals the job gets. */
-  
-    /* This is possibly a race condition -- should it go in stop_pipeline? */
-    wait_sigint_received = 0;
-!   if (job_control == 0)
-      {
-        old_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler);
---- 2343,2354 ----
-       received, only if one of the jobs run is killed via SIGINT.  If
-       job control is not set, the job will be run in the same pgrp as
-!      the shell, and the shell will see any signals the job gets.  In
-!      fact, we want this set every time the waiting shell and the waited-
-!      for process are in the same process group, including command
-!      substitution. */
-  
-    /* This is possibly a race condition -- should it go in stop_pipeline? */
-    wait_sigint_received = 0;
-!   if (job_control == 0 || (subshell_environment&SUBSHELL_COMSUB))
-      {
-        old_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler);
-***************
-*** 2452,2464 ****
-            the last process in the pipeline.  If no process exits due to a
-            signal, S is left as the status of the last job in the pipeline. */
-!        p = jobs[job]->pipe;
-!        do
-!          {
-!            s = p->status;
-!            if (WIFSIGNALED(s) || WIFSTOPPED(s))
-!              break;
-!            p = p->next;
-!          }
-!        while (p != jobs[job]->pipe);
-  
-         if (WIFSIGNALED (s) || WIFSTOPPED (s))
---- 2496,2500 ----
-            the last process in the pipeline.  If no process exits due to a
-            signal, S is left as the status of the last job in the pipeline. */
-!        s = job_signal_status (job);
-  
-         if (WIFSIGNALED (s) || WIFSTOPPED (s))
-***************
-*** 2494,2497 ****
---- 2530,2551 ----
-           }
-       }
-+       else if ((subshell_environment & SUBSHELL_COMSUB) && wait_sigint_received)
-+      {
-+        /* If waiting for a job in a subshell started to do command
-+           substitution, simulate getting and being killed by the SIGINT to
-+           pass the status back to our parent. */
-+        s = job_signal_status (job);
-+      
-+        if (WIFSIGNALED (s) && WTERMSIG (s) == SIGINT && signal_is_trapped (SIGINT) == 0)
-+          {
-+            UNBLOCK_CHILD (oset);
-+            restore_sigint_handler ();
-+            old_sigint_handler = set_signal_handler (SIGINT, SIG_DFL);
-+            if (old_sigint_handler == SIG_IGN)
-+              restore_sigint_handler ();
-+            else
-+              kill (getpid (), SIGINT);
-+          }
-+      }
-  
-        /* Moved here from set_job_status_and_cleanup, which is in the SIGCHLD
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 34
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 35
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-036 b/src/patches/bash/bash32-036
deleted file mode 100644 (file)
index ef22e60..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-036
-
-Bug-Reported-by:       Len Lattanzi <llattanzi@apple.com>
-Bug-Reference-ID:      <87493131-7AEC-4301-A684-E6CC6D06E3E1@apple.com>
-Bug-Reference-URL:
-
-Bug-Description:
-
-When initializing a subshell, bash did not reset a sentinel keeping track
-of the number of command substitutions, leading to an infinite loop if
-an error was encountered in the subshell.
-
-Patch:
-
-*** ../bash-3.2-patched/execute_cmd.c  2007-12-13 22:31:14.000000000 -0500
---- execute_cmd.c      2007-12-20 08:52:34.000000000 -0500
-***************
-*** 3881,3884 ****
---- 3916,3921 ----
-  
-    clear_unwind_protect_list (0);
-+   /* XXX -- are there other things we should be resetting here? */
-+   parse_and_execute_level = 0;               /* nothing left to restore it */
-  
-    /* We're no longer inside a shell function. */
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 35
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 36
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-037 b/src/patches/bash/bash32-037
deleted file mode 100644 (file)
index 376bd93..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-037
-
-Bug-Reported-by:       jared r r spiegel <jrrs@iorek.ice-nine.org>
-Bug-Reference-ID:      <200801152201.m0FM1lDp021260@iorek.ice-nine.org>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2008-01/msg00049.html
-
-Bug-Description:
-
-Bash inappropriately evaluates command substitutions while expanding
-directory names as part of command substitution.
-
-Patch:
-
-*** ../bash-3.2-patched/subst.c        2007-12-13 22:31:21.000000000 -0500
---- subst.c    2008-01-17 22:48:15.000000000 -0500
-***************
-*** 2815,2821 ****
-     to jump_to_top_level here so we don't endlessly loop. */
-  WORD_LIST *
-! expand_prompt_string (string, quoted)
-       char *string;
-       int quoted;
-  {
-    WORD_LIST *value;
---- 2895,2902 ----
-     to jump_to_top_level here so we don't endlessly loop. */
-  WORD_LIST *
-! expand_prompt_string (string, quoted, wflags)
-       char *string;
-       int quoted;
-+      int wflags;
-  {
-    WORD_LIST *value;
-***************
-*** 2825,2829 ****
-      return ((WORD_LIST *)NULL);
-  
-!   td.flags = 0;
-    td.word = savestring (string);
-  
---- 2906,2910 ----
-      return ((WORD_LIST *)NULL);
-  
-!   td.flags = wflags;
-    td.word = savestring (string);
-  
-*** ../bash-3.2-patched/subst.h        2007-03-24 14:51:05.000000000 -0400
---- subst.h    2008-01-17 22:46:08.000000000 -0500
-***************
-*** 136,140 ****
-  
-  /* Expand a prompt string. */
-! extern WORD_LIST *expand_prompt_string __P((char *, int));
-  
-  /* Expand STRING just as if you were expanding a word.  This also returns
---- 137,141 ----
-  
-  /* Expand a prompt string. */
-! extern WORD_LIST *expand_prompt_string __P((char *, int, int));
-  
-  /* Expand STRING just as if you were expanding a word.  This also returns
-*** ../bash-3.2-patched/parse.y        2007-08-25 13:47:06.000000000 -0400
---- parse.y    2008-01-17 22:46:30.000000000 -0500
-***************
-*** 4367,4371 ****
-      {
-        last_exit_value = last_command_exit_value;
-!       list = expand_prompt_string (result, Q_DOUBLE_QUOTES);
-        free (result);
-        result = string_list (list);
---- 4367,4371 ----
-      {
-        last_exit_value = last_command_exit_value;
-!       list = expand_prompt_string (result, Q_DOUBLE_QUOTES, 0);
-        free (result);
-        result = string_list (list);
-*** ../bash-3.2-patched/bashline.c     2006-07-29 16:39:30.000000000 -0400
---- bashline.c 2008-02-17 12:53:42.000000000 -0500
-***************
-*** 2358,2362 ****
-      {
-        new_dirname = savestring (local_dirname);
-!       wl = expand_prompt_string (new_dirname, 0);    /* does the right thing */
-        if (wl)
-       {
---- 2376,2380 ----
-      {
-        new_dirname = savestring (local_dirname);
-!       wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB);        /* does the right thing */
-        if (wl)
-       {
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 36
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 37
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-038 b/src/patches/bash/bash32-038
deleted file mode 100644 (file)
index 842b1b5..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-038
-
-Bug-Reported-by:       Wojciech Puchar <wojtek@wojtek.tensor.gdynia.pl>
-Bug-Reference-ID:      <200803131141.m2DBf9vo001136@wojtek.tensor.gdynia.pl>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2008-03/msg00029.html
-
-Bug-Description:
-
-When reading input lines into a single variable using the `read' builtin,
-bash did not free the memory it read after assigining it to the named
-variable, causing a memory leak noticable when reading large amounts of
-data.
-
-
-Patch:
-
-*** ../bash-3.2-patched/builtins/read.def      2007-08-25 13:47:07.000000000 -0400
---- builtins/read.def  2008-03-07 12:55:47.000000000 -0500
-***************
-*** 135,139 ****
-    char c;
-    char *input_string, *orig_input_string, *ifs_chars, *prompt, *arrayname;
-!   char *e, *t, *t1, *ps2;
-    struct stat tsb;
-    SHELL_VAR *var;
---- 152,156 ----
-    char c;
-    char *input_string, *orig_input_string, *ifs_chars, *prompt, *arrayname;
-!   char *e, *t, *t1, *ps2, *tofree;
-    struct stat tsb;
-    SHELL_VAR *var;
-***************
-*** 675,678 ****
---- 728,732 ----
-    /* Check whether or not the number of fields is exactly the same as the
-       number of variables. */
-+   tofree = NULL;
-    if (*input_string)
-      {
-***************
-*** 680,684 ****
-        t = get_word_from_string (&input_string, ifs_chars, &e);
-        if (*input_string == 0)
-!      input_string = t;
-        else
-       input_string = strip_trailing_ifs_whitespace (t1, ifs_chars, saw_escape);
---- 734,738 ----
-        t = get_word_from_string (&input_string, ifs_chars, &e);
-        if (*input_string == 0)
-!      tofree = input_string = t;
-        else
-       input_string = strip_trailing_ifs_whitespace (t1, ifs_chars, saw_escape);
-***************
-*** 695,698 ****
---- 749,754 ----
-      var = bind_read_variable (list->word->word, input_string);
-    stupidly_hack_special_variables (list->word->word);
-+   FREE (tofree);
-+ 
-    if (var)
-      VUNSETATTR (var, att_invisible);
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 37
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 38
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-039 b/src/patches/bash/bash32-039
deleted file mode 100644 (file)
index c225a5a..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-039
-
-Bug-Reported-by:       rew@erebor.com
-Bug-Reference-ID:      <20070119065603.546D011E9C@kansas.erebor.com>
-Bug-Reference-URL:     
-
-Bug-Description:
-
-Bash-3.2 changed the behavior of the [[ command's `=~' operator when the
-right-hand side was quoted:  it matched the quoted portions as strings.
-This patch introduces a new shell option: compat31.  When enabled, it
-restores the bash-3.1 behavior with respect to evaluating quoted arguments
-to the =~ operator.
-
-Patch:
-
-*** ../bash-3.2-patched/execute_cmd.c  2007-12-14 21:12:39.000000000 -0500
---- execute_cmd.c      2008-02-22 21:20:40.000000000 -0500
-***************
-*** 2547,2551 ****
-        if (arg1 == 0)
-       arg1 = nullstr;
-!       arg2 = cond_expand_word (cond->right->op, rmatch ? 2 : (patmatch ? 1 : 0));
-        if (arg2 == 0)
-       arg2 = nullstr;
---- 2552,2557 ----
-        if (arg1 == 0)
-       arg1 = nullstr;
-!       arg2 = cond_expand_word (cond->right->op,
-!                             (rmatch && shell_compatibility_level > 31) ? 2 : (patmatch ? 1 : 0));
-        if (arg2 == 0)
-       arg2 = nullstr;
-*** ../bash-3.2-patched/shell.h        2003-06-01 15:04:36.000000000 -0400
---- shell.h    2008-02-22 21:16:48.000000000 -0500
-***************
-*** 90,93 ****
---- 90,94 ----
-  extern int interactive, interactive_shell;
-  extern int startup_state;
-+ extern int shell_compatibility_level;
-  
-  /* Structure to pass around that holds a bitmap of file descriptors
-*** ../bash-3.2-patched/version.c      2007-12-14 21:12:29.000000000 -0500
---- version.c  2008-04-10 08:22:22.000000000 -0400
-***************
-*** 44,47 ****
---- 44,50 ----
-  const char *sccs_version = SCCSVERSION;
-  
-+ /* If == 31, shell compatible with bash-3.1, == 32 with bash-3.2, and so on */
-+ int shell_compatibility_level = 32;
-+ 
-  /* Functions for getting, setting, and displaying the shell version. */
-  
-*** ../bash-3.2-patched/builtins/shopt.def     2005-02-19 17:25:03.000000000 -0500
---- builtins/shopt.def 2008-04-10 08:13:32.000000000 -0400
-***************
-*** 102,105 ****
---- 102,107 ----
-  static int set_shellopts_after_change __P((int));
-  
-+ static int set_compatibility_level __P((int));
-+ 
-  #if defined (RESTRICTED_SHELL)
-  static int set_restricted_shell __P((int));
-***************
-*** 107,110 ****
---- 109,113 ----
-  
-  static int shopt_login_shell;
-+ static int shopt_compat31;
-  
-  typedef int shopt_set_func_t __P((int));
-***************
-*** 122,125 ****
---- 125,129 ----
-    { "cmdhist", &command_oriented_history, (shopt_set_func_t *)NULL },
-  #endif
-+   { "compat31", &shopt_compat31, set_compatibility_level },
-    { "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
-    { "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL },
-***************
-*** 460,463 ****
---- 464,479 ----
-  }
-  
-+ static int
-+ set_compatibility_level (mode)
-+      int mode;
-+ {
-+   /* Need to change logic here as we add more compatibility levels */
-+   if (shopt_compat31)
-+     shell_compatibility_level = 31;
-+   else
-+     shell_compatibility_level = 32;
-+   return 0;
-+ }
-+ 
-  #if defined (RESTRICTED_SHELL)
-  /* Don't allow the value of restricted_shell to be modified. */
-*** ../bash-3.2-patched/doc/bash.1     2006-09-28 10:26:05.000000000 -0400
---- doc/bash.1 2008-04-25 12:32:49.000000000 -0400
-***************
-*** 7978,7981 ****
---- 8200,8209 ----
-  easy re-editing of multi-line commands.
-  .TP 8
-+ .B compat31
-+ If set,
-+ .B bash
-+ changes its behavior to that of version 3.1 with respect to quoted
-+ arguments to the conditional command's =~ operator.
-+ .TP 8
-  .B dotglob
-  If set, 
-*** ../bash-20080214/doc/bashref.texi  2008-02-08 21:28:35.000000000 -0500
---- doc/bashref.texi   2008-02-22 21:44:51.000000000 -0500
-***************
-*** 4053,4056 ****
---- 4061,4069 ----
-  easy re-editing of multi-line commands.
-  
-+ @item compat31
-+ If set, Bash
-+ changes its behavior to that of version 3.1 with respect to quoted
-+ arguments to the conditional command's =~ operator.
-+ 
-  @item dotglob
-  If set, Bash includes filenames beginning with a `.' in
-*** ../bash-3.2-patched/tests/shopt.right      2005-02-19 17:46:09.000000000 -0500
---- tests/shopt.right  2008-04-28 09:13:07.000000000 -0400
-***************
-*** 7,10 ****
---- 7,11 ----
-  shopt -u checkwinsize
-  shopt -s cmdhist
-+ shopt -u compat31
-  shopt -u dotglob
-  shopt -u execfail
-***************
-*** 54,57 ****
---- 55,59 ----
-  shopt -u checkhash
-  shopt -u checkwinsize
-+ shopt -u compat31
-  shopt -u dotglob
-  shopt -u execfail
-***************
-*** 78,81 ****
---- 80,84 ----
-  checkhash            off
-  checkwinsize         off
-+ compat31             off
-  dotglob              off
-  execfail             off
-
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 38
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 39
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-040 b/src/patches/bash/bash32-040
deleted file mode 100644 (file)
index 50b85bb..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-040
-
-Bug-Reported-by:       John McCabe-Dansted
-Bug-Reference-ID:
-Bug-Reference-URL:     https://bugs.launchpad.net/ubuntu/+source/bash/+bug/202885
-
-Bug-Description:
-
-When using the `set' builtin to list all shell variables, the shell uses
-the wrong variable when computing the length of a variable's value.
-
-Patch:
-
-*** ../bash-3.2-patched/array.c        2007-03-24 14:51:03.000000000 -0400
---- array.c    2008-08-17 13:07:04.000000000 -0400
-***************
-*** 684,688 ****
-               valstr = element_value (ae) ? sh_double_quote (element_value(ae))
-                                           : (char *)NULL;
-!              elen = STRLEN (indstr) + 8 + STRLEN (valstr);
-               RESIZE_MALLOCED_BUFFER (result, rlen, (elen + 1), rsize, rsize);
-  
---- 809,813 ----
-               valstr = element_value (ae) ? sh_double_quote (element_value(ae))
-                                           : (char *)NULL;
-!              elen = STRLEN (is) + 8 + STRLEN (valstr);
-               RESIZE_MALLOCED_BUFFER (result, rlen, (elen + 1), rsize, rsize);
-  
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 39
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 40
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-041 b/src/patches/bash/bash32-041
deleted file mode 100644 (file)
index 3c05c04..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-041
-
-Bug-Reported-by:       Dan Jacobson <jidanni@jidanni.org>
-Bug-Reference-ID:      <873arjs11h.fsf@jidanni.org>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2008-02/msg00049.html
-
-Bug-Description:
-
-Bash saved and restored the value of `set -o history' while sourcing files,
-preventing users from turning off history with `set +o history' in .bashrc.
-
-Patch:
-
-*** ../bash-3.2-patched/bashhist.c     2005-12-26 13:31:16.000000000 -0500
---- bashhist.c 2008-08-17 13:07:40.000000000 -0400
-***************
-*** 81,84 ****
---- 81,85 ----
-     becomes zero when we read lines from a file, for example. */
-  int remember_on_history = 1;
-+ int enable_history_list = 1; /* value for `set -o history' */
-  
-  /* The number of lines that Bash has added to this history session.  The
-***************
-*** 235,239 ****
-    history_expansion_inhibited = 1;
-  #endif
-!   remember_on_history = interact != 0;
-    history_inhibit_expansion_function = bash_history_inhibit_expansion;
-  }
---- 236,240 ----
-    history_expansion_inhibited = 1;
-  #endif
-!   remember_on_history = enable_history_list = interact != 0;
-    history_inhibit_expansion_function = bash_history_inhibit_expansion;
-  }
-*** ../bash-3.2-patched/builtins/set.def       2006-07-27 09:41:43.000000000 -0400
---- builtins/set.def   2008-08-14 16:33:41.000000000 -0400
-***************
-*** 190,194 ****
-  #endif /* BANG_HISTORY */
-  #if defined (HISTORY)
-!   { "history",   '\0', &remember_on_history, bash_set_history, (setopt_get_func_t *)NULL },
-  #endif
-    { "ignoreeof", '\0', &ignoreeof, set_ignoreeof, (setopt_get_func_t *)NULL },
---- 198,202 ----
-  #endif /* BANG_HISTORY */
-  #if defined (HISTORY)
-!   { "history",   '\0', &enable_history_list, bash_set_history, (setopt_get_func_t *)NULL },
-  #endif
-    { "ignoreeof", '\0', &ignoreeof, set_ignoreeof, (setopt_get_func_t *)NULL },
-***************
-*** 382,385 ****
---- 390,394 ----
-    if (on_or_off == FLAG_ON)
-      {
-+       enable_history_list = 1;
-        bash_history_enable ();
-        if (history_lines_this_session == 0)
-***************
-*** 387,392 ****
-      }
-    else
-!     bash_history_disable ();
-!   return (1 - remember_on_history);
-  }
-  #endif
---- 396,404 ----
-      }
-    else
-!     {
-!       enable_history_list = 0;
-!       bash_history_disable ();
-!     }
-!   return (1 - enable_history_list);
-  }
-  #endif
-***************
-*** 566,570 ****
-  {
-  #if defined (HISTORY)
-!   remember_on_history = 1;
-  #endif
-    ignoreeof = 0;
---- 578,582 ----
-  {
-  #if defined (HISTORY)
-!   remember_on_history = enable_history_list = 1;
-  #endif
-    ignoreeof = 0;
-*** ../bash-3.2-patched/builtins/evalstring.c  2006-07-28 15:12:16.000000000 -0400
---- builtins/evalstring.c      2008-11-10 21:17:16.000000000 -0500
-***************
-*** 68,71 ****
---- 68,79 ----
-  static int cat_file __P((REDIRECT *));
-  
-+ #if defined (HISTORY)
-+ static void
-+ set_history_remembering ()
-+ {
-+   remember_on_history = enable_history_list;
-+ }
-+ #endif
-+ 
-  /* How to force parse_and_execute () to clean up after itself. */
-  void
-***************
-*** 116,120 ****
-  
-  #if defined (HISTORY)
-!   unwind_protect_int (remember_on_history);  /* can be used in scripts */
-  #  if defined (BANG_HISTORY)
-    if (interactive_shell)
---- 124,131 ----
-  
-  #if defined (HISTORY)
-!   if (parse_and_execute_level == 0)
-!     add_unwind_protect (set_history_remembering, (char *)NULL);
-!   else
-!     unwind_protect_int (remember_on_history);        /* can be used in scripts */
-  #  if defined (BANG_HISTORY)
-    if (interactive_shell)
-*** ../bash-3.2-patched/bashhist.h     2005-07-01 15:44:41.000000000 -0400
---- bashhist.h 2008-08-17 12:51:07.000000000 -0400
-***************
-*** 32,35 ****
---- 32,38 ----
-  
-  extern int remember_on_history;
-+ extern int enable_history_list;              /* value for `set -o history' */
-+ extern int literal_history;          /* controlled by `shopt lithist' */
-+ extern int force_append_history;
-  extern int history_lines_this_session;
-  extern int history_lines_in_file;
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 40
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 41
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-042 b/src/patches/bash/bash32-042
deleted file mode 100644 (file)
index 4c9f4d6..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-042
-
-Bug-Reported-by:       Archimerged Ark Submedes <archimerged@gmail.com>
-Bug-Reference-ID:      <5ba4bef00804182116g65ff71e0qdffcf672f205e708@mail.gmail.com>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2008-04/msg00041.html
-
-Bug-Description:
-
-An operator precedence error prevented the bash arithmetic evaluator from
-parsing conditional commands correctly.
-
-Patch:
-
-*** ../bash-3.2-patched/expr.c 2007-12-13 22:30:43.000000000 -0500
---- expr.c     2008-08-17 13:09:59.000000000 -0400
-***************
-*** 521,525 ****
-         noeval++;
-       }
-!       val2 = explor ();
-        if (set_noeval)
-       noeval--;
---- 521,526 ----
-         noeval++;
-       }
-! 
-!       val2 = expcond ();
-        if (set_noeval)
-       noeval--;
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 41
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 42
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-043 b/src/patches/bash/bash32-043
deleted file mode 100644 (file)
index 5a51843..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-043
-
-Bug-Reported-by:       Morita Sho <morita-pub-en-debian@inz.sakura.ne.jp>
-Bug-Reference-ID:
-Bug-Reference-URL:     http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=478096
-
-Bug-Description:
-
-Side effects caused by setting function-local versions of variables bash
-handles specially persisted after the function returned.
-
-Patch:
-
-*** ../bash-3.2-patched/variables.c    2007-08-25 13:47:05.000000000 -0400
---- variables.c        2008-11-09 17:47:31.000000000 -0500
-***************
-*** 3459,3465 ****
-       var->attributes &= ~(att_tempvar|att_propagate);
-        else
-!         shell_variables->flags |= VC_HASTMPVAR;
-        v->attributes |= var->attributes;
-      }
-  
-    dispose_variable (var);
---- 3771,3779 ----
-       var->attributes &= ~(att_tempvar|att_propagate);
-        else
-!      shell_variables->flags |= VC_HASTMPVAR;
-        v->attributes |= var->attributes;
-      }
-+   else
-+     stupidly_hack_special_variables (var->name);     /* XXX */
-  
-    dispose_variable (var);
-***************
-*** 3548,3551 ****
---- 3862,3867 ----
-        v->attributes |= var->attributes;
-      }
-+   else
-+     stupidly_hack_special_variables (var->name);     /* XXX */
-  
-    dispose_variable (var);
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 42
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 43
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-044 b/src/patches/bash/bash32-044
deleted file mode 100644 (file)
index 3e7a392..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-044
-
-Bug-Reported-by:       slinkp <stuff@slinkp.com>
-Bug-Reference-ID:      <da52a26a-9f38-4861-a918-14d3482b539d@c65g2000hsa.googlegroups.com>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2008-05/msg00085.html
-
-Bug-Description:
-
-The presence of invisible characters in a prompt longer than the screenwidth
-with invisible characters on the first and last prompt lines caused readline
-to place the cursor in the wrong physical location.
-
-Patch:
-
-*** ../bash-3.2-patched/lib/readline/display.c 2007-12-14 21:12:40.000000000 -0500
---- lib/readline/display.c     2008-10-23 09:39:46.000000000 -0400
-***************
-*** 911,914 ****
---- 944,951 ----
-            OFFSET (which has already been calculated above).  */
-  
-+ #define INVIS_FIRST()        (prompt_physical_chars > _rl_screenwidth ? prompt_invis_chars_first_line : wrap_offset)
-+ #define WRAP_OFFSET(line, offset)  ((line == 0) \
-+                                      ? (offset ? INVIS_FIRST() : 0) \
-+                                      : ((line == prompt_last_screen_line) ? wrap_offset-prompt_invis_chars_first_line : 0))
-  #define W_OFFSET(line, offset) ((line) == 0 ? offset : 0)
-  #define VIS_LLEN(l)  ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] - vis_lbreaks[l]))
-***************
-*** 945,949 ****
-                 _rl_last_c_pos > wrap_offset &&
-                 o_cpos < prompt_last_invisible)
-!              _rl_last_c_pos -= wrap_offset;
-                 
-             /* If this is the line with the prompt, we might need to
---- 982,992 ----
-                 _rl_last_c_pos > wrap_offset &&
-                 o_cpos < prompt_last_invisible)
-!              _rl_last_c_pos -= prompt_invis_chars_first_line;        /* XXX - was wrap_offset */
-!            else if (linenum == prompt_last_screen_line && prompt_physical_chars > _rl_screenwidth &&
-!                      (MB_CUR_MAX > 1 && rl_byte_oriented == 0) &&
-!                      cpos_adjusted == 0 &&
-!                      _rl_last_c_pos != o_cpos &&
-!                      _rl_last_c_pos > (prompt_last_invisible - _rl_screenwidth - prompt_invis_chars_first_line))
-!              _rl_last_c_pos -= (wrap_offset-prompt_invis_chars_first_line);
-                 
-             /* If this is the line with the prompt, we might need to
-***************
-*** 1205,1209 ****
-  {
-    register char *ofd, *ols, *oe, *nfd, *nls, *ne;
-!   int temp, lendiff, wsatend, od, nd, o_cpos;
-    int current_invis_chars;
-    int col_lendiff, col_temp;
---- 1264,1268 ----
-  {
-    register char *ofd, *ols, *oe, *nfd, *nls, *ne;
-!   int temp, lendiff, wsatend, od, nd, twidth, o_cpos;
-    int current_invis_chars;
-    int col_lendiff, col_temp;
-***************
-*** 1221,1225 ****
-      temp = _rl_last_c_pos;
-    else
-!     temp = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset);
-    if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode
-       && _rl_last_v_pos == current_line - 1)
---- 1280,1284 ----
-      temp = _rl_last_c_pos;
-    else
-!     temp = _rl_last_c_pos - WRAP_OFFSET (_rl_last_v_pos, visible_wrap_offset);
-    if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode
-       && _rl_last_v_pos == current_line - 1)
-***************
-*** 1587,1599 ****
-           {
-             _rl_output_some_chars (nfd + lendiff, temp - lendiff);
-- #if 1
-            /* XXX -- this bears closer inspection.  Fixes a redisplay bug
-               reported against bash-3.0-alpha by Andreas Schwab involving
-               multibyte characters and prompt strings with invisible
-               characters, but was previously disabled. */
-!            _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-col_lendiff);
-! #else
-!            _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-lendiff);
-! #endif
-           }
-       }
---- 1648,1660 ----
-           {
-             _rl_output_some_chars (nfd + lendiff, temp - lendiff);
-            /* XXX -- this bears closer inspection.  Fixes a redisplay bug
-               reported against bash-3.0-alpha by Andreas Schwab involving
-               multibyte characters and prompt strings with invisible
-               characters, but was previously disabled. */
-!            if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
-!              twidth = _rl_col_width (nfd+lendiff, 0, temp-col_lendiff);
-!            else
-!              twidth = temp - lendiff;
-!            _rl_last_c_pos += twidth;
-           }
-       }
-***************
-*** 1789,1793 ****
-    int cpos, dpos;            /* current and desired cursor positions */
-  
-!   woff = W_OFFSET (_rl_last_v_pos, wrap_offset);
-    cpos = _rl_last_c_pos;
-  #if defined (HANDLE_MULTIBYTE)
---- 1850,1854 ----
-    int cpos, dpos;            /* current and desired cursor positions */
-  
-!   woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset);
-    cpos = _rl_last_c_pos;
-  #if defined (HANDLE_MULTIBYTE)
-***************
-*** 1803,1807 ****
-        prompt string, since they're both buffer indices and DPOS is a
-        desired display position. */
-!       if (new > prompt_last_invisible)               /* XXX - don't use woff here */
-       {
-         dpos -= woff;
---- 1864,1872 ----
-        prompt string, since they're both buffer indices and DPOS is a
-        desired display position. */
-!       if ((new > prompt_last_invisible) ||           /* XXX - don't use woff here */
-!        (prompt_physical_chars > _rl_screenwidth &&
-!         _rl_last_v_pos == prompt_last_screen_line &&
-!         wrap_offset != woff &&
-!         new > (prompt_last_invisible-_rl_screenwidth-wrap_offset)))
-       {
-         dpos -= woff;
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 43
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 44
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-045 b/src/patches/bash/bash32-045
deleted file mode 100644 (file)
index 68b91ff..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-045
-
-Bug-Reported-by:       Roman Rakus <rrakus@redhat.com>
-Bug-Reference-ID:      <4864B4A0.1060402@redhat.com>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2008-06/msg00098.html
-
-Bug-Description:
-
-When short-circuiting execution due to the `break' or `continue' builtins,
-bash did not preserve the value of $?.
-
-Patch:
-
-*** ../bash-3.2-patched/execute_cmd.c  2008-04-28 22:00:24.000000000 -0400
---- execute_cmd.c      2008-10-18 14:35:03.000000000 -0400
-***************
-*** 502,507 ****
---- 514,526 ----
-    volatile int save_line_number;
-  
-+ #if 0
-    if (command == 0 || breaking || continuing || read_but_dont_execute)
-      return (EXECUTION_SUCCESS);
-+ #else
-+   if (breaking || continuing)
-+     return (last_command_exit_value);
-+   if (command == 0 || read_but_dont_execute)
-+     return (EXECUTION_SUCCESS);
-+ #endif
-  
-    QUIT;
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 44
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 45
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-046 b/src/patches/bash/bash32-046
deleted file mode 100644 (file)
index 78aaf01..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-046
-
-Bug-Reported-by:       Wang Xin <wxinee@gmail.com>
-Bug-Reference-ID:      <9a73e1570807062042ide16698m10e1b18036c95592@mail.gmail.com>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2008-07/msg00014.html
-
-Bug-Description:
-
-Bash did not compute the length of multibyte characters correctly when
-performing array element length references (e.g., ${#var[subscript]}).
-
-Patch:
-
-*** /usr/src/local/bash/bash-3.2-patched/subst.c       2008-04-28 22:00:20.000000000 -0400
---- subst.c    2008-11-10 22:02:38.000000000 -0500
-***************
-*** 4813,4817 ****
-      t = (ind == 0) ? value_cell (var) : (char *)NULL;
-  
-!   len = STRLEN (t);
-    return (len);
-  }
---- 4813,4817 ----
-      t = (ind == 0) ? value_cell (var) : (char *)NULL;
-  
-!   len = MB_STRLEN (t);
-    return (len);
-  }
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 45
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 46
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-047 b/src/patches/bash/bash32-047
deleted file mode 100644 (file)
index b8272b1..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-047
-
-Bug-Reported-by:       Roman Rakus <rrakus@redhat.com>
-Bug-Reference-ID:      <48A89EBC.906@redhat.com>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2008-08/msg00026.html
-
-Bug-Description:
-
-When using the `.' (source) builtin, under certain circumstances bash was
-too careful in discarding state to preserve internal consistency.  One
-effect was that assignments to readonly variables would cause entire scripts
-to be aborted instead of execution of the offending command.  This behavior
-was introduced by bash-3.2 patch 20.
-
-Patch:
-
-*** /usr/src/local/chet/src/bash/bash-3.2-patched/subst.c      2008-04-29 21:24:55.000000000 -0400
---- subst.c    2008-11-13 17:44:25.000000000 -0500
-***************
-*** 138,142 ****
-  extern int last_command_exit_value, last_command_exit_signal;
-  extern int subshell_environment;
-! extern int subshell_level;
-  extern int eof_encountered;
-  extern int return_catch_flag, return_catch_value;
---- 138,142 ----
-  extern int last_command_exit_value, last_command_exit_signal;
-  extern int subshell_environment;
-! extern int subshell_level, parse_and_execute_level;
-  extern int eof_encountered;
-  extern int return_catch_flag, return_catch_value;
-***************
-*** 7673,7677 ****
-    expanding_redir = 0;
-  
-!   top_level_cleanup ();                      /* from sig.c */
-  
-    jump_to_top_level (v);
---- 7673,7679 ----
-    expanding_redir = 0;
-  
-!   if (parse_and_execute_level == 0)
-!     top_level_cleanup ();                    /* from sig.c */
-! 
-  
-    jump_to_top_level (v);
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 46
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 47
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-048 b/src/patches/bash/bash32-048
deleted file mode 100644 (file)
index 551dade..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-048
-
-Bug-Reported-by:       Steffen Kiess <s-kiess@web.de>
-Bug-Reference-ID:      <1223929957.5383.6.camel@fips>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2008-10/msg00047.html
-
-Bug-Description:
-
-When invoked as `bash -c', bash did not execute an EXIT trap when the last
-command in the executed list was a command run from the file system.
-
-Patch:
-
-*** /Users/chet/src/bash/bash-3.2-patched/builtins/evalstring.c        2006-07-28 15:12:16.000000000 -0400
---- builtins/evalstring.c      2008-11-13 18:38:45.000000000 -0500
-***************
-*** 249,252 ****
---- 249,253 ----
-              *   we're not running a trap AND
-              *   we have parsed the full command (string == '\0') AND
-+             *   we're not going to run the exit trap AND
-              *   we have a simple command without redirections AND
-              *   the command is not being timed AND
-***************
-*** 259,263 ****
-                 *bash_input.location.string == '\0' &&
-                 command->type == cm_simple &&
-!                !command->redirects && !command->value.Simple->redirects &&
-                 ((command->flags & CMD_TIME_PIPELINE) == 0) &&
-                 ((command->flags & CMD_INVERT_RETURN) == 0))
---- 260,265 ----
-                 *bash_input.location.string == '\0' &&
-                 command->type == cm_simple &&
-!                signal_is_trapped (EXIT_TRAP) == 0 &&
-!                command->redirects == 0 && command->value.Simple->redirects == 0 &&
-                 ((command->flags & CMD_TIME_PIPELINE) == 0) &&
-                 ((command->flags & CMD_INVERT_RETURN) == 0))
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 47
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 48
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-049 b/src/patches/bash/bash32-049
deleted file mode 100644 (file)
index 469c4c8..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-049
-
-Bug-Reported-by:       Len Lattanzi <llattanzi@apple.com>
-Bug-Reference-ID:      <52B1297F-6675-45CC-B63E-24745337D006@apple.com>
-Bug-Reference-URL:     
-
-Bug-Description:
-
-On systems where mbrtowc() returns -2 when passed a length argument with
-value 0, when using a multibyte locale, Readline's emacs-mode forward-char
-at the end of a line will leave the point beyond the end of the line.
-
-Patch:
-
-*** ../bash-3.2-patched/lib/readline/mbutil.c  2009-05-29 23:09:26.000000000 -0400
---- lib/readline/mbutil.c      2009-05-29 23:10:12.000000000 -0400
-***************
-*** 78,82 ****
-       int seed, count, find_non_zero;
-  {
-!   size_t tmp;
-    mbstate_t ps;
-    int point;
---- 78,82 ----
-       int seed, count, find_non_zero;
-  {
-!   size_t tmp, len;
-    mbstate_t ps;
-    int point;
-***************
-*** 99,103 ****
-    while (count > 0)  
-      {
-!       tmp = mbrtowc (&wc, string+point, strlen(string + point), &ps);
-        if (MB_INVALIDCH ((size_t)tmp))
-       {
---- 99,106 ----
-    while (count > 0)  
-      {
-!       len = strlen (string + point);
-!       if (len == 0)
-!      break;
-!       tmp = mbrtowc (&wc, string+point, len, &ps);
-        if (MB_INVALIDCH ((size_t)tmp))
-       {
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 48
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 49
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-050 b/src/patches/bash/bash32-050
deleted file mode 100644 (file)
index aef537e..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-050
-
-Bug-Reported-by:       Jan Hnatek <Jan.Hnatek@Sun.COM>
-Bug-Reference-ID:      <4A44991F.8010005@sun.com>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2009-06/msg00084.html
-
-Bug-Description:
-
-On systems where mbrtowc() returns -2 when passed a length argument with
-value 0, when using a multibyte locale, Readline's emacs-mode forward-char
-at the end of a line will leave the point beyond the end of the line.
-
-Patch:
-
-*** ../bash-3.2-patched/lib/readline/mbutil.c  2009-06-16 11:26:50.000000000 -0400
---- lib/readline/mbutil.c      2009-01-04 14:32:33.000000000 -0500
-***************
-*** 132,141 ****
-      {
-        tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
-!       while (tmp > 0 && wcwidth (wc) == 0)
-       {
-         point += tmp;
-         tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
--        if (MB_NULLWCH (tmp) || MB_INVALIDCH (tmp))
--          break;
-       }
-      }
---- 130,137 ----
-      {
-        tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
-!       while (MB_NULLWCH (tmp) == 0 && MB_INVALIDCH (tmp) == 0 && wcwidth (wc) == 0)
-       {
-         point += tmp;
-         tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
-       }
-      }
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 49
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 50
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash32-051 b/src/patches/bash/bash32-051
deleted file mode 100644 (file)
index 404fbd6..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-                            BASH PATCH REPORT
-                            =================
-
-Bash-Release: 3.2
-Patch-ID: bash32-051
-
-Bug-Reported-by:       werner@suse.de
-Bug-Reference-ID:      <201002251238.o1PCcYcg016893@boole.suse.de>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2010-02/msg00132.html
-
-Bug-Description:
-
-When the `read' builtin times out after the timeout specified with -t is
-exceeded, it does not reset the flags that tell signal handlers to process
-signals immediately instead of deferring their handling.  This can result
-in unsafe functions being called from signal handlers, which can cause bash
-to hang or dump core.
-
-Patch:
-
-*** ../bash-3.2-patched/builtins/read.def      2008-04-29 21:25:00.000000000 -0400
---- builtins/read.def  2010-03-17 09:50:51.000000000 -0400
-***************
-*** 327,330 ****
---- 327,332 ----
-        if (code)
-       {
-+        interrupt_immediately--;
-+        terminate_immediately = 0;
-         run_unwind_frame ("read_builtin");
-         return (EXECUTION_FAILURE);
-*** ../bash-3.2/patchlevel.h   Thu Apr 13 08:31:04 2006
---- patchlevel.h       Mon Oct 16 14:22:54 2006
-***************
-*** 26,30 ****
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 50
-  
-  #endif /* _PATCHLEVEL_H_ */
---- 26,30 ----
-     looks for to find the patch level (for the sccs version string). */
-  
-! #define PATCHLEVEL 51
-  
-  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-001 b/src/patches/bash/bash43-001
new file mode 100644 (file)
index 0000000..ea1c6b2
--- /dev/null
@@ -0,0 +1,58 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-001
+
+Bug-Reported-by:       NBaH <nbah@sfr.fr>
+Bug-Reference-ID:      <ler0b5$iu9$1@speranza.aioe.org>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-02/msg00092.html
+
+Bug-Description:
+
+A missing check for a valid option prevented `test -R' from working.  There
+is another problem that causes bash to look up the wrong variable name when
+processing the argument to `test -R'.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-4.3/test.c 2014-02-04 16:52:58.000000000 -0500
+--- test.c     2014-02-28 21:22:44.000000000 -0500
+***************
+*** 647,652 ****
+  
+      case 'R':
+!       v = find_variable (arg);
+!       return (v && invisible_p (v) == 0 && var_isset (v) && nameref_p (v) ? TRUE : FALSE);
+      }
+  
+--- 647,652 ----
+  
+      case 'R':
+!       v = find_variable_noref (arg);
+!       return ((v && invisible_p (v) == 0 && var_isset (v) && nameref_p (v)) ? TRUE : FALSE);
+      }
+  
+***************
+*** 724,727 ****
+--- 724,728 ----
+      case 'u': case 'v': case 'w': case 'x': case 'z':
+      case 'G': case 'L': case 'O': case 'S': case 'N':
++     case 'R':
+        return (1);
+      }
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 0
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 1
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-002 b/src/patches/bash/bash43-002
new file mode 100644 (file)
index 0000000..735b7b8
--- /dev/null
@@ -0,0 +1,62 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-002
+
+Bug-Reported-by:       Moe Tunes <moetunes42@gmail.com>
+Bug-Reference-ID:      <53103F49.3070100@gmail.com>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-02/msg00086.html
+
+Bug-Description:
+
+A change to save state while running the DEBUG trap caused pipelines to hang
+on systems which need process group synchronization while building pipelines.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-4.3/trap.c 2014-02-05 10:03:21.000000000 -0500
+--- trap.c     2014-02-28 09:51:43.000000000 -0500
+***************
+*** 921,925 ****
+  
+  #if defined (JOB_CONTROL)
+!       save_pipeline (1);     /* XXX only provides one save level */
+  #endif
+  
+--- 921,926 ----
+  
+  #if defined (JOB_CONTROL)
+!       if (sig != DEBUG_TRAP) /* run_debug_trap does this */
+!      save_pipeline (1);      /* XXX only provides one save level */
+  #endif
+  
+***************
+*** 941,945 ****
+  
+  #if defined (JOB_CONTROL)
+!       restore_pipeline (1);
+  #endif
+  
+--- 942,947 ----
+  
+  #if defined (JOB_CONTROL)
+!       if (sig != DEBUG_TRAP) /* run_debug_trap does this */
+!      restore_pipeline (1);
+  #endif
+  
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 1
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 2
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-003 b/src/patches/bash/bash43-003
new file mode 100644 (file)
index 0000000..0f32f41
--- /dev/null
@@ -0,0 +1,48 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-003
+
+Bug-Reported-by:       Anatol Pomozov <anatol.pomozov@gmail.com>
+Bug-Reference-ID:      <CAOMFOmXy3mT2So5GQ5F-smCVArQuAeBwZ2QKzgCtMeXJoDeYOQ@mail.gmail.com>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-readline/2014-03/msg00010.html
+
+Bug-Description:
+
+When in callback mode, some readline commands can cause readline to seg
+fault by passing invalid contexts to callback functions.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-4.3/lib/readline/readline.c        2013-10-28 14:58:06.000000000 -0400
+--- lib/readline/readline.c    2014-03-10 14:15:02.000000000 -0400
+***************
+*** 745,749 ****
+  
+    RL_CHECK_SIGNALS ();
+!   if (r == 0)                        /* success! */
+      {
+        _rl_keyseq_chain_dispose ();
+--- 745,750 ----
+  
+    RL_CHECK_SIGNALS ();
+!   /* We only treat values < 0 specially to simulate recursion. */
+!   if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0))        /* success! or failure! */
+      {
+        _rl_keyseq_chain_dispose ();
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 2
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 3
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-004 b/src/patches/bash/bash43-004
new file mode 100644 (file)
index 0000000..010f04a
--- /dev/null
@@ -0,0 +1,47 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-004
+
+Bug-Reported-by:       Daan van Rossum <daan@flash.uchicago.edu>
+Bug-Reference-ID:      <20140307072523.GA14250@flash.uchicago.edu>
+Bug-Reference-URL:     
+
+Bug-Description:
+
+The `.' command in vi mode cannot undo multi-key commands beginning with
+`c', `d', and `y' (command plus motion specifier).
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-4.3/lib/readline/readline.c        2013-10-28 14:58:06.000000000 -0400
+--- lib/readline/readline.c    2014-03-07 15:20:33.000000000 -0500
+***************
+*** 965,969 ****
+    if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
+        key != ANYOTHERKEY &&
+!       rl_key_sequence_length == 1 && /* XXX */
+        _rl_vi_textmod_command (key))
+      _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
+--- 965,969 ----
+    if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
+        key != ANYOTHERKEY &&
+!       _rl_dispatching_keymap == vi_movement_keymap &&
+        _rl_vi_textmod_command (key))
+      _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 3
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 4
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-005 b/src/patches/bash/bash43-005
new file mode 100644 (file)
index 0000000..bcd4069
--- /dev/null
@@ -0,0 +1,63 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-005
+
+Bug-Reported-by:       David Sines <dave.gma@googlemail.com>
+Bug-Reference-ID:      <CAO3BAa_CK_Rgkhdfzs+NJ4KFYdB9qW3pvXQK0xLCi6GMmDU8bw@mail.gmail.com>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00037.html
+
+Bug-Description:
+
+When in Posix mode, bash did not correctly interpret the ANSI-C-style
+$'...' quoting mechanism when performing pattern substitution word
+expansions within double quotes.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-4.3/parse.y        2014-02-11 09:42:10.000000000 -0500
+--- parse.y    2014-03-07 20:57:15.000000000 -0500
+***************
+*** 3399,3403 ****
+           unescaped double-quotes or single-quotes, if any, shall occur." */
+        /* This was changed in Austin Group Interp 221 */
+!       if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
+       continue;
+  
+--- 3399,3403 ----
+           unescaped double-quotes or single-quotes, if any, shall occur." */
+        /* This was changed in Austin Group Interp 221 */
+!       if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
+       continue;
+  
+*** ../bash-4.3/y.tab.c        2014-02-11 10:57:47.000000000 -0500
+--- y.tab.c    2014-03-28 10:41:15.000000000 -0400
+***************
+*** 5711,5715 ****
+           unescaped double-quotes or single-quotes, if any, shall occur." */
+        /* This was changed in Austin Group Interp 221 */
+!       if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
+       continue;
+  
+--- 5711,5715 ----
+           unescaped double-quotes or single-quotes, if any, shall occur." */
+        /* This was changed in Austin Group Interp 221 */
+!       if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
+       continue;
+  
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 4
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 5
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-006 b/src/patches/bash/bash43-006
new file mode 100644 (file)
index 0000000..24ff057
--- /dev/null
@@ -0,0 +1,48 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-006
+
+Bug-Reported-by:       Eduardo A . Bustamante Lopez <dualbus@gmail.com>
+Bug-Reference-ID:      <20140228170013.GA16015@dualbus.me>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-02/msg00091.html
+
+Bug-Description:
+
+A shell that started with job control active but was not interactive left
+the terminal in the wrong process group when exiting, causing its parent
+shell to get a stop signal when it attempted to read from the terminal.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-4.3/jobs.c 2014-01-10 09:05:34.000000000 -0500
+--- jobs.c     2014-03-02 18:05:09.000000000 -0500
+***************
+*** 4375,4379 ****
+  end_job_control ()
+  {
+!   if (interactive_shell)             /* XXX - should it be interactive? */
+      {
+        terminate_stopped_jobs ();
+--- 4375,4379 ----
+  end_job_control ()
+  {
+!   if (interactive_shell || job_control)              /* XXX - should it be just job_control? */
+      {
+        terminate_stopped_jobs ();
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 5
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 6
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-007 b/src/patches/bash/bash43-007
new file mode 100644 (file)
index 0000000..0d62c9e
--- /dev/null
@@ -0,0 +1,50 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-007
+
+Bug-Reported-by:       geir.hauge@gmail.com
+Bug-Reference-ID:      <20140318093650.B181C1C5B0B@gina.itea.ntnu.no>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00095.html
+
+Bug-Description:
+
+Using compound assignments for associative arrays like
+
+assoc=( [x]= [y]=bar )
+
+left the value corresponding to the key `x' NULL.  This caused subsequent
+lookups to interpret it as unset.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-4.3/arrayfunc.c    2013-08-02 16:19:59.000000000 -0400
+--- arrayfunc.c        2014-03-18 11:08:15.000000000 -0400
+***************
+*** 598,601 ****
+--- 598,606 ----
+       {
+         val = expand_assignment_string_to_string (val, 0);
++        if (val == 0)
++          {
++            val = (char *)xmalloc (1);
++            val[0] = '\0';    /* like do_assignment_internal */
++          }
+         free_val = 1;
+       }
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 6
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 7
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-008 b/src/patches/bash/bash43-008
new file mode 100644 (file)
index 0000000..0ae7c95
--- /dev/null
@@ -0,0 +1,188 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-008
+
+Bug-Reported-by:       Stephane Chazelas <stephane.chazelas@gmail.com>
+Bug-Reference-ID:      <20140318135901.GB22158@chaz.gmail.com>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00098.html
+
+Bug-Description:
+
+Some extended glob patterns incorrectly matched filenames with a leading
+dot, regardless of the setting of the `dotglob' option.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-4.3/lib/glob/gmisc.c       2013-10-28 14:45:25.000000000 -0400
+--- lib/glob/gmisc.c   2014-03-19 09:16:08.000000000 -0400
+***************
+*** 211,214 ****
+--- 211,215 ----
+      case '!':
+      case '@':
++     case '?':
+        return (pat[1] == LPAREN);
+      default:
+*** ../bash-4.3/lib/glob/glob.c        2014-01-31 21:43:51.000000000 -0500
+--- lib/glob/glob.c    2014-03-20 09:01:26.000000000 -0400
+***************
+*** 180,202 ****
+       int flags;
+  {
+!   char *pp, *pe, *t;
+!   int n, r;
+  
+    pp = pat + 2;
+!   pe = pp + strlen (pp) - 1; /*(*/
+!   if (*pe != ')')
+!     return 0;
+!   if ((t = strchr (pp, '|')) == 0)   /* easy case first */
+      {
+        *pe = '\0';
+        r = skipname (pp, dname, flags);       /*(*/
+        *pe = ')';
+        return r;
+      }
+    while (t = glob_patscan (pp, pe, '|'))
+      {
+        n = t[-1];
+        t[-1] = '\0';
+        r = skipname (pp, dname, flags);
+        t[-1] = n;
+        if (r == 0)    /* if any pattern says not skip, we don't skip */
+--- 180,215 ----
+       int flags;
+  {
+!   char *pp, *pe, *t, *se;
+!   int n, r, negate;
+  
++   negate = *pat == '!';
+    pp = pat + 2;
+!   se = pp + strlen (pp) - 1;         /* end of string */
+!   pe = glob_patscan (pp, se, 0);     /* end of extglob pattern (( */
+!   /* we should check for invalid extglob pattern here */
+!   /* if pe != se we have more of the pattern at the end of the extglob
+!      pattern. Check the easy case first ( */
+!   if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0)
+      {
+        *pe = '\0';
++ #if defined (HANDLE_MULTIBYTE)
++       r = mbskipname (pp, dname, flags);
++ #else
+        r = skipname (pp, dname, flags);       /*(*/
++ #endif
+        *pe = ')';
+        return r;
+      }
++ 
++   /* check every subpattern */
+    while (t = glob_patscan (pp, pe, '|'))
+      {
+        n = t[-1];
+        t[-1] = '\0';
++ #if defined (HANDLE_MULTIBYTE)
++       r = mbskipname (pp, dname, flags);
++ #else
+        r = skipname (pp, dname, flags);
++ #endif
+        t[-1] = n;
+        if (r == 0)    /* if any pattern says not skip, we don't skip */
+***************
+*** 205,219 ****
+      }        /*(*/
+  
+!   if (pp == pe)              /* glob_patscan might find end of pattern */
+      return r;
+  
+!   *pe = '\0';
+! #  if defined (HANDLE_MULTIBYTE)
+!   r = mbskipname (pp, dname, flags); /*(*/
+! #  else
+!   r = skipname (pp, dname, flags);   /*(*/
+! #  endif
+!   *pe = ')';
+!   return r;
+  }
+  #endif
+--- 218,227 ----
+      }        /*(*/
+  
+!   /* glob_patscan might find end of pattern */
+!   if (pp == se)
+      return r;
+  
+!   /* but if it doesn't then we didn't match a leading dot */
+!   return 0;
+  }
+  #endif
+***************
+*** 278,289 ****
+  {
+  #if EXTENDED_GLOB
+!   wchar_t *pp, *pe, *t, n;
+!   int r;
+  
+    pp = pat + 2;
+!   pe = pp + wcslen (pp) - 1; /*(*/
+!   if (*pe != L')')
+!     return 0;
+!   if ((t = wcschr (pp, L'|')) == 0)
+      {
+        *pe = L'\0';
+--- 286,298 ----
+  {
+  #if EXTENDED_GLOB
+!   wchar_t *pp, *pe, *t, n, *se;
+!   int r, negate;
+  
++   negate = *pat == L'!';
+    pp = pat + 2;
+!   se = pp + wcslen (pp) - 1; /*(*/
+!   pe = glob_patscan_wc (pp, se, 0);
+! 
+!   if (pe == se && *pe == ')' && (t = wcschr (pp, L'|')) == 0)
+      {
+        *pe = L'\0';
+***************
+*** 292,295 ****
+--- 301,306 ----
+        return r;
+      }
++ 
++   /* check every subpattern */
+    while (t = glob_patscan_wc (pp, pe, '|'))
+      {
+***************
+*** 306,313 ****
+      return r;
+  
+!   *pe = L'\0';
+!   r = wchkname (pp, dname);  /*(*/
+!   *pe = L')';
+!   return r;
+  #else
+    return (wchkname (pat, dname));
+--- 317,322 ----
+      return r;
+  
+!   /* but if it doesn't then we didn't match a leading dot */
+!   return 0;
+  #else
+    return (wchkname (pat, dname));
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 7
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 8
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-009 b/src/patches/bash/bash43-009
new file mode 100644 (file)
index 0000000..015835c
--- /dev/null
@@ -0,0 +1,64 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-009
+
+Bug-Reported-by:       Matthias Klose <doko@debian.org>
+Bug-Reference-ID:      <53346FC8.6090005@debian.org>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00171.html
+
+Bug-Description:
+
+There is a problem with unsigned sign extension when attempting to reallocate
+the input line when it is fewer than 3 characters long and there has been a
+history expansion.  The sign extension causes the shell to not reallocate the
+line, which results in a segmentation fault when it writes past the end.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-4.3-patched/parse.y        2014-02-11 09:42:10.000000000 -0500
+--- parse.y    2014-03-27 16:33:29.000000000 -0400
+***************
+*** 2425,2429 ****
+        if (shell_input_line_terminator != EOF)
+       {
+!        if (shell_input_line_size < SIZE_MAX && shell_input_line_len > shell_input_line_size - 3)
+           shell_input_line = (char *)xrealloc (shell_input_line,
+                                       1 + (shell_input_line_size += 2));
+--- 2425,2429 ----
+        if (shell_input_line_terminator != EOF)
+       {
+!        if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size))
+           shell_input_line = (char *)xrealloc (shell_input_line,
+                                       1 + (shell_input_line_size += 2));
+*** ../bash-4.3-patched/y.tab.c        2014-03-28 11:17:06.000000000 -0400
+--- y.tab.c    2014-04-07 11:48:31.000000000 -0400
+***************
+*** 4737,4741 ****
+        if (shell_input_line_terminator != EOF)
+       {
+!        if (shell_input_line_size < SIZE_MAX && shell_input_line_len > shell_input_line_size - 3)
+           shell_input_line = (char *)xrealloc (shell_input_line,
+                                       1 + (shell_input_line_size += 2));
+--- 4737,4741 ----
+        if (shell_input_line_terminator != EOF)
+       {
+!        if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size))
+           shell_input_line = (char *)xrealloc (shell_input_line,
+                                       1 + (shell_input_line_size += 2));
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 8
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 9
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-010 b/src/patches/bash/bash43-010
new file mode 100644 (file)
index 0000000..835a96e
--- /dev/null
@@ -0,0 +1,157 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-010
+
+Bug-Reported-by:       Albert Shih <Albert.Shih@obspm.fr>
+Bug-Reference-ID:      Wed, 5 Mar 2014 23:01:40 +0100
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00028.html
+
+Bug-Description:
+
+Patch (apply with `patch -p0'):
+
+This patch changes the behavior of programmable completion to compensate
+for two assumptions made by the bash-completion package.  Bash-4.3 changed
+to dequote the argument to programmable completion only under certain
+circumstances, to make the behavior of compgen more consistent when run
+from the command line -- closer to the behavior when run by a shell function
+run as part of programmable completion.  Bash-completion can pass quoted
+arguments to compgen when the original word to be completed was not quoted,
+expecting programmable completion to dequote the word before attempting
+completion.
+
+This patch fixes two cases:
+
+1.  An empty string that bash-completion passes to compgen as a quoted null
+    string ('').
+
+2.  An unquoted word that bash-completion quotes using single quotes or
+    backslashes before passing it to compgen.
+
+In these cases, since readline did not detect a quote character in the original
+word to be completed, bash-4.3 
+
+*** ../bash-4.3/externs.h      2014-01-02 14:58:20.000000000 -0500
+--- externs.h  2014-03-13 14:42:57.000000000 -0400
+***************
+*** 325,328 ****
+--- 325,329 ----
+  extern char *sh_backslash_quote_for_double_quotes __P((char *));
+  extern int sh_contains_shell_metas __P((char *));
++ extern int sh_contains_quotes __P((char *));
+  
+  /* declarations for functions defined in lib/sh/spell.c */
+*** ../bash-4.3/lib/sh/shquote.c       2013-03-31 21:53:32.000000000 -0400
+--- lib/sh/shquote.c   2014-03-13 14:42:57.000000000 -0400
+***************
+*** 312,313 ****
+--- 312,327 ----
+    return (0);
+  }
++ 
++ int
++ sh_contains_quotes (string)
++      char *string;
++ {
++   char *s;
++ 
++   for (s = string; s && *s; s++)
++     {
++       if (*s == '\'' || *s == '"' || *s == '\\')
++      return 1;
++     }
++   return 0;
++ }
+*** ../bash-4.3/pcomplete.c    2013-08-26 15:23:45.000000000 -0400
+--- pcomplete.c        2014-03-25 17:23:23.000000000 -0400
+***************
+*** 184,187 ****
+--- 184,188 ----
+  COMPSPEC *pcomp_curcs;
+  const char *pcomp_curcmd;
++ const char *pcomp_curtxt;
+  
+  #ifdef DEBUG
+***************
+*** 754,757 ****
+--- 755,784 ----
+         dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
+       }
++       /* Intended to solve a mismatched assumption by bash-completion.  If
++       the text to be completed is empty, but bash-completion turns it into
++       a quoted string ('') assuming that this code will dequote it before
++       calling readline, do the dequoting. */
++       else if (iscompgen && iscompleting &&
++             pcomp_curtxt && *pcomp_curtxt == 0 &&
++             text && (*text == '\'' || *text == '"') && text[1] == text[0] && text[2] == 0 && 
++             rl_filename_dequoting_function)
++      dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
++       /* Another mismatched assumption by bash-completion.  If compgen is being
++               run as part of bash-completion, and the argument to compgen is not
++               the same as the word originally passed to the programmable completion
++               code, dequote the argument if it has quote characters.  It's an
++               attempt to detect when bash-completion is quoting its filename
++               argument before calling compgen. */
++       /* We could check whether gen_shell_function_matches is in the call
++       stack by checking whether the gen-shell-function-matches tag is in
++       the unwind-protect stack, but there's no function to do that yet.
++       We could simply check whether we're executing in a function by
++       checking variable_context, and may end up doing that. */
++       else if (iscompgen && iscompleting && rl_filename_dequoting_function &&
++             pcomp_curtxt && text &&
++             STREQ (pcomp_curtxt, text) == 0 &&
++             variable_context &&
++             sh_contains_quotes (text))       /* guess */
++      dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
+        else
+       dfn = savestring (text);
+***************
+*** 1523,1527 ****
+  {
+    COMPSPEC *cs, *oldcs;
+!   const char *oldcmd;
+    STRINGLIST *ret;
+  
+--- 1550,1554 ----
+  {
+    COMPSPEC *cs, *oldcs;
+!   const char *oldcmd, *oldtxt;
+    STRINGLIST *ret;
+  
+***************
+*** 1546,1552 ****
+--- 1573,1581 ----
+    oldcs = pcomp_curcs;
+    oldcmd = pcomp_curcmd;
++   oldtxt = pcomp_curtxt;
+  
+    pcomp_curcs = cs;
+    pcomp_curcmd = cmd;
++   pcomp_curtxt = word;
+  
+    ret = gen_compspec_completions (cs, cmd, word, start, end, foundp);
+***************
+*** 1554,1557 ****
+--- 1583,1587 ----
+    pcomp_curcs = oldcs;
+    pcomp_curcmd = oldcmd;
++   pcomp_curtxt = oldtxt;
+  
+    /* We need to conditionally handle setting *retryp here */
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 9
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 10
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-011 b/src/patches/bash/bash43-011
new file mode 100644 (file)
index 0000000..cdc1572
--- /dev/null
@@ -0,0 +1,49 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-011
+
+Bug-Reported-by:       Egmont Koblinger <egmont@gmail.com>
+Bug-Reference-ID:      <CAGWcZk+bU5Jo1M+tutGvL-250UBE9DXjpeJVofYJSFcqFEVfMg@mail.gmail.com>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00153.html
+
+Bug-Description:
+
+The signal handling changes to bash and readline (to avoid running any code
+in a signal handler context) cause the cursor to be placed on the wrong
+line of a multi-line command after a ^C interrupts editing.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-4.3-patched/lib/readline/display.c 2013-12-27 13:10:56.000000000 -0500
+--- lib/readline/display.c     2014-03-27 11:52:45.000000000 -0400
+***************
+*** 2678,2682 ****
+    if (_rl_echoing_p)
+      {
+!       _rl_move_vert (_rl_vis_botlin);
+        _rl_vis_botlin = 0;
+        fflush (rl_outstream);
+--- 2678,2683 ----
+    if (_rl_echoing_p)
+      {
+!       if (_rl_vis_botlin > 0)        /* minor optimization plus bug fix */
+!      _rl_move_vert (_rl_vis_botlin);
+        _rl_vis_botlin = 0;
+        fflush (rl_outstream);
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 10
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 11
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-012 b/src/patches/bash/bash43-012
new file mode 100644 (file)
index 0000000..176fa15
--- /dev/null
@@ -0,0 +1,43 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-012
+
+Bug-Reported-by:       Eduardo A. Bustamante López<dualbus@gmail.com>
+Bug-Reference-ID:      <5346B54C.4070205@case.edu>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00051.html
+
+Bug-Description:
+
+When a SIGCHLD trap runs a command containing a shell builtin while
+a script is running `wait' to wait for all running children to complete,
+the SIGCHLD trap will not be run once for each child that terminates.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-4.3-patched/jobs.c 2014-03-28 10:54:19.000000000 -0400
+--- jobs.c     2014-04-15 08:47:03.000000000 -0400
+***************
+*** 3598,3601 ****
+--- 3598,3602 ----
+    unwind_protect_pointer (the_pipeline);
+    unwind_protect_pointer (subst_assign_varlist);
++   unwind_protect_pointer (this_shell_builtin);
+  
+    /* We have to add the commands this way because they will be run
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 11
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 12
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-013 b/src/patches/bash/bash43-013
new file mode 100644 (file)
index 0000000..8f4006b
--- /dev/null
@@ -0,0 +1,66 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-013
+
+Bug-Reported-by:       <Trond.Endrestol@ximalas.info>
+Bug-Reference-ID:      <alpine.BSF.2.03.1404192114310.1973@enterprise.ximalas.info>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00069.html
+
+Bug-Description:
+
+Using reverse-i-search when horizontal scrolling is enabled does not redisplay
+the entire line containing the successful search results.
+
+Patch (apply with `patch -p0'):
+*** ../bash-4.3-patched/lib/readline/display.c 2014-04-08 18:19:36.000000000 -0400
+--- lib/readline/display.c     2014-04-20 18:32:52.000000000 -0400
+***************
+*** 1638,1642 ****
+       the spot of first difference is before the end of the invisible chars,
+       lendiff needs to be adjusted. */
+!   if (current_line == 0 && !_rl_horizontal_scroll_mode &&
+        current_invis_chars != visible_wrap_offset)
+      {
+--- 1638,1642 ----
+       the spot of first difference is before the end of the invisible chars,
+       lendiff needs to be adjusted. */
+!   if (current_line == 0 && /* !_rl_horizontal_scroll_mode && */
+        current_invis_chars != visible_wrap_offset)
+      {
+***************
+*** 1826,1831 ****
+               _rl_last_c_pos += bytes_to_insert;
+  
+             if (_rl_horizontal_scroll_mode && ((oe-old) > (ne-new)))
+!              goto clear_rest_of_line;
+           }
+       }
+--- 1826,1836 ----
+               _rl_last_c_pos += bytes_to_insert;
+  
++            /* XXX - we only want to do this if we are at the end of the line
++               so we move there with _rl_move_cursor_relative */
+             if (_rl_horizontal_scroll_mode && ((oe-old) > (ne-new)))
+!              {
+!                _rl_move_cursor_relative (ne-new, new);
+!                goto clear_rest_of_line;
+!              }
+           }
+       }
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 12
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 13
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-014 b/src/patches/bash/bash43-014
new file mode 100644 (file)
index 0000000..f837196
--- /dev/null
@@ -0,0 +1,102 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-014
+
+Bug-Reported-by:       Greg Wooledge <wooledg@eeg.ccf.org>
+Bug-Reference-ID:      <20140418202123.GB7660@eeg.ccf.org>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/help-bash/2014-04/msg00004.html
+
+Bug-Description:
+
+Under certain circumstances, $@ is expanded incorrectly in contexts where
+word splitting is not performed.
+
+Patch (apply with `patch -p0'):
+*** ../bash-4.3-patched/subst.c        2014-01-23 16:26:37.000000000 -0500
+--- subst.c    2014-04-19 15:41:26.000000000 -0400
+***************
+*** 3249,3254 ****
+--- 3249,3256 ----
+      return ((char *)NULL);
+  
++   expand_no_split_dollar_star = 1;
+    w->flags |= W_NOSPLIT2;
+    l = call_expand_word_internal (w, 0, 0, (int *)0, (int *)0);
++   expand_no_split_dollar_star = 0;
+    if (l)
+      {
+***************
+*** 7848,7851 ****
+--- 7850,7857 ----
+        according to POSIX.2, this expands to a list of the positional
+        parameters no matter what IFS is set to. */
++       /* XXX - what to do when in a context where word splitting is not
++       performed? Even when IFS is not the default, posix seems to imply
++       that we behave like unquoted $* ?  Maybe we should use PF_NOSPLIT2
++       here. */
+        temp = string_list_dollar_at (list, (pflags & PF_ASSIGNRHS) ? (quoted|Q_DOUBLE_QUOTES) : quoted);
+  
+***************
+*** 8817,8820 ****
+--- 8823,8827 ----
+      {
+        char *ifs_chars;
++       char *tstring;
+  
+        ifs_chars = (quoted_dollar_at || has_dollar_at) ? ifs_value : (char *)NULL;
+***************
+*** 8831,8834 ****
+--- 8838,8865 ----
+        if (split_on_spaces)
+       list = list_string (istring, " ", 1);   /* XXX quoted == 1? */
++       /* If we have $@ (has_dollar_at != 0) and we are in a context where we
++       don't want to split the result (W_NOSPLIT2), and we are not quoted,
++       we have already separated the arguments with the first character of
++       $IFS.  In this case, we want to return a list with a single word
++       with the separator possibly replaced with a space (it's what other
++       shells seem to do).
++       quoted_dollar_at is internal to this function and is set if we are
++       passed an argument that is unquoted (quoted == 0) but we encounter a
++       double-quoted $@ while expanding it. */
++       else if (has_dollar_at && quoted_dollar_at == 0 && ifs_chars && quoted == 0 && (word->flags & W_NOSPLIT2))
++      {
++        /* Only split and rejoin if we have to */
++        if (*ifs_chars && *ifs_chars != ' ')
++          {
++            list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1);
++            tstring = string_list (list);
++          }
++        else
++          tstring = istring;
++        tword = make_bare_word (tstring);
++        if (tstring != istring)
++          free (tstring);
++        goto set_word_flags;
++      }
+        else if (has_dollar_at && ifs_chars)
+       list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1);
+***************
+*** 8836,8839 ****
+--- 8867,8871 ----
+       {
+         tword = make_bare_word (istring);
++ set_word_flags:
+         if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) || (quoted_state == WHOLLY_QUOTED))
+           tword->flags |= W_QUOTED;
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 13
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 14
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-015 b/src/patches/bash/bash43-015
new file mode 100644 (file)
index 0000000..9c4e5ea
--- /dev/null
@@ -0,0 +1,58 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-015
+
+Bug-Reported-by:       Clark Wang <dearvoid@gmail.com>
+Bug-Reference-ID:      <CADv8-og2TOSoabXeNVXVGaXN3tEMHnYVq1rwOLe5meaRPSGRig@mail.gmail.com>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00095.html
+
+Bug-Description:
+
+When completing directory names, the directory name is dequoted twice.
+This causes problems for directories with single and double quotes in
+their names.
+
+Patch (apply with `patch -p0'):
+*** ../bash-4.3-patched/bashline.c     2014-02-09 19:56:58.000000000 -0500
+--- bashline.c 2014-04-25 14:57:52.000000000 -0400
+***************
+*** 4168,4174 ****
+  
+    qc = rl_dispatching ? rl_completion_quote_character : 0;  
+!   dfn = bash_dequote_filename ((char *)text, qc);
+    m1 = rl_completion_matches (dfn, rl_filename_completion_function);
+!   free (dfn);
+  
+    if (m1 == 0 || m1[0] == 0)
+--- 4209,4222 ----
+  
+    qc = rl_dispatching ? rl_completion_quote_character : 0;  
+!   /* If rl_completion_found_quote != 0, rl_completion_matches will call the
+!      filename dequoting function, causing the directory name to be dequoted
+!      twice. */
+!   if (rl_dispatching && rl_completion_found_quote == 0)
+!     dfn = bash_dequote_filename ((char *)text, qc);
+!   else
+!     dfn = (char *)text;
+    m1 = rl_completion_matches (dfn, rl_filename_completion_function);
+!   if (dfn != text)
+!     free (dfn);
+  
+    if (m1 == 0 || m1[0] == 0)
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 14
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 15
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-016 b/src/patches/bash/bash43-016
new file mode 100644 (file)
index 0000000..882d593
--- /dev/null
@@ -0,0 +1,132 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-016
+
+Bug-Reported-by:       Pierre Gaston <pierre.gaston@gmail.com>
+Bug-Reference-ID:      <CAPSX3sTCD61k1VQLJ5r-LWzEt+e7Xc-fxXmwn2u8EA5gJJej8Q@mail.gmail.com>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00100.html
+
+Bug-Description:
+
+An extended glob pattern containing a slash (`/') causes the globbing code
+to misinterpret it as a directory separator.
+
+Patch (apply with `patch -p0'):
+*** ../bash-4.3-patched/lib/glob/glob.c        2014-03-28 10:54:23.000000000 -0400
+--- lib/glob/glob.c    2014-05-02 10:24:28.000000000 -0400
+***************
+*** 124,127 ****
+--- 124,129 ----
+  extern wchar_t *glob_patscan_wc __P((wchar_t *, wchar_t *, int));
+  
++ extern char *glob_dirscan __P((char *, int));
++ 
+  /* Compile `glob_loop.c' for single-byte characters. */
+  #define CHAR unsigned char
+***************
+*** 188,191 ****
+--- 190,196 ----
+    pe = glob_patscan (pp, se, 0);     /* end of extglob pattern (( */
+    /* we should check for invalid extglob pattern here */
++   if (pe == 0)
++     return 0;
++ 
+    /* if pe != se we have more of the pattern at the end of the extglob
+       pattern. Check the easy case first ( */
+***************
+*** 1016,1020 ****
+    char **result;
+    unsigned int result_size;
+!   char *directory_name, *filename, *dname;
+    unsigned int directory_len;
+    int free_dirname;                  /* flag */
+--- 1021,1025 ----
+    char **result;
+    unsigned int result_size;
+!   char *directory_name, *filename, *dname, *fn;
+    unsigned int directory_len;
+    int free_dirname;                  /* flag */
+***************
+*** 1032,1035 ****
+--- 1037,1052 ----
+    /* Find the filename.  */
+    filename = strrchr (pathname, '/');
++ #if defined (EXTENDED_GLOB)
++   if (filename && extended_glob)
++     {
++       fn = glob_dirscan (pathname, '/');
++ #if DEBUG_MATCHING
++       if (fn != filename)
++      fprintf (stderr, "glob_filename: glob_dirscan: fn (%s) != filename (%s)\n", fn ? fn : "(null)", filename);
++ #endif
++       filename = fn;
++     }
++ #endif
++ 
+    if (filename == NULL)
+      {
+*** ../bash-4.3-patched/lib/glob/gmisc.c       2014-03-28 10:54:23.000000000 -0400
+--- lib/glob/gmisc.c   2014-05-02 09:35:57.000000000 -0400
+***************
+*** 43,46 ****
+--- 43,48 ----
+  #define WRPAREN         L')'
+  
++ extern char *glob_patscan __P((char *, char *, int));
++ 
+  /* Return 1 of the first character of WSTRING could match the first
+     character of pattern WPAT.  Wide character version. */
+***************
+*** 376,377 ****
+--- 378,410 ----
+    return matlen;
+  }
++ 
++ /* Skip characters in PAT and return the final occurrence of DIRSEP.  This
++    is only called when extended_glob is set, so we have to skip over extglob
++    patterns x(...) */
++ char *
++ glob_dirscan (pat, dirsep)
++      char *pat;
++      int dirsep;
++ {
++   char *p, *d, *pe, *se;
++ 
++   d = pe = se = 0;
++   for (p = pat; p && *p; p++)
++     {
++       if (extglob_pattern_p (p))
++      {
++        if (se == 0)
++          se = p + strlen (p) - 1;
++        pe = glob_patscan (p + 2, se, 0);
++        if (pe == 0)
++          continue;
++        else if (*pe == 0)
++          break;
++        p = pe - 1;   /* will do increment above */
++        continue;
++      }
++       if (*p ==  dirsep)
++      d = p;
++     }
++   return d;
++ }
+
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 15
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 16
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-017 b/src/patches/bash/bash43-017
new file mode 100644 (file)
index 0000000..4016fb9
--- /dev/null
@@ -0,0 +1,51 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-017
+
+Bug-Reported-by:       Dan Douglas <ormaaj@gmail.com>
+Bug-Reference-ID:      <7781746.RhfoTROLxF@smorgbox>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-05/msg00026.html
+
+Bug-Description:
+
+The code that creates local variables should not clear the `invisible'
+attribute when returning an existing local variable.  Let the code that
+actually assigns a value clear it.
+
+Patch (apply with `patch -p0'):
+*** ../bash-4.3-patched/variables.c    2014-02-14 11:55:12.000000000 -0500
+--- variables.c        2014-05-07 10:53:57.000000000 -0400
+***************
+*** 2198,2205 ****
+    old_var = find_variable (name);
+    if (old_var && local_p (old_var) && old_var->context == variable_context)
+!     {
+!       VUNSETATTR (old_var, att_invisible);   /* XXX */
+!       return (old_var);
+!     }
+  
+    was_tmpvar = old_var && tempvar_p (old_var);
+--- 2260,2264 ----
+    old_var = find_variable (name);
+    if (old_var && local_p (old_var) && old_var->context == variable_context)
+!     return (old_var);
+  
+    was_tmpvar = old_var && tempvar_p (old_var);
+
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 16
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 17
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash43-018 b/src/patches/bash/bash43-018
new file mode 100644 (file)
index 0000000..39499f6
--- /dev/null
@@ -0,0 +1,44 @@
+                            BASH PATCH REPORT
+                            =================
+
+Bash-Release:  4.3
+Patch-ID:      bash43-018
+
+Bug-Reported-by:       Geir Hauge <geir.hauge@gmail.com>
+Bug-Reference-ID:      <CAO-BiTLOvfPXDypg61jcBausADrxUKJejakV2WTWP26cW0=rgA@mail.gmail.com>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-05/msg00040.html
+
+Bug-Description:
+
+When assigning an array variable using the compound assignment syntax,
+but using `declare' with the rhs of the compound assignment quoted, the
+shell did not mark the variable as visible after successfully performing
+the assignment.
+
+Patch (apply with `patch -p0'):
+*** ../bash-4.3-patched/arrayfunc.c    2014-03-28 10:54:21.000000000 -0400
+--- arrayfunc.c        2014-05-12 11:19:00.000000000 -0400
+***************
+*** 180,183 ****
+--- 180,184 ----
+    FREE (newval);
+  
++   VUNSETATTR (entry, att_invisible); /* no longer invisible */
+    return (entry);
+  }
+
+*** ../bash-4.3/patchlevel.h   2012-12-29 10:47:57.000000000 -0500
+--- patchlevel.h       2014-03-20 20:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 17
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 18
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/coreutils-5.96-futimes.patch b/src/patches/coreutils-5.96-futimes.patch
deleted file mode 100644 (file)
index e91f1df..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
---- coreutils-6.0.orig/lib/utimens.c   2006-06-11 09:14:31.000000000 +0200
-+++ coreutils-6.0/lib/utimens.c        2007-07-17 00:41:08.000000000 +0200
-@@ -75,7 +75,7 @@
-    Return 0 on success, -1 (setting errno) on failure.  */
- int
--futimens (int fd ATTRIBUTE_UNUSED,
-+cu_futimens (int fd ATTRIBUTE_UNUSED,
-         char const *file, struct timespec const timespec[2])
- {
-   /* There's currently no interface to set file timestamps with
-@@ -168,5 +168,5 @@
- int
- utimens (char const *file, struct timespec const timespec[2])
- {
--  return futimens (-1, file, timespec);
-+  return cu_futimens (-1, file, timespec);
- }
---- coreutils-6.0.orig/lib/utimens.h   2004-11-23 21:41:51.000000000 +0100
-+++ coreutils-6.0/lib/utimens.h        2007-07-17 00:41:31.000000000 +0200
-@@ -1,3 +1,3 @@
- #include "timespec.h"
--int futimens (int, char const *, struct timespec const [2]);
-+int cu_futimens (int, char const *, struct timespec const [2]);
- int utimens (char const *, struct timespec const [2]);
---- coreutils-6.0.orig/src/copy.c      2007-07-16 23:18:42.000000000 +0200
-+++ coreutils-6.0/src/copy.c   2007-07-17 00:43:10.000000000 +0200
-@@ -648,7 +648,7 @@
-       timespec[0] = get_stat_atime (src_sb);
-       timespec[1] = get_stat_mtime (src_sb);
--      if (futimens (dest_desc, dst_name, timespec) != 0)
-+      if (cu_futimens (dest_desc, dst_name, timespec) != 0)
-       {
-         error (0, errno, _("preserving times for %s"), quote (dst_name));
-         if (x->require_preserve)
---- coreutils-6.0.orig/src/touch.c     2005-11-02 11:01:07.000000000 +0100
-+++ coreutils-6.0/src/touch.c  2007-07-17 00:43:51.000000000 +0200
-@@ -167,7 +167,7 @@
-   if (amtime_now)
-     {
--      /* Pass NULL to futimens so it will not fail if we have
-+      /* Pass NULL to cu_futimens so it will not fail if we have
-        write access to the file, but don't own it.  */
-       t = NULL;
-     }
-@@ -182,7 +182,7 @@
-       t = timespec;
-     }
--  ok = (futimens (fd, (fd == STDOUT_FILENO ? NULL : file), t) == 0);
-+  ok = (cu_futimens (fd, (fd == STDOUT_FILENO ? NULL : file), t) == 0);
-   if (fd == STDIN_FILENO)
-     {
diff --git a/src/patches/coreutils-5.96-i18n-1.patch b/src/patches/coreutils-5.96-i18n-1.patch
deleted file mode 100644 (file)
index d1c8cf0..0000000
+++ /dev/null
@@ -1,4052 +0,0 @@
-Submitted by: Alexander E. Patrakov
-Date: 2005-11-12
-Initial Package Version: 5.93
-Upstream Status: Not accepted, but planned for 6.0
-Origin: RedHat CVS, see below how to regenerate
-http://cvs.fedora.redhat.com/viewcvs/*checkout*/devel/coreutils/coreutils-i18n.patch?rev=1.14
-Description: This patch fixes various problems with multibyte character support.
-LSB >= 2.0 tests for features added by this patch, but only Coreutils-5.2.1 plus
-http://www.linuxfromscratch.org/~alexander/patches/coreutils-5.2.1-i18n_fixes-1.patch
-actually pass the Li18nux2000-level1 testsuite.
-
-To regenerate:
-Get http://cvs.fedora.redhat.com/viewcvs/*checkout*/devel/coreutils/coreutils-i18n.patch?rev=1.14
-Replace the coreutils-5.93/tests/sort/Makefile.in hunk with that from rev 1.13
-Add this header.
-
---- coreutils-5.93/lib/linebuffer.h.i18n       2005-05-14 08:58:06.000000000 +0100
-+++ coreutils-5.93/lib/linebuffer.h    2005-12-23 08:53:01.000000000 +0000
-@@ -22,6 +22,11 @@
- # include <stdio.h>
-+/* Get mbstate_t.  */
-+# if HAVE_WCHAR_H
-+#  include <wchar.h>
-+# endif
-+
- /* A `struct linebuffer' holds a line of text. */
- struct linebuffer
-@@ -29,6 +34,9 @@
-   size_t size;                        /* Allocated. */
-   size_t length;              /* Used. */
-   char *buffer;
-+# if HAVE_WCHAR_H
-+  mbstate_t state;
-+# endif
- };
- /* Initialize linebuffer LINEBUFFER for use. */
---- coreutils-5.93/src/cut.c.i18n      2005-08-12 08:16:25.000000000 +0100
-+++ coreutils-5.93/src/cut.c   2005-12-23 08:53:01.000000000 +0000
-@@ -29,6 +29,11 @@
- #include <assert.h>
- #include <getopt.h>
- #include <sys/types.h>
-+
-+/* Get mbstate_t, mbrtowc().  */
-+#if HAVE_WCHAR_H
-+# include <wchar.h>
-+#endif
- #include "system.h"
- #include "error.h"
-@@ -37,6 +42,18 @@
- #include "quote.h"
- #include "xstrndup.h"
-+/* MB_LEN_MAX is incorrectly defined to be 1 in at least one GCC
-+   installation; work around this configuration error.        */
-+#if !defined MB_LEN_MAX || MB_LEN_MAX < 2
-+# undef MB_LEN_MAX
-+# define MB_LEN_MAX 16
-+#endif
-+
-+/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t.  */
-+#if HAVE_MBRTOWC && defined mbstate_t
-+# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0)
-+#endif
-+
- /* The official name of this program (e.g., no `g' prefix).  */
- #define PROGRAM_NAME "cut"
-@@ -67,6 +84,52 @@
-     }                                                 \
-   while (0)
-+/* Refill the buffer BUF to get a multibyte character. */
-+#define REFILL_BUFFER(BUF, BUFPOS, BUFLEN, STREAM)                    \
-+  do                                                                  \
-+    {                                                                 \
-+      if (BUFLEN < MB_LEN_MAX && !feof (STREAM) && !ferror (STREAM))  \
-+      {                                                               \
-+        memmove (BUF, BUFPOS, BUFLEN);                                \
-+        BUFLEN += fread (BUF + BUFLEN, sizeof(char), BUFSIZ, STREAM); \
-+        BUFPOS = BUF;                                                 \
-+      }                                                               \
-+    }                                                                 \
-+  while (0)
-+
-+/* Get wide character on BUFPOS. BUFPOS is not included after that.
-+   If byte sequence is not valid as a character, CONVFAIL is 1. Otherwise 0. */ 
-+#define GET_NEXT_WC_FROM_BUFFER(WC, BUFPOS, BUFLEN, MBLENGTH, STATE, CONVFAIL) \
-+  do                                                                  \
-+    {                                                                 \
-+      mbstate_t state_bak;                                            \
-+                                                                      \
-+      if (BUFLEN < 1)                                                 \
-+      {                                                               \
-+        WC = WEOF;                                                    \
-+        break;                                                        \
-+      }                                                               \
-+                                                                      \
-+      /* Get a wide character. */                                     \
-+      CONVFAIL = 0;                                                   \
-+      state_bak = STATE;                                              \
-+      MBLENGTH = mbrtowc ((wchar_t *)&WC, BUFPOS, BUFLEN, &STATE);    \
-+                                                                      \
-+      switch (MBLENGTH)                                                       \
-+      {                                                               \
-+      case (size_t)-1:                                                \
-+      case (size_t)-2:                                                \
-+        CONVFAIL++;                                                   \
-+        STATE = state_bak;                                            \
-+        /* Fall througn. */                                           \
-+                                                                      \
-+      case 0:                                                         \
-+        MBLENGTH = 1;                                                 \
-+        break;                                                        \
-+      }                                                               \
-+    }                                                                 \
-+  while (0)
-+
- struct range_pair
-   {
-     size_t lo;
-@@ -85,7 +148,7 @@
- /* The number of bytes allocated for FIELD_1_BUFFER.  */
- static size_t field_1_bufsize;
--/* The largest field or byte index used as an endpoint of a closed
-+/* The largest byte, character or field index used as an endpoint of a closed
-    or degenerate range specification;  this doesn't include the starting
-    index of right-open-ended ranges.  For example, with either range spec
-    `2-5,9-', `2-3,5,9-' this variable would be set to 5.  */
-@@ -97,10 +160,11 @@
- /* This is a bit vector.
-    In byte mode, which bytes to output.
-+   In character mode, which characters to output.
-    In field mode, which DELIM-separated fields to output.
--   Both bytes and fields are numbered starting with 1,
-+   Bytes, characters and fields are numbered starting with 1,
-    so the zeroth bit of this array is unused.
--   A field or byte K has been selected if
-+   A byte, character or field K has been selected if
-    (K <= MAX_RANGE_ENDPOINT and is_printable_field(K))
-     || (EOL_RANGE_START > 0 && K >= EOL_RANGE_START).  */
- static unsigned char *printable_field;
-@@ -109,9 +173,12 @@
-   {
-     undefined_mode,
--    /* Output characters that are in the given bytes. */
-+    /* Output bytes that are at the given positions. */
-     byte_mode,
-+    /* Output characters that are at the given positions. */
-+    character_mode,
-+
-     /* Output the given delimeter-separated fields. */
-     field_mode
-   };
-@@ -121,6 +188,13 @@
- static enum operating_mode operating_mode;
-+/* If nonzero, when in byte mode, don't split multibyte characters.  */
-+static int byte_mode_character_aware;
-+
-+/* If nonzero, the function for single byte locale is work
-+   if this program runs on multibyte locale. */
-+static int force_singlebyte_mode;
-+
- /* If true do not output lines containing no delimeter characters.
-    Otherwise, all such lines are printed.  This option is valid only
-    with field mode.  */
-@@ -132,6 +206,9 @@
- /* The delimeter character for field mode. */
- static unsigned char delim;
-+#if HAVE_WCHAR_H
-+static wchar_t wcdelim;
-+#endif
- /* True if the --output-delimiter=STRING option was specified.  */
- static bool output_delimiter_specified;
-@@ -205,7 +282,7 @@
-   -f, --fields=LIST       select only these fields;  also print any line\n\
-                             that contains no delimiter character, unless\n\
-                             the -s option is specified\n\
--  -n                      (ignored)\n\
-+  -n                      with -b: don't split multibyte characters\n\
- "), stdout);
-       fputs (_("\
-       --complement        complement the set of selected bytes, characters\n\
-@@ -360,7 +437,7 @@
-         in_digits = false;
-         /* Starting a range. */
-         if (dash_found)
--          FATAL_ERROR (_("invalid byte or field list"));
-+          FATAL_ERROR (_("invalid byte, character or field list"));
-         dash_found = true;
-         fieldstr++;
-@@ -385,14 +462,16 @@
-             if (value == 0)
-               {
-                 /* `n-'.  From `initial' to end of line. */
--                eol_range_start = initial;
-+                if (eol_range_start == 0 ||
-+                    (eol_range_start != 0 && eol_range_start > initial))
-+                  eol_range_start = initial;
-                 field_found = true;
-               }
-             else
-               {
-                 /* `m-n' or `-n' (1-n). */
-                 if (value < initial)
--                  FATAL_ERROR (_("invalid byte or field list"));
-+                  FATAL_ERROR (_("invalid byte, character or field list"));
-                 /* Is there already a range going to end of line? */
-                 if (eol_range_start != 0)
-@@ -465,6 +544,9 @@
-             if (operating_mode == byte_mode)
-               error (0, 0,
-                      _("byte offset %s is too large"), quote (bad_num));
-+            else if (operating_mode == character_mode)
-+              error (0, 0,
-+                     _("character offset %s is too large"), quote (bad_num));
-             else
-               error (0, 0,
-                      _("field number %s is too large"), quote (bad_num));
-@@ -475,7 +557,7 @@
-         fieldstr++;
-       }
-       else
--      FATAL_ERROR (_("invalid byte or field list"));
-+      FATAL_ERROR (_("invalid byte, character or field list"));
-     }
-   max_range_endpoint = 0;
-@@ -568,6 +650,63 @@
-     }
- }
-+#if HAVE_MBRTOWC
-+/* This function is in use for the following case.
-+
-+   1. Read from the stream STREAM, printing to standard output any selected
-+   characters. 
-+
-+   2. Read from stream STREAM, printing to standard output any selected bytes,
-+   without splitting multibyte characters.  */
-+ 
-+static void
-+cut_characters_or_cut_bytes_no_split (FILE *stream)
-+{
-+  int idx;            /* number of bytes or characters in the line so far. */
-+  char buf[MB_LEN_MAX + BUFSIZ];  /* For spooling a read byte sequence. */
-+  char *bufpos;               /* Next read position of BUF. */
-+  size_t buflen;      /* The length of the byte sequence in buf. */
-+  wint_t wc;          /* A gotten wide character. */
-+  size_t mblength;    /* The byte size of a multibyte character which shows
-+                         as same character as WC. */
-+  mbstate_t state;    /* State of the stream. */
-+  int convfail;               /* 1, when conversion is failed. Otherwise 0. */
-+
-+  idx = 0;
-+  buflen = 0;
-+  bufpos = buf;
-+  memset (&state, '\0', sizeof(mbstate_t));
-+
-+  while (1)
-+    {
-+      REFILL_BUFFER (buf, bufpos, buflen, stream);
-+
-+      GET_NEXT_WC_FROM_BUFFER (wc, bufpos, buflen, mblength, state, convfail);
-+
-+      if (wc == WEOF)
-+      {
-+        if (idx > 0)
-+          putchar ('\n');
-+        break;
-+      }
-+      else if (wc == L'\n')
-+      {
-+        putchar ('\n');
-+        idx = 0;
-+      }
-+      else
-+      {
-+        idx += (operating_mode == byte_mode) ? mblength : 1;
-+        if (print_kth (idx, NULL))
-+          fwrite (bufpos, mblength, sizeof(char), stdout);
-+      }
-+
-+      buflen -= mblength;
-+      bufpos += mblength;
-+    }
-+}
-+#endif
-+                 
- /* Read from stream STREAM, printing to standard output any selected fields.  */
- static void
-@@ -689,13 +828,192 @@
-     }
- }
-+#if HAVE_MBRTOWC
-+static void
-+cut_fields_mb (FILE *stream)
-+{
-+  int c;
-+  unsigned int field_idx;
-+  int found_any_selected_field;
-+  int buffer_first_field;
-+  int empty_input;
-+  char buf[MB_LEN_MAX + BUFSIZ];  /* For spooling a read byte sequence. */
-+  char *bufpos;               /* Next read position of BUF. */
-+  size_t buflen;      /* The length of the byte sequence in buf. */
-+  wint_t wc = 0;      /* A gotten wide character. */
-+  size_t mblength;    /* The byte size of a multibyte character which shows
-+                         as same character as WC. */
-+  mbstate_t state;    /* State of the stream. */
-+  int convfail;               /* 1, when conversion is failed. Otherwise 0. */
-+
-+  found_any_selected_field = 0;
-+  field_idx = 1;
-+  bufpos = buf;
-+  buflen = 0;
-+  memset (&state, '\0', sizeof(mbstate_t));
-+
-+  c = getc (stream);
-+  empty_input = (c == EOF);
-+  if (c != EOF)
-+    ungetc (c, stream);
-+  else
-+    wc = WEOF;
-+
-+  /* To support the semantics of the -s flag, we may have to buffer
-+     all of the first field to determine whether it is `delimited.'
-+     But that is unnecessary if all non-delimited lines must be printed
-+     and the first field has been selected, or if non-delimited lines
-+     must be suppressed and the first field has *not* been selected.
-+     That is because a non-delimited line has exactly one field.  */
-+  buffer_first_field = (suppress_non_delimited ^ !print_kth (1, NULL));
-+
-+  while (1)
-+    {
-+      if (field_idx == 1 && buffer_first_field)
-+      {
-+        int len = 0;
-+
-+        while (1)
-+          {
-+            REFILL_BUFFER (buf, bufpos, buflen, stream);
-+
-+            GET_NEXT_WC_FROM_BUFFER
-+              (wc, bufpos, buflen, mblength, state, convfail);
-+
-+            if (wc == WEOF)
-+              break;
-+
-+            field_1_buffer = xrealloc (field_1_buffer, len + mblength);
-+            memcpy (field_1_buffer + len, bufpos, mblength);
-+            len += mblength;
-+            buflen -= mblength;
-+            bufpos += mblength;
-+
-+            if (!convfail && (wc == L'\n' || wc == wcdelim))
-+              break;
-+          }
-+
-+        if (wc == WEOF)
-+          break;
-+
-+        /* If the first field extends to the end of line (it is not
-+           delimited) and we are printing all non-delimited lines,
-+           print this one.  */
-+        if (convfail || (!convfail && wc != wcdelim))
-+          {
-+            if (suppress_non_delimited)
-+              {
-+                /* Empty.     */
-+              }
-+            else
-+              {
-+                fwrite (field_1_buffer, sizeof (char), len, stdout);
-+                /* Make sure the output line is newline terminated.  */
-+                if (convfail || (!convfail && wc != L'\n'))
-+                  putchar ('\n');
-+              }
-+            continue;
-+          }
-+
-+        if (print_kth (1, NULL))
-+          {
-+            /* Print the field, but not the trailing delimiter.  */
-+            fwrite (field_1_buffer, sizeof (char), len - 1, stdout);
-+            found_any_selected_field = 1;
-+          }
-+        ++field_idx;
-+      }
-+
-+      if (wc != WEOF)
-+      {
-+        if (print_kth (field_idx, NULL))
-+          {
-+            if (found_any_selected_field)
-+              {
-+                fwrite (output_delimiter_string, sizeof (char),
-+                        output_delimiter_length, stdout);
-+              }
-+            found_any_selected_field = 1;
-+          }
-+
-+        while (1)
-+          {
-+            REFILL_BUFFER (buf, bufpos, buflen, stream);
-+
-+            GET_NEXT_WC_FROM_BUFFER
-+              (wc, bufpos, buflen, mblength, state, convfail);
-+
-+            if (wc == WEOF)
-+              break;
-+            else if (!convfail && (wc == wcdelim || wc == L'\n'))
-+              {
-+                buflen -= mblength;
-+                bufpos += mblength;
-+                break;
-+              }
-+
-+            if (print_kth (field_idx, NULL))
-+              fwrite (bufpos, mblength, sizeof(char), stdout);
-+
-+            buflen -= mblength;
-+            bufpos += mblength;
-+          }
-+      }
-+
-+      if ((!convfail || wc == L'\n') && buflen < 1)
-+      wc = WEOF;
-+
-+      if (!convfail && wc == wcdelim)
-+      ++field_idx;
-+      else if (wc == WEOF || (!convfail && wc == L'\n'))
-+      {
-+        if (found_any_selected_field
-+            || (!empty_input && !(suppress_non_delimited && field_idx == 1)))
-+          putchar ('\n');
-+        if (wc == WEOF)
-+          break;
-+        field_idx = 1;
-+        found_any_selected_field = 0;
-+      }
-+    }
-+}
-+#endif
-+
- static void
- cut_stream (FILE *stream)
- {
--  if (operating_mode == byte_mode)
--    cut_bytes (stream);
-+#if HAVE_MBRTOWC
-+  if (MB_CUR_MAX > 1 && !force_singlebyte_mode)
-+    {
-+      switch (operating_mode)
-+      {
-+      case byte_mode:
-+        if (byte_mode_character_aware)
-+          cut_characters_or_cut_bytes_no_split (stream);
-+        else
-+          cut_bytes (stream);
-+        break;
-+
-+      case character_mode:
-+        cut_characters_or_cut_bytes_no_split (stream);
-+        break;
-+
-+      case field_mode:
-+        cut_fields_mb (stream);
-+        break;
-+
-+      default:
-+        abort ();
-+      }
-+    }
-   else
--    cut_fields (stream);
-+#endif
-+    {
-+      if (operating_mode == field_mode)
-+      cut_fields (stream);
-+      else
-+      cut_bytes (stream);
-+    }
- }
- /* Process file FILE to standard output.
-@@ -745,6 +1063,8 @@
-   bool ok;
-   bool delim_specified = false;
-   char *spec_list_string IF_LINT(= NULL);
-+  char mbdelim[MB_LEN_MAX + 1];
-+  size_t delimlen = 0;
-   initialize_main (&argc, &argv);
-   program_name = argv[0];
-@@ -767,7 +1087,6 @@
-       switch (optc)
-       {
-       case 'b':
--      case 'c':
-         /* Build the byte list. */
-         if (operating_mode != undefined_mode)
-           FATAL_ERROR (_("only one type of list may be specified"));
-@@ -775,6 +1094,14 @@
-         spec_list_string = optarg;
-         break;
-+      case 'c':
-+        /* Build the character list. */
-+        if (operating_mode != undefined_mode)
-+          FATAL_ERROR (_("only one type of list may be specified"));
-+        operating_mode = character_mode;
-+        spec_list_string = optarg;
-+        break;
-+
-       case 'f':
-         /* Build the field list. */
-         if (operating_mode != undefined_mode)
-@@ -786,10 +1113,35 @@
-       case 'd':
-         /* New delimiter. */
-         /* Interpret -d '' to mean `use the NUL byte as the delimiter.'  */
--        if (optarg[0] != '\0' && optarg[1] != '\0')
--          FATAL_ERROR (_("the delimiter must be a single character"));
--        delim = optarg[0];
--        delim_specified = true;
-+#if HAVE_MBRTOWC
-+          {
-+            if(MB_CUR_MAX > 1)
-+              {
-+                mbstate_t state;
-+
-+                memset (&state, '\0', sizeof(mbstate_t));
-+                delimlen = mbrtowc (&wcdelim, optarg, strnlen(optarg, MB_LEN_MAX), &state);
-+
-+                if (delimlen == (size_t)-1 || delimlen == (size_t)-2)
-+                  ++force_singlebyte_mode;
-+                else
-+                  {
-+                    delimlen = (delimlen < 1) ? 1 : delimlen;
-+                    if (wcdelim != L'\0' && *(optarg + delimlen) != '\0')
-+                      FATAL_ERROR (_("the delimiter must be a single character"));
-+                    memcpy (mbdelim, optarg, delimlen);
-+                  }
-+              }
-+
-+            if (MB_CUR_MAX <= 1 || force_singlebyte_mode)
-+#endif
-+              {
-+                if (optarg[0] != '\0' && optarg[1] != '\0')
-+                  FATAL_ERROR (_("the delimiter must be a single character"));
-+                delim = (unsigned char) optarg[0];
-+              }
-+          delim_specified = true;
-+        }
-         break;
-       case OUTPUT_DELIMITER_OPTION:
-@@ -802,6 +1154,7 @@
-         break;
-       case 'n':
-+        byte_mode_character_aware = 1;
-         break;
-       case 's':
-@@ -824,7 +1177,7 @@
-   if (operating_mode == undefined_mode)
-     FATAL_ERROR (_("you must specify a list of bytes, characters, or fields"));
--  if (delim != '\0' && operating_mode != field_mode)
-+  if (delim_specified && operating_mode != field_mode)
-     FATAL_ERROR (_("an input delimiter may be specified only\
-  when operating on fields"));
-@@ -851,15 +1204,34 @@
-     }
-   if (!delim_specified)
--    delim = '\t';
-+    {
-+      delim = '\t';
-+#ifdef HAVE_MBRTOWC
-+      wcdelim = L'\t';
-+      mbdelim[0] = '\t';
-+      mbdelim[1] = '\0';
-+      delimlen = 1;
-+#endif
-+    }
-   if (output_delimiter_string == NULL)
-     {
--      static char dummy[2];
--      dummy[0] = delim;
--      dummy[1] = '\0';
--      output_delimiter_string = dummy;
--      output_delimiter_length = 1;
-+#ifdef HAVE_MBRTOWC
-+      if (MB_CUR_MAX > 1 && !force_singlebyte_mode)
-+      {
-+        output_delimiter_string = xstrdup(mbdelim);
-+        output_delimiter_length = delimlen;
-+      }
-+
-+      if (MB_CUR_MAX <= 1 || force_singlebyte_mode)
-+#endif
-+      {
-+        static char dummy[2]; 
-+        dummy[0] = delim;
-+        dummy[1] = '\0';
-+        output_delimiter_string = dummy;
-+        output_delimiter_length = 1;
-+      }
-     }
-   if (optind == argc)
---- coreutils-5.93/src/pr.c.i18n       2005-09-16 08:50:33.000000000 +0100
-+++ coreutils-5.93/src/pr.c    2005-12-23 08:53:01.000000000 +0000
-@@ -313,6 +313,32 @@
- #include <getopt.h>
- #include <sys/types.h>
-+
-+/* Get MB_LEN_MAX.  */
-+#include <limits.h>
-+/* MB_LEN_MAX is incorrectly defined to be 1 in at least one GCC
-+   installation; work around this configuration error.  */
-+#if !defined MB_LEN_MAX || MB_LEN_MAX == 1
-+# define MB_LEN_MAX 16
-+#endif
-+
-+/* Get MB_CUR_MAX.  */
-+#include <stdlib.h>
-+
-+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
-+/* Get mbstate_t, mbrtowc(), wcwidth().  */
-+#if HAVE_WCHAR_H
-+# include <wchar.h>
-+#endif
-+
-+/* Get iswprint(). -- for wcwidth().  */
-+#if HAVE_WCTYPE_H
-+# include <wctype.h>
-+#endif
-+#if !defined iswprint && !HAVE_ISWPRINT
-+# define iswprint(wc) 1
-+#endif
-+
- #include "system.h"
- #include "error.h"
- #include "hard-locale.h"
-@@ -324,6 +350,18 @@
- #include "strftime.h"
- #include "xstrtol.h"
-+/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t.  */
-+#if HAVE_MBRTOWC && defined mbstate_t
-+# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0)
-+#endif
-+
-+#ifndef HAVE_DECL_WCWIDTH
-+"this configure-time declaration test was not run"
-+#endif
-+#if !HAVE_DECL_WCWIDTH
-+extern int wcwidth ();
-+#endif
-+
- /* The official name of this program (e.g., no `g' prefix).  */
- #define PROGRAM_NAME "pr"
-@@ -416,7 +454,20 @@
- #define NULLCOL (COLUMN *)0
--static int char_to_clump (char c);
-+/* Funtion pointers to switch functions for single byte locale or for
-+   multibyte locale. If multibyte functions do not exist in your sysytem,
-+   these pointers always point the function for single byte locale. */
-+static void (*print_char) (char c);
-+static int (*char_to_clump) (char c);
-+
-+/* Functions for single byte locale. */
-+static void print_char_single (char c);
-+static int char_to_clump_single (char c);
-+
-+/* Functions for multibyte locale. */
-+static void print_char_multi (char c);
-+static int char_to_clump_multi (char c);
-+
- static bool read_line (COLUMN *p);
- static bool print_page (void);
- static bool print_stored (COLUMN *p);
-@@ -426,6 +477,7 @@
- static void pad_across_to (int position);
- static void add_line_number (COLUMN *p);
- static void getoptarg (char *arg, char switch_char, char *character,
-+                     int *character_length, int *character_width,
-                      int *number);
- void usage (int status);
- static void print_files (int number_of_files, char **av);
-@@ -440,7 +492,6 @@
- static void pad_down (int lines);
- static void read_rest_of_line (COLUMN *p);
- static void skip_read (COLUMN *p, int column_number);
--static void print_char (char c);
- static void cleanup (void);
- static void print_sep_string (void);
- static void separator_string (const char *optarg_S);
-@@ -455,7 +506,7 @@
-    we store the leftmost columns contiguously in buff.
-    To print a line from buff, get the index of the first character
-    from line_vector[i], and print up to line_vector[i + 1]. */
--static char *buff;
-+static unsigned char *buff;
- /* Index of the position in buff where the next character
-    will be stored. */
-@@ -559,7 +610,7 @@
- static bool untabify_input = false;
- /* (-e) The input tab character. */
--static char input_tab_char = '\t';
-+static char input_tab_char[MB_LEN_MAX] = "\t";
- /* (-e) Tabstops are at chars_per_tab, 2*chars_per_tab, 3*chars_per_tab, ...
-    where the leftmost column is 1. */
-@@ -569,7 +620,10 @@
- static bool tabify_output = false;
- /* (-i) The output tab character. */
--static char output_tab_char = '\t';
-+static char output_tab_char[MB_LEN_MAX] = "\t";
-+
-+/* (-i) The byte length of output tab character. */
-+static int output_tab_char_length = 1;
- /* (-i) The width of the output tab. */
- static int chars_per_output_tab = 8;
-@@ -643,7 +697,13 @@
- static bool numbered_lines = false;
- /* (-n) Character which follows each line number. */
--static char number_separator = '\t';
-+static char number_separator[MB_LEN_MAX] = "\t";
-+
-+/* (-n) The byte length of the character which follows each line number. */
-+static int number_separator_length = 1;
-+
-+/* (-n) The character width of the character which follows each line number. */
-+static int number_separator_width = 0;
- /* (-n) line counting starts with 1st line of input file (not with 1st
-    line of 1st page printed). */
-@@ -696,6 +756,7 @@
-    -a|COLUMN|-m is a `space' and with the -J option a `tab'. */
- static char *col_sep_string = "";
- static int col_sep_length = 0;
-+static int col_sep_width = 0;
- static char *column_separator = " ";
- static char *line_separator = "\t";
-@@ -852,6 +913,13 @@
-   col_sep_length = (int) strlen (optarg_S);
-   col_sep_string = xmalloc (col_sep_length + 1);
-   strcpy (col_sep_string, optarg_S);
-+
-+#if HAVE_MBRTOWC
-+  if (MB_CUR_MAX > 1)
-+    col_sep_width = mbswidth (col_sep_string, 0);
-+  else
-+#endif
-+    col_sep_width = col_sep_length;
- }
- int
-@@ -877,6 +945,21 @@
-   atexit (close_stdout);
-+/* Define which functions are used, the ones for single byte locale or the ones
-+   for multibyte locale. */
-+#if HAVE_MBRTOWC
-+  if (MB_CUR_MAX > 1)
-+    {
-+      print_char = print_char_multi;
-+      char_to_clump = char_to_clump_multi;
-+    }
-+  else
-+#endif
-+    {
-+      print_char = print_char_single;
-+      char_to_clump = char_to_clump_single;
-+    }
-+
-   n_files = 0;
-   file_names = (argc > 1
-               ? xmalloc ((argc - 1) * sizeof (char *))
-@@ -949,8 +1032,12 @@
-         break;
-       case 'e':
-         if (optarg)
--          getoptarg (optarg, 'e', &input_tab_char,
--                     &chars_per_input_tab);
-+          {
-+            int dummy_length, dummy_width;
-+
-+            getoptarg (optarg, 'e', input_tab_char, &dummy_length,
-+                       &dummy_width, &chars_per_input_tab);
-+          }
-         /* Could check tab width > 0. */
-         untabify_input = true;
-         break;
-@@ -963,8 +1050,12 @@
-         break;
-       case 'i':
-         if (optarg)
--          getoptarg (optarg, 'i', &output_tab_char,
--                     &chars_per_output_tab);
-+          {
-+            int dummy_width;
-+
-+            getoptarg (optarg, 'i', output_tab_char, &output_tab_char_length,
-+                       &dummy_width, &chars_per_output_tab);
-+          }
-         /* Could check tab width > 0. */
-         tabify_output = true;
-         break;
-@@ -991,8 +1082,8 @@
-       case 'n':
-         numbered_lines = true;
-         if (optarg)
--          getoptarg (optarg, 'n', &number_separator,
--                     &chars_per_number);
-+          getoptarg (optarg, 'n', number_separator, &number_separator_length,
-+                     &number_separator_width, &chars_per_number);
-         break;
-       case 'N':
-         skip_count = false;
-@@ -1031,7 +1122,7 @@
-         old_s = false;
-         /* Reset an additional input of -s, -S dominates -s */
-         col_sep_string = "";
--        col_sep_length = 0;
-+        col_sep_length = col_sep_width = 0;
-         use_col_separator = true;
-         if (optarg)
-           separator_string (optarg);
-@@ -1188,10 +1279,45 @@
-    a number. */
- static void
--getoptarg (char *arg, char switch_char, char *character, int *number)
-+getoptarg (char *arg, char switch_char, char *character, int *character_length,
-+         int *character_width, int *number)
- {
-   if (!ISDIGIT (*arg))
--    *character = *arg++;
-+    {
-+#ifdef HAVE_MBRTOWC
-+      if (MB_CUR_MAX > 1)     /* for multibyte locale. */
-+      {
-+        wchar_t wc;
-+        size_t mblength;
-+        int width;
-+        mbstate_t state = {'\0'};
-+
-+        mblength = mbrtowc (&wc, arg, strnlen(arg, MB_LEN_MAX), &state);
-+
-+        if (mblength == (size_t)-1 || mblength == (size_t)-2)
-+          {
-+            *character_length = 1;
-+            *character_width = 1;
-+          }
-+        else
-+          {
-+            *character_length = (mblength < 1) ? 1 : mblength;
-+            width = wcwidth (wc);
-+            *character_width = (width < 0) ? 0 : width;
-+          }
-+
-+        strncpy (character, arg, *character_length);
-+        arg += *character_length;
-+      }
-+      else                    /* for single byte locale. */
-+#endif
-+      {
-+        *character = *arg++;
-+        *character_length = 1;
-+        *character_width = 1;
-+      }
-+    }
-+
-   if (*arg)
-     {
-       long int tmp_long;
-@@ -1256,7 +1382,7 @@
-         else
-           col_sep_string = column_separator;
--        col_sep_length = 1;
-+        col_sep_length = col_sep_width = 1;
-         use_col_separator = true;
-       }
-       /* It's rather pointless to define a TAB separator with column
-@@ -1288,11 +1414,11 @@
-            TAB_WIDTH (chars_per_input_tab, chars_per_number);   */
-       /* Estimate chars_per_text without any margin and keep it constant. */
--      if (number_separator == '\t')
-+      if (number_separator[0] == '\t')
-       number_width = chars_per_number +
-         TAB_WIDTH (chars_per_default_tab, chars_per_number);
-       else
--      number_width = chars_per_number + 1;
-+      number_width = chars_per_number + number_separator_width;
-       /* The number is part of the column width unless we are
-        printing files in parallel. */
-@@ -1307,7 +1433,7 @@
-     }
-   chars_per_column = (chars_per_line - chars_used_by_number -
--                   (columns - 1) * col_sep_length) / columns;
-+                   (columns - 1) * col_sep_width) / columns;
-   if (chars_per_column < 1)
-     error (EXIT_FAILURE, 0, _("page width too narrow"));
-@@ -1432,7 +1558,7 @@
-   /* Enlarge p->start_position of first column to use the same form of
-      padding_not_printed with all columns. */
--  h = h + col_sep_length;
-+  h = h + col_sep_width;
-   /* This loop takes care of all but the rightmost column. */
-@@ -1466,7 +1592,7 @@
-       }
-       else
-       {
--        h = h_next + col_sep_length;
-+        h = h_next + col_sep_width;
-         h_next = h + chars_per_column;
-       }
-     }
-@@ -1756,9 +1882,9 @@
- align_column (COLUMN *p)
- {
-   padding_not_printed = p->start_position;
--  if (padding_not_printed - col_sep_length > 0)
-+  if (padding_not_printed - col_sep_width > 0)
-     {
--      pad_across_to (padding_not_printed - col_sep_length);
-+      pad_across_to (padding_not_printed - col_sep_width);
-       padding_not_printed = ANYWHERE;
-     }
-@@ -2029,13 +2155,13 @@
-       /* May be too generous. */
-       buff = X2REALLOC (buff, &buff_allocated);
-     }
--  buff[buff_current++] = c;
-+  buff[buff_current++] = (unsigned char) c;
- }
- static void
- add_line_number (COLUMN *p)
- {
--  int i;
-+  int i, j;
-   char *s;
-   int left_cut;
-@@ -2058,22 +2184,24 @@
-       /* Tabification is assumed for multiple columns, also for n-separators,
-        but `default n-separator = TAB' hasn't been given priority over
-        equal column_width also specified by POSIX. */
--      if (number_separator == '\t')
-+      if (number_separator[0] == '\t')
-         {
-           i = number_width - chars_per_number;
-           while (i-- > 0)
-           (p->char_func) (' ');
-         }
-       else
--        (p->char_func) (number_separator);
-+      for (j = 0; j < number_separator_length; j++)
-+        (p->char_func) (number_separator[j]);
-     }
-   else
-     /* To comply with POSIX, we avoid any expansion of default TAB
-        separator with a single column output. No column_width requirement
-        has to be considered. */
-     {
--      (p->char_func) (number_separator);
--      if (number_separator == '\t')
-+      for (j = 0; j < number_separator_length; j++)
-+      (p->char_func) (number_separator[j]);
-+      if (number_separator[0] == '\t')
-         output_position = POS_AFTER_TAB (chars_per_output_tab,
-                         output_position);
-     }
-@@ -2234,7 +2362,7 @@
-   while (goal - h_old > 1
-        && (h_new = POS_AFTER_TAB (chars_per_output_tab, h_old)) <= goal)
-     {
--      putchar (output_tab_char);
-+      fwrite (output_tab_char, sizeof(char), output_tab_char_length, stdout);
-       h_old = h_new;
-     }
-   while (++h_old <= goal)
-@@ -2254,6 +2382,7 @@
- {
-   char *s;
-   int l = col_sep_length;
-+  int not_space_flag;
-   s = col_sep_string;
-@@ -2267,6 +2396,7 @@
-     {
-       for (; separators_not_printed > 0; --separators_not_printed)
-       {
-+        not_space_flag = 0;
-         while (l-- > 0)
-           {
-             /* 3 types of sep_strings: spaces only, spaces and chars,
-@@ -2280,12 +2410,15 @@
-               }
-             else
-               {
-+                not_space_flag = 1;
-                 if (spaces_not_printed > 0)
-                   print_white_space ();
-                 putchar (*s++);
--                ++output_position;
-               }
-           }
-+        if (not_space_flag)
-+          output_position += col_sep_width;
-+
-           /* sep_string ends with some spaces */
-         if (spaces_not_printed > 0)
-           print_white_space ();
-@@ -2313,7 +2446,7 @@
-    required number of tabs and spaces. */
- static void
--print_char (char c)
-+print_char_single (char c)
- {
-   if (tabify_output)
-     {
-@@ -2337,6 +2470,74 @@
-   putchar (c);
- }
-+#ifdef HAVE_MBRTOWC
-+static void
-+print_char_multi (char c)
-+{
-+  static size_t mbc_pos = 0;
-+  static unsigned char mbc[MB_LEN_MAX] = {'\0'};
-+  static mbstate_t state = {'\0'};
-+  mbstate_t state_bak;
-+  wchar_t wc;
-+  size_t mblength;
-+  int width;
-+
-+  if (tabify_output)
-+    {
-+      state_bak = state;
-+      mbc[mbc_pos++] = (unsigned char)c;
-+      mblength = mbrtowc (&wc, mbc, mbc_pos, &state);
-+
-+      while (mbc_pos > 0)
-+      {
-+        switch (mblength)
-+          {
-+          case (size_t)-2:
-+            state = state_bak;
-+            return;
-+
-+          case (size_t)-1:
-+            state = state_bak;
-+            ++output_position;
-+            putchar (mbc[0]);
-+            memmove (mbc, mbc + 1, MB_CUR_MAX - 1);
-+            --mbc_pos;
-+            break;
-+
-+          case 0:
-+            mblength = 1;
-+
-+          default:
-+            if (wc == L' ')
-+              {
-+                memmove (mbc, mbc + mblength, MB_CUR_MAX - mblength);
-+                --mbc_pos;
-+                ++spaces_not_printed;
-+                return;
-+              }
-+            else if (spaces_not_printed > 0)
-+              print_white_space ();
-+
-+            /* Nonprintables are assumed to have width 0, except L'\b'. */
-+            if ((width = wcwidth (wc)) < 1)
-+              {
-+                if (wc == L'\b')
-+                  --output_position;
-+              }
-+            else
-+              output_position += width;
-+
-+            fwrite (mbc, sizeof(char), mblength, stdout);
-+            memmove (mbc, mbc + mblength, MB_CUR_MAX - mblength);
-+            mbc_pos -= mblength;
-+          }
-+      }
-+      return;
-+    }
-+  putchar (c);
-+}
-+#endif
-+
- /* Skip to page PAGE before printing.
-    PAGE may be larger than total number of pages. */
-@@ -2517,9 +2718,9 @@
-         align_empty_cols = false;
-       }
--      if (padding_not_printed - col_sep_length > 0)
-+      if (padding_not_printed - col_sep_width > 0)
-       {
--        pad_across_to (padding_not_printed - col_sep_length);
-+        pad_across_to (padding_not_printed - col_sep_width);
-         padding_not_printed = ANYWHERE;
-       }
-@@ -2620,9 +2821,9 @@
-       }
-     }
--  if (padding_not_printed - col_sep_length > 0)
-+  if (padding_not_printed - col_sep_width > 0)
-     {
--      pad_across_to (padding_not_printed - col_sep_length);
-+      pad_across_to (padding_not_printed - col_sep_width);
-       padding_not_printed = ANYWHERE;
-     }
-@@ -2635,8 +2836,8 @@
-   if (spaces_not_printed == 0)
-     {
-       output_position = p->start_position + end_vector[line];
--      if (p->start_position - col_sep_length == chars_per_margin)
--      output_position -= col_sep_length;
-+      if (p->start_position - col_sep_width == chars_per_margin)
-+      output_position -= col_sep_width;
-     }
-   return true;
-@@ -2655,7 +2856,7 @@
-    number of characters is 1.) */
- static int
--char_to_clump (char c)
-+char_to_clump_single (char c)
- {
-   unsigned char uc = c;
-   char *s = clump_buff;
-@@ -2665,10 +2866,10 @@
-   int chars;
-   int chars_per_c = 8;
--  if (c == input_tab_char)
-+  if (c == input_tab_char[0])
-     chars_per_c = chars_per_input_tab;
--  if (c == input_tab_char || c == '\t')
-+  if (c == input_tab_char[0] || c == '\t')
-     {
-       width = TAB_WIDTH (chars_per_c, input_position);
-@@ -2739,6 +2940,154 @@
-   return chars;
- }
-+#ifdef HAVE_MBRTOWC
-+static int
-+char_to_clump_multi (char c)
-+{
-+  static size_t mbc_pos = 0;
-+  static char mbc[MB_LEN_MAX] = {'\0'};
-+  static mbstate_t state = {'\0'};
-+  mbstate_t state_bak;
-+  wchar_t wc;
-+  size_t mblength;
-+  int wc_width;
-+  register int *s = clump_buff;
-+  register int i, j;
-+  char esc_buff[4];
-+  int width;
-+  int chars;
-+  int chars_per_c = 8;
-+
-+  state_bak = state;
-+  mbc[mbc_pos++] = c;
-+  mblength = mbrtowc (&wc, mbc, mbc_pos, &state);
-+
-+  width = 0;
-+  chars = 0;
-+  while (mbc_pos > 0)
-+    {
-+      switch (mblength)
-+      {
-+      case (size_t)-2:
-+        state = state_bak;
-+        return 0;
-+
-+      case (size_t)-1:
-+        state = state_bak;
-+        mblength = 1;
-+
-+        if (use_esc_sequence || use_cntrl_prefix)
-+          {
-+            width = +4;
-+            chars = +4;
-+            *s++ = '\\';
-+            sprintf (esc_buff, "%03o", mbc[0]);
-+            for (i = 0; i <= 2; ++i)
-+              *s++ = (int) esc_buff[i];
-+          }
-+        else
-+          {
-+            width += 1;
-+            chars += 1;
-+            *s++ = mbc[0];
-+          }
-+        break;
-+
-+      case 0:
-+        mblength = 1;
-+              /* Fall through */
-+
-+      default:
-+        if (memcmp (mbc, input_tab_char, mblength) == 0)
-+          chars_per_c = chars_per_input_tab;
-+
-+        if (memcmp (mbc, input_tab_char, mblength) == 0 || c == '\t')
-+          {
-+            int  width_inc;
-+
-+            width_inc = TAB_WIDTH (chars_per_c, input_position);
-+            width += width_inc;
-+
-+            if (untabify_input)
-+              {
-+                for (i = width_inc; i; --i)
-+                  *s++ = ' ';
-+                chars += width_inc;
-+              }
-+            else
-+              {
-+                for (i = 0; i <  mblength; i++)
-+                  *s++ = mbc[i];
-+                chars += mblength;
-+              }
-+          }
-+        else if ((wc_width = wcwidth (wc)) < 1)
-+          {
-+            if (use_esc_sequence)
-+              {
-+                for (i = 0; i < mblength; i++)
-+                  {
-+                    width += 4;
-+                    chars += 4;
-+                    *s++ = '\\';
-+                    sprintf (esc_buff, "%03o", c);
-+                    for (j = 0; j <= 2; ++j)
-+                      *s++ = (int) esc_buff[j];
-+                  }
-+              }
-+            else if (use_cntrl_prefix)
-+              {
-+                if (wc < 0200)
-+                  {
-+                    width += 2;
-+                    chars += 2;
-+                    *s++ = '^';
-+                    *s++ = wc ^ 0100;
-+                  }
-+                else
-+                  {
-+                    for (i = 0; i < mblength; i++)
-+                      {
-+                        width += 4;
-+                        chars += 4;
-+                        *s++ = '\\';
-+                        sprintf (esc_buff, "%03o", c);
-+                        for (j = 0; j <= 2; ++j)
-+                          *s++ = (int) esc_buff[j];
-+                      }
-+                  }
-+              }
-+            else if (wc == L'\b')
-+              {
-+                width += -1;
-+                chars += 1;
-+                *s++ = c;
-+              }
-+            else
-+              {
-+                width += 0;
-+                chars += mblength;
-+                for (i = 0; i < mblength; i++)
-+                  *s++ = mbc[i];
-+              }
-+          }
-+        else
-+          {
-+            width += wc_width;
-+            chars += mblength;
-+            for (i = 0; i < mblength; i++)
-+              *s++ = mbc[i];
-+          }
-+      }
-+      memmove (mbc, mbc + mblength, MB_CUR_MAX - mblength);
-+      mbc_pos -= mblength;
-+    }
-+
-+  input_position += width;
-+  return chars;
-+}
-+#endif
-+
- /* We've just printed some files and need to clean up things before
-    looking for more options and printing the next batch of files.
---- coreutils-5.93/src/uniq.c.i18n     2005-07-05 07:32:54.000000000 +0100
-+++ coreutils-5.93/src/uniq.c  2005-12-23 08:53:01.000000000 +0000
-@@ -23,6 +23,16 @@
- #include <getopt.h>
- #include <sys/types.h>
-+/* Get mbstate_t, mbrtowc(). */
-+#if HAVE_WCHAR_H
-+# include <wchar.h>
-+#endif
-+
-+/* Get isw* functions. */
-+#if HAVE_WCTYPE_H
-+# include <wctype.h>
-+#endif
-+
- #include "system.h"
- #include "argmatch.h"
- #include "linebuffer.h"
-@@ -32,7 +42,19 @@
- #include "quote.h"
- #include "xmemcoll.h"
- #include "xstrtol.h"
--#include "memcasecmp.h"
-+#include "xmemcoll.h"
-+
-+/* MB_LEN_MAX is incorrectly defined to be 1 in at least one GCC
-+   installation; work around this configuration error.  */
-+#if !defined MB_LEN_MAX || MB_LEN_MAX < 2
-+# define MB_LEN_MAX 16
-+#endif
-+
-+/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t.  */
-+#if HAVE_MBRTOWC && defined mbstate_t
-+# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0)
-+#endif
-+
- /* The official name of this program (e.g., no `g' prefix).  */
- #define PROGRAM_NAME "uniq"
-@@ -109,6 +131,10 @@
- /* Select whether/how to delimit groups of duplicate lines.  */
- static enum delimit_method delimit_groups;
-+/* Function pointers. */
-+static char *
-+(*find_field) (struct linebuffer *line);
-+
- static struct option const longopts[] =
- {
-   {"count", no_argument, NULL, 'c'},
-@@ -189,7 +215,7 @@
-    return a pointer to the beginning of the line's field to be compared. */
- static char *
--find_field (const struct linebuffer *line)
-+find_field_uni (struct linebuffer *line)
- {
-   size_t count;
-   char *lp = line->buffer;
-@@ -210,6 +236,83 @@
-   return lp + i;
- }
-+#if HAVE_MBRTOWC
-+
-+# define MBCHAR_TO_WCHAR(WC, MBLENGTH, LP, POS, SIZE, STATEP, CONVFAIL)  \
-+  do                                                                  \
-+    {                                                                 \
-+      mbstate_t state_bak;                                            \
-+                                                                      \
-+      CONVFAIL = 0;                                                   \
-+      state_bak = *STATEP;                                            \
-+                                                                      \
-+      MBLENGTH = mbrtowc (&WC, LP + POS, SIZE - POS, STATEP);         \
-+                                                                      \
-+      switch (MBLENGTH)                                                       \
-+      {                                                               \
-+      case (size_t)-2:                                                \
-+      case (size_t)-1:                                                \
-+        *STATEP = state_bak;                                          \
-+        CONVFAIL++;                                                   \
-+        /* Fall through */                                            \
-+      case 0:                                                         \
-+        MBLENGTH = 1;                                                 \
-+      }                                                               \
-+    }                                                                 \
-+  while (0)
-+
-+static char *
-+find_field_multi (struct linebuffer *line)
-+{
-+  size_t count;
-+  char *lp = line->buffer;
-+  size_t size = line->length - 1;
-+  size_t pos;
-+  size_t mblength;
-+  wchar_t wc;
-+  mbstate_t *statep;
-+  int convfail;
-+
-+  pos = 0;
-+  statep = &(line->state);
-+
-+  /* skip fields. */
-+  for (count = 0; count < skip_fields && pos < size; count++)
-+    {
-+      while (pos < size)
-+      {
-+        MBCHAR_TO_WCHAR (wc, mblength, lp, pos, size, statep, convfail);
-+ 
-+        if (convfail || !iswblank (wc))
-+          {
-+            pos += mblength;
-+            break;
-+          }
-+        pos += mblength;
-+      }
-+
-+      while (pos < size)
-+      {
-+        MBCHAR_TO_WCHAR (wc, mblength, lp, pos, size, statep, convfail);
-+
-+        if (!convfail && iswblank (wc))
-+          break;
-+
-+        pos += mblength;
-+      }
-+    }
-+
-+  /* skip fields. */
-+  for (count = 0; count < skip_chars && pos < size; count++)
-+    {
-+      MBCHAR_TO_WCHAR (wc, mblength, lp, pos, size, statep, convfail);
-+      pos += mblength;
-+    }
-+
-+  return lp + pos;
-+}
-+#endif
-+
- /* Return false if two strings OLD and NEW match, true if not.
-    OLD and NEW point not to the beginnings of the lines
-    but rather to the beginnings of the fields to compare.
-@@ -218,6 +321,8 @@
- static bool
- different (char *old, char *new, size_t oldlen, size_t newlen)
- {
-+  char *copy_old, *copy_new;
-+
-   if (check_chars < oldlen)
-     oldlen = check_chars;
-   if (check_chars < newlen)
-@@ -225,14 +330,92 @@
-   if (ignore_case)
-     {
--      /* FIXME: This should invoke strcoll somehow.  */
--      return oldlen != newlen || memcasecmp (old, new, oldlen);
-+      size_t i;
-+
-+      copy_old = alloca (oldlen + 1);
-+      copy_new = alloca (oldlen + 1);
-+
-+      for (i = 0; i < oldlen; i++)
-+      {
-+        copy_old[i] = toupper (old[i]);
-+        copy_new[i] = toupper (new[i]);
-+      }
-     }
--  else if (hard_LC_COLLATE)
--    return xmemcoll (old, oldlen, new, newlen) != 0;
-   else
--    return oldlen != newlen || memcmp (old, new, oldlen);
-+    {
-+      copy_old = (char *)old;
-+      copy_new = (char *)new;
-+    }
-+
-+  return xmemcoll (copy_old, oldlen, copy_new, newlen);
-+}
-+
-+#if HAVE_MBRTOWC
-+static int
-+different_multi (const char *old, const char *new, size_t oldlen, size_t newlen, mbstate_t oldstate, mbstate_t newstate)
-+{
-+  size_t i, j, chars;
-+  const char *str[2];
-+  char *copy[2];
-+  size_t len[2];
-+  mbstate_t state[2];
-+  size_t mblength;
-+  wchar_t wc, uwc;
-+  mbstate_t state_bak;
-+
-+  str[0] = old;
-+  str[1] = new;
-+  len[0] = oldlen;
-+  len[1] = newlen;
-+  state[0] = oldstate;
-+  state[1] = newstate;
-+
-+  for (i = 0; i < 2; i++)
-+    {
-+      copy[i] = alloca (len[i] + 1);
-+
-+      for (j = 0, chars = 0; j < len[i] && chars < check_chars; chars++)
-+      {
-+        state_bak = state[i];
-+        mblength = mbrtowc (&wc, str[i] + j, len[i] - j, &(state[i]));
-+
-+        switch (mblength)
-+          {
-+          case (size_t)-1:
-+          case (size_t)-2:
-+            state[i] = state_bak;
-+            /* Fall through */
-+          case 0:
-+            mblength = 1;
-+            break;
-+
-+          default:
-+            if (ignore_case)
-+              {
-+                uwc = towupper (wc);
-+
-+                if (uwc != wc)
-+                  {
-+                    mbstate_t state_wc;
-+
-+                    memset (&state_wc, '\0', sizeof(mbstate_t));
-+                    wcrtomb (copy[i] + j, uwc, &state_wc);
-+                  }
-+                else
-+                  memcpy (copy[i] + j, str[i] + j, mblength);
-+              }
-+            else
-+              memcpy (copy[i] + j, str[i] + j, mblength);
-+          }
-+        j += mblength;
-+      }
-+      copy[i][j] = '\0';
-+      len[i] = j;
-+    }
-+
-+  return xmemcoll (copy[0], len[0], copy[1], len[1]);
- }
-+#endif
- /* Output the line in linebuffer LINE to standard output
-    provided that the switches say it should be output.
-@@ -286,15 +469,43 @@
-     {
-       char *prevfield IF_LINT (= NULL);
-       size_t prevlen IF_LINT (= 0);
-+#if HAVE_MBRTOWC
-+      mbstate_t prevstate;
-+
-+      memset (&prevstate, '\0', sizeof (mbstate_t));
-+#endif
-       while (!feof (stdin))
-       {
-         char *thisfield;
-         size_t thislen;
-+#if HAVE_MBRTOWC
-+        mbstate_t thisstate;
-+#endif
-+
-         if (readlinebuffer (thisline, stdin) == 0)
-           break;
-         thisfield = find_field (thisline);
-         thislen = thisline->length - 1 - (thisfield - thisline->buffer);
-+#if HAVE_MBRTOWC
-+        if (MB_CUR_MAX > 1)
-+            {
-+            thisstate = thisline->state;
-+
-+            if (prevline->length == 0 || different_multi
-+              (thisfield, prevfield, thislen, prevlen, thisstate, prevstate))
-+              {
-+                fwrite (thisline->buffer, sizeof (char),
-+                        thisline->length, stdout);
-+
-+                SWAP_LINES (prevline, thisline);
-+                prevfield = thisfield;
-+                prevlen = thislen;
-+                prevstate = thisstate;
-+              }
-+          }
-+      else
-+#endif
-         if (prevline->length == 0
-             || different (thisfield, prevfield, thislen, prevlen))
-           {
-@@ -313,17 +524,26 @@
-       size_t prevlen;
-       uintmax_t match_count = 0;
-       bool first_delimiter = true;
-+#if HAVE_MBRTOWC
-+      mbstate_t prevstate;
-+#endif
-       if (readlinebuffer (prevline, stdin) == 0)
-       goto closefiles;
-       prevfield = find_field (prevline);
-       prevlen = prevline->length - 1 - (prevfield - prevline->buffer);
-+#if HAVE_MBRTOWC
-+      prevstate = prevline->state;
-+#endif
-       while (!feof (stdin))
-       {
-         bool match;
-         char *thisfield;
-         size_t thislen;
-+#if HAVE_MBRTOWC
-+        mbstate_t thisstate;
-+#endif
-         if (readlinebuffer (thisline, stdin) == 0)
-           {
-             if (ferror (stdin))
-@@ -332,6 +552,15 @@
-           }
-         thisfield = find_field (thisline);
-         thislen = thisline->length - 1 - (thisfield - thisline->buffer);
-+#if HAVE_MBRTOWC
-+        if (MB_CUR_MAX > 1)
-+          {
-+              thisstate = thisline->state;
-+              match = !different_multi (thisfield, prevfield,
-+                                thislen, prevlen, thisstate, prevstate);
-+            }
-+        else
-+#endif
-         match = !different (thisfield, prevfield, thislen, prevlen);
-         match_count += match;
-@@ -364,6 +593,9 @@
-             SWAP_LINES (prevline, thisline);
-             prevfield = thisfield;
-             prevlen = thislen;
-+#if HAVE_MBRTOWC
-+            prevstate = thisstate;
-+#endif
-             if (!match)
-               match_count = 0;
-           }
-@@ -408,6 +640,19 @@
-   atexit (close_stdout);
-+#if HAVE_MBRTOWC
-+  if (MB_CUR_MAX > 1)
-+    {
-+      find_field = find_field_multi;
-+    }
-+  else
-+#endif
-+    {
-+      find_field = find_field_uni;
-+    }
-+
-+
-+
-   skip_chars = 0;
-   skip_fields = 0;
-   check_chars = SIZE_MAX;
---- coreutils-5.93/src/expand.c.i18n   2005-08-12 08:16:25.000000000 +0100
-+++ coreutils-5.93/src/expand.c        2005-12-23 08:53:01.000000000 +0000
-@@ -38,11 +38,28 @@
- #include <stdio.h>
- #include <getopt.h>
- #include <sys/types.h>
-+
-+/* Get mbstate_t, mbrtowc(), wcwidth(). */
-+#if HAVE_WCHAR_H
-+# include <wchar.h>
-+#endif
-+
- #include "system.h"
- #include "error.h"
- #include "quote.h"
- #include "xstrndup.h"
-+/* MB_LEN_MAX is incorrectly defined to be 1 in at least one GCC
-+   installation; work around this configuration error.  */
-+#if !defined MB_LEN_MAX || MB_LEN_MAX < 2
-+# define MB_LEN_MAX 16
-+#endif
-+
-+/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t.  */
-+#if HAVE_MBRTOWC && defined mbstate_t
-+# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0)
-+#endif
-+
- /* The official name of this program (e.g., no `g' prefix).  */
- #define PROGRAM_NAME "expand"
-@@ -182,6 +199,7 @@
-             stops = num_start + len - 1;
-           }
-       }
-+
-       else
-       {
-         error (0, 0, _("tab size contains invalid character(s): %s"),
-@@ -364,6 +382,142 @@
-     }
- }
-+#if HAVE_MBRTOWC
-+static void
-+expand_multibyte (void)
-+{
-+  FILE *fp;                   /* Input strem. */
-+  mbstate_t i_state;          /* Current shift state of the input stream. */
-+  mbstate_t i_state_bak;      /* Back up the I_STATE. */
-+  mbstate_t o_state;          /* Current shift state of the output stream. */
-+  char buf[MB_LEN_MAX + BUFSIZ];  /* For spooling a read byte sequence. */
-+  char *bufpos;                       /* Next read position of BUF. */
-+  size_t buflen = 0;          /* The length of the byte sequence in buf. */
-+  wchar_t wc;                 /* A gotten wide character. */
-+  size_t mblength;            /* The byte size of a multibyte character
-+                                 which shows as same character as WC. */
-+  int tab_index = 0;          /* Index in `tab_list' of next tabstop. */
-+  int column = 0;             /* Column on screen of the next char. */
-+  int next_tab_column;                /* Column the next tab stop is on. */
-+  int convert = 1;            /* If nonzero, perform translations. */
-+
-+  fp = next_file ((FILE *) NULL);
-+  if (fp == NULL)
-+    return;
-+
-+  memset (&o_state, '\0', sizeof(mbstate_t));
-+  memset (&i_state, '\0', sizeof(mbstate_t));
-+
-+  for (;;)
-+    {
-+      /* Refill the buffer BUF. */
-+      if (buflen < MB_LEN_MAX && !feof(fp) && !ferror(fp))
-+      {
-+        memmove (buf, bufpos, buflen);
-+        buflen += fread (buf + buflen, sizeof(char), BUFSIZ, fp);
-+        bufpos = buf;
-+      }
-+
-+      /* No character is left in BUF. */
-+      if (buflen < 1)
-+      {
-+        fp = next_file (fp);
-+
-+        if (fp == NULL)
-+          break;              /* No more files. */
-+        else
-+          {
-+            memset (&i_state, '\0', sizeof(mbstate_t));
-+            continue;
-+          }
-+      }
-+
-+      /* Get a wide character. */
-+      i_state_bak = i_state;
-+      mblength = mbrtowc (&wc, bufpos, buflen, &i_state);
-+
-+      switch (mblength)
-+      {
-+      case (size_t)-1:        /* illegal byte sequence. */
-+      case (size_t)-2:
-+        mblength = 1;
-+        i_state = i_state_bak;
-+        if (convert)
-+          {
-+            ++column;
-+            if (convert_entire_line == 0)
-+              convert = 0;
-+          }
-+        putchar (*bufpos);
-+        break;
-+
-+      case 0:         /* null. */
-+        mblength = 1;
-+        if (convert && convert_entire_line == 0)
-+          convert = 0;
-+        putchar ('\0');
-+        break;
-+
-+      default:
-+        if (wc == L'\n')   /* LF. */
-+          {
-+            tab_index = 0;
-+            column = 0;
-+            convert = 1;
-+            putchar ('\n');
-+          }
-+        else if (wc == L'\t' && convert)      /* Tab. */
-+          {
-+            if (tab_size == 0)
-+              {
-+                /* Do not let tab_index == first_free_tab;
-+                   stop when it is 1 less. */
-+                while (tab_index < first_free_tab - 1
-+                    && column >= tab_list[tab_index])
-+                  tab_index++;
-+                next_tab_column = tab_list[tab_index];
-+                if (tab_index < first_free_tab - 1)
-+                  tab_index++;
-+                if (column >= next_tab_column)
-+                  next_tab_column = column + 1;
-+              }
-+            else
-+              next_tab_column = column + tab_size - column % tab_size;
-+
-+            while (column < next_tab_column)
-+              {
-+                putchar (' ');
-+                ++column;
-+              }
-+          }
-+        else  /* Others. */
-+          {
-+            if (convert)
-+              {
-+                if (wc == L'\b')
-+                  {
-+                    if (column > 0)
-+                      --column;
-+                  }
-+                else
-+                  {
-+                    int width;                /* The width of WC. */
-+
-+                    width = wcwidth (wc);
-+                    column += (width > 0) ? width : 0;
-+                    if (convert_entire_line == 0)
-+                      convert = 0;
-+                  }
-+              }
-+            fwrite (bufpos, sizeof(char), mblength, stdout);
-+          }
-+      }
-+      buflen -= mblength;
-+      bufpos += mblength;
-+    }
-+}
-+#endif
-+
- int
- main (int argc, char **argv)
- {
-@@ -428,7 +582,12 @@
-   file_list = (optind < argc ? &argv[optind] : stdin_argv);
--  expand ();
-+#if HAVE_MBRTOWC
-+  if (MB_CUR_MAX > 1)
-+    expand_multibyte ();
-+  else
-+#endif
-+    expand ();
-   if (have_read_stdin && fclose (stdin) != 0)
-     error (EXIT_FAILURE, errno, "-");
---- coreutils-5.93/src/fold.c.i18n     2005-08-12 08:29:38.000000000 +0100
-+++ coreutils-5.93/src/fold.c  2005-12-23 08:53:01.000000000 +0000
-@@ -23,11 +23,33 @@
- #include <getopt.h>
- #include <sys/types.h>
-+/* Get mbstate_t, mbrtowc(), wcwidth().  */
-+#if HAVE_WCHAR_H
-+# include <wchar.h>
-+#endif
-+
-+/* Get iswprint(), iswblank(), wcwidth().  */
-+#if HAVE_WCTYPE_H
-+# include <wctype.h>
-+#endif
-+
- #include "system.h"
- #include "error.h"
- #include "quote.h"
- #include "xstrtol.h"
-+/* MB_LEN_MAX is incorrectly defined to be 1 in at least one GCC
-+      installation; work around this configuration error.  */
-+#if !defined MB_LEN_MAX || MB_LEN_MAX < 2
-+# undef MB_LEN_MAX
-+# define MB_LEN_MAX 16
-+#endif
-+
-+/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t.  */
-+#if HAVE_MBRTOWC && defined mbstate_t
-+# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0)
-+#endif
-+
- #define TAB_WIDTH 8
- /* The official name of this program (e.g., no `g' prefix).  */
-@@ -35,23 +57,44 @@
- #define AUTHORS "David MacKenzie"
-+#define FATAL_ERROR(Message)                                            \
-+  do                                                                    \
-+    {                                                                   \
-+      error (0, 0, (Message));                                          \
-+      usage (2);                                                        \
-+    }                                                                   \
-+  while (0)
-+
-+enum operating_mode
-+{
-+  /* Fold texts by columns that are at the given positions. */
-+  column_mode,
-+
-+  /* Fold texts by bytes that are at the given positions. */
-+  byte_mode,
-+
-+  /* Fold texts by characters that are at the given positions. */
-+  character_mode,
-+};
-+
- /* The name this program was run with. */
- char *program_name;
-+/* The argument shows current mode. (Default: column_mode) */
-+static enum operating_mode operating_mode;
-+
- /* If nonzero, try to break on whitespace. */
- static bool break_spaces;
--/* If nonzero, count bytes, not column positions. */
--static bool count_bytes;
--
- /* If nonzero, at least one of the files we read was standard input. */
- static bool have_read_stdin;
--static char const shortopts[] = "bsw:0::1::2::3::4::5::6::7::8::9::";
-+static char const shortopts[] = "bcsw:0::1::2::3::4::5::6::7::8::9::";
- static struct option const longopts[] =
- {
-   {"bytes", no_argument, NULL, 'b'},
-+  {"characters", no_argument, NULL, 'c'},
-   {"spaces", no_argument, NULL, 's'},
-   {"width", required_argument, NULL, 'w'},
-   {GETOPT_HELP_OPTION_DECL},
-@@ -81,6 +124,7 @@
- "), stdout);
-       fputs (_("\
-   -b, --bytes         count bytes rather than columns\n\
-+  -c, --characters    count characters rather than columns\n\
-   -s, --spaces        break at spaces\n\
-   -w, --width=WIDTH   use WIDTH columns instead of 80\n\
- "), stdout);
-@@ -98,7 +142,7 @@
- static size_t
- adjust_column (size_t column, char c)
- {
--  if (!count_bytes)
-+  if (operating_mode != byte_mode)
-     {
-       if (c == '\b')
-       {
-@@ -117,35 +161,14 @@
-   return column;
- }
--/* Fold file FILENAME, or standard input if FILENAME is "-",
--   to stdout, with maximum line length WIDTH.
--   Return true if successful.  */
--
--static bool
--fold_file (char *filename, size_t width)
-+static void
-+fold_text (FILE *istream, size_t width, int *saved_errno)
- {
--  FILE *istream;
-   int c;
-   size_t column = 0;          /* Screen column where next char will go. */
-   size_t offset_out = 0;      /* Index in `line_out' for next char. */
-   static char *line_out = NULL;
-   static size_t allocated_out = 0;
--  int saved_errno;
--
--  if (STREQ (filename, "-"))
--    {
--      istream = stdin;
--      have_read_stdin = true;
--    }
--  else
--    istream = fopen (filename, "r");
--
--  if (istream == NULL)
--    {
--      error (0, errno, "%s", filename);
--      return false;
--    }
--
-   while ((c = getc (istream)) != EOF)
-     {
-       if (offset_out + 1 >= allocated_out)
-@@ -172,6 +195,15 @@
-             bool found_blank = false;
-             size_t logical_end = offset_out;
-+            /* If LINE_OUT has no wide character,
-+               put a new wide character in LINE_OUT
-+               if column is bigger than width. */
-+            if (offset_out == 0)
-+              {
-+                line_out[offset_out++] = c;
-+                continue;
-+              }
-+
-             /* Look for the last blank. */
-             while (logical_end)
-               {
-@@ -218,11 +250,225 @@
-       line_out[offset_out++] = c;
-     }
--  saved_errno = errno;
-+  *saved_errno = errno;
-+
-+  if (offset_out)
-+    fwrite (line_out, sizeof (char), (size_t) offset_out, stdout);
-+
-+  free(line_out);
-+}
-+
-+#if HAVE_MBRTOWC
-+static void
-+fold_multibyte_text (FILE *istream, int width, int *saved_errno)
-+{
-+  char buf[MB_LEN_MAX + BUFSIZ];  /* For spooling a read byte sequence. */
-+  size_t buflen = 0;  /* The length of the byte sequence in buf. */
-+  char *bufpos;         /* Next read position of BUF. */
-+  wint_t wc;          /* A gotten wide character. */
-+  size_t mblength;    /* The byte size of a multibyte character which shows
-+                         as same character as WC. */
-+  mbstate_t state, state_bak; /* State of the stream. */
-+  int convfail;               /* 1, when conversion is failed. Otherwise 0. */
-+
-+  char *line_out = NULL;
-+  size_t offset_out = 0;      /* Index in `line_out' for next char. */
-+  size_t allocated_out = 0;
-+
-+  int increment;
-+  size_t column = 0;
-+
-+  size_t last_blank_pos;
-+  size_t last_blank_column;
-+  int is_blank_seen;
-+  int last_blank_increment;
-+  int is_bs_following_last_blank;
-+  size_t bs_following_last_blank_num;
-+  int is_cr_after_last_blank;
-+
-+#define CLEAR_FLAGS                           \
-+   do                                         \
-+     {                                                \
-+      last_blank_pos = 0;                     \
-+      last_blank_column = 0;                  \
-+      is_blank_seen = 0;                      \
-+      is_bs_following_last_blank = 0;         \
-+      bs_following_last_blank_num = 0;        \
-+      is_cr_after_last_blank = 0;             \
-+     }                                                \
-+   while (0)
-+
-+#define START_NEW_LINE                        \
-+   do                                 \
-+     {                                        \
-+      putchar ('\n');                 \
-+      column = 0;                     \
-+      offset_out = 0;                 \
-+      CLEAR_FLAGS;                    \
-+    }                                 \
-+   while (0)
-+
-+  CLEAR_FLAGS;
-+  memset (&state, '\0', sizeof(mbstate_t));
-+
-+  for (;; bufpos += mblength, buflen -= mblength)
-+    {
-+      if (buflen < MB_LEN_MAX && !feof (istream) && !ferror (istream))
-+      {
-+        memmove (buf, bufpos, buflen);
-+        buflen += fread (buf + buflen, sizeof(char), BUFSIZ, istream);
-+        bufpos = buf;
-+      }
-+
-+      if (buflen < 1)
-+      break;
-+
-+      /* Get a wide character. */
-+      convfail = 0;
-+      state_bak = state;
-+      mblength = mbrtowc ((wchar_t *)&wc, bufpos, buflen, &state);
-+
-+      switch (mblength)
-+      {
-+      case (size_t)-1:
-+      case (size_t)-2:
-+        convfail++;
-+        state = state_bak;
-+        /* Fall through. */
-+
-+      case 0:
-+        mblength = 1;
-+        break;
-+      }
-+
-+rescan:
-+      if (operating_mode == byte_mode)                        /* byte mode */
-+      increment = mblength;
-+      else if (operating_mode == character_mode)      /* character mode */
-+      increment = 1;
-+      else                                            /* column mode */
-+      {
-+        if (convfail)
-+          increment = 1;
-+        else
-+          {
-+            switch (wc)
-+              {
-+              case L'\n':
-+                fwrite (line_out, sizeof(char), offset_out, stdout);
-+                START_NEW_LINE;
-+                continue;
-+                
-+              case L'\b':
-+                increment = (column > 0) ? -1 : 0;
-+                break;
-+
-+              case L'\r':
-+                increment = -1 * column;
-+                break;
-+
-+              case L'\t':
-+                increment = 8 - column % 8;
-+                break;
-+
-+              default:
-+                increment = wcwidth (wc);
-+                increment = (increment < 0) ? 0 : increment;
-+              }
-+          }
-+      }
-+
-+      if (column + increment > width && break_spaces && last_blank_pos)
-+      {
-+        fwrite (line_out, sizeof(char), last_blank_pos, stdout);
-+        putchar ('\n');
-+
-+        offset_out = offset_out - last_blank_pos;
-+        column = column - last_blank_column + ((is_cr_after_last_blank)
-+            ? last_blank_increment : bs_following_last_blank_num);
-+        memmove (line_out, line_out + last_blank_pos, offset_out);
-+        CLEAR_FLAGS;
-+        goto rescan;
-+      }
-+
-+      if (column + increment > width && column != 0)
-+      {
-+        fwrite (line_out, sizeof(char), offset_out, stdout);
-+        START_NEW_LINE;
-+        goto rescan;
-+      }
-+
-+      if (allocated_out < offset_out + mblength)
-+      {
-+        allocated_out += 1024;
-+        line_out = xrealloc (line_out, allocated_out);
-+      }
-+
-+      memcpy (line_out + offset_out, bufpos, mblength);
-+      offset_out += mblength;
-+      column += increment;
-+
-+      if (is_blank_seen && !convfail && wc == L'\r')
-+      is_cr_after_last_blank = 1;
-+
-+      if (is_bs_following_last_blank && !convfail && wc == L'\b')
-+      ++bs_following_last_blank_num;
-+      else
-+      is_bs_following_last_blank = 0;
-+
-+      if (break_spaces && !convfail && iswblank (wc))
-+      {
-+        last_blank_pos = offset_out;
-+        last_blank_column = column;
-+        is_blank_seen = 1;
-+        last_blank_increment = increment;
-+        is_bs_following_last_blank = 1;
-+        bs_following_last_blank_num = 0;
-+        is_cr_after_last_blank = 0;
-+      }
-+    }
-+
-+  *saved_errno = errno;
-   if (offset_out)
-     fwrite (line_out, sizeof (char), (size_t) offset_out, stdout);
-+  free(line_out);
-+}
-+#endif
-+
-+/* Fold file FILENAME, or standard input if FILENAME is "-",
-+   to stdout, with maximum line length WIDTH.
-+   Return 0 if successful, 1 if an error occurs. */
-+
-+static int
-+fold_file (char *filename, int width)
-+{
-+  FILE *istream;
-+  int saved_errno;
-+
-+  if (STREQ (filename, "-"))
-+    {
-+      istream = stdin;
-+      have_read_stdin = 1;
-+    }
-+  else
-+    istream = fopen (filename, "r");
-+
-+  if (istream == NULL)
-+    {
-+      error (0, errno, "%s", filename);
-+      return 1;
-+    }
-+
-+  /* Define how ISTREAM is being folded. */
-+#if HAVE_MBRTOWC
-+  if (MB_CUR_MAX > 1)
-+    fold_multibyte_text (istream, width, &saved_errno);
-+  else
-+#endif
-+    fold_text (istream, width, &saved_errno);
-+
-   if (ferror (istream))
-     {
-       error (0, saved_errno, "%s", filename);
-@@ -255,7 +501,8 @@
-   atexit (close_stdout);
--  break_spaces = count_bytes = have_read_stdin = false;
-+  operating_mode = column_mode;
-+  break_spaces = have_read_stdin = false;
-   while ((optc = getopt_long (argc, argv, shortopts, longopts, NULL)) != -1)
-     {
-@@ -264,7 +511,15 @@
-       switch (optc)
-       {
-       case 'b':               /* Count bytes rather than columns. */
--        count_bytes = true;
-+        if (operating_mode != column_mode)
-+          FATAL_ERROR (_("only one way of folding may be specified"));
-+        operating_mode = byte_mode;
-+        break;
-+
-+      case 'c':
-+        if (operating_mode != column_mode)
-+          FATAL_ERROR (_("only one way of folding may be specified"));
-+        operating_mode = character_mode;
-         break;
-       case 's':               /* Break at word boundaries. */
---- coreutils-5.93/src/join.c.i18n     2005-08-12 08:16:25.000000000 +0100
-+++ coreutils-5.93/src/join.c  2005-12-23 08:53:01.000000000 +0000
-@@ -23,16 +23,30 @@
- #include <sys/types.h>
- #include <getopt.h>
-+/* Get mbstate_t, mbrtowc(), mbrtowc(), wcwidth().  */
-+#if HAVE_WCHAR_H
-+# include <wchar.h>
-+#endif
-+
-+/* Get iswblank(), towupper.  */
-+#if HAVE_WCTYPE_H
-+# include <wctype.h>
-+#endif
-+
- #include "system.h"
- #include "error.h"
- #include "hard-locale.h"
- #include "linebuffer.h"
--#include "memcasecmp.h"
- #include "quote.h"
- #include "stdio--.h"
- #include "xmemcoll.h"
- #include "xstrtol.h"
-+/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t.  */
-+#if HAVE_MBRTOWC && defined mbstate_t
-+# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0)
-+#endif
-+
- /* The official name of this program (e.g., no `g' prefix).  */
- #define PROGRAM_NAME "join"
-@@ -104,10 +118,12 @@
- /* Last element in `outlist', where a new element can be added.  */
- static struct outlist *outlist_end = &outlist_head;
--/* Tab character separating fields.  If negative, fields are separated
--   by any nonempty string of blanks, otherwise by exactly one
--   tab character whose value (when cast to unsigned char) equals TAB.  */
--static int tab = -1;
-+/* Tab character separating fields.  If NULL, fields are separated
-+   by any nonempty string of blanks.  */
-+static char *tab = NULL;
-+
-+/* The number of bytes used for tab. */
-+static size_t tablen = 0;
- static struct option const longopts[] =
- {
-@@ -197,6 +213,8 @@
- /* Fill in the `fields' structure in LINE.  */
-+/* Fill in the `fields' structure in LINE.  */
-+
- static void
- xfields (struct line *line)
- {
-@@ -206,10 +224,11 @@
-   if (ptr == lim)
-     return;
--  if (0 <= tab)
-+  if (tab != NULL)
-     {
-+      unsigned char t = tab[0];
-       char *sep;
--      for (; (sep = memchr (ptr, tab, lim - ptr)) != NULL; ptr = sep + 1)
-+      for (; (sep = memchr (ptr, t, lim - ptr)) != NULL; ptr = sep + 1)
-       extract_field (line, ptr, sep - ptr);
-     }
-   else
-@@ -236,6 +255,148 @@
-   extract_field (line, ptr, lim - ptr);
- }
-+#if HAVE_MBRTOWC
-+static void
-+xfields_multibyte (struct line *line)
-+{
-+  char *ptr = line->buf.buffer;
-+  char const *lim = ptr + line->buf.length - 1;
-+  wchar_t wc = 0;
-+  size_t mblength = 1;
-+  mbstate_t state, state_bak;
-+
-+  memset (&state, 0, sizeof (mbstate_t));
-+
-+  if (ptr == lim)
-+    return;
-+
-+  if (tab != NULL)
-+    {
-+      unsigned char t = tab[0];
-+      char *sep = ptr;
-+      for (; ptr < lim; ptr = sep + mblength)
-+      {
-+        sep = ptr;
-+        while (sep < lim)
-+          {
-+            state_bak = state;
-+            mblength = mbrtowc (&wc, sep, lim - sep + 1, &state);
-+
-+            if (mblength == (size_t)-1 || mblength == (size_t)-2)
-+              {
-+                mblength = 1;
-+                state = state_bak;
-+              }
-+            mblength = (mblength < 1) ? 1 : mblength;
-+
-+            if (mblength == tablen && !memcmp (sep, tab, mblength))
-+              break;
-+            else
-+              {
-+                sep += mblength;
-+                continue;
-+              }
-+          }
-+
-+        if (sep == lim)
-+          break;
-+
-+        extract_field (line, ptr, sep - ptr);
-+      }
-+    }
-+  else
-+    {
-+      /* Skip leading blanks before the first field.  */
-+      while(ptr < lim)
-+      {
-+        state_bak = state;
-+        mblength = mbrtowc (&wc, ptr, lim - ptr + 1, &state);
-+
-+        if (mblength == (size_t)-1 || mblength == (size_t)-2)
-+          {
-+            mblength = 1;
-+            state = state_bak;
-+            break;
-+          }
-+        mblength = (mblength < 1) ? 1 : mblength;
-+
-+        if (!iswblank(wc))
-+          break;
-+        ptr += mblength;
-+      }
-+
-+      do
-+      {
-+        char *sep;
-+        state_bak = state;
-+        mblength = mbrtowc (&wc, ptr, lim - ptr + 1, &state);
-+        if (mblength == (size_t)-1 || mblength == (size_t)-2)
-+          {
-+            mblength = 1;
-+            state = state_bak;
-+            break;
-+          }
-+        mblength = (mblength < 1) ? 1 : mblength;
-+
-+        sep = ptr + mblength;
-+        while (sep != lim)
-+          {
-+            state_bak = state;
-+            mblength = mbrtowc (&wc, sep, lim - sep + 1, &state);
-+            if (mblength == (size_t)-1 || mblength == (size_t)-2)
-+              {
-+                mblength = 1;
-+                state = state_bak;
-+                break;
-+              }
-+            mblength = (mblength < 1) ? 1 : mblength;
-+
-+            if (iswblank (wc))
-+              break;
-+
-+            sep += mblength;
-+          }
-+
-+        extract_field (line, ptr, sep - ptr);
-+        if (sep == lim)
-+          return;
-+
-+        state_bak = state;
-+        mblength = mbrtowc (&wc, sep, lim - sep + 1, &state);
-+        if (mblength == (size_t)-1 || mblength == (size_t)-2)
-+          {
-+            mblength = 1;
-+            state = state_bak;
-+            break;
-+          }
-+        mblength = (mblength < 1) ? 1 : mblength;
-+
-+        ptr = sep + mblength;
-+        while (ptr != lim)
-+          {
-+            state_bak = state;
-+            mblength = mbrtowc (&wc, ptr, lim - ptr + 1, &state);
-+            if (mblength == (size_t)-1 || mblength == (size_t)-2)
-+              {
-+                mblength = 1;
-+                state = state_bak;
-+                break;
-+              }
-+            mblength = (mblength < 1) ? 1 : mblength;
-+
-+            if (!iswblank (wc))
-+              break;
-+
-+            ptr += mblength;
-+          }
-+      }
-+      while (ptr != lim);
-+    }
-+
-+  extract_field (line, ptr, lim - ptr);
-+}
-+#endif
-+
- /* Read a line from FP into LINE and split it into fields.
-    Return true if successful.  */
-@@ -256,6 +417,11 @@
-   line->nfields_allocated = 0;
-   line->nfields = 0;
-   line->fields = NULL;
-+#if HAVE_MBRTOWC
-+  if (MB_CUR_MAX > 1)
-+    xfields_multibyte (line);
-+  else
-+#endif
-   xfields (line);
-   return true;
- }
-@@ -310,56 +476,114 @@
- keycmp (struct line const *line1, struct line const *line2)
- {
-   /* Start of field to compare in each file.  */
--  char *beg1;
--  char *beg2;
--
--  size_t len1;
--  size_t len2;                /* Length of fields to compare.  */
-+  char *beg[2];
-+  char *copy[2];
-+  size_t len[2];      /* Length of fields to compare.  */
-   int diff;
-+  int i, j;
-   if (join_field_1 < line1->nfields)
-     {
--      beg1 = line1->fields[join_field_1].beg;
--      len1 = line1->fields[join_field_1].len;
-+      beg[0] = line1->fields[join_field_1].beg;
-+      len[0] = line1->fields[join_field_1].len;
-     }
-   else
-     {
--      beg1 = NULL;
--      len1 = 0;
-+      beg[0] = NULL;
-+      len[0] = 0;
-     }
-   if (join_field_2 < line2->nfields)
-     {
--      beg2 = line2->fields[join_field_2].beg;
--      len2 = line2->fields[join_field_2].len;
-+      beg[1] = line2->fields[join_field_2].beg;
-+      len[1] = line2->fields[join_field_2].len;
-     }
-   else
-     {
--      beg2 = NULL;
--      len2 = 0;
-+      beg[1] = NULL;
-+      len[1] = 0;
-     }
--  if (len1 == 0)
--    return len2 == 0 ? 0 : -1;
--  if (len2 == 0)
-+  if (len[0] == 0)
-+    return len[1] == 0 ? 0 : -1;
-+  if (len[1] == 0)
-     return 1;
-   if (ignore_case)
-     {
--      /* FIXME: ignore_case does not work with NLS (in particular,
--         with multibyte chars).  */
--      diff = memcasecmp (beg1, beg2, MIN (len1, len2));
-+#ifdef HAVE_MBRTOWC
-+      if (MB_CUR_MAX > 1)
-+      {
-+        size_t mblength;
-+        wchar_t wc, uwc;
-+        mbstate_t state, state_bak;
-+
-+        memset (&state, '\0', sizeof (mbstate_t));
-+
-+        for (i = 0; i < 2; i++)
-+          {
-+            copy[i] = alloca (len[i] + 1);
-+
-+            for (j = 0; j < MIN (len[0], len[1]);)
-+              {
-+                state_bak = state;
-+                mblength = mbrtowc (&wc, beg[i] + j, len[i] - j, &state);
-+
-+                switch (mblength)
-+                  {
-+                  case (size_t) -1:
-+                  case (size_t) -2:
-+                    state = state_bak;
-+                    /* Fall through */
-+                  case 0:
-+                    mblength = 1;
-+                    break;
-+
-+                  default:
-+                    uwc = towupper (wc);
-+
-+                    if (uwc != wc)
-+                      {
-+                        mbstate_t state_wc;
-+
-+                        memset (&state_wc, '\0', sizeof (mbstate_t));
-+                        wcrtomb (copy[i] + j, uwc, &state_wc);
-+                      }
-+                    else
-+                      memcpy (copy[i] + j, beg[i] + j, mblength);
-+                  }
-+                j += mblength;
-+              }
-+            copy[i][j] = '\0';
-+          }
-+      }
-+      else
-+#endif
-+      {
-+        for (i = 0; i < 2; i++)
-+          {
-+            copy[i] = alloca (len[i] + 1);
-+
-+            for (j = 0; j < MIN (len[0], len[1]); j++)
-+              copy[i][j] = toupper (beg[i][j]);
-+
-+            copy[i][j] = '\0';
-+          }
-+      }
-     }
-   else
-     {
--      if (hard_LC_COLLATE)
--      return xmemcoll (beg1, len1, beg2, len2);
--      diff = memcmp (beg1, beg2, MIN (len1, len2));
-+      copy[0] = (unsigned char *) beg[0];
-+      copy[1] = (unsigned char *) beg[1];
-     }
-+  if (HAVE_SETLOCALE && hard_LC_COLLATE)
-+    return xmemcoll ((char *) copy[0], len[0], (char *) copy[1], len[1]);
-+  diff = memcmp (copy[0], copy[1], MIN (len[0], len[1]));
-+
-   if (diff)
-     return diff;
--  return len1 < len2 ? -1 : len1 != len2;
-+  return len[0] - len[1];
- }
- /* Print field N of LINE if it exists and is nonempty, otherwise
-@@ -384,11 +608,18 @@
- /* Print the join of LINE1 and LINE2.  */
-+#define PUT_TAB_CHAR                                                  \
-+  do                                                                  \
-+    {                                                                 \
-+      (tab != NULL) ?                                                 \
-+      fwrite(tab, sizeof(char), tablen, stdout) : putchar (' ');      \
-+    }                                                                 \
-+  while (0)                                                           
-+
- static void
- prjoin (struct line const *line1, struct line const *line2)
- {
-   const struct outlist *outlist;
--  char output_separator = tab < 0 ? ' ' : tab;
-   outlist = outlist_head.next;
-   if (outlist)
-@@ -404,12 +635,12 @@
-         if (o->file == 0)
-           {
-             if (line1 == &uni_blank)
--              {
-+              {
-                 line = line2;
-                 field = join_field_2;
-               }
-             else
--              {
-+              {
-                 line = line1;
-                 field = join_field_1;
-               }
-@@ -423,7 +654,7 @@
-         o = o->next;
-         if (o == NULL)
-           break;
--        putchar (output_separator);
-+        PUT_TAB_CHAR;
-       }
-       putchar ('\n');
-     }
-@@ -441,23 +672,23 @@
-       prfield (join_field_1, line1);
-       for (i = 0; i < join_field_1 && i < line1->nfields; ++i)
-       {
--        putchar (output_separator);
-+        PUT_TAB_CHAR;
-         prfield (i, line1);
-       }
-       for (i = join_field_1 + 1; i < line1->nfields; ++i)
-       {
--        putchar (output_separator);
-+        PUT_TAB_CHAR;
-         prfield (i, line1);
-       }
-       for (i = 0; i < join_field_2 && i < line2->nfields; ++i)
-       {
--        putchar (output_separator);
-+        PUT_TAB_CHAR;
-         prfield (i, line2);
-       }
-       for (i = join_field_2 + 1; i < line2->nfields; ++i)
-       {
--        putchar (output_separator);
-+        PUT_TAB_CHAR;
-         prfield (i, line2);
-       }
-       putchar ('\n');
-@@ -869,20 +1100,41 @@
-       case 't':
-         {
--          unsigned char newtab = optarg[0];
--          if (! newtab)
-+          char *newtab;
-+          size_t newtablen;
-+          if (! optarg[0])
-             error (EXIT_FAILURE, 0, _("empty tab"));
--          if (optarg[1])
-+          newtab = xstrdup (optarg);
-+#if HAVE_MBRTOWC
-+          if (MB_CUR_MAX > 1)
-+            {
-+              mbstate_t state;
-+
-+              memset (&state, 0, sizeof (mbstate_t));
-+              newtablen = mbrtowc (NULL, newtab,
-+                                   strnlen (newtab, MB_LEN_MAX),
-+                                   &state);
-+              if (newtablen == (size_t) 0
-+                  || newtablen == (size_t) -1
-+                  || newtablen == (size_t) -2)
-+                newtablen = 1;
-+            }
-+          else
-+#endif
-+            newtablen = 1;
-+              
-+          if (newtablen == 1 && newtab[1])
-+            {
-+              if (STREQ (newtab, "\\0"))
-+                newtab[0] = '\0';
-+            }
-+          if (tab != NULL && strcmp (tab, newtab))
-             {
--              if (STREQ (optarg, "\\0"))
--                newtab = '\0';
--              else
--                error (EXIT_FAILURE, 0, _("multi-character tab %s"),
--                       quote (optarg));
-+              free (newtab);
-+              error (EXIT_FAILURE, 0, _("incompatible tabs"));
-             }
--          if (0 <= tab && tab != newtab)
--            error (EXIT_FAILURE, 0, _("incompatible tabs"));
-           tab = newtab;
-+          tablen = newtablen;
-         }
-         break;
---- coreutils-5.93/src/unexpand.c.i18n 2005-08-12 08:16:25.000000000 +0100
-+++ coreutils-5.93/src/unexpand.c      2005-12-23 08:53:01.000000000 +0000
-@@ -39,11 +39,28 @@
- #include <stdio.h>
- #include <getopt.h>
- #include <sys/types.h>
-+
-+/* Get mbstate_t, mbrtowc(), wcwidth(). */
-+#if HAVE_WCHAR_H
-+# include <wchar.h>
-+#endif
-+
- #include "system.h"
- #include "error.h"
- #include "quote.h"
- #include "xstrndup.h"
-+/* MB_LEN_MAX is incorrectly defined to be 1 in at least one GCC
-+      installation; work around this configuration error.  */
-+#if !defined MB_LEN_MAX || MB_LEN_MAX < 2
-+# define MB_LEN_MAX 16
-+#endif
-+
-+/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t.  */
-+#if HAVE_MBRTOWC && defined mbstate_t
-+# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0)
-+#endif
-+
- /* The official name of this program (e.g., no `g' prefix).  */
- #define PROGRAM_NAME "unexpand"
-@@ -110,6 +127,208 @@
-   {NULL, 0, NULL, 0}
- };
-+static FILE *next_file (FILE *fp);
-+
-+#if HAVE_MBRTOWC
-+static void
-+unexpand_multibyte (void)
-+{
-+  FILE *fp;                   /* Input stream. */
-+  mbstate_t i_state;          /* Current shift state of the input stream. */
-+  mbstate_t i_state_bak;      /* Back up the I_STATE. */
-+  mbstate_t o_state;          /* Current shift state of the output stream. */
-+  char buf[MB_LEN_MAX + BUFSIZ];  /* For spooling a read byte sequence. */
-+  char *bufpos;                       /* Next read position of BUF. */
-+  size_t buflen = 0;          /* The length of the byte sequence in buf. */
-+  wint_t wc;                  /* A gotten wide character. */
-+  size_t mblength;            /* The byte size of a multibyte character
-+                                 which shows as same character as WC. */
-+
-+  /* Index in `tab_list' of next tabstop: */
-+  int tab_index = 0;          /* For calculating width of pending tabs. */
-+  int print_tab_index = 0;    /* For printing as many tabs as possible. */
-+  unsigned int column = 0;    /* Column on screen of next char. */
-+  int next_tab_column;                /* Column the next tab stop is on. */
-+  int convert = 1;            /* If nonzero, perform translations. */
-+  unsigned int pending = 0;   /* Pending columns of blanks. */
-+
-+  fp = next_file ((FILE *) NULL);
-+  if (fp == NULL)
-+    return;
-+
-+  memset (&o_state, '\0', sizeof(mbstate_t));
-+  memset (&i_state, '\0', sizeof(mbstate_t));
-+
-+  for (;;)
-+    {
-+      if (buflen < MB_LEN_MAX && !feof(fp) && !ferror(fp))
-+      {
-+        memmove (buf, bufpos, buflen);
-+        buflen += fread (buf + buflen, sizeof(char), BUFSIZ, fp);
-+        bufpos = buf;
-+      }
-+
-+      /* Get a wide character. */
-+      if (buflen < 1)
-+      {
-+        mblength = 1;
-+        wc = WEOF;
-+      }
-+      else
-+      {
-+        i_state_bak = i_state;
-+        mblength = mbrtowc ((wchar_t *)&wc, bufpos, buflen, &i_state);
-+      }
-+
-+      if (mblength == (size_t)-1 || mblength == (size_t)-2)
-+      {
-+        i_state = i_state_bak;
-+        wc = L'\0';
-+      }
-+
-+      if (wc == L' ' && convert && column < INT_MAX)
-+      {
-+        ++pending;
-+        ++column;
-+      }
-+      else if (wc == L'\t' && convert)
-+      {
-+        if (tab_size == 0)
-+          {
-+            /* Do not let tab_index == first_free_tab;
-+               stop when it is 1 less. */
-+            while (tab_index < first_free_tab - 1
-+                && column >= tab_list[tab_index])
-+              tab_index++;
-+            next_tab_column = tab_list[tab_index];
-+            if (tab_index < first_free_tab - 1)
-+              tab_index++;
-+            if (column >= next_tab_column)
-+              {
-+                convert = 0;  /* Ran out of tab stops. */
-+                goto flush_pend_mb;
-+              }
-+          }
-+        else
-+          {
-+            next_tab_column = column + tab_size - column % tab_size;
-+          }
-+        pending += next_tab_column - column;
-+        column = next_tab_column;
-+      }
-+      else
-+      {
-+flush_pend_mb:
-+        /* Flush pending spaces.  Print as many tabs as possible,
-+           then print the rest as spaces. */
-+        if (pending == 1)
-+          {
-+            putchar (' ');
-+            pending = 0;
-+          }
-+        column -= pending;
-+        while (pending > 0)
-+          {
-+            if (tab_size == 0)
-+              {
-+                /* Do not let print_tab_index == first_free_tab;
-+                   stop when it is 1 less. */
-+                while (print_tab_index < first_free_tab - 1
-+                    && column >= tab_list[print_tab_index])
-+                  print_tab_index++;
-+                next_tab_column = tab_list[print_tab_index];
-+                if (print_tab_index < first_free_tab - 1)
-+                  print_tab_index++;
-+              }
-+            else
-+              {
-+                next_tab_column =
-+                  column + tab_size - column % tab_size;
-+              }
-+            if (next_tab_column - column <= pending)
-+              {
-+                putchar ('\t');
-+                pending -= next_tab_column - column;
-+                column = next_tab_column;
-+              }
-+            else
-+              {
-+                --print_tab_index;
-+                column += pending;
-+                while (pending != 0)
-+                  {
-+                    putchar (' ');
-+                    pending--;
-+                  }
-+              }
-+          }
-+
-+        if (wc == WEOF)
-+          {
-+            fp = next_file (fp);
-+            if (fp == NULL)
-+              break;          /* No more files. */
-+            else
-+              {
-+                memset (&i_state, '\0', sizeof(mbstate_t));
-+                continue;
-+              }
-+          }
-+
-+        if (mblength == (size_t)-1 || mblength == (size_t)-2)
-+          {
-+            if (convert)
-+              {
-+                ++column;
-+                if (convert_entire_line == 0)
-+                  convert = 0;
-+              }
-+            mblength = 1;
-+            putchar (buf[0]);
-+          }
-+        else if (mblength == 0)
-+          {
-+            if (convert && convert_entire_line == 0)
-+              convert = 0;
-+            mblength = 1;
-+            putchar ('\0');
-+          }
-+        else
-+          {
-+            if (convert)
-+              {
-+                if (wc == L'\b')
-+                  {
-+                    if (column > 0)
-+                      --column;
-+                  }
-+                else
-+                  {
-+                    int width;            /* The width of WC. */
-+
-+                    width = wcwidth (wc);
-+                    column += (width > 0) ? width : 0;
-+                    if (convert_entire_line == 0)
-+                      convert = 0;
-+                  }
-+              }
-+
-+            if (wc == L'\n')
-+              {
-+                tab_index = print_tab_index = 0;
-+                column = pending = 0;
-+                convert = 1;
-+              }
-+            fwrite (bufpos, sizeof(char), mblength, stdout);
-+          }
-+      }
-+      buflen -= mblength;
-+      bufpos += mblength;
-+    }
-+}
-+#endif
-+
-+
- void
- usage (int status)
- {
-@@ -532,7 +751,12 @@
-   file_list = (optind < argc ? &argv[optind] : stdin_argv);
--  unexpand ();
-+#if HAVE_MBRTOWC
-+  if (MB_CUR_MAX > 1)
-+    unexpand_multibyte ();
-+  else
-+#endif
-+    unexpand ();
-   if (have_read_stdin && fclose (stdin) != 0)
-     error (EXIT_FAILURE, errno, "-");
---- coreutils-5.93/src/sort.c.i18n     2005-10-07 19:48:28.000000000 +0100
-+++ coreutils-5.93/src/sort.c  2005-12-23 10:38:44.000000000 +0000
-@@ -23,9 +23,18 @@
- #include <config.h>
-+#include <assert.h>
- #include <getopt.h>
- #include <sys/types.h>
- #include <signal.h>
-+#if HAVE_WCHAR_H
-+# include <wchar.h>
-+#endif
-+/* Get isw* functions. */
-+#if HAVE_WCTYPE_H
-+# include <wctype.h>
-+#endif
-+
- #include "system.h"
- #include "error.h"
- #include "hard-locale.h"
-@@ -95,14 +104,38 @@
- /* Thousands separator; if -1, then there isn't one.  */
- static int thousands_sep;
-+static int force_general_numcompare = 0;
-+
- /* Nonzero if the corresponding locales are hard.  */
- static bool hard_LC_COLLATE;
--#if HAVE_NL_LANGINFO
-+#if HAVE_LANGINFO_CODESET
- static bool hard_LC_TIME;
- #endif
- #define NONZERO(x) ((x) != 0)
-+/* get a multibyte character's byte length. */
-+#define GET_BYTELEN_OF_CHAR(LIM, PTR, MBLENGTH, STATE)                        \
-+  do                                                                  \
-+    {                                                                 \
-+      wchar_t wc;                                                     \
-+      mbstate_t state_bak;                                            \
-+                                                                      \
-+      state_bak = STATE;                                              \
-+      mblength = mbrtowc (&wc, PTR, LIM - PTR, &STATE);                       \
-+                                                                      \
-+      switch (MBLENGTH)                                                       \
-+      {                                                               \
-+      case (size_t)-1:                                                \
-+      case (size_t)-2:                                                \
-+        STATE = state_bak;                                            \
-+              /* Fall through. */                                     \
-+      case 0:                                                         \
-+        MBLENGTH = 1;                                                 \
-+      }                                                                       \
-+    }                                                                 \
-+  while (0)
-+
- /* The kind of blanks for '-b' to skip in various options. */
- enum blanktype { bl_start, bl_end, bl_both };
-@@ -239,13 +272,11 @@
-    they were read if all keys compare equal.  */
- static bool stable;
--/* If TAB has this value, blanks separate fields.  */
--enum { TAB_DEFAULT = CHAR_MAX + 1 };
--
--/* Tab character separating fields.  If TAB_DEFAULT, then fields are
-+/* Tab character separating fields.  If tab_length is 0, then fields are
-    separated by the empty string between a non-blank character and a blank
-    character. */
--static int tab = TAB_DEFAULT;
-+static char tab[MB_LEN_MAX + 1];
-+static size_t tab_length = 0;
- /* Flag to remove consecutive duplicate lines from the output.
-    Only the last of a sequence of equal lines will be output. */
-@@ -392,6 +423,44 @@
- static struct tempnode *volatile temphead;
- static struct tempnode *volatile *temptail = &temphead;
-+/* Function pointers. */
-+static void
-+(*inittables) (void);
-+static char *
-+(*begfield) (const struct line*, const struct keyfield *);
-+static char *
-+(*limfield) (const struct line*, const struct keyfield *);
-+static int
-+(*getmonth) (char const *, size_t);
-+static int
-+(*keycompare) (const struct line *, const struct line *);
-+static int
-+(*numcompare) (const char *, const char *);
-+
-+/* Test for white space multibyte character.
-+   Set LENGTH the byte length of investigated multibyte character. */
-+#if HAVE_MBRTOWC
-+static int
-+ismbblank (const char *str, size_t len, size_t *length)
-+{
-+  size_t mblength;
-+  wchar_t wc;
-+  mbstate_t state;
-+
-+  memset (&state, '\0', sizeof(mbstate_t));
-+  mblength = mbrtowc (&wc, str, len, &state);
-+
-+  if (mblength == (size_t)-1 || mblength == (size_t)-2)
-+    {
-+      *length = 1;
-+      return 0;
-+    }
-+
-+  *length = (mblength < 1) ? 1 : mblength;
-+  return iswblank (wc);
-+}
-+#endif
-+
- /* Clean up any remaining temporary files.  */
- static void
-@@ -545,7 +614,7 @@
-   free (node);
- }
--#if HAVE_NL_LANGINFO
-+#if HAVE_LANGINFO_CODESET
- static int
- struct_month_cmp (const void *m1, const void *m2)
-@@ -560,7 +629,7 @@
- /* Initialize the character class tables. */
- static void
--inittables (void)
-+inittables_uni (void)
- {
-   size_t i;
-@@ -572,7 +641,7 @@
-       fold_toupper[i] = (ISLOWER (i) ? toupper (i) : i);
-     }
--#if HAVE_NL_LANGINFO
-+#if HAVE_LANGINFO_CODESET
-   /* If we're not in the "C" locale, read different names for months.  */
-   if (hard_LC_TIME)
-     {
-@@ -598,6 +667,64 @@
- #endif
- }
-+#if HAVE_MBRTOWC
-+static void
-+inittables_mb (void)
-+{
-+  int i, j, k, l;
-+  char *name, *s;
-+  size_t s_len, mblength;
-+  char mbc[MB_LEN_MAX];
-+  wchar_t wc, pwc;
-+  mbstate_t state_mb, state_wc;
-+
-+  for (i = 0; i < MONTHS_PER_YEAR; i++)
-+    {
-+      s = (char *) nl_langinfo (ABMON_1 + i);
-+      s_len = strlen (s);
-+      monthtab[i].name = name = (char *) xmalloc (s_len + 1);
-+      monthtab[i].val = i + 1;
-+
-+      memset (&state_mb, '\0', sizeof (mbstate_t));
-+      memset (&state_wc, '\0', sizeof (mbstate_t));
-+
-+      for (j = 0; j < s_len;)
-+      {
-+        if (!ismbblank (s + j, s_len - j, &mblength))
-+          break;
-+        j += mblength;
-+      }
-+
-+      for (k = 0; j < s_len;)
-+      {
-+        mblength = mbrtowc (&wc, (s + j), (s_len - j), &state_mb);
-+        assert (mblength != (size_t)-1 && mblength != (size_t)-2);
-+        if (mblength == 0)
-+          break;
-+
-+        pwc = towupper (wc);
-+        if (pwc == wc)
-+          {
-+            memcpy (mbc, s + j, mblength);
-+            j += mblength;
-+          }
-+        else
-+          {
-+            j += mblength;
-+            mblength = wcrtomb (mbc, pwc, &state_wc);
-+            assert (mblength != (size_t)0 && mblength != (size_t)-1);
-+          }
-+
-+        for (l = 0; l < mblength; l++)
-+          name[k++] = mbc[l];
-+      }
-+      name[k] = '\0';
-+    }
-+  qsort ((void *) monthtab, MONTHS_PER_YEAR,
-+      sizeof (struct month), struct_month_cmp);
-+}
-+#endif
-+
- /* Specify the amount of main memory to use when sorting.  */
- static void
- specify_sort_size (char const *s)
-@@ -808,7 +935,7 @@
-    by KEY in LINE. */
- static char *
--begfield (const struct line *line, const struct keyfield *key)
-+begfield_uni (const struct line *line, const struct keyfield *key)
- {
-   char *ptr = line->text, *lim = ptr + line->length - 1;
-   size_t sword = key->sword;
-@@ -818,10 +945,10 @@
-   /* The leading field separator itself is included in a field when -t
-      is absent.  */
--  if (tab != TAB_DEFAULT)
-+  if (tab_length)
-     while (ptr < lim && sword--)
-       {
--      while (ptr < lim && *ptr != tab)
-+      while (ptr < lim && *ptr != tab[0])
-         ++ptr;
-       if (ptr < lim)
-         ++ptr;
-@@ -849,11 +976,70 @@
-   return ptr;
- }
-+#if HAVE_MBRTOWC
-+static char *
-+begfield_mb (const struct line *line, const struct keyfield *key)
-+{
-+  int i;
-+  char *ptr = line->text, *lim = ptr + line->length - 1;
-+  size_t sword = key->sword;
-+  size_t schar = key->schar;
-+  size_t mblength;
-+  mbstate_t state;
-+
-+  memset (&state, '\0', sizeof(mbstate_t));
-+
-+  if (tab_length)
-+    while (ptr < lim && sword--)
-+      {
-+      while (ptr < lim && memcmp (ptr, tab, tab_length) != 0)
-+        {
-+          GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state);
-+          ptr += mblength;
-+        }
-+      if (ptr < lim)
-+        {
-+          GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state);
-+          ptr += mblength;
-+        }
-+      }
-+  else
-+    while (ptr < lim && sword--)
-+      {
-+      while (ptr < lim && ismbblank (ptr, lim - ptr, &mblength))
-+        ptr += mblength;
-+      if (ptr < lim)
-+        {
-+          GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state);
-+          ptr += mblength;
-+        }
-+      while (ptr < lim && !ismbblank (ptr, lim - ptr, &mblength))
-+        ptr += mblength;
-+      }
-+
-+  if (key->skipsblanks)
-+    while (ptr < lim && ismbblank (ptr, lim - ptr, &mblength))
-+      ptr += mblength;
-+
-+  for (i = 0; i < schar; i++)
-+    {
-+      GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state);
-+
-+      if (ptr + mblength > lim)
-+      break;
-+      else
-+      ptr += mblength;
-+    }
-+
-+  return ptr;
-+}
-+#endif
-+
- /* Return the limit of (a pointer to the first character after) the field
-    in LINE specified by KEY. */
- static char *
--limfield (const struct line *line, const struct keyfield *key)
-+limfield_uni (const struct line *line, const struct keyfield *key)
- {
-   char *ptr = line->text, *lim = ptr + line->length - 1;
-   size_t eword = key->eword, echar = key->echar;
-@@ -866,10 +1052,10 @@
-      `beginning' is the first character following the delimiting TAB.
-      Otherwise, leave PTR pointing at the first `blank' character after
-      the preceding field.  */
--  if (tab != TAB_DEFAULT)
-+  if (tab_length)
-     while (ptr < lim && eword--)
-       {
--      while (ptr < lim && *ptr != tab)
-+      while (ptr < lim && *ptr != tab[0])
-         ++ptr;
-       if (ptr < lim && (eword | echar))
-         ++ptr;
-@@ -915,10 +1101,10 @@
-      */
-   /* Make LIM point to the end of (one byte past) the current field.  */
--  if (tab != TAB_DEFAULT)
-+  if (tab_length)
-     {
-       char *newlim;
--      newlim = memchr (ptr, tab, lim - ptr);
-+      newlim = memchr (ptr, tab[0], lim - ptr);
-       if (newlim)
-       lim = newlim;
-     }
-@@ -951,6 +1137,107 @@
-   return ptr;
- }
-+#if HAVE_MBRTOWC
-+static char *
-+limfield_mb (const struct line *line, const struct keyfield *key)
-+{
-+  char *ptr = line->text, *lim = ptr + line->length - 1;
-+  size_t eword = key->eword, echar = key->echar;
-+  int i;
-+  size_t mblength;
-+  mbstate_t state;
-+
-+  memset (&state, '\0', sizeof(mbstate_t));
-+
-+  if (tab_length)
-+    while (ptr < lim && eword--)
-+      {
-+      while (ptr < lim && memcmp (ptr, tab, tab_length) != 0)
-+        {
-+          GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state);
-+          ptr += mblength;
-+        }
-+      if (ptr < lim && (eword | echar))
-+        {
-+          GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state);
-+          ptr += mblength;
-+        }
-+      }
-+  else
-+    while (ptr < lim && eword--)
-+      {
-+      while (ptr < lim && ismbblank (ptr, lim - ptr, &mblength))
-+        ptr += mblength;
-+      if (ptr < lim)
-+        {
-+          GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state);
-+          ptr += mblength;
-+        }
-+      while (ptr < lim && !ismbblank (ptr, lim - ptr, &mblength))
-+        ptr += mblength;
-+      }
-+
-+
-+# ifdef POSIX_UNSPECIFIED
-+  /* Make LIM point to the end of (one byte past) the current field.  */
-+  if (tab_length)
-+    {
-+      char *newlim, *p;
-+
-+      newlim = NULL;
-+      for (p = ptr; p < lim;)
-+      {
-+        if (memcmp (p, tab, tab_length) == 0)
-+          {
-+            newlim = p;
-+            break;
-+          }
-+
-+        GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state);
-+        p += mblength;
-+      }
-+    }
-+  else
-+    {
-+      char *newlim;
-+      newlim = ptr;
-+
-+      while (newlim < lim && ismbblank (newlim, lim - newlim, &mblength))
-+      newlim += mblength;
-+      if (ptr < lim)
-+      {
-+        GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state);
-+        ptr += mblength;
-+      }
-+      while (newlim < lim && !ismbblank (newlim, lim - newlim, &mblength))
-+      newlim += mblength;
-+      lim = newlim;
-+    }
-+# endif
-+
-+  /* If we're skipping leading blanks, don't start counting characters
-+   *      until after skipping past any leading blanks.  */
-+  if (key->skipsblanks)
-+    while (ptr < lim && ismbblank (ptr, lim - ptr, &mblength))
-+      ptr += mblength;
-+
-+  memset (&state, '\0', sizeof(mbstate_t));
-+
-+  /* Advance PTR by ECHAR (if possible), but no further than LIM.  */
-+  for (i = 0; i < echar; i++)
-+    {
-+      GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state);
-+
-+      if (ptr + mblength > lim)
-+      break;
-+      else
-+      ptr += mblength;
-+    }
-+
-+  return ptr;
-+}
-+#endif
-+
- /* Fill BUF reading from FP, moving buf->left bytes from the end
-    of buf->buf to the beginning first.  If EOF is reached and the
-    file wasn't terminated by a newline, supply one.  Set up BUF's line
-@@ -1067,7 +1354,7 @@
-    hideously fast. */
- static int
--numcompare (const char *a, const char *b)
-+numcompare_uni (const char *a, const char *b)
- {
-   while (blanks[to_uchar (*a)])
-     a++;
-@@ -1077,6 +1364,25 @@
-   return strnumcmp (a, b, decimal_point, thousands_sep);
- }
-+#if HAVE_MBRTOWC
-+static int
-+numcompare_mb (const char *a, const char *b)
-+{
-+  size_t mblength, len;
-+  len = strlen (a); /* okay for UTF-8 */
-+  while (*a && ismbblank (a, len > MB_CUR_MAX ? MB_CUR_MAX : len, &mblength))
-+    {
-+      a += mblength;
-+      len -= mblength;
-+    }
-+  len = strlen (b); /* okay for UTF-8 */
-+  while (*b && ismbblank (b, len > MB_CUR_MAX ? MB_CUR_MAX : len, &mblength))
-+    b += mblength;
-+
-+  return strnumcmp (a, b, decimal_point, thousands_sep);
-+}
-+#endif /* HAV_EMBRTOWC */
-+
- static int
- general_numcompare (const char *sa, const char *sb)
- {
-@@ -1110,7 +1416,7 @@
-    Return 0 if the name in S is not recognized.  */
- static int
--getmonth (char const *month, size_t len)
-+getmonth_uni (char const *month, size_t len)
- {
-   size_t lo = 0;
-   size_t hi = MONTHS_PER_YEAR;
-@@ -1152,11 +1458,79 @@
-   return 0;
- }
-+#if HAVE_MBRTOWC
-+static int
-+getmonth_mb (const char *s, size_t len)
-+{
-+  char *month;
-+  register size_t i;
-+  register int lo = 0, hi = MONTHS_PER_YEAR, result;
-+  char *tmp;
-+  size_t wclength, mblength;
-+  const char **pp;
-+  const wchar_t **wpp;
-+  wchar_t *month_wcs;
-+  mbstate_t state;
-+
-+  while (len > 0 && ismbblank (s, len, &mblength))
-+    {
-+      s += mblength;
-+      len -= mblength;
-+    }
-+
-+  if (len == 0)
-+    return 0;
-+
-+  month = (char *) alloca (len + 1);
-+
-+  tmp = (char *) alloca (len + 1);
-+  memcpy (tmp, s, len);
-+  tmp[len] = '\0';
-+  pp = (const char **)&tmp;
-+  month_wcs = (wchar_t *) alloca ((len + 1) * sizeof (wchar_t));
-+  memset (&state, '\0', sizeof(mbstate_t));
-+
-+  wclength = mbsrtowcs (month_wcs, pp, len + 1, &state);
-+  assert (wclength != (size_t)-1 && *pp == NULL);
-+
-+  for (i = 0; i < wclength; i++)
-+    {
-+      month_wcs[i] = towupper(month_wcs[i]);
-+      if (iswblank (month_wcs[i]))
-+      {
-+        month_wcs[i] = L'\0';
-+        break;
-+      }
-+    }
-+
-+  wpp = (const wchar_t **)&month_wcs;
-+
-+  mblength = wcsrtombs (month, wpp, len + 1, &state);
-+  assert (mblength != (-1) && *wpp == NULL);
-+
-+  do
-+    {
-+      int ix = (lo + hi) / 2;
-+
-+      if (strncmp (month, monthtab[ix].name, strlen (monthtab[ix].name)) < 0)
-+      hi = ix;
-+      else
-+      lo = ix;
-+    }
-+  while (hi - lo > 1);
-+
-+  result = (!strncmp (month, monthtab[lo].name, strlen (monthtab[lo].name))
-+      ? monthtab[lo].val : 0);
-+
-+  return result;
-+}
-+#endif
-+
- /* Compare two lines A and B trying every key in sequence until there
-    are no more keys or a difference is found. */
- static int
--keycompare (const struct line *a, const struct line *b)
-+keycompare_uni (const struct line *a, const struct line *b)
- {
-   struct keyfield const *key = keylist;
-@@ -1326,6 +1700,177 @@
-   return key->reverse ? -diff : diff;
- }
-+#if HAVE_MBRTOWC
-+static int
-+keycompare_mb (const struct line *a, const struct line *b)
-+{
-+  struct keyfield *key = keylist;
-+
-+  /* For the first iteration only, the key positions have been
-+     precomputed for us. */
-+  char *texta = a->keybeg;
-+  char *textb = b->keybeg;
-+  char *lima = a->keylim;
-+  char *limb = b->keylim;
-+
-+  size_t mblength_a, mblength_b;
-+  wchar_t wc_a, wc_b;
-+  mbstate_t state_a, state_b;
-+
-+  int diff;
-+
-+  memset (&state_a, '\0', sizeof(mbstate_t));
-+  memset (&state_b, '\0', sizeof(mbstate_t));
-+
-+  for (;;)
-+    {
-+      unsigned char *translate = (unsigned char *) key->translate;
-+      bool const *ignore = key->ignore;
-+
-+      /* Find the lengths. */
-+      size_t lena = lima <= texta ? 0 : lima - texta;
-+      size_t lenb = limb <= textb ? 0 : limb - textb;
-+
-+      /* Actually compare the fields. */
-+      if (key->numeric | key->general_numeric)
-+      {
-+        char savea = *lima, saveb = *limb;
-+
-+        *lima = *limb = '\0';
-+        if (force_general_numcompare)
-+          diff = general_numcompare (texta, textb);
-+        else
-+          diff = ((key->numeric ? numcompare : general_numcompare)
-+              (texta, textb));
-+        *lima = savea, *limb = saveb;
-+      }
-+      else if (key->month)
-+      diff = getmonth (texta, lena) - getmonth (textb, lenb);
-+      else
-+      {
-+        if (ignore || translate)
-+          {
-+            char *copy_a = (char *) alloca (lena + 1 + lenb + 1);
-+            char *copy_b = copy_a + lena + 1;
-+            size_t new_len_a, new_len_b;
-+            size_t i, j;
-+
-+            /* Ignore and/or translate chars before comparing.  */
-+# define IGNORE_CHARS(NEW_LEN, LEN, TEXT, COPY, WC, MBLENGTH, STATE)  \
-+  do                                                                  \
-+    {                                                                 \
-+      wchar_t uwc;                                                    \
-+      char mbc[MB_LEN_MAX];                                           \
-+      mbstate_t state_wc;                                             \
-+                                                                      \
-+      for (NEW_LEN = i = 0; i < LEN;)                                 \
-+      {                                                               \
-+        mbstate_t state_bak;                                          \
-+                                                                      \
-+        state_bak = STATE;                                            \
-+        MBLENGTH = mbrtowc (&WC, TEXT + i, LEN - i, &STATE);          \
-+                                                                      \
-+        if (MBLENGTH == (size_t)-2 || MBLENGTH == (size_t)-1          \
-+            || MBLENGTH == 0)                                         \
-+          {                                                           \
-+            if (MBLENGTH == (size_t)-2 || MBLENGTH == (size_t)-1)     \
-+              STATE = state_bak;                                      \
-+            if (!ignore)                                              \
-+              COPY[NEW_LEN++] = TEXT[i++];                            \
-+            continue;                                                 \
-+          }                                                           \
-+                                                                      \
-+        if (ignore)                                                   \
-+          {                                                           \
-+            if ((ignore == nonprinting && !iswprint (WC))             \
-+                 || (ignore == nondictionary                          \
-+                     && !iswalnum (WC) && !iswblank (WC)))            \
-+              {                                                       \
-+                i += MBLENGTH;                                        \
-+                continue;                                             \
-+              }                                                       \
-+          }                                                           \
-+                                                                      \
-+        if (translate)                                                \
-+          {                                                           \
-+                                                                      \
-+            uwc = towupper(WC);                                       \
-+            if (WC == uwc)                                            \
-+              {                                                       \
-+                memcpy (mbc, TEXT + i, MBLENGTH);                     \
-+                i += MBLENGTH;                                        \
-+              }                                                       \
-+            else                                                      \
-+              {                                                       \
-+                i += MBLENGTH;                                        \
-+                WC = uwc;                                             \
-+                memset (&state_wc, '\0', sizeof (mbstate_t));         \
-+                                                                      \
-+                MBLENGTH = wcrtomb (mbc, WC, &state_wc);              \
-+                assert (MBLENGTH != (size_t)-1 && MBLENGTH != 0);     \
-+              }                                                       \
-+                                                                      \
-+            for (j = 0; j < MBLENGTH; j++)                            \
-+              COPY[NEW_LEN++] = mbc[j];                               \
-+          }                                                           \
-+        else                                                          \
-+          for (j = 0; j < MBLENGTH; j++)                              \
-+            COPY[NEW_LEN++] = TEXT[i++];                              \
-+      }                                                               \
-+      COPY[NEW_LEN] = '\0';                                           \
-+    }                                                                 \
-+  while (0)
-+            IGNORE_CHARS (new_len_a, lena, texta, copy_a,
-+                          wc_a, mblength_a, state_a);
-+            IGNORE_CHARS (new_len_b, lenb, textb, copy_b,
-+                          wc_b, mblength_b, state_b);
-+            diff = xmemcoll (copy_a, new_len_a, copy_b, new_len_b);
-+          }
-+        else if (lena == 0)
-+          diff = - NONZERO (lenb);
-+        else if (lenb == 0)
-+          goto greater;
-+        else
-+          diff = xmemcoll (texta, lena, textb, lenb);
-+      }
-+
-+      if (diff)
-+      goto not_equal;
-+
-+      key = key->next;
-+      if (! key)
-+      break;
-+
-+      /* Find the beginning and limit of the next field.  */
-+      if (key->eword != -1)
-+      lima = limfield (a, key), limb = limfield (b, key);
-+      else
-+      lima = a->text + a->length - 1, limb = b->text + b->length - 1;
-+
-+      if (key->sword != -1)
-+      texta = begfield (a, key), textb = begfield (b, key);
-+      else
-+      {
-+        texta = a->text, textb = b->text;
-+        if (key->skipsblanks)
-+          {
-+            while (texta < lima && ismbblank (texta, lima - texta, &mblength_a))
-+              texta += mblength_a;
-+            while (textb < limb && ismbblank (textb, limb - textb, &mblength_b))
-+              textb += mblength_b;
-+          }
-+      }
-+    }
-+
-+  return 0;
-+
-+greater:
-+  diff = 1;
-+not_equal:
-+  return key->reverse ? -diff : diff;
-+}
-+#endif
-+
- /* Compare two lines A and B, returning negative, zero, or positive
-    depending on whether A compares less than, equal to, or greater than B. */
-@@ -2127,7 +2672,7 @@
-   atexit (close_stdout);
-   hard_LC_COLLATE = hard_locale (LC_COLLATE);
--#if HAVE_NL_LANGINFO
-+#if HAVE_LANGINFO_CODESET
-   hard_LC_TIME = hard_locale (LC_TIME);
- #endif
-@@ -2148,6 +2693,27 @@
-       thousands_sep = -1;
-   }
-+#if HAVE_MBRTOWC
-+  if (MB_CUR_MAX > 1)
-+    {
-+      inittables = inittables_mb;
-+      begfield = begfield_mb;
-+      limfield = limfield_mb;
-+      getmonth = getmonth_mb;
-+      keycompare = keycompare_mb;
-+      numcompare = numcompare_mb;
-+    }
-+  else
-+#endif
-+    {
-+      inittables = inittables_uni;
-+      begfield = begfield_uni;
-+      limfield = limfield_uni;
-+      getmonth = getmonth_uni;
-+      keycompare = keycompare_uni;
-+      numcompare = numcompare_uni;
-+    }
-+
-   have_read_stdin = false;
-   inittables ();
-@@ -2349,13 +2915,35 @@
-       case 't':
-         {
--          char newtab = optarg[0];
--          if (! newtab)
-+          char newtab[MB_LEN_MAX + 1];
-+          size_t newtab_length = 1;
-+          strncpy (newtab, optarg, MB_LEN_MAX);
-+          if (! newtab[0])
-             error (SORT_FAILURE, 0, _("empty tab"));
--          if (optarg[1])
-+#if HAVE_MBRTOWC
-+          if (MB_CUR_MAX > 1)
-+            {
-+              wchar_t wc;
-+              mbstate_t state;
-+              size_t i;
-+
-+              memset (&state, '\0', sizeof (mbstate_t));
-+              newtab_length = mbrtowc (&wc, newtab, strnlen (newtab,
-+                                                             MB_LEN_MAX),
-+                                       &state);
-+              switch (newtab_length)
-+                {
-+                case (size_t) -1:
-+                case (size_t) -2:
-+                case 0:
-+                  newtab_length = 1;
-+                }
-+            }
-+#endif
-+          if (newtab_length == 1 && optarg[1])
-             {
-               if (STREQ (optarg, "\\0"))
--                newtab = '\0';
-+                newtab[0] = '\0';
-               else
-                 {
-                   /* Provoke with `sort -txx'.  Complain about
-@@ -2366,9 +2954,12 @@
-                          quote (optarg));
-                 }
-             }
--          if (tab != TAB_DEFAULT && tab != newtab)
-+          if (tab_length
-+              && (tab_length != newtab_length
-+                  || memcmp (tab, newtab, tab_length) != 0))
-             error (SORT_FAILURE, 0, _("incompatible tabs"));
--          tab = newtab;
-+          memcpy (tab, newtab, newtab_length);
-+          tab_length = newtab_length;
-         }
-         break;
---- /dev/null  2005-10-10 09:36:06.437701000 +0100
-+++ coreutils-5.93/tests/sort/sort-mb-tests    2005-12-23 08:53:01.000000000 +0000
-@@ -0,0 +1,58 @@
-+#! /bin/sh
-+case $# in
-+  0) xx='../../src/sort';;
-+  *) xx="$1";;
-+esac
-+test "$VERBOSE" && echo=echo || echo=:
-+$echo testing program: $xx
-+errors=0
-+test "$srcdir" || srcdir=.
-+test "$VERBOSE" && $xx --version 2> /dev/null
-+
-+export LC_ALL=en_US.UTF-8
-+locale -k LC_CTYPE 2>&1 | grep -q charmap.*UTF-8 || exit 77
-+errors=0
-+
-+$xx -t @ -k2 -n mb1.I > mb1.O
-+code=$?
-+if test $code != 0; then
-+  $echo "Test mb1 failed: $xx return code $code differs from expected value 0" 1>&2
-+  errors=`expr $errors + 1`
-+else
-+  cmp mb1.O $srcdir/mb1.X > /dev/null 2>&1
-+  case $? in
-+    0) if test "$VERBOSE"; then $echo "passed mb1"; fi;;
-+    1) $echo "Test mb1 failed: files mb1.O and $srcdir/mb1.X differ" 1>&2
-+       (diff -c mb1.O $srcdir/mb1.X) 2> /dev/null
-+       errors=`expr $errors + 1`;;
-+    2) $echo "Test mb1 may have failed." 1>&2
-+       $echo The command "cmp mb1.O $srcdir/mb1.X" failed. 1>&2
-+       errors=`expr $errors + 1`;;
-+  esac
-+fi
-+
-+$xx -t @ -k4 -n mb2.I > mb2.O
-+code=$?
-+if test $code != 0; then
-+  $echo "Test mb2 failed: $xx return code $code differs from expected value 0" 1>&2
-+  errors=`expr $errors + 1`
-+else
-+  cmp mb2.O $srcdir/mb2.X > /dev/null 2>&1
-+  case $? in
-+    0) if test "$VERBOSE"; then $echo "passed mb2"; fi;;
-+    1) $echo "Test mb2 failed: files mb2.O and $srcdir/mb2.X differ" 1>&2
-+       (diff -c mb2.O $srcdir/mb2.X) 2> /dev/null
-+       errors=`expr $errors + 1`;;
-+    2) $echo "Test mb2 may have failed." 1>&2
-+       $echo The command "cmp mb2.O $srcdir/mb2.X" failed. 1>&2
-+       errors=`expr $errors + 1`;;
-+  esac
-+fi
-+
-+if test $errors = 0; then
-+  $echo Passed all 113 tests. 1>&2
-+else
-+  $echo Failed $errors tests. 1>&2
-+fi
-+test $errors = 0 || errors=1
-+exit $errors
---- /dev/null  2005-10-10 09:36:06.437701000 +0100
-+++ coreutils-5.93/tests/sort/mb1.I    2005-12-23 08:53:01.000000000 +0000
-@@ -0,0 +1,4 @@
-+Apple@10
-+Banana@5
-+Citrus@20
-+Cherry@30
---- /dev/null  2005-10-10 09:36:06.437701000 +0100
-+++ coreutils-5.93/tests/sort/mb2.I    2005-12-23 08:53:01.000000000 +0000
-@@ -0,0 +1,4 @@
-+Apple@AA10@@20
-+Banana@AA5@@30
-+Citrus@AA20@@5
-+Cherry@AA30@@10
---- /dev/null  2005-10-10 09:36:06.437701000 +0100
-+++ coreutils-5.93/tests/sort/mb1.X    2005-12-23 08:53:01.000000000 +0000
-@@ -0,0 +1,4 @@
-+Banana@5
-+Apple@10
-+Citrus@20
-+Cherry@30
---- /dev/null  2005-10-10 09:36:06.437701000 +0100
-+++ coreutils-5.93/tests/sort/mb2.X    2005-12-23 08:53:01.000000000 +0000
-@@ -0,0 +1,4 @@
-+Citrus@AA20@@5
-+Cherry@AA30@@10
-+Apple@AA10@@20
-+Banana@AA5@@30
---- coreutils-5.93/tests/sort/Makefile.am.i18n 2005-10-24 22:02:25.000000000 +0100
-+++ coreutils-5.93/tests/sort/Makefile.am      2005-12-23 08:53:01.000000000 +0000
-@@ -43,14 +43,16 @@
- nul-nls.E use-nl.O use-nl.E o2.O o2.E nul-tab.O nul-tab.E
- ##test-files-end
--EXTRA_DIST = Test.pm $x-tests $(explicit) $(maint_gen)
--noinst_SCRIPTS = $x-tests
-+run_gen += mb1.O mb2.O
-+
-+EXTRA_DIST = Test.pm $x-tests $(explicit) $(maint_gen) mb1.I mb1.X mb2.I mb2.X
-+noinst_SCRIPTS = $x-tests # $x-mb-tests
- TESTS_ENVIRONMENT = \
-   PATH="`pwd`/../../src$(PATH_SEPARATOR)$$PATH"
- editpl = sed -e 's,@''PERL''@,$(PERL),g' -e 's,@''srcdir''@,$(srcdir),g'
--TESTS = $x-tests
-+TESTS = $x-tests $x-mb-tests
- mk_script = $(srcdir)/../mk-script
- $(srcdir)/$x-tests: $(mk_script) Test.pm Makefile.am
---- coreutils-5.93/tests/sort/Makefile.in.i18n 2005-10-22 19:13:23.000000000 +0100
-+++ coreutils-5.93/tests/sort/Makefile.in      2005-10-26 22:17:04.000000000 +0100
-@@ -338,13 +338,15 @@
- o-no-file1.E create-empty.O create-empty.E neg-nls.O neg-nls.E nul-nls.O \
- nul-nls.E use-nl.O use-nl.E o2.O o2.E nul-tab.O nul-tab.E
--EXTRA_DIST = Test.pm $x-tests $(explicit) $(maint_gen)
--noinst_SCRIPTS = $x-tests
-+run_gen += mb1.O mb2.O
-+
-+EXTRA_DIST = Test.pm $x-tests $(explicit) $(maint_gen) mb1.I mb1.X mb2.I mb2.X
-+noinst_SCRIPTS = $x-tests # $x-mb-tests
- TESTS_ENVIRONMENT = \
-   PATH="`pwd`/../../src$(PATH_SEPARATOR)$$PATH"
- editpl = sed -e 's,@''PERL''@,$(PERL),g' -e 's,@''srcdir''@,$(srcdir),g'
--TESTS = $x-tests
-+TESTS = $x-tests $x-mb-tests
- mk_script = $(srcdir)/../mk-script
- MAINTAINERCLEANFILES = $x-tests $(maint_gen)
- CLEANFILES = $(run_gen)
diff --git a/src/patches/coreutils-5.96-rename-tee.patch b/src/patches/coreutils-5.96-rename-tee.patch
deleted file mode 100644 (file)
index 60afab4..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-From b50508742035812f8ae8671eedc6623fac53f51d Mon Sep 17 00:00:00 2001
-From: Jim Meyering <jim@meyering.net>
-Date: Thu, 22 Jun 2006 12:50:32 +0000
-Subject: [PATCH] * src/tee.c (tee_files): Rename from tee, to avoid conflict with
- the function in glibc's <fcntl.h>.  Reported by Andreas Schwab.
-
----
- src/tee.c |    8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/src/tee.c b/src/tee.c
-index f99642d..f612181 100644
---- a/src/tee.c
-+++ b/src/tee.c
-@@ -1,5 +1,5 @@
- /* tee - read from standard input and write to standard output and files.
--   Copyright (C) 85,1990-2005 Free Software Foundation, Inc.
-+   Copyright (C) 85,1990-2006 Free Software Foundation, 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
-@@ -31,7 +31,7 @@
- #define AUTHORS "Mike Parker", "Richard M. Stallman", "David MacKenzie"
--static bool tee (int nfiles, const char **files);
-+static bool tee_files (int nfiles, const char **files);
- /* If true, append to output files rather than truncating them. */
- static bool append;
-@@ -121,7 +121,7 @@ main (int argc, char **argv)
-   /* Do *not* warn if tee is given no file arguments.
-      POSIX requires that it work when given no arguments.  */
--  ok = tee (argc - optind, (const char **) &argv[optind]);
-+  ok = tee_files (argc - optind, (const char **) &argv[optind]);
-   if (close (STDIN_FILENO) != 0)
-     error (EXIT_FAILURE, errno, _("standard input"));
-@@ -133,7 +133,7 @@ main (int argc, char **argv)
-    Return true if successful.  */
- static bool
--tee (int nfiles, const char **files)
-+tee_files (int nfiles, const char **files)
- {
-   FILE **descriptors;
-   char buffer[BUFSIZ];
--- 
-1.7.2.5
-
diff --git a/src/patches/coreutils-5.96-suppress_uptime_kill_su-1.patch b/src/patches/coreutils-5.96-suppress_uptime_kill_su-1.patch
deleted file mode 100644 (file)
index 6a08909..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-Submitted By: Matthew Burgess <matthew at linuxfromscratch dot org>
-Date: 2006-03-15
-Initial Package Version: 5.94
-Origin: original suppress_hotname_uptame_kill_su patch (Robert Connolly)
-Upstream Status: N/A
-Description: This patch supresses the building of uptime, and kill.  The su
-command is built so the testsuite can run, use './src/su', but it will not
-be installed. Also see:
-           http://www.linuxfromscratch.org/patches/downloads/coreutils/
-           coreutils-5.0-dupes-2.patch
-
-diff -Naur coreutils-5.94.orig/AUTHORS coreutils-5.94/AUTHORS
---- coreutils-5.94.orig/AUTHORS        2004-11-03 23:10:50.000000000 +0000
-+++ coreutils-5.94/AUTHORS     2006-03-15 22:20:49.000000000 +0000
-@@ -34,7 +34,6 @@
- hostname: Jim Meyering
- id: Arnold Robbins, David MacKenzie
- join: Mike Haertel
--kill: Paul Eggert
- link: Michael Stone
- ln: Mike Parker, David MacKenzie
- logname: FIXME: unknown
-@@ -83,7 +82,6 @@
- unexpand: David MacKenzie
- uniq: Richard Stallman, David MacKenzie
- unlink: Michael Stone
--uptime: Joseph Arceneaux, David MacKenzie, Kaveh Ghazi
- users: Joseph Arceneaux, David MacKenzie
- vdir: Richard Stallman, David MacKenzie
- wc: Paul Rubin, David MacKenzie
-diff -Naur coreutils-5.94.orig/Makefile.in coreutils-5.94/Makefile.in
---- coreutils-5.94.orig/Makefile.in    2006-02-13 12:52:03.000000000 +0000
-+++ coreutils-5.94/Makefile.in 2006-03-15 22:20:49.000000000 +0000
-@@ -148,7 +148,7 @@
-       $(top_srcdir)/m4/ullong_max.m4 $(top_srcdir)/m4/ulonglong.m4 \
-       $(top_srcdir)/m4/unicodeio.m4 $(top_srcdir)/m4/unistd-safer.m4 \
-       $(top_srcdir)/m4/unlink-busy.m4 $(top_srcdir)/m4/unlinkdir.m4 \
--      $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/uptime.m4 \
-+      $(top_srcdir)/m4/unlocked-io.m4 \
-       $(top_srcdir)/m4/userspec.m4 $(top_srcdir)/m4/utimbuf.m4 \
-       $(top_srcdir)/m4/utime.m4 $(top_srcdir)/m4/utimecmp.m4 \
-       $(top_srcdir)/m4/utimens.m4 $(top_srcdir)/m4/utimes-null.m4 \
-diff -Naur coreutils-5.94.orig/README coreutils-5.94/README
---- coreutils-5.94.orig/README 2005-09-28 18:34:26.000000000 +0000
-+++ coreutils-5.94/README      2006-03-15 22:20:49.000000000 +0000
-@@ -9,11 +9,11 @@
-   [ basename cat chgrp chmod chown chroot cksum comm cp csplit cut date dd
-   df dir dircolors dirname du echo env expand expr factor false fmt fold
--  ginstall groups head hostid hostname id join kill link ln logname ls
-+  ginstall groups head hostid hostname id join link ln logname ls
-   md5sum mkdir mkfifo mknod mv nice nl nohup od paste pathchk pinky pr
-   printenv printf ptx pwd readlink rm rmdir seq sha1sum shred sleep sort
-   split stat stty su sum sync tac tail tee test touch tr true tsort tty
--  uname unexpand uniq unlink uptime users vdir wc who whoami yes
-+  uname unexpand uniq unlink users vdir wc who whoami yes
- See the file NEWS for a list of major changes in the current release.
-diff -Naur coreutils-5.94.orig/configure coreutils-5.94/configure
---- coreutils-5.94.orig/configure      2006-02-13 12:52:04.000000000 +0000
-+++ coreutils-5.94/configure   2006-03-15 22:20:49.000000000 +0000
-@@ -50418,8 +50418,7 @@
- { echo "$as_me:$LINENO: result: $gnulib_cv_have_boot_time" >&5
- echo "${ECHO_T}$gnulib_cv_have_boot_time" >&6; }
-   if test $gnulib_cv_have_boot_time = yes; then
--  OPTIONAL_BIN_PROGS="$OPTIONAL_BIN_PROGS uptime\$(EXEEXT)"
--  MAN="$MAN uptime.1"
-+echo "uptime is suppressed"
- fi
-diff -Naur coreutils-5.94.orig/man/Makefile.in coreutils-5.94/man/Makefile.in
---- coreutils-5.94.orig/man/Makefile.in        2006-02-13 12:51:58.000000000 +0000
-+++ coreutils-5.94/man/Makefile.in     2006-03-15 22:20:50.000000000 +0000
-@@ -142,7 +142,7 @@
-       $(top_srcdir)/m4/ullong_max.m4 $(top_srcdir)/m4/ulonglong.m4 \
-       $(top_srcdir)/m4/unicodeio.m4 $(top_srcdir)/m4/unistd-safer.m4 \
-       $(top_srcdir)/m4/unlink-busy.m4 $(top_srcdir)/m4/unlinkdir.m4 \
--      $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/uptime.m4 \
-+      $(top_srcdir)/m4/unlocked-io.m4 \
-       $(top_srcdir)/m4/userspec.m4 $(top_srcdir)/m4/utimbuf.m4 \
-       $(top_srcdir)/m4/utime.m4 $(top_srcdir)/m4/utimecmp.m4 \
-       $(top_srcdir)/m4/utimens.m4 $(top_srcdir)/m4/utimes-null.m4 \
-@@ -303,13 +303,13 @@
-   basename.1 cat.1 chgrp.1 chmod.1 chown.1 chroot.1 cksum.1 comm.1 \
-   cp.1 csplit.1 cut.1 date.1 dd.1 df.1 dir.1 dircolors.1 dirname.1 du.1 \
-   echo.1 env.1 expand.1 expr.1 factor.1 false.1 fmt.1 fold.1 groups.1 \
--  head.1 hostid.1 hostname.1 id.1 install.1 join.1 kill.1 \
-+  head.1 hostid.1 hostname.1 id.1 install.1 join.1 \
-   link.1 ln.1 logname.1 \
-   ls.1 md5sum.1 mkdir.1 mkfifo.1 mknod.1 mv.1 nice.1 nl.1 nohup.1 od.1 \
-   paste.1 pathchk.1 pinky.1 pr.1 printenv.1 printf.1 ptx.1 pwd.1 readlink.1 \
-   rm.1 rmdir.1 seq.1 sha1sum.1 shred.1 sleep.1 sort.1 split.1 stat.1 stty.1 \
--  su.1 sum.1 sync.1 tac.1 tail.1 tee.1 test.1 touch.1 tr.1 true.1 tsort.1 \
--  tty.1 uname.1 unexpand.1 uniq.1 unlink.1 uptime.1 users.1 vdir.1 wc.1 \
-+  sum.1 sync.1 tac.1 tail.1 tee.1 test.1 touch.1 tr.1 true.1 tsort.1 \
-+  tty.1 uname.1 unexpand.1 uniq.1 unlink.1 users.1 vdir.1 wc.1 \
-   who.1 whoami.1 yes.1
- man_aux = $(dist_man_MANS:.1=.x)
-@@ -575,7 +575,6 @@
- id.1:         $(common_dep)   $(srcdir)/id.x          ../src/id.c
- install.1:    $(common_dep)   $(srcdir)/install.x     ../src/install.c
- join.1:               $(common_dep)   $(srcdir)/join.x        ../src/join.c
--kill.1:               $(common_dep)   $(srcdir)/kill.x        ../src/kill.c
- link.1:               $(common_dep)   $(srcdir)/link.x        ../src/link.c
- ln.1:         $(common_dep)   $(srcdir)/ln.x          ../src/ln.c
- logname.1:    $(common_dep)   $(srcdir)/logname.x     ../src/logname.c
-@@ -608,7 +607,6 @@
- split.1:      $(common_dep)   $(srcdir)/split.x       ../src/split.c
- stat.1:               $(common_dep)   $(srcdir)/stat.x        ../src/stat.c
- stty.1:               $(common_dep)   $(srcdir)/stty.x        ../src/stty.c
--su.1:         $(common_dep)   $(srcdir)/su.x          ../src/su.c
- sum.1:                $(common_dep)   $(srcdir)/sum.x         ../src/sum.c
- sync.1:               $(common_dep)   $(srcdir)/sync.x        ../src/sync.c
- tac.1:                $(common_dep)   $(srcdir)/tac.x         ../src/tac.c
-@@ -624,7 +622,6 @@
- unexpand.1:   $(common_dep)   $(srcdir)/unexpand.x    ../src/unexpand.c
- uniq.1:               $(common_dep)   $(srcdir)/uniq.x        ../src/uniq.c
- unlink.1:     $(common_dep)   $(srcdir)/unlink.x      ../src/unlink.c
--uptime.1:     $(common_dep)   $(srcdir)/uptime.x      ../src/uptime.c
- users.1:      $(common_dep)   $(srcdir)/users.x       ../src/users.c
- vdir.1:               $(common_dep)   $(srcdir)/vdir.x        ../src/ls.c
- wc.1:         $(common_dep)   $(srcdir)/wc.x          ../src/wc.c
-@@ -656,7 +653,7 @@
- check-x-vs-1:
-       PATH=../src$(PATH_SEPARATOR)$$PATH; export PATH;                \
-       t=ls-files.$$$$;                                                \
--      (cd $(srcdir) && ls -1 *.x) | sed 's/\.x$$//' | $(ASSORT) > $$t;\
-+      (cd $(srcdir) && ls -1 *.x) | grep -v -e 'kill.x' -e 'su.x' -e 'uptime.x' | sed 's/\.x$$//' | $(ASSORT) > $$t;\
-       echo $(dist_man_MANS) | tr -s ' ' '\n' | sed 's/\.1$$//'        \
-         | $(ASSORT) | diff - $$t || { rm $$t; exit 1; };              \
-       rm $$t
-diff -Naur coreutils-5.94.orig/src/Makefile.in coreutils-5.94/src/Makefile.in
---- coreutils-5.94.orig/src/Makefile.in        2006-02-13 13:08:11.000000000 +0000
-+++ coreutils-5.94/src/Makefile.in     2006-03-15 22:20:50.000000000 +0000
-@@ -39,7 +39,7 @@
- host_triplet = @host@
- EXTRA_PROGRAMS = chroot$(EXEEXT) df$(EXEEXT) hostid$(EXEEXT) \
-       nice$(EXEEXT) pinky$(EXEEXT) stty$(EXEEXT) su$(EXEEXT) \
--      uname$(EXEEXT) uptime$(EXEEXT) users$(EXEEXT) who$(EXEEXT)
-+      uname$(EXEEXT) users$(EXEEXT) who$(EXEEXT)
- bin_PROGRAMS = [$(EXEEXT) chgrp$(EXEEXT) chown$(EXEEXT) chmod$(EXEEXT) \
-       cp$(EXEEXT) dd$(EXEEXT) dircolors$(EXEEXT) du$(EXEEXT) \
-       ginstall$(EXEEXT) link$(EXEEXT) ln$(EXEEXT) dir$(EXEEXT) \
-@@ -56,7 +56,7 @@
-       uniq$(EXEEXT) wc$(EXEEXT) basename$(EXEEXT) date$(EXEEXT) \
-       dirname$(EXEEXT) echo$(EXEEXT) env$(EXEEXT) expr$(EXEEXT) \
-       factor$(EXEEXT) false$(EXEEXT) hostname$(EXEEXT) id$(EXEEXT) \
--      kill$(EXEEXT) logname$(EXEEXT) pathchk$(EXEEXT) \
-+      logname$(EXEEXT) pathchk$(EXEEXT) \
-       printenv$(EXEEXT) printf$(EXEEXT) pwd$(EXEEXT) seq$(EXEEXT) \
-       sleep$(EXEEXT) tee$(EXEEXT) test$(EXEEXT) true$(EXEEXT) \
-       tty$(EXEEXT) whoami$(EXEEXT) yes$(EXEEXT) $(am__EXEEXT_1) \
-@@ -169,7 +169,7 @@
-       $(top_srcdir)/m4/ullong_max.m4 $(top_srcdir)/m4/ulonglong.m4 \
-       $(top_srcdir)/m4/unicodeio.m4 $(top_srcdir)/m4/unistd-safer.m4 \
-       $(top_srcdir)/m4/unlink-busy.m4 $(top_srcdir)/m4/unlinkdir.m4 \
--      $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/uptime.m4 \
-+      $(top_srcdir)/m4/unlocked-io.m4 \
-       $(top_srcdir)/m4/userspec.m4 $(top_srcdir)/m4/utimbuf.m4 \
-       $(top_srcdir)/m4/utime.m4 $(top_srcdir)/m4/utimecmp.m4 \
-       $(top_srcdir)/m4/utimens.m4 $(top_srcdir)/m4/utimes-null.m4 \
-@@ -350,11 +350,6 @@
- join_LDADD = $(LDADD)
- join_DEPENDENCIES = ../lib/libcoreutils.a $(am__DEPENDENCIES_1) \
-       ../lib/libcoreutils.a
--kill_SOURCES = kill.c
--kill_OBJECTS = kill.$(OBJEXT)
--kill_LDADD = $(LDADD)
--kill_DEPENDENCIES = ../lib/libcoreutils.a $(am__DEPENDENCIES_1) \
--      ../lib/libcoreutils.a
- link_SOURCES = link.c
- link_OBJECTS = link.$(OBJEXT)
- link_LDADD = $(LDADD)
-@@ -577,9 +572,6 @@
- unlink_LDADD = $(LDADD)
- unlink_DEPENDENCIES = ../lib/libcoreutils.a $(am__DEPENDENCIES_1) \
-       ../lib/libcoreutils.a
--uptime_SOURCES = uptime.c
--uptime_OBJECTS = uptime.$(OBJEXT)
--uptime_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
- users_SOURCES = users.c
- users_OBJECTS = users.$(OBJEXT)
- users_LDADD = $(LDADD)
-@@ -622,28 +614,28 @@
-       csplit.c cut.c date.c dd.c df.c $(dir_SOURCES) dircolors.c \
-       dirname.c du.c echo.c env.c expand.c expr.c factor.c false.c \
-       fmt.c fold.c $(ginstall_SOURCES) head.c hostid.c hostname.c \
--      id.c join.c kill.c link.c ln.c logname.c $(ls_SOURCES) \
-+      id.c join.c link.c ln.c logname.c $(ls_SOURCES) \
-       $(md5sum_SOURCES) mkdir.c mkfifo.c mknod.c $(mv_SOURCES) \
-       nice.c nl.c nohup.c od.c paste.c pathchk.c pinky.c pr.c \
-       printenv.c printf.c ptx.c pwd.c readlink.c $(rm_SOURCES) \
-       rmdir.c seq.c setuidgid.c $(sha1sum_SOURCES) shred.c sleep.c \
-       sort.c split.c stat.c stty.c su.c sum.c sync.c tac.c tail.c \
-       tee.c test.c touch.c tr.c true.c tsort.c tty.c uname.c \
--      unexpand.c uniq.c unlink.c uptime.c users.c $(vdir_SOURCES) \
-+      unexpand.c uniq.c unlink.c users.c $(vdir_SOURCES) \
-       wc.c who.c whoami.c yes.c
- DIST_SOURCES = $(__SOURCES) basename.c cat.c $(chgrp_SOURCES) chmod.c \
-       $(chown_SOURCES) chroot.c cksum.c comm.c $(cp_SOURCES) \
-       csplit.c cut.c date.c dd.c df.c $(dir_SOURCES) dircolors.c \
-       dirname.c du.c echo.c env.c expand.c expr.c factor.c false.c \
-       fmt.c fold.c $(ginstall_SOURCES) head.c hostid.c hostname.c \
--      id.c join.c kill.c link.c ln.c logname.c $(ls_SOURCES) \
-+      id.c join.c link.c ln.c logname.c $(ls_SOURCES) \
-       $(md5sum_SOURCES) mkdir.c mkfifo.c mknod.c $(mv_SOURCES) \
-       nice.c nl.c nohup.c od.c paste.c pathchk.c pinky.c pr.c \
-       printenv.c printf.c ptx.c pwd.c readlink.c $(rm_SOURCES) \
-       rmdir.c seq.c setuidgid.c $(sha1sum_SOURCES) shred.c sleep.c \
-       sort.c split.c stat.c stty.c su.c sum.c sync.c tac.c tail.c \
-       tee.c test.c touch.c tr.c true.c tsort.c tty.c uname.c \
--      unexpand.c uniq.c unlink.c uptime.c users.c $(vdir_SOURCES) \
-+      unexpand.c uniq.c unlink.c users.c $(vdir_SOURCES) \
-       wc.c who.c whoami.c yes.c
- HEADERS = $(noinst_HEADERS)
- ETAGS = etags
-@@ -840,7 +832,6 @@
- nanosec_libs = $(LDADD) $(POW_LIB) $(LIB_NANOSLEEP)
- sleep_LDADD = $(nanosec_libs)
- tail_LDADD = $(nanosec_libs)
--uptime_LDADD = $(LDADD) $(GETLOADAVG_LIBS)
- su_LDADD = $(LDADD) $(LIB_CRYPT)
- SUFFIXES = .sh
- installed_su = $(DESTDIR)$(bindir)/`echo su|sed '$(transform)'`
-@@ -1076,9 +1067,6 @@
- join$(EXEEXT): $(join_OBJECTS) $(join_DEPENDENCIES) 
-       @rm -f join$(EXEEXT)
-       $(LINK) $(join_LDFLAGS) $(join_OBJECTS) $(join_LDADD) $(LIBS)
--kill$(EXEEXT): $(kill_OBJECTS) $(kill_DEPENDENCIES) 
--      @rm -f kill$(EXEEXT)
--      $(LINK) $(kill_LDFLAGS) $(kill_OBJECTS) $(kill_LDADD) $(LIBS)
- link$(EXEEXT): $(link_OBJECTS) $(link_DEPENDENCIES) 
-       @rm -f link$(EXEEXT)
-       $(LINK) $(link_LDFLAGS) $(link_OBJECTS) $(link_LDADD) $(LIBS)
-@@ -1226,9 +1214,6 @@
- unlink$(EXEEXT): $(unlink_OBJECTS) $(unlink_DEPENDENCIES) 
-       @rm -f unlink$(EXEEXT)
-       $(LINK) $(unlink_LDFLAGS) $(unlink_OBJECTS) $(unlink_LDADD) $(LIBS)
--uptime$(EXEEXT): $(uptime_OBJECTS) $(uptime_DEPENDENCIES) 
--      @rm -f uptime$(EXEEXT)
--      $(LINK) $(uptime_LDFLAGS) $(uptime_OBJECTS) $(uptime_LDADD) $(LIBS)
- users$(EXEEXT): $(users_OBJECTS) $(users_DEPENDENCIES) 
-       @rm -f users$(EXEEXT)
-       $(LINK) $(users_LDFLAGS) $(users_OBJECTS) $(users_LDADD) $(LIBS)
-@@ -1322,7 +1307,6 @@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/id.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/install.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/join.Po@am__quote@
--@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kill.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lbracket.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/link.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ln.Po@am__quote@
-@@ -1378,7 +1362,6 @@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unexpand.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uniq.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unlink.Po@am__quote@
--@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uptime.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/users.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wc.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/who.Po@am__quote@
-@@ -1606,7 +1589,7 @@
-         && can_create_suid_root_executable=yes; \
-       rm -f $$TMPFILE; \
-       if test $$can_create_suid_root_executable = yes; then \
--        $(INSTALL_SU); \
-+        echo "Installation of su is suppressed"; \
-       else \
-         echo "WARNING: insufficient access; not installing su"; \
-         echo "NOTE: to install su, run 'make install-root' as root"; \
diff --git a/src/patches/coreutils-5.96-uname-1.patch b/src/patches/coreutils-5.96-uname-1.patch
deleted file mode 100644 (file)
index 0ae413f..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-Submitted By: Robert Connolly <robert@linuxfromscratch.org> (ashes)
-Date: 2005-11-13
-Initial Package Version: 5.93
-Upstream Status: pending
-Origin: Scot McPherson and Zack Winkles
-Description: Fix the output of uname once and for all. This is the position independent
-version.
-
-       $ uname -m      # This always worked.
-       i686
-       $ uname -i      # Used to report 'unknown'.
-       i386
-       $ uname -p      # Likewise.
-       athlon-4
-
-Now 'uname -p' can be used by GCC's mtune/mcpu and march options. For example:
-
-       CFLAGS="-march=$(uname -m) -mtune=$(uname -p)"
-
-diff -Naur coreutils-5.93.orig/src/uname.c coreutils-5.93/src/uname.c
---- coreutils-5.93.orig/src/uname.c    2005-09-15 19:57:04.000000000 +0000
-+++ coreutils-5.93/src/uname.c 2005-11-13 19:18:35.000000000 +0000
-@@ -29,6 +29,26 @@
- # include <sys/systeminfo.h>
- #endif
-+#ifdef linux
-+/* Thanks to the ffmpeg team for this PIC version of cpuid() */
-+#ifdef ARCH_X86_64
-+#  define REG_b "rbx"
-+#  define REG_S "rsi"
-+#else
-+#  define REG_b "ebx"
-+#  define REG_S "esi"
-+#endif
-+#define cpuid(index,eax,ebx,ecx,edx)\
-+      __asm __volatile\
-+        ("mov %%"REG_b", %%"REG_S"\n\t"\
-+        "cpuid\n\t"\
-+        "xchg %%"REG_b", %%"REG_S\
-+        : "=a" (eax), "=S" (ebx),\
-+        "=c" (ecx), "=d" (edx)\
-+        : "0" (index));
-+int has_sse( void );
-+#endif
-+
- #if HAVE_SYS_SYSCTL_H
- # if HAVE_SYS_PARAM_H
- #  include <sys/param.h> /* needed for OpenBSD 3.0 */
-@@ -256,6 +276,99 @@
-       if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor))
-         element = processor;
-       }
-+#else
-+      {
-+      struct utsname u;
-+      uname (&u);
-+      element = u.machine;
-+#ifdef linux
-+/******************************************************************************
-+ *
-+ * Hello, major hack.  I shouldn't have to do this.  struct utsname should
-+ * have another element with this info in it.  There's probably a struct
-+ * somewhere that has this info, I just don't know where it is.
-+ *
-+ *****************************************************************************/
-+
-+      if( !strcmp( element, "i586" ) || !strcmp( element, "i686" ) ) {
-+        int eax, ebx, ecx, edx, unused;
-+        int model, family, sse;
-+     
-+        cpuid(0,unused,ebx,ecx,edx);
-+        cpuid(1,eax,unused,unused,unused);
-+        model = (eax >> 4) & 0xf;
-+        family = (eax >> 8) & 0xf;
-+
-+        switch(ebx) {
-+        case 0x756e6547: // Intel
-+          switch( family ) {
-+          case 5: // Pentium
-+            if( model <= 3 )
-+              element="pentium";
-+            if( model > 3 )
-+              element="pentium-mmx";
-+            break;
-+          case 6: // PentiumPro - Pentium III
-+            if( model == 1 ) // Pentium Pro
-+              element="pentiumpro";
-+            if( ( model == 3 ) || ( model == 5 ) ||
-+                ( model == 6 ) ) // Pentium II
-+              element="pentium2";
-+            if( ( model == 7 ) || ( model == 8 ) ||
-+                ( model == 10 ) || ( model == 11 ) ) // These are all Pentium III
-+              element="pentium3";
-+            break;
-+          case 15: // Pentium4
-+            if( model == 3 ) // Prescott
-+                element="prescott";
-+            else
-+            element="pentium4";
-+            break;
-+          default:
-+            break;
-+          } // end switch( family )
-+          break;
-+        case 0x68747541: // AMD
-+          switch(family) {
-+          case 5:
-+            if( ( model == 0 ) || ( model == 1 ) || 
-+                ( model == 2 ) || ( model == 3 ) ) // K5
-+              element="i586";
-+            if( ( model == 6 ) || ( model == 7 ) ) // K6
-+              element="k6";
-+            if( model == 8 ) // K6-2
-+              element="k6-2";
-+            if( model == 9 ) // K6-3
-+              element="k6-3";
-+            break;
-+          case 6:
-+            if( model <= 4 )
-+              element="athlon";
-+            if( model > 4 ) {
-+              sse = has_sse();
-+              if( sse == 0 )
-+                element="athlon";
-+              if( sse == 1 )
-+                element="athlon-4";
-+            }
-+            break;
-+          case 15:
-+            element="athlon-4";
-+            break;
-+          default:
-+            break;
-+          } // end switch( family )
-+          break;
-+        case 0x69727943: // Cyrix
-+          element="i386"; // who knows what cyrix supports, lets be safe
-+          break;
-+        default:
-+          break;
-+        } // end switch(ebx)
-+      }
-+
-+#endif
-+      }
- #endif
- #ifdef UNAME_PROCESSOR
-       if (element == unknown)
-@@ -293,7 +406,7 @@
-   if (toprint & PRINT_HARDWARE_PLATFORM)
-     {
--      char const *element = unknown;
-+      char *element = unknown;
- #if HAVE_SYSINFO && defined SI_PLATFORM
-       {
-       static char hardware_platform[257];
-@@ -301,6 +414,15 @@
-                         hardware_platform, sizeof hardware_platform))
-         element = hardware_platform;
-       }
-+#else
-+      {
-+      struct utsname u;
-+      uname (&u);
-+      element = u.machine;
-+      if (strlen (element) == 4 && element[0] == 'i' && element[2] == '8'
-+          && element[3] == '6')
-+        element[1] = '3';
-+      }
- #endif
- #ifdef UNAME_HARDWARE_PLATFORM
-       if (element == unknown)
-@@ -323,3 +445,29 @@
-   exit (EXIT_SUCCESS);
- }
-+
-+#ifdef linux
-+
-+/******************************************************************************
-+ *
-+ * int has_sse( void )
-+ * Checks Athlon CPU's to see if they support SSE.
-+ *
-+ *****************************************************************************/
-+
-+int has_sse( void )
-+{
-+  unsigned long edx, unused;
-+  int sse;
-+  cpuid(1,unused,unused,unused,edx);
-+  // I think, I need this tested on a Duron with SSE
-+  // and one without it.
-+  sse = edx & 0x2000000;
-+  if( sse == 0 ) {
-+    return 0;
-+  } else {
-+    return 1;
-+  }
-+
-+}
-+#endif
diff --git a/src/patches/dracut-006_add_run_dir.patch b/src/patches/dracut-006_add_run_dir.patch
deleted file mode 100644 (file)
index 08063f8..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-diff -Naur dracut-006.org/modules.d/99base/init dracut-006/modules.d/99base/init
---- dracut-006.org/modules.d/99base/init       2010-06-17 10:46:29.000000000 +0200
-+++ dracut-006/modules.d/99base/init   2013-10-31 16:51:17.658771341 +0100
-@@ -87,6 +87,9 @@
- ln -s /proc/self/fd /dev/fd >/dev/null 2>&1
-+# create run dir
-+mkdir run
-+
- if getarg rdinitdebug; then
-     getarg quiet && DRACUT_QUIET="yes"
-     mkfifo /dev/initlog.pipe
diff --git a/src/patches/dracut-006_lzma.patch b/src/patches/dracut-006_lzma.patch
deleted file mode 100644 (file)
index ddf4991..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-diff -Naur dracut-006.org/dracut dracut-006/dracut
---- dracut-006.org/dracut      2010-06-17 10:46:29.000000000 +0200
-+++ dracut-006/dracut  2010-08-07 21:00:38.000000000 +0200
-@@ -308,9 +308,7 @@
-       #strip -R .comment $note "$f" || :
-     done
- fi
--
--type pigz &>/dev/null && gzip=pigz || gzip=gzip
--( cd "$initdir"; find . |cpio -R 0:0 -H newc -o --quiet |$gzip -9 > "$outfile"; ) 
-+( cd "$initdir"; find . |cpio -R 0:0 -H newc -o --quiet | lzma > "$outfile"; ) 
- if [ $? -ne 0 ]; then
-     derror "dracut: creation of $outfile failed"
-     exit 1
diff --git a/src/patches/dracut-006_remove_cdrom_wait.patch b/src/patches/dracut-006_remove_cdrom_wait.patch
deleted file mode 100644 (file)
index 23c084e..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-diff -Naur dracut-006.org/modules.d/99base/init dracut-006/modules.d/99base/init
---- dracut-006.org/modules.d/99base/init       2010-06-17 10:46:29.000000000 +0200
-+++ dracut-006/modules.d/99base/init   2011-01-12 11:40:41.713190125 +0100
-@@ -190,17 +190,6 @@
-     # no more udev jobs and queues empty.
-     sleep 0.5
--    # dirty hack for some cdrom drives,
--    # which report no medium for quiet
--    # some time.
--    for cdrom in /sys/block/sr*; do
--      [ -e "$cdrom" ] || continue
--      # skip, if cdrom medium was already found
--        strstr "$(udevadm info --query=env --path=${cdrom##/sys})" \
--          ID_CDROM_MEDIA && continue
--        echo change > "$cdrom/uevent"        
--    done
--    
-     i=$(($i+1))
-     [ $i -gt $RDRETRY ] \
-         && { flock -s 9 ; emergency_shell "No root device found"; } 9>/.console_lock
diff --git a/src/patches/dracut-006_remove_scsi_wait.patch b/src/patches/dracut-006_remove_scsi_wait.patch
deleted file mode 100644 (file)
index cfccf01..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -Naur dracut-006.org/modules.d/99base/init dracut-006/modules.d/99base/init
---- dracut-006.org/modules.d/99base/init       2010-06-17 10:46:29.000000000 +0200
-+++ dracut-006/modules.d/99base/init   2013-10-31 17:05:09.135475525 +0100
-@@ -175,7 +175,7 @@
-     $UDEV_QUEUE_EMPTY >/dev/null 2>&1 || continue
--    modprobe scsi_wait_scan && rmmod scsi_wait_scan
-+    sleep 0.1
-     $UDEV_QUEUE_EMPTY >/dev/null 2>&1 || continue
diff --git a/src/patches/dracut-init_start_ipfireinstaller.patch b/src/patches/dracut-init_start_ipfireinstaller.patch
deleted file mode 100644 (file)
index 0103826..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-diff -Naur org/init new/init
---- init       2010-06-17 10:46:29.000000000 +0200
-+++ init       2010-08-10 17:55:41.000000000 +0200
-@@ -111,8 +111,9 @@
- getarg 'rdbreak=cmdline' && emergency_shell -n cmdline "Break before cmdline"
- source_all cmdline
--[ -z "$root" ] && die "No or empty root= argument"
--[ -z "$rootok" ] && die "Don't know how to handle 'root=$root'"
-+# Disable root argument check ...
-+#[ -z "$root" ] && die "No or empty root= argument"
-+#[ -z "$rootok" ] && die "Don't know how to handle 'root=$root'"
- # Network root scripts may need updated root= options,
- # so deposit them where they can see them (udev purges the env)
-@@ -202,12 +203,15 @@
-     done
-     
-     i=$(($i+1))
--    [ $i -gt $RDRETRY ] \
--        && { flock -s 9 ; emergency_shell "No root device found"; } 9>/.console_lock
-+      # Start IPFire installer after root was not found ;)
-+    [ $i -gt $RDRETRY ] && break 2;
-+
- done
- unset job
- unset queuetriggered
-+/etc/rc_installer
-+
- # pre-mount happens before we try to mount the root filesystem,
- # and happens once.
- getarg 'rdbreak=pre-mount' && emergency_shell -n pre-mount "Break pre-mount"
diff --git a/src/patches/mdadm-3.3.1-Assemble-Only-fail-auto-assemble-in-face-of-mdadm.co.patch b/src/patches/mdadm-3.3.1-Assemble-Only-fail-auto-assemble-in-face-of-mdadm.co.patch
new file mode 100644 (file)
index 0000000..5215789
--- /dev/null
@@ -0,0 +1,85 @@
+From 5141638c54535b4ac80b8481404d868a63a18ecd Mon Sep 17 00:00:00 2001
+From: NeilBrown <neilb@suse.de>
+Date: Tue, 29 Jul 2014 13:48:23 +1000
+Subject: [PATCH] Assemble: Only fail auto-assemble in face of mdadm.conf
+ conflicts.
+
+We should never auto-assemble things that conflict with mdadm.conf
+However explicit assembly requests should be allowed.
+
+Reported-by: olovopb
+Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1070245
+Signed-off-by: NeilBrown <neilb@suse.de>
+---
+ Assemble.c | 47 ++++++++++++++++++++++++++---------------------
+ 1 file changed, 26 insertions(+), 21 deletions(-)
+
+diff --git a/Assemble.c b/Assemble.c
+index aca28be..cdcdb0f 100644
+--- a/Assemble.c
++++ b/Assemble.c
+@@ -366,9 +366,6 @@ static int select_devices(struct mddev_dev *devlist,
+                       tmpdev = NULL;
+                       goto loop;
+               } else {
+-                      int rv = 0;
+-                      struct mddev_ident *match;
+-
+                       content = *contentp;
+                       tst->ss->getinfo_super(tst, content, NULL);
+@@ -377,25 +374,33 @@ static int select_devices(struct mddev_dev *devlist,
+                                          report_mismatch ? devname : NULL))
+                               goto loop;
+-                      match = conf_match(tst, content, devname,
+-                                         report_mismatch ? c->verbose : -1,
+-                                         &rv);
+-                      if (!match && rv == 2)
+-                              goto loop;
+-                      if (match && match->devname &&
+-                          strcasecmp(match->devname, "<ignore>") == 0) {
+-                              if (report_mismatch)
+-                                      pr_err("%s is a member of an explicitly ignored array\n",
+-                                             devname);
+-                              goto loop;
+-                      }
+-                      if (match && !ident_matches(match, content, tst,
+-                                                  c->homehost, c->update,
+-                                                  report_mismatch ? devname : NULL))
+-                              /* Array exists  in mdadm.conf but some
+-                               * details don't match, so reject it
++                      if (auto_assem) {
++                              /* Never auto-assemble things that conflict
++                               * with mdadm.conf in some way
+                                */
+-                              goto loop;
++                              struct mddev_ident *match;
++                              int rv = 0;
++
++                              match = conf_match(tst, content, devname,
++                                                 report_mismatch ? c->verbose : -1,
++                                                 &rv);
++                              if (!match && rv == 2)
++                                      goto loop;
++                              if (match && match->devname &&
++                                  strcasecmp(match->devname, "<ignore>") == 0) {
++                                      if (report_mismatch)
++                                              pr_err("%s is a member of an explicitly ignored array\n",
++                                                     devname);
++                                      goto loop;
++                              }
++                              if (match && !ident_matches(match, content, tst,
++                                                          c->homehost, c->update,
++                                                          report_mismatch ? devname : NULL))
++                                      /* Array exists  in mdadm.conf but some
++                                       * details don't match, so reject it
++                                       */
++                                      goto loop;
++                      }
+                       /* should be safe to try an exclusive open now, we
+                        * have rejected anything that some other mdadm might
+-- 
+1.9.3
+
diff --git a/src/patches/mktemp-1.5-add_tempfile-3.patch b/src/patches/mktemp-1.5-add_tempfile-3.patch
deleted file mode 100644 (file)
index bf6dfbe..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-Submitted By: Tushar Teredesai <tushar@linuxfromscratch.org>
-Date: 2005-07-25
-Initial Package Version: 1.5
-Upstream Status: Sent, no response yet.
-Origin: http://archive.linuxfromscratch.org/mail-archives/lfs-dev/2003-April/033602.html
-        http://archive.linuxfromscratch.org/mail-archives/lfs-dev/2003-June/035234.html
-               http://linuxfromscratch.org/pipermail/lfs-dev/2005-June/051908.html
-Description: Add tempfile wrapper script. Use "make install-tempfile" to install it.
-
-diff -Naur mktemp-1.5.orig/Makefile.in mktemp-1.5/Makefile.in
---- mktemp-1.5.orig/Makefile.in        2003-03-23 18:09:56.000000000 -0700
-+++ mktemp-1.5/Makefile.in     2005-07-25 11:11:11.000000000 -0600
-@@ -113,6 +113,9 @@
- install-man:
-       $(INSTALL) -m 0444 $(srcdir)/$(PROG).$(mantype) $(mandir)/man1/$(PROG).1
-+install-tempfile: $(srcdir)/tempfile
-+      $(INSTALL) -m 0555 $(srcdir)/tempfile $(bindir)/tempfile
-+
- check:
-       @echo nothing to check
-diff -Naur mktemp-1.5.orig/tempfile mktemp-1.5/tempfile
---- mktemp-1.5.orig/tempfile   1969-12-31 17:00:00.000000000 -0700
-+++ mktemp-1.5/tempfile        2005-07-25 11:13:41.000000000 -0600
-@@ -0,0 +1,85 @@
-+#!/bin/bash
-+# A tempfile wrapper for mktemp
-+# Note: If you can, avoid using tempfile and use mktemp instead.
-+#       This wrapper is provided for compatibility since some scripts use
-+#       tempfile. If possible, the best solution is to patch the scripts
-+#       to use mktemp.
-+#
-+# Copyright (c) Tushar Teredesai <tush@yahoo.com>
-+#
-+# Permission to use, copy, modify, and distribute this software for any
-+# purpose with or without fee is hereby granted, provided that the above
-+# copyright notice and this permission notice appear in all copies.
-+#
-+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-+# ANY SPECIAL, DIRECT, 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.
-+#
-+
-+# Usage info
-+usage()
-+{
-+      echo "Usage: tempfile [OPTION]"
-+      echo
-+      echo "Create a temporary file in a safe manner."
-+      echo "This version is a wrapper that invokes mktemp."
-+      echo "NOTE: Do not use tempfile in your scripts."
-+      echo "      Use mktemp instead."
-+      echo
-+      echo "[-d|--directory] DIR -> place temporary file in DIR"
-+      echo "[-p|--prefix] PREFIX -> ignored"
-+      echo "[-s|--suffix] SUFFIX -> ignored"
-+      echo "[-n|--name] NAME -> ignored"
-+      echo "[-m|--mode] MODE -> ignored"
-+      echo "--version -> output version information and exit"
-+}
-+
-+# parse all arguments
-+while [ $# != 0 ]
-+do
-+      case "$1" in
-+      # -d for tempfile is equivalent to -p for mktemp
-+      -d|--directory)
-+              dir="$2"
-+              shift 2
-+      ;;
-+      --directory=*)
-+              dir="${1#--directory=}"
-+              shift 1
-+      ;;
-+      -d*)
-+              dir="${1#-d}"
-+              shift 1
-+      ;;
-+      # The following switches are ignored.
-+      -p|--prefix|-s|--suffix|-n|--name|-m|--mode)
-+              shift 2
-+      ;;
-+      -p*|--prefix=*|-s*|--suffix=*|-n*|--name=*|-m*|--mode=*)
-+              shift 1
-+      ;;
-+      # --version for tempfile is equivalent to -V for mktemp
-+      --version)
-+              echo "tempfile 1.0 (`mktemp -V 2>/dev/null`)"
-+              exit 0
-+      ;;
-+      # Unknown switch
-+      *)
-+              usage
-+              exit 1
-+      ;;
-+      esac
-+done
-+
-+# Use the dir if $TMPDIR is not set.
-+if [ -z "$TMPDIR" -a ! -z "$dir" ]
-+then
-+      export TMPDIR="$dir"
-+fi
-+# Execute mktemp with proper arguments
-+# the -t behaviour of mktemp is the default for tempfile
-+exec mktemp -t
diff --git a/src/patches/newt-0.51.6-if1close.patch b/src/patches/newt-0.51.6-if1close.patch
deleted file mode 100644 (file)
index 476396f..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
---- newt-0.51.6/form.c.orig    2004-10-15 11:17:35.042333181 -0400
-+++ newt-0.51.6/form.c 2004-10-15 11:18:53.428533351 -0400
-@@ -889,6 +889,7 @@
-     struct eventResult er;
-     int key, i, max;
-     int done = 0;
-+    int success;
-     fd_set readSet, writeSet, exceptSet;
-     struct timeval nextTimeout, now, timeout;
- #ifdef USE_GPM
-@@ -902,7 +903,7 @@
-     conn.minMod      = 0;
-     conn.maxMod      = 0;
--    Gpm_Open(&conn, 0);
-+    success = Gpm_Open(&conn, 0);
- #endif
-     newtFormSetSize(co);
-@@ -1062,7 +1063,8 @@
-     }
-     newtRefresh();
- #ifdef USE_GPM
--    Gpm_Close();
-+    if (success > 0)
-+        Gpm_Close();
- #endif
- }
diff --git a/src/patches/readline/readline62-001 b/src/patches/readline/readline62-001
deleted file mode 100644 (file)
index d4563c3..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-                          READLINE PATCH REPORT
-                          =====================
-
-Readline-Release: 6.2
-Patch-ID: readline62-001
-
-Bug-Reported-by:       Clark J. Wang <dearvoid@gmail.com>
-Bug-Reference-ID:      <AANLkTimGbW7aC4E5infXP6ku5WPci4t=xVc+L1SyHqrD@mail.gmail.com>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00157.html
-
-Bug-Description:
-
-The readline vi-mode `cc', `dd', and `yy' commands failed to modify the
-entire line.
-
-[This patch intentionally does not modify patchlevel]
-
-Patch (apply with `patch -p0'):
-
-*** ../readline-6.2-patched/vi_mode.c  2010-11-20 19:51:39.000000000 -0500
---- vi_mode.c  2011-02-17 20:24:25.000000000 -0500
-***************
-*** 1115,1119 ****
-        _rl_vi_last_motion = c;
-        RL_UNSETSTATE (RL_STATE_VIMOTION);
-!       return (0);
-      }
-  #if defined (READLINE_CALLBACKS)
---- 1115,1119 ----
-        _rl_vi_last_motion = c;
-        RL_UNSETSTATE (RL_STATE_VIMOTION);
-!       return (vidomove_dispatch (m));
-      }
-  #if defined (READLINE_CALLBACKS)
-*** ../readline-6.2-patched/callback.c 2010-06-06 12:18:58.000000000 -0400
---- callback.c 2011-02-17 20:43:28.000000000 -0500
-***************
-*** 149,152 ****
---- 149,155 ----
-         /* Should handle everything, including cleanup, numeric arguments,
-            and turning off RL_STATE_VIMOTION */
-+        if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)
-+          _rl_internal_char_cleanup ();
-+ 
-         return;
-       }
diff --git a/src/patches/readline/readline62-002 b/src/patches/readline/readline62-002
deleted file mode 100644 (file)
index 3dc2604..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-                          READLINE PATCH REPORT
-                          =====================
-
-Readline-Release: 6.2
-Patch-ID: readline62-002
-
-Bug-Reported-by:       Vincent Sheffer <vince.sheffer@apisphere.com>
-Bug-Reference-ID:      <F13C1C4F-C44C-4071-BFED-4BB6D13CF92F@apisphere.com>
-Bug-Reference-URL:     https://lists.gnu.org/archive/html/bug-readline/2011-08/msg00000.html
-
-Bug-Description:
-
-The readline shared library helper script needs to be updated for Mac OS X
-10.7 (Lion, darwin11).
-
-Patch (apply with `patch -p0'):
-
-*** ../readline-6.2-patched/support/shobj-conf 2009-10-28 09:20:21.000000000 -0400
---- support/shobj-conf 2011-08-27 13:25:23.000000000 -0400
-***************
-*** 158,162 ****
-  
-  # Darwin/MacOS X
-! darwin[89]*|darwin10*)
-       SHOBJ_STATUS=supported
-       SHLIB_STATUS=supported
---- 172,176 ----
-  
-  # Darwin/MacOS X
-! darwin[89]*|darwin1[012]*)
-       SHOBJ_STATUS=supported
-       SHLIB_STATUS=supported
-***************
-*** 187,191 ****
-  
-       case "${host_os}" in
-!      darwin[789]*|darwin10*) SHOBJ_LDFLAGS=''
-                       SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
-                       ;;
---- 201,205 ----
-  
-       case "${host_os}" in
-!      darwin[789]*|darwin1[012]*)     SHOBJ_LDFLAGS=''
-                       SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
-                       ;;
-
-*** ../readline-6.2-patched/patchlevel 2010-01-14 10:15:52.000000000 -0500
---- patchlevel 2011-11-17 11:09:35.000000000 -0500
-***************
-*** 1,3 ****
-  # Do not edit -- exists only for use by patch
-  
-! 1
---- 1,3 ----
-  # Do not edit -- exists only for use by patch
-  
-! 2
diff --git a/src/patches/readline/readline62-003 b/src/patches/readline/readline62-003
deleted file mode 100644 (file)
index 0462242..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-                          READLINE PATCH REPORT
-                          =====================
-
-Readline-Release: 6.2
-Patch-ID: readline62-003
-
-Bug-Reported-by:       Max Horn <max@quendi.de>
-Bug-Reference-ID:      <20CC5C60-07C3-4E41-9817-741E48D407C5@quendi.de>
-Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-readline/2012-06/msg00005.html
-
-Bug-Description:
-
-A change between readline-6.1 and readline-6.2 to prevent the readline input
-hook from being called too frequently had the side effect of causing delays
-when reading pasted input on systems such as Mac OS X.  This patch fixes
-those delays while retaining the readline-6.2 behavior.
-
-Patch (apply with `patch -p0'):
-
-*** ../readline-6.2-patched/input.c    2010-05-30 18:33:01.000000000 -0400
---- input.c    2012-06-25 21:08:42.000000000 -0400
-***************
-*** 410,414 ****
-  rl_read_key ()
-  {
-!   int c;
-  
-    rl_key_sequence_length++;
---- 412,416 ----
-  rl_read_key ()
-  {
-!   int c, r;
-  
-    rl_key_sequence_length++;
-***************
-*** 430,441 ****
-         while (rl_event_hook)
-           {
-!            if (rl_gather_tyi () < 0) /* XXX - EIO */
-               {
-                 rl_done = 1;
-                 return ('\n');
-               }
-             RL_CHECK_SIGNALS ();
--            if (rl_get_char (&c) != 0)
--              break;
-             if (rl_done)              /* XXX - experimental */
-               return ('\n');
---- 432,447 ----
-         while (rl_event_hook)
-           {
-!            if (rl_get_char (&c) != 0)
-!              break;
-!              
-!            if ((r = rl_gather_tyi ()) < 0)   /* XXX - EIO */
-               {
-                 rl_done = 1;
-                 return ('\n');
-               }
-+            else if (r == 1)                  /* read something */
-+              continue;
-+ 
-             RL_CHECK_SIGNALS ();
-             if (rl_done)              /* XXX - experimental */
-               return ('\n');
-*** ../readline-6.2-patched/patchlevel 2010-01-14 10:15:52.000000000 -0500
---- patchlevel 2011-11-17 11:09:35.000000000 -0500
-***************
-*** 1,3 ****
-  # Do not edit -- exists only for use by patch
-  
-! 2
---- 1,3 ----
-  # Do not edit -- exists only for use by patch
-  
-! 3
diff --git a/src/patches/readline/readline62-004 b/src/patches/readline/readline62-004
deleted file mode 100644 (file)
index 5f3ba9b..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-                          READLINE PATCH REPORT
-                          =====================
-
-Readline-Release: 6.2
-Patch-ID: readline62-004
-
-Bug-Reported-by:       Jakub Filak
-Bug-Reference-ID:
-Bug-Reference-URL:     https://bugzilla.redhat.com/show_bug.cgi?id=813289
-
-Bug-Description:
-
-Attempting to redo (using `.') the vi editing mode `cc', `dd', or `yy'
-commands leads to an infinite loop.
-
-Patch (apply with `patch -p0'):
-
-*** ../readline-6.2-patched/vi_mode.c  2011-02-25 11:17:02.000000000 -0500
---- vi_mode.c  2012-06-02 12:24:47.000000000 -0400
-***************
-*** 1235,1243 ****
-        r = rl_domove_motion_callback (_rl_vimvcxt);
-      }
-!   else if (vi_redoing)
-      {
-        _rl_vimvcxt->motion = _rl_vi_last_motion;
-        r = rl_domove_motion_callback (_rl_vimvcxt);
-      }
-  #if defined (READLINE_CALLBACKS)
-    else if (RL_ISSTATE (RL_STATE_CALLBACK))
---- 1297,1313 ----
-        r = rl_domove_motion_callback (_rl_vimvcxt);
-      }
-!   else if (vi_redoing && _rl_vi_last_motion != 'd')  /* `dd' is special */
-      {
-        _rl_vimvcxt->motion = _rl_vi_last_motion;
-        r = rl_domove_motion_callback (_rl_vimvcxt);
-      }
-+   else if (vi_redoing)               /* handle redoing `dd' here */
-+     {
-+       _rl_vimvcxt->motion = _rl_vi_last_motion;
-+       rl_mark = rl_end;
-+       rl_beg_of_line (1, key);
-+       RL_UNSETSTATE (RL_STATE_VIMOTION);
-+       r = vidomove_dispatch (_rl_vimvcxt);
-+     }
-  #if defined (READLINE_CALLBACKS)
-    else if (RL_ISSTATE (RL_STATE_CALLBACK))
-***************
-*** 1317,1325 ****
-        r = rl_domove_motion_callback (_rl_vimvcxt);
-      }
-!   else if (vi_redoing)
-      {
-        _rl_vimvcxt->motion = _rl_vi_last_motion;
-        r = rl_domove_motion_callback (_rl_vimvcxt);
-      }
-  #if defined (READLINE_CALLBACKS)
-    else if (RL_ISSTATE (RL_STATE_CALLBACK))
---- 1387,1403 ----
-        r = rl_domove_motion_callback (_rl_vimvcxt);
-      }
-!   else if (vi_redoing && _rl_vi_last_motion != 'c')  /* `cc' is special */
-      {
-        _rl_vimvcxt->motion = _rl_vi_last_motion;
-        r = rl_domove_motion_callback (_rl_vimvcxt);
-      }
-+   else if (vi_redoing)               /* handle redoing `cc' here */
-+     {
-+       _rl_vimvcxt->motion = _rl_vi_last_motion;
-+       rl_mark = rl_end;
-+       rl_beg_of_line (1, key);
-+       RL_UNSETSTATE (RL_STATE_VIMOTION);
-+       r = vidomove_dispatch (_rl_vimvcxt);
-+     }
-  #if defined (READLINE_CALLBACKS)
-    else if (RL_ISSTATE (RL_STATE_CALLBACK))
-***************
-*** 1378,1381 ****
---- 1456,1472 ----
-        r = rl_domove_motion_callback (_rl_vimvcxt);
-      }
-+   else if (vi_redoing && _rl_vi_last_motion != 'y')  /* `yy' is special */
-+     {
-+       _rl_vimvcxt->motion = _rl_vi_last_motion;
-+       r = rl_domove_motion_callback (_rl_vimvcxt);
-+     }
-+   else if (vi_redoing)                       /* handle redoing `yy' here */
-+     {
-+       _rl_vimvcxt->motion = _rl_vi_last_motion;
-+       rl_mark = rl_end;
-+       rl_beg_of_line (1, key);
-+       RL_UNSETSTATE (RL_STATE_VIMOTION);
-+       r = vidomove_dispatch (_rl_vimvcxt);
-+     }
-  #if defined (READLINE_CALLBACKS)
-    else if (RL_ISSTATE (RL_STATE_CALLBACK))
-*** ../readline-6.2-patched/patchlevel 2010-01-14 10:15:52.000000000 -0500
---- patchlevel 2011-11-17 11:09:35.000000000 -0500
-***************
-*** 1,3 ****
-  # Do not edit -- exists only for use by patch
-  
-! 3
---- 1,3 ----
-  # Do not edit -- exists only for use by patch
-  
-! 4
diff --git a/src/patches/readline/readline63-001 b/src/patches/readline/readline63-001
new file mode 100644 (file)
index 0000000..bae6a2f
--- /dev/null
@@ -0,0 +1,43 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 6.3
+Patch-ID: readline63-001
+
+Bug-Reported-by:       Daan van Rossum <daan@flash.uchicago.edu>
+Bug-Reference-ID:      <20140307072523.GA14250@flash.uchicago.edu>
+Bug-Reference-URL:     
+
+Bug-Description:
+
+The `.' command in vi mode cannot undo multi-key commands beginning with
+`c', `d', and `y' (command plus motion specifier).
+
+Patch (apply with `patch -p0'):
+
+*** ../readline-6.3/readline.c 2013-10-28 14:58:06.000000000 -0400
+--- readline.c 2014-03-07 15:20:33.000000000 -0500
+***************
+*** 965,969 ****
+    if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
+        key != ANYOTHERKEY &&
+!       rl_key_sequence_length == 1 && /* XXX */
+        _rl_vi_textmod_command (key))
+      _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
+--- 965,969 ----
+    if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
+        key != ANYOTHERKEY &&
+!       _rl_dispatching_keymap == vi_movement_keymap &&
+        _rl_vi_textmod_command (key))
+      _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
+*** ../readline-6.3/patchlevel 2013-11-15 08:11:11.000000000 -0500
+--- patchlevel 2014-03-21 08:28:40.000000000 -0400
+***************
+*** 1,3 ****
+  # Do not edit -- exists only for use by patch
+  
+! 5
+--- 1,3 ----
+  # Do not edit -- exists only for use by patch
+  
+! 1
diff --git a/src/patches/readline/readline63-002 b/src/patches/readline/readline63-002
new file mode 100644 (file)
index 0000000..0e79f13
--- /dev/null
@@ -0,0 +1,44 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 6.3
+Patch-ID: readline63-002
+
+Bug-Reported-by:       Anatol Pomozov <anatol.pomozov@gmail.com>
+Bug-Reference-ID:      <CAOMFOmXy3mT2So5GQ5F-smCVArQuAeBwZ2QKzgCtMeXJoDeYOQ@mail.gmail.com>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-readline/2014-03/msg00010.html
+
+Bug-Description:
+
+When in callback mode, some readline commands can cause readline to seg
+fault by passing invalid contexts to callback functions.
+
+Patch (apply with `patch -p0'):
+
+*** ../readline-6.3/readline.c 2013-10-28 14:58:06.000000000 -0400
+--- readline.c 2014-03-10 14:15:02.000000000 -0400
+***************
+*** 745,749 ****
+  
+    RL_CHECK_SIGNALS ();
+!   if (r == 0)                        /* success! */
+      {
+        _rl_keyseq_chain_dispose ();
+--- 745,750 ----
+  
+    RL_CHECK_SIGNALS ();
+!   /* We only treat values < 0 specially to simulate recursion. */
+!   if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0))        /* success! or failure! */
+      {
+        _rl_keyseq_chain_dispose ();
+*** ../readline-6.3/patchlevel 2013-11-15 08:11:11.000000000 -0500
+--- patchlevel 2014-03-21 08:28:40.000000000 -0400
+***************
+*** 1,3 ****
+  # Do not edit -- exists only for use by patch
+  
+! 1
+--- 1,3 ----
+  # Do not edit -- exists only for use by patch
+  
+! 2
diff --git a/src/patches/readline/readline63-003 b/src/patches/readline/readline63-003
new file mode 100644 (file)
index 0000000..d2cad94
--- /dev/null
@@ -0,0 +1,47 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 6.3
+Patch-ID: readline63-003
+
+Bug-Reported-by:
+Bug-Reference-ID:
+Bug-Reference-URL:
+
+Bug-Description:
+
+There are debugging functions in the readline release that are theoretically
+exploitable as security problems.  They are not public functions, but have
+global linkage.
+
+Patch (apply with `patch -p0'):
+
+*** ../readline-6.3/util.c     2013-09-02 13:36:12.000000000 -0400
+--- util.c     2014-03-20 10:25:53.000000000 -0400
+***************
+*** 477,480 ****
+--- 479,483 ----
+  }
+  
++ #if defined (DEBUG)
+  #if defined (USE_VARARGS)
+  static FILE *_rl_tracefp;
+***************
+*** 539,542 ****
+--- 542,546 ----
+  }
+  #endif
++ #endif /* DEBUG */
+  
+  
+*** ../readline-6.3/patchlevel 2013-11-15 08:11:11.000000000 -0500
+--- patchlevel 2014-03-21 08:28:40.000000000 -0400
+***************
+*** 1,3 ****
+  # Do not edit -- exists only for use by patch
+  
+! 2
+--- 1,3 ----
+  # Do not edit -- exists only for use by patch
+  
+! 3
diff --git a/src/patches/readline/readline63-004 b/src/patches/readline/readline63-004
new file mode 100644 (file)
index 0000000..3cd89e3
--- /dev/null
@@ -0,0 +1,45 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 6.3
+Patch-ID: readline63-004
+
+Bug-Reported-by:       Egmont Koblinger <egmont@gmail.com>
+Bug-Reference-ID:      <CAGWcZk+bU5Jo1M+tutGvL-250UBE9DXjpeJVofYJSFcqFEVfMg@mail.gmail.com>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00153.html
+
+Bug-Description:
+
+The signal handling changes to bash and readline (to avoid running any code
+in a signal handler context) cause the cursor to be placed on the wrong
+line of a multi-line command after a ^C interrupts editing.
+
+Patch (apply with `patch -p0'):
+
+*** ../readline-6.3-patched/display.c  2013-12-27 13:10:56.000000000 -0500
+--- display.c  2014-03-27 11:52:45.000000000 -0400
+***************
+*** 2678,2682 ****
+    if (_rl_echoing_p)
+      {
+!       _rl_move_vert (_rl_vis_botlin);
+        _rl_vis_botlin = 0;
+        fflush (rl_outstream);
+--- 2678,2683 ----
+    if (_rl_echoing_p)
+      {
+!       if (_rl_vis_botlin > 0)        /* minor optimization plus bug fix */
+!      _rl_move_vert (_rl_vis_botlin);
+        _rl_vis_botlin = 0;
+        fflush (rl_outstream);
+*** ../readline-6.3/patchlevel 2013-11-15 08:11:11.000000000 -0500
+--- patchlevel 2014-03-21 08:28:40.000000000 -0400
+***************
+*** 1,3 ****
+  # Do not edit -- exists only for use by patch
+  
+! 3
+--- 1,3 ----
+  # Do not edit -- exists only for use by patch
+  
+! 4
diff --git a/src/patches/readline/readline63-005 b/src/patches/readline/readline63-005
new file mode 100644 (file)
index 0000000..8a63738
--- /dev/null
@@ -0,0 +1,58 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 6.3
+Patch-ID: readline63-005
+
+Bug-Reported-by:       Juergen Daubert <jue@jue.li>
+Bug-Reference-ID:      <20140303180430.GA7346@jue.netz>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-readline/2014-03/msg00002.html
+
+Bug-Description:
+
+There are still applications using the deprecated Function/VFunction/etc.
+typedefs in rltypedefs.h.  This patch restores the typedefs, but attempts
+to mark them as deprecated using gcc/clang attributes.  Thanks to Max Horn
+for the suggestion.
+
+Patch (apply with `patch -p0'):
+
+*** ../readline-6.3-patched/rltypedefs.h       2011-03-26 14:53:31.000000000 -0400
+--- rltypedefs.h       2014-04-10 11:30:45.000000000 -0400
+***************
+*** 27,30 ****
+--- 27,49 ----
+  #endif
+  
++ /* Old-style, attempt to mark as deprecated in some way people will notice. */
++ 
++ #if !defined (_FUNCTION_DEF)
++ #  define _FUNCTION_DEF
++ 
++ #if defined(__GNUC__) || defined(__clang__)
++ typedef int Function () __attribute__ ((deprecated));
++ typedef void VFunction () __attribute__ ((deprecated));
++ typedef char *CPFunction () __attribute__ ((deprecated));
++ typedef char **CPPFunction () __attribute__ ((deprecated));
++ #else
++ typedef int Function ();
++ typedef void VFunction ();
++ typedef char *CPFunction ();
++ typedef char **CPPFunction ();
++ #endif
++ 
++ #endif /* _FUNCTION_DEF */
++ 
+  /* New style. */
+  
+*** ../readline-6.3/patchlevel 2013-11-15 08:11:11.000000000 -0500
+--- patchlevel 2014-03-21 08:28:40.000000000 -0400
+***************
+*** 1,3 ****
+  # Do not edit -- exists only for use by patch
+  
+! 4
+--- 1,3 ----
+  # Do not edit -- exists only for use by patch
+  
+! 5
diff --git a/src/patches/readline/readline63-006 b/src/patches/readline/readline63-006
new file mode 100644 (file)
index 0000000..a3f0930
--- /dev/null
@@ -0,0 +1,63 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 6.3
+Patch-ID: readline63-006
+
+Bug-Reported-by:       <Trond.Endrestol@ximalas.info>
+Bug-Reference-ID:      <alpine.BSF.2.03.1404192114310.1973@enterprise.ximalas.info>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00069.html
+
+Bug-Description:
+
+Using reverse-i-search when horizontal scrolling is enabled does not redisplay
+the entire line containing the successful search results.
+
+Patch (apply with `patch -p0'):
+
+*** ../readline-6.3-patched/display.c  2014-04-08 18:19:36.000000000 -0400
+--- display.c  2014-04-20 18:32:52.000000000 -0400
+***************
+*** 1638,1642 ****
+       the spot of first difference is before the end of the invisible chars,
+       lendiff needs to be adjusted. */
+!   if (current_line == 0 && !_rl_horizontal_scroll_mode &&
+        current_invis_chars != visible_wrap_offset)
+      {
+--- 1638,1642 ----
+       the spot of first difference is before the end of the invisible chars,
+       lendiff needs to be adjusted. */
+!   if (current_line == 0 && /* !_rl_horizontal_scroll_mode && */
+        current_invis_chars != visible_wrap_offset)
+      {
+***************
+*** 1826,1831 ****
+               _rl_last_c_pos += bytes_to_insert;
+  
+             if (_rl_horizontal_scroll_mode && ((oe-old) > (ne-new)))
+!              goto clear_rest_of_line;
+           }
+       }
+--- 1826,1836 ----
+               _rl_last_c_pos += bytes_to_insert;
+  
++            /* XXX - we only want to do this if we are at the end of the line
++               so we move there with _rl_move_cursor_relative */
+             if (_rl_horizontal_scroll_mode && ((oe-old) > (ne-new)))
+!              {
+!                _rl_move_cursor_relative (ne-new, new);
+!                goto clear_rest_of_line;
+!              }
+           }
+       }
+*** ../readline-6.3/patchlevel 2013-11-15 08:11:11.000000000 -0500
+--- patchlevel 2014-03-21 08:28:40.000000000 -0400
+***************
+*** 1,3 ****
+  # Do not edit -- exists only for use by patch
+  
+! 5
+--- 1,3 ----
+  # Do not edit -- exists only for use by patch
+  
+! 6
diff --git a/src/patches/slang-1.4.5-utf8-segv.patch b/src/patches/slang-1.4.5-utf8-segv.patch
deleted file mode 100644 (file)
index f8df90a..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-diff -ru slang-1.4.5/src/slsmg.c slang-1.4.5-new/src/slsmg.c
---- slang-1.4.5/src/slsmg.c    2002-07-25 00:09:00.000000000 -0400
-+++ slang-1.4.5-new/src/slsmg.c        2002-07-25 00:04:02.000000000 -0400
-@@ -369,7 +369,10 @@
-   max_len = Start_Col + Screen_Cols;
-   len = This_Col;
--  p = SL_Screen[This_Row - Start_Row].neew + len - Start_Col;
-+
-+       
-+  p = SL_Screen[This_Row - Start_Row].neew;
-+  if (len > Start_Col) p += len - Start_Col;
-   prev = 0;
-   for (i = 0; i < n; i++, str) {
diff --git a/src/patches/slang-debian-utf8.patch b/src/patches/slang-debian-utf8.patch
deleted file mode 100644 (file)
index 62eb670..0000000
+++ /dev/null
@@ -1,917 +0,0 @@
---- slang-1.4.4.orig/src/slinclud.h
-+++ slang-1.4.4/src/slinclud.h
-@@ -23,4 +23,12 @@
- # include <memory.h>
- #endif
-
-+#define UTF8 1
-+
-+#ifdef UTF8
-+#include <wchar.h>
-+#include <limits.h>
-+#endif /* UTF8 */
-+
-+
- #endif                                       /* _SLANG_INCLUDE_H_ */
---- slang-1.4.4.orig/src/slang.h
-+++ slang-1.4.4/src/slang.h
-@@ -1239,10 +1239,20 @@
- extern int SLtt_Msdos_Cheap_Video;
- #endif
-
-+#define UTF8 1
-+
-+#ifdef UTF8
-+typedef int SLsmg_Char_Type;
-+#define SLSMG_EXTRACT_CHAR(x) ((x) & 0xFFFFFF)
-+#define SLSMG_EXTRACT_COLOR(x) (((x)>>24)&0xFF)
-+#define SLSMG_BUILD_CHAR(ch,color) (((SLsmg_Char_Type)(wchar_t)(ch))|((color)<<24))
-+#define SLSMG_NOCHAR 1
-+#else
- typedef unsigned short SLsmg_Char_Type;
- #define SLSMG_EXTRACT_CHAR(x) ((x) & 0xFF)
- #define SLSMG_EXTRACT_COLOR(x) (((x)>>8)&0xFF)
- #define SLSMG_BUILD_CHAR(ch,color) (((SLsmg_Char_Type)(unsigned char)(ch))|((color)<<8))
-+#endif /* UTF8 */
- extern int SLtt_flush_output (void);
- extern void SLtt_set_scroll_region(int, int);
-@@ -1334,7 +1342,11 @@
- /*{{{ SLsmg Screen Management Functions */
-+#ifdef UTF8
-+extern void SLsmg_fill_region (int, int, unsigned int, unsigned int, wchar_t);
-+#else
- extern void SLsmg_fill_region (int, int, unsigned int, unsigned int, unsigned char);
-+#endif /* UTF8 */
- extern void SLsmg_set_char_set (int);
- #ifndef IBMPC_SYSTEM
- extern int SLsmg_Scroll_Hash_Border;
-@@ -1351,7 +1363,12 @@
- extern void SLsmg_vprintf (char *, va_list);
- extern void SLsmg_write_string (char *);
- extern void SLsmg_write_nstring (char *, unsigned int);
-+#ifdef UTF8
-+extern void SLsmg_write_char (wchar_t);
-+extern void SLsmg_write_nwchars (wchar_t *, unsigned int);
-+#else
- extern void SLsmg_write_char (char);
-+#endif /* UTF8 */
- extern void SLsmg_write_nchars (char *, unsigned int);
- extern void SLsmg_write_wrapped_string (char *, int, int, unsigned int, unsigned int, int);
- extern void SLsmg_cls (void);
---- slang-1.4.4.orig/src/slcurses.c
-+++ slang-1.4.4/src/slcurses.c
-@@ -440,20 +440,130 @@
- static int do_newline (SLcurses_Window_Type *w)
- {
--   w->_curx = 0;
-+   /* w->_curx = 0; */
-    w->_cury += 1;
-    if (w->_cury >= w->scroll_max)
-      {
-       w->_cury = w->scroll_max - 1;
--      if (w->scroll_ok)
-+      if (w->scroll_ok) {
-+        w->_curx = 0;
-         SLcurses_wscrl (w, 1);
-+      }
-      }
-+   else
-+     w->_curx = 0;
-+   
-+   return 0;
-+}
-+
-+#ifdef UTF8
-+static int SLcurses_waddch1 (SLcurses_Window_Type *win,
-+                           wchar_t ch, int color)
-+{
-+   SLsmg_Char_Type *b, *bmin, *bmax, *c;
-+   int k;
-+
-+   if (win == NULL) return -1;
-+
-+   if (win->_cury >= win->nrows)
-+     {
-+      /* Curses seems to move current postion to top of window. */
-+      win->_cury = win->_curx = 0;
-+      return -1;
-+     }
-+
-+   win->modified = 1;
-+
-+   if (ch < ' ')
-+     {
-+      if (ch == '\n')
-+        {
-+           SLcurses_wclrtoeol (win);
-+           return do_newline (win);
-+        }
-+
-+      if (ch == '\r')
-+        {
-+           win->_curx = 0;
-+           return 0;
-+        }
-+
-+      if (ch == '\b')
-+        {
-+           if (win->_curx > 0)
-+             win->_curx--;
-+
-+           return 0;
-+        }
-+
-+      /* HACK HACK!!!! */
-+      if (ch == '\t') ch = ' ';
-+     }
-+
-+   k = wcwidth(ch);
-+
-+   if (!k)
-+     return 0; /* ignore combining characters for now */
-+
-+   if (k > win->ncols)
-+     return 0; /* character wider than window */
-+
-+   if (win->_curx + k > win->ncols) {
-+     if (win->_curx < win->ncols)
-+       SLcurses_wclrtoeol(win);
-+     do_newline (win);
-+   }
-+
-+   bmin = win->lines[win->_cury];
-+   b = bmin + win->_curx;
-+   bmax = bmin + win->ncols;
-+
-+   /* Remove overwritten chars to left */
-+   if (*b == SLSMG_NOCHAR) {
-+     for (c = b - 1; c >= bmin && *c == SLSMG_NOCHAR; c--)
-+       *c = SLSMG_BUILD_CHAR(' ',SLSMG_EXTRACT_COLOR(*c));
-+     if (c >= bmin)
-+       *c = SLSMG_BUILD_CHAR(' ',SLSMG_EXTRACT_COLOR(*c));
-+   }
-+
-+   *b = SLSMG_BUILD_CHAR(ch,color);
-+   win->_curx += k;
-+   while (--k > 0)
-+     *++b = SLSMG_NOCHAR;
-+
-+   /* Remove overwritten chars to right */
-+   for (c = b + 1; c < bmax && *c == SLSMG_NOCHAR; c++)
-+     *c = SLSMG_BUILD_CHAR(' ',SLSMG_EXTRACT_COLOR(*c));
-    return 0;
- }
- int SLcurses_waddch (SLcurses_Window_Type *win, SLtt_Char_Type attr)
- {
-+   SLsmg_Char_Type ch, color;
-+
-+   if (win == NULL) return -1;
-+
-+   ch = SLSMG_EXTRACT_CHAR(attr);
-+
-+   if (attr == ch)
-+     color = win->color;
-+   else
-+     {
-+      /* hack to pick up the default color for graphics chars */
-+      if (((attr & A_COLOR) == 0) && ((attr & A_ALTCHARSET) != 0))
-+        {
-+           /* FIXME: priority=medium: Use SLSMG_?? instead of << */
-+           attr |= win->color << 8;
-+        }
-+      color = map_attr_to_object (attr);
-+     }
-+
-+   return SLcurses_waddch1 (win, ch, color);
-+}
-+#else
-+int SLcurses_waddch (SLcurses_Window_Type *win, SLtt_Char_Type attr)
-+{
-    SLsmg_Char_Type *b, ch;
-    SLsmg_Char_Type color;
-@@ -518,6 +628,7 @@
-    return 0;
- }
-+#endif /* UTF8 */
- int SLcurses_wnoutrefresh (SLcurses_Window_Type *w)
- {
-@@ -577,7 +688,11 @@
- int SLcurses_wclrtoeol (SLcurses_Window_Type *w)
- {
-+#ifdef UTF8
-+   SLsmg_Char_Type *b, *bmin, *bmax, *c;
-+#else
-    SLsmg_Char_Type *b, *bmax;
-+#endif /* UTF8 */
-    SLsmg_Char_Type blank;
-    if (w == NULL) return -1;
-@@ -588,9 +703,23 @@
-    blank = SLSMG_BUILD_CHAR(' ',w->color);
-+#ifdef UTF8
-+   bmin = w->lines[w->_cury];
-+   b = bmin + w->_curx;
-+   bmax = bmin + w->ncols;
-+
-+   /* Remove overwritten chars to left */
-+   if (b < bmax && *b == SLSMG_NOCHAR) {
-+     for (c = b - 1; c >= bmin && *c == SLSMG_NOCHAR; c--)
-+       *c = SLSMG_BUILD_CHAR(' ',SLSMG_EXTRACT_COLOR(*c));
-+     if (c >= bmin) 
-+       *c = SLSMG_BUILD_CHAR(' ',SLSMG_EXTRACT_COLOR(*c));
-+   }
-+#else
-    b = w->lines[w->_cury];
-    bmax = b + w->ncols;
-    b += w->_curx;
-+#endif /* UTF8 */
-    while (b < bmax) *b++ = blank;
-    return 0;
-@@ -677,6 +806,34 @@
-    return 0;
- }
-+#ifdef UTF8
-+/* Note: if len is < 0, entire string will be used.
-+ */
-+int SLcurses_waddnstr (SLcurses_Window_Type *w, char *str, int len)
-+{
-+   size_t k;
-+   wchar_t wc;
-+   mbstate_t mbstate;
-+
-+   if ((w == NULL)
-+       || (str == NULL))
-+     return -1;
-+
-+   if (len < 0)
-+     len = (char *)(-1) - str;
-+
-+   memset (&mbstate, 0, sizeof (mbstate));
-+   while ((k = mbrtowc (&wc, str, len, &mbstate)) &&
-+        k != (size_t)(-1) &&
-+        k != (size_t)(-2))
-+     {
-+      SLcurses_waddch1 (w, wc, w->color);
-+      str += k;
-+      len -= k;
-+     }
-+   return k;
-+}
-+#else
- /* Note: if len is < 0, entire string will be used.
-  */
- int SLcurses_waddnstr (SLcurses_Window_Type *w, char *str, int len)
-@@ -758,6 +915,7 @@
-    return 0;
- }
-+#endif /* UTF8 */
- /* This routine IS NOT CORRECT.  It needs to compute the proper overlap
-  * and copy accordingly.  Here, I just assume windows are same size.
-@@ -852,12 +1010,36 @@
- int SLcurses_wdelch (SLcurses_Window_Type *w)
- {
-+#ifdef UTF8
-+   SLsmg_Char_Type *p, *p1, *pmin, *pmax, *q;
-+#else
-    SLsmg_Char_Type *p, *p1, *pmax;
-+#endif /* UTF8 */
-+#ifdef UTF8
-+   pmin = w->lines[w->_cury];
-+   p = pmin + w->_curx;
-+   pmax = pmin + w->ncols;
-+
-+   /* Remove overwritten chars to left */
-+   if (p < pmax && *p == SLSMG_NOCHAR) {
-+     for (q = p - 1; q >= pmin && *q == SLSMG_NOCHAR; q--)
-+       *q = SLSMG_BUILD_CHAR(' ',SLSMG_EXTRACT_COLOR(*q));
-+     if (q >= pmin)
-+       *q = SLSMG_BUILD_CHAR(' ',SLSMG_EXTRACT_COLOR(*q));
-+   }
-+
-+   /* Remove overwritten chars to right */
-+   for (q = p + 1; q < pmax && *q == SLSMG_NOCHAR; q++)
-+     *q = SLSMG_BUILD_CHAR(' ',SLSMG_EXTRACT_COLOR(*q));
-+ 
-+   p1 = p + 1;
-+#else
-    p = w->lines[w->_cury];
-    pmax = p + w->ncols;
-    p += w->_curx;
-    p1 = p + 1;
-+#endif /* UTF8 */
-    while (p1 < pmax)
-      {
-@@ -884,12 +1066,12 @@
-    while (pmax > p)
-      {
--      *pmax = *p1;
-+      *pmax = *p1; /* Doesn't this assign beyond the end of the line? */
-       pmax = p1;
-       p1--;
-      }
--   if (p < pmax)
-+   if (p < pmax) /* How could it be? */
-      *p = SLSMG_BUILD_CHAR(ch, w->color);
-    w->modified = 1;
---- slang-1.4.4.orig/src/slsmg.c
-+++ slang-1.4.4/src/slsmg.c
-@@ -225,6 +225,38 @@
-    SLsmg_write_nchars (str, strlen (str));
- }
-+#ifdef UTF8
-+void SLsmg_write_nstring (char *str, unsigned int n)
-+{
-+   char blank = ' ';
-+   mbstate_t mbstate;
-+
-+   /* Avoid a problem if a user accidently passes a negative value */
-+   if ((int) n < 0)
-+     return;
-+
-+   if (str != NULL)
-+     {
-+      wchar_t wc;
-+      size_t k;
-+      int w;
-+
-+      memset (&mbstate, 0, sizeof (mbstate));
-+        while ((k = mbrtowc (&wc, str, MB_LEN_MAX, &mbstate)) &&
-+             k != (size_t)(-1) &&
-+             k != (size_t)(-2))
-+        {
-+           w = wcwidth(wc);
-+           if (w < 0 || w > n)
-+             break;
-+           SLsmg_write_nwchars (&wc, 1);
-+           str += k;
-+           n -= w;
-+        }
-+     }
-+   while (n-- > 0) SLsmg_write_nchars (&blank, 1);
-+}
-+#else
- void SLsmg_write_nstring (char *str, unsigned int n)
- {
-    unsigned int width;
-@@ -243,7 +275,11 @@
-      }
-    while (width++ < n) SLsmg_write_nchars (&blank, 1);
- }
-+#endif /* UTF8 */
-+#ifdef UTF8
-+/* FIXME: This function not UTF8'd yet - Edmund */
-+#endif /* UTF8 */
- void SLsmg_write_wrapped_string (char *s, int r, int c,
-                                unsigned int dr, unsigned int dc,
-                                int fill)
-@@ -302,6 +338,123 @@
- int SLsmg_Display_Eight_Bit = 128;
- #endif
-+#ifdef UTF8
-+void SLsmg_write_nwchars (wchar_t *str, unsigned int n)
-+{
-+  SLsmg_Char_Type *p, *prev, *q;
-+  int len, max_len, w, i;
-+  wchar_t ch;
-+
-+#ifndef IBMPC_SYSTEM
-+   int alt_char_set_flag;
-+
-+   alt_char_set_flag = ((This_Color & ALT_CHAR_FLAG)
-+                      && ((tt_Use_Blink_For_ACS == NULL)
-+                          || (*tt_Use_Blink_For_ACS == 0)));
-+#endif
-+
-+  if (Smg_Inited == 0)
-+    return;
-+  if (This_Row < Start_Row || This_Row >= Start_Row + Screen_Rows)
-+    return;
-+
-+  max_len = Start_Col + Screen_Cols;
-+  len = This_Col;
-+  p = SL_Screen[This_Row - Start_Row].neew + len - Start_Col;
-+  prev = 0;
-+
-+  for (i = 0; i < n; i++, str) {
-+    ch = *str++;
-+#ifndef IBMPC_SYSTEM
-+    if (alt_char_set_flag)
-+      ch = Alt_Char_Set[ch & 0x7F];
-+#endif
-+    w = wcwidth(ch);
-+
-+    if (w > 0) {
-+      if (len + w <= max_len) {
-+      if (!prev) {
-+        for (q = p; *q == SLSMG_NOCHAR; q--)
-+          *q = SLSMG_BUILD_CHAR(' ', SLSMG_EXTRACT_COLOR(*q));
-+        *q = SLSMG_BUILD_CHAR(' ', SLSMG_EXTRACT_COLOR(*q));
-+      }
-+      prev = p;
-+      *p++ = SLSMG_BUILD_CHAR(ch, This_Color), ++len;
-+      for (; --w; len++, p++)
-+        *p = SLSMG_NOCHAR;
-+      }
-+      else if (len < max_len) {
-+      for (; len < max_len; len++, p++)
-+        *p = SLSMG_BUILD_CHAR(' ', SLSMG_EXTRACT_COLOR(*p));
-+      prev = 0;
-+      }
-+    }
-+    else if (ch == '\n' &&
-+           SLsmg_Newline_Behavior != SLSMG_NEWLINE_PRINTABLE) {
-+      SL_Screen[This_Row - Start_Row].flags |= TOUCHED;
-+      for (; len < max_len && *p == SLSMG_NOCHAR; len++, p++)
-+      *p = SLSMG_BUILD_CHAR(' ', SLSMG_EXTRACT_COLOR(*p));
-+      if (!SLsmg_Newline_Behavior)
-+      break;
-+      ++This_Row;
-+      len = 0;
-+      if (This_Row == Start_Row + Screen_Rows) {
-+      if (SLsmg_Newline_Behavior == SLSMG_NEWLINE_SCROLLS)
-+        scroll_up();
-+      else
-+        break;
-+      }
-+      p = SL_Screen[This_Row - Start_Row].neew;
-+      prev = 0;
-+    }
-+    else if (ch == '\t' && (SLsmg_Tab_Width > 0)) {
-+      while (len < max_len) {
-+      *p = SLSMG_BUILD_CHAR(' ', SLSMG_EXTRACT_COLOR(*p));
-+      ++p, ++len;
-+      if (len % SLsmg_Tab_Width == 0)
-+        break;
-+      }
-+    }
-+    else if ((ch == 0x8) && SLsmg_Backspace_Moves) {
-+      /* not implemented */
-+    }
-+    else if (!w && ch) {
-+      /* we could handle combining characters here, using prev */
-+    }
-+    else {
-+      /* we should convert control characters to printable form here */
-+    }
-+  }
-+  This_Col = len;
-+  if (i == n) {
-+    SL_Screen[This_Row - Start_Row].flags |= TOUCHED;
-+    for (; len < max_len && *p == SLSMG_NOCHAR; len++, p++)
-+      *p = SLSMG_BUILD_CHAR(' ', SLSMG_EXTRACT_COLOR(*p));
-+  }
-+}
-+
-+void SLsmg_write_char (wchar_t wc)
-+{
-+   SLsmg_write_nwchars (&wc, 1);
-+}
-+
-+void SLsmg_write_nchars (char *str, unsigned int n)
-+{
-+   wchar_t wc;
-+   size_t k;
-+   mbstate_t mbstate;
-+
-+   memset (&mbstate, 0, sizeof (mbstate));
-+   while ((k = mbrtowc (&wc, str, n, &mbstate)) &&
-+        k != (size_t)(-1) &&
-+        k != (size_t)(-2))
-+     {
-+        SLsmg_write_nwchars (&wc, 1);
-+      str += k;
-+      n -= k;
-+     }
-+}
-+#else
- void SLsmg_write_nchars (char *str, unsigned int n)
- {
-    register SLsmg_Char_Type *p, old, neew, color;
-@@ -475,6 +628,7 @@
- {
-    SLsmg_write_nchars (&ch, 1);
- }
-+#endif /* UTF8 */
- static int Cls_Flag;
-@@ -891,6 +1045,10 @@
-            This_Color = color;
-         }
-+#ifdef UTF8
-+      /* FIXME: We should convert broken wide characters to spaces
-+         before calling smart_puts */
-+#endif /* UTF8 */
-       SL_Screen[i].old[Screen_Cols] = 0;
-       SL_Screen[i].neew[Screen_Cols] = 0;
-@@ -1334,9 +1492,16 @@
-    This_Row = r; This_Col = c;
- }
-+#ifdef UTF8
-+void SLsmg_fill_region (int r, int c, unsigned int dr, unsigned int dc, wchar_t ch)
-+{
-+   static wchar_t hbuf[16];
-+   int i;
-+#else
- void SLsmg_fill_region (int r, int c, unsigned int dr, unsigned int dc, unsigned char ch)
- {
-    static unsigned char hbuf[16];
-+#endif /* UTF8 */
-    int count;
-    int dcmax, rmax;
-@@ -1357,16 +1522,30 @@
- #if 0
-    ch = Alt_Char_Set[ch];
- #endif
-+#ifdef UTF8
-+   if (ch != hbuf[0])
-+     for (i = 0; i < 16; i++)
-+       hbuf[i] = ch;
-+#else
-    if (ch != hbuf[0]) SLMEMSET ((char *) hbuf, (char) ch, 16);
-+#endif /* UTF8 */
-    for (This_Row = r; This_Row < rmax; This_Row++)
-      {
-       This_Col = c;
-       count = dc / 16;
-+#ifdef UTF8
-+      SLsmg_write_nwchars (hbuf, dc % 16);
-+#else
-       SLsmg_write_nchars ((char *) hbuf, dc % 16);
-+#endif /* UTF8 */
-       while (count-- > 0)
-         {
-+#ifdef UTF8
-+           SLsmg_write_nwchars (hbuf, 16);
-+#else
-            SLsmg_write_nchars ((char *) hbuf, 16);
-+#endif /* UTF8 */
-         }
-      }
-@@ -1381,14 +1560,22 @@
- void SLsmg_write_color_chars (SLsmg_Char_Type *s, unsigned int len)
- {
-    SLsmg_Char_Type *smax, sh;
-+#ifdef UTF8
-+   wchar_t buf[32], *b, *bmax;
-+#else
-    char buf[32], *b, *bmax;
-+#endif /* UTF8 */
-    int color, save_color;
-    if (Smg_Inited == 0) return;
-    smax = s + len;
-    b = buf;
-+#ifdef UTF8
-+   bmax = b + sizeof (buf) / sizeof (SLsmg_Char_Type);
-+#else
-    bmax = b + sizeof (buf);
-+#endif /* UTF8 */
-    save_color = This_Color;
-@@ -1412,16 +1599,28 @@
-         {
-            if (b != buf)
-              {
-+#ifdef UTF8
-+                SLsmg_write_nwchars (buf, (int) (b - buf));
-+#else
-                 SLsmg_write_nchars (buf, (int) (b - buf));
-+#endif /* UTF8 */
-                 b = buf;
-              }
-            This_Color = color;
-         }
-+#ifdef UTF8
-+      *b++ = SLSMG_EXTRACT_CHAR(sh);
-+#else
-       *b++ = (char) SLSMG_EXTRACT_CHAR(sh);
-+#endif /* UTF8 */
-      }
-    if (b != buf)
-+#ifdef UTF8
-+     SLsmg_write_nwchars (buf, (unsigned int) (b - buf));
-+#else
-      SLsmg_write_nchars (buf, (unsigned int) (b - buf));
-+#endif /* UTF8 */
-    This_Color = save_color;
- }
-@@ -1473,7 +1672,11 @@
- SLsmg_set_color_in_region (int color, int r, int c, unsigned int dr, unsigned int dc)
- {
-    int cmax, rmax;
-+#ifdef UTF8
-+   int color_mask;
-+#else
-    SLsmg_Char_Type char_mask;
-+#endif /* UTF8 */
-    if (Smg_Inited == 0) return;
-@@ -1498,14 +1701,22 @@
-         color = ((color & 0x7F) + Bce_Color_Offset) & 0x7F;
-      }
- #endif
-+#ifdef UTF8
-+   color_mask = 0;
-+#else
-    color = color << 8;
-    char_mask = 0xFF;
-+#endif /* UTF8 */
- #ifndef IBMPC_SYSTEM
-    if ((tt_Use_Blink_For_ACS == NULL)
-        || (0 == *tt_Use_Blink_For_ACS))
-+#ifdef UTF8
-+     color_mask = 0x80;
-+#else
-      char_mask = 0x80FF;
-+#endif /* UTF8 */
- #endif
-    while (r < rmax)
-@@ -1519,7 +1730,13 @@
-       while (s < smax)
-         {
-+#ifdef UTF8
-+           *s = SLSMG_BUILD_CHAR(SLSMG_EXTRACT_CHAR(*s),
-+                                 (SLSMG_EXTRACT_COLOR(*s) & color_mask)
-+                                 | color);
-+#else
-            *s = (*s & char_mask) | color;
-+#endif /* UTF8 */
-            s++;
-         }
-       r++;
---- slang-1.4.5/src/Makefile.in.foo    2002-06-12 19:30:09.000000000 -0400
-+++ slang-1.4.5/src/Makefile.in        2002-06-12 19:31:13.000000000 -0400
-@@ -67,7 +67,7 @@
- #---------------------------------------------------------------------------
- # There should be no need to change anything below here.
- #---------------------------------------------------------------------------
--THIS_LIB              = slang#
-+THIS_LIB              = slang-utf8#
- OTHERSTUFF            = 
- THIS_LIB_DEFINES      = -DSLANG
- ELF_MAJOR_VERSION     = @slang_major_version@#
---- slang-1.4.9/src/sldisply.c.orig    2003-10-27 17:24:15.000000000 -0500
-+++ slang-1.4.9/src/sldisply.c 2003-10-27 17:56:25.000000000 -0500
-@@ -9,6 +9,7 @@
- #include <time.h>
- #include <ctype.h>
-+#include <limits.h>
- #if !defined(VMS) || (__VMS_VER >= 70000000)
- # include <sys/time.h>
-@@ -1426,14 +1427,25 @@
- /* Highest bit represents the character set. */
- #define COLOR_MASK 0x7F00
-+#ifdef UTF8
-+# define COLOR_OF(x) (SLSMG_EXTRACT_COLOR(x) & 0x7F)
-+#else
- #define COLOR_OF(x) (((x)&COLOR_MASK)>>8)
-+#endif
- #define CHAR_OF(x) ((x)&0x80FF)
- #if SLTT_HAS_NON_BCE_SUPPORT
-+#ifdef UTF8
-+static int bce_color_eqs (SLsmg_Char_Type a, SLsmg_Char_Type b)
-+{
-+   a = SLSMG_EXTRACT_COLOR(a) & 0x7F;
-+   b = SLSMG_EXTRACT_COLOR(b) & 0x7F;
-+#else
- static int bce_color_eqs (unsigned int a, unsigned int b)
- {
-    a = COLOR_OF(a);
-    b = COLOR_OF(b);
-+#endif
-    
-    if (a == b)
-      return 1;
-@@ -1459,8 +1471,14 @@
-     :  (Ansi_Color_Map[COLOR_OF(a)].mono == Ansi_Color_Map[COLOR_OF(b)].mono))
- #endif
-+#ifdef UTF8
-+#define CHAR_EQS(a, b) ((a) == (b)\
-+                      || (SLSMG_EXTRACT_CHAR(a) == SLSMG_EXTRACT_CHAR(b)\
-+                          && COLOR_EQS((a), (b))))
-+#else
- #define CHAR_EQS(a, b) (((a) == (b))\
-                       || ((CHAR_OF(a)==CHAR_OF(b)) && COLOR_EQS(a,b)))
-+#endif
- /* The whole point of this routine is to prevent writing to the last column
-  * and last row on terminals with automatic margins.
-@@ -1488,9 +1506,58 @@
-    tt_write (str, len);
- }
-+#ifdef UTF8
-+/* FIXME: This duplicates the function above
-+ */
-+static void write_wstring_with_care (SLsmg_Char_Type *str, unsigned int len)
-+{
-+   mbstate_t mbstate;
-+
-+   if (str == NULL) return;
-+
-+   if (Automatic_Margins && (Cursor_r + 1 == SLtt_Screen_Rows))
-+     {
-+      if (len + (unsigned int) Cursor_c >= (unsigned int) SLtt_Screen_Cols)
-+        {
-+           /* For now, just do not write there.  Later, something more
-+            * sophisticated will be implemented.
-+            */
-+           if (SLtt_Screen_Cols > Cursor_c)
-+             {
-+                len = SLtt_Screen_Cols - Cursor_c - 1;
-+                while (len > 0 && str[len] == SLSMG_NOCHAR)
-+                  --len;
-+             }
-+           else len = 0;
-+        }
-+     }
-+
-+   memset (&mbstate, 0, sizeof (mbstate));
-+   while (len--)
-+     {
-+        SLsmg_Char_Type c = *str++;
-+      char buf[MB_LEN_MAX];
-+      size_t n;
-+
-+      if (c == SLSMG_NOCHAR)
-+        continue;
-+
-+      n = wcrtomb (buf, c, &mbstate);
-+      if (n == (size_t)(-1))
-+        break;
-+
-+      tt_write(buf, n);
-+     }
-+}
-+#endif /* UTF8 */
-+
- static void send_attr_str (SLsmg_Char_Type *s)
- {
-+#ifdef UTF8
-+   SLsmg_Char_Type out[SLTT_MAX_SCREEN_COLS], ch, *p;
-+#else
-    unsigned char out[SLTT_MAX_SCREEN_COLS], ch, *p;
-+#endif /* UTF8 */
-    register SLtt_Char_Type attr;
-    register SLsmg_Char_Type sh;
-    int color, last_color = -1;
-@@ -1498,8 +1565,13 @@
-    p = out;
-    while (0 != (sh = *s++))
-      {
-+#ifdef UTF8
-+      ch = SLSMG_EXTRACT_CHAR(sh);
-+      color = SLSMG_EXTRACT_COLOR(sh);
-+#else
-       ch = sh & 0xFF;
-       color = ((int) sh & 0xFF00) >> 8;
-+#endif
- #if SLTT_HAS_NON_BCE_SUPPORT
-       if (Bce_Color_Offset
-@@ -1511,8 +1583,12 @@
-         {
-            if (SLtt_Use_Ansi_Colors) attr = Ansi_Color_Map[color & 0x7F].fgbg;
-            else attr = Ansi_Color_Map[color & 0x7F].mono;
--
-+ 
-+#ifdef UTF8
-+           if (SLSMG_EXTRACT_COLOR(sh) & 0x80) /* alternate char set */
-+#else
-            if (sh & 0x8000) /* alternate char set */
-+#endif
-              {
-                 if (SLtt_Use_Blink_For_ACS)
-                   {
-@@ -1534,8 +1610,12 @@
-                   {
-                      if (p != out)
-                        {
-+#ifdef UTF8
-+                          write_wstring_with_care (out, p-out);
-+#else
-                           *p = 0;
-                           write_string_with_care ((char *) out);
-+#endif
-                           Cursor_c += (int) (p - out);
-                           p = out;
-                        }
-@@ -1558,8 +1638,12 @@
-         }
-       *p++ = ch;
-      }
-+#ifdef UTF8
-+   if (p != out) write_wstring_with_care (out, p-out);
-+#else
-    *p = 0;
-    if (p != out) write_string_with_care ((char *) out);
-+#endif
-    Cursor_c += (int) (p - out);
- }
-@@ -1686,7 +1770,11 @@
-       while (qq < qmax)
-         {
-+#ifdef UTF8
-+           if (SLSMG_EXTRACT_COLOR(*qq))
-+#else
-            if (*qq & 0xFF00)
-+#endif
-              {
-                 SLtt_normal_video ();
-                 SLtt_del_eol ();
-@@ -1701,7 +1789,11 @@
-    /* Find where the last non-blank character on old/new screen is */
-    space_char = ' ';
-+#ifdef UTF8
-+   if (SLSMG_EXTRACT_CHAR(*(pmax-1)) == ' ')
-+#else
-    if (CHAR_EQS(*(pmax-1), ' '))
-+#endif
-      {
-       /* If we get here, then we can erase to the end of the line to create
-        * the final space.  However, this will only work _if_ erasing will 
-@@ -1752,7 +1844,11 @@
-      {
- #endif
-       /* Try use use erase to bol if possible */
-+#ifdef UTF8
-+      if ((Del_Bol_Str != NULL) && (SLSMG_EXTRACT_CHAR(*neww) == ' '))
-+#else
-       if ((Del_Bol_Str != NULL) && (CHAR_OF(*neww) == ' '))
-+#endif
-         {
-            SLsmg_Char_Type *p1;
-            SLsmg_Char_Type blank;
-@@ -1781,7 +1877,11 @@
-                 q = oldd + ofs;
-                 p = p1;
-                 SLtt_goto_rc (row, ofs - 1);
-+#ifdef UTF8
-+                SLtt_reverse_video (SLSMG_EXTRACT_COLOR (blank));
-+#else
-                 SLtt_reverse_video (COLOR_OF(blank));
-+#endif
-                 tt_write_string (Del_Bol_Str);
-                 tt_write (" ", 1);
-                 Cursor_c += 1;
-@@ -1978,7 +2078,11 @@
-    if (q < qmax) 
-      {
-+#ifdef UTF8
-+      SLtt_reverse_video (SLSMG_EXTRACT_COLOR (space_char));
-+#else
-       SLtt_reverse_video (COLOR_OF(space_char));
-+#endif
-       del_eol ();
-      }
-    
diff --git a/src/patches/slang-utf8-acs.patch b/src/patches/slang-utf8-acs.patch
deleted file mode 100644 (file)
index dc8a851..0000000
+++ /dev/null
@@ -1,417 +0,0 @@
---- slang-1.4.5/src/slang.h.acs        2002-07-09 00:03:57.000000000 -0400
-+++ slang-1.4.5/src/slang.h    2002-07-09 00:11:06.000000000 -0400
-@@ -1255,6 +1255,8 @@
- #ifdef UTF8
- typedef int SLsmg_Char_Type;
-+extern SLtt_Char_Type SLcurses_Acs_Map [128];
-+#define acs_map SLcurses_Acs_Map
- #define SLSMG_EXTRACT_CHAR(x) ((x) & 0xFFFFFF)
- #define SLSMG_EXTRACT_COLOR(x) (((x)>>24)&0xFF)
- #define SLSMG_BUILD_CHAR(ch,color) (((SLsmg_Char_Type)(wchar_t)(ch))|((color)<<24))
-@@ -1396,7 +1398,11 @@
- extern void SLsmg_set_screen_start (int *, int *);
- extern void SLsmg_draw_hline (unsigned int);
- extern void SLsmg_draw_vline (int);
-+#ifdef UTF8
-+extern void SLsmg_draw_object (int, int, SLsmg_Char_Type);
-+#else
- extern void SLsmg_draw_object (int, int, unsigned char);
-+#endif
- extern void SLsmg_draw_box (int, int, unsigned int, unsigned int);
- extern int SLsmg_get_column(void);
- extern int SLsmg_get_row(void);
-@@ -1408,6 +1414,9 @@
- extern int SLsmg_Display_Eight_Bit;
- extern int SLsmg_Tab_Width;
-+extern int SLsmg_Is_Unicode;
-+extern int SLsmg_Setlocale;
-+
- #define SLSMG_NEWLINE_IGNORED 0      /* default */
- #define SLSMG_NEWLINE_MOVES   1      /* moves to next line, column 0 */
- #define SLSMG_NEWLINE_SCROLLS 2      /* moves but scrolls at bottom of screen */
-@@ -1465,31 +1474,79 @@
- #  define SLSMG_BOARD_CHAR    '#'
- #  define SLSMG_BLOCK_CHAR    '#'
- # else
--#  define SLSMG_HLINE_CHAR    'q'
--#  define SLSMG_VLINE_CHAR    'x'
--#  define SLSMG_ULCORN_CHAR   'l'
--#  define SLSMG_URCORN_CHAR   'k'
--#  define SLSMG_LLCORN_CHAR   'm'
--#  define SLSMG_LRCORN_CHAR   'j'
--#  define SLSMG_CKBRD_CHAR    'a'
--#  define SLSMG_RTEE_CHAR     'u'
--#  define SLSMG_LTEE_CHAR     't'
--#  define SLSMG_UTEE_CHAR     'w'
--#  define SLSMG_DTEE_CHAR     'v'
--#  define SLSMG_PLUS_CHAR     'n'
--#  define SLSMG_DIAMOND_CHAR  '`'
--#  define SLSMG_DEGREE_CHAR   'f'
--#  define SLSMG_PLMINUS_CHAR  'g'
--#  define SLSMG_BULLET_CHAR   '~'
--#  define SLSMG_LARROW_CHAR   ','
--#  define SLSMG_RARROW_CHAR   '+'
--#  define SLSMG_DARROW_CHAR   '.'
--#  define SLSMG_UARROW_CHAR   '-'
--#  define SLSMG_BOARD_CHAR    'h'
--#  define SLSMG_BLOCK_CHAR    '0'
-+#  define SLSMG_HLINE_CHAR    (acs_map['q'])
-+#  define SLSMG_VLINE_CHAR    (acs_map['x'])
-+#  define SLSMG_ULCORN_CHAR   (acs_map['l'])
-+#  define SLSMG_URCORN_CHAR   (acs_map['k'])
-+#  define SLSMG_LLCORN_CHAR   (acs_map['m'])
-+#  define SLSMG_LRCORN_CHAR   (acs_map['j'])
-+#  define SLSMG_CKBRD_CHAR    (acs_map['a'])
-+#  define SLSMG_RTEE_CHAR     (acs_map['u'])
-+#  define SLSMG_LTEE_CHAR     (acs_map['t'])
-+#  define SLSMG_UTEE_CHAR     (acs_map['v'])
-+#  define SLSMG_DTEE_CHAR     (acs_map['w'])
-+#  define SLSMG_PLUS_CHAR     (acs_map['n'])
-+#  define SLSMG_DIAMOND_CHAR  (acs_map['`'])
-+#  define SLSMG_DEGREE_CHAR   (acs_map['f'])
-+#  define SLSMG_PLMINUS_CHAR  (acs_map['g'])
-+#  define SLSMG_BULLET_CHAR   (acs_map['~'])
-+#  define SLSMG_LARROW_CHAR   (acs_map[','])
-+#  define SLSMG_RARROW_CHAR   (acs_map['+'])
-+#  define SLSMG_DARROW_CHAR   (acs_map['.'])
-+#  define SLSMG_UARROW_CHAR   (acs_map['-'])
-+#  define SLSMG_BOARD_CHAR    (acs_map['h'])
-+#  define SLSMG_BLOCK_CHAR    (acs_map['0'])
-+#
-+#  define SLSMG_HLINE_CHAR_TERM       'q'
-+#  define SLSMG_VLINE_CHAR_TERM       'x'
-+#  define SLSMG_ULCORN_CHAR_TERM      'l'
-+#  define SLSMG_URCORN_CHAR_TERM      'k'
-+#  define SLSMG_LLCORN_CHAR_TERM      'm'
-+#  define SLSMG_LRCORN_CHAR_TERM      'j'
-+#  define SLSMG_CKBRD_CHAR_TERM       'a'
-+#  define SLSMG_RTEE_CHAR_TERM        'u'
-+#  define SLSMG_LTEE_CHAR_TERM        't'
-+#  define SLSMG_UTEE_CHAR_TERM        'v'
-+#  define SLSMG_DTEE_CHAR_TERM        'w'
-+#  define SLSMG_PLUS_CHAR_TERM        'n'
-+#  define SLSMG_DIAMOND_CHAR_TERM     '`'
-+#  define SLSMG_DEGREE_CHAR_TERM      'f'
-+#  define SLSMG_PLMINUS_CHAR_TERM     'g'
-+#  define SLSMG_BULLET_CHAR_TERM      '~'
-+#  define SLSMG_LARROW_CHAR_TERM      ','
-+#  define SLSMG_RARROW_CHAR_TERM      '+'
-+#  define SLSMG_DARROW_CHAR_TERM      '.'
-+#  define SLSMG_UARROW_CHAR_TERM      '-'
-+#  define SLSMG_BOARD_CHAR_TERM       'h'
-+#  define SLSMG_BLOCK_CHAR_TERM       '0'
- # endif                                      /* AMIGA */
- #endif                                       /* IBMPC_SYSTEM */
-+#ifdef UTF8
-+# define SLSMG_HLINE_CHAR_UNICODE     0x2500
-+# define SLSMG_VLINE_CHAR_UNICODE     0x2502
-+# define SLSMG_ULCORN_CHAR_UNICODE    0x250c
-+# define SLSMG_URCORN_CHAR_UNICODE    0x2510
-+# define SLSMG_LLCORN_CHAR_UNICODE    0x2514
-+# define SLSMG_LRCORN_CHAR_UNICODE    0x2518
-+# define SLSMG_RTEE_CHAR_UNICODE      0x2524
-+# define SLSMG_LTEE_CHAR_UNICODE      0x251c
-+# define SLSMG_UTEE_CHAR_UNICODE      0x2534
-+# define SLSMG_DTEE_CHAR_UNICODE      0x252c
-+# define SLSMG_PLUS_CHAR_UNICODE      0x253c
-+# define SLSMG_CKBRD_CHAR_UNICODE     0x2592
-+# define SLSMG_DIAMOND_CHAR_UNICODE   0x25c6
-+# define SLSMG_DEGREE_CHAR_UNICODE    0x00b0
-+# define SLSMG_PLMINUS_CHAR_UNICODE   0x00b1
-+# define SLSMG_BULLET_CHAR_UNICODE    0x00b7
-+# define SLSMG_LARROW_CHAR_UNICODE    0x2190
-+# define SLSMG_RARROW_CHAR_UNICODE    0x2192
-+# define SLSMG_DARROW_CHAR_UNICODE    0x2193
-+# define SLSMG_UARROW_CHAR_UNICODE    0x2191
-+# define SLSMG_BOARD_CHAR_UNICODE     0x2592
-+# define SLSMG_BLOCK_CHAR_UNICODE     0x25ae
-+#endif
-+
- #ifndef IBMPC_SYSTEM
- # define SLSMG_COLOR_BLACK            0x000000
- # define SLSMG_COLOR_RED              0x000001
---- slang-1.4.5/src/slcurses.c.acs     2002-07-09 00:03:57.000000000 -0400
-+++ slang-1.4.5/src/slcurses.c 2002-07-09 00:09:03.000000000 -0400
-@@ -331,40 +331,63 @@
-    /* SLtt_set_mono (A_BLINK >> 8, NULL, SLTT_BLINK_MASK); */
-    SLtt_set_mono ((A_BOLD|A_UNDERLINE) >> 8, NULL, SLTT_ULINE_MASK|SLTT_BOLD_MASK);
-    SLtt_set_mono ((A_REVERSE|A_UNDERLINE) >> 8, NULL, SLTT_ULINE_MASK|SLTT_REV_MASK);
-+   
-+   SLcurses_init_acs_map();
-+
-+   return SLcurses_Stdscr;
-+}
-+void SLcurses_init_acs_map()
-+{
-    if (SLtt_Has_Alt_Charset)
-      {
--       SLcurses_Acs_Map[SLSMG_ULCORN_CHAR] = SLSMG_ULCORN_CHAR | A_ALTCHARSET;
--       SLcurses_Acs_Map[SLSMG_URCORN_CHAR] = SLSMG_URCORN_CHAR | A_ALTCHARSET;
--       SLcurses_Acs_Map[SLSMG_LLCORN_CHAR] = SLSMG_LLCORN_CHAR | A_ALTCHARSET;
--       SLcurses_Acs_Map[SLSMG_LRCORN_CHAR] = SLSMG_LRCORN_CHAR | A_ALTCHARSET;
--       SLcurses_Acs_Map[SLSMG_UTEE_CHAR] = SLSMG_UTEE_CHAR | A_ALTCHARSET;
--       SLcurses_Acs_Map[SLSMG_DTEE_CHAR] = SLSMG_DTEE_CHAR | A_ALTCHARSET;
--       SLcurses_Acs_Map[SLSMG_LTEE_CHAR] = SLSMG_LTEE_CHAR | A_ALTCHARSET;
--       SLcurses_Acs_Map[SLSMG_RTEE_CHAR] = SLSMG_RTEE_CHAR | A_ALTCHARSET;
--       SLcurses_Acs_Map[SLSMG_VLINE_CHAR] = SLSMG_VLINE_CHAR | A_ALTCHARSET;
--       SLcurses_Acs_Map[SLSMG_HLINE_CHAR] = SLSMG_HLINE_CHAR | A_ALTCHARSET;
--       SLcurses_Acs_Map[SLSMG_PLUS_CHAR] = SLSMG_PLUS_CHAR | A_ALTCHARSET;
--       SLcurses_Acs_Map[SLSMG_CKBRD_CHAR] = SLSMG_CKBRD_CHAR | A_ALTCHARSET;
-+       if (SLsmg_Is_Unicode)
-+         {
-+           SLcurses_Acs_Map['l'] = SLSMG_ULCORN_CHAR_UNICODE;
-+           SLcurses_Acs_Map['k'] = SLSMG_URCORN_CHAR_UNICODE;
-+           SLcurses_Acs_Map['m'] = SLSMG_LLCORN_CHAR_UNICODE;
-+           SLcurses_Acs_Map['j'] = SLSMG_LRCORN_CHAR_UNICODE;
-+           SLcurses_Acs_Map['v'] = SLSMG_UTEE_CHAR_UNICODE;
-+           SLcurses_Acs_Map['w'] = SLSMG_DTEE_CHAR_UNICODE;
-+           SLcurses_Acs_Map['t'] = SLSMG_LTEE_CHAR_UNICODE;
-+           SLcurses_Acs_Map['u'] = SLSMG_RTEE_CHAR_UNICODE;
-+           SLcurses_Acs_Map['x'] = SLSMG_VLINE_CHAR_UNICODE;
-+           SLcurses_Acs_Map['q'] = SLSMG_HLINE_CHAR_UNICODE;
-+           SLcurses_Acs_Map['n'] = SLSMG_PLUS_CHAR_UNICODE;
-+           SLcurses_Acs_Map['a'] = SLSMG_CKBRD_CHAR_UNICODE;
-+         }
-+       else
-+       {
-+           SLcurses_Acs_Map['l'] = SLSMG_ULCORN_CHAR_TERM | A_ALTCHARSET;
-+           SLcurses_Acs_Map['k'] = SLSMG_URCORN_CHAR_TERM | A_ALTCHARSET;
-+           SLcurses_Acs_Map['m'] = SLSMG_LLCORN_CHAR_TERM | A_ALTCHARSET;
-+           SLcurses_Acs_Map['j'] = SLSMG_LRCORN_CHAR_TERM | A_ALTCHARSET;
-+           SLcurses_Acs_Map['v'] = SLSMG_UTEE_CHAR_TERM | A_ALTCHARSET;
-+           SLcurses_Acs_Map['w'] = SLSMG_DTEE_CHAR_TERM | A_ALTCHARSET;
-+           SLcurses_Acs_Map['t'] = SLSMG_LTEE_CHAR_TERM | A_ALTCHARSET;
-+           SLcurses_Acs_Map['u'] = SLSMG_RTEE_CHAR_TERM | A_ALTCHARSET;
-+           SLcurses_Acs_Map['x'] = SLSMG_VLINE_CHAR_TERM | A_ALTCHARSET;
-+           SLcurses_Acs_Map['q'] = SLSMG_HLINE_CHAR_TERM | A_ALTCHARSET;
-+           SLcurses_Acs_Map['n'] = SLSMG_PLUS_CHAR_TERM | A_ALTCHARSET;
-+           SLcurses_Acs_Map['a'] = SLSMG_CKBRD_CHAR_TERM | A_ALTCHARSET;
-+         }
-      }
-    else
-      {
-        /* ugly defaults to use on terminals which don't support graphics */
--       SLcurses_Acs_Map[SLSMG_ULCORN_CHAR] = '+';
--       SLcurses_Acs_Map[SLSMG_URCORN_CHAR] = '+';
--       SLcurses_Acs_Map[SLSMG_LLCORN_CHAR] = '+';
--       SLcurses_Acs_Map[SLSMG_LRCORN_CHAR] = '+';
--       SLcurses_Acs_Map[SLSMG_UTEE_CHAR] = '+';
--       SLcurses_Acs_Map[SLSMG_DTEE_CHAR] = '+';
--       SLcurses_Acs_Map[SLSMG_LTEE_CHAR] = '+';
--       SLcurses_Acs_Map[SLSMG_RTEE_CHAR] = '+';
--       SLcurses_Acs_Map[SLSMG_VLINE_CHAR] = '|';
--       SLcurses_Acs_Map[SLSMG_HLINE_CHAR] = '-';
--       SLcurses_Acs_Map[SLSMG_PLUS_CHAR] = '+';
--       SLcurses_Acs_Map[SLSMG_CKBRD_CHAR] = '#';
-+       SLcurses_Acs_Map['l'] = '+';
-+       SLcurses_Acs_Map['k'] = '+';
-+       SLcurses_Acs_Map['m'] = '+';
-+       SLcurses_Acs_Map['j'] = '+';
-+       SLcurses_Acs_Map['v'] = '+';
-+       SLcurses_Acs_Map['w'] = '+';
-+       SLcurses_Acs_Map['t'] = '+';
-+       SLcurses_Acs_Map['u'] = '+';
-+       SLcurses_Acs_Map['x'] = '|';
-+       SLcurses_Acs_Map['q'] = '-';
-+       SLcurses_Acs_Map['n'] = '+';
-+       SLcurses_Acs_Map['a'] = '#';
-      }
--
--   return SLcurses_Stdscr;
- }
- int SLcurses_wattrset (SLcurses_Window_Type *w, SLtt_Char_Type ch)
---- slang-1.4.5/src/slcurses.h.acs     2002-02-10 02:39:19.000000000 -0500
-+++ slang-1.4.5/src/slcurses.h 2002-07-09 00:03:57.000000000 -0400
-@@ -141,6 +141,7 @@
- extern int SLcurses_nodelay (SLcurses_Window_Type *, int);
- extern SLcurses_Window_Type *SLcurses_initscr (void);
-+extern void SLcurses_init_acs_map (void);
- #define initscr SLcurses_initscr
- extern int SLcurses_cbreak (void);
-@@ -222,21 +222,21 @@
- extern SLtt_Char_Type SLcurses_Acs_Map [128];
- #define acs_map SLcurses_Acs_Map
--#define ACS_ULCORNER (acs_map[SLSMG_ULCORN_CHAR])
--#define ACS_URCORNER (acs_map[SLSMG_URCORN_CHAR])
--#define ACS_LRCORNER (acs_map[SLSMG_LRCORN_CHAR])
--#define ACS_LLCORNER (acs_map[SLSMG_LLCORN_CHAR])
--#define ACS_TTEE (acs_map[SLSMG_UTEE_CHAR])
--#define ACS_LTEE (acs_map[SLSMG_LTEE_CHAR])
--#define ACS_RTEE (acs_map[SLSMG_RTEE_CHAR])
--#define ACS_BTEE (acs_map[SLSMG_DTEE_CHAR])
--#define ACS_PLUS (acs_map[SLSMG_PLUS_CHAR])
--#define ACS_VLINE (acs_map[SLSMG_VLINE_CHAR])
--#define ACS_HLINE (acs_map[SLSMG_HLINE_CHAR])
-+#define ACS_ULCORNER SLSMG_ULCORN_CHAR
-+#define ACS_URCORNER SLSMG_URCORN_CHAR
-+#define ACS_LRCORNER SLSMG_LRCORN_CHAR
-+#define ACS_LLCORNER SLSMG_LLCORN_CHAR
-+#define ACS_TTEE SLSMG_UTEE_CHAR
-+#define ACS_LTEE SLSMG_LTEE_CHAR
-+#define ACS_RTEE SLSMG_RTEE_CHAR
-+#define ACS_BTEE SLSMG_DTEE_CHAR
-+#define ACS_PLUS SLSMG_PLUS_CHAR
-+#define ACS_VLINE SLSMG_VLINE_CHAR
-+#define ACS_HLINE SLSMG_HLINE_CHAR
- #define ACS_S1                '-'
- #define ACS_S9                '-'
- #define ACS_DIAMOND           '&'
--#define ACS_CKBOARD           (acs_map[SLSMG_CKBRD_CHAR])
-+#define ACS_CKBOARD           SLSMG_CKBRD_CHAR
- #define ACS_DEGREE            'o'
- #define ACS_PLMINUS           '+'
- #define ACS_BULLET            '*'
---- slang-1.4.5/src/slsmg.c.acs        2002-07-09 00:03:57.000000000 -0400
-+++ slang-1.4.5/src/slsmg.c    2002-07-09 00:03:57.000000000 -0400
-@@ -10,6 +10,9 @@
- #include "slang.h"
- #include "_slang.h"
-+#include "slcurses.h"
-+
-+#include <locale.h>
- typedef struct Screen_Type
-   {
-@@ -44,9 +47,9 @@
-                                       */
- #ifndef IBMPC_SYSTEM
--#define ALT_CHAR_FLAG 0x80
-+static int ALT_CHAR_FLAG=0x80;
- #else
--#define ALT_CHAR_FLAG 0x00
-+static int ALT_CHAR_FLAG=0x00;
- #endif
- #if SLTT_HAS_NON_BCE_SUPPORT && !defined(IBMPC_SYSTEM)
-@@ -54,6 +57,8 @@
- static int Bce_Color_Offset;
- #endif
-+int SLsmg_Is_Unicode = 0;
-+int SLsmg_Setlocale = 1;
- int SLsmg_Newline_Behavior = 0;
- int SLsmg_Backspace_Moves = 0;
- /* Backward compatibility. Not used. */
-@@ -184,6 +189,8 @@
-      return;/* alt chars not used and the alt bit
-            * is used to indicate a blink.
-            */
-+   if (SLsmg_Is_Unicode)
-+       ALT_CHAR_FLAG=0x00;
-    if (i) This_Alt_Char = ALT_CHAR_FLAG;
-    else This_Alt_Char = 0;
-@@ -348,6 +355,8 @@
- #ifndef IBMPC_SYSTEM
-    int alt_char_set_flag;
-+   if (SLsmg_Is_Unicode)
-+     ALT_CHAR_FLAG = 0x00;
-    alt_char_set_flag = ((This_Color & ALT_CHAR_FLAG)
-                       && ((tt_Use_Blink_For_ACS == NULL)
-                           || (*tt_Use_Blink_For_ACS == 0)));
-@@ -1221,6 +1230,20 @@
-    Smg_Inited = 0;
- }
-+static void SLsmg_check_unicode(void)
-+{
-+    char *s,*t;
-+    
-+    if (SLsmg_Setlocale)
-+              s = setlocale(LC_ALL, "");
-+    else
-+              s = setlocale(LC_ALL, NULL);
-+    if (s && (strstr(s,"UTF-8") || strstr(s,"utf8"))) {
-+          SLsmg_Is_Unicode = 1;
-+          return;
-+    }
-+    SLsmg_Is_Unicode = 0;
-+}
- static int init_smg (void)
- {
-@@ -1242,6 +1265,8 @@
-    This_Col = This_Row = Start_Col = Start_Row = 0;
-    This_Alt_Char = 0;
-+   SLsmg_check_unicode ();
-+   SLcurses_init_acs_map ();
-    SLsmg_set_color (0);
-    Cls_Flag = 1;
- #ifndef IBMPC_SYSTEM
-@@ -1386,7 +1411,11 @@
-      }
- }
-+#ifdef UTF8
-+void SLsmg_draw_object (int r, int c, SLsmg_Char_Type object)
-+#else
- void SLsmg_draw_object (int r, int c, unsigned char object)
-+#endif
- {
-    This_Row = r;  This_Col = c;
-@@ -1405,7 +1434,7 @@
- void SLsmg_draw_hline (unsigned int n)
- {
--   static unsigned char hbuf[16];
-+   SLsmg_Char_Type ch = SLSMG_HLINE_CHAR;
-    int count;
-    int cmin, cmax;
-    int final_col = This_Col + (int) n;
-@@ -1421,11 +1450,6 @@
-       return;
-      }
--   if (hbuf[0] == 0)
--     {
--      SLMEMSET ((char *) hbuf, SLSMG_HLINE_CHAR, 16);
--     }
--
-    n = (unsigned int)(cmax - cmin);
-    count = n / 16;
-@@ -1433,10 +1457,10 @@
-    This_Color |= ALT_CHAR_FLAG;
-    This_Col = cmin;
--   SLsmg_write_nchars ((char *) hbuf, n % 16);
--   while (count-- > 0)
-+   SLsmg_draw_object(This_Row, This_Col, ch);
-+   while (n-- > 0)
-      {
--      SLsmg_write_nchars ((char *) hbuf, 16);
-+      SLsmg_draw_object(This_Row, This_Col, ch);
-      }
-    This_Color = save_color;
-@@ -1445,7 +1469,7 @@
- void SLsmg_draw_vline (int n)
- {
--   unsigned char ch = SLSMG_VLINE_CHAR;
-+   SLsmg_Char_Type ch = SLSMG_VLINE_CHAR;
-    int c = This_Col, rmin, rmax;
-    int final_row = This_Row + n;
-    int save_color;
-@@ -1466,7 +1490,7 @@
-    for (This_Row = rmin; This_Row < rmax; This_Row++)
-      {
-       This_Col = c;
--      SLsmg_write_nchars ((char *) &ch, 1);
-+      SLsmg_draw_object (This_Row, This_Col, ch);
-      }
-    This_Col = c;  This_Row = final_row;
diff --git a/src/patches/slang-utf8-fix.patch b/src/patches/slang-utf8-fix.patch
deleted file mode 100644 (file)
index 6c0a80f..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
---- slang-1.4.5/src/slsmg.c.jj 2003-02-21 12:11:37.000000000 -0500
-+++ slang-1.4.5/src/slsmg.c    2003-02-21 14:09:28.000000000 -0500
-@@ -378,8 +378,10 @@ void SLsmg_write_nwchars (wchar_t *str, 
-   for (i = 0; i < n; i++, str) {
-     ch = *str++;
- #ifndef IBMPC_SYSTEM
--    if (alt_char_set_flag)
-+    if (alt_char_set_flag) {
-       ch = Alt_Char_Set[ch & 0x7F];
-+      w = 1;
-+    } else
- #endif
-     w = wcwidth(ch);
---- slang-1.4.5/src/sldisply.c.jj      2003-02-21 12:11:37.000000000 -0500
-+++ slang-1.4.5/src/sldisply.c 2003-02-21 15:51:43.000000000 -0500
-@@ -1498,6 +1498,17 @@ static void write_wstring_with_care (SLs
-         }
-      }
-+   if (Current_Fgbg & SLTT_ALTC_MASK)
-+     {
-+      char c;
-+      while (len--)
-+        {
-+           c = *str++;
-+           tt_write(&c, 1);
-+        }
-+      return;
-+     }
-+
-    memset (&mbstate, 0, sizeof (mbstate));
-    while (len--)
-      {
similarity index 96%
rename from src/install+setup/setup/Makefile
rename to src/setup/Makefile
index 924da77dbe1cb7a13af3310b5ef8974e1816f92b..fe42e915d90621aee452d4b5a2dfeecc63ffb07b 100644 (file)
@@ -24,7 +24,7 @@ INCLUDE =
 
 LD      = gcc
 LDFLAGS = 
-LIBS    = -lnewt -lslang
+LIBS    = -lnewt -lslang -lsmooth
 
 COMPILE = $(CC) -c $(INCLUDE) $(CFLAGS)
 
@@ -40,7 +40,7 @@ clean :
 ######
 
 OBJS=main.o hostname.o domainname.o passwords.o networking.o misc.o \
-       dhcp.o keymap.o timezone.o ../libsmooth/libsmooth.o
+       dhcp.o keymap.o timezone.o netstuff.o
 
 setup: $(OBJS)
        $(LINK) $(OBJS) -o $@ $(LIBS)
diff --git a/src/setup/Makefile.am b/src/setup/Makefile.am
new file mode 100644 (file)
index 0000000..0ead631
--- /dev/null
@@ -0,0 +1,58 @@
+#  This file is part of the setup tool.
+#
+#  setup 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.
+
+ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
+AM_MAKEFLAGS = --no-print-directory
+AUTOMAKE_OPTIONS = color-tests parallel-tests
+
+SUBDIRS = . po
+
+# remove targets if the command fails
+.DELETE_ON_ERROR:
+
+# keep intermediate files
+.SECONDARY:
+
+AM_CPPFLAGS = \
+       -include $(top_builddir)/config.h \
+       $(OUR_CPPFLAGS)
+
+AM_CFLAGS = $(OUR_CFLAGS)
+AM_CXXFLAGS = $(OUR_CXXFLAGS)
+AM_LDFLAGS = $(OUR_LDFLAGS)
+
+bin_SCRIPTS =
+sbin_PROGRAMS =
+
+#- setup -----------------------------------------------------------------------
+
+sbin_PROGRAMS += \
+       setup
+
+setup_SOURCES = \
+       dhcp.c \
+       domainname.c \
+       hostname.c \
+       keymap.c \
+       main.c \
+       misc.c \
+       netstuff.c \
+       networking.c \
+       passwords.c \
+       setup.h \
+       timezone.c
+
+setup_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(LIBSMOOTH_CFLAGS)
+
+setup_LDADD = \
+       $(LIBSMOOTH_LIBS) \
+       $(NEWT_LIBS)
+
+bin_SCRIPTS += \
+       probenic.sh
diff --git a/src/setup/autogen.sh b/src/setup/autogen.sh
new file mode 100755 (executable)
index 0000000..3065488
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+autoreconf --force --install -I m4
diff --git a/src/setup/configure.ac b/src/setup/configure.ac
new file mode 100644 (file)
index 0000000..6f7c31b
--- /dev/null
@@ -0,0 +1,92 @@
+#  This file is part of the setup tool.
+#
+#  setup 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.
+
+AC_PREREQ([2.64])
+
+AC_INIT([setup],
+       [001],
+       [],
+       [setup],
+       [http://git.ipfire.org/?p=ipfire-2.x.git;a=summary])
+
+AC_CONFIG_MACRO_DIR([m4])
+AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_AUX_DIR([build-aux])
+
+AM_INIT_AUTOMAKE([
+       foreign
+       1.11
+       -Wall
+       -Wno-portability
+       silent-rules
+       tar-pax
+       no-dist-gzip
+       dist-xz
+       subdir-objects
+])
+AM_SILENT_RULES([yes])
+
+LT_PREREQ(2.2)
+LT_INIT([disable-static])
+
+AC_PROG_CC
+AC_PROG_CC_C99
+AC_PROG_CC_C_O
+
+AC_PATH_PROG([M4], [m4])
+
+# Gettext
+AM_GNU_GETTEXT([external])
+AM_GNU_GETTEXT_VERSION([0.18])
+AC_CHECK_HEADERS([libintl.h])
+
+# This makes sure pkg.m4 is available.
+m4_pattern_forbid([^_?PKG_[A-Z_]+$],[*** pkg.m4 missing, please install pkg-config])
+
+# newt
+LIBS=
+AC_SEARCH_LIBS([newtWinMenu], [newt], [], [AC_MSG_ERROR([*** newt library not found])])
+NEWT_LIBS="$LIBS"
+AC_SUBST(NEWT_LIBS)
+
+LIBS="$save_LIBS"
+
+PKG_CHECK_MODULES(LIBSMOOTH, [libsmooth])
+
+AC_ARG_WITH([distro-name],
+       AS_HELP_STRING([--with-distro-name] [The name of the distribution]),
+       AC_DEFINE_UNQUOTED([NAME], "$withval", [The name of the distribution]),
+       AC_MSG_ERROR([*** you need to set the name with --with-distro-name=]))
+
+AC_ARG_WITH([distro-sname],
+       AS_HELP_STRING([--with-distro-sname] [The short name of the distribution]),
+       AC_DEFINE_UNQUOTED([SNAME], "$withval", [The sname of the distribution]),
+       AC_MSG_ERROR([*** you need to set the sname with --with-distro-sname=]))
+
+AC_ARG_WITH([distro-slogan],
+       AS_HELP_STRING([--with-distro-slogan] [The slogan of the distribution]),
+       AC_DEFINE_UNQUOTED([SLOGAN], "$withval", [The slogan of the distribution]),
+       AC_MSG_ERROR([*** you need to set the slogan with --with-distro-slogan=]))
+
+AC_ARG_WITH([config-root],
+       AS_HELP_STRING([--with-distro-config-root] [The configuration directory]),
+       AC_DEFINE_UNQUOTED([CONFIG_ROOT], "$withval", [The config-root]),
+       AC_MSG_ERROR([*** you need to set CONFIG_ROOT with --with-config-root=]))
+
+AC_CONFIG_FILES([
+       Makefile
+       po/Makefile.in
+])
+
+AC_OUTPUT
+AC_MSG_RESULT([
+       $PACKAGE_NAME $VERSION
+
+       CFLAGS:                 ${OUR_CFLAGS} ${CFLAGS}
+       CPPFLAGS:               ${OUR_CPPFLAGS} ${CPPFLAGS}
+       LDFLAGS:                ${OUR_LDFLAGS} ${LDFLAGS}
+])
similarity index 78%
rename from src/install+setup/setup/dhcp.c
rename to src/setup/dhcp.c
index 332a807e7db2abc0ef760f73958f9aa7702d801c..22f471851f9aae336c22d036b293c230e80abcc5 100644 (file)
@@ -7,7 +7,11 @@
  * Stuff for setting up the DHCP server from the setup prog.
  * 
  */
+
+// Translation
+#include <libintl.h>
+#define _(x) dgettext("setup", x)
+
 #include "setup.h"
 
 #define TOP 4
@@ -24,8 +28,6 @@
 extern FILE *flog;
 extern char *mylog;
 
-extern char **ctr;
-
 extern int automode;
 
 newtComponent dhcpform;
@@ -44,13 +46,24 @@ int handledhcp(void)
        newtComponent labels[MAX_BOXES];
        newtComponent ok, cancel;       
        char message[1000];
-       char *labeltexts[MAX_BOXES] = { ctr[TR_START_ADDRESS], ctr[TR_END_ADDRESS],
-               ctr[TR_PRIMARY_DNS], ctr[TR_SECONDARY_DNS], ctr[TR_DEFAULT_LEASE],
-               ctr[TR_MAX_LEASE], ctr[TR_DOMAIN_NAME_SUFFIX] };
-       char *varnames[MAX_BOXES] = { "START_ADDR_GREEN", "END_ADDR_GREEN", 
-               "DNS1_GREEN", "DNS2_GREEN",
-               "DEFAULT_LEASE_TIME_GREEN", "MAX_LEASE_TIME_GREEN", 
-               "DOMAIN_NAME_GREEN"};
+       char *labeltexts[MAX_BOXES] = {
+               _("Start address:"),
+               _("End address:"),
+               _("Primary DNS:"),
+               _("Secondary DNS:"),
+               _("Default lease (mins):"),
+               _("Max lease (mins):"),
+               _("Domain name suffix:")
+       };
+       char *varnames[MAX_BOXES] = {
+               "START_ADDR_GREEN",
+               "END_ADDR_GREEN",
+               "DNS1_GREEN",
+               "DNS2_GREEN",
+               "DEFAULT_LEASE_TIME_GREEN",
+               "MAX_LEASE_TIME_GREEN",
+               "DOMAIN_NAME_GREEN"
+       };
        char defaults[MAX_BOXES][STRING_SIZE]; 
        int result;
        int c;
@@ -70,14 +83,14 @@ int handledhcp(void)
        {
                freekeyvalues(dhcpkv);
                freekeyvalues(ethernetkv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
        if (!(readkeyvalues(ethernetkv, CONFIG_ROOT "/ethernet/settings")))
        {
                freekeyvalues(dhcpkv);
                freekeyvalues(ethernetkv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
        if (!(readkeyvalues(mainkv, CONFIG_ROOT "/main/settings")))
@@ -85,7 +98,7 @@ int handledhcp(void)
                freekeyvalues(dhcpkv);
                freekeyvalues(ethernetkv);
                freekeyvalues(mainkv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
 
@@ -95,13 +108,13 @@ int handledhcp(void)
        strcpy(defaults[DEFAULT_LEASE_TIME], "60");
        strcpy(defaults[MAX_LEASE_TIME], "120");
 
-       sprintf(message, ctr[TR_DHCP_SERVER_CONFIGURATION]);
-       newtCenteredWindow(55, 18, message);
+       newtCenteredWindow(55, 18, _("DHCP server configuration"));
 
        dhcpform = newtForm(NULL, NULL, 0);
-       
-       sprintf(message, ctr[TR_CONFIGURE_DHCP]);
-       header = newtTextboxReflowed(1, 1, message, 52, 0, 0, 0);
+
+       header = newtTextboxReflowed(1, 1,
+               _("Configure the DHCP server by entering the settings information."),
+               52, 0, 0, 0);
        newtFormAddComponent(dhcpform, header);
 
        strcpy(temp, ""); findkey(dhcpkv, "ENABLE_GREEN", temp);
@@ -109,7 +122,7 @@ int handledhcp(void)
                startenabled = '*';
        else
                startenabled = ' ';
-       enabledcheckbox = newtCheckbox(2, TOP + 0, ctr[TR_ENABLED], startenabled, " *", &enabledresult);
+       enabledcheckbox = newtCheckbox(2, TOP + 0, _("Enabled"), startenabled, " *", &enabledresult);
        newtFormAddComponent(dhcpform, enabledcheckbox);
        newtComponentAddCallback(enabledcheckbox, dhcpdialogcallbackdhcp, NULL);                
 
@@ -126,13 +139,12 @@ int handledhcp(void)
                
        }
        
-       ok = newtButton(10, c + 7, ctr[TR_OK]);
-       cancel = newtButton(34, c + 7, ctr[TR_CANCEL]);
+       ok = newtButton(10, c + 7, _("OK"));
+       cancel = newtButton(34, c + 7, _("Cancel"));
 
        newtFormAddComponents(dhcpform, ok, cancel, NULL);
        
-       do
-       {
+       do {
                error = 0;
                newtFormRun(dhcpform, &es);
        
@@ -141,22 +153,25 @@ int handledhcp(void)
                        /* OK was pressed; verify the contents of each entry. */                
                        if (enabledresult == '*')
                        {
-                               strcpy(message, ctr[TR_INVALID_FIELDS]);                        
+                               strcpy(message, _("The following fields are invalid:\n\n"));
                                if (inet_addr(results[START_ADDRESS]) == INADDR_NONE)
                                {
-                                       strcat(message, ctr[TR_START_ADDRESS_CR]);
+                                       strcat(message, _("Start address"));
+                                       strcat(message, "\n");
                                        error = 1;
                                }
                                if (inet_addr(results[END_ADDRESS]) == INADDR_NONE)
                                {
-                                       strcat(message, ctr[TR_END_ADDRESS_CR]);
+                                       strcat(message, _("End address"));
+                                       strcat(message, "\n");
                                        error = 1;
                                }
                                if (strlen(results[SECONDARY_DNS]))
                                {
                                        if (inet_addr(results[PRIMARY_DNS]) == INADDR_NONE)
                                        {
-                                               strcat(message, ctr[TR_PRIMARY_DNS_CR]);
+                                               strcat(message, _("Primary DNS"));
+                                               strcat(message, "\n");
                                                error = 1;
                                        }
                                }
@@ -164,18 +179,21 @@ int handledhcp(void)
                                {
                                        if (inet_addr(results[SECONDARY_DNS]) == INADDR_NONE)
                                        {
-                                               strcat(message, ctr[TR_SECONDARY_DNS_CR]);
+                                               strcat(message, _("Secondary DNS"));
+                                               strcat(message, "\n");
                                                error = 1;
                                        }
                                }
                                if (!(atol(results[DEFAULT_LEASE_TIME])))
                                {
-                                       strcat(message, ctr[TR_DEFAULT_LEASE_CR]);
+                                       strcat(message, _("Default lease time"));
+                                       strcat(message, "\n");
                                        error = 1;
                                }
                                if (!(atol(results[MAX_LEASE_TIME])))
                                {
-                                       strcat(message, ctr[TR_MAX_LEASE_CR]);
+                                       strcat(message, _("Max. lease time"));
+                                       strcat(message, "\n");
                                        error = 1;
                                }
                        }                               
@@ -191,13 +209,13 @@ int handledhcp(void)
                                        replacekeyvalue(dhcpkv, "ENABLE_GREEN", "on");
                                        fclose(fopen(CONFIG_ROOT "/dhcp/enable_green", "w"));
                                        chown(CONFIG_ROOT "/dhcp/enable_green", 99, 99);
-                                       mysystem("/usr/local/bin/dhcpctrl enable");
+                                       mysystem(NULL, "/usr/local/bin/dhcpctrl enable");
                                }
                                else
                                {
                                        replacekeyvalue(dhcpkv, "ENABLE_GREEN", "off");
                                        unlink(CONFIG_ROOT "/dhcp/enable_green");
-                                       mysystem("/usr/local/bin/dhcpctrl disable");
+                                       mysystem(NULL, "/usr/local/bin/dhcpctrl disable");
                                }
                                replacekeyvalue(dhcpkv, "VALID", "yes");
                                writekeyvalues(dhcpkv, CONFIG_ROOT "/dhcp/settings");
@@ -230,14 +248,13 @@ int handledhcp(void)
                                fclose(file);
                                chown(CONFIG_ROOT "/dhcp/dhcpd.conf", 99, 99);
                                if (automode == 0)
-                                       mysystem("/usr/local/bin/dhcpctrl enable");
+                                       mysystem(NULL, "/usr/local/bin/dhcpctrl enable");
                        }
                        result = 1;
                }
                else
                        result = 0;
-       }               
-       while (error);
+       } while (error);
        
        newtFormDestroy(dhcpform);
        newtPopWindow();
similarity index 73%
rename from src/install+setup/setup/domainname.c
rename to src/setup/domainname.c
index 9aedd9b49d064256872515688f59590159df47e0..38269d2a34188dd84007b35d5ebbb29b2e133f93 100644 (file)
@@ -6,14 +6,16 @@
  * $Id: domainname.c
  * 
  */
+
+// Translation
+#include <libintl.h>
+#define _(x) dgettext("setup", x)
+
 #include "setup.h"
  
 extern FILE *flog;
 extern char *mylog;
 
-extern char **ctr;
-
 extern int automode;
 
 int handledomainname(void)
@@ -29,7 +31,7 @@ int handledomainname(void)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }       
        
@@ -37,19 +39,18 @@ int handledomainname(void)
        
        for (;;)
        {       
-               rc = newtWinEntries(ctr[TR_DOMAINNAME], ctr[TR_ENTER_DOMAINNAME],
-                       50, 5, 5, 40, entries, ctr[TR_OK], ctr[TR_CANCEL], NULL);       
+               rc = newtWinEntries(_("Domain name"), _("Enter Domain name"),
+                       50, 5, 5, 40, entries, _("OK"), _("Cancel"), NULL);     
                
-               if (rc == 1)
-               {
+               if (rc == 1) {
                        strcpy(domainname, values[0]);
                        if (!(strlen(domainname)))
-                               errorbox(ctr[TR_DOMAINNAME_CANNOT_BE_EMPTY]);
+                               errorbox(_("Domain name cannot be empty."));
                        else if (strchr(domainname, ' '))
-                               errorbox(ctr[TR_DOMAINNAME_CANNOT_CONTAIN_SPACES]);
+                               errorbox(_("Domain name cannot contain spaces."));
                        else if (strlen(domainname) != strspn(domainname,
                                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-."))
-                               errorbox(ctr[TR_DOMAINNAME_NOT_VALID_CHARS]);
+                               errorbox(_("Domain name may only contain letters, numbers, hyphens and periods."));
                        else
                        {
                                replacekeyvalue(kv, "DOMAINNAME", domainname);
similarity index 76%
rename from src/install+setup/setup/hostname.c
rename to src/setup/hostname.c
index 0165257367635c49143533771b82716d701b3264..7d7edc56b5f9ef3835b5195a3c558f2527d741ce 100644 (file)
@@ -9,14 +9,16 @@
  * $Id: hostname.c,v 1.6.2.1 2004/04/14 22:05:41 gespinasse Exp $
  * 
  */
+
+// Translation
+#include <libintl.h>
+#define _(x) dgettext("setup", x)
+
 #include "setup.h"
  
 extern FILE *flog;
 extern char *mylog;
 
-extern char **ctr;
-
 extern int automode;
 
 int handlehostname(void)
@@ -32,7 +34,7 @@ int handlehostname(void)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }       
        
@@ -41,19 +43,19 @@ int handlehostname(void)
        
        for (;;)
        {
-               rc = newtWinEntries(ctr[TR_HOSTNAME], ctr[TR_ENTER_HOSTNAME],
-                       50, 5, 5, 40, entries, ctr[TR_OK], ctr[TR_CANCEL], NULL);
+               rc = newtWinEntries(_("Hostname"), _("Enter the machine's hostname."),
+                       50, 5, 5, 40, entries, _("OK"), _("Cancel"), NULL);
                
                if (rc == 1)
                {
                        strcpy(hostname, values[0]);
                        if (!(strlen(hostname)))
-                               errorbox(ctr[TR_HOSTNAME_CANNOT_BE_EMPTY]);
+                               errorbox(_("Hostname cannot be empty."));
                        else if (strchr(hostname, ' '))
-                               errorbox(ctr[TR_HOSTNAME_CANNOT_CONTAIN_SPACES]);
+                               errorbox(_("Hostname cannot contain spaces."));
                        else if (strlen(hostname) != strspn(hostname,
                                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-"))
-                               errorbox(ctr[TR_HOSTNAME_NOT_VALID_CHARS]);
+                               errorbox(_("Hostname may only contain letters, numbers and hyphens."));
                        else
                        {
                                replacekeyvalue(kv, "HOSTNAME", hostname);
similarity index 90%
rename from src/install+setup/setup/keymap.c
rename to src/setup/keymap.c
index b143492a1345df4a07d3968c79cf6b972765581c..d0030a3bc0d66c9a7ca549015090b429492b5ec1 100644 (file)
@@ -9,14 +9,16 @@
  * $Id: keymap.c,v 1.9.2.1 2004/04/14 22:05:41 gespinasse Exp $
  * 
  */
-   
+
+// Translation
+#include <libintl.h>
+#define _(x) dgettext("setup", x)
+
 #include "setup.h"
  
 extern FILE *flog;
 extern char *mylog;
 
-extern char **ctr;
-
 extern int automode;
 
 #define MAX_FILENAMES 5000
@@ -65,7 +67,7 @@ int handlekeymap(void)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }       
        
@@ -79,8 +81,9 @@ int handlekeymap(void)
                        choice = c;
        }
        
-       rc = newtWinMenu(ctr[TR_KEYBOARD_MAPPING], ctr[TR_KEYBOARD_MAPPING_LONG], 50, 5, 5, 6, displaynames, &choice,
-               ctr[TR_OK], ctr[TR_CANCEL], NULL);
+       rc = newtWinMenu(_("Keyboard mapping"),
+               _("Choose the type of keyboard you are using from the list below."),
+               50, 5, 5, 6, displaynames, &choice, _("OK"), _("Cancel"), NULL);
 
        strcpy(keymap, filenames[choice]);
        
@@ -89,7 +92,7 @@ int handlekeymap(void)
                replacekeyvalue(kv, "KEYMAP", keymap);
                writekeyvalues(kv, CONFIG_ROOT "/main/settings");
                sprintf(commandstring, "/bin/loadkeys %s", keymap);
-               mysystem(commandstring);
+               mysystem(NULL, commandstring);
                result = 1;
        }
        else
diff --git a/src/setup/m4/attributes.m4 b/src/setup/m4/attributes.m4
new file mode 100644 (file)
index 0000000..7e080da
--- /dev/null
@@ -0,0 +1,288 @@
+dnl Macros to check the presence of generic (non-typed) symbols.
+dnl Copyright (c) 2006-2008 Diego Pettenò <flameeyes@gmail.com>
+dnl Copyright (c) 2006-2008 xine project
+dnl Copyright (c) 2012 Lucas De Marchi <lucas.de.marchi@gmail.com>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2, or (at your option)
+dnl any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+dnl 02110-1301, USA.
+dnl
+dnl As a special exception, the copyright owners of the
+dnl macro gives unlimited permission to copy, distribute and modify the
+dnl configure scripts that are the output of Autoconf when processing the
+dnl Macro. You need not follow the terms of the GNU General Public
+dnl License when using or distributing such scripts, even though portions
+dnl of the text of the Macro appear in them. The GNU General Public
+dnl License (GPL) does govern all other use of the material that
+dnl constitutes the Autoconf Macro.
+dnl
+dnl This special exception to the GPL applies to versions of the
+dnl Autoconf Macro released by this project. When you make and
+dnl distribute a modified version of the Autoconf Macro, you may extend
+dnl this special exception to the GPL to apply to your modified version as
+dnl well.
+
+dnl Check if FLAG in ENV-VAR is supported by compiler and append it
+dnl to WHERE-TO-APPEND variable
+dnl CC_CHECK_FLAG_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG])
+
+AC_DEFUN([CC_CHECK_FLAG_APPEND], [
+  AC_CACHE_CHECK([if $CC supports flag $3 in envvar $2],
+                 AS_TR_SH([cc_cv_$2_$3]),
+          [eval "AS_TR_SH([cc_save_$2])='${$2}'"
+           eval "AS_TR_SH([$2])='-Werror $3'"
+           AC_COMPILE_IFELSE([AC_LANG_SOURCE([int a = 0; int main(void) { return a; } ])],
+                                    [eval "AS_TR_SH([cc_cv_$2_$3])='yes'"],
+                                    [eval "AS_TR_SH([cc_cv_$2_$3])='no'"])
+           eval "AS_TR_SH([$2])='$cc_save_$2'"])
+
+  AS_IF([eval test x$]AS_TR_SH([cc_cv_$2_$3])[ = xyes],
+        [eval "$1='${$1} $3'"])
+])
+
+dnl CC_CHECK_FLAGS_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG1 FLAG2])
+AC_DEFUN([CC_CHECK_FLAGS_APPEND], [
+  for flag in $3; do
+    CC_CHECK_FLAG_APPEND($1, $2, $flag)
+  done
+])
+
+dnl Check if the flag is supported by linker (cacheable)
+dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
+
+AC_DEFUN([CC_CHECK_LDFLAGS], [
+  AC_CACHE_CHECK([if $CC supports $1 flag],
+    AS_TR_SH([cc_cv_ldflags_$1]),
+    [ac_save_LDFLAGS="$LDFLAGS"
+     LDFLAGS="$LDFLAGS $1"
+     AC_LINK_IFELSE([int main() { return 1; }],
+       [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"],
+       [eval "AS_TR_SH([cc_cv_ldflags_$1])="])
+     LDFLAGS="$ac_save_LDFLAGS"
+    ])
+
+  AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes],
+    [$2], [$3])
+])
+
+dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for
+dnl the current linker to avoid undefined references in a shared object.
+AC_DEFUN([CC_NOUNDEFINED], [
+  dnl We check $host for which systems to enable this for.
+  AC_REQUIRE([AC_CANONICAL_HOST])
+
+  case $host in
+     dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads
+     dnl are requested, as different implementations are present; to avoid problems
+     dnl use -Wl,-z,defs only for those platform not behaving this way.
+     *-freebsd* | *-openbsd*) ;;
+     *)
+        dnl First of all check for the --no-undefined variant of GNU ld. This allows
+        dnl for a much more readable commandline, so that people can understand what
+        dnl it does without going to look for what the heck -z defs does.
+        for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do
+           CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"])
+           break
+        done
+     ;;
+  esac
+
+  AC_SUBST([LDFLAGS_NOUNDEFINED])
+])
+
+dnl Check for a -Werror flag or equivalent. -Werror is the GCC
+dnl and ICC flag that tells the compiler to treat all the warnings
+dnl as fatal. We usually need this option to make sure that some
+dnl constructs (like attributes) are not simply ignored.
+dnl
+dnl Other compilers don't support -Werror per se, but they support
+dnl an equivalent flag:
+dnl  - Sun Studio compiler supports -errwarn=%all
+AC_DEFUN([CC_CHECK_WERROR], [
+  AC_CACHE_CHECK(
+    [for $CC way to treat warnings as errors],
+    [cc_cv_werror],
+    [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror],
+      [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])])
+    ])
+])
+
+AC_DEFUN([CC_CHECK_ATTRIBUTE], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))],
+    AS_TR_SH([cc_cv_attribute_$1]),
+    [ac_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])],
+       [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"],
+       [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"])
+     CFLAGS="$ac_save_CFLAGS"
+    ])
+
+  AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes],
+    [AC_DEFINE(
+       AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1,
+         [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))]
+         )
+     $4],
+    [$5])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [
+  CC_CHECK_ATTRIBUTE(
+    [constructor],,
+    [void __attribute__((constructor)) ctor() { int a; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_FORMAT], [
+  CC_CHECK_ATTRIBUTE(
+    [format], [format(printf, n, n)],
+    [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [
+  CC_CHECK_ATTRIBUTE(
+    [format_arg], [format_arg(printf)],
+    [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [
+  CC_CHECK_ATTRIBUTE(
+    [visibility_$1], [visibility("$1")],
+    [void __attribute__((visibility("$1"))) $1_function() { }],
+    [$2], [$3])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_NONNULL], [
+  CC_CHECK_ATTRIBUTE(
+    [nonnull], [nonnull()],
+    [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_UNUSED], [
+  CC_CHECK_ATTRIBUTE(
+    [unused], ,
+    [void some_function(void *foo, __attribute__((unused)) void *bar);],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [
+  CC_CHECK_ATTRIBUTE(
+    [sentinel], ,
+    [void some_function(void *foo, ...) __attribute__((sentinel));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [
+  CC_CHECK_ATTRIBUTE(
+    [deprecated], ,
+    [void some_function(void *foo, ...) __attribute__((deprecated));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_ALIAS], [
+  CC_CHECK_ATTRIBUTE(
+    [alias], [weak, alias],
+    [void other_function(void *foo) { }
+     void some_function(void *foo) __attribute__((weak, alias("other_function")));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_MALLOC], [
+  CC_CHECK_ATTRIBUTE(
+    [malloc], ,
+    [void * __attribute__((malloc)) my_alloc(int n);],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_PACKED], [
+  CC_CHECK_ATTRIBUTE(
+    [packed], ,
+    [struct astructure { char a; int b; long c; void *d; } __attribute__((packed));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_CONST], [
+  CC_CHECK_ATTRIBUTE(
+    [const], ,
+    [int __attribute__((const)) twopow(int n) { return 1 << n; } ],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_FLAG_VISIBILITY], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([if $CC supports -fvisibility=hidden],
+    [cc_cv_flag_visibility],
+    [cc_flag_visibility_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden],
+     cc_cv_flag_visibility='yes',
+     cc_cv_flag_visibility='no')
+     CFLAGS="$cc_flag_visibility_save_CFLAGS"])
+
+  AS_IF([test "x$cc_cv_flag_visibility" = "xyes"],
+    [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1,
+       [Define this if the compiler supports the -fvisibility flag])
+     $1],
+    [$2])
+])
+
+AC_DEFUN([CC_FUNC_EXPECT], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([if compiler has __builtin_expect function],
+    [cc_cv_func_expect],
+    [ac_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     AC_COMPILE_IFELSE([AC_LANG_SOURCE(
+       [int some_function() {
+        int a = 3;
+        return (int)__builtin_expect(a, 3);
+     }])],
+       [cc_cv_func_expect=yes],
+       [cc_cv_func_expect=no])
+     CFLAGS="$ac_save_CFLAGS"
+    ])
+
+  AS_IF([test "x$cc_cv_func_expect" = "xyes"],
+    [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1,
+     [Define this if the compiler supports __builtin_expect() function])
+     $1],
+    [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported],
+    [cc_cv_attribute_aligned],
+    [ac_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     for cc_attribute_align_try in 64 32 16 8 4 2; do
+        AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+          int main() {
+            static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0;
+            return c;
+          }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break])
+     done
+     CFLAGS="$ac_save_CFLAGS"
+  ])
+
+  if test "x$cc_cv_attribute_aligned" != "x"; then
+     AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned],
+       [Define the highest alignment supported])
+  fi
+])
similarity index 75%
rename from src/install+setup/setup/main.c
rename to src/setup/main.c
index d6531bdf083414f021f76d3e10e4d9257c0705c8..3d47f58f4636634c7259670dd0632d1636baa91a 100644 (file)
@@ -8,36 +8,22 @@
  *
  */
 
+// Translation
+#include <libintl.h>
+#define _(x) dgettext("setup", x)
+
 #include "setup.h"
 
 FILE *flog = NULL;
 char *mylog;
 
-char **ctr = NULL;
-
 int automode = 0;
 
 struct  nic  nics[20] = { { "" , "" , "" , "" } };
 struct knic knics[20] = { { "" , "" , "" , "" } };
 
-extern char *en_tr[];
-extern char *de_tr[];
-extern char *fr_tr[];
-extern char *es_tr[];
-extern char *pl_tr[];
-extern char *ru_tr[];
-extern char *nl_tr[];
-extern char *tr_tr[];
-
 int main(int argc, char *argv[])
 {
-#ifdef  LANG_EN_ONLY
-       char *shortlangnames[] = { "en", NULL };
-       char **langtrs[] = { en_tr, NULL };
-#else
-       char *shortlangnames[] = { "de", "en", "fr", "es", "nl", "pl", "ru", "tr", NULL };
-       char **langtrs[] = { de_tr, en_tr, fr_tr, es_tr, nl_tr, pl_tr, ru_tr, tr_tr, NULL };
-#endif
        int choice;
        char *sections[11]; /* need to fill this out AFTER knowning lang */
        int rc;
@@ -67,6 +53,7 @@ int main(int argc, char *argv[])
        if (!setlocale(LC_CTYPE,""))
                fprintf(flog, "Locale not spezified. Check LANG, LC_CTYPE, RC_ALL.");
 
+#if 0
        kv = initkeyvalues();
        if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings")))
        {
@@ -95,15 +82,16 @@ int main(int argc, char *argv[])
                        goto EXIT;
                ctr = langtrs[choice];
        }
+#endif
 
-       sections[0] = ctr[TR_KEYBOARD_MAPPING];
-       sections[1] = ctr[TR_TIMEZONE];
-       sections[2] = ctr[TR_HOSTNAME];
-       sections[3] = ctr[TR_DOMAINNAME];
-       sections[4] = ctr[TR_NETWORKING];
-       sections[5] = ctr[TR_ISDN];
-       sections[6] = ctr[TR_ROOT_PASSWORD];
-       sections[7] = ctr[TR_ADMIN_PASSWORD];
+       sections[0] = _("Keyboard mapping");
+       sections[1] = _("Timezone");
+       sections[2] = _("Hostname");
+       sections[3] = _("Domain name");
+       sections[4] = _("Networking");
+       sections[5] = _("ISDN");
+       sections[6] = _("'root' password");
+       sections[7] = _("'admin' password");
        sections[8] = NULL;
 
        newtInit();
@@ -119,16 +107,16 @@ int main(int argc, char *argv[])
            sprintf (title, "%s %s - %s", NAME, VERSION, SLOGAN);
        }
        newtDrawRootText(14, 0, title);
-       newtPushHelpLine(ctr[TR_HELPLINE]);             
+       newtPushHelpLine(_("              <Tab>/<Alt-Tab> between elements   |  <Space> selects"));             
 
        if (automode == 0)
        {
                choice = 0;
                for (;;)
                {
-                       rc = newtWinMenu(ctr[TR_SECTION_MENU],
-                               ctr[TR_SELECT_THE_ITEM], 50, 5, 5, 11,
-                               sections, &choice, ctr[TR_OK], ctr[TR_QUIT], NULL);
+                       rc = newtWinMenu(_("Section menu"),
+                               _("Select the item you wish to configure."), 50, 5, 5, 11,
+                               sections, &choice, _("OK"), _("Quit"), NULL);
 
                        if (rc == 2)
                                break;
@@ -196,15 +184,17 @@ int main(int argc, char *argv[])
                autook = 1;
        }
 
-EXIT:  
+EXIT:
        if (automode != 0)
        {
                sprintf (title, "%s %s - %s", NAME, VERSION, SLOGAN);
                if (autook)
-                       newtWinMessage(title, ctr[TR_OK], ctr[TR_SETUP_FINISHED]);
-               else
-               {
-                       newtWinMessage(ctr[TR_WARNING], ctr[TR_OK], ctr[TR_SETUP_NOT_COMPLETE]);
+                       newtWinMessage(title, _("OK"), _("Setup is complete."));
+               else {
+                       newtWinMessage(_("Warning"), _("OK"),
+                               _("Initial setup was not entirely complete. "
+                               "You must ensure that Setup is properly finished by running "
+                               "setup again at the shell."));
 
                        fprintf(flog, "Setup program has not finished.\n");
                        fflush(flog);
similarity index 81%
rename from src/install+setup/setup/misc.c
rename to src/setup/misc.c
index 58e9bb275d0e8838dc9a5918ad085eb84eb3d50f..3b258e0f184e29bd32c1933b3990b9d0199d285b 100644 (file)
@@ -7,14 +7,16 @@
  * Misc. stuff for the lib.
  * 
  */
+
+// Translation
+#include <libintl.h>
+#define _(x) dgettext("setup", x)
+
 #include "setup.h"
 
 extern FILE *flog;
 extern char *mylog;
 
-extern char **ctr;
 extern int automode;
 
 /* This will rewrite /etc/hosts, /etc/hosts.*, and the apache ServerName file. */
@@ -35,7 +37,7 @@ int writehostsfiles(void)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
        findkey(kv, "GREEN_ADDRESS", address);
@@ -47,7 +49,7 @@ int writehostsfiles(void)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
        strcpy(hostname, SNAME );
@@ -57,7 +59,7 @@ int writehostsfiles(void)
                
        if (!(file = fopen(CONFIG_ROOT "/main/hostname.conf", "w")))
        {
-               sprintf (message, ctr[TR_UNABLE_TO_WRITE_VAR_SMOOTHWALL_MAIN_HOSTNAMECONF], CONFIG_ROOT);
+               sprintf (message, _("Unable to write %s/main/hostname.conf"), CONFIG_ROOT);
                errorbox(message);
                return 0;
        }
@@ -66,12 +68,12 @@ int writehostsfiles(void)
        
        if (!(file = fopen(CONFIG_ROOT "/main/hosts", "r")))
        {
-               errorbox(ctr[TR_UNABLE_TO_OPEN_HOSTS_FILE]);
+               errorbox(_("Unable to open main hosts file."));
                return 0;
        }
        if (!(hosts = fopen("/etc/hosts", "w")))
        {
-               errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS]);
+               errorbox(_("Unable to write /etc/hosts."));
                return 0;
        }
        fprintf(hosts, "127.0.0.1\tlocalhost\n");
@@ -112,7 +114,7 @@ int writehostsfiles(void)
        /* TCP wrappers stuff. */
        if (!(file = fopen("/etc/hosts.deny", "w")))
        {
-               errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS_DENY]);
+               errorbox(_("Unable to write /etc/hosts.deny."));
                return 0;
        }
        fprintf(file, "ALL : ALL\n");
@@ -120,7 +122,7 @@ int writehostsfiles(void)
        
        if (!(file = fopen("/etc/hosts.allow", "w")))
        {
-               errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS_ALLOW]);
+               errorbox(_("Unable to write /etc/hosts.allow."));
                return 0;
        }
        fprintf(file, "sshd : ALL\n");
@@ -129,9 +131,9 @@ int writehostsfiles(void)
        fclose(file);
        
        sprintf(commandstring, "/bin/hostname %s.%s", hostname, domainname);
-       if (mysystem(commandstring))
+       if (mysystem(NULL, commandstring))
        {
-               errorbox(ctr[TR_UNABLE_TO_SET_HOSTNAME]);
+               errorbox(_("Unable to set hostname."));
                return 0;
        }
        
@@ -142,8 +144,8 @@ int handleisdn(void)
 {
        char command[STRING_SIZE];
        sprintf(command, "/etc/rc.d/init.d/mISDN config");
-       if (runcommandwithstatus(command, ctr[TR_PROBING_ISDN]))
-               errorbox(ctr[TR_ERROR_PROBING_ISDN]);
+       if (runcommandwithstatus(command, _("ISDN"), _("Scanning and configuring ISDN devices."), NULL))
+               errorbox(_("Unable to scan for ISDN devices."));
        // Need to write some lines that count the cards and say the names...
        return 1;
 }
similarity index 88%
rename from src/install+setup/libsmooth/netstuff.c
rename to src/setup/netstuff.c
index 8c6f3fa90f7158a946912d9fa483b1dbf7015085..a656e9f910b183a8520b95308c7f02ed02503caa 100644 (file)
@@ -8,14 +8,18 @@
  * 
  */
 
-#include "libsmooth.h"
+#include <libsmooth.h>
 #include <signal.h>
 
+// Translation
+#include <libintl.h>
+#define _(x) dgettext("setup", x)
+
+#include "setup.h"
+
 extern FILE *flog;
 extern char *mylog;
 
-extern char **ctr;
-
 extern struct nic nics[];
 extern struct knic knics[];
 
@@ -79,12 +83,12 @@ int changeaddress(struct keyvalue *kv, char *colour, int typeflag,
        sprintf(dhcphostnamefield, "%s_DHCP_HOSTNAME", colour);
        sprintf(dhcpforcemtufield, "%s_DHCP_FORCE_MTU", colour);
                
-       sprintf(message, ctr[TR_INTERFACE], colour);
+       sprintf(message, _("Interface - %s"), colour);
        newtCenteredWindow(44, (typeflag ? 18 : 12), message);
        
        networkform = newtForm(NULL, NULL, 0);
 
-       sprintf(message, ctr[TR_ENTER_THE_IP_ADDRESS_INFORMATION], colour);
+       sprintf(message, _("Enter the IP address information for the %s interface."), colour);
        header = newtTextboxReflowed(1, 1, message, 42, 0, 0, 0);
        newtFormAddComponent(networkform, header);
 
@@ -96,18 +100,19 @@ int changeaddress(struct keyvalue *kv, char *colour, int typeflag,
                if (strcmp(temp, "STATIC") == 0) startstatictype = 1;
                if (strcmp(temp, "DHCP") == 0) startdhcptype = 1;
                if (strcmp(temp, "PPPOE") == 0) startpppoetype = 1;
-               statictyperadio = newtRadiobutton(2, 4, ctr[TR_STATIC], startstatictype, NULL);
-               dhcptyperadio = newtRadiobutton(2, 5, ctr[TR_DHCP], startdhcptype, statictyperadio);
-               pppoetyperadio = newtRadiobutton(2, 6, ctr[TR_PPP_DIALUP], startpppoetype, dhcptyperadio);
+               statictyperadio = newtRadiobutton(2, 4, _("Static"), startstatictype, NULL);
+               dhcptyperadio = newtRadiobutton(2, 5, _("DHCP"), startdhcptype, statictyperadio);
+               pppoetyperadio = newtRadiobutton(2, 6, _("PPP DIALUP (PPPoE, modem, ATM ...)"),
+                       startpppoetype, dhcptyperadio);
                newtFormAddComponents(networkform, statictyperadio, dhcptyperadio, 
                        pppoetyperadio, NULL);
                newtComponentAddCallback(statictyperadio, networkdialogcallbacktype, NULL);
                newtComponentAddCallback(dhcptyperadio, networkdialogcallbacktype, NULL);
                newtComponentAddCallback(pppoetyperadio, networkdialogcallbacktype, NULL);
                dhcphostnamelabel = newtTextbox(2, 8, 18, 1, 0);
-               newtTextboxSetText(dhcphostnamelabel, ctr[TR_DHCP_HOSTNAME]);
+               newtTextboxSetText(dhcphostnamelabel, _("DHCP Hostname:"));
                dhcpforcemtulabel = newtTextbox(2, 9, 18, 1, 0);
-               newtTextboxSetText(dhcpforcemtulabel, ctr[TR_DHCP_FORCE_MTU]);
+               newtTextboxSetText(dhcpforcemtulabel, _("Force DHCP MTU:"));
                strcpy(temp, defaultdhcphostname);
                findkey(kv, dhcphostnamefield, temp);
                dhcphostnameentry = newtEntry(20, 8, temp, 20, &dhcphostnameresult, 0);
@@ -126,7 +131,7 @@ int changeaddress(struct keyvalue *kv, char *colour, int typeflag,
        }
        /* Address */
        addresslabel = newtTextbox(2, (typeflag ? 11 : 4) + 0, 18, 1, 0);
-       newtTextboxSetText(addresslabel, ctr[TR_IP_ADDRESS_PROMPT]);
+       newtTextboxSetText(addresslabel, _("IP address:"));
        strcpy(temp, "");
        findkey(kv, addressfield, temp);
        addressentry = newtEntry(20, (typeflag ? 11 : 4) + 0, temp, 20, &addressresult, 0);
@@ -138,7 +143,7 @@ int changeaddress(struct keyvalue *kv, char *colour, int typeflag,
        
        /* Netmask */
        netmasklabel = newtTextbox(2, (typeflag ? 11 : 4) + 1, 18, 1, 0);
-       newtTextboxSetText(netmasklabel, ctr[TR_NETMASK_PROMPT]);
+       newtTextboxSetText(netmasklabel, _("Network mask:"));
        strcpy(temp, "255.255.255.0"); findkey(kv, netmaskfield, temp);
        netmaskentry = newtEntry(20, (typeflag ? 11 : 4) + 1, temp, 20, &netmaskresult, 0);
        newtEntrySetFilter(netmaskentry, ip_input_filter, NULL);
@@ -149,8 +154,8 @@ int changeaddress(struct keyvalue *kv, char *colour, int typeflag,
        newtFormAddComponent(networkform, netmaskentry);
 
        /* Buttons. */
-       ok = newtButton(8, (typeflag ? 14 : 7), ctr[TR_OK]);
-       cancel = newtButton(26, (typeflag ? 14 : 7), ctr[TR_CANCEL]);
+       ok = newtButton(8, (typeflag ? 14 : 7), _("OK"));
+       cancel = newtButton(26, (typeflag ? 14 : 7), _("Cancel"));
 
        newtFormAddComponents(networkform, ok, cancel, NULL);
 
@@ -165,7 +170,8 @@ int changeaddress(struct keyvalue *kv, char *colour, int typeflag,
                if (es.u.co == ok)
                {
                        /* OK was pressed; verify the contents of each entry. */
-                       strcpy(message, ctr[TR_INVALID_FIELDS]);
+                       strcpy(message, _("The following fields are invalid:"));
+                       strcat(message, "\n\n");
                        
                        strcpy(type, "STATIC");
                        if (typeflag)
@@ -174,12 +180,14 @@ int changeaddress(struct keyvalue *kv, char *colour, int typeflag,
                        {               
                                if (inet_addr(addressresult) == INADDR_NONE)
                                {
-                                       strcat(message, ctr[TR_IP_ADDRESS_CR]);
+                                       strcat(message, _("IP address"));
+                                       strcat(message, "\n");
                                        error = 1;
                                }
                                if (inet_addr(netmaskresult) == INADDR_NONE)
                                {
-                                       strcat(message, ctr[TR_NETWORK_MASK_CR]);
+                                       strcat(message, _("Network mask"));
+                                       strcat(message, "\n");
                                        error = 1;
                                }
                        }
@@ -187,7 +195,8 @@ int changeaddress(struct keyvalue *kv, char *colour, int typeflag,
                        {
                                if (!strlen(dhcphostnameresult))
                                {
-                                       strcat(message, ctr[TR_DHCP_HOSTNAME_CR]);
+                                       strcat(message, _("DHCP hostname"));
+                                       strcat(message, "\n");
                                        error = 1;
                                }
                        }
@@ -365,7 +374,7 @@ int get_knic(int card)              //returns "0" for zero cards or error and "1" card is fo
        if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
 
@@ -384,7 +393,7 @@ int get_knic(int card)              //returns "0" for zero cards or error and "1" card is fo
                strcpy(knics[ card ].driver, temp);
                ret_value = 1;
        } else {
-               strcpy(knics[ card ].description, ctr[TR_UNSET]);
+               strcpy(knics[ card ].description, _("Unset"));
                ret_value = 0;
        }
        freekeyvalues(kv);
@@ -413,7 +422,7 @@ int is_interface_up(char *card) {   /* Check if the interface is UP */
        char temp[STRING_SIZE];
 
        sprintf(temp,"ip link show dev %s | grep -q UP", card);
-       if (mysystem(temp)) return 0; else return 1;
+       if (mysystem(NULL, temp)) return 0; else return 1;
 }
 
 int rename_device(char *old_name, char *new_name) {
@@ -425,7 +434,7 @@ int rename_device(char *old_name, char *new_name) {
                return 0;
        }
        sprintf(temp,"/sbin/ip link set dev %s name %s",old_name ,new_name );
-       mysystem(temp);
+       mysystem(NULL, temp);
 
        return 1;
 }
@@ -477,14 +486,14 @@ int nic_shutdown(char *nic) {
        char temp[STRING_SIZE];
        
        sprintf(temp,"ip link set %s down", nic);
-       mysystem(temp);
+       mysystem(NULL, temp);
 }
 
 int nic_startup(char *nic) {
        char temp[STRING_SIZE];
        
        sprintf(temp,"ip link set %s up", nic);
-       mysystem(temp);
+       mysystem(NULL, temp);
 
 }
 
@@ -554,7 +563,7 @@ int write_configs_netudev(int card , int colour)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
 
@@ -585,7 +594,7 @@ int scan_network_cards(void)
        
        if (!(scanned_nics_read_done))
        {
-               mysystem("/bin/probenic.sh");
+               mysystem(NULL, "/usr/bin/probenic.sh");
                if( (fp = fopen(SCANNED_NICS, "r")) == NULL )
                {
                        fprintf(stderr,"Couldn't open "SCANNED_NICS);
@@ -657,18 +666,19 @@ int nicmenu(int colour)
 
                pMenuInhalt[mcount] = NULL;
 
-               sprintf(message, ctr[TR_CHOOSE_NETCARD], ucolourcard[colour]);
+               sprintf(message, _("Please choose a networkcard for the following interface - %s."), ucolourcard[colour]);
                rc=2;
                while ( rc == 2 ) {
-                       rc = newtWinMenu( ctr[TR_NETCARDMENU2], message, 50, 5, 5, 6, pMenuInhalt, &choise, ctr[TR_SELECT], ctr[TR_IDENTIFY], ctr[TR_CANCEL], NULL);
+                       rc = newtWinMenu(_("Extended Network Menu"), message, 50, 5, 5, 6, pMenuInhalt, &choise,
+                               _("Select"), _("Identify"), _("Cancel"), NULL);
                        if ( rc == 2 ) {
                                sprintf(temp, "/sbin/ip link set %s up", nics[found_NIC_as_Card[choise]].nic);
-                               mysystem(temp);
+                               mysystem(NULL, temp);
                                sprintf(temp, "/usr/sbin/ethtool -p %s 10", nics[found_NIC_as_Card[choise]].nic);
-                               if (runcommandwithstatus(temp,ctr[TR_IDENTIFY_SHOULD_BLINK]) != 0) {      
-                                       errorbox(ctr[TR_IDENTIFY_NOT_SUPPORTED]);
+                               if (runcommandwithstatus(temp, _("Device Identification"), _("The lights on the selected port should flash now for 10 seconds..."), NULL) != 0) {
+                                       errorbox(_("Identification is not supported by this interface."));
                                sprintf(temp, "/sbin/ip link set %s down", nics[found_NIC_as_Card[choise]].nic);
-                               mysystem(temp);
+                               mysystem(NULL, temp);
                                }
                        }
                }
@@ -678,7 +688,7 @@ int nicmenu(int colour)
                return 0;
        } else {
                // We have to add here that you can manually add a device
-               errorbox( ctr[TR_ERROR_INTERFACES]);
+               errorbox(_("There are no unassigned interfaces on your system."));
                return 1;
        }
 }
@@ -691,12 +701,12 @@ int clear_card_entry(int card)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
 
        strcpy(knics[card].driver, "");
-       strcpy(knics[card].description, ctr[TR_UNSET]);
+       strcpy(knics[card].description, _("Unset"));
        strcpy(knics[card].macaddr, "");
        strcpy(knics[card].colour, "");
        sprintf(temp, "%s_DRIVER", ucolourcard[card]);
@@ -719,8 +729,8 @@ int ask_clear_card_entry(int card)
        char message[STRING_SIZE];
        int rc;
 
-       sprintf(message, ctr[TR_REMOVE_CARD], ucolourcard[card]);
-       rc = newtWinChoice(ctr[TR_WARNING], ctr[TR_OK], ctr[TR_CANCEL], message);                               
+       sprintf(message, _("Do you really want to remove the assigned %s interface?"), ucolourcard[card]);
+       rc = newtWinChoice(_("Warning"), _("OK"), _("Cancel"), message);
 
        if ( rc = 0 || rc == 1) {
                clear_card_entry(card);
@@ -742,15 +752,14 @@ int manualdriver(char *driver, char *driveroptions)
        strcpy(driver, "");
        strcpy(driveroptions, "");
        
-       rc = newtWinEntries(ctr[TR_SELECT_NETWORK_DRIVER], 
-               ctr[TR_MODULE_PARAMETERS], 50, 5, 5, 40, entries, 
-               ctr[TR_OK], ctr[TR_CANCEL], NULL);      
+       rc = newtWinEntries(_("Select network driver"), _("Set additional module parameters"),
+               50, 5, 5, 40, entries,  _("OK"), _("Cancel"), NULL);
        if (rc == 0 || rc == 1)
        {
                if (strlen(values[0]))
                {
                        sprintf(commandstring, "/sbin/modprobe %s", values[0]);
-                       if (runcommandwithstatus(commandstring, ctr[TR_LOADING_MODULE]) == 0)
+                       if (runcommandwithstatus(commandstring, _("Loading module..."), _("Loading module..."), NULL) == 0)
                        {
                                if ((driverend = strchr(values[0], ' ')))
                                {
@@ -765,10 +774,10 @@ int manualdriver(char *driver, char *driveroptions)
                                }
                        }
                        else
-                               errorbox(ctr[TR_UNABLE_TO_LOAD_DRIVER_MODULE]);
+                               errorbox(_("Unable to load driver module."));
                }
                else
-                       errorbox(ctr[TR_MODULE_NAME_CANNOT_BE_BLANK]);
+                       errorbox(_("Module name cannot be blank."));
        }
        free(values[0]);
 
similarity index 71%
rename from src/install+setup/setup/networking.c
rename to src/setup/networking.c
index edd3c71af0d60560c64b0f41616640c1eb3c60cd..1b5b77d8d54444c61fe18f5c182c09d6d6e42f5a 100644 (file)
@@ -7,7 +7,11 @@
  * The big one: networking. 
  * 
  */
+
+// Translation
+#include <libintl.h>
+#define _(x) dgettext("setup", x)
+
 #include "setup.h"
 
 #define DNS1 0
@@ -18,8 +22,6 @@
 extern FILE *flog;
 extern char *mylog;
 
-extern char **ctr;
-
 extern int automode;
 
 #define HAS_GREEN 1
@@ -105,12 +107,12 @@ int handlenetworking(void)
                if (netaddresschange)
                {
                        runcommandwithstatus("/etc/rc.d/init.d/network stop",
-                               ctr[TR_PUSHING_NETWORK_DOWN]);
+                               _("Networking"), _("Stopping network..."), NULL);
 
                        rename_nics();
 
                        runcommandwithstatus("/etc/rc.d/init.d/network start",
-                               ctr[TR_PULLING_NETWORK_UP]);
+                               _("Networking"), _("Restarting network..."), NULL);
                }
        } else {
                rename_nics();
@@ -129,7 +131,7 @@ int oktoleave(void)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }       
 
@@ -141,13 +143,13 @@ int oktoleave(void)
                strcpy(temp, ""); findkey(kv, "GREEN_DEV", temp);
                if (!(strlen(temp)))
                {
-                       errorbox(ctr[TR_NO_GREEN_INTERFACE]);
+                       errorbox(_("No GREEN interface assigned."));
                        freekeyvalues(kv);
                        return 0;
                }
                if (!(interfacecheck(kv, "GREEN")))
                {
-                       errorbox(ctr[TR_MISSING_GREEN_IP]);
+                       errorbox(_("Missing an IP address on GREEN."));
                        freekeyvalues(kv);
                        return 0;
                }
@@ -158,7 +160,8 @@ int oktoleave(void)
                strcpy(temp, ""); findkey(kv, "RED_DEV", temp);
                if (!(strlen(temp)))
                {
-                       rc = newtWinChoice(ctr[TR_ERROR], ctr[TR_OK], ctr[TR_IGNORE], ctr[TR_NO_RED_INTERFACE]);
+                       rc = newtWinChoice(_("Error"), _("OK"), _("Ignore"),
+                               _("No RED interface assigned."));
                        if (rc == 0 || rc == 1)
                        {
                                freekeyvalues(kv);
@@ -167,7 +170,7 @@ int oktoleave(void)
                }
                if (!(interfacecheck(kv, "RED")))
                {
-                       errorbox(ctr[TR_MISSING_RED_IP]);
+                       errorbox(_("Missing an IP address on RED."));
                        freekeyvalues(kv);
                        return 0;
                }
@@ -177,13 +180,13 @@ int oktoleave(void)
                strcpy(temp, ""); findkey(kv, "ORANGE_DEV", temp);
                if (!(strlen(temp)))
                {
-                       errorbox(ctr[TR_NO_ORANGE_INTERFACE]);
+                       errorbox(_("No ORANGE interface assigned."));
                        freekeyvalues(kv);
                        return 0;
                }
                if (!(interfacecheck(kv, "ORANGE")))
                {
-                       errorbox(ctr[TR_MISSING_ORANGE_IP]);
+                       errorbox(_("Missing an IP address on ORANGE."));
                        freekeyvalues(kv);
                        return 0;
                }
@@ -193,13 +196,13 @@ int oktoleave(void)
                strcpy(temp, ""); findkey(kv, "BLUE_DEV", temp);
                if (!(strlen(temp)))
                {
-                       errorbox(ctr[TR_NO_BLUE_INTERFACE]);
+                       errorbox(_("No BLUE interface assigned."));
                        freekeyvalues(kv);
                        return 0;
                }
                if (!(interfacecheck(kv, "BLUE")))
                {
-                       errorbox(ctr[TR_MISSING_BLUE_IP]);
+                       errorbox(_("Missing an IP address on BLUE."));
                        freekeyvalues(kv);
                        return 0;
                }
@@ -211,14 +214,14 @@ int oktoleave(void)
                strcpy(temp, ""); findkey(kv, "DNS1", temp);
                if (!(strlen(temp)))
                {
-                       errorbox(ctr[TR_MISSING_DNS]);
+                       errorbox(_("Misssing DNS."));
                        freekeyvalues(kv);
                        return 0;
                }
                strcpy(temp, ""); findkey(kv, "DEFAULT_GATEWAY", temp);
                if (!(strlen(temp)))
                {
-                       errorbox(ctr[TR_MISSING_DEFAULT]);
+                       errorbox(_("Missing Default Gateway."));
                        freekeyvalues(kv);
                        return 0;
                }
@@ -230,10 +233,13 @@ int oktoleave(void)
 /* Shows the main menu and a summary of the current settings. */
 int firstmenu(void)
 {
-       char *sections[] = { ctr[TR_NETWORK_CONFIGURATION_TYPE],
-               ctr[TR_DRIVERS_AND_CARD_ASSIGNMENTS],
-               ctr[TR_ADDRESS_SETTINGS],
-               ctr[TR_DNS_AND_GATEWAY_SETTINGS], NULL };
+       char *sections[] = {
+               _("Network configuration type"),
+               _("Drivers and card assignments"),
+               _("Address settings"),
+               _("DNS and Gateway settings"),
+               NULL
+       };
        int rc;
        static int choice = 0;
        struct keyvalue *kv = initkeyvalues();
@@ -246,22 +252,22 @@ int firstmenu(void)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }       
 
        if (netaddresschange) 
-               strcpy(networkrestart, ctr[TR_RESTART_REQUIRED]);
+               strcpy(networkrestart, _("When configuration is complete, a network restart will be required."));
 
        strcpy(temp, ""); findkey(kv, "CONFIG_TYPE", temp); 
        x = atol(temp);
        x--;
        if (x < 0 || x > 4) x = 0;
        /* Format heading bit. */
-       snprintf(message, 1000, ctr[TR_CURRENT_CONFIG], configtypenames[x],
+       snprintf(message, 1000, _("Current config: %s%s"), configtypenames[x],
                networkrestart);
-       rc = newtWinMenu(ctr[TR_NETWORK_CONFIGURATION_MENU], message, 50, 5, 5, 6,
-                       sections, &choice, ctr[TR_OK], ctr[TR_DONE], NULL);
+       rc = newtWinMenu(_("Network configuration menu"), message, 50, 5, 5, 6,
+                       sections, &choice, _("OK"), _("Done"), NULL);
 
        if (rc == 0 || rc == 1)
                result = choice + 1;
@@ -283,7 +289,7 @@ int configtypemenu(void)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
 
@@ -292,11 +298,15 @@ int configtypemenu(void)
        findkey(kv, "CONFIG_TYPE", temp); choise = atol(temp);
        choise--;
 
-               sprintf(message, ctr[TR_NETWORK_CONFIGURATION_TYPE_LONG], NAME);
-               rc = newtWinMenu(ctr[TR_NETWORK_CONFIGURATION_TYPE], message, 50, 5, 5,
-                       6, configtypenames, &choise, ctr[TR_OK], ctr[TR_CANCEL], NULL);
+               sprintf(message, _("Select the network configuration for %s. "
+                       "The following configuration types list those interfaces which have ethernet attached. "
+                       "If you change this setting, a network restart will be required, and you will have to "
+                       "reconfigure the network driver assignments."), NAME);
+               rc = newtWinMenu(_("Network configuration type"), message, 50, 5, 5,
+                       6, configtypenames, &choise, _("OK"), _("Cancel"), NULL);
                if ( configtypecards[choise] > found ) {
-                       sprintf(message, ctr[TR_NOT_ENOUGH_INTERFACES] , configtypecards[choise], found);
+                       sprintf(message, _("Not enough netcards for your choice.\n\nNeeded: %d - Available: %d\n"),
+                               configtypecards[choise], found);
                        errorbox(message);
                }
 
@@ -334,7 +344,7 @@ int drivermenu(void)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
 
@@ -347,42 +357,43 @@ int drivermenu(void)
                writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings");
        }
 
-       strcpy(message, ctr[TR_CONFIGURE_NETWORK_DRIVERS]);
+       strcpy(message, _("Configure network drivers, and which interface each card is assigned to. "
+               "The current configuration is as follows:\n\n"));
 
        kcount = 0;
        neednics = 0;
        if (HAS_GREEN) {
-               sprintf(temp, "GREEN:  %s\n", knics[_GREEN_CARD_].description);
+               sprintf(temp, "%-6s: %s\n", "GREEN", knics[_GREEN_CARD_].description);
                strcat(message, temp);
                if (strlen(knics[_GREEN_CARD_].macaddr) ) {
-                       sprintf(temp, "GREEN:  (%s) %s green0\n", knics[_GREEN_CARD_].macaddr, ctr[TR_AS]);
+                       sprintf(temp, "%-6s: (%s)\n", "GREEN", knics[_GREEN_CARD_].macaddr);
                        strcat(message, temp);
                }
                neednics++;
        }
        if (HAS_RED) {
-               sprintf(temp, "RED:    %s\n", knics[_RED_CARD_].description);
+               sprintf(temp, "%-6s: %s\n", "RED", knics[_RED_CARD_].description);
                strcat(message, temp);
                if (strlen(knics[_RED_CARD_].macaddr) ) {
-                       sprintf(temp, "RED:    (%s) %s red0\n", knics[_RED_CARD_].macaddr, ctr[TR_AS]);
+                       sprintf(temp, "%-6s: (%s)\n", "RED", knics[_RED_CARD_].macaddr);
                        strcat(message, temp);
                }
                neednics++;
        }
        if (HAS_ORANGE) {
-               sprintf(temp, "ORANGE: %s\n", knics[_ORANGE_CARD_].description);
+               sprintf(temp, "%-6s: %s\n", "ORANGE", knics[_ORANGE_CARD_].description);
                strcat(message, temp);
                if ( strlen(knics[_ORANGE_CARD_].macaddr) ) {
-                       sprintf(temp, "ORANGE: (%s) %s orange0\n", knics[_ORANGE_CARD_].macaddr, ctr[TR_AS]);
+                       sprintf(temp, "%-6s: (%s)\n", "ORANGE", knics[_ORANGE_CARD_].macaddr);
                        strcat(message, temp);
                }
                neednics++;
        }
        if (HAS_BLUE) {
-               sprintf(temp, "BLUE:   %s\n", knics[_BLUE_CARD_].description);
+               sprintf(temp, "%-6s: %s\n", "BLUE", knics[_BLUE_CARD_].description);
                strcat(message, temp);
                if (strlen(knics[_BLUE_CARD_].macaddr)) {
-                       sprintf(temp, "BLUE:   (%s) %s blue0\n", knics[_BLUE_CARD_].macaddr, ctr[TR_AS]);
+                       sprintf(temp, "%-6s: (%s)\n", "BLUE", knics[_BLUE_CARD_].macaddr);
                        strcat(message, temp);
                }
                neednics++;
@@ -394,9 +405,10 @@ int drivermenu(void)
 
        if (neednics = kcount)
        {
-               strcat(message, ctr[TR_DO_YOU_WISH_TO_CHANGE_THESE_SETTINGS]);
-               rc = newtWinChoice(ctr[TR_DRIVERS_AND_CARD_ASSIGNMENTS], ctr[TR_OK],
-               ctr[TR_CANCEL], message);
+               strcat(message, "\n");
+               strcat(message, _("Do you wish to change these settings?"));
+               rc = newtWinChoice(_("Drivers and card assignments"), _("OK"),
+                       _("Cancel"), message);
                if (rc == 0 || rc == 1)
                {
                        changedrivers();
@@ -428,12 +440,12 @@ int changedrivers(void)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
        if (automode == 0)
                runcommandwithstatus("/etc/rc.d/init.d/network stop red blue orange",
-                       ctr[TR_PUSHING_NON_LOCAL_NETWORK_DOWN]);
+                       _("Networking"), _("Restarting non-local network..."), NULL);
 
        findkey(kv, "CONFIG_TYPE", temp); configtype = atol(temp);
        if (configtype == 1)
@@ -450,16 +462,16 @@ int changedrivers(void)
        do
        {
                count = 0;
-               strcpy(message, ctr[TR_INTERFACE_CHANGE]);
+               strcpy(message, _("Please choose the interface you wish to change.\n\n"));
 
                if (green) {
                        strcpy(MenuInhalt[count], "GREEN");
                        pMenuInhalt[count] = MenuInhalt[count];
                        NicEntry[_GREEN_CARD_] = count;
-                       sprintf(temp, "GREEN:  %s\n", knics[_GREEN_CARD_].description);
+                       sprintf(temp, "%-6s: %s\n", "GREEN", knics[_GREEN_CARD_].description);
                        strcat(message, temp);
                        if ( strlen(knics[_GREEN_CARD_].macaddr) ) {
-                               sprintf(temp, "GREEN:  (%s) %s green0\n", knics[_GREEN_CARD_].macaddr, ctr[TR_AS]);
+                               sprintf(temp, "%-6s: (%s)\n", "GREEN", knics[_GREEN_CARD_].macaddr);
                                strcat(message, temp);
                        }
                        count++;
@@ -469,10 +481,10 @@ int changedrivers(void)
                        strcpy(MenuInhalt[count], "RED");
                        pMenuInhalt[count] = MenuInhalt[count];
                        NicEntry[_RED_CARD_] = count;
-                       sprintf(temp, "RED:    %s\n", knics[_RED_CARD_].description);
+                       sprintf(temp, "%-6s: %s\n", "RED", knics[_RED_CARD_].description);
                        strcat(message, temp);
                        if ( strlen(knics[_RED_CARD_].macaddr) ) {
-                               sprintf(temp, "RED:    (%s) %s red0\n", knics[_RED_CARD_].macaddr, ctr[TR_AS]);
+                               sprintf(temp, "%-6s: (%s)\n", "RED", knics[_RED_CARD_].macaddr);
                                strcat(message, temp);
                        }
                        count++;
@@ -482,10 +494,10 @@ int changedrivers(void)
                        strcpy(MenuInhalt[count], "ORANGE");
                        pMenuInhalt[count] = MenuInhalt[count];
                        NicEntry[_ORANGE_CARD_] = count;
-                       sprintf(temp, "ORANGE: %s\n", knics[_ORANGE_CARD_].description);
+                       sprintf(temp, "%-6s: %s\n", "ORANGE", knics[_ORANGE_CARD_].description);
                        strcat(message, temp);
                        if ( strlen(knics[_ORANGE_CARD_].macaddr) ) {
-                               sprintf(temp, "ORANGE: (%s) %s orange0\n", knics[_ORANGE_CARD_].macaddr, ctr[TR_AS]);
+                               sprintf(temp, "%-6s: (%s)\n", "ORANGE", knics[_ORANGE_CARD_].macaddr);
                                strcat(message, temp);
                        }
                        count++;
@@ -495,17 +507,18 @@ int changedrivers(void)
                        strcpy(MenuInhalt[count], "BLUE");
                        pMenuInhalt[count] = MenuInhalt[count];
                        NicEntry[_BLUE_CARD_] = count;
-                       sprintf(temp, "BLUE:   %s\n", knics[_BLUE_CARD_].description);
+                       sprintf(temp, "%-6s: %s\n", "BLUE", knics[_BLUE_CARD_].description);
                        strcat(message, temp);
                        if ( strlen(knics[_BLUE_CARD_].macaddr) ) {
-                               sprintf(temp, "BLUE:   (%s) %s blue0\n", knics[_BLUE_CARD_].macaddr, ctr[TR_AS]);
+                               sprintf(temp, "%-6s: (%s)\n", "BLUE", knics[_BLUE_CARD_].macaddr);
                                strcat(message, temp);
                        }
                        count++;
                }
                pMenuInhalt[count] = NULL;
 
-               rc = newtWinMenu( ctr[TR_NETCARD_COLOR], message, 70, 5, 5, 6, pMenuInhalt, &choise, ctr[TR_SELECT], ctr[TR_REMOVE], ctr[TR_DONE], NULL);
+               rc = newtWinMenu(_("Assigned Cards"), message, 70, 5, 5, 6, pMenuInhalt,
+                       &choise, _("Select"), _("Remove"), _("Done"), NULL);
                        
                if ( rc == 0 || rc == 1) {
                        if ((green) && ( choise == NicEntry[0])) nicmenu(_GREEN_CARD_);
@@ -537,12 +550,15 @@ int greenaddressmenu(void)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
 
-       sprintf(message, ctr[TR_WARNING_LONG], NAME);
-       rc = newtWinChoice(ctr[TR_WARNING], ctr[TR_OK], ctr[TR_CANCEL], message);
+       sprintf(message, _("If you change this IP address, and you are logged in remotely, "
+               "your connection to the %s machine will be broken, and you will have to reconnect "
+               "on the new IP. This is a risky operation, and should only be attempted if you "
+               "have physical access to the machine, should something go wrong."), NAME);
+       rc = newtWinChoice(_("Warning"), _("OK"), _("Cancel"), message);
        
        if (rc == 0 || rc == 1)
        {
@@ -585,14 +601,14 @@ int addressesmenu(void)
        {
                freekeyvalues(kv);
                freekeyvalues(mainkv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
        if (!(readkeyvalues(mainkv, CONFIG_ROOT "/main/settings")))
        {
                freekeyvalues(kv);
                freekeyvalues(mainkv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
 
@@ -622,18 +638,20 @@ int addressesmenu(void)
        done = 0;       
        while (!done)
        {
-               rc = newtWinMenu(ctr[TR_ADDRESS_SETTINGS],
-                       ctr[TR_SELECT_THE_INTERFACE_YOU_WISH_TO_RECONFIGURE], 50, 5,
-                       5, 6, sections, &choice, ctr[TR_OK], ctr[TR_DONE], NULL);       
+               rc = newtWinMenu(_("Address settings"),
+                       _("Select the interface you wish to reconfigure."), 50, 5,
+                       5, 6, sections, &choice, _("OK"), _("Done"), NULL);     
 
                if (rc == 0 || rc == 1)
                {
                        if (strcmp(sections[choice], "GREEN") == 0)
                        {
                                findkey(kv, "GREEN_ADDRESS", oldgreenaddress);
-                               sprintf(message, ctr[TR_WARNING_LONG], NAME);
-                               rc = newtWinChoice(ctr[TR_WARNING], ctr[TR_OK], ctr[TR_CANCEL],
-                                       message);
+                               sprintf(message, _("If you change this IP address, and you are logged in remotely, "
+                                       "your connection to the %s machine will be broken, and you will have to reconnect "
+                                       "on the new IP. This is a risky operation, and should only be attempted if you "
+                                       "have physical access to the machine, should something go wrong."), NAME);
+                               rc = newtWinChoice(_("Warning"), _("OK"), _("Cancel"), message);
                                if (rc == 0 || rc == 1)
                                {
                                        if (changeaddress(kv, "GREEN", 0, ""))
@@ -693,23 +711,23 @@ int dnsgatewaymenu(void)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }
 
-       entries[DNS1].text = ctr[TR_PRIMARY_DNS];
+       entries[DNS1].text = _("Primary DNS:");
        strcpy(temp, ""); findkey(kv, "DNS1", temp);
        values[DNS1] = strdup(temp);
        entries[DNS1].value = &values[DNS1];
        entries[DNS1].flags = 0;
        
-       entries[DNS2].text = ctr[TR_SECONDARY_DNS];
+       entries[DNS2].text = _("Secondary DNS:");
        strcpy(temp, ""); findkey(kv, "DNS2", temp);
        values[DNS2] = strdup(temp);
        entries[DNS2].value = &values[DNS2];
        entries[DNS2].flags = 0;
        
-       entries[DEFAULT_GATEWAY].text = ctr[TR_DEFAULT_GATEWAY];
+       entries[DEFAULT_GATEWAY].text = _("Default gateway:");
        strcpy(temp, ""); findkey(kv, "DEFAULT_GATEWAY", temp);
        values[DEFAULT_GATEWAY] = strdup(temp);
        entries[DEFAULT_GATEWAY].value = &values[DEFAULT_GATEWAY];
@@ -723,17 +741,20 @@ int dnsgatewaymenu(void)
        {
                error = 0;
                
-               rc = newtWinEntries(ctr[TR_DNS_AND_GATEWAY_SETTINGS], 
-                       ctr[TR_DNS_AND_GATEWAY_SETTINGS_LONG], 50, 5, 5, 18, entries,
-                       ctr[TR_OK], ctr[TR_CANCEL], NULL);
+               rc = newtWinEntries(_("DNS and Gateway settings"),
+                       _("Enter the DNS and gateway information. "
+                       "These settings are used only with Static IP (and DHCP if DNS set) on the RED interface."),
+                       50, 5, 5, 18, entries, _("OK"), _("Cancel"), NULL);
                if (rc == 0 || rc == 1)
                {
-                       strcpy(message, ctr[TR_INVALID_FIELDS]);
+                       strcpy(message, _("The following fields are invalid:"));
+                       strcpy(message, "\n\n");
                        if (strlen(values[DNS1]))
                        {
                                if (inet_addr(values[DNS1]) == INADDR_NONE)
                                {
-                                       strcat(message, ctr[TR_PRIMARY_DNS_CR]);
+                                       strcat(message, _("Primary DNS"));
+                                       strcat(message, "\n");
                                        error = 1;
                                }
                        }
@@ -741,7 +762,8 @@ int dnsgatewaymenu(void)
                        {
                                if (inet_addr(values[DNS2]) == INADDR_NONE)
                                {
-                                       strcat(message, ctr[TR_SECONDARY_DNS_CR]);
+                                       strcat(message, _("Secondary DNS"));
+                                       strcat(message, "\n");
                                        error = 1;
                                }
                        }
@@ -749,13 +771,15 @@ int dnsgatewaymenu(void)
                        {
                                if (inet_addr(values[DEFAULT_GATEWAY]) == INADDR_NONE)
                                {
-                                       strcat(message, ctr[TR_DEFAULT_GATEWAY_CR]);
+                                       strcat(message, _("Default gateway"));
+                                       strcat(message, "\n");
                                        error = 1;
                                }
                        }
                        if (!strlen(values[DNS1]) && strlen(values[DNS2]))
                        {
-                               strcpy(message, ctr[TR_SECONDARY_WITHOUT_PRIMARY_DNS]);
+                               strcpy(message, _("Secondary DNS specified without a Primary DNS"));
+                               strcat(message, "\n");
                                error = 1;
                        }
 
similarity index 66%
rename from src/install+setup/setup/passwords.c
rename to src/setup/passwords.c
index f5a686b4891e27c88023c0bb799e85a8b16e667e..69f35529f36593223bda59bea3403c7848fce348 100644 (file)
  * 
  */
 
+// Translation
+#include <libintl.h>
+#define _(x) dgettext("setup", x)
+
 #include "setup.h"
 
 extern FILE *flog;
 extern char *mylog;
 
-extern char **ctr;
-
 extern int automode;
 
 int getpassword(char *password, char *text);
@@ -28,14 +30,13 @@ int handlerootpassword(void)
        char commandstring[STRING_SIZE];
                
        /* Root password. */
-       if (getpassword(password, ctr[TR_ENTER_ROOT_PASSWORD]) == 2)
+       if (getpassword(password, _("Enter the 'root' user password. Login as this user for commandline access.")) == 2)
                return 0;
        
        snprintf(commandstring, STRING_SIZE,
                "/bin/echo 'root:%s' | /usr/sbin/chpasswd", password);
-       if (runhiddencommandwithstatus(commandstring, ctr[TR_SETTING_ROOT_PASSWORD]))
-       {
-               errorbox(ctr[TR_PROBLEM_SETTING_ROOT_PASSWORD]);
+       if (runhiddencommandwithstatus(commandstring, _("Setting password"), _("Setting 'root' password...."), NULL)) {
+               errorbox(_("Problem setting 'root' password."));
                return 0;
        }
        
@@ -49,16 +50,16 @@ int handleadminpassword(void)
        char message[1000];
                
        /* web interface admin password. */
-       sprintf(message, ctr[TR_ENTER_ADMIN_PASSWORD], NAME, NAME);
+       sprintf(message, _("Enter %s 'admin' user password. "
+               "This is the user to use for logging into the %s web administration pages."), NAME, NAME);
        if (getpassword(password, message) == 2)
                return 0;
        
        snprintf(commandstring, STRING_SIZE,
                "/usr/sbin/htpasswd -c -m -b " CONFIG_ROOT "/auth/users admin '%s'", password);
-       sprintf(message, ctr[TR_SETTING_ADMIN_PASSWORD], NAME);
-       if (runhiddencommandwithstatus(commandstring, message))
-       {
-               sprintf(message, ctr[TR_PROBLEM_SETTING_ADMIN_PASSWORD], NAME);
+       sprintf(message, _("Setting %s 'admin' user password..."), NAME);
+       if (runhiddencommandwithstatus(commandstring, _("Setting password"), message, NULL)) {
+               sprintf(message, _("Problem setting %s 'admin' user password."), NAME);
                errorbox(message);
                return 0;
        }
@@ -72,8 +73,8 @@ int getpassword(char *password, char *text)
        char *values[] = {      NULL, NULL, NULL };     /* pointers for the values. */
        struct newtWinEntry entries[] =
        { 
-               { ctr[TR_PASSWORD_PROMPT], &values[0], 2 },
-               { ctr[TR_AGAIN_PROMPT], &values[1], 2 },
+               { _("Password:"), &values[0], 2 },
+               { _("Again:"), &values[1], 2 },
                { NULL, NULL, 0 }
        };
        char title[STRING_SIZE];
@@ -85,27 +86,27 @@ int getpassword(char *password, char *text)
                done = 1;
                sprintf (title, "%s %s - %s", NAME, VERSION, SLOGAN);
                rc = newtWinEntries(title, text,
-                       65, 5, 5, 50, entries, ctr[TR_OK], ctr[TR_CANCEL], NULL);
+                       65, 5, 5, 50, entries, _("OK"), _("Cancel"), NULL);
 
                if (rc != 2)
                {
                        if (strlen(values[0]) == 0 || strlen(values[1]) == 0)
                        {
-                               errorbox(ctr[TR_PASSWORD_CANNOT_BE_BLANK]);
+                               errorbox(_("Password cannot be blank."));
                                done = 0;
                                strcpy(values[0], "");
                                strcpy(values[1], "");
                        }
                        else if (strcmp(values[0], values[1]) != 0)
                        {
-                               errorbox(ctr[TR_PASSWORDS_DO_NOT_MATCH]);
+                               errorbox(_("Passwords do not match."));
                                done = 0;
                                strcpy(values[0], "");
                                strcpy(values[1], "");
                        }
                        else if (strchr(values[0], ' '))
                        {
-                               errorbox(ctr[TR_PASSWORD_CANNOT_CONTAIN_SPACES]);
+                               errorbox(_("Password cannot contain spaces."));
                                done = 0;
                                strcpy(values[0], "");
                                strcpy(values[1], "");
diff --git a/src/setup/po/LINGUAS b/src/setup/po/LINGUAS
new file mode 100644 (file)
index 0000000..7673daa
--- /dev/null
@@ -0,0 +1 @@
+de
diff --git a/src/setup/po/Makevars b/src/setup/po/Makevars
new file mode 100644 (file)
index 0000000..cf8c600
--- /dev/null
@@ -0,0 +1,41 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = The IPFire Project (www.ipfire.org)
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS =
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
diff --git a/src/setup/po/POTFILES.in b/src/setup/po/POTFILES.in
new file mode 100644 (file)
index 0000000..675adda
--- /dev/null
@@ -0,0 +1,11 @@
+dhcp.c
+domainname.c
+hostname.c
+keymap.c
+main.c
+misc.c
+netstuff.c
+networking.c
+passwords.c
+setup.h
+timezone.c
diff --git a/src/setup/po/de.po b/src/setup/po/de.po
new file mode 100644 (file)
index 0000000..2aab9e1
--- /dev/null
@@ -0,0 +1,582 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR The IPFire Project (www.ipfire.org)
+# This file is distributed under the same license as the PACKAGE package.
+# 
+# Translators:
+# Michael Tremer <michael.tremer@ipfire.org>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: IPFire Project\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-08-12 10:05+0000\n"
+"PO-Revision-Date: 2014-08-12 10:10+0000\n"
+"Last-Translator: Michael Tremer <michael.tremer@ipfire.org>\n"
+"Language-Team: German (http://www.transifex.com/projects/p/ipfire/language/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: dhcp.c:50
+msgid "Start address:"
+msgstr ""
+
+#: dhcp.c:51
+msgid "End address:"
+msgstr ""
+
+#: dhcp.c:52 networking.c:718
+msgid "Primary DNS:"
+msgstr "Primärer DNS:"
+
+#: dhcp.c:53 networking.c:724
+msgid "Secondary DNS:"
+msgstr "Sekundärer DNS:"
+
+#: dhcp.c:54
+msgid "Default lease (mins):"
+msgstr ""
+
+#: dhcp.c:55
+msgid "Max lease (mins):"
+msgstr ""
+
+#: dhcp.c:56
+msgid "Domain name suffix:"
+msgstr ""
+
+#: dhcp.c:86 dhcp.c:93 dhcp.c:101 domainname.c:34 hostname.c:37 keymap.c:70
+#: misc.c:40 misc.c:52 netstuff.c:377 netstuff.c:566 netstuff.c:704
+#: networking.c:134 networking.c:255 networking.c:292 networking.c:347
+#: networking.c:443 networking.c:553 networking.c:604 networking.c:611
+#: networking.c:714 timezone.c:63
+msgid "Unable to open settings file"
+msgstr ""
+
+#: dhcp.c:111
+msgid "DHCP server configuration"
+msgstr ""
+
+#: dhcp.c:116
+msgid "Configure the DHCP server by entering the settings information."
+msgstr ""
+
+#: dhcp.c:125
+msgid "Enabled"
+msgstr ""
+
+#: dhcp.c:142 domainname.c:43 hostname.c:47 keymap.c:86 main.c:119 main.c:192
+#: main.c:194 netstuff.c:157 netstuff.c:733 netstuff.c:756 networking.c:163
+#: networking.c:270 networking.c:306 networking.c:410 networking.c:561
+#: networking.c:643 networking.c:654 networking.c:747 passwords.c:89
+#: timezone.c:78
+msgid "OK"
+msgstr "OK"
+
+#: dhcp.c:143 domainname.c:43 hostname.c:47 keymap.c:86 netstuff.c:158
+#: netstuff.c:673 netstuff.c:733 netstuff.c:756 networking.c:306
+#: networking.c:411 networking.c:561 networking.c:654 networking.c:747
+#: passwords.c:89 timezone.c:78
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: dhcp.c:156
+msgid ""
+"The following fields are invalid:\n"
+"\n"
+msgstr ""
+
+#: dhcp.c:159
+msgid "Start address"
+msgstr "Startadresse"
+
+#: dhcp.c:165
+msgid "End address"
+msgstr "Endadresse"
+
+#: dhcp.c:173 networking.c:756
+msgid "Primary DNS"
+msgstr "Primärer DNS"
+
+#: dhcp.c:182 networking.c:765
+msgid "Secondary DNS"
+msgstr ""
+
+#: dhcp.c:189
+msgid "Default lease time"
+msgstr ""
+
+#: dhcp.c:195
+msgid "Max. lease time"
+msgstr ""
+
+#: domainname.c:42 main.c:90
+msgid "Domain name"
+msgstr ""
+
+#: domainname.c:42
+msgid "Enter Domain name"
+msgstr ""
+
+#: domainname.c:48
+msgid "Domain name cannot be empty."
+msgstr ""
+
+#: domainname.c:50
+msgid "Domain name cannot contain spaces."
+msgstr ""
+
+#: domainname.c:53
+msgid "Domain name may only contain letters, numbers, hyphens and periods."
+msgstr ""
+
+#: hostname.c:46 main.c:89
+msgid "Hostname"
+msgstr "Hostname"
+
+#: hostname.c:46
+msgid "Enter the machine's hostname."
+msgstr ""
+
+#: hostname.c:53
+msgid "Hostname cannot be empty."
+msgstr ""
+
+#: hostname.c:55
+msgid "Hostname cannot contain spaces."
+msgstr ""
+
+#: hostname.c:58
+msgid "Hostname may only contain letters, numbers and hyphens."
+msgstr ""
+
+#: keymap.c:84 main.c:87
+msgid "Keyboard mapping"
+msgstr ""
+
+#: keymap.c:85
+msgid "Choose the type of keyboard you are using from the list below."
+msgstr ""
+
+#: main.c:88 timezone.c:77
+msgid "Timezone"
+msgstr "Zeitzone"
+
+#: main.c:91 networking.c:110 networking.c:115 networking.c:448
+msgid "Networking"
+msgstr "Netzwerk"
+
+#: main.c:92 misc.c:147
+msgid "ISDN"
+msgstr "ISDN"
+
+#: main.c:93
+msgid "'root' password"
+msgstr ""
+
+#: main.c:94
+msgid "'admin' password"
+msgstr ""
+
+#: main.c:110
+msgid "              <Tab>/<Alt-Tab> between elements   |  <Space> selects"
+msgstr ""
+
+#: main.c:117
+msgid "Section menu"
+msgstr ""
+
+#: main.c:118
+msgid "Select the item you wish to configure."
+msgstr ""
+
+#: main.c:119
+msgid "Quit"
+msgstr "Beenden"
+
+#: main.c:192
+msgid "Setup is complete."
+msgstr ""
+
+#: main.c:194 netstuff.c:733 networking.c:561 networking.c:654
+msgid "Warning"
+msgstr "Warnung"
+
+#: main.c:195
+msgid ""
+"Initial setup was not entirely complete. You must ensure that Setup is "
+"properly finished by running setup again at the shell."
+msgstr ""
+
+#: misc.c:62
+#, c-format
+msgid "Unable to write %s/main/hostname.conf"
+msgstr ""
+
+#: misc.c:71
+msgid "Unable to open main hosts file."
+msgstr ""
+
+#: misc.c:76
+msgid "Unable to write /etc/hosts."
+msgstr ""
+
+#: misc.c:117
+msgid "Unable to write /etc/hosts.deny."
+msgstr ""
+
+#: misc.c:125
+msgid "Unable to write /etc/hosts.allow."
+msgstr ""
+
+#: misc.c:136
+msgid "Unable to set hostname."
+msgstr ""
+
+#: misc.c:147
+msgid "Scanning and configuring ISDN devices."
+msgstr ""
+
+#: misc.c:148
+msgid "Unable to scan for ISDN devices."
+msgstr ""
+
+#: netstuff.c:86
+#, c-format
+msgid "Interface - %s"
+msgstr ""
+
+#: netstuff.c:91
+#, c-format
+msgid "Enter the IP address information for the %s interface."
+msgstr ""
+
+#: netstuff.c:103
+msgid "Static"
+msgstr ""
+
+#: netstuff.c:104
+msgid "DHCP"
+msgstr ""
+
+#: netstuff.c:105
+msgid "PPP DIALUP (PPPoE, modem, ATM ...)"
+msgstr ""
+
+#: netstuff.c:113
+msgid "DHCP Hostname:"
+msgstr ""
+
+#: netstuff.c:115
+msgid "Force DHCP MTU:"
+msgstr ""
+
+#: netstuff.c:134
+msgid "IP address:"
+msgstr ""
+
+#: netstuff.c:146
+msgid "Network mask:"
+msgstr ""
+
+#: netstuff.c:173 networking.c:750
+msgid "The following fields are invalid:"
+msgstr ""
+
+#: netstuff.c:183
+msgid "IP address"
+msgstr ""
+
+#: netstuff.c:189
+msgid "Network mask"
+msgstr ""
+
+#: netstuff.c:198
+msgid "DHCP hostname"
+msgstr ""
+
+#: netstuff.c:396 netstuff.c:709
+msgid "Unset"
+msgstr ""
+
+#: netstuff.c:669
+#, c-format
+msgid "Please choose a networkcard for the following interface - %s."
+msgstr ""
+
+#: netstuff.c:672
+msgid "Extended Network Menu"
+msgstr ""
+
+#: netstuff.c:673 networking.c:521
+msgid "Select"
+msgstr ""
+
+#: netstuff.c:673
+msgid "Identify"
+msgstr ""
+
+#: netstuff.c:678
+msgid "Device Identification"
+msgstr ""
+
+#: netstuff.c:678
+msgid "The lights on the selected port should flash now for 10 seconds..."
+msgstr ""
+
+#: netstuff.c:679
+msgid "Identification is not supported by this interface."
+msgstr ""
+
+#: netstuff.c:691
+msgid "There are no unassigned interfaces on your system."
+msgstr ""
+
+#: netstuff.c:732
+#, c-format
+msgid "Do you really want to remove the assigned %s interface?"
+msgstr ""
+
+#: netstuff.c:755
+msgid "Select network driver"
+msgstr ""
+
+#: netstuff.c:755
+msgid "Set additional module parameters"
+msgstr ""
+
+#: netstuff.c:762
+msgid "Loading module..."
+msgstr ""
+
+#: netstuff.c:777
+msgid "Unable to load driver module."
+msgstr ""
+
+#: netstuff.c:780
+msgid "Module name cannot be blank."
+msgstr ""
+
+#: networking.c:110
+msgid "Stopping network..."
+msgstr ""
+
+#: networking.c:115
+msgid "Restarting network..."
+msgstr ""
+
+#: networking.c:146
+msgid "No GREEN interface assigned."
+msgstr ""
+
+#: networking.c:152
+msgid "Missing an IP address on GREEN."
+msgstr ""
+
+#: networking.c:163
+msgid "Error"
+msgstr ""
+
+#: networking.c:163
+msgid "Ignore"
+msgstr ""
+
+#: networking.c:164
+msgid "No RED interface assigned."
+msgstr ""
+
+#: networking.c:173
+msgid "Missing an IP address on RED."
+msgstr ""
+
+#: networking.c:183
+msgid "No ORANGE interface assigned."
+msgstr ""
+
+#: networking.c:189
+msgid "Missing an IP address on ORANGE."
+msgstr ""
+
+#: networking.c:199
+msgid "No BLUE interface assigned."
+msgstr ""
+
+#: networking.c:205
+msgid "Missing an IP address on BLUE."
+msgstr ""
+
+#: networking.c:217
+msgid "Misssing DNS."
+msgstr ""
+
+#: networking.c:224
+msgid "Missing Default Gateway."
+msgstr ""
+
+#: networking.c:237 networking.c:305
+msgid "Network configuration type"
+msgstr ""
+
+#: networking.c:238 networking.c:410
+msgid "Drivers and card assignments"
+msgstr ""
+
+#: networking.c:239 networking.c:641
+msgid "Address settings"
+msgstr ""
+
+#: networking.c:240 networking.c:744
+msgid "DNS and Gateway settings"
+msgstr ""
+
+#: networking.c:260
+msgid "When configuration is complete, a network restart will be required."
+msgstr ""
+
+#: networking.c:267
+#, c-format
+msgid "Current config: %s%s"
+msgstr ""
+
+#: networking.c:269
+msgid "Network configuration menu"
+msgstr ""
+
+#: networking.c:270 networking.c:521 networking.c:643
+msgid "Done"
+msgstr ""
+
+#: networking.c:301
+#, c-format
+msgid ""
+"Select the network configuration for %s. The following configuration types "
+"list those interfaces which have ethernet attached. If you change this "
+"setting, a network restart will be required, and you will have to "
+"reconfigure the network driver assignments."
+msgstr ""
+
+#: networking.c:308
+#, c-format
+msgid ""
+"Not enough netcards for your choice.\n"
+"\n"
+"Needed: %d - Available: %d\n"
+msgstr ""
+
+#: networking.c:360
+msgid ""
+"Configure network drivers, and which interface each card is assigned to. The current configuration is as follows:\n"
+"\n"
+msgstr ""
+
+#: networking.c:409
+msgid "Do you wish to change these settings?"
+msgstr ""
+
+#: networking.c:448
+msgid "Restarting non-local network..."
+msgstr ""
+
+#: networking.c:465
+msgid ""
+"Please choose the interface you wish to change.\n"
+"\n"
+msgstr ""
+
+#: networking.c:520
+msgid "Assigned Cards"
+msgstr ""
+
+#: networking.c:521
+msgid "Remove"
+msgstr ""
+
+#: networking.c:557 networking.c:650
+#, c-format
+msgid ""
+"If you change this IP address, and you are logged in remotely, your "
+"connection to the %s machine will be broken, and you will have to reconnect "
+"on the new IP. This is a risky operation, and should only be attempted if "
+"you have physical access to the machine, should something go wrong."
+msgstr ""
+
+#: networking.c:642
+msgid "Select the interface you wish to reconfigure."
+msgstr ""
+
+#: networking.c:730
+msgid "Default gateway:"
+msgstr ""
+
+#: networking.c:745
+msgid ""
+"Enter the DNS and gateway information. These settings are used only with "
+"Static IP (and DHCP if DNS set) on the RED interface."
+msgstr ""
+
+#: networking.c:774
+msgid "Default gateway"
+msgstr ""
+
+#: networking.c:781
+msgid "Secondary DNS specified without a Primary DNS"
+msgstr ""
+
+#: passwords.c:33
+msgid ""
+"Enter the 'root' user password. Login as this user for commandline access."
+msgstr ""
+
+#: passwords.c:38 passwords.c:61
+msgid "Setting password"
+msgstr ""
+
+#: passwords.c:38
+msgid "Setting 'root' password...."
+msgstr ""
+
+#: passwords.c:39
+msgid "Problem setting 'root' password."
+msgstr ""
+
+#: passwords.c:53
+#, c-format
+msgid ""
+"Enter %s 'admin' user password. This is the user to use for logging into the"
+" %s web administration pages."
+msgstr ""
+
+#: passwords.c:60
+#, c-format
+msgid "Setting %s 'admin' user password..."
+msgstr ""
+
+#: passwords.c:62
+#, c-format
+msgid "Problem setting %s 'admin' user password."
+msgstr ""
+
+#: passwords.c:76
+msgid "Password:"
+msgstr ""
+
+#: passwords.c:77
+msgid "Again:"
+msgstr ""
+
+#: passwords.c:95
+msgid "Password cannot be blank."
+msgstr ""
+
+#: passwords.c:102
+msgid "Passwords do not match."
+msgstr ""
+
+#: passwords.c:109
+msgid "Password cannot contain spaces."
+msgstr ""
+
+#: timezone.c:77
+msgid "Choose the timezone you are in from the list below."
+msgstr ""
diff --git a/src/setup/setup.h b/src/setup/setup.h
new file mode 100644 (file)
index 0000000..388d2ed
--- /dev/null
@@ -0,0 +1,87 @@
+/* SmoothWall setup program.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence.  See the file COPYING for details.
+ *
+ * (c) Lawrence Manning, 2001
+ * Main include file.
+ * 
+ * $Id: setup.h,v 1.4 2003/12/11 11:25:54 riddles Exp $
+ * 
+ */
+
+#include <newt.h>
+#include <libsmooth.h>
+
+/* hostname.c */
+int handlehostname(void);
+
+/* domainname.c */
+int handledomainname(void);
+
+/* networking.c */
+int handlenetworking(void);
+
+/* dhcp.c */
+int handledhcp(void);
+
+/* passwords.c */
+int handlerootpassword(void);
+int handlesetuppassword(void);
+int handleadminpassword(void);
+
+/* misc.c */
+int writehostsfiles(void);
+int handleisdn(void);
+
+/* keymap.c */
+int handlekeymap(void);
+
+/* timezone.c */
+int handletimezone(void);
+
+/* netstuff.c */
+#define ADDRESS 0
+#define NETADDRESS 1
+#define NETMASK 2
+#define DHCP 3
+#define NETCHANGE_TOTAL 4
+
+#define SCANNED_NICS "/var/ipfire/ethernet/scanned_nics"
+#define SYSDIR "/sys/class/net"
+
+#define _GREEN_CARD_ 0
+#define _RED_CARD_ 1
+#define _ORANGE_CARD_ 2
+#define _BLUE_CARD_ 3
+
+struct nic
+{
+       char driver[80];
+       char description[256];
+       char macaddr[20];
+       char nic[20];
+};
+
+struct knic
+{
+       char driver[80];
+       char description[256];
+       char macaddr[20];
+       char colour[20];
+};
+
+int changeaddress(struct keyvalue *kv, char *colour, int typeflag,
+       char *defaultdhcphostname);
+int gettype(char *type);
+int setnetaddress(struct keyvalue *kv, char *colour);
+void networkdialogcallbacktype(newtComponent cm, void *data);
+int interfacecheck(struct keyvalue *kv, char *colour);
+int rename_nics(void);
+int init_knics(void);
+int create_udev(void);
+int scan_network_cards(void);
+int nicmenu(int colour);
+int clear_card_entry(int cards);
+int ask_clear_card_entry(int cards);
+int manualdriver(char *driver, char *driveroptions);
similarity index 90%
rename from src/install+setup/setup/timezone.c
rename to src/setup/timezone.c
index d0a848378b1ee7cdea515df9ae5bb96edb898c75..619ebf26ae53639bd8bf7f7f6674bb4d876c6fad 100644 (file)
  * 
  */
 
+// Translation
+#include <libintl.h>
+#define _(x) dgettext("setup", x)
+
 #include "setup.h"
  
 extern FILE *flog;
 extern char *mylog;
 
-extern char **ctr;
-
 extern int automode;
 
 #define MAX_FILENAMES 5000
@@ -58,7 +60,7 @@ int handletimezone(void)
        if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings")))
        {
                freekeyvalues(kv);
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               errorbox(_("Unable to open settings file"));
                return 0;
        }       
        
@@ -72,8 +74,8 @@ int handletimezone(void)
                        choice = c;
        }
        
-       rc = newtWinMenu(ctr[TR_TIMEZONE], ctr[TR_TIMEZONE_LONG], 50, 5, 5, 6, displaynames, &choice,
-               ctr[TR_OK], ctr[TR_CANCEL], NULL);
+       rc = newtWinMenu(_("Timezone"), _("Choose the timezone you are in from the list below."),
+               50, 5, 5, 6, displaynames, &choice, _("OK"), _("Cancel"), NULL);
 
        strcpy(timezone, filenames[choice]);