http://www.uw-madison.lkams.kernel.org/pub/mirrors/fink/distfiles/xscreensaver-4...
authorZygo Blaxell <zblaxell@hungrycats.org>
Mon, 2 Mar 2009 05:43:07 +0000 (00:43 -0500)
committerZygo Blaxell <zblaxell@faye.furryterror.org>
Fri, 8 Feb 2013 17:54:03 +0000 (12:54 -0500)
-rw-r--r-- 1 zblaxell zblaxell 3744413 Sep  3  2003 xscreensaver-4.11.tar.gz
35ed2910975fe5fd565f48519b90ba6c47726145  xscreensaver-4.11.tar.gz

103 files changed:
Makefile.in
README
configure
configure.in
driver/Makefile.in
driver/XScreenSaver.ad.in
driver/XScreenSaver_ad.h
driver/demo-Gtk-support.c
driver/demo-Gtk-widgets.c
driver/demo-Gtk.c
driver/demo-Xm-widgets.c
driver/demo-Xm.c
driver/lock.c
driver/passwd-kerberos.c
driver/passwd-pam.c
driver/prefs.c
driver/subprocs.c
driver/xscreensaver-command.man
driver/xscreensaver-demo.glade
driver/xscreensaver-demo.glade2
driver/xscreensaver-demo.man
driver/xscreensaver-getimage-file.man
driver/xscreensaver-getimage-video.man
driver/xscreensaver-getimage.man
driver/xscreensaver.c
driver/xscreensaver.h
driver/xscreensaver.man
hacks/Makefile.in
hacks/bsod.c
hacks/cloudlife.c
hacks/cloudlife.man [new file with mode: 0644]
hacks/config/README
hacks/config/blocktube.xml [new file with mode: 0644]
hacks/config/cloudlife.xml
hacks/config/cubestorm.xml [new file with mode: 0644]
hacks/config/engine.xml
hacks/config/flyingtoasters.xml
hacks/config/glknots.xml [new file with mode: 0644]
hacks/config/glmatrix.xml [new file with mode: 0644]
hacks/config/glslideshow.xml
hacks/config/hypertorus.xml [new file with mode: 0644]
hacks/config/xmatrix.xml
hacks/glx/Makefile.in
hacks/glx/blocktube.c [new file with mode: 0644]
hacks/glx/blocktube.man [new file with mode: 0644]
hacks/glx/cubestorm.c [new file with mode: 0644]
hacks/glx/cubestorm.man [new file with mode: 0644]
hacks/glx/dangerball.c
hacks/glx/engine.c
hacks/glx/engine.man
hacks/glx/flurry.h
hacks/glx/fps.c
hacks/glx/glknots.c [new file with mode: 0644]
hacks/glx/glknots.man [new file with mode: 0644]
hacks/glx/glmatrix.c [new file with mode: 0644]
hacks/glx/glmatrix.man [new file with mode: 0644]
hacks/glx/glslideshow.c
hacks/glx/glslideshow.man
hacks/glx/glsnake.c
hacks/glx/gltext.c
hacks/glx/hypertorus.c [new file with mode: 0644]
hacks/glx/hypertorus.man [new file with mode: 0644]
hacks/glx/jigglypuff.c
hacks/glx/klein.c
hacks/glx/molecule.c
hacks/glx/tube.c
hacks/glx/tube.h
hacks/glx/xpm-ximage.c
hacks/ifs.c
hacks/images/blocktube.xpm [new file with mode: 0644]
hacks/images/matrix0.xbm [deleted file]
hacks/images/matrix0.xpm [deleted file]
hacks/images/matrix0b.xbm [deleted file]
hacks/images/matrix0b.xpm [deleted file]
hacks/images/matrix3.xpm [new file with mode: 0644]
hacks/moire.man
hacks/screenhack.c
hacks/sonar.c
hacks/whirlygig.c
hacks/xlockmore.h
hacks/xmatrix.c
hacks/xmatrix.man
po/POTFILES.in
po/es.po
po/ja.po
po/ko.po
utils/Makefile.in
utils/images/screensaver-cmndln.png [new file with mode: 0644]
utils/images/screensaver-cmndln.xpm [deleted file]
utils/images/screensaver-colorselector.png [new file with mode: 0644]
utils/images/screensaver-colorselector.xpm [deleted file]
utils/images/screensaver-diagnostic.png [new file with mode: 0644]
utils/images/screensaver-diagnostic.xpm [deleted file]
utils/images/screensaver-locking.png [new file with mode: 0644]
utils/images/screensaver-locking.xpm [deleted file]
utils/images/screensaver-power.png [new file with mode: 0644]
utils/images/screensaver-power.xpm [deleted file]
utils/images/screensaver-snap.png [new file with mode: 0644]
utils/images/screensaver-snap.xpm [deleted file]
utils/version.h
xscreensaver.lsm
xscreensaver.lsm.sh
xscreensaver.spec

index 5711b06321b6a5e1e60fdb2db8bdebcda4069c4b..f6f2efb57659ed5f86f3c872f704aafa6ad0e2f6 100644 (file)
@@ -155,6 +155,10 @@ bump-version::
   echo "overwrote $$SRC";                                                  \
   ls -lFd $$SRC
 
+bump_version:: bump-version
+tick-version:: bump-version
+tick_version:: bump-version
+
 update_spec_version::
        @S=$(srcdir)/xscreensaver.spec ;                                    \
        U=$(srcdir)/utils/version.h ;                                       \
@@ -307,3 +311,12 @@ www::
   fi ;                                                                     \
                                                                            \
   cvs commit -m "$$VERS"
+
+count::
+       @ \
+  echo -n "Current hack count: " ; \
+  ( ( cd hacks;     make -s INSTALL=true install-program install-scripts ) ; \
+    ( cd hacks/glx; make -s INSTALL=true install-program ) ) | \
+    grep true | \
+    grep -v helper | \
+    wc -l
diff --git a/README b/README
index 9f7aa97a1d57701848840a3aa9107231f8b944a8..7f656b94b9d97593884e4d157bb1164e625dd559 100644 (file)
--- a/README
+++ b/README
@@ -59,7 +59,7 @@ there's no need to recompile or reinstall anything.
 Along with the xscreensaver daemon itself, this package also includes
 numerous graphics hacks for use as screensavers.  There is nothing
 magic about these: they are just programs that draw on the root window.
-More than 150 such programs are included.  For details, see the
+More than 160 such programs are included.  For details, see the
 xscreensaver web page, or the enclosed manual pages.
 
 The latest version of xscreensaver is always available on the web at
@@ -70,12 +70,21 @@ the XScreenSaver FAQ about that: http://www.jwz.org/xscreensaver/faq.html
 
                               ============
 
+Changes since 4.10:   * New hacks, `hypertorus', `cubestorm', `glknots',
+                        `blocktube', and `glmatrix'.
+                      * Updates to `cloudlife', `engine', `xmatrix', and
+                        `sonar'.
+                      * Rewrote `glslideshow': it should work on somewhat
+                        wimpier video cards now.
+                      * Various portability tweaks.
 Changes since 4.09:   * New hacks, `cloudlife' and `klein'.
                       * Added Apple ][+, HPUX, and OS/390 sessions to BSOD.
                       * Added some Matrix Reloaded text to `xmatrix'.
                       * Updates to `webcollage', `eruption', `jigglypuff',
                         `metaballs', and `endgame'.
-                      * Completely ignore the `memoryLimit' setting now.
+                      * Completely ignore the `memoryLimit' setting now,
+                        since it was still causing people GL grief.
+                      * Various minor fixes.
 Changes since 4.08:   * New hacks, `flyingtoasters', `bouncingcow',
                         `jigglypuff', and `glslideshow'.
                       * More models in `engine'.
index a3ee8c5d4776c598fd0acd656f011de81136d63d..fc5b9fddab278a82f224ca3a785a6277a009cb99 100755 (executable)
--- a/configure
+++ b/configure
@@ -6050,7 +6050,7 @@ case "$host" in
       #
       if test -f /usr/dt/include/Xm/Xm.h ; then
         X_CFLAGS="$X_CFLAGS -I/usr/dt/include"
-        X_LIBS="$X_LIBS -L/usr/dt/lib -R:/usr/dt/lib"
+        MOTIF_LIBS="$MOTIF_LIBS -L/usr/dt/lib -R/usr/dt/lib"
 
         # Some versions of Slowlaris Motif require -lgen.  But not all.  Why?
         echo "$as_me:$LINENO: checking for regcmp in -lgen" >&5
@@ -6109,7 +6109,7 @@ fi
 echo "$as_me:$LINENO: result: $ac_cv_lib_gen_regcmp" >&5
 echo "${ECHO_T}$ac_cv_lib_gen_regcmp" >&6
 if test $ac_cv_lib_gen_regcmp = yes; then
-  X_LIBS="$X_LIBS -lgen"
+  MOTIF_LIBS="$MOTIF_LIBS -lgen"
 fi
 
       fi
@@ -9362,6 +9362,7 @@ else
 #line $LINENO "configure"
 #include "confdefs.h"
 #include <X11/Xlib.h>
+                    #include <X11/Xmd.h>
 
 #include <X11/extensions/dpms.h>
 _ACEOF
@@ -11151,16 +11152,115 @@ _ACEOF
   fi
 
   if test "$ac_cv_kerberos5" = yes ; then
-    have_kerberos=yes
-    have_kerberos5=yes
-    cat >>confdefs.h <<\_ACEOF
+
+    # Andrew Snare <ajs@pigpond.com> wrote:
+    #
+    # You were assuming that if kerberosV (krb5) was found, then kerberosIV
+    # (krb4) was also available.  This turns out not to be the case with
+    # mit-krb-1.2.7; apparently backwards-compatibility with KerberosIV
+    # is optional.
+    #
+    # So, disable kerberosV support if libkrb4 can't be found.
+    # This is not the best solution, but it makes the compile not fail.
+    #
+
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+  echo "$as_me:$LINENO: checking for krb_get_tf_realm in -lkrb4" >&5
+echo $ECHO_N "checking for krb_get_tf_realm in -lkrb4... $ECHO_C" >&6
+if test "${ac_cv_lib_krb4_krb_get_tf_realm+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lkrb4  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char krb_get_tf_realm ();
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+krb_get_tf_realm ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_krb4_krb_get_tf_realm=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_krb4_krb_get_tf_realm=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_krb4_krb_get_tf_realm" >&5
+echo "${ECHO_T}$ac_cv_lib_krb4_krb_get_tf_realm" >&6
+if test $ac_cv_lib_krb4_krb_get_tf_realm = yes; then
+  have_kerberos=yes
+else
+  have_kerberos=no
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+
+    if test "$have_kerberos" = yes ; then
+      have_kerberos5=yes
+      cat >>confdefs.h <<\_ACEOF
 #define HAVE_KERBEROS 1
 _ACEOF
 
-    cat >>confdefs.h <<\_ACEOF
+      cat >>confdefs.h <<\_ACEOF
 #define HAVE_KERBEROS5 1
 _ACEOF
 
+    else
+      have_kerberos5=no
+      { echo "$as_me:$LINENO: WARNING: Cannot find compat lib (libkrb4) needed to use Kerberos 5" >&5
+echo "$as_me: WARNING: Cannot find compat lib (libkrb4) needed to use Kerberos 5" >&2;}
+    fi
+
   fi
 
   if test "$have_kerberos5" = yes ; then
@@ -12684,7 +12784,6 @@ done
     # the new way...
     # run pkg-config based tests.
     #
-
     pkgs=''
     pkg_check_version() {
       if test "$ok" = yes ; then
@@ -12714,11 +12813,15 @@ echo "${ECHO_T}no" >&6
       fi
     }
 
+    echo "$as_me:$LINENO: result: checking for GTK 2.x with pkg-config based tests..." >&5
+echo "${ECHO_T}checking for GTK 2.x with pkg-config based tests..." >&6
+
     ok="yes"
-    pkg_check_version     gtk+-2.0  2.0.1  ; ac_gtk_version_string="$vers"
-    pkg_check_version  gmodule-2.0  2.0.0
-    pkg_check_version   libxml-2.0  2.4.6
-    pkg_check_version libglade-2.0  1.99.0
+    pkg_check_version       gtk+-2.0  2.0.1  ; ac_gtk_version_string="$vers"
+    pkg_check_version    gmodule-2.0  2.0.0
+    pkg_check_version     libxml-2.0  2.4.6
+    pkg_check_version   libglade-2.0  1.99.0
+#   pkg_check_version gdk_pixbuf      0.1
     have_gtk="$ok"
 
     if test "$have_gtk" = yes; then
@@ -12738,10 +12841,14 @@ _ACEOF
       #
       # we don't have GTK 2.  Let's look for GTK 1.
       #
+      echo "$as_me:$LINENO: result: checking for GTK 1.x with pkg-config based tests..." >&5
+echo "${ECHO_T}checking for GTK 1.x with pkg-config based tests..." >&6
+
       pkgs=''
       ok="yes"
-      pkg_check_version gtk+ 1.2           ; ac_gtk_version_string="$vers"
-      pkg_check_version glib 1.0
+      pkg_check_version gtk+       1.2     ; ac_gtk_version_string="$vers"
+      pkg_check_version glib       1.0
+      pkg_check_version gdk_pixbuf 0.1
       have_gtk="$ok"
 
       # Now check for Gnome...
@@ -12803,6 +12910,8 @@ echo "${ECHO_T}$ac_cv_gtk_config_libs" >&6
     # the old way...
     # run {gnome,gtk}-config based tests.
     #
+    echo "$as_me:$LINENO: result: checking for GTK 1.x with gtk-config based tests..." >&5
+echo "${ECHO_T}checking for GTK 1.x with gtk-config based tests..." >&6
 
     for ac_prog in glib12-config glib-config
 do
@@ -14760,7 +14869,7 @@ if test "${ac_cv_mesagl_version_string+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 14769 "configure"
+#line 14878 "configure"
 #include "confdefs.h"
 #include <GL/gl.h>
 #ifndef MESA_MAJOR_VERSION
@@ -15668,6 +15777,8 @@ if test "$with_gdk_pixbuf" = yes; then
       #
       # we don't have Gtk; or we have Gtk 2.x.  Check for pixbuf 2.x.
       #
+      echo "$as_me:$LINENO: result: checking for gdk_pixbuf 2.x with gtk-config based tests..." >&5
+echo "${ECHO_T}checking for gdk_pixbuf 2.x with gtk-config based tests..." >&6
       pkg_check_version gdk-pixbuf-2.0      2.0.0
       pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
       have_gdk_pixbuf="$ok"
@@ -15682,8 +15793,10 @@ if test "$with_gdk_pixbuf" = yes; then
       if test "$have_gdk_pixbuf2" = no; then
         pkgs=''
         ok="yes"
-        pkg_check_version gdk-pixbuf      0.0
-        pkg_check_version gdk-pixbuf-xlib 0.0
+      echo "$as_me:$LINENO: result: checking for gdk_pixbuf 1.x with gtk-config based tests..." >&5
+echo "${ECHO_T}checking for gdk_pixbuf 1.x with gtk-config based tests..." >&6
+        pkg_check_version gdk_pixbuf      0.0
+        pkg_check_version gdk_pixbuf_xlib 0.0
         have_gdk_pixbuf="$ok"
       fi
     fi
@@ -15722,6 +15835,9 @@ echo "${ECHO_T}$ac_cv_gdk_pixbuf_config_libs" >&6
     # pkg-config exists, but doesn't know about pixbuf.
     #
 
+   echo "$as_me:$LINENO: result: checking for gdk_pixbuf with gdk-pixbuf-config based tests..." >&5
+echo "${ECHO_T}checking for gdk_pixbuf with gdk-pixbuf-config based tests..." >&6
+
     # if the user specified --with-gtk=/foo/ or --with-gnome=/foo/ then
     # look in /foo/bin/ for for gdk-pixbuf-config.
     #
@@ -19637,7 +19753,7 @@ if test "$do_dir_warning" = yes; then
   echo '      "xscreensaver-demo", and "xscreensaver-command" executables'
   echo "      will be installed in ${bindir}/."
   echo ""
-  echo "      The various graphics demos (150+ different executables) will"
+  echo "      The various graphics demos (160+ different executables) will"
   echo "      be installed in ${HACKDIR}/."
   echo ""
   echo "      If you would prefer the demos to be installed elsewhere,"
index a2337930bf8e0668a97638a65bcb402ab766d9e0..411df4ac1634fea83052970c530561b8f742b1e7 100644 (file)
@@ -617,10 +617,10 @@ AC_DEFUN(AC_X_RANDOM_PATHS,
       #
       if test -f /usr/dt/include/Xm/Xm.h ; then
         X_CFLAGS="$X_CFLAGS -I/usr/dt/include"
-        X_LIBS="$X_LIBS -L/usr/dt/lib -R:/usr/dt/lib"
+        MOTIF_LIBS="$MOTIF_LIBS -L/usr/dt/lib -R/usr/dt/lib"
 
         # Some versions of Slowlaris Motif require -lgen.  But not all.  Why?
-        AC_CHECK_LIB(gen, regcmp, [X_LIBS="$X_LIBS -lgen"])
+        AC_CHECK_LIB(gen, regcmp, [MOTIF_LIBS="$MOTIF_LIBS -lgen"])
       fi
 
     ;;
@@ -1180,7 +1180,8 @@ if test "$with_dpms" = yes; then
 
   # first check for dpms.h
   AC_CHECK_X_HEADER(X11/extensions/dpms.h, [have_dpms=yes],,
-                    [#include <X11/Xlib.h>])
+                    [#include <X11/Xlib.h>
+                    #include <X11/Xmd.h>])
 
   # if that succeeded, then check for the DPMS code in the libraries
   if test "$have_dpms" = yes; then
@@ -1591,10 +1592,29 @@ if test "$enable_locking" = yes -a "$with_kerberos" = yes; then
   fi
 
   if test "$ac_cv_kerberos5" = yes ; then
-    have_kerberos=yes
-    have_kerberos5=yes
-    AC_DEFINE(HAVE_KERBEROS)
-    AC_DEFINE(HAVE_KERBEROS5)
+
+    # Andrew Snare <ajs@pigpond.com> wrote:
+    #
+    # You were assuming that if kerberosV (krb5) was found, then kerberosIV
+    # (krb4) was also available.  This turns out not to be the case with
+    # mit-krb-1.2.7; apparently backwards-compatibility with KerberosIV
+    # is optional.
+    #
+    # So, disable kerberosV support if libkrb4 can't be found.
+    # This is not the best solution, but it makes the compile not fail.
+    #
+    AC_CHECK_X_LIB(krb4, krb_get_tf_realm,
+                   [have_kerberos=yes],
+                   [have_kerberos=no])
+    if test "$have_kerberos" = yes ; then
+      have_kerberos5=yes
+      AC_DEFINE(HAVE_KERBEROS)
+      AC_DEFINE(HAVE_KERBEROS5)
+    else
+      have_kerberos5=no
+      AC_MSG_WARN([Cannot find compat lib (libkrb4) needed to use Kerberos 5])
+    fi
+
   fi
 
   if test "$have_kerberos5" = yes ; then
@@ -1979,7 +1999,6 @@ if test "$with_gtk" = yes; then
     # the new way...
     # run pkg-config based tests.
     #
-
     pkgs=''
     pkg_check_version() {
       if test "$ok" = yes ; then
@@ -2005,11 +2024,14 @@ if test "$with_gtk" = yes; then
       fi
     }
 
+    AC_MSG_RESULT(checking for GTK 2.x with pkg-config based tests...)
+
     ok="yes"
-    pkg_check_version     gtk+-2.0  2.0.1  ; ac_gtk_version_string="$vers"
-    pkg_check_version  gmodule-2.0  2.0.0
-    pkg_check_version   libxml-2.0  2.4.6
-    pkg_check_version libglade-2.0  1.99.0
+    pkg_check_version       gtk+-2.0  2.0.1  ; ac_gtk_version_string="$vers"
+    pkg_check_version    gmodule-2.0  2.0.0
+    pkg_check_version     libxml-2.0  2.4.6
+    pkg_check_version   libglade-2.0  1.99.0
+#   pkg_check_version gdk_pixbuf      0.1
     have_gtk="$ok"
 
     if test "$have_gtk" = yes; then
@@ -2026,10 +2048,13 @@ if test "$with_gtk" = yes; then
       #
       # we don't have GTK 2.  Let's look for GTK 1.
       #
+      AC_MSG_RESULT(checking for GTK 1.x with pkg-config based tests...)
+
       pkgs=''
       ok="yes"
-      pkg_check_version gtk+ 1.2           ; ac_gtk_version_string="$vers"
-      pkg_check_version glib 1.0
+      pkg_check_version gtk+       1.2     ; ac_gtk_version_string="$vers"
+      pkg_check_version glib       1.0
+      pkg_check_version gdk_pixbuf 0.1
       have_gtk="$ok"
 
       # Now check for Gnome...
@@ -2074,6 +2099,7 @@ if test "$with_gtk" = yes; then
     # the old way...
     # run {gnome,gtk}-config based tests.
     #
+    AC_MSG_RESULT(checking for GTK 1.x with gtk-config based tests...)
 
     AC_PATH_PROGS(glib_config,  glib12-config glib-config,,  $gtk_path)
     AC_PATH_PROGS(gtk_config,   gtk12-config  gtk-config,,   $gtk_path)
@@ -2893,6 +2919,7 @@ if test "$with_gdk_pixbuf" = yes; then
       #
       # we don't have Gtk; or we have Gtk 2.x.  Check for pixbuf 2.x.
       #
+      AC_MSG_RESULT(checking for gdk_pixbuf 2.x with gtk-config based tests...)
       pkg_check_version gdk-pixbuf-2.0      2.0.0
       pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
       have_gdk_pixbuf="$ok"
@@ -2907,8 +2934,9 @@ if test "$with_gdk_pixbuf" = yes; then
       if test "$have_gdk_pixbuf2" = no; then
         pkgs=''
         ok="yes"
-        pkg_check_version gdk-pixbuf      0.0
-        pkg_check_version gdk-pixbuf-xlib 0.0
+      AC_MSG_RESULT(checking for gdk_pixbuf 1.x with gtk-config based tests...)
+        pkg_check_version gdk_pixbuf      0.0
+        pkg_check_version gdk_pixbuf_xlib 0.0
         have_gdk_pixbuf="$ok"
       fi
     fi
@@ -2933,6 +2961,8 @@ if test "$with_gdk_pixbuf" = yes; then
     # pkg-config exists, but doesn't know about pixbuf.
     #
 
+   AC_MSG_RESULT(checking for gdk_pixbuf with gdk-pixbuf-config based tests...)
+
     # if the user specified --with-gtk=/foo/ or --with-gnome=/foo/ then
     # look in /foo/bin/ for for gdk-pixbuf-config.
     #
@@ -4060,7 +4090,7 @@ if test "$do_dir_warning" = yes; then
   echo '      "xscreensaver-demo", and "xscreensaver-command" executables'
   echo "      will be installed in ${bindir}/."
   echo ""
-  echo "      The various graphics demos (150+ different executables) will"
+  echo "      The various graphics demos (160+ different executables) will"
   echo "      be installed in ${HACKDIR}/."
   echo ""
   echo "      If you would prefer the demos to be installed elsewhere,"
index 4e0977c602622a7d8f9aeb822cd5a3f9b2fb9903..6ef65ed97ab50f2df4d82543041013a8083518cd 100644 (file)
@@ -31,6 +31,7 @@ GNOME_PANELDIR1 = $(GNOME_DATADIR)/gnome/apps/Settings/Desktop
 GNOME_PANELDIR2        = $(GNOME_DATADIR)/applications
 GNOME_PANELDIR = @GNOME_PANELDIR@
 GLADE_DATADIR  = @GLADE_DATADIR@
+GNOME_ICONDIR  = $(GNOME_DATADIR)/pixmaps
 GNOME_BINDIR   = $(bindir)
 HACK_CONF_DIR  = @HACK_CONF_DIR@
 
@@ -141,7 +142,7 @@ GL_LIBS             = @SAVER_GL_LIBS@
 
 ICON_SRC        = $(UTILS_SRC)/images
 LOGO           = $(ICON_SRC)/logo-50.xpm
-GTK_ICONS      = $(ICON_SRC)/screensaver-*.xpm
+GTK_ICONS      = $(ICON_SRC)/screensaver-*.png
 
 DEMO_UTIL_SRCS = $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \
                  $(UTILS_SRC)/visual.c
@@ -556,20 +557,27 @@ install-gnome:: screensaver-properties-capplet
         fi
 
 # xscreensaver.xpm
+# into /usr/share/pixmaps/
 install-gnome:: $(LOGO)
-       @if [ "$(GLADE_DATADIR)" != "" ]; then                                  \
-           if [ ! -d "$(install_prefix)$(GLADE_DATADIR)" ]; then                \
-             echo $(INSTALL_DIRS) "$(install_prefix)$(GLADE_DATADIR)"          ;\
-                  $(INSTALL_DIRS) "$(install_prefix)$(GLADE_DATADIR)"          ;\
+       @if [ "$(GNOME_DATADIR)" != "" ]; then                                \
+           if [ ! -d "$(install_prefix)$(GNOME_ICONDIR)" ]; then              \
+             echo $(INSTALL_DIRS) "$(install_prefix)$(GNOME_ICONDIR)"        ;\
+                  $(INSTALL_DIRS) "$(install_prefix)$(GNOME_ICONDIR)"        ;\
            fi                                                                ;\
           target=xscreensaver.xpm                                           ;\
           echo $(INSTALL_DATA) $(LOGO)                                       \
-                 $(install_prefix)$(GLADE_DATADIR)/$$target                 ;\
+                 $(install_prefix)$(GNOME_ICONDIR)/$$target                 ;\
                $(INSTALL_DATA) $(LOGO)                                       \
-                 $(install_prefix)$(GLADE_DATADIR)/$$target                 ;\
+                 $(install_prefix)$(GNOME_ICONDIR)/$$target                 ;\
         fi
 
-# ../utils/images/screensaver-*.xpm
+# ../utils/images/screensaver-*.png
+# into /usr/share/xscreensaver/
+#
+# Should these really go in GLADE_DATADIR (/usr/share/xscreensaver/)
+# or should they instead go in GNOME_ICONDIR (/usr/share/pixmaps/)?
+# Does it matter?
+#
 install-gnome::
        @if [ "$(GLADE_DATADIR)" != "" ]; then                                \
            if [ ! -d "$(install_prefix)$(GLADE_DATADIR)" ]; then              \
@@ -586,6 +594,7 @@ install-gnome::
         fi
 
 # xscreensaver-demo.glade2
+# into /usr/share/xscreensaver/
 install-gnome:: xscreensaver-demo.glade2
        @if [ "$(GLADE_DATADIR)" != "" ]; then                                \
          if [ ! -d "$(install_prefix)$(GLADE_DATADIR)" ]; then               \
@@ -614,6 +623,7 @@ install-gnome:: xscreensaver-demo.glade2
 
 
 # screensaver-properties.desktop
+# into /usr/share/gnome/apps/Settings/Desktop/
 uninstall-gnome::
        @if [ "$(GNOME_DATADIR)" != "" ]; then                                \
           f=screensaver-properties.desktop                                   ;\
@@ -628,6 +638,7 @@ uninstall-gnome::
         fi
 
 # screensaver-properties-capplet
+# into /usr/X11R6/bin/
 uninstall-gnome::
        @if [ "$(GNOME_DATADIR)" != "" ]; then                                \
          program=screensaver-properties-capplet                             ;\
@@ -636,14 +647,16 @@ uninstall-gnome::
         fi
 
 # xscreensaver.xpm
+# into /usr/share/pixmaps/
 uninstall-gnome::
-       @if [ "$(GLADE_DATADIR)" != "" ]; then                                \
+       @if [ "$(GNOME_ICONDIR)" != "" ]; then                                \
          target=xscreensaver.xpm                                            ;\
-         echo rm -f $(install_prefix)$(GLADE_DATADIR)/$$target                ;\
-              rm -f $(install_prefix)$(GLADE_DATADIR)/$$target                ;\
+         echo rm -f $(install_prefix)$(GNOME_ICONDIR)/$$target              ;\
+              rm -f $(install_prefix)$(GNOME_ICONDIR)/$$target              ;\
         fi
 
-# xscreensaver.xpm
+# ../utils/images/screensaver-*.png
+# into /usr/share/xscreensaver/
 uninstall-gnome::
        @if [ "$(GLADE_DATADIR)" != "" ]; then                                \
           for target in $(GTK_ICONS) ; do                                    \
@@ -653,6 +666,7 @@ uninstall-gnome::
           done                                                              ;\
         fi
 
+# xscreensaver.kss
 install-kde:
        @src="xscreensaver.kss" ;                                             \
        if [ "$$KDEDIR" != "" ]; then                                         \
index ff59ab96e0eed7bce21cbfb527a460f64ef313cd..47c798f08f3bda1f69d10dc25eb992b8a8f1cd1c 100644 (file)
@@ -4,8 +4,8 @@
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
-!                              version 4.10
-!                              20-May-2003
+!                              version 4.11
+!                              23-Jun-2003
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
 @GL_KLUDGE@ GL:                        bouncingcow -root                           \n\
 @GL_KLUDGE@ GL:                        jigglypuff -root -random                    \n\
 @GL_KLUDGE@ GL:                        klein -root -random                         \n\
+@GL_KLUDGE@ GL:        "HyperTorus (striped)"  hypertorus -root                    \n\
+@GL_KLUDGE@ GL:        "HyperTorus (solid)"    hypertorus -root -solid -transp     \n\
+@GL_KLUDGE@ GL:                        glmatrix -root                              \n\
+@GL_KLUDGE@ GL:                        cubestorm -root                             \n\
+@GL_KLUDGE@ GL:                        glknots -root                               \n\
+@GL_KLUDGE@ GL:                        blocktube -root                             \n\
 -         GL:                  glslideshow -root                           \n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \n\
@@ -620,7 +626,6 @@ XScreenSaver*doc.fontList:       *-helvetica-medium-r-*-*-*-100-*-*-*-iso8859-1
 *hacks.vidwhacker.name:     VidWhacker
 *hacks.morph3d.name:        Morph3D
 *hacks.bubble3d.name:       Bubble3D
-*hacks.glplanet.name:       GLPlanet
 *hacks.sierpinski3d.name:   Sierpinski3D
 *hacks.gflux.name:          GFlux
 *hacks.xrayswarm.name:      XRaySwarm
@@ -628,12 +633,9 @@ XScreenSaver*doc.fontList:       *-helvetica-medium-r-*-*-*-100-*-*-*-iso8859-1
 *hacks.rotzoomer.name:      RotZoomer
 *hacks.stonerview.name:     StonerView
 *hacks.starwars.name:       StarWars
-*hacks.glblur.name:         GLBlur
-*hacks.gltext.name:         GLText
 *hacks.dangerball.name:     DangerBall
 *hacks.whirlygig.name:      WhirlyGig
 *hacks.speedmine.name:      SpeedMine
-*hacks.glsnake.name:        GLSnake
 *hacks.glforestfire.name:   GLForestFire
 *hacks.sballs.name:         SBalls
 *hacks.xdaliclock.name:     XDaliClock
@@ -646,7 +648,9 @@ XScreenSaver*doc.fontList:       *-helvetica-medium-r-*-*-*-100-*-*-*-iso8859-1
 *hacks.flyingtoasters.name: FlyingToasters
 *hacks.bouncingcow.name:    BouncingCow
 *hacks.jigglypuff.name:     JigglyPuff
-*hacks.glslideshow.name:    GLSlideshow
+*hacks.hypertorus.name:     HyperTorus
+*hacks.cubestorm.name:      CubeStorm
+*hacks.blocktube.name:      BlockTube
 
 ! obsolete, but still used by xscreensaver-demo-Xm.
 *hacks.documentation.isInstalled: True
index 67450449c21380b073427ea72800e2fc42e363ff..5a6ffa9713bb834633e330d36b90e52ca5847552 100644 (file)
           GL:                  bouncingcow -root                           \\n\
           GL:                  jigglypuff -root -random                    \\n\
           GL:                  klein -root -random                         \\n\
+          GL:  \"HyperTorus (striped)\"        hypertorus -root                    \\n\
+          GL:  \"HyperTorus (solid)\"  hypertorus -root -solid -transp     \\n\
+          GL:                  glmatrix -root                              \\n\
+          GL:                  cubestorm -root                             \\n\
+          GL:                  glknots -root                               \\n\
+          GL:                  blocktube -root                             \\n\
 -         GL:                  glslideshow -root                           \\n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \\n\
 "*hacks.vidwhacker.name:     VidWhacker",
 "*hacks.morph3d.name:        Morph3D",
 "*hacks.bubble3d.name:       Bubble3D",
-"*hacks.glplanet.name:       GLPlanet",
 "*hacks.sierpinski3d.name:   Sierpinski3D",
 "*hacks.gflux.name:          GFlux",
 "*hacks.xrayswarm.name:      XRaySwarm",
 "*hacks.rotzoomer.name:      RotZoomer",
 "*hacks.stonerview.name:     StonerView",
 "*hacks.starwars.name:       StarWars",
-"*hacks.glblur.name:         GLBlur",
-"*hacks.gltext.name:         GLText",
 "*hacks.dangerball.name:     DangerBall",
 "*hacks.whirlygig.name:      WhirlyGig",
 "*hacks.speedmine.name:      SpeedMine",
-"*hacks.glsnake.name:        GLSnake",
 "*hacks.glforestfire.name:   GLForestFire",
 "*hacks.sballs.name:         SBalls",
 "*hacks.xdaliclock.name:     XDaliClock",
 "*hacks.flyingtoasters.name: FlyingToasters",
 "*hacks.bouncingcow.name:    BouncingCow",
 "*hacks.jigglypuff.name:     JigglyPuff",
-"*hacks.glslideshow.name:    GLSlideshow",
+"*hacks.hypertorus.name:     HyperTorus",
+"*hacks.cubestorm.name:      CubeStorm",
+"*hacks.blocktube.name:      BlockTube",
 "*hacks.documentation.isInstalled: True",
index ce5ea475141512a9d05f1f318ee0f18fc72fbe00..881129c4f11ca1ebd8cd66e6771b1997dbd139dd 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * DO NOT EDIT THIS FILE - it is generated by Glade.
+   WARNING: I did edit this file!  Be careful!  -jwz
  */
 
 #ifdef HAVE_CONFIG_H
 
 #include "demo-Gtk-support.h"
 
+/* jwz -- dumbass Glade1 doesn't emit code that can read PNGs. this does. */
+#ifdef HAVE_GDK_PIXBUF
+# ifdef HAVE_GTK2
+#  include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+# else  /* !HAVE_GTK2 */
+#  include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+# endif /* !HAVE_GTK2 */
+#endif /* HAVE_GDK_PIXBUF */
+
+
 /* This is an internally used function to check if a pixmap file exists. */
 static gchar* check_file_exists        (const gchar     *directory,
                                         const gchar     *filename);
@@ -86,16 +97,19 @@ add_pixmap_directory                   (const gchar     *directory)
 }
 
 /* This is an internally used function to create pixmaps. */
+/* #### Warning: this version of this function hacked by jwz to
+   support PNGs.  Don't let Glade1 overwrite this!
+ */
 GtkWidget*
 create_pixmap                          (GtkWidget       *widget,
                                         const gchar     *filename)
 {
   gchar *found_filename = NULL;
-  GdkColormap *colormap;
-  GdkPixmap *gdkpixmap;
-  GdkBitmap *mask;
-  GtkWidget *pixmap;
-  GList *elem;
+  GdkColormap *colormap = 0;
+  GdkPixmap *gdkpixmap = 0;
+  GdkBitmap *mask = 0;
+  GtkWidget *pixmap = 0;
+  GList *elem = 0;
 
   if (!filename || !filename[0])
       return create_dummy_pixmap (widget);
@@ -123,6 +137,9 @@ create_pixmap                          (GtkWidget       *widget,
     }
 
   colormap = gtk_widget_get_colormap (widget);
+
+# ifndef HAVE_GDK_PIXBUF
+
   gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask,
                                                    NULL, found_filename);
   if (gdkpixmap == NULL)
@@ -131,10 +148,50 @@ create_pixmap                          (GtkWidget       *widget,
       g_free (found_filename);
       return create_dummy_pixmap (widget);
     }
+
+# else /* HAVE_GDK_PIXBUF */
+
+  /* jwz -- dumbass Glade1 doesn't emit code that can read PNGs.
+     This code does... */
+
+  /* #### Danger: we aren't using `colormap'... */
+
+  {
+    GdkPixbuf *pb;
+#  ifdef HAVE_GTK2
+    GError *gerr = 0;
+#  endif /* HAVE_GTK2 */
+
+    pb = gdk_pixbuf_new_from_file (found_filename
+#  ifdef HAVE_GTK2
+                                   , &gerr
+#  endif /* HAVE_GTK2 */
+                                   );
+
+    if (pb)
+      {
+        gdkpixmap = 0;
+        mask = 0;
+        gdk_pixbuf_render_pixmap_and_mask (pb, &gdkpixmap, &mask, 128);
+      }
+    else
+      {
+        g_warning (_("Error loading pixmap file: %s"), found_filename);
+#  ifdef HAVE_GTK2
+        if (gerr && gerr->message && *gerr->message)
+          g_warning (_("reason: %s\n"), gerr->message);
+#  endif /* HAVE_GTK2 */
+
+        return create_dummy_pixmap (widget);
+      }
+  }
+# endif /* HAVE_GDK_PIXBUF */
+
   g_free (found_filename);
   pixmap = gtk_pixmap_new (gdkpixmap, mask);
   gdk_pixmap_unref (gdkpixmap);
   gdk_bitmap_unref (mask);
+
   return pixmap;
 }
 
index 65a9d9ba649af61630b5fab0f0673a61815b96a1..e2c9be771cd5166c0e72da060cf75de2374d1343 100644 (file)
@@ -718,7 +718,7 @@ create_xscreensaver_demo (void)
   gtk_container_add (GTK_CONTAINER (diag_frame), diag_hbox);
   gtk_container_set_border_width (GTK_CONTAINER (diag_hbox), 8);
 
-  diag_logo = create_pixmap (xscreensaver_demo, "screensaver-diagnostic.xpm");
+  diag_logo = create_pixmap (xscreensaver_demo, "screensaver-diagnostic.png");
   gtk_widget_set_name (diag_logo, "diag_logo");
   gtk_widget_ref (diag_logo);
   gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "diag_logo", diag_logo,
@@ -807,7 +807,7 @@ create_xscreensaver_demo (void)
   gtk_container_add (GTK_CONTAINER (cmap_frame), cmap_hbox);
   gtk_container_set_border_width (GTK_CONTAINER (cmap_hbox), 8);
 
-  cmap_logo = create_pixmap (xscreensaver_demo, "screensaver-colorselector.xpm");
+  cmap_logo = create_pixmap (xscreensaver_demo, "screensaver-colorselector.png");
   gtk_widget_set_name (cmap_logo, "cmap_logo");
   gtk_widget_ref (cmap_logo);
   gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "cmap_logo", cmap_logo,
@@ -953,7 +953,7 @@ create_xscreensaver_demo (void)
   gtk_container_add (GTK_CONTAINER (dpms_frame), dpms_hbox);
   gtk_container_set_border_width (GTK_CONTAINER (dpms_hbox), 8);
 
-  dpms_logo = create_pixmap (xscreensaver_demo, "screensaver-power.xpm");
+  dpms_logo = create_pixmap (xscreensaver_demo, "screensaver-power.png");
   gtk_widget_set_name (dpms_logo, "dpms_logo");
   gtk_widget_ref (dpms_logo);
   gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "dpms_logo", dpms_logo,
@@ -1134,7 +1134,7 @@ create_xscreensaver_demo (void)
   gtk_container_add (GTK_CONTAINER (grab_frame), grab_hbox);
   gtk_container_set_border_width (GTK_CONTAINER (grab_hbox), 8);
 
-  img_logo = create_pixmap (xscreensaver_demo, "screensaver-snap.xpm");
+  img_logo = create_pixmap (xscreensaver_demo, "screensaver-snap.png");
   gtk_widget_set_name (img_logo, "img_logo");
   gtk_widget_ref (img_logo);
   gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "img_logo", img_logo,
@@ -1502,7 +1502,7 @@ create_xscreensaver_settings_dialog (void)
   gtk_widget_show (opt_table);
   gtk_container_add (GTK_CONTAINER (opt_notebook), opt_table);
 
-  cmd_logo = create_pixmap (xscreensaver_settings_dialog, "screensaver-cmndln.xpm");
+  cmd_logo = create_pixmap (xscreensaver_settings_dialog, "screensaver-cmndln.png");
   gtk_widget_set_name (cmd_logo, "cmd_logo");
   gtk_widget_ref (cmd_logo);
   gtk_object_set_data_full (GTK_OBJECT (xscreensaver_settings_dialog), "cmd_logo", cmd_logo,
index 1d7e91fd620e84e8ce824c237d922e66d5580c4c..b2620a4f7ef12d17e8488a2a6b1afae377dea322 100644 (file)
@@ -431,7 +431,8 @@ warning_dialog (GtkWidget *parent, const char *message,
   while (parent && !parent->window)
     parent = parent->parent;
 
-  if (!GTK_WIDGET (parent)->window) /* too early to pop up transient dialogs */
+  if (!parent ||
+      !GTK_WIDGET (parent)->window) /* too early to pop up transient dialogs */
     {
       fprintf (stderr, "%s: too early for dialog?\n", progname);
       return;
@@ -769,7 +770,6 @@ doc_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
   sprintf (help_command + strlen(help_command),
            p->load_url_command, p->help_url, p->help_url);
   strcat (help_command, " ) &");
-fprintf(stderr, "## %s\n", help_command);
   system (help_command);
   free (help_command);
 }
index 09199d9f06d58744938673fa7864a72273b2fa41..cbe339343b750743a78938e8594e4a5cc7a7c84b 100644 (file)
@@ -1,5 +1,5 @@
 /* demo-Xm.c --- implements the interactive demo-mode and options dialogs.
- * xscreensaver, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1999, 2003 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -70,7 +70,7 @@ tab_cb (Widget button, XtPointer client_data, XtPointer ignored)
   Cardinal nkids = 0;
   if (!tabber) abort();
   
-  XtVaGetValues (tabber, XmNnumChildren, &nkids, XmNchildren, &kids, 0);
+  XtVaGetValues (tabber, XmNnumChildren, &nkids, XmNchildren, &kids, NULL);
   if (!kids) abort();
   if (nkids > 0)
     XtUnmanageChildren (kids, nkids);
@@ -105,7 +105,7 @@ create_xscreensaver_demo (Widget parent)
                  XmNtopAttachment, XmATTACH_FORM,
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNrightAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
 
   {
     Widget menu = 0, item = 0;
@@ -128,7 +128,7 @@ create_xscreensaver_demo (Widget parent)
             item = XmCreateCascadeButtonGadget (menubar, menus[i]+1, av, ac);
 
             if (!strcmp (menus[i]+1, "help"))
-              XtVaSetValues(menubar, XmNmenuHelpWidget, item, 0);
+              XtVaSetValues(menubar, XmNmenuHelpWidget, item, NULL);
           }
         XtManageChild (item);
       }
@@ -140,7 +140,7 @@ create_xscreensaver_demo (Widget parent)
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNtopAttachment, XmATTACH_WIDGET,
                  XmNtopWidget, menubar,
-                 0);
+                 NULL);
 
   options_tab = XmCreatePushButtonGadget (form, "optionsTab", av, ac);
   XtVaSetValues (options_tab,
@@ -150,7 +150,7 @@ create_xscreensaver_demo (Widget parent)
                  XmNtopWidget, demo_tab,
                  XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
                  XmNbottomWidget, demo_tab,
-                 0);
+                 NULL);
 
   hr = XmCreateSeparatorGadget (form, "hr", av, ac);
   XtVaSetValues (hr,
@@ -158,7 +158,7 @@ create_xscreensaver_demo (Widget parent)
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNtopAttachment, XmATTACH_WIDGET,
                  XmNtopWidget, demo_tab,
-                 0);
+                 NULL);
 
   tabber = XmCreateForm (form, "folder", av, ac);
   XtVaSetValues (tabber,
@@ -167,7 +167,7 @@ create_xscreensaver_demo (Widget parent)
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
 
   demos = create_demos_page (tabber);
   options = create_options_page (tabber);
@@ -234,7 +234,7 @@ create_demos_page (Widget parent)
                  XmNtopAttachment, XmATTACH_FORM,
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
 
   scroller = XmCreateScrolledWindow (form2, "scroller", av, ac);
   XtVaSetValues (scroller,
@@ -242,7 +242,7 @@ create_demos_page (Widget parent)
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_WIDGET,
-                 0);
+                 NULL);
   list = XmCreateList (scroller, "list", av, ac);
 
   buttonbox1 = XmCreateForm (form2, "buttonbox1", av, ac);
@@ -250,22 +250,22 @@ create_demos_page (Widget parent)
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
-  XtVaSetValues (scroller, XmNbottomWidget, buttonbox1, 0);
+                 NULL);
+  XtVaSetValues (scroller, XmNbottomWidget, buttonbox1, NULL);
 
   down = XmCreatePushButton (buttonbox1, "down", av, ac);
   XtVaSetValues (down,
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNtopAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
   up = XmCreatePushButton (buttonbox1, "up", av, ac);
   XtVaSetValues (up,
                  XmNleftAttachment, XmATTACH_WIDGET,
                  XmNleftWidget, down,
                  XmNtopAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
 
   form3 = XmCreateForm (form1, "form3", av, ac);
   XtVaSetValues (form3,
@@ -274,7 +274,7 @@ create_demos_page (Widget parent)
                  XmNleftWidget, form2,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
   frame = XmCreateFrame (form3, "frame", av, ac);
 
   ac = 0;
@@ -287,7 +287,7 @@ create_demos_page (Widget parent)
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_WIDGET,
-                 0);
+                 NULL);
 
   ac = 0;
   XtSetArg (av [ac], XmNchildType, XmFRAME_WORKAREA_CHILD); ac++;
@@ -300,45 +300,45 @@ create_demos_page (Widget parent)
                  XmNwordWrap, TRUE,
                  XmNeditMode, XmMULTI_LINE_EDIT,
                  XmNshadowThickness, 0,
-                 0);
+                 NULL);
 
   cmd_label = XmCreateLabelGadget (form3, "cmdLabel", av, ac);
   XtVaSetValues (cmd_label,
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_WIDGET,
-                 0);
-  XtVaSetValues (frame, XmNbottomWidget, cmd_label, 0);
+                 NULL);
+  XtVaSetValues (frame, XmNbottomWidget, cmd_label, NULL);
 
   cmd_text = XmCreateTextField (form3, "cmdText", av, ac);
   XtVaSetValues (cmd_text,
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_WIDGET,
-                 0);
-  XtVaSetValues (cmd_label, XmNbottomWidget, cmd_text, 0);
+                 NULL);
+  XtVaSetValues (cmd_label, XmNbottomWidget, cmd_text, NULL);
 
   form4 = XmCreateForm (form3, "form4", av, ac);
   XtVaSetValues (form4,
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_WIDGET,
-                 0);
-  XtVaSetValues (cmd_text, XmNbottomWidget, form4, 0);
+                 NULL);
+  XtVaSetValues (cmd_text, XmNbottomWidget, form4, NULL);
 
   enabled = XmCreateToggleButtonGadget (form4, "enabled", av, ac);
   XtVaSetValues (enabled,
                  XmNtopAttachment, XmATTACH_FORM,
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
   vis_label = XmCreateLabelGadget (form4, "visLabel", av, ac);
   XtVaSetValues (vis_label,
                  XmNtopAttachment, XmATTACH_FORM,
                  XmNleftAttachment, XmATTACH_WIDGET,
                  XmNleftWidget, enabled,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
 #ifdef HAVE_XMCOMBOBOX
   {
     Widget list;
@@ -352,8 +352,8 @@ create_demos_page (Widget parent)
         XmComboBoxAddItem (combo, xs, 0, False);
         XmStringFree (xs);
       }
-    XtVaGetValues (combo, XmNlist, &list, 0);
-    XtVaSetValues (list, XmNvisibleItemCount, i, 0);
+    XtVaGetValues (combo, XmNlist, &list, NULL);
+    XtVaSetValues (list, XmNvisibleItemCount, i, NULL);
   }
 #else /* !HAVE_XMCOMBOBOX */
   {
@@ -384,36 +384,36 @@ create_demos_page (Widget parent)
                  XmNleftAttachment, XmATTACH_WIDGET,
                  XmNleftWidget, vis_label,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
 
   hr = XmCreateSeparatorGadget (form3, "hr", av, ac);
   XtVaSetValues (hr,
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_WIDGET,
-                 0);
-  XtVaSetValues (form4, XmNbottomWidget, hr, 0);
+                 NULL);
+  XtVaSetValues (form4, XmNbottomWidget, hr, NULL);
 
   buttonbox2 = XmCreateForm (form3, "buttonbox2", av, ac);
   XtVaSetValues (buttonbox2,
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
-  XtVaSetValues (hr, XmNbottomWidget, buttonbox2, 0);
+                 NULL);
+  XtVaSetValues (hr, XmNbottomWidget, buttonbox2, NULL);
 
   demo = XmCreatePushButtonGadget (buttonbox2, "demo", av, ac);
   XtVaSetValues (demo,
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNtopAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
   man = XmCreatePushButtonGadget (buttonbox2, "man", av, ac);
   XtVaSetValues (man,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNtopAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
 
   XtManageChild (demo);
   XtManageChild (man);
@@ -448,7 +448,7 @@ create_demos_page (Widget parent)
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNtopAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
 
   return form1;
 }
@@ -654,7 +654,7 @@ create_options_page (Widget parent)
                  XmNrightAttachment, XmATTACH_WIDGET,
                  XmNrightOffset, 4,
                  XmNrightWidget, timeout_text,
-                 0);
+                 NULL);
 
   XtVaSetValues (cycle_label,
                  XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
@@ -668,7 +668,7 @@ create_options_page (Widget parent)
                  XmNrightAttachment, XmATTACH_WIDGET,
                  XmNrightOffset, 4,
                  XmNrightWidget, cycle_text,
-                 0);
+                 NULL);
 
   XtVaSetValues (fade_seconds_label,
                  XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
@@ -682,7 +682,7 @@ create_options_page (Widget parent)
                  XmNrightAttachment, XmATTACH_WIDGET,
                  XmNrightOffset, 4,
                  XmNrightWidget, fade_text,
-                 0);
+                 NULL);
 
   XtVaSetValues (fade_ticks_label,
                  XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
@@ -696,7 +696,7 @@ create_options_page (Widget parent)
                  XmNrightAttachment, XmATTACH_WIDGET,
                  XmNrightOffset, 4,
                  XmNrightWidget, fade_ticks_text,
-                 0);
+                 NULL);
 
   XtVaSetValues (lock_label,
                  XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
@@ -710,7 +710,7 @@ create_options_page (Widget parent)
                  XmNrightAttachment, XmATTACH_WIDGET,
                  XmNrightOffset, 4,
                  XmNrightWidget, lock_timeout_text,
-                 0);
+                 NULL);
 
   XtVaSetValues (passwd_label,
                  XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
@@ -724,14 +724,14 @@ create_options_page (Widget parent)
                  XmNrightAttachment, XmATTACH_WIDGET,
                  XmNrightOffset, 4,
                  XmNrightWidget, passwd_timeout_text,
-                 0);
+                 NULL);
 
   XtVaSetValues (timeout_text,
                  XmNtopAttachment, XmATTACH_FORM,
                  XmNtopOffset, 4,
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNleftOffset, 141,
-                 0);
+                 NULL);
 
   XtVaSetValues (cycle_text,
                  XmNtopAttachment, XmATTACH_WIDGET,
@@ -740,7 +740,7 @@ create_options_page (Widget parent)
                  XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
                  XmNleftOffset, 0,
                  XmNleftWidget, timeout_text,
-                 0);
+                 NULL);
 
   XtVaSetValues (fade_text,
                  XmNtopAttachment, XmATTACH_WIDGET,
@@ -749,7 +749,7 @@ create_options_page (Widget parent)
                  XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
                  XmNleftOffset, 0,
                  XmNleftWidget, cycle_text,
-                 0);
+                 NULL);
 
   XtVaSetValues (fade_ticks_text,
                  XmNtopAttachment, XmATTACH_WIDGET,
@@ -758,7 +758,7 @@ create_options_page (Widget parent)
                  XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
                  XmNleftOffset, 0,
                  XmNleftWidget, fade_text,
-                 0);
+                 NULL);
 
   XtVaSetValues (lock_timeout_text,
                  XmNtopAttachment, XmATTACH_WIDGET,
@@ -767,7 +767,7 @@ create_options_page (Widget parent)
                  XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
                  XmNleftOffset, 0,
                  XmNleftWidget, fade_ticks_text,
-                 0);
+                 NULL);
 
   XtVaSetValues (passwd_timeout_text,
                  XmNtopAttachment, XmATTACH_WIDGET,
@@ -776,7 +776,7 @@ create_options_page (Widget parent)
                  XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
                  XmNleftOffset, 0,
                  XmNleftWidget, lock_timeout_text,
-                 0);
+                 NULL);
 
   XtVaSetValues (verbose_toggle,
                  XmNtopAttachment, XmATTACH_FORM,
@@ -789,7 +789,7 @@ create_options_page (Widget parent)
                  XmNleftWidget, timeout_text,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNrightOffset, 20,
-                 0);
+                 NULL);
 
   XtVaSetValues (install_cmap_toggle,
                  XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
@@ -803,7 +803,7 @@ create_options_page (Widget parent)
                  XmNleftWidget, verbose_toggle,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNrightOffset, 20,
-                 0);
+                 NULL);
 
   XtVaSetValues (fade_toggle,
                  XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
@@ -817,7 +817,7 @@ create_options_page (Widget parent)
                  XmNleftWidget, install_cmap_toggle,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNrightOffset, 20,
-                 0);
+                 NULL);
 
   XtVaSetValues (unfade_toggle,
                  XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
@@ -831,7 +831,7 @@ create_options_page (Widget parent)
                  XmNleftWidget, fade_toggle,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNrightOffset, 20,
-                 0);
+                 NULL);
 
   XtVaSetValues (lock_toggle,
                  XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
@@ -845,7 +845,7 @@ create_options_page (Widget parent)
                  XmNleftWidget, unfade_toggle,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNrightOffset, 20,
-                 0);
+                 NULL);
 
   XtVaSetValues (hr,
                  XmNtopWidget, passwd_timeout_text,
@@ -853,20 +853,20 @@ create_options_page (Widget parent)
                  XmNbottomOffset, 4,
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNrightAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
 
   XtVaSetValues (prefs_done,
                  XmNleftAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
   XtVaSetValues (prefs_cancel,
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
   XtVaSetValues (hr,
                  XmNbottomAttachment, XmATTACH_WIDGET,
                  XmNbottomWidget, prefs_done,
-                 0);
+                 NULL);
 
   ac = 0;
   children[ac++] = timeout_label;
@@ -901,7 +901,7 @@ create_options_page (Widget parent)
                  XmNrightAttachment, XmATTACH_FORM,
                  XmNtopAttachment, XmATTACH_FORM,
                  XmNbottomAttachment, XmATTACH_FORM,
-                 0);
+                 NULL);
 
   return preferences_form;
 }
index b1b08f867326077fb918d994be2af41dd7ddf2dd..f8d0de286ee7efc80cf79123b40f045f28b22fef 100644 (file)
@@ -1,5 +1,5 @@
 /* demo-Xm.c --- implements the interactive demo-mode and options dialogs.
- * xscreensaver, Copyright (c) 1993-2001 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1993-2003 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -157,7 +157,7 @@ ensure_selected_item_visible (Widget list)
       XtVaGetValues (list,
                     XmNtopItemPosition, &top,
                     XmNvisibleItemCount, &visible,
-                    0);
+                    NULL);
       if (pos_list[0] >= top + visible)
        {
          int pos = pos_list[0] - visible + 1;
@@ -554,16 +554,16 @@ apply_changes_and_save (Widget widget)
   if (which < 0) return -1;
 
 # ifdef HAVE_XMCOMBOBOX
-  XtVaGetValues (vis, XmNtextField, &text, 0);
+  XtVaGetValues (vis, XmNtextField, &text, NULL);
   if (!text)
     /* If we can't get at the text field of this combo box, we're screwed. */
     abort();
-  XtVaGetValues (text, XmNvalue, &visual, 0);
+  XtVaGetValues (text, XmNvalue, &visual, NULL);
 
 # else /* !HAVE_XMCOMBOBOX */
-  XtVaGetValues (vis, XmNsubMenuId, &menu, 0);
-  XtVaGetValues (menu, XmNnumChildren, &nkids, XmNchildren, &kids, 0);
-  XtVaGetValues (menu, XmNmenuHistory, &selected_item, 0);
+  XtVaGetValues (vis, XmNsubMenuId, &menu, NULL);
+  XtVaGetValues (menu, XmNnumChildren, &nkids, XmNchildren, &kids, NULL);
+  XtVaGetValues (menu, XmNmenuHistory, &selected_item, NULL);
   if (selected_item)
     for (i = 0; i < nkids; i++)
       if (kids[i] == selected_item)
@@ -572,8 +572,8 @@ apply_changes_and_save (Widget widget)
   visual = visual_menu[i];
 # endif /* !HAVE_XMCOMBOBOX */
 
-  XtVaGetValues (enabled, XmNset, &enabled_p, 0);
-  XtVaGetValues (cmd, XtNvalue, &command, 0);
+  XtVaGetValues (enabled, XmNset, &enabled_p, NULL);
+  XtVaGetValues (cmd, XtNvalue, &command, NULL);
 
   if (maybe_reload_init_file (widget, pair) != 0)
     return 1;
@@ -789,18 +789,18 @@ prefs_ok_cb (Widget button, XtPointer client_data, XtPointer ignored)
 
 # define SECONDS(field, name) \
   v = 0; \
-  XtVaGetValues (name_to_widget (button, (name)), XtNvalue, &v, 0); \
+  XtVaGetValues (name_to_widget (button, (name)), XtNvalue, &v, NULL); \
   hack_time_text (button, v, (field), True)
 
 # define MINUTES(field, name) \
   v = 0; \
-  XtVaGetValues (name_to_widget (button, (name)), XtNvalue, &v, 0); \
+  XtVaGetValues (name_to_widget (button, (name)), XtNvalue, &v, NULL); \
   hack_time_text (button, v, (field), False)
 
 # define INTEGER(field, name) do { \
     unsigned int value; \
     char c; \
-    XtVaGetValues (name_to_widget (button, (name)), XtNvalue, &v, 0); \
+    XtVaGetValues (name_to_widget (button, (name)), XtNvalue, &v, NULL); \
     if (! *v) \
       ; \
     else if (sscanf (v, "%u%c", &value, &c) != 1) \
@@ -814,7 +814,7 @@ prefs_ok_cb (Widget button, XtPointer client_data, XtPointer ignored)
   } while(0)
 
 # define CHECKBOX(field, name) \
-  XtVaGetValues (name_to_widget (button, (name)), XmNset, &field, 0)
+  XtVaGetValues (name_to_widget (button, (name)), XmNset, &field, NULL)
 
   MINUTES (&p2->timeout,        "timeoutText");
   MINUTES (&p2->cycle,          "cycleText");
@@ -981,28 +981,28 @@ populate_prefs_page (Widget top, prefs_pair *pair)
   char s[100];
 
   format_time (s, p->timeout);
-  XtVaSetValues (name_to_widget (top, "timeoutText"),     XmNvalue, s, 0);
+  XtVaSetValues (name_to_widget (top, "timeoutText"),     XmNvalue, s, NULL);
   format_time (s, p->cycle);
-  XtVaSetValues (name_to_widget (top, "cycleText"),       XmNvalue, s, 0);
+  XtVaSetValues (name_to_widget (top, "cycleText"),       XmNvalue, s, NULL);
   format_time (s, p->lock_timeout);
-  XtVaSetValues (name_to_widget (top, "lockText"),        XmNvalue, s, 0);
+  XtVaSetValues (name_to_widget (top, "lockText"),        XmNvalue, s, NULL);
   format_time (s, p->passwd_timeout);
-  XtVaSetValues (name_to_widget (top, "passwdText"),      XmNvalue, s, 0);
+  XtVaSetValues (name_to_widget (top, "passwdText"),      XmNvalue, s, NULL);
   format_time (s, p->fade_seconds);
-  XtVaSetValues (name_to_widget (top, "fadeSecondsText"), XmNvalue, s, 0);
+  XtVaSetValues (name_to_widget (top, "fadeSecondsText"), XmNvalue, s, NULL);
   sprintf (s, "%u", p->fade_ticks);
-  XtVaSetValues (name_to_widget (top, "fadeTicksText"),   XmNvalue, s, 0);
+  XtVaSetValues (name_to_widget (top, "fadeTicksText"),   XmNvalue, s, NULL);
 
   XtVaSetValues (name_to_widget (top, "verboseToggle"),
-                 XmNset, p->verbose_p, 0);
+                 XmNset, p->verbose_p, NULL);
   XtVaSetValues (name_to_widget (top, "cmapToggle"),
-                 XmNset, p->install_cmap_p, 0);
+                 XmNset, p->install_cmap_p, NULL);
   XtVaSetValues (name_to_widget (top, "fadeToggle"),
-                 XmNset, p->fade_p, 0);
+                 XmNset, p->fade_p, NULL);
   XtVaSetValues (name_to_widget (top, "unfadeToggle"),
-                 XmNset, p->unfade_p, 0);
+                 XmNset, p->unfade_p, NULL);
   XtVaSetValues (name_to_widget (top, "lockToggle"),
-                 XmNset, p->lock_p, 0);
+                 XmNset, p->lock_p, NULL);
 
 
   {
@@ -1025,19 +1025,19 @@ populate_prefs_page (Widget top, prefs_pair *pair)
 #endif
 
     XtVaSetValues (name_to_widget (top, "fadeSecondsLabel"), XtNsensitive,
-                           found_any_writable_cells, 0);
+                           found_any_writable_cells, NULL);
     XtVaSetValues (name_to_widget (top, "fadeTicksLabel"), XtNsensitive,
-                           found_any_writable_cells, 0);
+                           found_any_writable_cells, NULL);
     XtVaSetValues (name_to_widget (top, "fadeSecondsText"), XtNsensitive,
-                           found_any_writable_cells, 0);
+                           found_any_writable_cells, NULL);
     XtVaSetValues (name_to_widget (top, "fadeTicksText"), XtNsensitive,
-                           found_any_writable_cells, 0);
+                           found_any_writable_cells, NULL);
     XtVaSetValues (name_to_widget (top, "cmapToggle"), XtNsensitive,
-                           found_any_writable_cells, 0);
+                           found_any_writable_cells, NULL);
     XtVaSetValues (name_to_widget (top, "fadeToggle"), XtNsensitive,
-                           found_any_writable_cells, 0);
+                           found_any_writable_cells, NULL);
     XtVaSetValues (name_to_widget (top, "unfadeToggle"), XtNsensitive,
-                           found_any_writable_cells, 0);
+                           found_any_writable_cells, NULL);
   }
 }
 
@@ -1051,7 +1051,7 @@ sensitize_demo_widgets (Widget toplevel, Bool sensitive_p)
   for (i = 0; i < sizeof(names)/countof(*names); i++)
     {
       Widget w = name_to_widget (toplevel, names[i]);
-      XtVaSetValues (w, XtNsensitive, sensitive_p, 0);
+      XtVaSetValues (w, XtNsensitive, sensitive_p, NULL);
     }
 
   /* I don't know how to handle these yet... */
@@ -1060,7 +1060,7 @@ sensitize_demo_widgets (Widget toplevel, Bool sensitive_p)
     for (i = 0; i < sizeof(names2)/countof(*names2); i++)
       {
         Widget w = name_to_widget (toplevel, names2[i]);
-        XtVaSetValues (w, XtNsensitive, FALSE, 0);
+        XtVaSetValues (w, XtNsensitive, FALSE, NULL);
       }
   }
 }
@@ -1150,7 +1150,7 @@ pixmapify_buttons (Widget toplevel)
   symbols[0].name = "background";
   symbols[0].pixel = 0;
   symbols[1].name = 0;
-  XtVaGetValues (up, XmNbackground, &xc, 0);
+  XtVaGetValues (up, XmNbackground, &xc, NULL);
   XQueryColor (dpy, xgwa.colormap, &xc);
   sprintf (color, "#%04X%04X%04X", xc.red, xc.green, xc.blue);
   symbols[0].value = color;
@@ -1194,8 +1194,8 @@ pixmapify_buttons (Widget toplevel)
       return;
     }
 
-  XtVaSetValues (up, XmNlabelType, XmPIXMAP, XmNlabelPixmap, up_pixmap, 0);
-  XtVaSetValues (dn, XmNlabelType, XmPIXMAP, XmNlabelPixmap, down_pixmap, 0);
+  XtVaSetValues (up, XmNlabelType, XmPIXMAP, XmNlabelPixmap, up_pixmap, NULL);
+  XtVaSetValues (dn, XmNlabelType, XmPIXMAP, XmNlabelPixmap, down_pixmap,NULL);
 
 #endif /* HAVE_XPM */
 }
@@ -1330,13 +1330,13 @@ populate_demo_window (Widget toplevel, int which, prefs_pair *pair)
   XmString xmstr;
 
   xmstr = XmStringCreate (pretty_name, XmSTRING_DEFAULT_CHARSET);
-  XtVaSetValues (frameL, XmNlabelString, xmstr, 0);
+  XtVaSetValues (frameL, XmNlabelString, xmstr, NULL);
   XmStringFree (xmstr);
 
-  XtVaSetValues (doc, XmNvalue, doc_string, 0);
-  XtVaSetValues (cmd, XmNvalue, (hack ? hack->command : ""), 0);
+  XtVaSetValues (doc, XmNvalue, doc_string, NULL);
+  XtVaSetValues (cmd, XmNvalue, (hack ? hack->command : ""), NULL);
 
-  XtVaSetValues (enabled, XmNset, (hack ? hack->enabled_p : False), 0);
+  XtVaSetValues (enabled, XmNset, (hack ? hack->enabled_p : False), NULL);
 
   i = 0;
   if (hack && hack->visual && *hack->visual)
@@ -1348,21 +1348,21 @@ populate_demo_window (Widget toplevel, int which, prefs_pair *pair)
   {
 # ifdef HAVE_XMCOMBOBOX
     Widget text = 0;
-    XtVaGetValues (vis, XmNtextField, &text, 0);
-    XtVaSetValues (vis, XmNselectedPosition, i, 0);
+    XtVaGetValues (vis, XmNtextField, &text, NULL);
+    XtVaSetValues (vis, XmNselectedPosition, i, NULL);
     if (i < 0)
-      XtVaSetValues (text, XmNvalue, hack->visual, 0);
+      XtVaSetValues (text, XmNvalue, hack->visual, NULL);
 # else /* !HAVE_XMCOMBOBOX */
     Cardinal nkids;
     Widget *kids;
     Widget menu;
 
-    XtVaGetValues (vis, XmNsubMenuId, &menu, 0);
+    XtVaGetValues (vis, XmNsubMenuId, &menu, NULL);
     if (!menu) abort ();
-    XtVaGetValues (menu, XmNnumChildren, &nkids, XmNchildren, &kids, 0);
+    XtVaGetValues (menu, XmNnumChildren, &nkids, XmNchildren, &kids, NULL);
     if (!kids) abort();
     if (i < nkids)
-      XtVaSetValues (vis, XmNmenuHistory, kids[i], 0);
+      XtVaSetValues (vis, XmNmenuHistory, kids[i], NULL);
 # endif /* !HAVE_XMCOMBOBOX */
   }
 
@@ -1407,7 +1407,7 @@ maybe_reload_init_file (Widget widget, prefs_pair *pair)
       which = selected_hack_number (widget);
       list = name_to_widget (widget, "list");
 
-      XtVaSetValues (list, XmNitemCount, 0, 0);
+      XtVaSetValues (list, XmNitemCount, 0, NULL);
 
       populate_hack_list (widget, pair);
 
@@ -1478,12 +1478,12 @@ sanity_check_resources (Widget toplevel)
       const char *name = XtName(w);
       XmString xm = 0;
       char *label = 0;
-      XtVaGetValues (w, XmNlabelString, &xm, 0);
+      XtVaGetValues (w, XmNlabelString, &xm, NULL);
       if (xm) XmStringGetLtoR (xm, XmSTRING_DEFAULT_CHARSET, &label);
       if (w && (!label || !strcmp (name, label)))
         {
           xm = XmStringCreate ("ERROR", XmSTRING_DEFAULT_CHARSET);
-          XtVaSetValues (w, XmNlabelString, xm, 0);
+          XtVaSetValues (w, XmNlabelString, xm, NULL);
         }
     }
 }
@@ -1501,17 +1501,17 @@ hack_button_sizes (Widget toplevel)
   Widget down = name_to_widget (toplevel, "down");
   Dimension w1, w2;
 
-  XtVaGetValues (demo, XmNwidth, &w1, 0);
-  XtVaGetValues (man,  XmNwidth, &w2, 0);
-  XtVaSetValues ((w1 > w2 ? man : demo), XmNwidth, (w1 > w2 ? w1 : w2), 0);
+  XtVaGetValues (demo, XmNwidth, &w1, NULL);
+  XtVaGetValues (man,  XmNwidth, &w2, NULL);
+  XtVaSetValues ((w1 > w2 ? man : demo), XmNwidth, (w1 > w2 ? w1 : w2), NULL);
 
-  XtVaGetValues (ok,   XmNwidth, &w1, 0);
-  XtVaGetValues (can,  XmNwidth, &w2, 0);
-  XtVaSetValues ((w1 > w2 ? can : ok), XmNwidth, (w1 > w2 ? w1 : w2), 0);
+  XtVaGetValues (ok,   XmNwidth, &w1, NULL);
+  XtVaGetValues (can,  XmNwidth, &w2, NULL);
+  XtVaSetValues ((w1 > w2 ? can : ok), XmNwidth, (w1 > w2 ? w1 : w2), NULL);
 
-  XtVaGetValues (up,   XmNwidth, &w1, 0);
-  XtVaGetValues (down, XmNwidth, &w2, 0);
-  XtVaSetValues ((w1 > w2 ? down : up), XmNwidth, (w1 > w2 ? w1 : w2), 0);
+  XtVaGetValues (up,   XmNwidth, &w1, NULL);
+  XtVaGetValues (down, XmNwidth, &w2, NULL);
+  XtVaSetValues ((w1 > w2 ? down : up), XmNwidth, (w1 > w2 ? w1 : w2), NULL);
 }
 
 
@@ -1808,7 +1808,7 @@ main (int argc, char **argv)
     *s2 = 0;
     *s4 = 0;
     sprintf (title, "%.50s %.50s, %.50s", progclass, s1, s3);
-    XtVaSetValues (toplevel_shell, XtNtitle, title, 0);
+    XtVaSetValues (toplevel_shell, XtNtitle, title, NULL);
     free (v);
   }
 
@@ -1828,7 +1828,7 @@ main (int argc, char **argv)
   ensure_selected_item_visible (name_to_widget (toplevel_shell, "list"));
 
   XSync (dpy, False);
-  XtVaSetValues (toplevel_shell, XmNallowShellResize, False, 0);
+  XtVaSetValues (toplevel_shell, XmNallowShellResize, False, NULL);
 
 
   /* Handle the -prefs command-line argument. */
@@ -1841,7 +1841,7 @@ main (int argc, char **argv)
       Cardinal nkids = 0;
       if (!tabber) abort();
   
-      XtVaGetValues (tabber, XmNnumChildren, &nkids, XmNchildren, &kids, 0);
+      XtVaGetValues (tabber, XmNnumChildren, &nkids, XmNchildren, &kids, NULL);
       if (!kids) abort();
       if (nkids > 0)
         XtUnmanageChildren (kids, nkids);
index 529bf862326f597d90b395fc76be3a7bdcc11bca..6a73ee0c70853de3b9712f08073e78ac67a1f3e0 100644 (file)
@@ -882,6 +882,16 @@ destroy_passwd_window (saver_info *si)
 }
 
 
+static Bool error_handler_hit_p = False;
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+  error_handler_hit_p = True;
+  return 0;
+}
+
+
 #ifdef HAVE_XHPDISABLERESET
 /* This function enables and disables the C-Sh-Reset hot-key, which
    normally resets the X server (logging out the logged-in user.)
@@ -927,7 +937,16 @@ static void
 xfree_lock_grab_smasher (saver_info *si, Bool lock_p)
 {
   saver_preferences *p = &si->prefs;
-  int status = XF86MiscSetGrabKeysState (si->dpy, !lock_p);
+  int status;
+
+  XErrorHandler old_handler;
+  XSync (si->dpy, False);
+  error_handler_hit_p = False;
+  old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+  XSync (si->dpy, False);
+  status = XF86MiscSetGrabKeysState (si->dpy, !lock_p);
+  XSync (si->dpy, False);
+  if (error_handler_hit_p) status = 666;
 
   if (p->verbose_p && status != MiscExtGrabStateSuccess)
     fprintf (stderr, "%s: error: XF86MiscSetGrabKeysState returned %s\n",
@@ -935,7 +954,12 @@ xfree_lock_grab_smasher (saver_info *si, Bool lock_p)
              (status == MiscExtGrabStateSuccess ? "MiscExtGrabStateSuccess" :
               status == MiscExtGrabStateLocked  ? "MiscExtGrabStateLocked"  :
               status == MiscExtGrabStateAlready ? "MiscExtGrabStateAlready" :
+              status == 666 ? "an X error" :
               "unknown value"));
+
+  XSync (si->dpy, False);
+  XSetErrorHandler (old_handler);
+  XSync (si->dpy, False);
 }
 #endif /* HAVE_XF86MISCSETGRABKEYSSTATE */
 
@@ -1011,9 +1035,6 @@ linux_lock_vt_switch (saver_info *si, Bool lock_p)
  */
 #ifdef HAVE_XF86VMODE
 
-static int ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error);
-static Bool vp_got_error = False;
-
 static void
 xfree_lock_mode_switch (saver_info *si, Bool lock_p)
 {
@@ -1033,10 +1054,11 @@ xfree_lock_mode_switch (saver_info *si, Bool lock_p)
     {
       XSync (si->dpy, False);
       old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+      error_handler_hit_p = False;
       status = XF86VidModeLockModeSwitch (si->dpy, screen, lock_p);
       XSync (si->dpy, False);
       XSetErrorHandler (old_handler);
-      if (vp_got_error) status = False;
+      if (error_handler_hit_p) status = False;
 
       if (status)
         any_mode_locked_p = lock_p;
@@ -1052,14 +1074,6 @@ xfree_lock_mode_switch (saver_info *si, Bool lock_p)
                  blurb(), screen, (lock_p ? "locked" : "unlocked"));
     }
 }
-
-static int
-ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
-{
-  vp_got_error = True;
-  return 0;
-}
-
 #endif /* HAVE_XF86VMODE */
 
 \f
index 1fbe2af9576930004241b858b0a850f60a05e4a9..196e3bc59a494e98c463f926d307027dc6eb6496 100644 (file)
@@ -31,7 +31,7 @@
    Might __APPLE__ be defined if this is apple hardware, but not
    an Apple OS?
 
-   Thanks to Jan Kujawa <kujawa@ultranet.com> for the MacOS X code.
+   Thanks to Alexei Kosut <akosut@stanford.edu> for the MacOS X code.
  */
 #ifdef __APPLE__
 # define HAVE_DARWIN
index d6966bdbe618eba3845786a93e18bcd055d0e2f0..7560d1a41ec487175784a56687f81db48495a77b 100644 (file)
@@ -1,7 +1,7 @@
 /* passwd-pam.c --- verifying typed passwords with PAM
  * (Pluggable Authentication Modules.)
  * written by Bill Nottingham <notting@redhat.com> (and jwz) for
- * xscreensaver, Copyright (c) 1993-2002 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1993-2003 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -52,10 +52,12 @@ extern char *blurb(void);
 #include <pwd.h>
 #include <grp.h>
 #include <security/pam_appl.h>
+#include <signal.h>
+#include <errno.h>
 
 #include <sys/stat.h>
 
-extern void block_sigchld (void);
+extern sigset_t block_sigchld (void);
 extern void unblock_sigchld (void);
 
 /* blargh */
@@ -179,6 +181,8 @@ pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
   struct pam_conv pc;
   struct pam_closure c;
   char *user = 0;
+  sigset_t set;
+  struct timespec timeout;
 
   struct passwd *p = getpwuid (getuid ());
   if (!p) return False;
@@ -242,8 +246,10 @@ pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
 
   PAM_NO_DELAY(pamh);
 
-  block_sigchld();
+  timeout.tv_nsec = 1;
+  set = block_sigchld();
   status = pam_authenticate (pamh, 0);
+  sigtimedwait (&set, NULL, &timeout);
   unblock_sigchld();
 
   if (verbose_p)
@@ -279,7 +285,12 @@ pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
   if (status != PAM_SUCCESS) goto DONE;
 
   PAM_NO_DELAY(pamh);
+
+  set = block_sigchld();
   status = pam_authenticate (pamh, 0);
+  sigtimedwait(&set, NULL, &timeout);
+  unblock_sigchld();
+
   if (verbose_p)
     fprintf (stderr, "%s:   pam_authenticate (...) ==> %d (%s)\n",
              blurb(), status, PAM_STRERROR(pamh, status));
index 04bd856d22e5a3100042fde2401198677a47bddf..9b44698757dfbbc763c917ab6a29be6e5cde9d96 100644 (file)
@@ -1,5 +1,5 @@
 /* dotfile.c --- management of the ~/.xscreensaver file.
- * xscreensaver, Copyright (c) 1998 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1998, 2003 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -1320,6 +1320,10 @@ make_hack_name (const char *shell_command)
     s[0] -= 'a'-'A';
   if (s[0] == 'X' && s[1] >= 'a' && s[1] <= 'z')       /* (magic leading X) */
     s[1] -= 'a'-'A';
+  if (s[0] == 'G' && s[1] == 'l' && 
+      s[2] >= 'a' && s[2] <= 'z')                     /* (magic leading GL) */
+    s[1] -= 'a'-'A',
+    s[2] -= 'a'-'A';
   return s;
 }
 
index 527f379d4b5278ff1b3df095a7d2539e6a93bcd8..463b3189450310fbbeb2f8e5ae552c17537de79e 100644 (file)
@@ -294,17 +294,28 @@ static void describe_dead_child (saver_info *, pid_t, int wait_status);
 static int block_sigchld_handler = 0;
 
 
-void
+#ifdef HAVE_SIGACTION
+ sigset_t
+#else  /* !HAVE_SIGACTION */
+ int
+#endif /* !HAVE_SIGACTION */
 block_sigchld (void)
 {
 #ifdef HAVE_SIGACTION
   sigset_t child_set;
   sigemptyset (&child_set);
   sigaddset (&child_set, SIGCHLD);
+  sigaddset (&child_set, SIGPIPE);
   sigprocmask (SIG_BLOCK, &child_set, 0);
 #endif /* HAVE_SIGACTION */
 
   block_sigchld_handler++;
+
+#ifdef HAVE_SIGACTION
+  return child_set;
+#else  /* !HAVE_SIGACTION */
+  return 0;
+#endif /* !HAVE_SIGACTION */
 }
 
 void
@@ -314,6 +325,7 @@ unblock_sigchld (void)
   sigset_t child_set;
   sigemptyset(&child_set);
   sigaddset(&child_set, SIGCHLD);
+  sigaddset(&child_set, SIGPIPE);
   sigprocmask(SIG_UNBLOCK, &child_set, 0);
 #endif /* HAVE_SIGACTION */
 
index 18484e90bd95e173fe6995248ab91bd52312a85b..1823ad09269fc5948d528f0d2e1628f08c5efea6 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "20-May-2003 (4.10)" "X Version 11"
+.TH XScreenSaver 1 "23-Jun-2003 (4.11)" "X Version 11"
 .SH NAME
 xscreensaver-command - control a running xscreensaver process
 .SH SYNOPSIS
index 71f91d4d0416a3d0452891631afd2c03460c032f..e34800160b894123a21dc3be53a2c8e85311185a 100644 (file)
@@ -906,7 +906,7 @@ Random Screen Saver
            <widget>
              <class>GtkPixmap</class>
              <name>diag_logo</name>
-             <filename>screensaver-diagnostic.xpm</filename>
+             <filename>screensaver-diagnostic.png</filename>
              <xalign>0.5</xalign>
              <yalign>0</yalign>
              <xpad>0</xpad>
@@ -1040,7 +1040,7 @@ Random Screen Saver
            <widget>
              <class>GtkPixmap</class>
              <name>cmap_logo</name>
-             <filename>screensaver-colorselector.xpm</filename>
+             <filename>screensaver-colorselector.png</filename>
              <xalign>0.5</xalign>
              <yalign>0</yalign>
              <xpad>0</xpad>
@@ -1286,7 +1286,7 @@ Random Screen Saver
            <widget>
              <class>GtkPixmap</class>
              <name>dpms_logo</name>
-             <filename>screensaver-power.xpm</filename>
+             <filename>screensaver-power.png</filename>
              <xalign>0.5</xalign>
              <yalign>0</yalign>
              <xpad>0</xpad>
@@ -1685,7 +1685,7 @@ Random Screen Saver
            <widget>
              <class>GtkPixmap</class>
              <name>img_logo</name>
-             <filename>screensaver-snap.xpm</filename>
+             <filename>screensaver-snap.png</filename>
              <xalign>0.5</xalign>
              <yalign>0</yalign>
              <xpad>0</xpad>
@@ -2105,7 +2105,7 @@ Random Screen Saver
            <widget>
              <class>GtkPixmap</class>
              <name>cmd_logo</name>
-             <filename>screensaver-cmndln.xpm</filename>
+             <filename>screensaver-cmndln.png</filename>
              <xalign>0.5</xalign>
              <yalign>0.5</yalign>
              <xpad>4</xpad>
index ae5a73fcb36b5107a488b477534d1bac435d5761..f0828d0b277553ca9e4dfcc186294855fb5cd753 100644 (file)
@@ -880,7 +880,7 @@ Installed</property>
                          <child>
                            <widget class="GtkImage" id="image2">
                              <property name="visible">True</property>
-                             <property name="pixbuf">screensaver-snap.xpm</property>
+                             <property name="pixbuf">screensaver-snap.png</property>
                              <property name="xalign">0</property>
                              <property name="yalign">0</property>
                              <property name="xpad">4</property>
@@ -1085,7 +1085,7 @@ Installed</property>
                          <child>
                            <widget class="GtkImage" id="diag_logo">
                              <property name="visible">True</property>
-                             <property name="pixbuf">screensaver-diagnostic.xpm</property>
+                             <property name="pixbuf">screensaver-diagnostic.png</property>
                              <property name="xalign">0.5</property>
                              <property name="yalign">0</property>
                              <property name="xpad">0</property>
@@ -1218,7 +1218,7 @@ Installed</property>
                          <child>
                            <widget class="GtkImage" id="dpms_logo">
                              <property name="visible">True</property>
-                             <property name="pixbuf">screensaver-power.xpm</property>
+                             <property name="pixbuf">screensaver-power.png</property>
                              <property name="xalign">0.5</property>
                              <property name="yalign">0</property>
                              <property name="xpad">0</property>
@@ -1553,7 +1553,7 @@ Installed</property>
                          <child>
                            <widget class="GtkImage" id="image5">
                              <property name="visible">True</property>
-                             <property name="pixbuf">screensaver-colorselector.xpm</property>
+                             <property name="pixbuf">screensaver-colorselector.png</property>
                              <property name="xalign">0.5</property>
                              <property name="yalign">0</property>
                              <property name="xpad">0</property>
@@ -1978,7 +1978,7 @@ Installed</property>
                      <child>
                        <widget class="GtkImage" id="cmd_logo">
                          <property name="visible">True</property>
-                         <property name="pixbuf">screensaver-cmndln.xpm</property>
+                         <property name="pixbuf">screensaver-cmndln.png</property>
                          <property name="xalign">0.5</property>
                          <property name="yalign">0.5</property>
                          <property name="xpad">4</property>
index c76141afe140e5e6ca9453cf9633245b28f7e16b..135cbe45f1c155aeb38caff4cebd23b8259d67c0 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "20-May-2003 (4.10)" "X Version 11"
+.TH XScreenSaver 1 "23-Jun-2003 (4.11)" "X Version 11"
 .SH NAME
 xscreensaver-demo - interactively control the background xscreensaver daemon
 .SH SYNOPSIS
index 38c38c7b66412c3b4a4425160403b5c75b9fd465..f69bffb17a69c9c2e0185eba96e9aed3ebfa81af 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "20-May-2003 (4.10)" "X Version 11"
+.TH XScreenSaver 1 "23-Jun-2003 (4.11)" "X Version 11"
 .SH NAME
 xscreensaver-getimage-file - put a randomly-selected image on the root window
 .SH SYNOPSIS
index 8c0d24fdfe92cc99ede0d0ceba826d36e0f72e8a..cfeb15da9e0f99b22d90bacbb0e20e26cbd4123d 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "20-May-2003 (4.10)" "X Version 11"
+.TH XScreenSaver 1 "23-Jun-2003 (4.11)" "X Version 11"
 .SH NAME
 xscreensaver-getimage-video - put a video frame on the root window
 .SH SYNOPSIS
index ca978bf649ec046bbb71385ec4474b84ee1fdf4e..9f325df712ce8c0dc1be6a0a39a166d843e76b5b 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "20-May-2003 (4.10)" "X Version 11"
+.TH XScreenSaver 1 "23-Jun-2003 (4.11)" "X Version 11"
 .SH NAME
 xscreensaver-getimage - put some randomly-selected image on the root window
 .SH SYNOPSIS
index 1815180678dc288736216e722c6cf7e38077133f..1077c7543c007298008a77c760222f3851504d60 100644 (file)
@@ -795,7 +795,7 @@ initialize_per_screen_info (saver_info *si, Widget toplevel_shell)
                              XtNvisual, ssi->current_visual,
                              XtNdepth,  visual_depth (ssi->screen,
                                                       ssi->current_visual),
-                             0);
+                             NULL);
 
       if (! found_any_writable_cells)
        {
index 94a0d0cd2a276f97d67db2a20427f900555b767c..81d3e5ad3f360aa8a412c308cd3e18b3aff87553 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1993-2002 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1993-2003 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -374,7 +374,11 @@ extern void maybe_reload_init_file (saver_info *);
    ======================================================================= */
 
 extern void handle_signals (saver_info *si);
-extern void block_sigchld (void);
+#ifdef HAVE_SIGACTION
+ extern sigset_t block_sigchld (void);
+#else  /* !HAVE_SIGACTION */
+ extern int block_sigchld (void);
+#endif /* !HAVE_SIGACTION */
 extern void unblock_sigchld (void);
 extern void hack_environment (saver_info *si);
 extern void hack_subproc_environment (saver_screen_info *ssi);
index 5d9c4ba06d4876d379fe3f001e73bd4f7c48623b..6fc5ad85748035fa281fc4d0e36a494ddd4af17d 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "20-May-2003 (4.10)" "X Version 11"
+.TH XScreenSaver 1 "23-Jun-2003 (4.11)" "X Version 11"
 .SH NAME
 xscreensaver - extensible screen saver framework, plus locking
 .SH SYNOPSIS
index a487ef40486ee08bfa94307a693b5eccb10a035f..05d6a5c692cc8130d740e94cb9649ccdb543df64 100644 (file)
@@ -181,7 +181,7 @@ MEN         = anemone.man ant.man apollonian.man attraction.man \
                  worm.man xflame.man xjack.man xlyap.man xmatrix.man \
                  xrayswarm.man xspirograph.man xsublim.man xteevee.man \
                  zoom.man halftone.man eruption.man metaballs.man \
-                 barcode.man piecewise.man
+                 barcode.man piecewise.man cloudlife.man
 STAR           = *
 EXTRAS         = README Makefile.in xlock_23.h xml2man.pl .gdbinit \
                  config/README \
@@ -1291,10 +1291,6 @@ xlockmore.o: $(srcdir)/xlockmoreI.h
 xlyap.o: ../config.h
 xlyap.o: $(srcdir)/screenhack.h
 xmatrix.o: ../config.h
-xmatrix.o: $(srcdir)/images/matrix0b.xbm
-xmatrix.o: $(srcdir)/images/matrix0b.xpm
-xmatrix.o: $(srcdir)/images/matrix0.xbm
-xmatrix.o: $(srcdir)/images/matrix0.xpm
 xmatrix.o: $(srcdir)/images/matrix1b.xbm
 xmatrix.o: $(srcdir)/images/matrix1b.xpm
 xmatrix.o: $(srcdir)/images/matrix1.xbm
index b2bd384431e0e50ab6b0abc505bc782909e074e2..fbe2a7706d0f1baf4595d74ece97c8df870a2d9e 100644 (file)
@@ -2100,8 +2100,6 @@ linux_fsck (Display *dpy, Window window, int delay)
 static void
 hpux (Display* dpy, Window window, int delay)
 {
-  GC gc;
-  XGCValues gcv;
   XWindowAttributes xgwa;
   scrolling_window *ts;
   const char *sysname;
@@ -2180,6 +2178,7 @@ hpux (Display* dpy, Window window, int delay)
 
   XGetWindowAttributes (dpy, window, &xgwa);
   ts = make_scrolling_window (dpy, window, "HPUX", False);
+  XClearWindow(dpy,window);
   ts->columns = 10000;  /* never wrap */
   ts->sub_x = 0;
   ts->sub_y = 0;
@@ -2198,10 +2197,6 @@ hpux (Display* dpy, Window window, int delay)
   }
 # endif        /* !HAVE_UNAME */
 
-  gcv.foreground = get_pixel_resource ("HPUX.foreground", "HPUX.Foreground",
-                                       dpy, xgwa.colormap);
-  gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv);
-  XFillRectangle (dpy, window, gc, 0, 0, xgwa.width, xgwa.height);
   if (bsod_sleep (dpy, 1))
     goto DONE;
   
@@ -3854,6 +3849,7 @@ char *defaults [] = {
   "*doSolaris:             True",
   "*doHPUX:                True",
   "*doApple2:              True",
+  "*doOS390:               True",
 
   ".Windows.font:         -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
   ".Windows.font2:        -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
@@ -3919,8 +3915,8 @@ char *defaults [] = {
 
   ".HPUX.font:            9x15bold",
   ".HPUX.font2:                   -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
-  ".HPUX.foreground:      Black",
-  ".HPUX.background:      White",
+  ".HPUX.foreground:      White",
+  ".HPUX.background:      Black",
 
   ".OS390.font:                   9x15bold",
   ".OS390.font2:          -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
index 368eb9d55ff5b5d0b8c28b6db4b7aa9e4f7aee91..a799bde4ae01b8f49198d728d9fcdb214c73223a 100644 (file)
@@ -10,6 +10,8 @@
  * Cloudlife only draws one pixel of each cell per tick, whether the cell is
  * alive or dead.  So gliders look like little comets.
 
+ * 20 May 2003 -- now includes color cycling and a man page.
+
  * Based on several examples from the hacks directory of: 
  
  * xscreensaver, Copyright (c) 1997, 1998, 2002 Jamie Zawinski <jwz@jwz.org>
 #define inline                 /* */
 #endif
 
-typedef struct {
+struct field {
     unsigned int height;
     unsigned int width;
     unsigned int max_age;
     unsigned int cell_size;
     unsigned char *cells;
     unsigned char *new_cells;
-} field;
+};
 
 static void 
 *xrealloc(void *p, size_t size)
@@ -63,10 +65,10 @@ static void
     return ret;
 }
 
-field 
+struct field 
 *init_field(void)
 {
-    field *f = xrealloc(NULL, sizeof(field));
+    struct field *f = xrealloc(NULL, sizeof(struct field));
     f->height = 0;
     f->width = 0;
     f->cell_size = get_integer_resource("cellSize", "Integer");
@@ -77,7 +79,7 @@ field
 }
 
 void 
-resize_field(field * f, unsigned int w, unsigned int h)
+resize_field(struct field * f, unsigned int w, unsigned int h)
 {
     f->width = w;
     f->height = h;
@@ -91,14 +93,14 @@ resize_field(field * f, unsigned int w, unsigned int h)
 }
 
 inline unsigned char 
-*cell_at(field * f, unsigned int x, unsigned int y)
+*cell_at(struct field * f, unsigned int x, unsigned int y)
 {
     return (f->cells + x * sizeof(unsigned char) + 
                        y * f->width * sizeof(unsigned char));
 }
 
 inline unsigned char 
-*new_cell_at(field * f, unsigned int x, unsigned int y)
+*new_cell_at(struct field * f, unsigned int x, unsigned int y)
 {
     return (f->new_cells + x * sizeof(unsigned char) + 
                            y * f->width * sizeof(unsigned char));
@@ -106,7 +108,7 @@ inline unsigned char
 
 static void
 draw_field(Display * dpy,
-          Window window, Colormap cmap, GC fgc, GC bgc, field * f)
+          Window window, GC fgc, GC bgc, struct field * f)
 {
     unsigned int x, y;
     unsigned int rx, ry = 0;   /* random amount to offset the dot */
@@ -158,7 +160,7 @@ cell_value(unsigned char c, unsigned int age)
 }
 
 inline unsigned int 
-is_alive(field * f, unsigned int x, unsigned int y)
+is_alive(struct field * f, unsigned int x, unsigned int y)
 {
     unsigned int count;
     unsigned int i, j;
@@ -191,7 +193,7 @@ is_alive(field * f, unsigned int x, unsigned int y)
 }
 
 unsigned int 
-do_tick(field * f)
+do_tick(struct field * f)
 {
     unsigned int x, y;
     unsigned int count = 0;
@@ -219,7 +221,7 @@ random_cell(unsigned int p)
 }
 
 void 
-populate_field(field * f, unsigned int p)
+populate_field(struct field * f, unsigned int p)
 {
     unsigned int x, y;
 
@@ -231,7 +233,7 @@ populate_field(field * f, unsigned int p)
 }
 
 void 
-populate_edges(field * f, unsigned int p)
+populate_edges(struct field * f, unsigned int p)
 {
     unsigned int i;
 
@@ -253,8 +255,10 @@ char *defaults[] = {
     ".background:      black",
     ".foreground:      blue",
     "*cycleDelay:      25000",
+    "*cycleColors:      2",
+    "*ncolors:          64",
     "*maxAge:          64",
-    "*initialDensity:  160",
+    "*initialDensity:  30",
     "*cellSize:                3",
     0
 };
@@ -263,6 +267,8 @@ XrmOptionDescRec options[] = {
     {"-background", ".background", XrmoptionSepArg, 0},
     {"-foreground", ".foreground", XrmoptionSepArg, 0},
     {"-cycle-delay", ".cycleDelay", XrmoptionSepArg, 0},
+    {"-cycle-colors", ".cycleColors", XrmoptionSepArg, 0},
+    {"-ncolors", ".ncolors", XrmoptionSepArg, 0},
     {"-cell-size", ".cellSize", XrmoptionSepArg, 0},
     {"-initial-density", ".initialDensity", XrmoptionSepArg, 0},
     {"-max-age", ".maxAge", XrmoptionSepArg, 0},
@@ -271,24 +277,41 @@ XrmOptionDescRec options[] = {
 
 void screenhack(Display * dpy, Window window)
 {
-    field *f = init_field();
+    struct field *f = init_field();
 
 #ifdef TIME_ME
     time_t start_time = time(NULL);
 #endif
 
     unsigned int cycles = 0;
+    unsigned int colorindex = 0;  /* which color in the colormap are we on */
+    unsigned int colortimer = 0;  /* when this reaches 0, cycle to next color */
+
+    int cycle_delay;
+    int cycle_colors;
+    int ncolors;
+    int density;
 
     GC fgc, bgc;
     XGCValues gcv;
     XWindowAttributes xgwa;
+    XColor *colors = NULL;
+    Bool tmp = True;
+
+    cycle_delay = get_integer_resource("cycleDelay", "Integer");
+    cycle_colors = get_integer_resource("cycleColors", "Integer");
+    ncolors = get_integer_resource("ncolors", "Integer");
+    density = (get_integer_resource("initialDensity", "Integer") 
+                  % 100 * 256)/100;
 
-    unsigned int cycle_delay = (unsigned int)
-       get_integer_resource("cycleDelay", "Integer");
-    unsigned int density = (unsigned int)
-       get_integer_resource("initialDensity", "Integer") & 0xff;
     XGetWindowAttributes(dpy, window, &xgwa);
 
+    if (cycle_colors) {
+        colors = (XColor *) xrealloc(colors, sizeof(XColor) * (ncolors+1));
+        make_smooth_colormap (dpy, xgwa.visual, xgwa.colormap, colors, &ncolors,
+                              True, &tmp, True);
+    }
+
     gcv.foreground = get_pixel_resource("foreground", "Foreground",
                                        dpy, xgwa.colormap);
     fgc = XCreateGC(dpy, window, GCForeground, &gcv);
@@ -298,6 +321,18 @@ void screenhack(Display * dpy, Window window)
     bgc = XCreateGC(dpy, window, GCForeground, &gcv);
 
     while (1) {
+
+        if (cycle_colors) {
+            if (colortimer == 0) {
+               colortimer = cycle_colors;
+               if( colorindex == 0 ) 
+                   colorindex = ncolors;
+               colorindex--;
+               XSetForeground(dpy, fgc, colors[colorindex].pixel);
+            }
+            colortimer--;
+        } 
+
        XGetWindowAttributes(dpy, window, &xgwa);
        if (f->height != xgwa.height / (1 << f->cell_size) + 2 ||
            f->width != xgwa.width / (1 << f->cell_size) + 2) {
@@ -309,7 +344,7 @@ void screenhack(Display * dpy, Window window)
 
        screenhack_handle_events(dpy);
 
-       draw_field(dpy, window, xgwa.colormap, fgc, bgc, f);
+       draw_field(dpy, window, fgc, bgc, f);
 
        if (do_tick(f) < (f->height + f->width) / 4) {
            populate_field(f, density);
@@ -322,7 +357,7 @@ void screenhack(Display * dpy, Window window)
        }
 
        XSync(dpy, False);
-
        cycles++;
 
        if (cycle_delay)
diff --git a/hacks/cloudlife.man b/hacks/cloudlife.man
new file mode 100644 (file)
index 0000000..24c8bd4
--- /dev/null
@@ -0,0 +1,89 @@
+.TH XScreenSaver 6 "20-May-2003" "X Version 11"
+.SH NAME
+cloudlife - a cellular automaton based on Conway's Life
+.SH SYNOPSIS
+.B cloudlife
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-cycle-delay \fImicroseconds\fP] [\-cycle-colors \fIinteger\fP][\-cell-size \fIinteger\fP] [\-initial-density \fIinteger\fP] [\-max-age \fIinteger\fP]
+
+.SH DESCRIPTION
+The \fIcloudlife\fP program draws a cellular
+automaton based on Conway's Life, except that
+cells have a maximum age, and only one pixel per
+cell is drawn every tick.
+.SH OPTIONS
+.I cloudlife
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-cycle-delay \fIinteger\fP
+Time in microseconds to sleep between ticks.  Default 25000.
+.TP 8
+.B \-cycle-colors \fIinteger\fP
+How many ticks should elapse between cycling colors.  0 to disable
+color cycling.  Default 2.
+.TP 8
+.B \-cycle-colors \fIinteger\fP
+How many ticks should elapse between cycling colors.  0 to use
+just one color. Default 1.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 32.
+The colors are chosen randomly.
+.TP 8
+.B \-cell-size \fIinteger\fP
+Size of each cell, in powers of 2.  Default 3 (8-pixel cells).
+.TP 8
+.B \-initial-density \fIinteger\fP
+Percentage of cells that are alive at start and when the
+field is repopulated.  Default 30.  
+.TP 8
+.B \-max-age \fIinteger\fP
+Maximum age for a cell.  Default 64.
+
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+
+Copyright \(co 2003 by Don Marti.  Based on
+examples from the hacks directory of xscreensaver,
+Copyright (c) 1997, 1998, 2002 Jamie Zawinski
+<jwz@jwz.org>
+
+This man page based on the man page of sierpinski,
+Copyright \(co 1996 by Desmond Daignault.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. 
+.SH AUTHOR
+Don Marti <dmarti@zgp.org> 20 May 2003.  
+
index 4ce15db9cb33e72120e5a1c47ecf6f6fb6982f2d..bf9188e3e561965063f4aebdf6c94ed59b93f6c5 100644 (file)
@@ -4,8 +4,8 @@
             a screen saver and locker for the X window system
                             by Jamie Zawinski
 
-                              version 4.10
-                               20-May-2003
+                              version 4.11
+                               23-Jun-2003
 
                      http://www.jwz.org/xscreensaver/
 
diff --git a/hacks/config/blocktube.xml b/hacks/config/blocktube.xml
new file mode 100644 (file)
index 0000000..b4d4ab9
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>\r
+\r
+<screensaver name="blocktube" _label="BlockTube">\r
+\r
+  <command arg="-root"/>\r
+\r
+  <number id="speed" type="slider" arg="-delay %"\r
+          _label="Speed" _low-label="Slow" _high-label="Fast"\r
+          low="0" high="50000" default="10000"\r
+          convert="invert"/>\r
+\r
+  <number id="holdtime" type="slider" arg="-holdtime %"\r
+          _label="Color Hold Time" _low-label="Short" _high-label="Long"\r
+          low="10" high="2000" default="1000"/>\r
+\r
+  <number id="changetime" type="slider" arg="-changetime %"\r
+          _label="Color Change Time" _low-label="Short" _high-label="Long"\r
+          low="10" high="1000" default="200"/>\r
+\r
+  <select id="render">\r
+    <option id="texture"  _label="Reflective Blocks"/>\r
+    <option id="solid"    _label="Solid Blocks" arg-set="-no-texture"/>\r
+    <option id="wire"     _label="Wireframe" arg-set="-wireframe"/>\r
+  </select>\r
+\r
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>\r
+\r
+  <_description>\r
+This hack draws a swirling, falling tunnel of reflective slabs. They fade from\r
+hue to hue.  Written by Lars R. Damerow.\r
+  </_description>\r
+</screensaver>\r
index 8be3592848ed2a682ddb72ee0b2fe10948bc9119..a997016e2ea7c620a906cf36f5eec5c14d17e59f 100644 (file)
@@ -23,7 +23,7 @@
 
   <_description>
 
-Generates cloud-like formations based on a variant of Conway's Life The
+Generates cloud-like formations based on a variant of Conway's Life. The
 difference is that cells have a maximum age, after which they count as
 3 for populating the next generation.  This makes long-lived formations
 explode instead of just sitting there burning a hole in your screen.
diff --git a/hacks/config/cubestorm.xml b/hacks/config/cubestorm.xml
new file mode 100644 (file)
index 0000000..5f6877e
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cubestorm" _label="CubeStorm">
+
+  <command arg="-root"/>
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Animation Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="50000" default="30000"
+          convert="invert"/>
+
+  <number id="speed" type="slider" arg="-speed %"
+          _label="Motion Speed" _low-label="Slow" _high-label="Fast"
+          low="0.01" high="5.0" default="1.0"/>
+
+  <number id="count" type="spinbutton" arg="-count %"
+          _label="Number of Cubes" low="1" high="20" default="4"/>
+
+  <number id="thickness" type="thickness" arg="-thickness %"
+          _label="Strut Thickness" _low-label="Thin" _high-label="Thick"
+          low="0.01" high="1.0" default="0.06"/>
+
+  <hgroup>
+   <boolean id="wander" _label="Wander"    arg-unset="-no-wander"/>
+   <boolean id="spin"   _label="Spin"      arg-unset="-no-spin"/>
+   <boolean id="wire"   _label="Wireframe" arg-set="-wireframe"/>
+  </hgroup>
+
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+  <_description>
+Draws a series of rotating 3D boxes that intersect each other and
+eventually fill space.  Written by Jamie Zawinski.
+  </_description>
+</screensaver>
index cc9e9bb4edc51fdc198d001c2e37dbd2efef3b48..519adbe47afaf99dbc4f8de13ef869ed428edb57 100644 (file)
@@ -24,6 +24,7 @@
    <option id="9" _label="Jaguar XKE (12 cylinders, V)" arg-set="-engine 'Jaguar XKE'"/>
   </select>
 
+  <boolean id="titles" _label="Show Engine Name" arg-set="-titles"/>
   <hgroup>
     <boolean id="wander" _label="Wander" arg-unset="-no-move"/>
     <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
index 2d1ee8fe710b5d91ce79c9bf87ce0a68a74bf6fb..55b09b17f71d752fd761802773c81cc8e2f345fb 100644 (file)
@@ -27,6 +27,8 @@
     <option id="wire"     _label="Wireframe" arg-set="-wireframe"/>
   </select>
 
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
   <_description>
 A fleet of 3d space-age jet-powered flying toasters (and toast!)
 Inspired by the ancient Berkeley Systems After Dark flying toasters.
diff --git a/hacks/config/glknots.xml b/hacks/config/glknots.xml
new file mode 100644 (file)
index 0000000..d7a1653
--- /dev/null
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glknots" _label="GLKnots">
+
+  <command arg="-root"/>
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Animation Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="50000" default="30000"
+          convert="invert"/>
+
+  <number id="speed" type="slider" arg="-speed %"
+          _label="Motion Speed" _low-label="Slow" _high-label="Fast"
+          low="0.01" high="5.0" default="1.0"/>
+
+  <number id="segments" type="slider" arg="-segments %"
+          _label="Resolution" _low-label="Segmented" _high-label="Smooth"
+          low="100" high="2000" default="800"/>
+
+  <number id="thickness" type="thickness" arg="-thickness %"
+          _label="Thickness" _low-label="Thin" _high-label="Thick"
+          low="0.05" high="1.0" default="0.3"/>
+
+  <select id="rotation">
+    <option id="no"  _label="Don't Rotate" arg-set="-no-spin"/>
+    <option id="x"   _label="Rotate around X axis" arg-set="-spin X"/>
+    <option id="y"   _label="Rotate around Y axis" arg-set="-spin Y"/>
+    <option id="z"   _label="Rotate around Z axis" arg-set="-spin Z"/>
+    <option id="xy"  _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+    <option id="xz"  _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+    <option id="yz"  _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+    <option id="xyz" _label="Rotate around all three axes"/>
+  </select>
+
+  <hgroup>
+   <boolean id="wander" _label="Wander"    arg-unset="-no-wander"/>
+   <boolean id="wire"   _label="Wireframe" arg-set="-wireframe"/>
+  </hgroup>
+
+  <hgroup>
+    <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+  </hgroup>
+
+  <_description>
+Generates some twisting 3d knot patterns.  Spins 'em around.
+Written by Jamie Zawinski.
+  </_description>
+</screensaver>
diff --git a/hacks/config/glmatrix.xml b/hacks/config/glmatrix.xml
new file mode 100644 (file)
index 0000000..e7b7650
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glmatrix" _label="GLMatrix">
+
+  <command arg="-root"/>
+
+  <number id="density" type="slider" arg="-density %"
+          _label="Glyph Density" _low-label="Sparse" _high-label="Dense"
+          low="0" high="100" default="20"/>
+
+  <number id="speed" type="slider" arg="-speed %"
+          _label="Glyph Speed" _low-label="Slow" _high-label="Fast"
+          low="0.1" high="8.0" default="1.0"/>
+
+  <number id="delay" type="slider" arg="-delay %"
+          _label="Animation Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="50000" default="30000"
+          convert="invert"/>
+
+  <select id="mode">
+    <option id="matrix" _label="Matrix Encoding"/>
+    <option id="binary" _label="Binary Encoding"      arg-set="-binary"/>
+    <option id="hex"    _label="Hexadecimal Encoding" arg-set="-hexadecimal"/>
+    <option id="dna"    _label="Genetic Encoding"     arg-set="-dna"/>
+  </select>
+
+  <select id="render">
+    <option id="textured"  _label="Draw Glyphs"/>
+    <option id="boxes"     _label="Draw Solid Boxes" arg-set="-no-texture"/>
+    <option id="wireframe" _label="Draw Outlines"    arg-set="-wireframe"/>
+  </select>
+
+  <hgroup>
+   <boolean id="fog"    _label="Fog"     arg-unset="-no-fog"/>
+   <boolean id="waves"  _label="Waves"   arg-unset="-no-waves"/>
+   <boolean id="rotate" _label="Panning" arg-unset="-no-rotate"/>
+  </hgroup>
+
+  <hgroup>
+   <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+  </hgroup>
+
+  <_description>
+Draws 3D dropping characters similar to what is seen in the title sequence
+of "The Matrix".
+
+See also "xmatrix" for a 2D rendering of the similar effect that
+appeared on the computer monitors actually *in* the movie.
+
+Written by Jamie Zawinski.
+  </_description>
+</screensaver>
index 02231e51996e7e8fc257e5fa046f8c0e6da82bab..bf3da8627159afbace22f41797aafb9d44d800c3 100644 (file)
@@ -5,17 +5,30 @@
   <command arg="-root"/>
 
   <number id="duration" type="slider" arg="-duration %"
-          _label="Image Duration"
+          _label="Time until loading a new image:"
           _low-label="10 Seconds" _high-label="5 Minutes"
           low="10" high="300" default="30"/>
 
+  <number id="pan" type="slider" arg="-pan %"
+          _label="Always show at least this much of the image:"
+          _low-label="50%" _high-label="100%"
+          low="50" high="100" default="75"/>
+
+  <number id="pan" type="slider" arg="-pan %"
+          _label="Pan/Zoom Duration:"
+          _low-label="1 Second" _high-label="30 Seconds"
+          low="1" high="30" default="6"/>
+
+  <number id="fade" type="slider" arg="-fade %"
+          _label="Crossfade Duration:"
+          _low-label="None" _high-label="30 Seconds"
+          low="0" high="30" default="6"/>
+
   <number id="speed" type="slider" arg="-delay %"
-          _label="Frame Rate" _low-label="Low" _high-label="High"
+          _label="Frame Rate:" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
           convert="invert"/>
 
-  <boolean id="fade" _label="Fade Between Images" arg-unset="-no-fade"/>
-
   <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
 
   <_description>
@@ -26,6 +39,6 @@ images are loaded on the "Advanced" tab.
 This  program  requires  a good video card capable of supporting large
 textures.
 
-Written by Mike Oliphant and Jamie Zawinski.
+Written by Jamie Zawinski and Mike Oliphant.
   </_description>
 </screensaver>
diff --git a/hacks/config/hypertorus.xml b/hacks/config/hypertorus.xml
new file mode 100644 (file)
index 0000000..03ed689
--- /dev/null
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hypertorus" _label="4D Hypertorus">
+
+  <command arg="-root"/>
+
+  <select id="display-mode">
+    <option id="mesh" _label="Wireframe Mesh"
+            arg-set="-mesh"/>
+    <option id="surface" _label="Solid Surface"
+            arg-set="-surface"/>
+    <option id="transparent" _label="Transparent Surface"
+            arg-set="-transparent"/>
+  </select>
+
+  <select id="appearance">
+    <option id="solid" _label="Solid Object"
+            arg-set="-solid"/>
+    <option id="bands" _label="See-Through Bands"
+            arg-set="-bands"/>
+  </select>
+
+  <select id="colors">
+    <option id="twosided" _label="Two-Sided"
+            arg-set="-twosided"/>
+    <option id="colorwheel" _label="Color Wheel"
+            arg-set="-colorwheel"/>
+  </select>
+
+  <select id="projection3d">
+    <option id="perspective-3d" _label="Perspective 3d"
+            arg-set="-perspective-3d"/>
+    <option id="orthographic-3d" _label="Orthographic 3d"
+            arg-set="-orthographic-3d"/>
+  </select>
+
+  <select id="projection4d">
+    <option id="perspective-4d" _label="Perspective 4d"
+            arg-set="-perspective-4d"/>
+    <option id="orthographic-4d" _label="Orthographic 4d"
+            arg-set="-orthographic-4d"/>
+  </select>
+
+  <hgroup>
+
+    <vgroup>
+
+      <number id="speed-wx" type="slider" arg="-speed-wx %"
+              _label="WX Rotation Speed"
+              _low-label="-4.0" _high-label="4.0"
+              low="-4.0" high="4.0" default="1.1"/>
+
+      <number id="speed-wy" type="slider" arg="-speed-wy %"
+              _label="WY Rotation Speed"
+              _low-label="-4.0" _high-label="4.0"
+              low="-4.0" high="4.0" default="1.3"/>
+
+      <number id="speed-wz" type="slider" arg="-speed-wz %"
+              _label="WZ Rotation Speed"
+              _low-label="-4.0" _high-label="4.0"
+              low="-4.0" high="4.0" default="1.5"/>
+
+    </vgroup>
+
+    <vgroup>
+
+      <number id="speed-xy" type="slider" arg="-speed-xy %"
+              _label="XY Rotation Speed"
+              _low-label="-4.0" _high-label="4.0"
+              low="-4.0" high="4.0" default="1.7"/>
+    
+      <number id="speed-xz" type="slider" arg="-speed-xz %"
+              _label="XZ Rotation Speed"
+              _low-label="-4.0" _high-label="4.0"
+              low="-4.0" high="4.0" default="1.9"/>
+    
+      <number id="speed-yz" type="slider" arg="-speed-yz %"
+              _label="YZ Rotation Speed"
+              _low-label="-4.0" _high-label="4.0"
+              low="-4.0" high="4.0" default="2.1"/>
+    
+    </vgroup>
+
+  </hgroup>
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Display Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="40000" default="25000"
+          convert="invert"/>
+
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+  <_description>
+This program shows a rotating Clifford Torus: a torus lying on the
+"surface" of a 4D hypersphere.  Written by Carsten Steger, inspired by
+Thomas Banchoff's book "Beyond the Third Dimension: Geometry, Computer
+Graphics, and Higher Dimensions", Scientific American Library, 1990.
+  </_description>
+</screensaver>
index 7f369ea19c8fe45a6a0a53563360c55b27777c8e..9a0eacecf3189f3ca9f1375a606abecc8e451e28 100644 (file)
   <string id="phone" _label="Phone Number" arg="-phone %"/>
 
   <_description>
-A rendition of the text scrolls seen in the movie ``The Matrix.''
+Draws dropping characters similar to what is seen on the computer 
+monitors in "The Matrix".
+
+See also "glmatrix" for a 3D rendering of the similar effect that
+appeared in the title sequence of the movie.
+
 Written by Jamie Zawinski.
   </_description>
 </screensaver>
index a7958bb401e2f48fc43c37f71808033766ced4e3..a65a6742bb40b2b1fa3de4d9ee5f77288d7ffd1c 100644 (file)
@@ -92,7 +92,8 @@ SRCS          = xscreensaver-gl-helper.c \
                  toaster_handle2.c toaster_jet.c toaster_knob.c \
                  toaster_slots.c toaster_wing.c toast.c toast2.c \
                  bouncingcow.c cow_face.c cow_hide.c cow_hoofs.c cow_horns.c \
-                 cow_tail.c cow_udder.c glslideshow.c jigglypuff.c klein.c
+                 cow_tail.c cow_udder.c glslideshow.c jigglypuff.c klein.c \
+                 hypertorus.c glmatrix.c cubestorm.c glknots.c blocktube.c
 
 OBJS           = xscreensaver-gl-helper.o \
                  atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
@@ -117,7 +118,8 @@ OBJS                = xscreensaver-gl-helper.o \
                  toaster_handle2.o toaster_jet.o toaster_knob.o \
                  toaster_slots.o toaster_wing.o toast.o toast2.o \
                  bouncingcow.o cow_face.o cow_hide.o cow_hoofs.o cow_horns.o \
-                 cow_tail.o cow_udder.o glslideshow.o jigglypuff.o klein.o
+                 cow_tail.o cow_udder.o glslideshow.o jigglypuff.o klein.o \
+                 hypertorus.o glmatrix.o cubestorm.o glknots.o blocktube.o
 
 GL_EXES                = cage gears moebius pipes sproingies stairs superquadrics \
                  morph3d rubik atlantis lament bubble3d glplanet pulsar \
@@ -125,7 +127,8 @@ GL_EXES             = cage gears moebius pipes sproingies stairs superquadrics \
                  dangerball circuit menger engine flipscreen3d glsnake boxed \
                  glforestfire sballs cubenetic spheremonics lavalite queens \
                  endgame glblur flurry atunnel flyingtoasters bouncingcow \
-                 glslideshow jigglypuff klein
+                 glslideshow jigglypuff klein hypertorus glmatrix cubestorm \
+                 glknots blocktube
 GLE_EXES       = extrusion
 GL_UTIL_EXES   = xscreensaver-gl-helper
 HACK_EXES      = @GL_EXES@ @GLE_EXES@
@@ -153,7 +156,8 @@ GL_MEN              = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  stonerview.man superquadrics.man xscreensaver-gl-helper.man \
                  endgame.man flurry.man glblur.man atunnel.man \
                  flyingtoasters.man bouncingcow.man glslideshow.man \
-                 jigglypuff.man klein.man
+                 jigglypuff.man klein.man hypertorus.man glmatrix.man \
+                 cubestorm.man glknots.man blocktube.man
 MEN            = @GL_MEN@
 EXTRAS         = README Makefile.in dxf2gl.pl
 
@@ -517,6 +521,20 @@ jigglypuff:        jigglypuff.o    xpm-ximage.o $(HACK_OBJS) $(TRACK_OBJS)
 klein:         klein.o         $(HACK_OBJS) $(TRACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
 
+hypertorus:    hypertorus.o    $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+glmatrix:      glmatrix.o      $(HACK_OBJS) xpm-ximage.o
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) xpm-ximage.o $(XPM_LIBS)
+
+cubestorm:     cubestorm.o     $(TRACK_OBJS) $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+
+glknots:       glknots.o       tube.o $(TRACK_OBJS) $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   tube.o $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+
+blocktube:     blocktube.o     $(HACK_OBJS) xpm-ximage.o
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) xpm-ximage.o $(HACK_LIBS) $(XPM_LIBS)
 
 # This one works differently (it's not xlock-like.)
 #
@@ -561,6 +579,9 @@ b_draw.o: $(srcdir)/bubble3d.h
 b_draw.o: ../../config.h
 b_lockglue.o: $(srcdir)/bubble3d.h
 b_lockglue.o: ../../config.h
+blocktube.o: ../../config.h
+blocktube.o: $(HACK_SRC)/images/blocktube.xpm
+blocktube.o: $(srcdir)/xpm-ximage.h
 bouncingcow.o: ../../config.h
 bouncingcow.o: $(srcdir)/gllist.h
 bouncingcow.o: $(srcdir)/gltrackball.h
@@ -587,6 +608,9 @@ cow_udder.o: $(srcdir)/gllist.h
 cubenetic.o: ../../config.h
 cubenetic.o: $(srcdir)/gltrackball.h
 cubenetic.o: $(srcdir)/rotator.h
+cubestorm.o: ../../config.h
+cubestorm.o: $(srcdir)/gltrackball.h
+cubestorm.o: $(srcdir)/rotator.h
 dangerball.o: ../../config.h
 dangerball.o: $(srcdir)/gltrackball.h
 dangerball.o: $(srcdir)/rotator.h
@@ -650,7 +674,15 @@ glforestfire.o: ../../config.h
 glforestfire.o: $(HACK_SRC)/images/ground.xpm
 glforestfire.o: $(HACK_SRC)/images/tree.xpm
 glforestfire.o: $(srcdir)/xpm-ximage.h
+glknots.o: ../../config.h
+glknots.o: $(srcdir)/gltrackball.h
+glknots.o: $(srcdir)/rotator.h
+glknots.o: $(srcdir)/tube.h
 gllist.o: $(srcdir)/gllist.h
+glmatrix.o: ../../config.h
+glmatrix.o: $(srcdir)/gllist.h
+glmatrix.o: $(HACK_SRC)/images/matrix3.xpm
+glmatrix.o: $(srcdir)/xpm-ximage.h
 glplanet.o: ../../config.h
 glplanet.o: $(srcdir)/gltrackball.h
 glplanet.o: $(HACK_SRC)/images/earth.xpm
@@ -674,6 +706,7 @@ glut_stroke.o: $(srcdir)/glutstroke.h
 glut_swidth.o: ../../config.h
 glut_swidth.o: $(srcdir)/glutstroke.h
 grab-ximage.o: ../../config.h
+hypertorus.o: ../../config.h
 jigglypuff.o: ../../config.h
 jigglypuff.o: $(srcdir)/gltrackball.h
 jigglypuff.o: $(HACK_SRC)/images/jigglymap.xpm
diff --git a/hacks/glx/blocktube.c b/hacks/glx/blocktube.c
new file mode 100644 (file)
index 0000000..2542973
--- /dev/null
@@ -0,0 +1,419 @@
+/* blocktube, Copyright (c) 2003 Lars Damerow <lars@oddment.org>
+ *
+ * Based on Jamie Zawinski's original dangerball code.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include <X11/Intrinsic.h>
+
+#define DEBUG 1
+
+extern XtAppContext app;
+
+#define PROGCLASS       "Blocktube"
+#define HACK_INIT       init_blocktube
+#define HACK_DRAW       draw_blocktube
+#define HACK_RESHAPE    reshape_blocktube
+#define EVENT_MASK      PointerMotionMask
+#define blocktube_opts  xlockmore_opts
+
+#define DEF_HOLDTIME    "1000"
+#define DEF_CHANGETIME  "200"
+#define MAX_ENTITIES     1000
+#define DEF_TEXTURE     "True"
+#define DEF_FOG         "True"
+
+#define DEFAULTS        "*delay:       10000           \n" \
+                        "*holdtime:   " DEF_HOLDTIME   "\n" \
+                        "*changetime: " DEF_CHANGETIME "\n" \
+                       "*wireframe:    False           \n" \
+                       "*texture:    " DEF_TEXTURE    "\n" \
+                       "*fog:        " DEF_FOG        "\n" \
+                       "*showFPS:      False           \n" \
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include <math.h>
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#include <GL/glu.h>
+
+#if defined( USE_XPM ) || defined( USE_XPMINC ) || defined( HAVE_XPM )
+/* USE_XPM & USE_XPMINC in xlock mode ; HAVE_XPM in xscreensaver mode */
+#include "xpm-ximage.h"
+#define I_HAVE_XPM
+
+#include "../images/blocktube.xpm"
+#endif /* HAVE_XPM */
+
+typedef struct {
+    GLXContext *glx_context;
+    GLuint  block_dlist;
+} blocktube_configuration;
+
+static int nextID = 1;
+static blocktube_configuration *lps = NULL;
+
+typedef struct {
+    int id, r, g, b;
+    GLfloat tVal;
+    int age;
+    int lifetime;
+    GLfloat position[3];
+    GLfloat angle;
+    GLfloat angularVelocity;
+} entity;
+
+static entity entities[MAX_ENTITIES];
+static float targetR, targetG, targetB,
+             currentR, currentG, currentB,
+             deltaR, deltaG, deltaB;
+static GLint holdtime;
+static GLint changetime;
+static int counter = 0;
+static int changing = 0;
+static GLfloat zoom = 30.0f;
+static GLfloat tilt = 4.5f;
+static GLuint loop;
+static GLuint envTexture;
+static XImage *texti;
+static int do_texture;
+static int do_fog;
+
+GLfloat tunnelLength=200;
+GLfloat tunnelWidth=5;
+
+static XrmOptionDescRec opts[] = {
+    { "-holdtime",  ".holdtime",  XrmoptionSepArg, 0 },
+    { "-changetime",  ".changetime",  XrmoptionSepArg, 0 },
+    {"-texture",     ".texture",   XrmoptionNoArg, (caddr_t) "True" },
+    {"+texture",     ".texture",   XrmoptionNoArg, (caddr_t) "False" },
+    {"-fog",         ".fog",       XrmoptionNoArg, (caddr_t) "True" },
+    {"+fog",         ".fog",       XrmoptionNoArg, (caddr_t) "False" },
+};
+
+static argtype vars[] = {
+    {(caddr_t *) &holdtime, "holdtime",  "Hold Time",  DEF_HOLDTIME,  t_Int},
+    {(caddr_t *) &changetime, "changetime",  "Change Time",  DEF_CHANGETIME, \
+     t_Int},
+    {(caddr_t *) &do_texture, "texture",    "Texture", DEF_TEXTURE,   t_Bool},
+    {(caddr_t *) &do_fog,     "fog",        "Fog",     DEF_FOG,       t_Bool},
+};
+
+static OptionStruct desc[] = {
+    {"-holdtime", "how long to stay on the same color"},
+    {"-changetime", "how long it takes to fade to a new color"},
+};
+
+ModeSpecOpt blocktube_opts = {countof(opts), opts, countof(vars), vars, desc};
+
+#ifdef USE_MODULES
+ModStruct blocktube_description =
+    {"blocktube", "init_blocktube", "draw_blocktube", "release_blocktube",
+     "draw_blocktube", "init_blocktube", (char *)NULL, &blocktube_opts,
+     10000, 30, 1, 1, 64, 1.0, "",
+     "A shifting tunnel of reflective blocks", 0, NULL};
+#endif /* USE_MODULES */
+
+static Bool LoadGLTextures(ModeInfo *mi)
+{
+    Bool status;
+
+    status = True;
+    glGenTextures(1, &envTexture);
+    glBindTexture(GL_TEXTURE_2D, envTexture);
+    texti = xpm_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi), MI_COLORMAP(mi),
+                          envImage_xpm);
+    if (!texti) {
+        status = False;
+    } else {
+        glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texti->width, texti->height, 0,
+            GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, texti->data);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+        glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+        glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+    }
+    return status;
+}
+
+static void newTargetColor(void)
+{
+    targetR = random() % 256;
+    targetG = random() % 256;
+    targetB = random() % 256;
+    deltaR = (targetR - currentR) / changetime;
+    deltaG = (targetG - currentG) / changetime;
+    deltaB = (targetB - currentB) / changetime;
+}
+
+static void randomize_entity (entity *ent)
+{
+    ent->id = nextID++;
+    ent->tVal = 1 - ((float)random() / RAND_MAX / 1.5);
+    ent->age = 0;
+    ent->lifetime = 100;
+    ent->angle = random() % 360;
+    ent->angularVelocity = 0.5-((float)(random()) / RAND_MAX);
+    ent->position[0] = (float)(random()) / RAND_MAX + tunnelWidth;
+    ent->position[1] = (float)(random()) / RAND_MAX * 2;
+    ent->position[2] = -(float)(random()) / RAND_MAX * tunnelLength;
+}
+
+static void entityTick(entity *ent)
+{
+    ent->angle += ent->angularVelocity;
+    ent->position[2] += 0.1;
+    if (ent->position[2] > zoom) {
+        ent->position[2] = -tunnelLength + ((float)(random()) / RAND_MAX) * 20;
+    }
+    ent->age += 0.1;
+}
+
+static void tick(void)
+{
+    counter--;
+    if (!counter) {
+        if (!changing) {
+            newTargetColor();
+            counter = changetime;
+        } else {
+            counter = holdtime;
+        }
+        changing = (!changing);
+    } else {
+        if (changing) {
+            currentR += deltaR;
+            currentG += deltaG;
+            currentB += deltaB;
+        }
+    }
+}
+
+static void cube_vertices(float x, float y, float z, int wire);
+
+void init_blocktube (ModeInfo *mi)
+{
+    GLfloat fogColor[4] = {0,0,0,1};
+    blocktube_configuration *lp;
+    int wire = MI_IS_WIREFRAME(mi);
+
+    if (!lps) {
+      lps = (blocktube_configuration *)
+        calloc (MI_NUM_SCREENS(mi), sizeof (blocktube_configuration));
+      if (!lps) {
+        fprintf(stderr, "%s: out of memory\n", progname);
+        exit(1);
+      }
+      lp = &lps[MI_SCREEN(mi)];
+    }
+
+    lp = &lps[MI_SCREEN(mi)];
+    lp->glx_context = init_GL(mi);
+
+    if (wire) {
+      do_fog = False;
+      do_texture = False;
+      glLineWidth(2);
+    }
+
+    lp->block_dlist = glGenLists (1);
+    glNewList (lp->block_dlist, GL_COMPILE);
+    cube_vertices(0.15, 1.2, 5.25, wire);
+    glEndList ();
+
+#if defined( I_HAVE_XPM )
+    if (do_texture) {
+      if (!LoadGLTextures(mi)) {
+        fprintf(stderr, "%s: can't load textures!\n", progname);
+        exit(1);
+      }
+      glEnable(GL_TEXTURE_2D);
+    }
+#endif
+
+    /* kick on the fog machine */
+    if (do_fog) {
+      glEnable(GL_FOG);
+      glFogi(GL_FOG_MODE, GL_LINEAR);
+      glHint(GL_FOG_HINT, GL_NICEST);
+      glFogf(GL_FOG_START, 0);
+      glFogf(GL_FOG_END, tunnelLength/1.8);
+      glFogfv(GL_FOG_COLOR, fogColor);
+      glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+    }
+    glShadeModel(GL_SMOOTH);
+    glEnable(GL_DEPTH_TEST);
+    glEnable(GL_CULL_FACE);
+    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+    glClearDepth(1.0f);
+
+    if (!do_texture && !wire) {
+      /* If there is no texture, the boxes don't show up without a light.
+         Though I don't understand why all the blocks come out gray.
+       */
+      GLfloat pos[4] = {0.0, 1.0, 1.0, 0.0};
+      GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+      GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+      GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+      glLightfv(GL_LIGHT0, GL_POSITION, pos);
+      glLightfv(GL_LIGHT0, GL_AMBIENT,  amb);
+      glLightfv(GL_LIGHT0, GL_DIFFUSE,  dif);
+      glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+      glEnable(GL_LIGHTING);
+      glEnable(GL_LIGHT0);
+    }
+
+    counter = holdtime;
+    currentR = random() % 256;
+    currentG = random() % 256;
+    currentB = random() % 256;
+    newTargetColor();
+    for (loop = 0; loop < MAX_ENTITIES; loop++)
+    {
+        randomize_entity(&entities[loop]);
+    }
+    reshape_blocktube(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+    glFlush();
+}
+
+void release_blocktube (ModeInfo *mi)
+{
+#if defined ( I_HAVE_XPM )
+    glDeleteTextures(1, &envTexture);
+    XDestroyImage(texti);
+#endif
+}
+
+void reshape_blocktube (ModeInfo *mi, int width, int height)
+{
+    GLfloat h = (GLfloat) height / (GLfloat) width;
+
+    glViewport(0, 0, (GLint) width, (GLint) height);
+    glMatrixMode(GL_PROJECTION);
+    glLoadIdentity();
+    gluPerspective(45.0, 1/h, 1.0, 100.0);
+    glMatrixMode(GL_MODELVIEW);
+}
+
+static void cube_vertices(float x, float y, float z, int wire)
+{
+    float x2, y2, z2, nv = 0.7;
+    x2 = x/2;
+    y2 = y/2;
+    z2 = z/2;
+
+    glFrontFace(GL_CW);
+
+    glNormal3f(0, 0, nv);
+    glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+    glTexCoord2f(0.0, 0.0); glVertex3f(-x2,  y2,  z2);
+    glTexCoord2f(1.0, 0.0); glVertex3f( x2,  y2,  z2);
+    glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2,  z2);
+    glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2,  z2);
+    glEnd();
+
+    glNormal3f(0, 0, -nv);
+    glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+    glTexCoord2f(1.0, 0.0); glVertex3f(-x2, -y2, -z2);
+    glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2, -z2);
+    glTexCoord2f(0.0, 1.0); glVertex3f( x2,  y2, -z2);
+    glTexCoord2f(0.0, 0.0); glVertex3f(-x2,  y2, -z2);
+    glEnd();
+
+    glNormal3f(0, nv, 0);
+    glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+    glTexCoord2f(0.0, 1.0); glVertex3f(-x2,  y2, -z2);
+    glTexCoord2f(0.0, 0.0); glVertex3f( x2,  y2, -z2);
+    glTexCoord2f(1.0, 0.0); glVertex3f( x2,  y2,  z2);
+    glTexCoord2f(1.0, 1.0); glVertex3f(-x2,  y2,  z2);
+    glEnd();
+
+    glNormal3f(0, -nv, 0);
+    glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+    glTexCoord2f(1.0, 1.0); glVertex3f(-x2, -y2, -z2);
+    glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2,  z2);
+    glTexCoord2f(0.0, 0.0); glVertex3f( x2, -y2,  z2);
+    glTexCoord2f(1.0, 0.0); glVertex3f( x2, -y2, -z2);
+    glEnd();
+
+    if (wire) return;
+
+    glNormal3f(nv, 0, 0);
+    glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+    glTexCoord2f(1.0, 0.0); glVertex3f( x2, -y2, -z2);
+    glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2,  z2);
+    glTexCoord2f(0.0, 1.0); glVertex3f( x2,  y2,  z2);
+    glTexCoord2f(0.0, 0.0); glVertex3f( x2,  y2, -z2);
+    glEnd();
+
+    glNormal3f(-nv, 0, 0);
+    glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+    glTexCoord2f(0.0, 0.0); glVertex3f(-x2, -y2, -z2);
+    glTexCoord2f(1.0, 0.0); glVertex3f(-x2,  y2, -z2);
+    glTexCoord2f(1.0, 1.0); glVertex3f(-x2,  y2,  z2);
+    glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2,  z2);
+    glEnd();
+}
+
+static void draw_block(ModeInfo *mi, entity *ent)
+{
+    blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
+    glCallList (lp->block_dlist);
+}
+
+void
+draw_blocktube (ModeInfo *mi)
+{
+    blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
+    Display *dpy = MI_DISPLAY(mi);
+    Window window = MI_WINDOW(mi);
+    entity *cEnt = NULL;
+    int loop = 0;
+
+    if (!lp->glx_context)
+      return;
+
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+    if (do_texture) {
+      glEnable(GL_TEXTURE_GEN_S);
+      glEnable(GL_TEXTURE_GEN_T);
+      glBindTexture(GL_TEXTURE_2D, envTexture);
+    }
+
+    for (loop = 0; loop < MAX_ENTITIES; loop++) {
+        cEnt = &entities[loop];
+
+        glLoadIdentity();
+        glTranslatef(0.0f, 0.0f, zoom);
+        glRotatef(tilt, 1.0f, 0.0f, 0.0f);
+        glRotatef(cEnt->angle, 0.0f, 0.0f, 1.0f);
+        glTranslatef(cEnt->position[0], cEnt->position[1], cEnt->position[2]);
+        glColor4ub((int)(currentR * cEnt->tVal),
+                   (int)(currentG * cEnt->tVal),
+                   (int)(currentB * cEnt->tVal), 255);
+        draw_block(mi, cEnt);
+        entityTick(cEnt);
+    }
+    tick();
+
+    if (mi->fps_p) do_fps (mi);
+    glFinish();
+    glXSwapBuffers(dpy, window);
+}
+
+#endif /* USE_GL */
diff --git a/hacks/glx/blocktube.man b/hacks/glx/blocktube.man
new file mode 100644 (file)
index 0000000..7b3963c
--- /dev/null
@@ -0,0 +1,73 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+blocktube - draws a swirling, falling tunnel of reflective slabs
+.SH SYNOPSIS
+.B blocktube
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-holdtime \fInumber\fP]
+[\-changetime \fInumber\fP]
+[\-no-texture]
+[\-no-fog]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Blocktube draws a swirling, falling tunnel of reflective slabs. They fade 
+from hue to hue.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-holdtime \fInumber\fP
+How long to stay on the same color.  Default: 1000 frames.
+.TP 8
+.B \-changetime \fInumber\fP
+How long it takes to fade to a new color.  Default: 200 frames.
+.TP 8
+.B \-no-texture
+Draw solid blocks intstead of reflective blocks.
+.TP 8
+.B \-no-fog
+Do not make blocks in the distance be darker.
+.TP 8
+.B \-wireframe
+Only draw outlines.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Lars Damerow.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Lars Damerow <lars@oddment.org>
diff --git a/hacks/glx/cubestorm.c b/hacks/glx/cubestorm.c
new file mode 100644 (file)
index 0000000..cfc53c0
--- /dev/null
@@ -0,0 +1,423 @@
+/* cubestorm, Copyright (c) 2003 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include <X11/Intrinsic.h>
+
+extern XtAppContext app;
+
+#define PROGCLASS      "CubeStorm"
+#define HACK_INIT      init_cube
+#define HACK_DRAW      draw_cube
+#define HACK_RESHAPE   reshape_cube
+#define HACK_HANDLE_EVENT cube_handle_event
+#define EVENT_MASK      PointerMotionMask
+#define sws_opts       xlockmore_opts
+
+#define DEF_SPIN        "True"
+#define DEF_WANDER      "True"
+#define DEF_SPEED       "1.0"
+#define DEF_THICKNESS   "0.06"
+#define DEF_COUNT       "4"
+
+#define DEFAULTS       "*delay:        30000       \n" \
+                       "*count:        30          \n" \
+                       "*showFPS:      False       \n" \
+                       "*fpsSolid:     True        \n" \
+                       "*wireframe:    False       \n" \
+                       "*speed:      " DEF_SPEED " \n" \
+                       "*spin:       " DEF_SPIN   "\n" \
+                       "*wander:     " DEF_WANDER "\n" \
+                       "*thickness:  " DEF_THICKNESS "\n" \
+                       "*count:      " DEF_COUNT   "\n" \
+
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#include <GL/glu.h>
+
+typedef struct {
+  rotator *rot;
+  int ccolor;
+} subcube;
+
+typedef struct {
+  GLXContext *glx_context;
+  trackball_state *trackball;
+  Bool button_down_p;
+  Bool clear_p;
+
+  GLuint cube_list;
+
+  int ncolors;
+  XColor *colors;
+
+  subcube *subcubes;
+
+} cube_configuration;
+
+static cube_configuration *bps = NULL;
+
+static Bool do_spin;
+static Bool do_wander;
+static GLfloat speed;
+static GLfloat thickness;
+
+static XrmOptionDescRec opts[] = {
+  { "-spin",   ".spin",   XrmoptionNoArg, "True" },
+  { "+spin",   ".spin",   XrmoptionNoArg, "False" },
+  { "-wander", ".wander", XrmoptionNoArg, "True" },
+  { "+wander", ".wander", XrmoptionNoArg, "False" },
+  { "-speed",  ".speed",  XrmoptionSepArg, 0 },
+  { "-thickness", ".thickness",  XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_Bool},
+  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {(caddr_t *) &speed,     "speed",  "Speed",  DEF_SPEED,  t_Float},
+  {(caddr_t *) &thickness, "thickness", "Thickness",  DEF_THICKNESS,  t_Float},
+};
+
+ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static void
+draw_face (ModeInfo *mi)
+{
+  int wire = MI_IS_WIREFRAME(mi);
+
+  int i;
+  GLfloat t = thickness / 2;
+  GLfloat a = -0.5;
+  GLfloat b =  0.5;
+
+  if (t <= 0) t = 0.001;
+  else if (t > 0.5) t = 0.5;
+
+  glPushMatrix();
+  glFrontFace(GL_CW);
+
+  for (i = 0; i < 4; i++)
+    {
+      glNormal3f (0, 0, -1);
+      glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+      glVertex3f (a,   a,   a);
+      glVertex3f (b,   a,   a);
+      glVertex3f (b-t, a+t, a);
+      glVertex3f (a+t, a+t, a);
+      glEnd();
+
+      glNormal3f (0, 1, 0);
+      glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+      glVertex3f (b-t, a+t, a);
+      glVertex3f (b-t, a+t, a+t);
+      glVertex3f (a+t, a+t, a+t);
+      glVertex3f (a+t, a+t, a);
+      glEnd();
+
+      glRotatef(90, 0, 0, 1);
+    }
+  glPopMatrix();
+}
+
+static void
+draw_faces (ModeInfo *mi)
+{
+  glPushMatrix();
+  draw_face (mi);
+  glRotatef (90,  0, 1, 0); draw_face (mi);
+  glRotatef (90,  0, 1, 0); draw_face (mi);
+  glRotatef (90,  0, 1, 0); draw_face (mi);
+  glRotatef (90,  1, 0, 0); draw_face (mi);
+  glRotatef (180, 1, 0, 0); draw_face (mi);
+  glPopMatrix();
+}
+
+
+static void
+new_cube_colors (ModeInfo *mi)
+{
+  cube_configuration *bp = &bps[MI_SCREEN(mi)];
+  int i;
+  bp->ncolors = 128;
+  if (bp->colors) free (bp->colors);
+  bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+  make_smooth_colormap (0, 0, 0,
+                        bp->colors, &bp->ncolors,
+                        False, 0, False);
+  for (i = 0; i < MI_COUNT(mi); i++)
+    bp->subcubes[i].ccolor = random() % bp->ncolors;
+}
+
+
+/* Window management, etc
+ */
+void
+reshape_cube (ModeInfo *mi, int width, int height)
+{
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  glViewport (0, 0, (GLint) width, (GLint) height);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  gluLookAt( 0.0, 0.0, 45.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+  cube_configuration *bp = &bps[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      bp->button_down_p = True;
+      gltrackball_start (bp->trackball,
+                         event->xbutton.x, event->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button & Button1)
+    {
+      bp->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           bp->button_down_p)
+    {
+      gltrackball_track (bp->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+  else if (event->xany.type == KeyPress)
+    {
+      KeySym keysym;
+      char c = 0;
+      XLookupString (&event->xkey, &c, 1, &keysym, 0);
+      if (c == ' ')
+        {
+          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+          return True;
+        }
+      else if (c == '\r' || c == '\n')
+        {
+          new_cube_colors (mi);
+          return True;
+        }
+    }
+  return False;
+}
+
+
+void 
+init_cube (ModeInfo *mi)
+{
+  cube_configuration *bp;
+  int wire = MI_IS_WIREFRAME(mi);
+  int i;
+
+  if (!bps) {
+    bps = (cube_configuration *)
+      calloc (MI_NUM_SCREENS(mi), sizeof (cube_configuration));
+    if (!bps) {
+      fprintf(stderr, "%s: out of memory\n", progname);
+      exit(1);
+    }
+
+    bp = &bps[MI_SCREEN(mi)];
+  }
+
+  bp = &bps[MI_SCREEN(mi)];
+
+  bp->glx_context = init_GL(mi);
+
+  if (MI_COUNT(mi) <= 0) MI_COUNT(mi) = 1;
+
+  bp->trackball = gltrackball_init ();
+  bp->subcubes = (subcube *) calloc (MI_COUNT(mi), sizeof(subcube));
+  for (i = 0; i < MI_COUNT(mi); i++)
+    {
+      double wander_speed, spin_speed, spin_accel;
+
+      if (i == 0)
+        {
+          wander_speed = 0.05 * speed;
+          spin_speed   = 10.0 * speed;
+          spin_accel   = 4.0  * speed;
+        }
+      else
+        {
+          wander_speed = 0;
+          spin_speed   = 4.0 * speed;
+          spin_accel   = 2.0 * speed;
+        }
+
+      bp->subcubes[i].rot = make_rotator (do_spin ? spin_speed : 0,
+                                          do_spin ? spin_speed : 0,
+                                          do_spin ? spin_speed : 0,
+                                          spin_accel,
+                                          do_wander ? wander_speed : 0,
+                                          True);
+    }
+
+  bp->colors = 0;
+  new_cube_colors (mi);
+
+  reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+  if (!wire)
+    {
+      GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+      GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+      GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+      GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+      glEnable(GL_LIGHTING);
+      glEnable(GL_LIGHT0);
+      glEnable(GL_DEPTH_TEST);
+      glEnable(GL_CULL_FACE);
+
+      glLightfv(GL_LIGHT0, GL_POSITION, pos);
+      glLightfv(GL_LIGHT0, GL_AMBIENT,  amb);
+      glLightfv(GL_LIGHT0, GL_DIFFUSE,  dif);
+      glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+    }
+
+  bp->cube_list = glGenLists (1);
+  glNewList (bp->cube_list, GL_COMPILE);
+  draw_faces (mi);
+  glEndList ();
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+void
+draw_cube (ModeInfo *mi)
+{
+  cube_configuration *bp = &bps[MI_SCREEN(mi)];
+  Display *dpy = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+  int wire = MI_IS_WIREFRAME(mi);
+  int i;
+  double x, y, z;
+
+  if (!bp->glx_context)
+    return;
+
+  glShadeModel(GL_SMOOTH);
+
+  glEnable(GL_DEPTH_TEST);
+  glEnable(GL_NORMALIZE);
+  glEnable(GL_CULL_FACE);
+
+  if (bp->clear_p)   /* we're in "no vapor trails" mode */
+    {
+      glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
+      if (! (random() % (int) (25 / speed)))
+        bp->clear_p = False;
+    }
+  else
+    {
+      if (! (random() % (int) (200 / speed)))
+        {
+          bp->clear_p = True;
+          new_cube_colors (mi);
+        }
+    }
+
+  glPushMatrix ();
+
+  glScalef(1.1, 1.1, 1.1);
+
+  mi->polygon_count = 0;
+
+  get_position (bp->subcubes[0].rot, &x, &y, &z, !bp->button_down_p);
+  glTranslatef((x - 0.5) * 15,
+               (y - 0.5) * 15,
+               (z - 0.5) * 30);
+  gltrackball_rotate (bp->trackball);
+
+  glScalef (4.0, 4.0, 4.0);
+
+  for (i = 0; i < MI_COUNT(mi); i++)
+    {
+      static GLfloat bcolor[4] = {0.0, 0.0, 0.0, 1.0};
+      static GLfloat bspec[4]  = {1.0, 1.0, 1.0, 1.0};
+      static GLfloat bshiny    = 128.0;
+
+      glPushMatrix();
+
+      if (i != 0)  /* N+1 cubes rotate relative to cube 0 */
+        {
+          get_rotation (bp->subcubes[0].rot, &x, &y, &z, False);
+          glRotatef (x * 360, 1.0, 0.0, 0.0);
+          glRotatef (y * 360, 0.0, 1.0, 0.0);
+          glRotatef (z * 360, 0.0, 0.0, 1.0);
+        }
+
+      get_rotation (bp->subcubes[i].rot, &x, &y, &z, !bp->button_down_p);
+      glRotatef (x * 360, 1.0, 0.0, 0.0);
+      glRotatef (y * 360, 0.0, 1.0, 0.0);
+      glRotatef (z * 360, 0.0, 0.0, 1.0);
+
+      bcolor[0] = bp->colors[bp->subcubes[i].ccolor].red   / 65536.0;
+      bcolor[1] = bp->colors[bp->subcubes[i].ccolor].green / 65536.0;
+      bcolor[2] = bp->colors[bp->subcubes[i].ccolor].blue  / 65536.0;
+      bp->subcubes[i].ccolor++;
+      if (bp->subcubes[i].ccolor >= bp->ncolors)
+        bp->subcubes[i].ccolor = 0;
+
+      if (wire)
+        glColor3f (bcolor[0], bcolor[1], bcolor[2]);
+      else
+        {
+          glMaterialfv (GL_FRONT, GL_SPECULAR,            bspec);
+          glMateriali  (GL_FRONT, GL_SHININESS,           bshiny);
+          glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
+        }
+
+      glCallList (bp->cube_list);
+      mi->polygon_count += (4 * 2 * 6);
+
+      glPopMatrix();
+    }
+
+  glPopMatrix ();
+
+  if (mi->fps_p) do_fps (mi);
+  glFinish();
+
+  glXSwapBuffers(dpy, window);
+}
+
+#endif /* USE_GL */
diff --git a/hacks/glx/cubestorm.man b/hacks/glx/cubestorm.man
new file mode 100644 (file)
index 0000000..cc9a5bc
--- /dev/null
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cubestorm - a series of 3D boxes that fill space
+.SH SYNOPSIS
+.B cubestorm
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIfloat\fP]
+[\-count \fIint\fP]
+[\-thickness \fIfloat\fP]
+[\-no-wander]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws a series of rotating 3D boxes that intersect each other and
+eventually fill space.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Larger numbers mean run faster.  Default: 1.0.
+.TP 8
+.B \-count \fInumber\fP
+Number of cubes.  Default 4.
+.TP 8
+.B \-thickness \fIfloat\fP
+How thick the struts making up the cubes should be (0.0-1.0).  Default 0.06.
+.TP 8
+.B \-wander | \-no-wander
+Whether the cubes should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the cubes should spin.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
index 6f3f9d46808a2a88098414c50363ded4e86b8ff8..64de8a87bcc7414ab53cad8aa829391eeb46a36f 100644 (file)
@@ -1,4 +1,4 @@
-/* dangerball, Copyright (c) 2001, 2002 Jamie Zawinski <jwz@jwz.org>
+/* dangerball, Copyright (c) 2001, 2002, 2003 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -296,7 +296,7 @@ init_ball (ModeInfo *mi)
   glNewList (bp->spike_list, GL_COMPILE);
   cone (0, 0, 0,
         0, 1, 0,
-        1, 0, SPIKE_FACES, SMOOTH_SPIKES, wire);
+        1, 0, SPIKE_FACES, SMOOTH_SPIKES, False, wire);
   glEndList ();
 
   randomize_spikes (mi);
index 4b9b1d4da76b6be07d93a61606db710bce6af53f..2febb1d42bd31857c8938de2eddce8c058830813 100644 (file)
 /* insert defaults here */
 
 #define DEF_ENGINE "(none)"
+#define DEF_TITLES "False"
+#define DEF_SPIN   "True"
+#define DEF_WANDER "True"
 
 #define DEFAULTS        "*delay:           10000        \n" \
                         "*showFPS:         False        \n" \
                         "*move:            True         \n" \
                         "*spin:            True         \n" \
                         "*engine:        " DEF_ENGINE  "\n" \
+                       "*titles:        " DEF_TITLES  "\n" \
+                       "*titleFont:  -*-times-bold-r-normal-*-180-*\n" \
 
-# include "xlockmore.h"                         /* from the xscreensaver distribution */
+# include "xlockmore.h"              /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
-# include "xlock.h"                                     /* from the xlockmore distribution */
+# include "xlock.h"                  /* from the xlockmore distribution */
 #endif /* !STANDALONE */
 
 #include "rotator.h"
@@ -70,19 +75,23 @@ static char *which_engine;
 static int move;
 static int movepaused = 0;
 static int spin;
+static Bool do_titles;
 
 static XrmOptionDescRec opts[] = {
-  {"-engine", ".engine.engine", XrmoptionSepArg, DEF_ENGINE },
-  {"-move", ".engine.move", XrmoptionNoArg, (caddr_t) "true" },
-  {"+move", ".engine.move", XrmoptionNoArg, (caddr_t) "false" },
-  {"-spin", ".engine.spin", XrmoptionNoArg, (caddr_t) "true" },
-  {"+spin", ".engine.spin", XrmoptionNoArg, (caddr_t) "false" },
+  {"-engine",  ".engine.engine", XrmoptionSepArg, DEF_ENGINE },
+  {"-move",    ".engine.move",   XrmoptionNoArg, (caddr_t) "True"  },
+  {"+move",    ".engine.move",   XrmoptionNoArg, (caddr_t) "False" },
+  {"-spin",    ".engine.spin",   XrmoptionNoArg, (caddr_t) "True"  },
+  {"+spin",    ".engine.spin",   XrmoptionNoArg, (caddr_t) "False" },
+  { "-titles", ".engine.titles", XrmoptionNoArg, (caddr_t) "True"  },
+  { "+titles", ".engine.titles", XrmoptionNoArg, (caddr_t) "False" },
 };
 
 static argtype vars[] = {
   {(caddr_t *) &which_engine, "engine", "Engine", DEF_ENGINE, t_String},
-  {(caddr_t *) &move, "move", "Move", "True", t_Bool},
-  {(caddr_t *) &spin, "spin", "Spin", "True", t_Bool},
+  {(caddr_t *) &move,         "move",   "Move",   DEF_WANDER, t_Bool},
+  {(caddr_t *) &spin,         "spin",   "Spin",   DEF_SPIN,   t_Bool},
+  {(caddr_t *) &do_titles,    "titles", "Titles", DEF_TITLES, t_Bool},
 };
 
 ModeSpecOpt engine_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -108,6 +117,9 @@ typedef struct {
   rotator *rot;
   trackball_state *trackball;
   Bool button_down_p;
+  XFontStruct *xfont;
+  GLuint font_dlist;
+  char *engine_name;
 } Engine;
 
 static Engine *engine = NULL;
@@ -175,10 +187,11 @@ float tan_table[TWOREV];
  * To avoid going completely insane, we also reorder these so the newly 
  * renumbered cylinder 0 is always first: 0-3-4-1-2-5
  *   
- * For a flat 6, the included angle is 180 degrees (0 would be a inline engine).
- * Because these are all four-stroke engines, each piston goes through
- * 720 degrees of rotation for each time the spark plug sparks, so in this case,
- * we would use the following angles:
+ * For a flat 6, the included angle is 180 degrees (0 would be a inline
+ * engine).  Because these are all four-stroke engines, each piston goes
+ * through 720 degrees of rotation for each time the spark plug sparks,
+ * so in this case, we would use the following angles:
+ *
  * cylinder     firing order     angle
  * --------     ------------     -----
  *    0               0             0
@@ -269,9 +282,10 @@ int find_engine(const char *name)
  in one frame can be a bit harsh..
 */
 
-void make_tables(void) {
-int i;
-float f;
+void make_tables(void)
+{
+  int i;
+  float f;
 
   f = ONEREV / (M_PI * 2);
   for (i = 0 ; i <= TWOREV ; i++) {
@@ -290,16 +304,17 @@ float f;
 /* angle is how far around the axis to go (up to 360) */
 
 void cylinder (GLfloat x, GLfloat y, GLfloat z, 
-    float length, float outer, float inner, int endcaps, int sang, int eang) {
-int a; /* current angle around cylinder */
-int b = 0; /* previous */
-int angle, norm, step, sangle;
-float z1, y1, z2, y2, ex=0;
-float y3, z3;
-float Z1, Y1, Z2, Y2, xl, Y3, Z3;
-GLfloat y2c[TWOREV], z2c[TWOREV];
-GLfloat ony, onz; /* previous normals */
-int nsegs, tube = 0;
+    float length, float outer, float inner, int endcaps, int sang, int eang)
+{
+  int a; /* current angle around cylinder */
+  int b = 0; /* previous */
+  int angle, norm, step, sangle;
+  float z1, y1, z2, y2, ex=0;
+  float y3, z3;
+  float Z1, Y1, Z2, Y2, xl, Y3, Z3;
+  GLfloat y2c[TWOREV], z2c[TWOREV];
+  GLfloat ony, onz; /* previous normals */
+  int nsegs, tube = 0;
 
   glPushMatrix();
   nsegs = outer*(MAX(win_w, win_h)/200);
@@ -436,7 +451,8 @@ int nsegs, tube = 0;
 }
 
 /* this is just a convenience function to make a solid rod */
-void rod (GLfloat x, GLfloat y, GLfloat z, float length, float diameter) {
+void rod (GLfloat x, GLfloat y, GLfloat z, float length, float diameter)
+{
     cylinder(x, y, z, length, diameter, diameter, 3, 0, ONEREV);
 }
 
@@ -461,10 +477,11 @@ GLvoid normal(GLfloat v1[], GLfloat v2[], GLfloat v3[],
 
 
 void Rect(GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h,
-            GLfloat t) {
-GLfloat yh;
-GLfloat xw;
-GLfloat zt;
+            GLfloat t)
+{
+  GLfloat yh;
+  GLfloat xw;
+  GLfloat zt;
 
   yh = y+h; xw = x+w; zt = z - t;
 
@@ -507,9 +524,10 @@ GLfloat zt;
   glEnd();
 }
 
-void makepiston(void) {
-GLfloat colour[] = {0.6, 0.6, 0.6, 1.0};
-int i;
+void makepiston(void)
+{
+  GLfloat colour[] = {0.6, 0.6, 0.6, 1.0};
+  int i;
   
   i = glGenLists(1);
   glNewList(i, GL_COMPILE);
@@ -525,17 +543,19 @@ int i;
   glEndList();
 }
 
-void CrankBit(GLfloat x) {
+void CrankBit(GLfloat x)
+{
   Rect(x, -1.4, 0.5, 0.2, 1.8, 1);
   cylinder(x, -0.5, 0, 0.2, 2, 2, 1, 60, 120);
 }
 
-void boom(GLfloat x, GLfloat y, int s) {
-static GLfloat red[] = {0, 0, 0, 0.9};
-static GLfloat lpos[] = {0, 0, 0, 1};
-static GLfloat d = 0, wd;
-int flameOut = 720/ENG.speed/ENG.cylinders;
-static int time = 0;
+void boom(GLfloat x, GLfloat y, int s)
+{
+  static GLfloat red[] = {0, 0, 0, 0.9};
+  static GLfloat lpos[] = {0, 0, 0, 1};
+  static GLfloat d = 0, wd;
+  int flameOut = 720/ENG.speed/ENG.cylinders;
+  static int time = 0;
 
   if (time == 0 && s) {
     red[0] = red[1] = 0;
@@ -575,17 +595,17 @@ static int time = 0;
   glDisable(GL_BLEND);
 }
 
-void display(Engine *e) {
-
-static int a = 0;
-GLfloat zb, yb;
-static GLfloat ln[730], yp[730], ang[730];
-static int ln_init = 0;
-static int lastPlug = 0;
-int half;
-int sides;
-int j, b;
-static float rightSide;
+void display(Engine *e)
+{
+  static int a = 0;
+  GLfloat zb, yb;
+  static GLfloat ln[730], yp[730], ang[730];
+  static int ln_init = 0;
+  static int lastPlug = 0;
+  int half;
+  int sides;
+  int j, b;
+  static float rightSide;
 
   glEnable(GL_LIGHTING);
   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
@@ -672,8 +692,10 @@ static float rightSide;
          b = (a+HALFREV+ENG.pistonAngle[j+half]) % TWOREV; 
          glPushMatrix();
          glRotatef(ang[b], 0, 1, 0);
-         rod(-cos_table[b], -crankWidth/2-crankOffset*(j+half), -sin_table[b], 
-               ln[b], 0.2);
+         rod(-cos_table[b],
+              -crankWidth/2-crankOffset*(j+half),
+              -sin_table[b], 
+              ln[b], 0.2);
          glPopMatrix();
       }
       glPopMatrix();
@@ -736,11 +758,12 @@ static float rightSide;
   glFlush();
 }
 
-void makeshaft (void) {
-int i;
-int j;
-const static float crankThick = 0.2;
-const static float crankDiam = 0.3;
+void makeshaft (void)
+{
+  int i;
+  int j;
+  const static float crankThick = 0.2;
+  const static float crankDiam = 0.3;
 
   i = glGenLists(1);
   glNewList(i, GL_COMPILE);
@@ -757,10 +780,11 @@ const static float crankDiam = 0.3;
    */
   rod(-2, 0, 0, 2, crankDiam);
 
-  /* Each crank is crankWidth units wide and the total width of a cylinder assembly
-   * is 3.3 units. For inline engines, there is just a single crank per cylinder
-   * width.  For other engine configurations, there is a crank between each pair
-   * of adjacent cylinders on one side of the engine, so the crankOffset length is 
+  /* Each crank is crankWidth units wide and the total width of a
+   * cylinder assembly is 3.3 units. For inline engines, there is just
+   * a single crank per cylinder width.  For other engine
+   * configurations, there is a crank between each pair of adjacent
+   * cylinders on one side of the engine, so the crankOffset length is
    * halved.
    */
   crankOffset = 3.3;
@@ -793,9 +817,93 @@ const static float crankDiam = 0.3;
   glEndList();
 }
 
-void reshape_engine(ModeInfo *mi, int width, int height)
+static void
+load_font (ModeInfo *mi, char *res, XFontStruct **fontP, GLuint *dlistP)
 {
+  const char *font = get_string_resource (res, "Font");
+  XFontStruct *f;
+  Font id;
+  int first, last;
+
+  if (!font) font = "-*-times-bold-r-normal-*-180-*";
+
+  f = XLoadQueryFont(mi->dpy, font);
+  if (!f) f = XLoadQueryFont(mi->dpy, "fixed");
 
+  id = f->fid;
+  first = f->min_char_or_byte2;
+  last = f->max_char_or_byte2;
+  
+  clear_gl_error ();
+  *dlistP = glGenLists ((GLuint) last+1);
+  check_gl_error ("glGenLists");
+  glXUseXFont(id, first, last-first+1, *dlistP + first);
+  check_gl_error ("glXUseXFont");
+
+  *fontP = f;
+}
+
+
+static void
+print_title_string (ModeInfo *mi, const char *string, GLfloat x, GLfloat y)
+{
+  Engine *e = &engine[MI_SCREEN(mi)];
+  XFontStruct *font = e->xfont;
+  GLfloat line_height = font->ascent + font->descent;
+
+  y -= line_height;
+
+  glPushAttrib (GL_TRANSFORM_BIT |  /* for matrix contents */
+                GL_ENABLE_BIT);     /* for various glDisable calls */
+  glDisable (GL_LIGHTING);
+  glDisable (GL_DEPTH_TEST);
+  {
+    glMatrixMode(GL_PROJECTION);
+    glPushMatrix();
+    {
+      glLoadIdentity();
+
+      glMatrixMode(GL_MODELVIEW);
+      glPushMatrix();
+      {
+        int i;
+        int x2 = x;
+        glLoadIdentity();
+
+        gluOrtho2D (0, mi->xgwa.width, 0, mi->xgwa.height);
+
+        glRasterPos2f (x, y);
+        for (i = 0; i < strlen(string); i++)
+          {
+            char c = string[i];
+            if (c == '\n')
+              {
+                glRasterPos2f (x, (y -= line_height));
+                x2 = x;
+              }
+            else
+              {
+                glCallList (e->font_dlist + (int)(c));
+                x2 += (font->per_char
+                       ? font->per_char[c - font->min_char_or_byte2].width
+                       : font->min_bounds.width);
+              }
+          }
+      }
+      glPopMatrix();
+    }
+    glMatrixMode(GL_PROJECTION);
+    glPopMatrix();
+  }
+  glPopAttrib();
+
+  glMatrixMode(GL_MODELVIEW);
+}
+
+
+
+void reshape_engine(ModeInfo *mi, int width, int height)
+{
  glViewport(0,0,(GLint)width, (GLint) height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
@@ -807,8 +915,8 @@ void reshape_engine(ModeInfo *mi, int width, int height)
 
 void init_engine(ModeInfo *mi)
 {
-int screen = MI_SCREEN(mi);
-Engine *e;
+  int screen = MI_SCREEN(mi);
+  Engine *e;
 
  if (engine == NULL) {
    if ((engine = (Engine *) calloc(MI_NUM_SCREENS(mi),
@@ -865,11 +973,24 @@ Engine *e;
  glEnable(GL_NORMALIZE);
  make_tables();
  engineType = find_engine(which_engine);
+
+ e->engine_name = malloc(200);
+ sprintf (e->engine_name,
+          "%s\n%s%d%s",
+          engines[engineType].engineName,
+          (engines[engineType].includedAngle == 0 ? "" :
+           engines[engineType].includedAngle == 180 ? "Flat " : "V"),
+          engines[engineType].cylinders,
+          (engines[engineType].includedAngle == 0 ? " Cylinder" : "")
+          );
+
  makeshaft();
  makepiston();
+ load_font (mi, "titleFont", &e->xfont, &e->font_dlist);
 }
 
-Bool engine_handle_event (ModeInfo *mi, XEvent *event) {
+Bool engine_handle_event (ModeInfo *mi, XEvent *event)
+{
    Engine *e = &engine[MI_SCREEN(mi)];
 
    if (event->xany.type == ButtonPress &&
@@ -898,26 +1019,31 @@ Bool engine_handle_event (ModeInfo *mi, XEvent *event) {
   return False;
 }
 
-void draw_engine(ModeInfo *mi) {
-Engine *e = &engine[MI_SCREEN(mi)];
-Window w = MI_WINDOW(mi);
-Display *disp = MI_DISPLAY(mi);
+void draw_engine(ModeInfo *mi)
+{
+  Engine *e = &engine[MI_SCREEN(mi)];
+  Window w = MI_WINDOW(mi);
+  Display *disp = MI_DISPLAY(mi);
 
   if (!e->glx_context)
-      return;
+    return;
 
   glXMakeCurrent(disp, w, *(e->glx_context));
 
 
   display(e);
 
+  if (do_titles)
+    print_title_string (mi, e->engine_name,
+                        10, mi->xgwa.height - 10);
+
   if(mi->fps_p) do_fps(mi);
   glFinish(); 
   glXSwapBuffers(disp, w);
 }
 
-void release_engine(ModeInfo *mi) {
-
+void release_engine(ModeInfo *mi) 
+{
   if (engine != NULL) {
    (void) free((void *) engine);
    engine = NULL;
index 8c5694afee469acef67364fee363df0716c73885..bfbede02fbb2e263f86263ba0daad4546627e830 100644 (file)
@@ -11,6 +11,7 @@ engine - draws a 3D four-stroke engine.
 [\-delay \fInumber\fP]
 [\-no-move]
 [\-no-spin]
+[\-no-title]
 [\-fps]
 .SH DESCRIPTION
 Draws a simple four-stroke engine that floats around the screen.
@@ -52,6 +53,9 @@ Whether the object should spin.
 .TP 8
 .B \-fps | \-no-fps
 Whether to show a frames-per-second display at the bottom of the screen.
+.TP 8
+.B \-title | \-no-title
+Whether to display the name of the engine being rendered.
 .SH ENVIRONMENT
 .PP
 .TP 8
index ead856e3fd194485a9bfda07ae1a2d928c77cac8..a8aca0fdbf02956e9d3a375aeb5a7b3306bc4e1d 100644 (file)
@@ -156,7 +156,7 @@ void DrawSpark(global_info_t *info, flurry_info_t *flurry, Spark *s);
 /* int fieldIncoherence = 0; */
 /* int ifieldSpeed = 120; */
 
-static __inline__ float FastDistance2D(float x, float y)
+static /*inline*/ float FastDistance2D(float x, float y)
 {
         /* this function computes the distance from 0,0 to x,y with ~3.5% error */
        float mn;
index 2ba56d40e62e57564e2b3cdd5f88585e8bd56968..33d4250a26df3bba98ab59e6bbf1677ece45888e 100644 (file)
@@ -34,6 +34,7 @@ static int fps_text_y = 10;
 static int fps_ascent, fps_descent;
 static GLuint font_dlist;
 static Bool fps_clear_p = False;
+static char fps_string[1024];
 
 static void
 fps_init (ModeInfo *mi)
@@ -178,21 +179,21 @@ fps_print_string (ModeInfo *mi, GLfloat x, GLfloat y, const char *string)
 }
 
 
-void
-do_fps (ModeInfo *mi)
+GLfloat
+fps_1 (ModeInfo *mi)
 {
   static Bool initted_p = False;
-  static int last_ifps = 0;
+  static int last_ifps = -1;
+  static GLfloat last_fps = -1;
   static int frame_count = 0;
   static struct timeval prev = { 0, };
   static struct timeval now  = { 0, };
-  static char msg [1024] = { 0, };
 
   if (!initted_p)
     {
       initted_p = True;
       fps_init (mi);
-      strcpy (msg, "FPS: (accumulating...)");
+      strcpy (fps_string, "FPS: (accumulating...)");
     }
 
   /* Every N frames (where N is approximately one second's worth of frames)
@@ -223,8 +224,9 @@ do_fps (ModeInfo *mi)
       prev = now;
       frame_count = 0;
       last_ifps = fps;
+      last_fps  = fps;
 
-      sprintf (msg, "FPS: %.02f", fps);
+      sprintf (fps_string, "FPS: %.02f", fps);
 
       if (mi->pause != 0)
         {
@@ -234,7 +236,8 @@ do_fps (ModeInfo *mi)
             buf[strlen(buf)-1] = 0;
           if (buf[strlen(buf)-1] == '.')
             buf[strlen(buf)-1] = 0;
-          sprintf(msg + strlen(msg), " (including %s sec/frame delay)",
+          sprintf(fps_string + strlen(fps_string),
+                  " (including %s sec/frame delay)",
                   buf);
         }
 
@@ -247,19 +250,31 @@ do_fps (ModeInfo *mi)
           else if (p >= 2048)          p >>= 10, s = "K";
 # endif
 
-          strcat (msg, "\nPolys: ");
+          strcat (fps_string, "\nPolys: ");
           if (p >= 1000000)
-            sprintf (msg + strlen(msg), "%lu,%03lu,%03lu%s",
+            sprintf (fps_string + strlen(fps_string), "%lu,%03lu,%03lu%s",
                      (p / 1000000), ((p / 1000) % 1000), (p % 1000), s);
           else if (p >= 1000)
-            sprintf (msg + strlen(msg), "%lu,%03lu%s",
+            sprintf (fps_string + strlen(fps_string), "%lu,%03lu%s",
                      (p / 1000), (p % 1000), s);
           else
-            sprintf (msg + strlen(msg), "%lu%s", p, s);
+            sprintf (fps_string + strlen(fps_string), "%lu%s", p, s);
         }
     }
 
-  /* Print the string every frame (or else nothing will show up.)
-   */
-  fps_print_string (mi, fps_text_x, fps_text_y, msg);
+  return last_fps;
+}
+
+void
+fps_2 (ModeInfo *mi)
+{
+  fps_print_string (mi, fps_text_x, fps_text_y, fps_string);
+}
+
+
+void
+do_fps (ModeInfo *mi)
+{
+  fps_1 (mi);   /* Lazily compute current FPS value, about once a second. */
+  fps_2 (mi);   /* Print the string every frame (else nothing shows up.) */
 }
diff --git a/hacks/glx/glknots.c b/hacks/glx/glknots.c
new file mode 100644 (file)
index 0000000..81488ac
--- /dev/null
@@ -0,0 +1,467 @@
+/* glknots, Copyright (c) 2003 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * Generates some 3D knots (closed loops).
+ * Inspired by Paul Bourke <pbourke@swin.edu.au> at
+ * http://astronomy.swin.edu.au/~pbourke/curves/knot/
+ */
+
+#include <X11/Intrinsic.h>
+
+extern XtAppContext app;
+
+#define PROGCLASS      "GLKnots"
+#define HACK_INIT      init_knot
+#define HACK_DRAW      draw_knot
+#define HACK_RESHAPE   reshape_knot
+#define HACK_HANDLE_EVENT knot_handle_event
+#define EVENT_MASK      PointerMotionMask
+#define sws_opts       xlockmore_opts
+
+#define DEF_SPIN        "XYZ"
+#define DEF_WANDER      "True"
+#define DEF_SPEED       "1.0"
+#define DEF_THICKNESS   "0.3"
+#define DEF_SEGMENTS    "800"
+#define DEF_DURATION    "8"
+
+#define DEFAULTS       "*delay:        30000       \n" \
+                       "*showFPS:      False       \n" \
+                       "*wireframe:    False       \n" \
+                       "*speed:      " DEF_SPEED " \n" \
+                       "*spin:       " DEF_SPIN   "\n" \
+                       "*wander:     " DEF_WANDER "\n" \
+                       "*thickness:  " DEF_THICKNESS "\n" \
+                       "*segments:   " DEF_SEGMENTS "\n" \
+                       "*duration:   " DEF_DURATION "\n" \
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#include <GL/glu.h>
+
+typedef struct {
+  GLXContext *glx_context;
+  rotator *rot;
+  trackball_state *trackball;
+  Bool button_down_p;
+
+  GLuint knot_list;
+
+  int ncolors;
+  XColor *colors;
+  int ccolor;
+
+  int mode;  /* 0 = normal, 1 = out, 2 = in */
+  int mode_tick;
+  Bool clear_p;
+
+} knot_configuration;
+
+static knot_configuration *bps = NULL;
+
+static char *do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static GLfloat thickness;
+static int segments;
+static int duration;
+
+static XrmOptionDescRec opts[] = {
+  { "-spin",   ".spin",   XrmoptionSepArg, 0 },
+  { "+spin",   ".spin",   XrmoptionNoArg, "" },
+  { "-wander", ".wander", XrmoptionNoArg, "True" },
+  { "+wander", ".wander", XrmoptionNoArg, "False" },
+  { "-speed",  ".speed",  XrmoptionSepArg, 0 },
+  { "-thickness", ".thickness",  XrmoptionSepArg, 0 },
+  { "-segments",  ".segments",   XrmoptionSepArg, 0 },
+  { "-duration",  ".duration",   XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
+  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {(caddr_t *) &speed,     "speed",  "Speed",  DEF_SPEED,  t_Float},
+  {(caddr_t *) &thickness, "thickness", "Thickness",  DEF_THICKNESS, t_Float},
+  {(caddr_t *) &segments,  "segments",  "Segments",   DEF_SEGMENTS,  t_Int},
+  {(caddr_t *) &duration,  "duration",  "Duration",   DEF_DURATION,  t_Int},
+};
+
+ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static void
+make_knot (ModeInfo *mi)
+{
+  int wire = MI_IS_WIREFRAME(mi);
+
+  GLfloat diam = (4 * thickness);
+  int faces = (wire ? 3 : 6);
+
+  int i;
+  double x, y, z, ox, oy, oz;
+  double mu;
+
+  double p[9];
+
+  Bool blobby_p = (0 == (random() % 5));
+  Bool type = (random() % 2);
+
+  for (i = 0; i < countof(p); i++)
+    {
+      p[i] = 1 + (random() % 4);
+      if (! (random() % 3))
+        p[i] += (random() % 5);
+    }
+
+  if (type == 1)
+    {
+      p[0] += 4;
+      p[1] *= ((p[0] + p[0]) / 10);
+      blobby_p = False;
+    }
+
+  mi->polygon_count = 0;
+
+  for (i = 0; i <= segments; i++)
+    {
+      if (type == 0)
+        {
+          mu = i * (M_PI * 2) / segments;
+          x = 10 * (cos(mu) + cos(p[0]*mu)) + cos(p[1]*mu) + cos(p[2]*mu);
+          y = 6 * sin(mu) + 10 * sin(p[3]*mu);
+          z = 16 * sin(p[4]*mu) * sin(p[5]*mu/2) + p[6]*sin(p[7]*mu) -
+            2 * sin(p[8]*mu);
+        }
+      else if (type == 1)
+        {
+          mu = i * (M_PI * 2) * p[0] / (double) segments;
+          x = 10 * cos(mu) * (1 + cos(p[1] * mu/ p[0]) / 2.0);
+          y = 25 * sin(p[1] * mu / p[0]) / 2.0;
+          z = 10 * sin(mu) * (1 + cos(p[1] * mu/ p[0]) / 2.0);
+        }
+      else
+        abort();
+
+      if (i != 0)
+        {
+          GLfloat dist = sqrt ((x-ox)*(x-ox) +
+                               (y-oy)*(y-oy) +
+                               (z-oz)*(z-oz));
+          GLfloat di;
+          if (!blobby_p)
+            di = diam;
+          else
+            {
+              di = dist * (segments / 500.0);
+              di = (di * di * 3);
+            }
+
+          tube (ox, oy, oz,
+                x, y, z,
+                di, dist/3,
+                faces, True, wire, wire);
+
+          mi->polygon_count += faces;
+        }
+
+      ox = x;
+      oy = y;
+      oz = z;
+   }
+}
+
+
+/* Window management, etc
+ */
+void
+reshape_knot (ModeInfo *mi, int width, int height)
+{
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  glViewport (0, 0, (GLint) width, (GLint) height);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  gluLookAt( 0.0, 0.0, 30.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
+
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+new_knot (ModeInfo *mi)
+{
+  knot_configuration *bp = &bps[MI_SCREEN(mi)];
+  int i;
+
+  bp->clear_p = !!(random() % 15);
+
+  bp->ncolors = 128;
+  bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+  make_smooth_colormap (0, 0, 0,
+                        bp->colors, &bp->ncolors,
+                        False, 0, False);
+
+  for (i = 0; i < bp->ncolors; i++)
+    {
+      /* make colors twice as bright */
+      bp->colors[i].red   = (bp->colors[i].red   >> 2) + 0x7FFF;
+      bp->colors[i].green = (bp->colors[i].green >> 2) + 0x7FFF;
+      bp->colors[i].blue  = (bp->colors[i].blue  >> 2) + 0x7FFF;
+    }
+
+  glNewList (bp->knot_list, GL_COMPILE);
+  make_knot (mi);
+  glEndList ();
+}
+
+
+Bool
+knot_handle_event (ModeInfo *mi, XEvent *event)
+{
+  knot_configuration *bp = &bps[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      bp->button_down_p = True;
+      gltrackball_start (bp->trackball,
+                         event->xbutton.x, event->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button & Button1)
+    {
+      bp->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           bp->button_down_p)
+    {
+      gltrackball_track (bp->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+
+
+void 
+init_knot (ModeInfo *mi)
+{
+  knot_configuration *bp;
+  int wire = MI_IS_WIREFRAME(mi);
+
+  if (!bps) {
+    bps = (knot_configuration *)
+      calloc (MI_NUM_SCREENS(mi), sizeof (knot_configuration));
+    if (!bps) {
+      fprintf(stderr, "%s: out of memory\n", progname);
+      exit(1);
+    }
+
+    bp = &bps[MI_SCREEN(mi)];
+  }
+
+  bp = &bps[MI_SCREEN(mi)];
+
+  bp->glx_context = init_GL(mi);
+
+  if (thickness <= 0) thickness = 0.001;
+  else if (thickness > 1) thickness = 1;
+
+  if (segments < 10) segments = 10;
+
+  reshape_knot (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+  if (!wire)
+    {
+      GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+      GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+      GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+      GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+      glEnable(GL_LIGHTING);
+      glEnable(GL_LIGHT0);
+      glEnable(GL_DEPTH_TEST);
+      glEnable(GL_CULL_FACE);
+
+      glLightfv(GL_LIGHT0, GL_POSITION, pos);
+      glLightfv(GL_LIGHT0, GL_AMBIENT,  amb);
+      glLightfv(GL_LIGHT0, GL_DIFFUSE,  dif);
+      glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+    }
+
+  {
+    Bool spinx=False, spiny=False, spinz=False;
+    double spin_speed   = 2.0;
+    double wander_speed = 0.05;
+    double spin_accel   = 0.2;
+
+    char *s = do_spin;
+    while (*s)
+      {
+        if      (*s == 'x' || *s == 'X') spinx = True;
+        else if (*s == 'y' || *s == 'Y') spiny = True;
+        else if (*s == 'z' || *s == 'Z') spinz = True;
+        else
+          {
+            fprintf (stderr,
+         "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+                     progname, do_spin);
+            exit (1);
+          }
+        s++;
+      }
+
+    bp->rot = make_rotator (spinx ? spin_speed : 0,
+                            spiny ? spin_speed : 0,
+                            spinz ? spin_speed : 0,
+                            spin_accel,
+                            do_wander ? wander_speed : 0,
+                            (spinx && spiny && spinz));
+    bp->trackball = gltrackball_init ();
+  }
+
+  bp->knot_list = glGenLists (1);
+  new_knot(mi);
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+void
+draw_knot (ModeInfo *mi)
+{
+  knot_configuration *bp = &bps[MI_SCREEN(mi)];
+  Display *dpy = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+
+  static GLfloat bcolor[4] = {0.0, 0.0, 0.0, 1.0};
+  static GLfloat bspec[4]  = {1.0, 1.0, 1.0, 1.0};
+  static GLfloat bshiny    = 128.0;
+
+  static time_t last_time = 0;
+
+  if (!bp->glx_context)
+    return;
+
+  if (bp->mode == 0)
+    {
+      static int tick = 0;
+      if (tick++ > 10)
+        {
+          time_t now = time((time_t *) 0);
+          if (last_time == 0) last_time = now;
+          tick = 0;
+          if (!bp->button_down_p &&
+              now - last_time >= duration)
+            {
+              bp->mode = 1;    /* go out */
+              bp->mode_tick = 10 * speed;
+              last_time = now;
+            }
+        }
+    }
+  else if (bp->mode == 1)   /* out */
+    {
+      if (--bp->mode_tick <= 0)
+        {
+          new_knot (mi);
+          bp->mode_tick = 10 * speed;
+          bp->mode = 2;  /* go in */
+        }
+    }
+  else if (bp->mode == 2)   /* in */
+    {
+      if (--bp->mode_tick <= 0)
+        bp->mode = 0;  /* normal */
+    }
+  else
+    abort();
+
+  glShadeModel(GL_SMOOTH);
+
+  glEnable(GL_DEPTH_TEST);
+  glEnable(GL_NORMALIZE);
+  glEnable(GL_CULL_FACE);
+
+  if (bp->clear_p)
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  glPushMatrix ();
+
+  {
+    double x, y, z;
+    get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+    glTranslatef((x - 0.5) * 8,
+                 (y - 0.5) * 8,
+                 (z - 0.5) * 15);
+
+    gltrackball_rotate (bp->trackball);
+
+    get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+
+    glRotatef (x * 360, 1.0, 0.0, 0.0);
+    glRotatef (y * 360, 0.0, 1.0, 0.0);
+    glRotatef (z * 360, 0.0, 0.0, 1.0);
+  }
+
+  bcolor[0] = bp->colors[bp->ccolor].red   / 65536.0;
+  bcolor[1] = bp->colors[bp->ccolor].green / 65536.0;
+  bcolor[2] = bp->colors[bp->ccolor].blue  / 65536.0;
+  bp->ccolor++;
+  if (bp->ccolor >= bp->ncolors) bp->ccolor = 0;
+
+  glMaterialfv (GL_FRONT, GL_SPECULAR,            bspec);
+  glMateriali  (GL_FRONT, GL_SHININESS,           bshiny);
+  glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
+
+  glScalef(0.25, 0.25, 0.25);
+
+  if (bp->mode != 0)
+    {
+      GLfloat s = (bp->mode == 1
+                   ? bp->mode_tick / (10 * speed)
+                   : ((10 * speed) - bp->mode_tick + 1) / (10 * speed));
+      glScalef (s, s, s);
+    }
+
+  glCallList (bp->knot_list);
+
+  glPopMatrix ();
+
+  if (mi->fps_p) do_fps (mi);
+  glFinish();
+
+  glXSwapBuffers(dpy, window);
+}
+
+#endif /* USE_GL */
diff --git a/hacks/glx/glknots.man b/hacks/glx/glknots.man
new file mode 100644 (file)
index 0000000..8e7051e
--- /dev/null
@@ -0,0 +1,81 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glknots - generates some twisting 3d knot patterns
+.SH SYNOPSIS
+.B glknots
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIfloat\fP]
+[\-segments \fIint\fP]
+[\-thickness \fIfloat\fP]
+[\-duration \fIseconds\fP]
+[\-no-wander]
+[\-spin \fIXYZ\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Generates some twisting 3d knot patterns.  Spins 'em around.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Larger numbers mean run faster.  Default: 1.0.
+.TP 8
+.B \-segments \fInumber\fP
+Number of segments in each path.  Default 800.  Larger numbers make the
+curves smoother, at the expense of a higher polygon count.
+.TP 8
+.B \-thickness \fIfloat\fP
+How thick the tubes should be.  Default 0.3.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to leave each knot up.  Default 5 seconds.
+.TP 8
+.B \-wander | \-no-wander
+Whether the cubes should wander around the screen.
+.TP 8
+.B \-spin [XYZ] | \-no-spin
+Which axes, if any, to spin around on.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/glmatrix.c b/hacks/glx/glmatrix.c
new file mode 100644 (file)
index 0000000..1fa1123
--- /dev/null
@@ -0,0 +1,1021 @@
+/* glmatrix, Copyright (c) 2003 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * GLMatrix -- simulate the text scrolls from the movie "The Matrix".
+ *
+ * This program does a 3D rendering of the dropping characters that
+ * appeared in the title sequences of the movies.  See also `xmatrix'
+ * for a simulation of what the computer monitors actually *in* the
+ * movie did.
+ */
+
+#include <X11/Intrinsic.h>
+
+extern XtAppContext app;
+
+#define PROGCLASS      "GLMatrix"
+#define HACK_INIT      init_matrix
+#define HACK_DRAW      draw_matrix
+#define HACK_RESHAPE   reshape_matrix
+#define HACK_HANDLE_EVENT matrix_handle_event
+#define EVENT_MASK      PointerMotionMask
+#define matrix_opts    xlockmore_opts
+
+#define DEF_SPEED       "1.0"
+#define DEF_DENSITY     "20"
+#define DEF_FOG         "True"
+#define DEF_WAVES       "True"
+#define DEF_ROTATE      "True"
+#define DEF_TEXTURE     "True"
+#define DEF_MODE        "Matrix"
+
+#define DEFAULTS       "*delay:        30000         \n" \
+                       "*showFPS:      False         \n" \
+                       "*wireframe:    False         \n" \
+                       "*mode:       " DEF_MODE    " \n" \
+                       "*speed:      " DEF_SPEED   " \n" \
+                       "*density:    " DEF_DENSITY " \n" \
+                       "*fog:        " DEF_FOG     " \n" \
+                       "*waves:      " DEF_WAVES   " \n" \
+                       "*texture:    " DEF_TEXTURE " \n" \
+                       "*rotate:     " DEF_ROTATE  " \n" \
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#include "xlockmore.h"
+#include "xpm-ximage.h"
+#include <ctype.h>
+
+#include "../images/matrix3.xpm"
+
+#ifdef USE_GL /* whole file */
+
+#include <GL/glu.h>
+
+
+#include "gllist.h"
+
+
+#define CHAR_COLS 16
+#define CHAR_ROWS 13
+static int real_char_rows;
+
+static int matrix_encoding[] = { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+                                 192, 193, 194, 195, 196, 197, 198, 199,
+                                 200, 201, 202, 203, 204, 205, 206, 207 };
+static int decimal_encoding[]  = { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 };
+static int hex_encoding[]      = { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+                                   33, 34, 35, 36, 37, 38 };
+static int binary_encoding[] = { 16, 17 };
+static int dna_encoding[]    = { 33, 35, 39, 52 };
+#if 0
+static unsigned char char_map[256] = {
+    3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  /*   0 */
+    3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  /*  16 */
+    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,  /*  32 */
+   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,  /*  48 */
+   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,  /*  64 */
+   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,  /*  80 */
+   64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,  /*  96 */
+   80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,  /* 112 */
+    3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  /* 128 */
+    3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  /* 144 */
+   96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,  /* 160 */
+  112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,  /* 176 */
+  128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,  /* 192 */
+  144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,  /* 208 */
+  160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,  /* 224 */
+  176,177,178,195,180,181,182,183,184,185,186,187,188,189,190,191   /* 240 */
+};
+#endif /* 0 */
+
+#define CURSOR_GLYPH 97
+
+/* #define DEBUG */
+
+#define GRID_SIZE  70     /* width and height of the arena */
+#define GRID_DEPTH 35     /* depth of the arena */
+#define WAVE_SIZE  22     /* periodicity of color (brightness) waves */
+#define SPLASH_RATIO 0.7  /* ratio of GRID_DEPTH where chars hit the screen */
+
+static struct { GLfloat x, y; } nice_views[] = {
+  {  0,     0 },
+  {  0,   -20 },     /* this is a list of viewer rotations that look nice. */
+  {  0,    20 },     /* every now and then we switch to a new one.         */
+  { 25,     0 },     /* (but we only use the first one at start-up.)       */
+  {-25,     0 },
+  { 25,    20 },
+  {-25,    20 },
+  { 25,   -20 },
+  {-25,   -20 },
+
+  { 10,     0 },
+  {-10,     0 },
+  {  0,     0 },  /* prefer these */
+  {  0,     0 },
+  {  0,     0 },
+  {  0,     0 },
+  {  0,     0 },
+};
+
+
+typedef struct {
+  GLfloat x, y, z;        /* position of strip */
+  GLfloat dx, dy, dz;     /* velocity of strip */
+
+  Bool erasing_p;         /* Whether this strip is on its way out. */
+
+  int spinner_glyph;      /* the bottommost glyph -- the feeder */
+  GLfloat spinner_y;      /* where on the strip the bottom glyph is */
+  GLfloat spinner_speed;  /* how fast the bottom glyph drops */
+
+  int glyphs[GRID_SIZE];  /* the other glyphs on the strip, which will be
+                             revealed by the dropping spinner.
+                             0 means no glyph; negative means "spinner".
+                             If non-zero, real value is abs(G)-1. */
+
+  int spin_speed;         /* Rotate all spinners every this-many frames */
+  int spin_tick;          /* frame counter */
+
+  int wave_position;     /* Waves of brightness wash down the strip. */
+  int wave_speed;        /* every this-many frames. */
+  int wave_tick;         /* frame counter. */
+
+} strip;
+
+
+typedef struct {
+  GLXContext *glx_context;
+  Bool button_down_p;
+  GLuint texture;
+  int nstrips;
+  strip *strips;
+  int *glyph_map;
+  int nglyphs;
+  GLfloat tex_char_width, tex_char_height;
+
+  /* auto-tracking direction of view */
+  int last_view, target_view;
+  GLfloat view_x, view_y;
+  int view_steps, view_tick;
+  Bool auto_tracking_p;
+
+} matrix_configuration;
+
+static matrix_configuration *mps = NULL;
+
+static GLfloat brightness_ramp[WAVE_SIZE];
+
+static GLfloat speed;
+static GLfloat density;
+static Bool do_fog;
+static Bool do_waves;
+static Bool do_rotate;
+static Bool do_texture;
+static char *mode_str;
+
+static XrmOptionDescRec opts[] = {
+  { "-speed",       ".speed",     XrmoptionSepArg, 0 },
+  { "-density",     ".density",   XrmoptionSepArg, 0 },
+  { "-mode",        ".mode",      XrmoptionSepArg, 0 },
+  { "-binary",      ".mode",      XrmoptionNoArg, "binary"      },
+  { "-hexadecimal", ".mode",      XrmoptionNoArg, "hexadecimal" },
+  { "-decimal",     ".mode",      XrmoptionNoArg, "decimal"     },
+  { "-dna",         ".mode",      XrmoptionNoArg, "dna"         },
+  { "-fog",         ".fog",       XrmoptionNoArg, "True"  },
+  { "+fog",         ".fog",       XrmoptionNoArg, "False" },
+  { "-waves",       ".waves",     XrmoptionNoArg, "True"  },
+  { "+waves",       ".waves",     XrmoptionNoArg, "False" },
+  { "-rotate",      ".rotate",    XrmoptionNoArg, "True"  },
+  { "+rotate",      ".rotate",    XrmoptionNoArg, "False" },
+  {"-texture",      ".texture",   XrmoptionNoArg, "True"  },
+  {"+texture",      ".texture",   XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+  {(caddr_t *) &mode_str,   "mode",       "Mode",    DEF_MODE,      t_String},
+  {(caddr_t *) &speed,      "speed",      "Speed",   DEF_SPEED,     t_Float},
+  {(caddr_t *) &density,    "density",    "Density", DEF_DENSITY,   t_Float},
+  {(caddr_t *) &do_fog,     "fog",        "Fog",     DEF_FOG,       t_Bool},
+  {(caddr_t *) &do_waves,   "waves",      "Waves",   DEF_WAVES,     t_Bool},
+  {(caddr_t *) &do_rotate,  "rotate",     "Rotate",  DEF_ROTATE,    t_Bool},
+  {(caddr_t *) &do_texture, "texture",    "Texture", DEF_TEXTURE,   t_Bool},
+};
+
+ModeSpecOpt matrix_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Re-randomize the state of one strip.
+ */
+static void
+reset_strip (ModeInfo *mi, strip *s)
+{
+  matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+  int i;
+
+  memset (s, 0, sizeof(*s));
+  s->x = (GLfloat) (frand(GRID_SIZE) - (GRID_SIZE/2));
+  s->y = (GLfloat) (GRID_SIZE/2 + BELLRAND(0.5));      /* shift top slightly */
+  s->z = (GLfloat) (GRID_DEPTH * 0.2) - frand (GRID_DEPTH * 0.7);
+  s->spinner_y = 0;
+
+  s->dx = 0;
+/*  s->dx = ((BELLRAND(0.01) - 0.005) * speed); */
+  s->dy = 0;
+  s->dz = (BELLRAND(0.02) * speed);
+
+  s->spinner_speed = (BELLRAND(0.3) * speed);
+
+  s->spin_speed = (int) BELLRAND(2.0 / speed) + 1;
+  s->spin_tick  = 0;
+
+  s->wave_position = 0;
+  s->wave_speed = (int) BELLRAND(3.0 / speed) + 1;
+  s->wave_tick  = 0;
+
+  for (i = 0; i < GRID_SIZE; i++)
+    {
+      int draw_p = (random() % 7);
+      int spin_p = (draw_p && !(random() % 20));
+      int g = (draw_p
+               ? mp->glyph_map[(random() % mp->nglyphs)] + 1
+               : 0);
+      if (spin_p) g = -g;
+      s->glyphs[i] = g;
+    }
+  s->spinner_glyph = - (mp->glyph_map[(random() % mp->nglyphs)] + 1);
+}
+
+
+/* Animate the strip one step.  Reset if it has reached the bottom.
+ */
+static void
+tick_strip (ModeInfo *mi, strip *s)
+{
+  matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+  int i;
+
+  if (mp->button_down_p)
+    return;
+
+  s->x += s->dx;
+  s->y += s->dy;
+  s->z += s->dz;
+
+  if (s->z > GRID_DEPTH * SPLASH_RATIO)  /* splashed into screen */
+    {
+      reset_strip (mi, s);
+      return;
+    }
+
+  s->spinner_y += s->spinner_speed;
+  if (s->spinner_y >= GRID_SIZE)
+    {
+      if (s->erasing_p)
+        {
+          reset_strip (mi, s);
+          return;
+        }
+      else
+        {
+          s->erasing_p = True;
+          s->spinner_y = 0;
+          s->spinner_speed /= 2;  /* erase it slower than we drew it */
+        }
+    }
+
+  /* Spin the spinners. */
+  s->spin_tick++;
+  if (s->spin_tick > s->spin_speed)
+    {
+      s->spin_tick = 0;
+      s->spinner_glyph = - (mp->glyph_map[(random() % mp->nglyphs)] + 1);
+      for (i = 0; i < GRID_SIZE; i++)
+        if (s->glyphs[i] < 0)
+          {
+            s->glyphs[i] = -(mp->glyph_map[(random() % mp->nglyphs)] + 1);
+            if (! (random() % 800))  /* sometimes they stop spinning */
+              s->glyphs[i] = -s->glyphs[i];
+          }
+    }
+
+  /* Move the color (brightness) wave. */
+  s->wave_tick++;
+  if (s->wave_tick > s->wave_speed)
+    {
+      s->wave_tick = 0;
+      s->wave_position++;
+      if (s->wave_position >= WAVE_SIZE)
+        s->wave_position = 0;
+    }
+}
+
+
+/* Draw a single character at the given position and brightness.
+ */
+static void
+draw_glyph (ModeInfo *mi, int glyph,
+            GLfloat x, GLfloat y, GLfloat z,
+            GLfloat brightness)
+{
+  matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+  int wire = MI_IS_WIREFRAME(mi);
+  GLfloat w = mp->tex_char_width;
+  GLfloat h = mp->tex_char_height;
+  GLfloat cx, cy;
+  GLfloat S = 1;
+  Bool spinner_p = (glyph < 0);
+
+  if (glyph == 0) abort();
+  if (glyph < 0) glyph = -glyph;
+
+  if (spinner_p)
+    brightness *= 1.5;
+
+  if (!do_texture)
+    {
+      S  = 0.8;
+      x += 0.1;
+      y += 0.1;
+    }
+  else
+    {
+      int ccx = ((glyph - 1) % CHAR_COLS);
+      int ccy = ((glyph - 1) / CHAR_COLS);
+
+      cx = ccx * w;
+      cy = (real_char_rows - ccy - 1) * h;
+
+      if (do_fog)
+        {
+          GLfloat depth;
+          depth = (z / GRID_DEPTH) + 0.5;  /* z ratio from back/front      */
+          depth = 0.2 + (depth * 0.8);     /* scale to range [0.2 - 1.0]   */
+          brightness *= depth;             /* so no row goes all black.    */
+        }
+    }
+
+  {
+    GLfloat r, g, b, a = 1;
+    if (!do_texture && !spinner_p)
+      r = b = 0, g = brightness;
+    else
+      r = g = b = brightness;
+
+    /* If the glyph is very close to the screen (meaning it is very large,
+       and is about to splash into the screen and vanish) then start fading
+       it out, proportional to how close to the glass it is.
+    */
+    if (z > GRID_DEPTH/2)
+      {
+        GLfloat ratio = ((z - GRID_DEPTH/2) /
+                         ((GRID_DEPTH * SPLASH_RATIO) - GRID_DEPTH/2));
+        int i = ratio * WAVE_SIZE;
+
+        if (i < 0) i = 0;
+        else if (i >= WAVE_SIZE) i = WAVE_SIZE-1; 
+
+        a = brightness_ramp[i];
+#if 1
+        /* I don't understand this -- if I change the alpha on the color of
+           the quad, I'd expect that to make the quad more transparent.
+           But instead, it seems to be making the transparent parts of the
+           texture on the quad be *less* transparent!  So as we fade out,
+           we fade towards a completely solid rectangle.  WTF?
+
+           So, for now, instead of changing the alpha, just make the colors
+           be darker.  This isn't quite right (it causes a large dark glyph
+           to occlude the brighter glyphs behind it) but it's close...
+         */
+        r *= a;
+        g *= a;
+        b *= a;
+        a = 1;
+#endif
+      }
+
+    glColor4f (r,g,b,a);
+  }
+
+  glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+  glNormal3f (0, 0, 1);
+  glTexCoord2f (cx,   cy);   glVertex3f (x,   y,   z);
+  glTexCoord2f (cx+w, cy);   glVertex3f (x+S, y,   z);
+  glTexCoord2f (cx+w, cy+h); glVertex3f (x+S, y+S, z);
+  glTexCoord2f (cx,   cy+h); glVertex3f (x,   y+S, z);
+  glEnd ();
+
+  if (wire && spinner_p)
+    {
+      glBegin (GL_LINES);
+      glVertex3f (x,   y,   z);
+      glVertex3f (x+S, y+S, z);
+      glVertex3f (x,   y+S, z);
+      glVertex3f (x+S, y,   z);
+      glEnd();
+    }
+
+  mi->polygon_count++;
+}
+
+
+/* Draw all the visible glyphs in the strip.
+ */
+static void
+draw_strip (ModeInfo *mi, strip *s)
+{
+  int i;
+  for (i = 0; i < GRID_SIZE; i++)
+    {
+      int g = s->glyphs[i];
+      Bool below_p = (s->spinner_y >= i);
+
+      if (s->erasing_p)
+        below_p = !below_p;
+
+      if (g && below_p)       /* don't draw cells below the spinner */
+        {
+          GLfloat brightness;
+          if (!do_waves)
+            brightness = 1.0;
+          else
+            {
+              int j = WAVE_SIZE - ((i + (GRID_SIZE - s->wave_position))
+                                   % WAVE_SIZE);
+              brightness = brightness_ramp[j];
+            }
+
+          draw_glyph (mi, g, s->x, s->y - i, s->z, brightness);
+        }
+    }
+
+  if (!s->erasing_p)
+    draw_glyph (mi, s->spinner_glyph, s->x, s->y - s->spinner_y, s->z, 1.0);
+}
+
+
+/* qsort comparator for sorting strips by z position */
+static int
+cmp_strips (const void *aa, const void *bb)
+{
+  const strip *a = *(strip **) aa;
+  const strip *b = *(strip **) bb;
+  return ((int) (a->z * 10000) -
+          (int) (b->z * 10000));
+}
+
+
+/* Auto-tracking
+ */
+
+static void
+auto_track_init (ModeInfo *mi)
+{
+  matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+  mp->last_view = 0;
+  mp->target_view = 0;
+  mp->view_x = nice_views[mp->last_view].x;
+  mp->view_y = nice_views[mp->last_view].y;
+  mp->view_steps = 100;
+  mp->view_tick = 0;
+  mp->auto_tracking_p = False;
+}
+
+
+static void
+auto_track (ModeInfo *mi)
+{
+  matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+
+  if (! do_rotate)
+    return;
+  if (mp->button_down_p)
+    return;
+
+  /* if we're not moving, maybe start moving.  Otherwise, do nothing. */
+  if (! mp->auto_tracking_p)
+    {
+      static int tick = 0;
+      if (++tick < 20/speed) return;
+      tick = 0;
+      if (! (random() % 20))
+        mp->auto_tracking_p = True;
+      else
+        return;
+    }
+
+
+  {
+    GLfloat ox = nice_views[mp->last_view].x;
+    GLfloat oy = nice_views[mp->last_view].y;
+    GLfloat tx = nice_views[mp->target_view].x;
+    GLfloat ty = nice_views[mp->target_view].y;
+
+    /* move from A to B with sinusoidal deltas, so that it doesn't jerk
+       to a stop. */
+    GLfloat th = sin ((M_PI / 2) * (double) mp->view_tick / mp->view_steps);
+
+    mp->view_x = (ox + ((tx - ox) * th));
+    mp->view_y = (oy + ((ty - oy) * th));
+    mp->view_tick++;
+
+  if (mp->view_tick >= mp->view_steps)
+    {
+      mp->view_tick = 0;
+      mp->view_steps = (350.0 / speed);
+      mp->last_view = mp->target_view;
+      mp->target_view = (random() % (countof(nice_views) - 1)) + 1;
+      mp->auto_tracking_p = False;
+    }
+  }
+}
+
+
+/* Window management, etc
+ */
+void
+reshape_matrix (ModeInfo *mi, int width, int height)
+{
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  glViewport (0, 0, (GLint) width, (GLint) height);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective (80.0, 1/h, 1.0, 100);
+
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  gluLookAt( 0.0, 0.0, 25.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
+
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+Bool
+matrix_handle_event (ModeInfo *mi, XEvent *event)
+{
+  matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      mp->button_down_p = True;
+      return True;
+    }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button & Button1)
+    {
+      mp->button_down_p = False;
+      return True;
+    }
+
+  return False;
+}
+
+
+static Bool
+bigendian (void)
+{
+  union { int i; char c[sizeof(int)]; } u;
+  u.i = 1;
+  return !u.c[0];
+}
+
+
+/* The image with the characters in it is 512x598, meaning that it needs to
+   be copied into a 512x1024 texture.  But some machines can't handle textures
+   that large...  And it turns out that we aren't using most of the characters
+   in that image anyway, since this program doesn't do anything that makes use
+   of the full range of Latin1 characters.  So... this function tosses out the
+   last 32 of the Latin1 characters, resulting in a 512x506 image, which we
+   can then stuff in a 512x512 texture.  Voila.
+
+   If this hack ever grows into something that displays full Latin1 text,
+   well then, Something Else Will Need To Be Done.
+ */
+static void
+spank_image (XImage *xi)
+{
+  int ch = xi->height / CHAR_ROWS;
+  int cut = 2;
+  unsigned char *bits = (unsigned char *) xi->data;
+  unsigned char *from, *to, *s, *end;
+  int L = xi->bytes_per_line * ch;
+  int i;
+
+  /* Copy row 12 into 10 (which really means, copy 2 into 0,
+     since texture data is upside down.).
+  */
+  to   = bits + (L * cut);
+  from = bits;
+  end  = from + L;
+  s    = from;
+  while (s < end)
+    *to++ = *s++;
+
+  /* Then, pull all the bits down by 2 rows.
+   */
+  to   = bits;
+  from = bits + (L * cut);
+  end  = bits + (L * CHAR_ROWS);
+  s    = from;
+  while (s < end)
+    *to++ = *s++;
+
+  /* And clear out the rest, for good measure.
+   */
+  from = bits + (L * (CHAR_ROWS - cut));
+  end  = bits + (L * CHAR_ROWS);
+  s    = from;
+  while (s < end)
+    *s++ = 0;
+
+  xi->height -= (cut * ch);
+  real_char_rows -= cut;
+
+  /* Finally, pull the map indexes back to match the new bits.
+   */
+  for (i = 0; i < countof(matrix_encoding); i++)
+    if (matrix_encoding[i] > (CHAR_COLS * (CHAR_ROWS - cut)))
+      matrix_encoding[i] -= (cut * CHAR_COLS);
+}
+
+
+static void
+load_textures (ModeInfo *mi, Bool flip_p)
+{
+  matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+  XImage *xi;
+  int x, y;
+  int cw, ch;
+  int orig_w, orig_h;
+
+  /* The Matrix XPM is 512x598 -- but GL texture sizes must be powers of 2.
+     So we waste some padding rows to round up.
+   */
+  xi = xpm_to_ximage (mi->dpy, mi->xgwa.visual, mi->xgwa.colormap,
+                      matrix3_xpm);
+  orig_w = xi->width;
+  orig_h = xi->height;
+  real_char_rows = CHAR_ROWS;
+  spank_image (xi);
+
+  if (xi->height != 512 && xi->height != 1024)
+    {
+      xi->height = (xi->height < 512 ? 512 : 1024);
+      xi->data = realloc (xi->data, xi->height * xi->bytes_per_line);
+      if (!xi->data)
+        {
+          fprintf(stderr, "%s: out of memory\n", progname);
+          exit(1);
+        }
+    }
+
+  if (xi->width != 512) abort();
+  if (xi->height != 512 && xi->height != 1024) abort();
+
+  /* char size in pixels */
+  cw = orig_w / CHAR_COLS;
+  ch = orig_h / CHAR_ROWS;
+
+  /* char size in ratio of final (padded) texture size */
+  mp->tex_char_width  = (GLfloat) cw / xi->width;
+  mp->tex_char_height = (GLfloat) ch / xi->height;
+
+  /* Flip each character's bits horizontally -- we could also just do this
+     by reversing the texture coordinates on the quads, but on some systems
+     that slows things down a lot.
+   */
+  if (flip_p)
+    {
+      int xx, col;
+      unsigned long buf[100];
+      for (y = 0; y < xi->height; y++)
+        for (col = 0, xx = 0; col < CHAR_COLS; col++, xx += cw)
+          {
+            for (x = 0; x < cw; x++)
+              buf[x] = XGetPixel (xi, xx+x, y);
+            for (x = 0; x < cw; x++)
+              XPutPixel (xi, xx+x, y, buf[cw-x-1]);
+          }
+    }
+
+  /* The pixmap is a color image with no transparency.  Set the texture's
+     alpha to be the green channel, and set the green channel to be 100%.
+   */
+  {
+    int rpos, gpos, bpos, apos;  /* bitfield positions */
+    if (bigendian())
+      rpos = 24, gpos = 16, bpos =  8, apos =  0;
+    else
+      rpos =  0, gpos =  8, bpos = 16, apos = 24;
+
+    for (y = 0; y < xi->height; y++)
+      for (x = 0; x < xi->width; x++)
+        {
+          unsigned long p = XGetPixel (xi, x, y);
+          unsigned char r = (p >> rpos) & 0xFF;
+          unsigned char g = (p >> gpos) & 0xFF;
+          unsigned char b = (p >> bpos) & 0xFF;
+          unsigned char a = ~g;
+          g = 0xFF;
+          p = (r << rpos) | (g << gpos) | (b << bpos) | (a << apos);
+          XPutPixel (xi, x, y, p);
+        }
+  }
+
+  /* Now load the texture into GL.
+   */
+  clear_gl_error();
+  glGenTextures (1, &mp->texture);
+
+  glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+  glPixelStorei (GL_UNPACK_ROW_LENGTH, xi->width);
+  glBindTexture (GL_TEXTURE_2D, mp->texture);
+  check_gl_error ("texture init");
+  glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, xi->width, xi->height, 0, GL_RGBA,
+                GL_UNSIGNED_INT_8_8_8_8_REV, xi->data);
+  {
+    char buf[255];
+    sprintf (buf, "creating %dx%d texture:", xi->width, xi->height);
+    check_gl_error (buf);
+  }
+
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+  /* I'd expect CLAMP to be the thing to do here, but oddly, we get a
+     faint solid green border around the texture if it is *not* REPEAT!
+  */
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+  glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+  glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+  check_gl_error ("texture param");
+
+  xi->data = 0;  /* don't free the texture data */
+  XDestroyImage (xi);
+}
+
+
+void 
+init_matrix (ModeInfo *mi)
+{
+  matrix_configuration *mp;
+  int wire = MI_IS_WIREFRAME(mi);
+  Bool flip_p = 0;
+  int i;
+
+  if (wire)
+    do_texture = False;
+
+  if (!mps) {
+    mps = (matrix_configuration *)
+      calloc (MI_NUM_SCREENS(mi), sizeof (matrix_configuration));
+    if (!mps) {
+      fprintf(stderr, "%s: out of memory\n", progname);
+      exit(1);
+    }
+  }
+
+  mp = &mps[MI_SCREEN(mi)];
+  mp->glx_context = init_GL(mi);
+
+  if (!mode_str || !*mode_str || !strcasecmp(mode_str, "matrix"))
+    {
+      flip_p = 1;
+      mp->glyph_map = matrix_encoding;
+      mp->nglyphs   = countof(matrix_encoding);
+    }
+  else if (!strcasecmp (mode_str, "dna"))
+    {
+      flip_p = 0;
+      mp->glyph_map = dna_encoding;
+      mp->nglyphs   = countof(dna_encoding);
+    }
+  else if (!strcasecmp (mode_str, "bin") ||
+           !strcasecmp (mode_str, "binary"))
+    {
+      flip_p = 0;
+      mp->glyph_map = binary_encoding;
+      mp->nglyphs   = countof(binary_encoding);
+    }
+  else if (!strcasecmp (mode_str, "hex") ||
+           !strcasecmp (mode_str, "hexadecimal"))
+    {
+      flip_p = 0;
+      mp->glyph_map = hex_encoding;
+      mp->nglyphs   = countof(hex_encoding);
+    }
+  else if (!strcasecmp (mode_str, "dec") ||
+           !strcasecmp (mode_str, "decimal"))
+    {
+      flip_p = 0;
+      mp->glyph_map = decimal_encoding;
+      mp->nglyphs   = countof(decimal_encoding);
+    }
+  else
+    {
+      fprintf (stderr,
+           "%s: `mode' must be matrix, dna, binary, or hex: not `%s'\n",
+               progname, mode_str);
+      exit (1);
+    }
+
+  reshape_matrix (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+  glShadeModel(GL_SMOOTH);
+
+  glDisable(GL_DEPTH_TEST);
+  glDisable(GL_CULL_FACE);
+  glEnable(GL_NORMALIZE);
+
+  if (do_texture)
+    {
+      load_textures (mi, flip_p);
+      glEnable(GL_TEXTURE_2D);
+      glEnable(GL_BLEND);
+      glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
+    }
+
+  /* to scale coverage-percent to strips, this number looks about right... */
+  mp->nstrips = (int) (density * 2.2);
+  if      (mp->nstrips < 1)    mp->nstrips = 1;
+  else if (mp->nstrips > 2000) mp->nstrips = 2000;
+
+
+  mp->strips = calloc (mp->nstrips, sizeof(strip));
+  for (i = 0; i < mp->nstrips; i++)
+    {
+      strip *s = &mp->strips[i];
+      reset_strip (mi, s);
+
+      /* If we start all strips from zero at once, then the first few seconds
+         of the animation are much denser than normal.  So instead, set all
+         the initial strips to erase-mode with random starting positions.
+         As these die off at random speeds and are re-created, we'll get a
+         more consistent density. */
+      s->erasing_p = True;
+      s->spinner_y = frand(GRID_SIZE);
+      memset (s->glyphs, 0, sizeof(s->glyphs));  /* no visible glyphs */
+    }
+
+  /* Compute the brightness ramp.
+   */
+  for (i = 0; i < WAVE_SIZE; i++)
+    {
+      GLfloat j = ((WAVE_SIZE - i) / (GLfloat) (WAVE_SIZE - 1));
+      j *= (M_PI / 2);       /* j ranges from 0.0 - PI/2  */
+      j = sin (j);           /* j ranges from 0.0 - 1.0   */
+      j = 0.2 + (j * 0.8);   /* j ranges from 0.2 - 1.0   */
+      brightness_ramp[i] = j;
+      /* printf("%2d %8.2f\n", i, j); */
+    }
+
+
+  auto_track_init (mi);
+}
+
+
+#ifdef DEBUG
+
+static void
+draw_grid (ModeInfo *mi)
+{
+  if (!MI_IS_WIREFRAME(mi))
+    {
+      glDisable(GL_TEXTURE_2D);
+      glDisable(GL_BLEND);
+    }
+  glPushMatrix();
+  glColor3f(1, 1, 1);
+  glBegin(GL_LINES);
+  glVertex3f(-GRID_SIZE, 0, 0); glVertex3f(GRID_SIZE, 0, 0);
+  glVertex3f(0, -GRID_SIZE, 0); glVertex3f(0, GRID_SIZE, 0);
+  glEnd();
+  glBegin(GL_LINE_LOOP);
+  glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, 0);
+  glVertex3f(-GRID_SIZE/2,  GRID_SIZE/2, 0);
+  glVertex3f( GRID_SIZE/2,  GRID_SIZE/2, 0);
+  glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, 0);
+  glEnd();
+  glBegin(GL_LINE_LOOP);
+  glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+  glVertex3f(-GRID_SIZE/2, GRID_SIZE/2,  GRID_DEPTH/2);
+  glVertex3f( GRID_SIZE/2, GRID_SIZE/2,  GRID_DEPTH/2);
+  glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+  glEnd();
+  glBegin(GL_LINE_LOOP);
+  glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+  glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2,  GRID_DEPTH/2);
+  glVertex3f( GRID_SIZE/2, -GRID_SIZE/2,  GRID_DEPTH/2);
+  glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+  glEnd();
+  glBegin(GL_LINES);
+  glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+  glVertex3f(-GRID_SIZE/2,  GRID_SIZE/2, -GRID_DEPTH/2);
+  glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2,  GRID_DEPTH/2);
+  glVertex3f(-GRID_SIZE/2,  GRID_SIZE/2,  GRID_DEPTH/2);
+  glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+  glVertex3f( GRID_SIZE/2,  GRID_SIZE/2, -GRID_DEPTH/2);
+  glVertex3f( GRID_SIZE/2, -GRID_SIZE/2,  GRID_DEPTH/2);
+  glVertex3f( GRID_SIZE/2,  GRID_SIZE/2,  GRID_DEPTH/2);
+  glEnd();
+  glPopMatrix();
+  if (!MI_IS_WIREFRAME(mi))
+    {
+      glEnable(GL_TEXTURE_2D);
+      glEnable(GL_BLEND);
+    }
+}
+#endif /* DEBUG */
+
+
+void
+draw_matrix (ModeInfo *mi)
+{
+  matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+  Display *dpy = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+  int i;
+
+  if (!mp->glx_context)
+    return;
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  glPushMatrix ();
+
+  if (do_rotate)
+    {
+      glRotatef (mp->view_x, 1, 0, 0);
+      glRotatef (mp->view_y, 0, 1, 0);
+    }
+
+#ifdef DEBUG
+# if 0
+  glScalef(0.5, 0.5, 0.5);
+# endif
+# if 0
+  glRotatef(-30, 0, 1, 0); 
+# endif
+  draw_grid (mi);
+#endif
+
+  mi->polygon_count = 0;
+
+  /* Render (and tick) each strip, starting at the back
+     (draw the ones farthest from the camera first, to make
+     the alpha transparency work out right.)
+   */
+  {
+    strip **sorted = malloc (mp->nstrips * sizeof(*sorted));
+    for (i = 0; i < mp->nstrips; i++)
+      sorted[i] = &mp->strips[i];
+    qsort (sorted, i, sizeof(*sorted), cmp_strips);
+
+    for (i = 0; i < mp->nstrips; i++)
+      {
+        strip *s = sorted[i];
+        tick_strip (mi, s);
+        draw_strip (mi, s);
+      }
+    free (sorted);
+  }
+
+  auto_track (mi);
+
+#if 0
+  glBegin(GL_QUADS);
+  glColor3f(1,1,1);
+  glTexCoord2f (0,0);  glVertex3f(-15,-15,0);
+  glTexCoord2f (0,1);  glVertex3f(-15,15,0);
+  glTexCoord2f (1,1);  glVertex3f(15,15,0);
+  glTexCoord2f (1,0);  glVertex3f(15,-15,0);
+  glEnd();
+#endif
+
+  glPopMatrix ();
+
+  if (mi->fps_p) do_fps (mi);
+  glFinish();
+
+  glXSwapBuffers(dpy, window);
+}
+
+#endif /* USE_GL */
diff --git a/hacks/glx/glmatrix.man b/hacks/glx/glmatrix.man
new file mode 100644 (file)
index 0000000..d7ecc73
--- /dev/null
@@ -0,0 +1,95 @@
+.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
+.SH NAME
+glmatrix - simulates the title sequence effect of the movie
+.SH SYNOPSIS
+.B glmatrix
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] 
+[\-delay \fIusecs\fP] 
+[\-density \fIpercentage\fP]
+[\-top | \-bottom | \-both]
+[\-small | \-large]
+[\-trace]
+[\-phone \fInumber\fP]
+.SH DESCRIPTION
+The \fIglmatrix\fP program draws dropping characters similar to what
+is seen in the title sequence of the Wachowski brothers' film,
+"The Matrix".
+
+Also see
+.BR xmatrix (1)
+for a 2D rendering of the similar effect that appeared on the
+computer monitors actually \fIin\fP the movie.
+.SH OPTIONS
+.I glmatrix
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between frames of the animation, in microseconds: default 30000.
+.TP 8
+.B \-speed \fIratio\fP
+How fast the glyphs should move; default 1.0.  2.0 means twice as fast,
+0.5 means half as fast.
+.TP 8
+.B \-density \fIpercentage\fP
+The approximate percentage of the screen that should be filled with 
+characters at any given time.  Default 20%.
+.TP 8
+.B \-no\-fog
+By default, glyphs are dimmer the farther away they are.  This 
+argument disables that.
+.TP 8
+.B \-no\-waves
+By default, waves of color roll down the columns of glyphs.  This
+argument disables that.
+.TP 8
+.B \-binary\fP
+Instead of displaying Matrix glyphs, only display ones and zeros.
+.TP 8
+.B \-hexadecimal\fP
+Instead of displaying Matrix glyphs, display hexadecimal digits.
+.TP 8
+.B \-dna\fP
+Instead of displaying Matrix glyphs, display genetic code
+(guanine, adenine, thymine, and cytosine.)
+.TP 8
+.B \-fps
+Display a running tally of how many frames per second are being rendered.
+In conjunction with \fB\-delay 0\fP, this can be a useful benchmark of 
+your GL performance.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR xmatrix (1),
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1999-2003 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 8-Jun-2003.
index 9d8ca2e8a52062447c1fb688fe79844efde52683..f705a65c010da82bf24c30a26a6f4c23c2aba4cc 100644 (file)
@@ -1,14 +1,11 @@
-/*
- * glslideshow - takes a snapshot of the screen and smoothly scans around
- *               in it
+/* glslideshow, Copyright (c) 2003 Jamie Zawinski <jwz@jwz.org>
+ * Loads a sequence of images and smoothly pans around them; crossfades
+ * when loading new images.
  *
- * Copyright (c) 2002, 2003 Mike Oliphant (oliphant@gtk.org)
+ * First version Copyright (c) 2002, 2003 Mike Oliphant (oliphant@gtk.org)
+ * based on flipscreen3d, Copyright (C) 2001 Ben Buxton (bb@cactii.net).
  *
- * Framework based on flipscreen3d
- *   Copyright (C) 2001 Ben Buxton (bb@cactii.net)
- *
- * Smooth transitions between multiple files added by
- * Jamie Zawinski <jwz@jwz.org>
+ * Almost entirely rewritten by jwz, 21-Jun-2003.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
 # define HACK_INIT init_slideshow
 # define HACK_DRAW draw_slideshow
 # define HACK_RESHAPE reshape_slideshow
+# define HACK_HANDLE_EVENT glslideshow_handle_event
+# define EVENT_MASK        (ExposureMask|VisibilityChangeMask)
 # define slideshow_opts xlockmore_opts
 
-# define DEF_FADE     "True"
-# define DEF_DURATION "30"
-# define DEF_ZOOM     "75"
-
-#define DEFAULTS  "*delay:       20000          \n" \
-                  "*fade:       " DEF_FADE     "\n" \
-                  "*duration:   " DEF_DURATION "\n" \
-                  "*zoom:       " DEF_ZOOM     "\n" \
-                 "*wireframe:   False          \n" \
-                  "*showFPS:     False          \n" \
-                 "*fpsSolid:    True           \n" \
-                  "*desktopGrabber: xscreensaver-getimage -no-desktop %s\n"
+# define DEF_FADE_DURATION  "2"
+# define DEF_PAN_DURATION   "6"
+# define DEF_IMAGE_DURATION "30"
+# define DEF_ZOOM           "75"
+# define DEF_FPS_CUTOFF     "5"
+# define DEF_DEBUG          "False"
+
+#define DEFAULTS  "*delay:           20000                \n" \
+                  "*fadeDuration:  " DEF_FADE_DURATION   "\n" \
+                  "*panDuration:   " DEF_PAN_DURATION    "\n" \
+                  "*imageDuration: " DEF_IMAGE_DURATION  "\n" \
+                  "*zoom:          " DEF_ZOOM            "\n" \
+                  "*FPScutoff:     " DEF_FPS_CUTOFF      "\n" \
+                 "*debug   :      " DEF_DEBUG           "\n" \
+                 "*wireframe:       False                \n" \
+                  "*showFPS:         False                \n" \
+                 "*fpsSolid:        True                 \n" \
+                  "*desktopGrabber:  xscreensaver-getimage -no-desktop %s\n"
 
 # include "xlockmore.h"
 
-#define RRAND(range) (random()%(range))
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #include <stdlib.h>
 #include "grab-ximage.h"
 
+typedef struct {
+  GLfloat x, y, w, h;
+} rect;
 
-#define QW 12.4   /* arbitrary size of the textured quads we render */
-#define QH 12.4
-#define QX -6.2
-#define QY  6.2
+typedef struct {
+  GLuint texid;                           /* which texture to draw */
+  enum { IN, OUT, DEAD } state;    /* how to draw it */
+  rect from, to;                  /* the journey this quad is taking */
+} quad;
 
-#define NQUADS 2  /* sometimes we draw 2 at once */
 
 typedef struct {
   GLXContext *glx_context;
-  Window window;
+  time_t start_time;           /* when we started displaying this image */
 
-  int tw, th;                  /* texture width, height */
-  GLfloat max_tx, max_ty;
+  int motion_frames;            /* how many frames each pan takes */
+  int fade_frames;              /* how many frames fading in/out takes */
 
-  GLfloat qw, qh;              /* q? are for the quad we'll draw */
-  GLfloat qx[NQUADS], qy[NQUADS], qz[NQUADS];
-  GLfloat dx[NQUADS], dy[NQUADS], dz[NQUADS];
+  quad quads[2];               /* the (up to) 2 quads we animate */
+  GLuint texids[2];            /* textures: "old" and "new" */
+  GLuint current_texid;         /* the "new" one */
 
-  GLuint texids[NQUADS];       /* two textures: current img, incoming img */
+  int img_w, img_h;            /* Size (pixels) of currently-loaded image */
 
-  time_t start_time;           /* when we started displaying this image */
+  double now;                  /* current time in seconds */
+  double pan_start_time;       /* when this pan began */
+  double image_start_time;     /* when this image was loaded */
+  double dawn_of_time;         /* when the program launched */
+
+  Bool redisplay_needed_p;     /* Sometimes we can get away with not
+                                   re-painting.  Tick this if a redisplay
+                                   is required. */
 
-  int curr_screen;
-  int curr_texid_index;
-  int in_transition;           /* true while we're drawing overlapping imgs */
-  int in_file_transition;      /* ...plus loading a new image */
-  int frames;                  /* how many frames we've drawn in this pan */
+  GLfloat fps;                  /* approximate frame rate we're achieving */
+  int pan_frame_count;         /* More frame-rate stats */
+  int fade_frame_count;
+  Bool low_fps_p;              /* Whether we have compensated for a low
+                                   frame rate. */
 
 } slideshow_state;
 
@@ -93,365 +107,745 @@ static slideshow_state *sss = NULL;
 
 /* Command-line arguments
  */
-int fade;     /* If true, transitions between pans (and between images) will
-                 be translucent; otherwise, they will be jump-cuts. */
-int duration; /* how many seconds until loading a new image */
-int zoom;     /* how far in to zoom when panning, in percent of image size:
-                 that is, 75 means "when zoomed all the way in, 75% of the
-                 image will be on screen."  */
-
-
-/* blah, apparently other magic numbers elsewhere in the file also
-   affect this...   can't just change these to speed up / slow down...
- */
-static int frames_per_pan  = 300;
-static int frames_per_fade = 100;
+int fade_seconds;    /* Duration in seconds of fade transitions.
+                        If 0, jump-cut instead of fading. */
+int pan_seconds;     /* Duration of each pan through an image. */
+int image_seconds;   /* How many seconds until loading a new image. */
+int zoom;            /* How far in to zoom when panning, in percent of image
+                        size: that is, 75 means "when zoomed all the way in,
+                        75% of the image will be on screen."  */
+int fps_cutoff;      /* If the frame-rate falls below this, turn off zooming.*/
+Bool debug_p;       /* Be loud and do weird things. */
 
 
 static XrmOptionDescRec opts[] = {
-  {"+fade",     ".slideshow.fade",     XrmoptionNoArg, (caddr_t) "False" },
-  {"-fade",     ".slideshow.fade",     XrmoptionNoArg, (caddr_t) "True" },
-  {"-duration", ".slideshow.duration", XrmoptionSepArg, 0},
-  {"-zoom",     ".slideshow.zoom",     XrmoptionSepArg, 0}
+  {"-fade",     ".slideshow.fadeDuration",  XrmoptionSepArg, 0     },
+  {"-pan",      ".slideshow.panDuration",   XrmoptionSepArg, 0     },
+  {"-duration", ".slideshow.imageDuration", XrmoptionSepArg, 0     },
+  {"-zoom",     ".slideshow.zoom",          XrmoptionSepArg, 0     },
+  {"-cutoff",   ".slideshow.FPScutoff",     XrmoptionSepArg, 0     },
+  {"-debug",    ".slideshow.debug",         XrmoptionNoArg, "True" },
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &fade,     "fade",     "Fade",     DEF_FADE,     t_Bool},
-  {(caddr_t *) &duration, "duration", "Duration", DEF_DURATION, t_Int},
-  {(caddr_t *) &zoom,     "zoom",     "Zoom",     DEF_ZOOM,     t_Int}
+  { &fade_seconds,  "fadeDuration", "FadeDuration", DEF_FADE_DURATION,  t_Int},
+  { &pan_seconds,   "panDuration",  "PanDuration",  DEF_PAN_DURATION,   t_Int},
+  { &image_seconds, "imageDuration","ImageDuration",DEF_IMAGE_DURATION, t_Int},
+  { &zoom,          "zoom",         "Zoom",         DEF_ZOOM,           t_Int},
+  { &fps_cutoff,    "FPScutoff",    "FPSCutoff",    DEF_FPS_CUTOFF,     t_Int},
+  { &debug_p,       "debug",        "Debug",        DEF_DEBUG,         t_Bool},
 };
 
 ModeSpecOpt slideshow_opts = {countof(opts), opts, countof(vars), vars, NULL};
 
 
-/* draw the texture mapped quad.
-   `screen' specifies which of the independently-moving images to draw.
+/* Returns the current time in seconds as a double.
  */
+static double
+double_time (void)
+{
+  struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+  struct timezone tzp;
+  gettimeofday(&now, &tzp);
+# else
+  gettimeofday(&now);
+# endif
+
+  return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
 static void
-showscreen (ModeInfo *mi, int wire, int screen, int texid_index)
+draw_quad (ModeInfo *mi, quad *q)
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
-  static GLfloat r = 1, g = 1, b = 1, a = 1;
-  GLfloat qxw, qyh;
-  GLfloat x, y, w, h;
+  int wire = MI_IS_WIREFRAME(mi);
+  GLfloat ratio;
+  rect current;
+  GLfloat opacity;
+  double secs;
+  GLfloat texw = 0;
+  GLfloat texh = 0;
 
-  if (screen >= NQUADS) abort();
-  qxw = ss->qx[screen] + ss->qw;
-  qyh = ss->qy[screen] - ss->qh;
-  x = ss->qx[screen];
-  y = ss->qy[screen];
-  w = qxw;
-  h = qyh;
+  if (q->state == DEAD)
+    return;
 
-  ss->qx[screen] += ss->dx[screen];
-  ss->qy[screen] -= ss->dy[screen];
-  ss->qz[screen] += ss->dz[screen];
+  secs = ss->now - ss->pan_start_time;
 
-  glTranslatef(0, 0, ss->qz[screen]);
+  if (q->state == OUT)
+    secs += pan_seconds;
 
-  if (ss->in_transition) {
-    a = 1 - (ss->frames/100.0);
+  ratio = secs / (pan_seconds + fade_seconds);
 
-    if (screen != ss->curr_screen) {
-      a = 1-a;
-    }
-  }
-  else {
-    a = 1;
-  }
+  current.x = q->from.x + ratio * (q->to.x - q->from.x);
+  current.y = q->from.y + ratio * (q->to.y - q->from.y);
+  current.w = q->from.w + ratio * (q->to.w - q->from.w);
+  current.h = q->from.h + ratio * (q->to.h - q->from.h);
 
-  glColor4f(r, g, b, a);
+  if (secs < fade_seconds)
+    opacity = secs / (GLfloat) fade_seconds;    /* fading in or out... */
+  else if (secs < pan_seconds)
+    opacity = 1;                               /* panning opaquely. */
+  else
+    opacity = 1 - ((secs - pan_seconds) /
+                   (GLfloat) fade_seconds);    /* fading in or out... */
 
-  if(!wire) {
-    glEnable(GL_TEXTURE_2D);
-    glEnable(GL_BLEND);
-    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-    glDepthMask(GL_FALSE);
-    glBindTexture (GL_TEXTURE_2D, ss->texids[texid_index]);
-  }
+  if (q->state == OUT && opacity < 0.0001)
+    q->state = DEAD;
 
-  glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
-
-  glNormal3f(0, 0, 1);
-
-  glTexCoord2f(0, ss->max_ty);
-  glVertex3f(x, y, 0);
-
-  glTexCoord2f(ss->max_tx, ss->max_ty);
-  glVertex3f(w, y, 0);
-
-  glTexCoord2f(ss->max_tx, 0);
-  glVertex3f(w, h, 0);
-
-  glTexCoord2f(0, 0);
-  glVertex3f(x, h, 0);
-
-  glEnd();
-
-  if (wire) {
-    GLfloat i;
-    int k = 10;
-    glBegin(GL_LINES);
-    for (i = x; i < w; i += ((w-x)/k))
-      {
-        glVertex3f(i, y, 0);
-        glVertex3f(i, h, 0);
-      }
-    for (i = y; i >= h; i -= ((y-h)/k))
-      {
-        glVertex3f(x, i, 0);
-        glVertex3f(w, i, 0);
-      }
-    glVertex3f(x, y, 0);
-    glVertex3f(w, h, 0);
-    glVertex3f(x, h, 0);
-    glVertex3f(w, y, 0);
-    glEnd();
-  }
+  glPushMatrix();
 
-  glDisable(GL_TEXTURE_2D);
-  glDepthMask(GL_TRUE);
-  
-  glBegin(GL_LINE_LOOP);
-  glVertex3f(x, y, 0);
-  glVertex3f(x, h, 0);
-  glVertex3f(w, h, 0);
-  glVertex3f(w, y, 0);
-  glEnd();
-  glDisable(GL_BLEND);
-
-  glTranslatef(0, 0, -ss->qz[screen]);
+  glTranslatef (current.x, current.y, 0);
+  glScalef (current.w, current.h, 1);
+
+  if (!wire)
+    {
+      texw = mi->xgwa.width  / (GLfloat) ss->img_w;
+      texh = mi->xgwa.height / (GLfloat) ss->img_h;
+
+      glEnable (GL_TEXTURE_2D);
+      glEnable (GL_BLEND);
+      glBindTexture (GL_TEXTURE_2D, q->texid);
+      glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+      glDepthMask (GL_FALSE);
+
+      /* Draw the texture quad
+       */
+      glColor4f (1, 1, 1, opacity);
+      glNormal3f (0, 0, 1);
+      glBegin (GL_QUADS);
+      glTexCoord2f (0,    0);    glVertex3f (0, 0, 0);
+      glTexCoord2f (0,    texh); glVertex3f (0, 1, 0);
+      glTexCoord2f (texw, texh); glVertex3f (1, 1, 0);
+      glTexCoord2f (texw, 0);    glVertex3f (1, 0, 0);
+      glEnd();
+
+      glDisable (GL_TEXTURE_2D);
+      glDisable (GL_BLEND);
+    }
+
+  if (wire)
+    glColor4f ((q->texid == ss->texids[0] ? opacity : 0), 0,
+               (q->texid == ss->texids[0] ? 0 : opacity),
+               opacity);
+  else
+    glColor4f (1, 1, 1, opacity);
+
+
+  /* Draw a grid inside the box
+   */
+  if (wire)
+    {
+      GLfloat d = 0.1;
+      GLfloat x, y;
+      glBegin(GL_LINES);
+      glVertex3f (0, 0, 0); glVertex3f (1, 1, 0);
+      glVertex3f (1, 0, 0); glVertex3f (0, 1, 0);
+
+      for (y = 0; y < 1+d; y += d)
+        for (x = 0; x < 1+d; x += d)
+          {
+            glVertex3f (0, y, 0); glVertex3f (1, y, 0);
+            glVertex3f (x, 0, 0); glVertex3f (x, 1, 0);
+          }
+      glEnd();
+    }
+
+  glPopMatrix();
+
+  if (debug_p)
+    {
+      /* Draw the "from" and "to" boxes
+       */
+      glColor4f ((q->texid == ss->texids[0] ? opacity : 0), 0,
+                 (q->texid == ss->texids[0] ? 0 : opacity),
+                 opacity);
+
+      glBegin (GL_LINE_LOOP);
+      glVertex3f (q->from.x,             q->from.y,             0);
+      glVertex3f (q->from.x + q->from.w, q->from.y,             0);
+      glVertex3f (q->from.x + q->from.w, q->from.y + q->from.h, 0);
+      glVertex3f (q->from.x,             q->from.y + q->from.h, 0);
+      glEnd();
+
+      glBegin (GL_LINE_LOOP);
+      glVertex3f (q->to.x,               q->to.y,               0);
+      glVertex3f (q->to.x + q->to.w,     q->to.y,               0);
+      glVertex3f (q->to.x + q->to.w,     q->to.y + q->to.h,     0);
+      glVertex3f (q->to.x,               q->to.y + q->to.h,     0);
+      glEnd();
+    }
 }
 
 
 static void
-display (ModeInfo *mi)
+draw_quads (ModeInfo *mi)
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
-  int wire = MI_IS_WIREFRAME(mi);
-  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
-  glLoadIdentity();
-  gluLookAt(0, 0, 15,
-            0, 0, 0,
-            0, 1, 0);
+  GLfloat s, o;
+  int i;
+
+  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
   glPushMatrix();
 
-  showscreen (mi, wire, ss->curr_screen, ss->curr_texid_index);
+  s = (100.0 / zoom);
+  o = (1-s)/2;
+  glTranslatef (o, o, 0);
+  glScalef (s, s, s);
 
-  if (ss->in_transition)
-    showscreen (mi, wire, 1-ss->curr_screen,
-                (ss->in_file_transition
-                 ? 1 - ss->curr_texid_index
-                 : ss->curr_texid_index));
+  for (i = 0; i < countof(ss->quads); i++)
+    draw_quad (mi, &ss->quads[i]);
 
   glPopMatrix();
-  glFlush();
-}
 
-void
-reshape_slideshow (ModeInfo *mi, int width, int height)
-{
-  glViewport(0,0,(GLint)width, (GLint) height);
-  glMatrixMode(GL_PROJECTION);
-  glLoadIdentity();
-  gluPerspective(45, 1, 2.0, 85);
-  glMatrixMode(GL_MODELVIEW);
+  if (debug_p)
+    {
+      glColor4f (1, 1, 1, 1);
+      glBegin (GL_LINE_LOOP);
+      glVertex3f (0, 0, 0);
+      glVertex3f (0, 1, 0);
+      glVertex3f (1, 1, 0);
+      glVertex3f (1, 0, 0);
+      glEnd();
+    }
 }
 
+
+/* Re-randomize the state of the given quad.
+ */
 static void
-reset (ModeInfo *mi, int screen)
+reset_quad (ModeInfo *mi, quad *q)
 {
-  slideshow_state *ss = &sss[MI_SCREEN(mi)];
-  ss->frames = 0;
-
-  if (screen >= NQUADS) abort();
-  ss->dz[screen] = (-.02+(RRAND(400)/10000.0)) * (GLfloat) zoom/100.0;
+/*  slideshow_state *ss = &sss[MI_SCREEN(mi)];*/
+
+  GLfloat mid_w = (zoom / 100.0);
+  GLfloat mid_h = (zoom / 100.0);
+  GLfloat mid_x = (1 - mid_w) / 2;
+  GLfloat mid_y = (1 - mid_h) / 2;
+
+  GLfloat small = mid_w + frand ((1 - mid_w) * 0.3);
+#if 0
+  GLfloat large = small + frand ((1 - small) / 2) + ((1 - small) / 2);
+#else
+  GLfloat large = small + frand (1 - small);
+#endif
 
-  if (ss->dz[screen] < 0.0) {
-    ss->qz[screen] = 6.0 + RRAND(300)/100.0;
-  }
-  else {
-    ss->qz[screen] = 1.0 + RRAND(300)/100.0;
-  }
+  if (q->state != DEAD)
+    abort();    /* we should only be resetting a quad when it's not visible. */
+
+  /* Possible box sizes range between "zoom" and "100%".
+     Pick a small box size, and a large box size.
+     Assign each a random position within the 1x1 box,
+     such that they encompass the middle "zoom" percentage.
+     One of those is the start, and one is the end.
+     Each frame will transition between one and the other.
+   */
+
+  if (random() & 1)
+    {
+      q->from.w = small; q->from.h = small;
+      q->to.w   = large; q->to.h   = large;
+    }
+  else
+    {
+      q->from.w = large; q->from.h = large;
+      q->to.w   = small; q->to.h   = small;
+    }
 
-  ss->qz[screen] *= (GLfloat) zoom/100.0;
+  q->from.x = mid_x - frand (q->from.w - mid_w);
+  q->from.y = mid_y - frand (q->from.h - mid_h);
+  q->to.x   = mid_x - frand (q->to.w - mid_w);
+  q->to.y   = mid_y - frand (q->to.w - mid_h);
 
-  ss->dx[screen] = -.02 + RRAND(400)/10000.0;
-  ss->dy[screen] =- .01 + RRAND(200)/10000.0;
+  q->state = IN;
+}
 
-  ss->dx[screen] *= ss->qz[screen]/12.0;
-  ss->dy[screen] *= ss->qz[screen]/12.0;
 
-  ss->qx[screen] = QX - ss->dx[screen] * 40.0 * ss->qz[screen];
-  ss->qy[screen] = QY + ss->dy[screen] * 40.0 * ss->qz[screen];  
+/* Shrinks the XImage by a factor of two.
+ */
+static void
+shrink_image (ModeInfo *mi, XImage *ximage)
+{
+  int w2 = ximage->width/2;
+  int h2 = ximage->height/2;
+  int x, y;
+  XImage *ximage2;
+
+  if (w2 <= 32 || h2 <= 32)   /* let's not go crazy here, man. */
+    return;
+
+  if (debug_p)
+    fprintf (stderr, "%s: debug: shrinking image %dx%d -> %dx%d\n",
+             progname, ximage->width, ximage->height, w2, h2);
+
+  ximage2 = XCreateImage (MI_DISPLAY (mi), mi->xgwa.visual,
+                          32, ZPixmap, 0, 0,
+                          w2, h2, 32, 0);
+  ximage2->data = (char *) calloc (h2, ximage2->bytes_per_line);
+  if (!ximage2->data)
+    {
+      fprintf (stderr, "%s: out of memory (scaling %dx%d image to %dx%d)\n",
+               progname, ximage->width, ximage->height, w2, h2);
+      exit (1);
+    }
+  for (y = 0; y < h2; y++)
+    for (x = 0; x < w2; x++)
+      XPutPixel (ximage2, x, y, XGetPixel (ximage, x*2, y*2));
+  free (ximage->data);
+  *ximage = *ximage2;
+  ximage2->data = 0;
+  XFree (ximage2);
 }
 
 
+/* Load a new image into a texture for the given quad.
+ */
 static void
-getSnapshot (ModeInfo *mi, int into_texid)
+load_quad (ModeInfo *mi, quad *q)
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
   XImage *ximage;
   int status;
-  
-  if(MI_IS_WIREFRAME(mi)) return;
+  int max_reduction = 7;
+  int err_count = 0;
+  int wire = MI_IS_WIREFRAME(mi);
+
+  if (q->state != DEAD) abort();
+
+  /* Figure out which texid is currently in use, and pick the other one.
+   */
+  {
+    GLuint tid = 0;
+    int i;
+    if (ss->current_texid == 0)
+      tid = ss->texids[0];
+    else
+      for (i = 0; i < countof(ss->texids); i++)
+        if (ss->texids[i] != ss->current_texid)
+          {
+            tid = ss->texids[i];
+            break;
+          }
+
+    if (tid == 0) abort();   /* both textures in use by visible quads? */
+    q->texid = tid;
+    ss->current_texid = tid;
+  }
+
+  if (debug_p)
+    fprintf (stderr, "%s: debug: loading image %d (%dx%d)\n",
+             progname, q->texid, mi->xgwa.width, mi->xgwa.height);
 
-  ss->qw = QW;
-  ss->qh = QH;
+  if (wire)
+    goto DONE;
 
   ximage = screen_to_ximage (mi->xgwa.screen, mi->window);
 
-  ss->tw = mi->xgwa.width;
-  ss->th = mi->xgwa.height;
-/*  ss->tw = ximage->width; */
-/*  ss->th = ximage->height; */
+  glBindTexture (GL_TEXTURE_2D, q->texid);
+  glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+                   GL_LINEAR_MIPMAP_LINEAR);
   
-  ss->qw *= (GLfloat) ss->tw / MI_WIDTH(mi);
-  ss->qh *= (GLfloat) ss->th / MI_HEIGHT(mi);
-  
-  ss->max_tx = (GLfloat) ss->tw / (GLfloat) ximage->width;
-  ss->max_ty = (GLfloat) ss->th / (GLfloat) ximage->height;
+  ss->img_w = ximage->width;
+  ss->img_h = ximage->height;
 
-  glBindTexture (GL_TEXTURE_2D, into_texid);
+ AGAIN:
 
-  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
-                  GL_LINEAR_MIPMAP_LINEAR);
-  
   clear_gl_error();
-  status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
-                            ximage->width, ximage->height,
-                            GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
+  status = gluBuild2DMipmaps (GL_TEXTURE_2D, 3,
+                              ximage->width, ximage->height,
+                              GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
   
   if(!status && glGetError())
    /* Some implementations of gluBuild2DMipmaps(), but set a GL error anyway.
       We could just call check_gl_error(), but that would exit. */
     status = -1;
 
-  if(status) {
-    const char *s = gluErrorString (status);
-
-    fprintf(stderr, "%s: error mipmapping %dx%d texture: %s\n",
-           progname, ximage->width, ximage->height,
-           (s ? s : "(unknown)"));
-    fprintf(stderr, "%s: turning on -wireframe.\n", progname);
-    MI_IS_WIREFRAME(mi) = 1;
-    clear_gl_error();
-  }
+  if (status)
+    {
+      char buf[100];
+      const char *s = gluErrorString (status);
+
+      if (!s || !*s)
+        {
+          sprintf (buf, "unknown error %d", status);
+          s = buf;
+        }
+
+      clear_gl_error();
+
+      if (++err_count > max_reduction)
+        {
+          fprintf(stderr,
+                  "\n"
+                  "%s: %dx%d texture failed, even after reducing to %dx%d:\n"
+                  "%s: GLU said: \"%s\".\n"
+                  "%s: probably this means "
+                  "\"your video card is worthless and weak\"?\n\n",
+                  progname, MI_WIDTH(mi), MI_HEIGHT(mi),
+                  ximage->width, ximage->height,
+                  progname, s,
+                  progname);
+          exit (1);
+        }
+      else
+        {
+          if (debug_p)
+            fprintf (stderr, "%s: debug: mipmap error (%dx%d): %s\n",
+                     progname, ximage->width, ximage->height, s);
+          shrink_image (mi, ximage);
+          goto AGAIN;
+        }
+    }
 
   check_gl_error("mipmapping");  /* should get a return code instead of a
                                    GL error, but just in case... */
-  
+
   free(ximage->data);
   ximage->data = 0;
   XDestroyImage(ximage);
 
-  ss->start_time = time ((time_t *) 0);
+ DONE:
+
+  /* Re-set "now" so that time spent loading the image file does not count
+     against the time remaining in this stage of the animation: image loading,
+     if it takes a perceptible amount of time, will cause the animation to
+     pause, but will not cause it to drop frames.
+   */
+  ss->now = double_time ();
+  ss->image_start_time = ss->now;
+
+  ss->redisplay_needed_p = True;
+}
+
+
+
+void
+reshape_slideshow (ModeInfo *mi, int width, int height)
+{
+  slideshow_state *ss = &sss[MI_SCREEN(mi)];
+  GLfloat s;
+  glViewport (0, 0, width, height);
+  glMatrixMode (GL_PROJECTION);
+  glLoadIdentity();
+  glMatrixMode (GL_MODELVIEW);
+  glLoadIdentity();
+
+  s = 2;
+
+  if (debug_p)
+    {
+      s *= (zoom / 100.0) * 0.75;
+      if (s < 0.1) s = 0.1;
+    }
+
+  glScalef (s, s, s);
+  glTranslatef (-0.5, -0.5, 0);
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  ss->redisplay_needed_p = True;
+}
+
+
+Bool
+glslideshow_handle_event (ModeInfo *mi, XEvent *event)
+{
+  slideshow_state *ss = &sss[MI_SCREEN(mi)];
+
+  if (event->xany.type == Expose ||
+      event->xany.type == GraphicsExpose ||
+      event->xany.type == VisibilityNotify)
+    {
+      if (debug_p)
+        fprintf (stderr, "%s: debug: exposure\n", progname);
+      ss->redisplay_needed_p = True;
+      return True;
+    }
+  return False;
 }
 
+
+/* Do some sanity checking on various user-supplied values, and make
+   sure they are all internally consistent.
+ */
+static void
+sanity_check (ModeInfo *mi)
+{
+  if (zoom < 1) zoom = 1;           /* zoom is a positive percentage */
+  else if (zoom > 100) zoom = 100;
+
+  if (pan_seconds < fade_seconds)   /* pan is inclusive of fade */
+    pan_seconds = fade_seconds;
+
+  if (pan_seconds == 0)             /* no zero-length cycles, please... */
+    pan_seconds = 1;
+
+  if (image_seconds < pan_seconds)  /* we only change images at fade-time */
+    image_seconds = pan_seconds;
+
+  /* If we're not panning/zooming within the image, then there's no point
+     in crossfading the image with itself -- only do crossfades when changing
+     to a new image. */
+  if (zoom == 100 && pan_seconds < image_seconds)
+    pan_seconds = image_seconds;
+
+  if      (fps_cutoff < 0)  fps_cutoff = 0;
+  else if (fps_cutoff > 30) fps_cutoff = 30;
+}
+
+
 void
 init_slideshow (ModeInfo *mi)
 {
   int screen = MI_SCREEN(mi);
   slideshow_state *ss;
+  int wire = MI_IS_WIREFRAME(mi);
+  int i;
   
-  if(sss == NULL) {
-    if((sss = (slideshow_state *)
-        calloc(MI_NUM_SCREENS(mi), sizeof(slideshow_state))) == NULL)
+  if (sss == NULL) {
+    if ((sss = (slideshow_state *)
+         calloc (MI_NUM_SCREENS(mi), sizeof(slideshow_state))) == NULL)
       return;
   }
-
   ss = &sss[screen];
-  ss->window = MI_WINDOW(mi);
-  ss->qw = QW;
-  ss->qh = QH;
 
-  if((ss->glx_context = init_GL(mi)) != NULL) {
-    reshape_slideshow(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+  if ((ss->glx_context = init_GL(mi)) != NULL) {
+    reshape_slideshow (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
   } else {
     MI_CLEARWINDOW(mi);
   }
 
-  glClearColor(0.0,0.0,0.0,0.0);
-  
-  if(! MI_IS_WIREFRAME(mi)) {
-    glShadeModel(GL_SMOOTH);
-    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
-    glEnable(GL_DEPTH_TEST);
-    glEnable(GL_CULL_FACE);
-    glCullFace(GL_FRONT);
-    glDisable(GL_LIGHTING);
-
-    glGenTextures (1, &ss->texids[0]);  /* texture for image A */
-    glGenTextures (1, &ss->texids[1]);  /* texture for image B */
-  }
-  
-  reset(mi, ss->curr_screen);
-  ss->curr_texid_index = 0;
-  getSnapshot(mi, ss->texids[ss->curr_texid_index]);
+  sanity_check(mi);
+
+  if (debug_p)
+    fprintf (stderr, "%s: debug: pan: %d; fade: %d; img: %d; zoom: %d%%\n",
+             progname, pan_seconds, fade_seconds, image_seconds, zoom);
+
+  if (! wire)
+    {
+      glShadeModel (GL_SMOOTH);
+      glPolygonMode (GL_FRONT_AND_BACK,GL_FILL);
+      glEnable (GL_DEPTH_TEST);
+      glEnable (GL_CULL_FACE);
+      glCullFace (GL_FRONT);
+      glDisable (GL_LIGHTING);
+    }
+
+  ss->now = double_time ();
+  ss->dawn_of_time = ss->now;
+
+  if (debug_p) glLineWidth (3);
+
+  ss->pan_start_time   = ss->now;
+  ss->image_start_time = ss->now;
+
+  for (i = 0; i < countof(ss->texids); i++)
+    glGenTextures (1, &ss->texids[i]);
+  ss->current_texid = 0;
+
+  for (i = 0; i < countof(ss->quads); i++)
+    {
+      quad *q = &ss->quads[i];
+      q->texid = ss->current_texid;
+      q->state = DEAD;
+      reset_quad (mi, q);
+      q->state = DEAD;
+    }
+
+  load_quad (mi, &ss->quads[0]);
+  ss->quads[0].state = IN;
+
+  ss->redisplay_needed_p = True;
 }
 
-void
-draw_slideshow (ModeInfo *mi)
+
+/* Call this each time we change from one state to another.
+   It gathers statistics on the frame rate of the previous state,
+   and if it's bad, turn things off (under the assumption that
+   we're running on sucky hardware.)
+ */
+static void
+ponder_state_change (ModeInfo *mi)
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
-  Window w = MI_WINDOW(mi);
-  Display *disp = MI_DISPLAY(mi);
+  const char *which;
+  int frames, secs;
+  GLfloat fps;
+
+  if (ss->fade_frame_count && ss->pan_frame_count)
+    abort();  /* one of these should be zero! */
+  else if (ss->fade_frame_count)   /* just finished fading */
+    {
+      which = "faded ";
+      secs = fade_seconds;
+      frames = ss->fade_frame_count;
+      ss->fade_frame_count = 0;
+    }
+  else if (ss->pan_frame_count)   /* just finished panning */
+    {
+      which = "panned";
+      secs = pan_seconds;
+      frames = ss->pan_frame_count;
+      ss->pan_frame_count = 0;
+    }
+  else
+    abort();  /* one of these should be non-zero! */
 
-  if(!ss->glx_context) return;
+  fps = frames / (GLfloat) secs;
 
-  glXMakeCurrent(disp, w, *(ss->glx_context));
-  
-  if (ss->frames == frames_per_pan) {
+  if (debug_p)
+    fprintf (stderr, "%s: debug: %s %3d frames %2d sec %4.1f fps\n",
+             progname, which, frames, secs, fps);
 
-    time_t now = time ((time_t *) 0);
 
-    if(fade) {
-      ss->in_transition = 1;
-      reset (mi, 1 - ss->curr_screen);
+  if (fps < fps_cutoff && !ss->low_fps_p)   /* oops, this computer sucks! */
+    {
+      int i;
 
-      if (ss->start_time + duration <= now) {
-        ss->in_file_transition = 1;
-        getSnapshot(mi, ss->texids[1 - ss->curr_texid_index]);
-      }
+      fprintf (stderr,
+               "%s: frame rate is only %.1f!  "
+               "Turning off pan/fade to compensate...\n",
+               progname, fps);
+      zoom = 100;
+      fade_seconds = 0;
+      ss->low_fps_p = True;
 
-    } else {
-      reset(mi, ss->curr_screen);
+      sanity_check (mi);
 
-      if (ss->start_time + duration <= now)
-        getSnapshot(mi, ss->texids[ss->curr_texid_index]);
+      /* Reset all quads, and mark only #0 as active. */
+      for (i = 0; i < countof(ss->quads); i++)
+        {
+          quad *q = &ss->quads[i];
+          q->state = DEAD;
+          reset_quad (mi, q);
+          q->texid = ss->current_texid;
+          q->state = (i == 0 ? IN : DEAD);
+        }
+
+      ss->pan_start_time = ss->now;
+      ss->redisplay_needed_p = True;
+
+      /* Need this in case zoom changed. */
+      reshape_slideshow (mi, mi->xgwa.width, mi->xgwa.height);
     }
-  }
+}
 
-  if (fade && ss->in_transition && ss->frames == frames_per_fade) {
-    ss->in_transition = 0;
-    ss->curr_screen = 1 - ss->curr_screen;
 
-    if (ss->in_file_transition) {
-      ss->in_file_transition = 0;
-      ss->curr_texid_index = 1 - ss->curr_texid_index;
+void
+draw_slideshow (ModeInfo *mi)
+{
+  slideshow_state *ss = &sss[MI_SCREEN(mi)];
+  Window w = MI_WINDOW(mi);
+  double secs;
+
+  if (!ss->glx_context)
+    return;
+
+  if (zoom < 100)
+    ss->redisplay_needed_p = True;
+
+  /* States:
+      0: - A invisible,  B invisible
+         - A fading in,  B invisible
+
+      1: - A opaque,     B invisible
+         - A fading out, B fading in
+         - A invisible, gets reset
+         - A invisible,  B opaque
+
+      2: - A invisible,  B opaque
+         - A fading in,  B fading out
+         - B invisible, gets reset
+         - A opaque,     B invisible (goto 1)
+  */
+
+  ss->now = double_time();
+
+  secs = ss->now - ss->pan_start_time;
+
+  if (secs < fade_seconds)
+    {
+      /* We are in the midst of a fade:
+         one quad is fading in, the other is fading out.
+         (If this is the very first time, then the one
+         fading out is already out.)
+       */
+      ss->redisplay_needed_p = True;
+      ss->fade_frame_count++;
+
+      if (! ((ss->quads[0].state == IN && ss->quads[1].state == OUT) ||
+             (ss->quads[1].state == IN && ss->quads[0].state == OUT) ||
+             (ss->quads[0].state == IN && ss->quads[1].state == DEAD)))
+        abort();
+    }
+  else if (secs < pan_seconds)
+    {
+      /* One quad is visible and in motion, the other is not.
+      */
+      if (ss->fade_frame_count != 0)  /* we just switched from fade to pan */
+        ponder_state_change (mi);
+      ss->pan_frame_count++;
+    }
+  else
+    {
+      /* One quad is visible and in motion, the other is not.
+         It's time to begin fading the visible one out, and the
+         invisible one in.  (Reset the invisible one first.)
+       */
+      quad *vq, *iq;
+
+      ponder_state_change (mi);
+
+      if (ss->quads[0].state == IN)
+        {
+          vq = &ss->quads[0];
+          iq = &ss->quads[1];
+        }
+      else
+        {
+          vq = &ss->quads[1];
+          iq = &ss->quads[0];
+        }
+
+      if (vq->state != IN)   abort();
+
+      /* I don't understand why sometimes iq is still OUT and not DEAD. */
+      if (iq->state == OUT)  iq->state = DEAD;
+      if (iq->state != DEAD) abort();
+
+      vq->state = OUT;
+
+      if (ss->image_start_time + image_seconds <= ss->now)
+        load_quad (mi, iq);
+
+      reset_quad (mi, iq);               /* fade invisible in */
+      iq->texid = ss->current_texid;     /* make sure we're using latest img */
+
+      ss->pan_start_time = ss->now;
+
+      if (! ((ss->quads[0].state == IN && ss->quads[1].state == OUT) ||
+             (ss->quads[1].state == IN && ss->quads[0].state == OUT)))
+        abort();
     }
-  }
 
-  display(mi);
-  
-  ss->frames++;
+  ss->fps = fps_1 (mi);
 
-  if(mi->fps_p) do_fps(mi);
+  if (!ss->redisplay_needed_p)
+    return;
+  else if (debug_p && zoom == 100)
+    fprintf (stderr, "%s: debug: drawing (%d)\n", progname,
+             (int) (ss->now - ss->dawn_of_time));
 
-  glFinish(); 
-  glXSwapBuffers(disp, w);
-}
+  draw_quads (mi);
+  ss->redisplay_needed_p = False;
 
-void
-release_slideshow (ModeInfo *mi)
-{
-  if(sss != NULL) {
-    (void) free((void *) sss);
-    sss = NULL;
-  }
+  if (mi->fps_p) fps_2(mi);
 
-  FreeAllGL(MI);
+  glFinish();
+  glXSwapBuffers (MI_DISPLAY (mi), w);
 }
 
-#endif
+#endif /* USE_GL */
index c3d454cbb46bb59e12b208e02fc6c023649fc248..e13f3b5fd365eedb4853e2771fed8270f5e4cbaf 100644 (file)
@@ -7,10 +7,14 @@ B glslideshow
 [\-visual \fIvisual\fP]
 [\-window]
 [\-root]
-[\-delay \fInumber\fP]
-[\-no-fade]
-[\-zoom \fInumber\fP]
+[\-pan \fIseconds\fP]
+[\-fade \fIseconds\fP]
+[\-zoom \fIpercent\fP]
+[\-delay \fIusecs\fP]
+[\-cutoff \fIint\fP]
 [\-fps]
+[\-debug]
+[\-wireframe]
 .SH DESCRIPTION
 Loads a random sequence of images and smoothly scans and zooms around
 in each, fading from pan to pan.  
@@ -33,22 +37,44 @@ Draw on a newly-created window.  This is the default.
 .B \-root
 Draw on the root window.
 .TP 8
-.B \-duration \fIseconds\fP
-How long to display each image before loading a new one.
-Default 30 seconds.
+.B \-pan \fIseconds\fP
+How long each pan should last.  Default 6 seconds.
 .TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds.  Default: 20000 (0.02 seconds.).
-.TP 8
-.B \-fade | \-no-fade
-Whether to fade between pans.
+.B \-fade \fIseconds\fP
+How long each fade (in and out) should last.  Default 2 seconds.
+If set to 0, then no cross-fading will be done (all transitions
+will be jump-cuts.)
+
+Note that fades are included in the pan, so \fI\-pan\fP should
+always be longer than  \fI\-fade\fP (it is auto-corrected if not.)
 .TP 8
 .B \-zoom \fInumber\fP
 Amount to zoom and pan as a percentage. Default: 75, meaning that
-75% or more of each image will always be visible.
+75% or more of each image will always be visible.  If set to 100%,
+then the images will always fill the screen, and no panning or 
+zooming will occur.  Images will still smoothly fade from one
+to another, however, assuming \fI\-fade\fP is non-zero.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-cutoff \fInumber\fP
+If the frame rate drops below this number of frames per second, then
+certain features will be turned off automatically (first zooming, 
+then, if the low frame rates persist, fading.)  Default 5.
+
+The idea here is that if your machine can't maintain a decent frame
+rate, then it must not have fast 3D hardware, so we might as well
+behave in a simpler manner.  Set this to 0 to disable this check.
 .TP 8
-.B \-fps | \-no-fps
+.B \-fps
 Whether to show a frames-per-second display at the bottom of the screen.
+.TP 8
+.B \-debug
+Prints debugging info to stderr.
+.TP 8
+.B \-wireframe
+Instead of loading images, simply animates representative grids instead.
 .SH ENVIRONMENT
 .PP
 .TP 8
@@ -64,13 +90,17 @@ stored in the RESOURCE_MANAGER property.
 .BR xscreensaver-getimage (1)
 .BR xscreensaver (1)
 .SH COPYRIGHT
-Copyright \(co 2002 by Mike Oliphant. Framework based on flipscreen3d,
-Copyright \(co 2001 Ben Buxton. Permission to use, copy, modify, 
-distribute, and sell this software and its documentation for any purpose is 
-hereby granted without fee, provided that the above copyright notice appear 
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
+Copyright \(co 2003 by Jamie Zawinski, based on an earlier version that was
+Copyright \(co 2002 by Mike Oliphant.  Originally derived from 
+.BR flipscreen3d (1) ,
+which was Copyright \(co 2001 Ben Buxton. 
+
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.  No representations are made about the
+suitability of this software for any purpose.  It is provided "as is"
+without express or implied warranty.
 .SH AUTHOR
-Mike Oliphant and Jamie Zawinski.
+Jamie Zawinski and Mike Oliphant.
index bc9c631399f9057f23d1ced0014bd7299b66ddce..90a28ced3f1fa847d29d53e57bd12ac0ce29b85d 100644 (file)
@@ -457,15 +457,15 @@ void calc_snake_metrics(glsnake_configuration * bp)
     y += GETSCALAR(prev_dest_dir, Y_MASK);
     z += GETSCALAR(prev_dest_dir, Z_MASK);
 
-    switch ((int) bp->node[i].dest_angle) {
-      case (int) (ZERO * 90.0):
+    switch ((int) (bp->node[i].dest_angle / 90.0)) {
+      case ZERO:
         dest_dir = -prev_src_dir;
         break;
-      case (int) (PIN * 90.0):
+      case PIN:
         dest_dir = prev_src_dir;
         break;
-      case (int) (RIGHT * 90.):
-      case (int) (LEFT * 90.0):
+      case RIGHT:
+      case LEFT:
         dest_dir = cross_product(prev_src_dir, prev_dest_dir);
         if (bp->node[i].dest_angle == (int) (RIGHT * 90.0))
           dest_dir = -dest_dir;
index bb3e9db3a9268fa5da7fc066a80002c0c6f4f9f6..75073fb31a05ec30e73a29b984770e64a3d0a4f3 100644 (file)
@@ -1,4 +1,4 @@
-/* gltext, Copyright (c) 2001, 2002 Jamie Zawinski <jwz@jwz.org>
+/* gltext, Copyright (c) 2001, 2002, 2003 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -355,7 +355,7 @@ fill_character (GLUTstrokeFont font, int c, Bool wire)
                     coord->x, coord->y, 0,
                     tube_width,
                     tube_width * 0.15,
-                    TUBE_FACES, smooth, wire);
+                    TUBE_FACES, smooth, True, wire);
             lx = coord->x;
             ly = coord->y;
           }
diff --git a/hacks/glx/hypertorus.c b/hacks/glx/hypertorus.c
new file mode 100644 (file)
index 0000000..bdcec9e
--- /dev/null
@@ -0,0 +1,820 @@
+/* hypertorus --- Shows a hypertorus that rotates in 4d */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)hypertorus.c  1.1 03/05/18 xlockmore";
+
+#endif
+
+/* Copyright (c) 2003 Carsten Steger <carsten@mirsanmir.org>. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * REVISION HISTORY:
+ * C. Steger - 03/05/18: Initial version
+ */
+
+/*
+ * This program shows the Clifford torus as it rotates in 4d.  The Clifford
+ * torus is a torus lies on the "surface" of the hypersphere in 4d.  The
+ * program projects the 4d torus to 3d using either a perspective or an
+ * orthographic projection.  Of the two alternatives, the perspecitve
+ * projection looks much more appealing.  In orthographic projections the
+ * torus degenerates into a doubly covered cylinder for some angles.  The
+ * projected 3d torus can then be projected to the screen either perspectively
+ * or orthographically.  There are three display modes for the torus: mesh
+ * (wireframe), solid, or transparent.  Furthermore, the appearance of the
+ * torus can be as a solid object or as a set of see-through bands.  Finally,
+ * the colors with with the torus is drawn can be set to either two-sided or
+ * to colorwheel.  In the first case, the torus is drawn with red on the
+ * outside and green on the inside.  This mode enables you to see that the
+ * torus turns inside-out as it rotates in 4d.  The second mode draws the
+ * torus in a fully saturated color wheel.  This gives a very nice effect
+ * when combined with the see-through bands mode.  The rotation speed for
+ * each of the six planes around which the torus rotates can be chosen.
+ * This program is very much inspired by Thomas Banchoff's book "Beyond the
+ * Third Dimension: Geometry, Computer Graphics, and Higher Dimensions",
+ * Scientific American Library, 1990.
+ */
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define DISP_WIREFRAME            0
+#define DISP_WIREFRAME_STR       "0"
+#define DISP_SURFACE              1
+#define DISP_SURFACE_STR         "1"
+#define DISP_TRANSPARENT          2
+#define DISP_TRANSPARENT_STR     "2"
+
+#define APPEARANCE_SOLID          0
+#define APPEARANCE_SOLID_STR     "0"
+#define APPEARANCE_BANDS          1
+#define APPEARANCE_BANDS_STR     "1"
+
+#define COLORS_TWOSIDED           0
+#define COLORS_TWOSIDED_STR      "0"
+#define COLORS_COLORWHEEL         1
+#define COLORS_COLORWHEEL_STR    "1"
+
+#define DISP_3D_PERSPECTIVE       0
+#define DISP_3D_PERSPECTIVE_STR  "0"
+#define DISP_3D_ORTHOGRAPHIC      1
+#define DISP_3D_ORTHOGRAPHIC_STR "1"
+
+#define DISP_4D_PERSPECTIVE       0
+#define DISP_4D_PERSPECTIVE_STR  "0"
+#define DISP_4D_ORTHOGRAPHIC      1
+#define DISP_4D_ORTHOGRAPHIC_STR "1"
+
+#define DALPHA                    1.1
+#define DALPHA_STR               "1.1"
+#define DBETA                     1.3
+#define DBETA_STR                "1.3"
+#define DDELTA                    1.5
+#define DDELTA_STR               "1.5"
+#define DZETA                     1.7
+#define DZETA_STR                "1.7"
+#define DETA                      1.9
+#define DETA_STR                 "1.9"
+#define DTHETA                    2.1
+#define DTHETA_STR               "2.1"
+
+#define DEF_DISPLAY_MODE          DISP_SURFACE_STR   
+#define DEF_APPEARANCE            APPEARANCE_BANDS_STR
+#define DEF_COLORS                COLORS_COLORWHEEL_STR
+#define DEF_3D_PROJECTION         DISP_3D_PERSPECTIVE_STR
+#define DEF_4D_PROJECTION         DISP_4D_PERSPECTIVE_STR
+#define DEF_DALPHA                DALPHA_STR
+#define DEF_DBETA                 DBETA_STR
+#define DEF_DDELTA                DDELTA_STR
+#define DEF_DZETA                 DZETA_STR
+#define DEF_DETA                  DETA_STR
+#define DEF_DTHETA                DTHETA_STR
+
+#ifdef STANDALONE
+# define PROGCLASS       "Hypertorus"
+# define HACK_INIT       init_hypertorus
+# define HACK_DRAW       draw_hypertorus
+# define HACK_RESHAPE    reshape_hypertorus
+# define hypertorus_opts xlockmore_opts
+# define DEFAULTS        "*delay:      25000 \n" \
+                         "*showFPS:    False \n" \
+                         "*wireframe:  False \n" \
+                         "*displayMode: "  DEF_DISPLAY_MODE  " \n" \
+                         "*appearance: "   DEF_APPEARANCE    " \n" \
+                         "*colors: "       DEF_COLORS        " \n" \
+                         "*projection3d: " DEF_3D_PROJECTION " \n" \
+                         "*projection4d: " DEF_4D_PROJECTION " \n" \
+                         "speedwx: "       DEF_DALPHA        " \n" \
+                         "speedwy: "       DEF_DBETA         " \n" \
+                         "speedwz: "       DEF_DDELTA        " \n" \
+                         "speedxy: "       DEF_DZETA         " \n" \
+                         "speedxz: "       DEF_DETA          " \n" \
+                         "speedyz: "       DEF_DTHETA        " \n"
+# include "xlockmore.h"         /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"             /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+
+#ifdef USE_MODULES
+ModStruct   hypertorus_description =
+{"hypertorus", "init_hypertorus", "draw_hypertorus", "release_hypertorus",
+ "draw_hypertorus", "change_hypertorus", NULL, &hypertorus_opts,
+ 25000, 1, 1, 1, 1.0, 4, "",
+ "Shows a hypertorus rotating in 4d", 0, NULL};
+
+#endif
+
+
+static int display_mode;
+static int appearance;
+static int colors;
+static int projection_3d;
+static int projection_4d;
+static float speed_wx;
+static float speed_wy;
+static float speed_wz;
+static float speed_xy;
+static float speed_xz;
+static float speed_yz;
+
+/* 4D rotation angles */
+static float alpha, beta, delta, zeta, eta, theta;
+static float aspect;
+
+static const float offset4d[4] = {
+  0.0, 0.0, 0.0, 2.0
+};
+
+static const float offset3d[4] = {
+  0.0, 0.0, -2.0, 0.0
+};
+
+
+static XrmOptionDescRec opts[] =
+{
+  {"-mesh",            ".hypertorus.displayMode",  XrmoptionNoArg,
+                       (caddr_t)DISP_WIREFRAME_STR },
+  {"-surface",         ".hypertorus.displayMode",  XrmoptionNoArg,
+                       (caddr_t)DISP_SURFACE_STR },
+  {"-transparent",     ".hypertorus.displayMode",  XrmoptionNoArg,
+                       (caddr_t)DISP_TRANSPARENT_STR },
+  {"-solid",           ".hypertorus.appearance",   XrmoptionNoArg,
+                       (caddr_t)APPEARANCE_SOLID_STR },
+  {"-bands",           ".hypertorus.appearance",   XrmoptionNoArg,
+                       (caddr_t)APPEARANCE_BANDS_STR },
+  {"-twosided",        ".hypertorus.colors",       XrmoptionNoArg,
+                       (caddr_t)COLORS_TWOSIDED_STR },
+  {"-colorwheel",      ".hypertorus.colors",       XrmoptionNoArg,
+                       (caddr_t)COLORS_COLORWHEEL_STR },
+  {"-perspective-3d",  ".hypertorus.projection3d", XrmoptionNoArg,
+                       (caddr_t)DISP_3D_PERSPECTIVE_STR },
+  {"-orthographic-3d", ".hypertorus.projection3d", XrmoptionNoArg,
+                       (caddr_t)DISP_3D_ORTHOGRAPHIC_STR },
+  {"-perspective-4d",  ".hypertorus.projection4d", XrmoptionNoArg,
+                       (caddr_t)DISP_4D_PERSPECTIVE_STR },
+  {"-orthographic-4d", ".hypertorus.projection4d", XrmoptionNoArg,
+                       (caddr_t)DISP_4D_ORTHOGRAPHIC_STR },
+  {"-speed-wx",        ".hypertorus.speedwx",      XrmoptionSepArg,
+                       (caddr_t)NULL },
+  {"-speed-wy",        ".hypertorus.speedwy",      XrmoptionSepArg,
+                       (caddr_t)NULL },
+  {"-speed-wz",        ".hypertorus.speedwz",      XrmoptionSepArg,
+                       (caddr_t)NULL },
+  {"-speed-xy",        ".hypertorus.speedxy",      XrmoptionSepArg,
+                       (caddr_t)NULL },
+  {"-speed-xz",        ".hypertorus.speedxz",      XrmoptionSepArg,
+                       (caddr_t)NULL },
+  {"-speed-yz",        ".hypertorus.speedyz",      XrmoptionSepArg,
+                       (caddr_t)NULL }
+};
+
+static argtype vars[] =
+{
+  { (caddr_t *) &display_mode,  "displayMode",  "DisplayMode",
+    DEF_DISPLAY_MODE,  t_Int },
+  { (caddr_t *) &appearance,    "appearance",   "Appearance",
+    DEF_APPEARANCE,    t_Int },
+  { (caddr_t *) &colors,        "colors",       "Colors",
+    DEF_COLORS,        t_Int },
+  { (caddr_t *) &projection_3d, "projection3d", "Projection3d",
+    DEF_3D_PROJECTION, t_Int },
+  { (caddr_t *) &projection_4d, "projection4d", "Projection4d",
+    DEF_4D_PROJECTION, t_Int },
+  { (caddr_t *) &speed_wx,      "speedwx",      "Speedwx",
+    DEF_DALPHA,        t_Float},
+  { (caddr_t *) &speed_wy,      "speedwy",      "Speedwy",
+    DEF_DBETA,         t_Float},
+  { (caddr_t *) &speed_wz,      "speedwz",      "Speedwz",
+    DEF_DDELTA,        t_Float},
+  { (caddr_t *) &speed_xy,      "speedxy",      "Speedxy",
+    DEF_DZETA,         t_Float},
+  { (caddr_t *) &speed_xz,      "speedxz",      "Speedxz",
+    DEF_DETA,          t_Float},
+  { (caddr_t *) &speed_yz,      "speedyz",      "Speedyz",
+    DEF_DTHETA,        t_Float}
+};
+
+static OptionStruct desc[] =
+{
+  { "-mesh",            "display the torus as a wireframe mesh" },
+  { "-surface",         "display the torus as a solid surface" },
+  { "-transparent",     "display the torus as a transparent surface" },
+  { "-solid",           "display the torus as a solid object" },
+  { "-bands",           "display the torus as see-through bands" },
+  { "-twosided",        "display the torus with two colors" },
+  { "-colorwheel",      "display the torus with a smooth color wheel" },
+  { "-perspective-3d",  "project the torus perspectively from 3d to 2d" },
+  { "-orthographic-3d", "project the torus orthographically from 3d to 2d" },
+  { "-perspective-4d",  "project the torus perspectively from 4d to 3d" },
+  { "-orthographic-4d", "project the torus orthographically from 4d to 3d" },
+  { "-speed-wx <arg>",  "rotation speed around the wx plane" },
+  { "-speed-wy <arg>",  "rotation speed around the wy plane" },
+  { "-speed-wz <arg>",  "rotation speed around the wz plane" },
+  { "-speed-xy <arg>",  "rotation speed around the xy plane" },
+  { "-speed-xz <arg>",  "rotation speed around the xz plane" },
+  { "-speed-yz <arg>",  "rotation speed around the yz plane" }
+};
+
+ModeSpecOpt hypertorus_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+
+typedef struct {
+  GLint       WindH, WindW;
+  GLXContext *glx_context;
+} hypertorusstruct;
+
+static hypertorusstruct *hyper = (hypertorusstruct *) NULL;
+
+
+/* Add a rotation around the wx-plane to the matrix m. */
+static void rotatewx(float m[4][4], float phi)
+{
+  float c, s, u, v;
+  int i;
+
+  phi *= M_PI/180.0;
+  c = cos(phi);
+  s = sin(phi);
+  for (i=0; i<4; i++)
+  {
+    u = m[i][1];
+    v = m[i][2];
+    m[i][1] = c*u+s*v;
+    m[i][2] = -s*u+c*v;
+  }
+}
+
+
+/* Add a rotation around the wy-plane to the matrix m. */
+static void rotatewy(float m[4][4], float phi)
+{
+  float c, s, u, v;
+  int i;
+
+  phi *= M_PI/180.0;
+  c = cos(phi);
+  s = sin(phi);
+  for (i=0; i<4; i++)
+  {
+    u = m[i][0];
+    v = m[i][2];
+    m[i][0] = c*u-s*v;
+    m[i][2] = s*u+c*v;
+  }
+}
+
+
+/* Add a rotation around the wz-plane to the matrix m. */
+static void rotatewz(float m[4][4], float phi)
+{
+  float c, s, u, v;
+  int i;
+
+  phi *= M_PI/180.0;
+  c = cos(phi);
+  s = sin(phi);
+  for (i=0; i<4; i++)
+  {
+    u = m[i][0];
+    v = m[i][1];
+    m[i][0] = c*u+s*v;
+    m[i][1] = -s*u+c*v;
+  }
+}
+
+
+/* Add a rotation around the xy-plane to the matrix m. */
+static void rotatexy(float m[4][4], float phi)
+{
+  float c, s, u, v;
+  int i;
+
+  phi *= M_PI/180.0;
+  c = cos(phi);
+  s = sin(phi);
+  for (i=0; i<4; i++)
+  {
+    u = m[i][2];
+    v = m[i][3];
+    m[i][2] = c*u+s*v;
+    m[i][3] = -s*u+c*v;
+  }
+}
+
+
+/* Add a rotation around the xz-plane to the matrix m. */
+static void rotatexz(float m[4][4], float phi)
+{
+  float c, s, u, v;
+  int i;
+
+  phi *= M_PI/180.0;
+  c = cos(phi);
+  s = sin(phi);
+  for (i=0; i<4; i++)
+  {
+    u = m[i][1];
+    v = m[i][3];
+    m[i][1] = c*u-s*v;
+    m[i][3] = s*u+c*v;
+  }
+}
+
+
+/* Add a rotation around the yz-plane to the matrix m. */
+static void rotateyz(float m[4][4], float phi)
+{
+  float c, s, u, v;
+  int i;
+
+  phi *= M_PI/180.0;
+  c = cos(phi);
+  s = sin(phi);
+  for (i=0; i<4; i++)
+  {
+    u = m[i][0];
+    v = m[i][3];
+    m[i][0] = c*u-s*v;
+    m[i][3] = s*u+c*v;
+  }
+}
+
+
+/* Compute a fully saturated and bright color based on an angle. */
+static void color(double angle)
+{
+  int s;
+  double t;
+  float color[4];
+
+  if (colors != COLORS_COLORWHEEL)
+    return;
+
+  if (angle >= 0.0)
+    angle = fmod(angle,2*M_PI);
+  else
+    angle = fmod(angle,-2*M_PI);
+  s = floor(angle/(M_PI/3));
+  t = angle/(M_PI/3)-s;
+  if (s >= 6)
+    s = 0;
+  switch (s)
+  {
+    case 0:
+      color[0] = 1.0;
+      color[1] = t;
+      color[2] = 0.0;
+      break;
+    case 1:
+      color[0] = 1.0-t;
+      color[1] = 1.0;
+      color[2] = 0.0;
+      break;
+    case 2:
+      color[0] = 0.0;
+      color[1] = 1.0;
+      color[2] = t;
+      break;
+    case 3:
+      color[0] = 0.0;
+      color[1] = 1.0-t;
+      color[2] = 1.0;
+      break;
+    case 4:
+      color[0] = t;
+      color[1] = 0.0;
+      color[2] = 1.0;
+      break;
+    case 5:
+      color[0] = 1.0;
+      color[1] = 0.0;
+      color[2] = 1.0-t;
+      break;
+  }
+  if (display_mode == DISP_TRANSPARENT)
+    color[3] = 0.5;
+  else
+    color[3] = 1.0;
+  glColor3fv(color);
+  glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,color);
+}
+
+
+/* Draw a hyperturus projected into 3D. */
+static void hypertorus(double umin, double umax, double vmin, double vmax,
+                       int numu, int numv)
+{
+  static GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+  static GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+  static GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.5 };
+  static GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.5 };
+  float p[3], pu[3], pv[3], n[3], mat[4][4];
+  int i, j, k, l, m;
+  double u, v, ur, vr;
+  double cu, su, cv, sv;
+  double xx[4], xxu[4], xxv[4], x[4], xu[4], xv[4];
+  double r, s, t;
+
+  /* Compute the rotation that rotates the hypercube in 4D. */
+  for (i=0; i<4; i++)
+    for (j=0; j<4; j++)
+      mat[i][j] = (i==j);
+  rotatewx(mat,alpha);
+  rotatewy(mat,beta);
+  rotatewz(mat,delta);
+  rotatexy(mat,zeta);
+  rotatexz(mat,eta);
+  rotateyz(mat,theta);
+
+  if (colors != COLORS_COLORWHEEL)
+  {
+    glColor3fv(mat_diff_red);
+    if (display_mode == DISP_TRANSPARENT)
+    {
+      glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
+      glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
+    }
+    else
+    {
+      glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
+      glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
+    }
+  }
+
+  ur = umax-umin;
+  vr = vmax-vmin;
+  for (i=0; i<numu; i++)
+  {
+    if (appearance == APPEARANCE_BANDS && ((i & 3) >= 2))
+      continue;
+    if (display_mode == DISP_WIREFRAME)
+      glBegin(GL_QUAD_STRIP);
+    else
+      glBegin(GL_TRIANGLE_STRIP);
+    for (j=0; j<=numv; j++)
+    {
+      for (k=0; k<=1; k++)
+      {
+        l = (i+k);
+        m = j;
+        u = ur*l/numu+umin;
+        v = vr*m/numv+vmin;
+        color(u);
+        cu = cos(u);
+        su = sin(u);
+        cv = cos(v);
+        sv = sin(v);
+        xx[0] = cu;
+        xx[1] = su;
+        xx[2] = cv;
+        xx[3] = sv;
+        xxu[0] = -su;
+        xxu[1] = cu;
+        xxu[2] = 0.0;
+        xxu[3] = 0.0;
+        xxv[0] = 0.0;
+        xxv[1] = 0.0;
+        xxv[2] = -sv;
+        xxv[3] = cv;
+        for (l=0; l<4; l++)
+        {
+          r = 0.0;
+          s = 0.0;
+          t = 0.0;
+          for (m=0; m<4; m++)
+          {
+            r += mat[l][m]*xx[m];
+            s += mat[l][m]*xxu[m];
+            t += mat[l][m]*xxv[m];
+          }
+          x[l] = r;
+          xu[l] = s;
+          xv[l] = t;
+        }
+        if (projection_4d == DISP_4D_ORTHOGRAPHIC)
+        {
+          for (l=0; l<3; l++)
+          {
+            p[l] = (x[l]+offset4d[l])/1.5+offset3d[l];
+            pu[l] = xu[l];
+            pv[l] = xv[l];
+          }
+        }
+        else
+        {
+          s = x[3]+offset4d[3];
+          t = s*s;
+          for (l=0; l<3; l++)
+          {
+            r = x[l]+offset4d[l];
+            p[l] = r/s+offset3d[l];
+            pu[l] = (xu[l]*s-r*xu[3])/t;
+            pv[l] = (xv[l]*s-r*xv[3])/t;
+          }
+        }
+        n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+        n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+        n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+        t = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+        n[0] /= t;
+        n[1] /= t;
+        n[2] /= t;
+        glNormal3fv(n);
+        glVertex3fv(p);
+      }
+    }
+    glEnd();
+  }
+}
+
+
+static void init(ModeInfo *mi)
+{
+  static GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+  static GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+  static GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+  static GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+  static GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+
+  alpha = 0.0;
+  beta = 0.0;
+  delta = 0.0;
+  zeta = 0.0;
+  eta = 0.0;
+  theta = 0.0;
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  if (projection_3d == DISP_3D_PERSPECTIVE)
+    gluPerspective(60.0,1.0,0.1,100.0);
+  else
+    glOrtho(-1.0,1.0,-1.0,1.0,0.1,100.0);;
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+
+  if (display_mode == DISP_WIREFRAME)
+  {
+    glDisable(GL_DEPTH_TEST);
+    glShadeModel(GL_FLAT);
+    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+    glDisable(GL_LIGHTING);
+    glDisable(GL_LIGHT0);
+    glDisable(GL_BLEND);
+  }
+  else if (display_mode == DISP_SURFACE)
+  {
+    glEnable(GL_DEPTH_TEST);
+    glDepthFunc(GL_LESS);
+    glShadeModel(GL_SMOOTH);
+    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+    glEnable(GL_LIGHTING);
+    glEnable(GL_LIGHT0);
+    glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+    glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+    glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+    glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+    glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+    glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+    glDepthMask(GL_TRUE);
+    glDisable(GL_BLEND);
+  }
+  else if (display_mode == DISP_TRANSPARENT)
+  {
+    glDisable(GL_DEPTH_TEST);
+    glShadeModel(GL_SMOOTH);
+    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+    glEnable(GL_LIGHTING);
+    glEnable(GL_LIGHT0);
+    glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+    glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+    glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+    glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+    glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+    glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+    glDepthMask(GL_FALSE);
+    glEnable(GL_BLEND);
+    glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+  }
+  else
+  {
+    glDisable(GL_DEPTH_TEST);
+    glShadeModel(GL_FLAT);
+    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+    glDisable(GL_LIGHTING);
+    glDisable(GL_LIGHT0);
+    glDisable(GL_BLEND);
+  }
+}
+
+
+/* Redisplay the hypertorus. */
+static void display_hypertorus(void)
+{
+  alpha += speed_wx;
+  if (alpha >= 360.0)
+    alpha -= 360.0;
+  beta += speed_wy;
+  if (beta >= 360.0)
+    beta -= 360.0;
+  delta += speed_wz;
+  if (delta >= 360.0)
+    delta -= 360.0;
+  zeta += speed_xy;
+  if (zeta >= 360.0)
+    zeta -= 360.0;
+  eta += speed_xz;
+  if (eta >= 360.0)
+    eta -= 360.0;
+  theta += speed_yz;
+  if (theta >= 360.0)
+    theta -= 360.0;
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  if (projection_3d == DISP_3D_ORTHOGRAPHIC)
+  {
+    if (aspect >= 1.0)
+      glOrtho(-aspect,aspect,-1.0,1.0,0.1,100.0);
+    else
+      glOrtho(-1.0,1.0,-1.0/aspect,1.0/aspect,0.1,100.0);
+  }
+  else
+  {
+    gluPerspective(60.0,aspect,0.1,100.0);
+  }
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+
+  if (display_mode == DISP_WIREFRAME)
+    hypertorus(0.0,2.0*M_PI,0.0,2.0*M_PI,40,40);
+  else
+    hypertorus(0.0,2.0*M_PI,0.0,2.0*M_PI,60,60);
+}
+
+
+void reshape_hypertorus(ModeInfo * mi, int width, int height)
+{
+  hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+
+  hp->WindW = (GLint)width;
+  hp->WindH = (GLint)height;
+  glViewport(0,0,width,height);
+  aspect = (GLfloat)width/(GLfloat)height;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ *    Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ *-----------------------------------------------------------------------------
+ *    Initialize hypertorus.  Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+void init_hypertorus(ModeInfo * mi)
+{
+  hypertorusstruct *hp;
+
+  if (hyper == NULL)
+  {
+    hyper = (hypertorusstruct *)calloc(MI_NUM_SCREENS(mi),
+                                       sizeof(hypertorusstruct));
+    if (hyper == NULL)
+      return;
+  }
+  hp = &hyper[MI_SCREEN(mi)];
+
+  if ((hp->glx_context = init_GL(mi)) != NULL)
+  {
+    reshape_hypertorus(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
+    glDrawBuffer(GL_BACK);
+    init(mi);
+  }
+  else
+  {
+    MI_CLEARWINDOW(mi);
+  }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *    Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+void draw_hypertorus(ModeInfo * mi)
+{
+  Display          *display = MI_DISPLAY(mi);
+  Window           window = MI_WINDOW(mi);
+  hypertorusstruct *hp;
+
+  if (hyper == NULL)
+    return;
+  hp = &hyper[MI_SCREEN(mi)];
+
+  MI_IS_DRAWN(mi) = True;
+  if (!hp->glx_context)
+    return;
+
+  glXMakeCurrent(display,window,*(hp->glx_context));
+
+  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+  glLoadIdentity();
+
+  display_hypertorus();
+
+  if (MI_IS_FPS(mi))
+    do_fps (mi);
+
+  glFlush();
+
+  glXSwapBuffers(display,window);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *    The display is being taken away from us.  Free up malloc'ed 
+ *      memory and X resources that we've alloc'ed.  Only called
+ *      once, we must zap everything for every screen.
+ *-----------------------------------------------------------------------------
+ */
+
+void release_hypertorus(ModeInfo * mi)
+{
+  if (hyper != NULL)
+  {
+    int screen;
+
+    for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
+    {
+      hypertorusstruct *hp = &hyper[screen];
+
+      if (hp->glx_context)
+        hp->glx_context = (GLXContext *)NULL;
+    }
+    (void) free((void *)hyper);
+    hyper = (hypertorusstruct *)NULL;
+  }
+  FreeAllGL(mi);
+}
+
+void change_hypertorus(ModeInfo * mi)
+{
+  hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+
+  if (!hp->glx_context)
+    return;
+
+  glXMakeCurrent(MI_DISPLAY(mi),MI_WINDOW(mi),*(hp->glx_context));
+  init(mi);
+}
+
+#endif /* USE_GL */
diff --git a/hacks/glx/hypertorus.man b/hacks/glx/hypertorus.man
new file mode 100644 (file)
index 0000000..bad206e
--- /dev/null
@@ -0,0 +1,167 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+hypertorus - Draws a hypertorus that rotates in 4d
+.SH SYNOPSIS
+.B hypertorus
+[\-display \fIhost:display.screen\fP]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIusecs\fP]
+[\-fps]
+[\-mesh]
+[\-surface]
+[\-transparent]
+[\-solid]
+[\-bands]
+[\-twosided]
+[\-colorwheel]
+[\-perspective-3d]
+[\-orthographic-3d]
+[\-perspective-4d]
+[\-orthographic-4d]
+[\-speed-wx \fIfloat\fP]
+[\-speed-wy \fIfloat\fP]
+[\-speed-wz \fIfloat\fP]
+[\-speed-xy \fIfloat\fP]
+[\-speed-xz \fIfloat\fP]
+[\-speed-yz \fIfloat\fP]
+.SH DESCRIPTION
+The \fIhypertorus\fP program shows the Clifford torus as it rotates in
+4d.  The Clifford torus is a torus lies on the "surface" of the
+hypersphere in 4d.  The program projects the 4d torus to 3d using
+either a perspective or an orthographic projection.  Of the two
+alternatives, the perspective projection looks much more appealing.
+In orthographic projections the torus degenerates into a doubly
+covered cylinder for some angles.  The projected 3d torus can then be
+projected to the screen either perspectively or orthographically.
+There are three display modes for the torus: mesh (wireframe), solid,
+or transparent.  Furthermore, the appearance of the torus can be as a
+solid object or as a set of see-through bands.  Finally, the colors
+with with the torus is drawn can be set to either two-sided or to a
+color wheel.  In the first case, the torus is drawn with red on the
+outside and green on the inside.  This mode enables you to see that
+the torus turns inside-out as it rotates in 4d.  The second mode draws
+the torus with a fully saturated color wheel.  This gives a very nice
+effect when combined with the see-through bands mode.  The rotation
+speed for each of the six planes around which the torus rotates can be
+chosen.  This program is very much inspired by Thomas Banchoff's book
+"Beyond the Third Dimension: Geometry, Computer Graphics, and Higher
+Dimensions", Scientific American Library, 1990.
+.SH OPTIONS
+.I hypertorus
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the
+animation.  Default 25000, or 1/40th second.
+.PP
+The following three options are mutually exclusive.  They determine
+how the torus is displayed.
+.TP 8
+.B \-mesh
+Display the torus as a wireframe mesh.
+.TP 8
+.B \-surface
+Display the torus as a solid surface (default).
+.TP 8
+.B \-transparent
+Display the torus as a transparent surface.
+.PP
+The following two options are mutually exclusive.  They determine the
+appearance of the torus.
+.TP 8
+.B \-solid
+Display the torus as a solid object.
+.TP 8
+.B \-bands
+Display the torus as see-through bands (default).
+.PP
+The following two options are mutually exclusive.  They determine how
+to color the torus.
+.TP 8
+.B \-twosided
+Display the torus with two colors: red on the outside and green on
+the inside.
+.TP 8
+.B \-colorwheel
+Display the torus with a fully saturated color wheel (default).
+.PP
+The following two options are mutually exclusive.  They determine how
+the torus is projected from 3d to 2d (i.e., to the screen).
+.TP 8
+.B \-perspective-3d
+Project the torus from 3d to 2d using a perspective projection
+(default).
+.TP 8
+.B \-orthographic-3d
+Project the torus from 3d to 2d using an orthographic projection.
+.PP
+The following two options are mutually exclusive.  They determine how
+the torus is projected from 4d to 3d.
+.TP 8
+.B \-perspective-4d
+Project the torus from 4d to 3d using a perspective projection
+(default).
+.TP 8
+.B \-orthographic-4d
+Project the torus from 4d to 3d using an orthographic projection.
+.PP
+The following six options determine the rotation speed of the torus
+around the six possible hyperplanes.  The rotation speed is measured
+in degrees per frame.  The speeds should be set to relatively small
+values, e.g., less than 4 in magnitude.
+.TP 8
+.B \-speed-xw \fIfloat\fP
+Rotation speed around the wx plane (default: 1.1).
+.TP 8
+.B \-speed-xy \fIfloat\fP
+Rotation speed around the wy plane (default: 1.3).
+.TP 8
+.B \-speed-wz \fIfloat\fP
+Rotation speed around the wz plane (default: 1.5).
+.TP 8
+.B \-speed-xy \fIfloat\fP
+Rotation speed around the xy plane (default: 1.7).
+.TP 8
+.B \-speed-xz \fIfloat\fP
+Rotation speed around the xz plane (default: 1.9).
+.TP 8
+.B \-speed-yz \fIfloat\fP
+Rotation speed around the yz plane (default: 2.1).
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Carsten Steger.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Carsten Steger <carsten@mirsanmir.org>, 27-may-2003.
index bc20c44279c57bca3af7e2bdb2d6a25dc3507f12..e5351886f017efd61d2c642506e75bf4d6868dc5 100644 (file)
@@ -196,11 +196,21 @@ static GLfloat flowerbox_colors[4][4] = {
 };
 
 #ifdef DEBUG
+# ifdef __GNUC__ /* GCC style */
 #define _DEBUG(msg, args...) do { \
     fprintf(stderr, "%s : %d : " msg ,__FILE__,__LINE__ ,##args); \
 } while(0)
+# else /* C99 standard style */
+#define _DEBUG(msg, ...) do { \
+    fprintf(stderr, "%s : %d : " msg ,__FILE__,__LINE__,__VA_ARGS__); \
+} while(0)
+# endif
 #else
+# ifdef __GNUC__ /* GCC style */
 #define _DEBUG(msg, args...)
+# else /* C99 standard style */
+#define _DEBUG(msg, ...)
+# endif
 #endif
 
 /* This is all the half-edge b-rep code (as well as basic geometry) */
@@ -346,7 +356,7 @@ static inline hedge *partner(hedge *h) {
        return h->e->left;
     }
     else {
-       _DEBUG("Inconsistent edge detected. Presumably, this is a bug. Exiting.\n");
+       _DEBUG("Inconsistent edge detected. Presumably, this is a bug. Exiting.\n", NULL);
        exit(-1);
     }
 }
@@ -375,7 +385,7 @@ hedge *hedge_new(hedge *hafter, vertex *vtx)
     hedge *h = (hedge*)malloc(sizeof(hedge));
     
     if(!h) {
-       _DEBUG("Out of memory in hedge_new()\n");
+       _DEBUG("Out of memory in hedge_new()\n",NULL);
        return NULL;
     }
     h->f = hafter->f;
@@ -392,7 +402,7 @@ edge *edge_new(solid *s)
 {
     edge *e = (edge*)malloc(sizeof(edge));
     if(!e) {
-       _DEBUG("Out of memory in edge_new()\n");
+       _DEBUG("Out of memory in edge_new()\n",NULL);
        exit(-1);
     }
     e->next = s->edges;
@@ -406,7 +416,7 @@ face *face_new(solid *s, hedge *h)
 {
     face *f = (face*)malloc(sizeof(face));
     if(!f) {
-       _DEBUG("Out of memory in face_new()");
+       _DEBUG("Out of memory in face_new()",NULL);
        exit(-1);
     }
     f->s = s;
@@ -467,11 +477,11 @@ face *face_split(face *f, hedge *h1, hedge *h2)
     face *fn;
 
     if(h1->f != f || h2->f != f) {
-       _DEBUG("Whoah, cap'n, yer usin' a bad halfedge!\n");
+       _DEBUG("Whoah, cap'n, yer usin' a bad halfedge!\n",NULL);
        exit(-1);
     }
     if(h1 == h2) {
-       _DEBUG("Trying to split a face at a single vertex\n");
+       _DEBUG("Trying to split a face at a single vertex\n",NULL);
        exit(-1);
     }
     /* close the loops */
@@ -776,9 +786,9 @@ void setup_opengl(ModeInfo *mi, jigglystruct *js)
 {
     const GLfloat lpos0[4] = {-12, 8, 12, 0};
     const GLfloat lpos1[4] = {7, -5, 0, 0};
-    const GLfloat lcol0[4] = {0.7, 0.7, 0.65, 1};
-    const GLfloat lcol1[4] = {0.3, 0.2, 0.1, 1};
-    const GLfloat scolor[4]= {0.9, 0.9, 0.9, 0.5};
+    const GLfloat lcol0[4] = {0.7f, 0.7f, 0.65f, 1};
+    const GLfloat lcol1[4] = {0.3f, 0.2f, 0.1f, 1};
+    const GLfloat scolor[4]= {0.9f, 0.9f, 0.9f, 0.5f};
 
     glDrawBuffer(GL_BACK);
     glClearColor(0, 0, 0, 0);
index afe9f221ac27400602814780cacf6709be25a83d..b068e3f4e7ff8259be004e41437ea1b78e9d9730 100644 (file)
-/* -*- Mode: C; tab-width: 4 -*- */\r
-/* Klein --- Klein Bottle, Moebius and other parametric surfaces\r
- * visualization */\r
-\r
-/*\r
- * Revision History:\r
- * 2000: written by Andrey Mirtchovski <mirtchov@cpsc.ucalgary.ca\r
- *       \r
- * 01-Mar-2003  mirtchov    modified as a xscreensaver hack\r
- *\r
- */\r
-\r
-/*-\r
- * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock.\r
- * otherwise caddr_t is not defined correctly\r
- */\r
-\r
-#include <X11/Intrinsic.h>\r
-\r
-#ifdef STANDALONE\r
-# define PROGCLASS                                     "Klein"\r
-# define HACK_INIT                                     init_klein\r
-# define HACK_DRAW                                     draw_klein\r
-# define HACK_RESHAPE                          reshape_klein\r
-# define HACK_HANDLE_EVENT                     klein_handle_event\r
-# define EVENT_MASK                                    PointerMotionMask\r
-# define klein_opts                                    xlockmore_opts\r
-\r
-\r
-#define DEF_SPIN                               "True"\r
-#define DEF_WANDER                             "False"\r
-#define DEF_RANDOM                             "False"\r
-#define DEF_SPEED                              "150"\r
-\r
-# define DEFAULTS                                      "*delay:                20000   \n"                     \\r
-                                                                       "*showFPS:      False   \n"                     \\r
-                                                                       "*wireframe:    False   \n"                     \\r
-                                                                       "*random:          " DEF_RANDOM     "\n"        \\r
-                                                                       "*speed:           " DEF_SPEED     "\n" \\r
-                                                                       "*spin:        " DEF_SPIN      "\n" \\r
-                                                                       "*wander:      " DEF_WANDER    "\n" \\r
-\r
-# include "xlockmore.h"                /* from the xscreensaver distribution */\r
-#else  /* !STANDALONE */\r
-# include "xlock.h"                    /* from the xlockmore distribution */\r
-#endif /* !STANDALONE */\r
-\r
-#ifdef USE_GL\r
-\r
-#include <GL/glu.h>\r
-#include "rotator.h"\r
-#include "gltrackball.h"\r
-\r
-#undef countof\r
-#define countof(x) (sizeof((x))/sizeof((*x)))\r
-\r
-/* surfaces being drawn */\r
-enum { \r
-       KLEIN = 0,\r
-       DINI,\r
-       ENNEPER,\r
-       KUEN,\r
-       MOEBIUS,\r
-       SEASHELL,\r
-       SWALLOWTAIL,\r
-       BOHEM,\r
-    SURFACE_LAST,\r
-};\r
-\r
-/* primitives to draw with \r
- * note that we skip the polygons and\r
- * triangle fans -- too slow\r
- *\r
- * also removed triangle_strip and quads -- \r
- * just doesn't look good enough\r
- */\r
-enum {\r
-       MY_POINTS = 0,\r
-       MY_LINES,\r
-       MY_LINE_LOOP,\r
-       MY_PRIM_LAST,\r
-};\r
-\r
-\r
-static Bool rand;\r
-static int render;\r
-static int speed;\r
-static Bool do_spin;\r
-static Bool do_wander;\r
-\r
-static XrmOptionDescRec opts[] = {\r
-  {"-speed",   ".speed",    XrmoptionSepArg, (caddr_t) 0 },\r
-  { "-spin",   ".spin",   XrmoptionNoArg, "True" },\r
-  { "+spin",   ".spin",   XrmoptionNoArg, "False" },\r
-  { "-wander", ".wander", XrmoptionNoArg, "True" },\r
-  { "+wander", ".wander", XrmoptionNoArg, "False" },\r
-  { "-random", ".rand", XrmoptionNoArg, "True" },\r
-  { "+random", ".rand", XrmoptionNoArg, "False" },\r
-};\r
-\r
-static argtype vars[] = {\r
-  {(caddr_t *) &rand,   "rand",   "Random",   DEF_RANDOM,   t_Bool},\r
-  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_Bool},\r
-  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},\r
-  {(caddr_t *) &speed,     "speed",  "Speed",  DEF_SPEED,  t_Int},\r
-};\r
-\r
-\r
-ModeSpecOpt klein_opts = {countof(opts), opts, countof(vars), vars, NULL};\r
-\r
-\r
-\r
-typedef struct{\r
-  GLfloat x;\r
-  GLfloat y;\r
-  GLfloat z;\r
-} GL_VECTOR;\r
-\r
-typedef struct {\r
-       GLXContext *glx_context;\r
-       Window      window;\r
-       rotator    *rot;\r
-       trackball_state *trackball;\r
-       Bool              button_down_p;\r
-\r
-       int render;\r
-       int surface;\r
-\r
-       float du, dv;\r
-       float a, b, c;\r
-\r
-} kleinstruct;\r
-\r
-static kleinstruct *klein = NULL;\r
-\r
-\r
-static void\r
-draw(ModeInfo *mi)\r
-{\r
-       kleinstruct *kp = &klein[MI_SCREEN(mi)];\r
-       static float step = 0.0;\r
-       double u, v;\r
-       float coord[3];\r
-       \r
-       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\r
-\r
-       glEnable(GL_DEPTH_TEST);\r
-       glEnable(GL_NORMALIZE);\r
-       glEnable(GL_CULL_FACE);\r
-\r
-       glPushMatrix();\r
-\r
-       {\r
-               double x, y, z;\r
-               get_position (kp->rot, &x, &y, &z, !kp->button_down_p);\r
-               glTranslatef((x - 0.5) * 10,\r
-                                                                (y - 0.5) * 10,\r
-                                                                (z - 0.5) * 20);\r
-\r
-               gltrackball_rotate (kp->trackball);\r
-\r
-               get_rotation (kp->rot, &x, &y, &z, !kp->button_down_p);\r
-               glRotatef (x * 360, 1.0, 0.0, 0.0);\r
-               glRotatef (y * 360, 0.0, 1.0, 0.0);\r
-               glRotatef (z * 360, 0.0, 0.0, 1.0);\r
-       }\r
-\r
-       glScalef( 4.0, 4.0, 4.0 );\r
-\r
-       glBegin(kp->render);\r
-       switch(kp->surface) {\r
-       case KLEIN:\r
-               for(u = -M_PI; u < M_PI; u+=kp->du){\r
-                       for(v = -M_PI; v < M_PI; v+=kp->dv){\r
-                               coord[0] = cos(u)*(kp->a + sin(v)*cos(u/2) -\r
-                                                       sin(2*v)*sin(u/2)/2);\r
-                               coord[1] = sin(u)*(kp->a + sin(v)*cos(u/2) -\r
-                                                       sin(2*v)*sin(u/2)/2);\r
-                               coord[2] = sin(u/2)*sin(v) + cos(u/2)*sin(2*v)/2;\r
-                               glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);\r
-                               glVertex3fv(coord);\r
-                       }\r
-               }\r
-               break;\r
-               case DINI:\r
-                       for(u = -M_PI; u < M_PI; u+=kp->du){\r
-                               for(v = -M_PI; v < M_PI; v+=kp->dv){\r
-                                       coord[0] = kp->a*cos(u)*sin(v);\r
-                                       coord[1] = kp->a*sin(u)*sin(v);\r
-                                       coord[2] = kp->a*(cos(v) + sin(tan((v/2))))+0.2*u;\r
-                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);\r
-                                       glVertex3fv(coord);\r
-                               }\r
-                       }\r
-                       break;\r
-               case ENNEPER:\r
-                       for(u = -M_PI; u < M_PI; u+=kp->du){\r
-                               for(v = -M_PI; v < M_PI; v+=kp->dv){\r
-                                       coord[0] = kp->a*(u-(u*u*u/3)+u*v*v);\r
-                                       coord[1] = kp->b*(v-(v*v*v/3)+u*u*v);\r
-                                       coord[2] = u*u-v*v;\r
-                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);\r
-                                       glVertex3fv(coord);\r
-                               }\r
-                       }\r
-                       break;\r
-               case KUEN:\r
-                       for(u = -M_PI; u < M_PI; u+=kp->du){\r
-                               for(v = -M_PI; v < M_PI; v+=kp->dv){\r
-                                       coord[0] = 2*(cos(u)+u*sin(u))*sin(v)/(1+u*u*sin(v)*sin(v));\r
-                                       coord[1] = 2*(sin(u)-u*cos(u))*sin(v)/(1+u*u*sin(v)*sin(v));\r
-                                       coord[2] = sin(tan(v/2))+2*cos(v)/(1+u*u*sin(v)*sin(v));\r
-\r
-                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);\r
-                                       glVertex3fv(coord);\r
-                               }\r
-                       }\r
-                       break;\r
-               case MOEBIUS:\r
-                       for(u = -M_PI; u < M_PI; u+=kp->du){\r
-                               for(v = -M_PI; v < M_PI; v+=kp->dv){\r
-                                       coord[0] = cos(u)+v*cos(u/2)*cos(u);\r
-                                       coord[1] = sin(u)+v*cos(u/2)*sin(u);\r
-                                       coord[2] = v*sin(u/2);\r
-                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);\r
-                                       glVertex3fv(coord);\r
-                               }\r
-                       }\r
-                       break;\r
-               case SEASHELL:\r
-                       for(u = 0; u < 2*M_PI; u+=kp->du){\r
-                               for(v = 0; v < 2*M_PI; v+=kp->dv){\r
-                                       coord[0] = kp->a*(1-v/(2*M_PI))*cos(2*v)*(1+cos(u))+sin(kp->c+=0.00001)*cos(2*v);\r
-                                       coord[1] = kp->a*(1-v/(2*M_PI))*sin(2*v)*(1+cos(u))+cos(kp->c+=0.00001)*sin(2*v);\r
-                                       coord[2] = sin(kp->b+=0.00001)*v/(2*M_PI)+kp->a*(1-v/(2*M_PI))*sin(u);\r
-                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);\r
-                                       glVertex3fv(coord);\r
-                               }\r
-                       }\r
-                       break;\r
-               case SWALLOWTAIL:\r
-                       for(u = -M_PI; u < M_PI; u+=kp->du){\r
-                               for(v = -M_PI; v < M_PI; v+=kp->dv){\r
-                                       coord[0] = u*pow(v,2) + 3*pow(v,4);\r
-                                       coord[1] = -2*u*v - 4*pow(v,3);\r
-                                       coord[2] = u;\r
-                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);\r
-                                       glVertex3fv(coord);\r
-                               }\r
-                       }\r
-                       break;\r
-               case BOHEM:\r
-                       for(u = -M_PI; u < M_PI; u+=kp->du){\r
-                               for(v = -M_PI; v < M_PI; v+=kp->dv){\r
-                                       coord[0] = kp->a*cos(u);\r
-                                       coord[1] = 1.5*cos(v) + kp->a*sin(u);\r
-                                       coord[2] = sin(v);\r
-                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);\r
-                                       glVertex3fv(coord);\r
-                               }\r
-                       }\r
-                       break;\r
-               default:\r
-                       for(u = -M_PI; u < M_PI; u+=kp->du){\r
-                               for(v = -M_PI; v < M_PI; v+=kp->dv){\r
-                                       coord[0] = sin(u)*kp->a;        \r
-                                       coord[1] = cos(u)*kp->a;\r
-                                       coord[2] = sin(u/2)*cos(v) + cos(u/2)*sin(v);\r
-                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);\r
-                                       glVertex3fv(coord);\r
-                               }\r
-                       }\r
-                       break;\r
-       }\r
-       glEnd();\r
-       glPopMatrix();\r
-\r
-\r
-       kp->a = sin(step+=0.01);\r
-       kp->b = cos(step+=0.01);\r
-}\r
-\r
-\r
-/* new window size or exposure */\r
-void\r
-reshape_klein(ModeInfo *mi, int width, int height)\r
-{\r
-       GLfloat h = (GLfloat) height / (GLfloat) width;\r
-\r
-       glViewport(0, 0, (GLint) width, (GLint) height);\r
-       glMatrixMode(GL_PROJECTION);\r
-       glLoadIdentity();\r
-       gluPerspective (30.0, 1/h, 1.0, 100.0);\r
-\r
-       glMatrixMode(GL_MODELVIEW);\r
-       glLoadIdentity();\r
-       gluLookAt( 0.0, 0.0, 30.0,\r
-                        0.0, 0.0, 0.0,\r
-                        0.0, 1.0, 0.0);\r
-       \r
-       glClear(GL_COLOR_BUFFER_BIT);\r
-}\r
-\r
-\r
-Bool\r
-klein_handle_event (ModeInfo *mi, XEvent *event)\r
-{\r
-       kleinstruct *kp = &klein[MI_SCREEN(mi)];\r
-\r
-       if (event->xany.type == ButtonPress && event->xbutton.button & Button1) {\r
-                       kp->button_down_p = True;\r
-                       gltrackball_start (kp->trackball, event->xbutton.x, event->xbutton.y, MI_WIDTH (mi), MI_HEIGHT (mi));\r
-                       return True;\r
-       } else if (event->xany.type == ButtonRelease && event->xbutton.button & Button1) {\r
-                       kp->button_down_p = False;\r
-                       return True;\r
-       } else if (event->xany.type == MotionNotify && kp->button_down_p) {\r
-                       gltrackball_track (kp->trackball, event->xmotion.x, event->xmotion.y, MI_WIDTH (mi), MI_HEIGHT (mi));\r
-                       return True;\r
-       }\r
-\r
-       return False;\r
-}\r
-\r
-\r
-void\r
-init_klein(ModeInfo *mi)\r
-{\r
-       int      screen = MI_SCREEN(mi);\r
-       kleinstruct *kp;\r
-\r
-       if (klein == NULL) {\r
-               if ((klein = (kleinstruct *) calloc(MI_NUM_SCREENS(mi), sizeof (kleinstruct))) == NULL)\r
-                       return;\r
-       }\r
-       kp = &klein[screen];\r
-\r
-       kp->window = MI_WINDOW(mi);\r
-\r
-       {\r
-               double spin_speed        = 1.0;\r
-               double wander_speed = 0.03;\r
-               kp->rot = make_rotator (do_spin ? spin_speed : 0,\r
-                                               do_spin ? spin_speed : 0,\r
-                                               do_spin ? spin_speed : 0,\r
-                                               1.0,\r
-                                               do_wander ? wander_speed : 0,\r
-                                               True);\r
-               kp->trackball = gltrackball_init ();\r
-       }\r
-\r
-       if(rand) {\r
-               render = random() % MY_PRIM_LAST;\r
-               kp->surface = random() % SURFACE_LAST;\r
-       } else {\r
-               render = MY_LINE_LOOP;\r
-               kp->surface = KLEIN;\r
-       }\r
-\r
-       switch (render) {\r
-       case MY_POINTS: kp->render = GL_POINTS; break;\r
-       case MY_LINES: kp->render = GL_LINES; break;\r
-       case MY_LINE_LOOP: kp->render = GL_LINE_LOOP; break;\r
-       default:\r
-                       kp->render = GL_LINE_LOOP;\r
-       }\r
-/*kp->render=GL_TRIANGLE_FAN;*/\r
-/*kp->render=GL_POLYGON;*/\r
-\r
-       kp->du = 0.07;\r
-       kp->dv = 0.07;\r
-       kp->a = kp->b = 1;\r
-       kp->c = 0.1;\r
-\r
-\r
-       if ((kp->glx_context = init_GL(mi)) != NULL) {\r
-               reshape_klein(mi, MI_WIDTH(mi), MI_HEIGHT(mi));\r
-       } else {\r
-               MI_CLEARWINDOW(mi);\r
-       }\r
-}\r
-\r
-void\r
-draw_klein(ModeInfo * mi)\r
-{\r
-       kleinstruct *kp = &klein[MI_SCREEN(mi)];\r
-       Display *display = MI_DISPLAY(mi);\r
-       Window  window = MI_WINDOW(mi);\r
-\r
-       if (!kp->glx_context) return;\r
-\r
-       glDrawBuffer(GL_BACK);\r
-\r
-       glXMakeCurrent(display, window, *(kp->glx_context));\r
-       draw(mi);\r
-       if (mi->fps_p) do_fps (mi);\r
-       glFinish();\r
-       glXSwapBuffers(display, window);\r
-}\r
-\r
-void\r
-release_klein(ModeInfo * mi)\r
-{\r
-       if (klein != NULL) {\r
-               int      screen;\r
-\r
-               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {\r
-                       kleinstruct *kp = &klein[screen];\r
-\r
-                       if (kp->glx_context) {\r
-                               /* Display lists MUST be freed while their glXContext is current. */\r
-                               glXMakeCurrent(MI_DISPLAY(mi), kp->window, *(kp->glx_context));\r
-                       }\r
-               }\r
-               (void) free((void *) klein);\r
-               klein = NULL;\r
-       }\r
-       FreeAllGL(mi);\r
-}\r
-\r
-\r
-/*********************************************************/\r
-\r
-#endif\r
+/* -*- Mode: C; tab-width: 4 -*- */
+/* Klein --- Klein Bottle, Moebius and other parametric surfaces
+ * visualization */
+
+/*
+ * Revision History:
+ * 2000: written by Andrey Mirtchovski <mirtchov@cpsc.ucalgary.ca
+ *       
+ * 01-Mar-2003  mirtchov    modified as a xscreensaver hack
+ *
+ */
+
+/*-
+ * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock.
+ * otherwise caddr_t is not defined correctly
+ */
+
+#include <X11/Intrinsic.h>
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Klein"
+# define HACK_INIT                                     init_klein
+# define HACK_DRAW                                     draw_klein
+# define HACK_RESHAPE                          reshape_klein
+# define HACK_HANDLE_EVENT                     klein_handle_event
+# define EVENT_MASK                                    PointerMotionMask
+# define klein_opts                                    xlockmore_opts
+
+
+#define DEF_SPIN                               "True"
+#define DEF_WANDER                             "False"
+#define DEF_RANDOM                             "False"
+#define DEF_SPEED                              "150"
+
+# define DEFAULTS                                      "*delay:                20000   \n"                     \
+                                                                       "*showFPS:      False   \n"                     \
+                                                                       "*wireframe:    False   \n"                     \
+                                                                       "*random:          " DEF_RANDOM     "\n"        \
+                                                                       "*speed:           " DEF_SPEED     "\n" \
+                                                                       "*spin:        " DEF_SPIN      "\n" \
+                                                                       "*wander:      " DEF_WANDER    "\n" \
+
+# include "xlockmore.h"                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include <GL/glu.h>
+#include "rotator.h"
+#include "gltrackball.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+/* surfaces being drawn */
+enum { 
+       KLEIN = 0,
+       DINI,
+       ENNEPER,
+       KUEN,
+       MOEBIUS,
+       SEASHELL,
+       SWALLOWTAIL,
+       BOHEM,
+    SURFACE_LAST,
+};
+
+/* primitives to draw with 
+ * note that we skip the polygons and
+ * triangle fans -- too slow
+ *
+ * also removed triangle_strip and quads -- 
+ * just doesn't look good enough
+ */
+enum {
+       MY_POINTS = 0,
+       MY_LINES,
+       MY_LINE_LOOP,
+       MY_PRIM_LAST,
+};
+
+
+static Bool rand;
+static int render;
+static int speed;
+static Bool do_spin;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+  {"-speed",   ".speed",    XrmoptionSepArg, (caddr_t) 0 },
+  { "-spin",   ".spin",   XrmoptionNoArg, "True" },
+  { "+spin",   ".spin",   XrmoptionNoArg, "False" },
+  { "-wander", ".wander", XrmoptionNoArg, "True" },
+  { "+wander", ".wander", XrmoptionNoArg, "False" },
+  { "-random", ".rand", XrmoptionNoArg, "True" },
+  { "+random", ".rand", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+  {(caddr_t *) &rand,   "rand",   "Random",   DEF_RANDOM,   t_Bool},
+  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_Bool},
+  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {(caddr_t *) &speed,     "speed",  "Speed",  DEF_SPEED,  t_Int},
+};
+
+
+ModeSpecOpt klein_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+typedef struct{
+  GLfloat x;
+  GLfloat y;
+  GLfloat z;
+} GL_VECTOR;
+
+typedef struct {
+       GLXContext *glx_context;
+       Window      window;
+       rotator    *rot;
+       trackball_state *trackball;
+       Bool              button_down_p;
+
+       int render;
+       int surface;
+
+       float du, dv;
+       float a, b, c;
+
+} kleinstruct;
+
+static kleinstruct *klein = NULL;
+
+
+static void
+draw(ModeInfo *mi)
+{
+       kleinstruct *kp = &klein[MI_SCREEN(mi)];
+       static float step = 0.0;
+       double u, v;
+       float coord[3];
+       
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       glEnable(GL_DEPTH_TEST);
+       glEnable(GL_NORMALIZE);
+       glEnable(GL_CULL_FACE);
+
+       glPushMatrix();
+
+       {
+               double x, y, z;
+               get_position (kp->rot, &x, &y, &z, !kp->button_down_p);
+               glTranslatef((x - 0.5) * 10,
+                                                                (y - 0.5) * 10,
+                                                                (z - 0.5) * 20);
+
+               gltrackball_rotate (kp->trackball);
+
+               get_rotation (kp->rot, &x, &y, &z, !kp->button_down_p);
+               glRotatef (x * 360, 1.0, 0.0, 0.0);
+               glRotatef (y * 360, 0.0, 1.0, 0.0);
+               glRotatef (z * 360, 0.0, 0.0, 1.0);
+       }
+
+       glScalef( 4.0, 4.0, 4.0 );
+
+       glBegin(kp->render);
+       switch(kp->surface) {
+       case KLEIN:
+               for(u = -M_PI; u < M_PI; u+=kp->du){
+                       for(v = -M_PI; v < M_PI; v+=kp->dv){
+                               coord[0] = cos(u)*(kp->a + sin(v)*cos(u/2) -
+                                                       sin(2*v)*sin(u/2)/2);
+                               coord[1] = sin(u)*(kp->a + sin(v)*cos(u/2) -
+                                                       sin(2*v)*sin(u/2)/2);
+                               coord[2] = sin(u/2)*sin(v) + cos(u/2)*sin(2*v)/2;
+                               glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+                               glVertex3fv(coord);
+                       }
+               }
+               break;
+               case DINI:
+                       for(u = -M_PI; u < M_PI; u+=kp->du){
+                               for(v = -M_PI; v < M_PI; v+=kp->dv){
+                                       coord[0] = kp->a*cos(u)*sin(v);
+                                       coord[1] = kp->a*sin(u)*sin(v);
+                                       coord[2] = kp->a*(cos(v) + sin(tan((v/2))))+0.2*u;
+                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+                                       glVertex3fv(coord);
+                               }
+                       }
+                       break;
+               case ENNEPER:
+                       for(u = -M_PI; u < M_PI; u+=kp->du){
+                               for(v = -M_PI; v < M_PI; v+=kp->dv){
+                                       coord[0] = kp->a*(u-(u*u*u/3)+u*v*v);
+                                       coord[1] = kp->b*(v-(v*v*v/3)+u*u*v);
+                                       coord[2] = u*u-v*v;
+                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+                                       glVertex3fv(coord);
+                               }
+                       }
+                       break;
+               case KUEN:
+                       for(u = -M_PI; u < M_PI; u+=kp->du){
+                               for(v = -M_PI; v < M_PI; v+=kp->dv){
+                                       coord[0] = 2*(cos(u)+u*sin(u))*sin(v)/(1+u*u*sin(v)*sin(v));
+                                       coord[1] = 2*(sin(u)-u*cos(u))*sin(v)/(1+u*u*sin(v)*sin(v));
+                                       coord[2] = sin(tan(v/2))+2*cos(v)/(1+u*u*sin(v)*sin(v));
+
+                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+                                       glVertex3fv(coord);
+                               }
+                       }
+                       break;
+               case MOEBIUS:
+                       for(u = -M_PI; u < M_PI; u+=kp->du){
+                               for(v = -M_PI; v < M_PI; v+=kp->dv){
+                                       coord[0] = cos(u)+v*cos(u/2)*cos(u);
+                                       coord[1] = sin(u)+v*cos(u/2)*sin(u);
+                                       coord[2] = v*sin(u/2);
+                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+                                       glVertex3fv(coord);
+                               }
+                       }
+                       break;
+               case SEASHELL:
+                       for(u = 0; u < 2*M_PI; u+=kp->du){
+                               for(v = 0; v < 2*M_PI; v+=kp->dv){
+                                       coord[0] = kp->a*(1-v/(2*M_PI))*cos(2*v)*(1+cos(u))+sin(kp->c+=0.00001)*cos(2*v);
+                                       coord[1] = kp->a*(1-v/(2*M_PI))*sin(2*v)*(1+cos(u))+cos(kp->c+=0.00001)*sin(2*v);
+                                       coord[2] = sin(kp->b+=0.00001)*v/(2*M_PI)+kp->a*(1-v/(2*M_PI))*sin(u);
+                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+                                       glVertex3fv(coord);
+                               }
+                       }
+                       break;
+               case SWALLOWTAIL:
+                       for(u = -M_PI; u < M_PI; u+=kp->du){
+                               for(v = -M_PI; v < M_PI; v+=kp->dv){
+                                       coord[0] = u*pow(v,2) + 3*pow(v,4);
+                                       coord[1] = -2*u*v - 4*pow(v,3);
+                                       coord[2] = u;
+                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+                                       glVertex3fv(coord);
+                               }
+                       }
+                       break;
+               case BOHEM:
+                       for(u = -M_PI; u < M_PI; u+=kp->du){
+                               for(v = -M_PI; v < M_PI; v+=kp->dv){
+                                       coord[0] = kp->a*cos(u);
+                                       coord[1] = 1.5*cos(v) + kp->a*sin(u);
+                                       coord[2] = sin(v);
+                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+                                       glVertex3fv(coord);
+                               }
+                       }
+                       break;
+               default:
+                       for(u = -M_PI; u < M_PI; u+=kp->du){
+                               for(v = -M_PI; v < M_PI; v+=kp->dv){
+                                       coord[0] = sin(u)*kp->a;        
+                                       coord[1] = cos(u)*kp->a;
+                                       coord[2] = sin(u/2)*cos(v) + cos(u/2)*sin(v);
+                                       glColor3f(coord[0]+0.7, coord[1]+0.7, coord[2]+0.7);
+                                       glVertex3fv(coord);
+                               }
+                       }
+                       break;
+       }
+       glEnd();
+       glPopMatrix();
+
+
+       kp->a = sin(step+=0.01);
+       kp->b = cos(step+=0.01);
+}
+
+
+/* new window size or exposure */
+void
+reshape_klein(ModeInfo *mi, int width, int height)
+{
+       GLfloat h = (GLfloat) height / (GLfloat) width;
+
+       glViewport(0, 0, (GLint) width, (GLint) height);
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+       glMatrixMode(GL_MODELVIEW);
+       glLoadIdentity();
+       gluLookAt( 0.0, 0.0, 30.0,
+                        0.0, 0.0, 0.0,
+                        0.0, 1.0, 0.0);
+       
+       glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+Bool
+klein_handle_event (ModeInfo *mi, XEvent *event)
+{
+       kleinstruct *kp = &klein[MI_SCREEN(mi)];
+
+       if (event->xany.type == ButtonPress && event->xbutton.button & Button1) {
+                       kp->button_down_p = True;
+                       gltrackball_start (kp->trackball, event->xbutton.x, event->xbutton.y, MI_WIDTH (mi), MI_HEIGHT (mi));
+                       return True;
+       } else if (event->xany.type == ButtonRelease && event->xbutton.button & Button1) {
+                       kp->button_down_p = False;
+                       return True;
+       } else if (event->xany.type == MotionNotify && kp->button_down_p) {
+                       gltrackball_track (kp->trackball, event->xmotion.x, event->xmotion.y, MI_WIDTH (mi), MI_HEIGHT (mi));
+                       return True;
+       }
+
+       return False;
+}
+
+
+void
+init_klein(ModeInfo *mi)
+{
+       int      screen = MI_SCREEN(mi);
+       kleinstruct *kp;
+
+       if (klein == NULL) {
+               if ((klein = (kleinstruct *) calloc(MI_NUM_SCREENS(mi), sizeof (kleinstruct))) == NULL)
+                       return;
+       }
+       kp = &klein[screen];
+
+       kp->window = MI_WINDOW(mi);
+
+       {
+               double spin_speed        = 1.0;
+               double wander_speed = 0.03;
+               kp->rot = make_rotator (do_spin ? spin_speed : 0,
+                                               do_spin ? spin_speed : 0,
+                                               do_spin ? spin_speed : 0,
+                                               1.0,
+                                               do_wander ? wander_speed : 0,
+                                               True);
+               kp->trackball = gltrackball_init ();
+       }
+
+       if(rand) {
+               render = random() % MY_PRIM_LAST;
+               kp->surface = random() % SURFACE_LAST;
+       } else {
+               render = MY_LINE_LOOP;
+               kp->surface = KLEIN;
+       }
+
+       switch (render) {
+       case MY_POINTS: kp->render = GL_POINTS; break;
+       case MY_LINES: kp->render = GL_LINES; break;
+       case MY_LINE_LOOP: kp->render = GL_LINE_LOOP; break;
+       default:
+                       kp->render = GL_LINE_LOOP;
+       }
+/*kp->render=GL_TRIANGLE_FAN;*/
+/*kp->render=GL_POLYGON;*/
+
+       kp->du = 0.07;
+       kp->dv = 0.07;
+       kp->a = kp->b = 1;
+       kp->c = 0.1;
+
+
+       if ((kp->glx_context = init_GL(mi)) != NULL) {
+               reshape_klein(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+       } else {
+               MI_CLEARWINDOW(mi);
+       }
+}
+
+void
+draw_klein(ModeInfo * mi)
+{
+       kleinstruct *kp = &klein[MI_SCREEN(mi)];
+       Display *display = MI_DISPLAY(mi);
+       Window  window = MI_WINDOW(mi);
+
+       if (!kp->glx_context) return;
+
+       glDrawBuffer(GL_BACK);
+
+       glXMakeCurrent(display, window, *(kp->glx_context));
+       draw(mi);
+       if (mi->fps_p) do_fps (mi);
+       glFinish();
+       glXSwapBuffers(display, window);
+}
+
+void
+release_klein(ModeInfo * mi)
+{
+       if (klein != NULL) {
+               int      screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       kleinstruct *kp = &klein[screen];
+
+                       if (kp->glx_context) {
+                               /* Display lists MUST be freed while their glXContext is current. */
+                               glXMakeCurrent(MI_DISPLAY(mi), kp->window, *(kp->glx_context));
+                       }
+               }
+               (void) free((void *) klein);
+               klein = NULL;
+       }
+       FreeAllGL(mi);
+}
+
+
+/*********************************************************/
+
+#endif
index 56085ac72560a07f6dd04fb8b508c964f69cd000..c54c101c6f6b821da0d2000de59bc25482e6a494 100644 (file)
@@ -675,7 +675,7 @@ build_molecule (ModeInfo *mi)
             tube (from->x, from->y, from->z,
                   to->x,   to->y,   to->z,
                   thickness, cap_size,
-                  faces, smooth, wire);
+                  faces, smooth, False, wire);
           }
       }
 
index 556de1f4a60d411b14d727d2075d955358dcaca1..20f51ed4d2839e165a4266747f4d3f7a6e6e675d 100644 (file)
@@ -1,4 +1,4 @@
-/* tube, Copyright (c) 2001 Jamie Zawinski <jwz@jwz.org>
+/* tube, Copyright (c) 2001, 2003 Jamie Zawinski <jwz@jwz.org>
  * Utility functions to create tubes and cones in GL.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -17,7 +17,7 @@
 #include "tube.h"
 
 static void
-unit_tube (int faces, Bool smooth, Bool wire)
+unit_tube (int faces, Bool smooth, Bool caps_p, Bool wire)
 {
   int i;
   GLfloat step = M_PI * 2 / faces;
@@ -70,26 +70,27 @@ unit_tube (int faces, Bool smooth, Bool wire)
 
   /* End caps
    */
-  for (z = 0; z <= 1; z++)
-    {
-      glFrontFace(z == 0 ? GL_CCW : GL_CW);
-      glNormal3f(0, (z == 0 ? -1 : 1), 0);
-      glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
-      if (! wire) glVertex3f(0, z, 0);
-      for (i = 0, th = 0; i <= faces; i++)
-        {
-          GLfloat x = cos (th);
-          GLfloat y = sin (th);
-          glVertex3f(x, z, y);
-          th += step;
-        }
-      glEnd();
-    }
+  if (caps_p)
+    for (z = 0; z <= 1; z++)
+      {
+        glFrontFace(z == 0 ? GL_CCW : GL_CW);
+        glNormal3f(0, (z == 0 ? -1 : 1), 0);
+        glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+        if (! wire) glVertex3f(0, z, 0);
+        for (i = 0, th = 0; i <= faces; i++)
+          {
+            GLfloat x = cos (th);
+            GLfloat y = sin (th);
+            glVertex3f(x, z, y);
+            th += step;
+          }
+        glEnd();
+      }
 }
 
 
 static void
-unit_cone (int faces, Bool smooth, Bool wire)
+unit_cone (int faces, Bool smooth, Bool cap_p, Bool wire)
 {
   int i;
   GLfloat step = M_PI * 2 / faces;
@@ -129,18 +130,21 @@ unit_cone (int faces, Bool smooth, Bool wire)
 
   /* End cap
    */
-  glFrontFace(GL_CCW);
-  glNormal3f(0, -1, 0);
-  glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
-  if (! wire) glVertex3f(0, 0, 0);
-  for (i = 0, th = 0; i <= faces; i++)
+  if (cap_p)
     {
-      GLfloat x = cos (th);
-      GLfloat y = sin (th);
-      glVertex3f(x, 0, y);
-      th += step;
+      glFrontFace(GL_CCW);
+      glNormal3f(0, -1, 0);
+      glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+      if (! wire) glVertex3f(0, 0, 0);
+      for (i = 0, th = 0; i <= faces; i++)
+        {
+          GLfloat x = cos (th);
+          GLfloat y = sin (th);
+          glVertex3f(x, 0, y);
+          th += step;
+        }
+      glEnd();
     }
-  glEnd();
 }
 
 
@@ -148,7 +152,7 @@ static void
 tube_1 (GLfloat x1, GLfloat y1, GLfloat z1,
         GLfloat x2, GLfloat y2, GLfloat z2,
         GLfloat diameter, GLfloat cap_size,
-        int faces, Bool smooth, Bool wire,
+        int faces, Bool smooth, Bool caps_p, Bool wire,
         Bool cone_p)
 {
   GLfloat length, X, Y, Z;
@@ -180,9 +184,9 @@ tube_1 (GLfloat x1, GLfloat y1, GLfloat z1,
     }
 
   if (cone_p)
-    unit_cone (faces, smooth, wire);
+    unit_cone (faces, smooth, caps_p, wire);
   else
-    unit_tube (faces, smooth, wire);
+    unit_tube (faces, smooth, caps_p, wire);
 
   glPopMatrix();
 }
@@ -192,9 +196,10 @@ void
 tube (GLfloat x1, GLfloat y1, GLfloat z1,
       GLfloat x2, GLfloat y2, GLfloat z2,
       GLfloat diameter, GLfloat cap_size,
-      int faces, Bool smooth, Bool wire)
+      int faces, Bool smooth, Bool caps_p, Bool wire)
 {
-  tube_1 (x1, y1, z1, x2, y2, z2, diameter, cap_size, faces, smooth, wire,
+  tube_1 (x1, y1, z1, x2, y2, z2, diameter, cap_size,
+          faces, smooth, caps_p, wire,
           False);
 }
 
@@ -203,8 +208,9 @@ void
 cone (GLfloat x1, GLfloat y1, GLfloat z1,
       GLfloat x2, GLfloat y2, GLfloat z2,
       GLfloat diameter, GLfloat cap_size,
-      int faces, Bool smooth, Bool wire)
+      int faces, Bool smooth, Bool cap_p, Bool wire)
 {
-  tube_1 (x1, y1, z1, x2, y2, z2, diameter, cap_size, faces, smooth, wire,
+  tube_1 (x1, y1, z1, x2, y2, z2, diameter, cap_size,
+          faces, smooth, cap_p, wire,
           True);
 }
index 1fd065d0fc7b4ec2ac33cd7300d86c0228700098..d4cd002d1d8e39c5cfc67dde91e8dbfeb2ec80f0 100644 (file)
@@ -1,4 +1,4 @@
-/* tube, Copyright (c) 2001 Jamie Zawinski <jwz@jwz.org>
+/* tube, Copyright (c) 2001, 2003 Jamie Zawinski <jwz@jwz.org>
  * Utility functions to create tubes and cones in GL.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
 extern void tube (GLfloat x1, GLfloat y1, GLfloat z1,
                   GLfloat x2, GLfloat y2, GLfloat z2,
                   GLfloat diameter, GLfloat cap_size,
-                  int faces, Bool smooth, Bool wire);
+                  int faces, Bool smooth, Bool caps_p, Bool wire);
 
 extern void cone (GLfloat x1, GLfloat y1, GLfloat z1,
                   GLfloat x2, GLfloat y2, GLfloat z2,
                   GLfloat diameter, GLfloat cap_size,
-                  int faces, Bool smooth, Bool wire);
+                  int faces, Bool smooth, Bool cap_p,  Bool wire);
 
 #endif /* __TUBE_H__ */
index 43ac2ae64bdbb70938013b72e10dca424d43ca7b..a524e7659adb6ed55495592577e1176e08503fb7 100644 (file)
@@ -1,5 +1,5 @@
 /* xpm-ximage.c --- converts XPM data to an XImage for use with OpenGL.
- * xscreensaver, Copyright (c) 1998, 2001, 2002 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1998-2003 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -18,6 +18,7 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+#include <X11/Xlib.h>
 
 extern char *progname;
 
index 111e5217c30c6f19c7287f1ef0138abc66219091..e3e0dc62a658a45d707d1f7d108edd31dbeb5756 100644 (file)
@@ -331,8 +331,10 @@ Trace(FRACTAL * F, F_PT xo, F_PT yo)
        Cur = Cur_F->Components;
        for (i = Cur_F->Nb_Simi; i; --i, Cur++) {
                Transform(Cur, xo, yo, &x, &y);
-               Buf->x = F->Lx + (x * F->Lx / (UNIT * 2));
-               Buf->y = F->Ly - (y * F->Ly / (UNIT * 2));
+               /* Buf->x = F->Lx + (x * F->Lx / (UNIT * 2)); */
+               /* Buf->y = F->Ly - (y * F->Ly / (UNIT * 2)); */
+        Buf->x = (UNIT * 2 + x) * F->Lx / (UNIT * 2);
+        Buf->y = (UNIT * 2 - y) * F->Ly / (UNIT * 2);
                Buf++;
                Cur_Pt++;
 
diff --git a/hacks/images/blocktube.xpm b/hacks/images/blocktube.xpm
new file mode 100644 (file)
index 0000000..6c5cc2c
--- /dev/null
@@ -0,0 +1,320 @@
+/* XPM */
+static char * envImage_xpm[] = {
+"256 256 61 1",
+"      c None",
+".     c #060606",
+"+     c #929292",
+"@     c #424242",
+"#     c #5A5A5A",
+"$     c #CACACA",
+"%     c #7A7A7A",
+"&     c #B6B6B6",
+"*     c #A6A6A6",
+"=     c #626262",
+"-     c #1E1E1E",
+";     c #8A8A8A",
+">     c #666666",
+",     c #E2E2E2",
+"'     c #262626",
+")     c #464646",
+"!     c #6A6A6A",
+"~     c #969696",
+"{     c #2E2E2E",
+"]     c #6E6E6E",
+"^     c #7E7E7E",
+"/     c #4A4A4A",
+"(     c #DADADA",
+"_     c #9E9E9E",
+":     c #C2C2C2",
+"<     c #AEAEAE",
+"[     c #525252",
+"}     c #3A3A3A",
+"|     c #828282",
+"1     c #767676",
+"2     c #D2D2D2",
+"3     c #BABABA",
+"4     c #EEEEEE",
+"5     c #868686",
+"6     c #8E8E8E",
+"7     c #727272",
+"8     c #121212",
+"9     c #9A9A9A",
+"0     c #363636",
+"a     c #5E5E5E",
+"b     c #A2A2A2",
+"c     c #565656",
+"d     c #AAAAAA",
+"e     c #B2B2B2",
+"f     c #4E4E4E",
+"g     c #1A1A1A",
+"h     c #EAEAEA",
+"i     c #BEBEBE",
+"j     c #C6C6C6",
+"k     c #3E3E3E",
+"l     c #CECECE",
+"m     c #D6D6D6",
+"n     c #323232",
+"o     c #2A2A2A",
+"p     c #DEDEDE",
+"q     c #222222",
+"r     c #E6E6E6",
+"s     c #161616",
+"t     c #F2F2F2",
+"u     c #0A0A0A",
+"v     c #0E0E0E",
+"@@k}}0nn{ooqq-gg-k1~9~~+6;;5||^%117]]!>==a##c[[f//)@@k}}0nn{oo'qq-ggs888vuuu8}1~bd&jprrr,pp((mm2ll$$j::i33&&ee<dd*bbb_99~~~+66;;55||^%%%1177%~$4tttt44hr(idb+5|1]]!!>>====aa#####cccc[[[[[[[[ff[f[f[f[f[[f[[[[[[cccc#####aaa===>>!!!!]77111%%%^|||5;;66++~999_bb",
+")@kk}00{{o''qq-gq)%99~++66;55|%^%177!]!>==a##c[ff/))kkk000{{{'q'---sssvvu8vsn]*:l(p,rhh,,,ppmm2ll$$j:jii333ee<<<dd*b___9~+++6;;55||^^^%11771;ep4tttt4hhr,(mj:eb9;^1]!===aaa####cccc[[c[c[ffff[[fffff[/fff[f[f[[c[[cccc##a#aa=a>=>>!]]]]]771%%^^^|555;;6+~+~9_9__",
+"@kk}0nn{ooqq-ggs'[|~9~+6;;5|^^%177]]!>==a##c[[//))@@k}}0nn{oo'qq-ggs8s8sg'{@>d(4hhhhrr,,p(((22ll$$jjii333&&e<dd**bb_99~~~+66;;55||^%%1177]]|*m44444hhhrr,pp((lj:<b~5%7>=a##c#c[[[[f[ff/f/f////)/)//////////fff//f[[f[[c[c####aaa====>!!!]7771%%%%|||55;;66++~99_",
+"@k}}0n{{{''q--g-{a;9~~+6;;5||%%%17]]!>>=aa#c[[ff/)@@k}}nn{{o''qq-gggq'{})f#!~l4t4t4hhrr,,pmmm22ll$j:::i3&eee<<d*bbb__99~++66;;5|5|^%1%117]^9$rttt44hhrr,r,pp((m2ljieb~;%]=a#c[[[[f[ffff/f//////////)///)///)//fffff[[[[ccccc##aaa=>>>!!]]]]1711^^^||55;;6++~~99_",
+"kk}0nn{oo'qqggsg0!6~+++6;;||^%%177!!!>=a##c[[f//)@k}}}00n{ooqq--qqon@f#=>]]^<pttt4hhr,,p((mm2l$$jj::i33&&e<<dd**b__99~~+6;;;5||^^%%%11]7]7;&p4t444hrr,,ppp((mm222$$$i3<_+|7>ac[ff////)/@))@@@@@@@@@@@@@@@@)@)))/)/)////f[[[[ccc###aa==>>!!!]]771%%^|||555;;++~~9",
+"@}}}0n{oo''---s-k1~~~+6;;55|^^%177!!>==aa##cff/)))@k}0nn{o{'ooon}@[a=7771]76:r4t4hhr,,,p(((222$$jj::ii33eee<d**bbb_9~~+++6;;;55|^%%1777]]|*mht44hhrrr,,,p(((mmml2ll$$j:i&d_;^!acf//)))))@@)))@@@@@@@@@@@@@)@@@)@))///fffff[cc[###aaaa==>>!!]777111%%^|55;;66++~~",
+"k}}nn{{o'qqgggsq/%~~~+6;5||^%111]]!>>=a#cc[[f//)@@k}00nn{oo{n0@[=]7%%%%117%924tt4hrr,,p((mmlll$jj::i33&&e<<dd*bb_999~++6;;;5|^^^%%1777]]1~jr4444hhr,rpp((mmm222$$$$jjj::i3&db+^]=[f))@@@@kkk}k}kk}}k}}kkk}kkkk@@@@@)))))///f[f[[cc##aa=a=>>>!]]771%%%^^|55;;66+~",
+"}k000noo''q-gsgq[5~++66;55|^^%177]]>>==aac[[ff/))@kk}00nn0k)c>]%^^|^^%11]7^<(t44hhrrrppp(m2ml$$$::i333eee<dd***___9~+~+66;5|||^^%%1%111%;e(444hhrr,,pp((((mmlllll$j$::::ii33&e*95%>#/)@kkkk}kk}}}}k}kk}}kkkkk@kk@k@@@)))//f/f[[[[[c##aa==>>!!!]]711%%%^|55;;6+++",
+"}}nn{{o'qqqgg8s'c5~++;;;5|^%%177]!!>=aa#cc[ff/)@@k}00n00@fa]%||55||^%%71]]|3,tt4hhr,,((mm2l$$$:::ii3&&ee<dd*bb_99~~++66;;5||^^%%111111%|_j,44hhrr,r,p((m222lll$$jj:::ii33333&e<<*9;%>c/kk}}00}0}000000000}0}0}}}}kkkk@@@)@))///f[[[ccc##aa==>!!!]]]11%%%|^555;6+",
+"}}}nn{{oqqg-gsgn>;~~+6;;|5|^%117!!!>==a##ccf//)@kkk}k@/a!%5;66655|^%%11771+jh444hr,,,p((2m22l$$j::33&&&<<<d**b__9~~~+6;;555|^%%%^%%^^5;9iphhrr,rp,((((((m22ll$$$jj::i:3i33&eeeee<d*_+^>#/k}00n0n0n0nn00n0n0000}0}}}kk}@@@))))//ff[[[cccaa==>>>!]!]7711%^^||5;;66",
+"00nn{o''q-ggs8s0]6++6;;5|^^%17]]!!>==##c[fff))@@kkk@f#]|;6666;;|||^%%17]]%b244hhrr,pp(mm2l$$$:::i33&eeedd*bb__9~~+66;;555||^^^^%^^||;69e2,rr,,p,(p((m222ll$$$j:j::ii33&3&eeee<dddd**b96^!c)}0nn{n{nnn{n{nn{nnn00000}}}}}kk@@@)))//ff[[[cc##a===>!!]7711%%^^|55;;",
+"}00n{oo'qq-ggsg@1+~+66;5||%^%177]!>==a##cc[/f))))f#>1;+~~~++6;55|^^%117]]|<,44hhr,r,(((m22ll$j::ii3&&<<d**b__99~++6;;;55|||^^||||;6+9b&$p,,,,pp((2m2m22$l$l$jjj::iii33&&&eeee<<<<dd*b*_9+^>c@}nn{{{{{{{{{n{nnnnnn0000}}}}kk@@@)))//f[[c[##aaa=>>!]]]7711^^^||;5;",
+"00n{{o'q--gs88-/%+++;;55|^%117]!!>>aa#cc[ff//))/#]^;+~99~++66;55|%%%177]7;3,44hhr,pp(mm2l$$j::i3&&e<<dd*bb_9~~+6;6;5|||||||||5;6+~9*de:mpp((m2m222ll$$$$jjj::ii3i333&&eeee<dd***bbbbbb_99~;%>c)0noooooo'oooooo{{{{{nnn00}0}}kk@@)))///f[[ccc#a===>>!!]771%%^^|55",
+"0n0{oo''q-ggssq[|++66;5|^^%%17]]!>==aa#c[[f/f[a]|~_bb__~~~66;5||^^%177]]16jh4hh,,,p((mml$ljj:i33&ee<d*bb_99~++6;;;555555|5;666+9_*<eijl(mmmm22ll$$$$jjjjj::::iii33&&&eee<<d<ddd***bb_____9~+;^!c@noo'o'o'ooo{oo{{{{nnnn00}0kk}k@@)))ff[f[[c#a#aa=>!!]]7171^^||55",
+"0n{{o'qqggs888qc|+66;55|^%1177!!>>=a##[[fffca]|+_bbb_99~++6;;5|5^^%1177]%_lhhhr,pp((22$$$::i33eee<d*bb_99+++;;;555|5555;;;6+~9_*d<&i:$$m2l$$$jjj::i:ii3i333&&&&eee<e<<dd*d*d*bbb____999~99+~+651>[k{q'qqqqqq''''oooo{{{{nnn0}}}}k@@@))//f[f[c##aa===!!!7771%%^||",
+"0nn{o''q--gs8s{a;~+;;5||^^%17]]!>>=aa##ccc>759bd*dbb__9~++66;55^^%117171|dmhhrr,p(m22$l$::i33ee<d*bbb_99+++;6;;;55;5;;66+~9_*dde&i:j$$l$$$$j::iii333&33&&&ee&e<e<<<ddddd***bbb__b_9999~9~+~+~++651a)0o'qq'q'q'q'''ooo{{{nn0n0}}}kk@@@///f[[cc###aa>>>!]]711%^^|5",
+"nn{oo'qqggssvsn>;6+;;5|^%%177]!!==a##cc#=]59*ddd**bb99~~+6;;5||^%%1%771^63pr,,p((m2$$j::i3&&<<d*bb_9~~++6;655555|5;;;6+~~__bd<e&3i:jjj$j::iii3&&&ee<<<ddd<dddd*****bbbbb_____9_9999~~++++++6666;;5%![kn'----q-qqqqq''oooo{{{nn00}}kk@@)))//f[[cc##==>>!!!]711%%^",
+"nn{{o''--gs88s0];+6;555|^%117]!!>==aa#=]59dee<<<**b_9_9++6;;55^^%1%1%^^59iprrppm2ll$j:i3&ee<d**__99~++6;;;5;5555;;66+~_9b*d<ee33ii::jj:ii33&eee<<<d<d**d*b**bb*bb_____9___9999~~~~~~++++6+666;66;65|%![k{qg-----qqq'''o'{o{n{0000}}kk@@)/fff[ccc#aaa==>!!771%%^^",
+"nno''qqggs88vs0]66;;5|^^%117]]!>==aa=!^+*<&ee<ddbb__9~~+6;;5||^%%%%%%|;~<lpp(mmll$::i3&e<d*bb_999++6;;;;55|5555;;;++~9_b**d<e&33ii:iii333eee<<dd**bbbb_9_999999~999~~~~++~+++++++6+6+6;6;;;;;55;5;5||^7a)nqgggggg----qqq'''oo{{n00}0}kk@@)///f[c[caa==>!!!]]71%%",
+"n{{{'qq-ggs88s@%666;5||^^%77]!!>>==!^~d&33&ee<dd**b999++66;;||^^^^%|5;~*32(((ml$j::3&&e<d**b999++6666;;55;;5;;6;++~99_b*d<e&&&3iiii3333eee<d<**bbb___99_99~~~+~~+++++++6+66++66666;6;;;;;;;5;5555|55|||%]#@o-gggggg---q'''oo{o{nn00}k}kk@))/fff[c###a==>!!]771%%",
+"n{oo'q--g88vvg/%66;55|%%%1]]!!!==!7;be&33&ee<<d*bb_9~~+66;55|^^^%|5;+9*ej2m2l$j:i33e<d**b999~++66;55555555555;66++~9_bb*dd<e&&&&3&&&&e&&<d<**b*b999~~~+++++666;6;;;;;5;5;;555;5;5;55;55|5|5|||^^|^^||^|%%7=f0qss8ssgggg-qqqq'ooo{n{n0}}k}k@))//[[[c##aa==>!!]711",
+"{{o''q-gggs88-f^666;|||^%11]]!>!759e3i:ii&&e<d**b__9~++6;55|||^|556~_d&:$22$$j:i3ee<d**___9~++66;;;;;55555;;6;6+~~~__b*d<<e&&333&33&ee<dddbbb_99999++++666;66;;;;;;55555|||55|5||555|5|5|||||^||^|^%^^^^^%1]#@{-gssggg----q'''o{o{n000}}k@@@//fff[c##a==>>]]]771",
+"{oo'qq-gs88v8-f^;;;5|^%%%77]!!]^6d&::ii33eedddbb_9~~++;;555||||566~bd&i:$$$::i&&edd**__99+++66;;555|55555;;5;;66+~~_bb**d<<<e&&&&ee&ee<d*dbbb_99~~~++6;;;;555||||||^|^|^^|%^^^^^^%^^^^^^^%%%%%%%%%%%%1%%%%117>[}qg88ssssg-g-qqq'ooonnnn}}kkk@@)/fffcc##a==>!!]77",
+"{{o''--gs8vvvqc|6;;55|^%117]]^;b&:$jj:33&ee<db*__~~++;6;55|55;;++9*<&3:jj$j:3&&e<<**__9~+++6;;;;;;55555555;666+~~9__bb*d<<e&ee&e&&eeeddd*bb_9999~+++666;;;55||5|^^^|^^%^^%^%^%%^%^%%%^%^%^%^%%%%11111%%1%%%%11]a){-s888ggg--qq'''o{{{000}}k@@))//[[[c#a===>!]]77",
+"{o'qq-ggss8v8o=56;5|^^%17]7%^~d:jjj:i33ee<d**__9~+++65;555;5;6+9_bde3:::::i3&eed*bb_99~++6;6;;5555||55555;5;;66+~~~9_b***d<<eeeeeee<<dd*bbbb_9~~++66;;55|5|||^^^%^%%%%11%111111111%11111117%1717117777777711717]=f0qs8v88sgsg-qqq''oo{{n00}}k@))//ff[cc#aa==!!!7",
+"{oo'q--gs8vvv0>;;;5||^%%%%^6*3$$$$j:ii&&ed**b_9~~+6;;;;;;6;++~9bd<&3i:::i33&e<d**b_99~~~++6;;;;555555|5;55;;66++~9__bb**d<<eee&ee&<<ddd*b*_99~~~+++;66;55|||^^^^^%%%%1%1111111711111717111177777]77]77]7777]11117]#@o-s8s8sggg-q'qooo{nnn00kkk@))/f[[[##aa>>>!]]",
+"o''q-ggss88ssn>5;;5|^^%%^5~<j$$$j:i3&e<ddbb_9~+66;;5;5;;;6+~9_bd<e33iii33&ee<d*bb_99~~+66;;;555||5|||5|55555;;66++~99_bb*dd<eeeee&ee<d**bb__9~+~+66;;55|5||^^%%%%111111771777777]7]7]7]]]]777]]]]!]!]]]!]]]]]7]777]=/ng88v88gsgg-qq''oo{nnn}}kk@))/ff[[###a==>!!",
+"{oo'q-gs8gssqk];6;55555;~di$lll$::i3&e<d*b_~~++666;;;666+~~9b**<ee&333i33&e<dd*bb__9~+++666;;;555|||5|5555;;;;;++~~~9_b***<<<e&&eee<<<dd*b_9__9~++6;;555|^^^^^%%%%%111111771777777177777777]777]]]]%%%^^|^||^%%17177!ck's8vs8ggg--qq''o{nn00}}k@@)//ffcc#aa=>>!]",
+"o'qq-ggggg-qo)75;6;;66~_e:$l$$::i&ee<*b_9~~++;;;5;;;;;++~99_b*d<e&333&3eeedd**bb99~~~+666;;5555||||^|||^|||5555;;6++~~99bb*d<<<e&&&&e<<dd**__99~++66;555|^^%%%%11117777777]777777]]7777177%1177]7%|~*d<<<<<<db+;^1777!#@ogv8v8ssgg--q'ooo{nn00kk@@)//ff[cc#a==>!",
+"{o''--gg-q'n@a^6+~9~9*<i$ll$jj:i&&e<**b_9~+6666;6;;66++~~_bb*dd&&e3&&3&&&e<<**b__999~++666;;5;5555||^|||||||55;;;;666~~9__b*dd&&e&3&&&<e<d**bb_99~++6;;5|||^%%%1111111777711711111%111%%^^^|^%%|+di$mppppp,,,mlie_;|17]>fn-8888sgg--qq''{{{0n}}}k@))f/[[[###=>>>",
+"'qqq-gq-'{}/#1+9_b*de3:j$$$:i3&&<d*b_9~~++6;;;;5;;;66++99_b*dd<<&e33e&ee<<ddb*b_99~~+666;;;;5|||||||^^^^^^^|^^^||555;;;6~~9b**de&i:333e&ee<*bbb999++6;;5||%^%111177777777]77777711%%%%^||;;;55~d:2prhh4h444444h,(l3b6%7]>c}q88v8ssgg--qqooonn00}}k@@)//f[c###a=>",
+"oo'--q-onk[!1+b<<&3i:j$$j:ii3&edd*b__9~+666;;;;;66+++~9~_b**d<<eeeee&&eeed<**bbb_99~9~~+66;;;;;55|||||^^|^^^|^|^^^|||55;;6+~9bddei:j:ii&&&ee<<**b99~~+;;;|5|^^^%11117771777171%%%%^^|5;;+9~+~d:m,rhhhhh4hhh4444444rm3_;1]!a@{g8v8sgg-qq''o{{nn}}kk@)//f[[cc#a=>>",
+"''q-q'o0/#75~*e&333ii:iii3&e<ddbb_9~++66;;;;5;;;;;6++~9~9b_**ddeee&eee<<<dd**b_9_99~~+++666;655555||^|^^^^%%%%%%%%%%%%%^^|556~_b<:$$$j:ii33ee<dd*b_9~~66;5||%%%%1177]7]]77777111%^^|5;;~999b&l,rhhhrhrrhhhhhhh44tt4hp$<+%7]=/0-8v8sssg-q''oo{{n0}}}@@))/f[cc##a=",
+"'qq'oo0f=1+*de3i33i3333&&e<<ddbb_9~~+++6;;;;;;6;;66++~9__b**dd<<eee&e&ee<<<d****_b9_99~9~~++666;;5;5|||^^^%%%1%%11111111%%^||56~d:ll$$jj::3i&&e<d**b_9~+6;;55|^%%111777777]7111%^^|;6+9b**dim,rrrr,,,r,,,r,rrhhhh4ttth(i_|1]![}qs8ssg---q''o{n000kkk)@//ff[##aa=",
+"'qqq{0)>^;b<e&&3&e&ee<<ddd**bb999~++6;;;5;5;5;;;666+++~99_bb*d<<<eeeeeee<<<dd**bbb__999~~~+++666;;55|5||^^^%%1117777]]]]!]]71^^6dj22ll$$j:i33&&e<d*b__9~++;;|||%%%1117]]]]77771%%^5;;+b*bdi2,,r,rr,,,,,,prprrrrhhhh4tt4,$*577!#@'s888gg--q'ooo{nn0}}@@)//ff[c#aa",
+"'o'{0)a16_*<eeeeee<<dddd***bb9_~+~+666;6;;;;65;6;;+6++~9_bb**dd<<ee&&&&&ee<ed<dd*****bb__9_999~++666;;5|||^^^%%1177]]!!]!!!]!]7%b$2m2l$$jj::i3&&e<dd*b__9~+66;|5|%%1171777]7771^^^56+9b*di2,r,,,,pppppp(p(,pp,,,,rhh44t4rld517]>fogsss-gqqq'o{{n0}}kk@)/f[[[c#aa",
+"q''nkc]59_**<*ddd***b*bb___99~~~+66;;;;55555;55;;;66+++~99_bb*dd<<<eeee&&&ee<<<<dd*d*b*bb_b999~~++66;;55||^^%%17177]!>>>>====>>19jm22ll$$j::i3&&&edd**__9~~+6;55|^^%117]]]]7]771%^|56_bb<$(,,,,pppp(((p(p((p,,,rrrrrh44ttrld577!=/n-s8gsg-qq'o{{nn0}kk@@)/f[[c##",
+"oo{0[>%69bbbb*b*b**bb___b_9_99~+++66;;;;55555;;;66666~~~~99_bb***<<<e&e&&&&3&&&e&ee<d<<ddbbb___99~~++66;555^^%%%177]]!>>===aaaa]_jmm22l$$$j::ii3ee<<d**b_9~~++6;;5^^^111177]]7711|55+__*:m,,ppp(mmmmmm2(m(m((((p,,rrrh4444h$b5717![}qssgg-q''oo{nn}}kk@)/ff[c##a",
+"'o0k#!|6~9~999999~__9_99999~~~++66666;;5555555555;;6;;;6+++~99_b_**ddee&3&&33&3&&&eee<dddd*bb_99~~++6;;55|^|^%1177]!!>==aa#ac##!_$mm2ll$j::ii3&3eee<dbbb__9~~66;55|^%%177]]]!]]771^^6~~d$pp,p((((m2m2ml22mmm((((p,,rrhh44ttrj9%777]#}qssgg--q'oo{{n0}kk@)//f[[c#",
+"'{n/a15+6++6+~~999~9999~~9~9~~~++++6;;;6;;;;55;55;;5;;6;;6+6++~~9_b_**de&3333ii33i33&e&ee<dd*bbb_99~++66555^^^%117]!!>>==#acc[c7d$m2ll$$jj::i3i&&&<<<d**b_9~~~+66;5||^%%1777]]7!711^56~e2p,((((m222lll2l2lll22m((ppp,,rhh44t,i+1771]ak'-sgg-q'oo{nn}}}@@@)/ffcc#",
+"'{0/>1|5|5555;;6+6++++~++~+++++++6666;;;;5555|55||5|5|55555;;66666~~~9_*d<e&e&33&3333&&eee<dd*b*_99~~+66;5|^^%17]7]!!===a##c[[c1elmm2$$$j::ii3&&ee<dd**b__99~+66;55||^%117]]]!]!!]]1%|+3m,p(((mm2l$ll$l$llll222mm(pp,,rrhh4th(<57]71]a){-gggqq'oo{{n00}k@))/f[[#",
+"'nk[>1%^%^%^|||;;;66;+++++~+~+~+++++6+66;;;;5;5555||5|||||5||||5;;5;66+~bb*dee&&333333&&&eee<<dbbb__~~+6;;55^^%%1]!]>>>aa#cc[[c1dl2llllj$j::33&&ee<<d*bbb__9~~~+66;5|^^%%117]]!]!!!]1%+ippppmmll$l$jj$j$jj$$ll22mmm((p,rrhh44hl9%111%1![0q---q''{{nn0kk@@)//f[[c",
+"'nkf=]]!!777711%^^|5555;;6;66666666;6;6;;;;;5555555|||||^^^^^|^%%^^^^|5;6+99_*dd<<<ee&&e&eee<<dd*b__9~++6;5|^^%117]!!==aaa#c[fc1d$m2l$$j::ii33&e<<ddd*bb_99~++66;;5||^^%%77]]!!>!>>>!];3mp((2m2l$$jj:::jjj$j$$$l2m((ppp,rhh444,&57]7111![nqgg-q'oo{nn0}k@@)/ff[c",
+"qn@/=>!>>!>!]]711%%^^|5|;5;;6;6+66++6666++;;66;;555|5||||^^|^%^^^^^^^%%|55;++~__*dd<eee&eeee<<<<d**__99+6+6;5|^^17]]!>==accc[[[>_:lll$$jjjiii3&&ee<<***bb_999++66;;55|^^%117]]!!>>>=!!5i(((m(l$$j::ii:iii::jj$$lll2mm(p,,rhh44h2*^177%%%!c0'-qqqo{{n00}}k))//f[[",
+"q{@/c####a#a==>!!!777%%%^|||;55;;;;6666;666;;6;;;5;555|5||^^^^%%%%11111%%%^|5;6+~__b***<<<<<<dddd**bb__9+66;5|^%%1]]!!===##c[f[a+i$l$$$:::i3&3ee<ddddbb__99~~+66;55|^^^%%177]]!!>==a=>|e(p(22l$$j:iii3iiii:::jj$ll2mmm(pp,rh444,i;77711%%][}qqqqqoo{nn0}}k@)/f[[",
+"'nk)c#c[cc##aa=>>]!!7111^^^||55;;;66666+666++6++666;6;;5;|5||||^^%^%%%111%^^|5;;6+~9_bb**d<<<<<dddd*bb_99~+6;;5|%%%7]!>=aacc[ff=;&$llljj::iii&&&e<<d**bb__9~+++66;;55|^%%%17]]]!>>==#=1dl(((2l$:i33&e3e&333i::jj$$ll2(p(p,rrhh4h2b%771%%%^7c}'qq'o{{n0}kk@))//f[",
+"qnk@/f//fff[cc#aa=>>!]]]11%^^^|555;;;666++6++6+++6+6666;6;;;5||^|%%%111111%%%^^|5;;+~99__bb**ddddd***bb_99~+6;5|^%177!!>a=#c[[fa;e:jjj$:i:33&&ee<dd**b__99~~++6;;55||%^%1717]!!!>=aa#a!9j((m2l$ji3e&<e&e&&33ii:j$$l2l2((pp,,hh44p&|]]71%%%%7c0'qq'oo{nn0}k@@)/ff",
+"'{k@ff//f/fc[[ca#a==!]]717%^^||;5;;6++++++~~+~~++~~++++6666;;;;5|5||^%%%%111%^^|5;;;6++9__bb**********bb__9~++6;5|^%17]!>aaac[[#|<ij$$:jjii33&e&e<dd*bbb_99~~++66;55||^%%177]]!>>>==a#=^el(m2lji&eed<<d<<&e33ii::j$$2m2m(p,rrh44r:+7771%^^|^1#k{''o{{n0}}k@)//f[",
+"'{k)f//////[[[c##a=a>!!]171%^||55;;;+++~~~~999999~99~~~~+++66;;;55||^^%%%1%1%%^%^|5566++~~_9_bbb*b*bbbbb__9~~+66;|^^%7]]]==a#[[c%b&3::i::i33&&e<<d***bb9999~+66;;5|||^%%%177]]!>>==aa#a!+32(22l:&dd**dd<<eee&i3::j$$$22mm(p,rrh4h2_1]]]1%%^^|7#ko''o{nn0}}k@))/f",
+"q0/f/f//[ff[c[#a#==>>!!]11%^^|5;66+~+~~99_99__9____9_99~9~+~+++;;;5||^^^%%%%1%%^|55;;66+~99_9_bbb*bbbb*bb___~~+6;;5|^^17!!==##[#!6*&3::i::ii3&eee<<d**bb_9~+~++;;;;5|^^^%1177]]]>>==aa#a7~3$2lj3d_9___b*ddee&&33i::$$l2m((pp,rrh4,e|7771%^^||51a@{oo{{n0}kk@)/ff",
+"okcc[[f/[[[c#[#aa=>>!7]7%%%|5|;;6++~~9999b___*bbb_b____999~++++;;;55|^^%%1%%1%%%%^^|5;;6++~999___bbbb_bb__999~++6;;|^^117]>>aac#=^+b<&333i3&&&e<<dd*bb_9_99+++6655|||^%%1177]!!!!>==aa##a]5bee<b+++~9__b**d<e&3ii::jl$l2mmpp,rrhhr:6]]]71%^||5|1ak{o{{nn0}}k@)//",
+"}c!a#acca#c=aa>>=]!!]77%%%|55;6+++9~9b_bbb***b**b*b*bb__9999~+++;;;5||^^^%%%%%^%^||5;5666+~~999___b_bbbb____999~+6;55^^11]]>=a#ca]5~b<&iii33&e&e<dd**bbb99~~~+6;6;;5||^%%%1777]]!>>==aa##a>7%^^%^|;6~~9bb*d<<ee&ii:jjl222((p,,rr4hl91]711%^^|5;5%=){o{nn0}k@))/f",
+"c=!!a=aa=aa>==>!>!7]]17%^^||;;;++~999_bbbb*********bb*bb_99~~++66;55|^^%%%1%11%%%^^^55;;66++~999_9_______999~~+++6;55||%17]]!>aaa>15+bd<&333&ee<<dd*b___99~+++6;;55||^^%11177]]!!>>>>=aa#aa==>!!7^5;+~99_**dee&&3i:jjjll2m((,rrhhhm*%!]]71%^||5;;%#k{onn0}kk@))/",
+"1%17!!>!!!>!!!]!]7771%%%^||;;6+~~99bb*b**d**dddddd***bb__99~+++6;;5||^%%%1%%1%^%^||55;;66+~~~9999______b___9999~~+6655|^^17]!>=aa=!15+_d<&&33eee<ddd**b__99~~++6;;55||^^^%1777]]!!!>==>=aaaaa=>]]%|566+9__**d<e&33i:jl$22mmppprrhhpd^]]71%%^|5;;;51ckn{n0}}k@@/f",
+"5^11!!]!!!!]]!]]]7711%%^^5|;6++~~9_bbb**bdddd*ddd**bb___99~~+6;;55||^%%1171111%%^^||55;66+~~~~9999999_9_9999~~~++666555^%%17!!>=aa=!156_*dee&e<<<d**bbb9999+++66;;55||^%%%1777]]!!>>>==>>==>>>!]1%^56++9__**<<ee&3ii:j$$l2m(pp,rhh,e^!]]711%^^5;6;;7cknnn}}k@@)/",
+";|%17]7]!77]177171111%^|5;66++~___bbb*dd<dddd<dd***bbb_9_~~++66;5||%%%1171711%%^^5556666~+~9~99___9_b9_9__9999~+++6;;5||^^177!]===>>]15+_d<ee&&<<dddbb_b99~~+++6;;;||||^%%%%777]]!!!!!>===>=>!]71%||56+~9__**<<e&33::$$l22m(p,,,rhri67]]71%^^555;+66%#@0n0}kk))/",
+";|^%171777]]7]7177%%%^||5;6+~99bbb*d*ddd<d<ddd***bbb_9_~++6;;55||%%%77]7]77711%%^|55;66+~+~999999_999__9999~+~+++666;;||^^%11]!!==a=>!%|69*d<ee<<dd**b__99~~++66;5;55||^^%11177]]]!!!!!!!>!!]!]71^|5;66~9_bb*d<e&33i:jj$222((prrrhr:;]!]711%%^5;;66+61c}000}k@@)",
+";5||%%177%11%1111%^^|5;;+~~9bbb*dd<d<<<<<eddddd***__99+~+66655^^%%177]!!]7]%%^^55;666~~~~99999________99_9999~~~++6;555|^%117]!!!===>>]%569*d<<ee<dd**b__99~+++666;5||^^%%%%11777]]]!]!!!!!!!771%%||56++99_b*d<e&&3i:j$$$2mmppp,,hr$+]]]771^^||5;66++67c}}kkk@)/",
+";5|^%%111171111%%%|||;++9__**dd<<eeeeee<<<dd*b*b_999~~66;5||^^%%77]>!!=>!7]%%||;;6++~9~99____9__9_99999~9~~~+++666665555|^%%77]!>>=a=>!]%|69bd<d<<d**bb_999~~++6;;;55||^^^%%111777]]!]!]]!]7]171%^55;6++99b**dd<&&33i:$$$2mmmp,rrr,:6]!!7711^||5566++~5]fk0}k@@)",
+"665|^^^%%%%111^%^|56+~_b*d<<&e&&&&&&e&ee<<d<d*b___~~666;;5|%^%1]]]!!====]1^^;;++~~__9_bbbb_bbb___b__9_99~~~+~+++6;;555|^^^%1177]!>>>==>!7^5+9bd<<<d<**bb_999~++66;;;55||^%%%%1111]177]7]]7]]77%%%^|5;6++~9_b*d<ee&3i::j$ll2mp(p,rhrj6]!]]71%^^|5;;+~~~9;7fkkk@))",
+";;5|^%%%%11111^^5;+~_*d<e&33i333333&ee<<dd*b___~~~66;5||^^%1]7]]>>=a####]^55++~9__bbbbbbb*bbb_b___999~~~~++666;66;6;555^^%%11]]!>>=====>!7^569bdd<dd**bb_9~+~+6+6;55|5||^^^%%11717777777771711^^^||5;++~99_b**<ee&33i:$j$l22((p,,rrj;]!!]711%^|5;;6+~~9~5>/k}k@)",
+"6;55|^%%%%1171|6+~*d<&3i:::::i::333&e&<<d*bb_9~9+66;55|^%%117]!>>=aa#c[#]5+9_b*dddd<<dddd****b_b9_99~~~~++++666;5;||||^|%%%%17]]!!>>===>!]1^;+9bdd<<<**b___9~~~6666;;555||^^^%%%11177777717%1%%%||5;;6++99_b*d<<&&3i:::$llmm(pp,rh,:6!!]771%^^|5;;6++99_95=/@@))",
+";;5|^%%17717]75~bde33:jjjj:jj:ii3&&e<<ddbb_9_~++6;;5^^%%1]7!!>==a##c[[f[!;_bddddd<d<<dd***bbb_9_~9~+++66;;;;;55555|||^^^^%11777]>>====a=>!]1^5~9b**dd***_99~~+++6;6;55||||^%^%%%%11%%11%111%%%^^||5;66~~99bb**d<ee&3:jj$l$2mmpp,,r,i;!>!!771%^|||;6++~99_9^=)k@)",
+"6;55|^%1177]]75*&3j$$$llll$$:::i33&&e<d***__~~+6;;5||^%%17!!!>>aa##[[ff[!+dee&&&&eee<<<dd*bb__999~~~+6666;555|5||^^|^%^111%717]!!!>==a===>]1%5;~_*dddddb*b__~~~++6;66555||||^^^%%%%11%%1%%%%%^|||5;;;+++99_b*dde&&3i3:j$$22m((p,rrp&|!!!771%^^||;;6+~~9__b~%a/)@",
+";5||^%%11]!!!!5d:j$222llll$j::333ee<dddbb_99++66;55|^%177]!>>=a##cc[f/)/a+<&&33&&&ee<dd**bb__99~++66;;55|||^^^^%^^%%%1%%1777]]!!>!>==aaa==!!7^56~_**d*d*___99+~++66;;;;55|^|^^|^%%^%%%%%%%%^^^|55;;66+~9_9bb*dd<e&&ii:jl$l22m(p,,rmd%>!!]]71%%||5;;6+~~__bb+7[))",
+";;55|^%177]]!]5elmm(mmm22l$$j::3&3e<<dbb__9~~+6;;|^|%%177]]!===aac[[ff//a;ei333i3&&&e<<d**bb9_~~+++;655|||^^^%%11111717]777]]]]]!>==aa====>!7%|;+9_*ddd**b__99~~++66;;;5555|||^^^^%^^^%^^^^^||||55;6++~~9_b**d<e&&33i::j$llm((p,r,2b7>>!]71%%^|55;;+~9_9_**b+][/",
+";;|^^^11]]!>>>^d2(pmm(m22l$j:ii3&ee<dd*b__9~++6;;5|^%%177!!>>aa#cc[f//))f|<:::ii3&eeedd*bb__9~++6;;555||^^%1%1117]]7]!]!!!!!!>>>>>==a#a#a==!!7%|;~9_**d**b_99~~+++666;;;5|5|||^|||^^^|^^||||555;6;66~+~9__bbddd<&&i3:jj$$22m((p,r,j~]>>!]]71%%||5;66+~9__b**b5>f",
+"65;5^%%117!!>>%dmr,,p((mll$$:jii3&e<<d**b99~~+;655|^^%17]!!!=>aa#c[[ff))f7djj::ii3&&e<<d*bb999~~+66;55|^^%%%177]!]]!!!!!!>>!!>>>===a=aaa#a=>]71^;69bbddd**bb99~~~++666;;;;5;||5||^|||^|||||||55;;6;++~99__***d<ee&&ii:j$$l22((p,,,:;!>!!]711^^|55;6++~99_b*ddb5=",
+";5||^%177]]!>=7b2,,p((m2ll$j::33&ee<d*bb__~~++;;;||^%%17]]!>==a#cc[f//)@)>_ij:i333ee<dd**_b_9~++6;;5|||^%1177]7]!>!>>=>===a==aaa==aa####aaa=>]7%56~9_b*d*bbb99~+~++666;;;55;5|5|5|||5||||5555;;;;++++~_9__bdd<<e&33i:::$ll2mm(p,,(e^>=!!]]11%%^|5;;6++99_bb*dd_|",
+"6;5||^%%77!!!>7_lr,,p(m22$$$j:ii3&e<dd*bb99~~+6;55|^^%177]!!==aa#cc[ff/))a+ij:::i&&ee<dd**__99~~+66;;5^|^%177]!!]!=>=====aaaaaaa####a#####a=>!7%|;+9b**ddd*bb_99~~~~6++6;6;;;;55|555|5555555;;;6+6+~~999b***ddee&&3ii:$$$22mp(p,,2b7=>>!]77%%^|55;6++~9_bb*dd<d*",
+";;5|^%117]!>==>+:p,p((m22$jj::i3&&eedd*bb99~+66;5||%%%1]]!!>==a#c[[f//)))[|e::i33&ee<dd*bb__9~+++;;5||^%%%117]]!>>=>==####c##c#cc#ccc[ccc##a=>]7^5699bb***bb9_~~~~++6666;;;;555;555;5;555;;;6666+++~~9___b*dddee&33i::j$$l22m(p,pj~]=>>!!7711^^|5;;6+~~9_bbdd<<e",
+"65||^^%177]!!>!5:pr,p(m22lljj:i33&ed<db*__9~++;;55||%%117]!!>=aa#c[[f//@@/1*:::ii3&&e<<**b__99~~66;;55||^%177]!!!>>a##aa##ccc[ccc[cccccccc#a=!]1^5+~_**dd**bb__99~~~~++6+6;;6;6;;;;5;5;5;;;;;66++~~9999b***d<eee&3ii:jj$22m(ppp,(3|>>=!!]711^^|55;6+~~9_bb*d<<&e",
+";55|^%117]!!>=>^&(pp(mm2l$$j:ii3&e&<ddbb__~9++6;55|^%177]!!>=a##cc[f//))@@=~i:i33&ee<ddd*b_99~++66;;||^^%%%717!!>=>>=##cccc[[ff[ffffffff[[c#a=!]%|;~9_b***bbb__99~++~++666+;6;;;;;6;6;6;66666++++~~____bb**dd<e&33i::j$$ll2m((pp$_7===!!!]11%^||5566+~99_b**d<ee",
+"6;|5|^%17]]!>==%dm,,p((22l$j::i33&<<d**b_99+~+;65||^%%17]]!>===a#[cff//@@)#;e::i33&ee<d**b__9~~++665;||^%%11]]]]!>=aaa##cc[[[[f/f/f//fff[[c##=!7%|;~9bb*ddd*b__99999~~~+++6+6+6666;666;6666+6+~+~~999__b**<<ee&&33i:jj$$l22m(p,p:6!=>>!]7111%^|5;666~~9_b**d<<&&",
+";;||^%%17]!!>=a79lpppmm2ll$j::i3&&e<d**b_99~++;;;|^^%117]!!>=a###[[ff/)@kk/%diii3&&e<<dbbb__99~+6;;55|^^%%117]!!!>>=a##cc[[fff///)//)/))/f[ca=>]%|;+9_b***bbbb__99~~~+~+++6+66666+666+66+++~++~~999_bbbbd*dd<e&33ii::$$l22m(((pl*1=a==!!!71%%%^|5;66+~99_bb*d<ee",
+"6;5|^%%11]]!>>=!~jp,(pmm2$ljjii33ee<<db*b_9~+666555^%%117]!>>==acccf///)@@/>_3:ii&ee<<dd*bb_9~~~+66;55|^%%1777]!!>=aaa##c[[[f/ff//)))@))//fc#=!7%|;~9bb***d*b______999~9~+~+~++++6+6+6++6++++~~9~9_9_b*d*<deee&&i3::$jl$lmm(ppp:~]a=>>!]7711%||55;6+~~99bb*<<<e&",
+";55|^%%77]!!==a>53(p((222$$j::i33ee<ddbb__~9~6;;5|^^%17]]!!==aa#cc[f//)@kk@c;ei33&&e<dd*bb__9~+++;;5|||^%%%1]]]!>>>=aa#cccfff/))))@@@@@k@)/c#a>]%|;+9_bb*b*bbb_9_9999~~~9+~+++++~+~+++~~~+9~~99___bb*bbddd<<e&&33i::j$ll22mm((l*1=a==>!!]71%%^^55;66+~99_bbdd<ee",
+";;55|^%%7]!!!>=>^&(,(p(2l$ljj:i3&&e<dd*bb99+++6;;||^^%117]!!>=aa#cc[f//)@kkf%diii3e&e<<d*bb_99~+6+;;;5|^%%1117]!!>=>=aa##[c[fff))@@@)@@@)@/fc=]7^56~9b*******b_b____9_99~9~~~~~~+++~+~++~~~~9~_99__bb*d*d<<e&&33ii::j$$l2(mpp(i6!aa=>!!]771%%|55;;6+~99_b*dd<e&&",
+";5||^%%17]]!==aa1b2((mm22$$j:iii&&e<<*bb__9~++;;5||%%117]!!>>aa#cc[ff))@@k}@>93333ee<dd*bb__99~+6;;5||||%%17]7]]!>==a#a#c[[[f//)))@kkk}k@@)f#a!1^56+9_b****bbb__9_9_9999~~9~9~~~9~+9+999~99999_b_bbbb*dd<<ee&&33i:jjjllllmm(($_]aaaa=>!]771%%^||;;6++99__b*d<<e&",
+";;5|^%%117!!!===!9$pp((m2l$$::i3&&e<dd*b_99~++6;;5||^%17]]!>==aacc[fff/)@@k@c;ei3&&ee<dd*bb_9~~~+6;;55|^^%111]7!>>>>=a###cc[fff//)@@@kkk@)/fc>]%5;+9_b*****bbbbbbbbbb__9_999~~~~~~9~9~~~999_9_9_bbb*ddd<<e&e&33i:j:jl$l2mm((le|>aa=>!!!]711%^||5;6++~9__bb*d<ee&",
+";;5||%117]!>>=a#>5i(((m22$jj::i3&ee<dd**b_9~++6;;5|^%1777!!>=aa#cc[f/))@kk}})1*&3&&eedd**b_99~+++6;;|||^^%%71]]]!>===a###c[[[f//)))@kk}kk)/[#>]%56~9__bbb**bbb________b99_9__9_9_9999__99_9__bbb****d<d<e<e&33iii:jj$l22mmmmi6!###==>!!]711%%||55;6++~9_bb*dd<e&",
+"6;55^^%117]]!====|3mp(m22ll$j:ii3&e<<d*b_99~++6;5||^^%%1]]!!>=aa#cc[ff)))@}}@=93i3&&e<<d*bb__99~+66;;5|^^%%177]!!!>===a##cccfff//)@@@k@k))[c=!1|;+~_bb***b**bb*b*bb*bb_bb__99_99999_999___bbb_bbb**ddd<ee&3&333:jjjl$$2mm((j_1a#a==>!]]]71%^||55666+~99bb*dd<&e&",
+";5||^%177]!!>=a#a7dl(mm22l$j::333&e<d**bb_9~+66;5||%%177]!>>==#ac[[f//)@kk}}k[5<&&ee<dd**bb99~++66;55||^^%%1777]!>>=aaa##[[[fff/))@@@@@@//[#>]%|;+99bbb**bb**bbbbbbbbb_____b___b_b_____b__bb****d*dd<<<ee&3i3i:i:$j$ll22mm$d^a###a==>!]771%%^|55;6++~99_bb*dde&&",
+";;;5|^^%17!!>>=aa]_lpp(mll$$j::3&&e<d<b*b99~+~66;5||^%%17]]>>==aac[[f//)@@kk})7b333ee<dd*bb_99~~++;;555^^%%117]!]!>>==aa##cc[f////))@))//[#>!1^5+~9_bb*****bbb*b*b**bb**bbb_b_________b_b*bbbb***d<<<<e&e&&3iiijjj$$ll2m($e5=##aa==>!!]71%%%^55;;6+~~___**d<eee3",
+"655|^%%777]!>==a#=;im(mmll$jj:i3&&e<dd*bb_9~++;;;5|^%%77]!!!>aa##c[[f/))@k}}}ka+<&&ee<d**bb_99+++66;5|||^%%1777!!!>==aa##cc[[ff//))))//fc#a!7%|;+99_b*bb*b*b*b*b**b**bbbbbbbbbbbbbb**b*bbb*d*ddd<dd<<ee&&333i::jj$l222m2$&;>#c##a==>!!]77%%^^||;;6++~9__b*dd<ee&",
+";65||^%%7]!]!>=a#=|&m(mm2ll$::ii3&&e<d*b__99+++;55|^^%%77]]>=>a#ccc[ff/@@kk}00f%d&&&e<dd*bb__99~+6;655|^^%1%17]]]!>>>=a##c[c[f/f//)/f/fc#=!]%|;6~9_************d**dd*dd**bbbbbbbbbbbbbb*******ddd<e<&e&&333::::j$l$$2m2$e;!ac##a=>>!]]771%^^|5;;6++~99_b**d<e&&3",
+";;5||%%117!!>==a##1*l(mmll$$::i33ee<<dd*__99+66;55|^%%117!!>==aa#c[ff//)@k}}00@=9eee<<dd*bb_99+~+6;6;55^^^%1117]!!!===a#cc[fff/)))//f[[#a=]1%5;6+99_b**b***b****d**<d*d*dd**************d*d<<d<<<<eeee&3ii3ij::$j$2ll2$e6!#c###a==>!!]777%%^||5;;6++99bbb*d<<e&3",
+"6;;5|^%%777!!>=aaa>~j(m22l$jjj:i&3eeddbbb_9~~~66;5||^%177]]!>>=a#c[[f/)@)@k}}0}[|d&&&<ddd*b__99~++6;;5|5|%%177]]!!>>=a#a#c[[f////f/f[ca=!]7%|5;+9_bbb**d**ddd*ddd<ddddd***d**********d***dddd<<e<&e&333333:::j$jlll22$e+7==aaa=a=>!!]]71%%^||5;6++~999_b*dd<ee33",
+"6;5||^%17]]!!==a##a|32(m2ll$::ii&&e<<<db__9~+++;;||^%%11]!!>==aa#ccfff/@@kk}0nnk!9eee<ddbbb_99~++66;;5|^|^^%117]!!>==a#c[[ff/////ff[[#a>>]%%|;66~9_b_b*******ddddd<<dd<d<*<dddddddddddd<dd<d<<eee&e&&333:::::j$j$lllje+1>==aaa===>>!!771%1^|^55;6++~9_bb*ddeee&3",
+"6;;5|^^%11]!!!==##a1<2mmm2$$j::ii&&e<d**b__9~+66;5||^%%71]]]>=aa##[[f///@@k}}00}c;deee<dd*b__9~~++;;;55|^%%117]]!!==a##c[[fffff/ff[caa=!]1%^5;6~~9__*b*b*dd<<<e<<e<<e<d<d<dddddddddddd<d<<<<e<ee&e&333ii3ii:jjjl$$lje9^]]>==>>>=>>]]]]771%%^5|;;6+~~99_b*d<<e&&i",
+"6;55^^%177]!>>=a###!9$m2lll$j::33ee<<d**b_99~+6;;5|^^%177]!!>=aa#cc[f/))@kk}}nnn@7_ee<dd**b__99~+~66;55|^^^1]7!!>>=a#c[[ff/////f[[[ca==!77%^|5;6~~99__bbb***dd<e<e<<<<<<d<<<<<d<<<<<<<<<eeeeee&e&3&&333iii:::jj$$j:<95%7]]!!==>=>>>>]!]71%^%^||5;6+~99_bb*dee&&3",
+"66;|5^%%177]!>==a##=;immmll$j:iii3eedddbb_99~~+6;;55^%%17]!!>>=a##[c[/f))@@}}0nn}#;de<<<***b_99~~6+;55||^%171]!!>=a##cc[[f////ff[[#aa>!!7%^^5;6++~9__bbb__bb*<eeeee&ee<<e<ed<de<<<ed<e<e<eeee&&&&&3333i3ii::j:jj:3<_+5|%1]]!]!!!!!!]!7]7711%^|5;;;++~9_b**d<&&3i",
+"6;;5|^%%17]!!>=aacca%el2ml$$jj:333&&eddbb_99+++;;5|^^%117]!!>==a##[[[//@@@k}}0nnn)]_<edd**b__9~+~6;65||%%%1]!!!=a##c[[f////f/ff[[[caa=!!!7%^^|5;6+++~~~99~++~9*deeeee&e<eee<e<ee<eee<eeee&&&ee&&&&&3&3i3iiii:i:i&db~6;|%177!!!>!>>>!!!!]]711%%^|55;6+~~_b**d<e&3",
+"6;;5||^%17]]!>==aa#c]bl(22ll$:::3&ee<dd**b_99~+6;55||^%177]]>==a##c[ff//)@kk}00n0}#;de<<d*bb__9~66;555^^%77]]!==a##c[fff/ff/ff[[c#a#=>>!777%^|55;;;+66+6;;5^%%;9*e&&&ee&e<e&ee<eeeee&e&eeee<eee<ee&e&&&3&3ii33&e<b9~6;||%1777!!!!!!!!!!]7]711%%||5;6++99_bdd<e&3",
+"6;55|^^%17]!!>=a##cc=6:222l$$:iii3&e<ddbb_99~++6;55|^%117]!!>>=a##c[[f//@@kk}00n{n@]9<ddb*_999+~66;||^%%17!!==aa#[[[f/f///ff/ff[[c##aa=>!]711%%^|||5||^^%1]!=a=]|~*<e&e&&&e&e&eee&e<e<ee<<<<dd<dd*dd<<<e<<<e<<*b_9+655^%11]!!!!>>>>>>>!>!!]]771%^|||;6++99_*dde&",
+"+6;;||^%117]!!=>a##c=^e2m2$$jjj:33eee<ddbb_9~~+66;5||^^117]]!>==##cc[ff)))@}}}0000ka;*<ddbb_9~+665||^117]!!>>a##cc[f[f/f////ff[fccc#aa>>>!!]]111%%%%1777!=ac[)))[>^+_dee&e&e&eeeee<e<<d****__b99___9999___b99+~6;5|^^177]!!>!>======>=>>!!!]]717%%^55;6+~9_b*<ee",
+"+6;5||^%11]]!>==aa#[#]bj22llj::i33&e<<d*bb_9~~+6;55|^%%71]!!>==aa#[[[///@@@k}}0000}f19**bb9~~+6;;5^%%7]!!>=a##c[[ff/f/)/////ffff[[[c#c#a===>>!>!!!!!!>aaccf)@k}0}kfa159b<<ee&ee<<<d**b__9++6555||||5|||||^^^^1777!!>==aaa###cc#cccc#a#aa===>!!]77%1%||5;++~__*d<",
+"66;;||^^%77]!]=>aaccc=6i222$$j:ii3&&e<ddbb__9~~66;5||^%%777!!>>=aa#c[[f//@@kk}k}k@)f>6*b*__~+6;5|%^177]!=>aaacc[[[ff/ffff/ffff[[fcc[c##a##aaaa=a=aaa#c[f//)@k}00nnn0)[=1569b*d**b__~+65|^%777!]!!>!=>>====aa#c#c[c[[[ffffff/fffff[c[c##aaa>>>>!!771%^^5;6+~~_b*<",
+"66;;||^%%17]!!==a##[ca%e$2ll$jjiii&eedd**b_9~~+66;55|^%117]]!>=a#c#[ff/))@kkk}kkk@fc>^9_9~++;;||^117!!!>=a#cc[[fff///)))///////fffff[[[[cccccc[cc[fff//)@k}}}}nnnnnnn0k)[a!%|5;;;||%77!>=accc[fff/f////))))))@@)@@@k@@k@@@)))))///fff[[c###a==>>]]77%%^||;6+~_b*",
+"+6;;5|^^1177!!>>=a##[c]b$22l$$::i33&eedd*b__9~++;6;||^^%177!!>===a##c[ff/))@@@@@/fc=!^699~+6;||%%17!!>=aa#a#ccc[ffff/ff///////f//ffffffffffffff/////))@@kkk}0n00n{n{{{{n00@)fc#a#aacc[//)))@@@@@@@kkkkkkkkk}kkkkkkkkk@@k@@@@@))/f//[[[ccc#aa==>!!]771%^^5;6+~9_b",
+"+6;55|^^1177!!==a##c[[a6illl$$::i3&ee<d**b__9~++;;;||^%1177!!!==##c[[f//)@@@@))/[ca!1%56+6;5|^%17]]!!>=a#c[c[ffff//////)))/)///////))/)))))))))@)@@kkk}}}}}000nn0n0nnnn{nn000}k}}k@kk@kkkkk@}k}k}kkkkkkkk}kk}kk}kkkkk@kk@@@@@)))///fff[c[c##a==>>!]]71%%^|;;6~9_",
+"++6;55|^%%7]]]!>=a##[c#1d$2l$jj:i333ee<<**b_99+++;;5|^^%%1]]!!>=aa#ccff/)/))//[[#=>7%|5;;;5|^%117]!!==aaa##c[[[[ff/f////////))/))))//)))))@@)@@)@@@@@k@k}}}}0000nnnnnn{0{nnnn0n0}}}}}}k}kkkk@k@k@kkkkkkkk@kk@kk@k@k@k@)))))///f/fff[[[cc#aaa===>!!]7771%^||;6+~_",
+"+66;5|^^%177!>>>=a##[[[>~illljjji33&e<ddb*_9~9~+6;;5|^^%117]!>=a##[[f///))/)/f[#=!!1%^|5|||^%%17!!>>==###ccc[fffff//)//))))))))))@@@@)@@@@@@@@k@@kkkk}k}}}}}}00}000n00n00}00}}}}}}kkkk@k@@@@@@@k))@@@@@@@)@@@@k@k@@@@@@@@))))/f/fff[[[ccc#a#===>!!!]77%%^^55;+~9",
+"+66655|^%%17]]!>==#ccc[#|&ll$$j::i3&ee<ddbbb_9~++6;55|^%17]!>>=a#cc[ff///ff[[#a=!!%1^|5|5|%%%7]]]!!==aaa##ccc[[fff//f/////)//)))//))))))@))@)@)@@@@@@@k@k}}}}}}000}00000}00}}}}kk@kk@@@@@)@)@@))@@)@))))@@)@)@))))@)))))/)//f/fff[[[c[##a#a=>=>>!!]7711%^||5;6+~",
+"+66;55|^%%17]!!>=aa#c[fc7b$l$$j::33&ee<d**b99~++6;;5|^%%77]!===##[f[/////ffcc#=>!]1%%^|%^%^1%1]]!>>>>a#a#cc[[[[ffff////))/))))/)@))))@)))@)@)@@@@@@@@kkkkkkk}}k}}0}00}}}kkkk@@k@@)))))/)))))))))///))))/))))))@)))))))/)////fff[[[[cc#c#aaa==>!!!!]]7111%^||56++",
+"~~66;5||%%17]]!>==##cc[f=+i$l$jj:ii3&ee<<*bb__9~+6655|%11]!!>=##c[[ffff[[[c#a=>!77%%%%^^^^11777]!!>>a==###c#c[c[fffff/fff/f/////f//////)////)//)//)@@@@@k@}kkk}}}k}}}kkkk}@@@@)@@))//))/////////)///f/////f/////)////f/ffff[f[[[c#c#a#aaa=>=!!!!]77711%^^||5;;6~",
+"++6;55|^%%17]!!>=>a#cccf[1<$$lj::i33&e<d**b_99~+6;;|^^%17]!==##[[[ffff/f[ccaa>>!771%%%%11%1177]!!!>>=aaa###cc[[[[[fff/f///fff///f/f/f/f//////)/))/))@)@@@@@kkkkk}kk@kkk@)@@)@)//////ff//f//f//ff/f[/fff[fff/ff/////////ff[f[[[ccc###aa===>>>!!]]]7711%%%%^^|5;6+",
+"~++6;5||^%117]!!=aaa#[f[[!~j$$$j:i3i&ee<ddbb_9~~+;55|%17!!=>##[c[fffffccc#aa>!]!7771%%^%%1%77]]]!!>>>>=>=a#a##c#cc[ccc[[[c[[[[c[[c[c[[[[[fffff/f////))))@@@@@@kk@k@k@@)@@)/)/////ff//f[ff[[ff[f/[ff[[[[[[[[c[f[[[fff[[[[[ccc##aaaa=>>=>!!!]]]]771%1%%%%^||55;;6+",
+"~~66;55^^%11]]!!>=a##cf[f#|&$$$j:i33&e<<ddbb9~++6;||%%7!!=a##[[ff/ffff[cc#aa=>!!]777711%111177]]!]!>>===a=aa####c#ccccc[cc[cc[ccc[[cc[[[[[ffff/f//)/)))))@@@@)@@)@)@)@/f///ffffff[c[[f[ffffff[[[[c[[[[c#ccc[c[[[[[[[[[ccc###a#a===>=!>!!]]]71111%%^%^^|^||5|;66+",
+"9++6;55|^^%17]!!>>=##ccff[]_j$ljj:ii3&e<d**__~~6;5|%%1]!>=a#ccf[fff[[[[c##===!]!771111%11111717]]!!]!]!>>=====a=aaa###aa##a#aaaa#a##c#cccccc[[[f/ff//)))))))@@@@@))//f//fff[[[c[[f[[[[c[[ccccf[c[[[cc#cc##a##a###c#cc##aaaa==>>!!!]]]77711%%%^^|^|||55|5555;;;6+",
+"9~+6655|^%1177!!>==#accf[f=;&$$j::i3&&ed*b__9+6;||%1]!!=a##[[ffff//f[[[c##a===!!!!]]77117111711777!]!!!!!!!>>>=>=====aa====aaaaa#a#####cc[[c[ffff//////)))@/)))////f/[[[[c[[[[ccccccc[c[[[[[cc[[[cccc#a#a#=aaa#a###aaa#aa==!>!]!]]777111%%%^^||55;;55;;;5;5;;;6+",
+"~+++;;5||^^11]]!>==a#c[c/f[7*j$$$:i33ee<d*b9++;55%%7]]==a#[cf[fff[[f[ccc##aa=>=>!]]7771117111717771777]7]!!]]!!!>!!>>!>>>>>>=====a=aa###c#c[[[[[[fffff/////)))f///ff[[[[[cccc#cccccccccc#ccc[[ccc######aa==>>=>=======>>!!]]]]7711%%^|||55;;;;6666++++66+666+++~",
+"9~++6;5|^%%17]]!!==aac[cf/[a+3$jj:i3&ed*b_9~+;5^%17!>=a#c[[[f////f[ff[[[####a==>>>!!]]771111%1%%%1%11111777]7]]]]!!]!!!!!!>>>>>==a=aaa###cccc[[[[[f//ff///f/f/ff[[[ccc################cccc[ccc#ccc##aa====>>!!>!!>>>>!!!]]]717%%%^||||55;;66+6~~~~99999~+~+++++~",
+"99++66;5||^111]]]>=a#a#[[f/#^<j$::i3&e<db_~+;5^^%]!>>a##cc[f[fffffff[[cc[c#aa===>>!>]]]]77111%1%%^^^^%%%%^1%1%111177777]!]]!!!>>>>=aaaaa###ccc[[[[[[[ffff//ffff[[[cccc####a###########a##c#ccc[##a#aaa==>!!!!]]!]]!!]!]7771%%^^||5|5;;6++++99999_bbbbb_bb999~~99",
+"~~+66;55|%%%77]!>>==#cc[[[ff>~ijji3&ed*b9~6;5^17]!>=a#cc[fff//ff//fffff[[[ccc#aaa===>!!!]]7]71%%%^^||||^^^%^%%%111117777]]]]!!!>=>==aa######ccc[[[[[[fffff[[[ccc####a#aaa#aaaaaaaaa######cccc##c#aaa==>=>!!]]]7]]7]]]7771%1%%^|||;;;66++~9~99bbbb****d***bb__99_",
+"_9~~6;65||^%%77]!>>=aa#cff[[a5<j::i&<d*_9+65|^17!!=aa##[[[fff//////ffff[[[[ccc##aa===a>>>!!!!771%|;;;;5;555||^^^^%%1%111777]]!!>!>>=>===aa####ccc[[[[[[[[[[[ccc####aaaaaa====a=aaaaaa####ccc#c#aa#===>>!]]77111%711711%%%%||555;6;6++~~999_b*b*ddd<eeeee<<dd**bb",
+"99~++;;5|^%%%77]!!==a#ccc[f[c793i3ee<*_~+;5^%1]!>==##c[[[f////////)/////ff/[[[[[c[cc##aa#a====>>!7^5;6;;;55||||^^%^%%1777]]!!!!!>=>===aaa#a#####cccc[[[[c[cc##aa=a==>>>>======a===aaa###c####a##=a>==>!!!]]7111%111111%%^^|||5;;666++~~9___b**dd<<<e&&&&&&<<<d*d",
+"_9~~+6;;55|%1177]>>>aa#c[[cca!6ei3&<*_9~65|^17]!>>a##cc[f[[ff/////////////f//ffff[f[ffff[[f[[[cc##]5+++66;6;555|5|^^%%%171777!]!!!>>====aaaa#####cccccc#c#ca#aa==>======>=>======a=aaaa##c#####=a==>!!]]7111%%^%^^^%%%^^^||55;;;6+~~99__b***dd<ee&&333iiiii3&&e<",
+"_9~++6;5||^^117]]!>==aa#cccc=]|b&&<*b9+6;|%%7!!==###c[[[f//////)))/))))@)@))))@)))@))))))))@@@@@))f!|6++66;;;55||^%%%%%1777]]!!!>>!>>====aaaa####ccc#c###a#a===>=>!!>>>=!>>>>>>===aaa#####caaaa===>>!!!]711%%%^%^%^%%%^||5|5;;;6++~~99__bb*dd<<ee&&3iiii:i::3i3&",
+"__9~++6;5||%%%77!]>>=a#c###=!%;_<<d*_9+;5^^17]!>==a##c[[f[f/f////))/))))@))@@@@@k@@kk}}}}00n00n{nn0/>5+++++6;;;5|5||^%%%%177777!]]!>>>======aaaaaaa##a##aa====!>!>>>>!!!>>>>=====a=aaaaa#cac#aa==>>]!]7771%^|||5||^^^^^|5|5;;6+++~~99__bb*dd<<e&&3iiijjjj$jj$j::",
+"__9~+66;5|5^%177]!!>=aa###==]|6~*db_~+;5^%7]!!>=a###cc[[fff///)))@@)@@@@kkkkkk}}}}}0}0nn0{n{ooo'qqqoka^++6+66;;5|||^^%%11177]]]!!!!!>>>====a=aa######aa===>!!>!!]]!]!!>!>!>!>>>===a=a#####a##===>!!]!]71%%%%||||||||||||55;;66+++~~99__b**dd<ee&&33ii:jjj$$$$l$j",
+"b_99+~66;5^^%%1]]]!>==#a#=>]1;+_b*b9++6||%%7]!!===##ccc[[ffff/////)))@)@@@@kkkkk}}00nnn{o{o''qqqq-ggq}a|6~+66;;555|^^^%%%1117777]!]!!!>!=>===aa==aaa=====!>!!]!!!!!!!!]!!>!>>>>=>a=aa=#####a===>>!!]7771%^||555;5;5||||55;6666+~~9__bb****d<eee&33i:jjj$ll2l2l2l",
+"__99++6;;;||^%%7]!!>==aaa=>1^;~__99~+;|^%17]!>>=aa##cccc[[f/f///)/)))@@)@@@kk}}}0}0}0nnnooo'qq--ggs88gn#%;+66;;555||^^%%%11177]]]!!!>!>>>>>>==aaa=====>!>]]!!]]7]7]]]!!!!!!!>>>=>===aaaa##a#a>=>!!!]71711%^||55;5555|5555;;6++~~~999_bb*ddd<ee&&33ii:j$$ll22mmmm",
+"*b99~++6;55^%^117]!!>==a=!]^5+9___9~;;5|^%7]]]!=>==aa#ccc[[c[[[f[fff/ff/)))@@)@kk}}000n{{o'''q-g-sss88g0#^;+666;555||^|^%%%1171777]]]!!!>>>=>>>=>=>=>!!!]!!77]7]]]]]!]!]!!>>>>>>=====a##a#a===!>!]]771%^^|5|;;6;6;;;;5566;6++~~~99_b*b*dddeee&33i::jj$l$l2mmmm((",
+"_b99~+6;;55|%%1177!!>===>!7^5+~99~++;5^%117]!!>==aaaaa###ccc[[[[[[[[fffff///)@@@@k}}000n{{o'qq-ggg8888vsn#%;6;;;55|||^%^%%11177]]]]!!!!!!>>>>=>=>=>>!!]]7777777177]]]]]!!!]!>>========a#aaaa==!!!]77711^^^||5;;;66;;;;;;66++++9999_bb**dd<<ee&33ii::j$$l22m(((pp",
+"*b__9~~+;;55|^%11]!!>==>!]%56~~~9++6;55^^1777!]!>>====aaaaa#a#a####cc#c[[[ff/f/)@@kk}}nnn{oo''q-gggs8vvvs{c%;666;;;|5||^^%%%%1111177]]]]!!!>>>>>>!!]!]]77771777]]]]]]]!!!!>>!>>>>====aaaa#a==>!!]7711%^%^|5;;;6+666;66;;6++~~999bbbb**<d<<&&333ii::j$$l222m(p,p,",
+"bb9_~+++;;5||^%117]!>===!7%56+~~+66;5|^%%17]]!!!>!!>=>>>========aa=aa###cc[ff//)))@k}}0n{{oo''q-gss8888vv8{c%;;;555|||^^^%%%%17777]7]!!]]!!!!>!]!!!771771171711777]]]]]]]!!!>>>>>=====aa=a=>>!]!]]7111%^|||5;;6+6++;;6666++~~~99_bb**dd<<eee&33i::j$$$llmmm((ppp",
+"**b999++6;55^^^%7]!!>>>!]%|;6~~+~+;;55|^%1%17777]]!]]]!]]]]]!!!!!>>>===###cc[ff//@@k}}00n{{o'qqq--gssvvvuvs{c1;;6;;555||^^%%%1%11777777]!]]!!]]!]777711111111777]7]]!]]!!!!!!!>>>!!>===a#===>!!7771%%^^^||55;66+~+++++++~~~99_bbb**ddde<&e&33ii:jjj$ll2m2(pp,,(l",
+"*bb_9~++6;5;|^%^17]!>==!]1|;;+~++6;;||^^%%11177777771777777777]]]!!!>===a##c[[[//)@@k}}0n{oo''q--ggss8vvuuu8{[15;;;55|||^^^%%111111]7]]]!]!!]]]7]]1%1%%%%1%1111777]7!]]]]!!!!!!=>>>>>=>=a==>!]]]717%%%^^||555;66++++++++++~999__b**ddde<e&&33ii::j$$ll22(m(p(mi_",
+"d*b_99~~+6;5||^11]!!>>!]1^|;6++++66;;|5||%^^%%^%^^^^^|^^^^%%%1%177]]!!>==aac#[ff/))@kk00nnn{{'qq-ggs8888vuuu8o[7|;;555||||^^^%^%111117777]7777]7%%%%%%%%1^117777]]]!]!!!!]!!]!!!!]!>>>a====>!!]711%%%^||||55;66~~+~~~++~~99__bb***dd<ee&&&iiiij:j$$$l2m((pp(23~1",
+"**bb__~~+6;5|||%17!!>=>!7^|;+6+66;555||||^^|^^^|5||5|55|||||^%%117]]!!>==aa#ccfff)@@kk}}nn{o'''q--ggs8vvvuu.u8o)>^;5;5|||^^%^%%%%177117777]771111%%%%^^^1%1%1777]]7]]]7]]]!!!!!!!!!!>>=a=>=>!!7]711%%^^||||||5;+~~+~~~+~9999_bbb**d<d<ee&&3ii::j$$ll22mmm(($<6]>",
+"<d*b_9~~+6;65|%%1]!!>!]]%^5;666666;655555555;;;;6666+6;6;;5|||^^%%117]!!==a##[[[///@@k}00nn{{o''q--gsss8vvuuuuv')!|66;;5|5||^^^%%%%%1111711111%%^^^^|^%%^1%7177]]7!]]]]]]]]]!!]]!]!!!>=>>=!!!77111%%^^^|||555;66+~9~99999__bb***d<<<e&&33iii::jj$ll22mm(p($*|!aa",
+"***b__9~++;;55%%1]!!=>!71^|;;666;;;55555;;;66++++~~+++++66;;5||^^%777]!!==a##c[[f//@)@k}0nn{{oq'q---s888888s8--'}#%~b_9+;5||^%^%%%1111777171%^%%^|^^^^%%^1%717]]]]!]]]7]7]]]]]]]]]7!!!==>=>!!]711%%%^^^^^^^|5;;6+~9~99999__bbb*ddd<eee&333i:::j$$$2lmmm(mj*^>aaa",
+"<d*b__9~~+66;||%7]!!>!!7%^5566;;66;;;;;66+~~99____9_99~~+66;;5||^%%17]!!>==a##c[ff//@k}k}00{o{oqq-ggggsgsqo0@@f[c=^_3ji&<b~65|^^%%^^%%%%%%^%%%|5|^||^%%%1%11]7]]]!7]]7]7]7]]77]77]]]!>>>=>!!77711%%^^|||||||^|56+~9_9_9__bb**ddd<<ee&&333:::j$$ll22mm((li_^=#aa=",
+"<d**b_9~~+665|^%1!>>>!]7%^5|5;;5;5;55;;66~9_b_bbbb_b_99~~++6;;||^%1177!!>===##ccff)/))k}00nn{oo'qq-gg--{}/ca>!]]]]16d$ppmli<_65|^%%%%1%%%%^^||||5|^||^%%111177]!]!]]71717777]77717]]!!>>>>]!]7711%%%^^%^%%^^^|;6+~999____bbb*ddd<<ee&&33ii:jj$$$ll2mmml&+7=##a==",
+"<<dbb__9~~+6;5^17]]!]!]1^^|;;5;65;5;;;;6+9*dd<dddd*bbb9_9~+66;;5|^^1177]]!=aa#c[cff))@@kk}0n{{oo'qqq'{)#>77%11177711;*j,hh,($&b+5|^^%^%^^^||5|5||||%^^^%%777]]!]]7]7777777711111777!!!!>>>!]771%%%%^^||^^^%%^|5;6~9_b_b_***dd<<<e&&&3ii::jjj$$ll2mmm2$<6]aaaaa==",
+"<<d*b___~++655^1]!>=!!]7%^^|555555555;5;6+bd<<<<ddd*bb999~+6;;5||^^%17]!!!>==a#c[ff/)@@k}00nnooo'''{@c!1^^%^%%1177771|9ip4t4hpl3*65^^^|^||5|5555|||^^%%1%17]]]]!!777111111711111%177!!]>!!!]7771%%%^%^^%%%%11%|5;+~9__bbb**ddd<ee&&33iii::jj$$l222mlib^>#c##a==>",
+"e<dd**b99~+;;|^%7]!!!]]1%^||5555;5555|5||;_<&&&eeeddd*b_99~~+;;;||^^1117!!>=aa#cc[[//)@kkk00nnooq'nf>%|5|5|^^%%11777]1%+e2r4tth,$&96|5|5555;;;5||||^^^%%1]7]!!]]]]77717111%%%%%%11177]>!!>!]77%%%^%^^%%%%1111%^56+9_bb**dd<<<eeee&333i:j:j$lll22m2$&~1=####a==>>",
+"<edd*bb99~+6;|%1]!!!!]711%^^|||||||^^^%17]5_&&&ee<<d**b_99~++6;5||^^1177]]!>=a##c[[f/))@k}}0{{o{{}[]|5;5|||^%%%11777]7]1|b:p4ttthmi*6;5;;6;;5;55|||^%^%1177]]!!]7711%%%%%1%11%^%%%1]]]!!]!!771711%%%^%%7177171^|5+~9bbbb*dd<<eee&&3iii:jj$$$ll2l$ib|!acc###===>!",
+"&<<d*b_b_9+65|^1]]>!!]71%%||^5||||%^%7]!!=!6d333&&<<d**b__9~+666;5|^^%17]!!>===##c[ff/)@@k}000{{}[75;;5;5|^^^^%%%1777]]]1^+<$,4t4h,$e~+6666;;5|5||^^^%%17]!]!!!]]11%1%%%%^%^^^%^%11%7]]!!]]]71%%^^^^^^%%177]711|56~_bbdd<d<ee&&&3iii:j:j$$ll22lje+1=ccc##a==>!!!",
+"ee<<ddb__9++;|%1!!>!>!]71%%^%^^%%%11]>=#c[[]~e3&&&<dd*bb_99~+66;5||^%%117!]]>==###[ff/)@@k}0nn0}c7;6+6;555|^^%%1111777]]]]159imhtt4rl&_+++66;5|||||^^%1777!!!]!]7%^^%%%^%^^^^||^^^117]]!!]]771111%%%%177]!!!]77%|;+9b*ddd<<ee&&333i::::j$$lll$3b|>cc[cc##a===>!!",
+"eeeddbbb_~+65|%1]!!>]]711%%^^^%^%%7!!>ac[f/[1b&i&e&e<<dbb__99~+66;|||%^177!!!===#ccc[ff)@@k}}00/]6+~66;;5|5|^^^^%%11177]]]!71;*jph4hr2&b~+;;555||||^%%117!!>!>]71%%%^^|^|^^||^^||%^177]]]]7771%%^^%%%11]!!!!!]7%|569_bd<ee&e&333ii::j$$$l$l$je+7acc[cc#a===>!!]]",
+"&ee<ddbbb9~+5|%7]!!>!!]7111%%%177]!>a#cf/)@@c|*33&e<<d**b_9~~++;;;5||%1%71]!!>==aac[ff/)@@k}00)>5++++6;;;|||^%%%%1171777]7]]]7|~ej(,p2:d~+6;5|55||^^%^11]]!>!!]1%%|||^|^|||^55|||^^^177!!]]711%1%%^%117!!!>>>!]]%|;9bb*d<eee&333i:::jj$$$$:e~^=cf[[cc#a#a==>!!]]",
+"&3ee<d*b_9~6;|%1]]>]!]]771%%%1%1]]!aac[//))@/>+<33&&<<d**bb_9~++6;;5||^%177]!!>=a###c[f/))@k}k[1+99+666;555|||^%%%1%17177]]]]]71|9&$2$id96;5|55|5|5^^11]!>>>>!77%^|^|||5|5|5||5|||^%17777]111%%^%^%%%7]]>==a=>!7%|6~_*<<&e333iii::jjjll$$&_|!a[[[[c#a#a=>>>!]]]1",
+"3&eedddbb9~65^%7!!!!!!]]771717]]!>=##[f//@kk}f]9e3&ee<dd*b__9~~+6;;55|^%%%7]]!!>=a#c[[f/)@@k}@a5999~+6;6;55|^^^%%%111117777]]!7]]159d<<b+;;555;|||5^^%17]!==>]1%^|5||5|5555;;5;;|||%%177]]77111%%%%11]!>=aaaa=>!7^5+9bd<e&333ii:::jjjj:&*5]#fff[[ccc#aaa=>!!!]77",
+"33eee<d*b9++;|^7]]!>!]]71771177]!==#[[f//@)kkk[%b&3&&e<dd**___~~~6;;55^^%111]!>>==aa#[[ff)@@kf7~99~++66;;55|||^|%^%%117177]777!]777^5++~+6|5555555^^^17!>==a!!1%^|5;5;;55;;556;5;5^|%17717711%^^%^^%77!>==aaa==>]1|+_*<e&&3ii:j:jjj$:&*;7=[fff[[ccaaaa=>>!]]]77%",
+"33&eedd**_~65^%7]!!!>!!]]77]7]!!=a##c[f/)@@@k}k#|*&&eeed**bb999~+66;55|^^%117]]]==aa#c[ff/@)@#^9__9~++6;;555^|^^%%%%%%711117]7]]]]!71^^|5;555;;;5;||^1]!=aaa!7%^|55;;5;;5;66;6;;;5||^%7777111%%%%%%1]!>=##c#c#a=!1^6~bd<&33iii::jjieb5]#f//fff[[cccaa===>>!!]71%",
+"i33&eed*__9+;|%7]!!!!]!]7777]!!>>=#c[[[//))@k}k@>+e&3&e<<d**b_999~+6;55|^^%117!>!>=a##ccf//@)#5_b99~~666;55|5||^^^%%%1%111711777777177^^||5;;5;;;55|%%]>a##=>]%||5;;;6;;66;;6;6;;;5^%%1%111%%%^^%%11]!==a##c##a=!]%5~_de&3:i:jj:3e_5]#f/f//f[ccc#aaa>=>>!]]711%%",
+"i3&eee<db_~+;|%7!!!!!!!!!]]]]!>=aa##c[[f/)@@k}}})!9<&ee<dd**b_99~~+66;;5|%%%177]!!==a#cc[f/)/a;_b_~~++6;;;5||||^%^^%^%%11%77117]777111%^||;5666;;555%1]>a##=!1%5;;;;;66;6666+++66;55%%17117%%%%%%%17]>a#ccccccc#a!756_*<&3::i3&*+^!#f/))//ff[[c###aa=>!!!!]]7%%^",
+":ii3&<<d*_9+;|%17!!!!]]!]77]]]!>=aa##c[ff//)@kk}k[1*&3&ee<d***b_9~+~665|||^%%11]]!>>=aac[[///=;bb_9~~666;;55|||||^^^%%%%%1%%1111111%%^|||;;6;;66;;5^^7>a#[#=!1^55666+66+6++++++666;||^%%1%%%^^%^^^11!>=##[[[[cc#a>7^+9*<&33&<_51=cf/))/ff[[c[####a=>>!!]]]11%%|5",
+":i3&&eedb_~+5|%1]!>>>!!!!]!!!>=>=aa#cc[[f/))@k}}}kc|b&&&e<d**b_999~~666;5|^^%11]]!!>==a#cc[f/=5bb_9++666;5555||^|^^^%%^%%111111711%^%||5;;;6++6+66;|%7!c[f[=]%|;;666+++++++~+~~+6665|^%%11%%%^^%%%7!>a#c[[[[[[[c#a!7|~bdd*_;%>c/)@@))///f[[[[c##aaa=>!!]]771%^|;",
+"iiii3e<ddb9~65^17!]!!!]]]!]!!!>====aa#cc[ff/))@k}}@a;d&&eee<d**b_9~+~66;;55^^%%117!!!==a#c[ffa59__9~++6;;;;55|5|^|^^|^%%%^%%%%%%%^%%||5;;6+++6~6+;55%]=#ffca]%|;666++++~+~~~~~~~~6;;5^%%%%%%^^^%%17]>=#ccc[[cc[cc#>]|;+~6^!#f/@)@))/f/f[[[c##aa==>>>!!!]771^^5;;",
+"::ii3&ed*b9+5|%17!!!>>>!!!!!>!>=>==aa#ccff/))@kk}}0@=+d&&e<dd**bb__~~+6;;55||%%177]!!>==a#c[[#%9_99~66;;;55|5|55|||^^^|^%%%^1%%%%^|||;;;+6~+~~~+++;5%!#f@)fa!%|;6++++~~~~~~~9~~~~+65||%%%^%%^^^^%1!!=#c[[f[ffff[[[a>]7]>af)@kk@@@)))//f[[cc####==>>!!]]7111^^5;+",
+"j:i33&e<d*_+6|^177]]!]]!]!]!!>!!>>>>aa#cc[ff/))@k}}k/]~<&e&edd**b_99~+~+6;55||^%%117]!!>=a##[c7+__+6+666;;;;555|||^|^^^^|^^%^%%^^||5;;;++~+~~~~~++;|1>#@}{0@c>7^56++~~9~99999_99~+66;||^^^|^|^^%%7]>a#c[[[[cc[[f[[ccc[//@kkk@@@))//ff[c[cc##a====>!]]]771%^||6++",
+"jj:3iie<*b_~65^1]!!!>>!!!>!!!>!>>===aa#cc[[//)@@k}}0}/!+<eee<d**bb___~~+66;;|||%%1177!!!>>=a#a!|++~666;;;;555||5|5|55|^^^^^^^^^^^||;66+++~999_99~~65%>[}{q-qo})c=!1|5;+~~9999_9_9~6;;||%%%^^|%^%%7!=#c[[[[[f[f[f//)@@}}}}kkk@@@))//fff[ccc##a==>>!!]77711%^|56+~",
+"$j::3&&e<b_~65^%17!]]!!!!]!!!]!!]!!>==aacc[[f//)@@}k}kf%be&eee<ddbb_99~++6;;;|||^%%1177]!>>==a>%56;;6;;;;;;;5;555|||^||||^^^^||5556;+++~999999999+651=f}'s8v88-'{})f#=]7^5;66+9~~++655|||||^||^^1]>=a#cc[cccccfff)@@kkk}@k@@))//ff[[[cccaa==>=>>>!!]7711%^|;;+99",
+"$$jj:3&edb9~65^%77!!!!!!!!!!!!!!!!!>==a##[[ff//)@@k}00}c^be&e<<ddb*b999~+~66;55||%%1171]7!]!]!!1^;;;;;;;555555;5555555||5|||^|||;;66+~999______99~+51=)n's8vvvvv8sgq'{}}/cc#=71^||55|||^^^||^^%%7!=#c[[[[[[cc[f//)@@kkkk@@)@)///fff[ccc###aa=>>!!!]7711%%^|;;+9_",
+"$jj:ii3e<db~6;|%17]]]]!]!]]!]]7]]]]!>==a##cc[f//)@kk}}}k#|bee&e<dd*bbb999++666;5|5|^^%1177]7!]7%||55;;;;;6;;;;5555|5|||5||||555;;6+~~~99___b_____~6|7#){-s88vv8888s8sss--'oon@fc=71^|5|^|||^||%1]!=#[[[cc##cc#c[f//)@@@@@@@)///f[[ccc#a#a==>>>!]]7771%^%|556+~__",
+"$jjj:33&<*b~65^%77]!!!!!!!!!!]]]]]!!>===##c[f[//))@kk}0}k#|*eeee<d**bb_999++6;;;5|||^^%%117111%%^55;;;;;;;;;;;;;;;5;;55555||55;;66+9_____b_*bbb_996|7c@{qg8s8v888v88s88ssssg-{0kfa]%%^|^^|||^^%1!=a#cc[c####ccc[f/))@@@)@)))//fff[[c###aa==>!!!!]]1111%%|5;6+9__",
+"ll$j::3&<d_9+;|^%17]!!!!]]]]7]77177]!!>==a##c[ff//@)k}}00@a;d&ee<ddd*bb_9~9+~++6;;5||^^%%%%%%^^|||5;;;;6;6;;;;;5;5;55;55555;;;66+~~999bbbb*bbb_b_9+|!c}'-ss88s88ss8s8sssssgg-'{@fa]7^|^||||||^%7]>#c[[cc#a#=a#c[[ff)))@)//fff[[[cc#c#aa==>>>!!]7111%%^|55;6~~9_*",
+"ll$$::33<d_~+;|%1777]]]!!]!]7771]77]!!===a##[[[f//@@@kk}0})!+de&&edd<**b__9~~+666;;555|||^^^%^^5||5;;;;;;;6;;;6;6;6;5;;;5;5;;;+++9__bbb*******b*_9+^>f0'-gs88ssssssggsgggg-g-'{0)[=!1%%^^^|^%%1]>ac[[[c##aaaa##[[f//))))///ff[[[cc###aa==>!!!!]]771%%^^55;+~9_bb",
+"ml$l$:i3ed*_+;5|%17]]]]]]]7771%1%177]!!>>aa##c[[/f//)@k}}0}/]~<ee<<<*dbbb__99~~++666;555|5||5|||;;;;;;;6666666;6;;;;6;;;6;;;6++~_99bb********bb__9+|=)nq-gsggsssggggs-ggggg-q'{}@[=!7%%^^^^^^^7]=a#cc[#aa====aa#c[[f////f/[f[[ccc#aaa=>>!>!]]]711%^%^^556++~9_b*",
+"m2l$$:33edb9~65^%%77]]!]]]7771111177]]!>>=aa##[[ff/)@@kk}00})]+<&&ee<<d**b__999~++66665;555|55;5;;;;66666;666+66666;66;;6;666+~~9bb*b**dd*dddd**b9~^=)nq-gsgg-ggggg-g----q--q'onkfa>]1%%^^^%%1]!a#[[[c#aa==>=aa#[[ff////ff[[[cc###aa===>!!!]]]711%%%^|5;;+~99_**",
+"22l$$::i&<*_~65|%1%77]7]777111%^%^%17]!]>=>=a##ccf///))kkk}0})]+<e&eeddd***bb_9~9~~+666;;;;;;;5;;;66666+++6++666666+6;6666++~~9_bb**dddd<dd*d**b__+5ako'qg-gggg---------q-qqqo{0k/c=!71%%%%%%1]>acc[c##a>!>>>==##c[[fffff[[cc###aa==>>>!]!]]111%%%^|55;6+99_b*dd",
+"mm2l$j:3&<*_~6;|^%1777]7]771%%%%%%1117]!!===a##[[[[//))@kk}0}0/]+deeee<<d**bb__9~~~~~++6++66;66666666+66+++6~+++++6+++6666++~9__b*d*d<dd<d<<<d**__+|=koqq----q---qq-qqqq'q'''oon0@fa>!711%%17]!=ac[[[#a==>!>>==a#c[[f[f[[[[cc###a====>>!]]7]711%%^^||55++~~9bb*d",
+"mm22$$::&<db9~;5|%%11777111%^^||^^^%177]!!>==a#a#c[ff//)@kkk0}0)]~<&e&<<dd**bbb___~~~~~~66++++6+++++~+~~+++~++~+++~+++~++~~~9__b**d<dd<<<<<dd**bb995=k{'q-q----qq-q'qq'qq''''o{nk)[#>]]1111117!>#cc[#a=>!]!]]>>=accc[[[[c##aaaa===>>!!]!]771%1%%^^||56++~9_bbbd<",
+"mm22l$:i3<*b~+65|%%11777711%%^^|^^%%177]!!!===##cc[ff/))@@kk}}0})]+<&&ee<<dd***____999~~~~+++++++++++++~~~+~++~~~+~+~++++~~99bb*ddd<<e<<e<e<<<dbb996!ko'qq'''qqq'q'''q'o'o'ooo{{}k/ca>!]7777]!>ac[[cca=!!]!!!!>=a#cc[cc[ccc##a===>>!!!]]]7711%%^|||5;6++~9_b**dd",
+"p(mml$$:3&<*_~6;|^%%11711%^%||5|5|^%^%117]!!>==a##cc[ff//)@kk}}}k)]~d&3e&<e<dd***bb_9999~~~9~9~~9~9~9~9~~~9~9~9~~~~~+~~~~~_9bbd*d<<<<<eeee<<<dd*__9;]@oo'qqqq''oq''''oo'o'o{o{{00k)[#>!!]7]]]!=a#ccca=>!]777]!!>=a#c#cc##aaaa==>>>!!!]7711%%^^^|||;;;++9__bb*d<<",
+"((mm2$$:3e<b_~6;||%%%1111%%^||5||5|^%11]7]!!!==a##c[[fff)))@@k}0}}/]+<&&&e<<<dd****bb___999_~~9~9~9~9~999~9999999~99~9~~99__bbd<<<<eeeeee&ee<<d*b__67){'''o''''oooo{oo{o{{o{{{{n0k)fca>!]!]!!>=#[[[c#=!!]717]!!>a###ccc###a====>!!!!]]77111%%^^^||5;6++99_b**dde",
+",p(mm2$ji&<d_9~6;5|^%%11%%^||55;;5|^^^%177]]!>===a##cc[ff/)@kkkk0}}/!+d&&&&&<<<<d*b*bbb_bb_9__9_9_9_9_999_9_99999_~9_99___b**<d<<eeeeeeee<ee<d<**_9~%fn{o'oo{ooooooo{{ono{n{nn00}k@fca=!!]]!>>a#c[c#=>!7711117!>>=a#a#a#a====>>]!!]77111%%^%^^|55;66+9~9_b**dd<e",
+",p(m2l$ji3<d_9+65|^^%%%%1^^|55;5;55|^%%117]!!!>==aa#c[[fff//)@k@}k}k/>5b&&&&e<<<d<dd***bbbb_____9___9_b_9_9_9___9__9_999__b*d<<<<ee&ee&&&&&&e<d*bb_~^[n{{o{ooo{{o{{{{n{nnnnnnnnn0}@)fc#===>>==##[[c#a>!7711717]!>=aaa#aaa==>>>>!]]]77711%%%^^|||5;6++~9__bbdd<<e",
+",,p((2$$:3e<*_~+6;5|^%%^^^|556;6;;;|||^^1177]!!>==aa##cc[f/)))@kk}00k)a5*&3&&&e<ed<ddd*d*bb***bbbbbbb__b________b_____b_b**<dd<eeeeeee&&&&eee<d*b__9|[}{oo{{{n{{nnnnn{nnnnn0000n0}@/[ca=>>>==a#cccca>]71%%%^17]]>>=aaa===>>>!]]]]]771%%^^|^||||;;;6~~_9bb*dd<<&&",
+",,pp(2l$:ie<b_9+655|^%%%^||5;;666;;5||^^%177]!!!=>aa##cc[f[f/))@@@k}0}k#|b&3&&&&&<<<<dd*d***bb*bbbbbbbbb*bb**b_bbb____bbb**deeeeeeee&e&&&33&ee<dd*b_;aknn{{{nnnnnnnn00n000n000000}})f[c#a===aa#[[[c#>!7%%^%^117]!>==aa==>>>!!!]]77711%%%^^^||||;;6++~9_bb*dd<<ee",
+"r,,p((2lji3<db9~+6;;5||^^|55;666+6;;55|^%%%177]]!>>>a##cccf/ff/)@kkkk}k@a|*&3i&&e&ee<<<<dddddd*d******b*b*bbbb*bbb**bb***d<e<eeeeee&e&&&&&&e&e<dbbb_+!@0nn00nnnnn000n000}}}}}}}}}k@)/[c#aaa###cc[c#=>]7%^^|^^%1]!>>>>=>>>!!]]]777%%%%%^|^||||5;;6++99_bb*dd<ee&3",
+"r,,,(m2$$i3ed*9~+655||||||5;;6+6+66;5|||^%117]]]!>>==a##ccc[ff///)@kk}}}@c%9ei33&3e&&ee<<<dddddd****dd**bd******bbb*bb**dd<ee&ee&&e&&&&3i33&&<<<d*bb+])00nn0000}0n0}0}}}}}}}k}}}0}k@)f[c##a#cc[[[c#=!]1%^^^^%%17!!>>>=>>!!!!]771711%%%^^||||55;66+~9__bb**<<ee&&",
+"hrr,ppm2$ji&<*b9~+6;5||||5;6++~~+~+;6;5||^^%%17]!!>>>==aacc[[ff/))))@kk}k)[7~<33i33&e&e&eeee<<<d<<<<*ddd<*d**dd**dd*dd<d<eeeee&eeeee&&&&&33&&&<d*d*b~])0000}00}0}k}}k}}kkk@kkk}}k}k)/fccc##a#cccc#a!]1%^555||%177]!!>!!]]]771711%%^^|||||||55;;6+~~__**d<<<e&&&i",
+"hrr,,(m2$:i&<db9~+6;55||55;;+++~+++66;55|^%%1177]]!!>==aa##c[[[[f/)@@@kk}}@f7~<3ii3i&3&&eeeeeee<d<<<<ddd<d<<ddd<*dd**d<<<e&&ee&eee&ee33iii3&&ee<<dd*97f}}}}kk0k}}}k}k@}kkk@@@kk}}}}@@)f[c[[cc[[f[#a=]1%^||5||^%7]!!!!!!!]]]7171%%%%^^||||||55;66+~99_bb*dd<ee&&3",
+"prrr,p(2l$iie<*b9~++6;;55;;6+~~9~9~+6;;;|5|^^%%71]!!!>==aa###cfff////))@@k}@/>;d&ii3i33&&3&&eee&eee<<e<e<<dd<<dd<<d<<<<e&eeeee<e<&e&&&&333i33&e<<d*<97/}k}}}}k}kk@kk@k@@@@@@@@@@@kk@)ff[[ccccc[cc#=!]%||5;;;5|^%17]7]]]771111%%^^^||5||555;5;66+~99b*bddde&e&3ii",
+"imrr,,(m2$:3&<*b_9+6;;;55;;6+~~9~~~++6;;5||^%%%177]]!!>>=aa###c[[f//))@@@kkkk/a5b3:iiii333&3&&e&&e&&e&<eeee<<e<<<<<d<eeee&&&e&ee<eee&&3iiii33&e<<<dd_1fkkkkk@@kk@@k@@@@@)))))@@kkkk@@//[f[[[[[[[c#=!]%^|;;555|^%1]]]]]]77711%%%^^||||5|55555;6++~99_b*dd<<e&&&3i",
+"63(,r,p(mlj:3ed*_9~~66;;666++~99999~+++;;;5||^%%%17]]>!>=>=a##ccc[[[f//)))@kk})#%9ei:::iiii3i333&&&eee&eeee&eeeeeeeeee&&&&ee&e<<e<eee&333iii3&e&e<e<97f@@@@@@@@@@@))@))))/)//)))@k@@))f/[[[[[[[cca!]%%|5;;66;||%%11777111%%%%^|^||5;555555;6;6+~9_bb**d<e&&33iii",
+"7~:,rr,(ml$i3&<*b_~~+66;;;6+~~9_999~+++6;555|^%%117]7!]]>=>=aaac#c[ff///))))@kk@[76<3::iiii3333333333&33&&e&&&e&eeee&e&&33&eeee<e<ee&33ii:ii33e&&eee_]f@@@@@@))@)@)/))))/////))@@kkk@)///fff[f[c#a>]%^|5;;66;5|%%17777771%%^^^||||55555|;;;;6+~~99bb*dd<ee&&333i",
+"!%b$pr,pm2$ji&<<*__~++66+6+~9___b___9~++66;5|||^^%%177!!!>=>==#a#ccc[[f//))@))@@@/>;d3jj::j:::i:i333333&3333&&3&&3&3&333&eee<dd<<<ee&&3i:::ii33&e&e<+!f))))))))/)//)f/ff/f/fff/)@)@@))//[f[[[[[ca=!7%^5;6+66665|^%%111%^^%^^||55;;5;5;;;;;;6++~9_bb*dd<ee&&333::",
+"!!|<2,,p(m$$:3ed*b_9~~+66+++~______99~++6;6;;||^^%%1717]!]>>=>a#a#cc[[[ff/f/@)@))@/#^_&:j:j:::i:::ii3iii33333333&&&3333i3&e<<<ddd<ee&3ii::::i33&&&&e~>/)//////////f////f/f[ffff/@@@@@@)//ffff[[c#=!7%^566++666;|^%%%%%%%^^|^||55;;5;55;5;;;6++99_bbbddeee&33i3i:",
+"!>]63(rrp(2$:i&e<b__9~+++++~99_bbbbb999~~+66;55||^^%%7777!]>>=>>a#a##c[[[f/)/)/@@@@)c1~<i$jjjjj:i::::iiiiiiii33iiii3333&ee<ddd<d<<<<e33:::::ii33333e~![/)////fffffff[[[[[[[[[[f//)@@@))/ffff[[cca!]%^56;+++~+6;5|^%%%%^^|||555;;;;6;6;;6;6++~~9_bbdd<<ee&33ii:::",
+"!!!19:p,p(2lj:&e<db_99~+++~99_bbbbbb_99~++6;;;55^^^%^%177]]]!>===aa##cc[c[[ff/f))))@)[>5b3:j$jj$jj::j:::iiiiiiiii3iiiii3ee<<d*d*d<eee3i::jjjiii333i&~>[ffff[/fff[ff[f[[[[[c[[[[//))@@)))//fff[[#a!!1^|;;++++++;55^^^^%^^|||55;;6;;;;;;;;;66+~99_bb*d<<e&&33iii::",
+"!!>!^*l,,p(l$:i&<d*b_999~~~9__bb**b*b_999+~++;6555|^%%%1777]!!!!>==aaa##c[[[ff//f)))))fa%9&jj$$jj$jjjjj:jj::j:::::i:ii3ee<d*b****dd<&&i:j:::jjii:i3e6=[fffff[[[[[[c[c[[c#cc#cc[[/)))))))//ff[[#a=!1^556+~~~~++6;5|||^||555;;666;666666;666~~99_b**dd<e&&33ii:jj$",
+"]!!>]5emp((2$:i&<d*b_99~9~~9__b*b*bbbb_99~~++66;55|||%%%1777]!!!>===aa###c[c[[[////)))@)[>5*i$l$$l$$$j$j:$jj::::::::ii3e<d**bbb***<<e3i:$$$::j::::i<;=[c[cc[[c[cc[cccccc####ccf[f))@)@))///f[[ca=!7%|;66+~9~~+6;5|||||||55;;;66666;;;;6666+~9__b*ddd<ee333i:::j$",
+"]]!!!1+3(,pmll:i&ed*bb__99_9_***dddd*bbb999~++66;55|||^%%%1777]!!!>=>=aa###ccc[[[[/f/////[=%9&j$l$l$$$$$$jjj$$j$jjj:i3e<dbb_bbbbb**<e3ijjjj$j::::::e5ac[c[[cccc[##c###aa#aa####[ff)))))///ff[[#a>]1^|;6~~~~99~~66;|5555;66666++66++6++66~~~99_*b*d<e&e&33i::j$$$",
+"77]!!>19i(pm2$:i3eddbb_9_9___b*ddd*d*b_b_99~+++66;;5|||^^%%7777]!!!>====a####cc[[cff/f//))fc!6<:$$2lll$lll$$$$j$$j::i&ed**b9_9_bb*d<e3i:$$$$$jjjjj:*%=#c##cc####c###a##a#aaa##c[f//@))@)//ff[[#a>]%^5;6+~999~~+6;;5|55;;;;6+++++66+;;666++~9__***d<<e&333:j:jj$$",
+"1]7]!]]|*l((m$$:3&e<d**bb_bb*bdd<<<<<d**b_999~~+66;;55^|^%%%1777]]!]!!====a###ccc[[c[fffff/f[a%9&$$22l2l$l2ll$l$jj::&ed*__9_9_99_bdde&:jj$l$$$$$$jib%ac###a###a#aaaaa=a====>=aa#c[///)/))//[cca=!7%|;++~~~9999~~66;;;6;66+++++++~6+++6+~~~___*b*<<<e&&3i:::$$l22",
+"17]]!!!1;el(ml$ji3e<d**bb_bb**dd<d<ddd*bbb__9~~~6+6;5;5|||^%%1777]!!!!!>=>=aa##ccc[c[[fff/f/f[c!5*i$m2lm2llllll$$jii&<*b99~~~9____*d&&:$l$ll$$$$l$i~]=####aaaa=aaaaaa=======a##c[f/)/))//fff[ca>!7%|56+~999_99~+666;;6;6+++~~+~++666++6+~~9_bb*dd<ee&33i::$$$ll2",
+"%117]]!]^~im(m$j:i3&e<<dd****d<<<eeee<dd*bb_9_9~~+6+6;;5|^|^^%%%117]!!!>>===a=aa###cccc[[[f[f/f[=1+<jlm22mmmmll$$::&<b_99~~~~++~_b*<<3ij$2ll$lll$l3+!a=aa=a==aa==>>>>>=>>!>!>>=#c[[/////f/fcc#a>]1^566~9~_____9~~+666+++~+~~~9~+~~++++~~9__bbddd<e&&i3::j$$ll22m",
+"%177]]!!1|b:mml$::3&e<<ddddddd<eeeee<d<d**bb_9_~~~+66;6;5|||^%%%71177]]!]!>>====aa##ccccc[[[[[[f[c!^_&$22m222lllji3edb_~~+++~~~~9_bdei:$$l2ll2l2lje;!===a===>>=====>=>>>>!>!===#c[f///)///f[c#a>]1^566+~9999999~~~+66+++~~9~~~~++++++++~~9_bb*ddee&&3i:jj$$2l22m",
+"^%%11]]]]^+elmml$:i33&eee<<<<<ee&e&e&&<<<dd*bb__9~~~++;;;;5|5|^%^%1777]7!!!!!>=====aa###c#cc[[f[f[[a75b32m((m2l$:3<*_9+++6666++~~9bde&j$2m2mmlml2$*%>>=>>>=>>=!!!!!!!!!]!!]]!!=aac[f//f/ff[c#a>!7%|5;~~999b_bb_99~~~~~~99_99999~~~~++~99__b**d<<ee&ii:jj$l22mmm(",
+"^^%17]7]]1|93l22l$::33&eee<ee<ee&&&&e&e<dd**bb___9~~+~+6;;;||||%%%%111]]7]!!!>>====aaaa##c#ccc[c[c[[c=76dil2m2$ji&d_~++666666+++~9b*e3j$2m22mmmm2:_7>>>>>!>!!>!>!>!!!!!]!]]]!!>a#c[[f//fff[[c#>!]%|;6+~999_____99~9~~~~999999~~~++~~++99_bb*dd<<&&33::j$$ll22mm(",
+"|^%%%17]]7^6*jlml$$::ii33&&&3&&333333&eee<d<**b__9_~~++++6;;;||5|^^%%1%77]]!]!!!>>>>>=a=aa#####cc[c[c[#>^9ejl$j:edb~6;;;66;66;;++__deijl2m(((m(m236]!!!!]!!!!]]]!]]]7]]]777]!!>=a#[[[ff/f[[ca=>]1^|;+~99___bbbb_9_9999999_999999~~~~999__bb*dde&&3i::jll22mm((pp",
+"||%%%77]]]1|~ejl2l$$j::3i33&3333i33333&ee<ddd*d*b__99~~+666;;5|||^|^%%%1117]]7!!>>>>=>=aaa=aa#aa##cccc[ca!^~<3&e*_+66;;5;;;;666++~9*e:j2mm((p((ml<5]]!!!!!]]!]!]]]7]]77]7717]]!>a#[[fffff[[c#=>]7^5;++~99__bbbbb____999_9999~~~~~~~+999_bb*ddd<&&3::j$l22mm(((m2",
+"5||^%%11777%;b3lm22l$jjj::iiiiiii:iii333&&e<d<*bbb__99~~~~+666;;55^^^^%^%1117]7]]]!!!>>>==a=aa#######c#c##=]^+bb96;;||555;;;;;;;+~_*<i$2m(pp(ppp$b%]]]7]]7]]77777771111111111]!!=a#c[[[[[cc#a>!]%|5;+~_9_b_bbb*bbbb____9_____9999~~99__bb**dee&33i:$l$22mm((mli<",
+"5|^^%%11]771^6*3$22l$$$j::::::i::::iii33&&ee<<<d**bb_99~~++666;;5;55^^%^%%11177]]]]!!!>>>>======aaaaa###cc##=!%5;5|55|5;5;55;;;;++_de:$m((,,,pp(i~%]7]7777177717717771111%%117!!=a#ccff[[[c#a=!]1|56+~999_bbbb*bbb______99999~~~9~9~9_bb**ddee&3i:j$$l2mm22$3*;1",
+"5;55|^%11777%5~<il2mmll$$$$jjjjjjjjj::i333&ee<ddd**bb___99~~+666;55|5||^%^%%111177]]!]!]!!!>>======aaaaaaa##a=!]1^^^|555;5;;555;6~9b&:lm(,p,,,,2<511711717711111%1%%%%^^%^%%1%7]>=##cccc[caa=!]7^|66+~___bb**d*ddb**bb____9_9__9___b_bb**<<ee&3ijj$$2mmmlj&b61!a",
+"555||^%%11777%59di$2m222l$$$$$$$jj:j:::3333ee&<dddd**b__99~~++666;65;5|5^^^^%%111777]]!]!!]!]>>>=====aaaaaaaa=>!]1%||555;;5;5;55;+9*&:l(prrrrr,$b^111111%%11%%%%%%%%%%%^%^^^%%7]!=a#c[[[cc##=>]1%|;6+~99_9_bb***d*b*bbb_b___99_999___bb**d<ee33ij$ll22$:e~|7=###",
+"66;5||^^%1171%^;9d3l2(m222ll$l$lll$$jj:::i33&e&e<<d*b**b__9_9~~~+6;65;5|5||^^^^%%%11177]]]!]!!!>!>>>>>>====>>>>!71^^|;;;;5;5555;;+9*&:l(,,rrhr(3+^%1%%%%1%^%%%^%^^^^|^||||5^^%17!>=###c#c##=>]71^5;+999_9bb**ddd*dd***b*bbbbbbbbb*****d<<<e&3i:j$lll$id~^]=a##a#",
+"6;;5||^^%117771^;9*3$m((mm2222llll$$$jj:iiii3&e&<<<<**bbb__99~+~~+6+;6655|5|^^^%%%%1111177]]7]!!!!!>>>>>==>=!]]71%|556;;6;;5555556~*&$mprrhhhrld;^^%%%%^^%^^^^^^^^^^||||||||^^11!>=a##c###a=>!7%^5;++99999__bb*d**ddd***b*b*bbb*bb***ddd<ee33:jj$$:&b6%!ac#cc##a",
+"+66;;5||^^%11771^;~*i$m(((((mmm2222ll$$jj::3333e&e<d<dddbbb___9~~++6+;;;6;|55|||^^%%%1%71717]]7]]!!!!!!!!>!!!!]%^|5;;;6;;555|5|||;~b&j2p,hhhhp:~|%^^|^|^^||||||||555||5555;;5|^7]!>aa###aa==>!1%|56+~9999__b**dd<dddd<dd*d**dddddddd<<<ee&&3i:jjie_;1>a#####aaa=",
+"+66;;5||^^%117771%56b&$mp((((m(m2m2ll$$$j:j:33i&&&&<<ddd*bb____99~~+~++;;6;55||||^^^^%^%%11111777]]]]]!!]!]!711%|5;;+6+666;5|5|55;~b3$m,rh44hm<6|||||||||||||||5||55555;5;;5;|^%1!>=aa###a=>!]7^|56++~~~~999__bbdddddddddddddddddddd<<eee&3iiiie_;7=#ccccc##aa==",
+"~~++;;;5||%^%1111%%|69ejm,,,,p(((mm222l$$j::::333eeee<<ddd**bb__9_9~++++6;6;;;;555||^^%%%%11111777717]77!]7771%|5;6+6+666;;55|5^|5+bej(,h444,:_;|||||5|555555;55;;5;6;;;6;;;;;|^1]!==aaa===>]71^56+~99+~++~9__b**dd<<<<<<<<<<<<<<eeeeee&3iiii&*+^!aac#cc#aaa===>",
+"~+++6;55||^%%1777711^|+*imp,,ppp((mm2lll$$$j:jiiii&&ee<<ddd*b*bb_9999~~+~6+;;;;555||55^^%^^%%%%1%77777]7]771%^|566+~+~++6;;55|^^%^|6b&l(rh44me6;;55;5;;555;;;;;;;;;;;6;66666;;5^17!!===a==>!!71%|;6++~+++;66~~9__b**dd<<<<e<e<eeeeee&&&&333e*951>ac#[cc###aa=>>>",
+"+~+++66;55||^^%171771%^;b3m,rrr,ppp(mmmll$$jj::i33i3&&&e<edddbbbb__999~9+~++++;6;;;;||5||^^^%%%%1%%%11%11%%%%|;;6++~~++66;;5||^%%1%%5+*ij(,m3~6;5;;5;5;;;;;6;;6666+6+6++++~6665|^1]!>====>!!]1^|;6+~9+6;;;;;6++~__b**<d<e<<eeee&eee&&&33&&<*~51>a##c##a#a==>>>!]",
+"1;~++66;55||%^%%777]]711|~&2p,,,,p(((mm22ll$$j:j:i33&&&&<e<d<d***bb_9_99~~~+++66;;;6;5555||5^^^^%%%%%1111%%||56++~~~~~~++;55|5|^%71771^;~b<b;1%|556;666666;66666+666+6++++~++6;5^1]!!>=>=>!!]1%|56++~665|||||5;;++~9_b**dd<d<<<<eeeeee<<d*96|]>a#c#c##aa===>>>!!",
+"c%6+++66;;;|5^^%%117777]7%+elprr,,,p((mm22llj$$::::ii3&&&eeedddd**bbb__9_9~~~+~++66;;;;;55||5|||||^^%^%%^^^|5;6+~9999++6;;;55|^^%%1177711%][@)fa!1%55;;6+++++++~+~~~~~~~99~9~+6;|%7]!!>>!!!]11^|;6+~~+;5|^%%%^^556+~9__bbb*****<ddd<<ddb_~;|]>=###c#aaa==>>!!]]]",
+"k#%6~++6;;;5||^%%1177]!]!!75b:pr,,,ppp((m2l2$ll$:j:ii3333ee&e<dddd**bbb99_9~~~~++6+6;6;;6;5555||||^^^^^^^||;;+~99_999~+66;;5||^^%%177777]=)q8s-'n@[a!7%^566++++~+~~~~~~~~99~~~6;5^1]!!!>!!]]7%^|;+++~65^%77]!]]11^^5566~~~99________99~+5|1!>a##c####=a==>>!!!]7",
+"0)a^6~~++;;;5||^^%%1777]]]]]^bjprrr,,pp(((m22l$$$j:j::i3333eeee<<dd***bbb_b__999~~+++666;;;;;555|5|5||||5|;;~~99_9_9~++6;;|5||^^%%117111!['8u.uv8sqonkf#=]%^|;6+~~~999_9__9__~~+5|%1]]!]!]]1%%|56+~9~+;|%7!>!>>>!]77%^||;;;6666++++6+;;|^]!==####aa===>!!!]]]717",
+"n0@a%6+++6;;;5||^%%%17]]!!!!!%_j,rr,,pp((mmm22ll$$jj::ii3333&eee<<<ddd**b__9999999~~~++++6;;66;;;5555|||;;66~___b__99+6;55|5|5^^^%%%1%1]c}suu..uuuuv8sgqo0@f[#>]7|55;6~~~~999~++;|%17]]]]]]7%^|56+~~+;5%]!=a##cc#a=>>!771%^^^^^||||^^17]!>=#####aaa==>=>!!!]]]11",
+"000@a^+~+~+6;;;|||%%%1177]!!!!%_:prrrr,,pp(mm222ll$$$:j::i33&3&ee<<eddd*****bb__99~9~9+~++++6;66;6;;55;6;6+99_b*bb_9++6;;55||^||^^^%%11>)-vvuuvuvuvvuvv88sgqq'n})fc#a>71%^^;6++655^%17]]777%%^|;6++6;|%7>#c[f/f[f[c#aa=>!!!7711111177]!!=aaaa#a=a=>>>!]]]]77111%",
+"00n0@#%6+++6;;;5||^%%117]]]]!!>^_:(rrr,,p,(((m22ll$$$jj:::ii3333&e<e<<ddd***bbbb__9999~9~+++~+66;;;;;;;66+~9_bbb__9~~+6;;||||^^^%%^%^%!/{svvvvvvvvvvvvv888v888ss--q'on}}kk/#>]7%^%%%177]]7711^|5;;;^7=#cf@kk@@@)///[c[##aa==>>>>>!>===aa#####a#===>>>!!!]77111%%",
+"k}}00)a%+~+++6;;55||^^%%117!!>!!1~3mrrrr,p,(m((mm22l$$$j:::ii33&3&&e<ee<ddd***bbb_b__99~999~+++~+++666+6+~9_bb**b_9~6;;5|5||^||^||^^%7c0g8v88v88888888888vs8ss8ssgggggqq-qo}@f#!7%%%1171171%^^|55;|1>c/@@}k}}kk@))f/f[cc###a=a=a=a==aaaaaa##a===>>>!]!!77711%%^^",
+"}}0nn0@#%6+++6;;55||^^%%17777!]]]76<2rrrr,r,p((mmm22l$$$$jj::ii333&&eeee<d<d*d****b_b_b99999~~+~++~++6~~9_bb***bb_~~6;5||5|||||^^|^^1=}q8s88888888s88s8ss8s88ssssssggggggg-on@fa>11111777771%^^5||%]a[)}}00}}kkk@)))//ff[[[[c##c####cc####aaa==>>!!!]]]71111%%^^",
+"@kk}}n}@#1;++~+66;;5||^^%1%7]]!!!!76e2,rrr,,ppp((mm2m2ll$jjj:j::i3i33&&&&ee<<d<***b*bb_b__9__9999~~~+~~9__b*dd**99+6;5|||^^^^^^||^|1>)osssssgsgssssggssssggg-gggg-gggg---qqon}/c!!1%%1171111%^||5^%!#f@k}0}kkkk@@@)//f/[f[ccccc#ccc#####a===>>>!!]]]]7171%%^^||5",
+"@kk}000}@c]56++6;;55||^%%%11777]]!!1;d$prrrr,pp(((m222llll$lj::::ii33&&eeee<<<<<*d****bbbb___999~9~9999_bbddddb*99+6;||^^^^%^|^^5^%>)oqgggggsgggsgsgg-g-gg-gggg-g------qqqq'{n@f#>!7777711111%%^%%]>[/@k}0}}}kk@@))////fff[f[[[ccc###aaaa=>=>>!!!]]77111%%%^^||5",
+"@@kkk}0}k)c75++66;;;555||%^%%1]]!]]]7|b$prrrrrr,,(p(mmm2lll$$$j:::iiiii33&&e&e<<<<<dd****bbbb_b__999___b*dddd**99+65|5^^%%%^^^^|^%>/n'g---gg-g------gg-g-----qqq-qqqqqqqqq'{{0k/#=]]71111711^^^^^1]>#f)k@kkk@@)))))//fff[[[ccccc####aaa=>=>>!]!!]]7711%%%^||5|55",
+"@)@k}}}}k@/a7|;6;;55|||||%^%%171777]]7|b:prhr,,,,pp((mm22l2l$l$$:j::i33333&&e&eee<<<<dd***bbbbbbb___bbb*<<<<<**9~+65^^%^%^%%%^^|1!fnqq------q--q---qq-qq--qq-q-qqqq''''''''o{n}@f#=!]]]777171%%1%7!ac))@kkkk@@@)))///f/ff[[[[ccc##a#aa==>>>!!]]]7]1111%^^^^|5|;;",
+"/)@@@kk@))[#>7|56;;;555|||%^%%17%7177%%|9&m,hhh,,,,,pp(mmm2ll$l$$$$jjj:iiii33&&&eee<<<<<ddddd***b*bbb*ddd<e<db99+;||^%%11111%%%1]f0''qqqq''qqqqqq'qqqqqq'''q''''''o'''ooooo{{00@/[a>!]777171%11%17>a[f@@@@@))))//f/fff[ccccc##aaaaa=>>>>!!]!]]771%1%^^^^||5556;6",
+"//)@@k@@)/[a>]%^55|5|||^^|^^^^%1117%71%%5_3m,rhhr,,pppppmm2m2l$ll$jj:j:::i33i33&&&eee<<e<ddd***db***dd<<ee<<*b9+6;|^%1%1171%1%1![}oq''q'qq'''q''q''''''''q'''''oooooooooo{{{{n0})fc=!!]]]77711177]!#[/))@@@))/)//fff[[[[[ccc###aa=====>>!!]!]77771%%%^||||5;;;;6",
+"f//)))@)/[#>!7%^^|5||||5|^^%%%%%%%%1%^^%^59&l,rrrrrr,pp(p((mmm22$$l$$jjj::::3i333&&&e&eeee<<<<ddddddd<eeee<d*9+65|^%1177]17717>[}{{o'ooooo'o'o'ooo'o'ooooo{{o{{ooo{{{{{n{n{{n0}k)fca=>!]]77771117!>a[f/))/////ffff[[[[cc###aaa====>>!!]]]]77111%^^^%|||55;;;66++",
+"ff/))))/[ca!]71%^^^|||^^|^|^^^%%%%^%%%||5;69e$prhrrrr,rppp((mm2m2lll$$$$jj:j:::3iii3&e&&eeee<<<<dd<e<e&&&e<*b9+6|^%%7777]]7]!>[k{oooooooooo{ooooo{o{{ooo{oo{oo{{{{{{{nnn{nnnnn0}k)f#a=>!!!!]]77]!>a#f//)///ff/f[[[[[cc#c####a===>>!>!!!]]]771%1%%%^^|||5;5;;++++",
+"[[ff//f[ca>!]1%%%^^^^|||^|%^%%^^%^%^|||555++be$(rhrhrr,,p,p(pm(mm22l2l$$$j$:::i:ii333i&&&&ee&e<ee<<<e&&&e<*b~6;|^%177]!!]!!!=f@nn{n{{n{{n{{{{{{{n{{{{{n{{nn{nnnnnnnn0nnn0}0}00}}k)/[#=>!!]]7]]]!]>a#cf///fff[[c[cc#####aaa=>>=>>>!!]]]]171%1%%^^^|5555;;;66+++~9",
+"[[f////c#=!]]1%%%^^^^^^^^|^|^^^^^^|^||556;++9*ejm,rhrrrr,,,(p((mmmm222l$$$$$jj:j:j:i3i333&3e&&eee&&3&33&e<b_~65|^11]]]!>!>=#fk}nnnnn{0{{n{nnn{{nnnnnn{nnnnnnnnnn0n0n0000000}}}}}k@/[c#==>>!!]!!!!=acf//ffff[[[c[cc####aa=====>!!!!!!]77771%%1%^^||||55;;66++++~9",
+"c[[fff[ca=!]771%%%^^^^|^|^^^^^|^|^|5|55;;++9_b<&j(,,rrrr,r,,,ppp((mmm2222$$$$$$::::::iiiii3i3&&3&&&&33&e<*_~;5^%1]]]!!>>>a#f@}0n00n00n00n0nnn00nnnnn00n0n00}0}0}0}0}}}}}}}k}kk}kk@)fcaa=>>>!!!]!==#[[fff[[c[#cc####aa=a==>>>!!!!!]777711%%%%^|||555;6666+++~9999",
+"#c[fff[#a=!!]71%%%%%^^^^^^^^^^^^|^||55;;6+~9_*deij(,rrrrrr,,,,pp(p((mm22222ll$lljjjjjj:i3iiii3&3i3i3ii&ed_~65|%177]!]>==acf@kk}00}00}00000000n0}0}00000000000}}}}}}}}}}}k}kkk@k}k@@/f[##===>>>>>=a#c[ff[[[ccc###aaaa======>!!!]]]77717%1%%^^^||||5;;;666+~+~999_",
+"##[[f[[#==]]]111%%%^^%^|^^^^^^||^5|555;6++~9_bde3:$mprrhrrr,,p,,pp(pp(((mml2ll$$$$$$j::jjj:iiiii3iii33ed_96;^%77]!!!==>#cf/@@kk}k0}}}}}k}}k}}k}}}}}}kkkkk}kkk}}}kkkkk@@@@@@)@@@@@@@/fc#a===>>>>>>a#c[f[[c###aaaaa===>=>!!!]!]]]7171%1%%^^^||5|55;;666+~~~~99___b",
+"a#cffffca#>!>!]77111%%%^^^|^^^^|||^55;;;++~9_bd<&i:lmp,rrrrrr,p,ppp((((m(mm2m222l$$$$$jj::::::i::::ii&<*~+5|^%77!!!!>=a#[//@@}k}k@kkk}}}k}kk}k}kk}k}}}}}}kk}kk@kkkk@k@@k@@@@)@@@@@))/[cc##a==a=aa#c[f[[[c####aa====>>!!!!!!]]777111%%%%^^|||55;;;;66++~~~999__bb",
+"a#c[ff[caa=>>>]!]7771111%1%^^^^^^^5|555;;6~99b*de&:jlmpprrrr,,r,,,ppp((p(((mmm2ll2ll$$$$$$$jj:j::::i&ed_~;|%17]!!!>===#[[f))@@)@kk@k@@k@k@@kk@kkk@@@@@@@@@@@@@@))))@)@)))))/)//)@@@)/f[c#aaaa=aaa##c[[cc#a====>>=!!>!!]]7]7771111%%%^^||5|55;;;66+++~~~99__bb***",
+"=#c[//ff[[ca#a==!>>!!!]7777111%%^%^^^||55;6~~9bd<e3:$$m(,,,,,,p,,,pppp(((m(mm((m2222lll$$$$$$j$jjjji&d_+;|^17]]]!!!==aacff//)@@))@@@@@@)@@@@@))@@@@@@@@@@@)@))@@@))))////////////))))/[c##aaaaaa##c[[[cc#a=====>>!!!!!]]]771711%%%^^^^||555;;6;6+++++9999__bb**d",
+">ac[f/)/[f[cfc##caaa===>>=>]!]771111%%^^||5;6~9_*<<&i$l2m(p,r,,,p,,,pppp(p(((mmm(m2m222lll$$$$$$$:i&<b965%177]]!]>>>=a#cc[ff///))))))//@)))))@))))))//)))))//)/f/////////f/f[f/f))))//[[cc##a#a#acccc[caa==>>!!]!!]]]7771711%%^%%|^55555;;6;66+~+~99_99__**b**dd",
+"=ac[/@@k@@)/@)///f/fff[[c[[#aa=>!!]]]]7]71%^|56+~b*<e3:$22m((p((((((pp(p(p(((mmmmmmmml22l2lllll$j:3<*9;5^%17]]]!]!>>=aaccff///f////)/)/////)///f))/))////////////ff/ffffffff[[ff//))/)/f[[cc#c###c[[[[c#a=>!>!!!!]]7]7171%1%%%^^^||||5;5;;666++++~~99__bbb**ddd<",
+"!=#[))kkk0}k}}k}}k}0}}}k}kkk@)/fc##==>>!!!!]71%|5;~9bde3i$$22mm(((((mm(2m2m2mmmmmm222mm22l2l$$$$j3e*965^%77]]]!]!!>>>=a#[c[fff/ff/ff/f///ffff///fffffff/ffff[ff[ff[[f[[[[cccc[[[[///)ff[[cc#####c#cc#ca==>!]]]]77777111%%%^^^||||555;;;666++~~~999__b_b*b*dddde<",
+">=#c)k}0n{n{oo{oooo'oooo''ooo{{n0k@))f/[[c#aa>>771^|6~_*<&3i:j$$$lllll2$l$lll2$l2222llll2l$l$$$i3e*9+5^%171]]7]]!]>>>=aacc[[f[[f[[fff[fffffffffffffffffffffffff[[[[[[cc[[[[ccccc[ff//)//ff[[cccccc[[[c#=>!!!]]7]777111%1%%^^^||5|5;5;;;66+++~~~999__bbbbd*d<<<ee",
+"]!acf@knn{ooo'''qqqq----qq----qqq'''{{00}k)/f[cca==]7%|6~9*d&&3i::jjj::j::i:i:$:j$$$ll$l$l$$jji3<b~;|^%71]]77]]]]!]!===##c#[c[[c[[[ccf[c[[[[[[[[[[[[[cc[[c[cccccccccccc#######ccc[f////ff[[cc[cccccc##a=>!!777111%%%%^%^^||||555;;;66+++~+~~99___bbb***dd<<<eee&",
+"]!=a[)@0{{o''qqq-qq---q-g-g-gggggggsgg--qq'{n0kk@//[ca>!%^;6~_*d<eee&&eeeeeee<ee&&&333iiiii:i3<d_~;5%%111177777]]!!]>==aaccccccccc[[cc[c[[ccc[c[[[cc[[cc[c[cc[cccc#cc######a#a###c[f////fff[[[ccc[c[##a=!!]777711%%%%^|^||||555;;;666+++~~9~999__bbb*dddd<<ee&&3",
+"7]!=cf)k00{o{{''oq''''q'''q-q-gggsssss8sssggg-q'oon0kk/cc=>1%5;~9_b*bb**bb___bbbb*d*d<d<<<edd*b9+5|%%17777717177]7!>!>=aaaa############c###cc######c#########a#a###aaa#a=aaa===a#cc[ff/f/[f[ccccccc#c#=>]711%%%^^^^^|||555;;;6666+++~~~9999__bb**bddddd<<ee&&&&3",
+"17!!#cf)}k0nnn{{{o{{ooo'ooo'q'q---ggsss888v88s88gs--'o{0}@/[#>]1|;6~~+~~9~+~+6~++6+++~~~~~~~+6;|^111111111717717]]7!!!=>aaaaa#a##a#########a############a##a###aaaa#a=aa========a#c[[f///fffff[[[[[c##=>!]7%%%%%%|^^|||5555;;;6;6++++~~999___bbb***dd<e<eee&3333",
+"177!>=#[/)@}k0000nnnnnnnn{{{{oq'qqq--ggss8s88v88v8vsssgqoon0@/ca>7%^5;;;5;;5;;5555;555|555|^^^1%111177777117177]77!]!>>====aa=a=aa=aaa=aaaa#aaa=aaaaaaa=a=aa=======>===>=>>=>>>==aac[fff/ff[[c[cccc##a=!]11%^^||||555;5;;;666++~+~~~999___bb***ddd<<e<e&&33i3ii:",
+"%117!=a#[[/))@kkkkkkk}}}00n0{n{{o'oqq-q-gsss888888vv8888sg-q'n}@fc=!]%^|||5||||||^^^%^%%%%%%1%1111111%111717171]]]]]!!!>==>>======>=======>=a=aaa====================>=>>=>!>>>>=a#cc[ff///ff[f[c[c##a=!]1%%^|||||5|5;;66;66+++~~~99999_b_bbb***dd<<eee&&&33ii::",
+"^%%17]!=a#cf[f/)/))@@))k@kk}}0n{{{ooo'qqqq-ggg8s8888vv88s8sg-qon})/c=>]1%^^||^^^|^^^^^^%%%11%11111111171117117]77]]]!!!!!!>>!>>>>==>>=>=====>=>>>>>=>>=>=>>>>>>>!!!]!!!!!]!!!!!>>=a#c[[f[ff[f[cc[cccaa=!71%^5|55;;;66;666++~+~~~99_9_bb*b***dd<<e<e&&&&&3iii:j:j",
+"^%%%7]]!==accccf[f[f//))))@kkkk}0n{n{oooq'qq---gsg8ss8vv8888ssgq'n0@f[a!]1%^|5|^^^^^^%^%%^^%%%11%1%111111177117777]7]]!!!!!!!>!!!!>!!>>!!>!>>>>=>>!>>!>>>>>!>!!>!!!!!!]!!!!!!>>==aa#c[[f[ffff[f[cc#ca==!]%%|||55;;;;666++++~~99999____bb**dddd<<eeee&33333i:::jj",
+"||^^^11]]!>>=a#acc[[[[[[//))@@kkk}}0nnn{{''qqq--qgggs8ss888s8sgg-qon0@/[a>]1^^||||^|^|||^%%^%%%^1%111%1111%77711777]77]]]!!]!]]]!!!!!!]!!!!]!!]]!!!!!!]]]]]!]]!]!]!]]]]]!]!!]!!>=a###cc[[[[cccc#c##aa=!!1%||5666;66+++~+~~99999__bb****ddd<d<eeeee&333ii::j::$$$",
+"||^%%%%7]7!!>>===aa#cc[c[[ff/))k@k}}}0nnnn{ooo'qqqq---sgssss88ssgg-''n0k)[#>]1^||||||^^|||^|^^%^%^^^%^%111%%117%711777]777]]]]]]7]!]]!]]]]!]]]!]!!]]!!]!!]]]]]]]]]]]]!]]!]!!>>>==a##c[[[[[[[[[[cc##aa>!!7%^55;;66+6+++~~~~~99___bbb***dddd<<<ee&&&3333ii:::jj$$$",
+";5|||%%11777]>!>====aa#cc[[ff/)/)@)@}}}00nnn{ooo''qqq-q---ggggggssggq'oo0}@f#>7%^|||||||^^^^^^|^^^%%%%%^%%11%1%1%%111%1117171777]77777]7]]77]77]777]77777777]7]777]]777]]!]!!>=>aa####ccccccc#aaaaa==>!]1^5566++~+~~~99_____b_b*b****dd<<eee&&3&i33i::jjjj$$llll",
+"555||^^%%1777]]]!>>===a##cc[[[ff/)@)@kk}}0000n{{ooo''qqqqqqq-g-----g--qq'{0}@[a!]%|^|||||||||^^^^^|^^^%^%^^%%%^%%%%^1111%1%71171717711717777777777777777]7]7777]]77]7]]]!!!>>>==aa##cccc[cc#c###a===>!]]1%55;6++~+~~9~999_bbbbb***ddd<<<<eee&&333i3ii::jj$$$$l22",
+"66;55||^%%%177]!!!>>===a###c[[[/ff/)))@@kk}00nnnn{ooo'o''q'qq''qqqqqq''q''o{0}/[a]7^^||^||^|^|||^|^^^^|^^^^^|^%^^^^%^^^%%%%%%%%1%1%1171717711111111777171111777177777]]]]!!!>====a########aaaa===>>]!]71%|56+~~~~_9_9___bbbb**ddd<<<e<e&&&&3333i:ijjjj$$$$ll222m",
+";;;55|||^%%%711]]]!!>===aaa##cc[fff//))@k@@kk}00nnn{{oooo'o'''ooo{ooon{{{{{{{n0k/ca>7^^5|5|5||^||^^||^^||^|^^|^^^^^%^%^^%^^%%1^1%111%1%11111111171111117777171777]7]]]!!!!>>>=aaaaa#a##a#a#a===>=>!]!]7%%^5;6~99999____bbb***ddddde<eeeee3&33iii::::jj$$$ll222mm",
+"++6;;;5||^%%%1777]]]!>>=>a##c#c[[[ff///))@@k}k}0}00nnn{{o{o{{{{o{{nnnn0}}0}}}}}kk@fc>!71^^^|||||^||^^^|^^^^^^^^^^^^|^|^%^%^^^^%^%^^%1%1%%%%1111%%%%1%111%11117111777777]]!!!>>>==aa=aaa===>>>>!!]]]77%%%|5;6~~9__bbb*******d<dd<eeee&&&333ii:i:::jj$$lll22m2m(mp",
+"+66;;;5||||^^^%17]]!]!>==>=a###c[c[[/ff/@)@)@@kk}}00n0nn{{{{{{nnnnn}}k}@@)@)))))/)//[a>!1%^^|||||||||^^|^||^^^^^^^%^^^|^^^^%^^^^%%^^%^%1%1%%%%1%11%11%1111111777777]]]!!!!!>>=============>>!!!!]]711%%^|5;+~99__b_bbb**dddd<<<<eeee&&333iii:::jjjj$$lll22mmm(((",
+"+~~+6;6;5|^^%%111177!]]]>====a#a#cc[[f/ff/)@@@@}k}}}00n00nnnnnnn00}}}k@)/)f[[cc#c####c#=>]7^%|^|^^^^^^|^^^^^^^^^^^^^%%%%^%^^^^^^||^^^^^^^^^^^%^^^^%^^%%%%%%1%%1111771]77]]!!>!!>>>=>>!>!]]!]]7711%%^^^|5;;++9__b*b**ddd<d<<<<&&&e&333i3ii::::j$$$lllll2mmm((ppp,",
+"9+++66;;;;55||^%%177]]!!!>>==aaa#ccc[cf//f//)))@@kk}k}00}000n}00}}}@@@)/[[c#aa>>!>!!]]!]]]]11^^|55|||^^^^%%^%%%%%%%^^%%%%%%1%1%11%%%^%^^^%%^^%%%%^%%^%%%%%%11%11711777]]]]!!!!>!>!!>!!!!!]]]717%%%^^||5|;6++9_bb**ddddd<<<eeeee&&3333ii:i::jjj$$$ll2l222mm(((pp,",
+"999~~++6;55||^^^%%%1177!!!>>=>=aaa#cc[c[[f//)))@@@@@kk}k}k}}}0}}}k@@/f[[ca=>!]]11%^%^%^^^^|^^|||||55555||55|5||||5||^|||^^^%1%%1%711711%%%^%%^^^^%%%%^%%%1%%1%%%%1117777]]]]!!]]!!]]]7]771111%%^^^|555;6;+~9_bbdd<dd<<<eeee&&&3333ii:i::j:$j$$$$ll22mm(((ppp,,r,"};
diff --git a/hacks/images/matrix0.xbm b/hacks/images/matrix0.xbm
deleted file mode 100644 (file)
index 1f071fd..0000000
+++ /dev/null
@@ -1,1261 +0,0 @@
-/* Created with The GIMP */
-#define matrix0_width 320
-#define matrix0_height 377
-static unsigned char matrix0_bits[] = {
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfe, 0xff, 0xef, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xdf, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
-   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff, 0xfe,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xef, 0xff, 0xdf, 0xff, 0x7f,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0xff,
-   0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xef, 0xff, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0x7b, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
-   0xff, 0xdf, 0xfb, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x7f, 0xdf, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xef, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xfe, 0xff, 0x7e, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
-   0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
-   0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbf,
-   0x7d, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xf7, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xb7, 0xff, 0x7f, 0xdb, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xf7, 0xfd, 0xff, 0xed, 0xff, 0xff, 0xff,
-   0x7f, 0xdf, 0xff, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfe, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xf7, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xbb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xfe,
-   0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xbf, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff,
-   0xff, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xbf, 0xbf, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x7f, 0xff,
-   0xff, 0xdb, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
-   0x7f, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0x7f, 0xff, 0xff, 0xfd,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xbf,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xde,
-   0xff, 0xbf, 0xfd, 0xff, 0xdb, 0xff, 0xff, 0xff, 0xdf, 0xdb, 0xff, 0xfb,
-   0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfd, 0xff,
-   0xdf, 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfe,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf7,
-   0xff, 0xdf, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xbf,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xbf,
-   0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff,
-   0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xbf, 0xf7, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xbf, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfe,
-   0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x7f, 0xef, 0xfe, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xff, 0xdf, 0xff,
-   0xff, 0xff, 0xff, 0xbf, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfe, 0xfe, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff,
-   0xfe, 0xfb, 0xff, 0x6f, 0xff, 0xff, 0xf7, 0x7f, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x7f,
-   0xff, 0x7f, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
-   0xfb, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
-   0xff, 0xdf, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xff, 0xf7, 0xff, 0xff, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xfe, 0xff, 0xef,
-   0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xbf, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xef,
-   0xff, 0xff, 0xfd, 0xff, 0xf7, 0xfe, 0xff, 0xff, 0xff, 0xef, 0xff, 0xdf,
-   0xfd, 0xff, 0xdf, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xf7, 0xff, 0xbf, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
-   0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x7f,
-   0xff, 0xff, 0xbd, 0xff, 0xfe, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
-   0xbb, 0xf7, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfd, 0xff, 0xff,
-   0x7f, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f,
-   0xff, 0xff, 0xb7, 0xff, 0xf7, 0xed, 0xff, 0xbb, 0xff, 0xff, 0xf7, 0xff,
-   0xff, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xfb, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfb, 0xfb, 0xff, 0xf6, 0xef, 0x7f, 0x7f, 0xff, 0xf7, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff,
-   0xff, 0xfb, 0xff, 0xbf, 0xfb, 0xff, 0xff, 0xf7, 0xff, 0xbf, 0xff, 0xbf,
-   0xff, 0xff, 0xf7, 0xfd, 0xfd, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x7f,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfe, 0xf7, 0xfd, 0xff, 0xfe, 0xfd, 0xff, 0xef, 0xff, 0xff,
-   0xfd, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xbf, 0xdf, 0xff, 0xff, 0xff,
-   0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xf7, 0xff, 0xef, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xf7, 0xef, 0xff,
-   0x7f, 0xff, 0xfd, 0xff, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xdf, 0xff, 0xff,
-   0xff, 0xf7, 0xdf, 0x7f, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xfe, 0xef,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xef,
-   0xfd, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x7f, 0xff, 0xff, 0xff, 0xfe,
-   0xff, 0xb7, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xff,
-   0xde, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xfb, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x7d, 0xff,
-   0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xdf, 0xff, 0xf7, 0xfd, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xbf, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xbf, 0xff, 0xfe, 0xff,
-   0xff, 0xff, 0xff, 0xef, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfd, 0xef, 0xff, 0x7f, 0xff, 0xf7, 0xff, 0xbf, 0xff, 0x7f,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xbf, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xef, 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xef, 0xff, 0xff, 0xfd,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
-   0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
-   0xef, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xb7, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0x7f, 0xff, 0xff, 0xfb,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xfe, 0xff, 0x7f, 0xdf,
-   0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfe, 0xdf,
-   0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xbf, 0xfb, 0xff, 0xfe, 0xff, 0xf7,
-   0xf6, 0xff, 0x7e, 0xff, 0xff, 0x7f, 0xff, 0xef, 0xff, 0xff, 0xf7, 0xff,
-   0xfb, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff,
-   0xff, 0xfd, 0xff, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xff, 0xfb, 0xff, 0xfe,
-   0xf6, 0xf7, 0xbe, 0xff, 0xdf, 0xff, 0xff, 0xfe, 0xff, 0xde, 0xfe, 0xb7,
-   0xff, 0xff, 0xdb, 0xff, 0xef, 0xef, 0xff, 0xbf, 0xff, 0x6f, 0xff, 0xff,
-   0xff, 0xff, 0x7f, 0x6f, 0xff, 0xff, 0xfb, 0xdf, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xf7, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef, 0xbb,
-   0xff, 0xff, 0xf7, 0x7f, 0xfb, 0xff, 0xff, 0xfe, 0xbf, 0x7f, 0xff, 0xfd,
-   0xfb, 0xff, 0xfb, 0xff, 0xdb, 0xef, 0xf7, 0xff, 0xff, 0xfb, 0xef, 0xff,
-   0xff, 0xff, 0xbf, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xed, 0xff, 0xdf,
-   0xff, 0xff, 0xef, 0xff, 0xb7, 0xfb, 0xbf, 0x6d, 0xff, 0xfe, 0xfd, 0xff,
-   0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0xdf, 0xff, 0xed, 0xfd, 0xbf, 0xed, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xf7, 0xf7, 0xb7, 0xff, 0xfe, 0xfb, 0xef, 0xff, 0xfe, 0xfe, 0xff,
-   0xef, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xf7, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xbd, 0xff, 0xff, 0xfd, 0xff,
-   0x7f, 0xf7, 0xff, 0xff, 0xfe, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xbf, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff, 0xff,
-   0xf7, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xf7, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x7f, 0xff, 0xff,
-   0xf7, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xdf, 0xff, 0xff, 0xef, 0xff, 0xfd,
-   0xff, 0xff, 0xfd, 0xef, 0x7e, 0xff, 0xfe, 0xfb, 0xff, 0xff, 0xfe, 0xfe,
-   0xef, 0xf7, 0xb7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfb, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xbd, 0xdf,
-   0xff, 0xfd, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
-   0xff, 0xff, 0xfe, 0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xfb, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xdf, 0xf7, 0xff, 0xfe, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xf7, 0xef, 0xef, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
-   0xb7, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0xbd, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0x7f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xff, 0xff,
-   0xf7, 0xff, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xff,
-   0xfe, 0xff, 0xff, 0xef, 0x7f, 0xf7, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfb, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xef,
-   0xff, 0xff, 0xfe, 0xff, 0xef, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfe, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0xf7, 0xff, 0xfd, 0xff, 0xff, 0xbf, 0xff,
-   0xff, 0xf7, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
-   0xbb, 0xff, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdb, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xef, 0xf7, 0xff, 0xfe, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xf7, 0xef, 0xff,
-   0xfe, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xdf, 0xff, 0x7f, 0xff, 0xbf, 0xef, 0xff, 0xdf, 0xff, 0xff, 0xff,
-   0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfe, 0xff, 0xff,
-   0xff, 0xdf, 0xff, 0xfe, 0xdb, 0xef, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
-   0xf7, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf6,
-   0xff, 0xf7, 0xf7, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0x7f, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xf7, 0xbf, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xde, 0xf7,
-   0xbf, 0xff, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb,
-   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xbf, 0xfb, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
-   0xff, 0x7f, 0xff, 0xff, 0xef, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
-   0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xff, 0x6f,
-   0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0x7f, 0xf7, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfb, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff,
-   0xf7, 0xff, 0xff, 0xf7, 0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xef, 0xff, 0xef, 0xfe, 0xff, 0xff, 0xfe, 0x7f, 0xff,
-   0xff, 0xdf, 0xff, 0xff, 0xef, 0xff, 0xfb, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0xff, 0xdb, 0xff,
-   0xef, 0xef, 0xff, 0x7d, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xf7, 0xf7,
-   0xff, 0xdb, 0xff, 0xf7, 0xff, 0x7f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0x7d, 0xff, 0x6f, 0xef, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xef,
-   0xbf, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xf7, 0xff,
-   0xff, 0xff, 0xff, 0xfd, 0xff, 0xef, 0xf7, 0xff, 0xff, 0xff, 0xfe, 0xfe,
-   0xff, 0xf7, 0x7f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff,
-   0xff, 0xef, 0xf7, 0xff, 0xfb, 0xff, 0xff, 0xfe, 0xff, 0xde, 0xff, 0x7f,
-   0xff, 0xff, 0xff, 0xff, 0x7b, 0xfb, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xfe, 0xff, 0xbf, 0xff,
-   0xff, 0xfb, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
-   0x7f, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xfe, 0xfb, 0xef, 0xff, 0x7f, 0xff, 0xfe, 0xef, 0xff,
-   0xff, 0xff, 0xfd, 0xf7, 0xef, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xdf, 0xff, 0xfe, 0xff, 0xff, 0xfb,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xef,
-   0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff,
-   0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff,
-   0xfe, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfd, 0xef, 0xbf, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0x7f,
-   0xff, 0xff, 0xfe, 0xff, 0x7f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xdf, 0xff,
-   0xff, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xff, 0xed, 0xff, 0xff, 0xf7, 0xff, 0x7f, 0xff, 0xff, 0xef, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfb,
-   0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xef, 0x7d, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfb,
-   0xff, 0x7f, 0xff, 0xff, 0xfb, 0xfb, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xbf,
-   0xff, 0xfe, 0xff, 0xed, 0xff, 0xdf, 0xef, 0xff, 0xff, 0xff, 0xdf, 0xfb,
-   0xff, 0xff, 0xff, 0xdf, 0xfe, 0xef, 0xfb, 0xfe, 0xdf, 0xef, 0xff, 0x7b,
-   0xff, 0x6f, 0xfb, 0x7f, 0xf7, 0xff, 0xf7, 0xff, 0xb7, 0xff, 0xff, 0xdb,
-   0xff, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0x7f, 0xff, 0xfe, 0xbf,
-   0xef, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xef, 0xff,
-   0x7f, 0xff, 0xff, 0xef, 0xff, 0xff, 0xf7, 0xff, 0x6f, 0xff, 0x7f, 0xff,
-   0x7f, 0xdf, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x7f,
-   0xff, 0xfd, 0xdf, 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfd, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfb,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf7, 0xff, 0xbb,
-   0xfb, 0xff, 0xde, 0xff, 0xbf, 0xfd, 0xff, 0xdb, 0xff, 0xfb, 0xfd, 0xdf,
-   0xde, 0xfe, 0xfd, 0xf7, 0xdf, 0x6e, 0xff, 0xf6, 0xed, 0xff, 0xf7, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xff, 0xef, 0xff,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xbf, 0xbd, 0xff, 0xef, 0xff, 0xff, 0xf7, 0xff, 0xdf, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xef, 0xff, 0x7f, 0xff,
-   0xff, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff,
-   0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xfe, 0xde,
-   0xfe, 0xef, 0xfe, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xdf, 0xfe, 0x7e, 0xf7, 0xff, 0xde, 0xff, 0xfe, 0xfb, 0xff, 0xff, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xf6, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xed,
-   0xef, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
-   0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfd,
-   0xff, 0xdf, 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfe, 0xff,
-   0xfb, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xdf, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x7f, 0xff,
-   0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xef,
-   0xfe, 0xff, 0xf7, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xff, 0xff, 0xfd,
-   0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfb,
-   0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff,
-   0xef, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x7e, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfd, 0xff, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfd, 0xf7, 0xff, 0xfe,
-   0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xde, 0xff, 0x7f,
-   0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff,
-   0xff, 0xfd, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xf7, 0xff, 0xff, 0x7d,
-   0xff, 0xb7, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xdf, 0xfe, 0xff,
-   0xff, 0x7f, 0xdf, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x7f, 0xdf, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfb, 0xff, 0x7f, 0xff,
-   0xff, 0xfe, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfe, 0xff, 0x7f,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff,
-   0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfe,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfb, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfd, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xff,
-   0xff, 0xf6, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb,
-   0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xff,
-   0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xef, 0xf7, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff,
-   0xef, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xdb,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfb, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff,
-   0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xf7, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff,
-   0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
-   0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfe, 0xff,
-   0xff, 0xff, 0xff, 0x76, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbf,
-   0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xef, 0xff, 0xbf, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xff, 0xff, 0xff, 0xbf, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfe, 0xff, 0xff, 0x7f, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x76, 0xff, 0xff, 0xfe, 0xff, 0xef, 0xff, 0xff,
-   0xff, 0xff, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xf7, 0xff, 0x6d, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfb, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfe, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xfb,
-   0xdf, 0xff, 0xdf, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb,
-   0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xef, 0xfe, 0xff, 0x7f, 0xf7, 0xff, 0xbf,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0x77, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xfd, 0xff,
-   0xfb, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xbf, 0xef, 0xff, 0xff, 0xfb, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff,
-   0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
-   0xfe, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xff, 0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xef,
-   0xfe, 0xbf, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xfd, 0xee, 0xff, 0xff,
-   0xff, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xff, 0xff, 0x7f, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff,
-   0xfe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
-   0xff, 0xff, 0xee, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xdb, 0xfe, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
-   0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff,
-   0xff, 0xff, 0xef, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xfd, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xff, 0xff, 0xff, 0xef, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfe, 0xff, 0xff, 0xbf, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfb, 0xfd, 0x7f, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xef, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xfd,
-   0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd,
-   0xed, 0xff, 0xef, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff,
-   0xbd, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xf7, 0xfe, 0xff, 0xef, 0xff, 0xff, 0xef, 0xff, 0xbf, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
-   0xff, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xfd, 0xbb,
-   0xfb, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf7, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff,
-   0xf7, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0xff, 0xf7, 0xf7, 0xff, 0xbf, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xdf, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0xdd, 0xff, 0xdf, 0xff, 0xff, 0xbf, 0xff, 0xdf, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xdf, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xdf, 0xff, 0xff, 0xed, 0xff, 0xff, 0x7e, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xf7, 0xef, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
-   0xfb, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xdf, 0xfe, 0xfd, 0xff, 0xff,
-   0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xf7, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0x7f, 0xf7, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xbf, 0xfb, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfe, 0xbf, 0xef, 0xff, 0xff, 0xff, 0xbf, 0x6d, 0xff, 0xf7, 0xf6,
-   0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfb,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xdb, 0x7f, 0xef,
-   0xff, 0xb7, 0xbd, 0x7f, 0xdb, 0xfd, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff,
-   0xef, 0xff, 0xdf, 0xff, 0xff, 0xf7, 0xff, 0x6f, 0xff, 0xff, 0xed, 0xff,
-   0xdf, 0xff, 0xff, 0xfd, 0xff, 0x6f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xef,
-   0x6f, 0x7f, 0xff, 0xbf, 0xf7, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0x7f, 0xfb,
-   0xff, 0xfd, 0xfd, 0xff, 0xbe, 0xff, 0xff, 0xfe, 0xbf, 0xfd, 0xff, 0xff,
-   0xff, 0x7f, 0xff, 0xff, 0xf7, 0xfe, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xbf, 0xf7, 0xff,
-   0xfb, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xff, 0xdf, 0xfd, 0xff, 0xfb, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff, 0xfb, 0xff, 0xff, 0xff,
-   0xff, 0xef, 0xff, 0xfe, 0xff, 0xbf, 0xfb, 0xff, 0xf7, 0xfe, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
-   0x7f, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xf7, 0xfd, 0xff, 0xef,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xf7,
-   0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xdf, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfd, 0x7f, 0xdf, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xef, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xbf, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfb, 0xfe, 0xff, 0xef,
-   0xff, 0xbf, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfe, 0xff, 0xdf,
-   0xfe, 0xff, 0xfd, 0xff, 0x7f, 0xf7, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff,
-   0xff, 0x6e, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xef, 0xf6, 0x7f, 0xff,
-   0xff, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xff, 0x7f, 0xef, 0xff, 0xf7, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xf6, 0x7f, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xf7, 0xff, 0xff, 0xfd, 0xff, 0xdf, 0xfb,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf7, 0xff, 0xff,
-   0xff, 0xbf, 0xff, 0xff, 0xfd, 0xff, 0xbf, 0xff, 0xdf, 0xff, 0xfe, 0xff,
-   0xff, 0xf7, 0xff, 0xfe, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xef, 0xdf,
-   0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfe,
-   0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xfd, 0xff, 0xff, 0xfb, 0xdf, 0xff,
-   0xff, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xf7, 0x7f, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
-   0xff, 0xff, 0x7f, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff,
-   0xfb, 0xef, 0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfb, 0xff,
-   0xff, 0xdf, 0xfe, 0xf7, 0xfd, 0xb7, 0xdd, 0xff, 0xf6, 0xf7, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xfd,
-   0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xfe, 0xfd, 0xed, 0xfb,
-   0xef, 0xff, 0xdf, 0xff, 0x7f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xed, 0xff, 0xf7, 0xff,
-   0xfb, 0xff, 0xfe, 0xef, 0xed, 0xff, 0xff, 0x7d, 0xef, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0xf7, 0xff, 0xbf, 0xfd, 0xff, 0xfe, 0xff, 0xb7, 0xff, 0x6e, 0xfb, 0xff,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
-   0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0x7f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
-   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xef, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff,
-   0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xff,
-   0xff, 0xdf, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xbf, 0xfd, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xf6, 0xff, 0xff, 0xfb, 0xff,
-   0xff, 0xff, 0xbf, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xbf, 0xfb,
-   0xff, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xbf,
-   0xff, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xbf, 0xff, 0xff,
-   0xfb, 0xfb, 0xff, 0xdf, 0xff, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xff, 0xfe,
-   0xdf, 0xfd, 0xfe, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xfb, 0xff, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xbf,
-   0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xf7, 0xbf, 0x77, 0xff,
-   0xf7, 0xf6, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0x6f, 0xff, 0xfb, 0xf7,
-   0xff, 0x7f, 0xff, 0xff, 0xff, 0xfb, 0x7f, 0xff, 0xff, 0xf7, 0xf7, 0x7f,
-   0x7f, 0xff, 0xf7, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0xff, 0x7f,
-   0xff, 0xff, 0xbf, 0xff, 0xf7, 0xed, 0x7f, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xfe,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xef, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfb,
-   0xff, 0xb7, 0xff, 0xff, 0xdd, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0x7e, 0xef, 0xfb, 0xdf, 0xdf, 0xff,
-   0xfd, 0xf7, 0xff, 0xf7, 0x7f, 0xff, 0xdd, 0xfb, 0x7f, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xdf,
-   0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xfd, 0xff, 0xff, 0xff, 0xbf,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x7f, 0xff, 0xff, 0xff, 0xef,
-   0xff, 0xff, 0xf7, 0xfd, 0xff, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0x7f, 0xff,
-   0xff, 0xf7, 0xff, 0xff, 0xfe, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xdf, 0xff,
-   0xef, 0xf7, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xbf, 0xff, 0xff, 0xff, 0xef,
-   0xf7, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f,
-   0xfb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff,
-   0xdf, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfe, 0xff,
-   0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfd, 0xfd, 0xff, 0xef,
-   0x7f, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xef, 0xbf, 0x7f,
-   0xff, 0xfb, 0xf7, 0xff, 0xff, 0xdf, 0xff, 0xbf, 0xdf, 0xfe, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfb, 0x7f, 0xff, 0xff, 0xff,
-   0xfb, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfe, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff,
-   0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xf7, 0xfe,
-   0xff, 0xbf, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xf7, 0xbf, 0xff, 0xfe, 0xfd,
-   0xff, 0xff, 0x77, 0xff, 0xff, 0xf6, 0xff, 0xdf, 0xff, 0xfe, 0xf7, 0xff,
-   0x7f, 0xff, 0xff, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xf7, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xbf, 0xff, 0xff, 0xfe,
-   0xfd, 0xff, 0xbf, 0xff, 0xfe, 0xff, 0xbf, 0xdb, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xff, 0xff, 0xff, 0x7f, 0xdb, 0xff, 0xf7, 0xf7, 0x7f, 0xef, 0xff,
-   0xff, 0xff, 0xff, 0xfb, 0xff, 0xb7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff,
-   0xff, 0xfb, 0xff, 0xb7, 0xff, 0x7f, 0xfb, 0xff, 0xbf, 0xfd, 0xff, 0xff,
-   0xff, 0xfb, 0xfe, 0x77, 0xff, 0xbf, 0xb7, 0xfb, 0xef, 0xff, 0x7f, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xde, 0xff, 0xff, 0xff, 0xff,
-   0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xf7, 0xff, 0x7f, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xfe, 0xff, 0xff,
-   0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
-   0xfb, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xfd, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfb, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
-   0xff, 0xff, 0x7f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfd, 0xff, 0xef, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xef, 0xff, 0xff, 0xed, 0xff, 0x77, 0xff, 0x7f, 0xf7, 0xff,
-   0xbf, 0xfd, 0xff, 0xfd, 0xff, 0x77, 0xff, 0xbf, 0x6d, 0xff, 0xff, 0xed,
-   0xff, 0xdf, 0xff, 0xb7, 0xff, 0x7f, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xb7, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0x7d, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff,
-   0x6f, 0xff, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xef, 0xfb, 0xff, 0xdf, 0xff,
-   0xdf, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xfd, 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xff, 0x7f, 0xff, 0xfe,
-   0xef, 0xef, 0x7f, 0xff, 0xff, 0xef, 0xff, 0xf7, 0xff, 0x7f, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xfb,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x7f, 0xff, 0xff,
-   0xff, 0x77, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xfe,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
-   0x7f, 0xf7, 0xff, 0xb7, 0xfd, 0xff, 0xdb, 0xff, 0xdf, 0xff, 0x7f, 0xdb,
-   0xff, 0xdb, 0xfe, 0xbb, 0xfb, 0xfe, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfb, 0xef, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xef,
-   0xff, 0xdf, 0xff, 0xfb, 0xef, 0xdf, 0xdf, 0xff, 0xff, 0xef, 0xff, 0xff,
-   0xff, 0x7f, 0xff, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
-   0xbb, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0x6f, 0xff, 0xff, 0xfb, 0xf7, 0xff, 0x7f, 0xff, 0xfb, 0xff, 0xff, 0xff,
-   0xff, 0xfd, 0xff, 0xff, 0xf6, 0xfe, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xdf, 0xff, 0xff, 0x77, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
-   0xfe, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfb,
-   0xdf, 0x7f, 0xff, 0xff, 0xff, 0xdf, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0xff,
-   0xff, 0xbf, 0xff, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfe, 0xdf, 0xee, 0xff, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xbb, 0xfd, 0xdd,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xfd, 0xff, 0x7d, 0xef, 0xff, 0xfd, 0xff,
-   0xf7, 0xf7, 0xff, 0xed, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xf6, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff,
-   0xfb, 0x7f, 0xef, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xef, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
-   0xff, 0xfe, 0xfd, 0xff, 0xbb, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xef,
-   0xfb, 0xff, 0xbf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff,
-   0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfb,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xef, 0xee, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfd,
-   0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0xff, 0xbf, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0x7f, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfb, 0xff, 0xfe, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xf7, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0x77, 0xff, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfb, 0xff, 0xef, 0xff,
-   0xff, 0xfe, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfe, 0x7f, 0xff, 0xff, 0xdf, 0xff,
-   0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xef, 0xff, 0xfb, 0xfd, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0xbf, 0xff,
-   0xf7, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xbf,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xff, 0xef, 0xff, 0x7f, 0xdf, 0xff,
-   0xff, 0xfd, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff,
-   0xff, 0xfb, 0xef, 0xff, 0x7f, 0xff, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xef, 0xfe, 0xff, 0xf7, 0xfe, 0x77,
-   0xef, 0xff, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xff, 0xef, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xbf, 0xbf, 0xff,
-   0xff, 0xed, 0xfe, 0xfd, 0xf6, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0xff,
-   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xbf, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff,
-   0xde, 0xff, 0xff, 0xdf, 0xff, 0xfe, 0xfb, 0xff, 0x7f, 0xff, 0xef, 0xf6,
-   0xef, 0x7f, 0xff, 0xfb, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0xef, 0x7f,
-   0xff, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0x7f, 0xff, 0xfe, 0xff, 0xef, 0xbf, 0xff, 0xff, 0xfb, 0xef, 0xef,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xfd, 0xff, 0xfd, 0xfd,
-   0xdf, 0xbf, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff,
-   0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0xfb, 0xfe, 0xff,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf7, 0xef, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xf7, 0xff, 0xff,
-   0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0x77, 0xff, 0xff, 0xfd, 0xb7, 0xff, 0xff, 0xfd, 0xfb, 0xff,
-   0xff, 0xff, 0xef, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xdf, 0xbf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xbf, 0xff, 0xbf, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff,
-   0xfe, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0x7f, 0xff, 0xfe,
-   0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
-   0xff, 0xff, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xef, 0xee, 0xff, 0xff, 0xff,
-   0x7f, 0xf7, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff,
-   0xfe, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfb, 0xff, 0xdb,
-   0xed, 0xff, 0xf7, 0xff, 0xdf, 0xfd, 0xff, 0xff, 0xff, 0xb7, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xee, 0xff, 0xf6, 0xff,
-   0xb7, 0xed, 0xff, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
-   0xff, 0xff, 0xff, 0xfe, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xdd,
-   0xff, 0xff, 0xfd, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, 0xf7,
-   0xff, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0xfb,
-   0xff, 0xff, 0xf7, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfb, 0xdf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
-   0xfe, 0xff, 0xff, 0xbf, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0x7f, 0xef, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xbb, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xff, 0xf7, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0xed, 0xff, 0xff,
-   0xff, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xf6, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xfd, 0xff,
-   0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xef, 0xff, 0xbf, 0xff, 0xff, 0xfb,
-   0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff,
-   0xff, 0xbf, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
-   0xdd, 0xfd, 0xef, 0x6d, 0xff, 0xdf, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xef, 0xbd, 0xff, 0xff,
-   0xef, 0xf7, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xbf,
-   0xdf, 0xff, 0xfb, 0xff, 0xff, 0xfb, 0xff, 0xee, 0xf7, 0xff, 0xfb, 0xff,
-   0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xbb, 0xf7, 0xff, 0xff, 0xfd,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xbf, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xdf, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf6, 0xef, 0x7f,
-   0x6f, 0x7f, 0xff, 0xef, 0xdf, 0xfb, 0xfe, 0xff, 0xfd, 0x6f, 0x77, 0xff,
-   0xff, 0xfb, 0xff, 0xde, 0xff, 0xfd, 0xed, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xef, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x7f, 0xbf, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xbf,
-   0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xb7, 0xff, 0xbf,
-   0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
-   0xff, 0xdd, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfd,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xed, 0xff,
-   0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfb, 0xf7, 0xff, 0xfd, 0xff, 0xfe,
-   0xff, 0xef, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfe,
-   0xdf, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0xdf, 0xdf, 0xdf, 0xf7, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfd,
-   0xff, 0xbf, 0xfb, 0xff, 0xfe, 0xfb, 0xff, 0xff, 0xfe, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xdf, 0xff, 0xbf, 0xff, 0xff, 0xff,
-   0xff, 0xbf, 0xef, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xff,
-   0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xdf, 0xff, 0xff,
-   0xfb, 0xef, 0xff, 0xef, 0xff, 0xef, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xbf, 0xff, 0xf7, 0xbf, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xfd, 0xfb,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xf7, 0xff, 0xff, 0xfb, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0xff, 0xef, 0xfe, 0xfd, 0xff,
-   0xdf, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xfd, 0xff, 0xff, 0xff, 0xfd,
-   0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xef, 0xdf, 0xff, 0xff, 0xff, 0xf7,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0xef, 0xff, 0xef, 0xff, 0xff, 0xf7, 0xff,
-   0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
-   0xff, 0xf7, 0xff, 0xbf, 0xff, 0xef, 0xbe, 0xff, 0xfb, 0xff, 0xff, 0xff,
-   0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfb, 0xff, 0xfd, 0xff,
-   0xf7, 0xdf, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xff,
-   0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xf7, 0xff, 0xff, 0xf7, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
diff --git a/hacks/images/matrix0.xpm b/hacks/images/matrix0.xpm
deleted file mode 100644 (file)
index 6422b25..0000000
+++ /dev/null
@@ -1,387 +0,0 @@
-/* XPM */
-static char * matrix0_xpm[] = {
-"320 377 7 1",
-"      c None",
-".     c #000000",
-"+     c #030E03",
-"@     c #081E08",
-"#     c #0B2A0B",
-"$     c #165016",
-"%     c #1B641B",
-"................................................................................................................................................................................................................................................................................................................................",
-"....................................................................++++++..............+++++.............................................................................................................................................................................................................................+++...",
-"............................++++.................................+++@@@@@+++...........++@@@++..............+..............................................................+................+....................++.....................................................................................................++@@@+..",
-"...........................+++++++.............++++++++..........++@@@@@@@++..........+++#@@@++...........+++++.....................................+++++................+++++............+++++.................+++++...................................................................................................++@@@++.",
-"..........................++@$$$@++.........+++@@+++@@+++........+@@@####@@++........++@@$$$@@@++.......++@@@@@+....................................+@@@@+..............++$$@@+..........+@@$#++..............+++$$$++.................................................................................................++@$$$++.",
-"..........................+@@$$$@@+.........+@@@#@@@#@@++.......++@#@#@##@@@+.......++@@#$$$@@@++.......++@####++..............+++++++.............++@#@@++............+++$#@@++.........@+@$$@++.............++@$$$@++...............+................................................................................++@$#$++.",
-"..........................+@@$$$@@+.........+@@@#@@@#@@++.......+@@###@##@@@+......+++@@#$$$#@@++......++@@@@@#+++............++@@+@++............++@@##@++............+@+$$@@+..........+@@#$@++...........++++@$$$@@++...........+++@++..............................................................................+@@$$$++.",
-".........................++@#$$$@@++.......+@@@$$@@@$$@@@+.....+++#@@####@@@++....++@@######$$@@@+.....++@##@#@@@+...........++@@$$$#@++.........++@@$$$@@+..........++@@@@#+++.........+++@##@@@+.........++@@@@$$$@@@@@+.........++$$$++............................................................................++@@@@@++.",
-".........................++@#$$$#@++.......++@@$$#@@$$@@@......+@+@######@@@+.....++#@######$$@@+.....+@@@@#@#@@@+..........++@##$$$#@+...........+@@$$$@++...........+@@###+++...........++@#@@@+.........+@@@@@$$$@@@@@..........++$$$++............................................................................+@@###@@+.",
-"..........................@@@$%$@@@........+@@@$$@@#$$@@++.....@@####$$$$##@@+....+@###@@@@@@#@+@+.....+@@@#@#@#@++........++@@##@@@@@++.........++@#@@@++...........++#@#@@@+...........++@#@##@++........+@@@$$$$$$$@@@+........++@#$$@++..........................................................................+++$$@@@+..",
-".........................++@#$$$#@++.......+@@#$$@@@$$@@+....+.@@@##$$$$$###++....++####@@@@@@@@+.....+@@@#@#@#@@@+.........+@@##@@@#@++.........++@#@#@++...........++#@##@++.............+@#@##++........+@@@$$$$$$$@@@+........++@$$$@++..........................................................................++@#$@@++..",
-"..........................@@@$$$@@+........++@@$$@@@$$@++.....+@@@###$$$$##@@++...++###@@@@@#@@@++.....+@@@#@#@#@+++.......+@@@##@@@@@+..........++#@@@@++...........++#@#@@+.............++@@#@@@+........+@@@#$$$$$$@@@+.......+++@$#$@@++...............................+.+.+.+...................................+@+$$@++...",
-".........................++@#$%$#@@........++@@@@@@@@@+++.....+@@#$$##@$$##@@.....++@##$$###@@@++......++@@####@#@@+........+@@$$@@@+@++..........+@@+++.............+@$$$@@+.............++@@$$$++.........+@@@@$$$@@@@++.....+++@@@$$$+@+++..........................++++++++++++++..............................++@@@#@@++...",
-"..........................@@@$$$@@++........+++@@+++@@+......++@@@$$###$$@##++....++@@@$$#@#@@@@++......++#@@#@#@@@@+......++@@#$@@+@++++..........++++.............+++$$$@++..............++@$$$@++.......+++@@@$$$@@@++.....+++@+@@$$$@@@@+++.......................+++@@@@@@@@@@@+++.............................+@@#@#++....",
-"..........................+@@$$$@@+.........++.++++++++.......+@@@$$@@@$$@@++......+@@@@@###$$@@@+.....+++@#####@@++.......++@@$$###@@@@++.........+................++@$$#@++...............+@$$$@+.........+@@$$@@#$$@@+.....+@$$$$$$$$$$$$$@+.......................+@$$$$$$$$$$$$$@+...........................+++###@@++....",
-"..........................++@$$$@++................+.........+++@@$$#@@$$@@@++.....+++@@@###$$##@++....++@#@####@@++.......++@@$$###@@@@@+...........................++$$$@+...............+++$$#@++.......+++@$$@@@$$@@++....+@$$$$$$$$$$$$$@+.......................+@$$$$$$$$$$$$$@+............................+@###@@+.....",
-"..........................++@$$$+++..........................++@@@$$@@@$$@+++......+++@@#@##$##@@@.....+++@#####@@@++......+@@@$$###@@@@@+..........................++@$$$+++..............++@$$$+++.......+++@$$@@@$#@@+.....+@$$%$$$%$$%$$$@+.......................++$$$$$$$$$$$$$@+...........................+++###@@+.....",
-"...........................++#$$@+...........................++$$$$$$%$$$##@+.....++@@@@@@@@#@###++....+@@@@######@@+.....++@@@#@$$$$$##@++.........................+++$$$+@+.............++++$$$+++........++@@@@@@@@+++......+@+@@@$$$@@@@+++.......................++@@@@@@@@@@@@+++...........................+@@###@++.....",
-"...........................+@$$$++...........................+@$$$$$$$$$$###+......+@@#@@@@@@####++....+@@@@#######@@.....+@@###@$$$$$#@@++.........................+++@##@@+..............+@@#@#++.........+++@@+++@@+++......+++@@@$$$@@+@+...........++++..........+.+++++++@+++++............+++.............++@@###+++.....",
-"...........................+++@+++...........................++@@########@++++....+@###$$###$$@#@@+....+++@@##@@@#@@++....++####@@@@$$@@@+...........................+@@##@@++............+@@@##@@+..........++.+..++++...........++@$$$@+++............+@@@@+............+++++..+++............++@@@+...........++@#@@@++......",
-"............................++@+++...........................++@@@###@#@@@++......++###$$@#@$$#@@++.....++++@##@@@#@++....++###@#@##$$@@@++..........................++@@@##++............++##@@@++...............................++@$$#@+++...........++@@@@++................+...............+@@@@@++..........+@@#@@@++......",
-"...........................++++@+.............................+@@@####@##+++......++@##$$###$$##@+.......++@#@#@@@#@+.....+@@###@#@@$$@@@++...........................+@#@#@@++..........++@@##@@+................................+++$$$@+............++@@#@@@.................................++@@#@++.........++@###@@+.......",
-"...........................++$$$++...........................++@@@#####@@@+.......++@@@@@$$$@@@+++........++######@#++.....+@#@$$$$%##$$$@+..........................++@@@##+++..........++@##@@@+.................................++$$$+++...........+@@$$$@@.................................+@@$$$++.........+@@#$@+++.......",
-"............................+$$$+.............................+@@@#####@@++..........+++@$$$@++............+@@#@#@@@+.....++@@#$$$$$##$$$++............................+@@$$@@+..........+@@$$@@++................................++@#$$++............+@@$$$@@+...............................++@@$$$++........++@@$#@++........",
-"............................+++++.............................+@@@##@###@++..........++++$$$@++............++@++@++++......+++@@@@+@@@@@+++.............................++$$@@@.........++@@#$++.+..................................+++++............++@#@@@++.................................++@@+@+.........+@@@#@@+.........",
-".............................+................................++@@###@#@@+.............+@@@@++..............+++++++.........+++++++++++++..............................+++$$@@+..........++@$$@++....................................+++.............++#@#@@++....................................+++.........++@#@#@++.........",
-"..............................................................++@@@#@@@@@+.............++@#@++..................................++.+....+...............................++++.++..........+++++........................................................+@#@@@++.................................................+@@#@@++.........",
-"................................................................++@+@@@+++.............++@@@+.............................................................................+.+...............+.+......................................................++@@@++..................................................++@@@@@+..........",
-".................................................................+++.++.................+++++.........................................................................................................................................................+++++...................................................++@@@+++..........",
-"................................................................................................................................................................................................................................................................................................................................",
-"..........+......................................+.+................+.+....................................+.++.+....................+............+.++++++................+.....................................................................................................................................................",
-".......+++++++............++++++..............++++++++...........++++++++................++++...........+++++++++++..............+++++++........+++++++++++++.........++++++++.............+++++++..............................................................................................................................",
-".....++@@@#@@+++........+++@@@@@+............++@@#@#@@++........++@@#@#@@++.............+@@@@@+........+++@#@#@#@@@@+..........+++@@#@@@++.....+@@@@#@@@@#@@@+.......++@@@#@+@++.........+++@@@@@+++.............................................................................................................+++++++++......",
-"....+++@@@#@@@++.......+++@@@#@@@+.........+++@@@#@#@@@+++....+++@@@#@#@@@+++.........+++@@@@@++.......+@@@#@#@##@@@+.........+++@@@#@#@@+....++@@#@####@#@@@++....++++@@@##@@+@+........++@##@@@@+++...........................................................................................................+++@@@@++++.....",
-"...++@@$$###$$@@@+....++@##$$$$$++.........+@@@$$###$$@@@+....+@@@$$###$$@@@+.........++@$$$$$++......+@@@$$######@@+........++@$$$$$#@#++....++#############++....+@@@$$#@#$$@@@+......++$#########++.........................................................................................................++@$$$$$$$@++....",
-"...+@@@$$###$$@@@.....++###$$$$$@+........++@#@$$###$$#@@++...+@#@$$###$$#@@++........+@@$$$$$++......++@@$$##@##@@@+........+@@$$$$$##@@+.....+@####@#######++...++@#@$$###$$#@@++....++@$$########++.......................................................++++..........................++++................++@$$$$$$$@@++...",
-"..++@@@$$@#@$$@@@++....+@##$$$$$@++........@@@#$$@##$$##@++..++@@#$$@##$$##@++.......++@@$$$$$@++.....+@@@$$######@@++.....+++@@$$$$$##@++....++##@##########++...+@@@#$$##@$$##@++....++@#$########++.....................................................++++++++.......................+++++++++...........++@+$$$$$$$@@@+...",
-"..++###@@@@@@@###++...++++@@@$$$+++.......++###@@@@@@@###++..++@@@@@@@@@@###++.......++####@$#@+......+@@@##@@@@@@@++......++@$$@@@@@+@@+......+++@+@+@+@#@#@++...++###@@@@@@@###++....@@@##+@@@@$$$@++..........+++.................+++................+++@@@$$$@+......+.+++++++.+......+$$$@#++++..........++@@##@@@@##@#++..",
-"..++###@@@@@@@###++.....+++@@$$$@+.........+@@#@@+@@@@###@+...+@@@@@+@@#@###@+......+++#@#@#$$@++.....+@@@##@@@@@@@++......++@#$##@@@@++.+.......+++++@@@##@#++...+@###@@@@@@@###@+....@@@##@@+@@#$#@@..........++++++..............++++++.............++++@@@#$#@@.....+++++++++++++....+.$#$##@@++++.........@@@@#@@@#####@+..",
-"..++###@@++@@@###++.....++++@$$$+@........+++++@+++@#@###++...+++++@+@@$$#@@++......+@@$$@@@$#@+......+@@@$$$$$$$@@@+......+@@$$@@#@@@@++..........+++@@##@@@++...++@###@@@@#@#@@++..+.@@@##@@+@@$$$@++.......+.@@$$$++...........+.@@$$$++..........++@@#####@@@++...++@@#@@#@#@@#@@+....++@+@#$$$@@++........+@@@@@+@@@##@++..",
-".+++###@@@++@@###@+.......++@#$$@++.........+++++++@@####++.....++++@+@$$###++.....++++$$@@@$$@++......@@@$$$$$$$#@@++....+@@@$$@#@##@@++............+++##@@@+....++#@#@#@@@@####++...+@@@##@+@+@$$#@@+........+@@$$$++............+@@$$$++.........++++@#####@@@++...++@#@##@#@##@#@++....++@#@$$$@@@+++.....+++@@@+@@@@###@+..",
-".++@###@@++@@@###++.......++@$$$+++............+++@@@####++......+++@@@#$@#@++.....+@@@$$@@@$#@++.....+@@@$$$$$$$@#@++....+@@@$$@#@#@@@@++...........+@@##@@@.....++@###@@@@#@#@@@+...+@@@##@@@@@$$$@++........+@@$$$++............+@@$$$++........++@@@@#####@+++....++#@#@####@#@##++....+++@@$$$#@@++++.....++@@@@+@@@###++..",
-"..++###@@@++@@###@+.......++@#$$@+............+++@@@$$@@@++.....+.@@$$$$$@@@++....++@@@@#@@@$$@++......++@@#@@@##$$$@+.....@@@$$$$$##$$$++...........+++$$@+++.....@@@@$$$$$$$@@@+.....@@@$$@@@@@$$$@++........+@@@#@@+............+@@@#@@+.......++@@#$$@@@@++++....+++#####@######@@+......+@@@@@##$$$@++......++@@@@$$#@@++..",
-"..++###@@+++@@##@@+.......++@$$$+++............++@@@$$@+++.......+@@$$$$$@@@++....++#####@@@$$@+++....+++@@@@@@@#$$#@++..++@@@$$$$$##$#$++..........++@@$#@+......++@@@$$$$$$$@@@@.....@@@$#@@@##$$$@@..........@@@#@++.............@@@#@++.......++#@#$$##@@@+......++@@######@####@@+.......++@@@##$$$@@+.......++@@#$$@#@++..",
-"..@+###@@++@@@###++........++$$$@+............+@@$$$@@@++.........++@@@#####@+....++$$$#####$$@@@+......+++@+++@+$$$@+....+@@@$$@@@@@$$$@++.........+@@@##+++.....++#####@@@#####++....+++##$$$@#$$$@++.........++++++..............++++++........+@###$$@@@+++.......+@@@#@@####@@##++.......+++@@#@$$$@@+......++@$$$@@@+++...",
-"..+@@##@@+++@@###@+.......++@#$$@++..........++@@$$$@@+++........+++@@@@####++....++$$$@###@$$#@@+.....++++++++@@$#$@@+...+@@@$$@@@@@$$$@++.........+@@@##++......++#####@@@#####++....+++@#$$$##$$$@@+..........+.+.................+.+..........++###$$@#@@++......++@#@##@###@##@#++.......+++@@##$$$@@+.......++$$$@@@++....",
-".++@###@@+@+@@###++........+@$$$+@..........+++@@$$$@@+........++++++@@@####++...+++$$$#####$$@@@++...+.++++++++@$$$@++...+@@@$$@@@+@$#$@@+........+@@@#@#++.....+++###@#@@@#@###@+.....+@@#%$$#@$$#@+............+.+.................+.+........+++#@#$$@@@@@++......+@@#@#@#@####@#++......+++@@@#@$$$@@+......+++$$$@@++.....",
-"..++###@@@++@@###++......+++@$$$@++.........+@@$$#@#@+++......++@@++++@@@###++...++@@##@####$$#@@++...++@@+++++@@$$$@++...+@@@$$+@@@@$$$+++........++@##@@@+......+@@##@@@@@@@##@@+.....+++@@@@@@$$$@++.............+...................+.........+++@+@@$$$@#@++.....+@@#######@####++....+++@@$$$#@@++++.......+++@##+++......",
-"..++###@@@@@@@###@+......+++@#$$@@++.......++@@$$@@@@@++.....++@@@+@+@@@@###@++...++#@######$$##@+....+@@@+@+@+@@$$$@@.....@@@$$@@@+@$$$@++........+@#@##@+.......+@####@@@@#@###++.....+++@@@@@@$$$++...........++++................++++...........++@@@$$$##@@++...+++#####@####@#@@+....+++@@$$$#@@@++.........+@@#@@++......",
-"..++###@@@@@@@##@++.....++@@@$$$+@+++.....++@@@$$##@@@+++....++@@@@@@+@@@###++....++#@##@###$$@#@@....+@@@@@@@+@@$$#@++....@@@$$@@@@@#$$@+.........++@#@#@+.......++###@@@@@@@###++.....+++@@@@@@$#$++.........+++++++.............+++++++...........++@@$$###@@@++...++@@@##@#@##@#@++...++@@@#$$$@@+++..........++@#@@+.......",
-"..++@@@$$@#@$$@@@++....++@@@@$$$#@@@@......@#$$$$@##@@@@@+...+@$$$@#@##$$#@@++....++++@@@###$$#@@++...+@#@$$@@##$###++.....++@#$#####$$$@++........+@$$$+@++.......@@@#$$@@@$$#@@@+....+++#@###$$##@+++.........@@$$$++............+@@$$$++............+++@@#@$$$@@....++@+++@++++@+++....+$#$##@@@@+++...........+@#@@+++......",
-"...+@@@$$@##$$@@@+.....+@@@##$$$#@@@@+...+++$$$$$#@##@@@@....++$$$##@@#$$#@#+......++++@@#@#$$@#@++...+@@#$$#@#$$###++.....+++$$###@#$$#@+.........++$$$@+.........+@#@$$###$$##@++....+@@@#@#@$$@@#++.........+@@$$$++...........++@@$$$+..............++++@@$$#@@....+.++++++++++++.....+$#$@#+@+++.............++@#@++.......",
-"....++@@@#@#@@@++.....++@@#@#######@@+....+@@@#########@@+...++@@@####@#@@+++........++@@######@@+....+++@@@####@+@+++......++@+#@###@@@+++........+@@@@+++.......++++@#@####@@++......++@@####@@@++...........+@@@#@++..........+++$$@@@++...............+++++@+++.......+....+..........+++@@+++.+..............++@#@+........",
-".....++@@###@@+++......+@@##@#@###@#@+....+@##@####@##@@@+....+@@@@#####@@++.........++@@@#@#@#@@@....+++@@##@#@#+++.........++@@#@#@@@@+...........+##@++.........++++@##@#@@@++......+@@#@###@@@++...........+@@###++...........++$$@@@++................++++++.........................++++++.+................++@@#++.......",
-"......+@@@#@@@+.......++@@@@###@@#@@@++...++@@#@@#@##@#@@++....+@@@#@#@@@++............+@#@###@@@+.......+@@##@#@++.........+.+@@@#@#@++...........++@@@+............+@@@@#@#@++.......++@@#@@@@+++.............+@@@@++..........+++$$@@@+.................................................+++.....................+@@@+........",
-"........+++++++........+++@+++@@+++++.....++@+@@+@++@++++.......++++@+@+++.............+.+++++@++.......+++++@+++++............+++@+++++.............++++.............++@+@+++++........+++@+@+++...............++++++...........+@@@@@+++.........................................................................+++.+........",
-".......+.++++............+++++.+++++.........+++++++++++.........++++++++...............++++++.+..........+.+++++...............++.++....................................++++..............+++++..................++.............++@@@++..............................................................................+.........",
-".............................+.+.............................................................+...................................................................................................................................+.+++++........................................................................................",
-"................................................................................................................................................................................................................................................................................................................................",
-"................................................................................................................................................................................................................................................................................................................................",
-".......+++++................+................+.+.+.+.................+.+.............+.+.+.+.............+.+.++.+............+.+.++.+.+..............+.+.............+........+............+.+.+.+..............+.+.+.+..........+........+..........+.+.+......................................................................",
-".....+++++@+++...........+++++++...........+++++++++++.............++++++++++......+++++++++++.........+++++++++++++.......++++++++++++++..........++++++++++......+++++++++++++++.......++++++++++++..........++++++++++......++++++++++++++......+++++++++...........+++++.....+++++.....+++++....+++++..........++++++.......",
-"....++@@#$$$@@+........++@@@@#@@++........+@@@#@@#@@@+++........+++@@@@@#@@+@+...++@@@#@@#@@@@++......+@@@#@#@@#@@@@+.....+@@@#@#@@#@@@@@++.....+++@@@@@#@@+@+...++@@@#@@+++@@@#@@+....+@@@@#@#@@@@@@........+@@@@#@@@@@@+...++@@@#@@++@@@@@@+....+@@@@#@@@++........++@@@@++...++@@@@+..++@@@@+++++@@@@@+......+++@@@@@@++.....",
-"....++@##$$$@@++.......++@@@#@@@++.......++@@#@#@#@#@@+++.......++@@@##@@@@@@@+...@@@#@#@#@#@@+++....++@@#@#@#@##@#@++...++@@#@#@##@###@@@+.....++@@@##@@@@@@@+...@@#@@#@@@@#@#@@@@...+.@@@@@#@##@@@@+......+.@@@#@####@@@+...@@#@@#@@@@#@#@@++..++@##@#@#@@++.......+@@@@@@+++++@@#@@@...+@@@@@+++@@@#@@@+.....++@@#@#@@+++....",
-"..++@@@@#$$$@@@+.......+@@@#@##@@++......+@@#@##@#@#@@@+++....++++@@#@##@@@@@@+.++@@@#@##@#@#@@+@+...+@@#@##@##@##@#++...+@@#@#@#@##@@#@@@+...++++@@#@##@@@@@@+.++@@@#@#@@@@@#@#@@@...++@@##@#@###@@@+......++@@#@#@#@#@@@..++@@@##@#@@@@##@@++..++@@#@#@#@@++.......+@@##@@@+++@@@#@@@.++@@#@@@@++@@#@#@@+...++++@@#@#@#@++++..",
-"...+@@@##@@@$$@++......+@@@$$$$$@@+......++###$$#####$$$++....+@#@$$#####$$$#@+..+@@$$$#######$$#++..++###$$#####$$$@++..++###$$#####$$$#@+...+@#@$$#####$$$#@+..+@@$$$##@@@##$$$@@....+@@@##$$$@##@@+.......+@@###$$###@@+..+@@$$$##@@@$$###@+..+@@##$$###@@........+@@$$$@@@+@@@$$$@@..+@$$$$$@@@@#$$$@@+...+@@##$####@$$$++..",
-"..++@#@##@@@$$@++......+@#@$$$$%@@++.....++###$$#####$#$++...++@@#$$@#@##$$$##+..+@@$$$#######$$$@+..++###$$##@##$$$@++..++###$$##@##$$$##+..++@@#$$@####$$$##+..+@@$$$##@@@##$$$@@....+@@###$$$#@#@@+......++@@#@#$$###@@...+@@$$$##@@@$$##@++..++#@#$$#@@@+........+@@$$$#@@@@@#$$%@@..+@$$$$$@@@#@$$$@@+..++@#@$$@####$#$+++.",
-"..+@###@@##@$$@@@+.....++@@#######++....+++@@@##@@@@@$$$@++.+++$$$@@@@@@@#@@#@+..++@###@@+@+@@#$$@@.+++@@@##@@@@@$$$@@..+++@@@##@@@@@@@@@#+.+++$$$@@@+@+@#@@#@+..++@###@@@@@@@###@+.....++++@$$$@@+++........+++@@@##@@@+++..++@###@@#####@+@+....++@@$$@@@+++......++@@$%$##@@@##$$$@@.+++###$$@@@@@$$$@@+.++@$$$@@@+@@@$$$@@+.",
-".++@###@@#@@$$@@@++.....++@#######++.....++@@@##@@@@@$$$@++..+@#$$@@+++++@#@##+..++@###@@@@++@$$$@@..++@@@##@@@@@$#$+++..++@@@##@@@@@#@##@+..+@#$$@@@+@+@@#@##+..++@###@@@@@@####@+.....+++@@$$$@++++.........++++@##@@@++...++@###@######@+++....+++@$$@@++........++@@$$$##@@@##$$$@@.++@###$$@@@@@$$$@++..++$$$@@@+++@$$$@@+.",
-"..++####@$$$$$@@@.......++@@#####@@++.....+@@@##@@@@@$$$@@+.++@$$$@@@+++@@@@@@+...++###@@+++@@#$$@@...+@@@##@@@@@$$#@+....+@@@##@@@@@#@@#@+.++@$$$@@+++++@#@#@+...+@####@@@@@@###@+.......+++$$$@@+.............++@###@@++....++###@@#####++.......++@#$@@++.........+@@$$$##@@@##$$$@+..+@@##$$##@@@$$#@@+.+++$$$@@++@+@#$$#@+.",
-"..+@###@#$$$$$@@@+......++@$$@@@$$@++....++@@#$$@#@##$$#@++.++@#$$@@++..+++@+++..++@####@++++@@###@...+@@@##@@@$$@@@++...++@@###@@@#$@@++++.++@#$$@@++++@+@@@++...++####@#@######++.......+@@$#$+++.............++@##@@@+.....+@###$$$$$@@++.......++@$$+@++.........+@@$$$$$@@@$$$$$@@..+@###@####@@$$$@++.+@@#$$@@++++@@#@#@@.",
-"..++##########@@@+.....++@@$$@@@$$@@++....+@@@$$@##@#$$$@@+..@@$$$@++.....+++.....++###@@+++.@@@@#@..++@@@##@@@$$@@++.....+@@@##@@@$#@++++...@@$$$@++++++@@+@++..++@#######@#####@+........++$$$@++..............++##@@@+....+++###$$$$$@@++.......++@#$@++..........++@$$$$$@@@$$$$$@@.+++####@###@@$$$@++.++@$$$@++..++@#@#@+.",
-"..++##########@@@+.....+@@@##@@@##@@@.....+@@@$$#####$$$@@+.++@$$#@++............+++###@@+.+++@#@##...+@@#$$$$$$#@@++.....+@@@$$$$$$$@++....++@$$$@++++@@@@@@@....++#####@#######++.......++@$$$@+..............+++##@@@+....++@###$$$$#@@++........+@$$@++..........++@$#$@#$$$#@$$$+@..++###@@$$$@@$#$@++.++@$$#@+++.+@@@###+.",
-"..++####@$$$$$##@++...++@@@##@@@##@@@+....+@@@$$@##@#$$$@@+.+@+$$$@++............+++###@@++.+@@@@##..++@@@$$$$$$$@+++.....+@@@$$$$$$#@++....++@$#$@@+++#@###@@+..+++#############@+........++$$#@++.........+.+.++@##@@@+.....++###$$$$$@@++........+@#$@@++........+++@$$$@#$$$#@$$$@+.++@###@@$$$@@$$$@@+.++@$$$@++..++@#@@#+.",
-".++@@##@#$$$$$@@@++....+@@###@@@##@@@++...+@@@$$#####$$$@@+.++@$$$@++............++@@##@@++.++@#@#@...+@@@$$$$$$$@++++....+@@#$$$$$$$@+.....+@@$$$+++++@#@@#@@+..++@@######@####@@+.......++@$$$@+.......++++++++++##@@@+....+++###$$$$$@@+++......++@$#@@+++++......+@@#$$#@$$$##$#$@+..++###@@$$$@@$$#@++.++@$$$@+++.++@@###+.",
-"..+@####@@#@####@+....+@###$$$$$$$###++...+@@@##@@@@@@#@##+.++@$#$@@++....+++.....+@###@@++++@@#@##...+@@###@@@$$@@@@+....+@@@###@@$#+++.....+@$$$@@+@@##$$$#@+...+@###@@@@@@@###@+......+.++$$$@++......+@@##++++@##@@@+.....+@###@@#@#$$@++.......++$$@@+++@@@+....++@$$$@@###@@$$$@@.++@###@#@@@##$$$@@+.+@@#$$@++.++@##@#@+.",
-"..++###@#@#@##@#@@...+++###$$$$$$$###++...+@@###@+@+@#@##@+.++@$$$+@++.+++++++....+@###@@++++@@@#@#...+@@@##@@@$$@@@@@+...+@@@##@@@$$++.....++@#$$@@+++##$$##@@...+@###@@@@@@@###++.......+@+$$#@++......+@###+@++@##@@@+.....++####@##@$$@@++.....++@$#@@+++@@@++...++@$$$@@#@#@@$$#@+..++####@##@##$#$+++..+@$$$@@+++++@####+.",
-".+++####@###@##@@++...+@$$$#@#@@#@$$$@+..++@@@##@@@@@##@##+.+++####@+++++@@@@@+..+++###@@++++@$$$@@..++@@###@@@@@@#@#@+..++@@@##@@@@@+.......+@###@@@@@@@@####+..+++####@+@@#@###@+......+++@$$$@+++....++@#$$@+@@@$$@@@+....++@###@@@@@###@@++....+@+$$@@@@@$#$@+...+@@#$$@@+@@+@$$$@@..+@###@@@@@$$$$$@@+.+++###@@@++@@$$$@@+.",
-"..++@@#@#@@@@@@@@...+++@$$$@#@@@#@$$$@@..++@@@##@@+@@@###@+.+++###@#@@+@@@##@@+..+@+###@@@@@@@$$$@@...+@@@##@@@@@#@@##+..++@@###@@@@++.......++####@@@+@@#@#@#+..+@@###@@@@+@@###@+.....+++@@$$$@+++....++@$$$@@@+@$$@@++....++@####@@@@##@#@@...+++@@$$@@@@@$$#@@...++@$$$@@++@+@$#$@@..+@###@@@@@$$$$$@++.+++####@@@+@@$$$@@+.",
-"..++#@##@@@@#@@@++...+@@$$$#@@@@@@$$$@@..++@#@##@@@@@##@##+..+@@###@@@@@@#@##@+..++@####@@+@@@#$#@@..+@@@###@@@@@@#@#@+..+@@@@##@@+@@++.....+.@@###@@@@@@@###@+..+++####@+@@#@###@+.....+++@+$$$@@@++....@+$$$@@@@@$$@@@.....+@+###@@@@@####@@+...++++$$@@@@@$$$@++.++@@#$#@@@++@@$$$@@.+++####@@@@#$$$$@@+...@@###@@@@@@$$$@++.",
-"..++@@@$$$$$$$@@++...+@@$$$$$@@#$$$$$@@..+@$$$$$$$$$$$$$@++...+@@@##$$$$$###@++..+@@$$$$$$$$$$##@++..+@$$$$$$$%$$$$$##+..+@$$$$$$$$@@.........+@@@$$$$$$$##@@@+..+@#$$$$$@@@$$$$$@@....+@#@$$$$$$$#@@+...++@#@$$$$$##+++.....+@@$$$$$@+@@@$$$@@..+@$$$$$$$$$$$$$@+...+@#$$$#@+@+@#$$$@@.++@$$$$$@+@@#$$$@+....+@@@$$$$$$$@@@+++.",
-"...++@@$$$$$#$@@+...++@#$$$$$@@@$$$$$#@.+++$$$$$$$$$$$$$@++..+.++@#@$$$$$##@@++.++@#$$$$$$$$$$#@#++..++$$$$$$$$$$$$$#@+..++$$$$$$$$@++.......++++@$#$$$$$###@++.++@@$$$$$@@@$$$$$#@...++@@#$$$$$$$##@+...++#@#$$$$$#@@+......+@@%$$$$@@+@@$$$#@..++$$$$$$$$$$$$$@++.++@@%$$@#+++#@$$$#@..+@$$$$$+@+#@$$$@++...+++@$#$#$$$#@@++..",
-"...+++@#$$$$$#@++....++@@@@@@@++@@@@@@+..++@@@@@@@@@+@++++....++++@+@@+@@+@++....++@@@@@@@@@@@+@++...++@@@@@@@@@@@@@+@+..++@@@@@@@@++..........+++++@@@@@++++.+..+@@@@@@++++@@@@@@+....+@+@@@@@@@@+@++...++++@@@@@@+@++......+@@@@@@+++++@@@@++..++@@@@@@@@@@@@@++..++@+@@@@+++++@@@@@+..++@@@@@++++@@@@++....+++++@@@@+@+@++...",
-".....++++@@@@++++....++++@+@++++++@@+++...+++@+@++++@+@++.........++++@++++++......++@+@@@+@+++++.....+++@@@@+@@@@+++++...+++@@@@+++.............+++++@+@++++.....+++@@+@+++++@++++.....++++@@@+@@+++......+++++@+@++.........++@++@+++++++++++...++@+@+@+@+@@+++.....+@++@++++++++++++...++@@+++++++++++.........++++@++++.....",
-".....++++++++++.......+++++++++++++++++...++++++++@+++++..........++++++++.........++++++++++++.......++++++@+++++++++....++++++++++..............++++++++........+++++++++++++++++.....+++++++++++++........++++++.+..........++++++....++++++....+++++++++++++......+++++++..++++++++....+++++....++++..........+++++++.+.....",
-".........+++.............+.+....+...+........+.++.....................+++.............+..+..+..............+......+.............++....................+.+.....................+++.........+...++++............+.+++..............+.+.......+.........++.+++++.+..........+.........+..........+........................+........",
-"................................................................................................................................................................................................................................................................................................................................",
-"....................................................................................................................................................................................................................................+++++.........+++++....................++++++...............................................",
-"...................................................................................................................................................................................................................................+@@@@@++.......+@#@+@+................+++@@@@@+..............................................",
-"........+.......................................+........................................+..+....................................................................................................................+...............+++@@#@@@++......+@##@++................++@@#@@@++..............++.............................",
-"...++++++++++++...........++++++++.........+++++++++++.............++++++++++.......+++++++++++++......+++++.+.+++++++.....++++++...+++++++....++++++...+++++++....++++++++++++++++....++++++++++++++++.....++++++++++++..........+@$$$##@++.....++@@@#@++...............+@@##$$$++.............+@@@+...........................",
-".+++@@@@@@@@+++++.......+++@@@+@+++......+++@@@@@@@++++..........+++@@@@@@++++....+++@@@@@@@@@++@+...+++@+@++++++@++++...+++@+++++++++@++++..+++@+@+++++++@++++..+++@@@+++++@@@++++..+++@@@+++++@@@++++..++++@@@@@@@@+@+++........++$$$##@++.....++@@@##++...............++@##$$$@+...........+++@@@++..........................",
-".++$#$$#$$$$$#@@+......++@@@#$$$$@@@+...++@@$#$$#$$$#@@++.......+++$#$$$#$$$$++...++$#$$#$$#$$$$$@+..++$$$$$@@@##$$$@@+.++@@$$$##+++#@$$$@@.++@@$$$#@@++#@$$$@@..+@##$$$$@@@#$$$$@@..+@##$$$$@@@#$$$$@@...+@#@$#$$$$$$$$++.......++@$$$#@@++......+@@@#@@++..............+@+##$$$@++..........++@$$$@++.........................",
-".+@$$$$$$#$$$##@@+....+++@##$$$#$@@@+....+@#$$$$$$$$##@+++.....++@@$$$#$$$$#$@+..++@$$$$$$$$$$$$#@+..+@$$$$$@+@@@$$$#@+..+@#$$$@#+++##$$$#@..+@#$$$##@@@##$$$#@..+@#$$$$$@@@$$$$$#@..+@#$$$$$@@@$$$$$#@..++###$$$$#$$$$$@++......++@$$$@@++.......++@@$$@++...............++@+$$#@+...........+@@$$$@@+.........................",
-"+++$$$$$$$$$$@#@@++...++@@##$$$$$@@@++...@@@$$$$$$$$@#@@@+....+++@@#$$$$$$$$$+@..++@$$$$$$$$$$$$$@@.++@#$$#$@@@##$$$@#+.+@@@$$$#@@+@@@$$$#@.++#@#$$#@@@@@#$$$@#.++@@$$$$$@@@$$$$$#@.++@@$$$$$@@@$$$$$#@..+@@@#$$$$$$$$$$@+........++$$$@++..........+@#$@@++..............+++@$$$@++.........++@@$$$@@++........................",
-"+++@@@##@@@@@####@+.+++###@#@@@@@$$$@++..+@@$$$@@@@@####@++....+@####@@@@@$$$@+..+@@#$$@@$$$@@$$$+@.++@$$$@@@++@@$$$@@+..+@@$$$@@@+@@@$$$@@.++@@$$$@@@@#@@$$$@@.++@@$$$@#@@@#@$$$@@.++@@$$$@#@@@#@$$$@@..++###@@@@@#@$$#@++......++@$$$@++..........++@@#@@+...............++@$$#@+..........++@#####@++........................",
-".+@@@###@@@@@####@+..+@@###@@@@@@$$$@@+.+++@#$$#@#@@#@###++...+@#@####@@#@$$$@@..++@$$$@@$$$@@#$$@+..+@#$$@@@+@+@$$$@@+.++@@$#$@@+++@@#$$@@..+@@$$$@@@#@@@$$$@@..+++$$$##@@@##$$$@+..+++$$$##@@@##$$$@+..+@####@#@@##$$$@+........++$#$@++.........++@@#@#@@+..............+++$$$@++........++@#@#####@+........................",
-"..+@@@##@@@@@@@@##+.++@$$$@@@@@@@###@@+..++@###@@@@@@@###++...++###@@@@@@@#@#++..++@$$$@@$$$@@$$$@+..+@###@@++++@#$$@@+..++@###@@+++@@###++..+@@$$$@#$$$@@$$$@@..+++@@@$$###$$@@@++..+++@@@##@@@$$@@@++..++@@#@@@@@$$@@@++.......++@$$$+++...........+@#@#@++..............++@$$$+++........++@$$@@@#$+@........................",
-".++@@@##@@+@@@#@##+.++@$$$@@+++++#####+..+++####@@@@#@###@+...++####@@@@@@##@@+...+@#$$@@$$$@@$$#@@.+++###@@++++@$$#@@+...++###@@@++@@###@+..++@#$$@@$$$@@$$#@@...++@@@$$#@#$$@@@+....++@@@##@@@$$@@@+...++@#@@@@@@$$@@@++.......+++$$$@+...........++@@$$$@++..............+@#$$@+.........+++$$@@@$$@++.......................",
-"..+@@###@@+@@@#@#@+.++@$$$@@++++@@##@@+..++@###@@@@@@@##@++...++#@#@#@@@+@@#@@+..++@#$$@@$$$@@$$$++..+@###@@@++++$$$@++..++@###@@+@+@@###@+..+@@$$$@#$$$#@$$$@+....+@@@$$###$$@@@+.....+@@@##@@@$$@@@+....+@@@@@@@@$$@@@+........++@#$$@++...........++@$$$+++.............++@$$#@++........+@@#$@@@#$@++.......................",
-".++@@@##@@+@@@####@.++@#$$@++++++#@@##@...++######@@$$##@@+...++@@@$$$$$#@@@@++....+@+@@@$$$@+@@+++.+++###@@++++@$#$@++...++@@#@@@+@@@@#@++..++@$$$##$$$##$$#@+.....+@@@@$$$@@@++.......++@##$$$##@++......+@@@@#####@@+..........+@$#$@+.............++@##@@+..............++$$$@+........+++@@@++@@@+@+.......................",
-"..+@@@##@@@@@#@#@@+.+@@$$#@++..++@#@#@+..+++###@#@#@$$@#@++...++@@@$$$$$@#@@@@+.....++@@@$$$@@++++...+@###@@+++++$$$@++...++#@##@@+@@###@@+..++@#$$@#$$$#@$$$@@......+@@#$$$#@@+++......+++##$$$#@@++.......++@@#####+++.........++@$#$@++.............+@@@$$++............++@$$$+++........++@@@@++@@+++.......................",
-"..+@@@$$$$$$$###@@+..@@$$#@+++++@@@#@#+...+@###$$$$$##@@@+.....++@@@@@@#$$$$$++.....++++@$$$@@+++...+++###@@++++@#$$@@+....+@@@##@@@##@@@+...+@@$$$$$@#@$$$$$@+.....++@@#####@@+.........++@@$$$@@+.........++@@$$#@@++.+........+++$$$@+...............++@#$@++...........+++$$$@+............+++.+++++........................",
-"..+@@@$$$$$$$###@++.++@$$$@@++++@###@@@..+++###$$$$$##@+++.....+++@@@#@#$$#$$++.......++@$$#@++......++###@@++++@$$#@++...++@@@##@@@##@@@+...++@$$$$$@#@$$$#$@+.....++@@######@++........++@@$$$+@++........++@@$$$@@+++.........++@$$$@++.............+++@##@@++..........++@$$$@++............................................",
-"..+@@@$$$$$$$##@@++..++$$$@@@@@@@####@+..++@###$$$$$##@@++....+++@@@@@#@$$$#$@+......++++$$$@+++....++@###@@++@+@#$$@@+.....@@@##@@@##@@@+....+@#$$$$#@@$$$$#@@...+++@@@#####@@@++........+@+$$$@++.......+++@#@$$$@@@@++.........+@#$$@+...............+++##@@@+..........+++$#$@+.............................................",
-"..+@@###@@@@@@@++...+++@##$$@@@@#$$$@@+...++###@@@@@$$@@@++...++#@#@@@@@@@$$$@+.......+@+$$$@++......++###@@++@+@$$$+++.....+@+$$@@@$$@++....++@###$$@@@$$###++...++@@#$$@@@$$@@@++.......+@@$$$+++........+@+$$@@@@@@#@@+.......++@$$#@++...............++##@@@+..........++@$$$+@.............................................",
-".++@@@##@@@@@++++....++#@@$$@#@##$$$@@+..++@###@@@@@$$@@@++..++@###@@@@@@@$$#@@......+++@$$$@@+.....+.@@##@@@@@@@$#$@@.......+@#$@@@$$@++.....++###$$#@@$$###@+...+@@@@$$@@@$$@#@++......+++@#$$@@++......++@@$$@#@@@###@++......+++$$$@@+...............++@@#@#++.........+@+$$$@++............................................",
-".+@###$$##@@@++......++@##$$@#@#@$$$@++..+@@$$$##@@@@#$$$@+..++@$$$#@@#@#@$$$@+......+@@@$$$@@@+......+@@###@@@#@###+++......+@@#$$$@@@+.....++@#####@@@#####++..+@@$%$##@@@##$$$@@......++@#$$$@@+++....++@##$$##@#@$$$+++......++@$$$++++..............++@@###++........++@@$$#@+.............................................",
-".++#@#$$#@#@@+.......++++@##$$$##@@@@@+.++@@$$$#@+@@##$$#@@..++@$$$###@@##$$$@+.....++@@#$$$@@+++.....@@@@#####@####@+.......++#@$$$#@+++.....++@####@@@#####@+.+.@@$$$##@@@##$$$@@.....++@#@$$$#@@+.....++#@#$$@##@#$$$@@........+@#$$#@++...............++@$$$@++......+++@@$$$@++............................................",
-".++####$#@@@+++.......+@@@##$$$##@@@@@+..+@@#$$@#@++@@$$$@+..++@$$$#@#@#@#$$#@+.....++@@@$$$#@@++.....+@@###@#@#@##@++.......++@@$$$#@++......+@#####@@@####@@+.++@@$$$##@@@##$$$@@.....++@@#$$$@@@++....++@##$$#@#@@$$$@+........+@$$$@#@++..............+++$#$++.......++@@#$$$+++............................................",
-".++@#######@@+.........+@@$$###$$$$$@@+...@@#####+@@@@###@@...+@#@########@@@++.....++@#######@++......++@@######@@@++........+@@###@@+.......++@@@@@+++@@@@@++..+@@#####@@@#####@@.....++@#######+@+.....@@@@#########@@++......++@#$$#@@++................@#$#@+.......++@@@$$$@+................................+.+.+.+.+....",
-".+@@##@###@@+.........++@@$$###$$$$$@@+..+@@@##@#++++@@#@@@..+++@@@#@#####@@@+.......++#####@#@++......+++@#@####@@@+.........+@@@##@@+........+@@#@@@++@#@#@+...+@@###@#@+@@###@@@.....++@@######+++.....+@@@#########@@+........++##@##@@+...............++@@+++.......+@@####@@+............................+++++++++++++++..",
-"..+++++++@+++..........@@@$$###$$$#$@@+...+++++@++..+++++++....++@+@+@+++++++........++++++@++++.........++@+@+++++............+++++++.........++++++++++++++.....+++++@++++@++@+++......+++++++++++......++@+++@+++++@++..........@@####@++.................++++........++@#####+++..........................++@@@@@@@@@@@@@@@.",
-"..++++++++..+...........+@@@@@+@@@@@++....++++++.+...++++......+.++++++++++.+..........++++++.............++++++++.............++++.+...........+.++..+.++..+......++++++++.+++++.+.......++++++++..........+++++++++++.+.........++@#@#@@++.................+++.........++@@#@#@++..........................+@+@@#@#@#@@###@@@.",
-".....+..................+++++++@@@+++.......+..........................+..................+..+................+.............................................................................+.++.................++++..............+++++++++............................+.+++@+@++............................@@@#@#@#@#@@#@#@@.",
-".........................++++++++++++...............................................................................................................................................................................................+++++..................................+.++++...........................++@@###############.",
-"................................................................................................................................................................................................................................................................................................................................",
-"................................................................................................................................................................................................................................................................................................................................",
-"...........................................++++.............................................++++.................................++++++++..........................++++.....................+++...................+++..........++++...................+++++.....................................................................",
-"........+++...............................+++++++..........................................+++++++..............................++++@@@+++........................+++++++..................++++++................++++++.......+++++++................++++@+++...................................................................",
-".....+++@@@+............................++@@$$$@++.......................................+++$$#@@++............................++#@##$$$$++.....................++@@$$$@++................++@$$$++..............++$$$@@......++$$$@@+...............++@$$$$$++..................................................................",
-".....++@@@@++............................+#@$$$@@+........................................+@$$###++...........................++@@##$$$$$@+......................+#@$$$@@+................+@@#$#++..............++$#$@@+.....+@$$$#@@+..............+@@$#$#$++..................................................................",
-".....+@@$$$@++...........................+@@###@@+......................................+.++@@###++..........................++@@$$$@@@@++.......................+@@###@@+................+@@###++.............+++###@@+.....++@@@##++...............++@@$$$++..................................................................",
-".....++@$$$@@+...........................+++###@@+++..................+.+...............+++@#@###@+..........................++@@$$$@@@@@++...........+.+........+++###@@+++.............+@@@###@++...........+++@###@@++....++@@###@+++.............++@@$$$@++............+.+.+................................................",
-".....+@@$$$@++...........++++++++........+@@###@@@++++............+++++++++++.........++++@+@####++.......++++++++.........+++@@@$$$@@@@@+.......++++++++++++....+@@###@@@++++...........++@@###++............++@@###@@+.....++@@@##@++++++..........++@@$$$@+........++++++++++++++.......+++++++++++............++++++++......",
-"......++@#@#@++.........+++@@@@@+@+.......++###@#@@@@@+++.......+++@@@@@@@@@@+.......++@@@@#@@###@+.....+++@@@@@@@+++......++@@#######@@@+.....+++@@@@@@@@@@@+....++###@#@@@@@++........++@#@#@@++..........++@@@@#@@@@++.....@@@@##@@@@@@+@..........++@$#$@++......++@@@@@@@@@@@@@++....+@@@@@@@@@@@++........+++@@@@@@@+++...",
-"......++@#@#@++.......+++@@@#@@@@+++......+@####@##@@@@+++.....+++@@@@#@#@@@@++....+++@@@#@#@###@@+....+++@@@#@@@@@+++.....+@@@#####@@#@@+....+++@@@@#@@@#@@@@....+@####@##@@@+++.......+++@@#@#+++.........+@@@@@#@#@@++.....+@@@##+@@@@@@@+.........++@$$$+++.....+@@@@@#@#@#@@@@@@++.+++@@@@@@@@@@@+++......+++@@@#@@@@@+++..",
-"......++++@@@+.........+@#@$$$$$$$@++....+++###$$$$$$$@#@+....++@#@$$###$$$$$@+...++@#@$$$$$$$###++...++@@#$$###$$##@+.....+@#@$$$$$###@@++..++@@#$$###$$$$$@@+..+++###$$$$$$$@@@+......+@@##$$$@+..........+@@###$$$$$++....++@@@##@@@$$#@@+..........++$$$@+......+@@$$$$$$$$$$$$$@@+..+@@$$$#####$$@@@+....++@@#$$###$$##@+..",
-".......++++@@+........++###$$$$$$#@++....++@###$$$$$$$##@@+...+@@##$$###$$$$$@+...+@@##$$$$$$$###@+...+@##@$$###$$@##++...++@#@$$$$$###@@+...+@##@$$###$$$$$#@+..++@###$$$$$$$#@@+......+@@##$$$@++.........+@#@##$$$$$++.....+@@@###@@$$#@@@.........++@#$$+@......+@@$$$$$$$$$$$$$#@@.++@#$$$#####$$@@@+....+@##@$$###$$@##++.",
-".........++@@+........++@@##$$#$$$@@++....++###$$$$$$$###++...++###$$###$$$$$@@...++#@#$$#$$$$###@+...++@##$$###$$#@#@+....+@#@$$$$$####@++..++@##$$###$$$$$@@+...++###$$$$$$$@@@++.....++@##$$$@+.........++@@####$#$$@++....+@@@###@#$$@#@+........+.+@$$$@++.....@@#$$$$$$$$$$$$$#@+..@@@$$$#####$$#@@++...++@##$$###$$##@@+.",
-"......................++@@@#@#@@$$@@@.....+@#####+@@@@$$$@+..++@#$$@@@@@@@$$$@+..+@@$$$@@@@@####@@+..++@$$$@#@@@@#$$$++....+++@@@###@+++++..++@$$$@@@@@#####@++...+@####@@@@@####++......++@@$$$+++.........++++@@@@@$#@+.....+@@#$$$$$@#@+++.........+++$$#@+......++@###@@#####@@@##+..+@@#####@@@@@###++..++@$$$@@@@@@@$$$@+.",
-"......................+@@@@@#@#@$$@@@+...+++###@#@+@@@$$$@@...@@$$$@@++@@@$$$@+...++$$$@@@+@@####++..++@$$$#@@@@#@$$$@@.....++@#@##@@@++....++@$$$@@@@@#####@++..+++#####@+@#@###@+.....+.+++$$$@+............++++@@@$$@++...++@@@$$$$$@@@++..........++@$$$@++.....++@###@#@#@#@##@#@@...+@#####@@@#####@+..++@$$$@@@+@@@$$$@+.",
-"......................++###$$###$$@@++....++###@@@@@@@$#$+@..++@$$$@@@++@@@@@++..+@@$$$@@@+@@@###@+..+@@$$$$$$$$$$$$$@+.....+++@#@##++++....+@@#$$@@+++@@###@++...++###@@@@+@@###++.......+@+$$$@++.............+++@@$#@+.....+@@@$$$$$@@++............+@#$$+++.....+++###@######@@##@@..+++###@@@+@@@###++..+@@#$$@@@++@@$#$@+.",
-"......................+@###$$###$$@@@+...++@####@++++@$$$@@...@+$$$@++++++@@@++..+++$$$@@+@@@@###@+..++@$$$$$$$$$$$$$@+......++#@##@@++.....++@$$$@@+@@@@###@+...+++###@@++@@@###@+.......++@$#$@+................++@$$@+.....+@@@$$$$$@@@++..........++@$$$@+.......+@###@@#@#@#@#@##+...+@###@@+@+@@###@+..++@$$$@+++@+@$$$@@.",
-".....................+++###$$###$$@@@+....++###@@@@@+@$$$+@..+@@#$$@++++++@+@++..+@@#$$+@++@@@###++..++@$$$$$$$$$$$$$@+......++@#@#@@+......+@@$$$@@++@@@###++...++@@##@@@+@@@##@@+.......++@$$$@++..............++@@$#@++....+@@@$$$$$@@++...........++@$$$@++.....++@####@###@#@#@#@+...+@@##@@+@+@@##@@+..+@@$$$@@+++@@#$#@+.",
-".....................++@$$$@@@@@$$@@@++..++@#####@+@@@$$$@+...+@$$$@@+++++@@@++..++@$$$@@@@@#####@+..+@@$$$##@@@@@###@+.....++@#@##@@++......++$$$@@@@@#####@++...+@###@@+++@@###@+......++@+$$$@+++.............++@@$$++....++@@@#####$$@+++........+++@#$$@@++.....+@###@@#####@#@##@..++@###@@@+@@@###@+...++$$$@@@+@@@$$$@@.",
-".....................++@#$$@@@@@$$#@@+...++@#####@@@@#$$#@+..++@$$$@#@++@+@@@@+..++@$$$#@@@@#####@+...+@$$$##@#@#@#@@@+.....++@@#@##@++++...+@@#$$@#@@@#####++...++@###@@@@@@@###++.....+++@@$$$@+++............++@+@$$@++....+@@####@#$$@@++........++@@$$$++++....++@####@##@#@@#@#@@..++@###@@@+@@@###++..+@@#$$@@@@@@#$$$++.",
-".....................++@$$$@@@@@$$@@@++..++@#####@@@@@$$$@@...++$$$@@@@@@@@@@@@...++$$$#@@@@#####@+..+@+$$$@#@@@@@###++....++@@@###@@@@++....+@$$$@@@@@#####@++..++@###@@@+@@@###@+.....+++@@#$$@@@+++.......+++++@@@$#@+....+@@@@####@$$@@@++......++@@@$$$@@@+++..++@###@@###@##@###@..++@####@+@@#@###@+...+@$$$#@@@@@@$$$@@.",
-".....................++@#$$$$$$$$$$$$@+..+@@$$$$$$$$$$@#@++..+++@##$$$$$$$$$$@@..+++@@#$$$$$$$$$$@@...++@@#$$$$$$$$$$@+....+@@#$$$$$$$@@@+...++@##$$$$$$$##@@+...+@@$$$$$@@@$$$$$@@...++@#@$$$$$$$@#@+.......+@@@@#@###++....+@$$$#@@@@$$$$$@@+...++@@##$$$$$$@#@+..+@@$$$##@##$$#@#$$@..+@@$$$$$@@@$$$$$@@...++@#@$$$$$$$@@@++.",
-"......................++$$$$$$$$$$$$$++..+@@$$$$$$$$$$@#@++....@@@@$$$#$$$$$$@@...++#@@$$$$$$$$$$@@....@@#@$$$$$$$$$#++....+@#@$$$$$$$##@+....@@@@$$$$$$$###++..++@@$$$$$@@@$$$$$@@....+@@#$$$$$$$#@@+.....++@@@@@#####++....++$$$##@@@$$$$$@@+....+@@#$$$$$$$#@@+..+@@$$$####@$$##@$$@..+@@$$$$$@+@$$$$$@@....@@@#$$$$$$$##@++.",
-"......................++@+@@@@@@@@@@@++..+@@@@@@@@@@@@@+++.....++@@@@@@@@@@@@++....++@+@@@@@@@@@@@@....++@@@@@@@@@@@@+.....+@@@@@@@@@@@@++....+@@@@@@@@@@###@+...+@@@@@@@+++@@@@@@+....+@@@@@@@@@@@@++......+@@#####@@@++....++@@@@+@+@@@@@@@++...++@@@@@@@@@@@@++..+@@@@@@@@@@@@@@@@@@..+@@@@@@@@++@@@@@@+....++@+@@@@@@@+@++..",
-".......................++@+@@@@@@@@@++....++@@@+@@@@@@+++.......++++@@@@@@@++++.....+++@+@@@+@@@@++......++@@@@@@@+++.+....+++@@@@@@@@+++......+++@@#@#@####+++...++@@@+@+++@@@@@@+.....+++@@@@@@@+++.......+@#@#####@++......++@@+@+++@@@@@++......+++@@@@@@@+++....++@@@@+@+@@@+@@@@+...++@@@@@+++@@@@@@+.....+++@+@@@@@+++...",
-".......................++++++++@++++++....++++@++++++++...........+++++++++++........+.+++++++++@++.......++++@++++++......++++@@@@@+++++......+++@@@@@#@###++....++@@@++++++++++++.....+++++@++++@++......++@@#####@++.......+++@+++..++@+@++......++++++@+++@++....++@@+++++++@+++@++...+++++++++++@+++++......+.+++++++......",
-"..........................+++++.+++.+........+.++++++...............++++.+++...........+++++++++............++.++++...........+..+.+++++.......++@@@##@###@#++.....+.+.+++..++++++.........+++++++..........+++++++@+++........+......+.+++..........+.+++.+++..........+++.++.+++.+.+......++++++..+.++++.........+++++.+......",
-".................................................................................................................................+.............++@@#@@#####@++................................................+++++++...........................................................................................................",
-"................................................................................................................................................................................................................................................................................................................................",
-"................................................................................................................................................................................................................................................................................................................................",
-".....................................................................................................................................................................................................................................+++@...............++++.............+++@...................................................",
-".....................................................................................................................................................................................................................................++@@++.............+@@@+.............+@@+++................................................",
-".....................................................................................+++...........................................................................................................................................++++@@++............++@@@++..........+++@@@+++...............................................",
-"....................................................................................+++@@+........................................................................................................................................++@##@@++............++$$$++...........++@@@#@++..............................................",
-"...................................................................................+@@@@#++.......................................................................................................................................+@@##@@++............++$$$++............+@###@@...............................................",
-"....................................................................................@@@##@+++.....................................................................................................................................++$$$@@+............++@#$$@++...........+++$$$+++.............................................",
-"...+++++++++++...........++++++++++++........+++++++++++..........+++++++++.......++@@@##@++++.........++++.....++++.......+++++++.+++++++.....+++++....+++++.......++++++.++++++......+++++....+++++.......++++++++++++.........++@$$$+++............++@$$$++............+@@$$$@+..............................................",
-"..+++@@@@@@@+++++......+++++@@@@@@@+++.....+++++@+++@+++++......++++@@@@+++++....+++@@@##@@@@+++......+++++++.++++++++....+++@+@++++++@@+++...+++++++++++++++++....+++@+++@++@++++....+++++++++++++++++....++++@@@@@@@++++........+@#$$@+.............+++$$$@++............++$$$@++.............................................",
-"++@@$#$@@$#$##@@+.....++@@###$##@$$#@@+....+@###$@@@$$##@++....++@#@$#$#@#@@+.....+@$$$$$$$#$$+@+...++@@$$$@@+++$$@#@++.++@@$$$$$@@@$$#$$@@.++@@$$$@#++@@#$$$@@..+++$$$$$@@@$$$$#@+.++@@$$$@@+++@#$$$@@....+@#@$#$#$#$#@@+.......++@$$$@++............++@#$$@+............++@#$$++..............................................",
-".+@@$$$##$$$##@@@+....+@@@##$$$##$$$#@+...++#@#$$#@##$###++....++@##$$$#####++...++@$$$$$$$$$$@++....+@@$#$+@++@#$#@#++..+@@$$#$$@@@$$$$$@@..+@@$$$#@@@+#@$$$#@...++$#$#$@@@$#$$$++..+@@$$$#@@@@@@$$$#@...+@@##$$$$$$$###++......+++$#$@+..............+@$#$@++............+@$$$@++...........+++++++++.+.......................",
-"++@@$$$##$$$##@@@++..++@@@##$$###$$$@@+....+@##$$@#@$$###++..+++@@##$$$@##@#++....+@$$$$$$$$#$@++...++@#$$$@@++@$$##@++.++@@$$$$$@@@$$$#$#@.++@#$#$#@@@@#@$$##@..+++$$$$$@@@$$$#$@+.++@##$$#@@+@#@$$#@@...++@##$$$$$$$@#@++......++@$$$+@.............++@$$$+++...........+++$$$@++........+++++++++++++++......................",
-".+@@#$$$$@@@##$$$@+..++$$$##@@@$$#$$@@+...++@@@$$$$$@@##@@+...+@#@$$@@@#####++....++@#@##@@@@@+++....+@@#$$@@@+@@@###@+..+@@#$$@@@@@@@$$$@@.++@@$$$@@###@@$$$@@...++@@@$$@@@$$#@@++..+@@$$$#@@@@#@$$$@@...+@###@@#@@$$@@@+.......+@@$$$@++............+++$$$@+............++@$#$@@+........+@@@$$@#@@@##@++.....................",
-"++@@$$#$$@@@##$$#++..++$$$##@#@$$$$#@@.....++@@$$$$$@@@#@++..++@##$$@#@#####++....++@#@##@@@@@+......++@$$#@@@+@@####++..++@$$$#@@@@##$$#@+..+@@$$$@@###@@$$$@@...++@@@$$@@@$#@@@++...+@#$$@#@@+#@$$$@+....+@####@##$$@@@+......++@@$$$+++............++@$$$@++...........++@$$$@@+.......++@@@$$##@@@###++.....................",
-"..++###@#@@@@+$$$@+.++@$#$@@@@@#@###@++.....++@$$@@@@@@+++...++@@@$$$$$@@@@@++....++@@@##@@@++.......++@###@@++@@@###@+..+++@@@##@@@@#@#@++.+++@###@#$$$#@###@+....++@@@@$$$@#@@+....++@@@@$$@@@$$@@@++...++@@@@@$$$#@@++........++@$$$@+..............++$#$@+............+++$$$@+++.....++@$$$@@$$$$$##@@+.....................",
-".++@####@@+@@@$$$@@..++$$$@@+@@#@###+++.....++@$$@@@++++++...++@@@$$$$$#@@@@+.....++@@###@++.++......+++###@@+++@@##@@+...++@@###@@@##@@@++..++@####@$$$@####++.....++@@#$$$@@@++.....++@#@$$@@@$$#@@++....++@@@@$$$@@@+++.......++@$#$@++............++@$$$+@.............+@#$$@++.......+@$$$#@$$$$$@#@@+.....................",
-"..++###@@@@@@@$$$@+.++@#$$##@@@$$###@+......+++$$@@@+++.......+@@@#$$$$@#@@@++.....+@@@##@+++.........+@###@@@+@@@###@+...++@@@@#@@@###@@+....++###@#$$$@@###@+.....++@@@$$$#@+++.......++@$$@#@$$@@++.....++@@#@$$$#@@++........+++$$$++.............+++$$$@++...........++@$$$@+........++$$$#@$$$$$##@++.....................",
-".++@###$$@@@##$$$@+..+@$#$###@#$$##@@+......+@+$$@@@++.......++@@#@@#@#$$###++....++@@@##@@+++++......++###@@@++@@###@+....+@@@$$@@@$#@+++....+@#####$$$$$###++.....++@#@$$$@#@++.......+++@#$$$@@@+.......++@@$$##@@@@@++.......++@$$$@++............++@$#$+++...........+++$$$+@........++@+@+@@+@@@@@++......................",
-".+++###$$@#@##$$#++..++$$$##@#@$$###@+.....+++@$$@@@+++......++@@@@@###$$##@@+......@@@##@@@@@+++....+++###@@@@@#@###@+.....++@#$@@@$$+@+....+++#####$$$$$###++....++++#@$$$#@@+++.......+@##$$$##+++.....+++@@$$###@@@@@+.......+++$$$@+.............+++$$$@+............++@#$$@++.........++@+++@+@++++.......................",
-"..+@#####$$$##@@@++.+.++@@#########@@++....+@@@$$@@@@@++.....++#####@@@#@$$$@+.....+@@@$$@@@@#@@@+....++@####@@@##$$#@@.....++@@#$$$#@@+......++@@#$$@@@$$@@@++....+@@#$$@@@$$@@@+.......+@@@$$$@@+.......++@#@$$@@##@##@@.......++@$#$@++............++@$$$+++...........++@$$$+++........++.+.+.+++++.+.......................",
-"..++#####$$$@@@@++....++@@##########@+....++@@@$$#@#@@+++....++######@#@#$$$@++.....++@$$#@#####@++...+@@#####@@##$$$@@......+@@#$$$#@+++.....++@@@$$@@@$$@#@+....++@#@$$@@@$$##@++.....+++#####@++........@@##$$@#@@####++.......++$$$@@+.............+@@##@+............++@$#$@+..............................................",
-".++@###@@@+@@@+++.......++++@@@@@###+++...++@#@$$@#@@@@++....++######@#@#$$$@+.....++@@$$@@###@#@+....++@#@##@#@##$$#@@......++@@$$$#@++......++@@@$$@@@$$@@@+....+@@@#$$@@@$$@#@++....++@+@###@@++.......++#@#$$@##@####++.......++$$#@++.............++##@@+............+@@$$#@+..............................................",
-".++@###@@@@+++...........+++@@@@####@+....++$$$$$###$$@++.....@@@##@$$$$$@@@+++.....+++@@$$###@@++.....+++@##$$$#@$$$@@.......+@@#@#@@+........+@@@#@@@@@#@@@+....++$$###@@@#$$$$++...+++@@#@###++........++@#@$$$$$$$#@@++......++@#$$@@++............++@#@++...........+++@$$$++..............................................",
-".++@####@@+@+.+.........+.+++@@@@###@++...++#$#$$####$+++.....+@@@#@$#$#$@@@+........++@@$$$@@@@++.....++++#@$#$@##$#@@.......+++##@@++.........++@@@++@@@@++.....++#$$##@@@$#$#$++...++$$$$$$$$++........++@@##$#$#$##@@+.........+@@@@@++.............+++++............+@@@@@@++..............................................",
-".+@@$$$$$#@@+..............+@@#$$$$$@@+...++++@+@+@+@+++......+++@+@+@@@++++..........++++++@+++.........+++@+@+@+@+++.........++++++............+++++++++++......+++++++++++++@++....++$#$$$$$$@++........++++@+@@@+@+@++.........+++@#@+++............+.++.............++#@+@+................................................",
-"++@@$$$$$@@@.+.............+@@@$$$$$#@+....+++++++++++.........+.+++++++++.............+++++++.+...........+++++++++++..........+++.+.............+.+..............+++++++++++++++.....+@@@@@@@@+...........+++++++++++............+++++++.................................+++++................................................",
-".+@@@@@@@@@++..............++@@@@@@@@++.......+...+.......................................+...................+.+.+.+.................................................................++@@@@@@@+++..............+..+........................................................+...................................................",
-"..++@@@@@@++................+++@@@@@+++.................................................................................................................................................@@@@@@@+................................................................................................................................",
-"................................................................................................................................................................................................................................................................................................................................",
-"................................................................................................................................................................................................................................................................................................................................",
-"..................................................+.+.............................................................................+.................+++++++.....................................................................................................................................................................",
-".................................................+++++..............++++++..............................+++++.+.+++++...........+++++.............++++@@+@+++...............................++++.+...............+.+............................................................................++++.+..........................",
-"................................................++#@#++...........+++@@@@++...........................++@@@@@+++@@@@++.........++#@#++...........++@@$#$$$@#@+...........................++++@@@+++............++@+@++.......................................................................++++@@@+++...........+++++++.......",
-"...#############...............................+++###+++.........++@@@@@@@++..........................++@@@@@+@+@@@@@++........+@@##++..........++@#@$$#$$@#@++........++.++++..........+++@@@@@@@+++.........+++@@@@++.....................................................................+++@@@@@@@+++........++++@@++++.....",
-"..##$$$$$#$$$$$##.............................++@@$$$@@++.......+++#$$#$$$@@+.......++++.+.+.++++.....+@$$$$$@@@$$$$$@+........+@$$$++..........+@@$$@#@#####++.....+++@@+++@#+.......++@@@$$$$#$$@@@+.......++@@@@@$$++..................................................................++@@@$$$$#$$@@@+.......+@##$#$$@++....",
-"..##$$$$$$$$$$$$#............................+++@@$$$@@@++......++@$$$$$$$@++......+++@++++++++@++...++@$$$$$@@@$$$$$@+.......++@#$$@++........++@@$$#@@#@###++.....++@@@+++#@++.......+@@@$#$$$$$#@@++......++###@##$++...................................................................+@@@$#$$$$$#@@++.....++#@$$$$#@@+....",
-"..##$$$$$$$$$$$##............................++@@@$$$@@@++......+@@#$$$#$$@@+......+@@@@@@@@@@@@++....+@$$$$$@@@$$$$$@+........+@$$$++.........+@@@$$@#@#@###++.....+++@@+++#@+......+++@#@$$$$#$$@@@++......++@#@#@$$++.................................................................+++@#@$$$$#$$@@@++.....++@#$#$$#@++....",
-"..#$$$%%%$$$$$$$#...........+.++............+@@@$$$$$$$@@+.....+@@@$$@@@@@+++.....++@#@$$#$#$$#@#++..+++@@#$$@@@$$@@@++.......+++$$$@++.......++@@@$$@#@@@@@@++.....+++@+++++@+.......+@$$$#@$$$##$$$@+.....+@@#####$$@++..........+.+.+.+++........+++++++++++++.........................+@$$$$#$$$##$$$@+......+@@@@@@@+++....",
-"..##$$$$$$$$$$$##..........+@@@@@+.........++@@#$$$#$$$@@@.....++@@$#@@+@++++.....+@@##$$$$$$$#@#++...++@@#$$@@@$$#@@++........+@#$$+++.......++@##$$#@#@@@@@+.......++++++++++.....+++@#$$##$$$@#$$#@+.....++@@###@$#@++........+++++++++++++....+++@@@@@@@@@++++......................+++@#$$$$$$$@#$$#@+......++@@@@@@+++....",
-"..#$$$%%%$$$$$$$#..........++@@@@+.........++###@@@@@##@@++...++@@@##@+@+++.......++#@###@@@####@++....+@@@$$@#@$$@@@+........++@$$$@+.......++@#$$@#$$$##@@@+..............+........+#@###$$@@@##@#@#@.....@@@##@@@$$@++........+@@@##@@###@@+....@##$#$$#$#$$$$++......................+@#@#@$$@@@$$@#@#@........+++++++......",
-"..#$$$%%%$$$$$$$#.........+.@+@@@++........++####@@@@@#@@+.....+@@###@@+++........++###@##@@#####++.....++@$$@#@$$@+++.........++$$$++.......++@$$$#@$$$##@@@++.....................++@@##@$$##@####@#@....++@@##@#@$$@++......++@@##@#@@##@@@...++@$$$$$$$$$$$#$@+.....+++++++++++.....++@#@#@$$##@$$##@#@.....................",
-"..##$$$$$$$$$$$$#.........++@@#@@+........+++####@@+@#@+@++...+@@@@##@@@+++......++@@####@#@####@@+....+++@$$#@##$@@+.........++@#$$@++......++@#$$@#$$$##@@@++.....................++#@###$$@#@##@#@#@.....@@@##@@@$$@@++....+++@#@###@@###@@+...++$#$#$$$$#$$$$@+....++++@@@@@@@+++....@@@#@#$$@#@$$@#@#@.....................",
-"..#$$$$$$$$$$$$$#..........+#@@##++........+@@##@@@@+@@++.....+@$$$$$$#$@@........++###@#@@@@@###++.....+++##$$$##+@+..........++@@@++.......++@$$$##@#@##$$$@+.....................++#####$$@@@@@#@##@....++@@#######@@+.....+@@@$$@@@#####+++....+@@@@@@@@@@$$#@@...+@@##$#$#$#$$$++..++###@@$$#####@#@##.....................",
-"..##$$$$$%$$$$$##.........++@##@@@+.......++@####@@+@@+@++....++$$$$$$$#@@+.......++###@@@@@#@###@+.....++@@#$$$##@++..........+@@@@@+........++$$$##@#@##$$$@+.....................++@##@#$$@@@#@#@@##.....++@#####@#@@++...++@@@$$@@@#####@+....+++@@@@@@@@@$$$@+...+@@@$$$$$$$$#$++...@@@#@#$$#####@#@#@.....................",
-"..#$$$$$$$$$$$$##........+++#@###++........++@####@@@#@@++....++@@@$$@#@@++.......++@#####@@####@++.....++@##$$$@#@@+..........+@###++.......+++@@@##$$$##$$#@+.....................++@@$$$$$$$$$$###@@....+@@@#$$$$$$@@+....+@$$$##@#@$$@@@++......+.++++@@@@$$#@+...+@@@@@@@@@@@@@+...++@@###$$@@######@@.....................",
-"..#$$$$$$$$$$$$##.........++#@###++........++##@###@@##@@++...+@@@@$$#@@@++......++@#####@@###@##@+.....++@@#$$$##+@+..........++###@++........++@@##$$$##$$#@+......................+@@#$$#$$$$$$###@@.....+@@$#$$$#$@@++...++$$$@#@#@$$@@@@+.......+..+.++++$$$@@....++@@@@@@@@@@@++...+@@###$$#@@#####@@.....................",
-"..#$$$$$$$$$$$$##........++@$$$$$@++.......++@####@@@#@@@+....++@@#$$@#@@++++.....++@#####@#####@++....+++@##$$$@#@++..........++##@@+........+.++@@@@@@$$###++.....................++@@$$$$$$#$$$###@@.....++@$$$#$$#@@+....++$$$#@#@#$$@@@++.............+++#$#@+...++++@@@@@@@@++....++@@###$$@#@#####@@.....................",
-"..#$$$$$$$$$$$$##.........++$$$$$@+.........++@+##%$$##@++....+@@#@$$@@@@@@@++...+++#@##$$$$$$#@#++.....++@@@$$$@@@@++........++@$$$++.........+++@+@@#@$$###++.......................+@@######@####@++.....+++@@@#@@@+++....++@@@$$@@@#####@++.............++@@@++.....++.++++.+.++.....++@@#@$$#@#$$###++.....................",
-"..##$$$$$$$$$$$$#........++@#$$$$@++........+++@##$$$##+++....++@@#$$@@@@@@@+++...++@##$$#$#$$#@#++....+++@@#$$$@@@++.........+++$$$@++.......++@@#@@@@@$$@@@++.......................++@#@##########++.....+++@@@@@@@++.....++@@@$$#@######++..............+.@+@++...........+.+.........++###$$@@@$$#@#++.....................",
-"..#$$$$$$%%%%%$##.........+@$$$$$+++.........++++@$$$@@++.....+@$$$$$$$$$#$$$@+....+@@@@@@@@+@@@++.....++@@$$$%$$$@@+.........++@$$$@+........++#@#@@@@@$$@@@++.......................++@@@@@$#$#@@+@+.......+.++++++++.......++@@#@###@@###@@+................+...........................+++@@#$$$#@@@++......................",
-"+.##$$$$$$$$$$$$#.........+@$$$$$@++...........++@$$$+++.....++@$$$$$$#$$$$$$++....+++++++++++@@++.....++@@#$$$$$$@@+..........++$#$@++........@@##@@@@@$$@@@+.........................+++@#@$$$@#@+++...........++............+++@#@#@@@###@@+............................................++@@@@$$$@#@@++......................",
-"+.#$$$$$$$$$$$$##........+++$$$$$@+............++@#$$@++......+@$$$$$$$$$$#$$@+.....++++++.+.++++.......++@$$$$$$#@@++........++@$$$++........++###$$$$$$$@++...........................+++@@$#$@@+++...........................++@@#@#@+#@#@++.............................................+++#@#$$@@+++.......................",
-"..##$$$$$$$$$$$#..........++$$$$$+++............++@@+++.......++@@@@@@@@@@@@++.......++.................+++@@@@@@@+++..........++$$$@+........++@##$$$#$#$+@+............................++++@+@+@+..............................++++@+++@++++...............................................+.+@++@@++.........................",
-"...############..........+++@#@#@@+..............++@@+.........+@@@@@@@@@@@+@++.........................+++@@@@@@@++..........+++$$$+++.......++@@@@@@@@@@++...............................+++++++................................+++.+++++++..................................................++++.++..........................",
-"..........................++@@#@@++..............................+++++++@+++..............................+++++++++............++@@@+..........++@@@#@@@+++.......................................................................................................................................+.............................",
-"..........................++@@@#@+................+................+++++.....................................++.................++@+++..........++@@@@@@++......................................................................................................................................................................",
-"...........................++@++++..............................................................................................++@+...............++++.+.......................................................................................................................................................................",
-"....................................................................................................................................................................................................................................................+.+.................+.+................++++.................................",
-"................................................................................................................................+.++++++...........................................................................................................+++++...............+++++..............++++++++..............................",
-".......++@++++................................++@+@++.............++@+@++.....................................................++@+@@@+@@++..................................................++++.................................................++@@@@@+............++@@@@@+............+@@##@#+++.............................",
-".......++@@@++................................++@@@@++............++@@@@++..................................................+++@@@@@@@@@@+.................................................+++@++................+.+..............................@@###@@+............@@###@@+..........++@#@###@@++............................",
-".....+++@@@@@+++.............................++@@@@@@++..........++@@@@@@++...............+++..............................+++@@@@@@@@@@@+................................................++@@@@++............++++++++..........................++@@#@#@++..........++@@#@#@++.....+++..+@@##@##@@@+...+++......................",
-".....++##@@@##++............++@++...........++@#@@@##@++........++@#@@@##@++............+++@@@+...........................++@#@$$$%$$$$$$@+..............................................++@@$$$++............+@@#@#@@+...........................@@$$$@@+......+++...@@$$$@@++...+++@@.+@@@@#@#@@@+++++@@@..........++++.......",
-"...+.++###@###+++..........++@@++...........++##@#@##@@+........++##@#@##@@+...........++@@@@@+...........................+@@##$$$$$$$$$#@+..............................................+@@#$$$++..........+++@@#@#@@@+........................+++@$#$@@+...++++++.+++@$#$@@++.++@@@@@.+@@#@#@##@@+++++@@+..........+@##+......",
-"....@@@##@@@##@@+.........+++$$$+++..........+@@@@@#@@++.........+@@@#@$$+@+...........++#@#@++..........................+@@$$$@@$$$##@@@++...............................................++@$$$@++.........++@##@@@##@++........................++@###@@++...@@@#@..++@###@@+++++@@#@@.++@@@#$$@@@+@@@@#@@.........++#@@++.....",
-"....+@@##@@@##@@@.........++@$$$@++.........++@@@#@##@++........++@@#@@$$@++...........++###@++........+++......+++......++@$$$@@$$$##@@@++...............................................++@$$$@+.........++@@##@@@##@@+........................++@###@@+++++@@@#@..++@###@@+++@@###@@.++@@#@$$@@@@@@@@##+.........++@@@+......",
-"...++@@##@@@##@@+.......+++@+$$$@@+++........+@@@@@##@++.........+@@@#@$#@@++.........++@@#@++........+++++++.+++++++.....@@$$$#@$$$###@@+...............................................++++$$#@++........++@@##@@@##@@@+.......+.+..+...........+@###@@@+++@@@@#@...++###@@@++@@@##@@.++@@@#$$#@@@@@#@#@+.........++@@@++.....",
-"....++@##@@@##@++......+@@@@@$$$@@@@@........+@@###@@@++........++@@@#@##@@+...........++@@@++.......+@@###+@+++$$@#@+...++@$%$@#$$$##@@@+...........+.+..................................++@$$$@++........++@@##@@@##@@+.....+@+@++++@++++......++@###@@@++@@###@+..+@@###@@@@@@#@@@@+.+@@@@@#@###@@###@++.........+@@@@++.....",
-"....++@@#@#@#@@++.....++@@@@@$$$@@@@@++.....++@@###@@++.........++@@#@###@@++.........+.+++++........+@@#@#@@+++#$@#@++...@@$$$#@$$$##@@@++........++++++.................................+@+$$$@++.........@@@##@@@##@@@+....+@@@+@@@@@@+++.....+++###@@@@@@@##@@+..+++###@@@@@####@@+.+@@#@#@##@#@@##@@++........+++###@+.....",
-"......+@@@@@@@+++.....++$$$$$$$$$$$$$++.....++####@##@++........++$$@@###@@+.............++..........+@@$$$@@+@@@####++..++@###$$$$$##@@@+........++@#@#+.................................+@@$$$@@+.........+@@###@@##@++....++@###@@@@$$@@++....+@######@@###@#@@+..+@###############@.+@@#####@#@##@#@@++........+@+###++.....",
-".....+++@@@@@++.......+@#$$$$$$$$$$$#@+.....++@#@@##@@@+........+@#$#@@##@@++........................+@@#$$@@+++#@###@+...++@#@$$$$$##@@@+........+@@###++................................+@@$$$@@+........+++@##@#@##@@+....++#####@@@$$@@@+...++@@#######@###@#+@.++@@####@#####@##@#.++@######@#####@@@........++@@$$$@++....",
-".......++@@@++........++$#$$$$$$$$#$$++.....++####@#@@++.........+#$@@@##+@+.........................+@@$$#@@@+@@####++...++@##$$$$$###@@+........+@@#@#++................................+@@$$$@@+.........++@##@#@##@++....++@####@#@$$@@@@+..++@@####@######@#+@.++@##############@#.++@@###@#@###@#@@+......+++@@#$#$++.....",
-".........+.............++@+@@$$$@@@++++......+@@@@@@@++.........++@@@@@@@++...........................++###@@+++@@###@+....+++@@@$$$##@@@+.........@@$$#@+...............................++@@@@@@@++........+@+#@###@@@++.....+@@@$$###@@$$$@++..++@+@@@@###@@$$$@+..+++@@@#@#@#@#@@@$$..++@+@@@$$$#@$$$@@+.....++@@#@$$$+++....",
-".......................++++@@$$$@@+@+........++@@@@@@++..........++@@@@@+++..........................++@###@@@+@@@##@@+....+.++@@$$$##@@@+........++@#$$++................................+@@@@@@++.........++@@#@##@#@++.....++@@$$@####$$$@@...+.++@@@@####@$$$@+...+++@@#@##@#@@@@$$...+++@@@$$##@$$$+++.....+@@###@@@++.....",
-".........................+++@###@+++..........+++++++...............+++++.............................+@###@@+@+@@###@+.....+++@@$$$##@@@+.........++@+++...................................++.+++.........++@@$$$$$$$@@++...+.@+@###@#@@$$$@@+...++@+@##@@@#@$$$@@..+++@@@##@@@@@###@@....++@###@@#@$$$@@+....++#####@@@+++....",
-"........................++++@###@+++............++....................................................++#####@@@##$$#@+......+++@$$$##@@@+...........+.+................+++++................+.............++@@$$$$$$#@@+.....+@@@#####@@$$$@@+.....@+@####@#@$$$+@...+@@@@#@@@@@@###@@...+++@##@#@#@$$$@++....++@####@@@+++....",
-".......................+.+@+@###@@+++................................................................++@#####@#@#@$$$@+.......+@+$$$##@@@++............................++@#@++..............................+@+$#$$$$$@+@.....++@@######@$$$@@+....++@@##@@@#@$$$@+...+@@#@##+++@@###@@..++++@###@@#@$$$@@+...++@###@@@@@#@+@+..",
-".......................++@@@@@@@@@@++.................................................................++#####@@###$$$@+......+++@$$$###@@+............................++@@#@@+...............................+++@+++++@+.....++@####@@@$$@@@++....++@##@###@##$$$@@...+@###@@+@+@#@#@@@...+#@#@@##@##$$$@@+....++###@@@@+#@@@+..",
-"........................@@@@@@#@@@@@@+...............................................................+++###$$$$$###$$@@.....+++@@$$$##@#@++...........................+@@$$$@@+...............................++++@+++.......++#####@@@$$#@@+++...++#@##@@#@#@$$$@@..++@###+@++@##@#@@@..++@@##@@@@#@$$$@@+....++@####@@@##@@@+.",
-"......................++@@@@#@@#@@@@+++..............................................................++@@##$$$$###$#$@@.....++@@@$$$###@#++...........................+@@$$$@@+.................................+.++.+.......++@####@@@$$@@@+.....++@#@@@#@#@#$$$@@..++@@##+@+++##@#@@@..++#@#@@#@@#@$$$@@+....+@@####@@@##@@+..",
-".....................+.@#$$$$$$$$$#$$++...............................................................+@###@@@@@@+@@+++.....+@@$$$$$$$$$$@+..........................++@@$$$@@+..............................................++@@@@@@@@@@@++.......+@@@@+@+@@@$$$@@...++@++++++@#$#@#$$...+@@@@+++@@@#$$@@+....++@#@##@#@##@@@+.",
-"......................++$$$#$$#$$$$#$++..............................................................++@###@@@+++..++++....++@@$$$$$$$$#$+@..........................++@@$$$@@+..............................................++@@@++@+@+@+++.......++@+++++++@#$$@@...++++++.++@#$@#@#$...+++++++++@@$#$@@+.....++@@$$$$$$#@++..",
-".......................+++@@+@@@+@+@++................................................................++###@@+......+.......++@$#$$#$#$$$++...........................+#@$$$@@++.................................................+++.+.++.............+.....+++++++....+.+..+..+@+++@++.....++++...+++++++......++++$#$$#$$+++..",
-"........................++++++++++++.+.................................................................@@##@+++.............++++@+@@@@+++++...........................+@@@@@++...............................................................................+++++..............++++++..............++++.+.......++++++@+++++...",
-"...........................+...+.+....................................................................++@@@++.................+++++++++++..............................+@@@@+++...................................................................................................+................................+++++++++....",
-".......................................................................................................+@+@++........................+.................................++@@@+.......................................................................................................................................+.+++.......",
-"........+.......................+................+++........................................................+++++....................................................+@@+++..................++@@++...........++@@@++...................................+........................+..............+++++...........................",
-"....+++@@+...................+++@@+...........+++@@@+..............+++++++................................++@@@@++...................................................+@@@@++................++@@@+++..........++@@@+++..............................+++@@+....................++@@++..........+++#@@@+..........................",
-"....++@@@+++................++@@@@+...........++@@@@++...........++@@+@+++.................................@@#@#++..............+.+.+.+...............+.+...........++@@@@+++..............+++@@#@++.........++@@#@@+++..........++++++++...........++@@@+++.................++@@@+++.........++@##@@++.........................",
-"....++@@#+++...............++@@@@@+...........++@@#@++..........+++@@@@@@@+...........+++.+.+............++@@@#@@++...........+++@+@+@+@++........+++@+@+++++.......++@@###@++............++@@#@@++.........++@@#####++.........++@@+++@@+@+........++@@#@+++...............+++@@#@++........++@+###@@+...........+.+.+.+.+.....",
-".....+@@@#@@+.............++@@##@@+..........++#####@@+........++@@$#$$$#@++........+++@@+++@@+..........++@#@@@@@...........+@@@@@@@@@@@@+.....+++@+@@@@@@+@+......++@@##@@+++.........++++@#@##+++.......+++@@#####@++.......+++##@@@@@@@++........+@@@@@@++.............++@@#@@++.........++##@@#@#++........+@+@@+++@@+++...",
-"....++@@#@#@++...........+++@###@++........+++@#####@@+........+@@@$$$$###++........+@@@@@+@@@+.........+++@#@#@@@..........+++@@@@@@@@@@@+....+++@@@@@@@@@@@++...++@@@@@@#@@@@+.......++@@@@##@@@@++.....++@@@#@@@#@@@@+.....++@@@@@@@#@@@@+.......++@@##@@@+............+++@@#@#+++.......+++####@##@++.......+@+@@@+@@@@@+...",
-"...++@@@@#@#++..........++@@@@@@@+.........++@@@@@@@@@+........+@@@@@@##@@++.......+@+@#@@@@@@++.......++@@@@##@@++.........++$#$$$$$$$$$$+...+@@@#$$$$$$$$##@+...++@@@#@#@#@@@@+....++@+@@@##@@@@@@......+@@@##@#@#@@@@+.....+@@@##@#@#@@@@++.....++@@@@##@@+@++.......+++@@###@@@++......++@@@@@@@#@@@++.....+@@@#@@@@#@@@@+..",
-"....+@@@@##@@+..........++@@#@#@@++........+@@@##@#@@@+........+@@#@##@#@@++.......++@@#@@@@@@+.........+@@#@#@#@+..........++$$$$$$$$$$$$@..++@@@$$#$$$$$$$@#+..++@@@@@#@@#@@@@++....+@@@#@###@@@@@@+...++@@@#@#@@##@@@++....+@@@#@#@@##@@@++......+@@@@##@@@@++.......+@+@@#@#@@@@+......+@@@##@@@#@@@@......++@@#@@@@#@@@@+..",
-"...+@@@#@@#@@++........++@@#@#@@@++........+@@@#@#@@@@++......++@#@#@##@@@+........+@@@###@@@@+........+@@@#@##@@++.........++@#$$$#@@@@##+..++$$$@@@@+@+@####+..++$$$$$$$$$$$$$@+...++$$$$$$$$$$$$$@+...+@$$$$$$$$$$$$$@+..+++$$$$$$$$$$$$$@++....+@@@@@###@@@@++.....++@@@@###@@@@++.....+@@@@#@#@##@@@++...++@@#@##@@##@@@+..",
-"...+@@#$$$$$@@+........+@@#$$$$$@@+........+@##$$$$$@@+.......++@##$$$$$@@++.......+@@#$$$$$@@++.......+@@#$$$$$@@+........++@@#$$$@#@@@##@..+@#$$#@@++@@@#@#@+..+@$$$$$$$$$$$$$@++.++@$$$$$$$$$$$$$@++.+++$$$$$$$$$$%$$@@+..++$$$$$$$$$$$$$@+.....+@##$$$$$$$@#@+.....+@##$$$$$$$@#@+.....+@##$$$$$$$#@@+.....+@##$$$$$$$#@@+..",
-"...+#@#$$%$$@@++......++#@#$$%$$@@++......++@@#$$$$%@@++......++@@#$$$%$@@+.......++@#@$$$$$@@+.......++#@#$$$$$@@++........+@@#$$$#@@@@#@+.++@$#$@@@+++@@#@#@+..++@@@##@@@@@$$$@++...+@@@##@@@@@$$$@++..++@@@##@@@@@$$$@+..+++@@@##@@@@@$$$@@....++@@@$$$$$$$#@@+....++@@@$$$$$$$#@@+....++#@@$$$$$$$##@+....++@@@$$$$$$$##@++.",
-"....+@@@#$$$#@++........+@@@#$$$#@++.......+@+@@#$$$@#++.......+@@@@#$$$#@@+.......++@@##$$$#@@+........+@@@#$$$#@++.......+++$$########@@+..+@$$$@@++.+++@@@@+..++@@###@@@@@$$$+@...++@@@##@@@@@$$#@+...++@@@##@@@@@$$#@++..++@@@##@@@@@$$#@++....++@@@@$$$@@@+++.....++@@@@$$$@@@@++......+@@@@$$$@++@++.....++@@@@$$$@++@++..",
-"...+++@##$$$@#++.......++++#@$$$@#++........++@#@$$$#@++........++@#@$$$@#++........++@@#$$$@#++.......+++@##$$$@#++.......++@#$###@##@#@@+.++@$$$@+++..+++++++..++@@@##@@@#@#@@@++...+@@@##@@@##@@@+++...+@@@##@@@##@@@++....+@@@##@@@##@@@+++......++@@$$$+@+++.......++++@$$$@++.+......+.++@@$$$@@+++........+++@$$$@@++....",
-"....+++@#$$$##++........+@@@#$$$#@@+........++@@#$$$##++........++@@#$$$#@@+.......+++@@#$$$#@@+........++@@#$$$#@@+.......++@$$@######@@++.++@$$$@@+....+++++....+@@###@@@##@@@+.....+@@@##@@@@#@#@++...++@@@##@@@##@@@++....+@@@##@@@@#@@@+.........++@$$$@+++.........+++@$$$@+++..........++@$$$+@+..........+++@$$$+@++....",
-".....@@$$@@@$$@++........+@$$@@@$$@++.......++@$$@@@$$@++........+@$$@@@$$@++.......+@@$$#@@$$@++.......++@$$@@@$$+++.....+@@@#####$$$$$@+..++@#$#@++......+......+@@@##@@@###@@++...++@@@##@@@##@@@+.....+@@@##@@@##@@@+.....+@@@##@@@##@@@++.......++++$$$@++...........+++$$$@@+..........++++$$$@+++..........+++$$$@++.....",
-"...+@@@$$@@@$$@@@++...++@@@$$@@@$$@@@++...++@@@$$@@@$$@@@++....+@@@$$@@@$$@@@++...++@@@$$@@@$$@@@++....+@@@$$@@@$$@@@++....@@@###@#$$$$$@++.+@@$$$@++.............+@@@$$###$$@@++.....+@@@$$###$$@@++.....+@@@$$###$$@+++.....+@@@$$###$$@++.........+.++$#$@+.............+@$$$@+............+++$$$@++............+@#$$@+......",
-".+++###$$###$$##@++...++###$$###$$#@#++...++###$$###$$##@++...++###$$###$$#@#++...++###$$###$$#@#++...++###$$###$$##@++..++@#@$$$$$@#@@@@++..@@#$$@+++++++++.+....+@@@$$@##$$@++++....+@@#$$@#@$$@++++....+@@@$$@#@$$@+++.....+@@@$$@#@$$@@+++........++@$$$+++...........+++$$$@++...........++@$$$+++...........++@$$$@++.....",
-"..++@@#$$###$$###++...++#@#$$###$$##@++...++@@#$$###$$###++...++@##$$###$$##@++..+.@@@#$$###$$##@++..+++@##$$###$$###++.+++#@#$$$$$#@#@@++..+++$$$@@@++++@@@@@....+@@@$$#@@$$@@@++....+@@@$$#@#$$@@@++....+@@@$$@#@$$@@@++....+@@@$$##@$$@@+++.........@+$$$@++...........++@$#$@++...........++@#$$@++...........++@$#$@++.....",
-".++@###$$###$$#@#@+..+++###$$###$$###@+..++@###$$###$$#@#@+..++@#@#$$###$$###@+..++@###$$###$$###@+...+@#@#$$###$$#@#@+..++###$$$$$##@#@@++..++$#$#@@@@@@@@@@@+...+@@@$$@##$$@@@@++...+@@@$$#@#$$@@@@++...+@@@$$##@$$@@@@++...+@@@$$@#@$$@@@+++......+++@$$$@++...........++@$$$@++...........++@$$$@++...........++@$$$@++.....",
-".++@$$$##@#@##$$$@+..++@$$$##@@@##$$$@+..++@$$$##@@#@#$$$@+..++@$$$###@@##$$$@+..++@$$$##@@@##$$$@+..++@$$$###@@@#$$$@+.+@@#$$@@##@#@@@@@#+.+++@#@$$#####$$$@@+..++@@@##@@@@@@@@@@+..++@@@##@@@@@@@@#@+..++@@@##@@@@@@@@#@+..++@@@##@@@@@@@@#@+......++@@#$$@@++........+++@@$$$@@++.........++@+$$$@@++.........++@+$$$@@++....",
-".+@@$$$##@#@##$$$@@..+@@$$$####@#@$$$@+..+@@$$$@##@###$$$@+..+@@$$$#@#@@#@$$$@+..+@+$$$@###@#@$$$@+.++@@$$$#@#####$$$@+.++@$$$@@####@@@@#@+..++@@@$$#####$$#@@+..+@@@@##@@@#@##@##+..++@@@##@@@#@#@@#@+..+@@@###@@@#@#@@#@+..+@@@@##@@@####@##+....++++@@$$$+@+++.......+++@@#$$+@+++......++++@@$$$+@+++......++++@@$$$+@+++...",
-"++@@$$$##@@@##$$$@@.++@@$$$##@@@##$$$@@.++@@$$$##@@@##$$$#@.++@@$$$##@#@##$$$@@.++@@$$$##@@@##$$$@@..+@@$$$##@@@##$$$#@.+@@$$$##$$$$$###$$@...+@@@$$#####$$$@++..++$$$$$#####$$$#@+.++@$$$$$#####$$$##+.+++$$$$$#####$$$##+.+++$$$$$#####$$$#@+.....@@@##$$$###@@+.....+@@@##$$$###@@+.....+@@@##$$$###@@+.....+@@@##$$$###@@+..",
-"++@@$$$##@@@##$$$#@..+@@$$$##@@@##$$$#@.++@@$$$##@@@##$$$@@..+@@$$$##@@@##$$$#@.++@#$$$##@@@##$$$#@.++@#$$$##@@@##$$$@@.+@#$$$@@$$$$$###$$+....++@@@$$$@@@@+++..++@$$$$$#####$$$##+..+@$$$$$#####$$$@#+..+@#$#$$#####$$$@#+..+@$$$$$#####$$$#@@...++@@###$$$##@@@+.....+@@###$$$##@@@+.....+@@###$$$##@@@+.....+@@###$$$##@@@+..",
-".+#@$$$##@@@##$$$@@.++#@$$$##@@@##$$$@@..+#@$$$##@@@##$$$#@.++#@$$$##@@@##$$$@@.++@@$$$##@@@##$$$@@.++@@$$$##@@@##$$$#@.+@@$$$##$$$$$###$$@......+@@####@++......++$#$$$#####$$$@@+..++$#$$$#####$$$#@+.+++$$$$$#####$$$#@+.+++$#$$$#####$#$#@+....+@@@##$$$###@@++....+@@@##$$$###@@++....+@@@##$$$###@@++....+@@@##$$$###@@++.",
-".+@@@@@@#@@+@@@@@@@..+@@@@@@@@@@@@@#@@@..+@@@#@@@@@+@@@@@@@.++@@@@@@@@@@@@@#@@@..+@@@@@@@@@@@@@#@@@..+@@@@@@@@@+@@@@@@@.+@@@@@@@@@@@#@#@@@+......+@@###@#++......++@@@@#@@@@@@@@@@+...+@@@@#@@#@@@@@@@+..++@@@#@#@#@@@@@@@+..++@@@#@@@@@@@@@@@+....+@@@@@#@#@@@@@+....++@@@@#@#@@@@@@+....++@@@@@#@@@@@@@+.....+@@@@@#@@@@@@@+..",
-"..+@@@@@@++@@@@@@@+...+@@@@@@@++@@@@@@+...+@@@@@@++@@@@@@++...+@@@@@@+++@@@@@@+..++@@@@@@@++@@@@@@+.+.+@@@@@@++@@@@@@++.++@@@@@@@@@@@#@@@@+.....++@##$$@++........+@@@#@@#@#@@@@@++..++@@@@@@@@@@@@@@++...+@@@@@@@@#@@@@@++...+@@@@#@#@@#@@@@++....++@@@@@@@@@@@+.......+@@@@@@@@@@@+.......+@@@@@@#@@@@+......++@@@@@@#@@@@+...",
-"...++@++++++++@++++....+++@++++++++++++....+++++++++++@++++....++@+++++++++++++....++@+++++++++++++....+++@+++++++@++++...+++++++@++++@++++......+@@$#$@++........+++++++++++@+++.+...+++@+@+@+@+@+++......+++@+@++++@+++.....+++++++++++++++........+++@+++@+++.........++++@+@+++++........+++@++++++++........+++@++++++++...",
-".............+.+.........+.......+++.........++++....+.++.......+.+++....+++........+.++.....+++.........+.......+.++.......++.+++++++.++.........++@++++............++++++++.+..........++.+++.++..........++++.+.+++..........+++++++++++............+.+++...............++.++++.............+.+++++.............+.+++++......",
-"..................................................................................................................................................+.+++.........................................................................................................................................................................",
-"........................++@@###@@@@@+.........+++......................++...............++++................+.+.+.........................................................................+++......................++...............++++.....................................+++++..............................................",
-".......................+++#@#@##@#@@+........++++++..................+++++............+++@+++.............++++++++++.....................................................................++++++..................+++++............+++@+++...................................+++#@++.............................................",
-".......................+@@#####$$@@@+........+@@@@@+................+++#@++...........++#@#@@+...........+@@@##@@@@@.....................................................................+@@@@@+................+++#@++...........++#@#@@+.................................++@@##+++...............................++++++.......",
-"....++++++++++........+@@@@####$$@@@++.......+@##@@++..............++@@##+++.........++@###@@++.........++@@###@@@@@+........++++++++....................................................+@##@@++..............++@@##+++........+++@###@@++..........+++.++++.............++@@@##@++........+++++..................++@@@++......",
-".++++@@@@+@+++++.....++@@@#####$$@@@++......++@@#@#++.............++@@@#@@+.........+++@####@++.........+@@@#@##@#@@+........++++++@+++.................................................+@@@@#@@++............++@@@@#@++.........+@@####@+++.........++++++@++++........++++#@#@@+++.....++++++++++..............++@@@@@++++....",
-"..@@#@#@#####@@+++...++@###@@@@#@###@@+.....++@+###@@.............++#@#@@@+.........++@#@@@##@@+.......++@#####$$@@++.......++#@@@+@#@@+...................................+.+++........++@@###@++...........+++@##@@@++.......+++@#@@@##@@++......+++##+@+@#@@+.......++++@###@@@@++....++@####@@@+............+++#@$$$##++....",
-".+@@##########@@@++..+@#####@@@@####@@+......++@##@@@++..........+++###@@+++........+@@#@#@#@@@+......++@@@####$$@@++.......++##@@@#@@@++........+.........+............++++++++.......+++@@#@#@@++++......++++@###@@@+++......++@##@#@#@@@@+......++@##@@@#@@@@++...++++@@@###@@@++++...++#####@@@++...........++@##$$$##+++...",
-"+.@@$$$@#@@@#@$$$@+.+++$$$$$@@@@@$$$@@+.....+++@@##@@+++.........+@@###@@@++.......+++##@@@##@@@.......+@@#####$$@@++......++@@#@@@##@@@........@@@++...+.@@++.......++++@+@@@@@+....+++@@@@###@@@++++....+++@@@###@@@@+++....++@@@#@@@##@@@++...+++@+##@@@##@@@++..+@@@#@##@@@#####@@+...@@@#$$#@@@+++.........+@@$$@@@$$@@@...",
-".+@@$$$##@#@##$#$@+..++$#$$$@@@#@$$$@@+....++@@@#####@@++......+++@@#####+@++......++@@######@@+++....+++@@@####@@@@++.....++@#@#####@@@++....++@@@+++.+++@@@+.....+++@@#####$#$++....+#@#@#@@@@####@@+..++#####@@@#@###@@+..++@####@@@#@###@@+...+@####@@@@@###@@+.+@@#####@@@#####@@...++#@#$$@#@@@+++.......+@@@$$@@@$$@@@...",
-".++@$$$@##@#@#$$$@@.++@$$$$$@@@#@$$$@@+...+++@@#####@@@+++....++@@@@#####@@+++....+++@@@#####@@@++....+@@@#@#####@@+++...++++@@@#####@@@++.....+@@@@+++++@@@@++...++@@@@#####$$#@+..+++#####@@@@####@@...++#####@@@@####@@...+@#####@@@@####@@+.++@#####+@@#####@@+.+@@$$$@#@@@##$$$@@+.+.+#@#$$#@#@@@++++....+.@@@#$@@@$$@@@+..",
-".++@###@@@@@@@###@@..+@@#######@@$$$@++...+@#@$$@@@##$$$@+....+@@#$$#@@#@$$$@+...++@####@#@#@$$$@+...++@@####@@#@$$$@+....+@#####@@#@$$$@++...++$$$##@@@@#$$#++...+@@@$$@@@#$$$$@++..++$$$#@@+@@@$$$@@+..+@#$##@+@@@@$$$@@+.+++$$$@#+@@@@$$$@@+..++$#$#@@++@@$$$@@+.+@@$$$##@@@@#$$$@@+..++@@@$$$$$$$###+++....++@@##@@@$$@@@+..",
-"++++####@@@@+@####@..+@########@@$$$@@+.+++@##$$##@#@$$$@++.+++#@@$$@#@##$$$@++..+@@#####@@##$$$@++..+@##@##@#@##$$$@++.+++#@###@#@##$$$+++...++#$##@@@@###$$+..+++##@$$###$$$$$@++.+++$$##@@+@@@$$$@@+..+@$$$##++@@@$$$@@+..++$$$##++@@@$$$@@+..++$$$@#@@+@@$$$@@+.+@@%$$#@@@@##$$$@@+...+@@@$$$$$$$###@@+....+@@@###@@$$@@@+..",
-".+@@$$$$$@@@@@@@@##..+@###@@$$$@@$$#@@+..+@#@@$$@@@#@$$$@@+..+@@##$$#@@#@$#$@@+..+@@####@#@#@$#$@@+..++@####@@@#@$#$@@+..+@@#####@@@@$$$@@+...++@@@$$###$$@@@+...++@##$$@@@$$$$$@@+..++$$$##+@+@@$$$@@+..+@#$$#@@++@@$$$@@+.++@#$$@@@@+@@$$$@@+.++@$$$#@++@@@$$$@@+..++####@@@@@####+++...+@@@##@@@@@@#@#@+....+@@###$$$$$@@@+..",
-"++@@$$$$$#@@+@#@##@.+++###@##$$@@$$$@++.++@$$$@@@@@@@###@@+..+@$$$@@@@+@@###@@+.++@$$$@@@@+@@###@@+.++@$$$@@@@@@@###@@+.++@$$$@@@@@@@###@@+....++@@$$###$$@@+++.++@$$$@@@#@#@###@@+.++@@##@@++++@#$$@@+..+@###@@@+++@$#$@++..+@###@@++++@$$$@++..++###@@@++@@$$$@++.+++@#@##@@@#@##@@+...++@@@##@@+@@#@###+...++@@@##$$$$$#@@++.",
-"++@@$$$$$@@@@+@@@##..++####@$$$@@$$$@++..+@$$$@@++++@@##@#+.+@+$$$@@++++@###@#+.++@$$$@@++++@###@#+.++@$$$#@++++@###@#+.++@$$$@@++++@@##@#+....+++@$$###$$@++....@+$$$@#@@@######@+..+@###@@@+++@$$$@++.+++###@@+++@+$$$@@+.+++###@@++++@#$$@@+.++@@##@@+++++$$$@@+..++@@@$$@@@$$@@@++....+@@###@@@+@##@#@+....+@@@##$$$$$@@@++.",
-".+@@$$$@#@@@+@#@##@.++@###@@###@@$#$@++.++@$$#@++..++@#@##@.+@+$$$@+++.+@@#@#@+..@+$$$@++..+@@#@##@.++@$$$@+++.+@@#@#@+.+@@$$$@++.+++@#@##@.....+@+#@$$$@@@@++..+@@#$$@@@##@@@#@@#+.+++###@@+++++$#$@++.++@###@@++++@#$$@@+.+++###@@++++@$#$@++.+++###@@+++@+$$#@@+...+++@$$@#@$$@@++....++@@@##@@@@@#@###+....+@@@##@@@@@$$$@+.",
-"++@@$$$#@@@@++@@@##..++####@###@@$$$@++.+@@$$$@+++.+@@@##@+.+@@$#$@++..++@@###+.+@@#$$@+++.++@@#@#+.++@$#$@++..++@@###+.++@$$#@++..+@@@#@#+....++@@@#$$$##+++...++@$$$@@###@@@#@##+.++@@##@@++++@$$#@++..++###@@++++@$$$@++..++###@@++++@$$$@++..++###@@++.+@$$$@++...++@@#$@#@$$+++......+@@@##@+@@@@#@#@+....+@@@##@@@##$$$@+.",
-".+++###@@@++@@@###@.++@###@#@@###$$#@@+.++@$$$@@++++@@#@#@@..+@$$$@@+++++####@@..+@$$$@@++++@@###@+.++@$$$@@+++++####@@.++@$$$@@++++@@###@+....++@@$$###$$@@@+..++@$$$##@@@@@####@@..+@###@@+++++$$$@@..++@###@@++++@#$#@@..++@###@@++++@#$$@@+.++@###@@++@++$#$@+.....+++##$$$@@@++......+@@@$$#####$$$@@+....+@@@##@@@@@$$#@+.",
-".+@@###@@@+++@@#@#@..++###@@#@@##$$$@++..+@#$$@+++++@####@+.++@$$$@@+++@+#@#@@+.++@$$#@@++++@##@##+.++@$$$@++++@+#@#@@+.++@$$$@@++++@##@##+....+@@@$$#@#$$@@@+..++@$$$###@#@@###@@+..++###@@++@@+$$$@+...++###@@++@+@$$$@+...++###@@++@+@$$#@++..++###@@+++@@$$$@++.....++@#$$%#@@+.......+@@@$$###@#$$$@@+....+@@@##@+@+@$$$@+.",
-"..++####@@@@@@@#@#@.++@###@@@#@##$$$@++.++@$$$@@@+++@#@#@#+.++@#$$@@@+@+@#####+.+++$$$@@@++@+###@@+.+++$$$@@@+@+@#####+.++@#$$@@@++@@@##@@+...++@@@$$@#@$$@@@++.++@#$$##@@@@@@####+.+++###@@@@+@@$#$+@+..++###@@@@+@@$$$+@+..++###@@@@+@+$$$@@...++###@@@@+@+$$#@@......++@@$$$@@++......++@@@$$#####$$$@@+...++@@@##@@@@@#$$@@.",
-".+@@$$$@@@@+@@$$$@@.+++$$$#@@@@##$$$@++.+++@####@@@@@$$$@@+..+@###@#@@@@@$$$@++.+++@##@#@@@@@$$$@@+.+++@####@@@@@$$$@++.+++##@##@@@@@$$$@@+...+@$$$@#@@@@#$$$+..++@###$$@#@@#$$$@++..++@@###@@@@@$$$+++..++@@##@@@@@@$#$@+...++@@###@@@@@$$#@+...++@@###@@@@@$$$++......++@@$$$@@++......++@#@$$@#@#@@@@+++...+@@#@##@@@@#$$#@+.",
-".++@#$$#@@@@#@$$$@+.++@$$$@#@@@##$$$@@+..++#@#@#@@@@@$$$@++..++@####@@@@@$$$+@+..++#@###@@@@@$$$@++..++#@#@#@@@@@$$#@@+..++@####@@@@@$$$@++...++$#$@@++@@@$#$++..++###$$@@@@@$$$+@+...@@#@#@@@@@@$$#@+...++@#@##@@@@@$$#+++..++@#@@#@@@@@$$$+++...@@@@#@@@@@@$#$@++....++@@@$$$@@@++.....+@@@#$$###@@@+++.....++@@#####@#@$$$@@.",
-".+@#$$$$$$$$$$@@@++..+@#$$$$@@@@@$$$@++..+++@@##$$$$$@@@++...++@@@##$$$$$@@@+++..++@@@##$$$$$@@@@+...+++@@##$$$$$@@@+++..+++@@@#$$$$$@@@@+....++@@@+++++++@@++...++@####$$$$$@@@++....++@@$$$$$$$@#@@+....++@@$$$$$$$#@#++....++@@$$$$$$$@@#++....+@@@$$$$$$$#@@@......+@@$$$$$$$@++.....+@$$$$$@@#@+++.......@@$$$$$@#@$$$$#@+.",
-"++@@$$$$$$$$$$#@@++.++@$$$$$@@@#@$#$@+.....@+@@#$$$$$@@@++.....++@@#$$$$$#@@+......++@@#$$$$$@@@++.....@+@@#$$$$$@@@+.....+++@##$$$$$#@@++......+@++++..++++@.+.++@@@###$$$$$#@@++.....++@$$$$$$$#@@++....+++@#$$$$$$@#@++....+++@$$$$$$$#@@++.....++@$$$$$$$@#@++.....++@#$$$$$$@@++...++@$$$$$#@@+++.......+++$$$$$#@@$$$$$++.",
-".+@@$$$$$$$$$$@@@+...++$$$$$+++@@$$$++.....++@@#$$$$$@@@.......++@@#$$$#$@@@+......++@@#$$$$$@@+.+.....++@@#$$$$$@@@+.....++++@#$$$#$@@@+.......++++....+++++.....+#@###$$$$#@@@+......+++#$$#$$$@#@+......++@$#$$$$$@@@+......+++#$$$$$$@#@+......+++#$$$$$$@@@++....++@@$$$#$$$@@+....+++$$$$$@#@++.........+@$$#$$@@@$$##$++.",
-".+@+++++++@+@+@++....+++++++@+++@+++++......+++++++++++.+.......++++++@+@++++.......++++++++++++........+++++++++++.........++++++@@++++.........................++@@@+@@+@+@@++.......+.@+++@@+@+++........+++@+@++@@++.......+++++++++@+++........+@+++@+@+@@+.......+++++@@++++++......+++++@++++.........+.+++@++@@@+@@+++..",
-"..++++@+++++++++.+....+++++++.+.++++.........++++++@+.+..........+.++++++++...........+++++++............++++++++++..........++++++++++...........................+@@@+++++++++.+........+++++++++++.........+++++++++++........+++++@++++++.........+++++++++...........++++++++.........++++++++.............+++++++.++++++...",
-".....+.++++.+...........++........+............+++................+.+.+.................++++................++++................+..+...............................+.++++.+................++.+.+................++.................+.+.+................+.+...............+..++.............+.+..................++............",
-"................................................................................................................................................................................................................................................................................................................................",
-"................................................................................................................................................................................................................................................................................................................................",
-"................................................................................................................................................................................................................................................................................................................................",
-".......+..........................................+........................................................+++++.......................................................+.........................+................+....................................+.........................+...............+..............................",
-".....++@@+...................+++@@..............+@+@+...............++.+...................................+@@@@+....................................................++@@+.....................+@@++.............@@@+................................++@@+.....................+@@++...........+@+@+............................",
-"....+++@@+++................++@+@@+...........+++@@@+............++++++++++...............................+@@@#@++..................................................+++@@+++.................+++@@+++..........++@@@++..............................+++@@+++.................+++@@+++........+++@@@+............................",
-".....++@@@++...............+++@@@@+...........++@@@@++...........++@@@@@@++............+.+..+.............+@@#@#++...................................................++@@@++.................++@@@@+..........+++@@@+++.............+...+............++@@@++.................+++@@@+.........++@@@@++.............+.+..+........",
-"....++@@@@@@+..............++#@#@@+..........++@####@@+........++@@$$#$##@@+........+++@@+++@@+...........+@@@@@@@..................................................+++@#@@@+...............+@@@#@++..........+@@####@++........++@@@+++@@++........+++@#@@@+..............++@@@#@++........++@####@@..........+++@@+++@@.......",
-".....++##@#@++............++@###@++..........+@#####@@+.........@@@$$$$$##+++.......++@@@+@+@@+..........++@#@@@@@+..................................................+@@#@#@++.............++@@@#@@+.........++@@###@#++........+++@@+++@@+++........++#@#@@++.............++@@@#@++........+@#####@@+.........++@@@@++@@+......",
-".....++@@#@#++...........++@@@@@@++........+++@@@@@@@@++......++@@@@@##@@@++.......+++@@@@@@@@++.........+@@@##@@+.........++++++.++++++...........++++++++++........++@@#@#@++..........+++@@##@@++.........++@#@@#@@@++.......+@+@@@@@@@@++........++@@#@@++............++@@##@+++.......++@@@@@@@@+........+++@@@@@@@@+......",
-"....+++@@##@@++.........+++@@@#@@+++........++@##@@@#@++.......+@@#@@@##@@@+.......++@@#@@@@@@+........++++#@#@#@+++.......+++@++@++++@+++.......++++@@@@+@+++......+++@@##@@@++.........++@@##@@@@++.......++@#@#@@#@@@++.....+++@#@@@@@@@@++......+++@@@##++...........++@@#@@@++.......+++@@##@@@@+.........++@@@@@@@@++.....",
-"...++@@@@@##@+++.......++@@@#@#@@@+........+@@@@@@#@#@@+......++@@#@####@@++.......+@+@@#@@@@@@+.......++@+@###@@++......++@@@@@@@@@@@@@++.....+++@@@@@@@@@@+++...+.+@@@@###@@@+++.....++++@@@##@@@+++.....+++@@#@@@#@@@++.....+@@@@#@@@#@@@++.......++@@#@@@+...........++@@##@@+.........++@@@@#@@@+........++@@@#@@@@@.......",
-"...+@@@$$$$$##++.......+@@@$$$$$##++.......+@@#$$$$$##+++.....++#@#$$$$$##@++.....++@@#$$$$$##+++......+@@#$$$$$##@+.....++$$$$$@##$$$$$@@+...++@@@#$$$$$$$$$@+....+@@@$$$$$$$@@@+....++@#@$$$$$$$@@@+....++@#@$$$$$$$@#@++...++@@@$$$$$$$@#@++.....+@@$$$$$++..........++@$$$$$@++........@@@$$$$$@++.........+@@$$$$$@++......",
-"...+@##$$$$$##@++......+@##$$$$$##@++.....++@##$$$$$##@++.....++@#@$$$$$##@++......+#@#$$$$$##@++......+@#@$$$$$##+@.....++$$$$$####$$$$#@+...+@@##$$$$$$$$$$@+..+++@#@$$$$$$$#@@@+...++@@#$$$$$$$##@@+...++@@#$$$$$$$#@#++...+@@##$$$$$$$@#@@+.....+@@$$$$$@++.........+@@#$$$$@++........+@@$$$$$@++........++@@$$$$$@++......",
-"..++@@@@@@@@$$@@@.....+@@@@@@@@@$$@@@.....++@@@@@@@@$$@@++....++@@#@@@@@$$@@@.....++@@@#@#@@$$@@++....+@@@#@@@@@$$@@@+..+++@@@@@$$$@@@@@$$@...+@$$$@@@+@@@$$$@@...+@$$$@@@@@#@$$$@+...+@$$$@@@@@@@$$$@+..++@$$$##@@@@#$$$@+...+@$$$@#@@@##$$$@+......++@@$$$@+...........++@@$$$@+........+.+@@@$$$@+...........++@@$$$@++......",
-"..++@##@#@@@$$@@@......+@##@#@@@$#@@@.....++@##@#@@@$$@@@.....++@@@@#@@@$$@@@.....++@#@@@@@@$$@@@......+@@#@#@@@$$@@+....+@@####$$$@#@@@$$@..+++$$$@@++@@@$$$+@..+++$$$##@@@#@$$$@+..++@$$$#@@@@#@$$#@+...+@$$$@#@@@#@$$$++..++@$$$@#@@@@#$$#@+......+++@$$$@++..........+++@$$#@++..........+@@$$$@++..........++@@$$$++.......",
-"..+@@@#@@@@@$$@@@+....+@@@@@@@@@$$@@@+....+@@@#@@@@@$$@@@+....++@@#@@@@@$$@@@+....+@@@#@@#@@$$@@@+....+@@@#@@@@@$$@@@+..++@@@@@@$$$@@@@@$$@..+@@$#$@@+++@@@#@++..++@$$$#@@@@##$$$@@..++@$$$@#@@@#@$$$@@..+++$$$@#@@@@#$$$@@..+++$$$##@@@#@$$$@@.......+@+$$$++............+@+$$$@+...........+++$$#@+............+++$$$@++......",
-"..++@#@$$$$$$$@@@+....++###$$$$$$$@@@+....++@#@$$$$$$$@@@+....+@@#@$$$$$$$@@@+....++#@#$$$$$$$@@@+....++#@#$$$$$$$@@@+..++@###$$$$$#####$$+..++@$$$@+@++++@@@++..++@$$$#####@#$$$++..++@$$$#######$$$@+..+@@$$$#######$$$@+..+@@$$$#######$$$@+.......++@$$$@++...........++@$$$@++..........++@$$$@++...........+@+$$$@++......",
-".++@@##$$$$$$$@@@+....+@@@#$$$$$%$@@@+....+@@##$$$$$$$@@@+....++@##$$$$$$$@@@+....+@#@#$$$$$%$@@@+...++@#@#$$$$$$$@@@++.+@@###$$$$$#####$$@..++@$$$@@++++@@@@++..++@$$$##@####$$$@@..++@$$$#######$$$@@...+@$$$#######$$$@@..++@$$$@######$$$@+.......++@#$$@++...........+++$#$@++..........+@+$$$@++...........++@$#$@++......",
-".++@$$$@@@@@##@@@+...++@$$$@@@@@##@@@+...++@$$$@#@@@###@@+...++@$$$@@@@@##@@@+...++@$$$@@@@@##@@@+....+@$$$@@@@@###@@+..+@####@@$$$##@#@#@@...+@$$$@@@++@+@@+@+..++@$$$###@@#@#@#@+..+@@$$$##@#@@##@#++..++@$$$##@#@@@##@@+..++@$$$##@@@#@##@@+.......++@$$$@++...........+@@$$$+++..........++@$$#@++...........++@$$$+++......",
-".++@$$$#@@@@##@@@++..++@$$$@#@@@##@@@++..++@$$$@@@@@##@@@++..++@$$$@#@@@##@@@++...+@$$$@@@@@###@@++..++@$$$@#@@@##@@@+..+##@##@@$$$####@##+...++###$$#####$$$@@..++@$$$##@##@###@@@..++@$$$##@###@##@@@...@@$$$@##@##@#@#@+..++@$$$#####@##@#@@......++@+$$$@+++.........+++@$$$@@++.......+++@+$$$@@++........++++@$$$@@++.....",
-".++@$$$@@@@@###@@++..++@$$$@@@@@###@@++..++@$$$@@@@@##@@@++..++@$$$@@@@@###@@++..++@$$$@#@@@##@@@++..++@$$$@@@@@##@@@@..+@####@@$$$#@@##@#+...++@@#$$@#@##$#$#@..++@$$$###@##@##@@+..++@$$$###@@#@##@@+...+@$$%##@###@##@@+..++@$$$##@#@#@##@@+....++++@@$$$@@+++......+++@+@$$$@@+++......+++@@$$$@+@++.......++@@+$$$@@+++....",
-".+++$$$#####$$###@+..++@$$$#####$$###@+...@+$$$#####%$###@+..++@$$$#####$$###@+...@+$$$#####$$###@+...@+$$$#####$$###@+.+#@$$$$$$$$$$###$$+....+@+@@#$$$@#@#@++...+@###$$#####$$$@+...+@###$$#####$$$@+..+++###$$#@#$$$$$@+...++###$$#####$$$@+.....@@@#@$$$#@#@@+......@@@#@$$$##@@@+....+@@@#@$$$##@@@+.....+@@@@#$$$##@@@+...",
-".++@$$$#####$$###++..++@$$$#####$$###++...+@$$$#####$$###++..++@$$$#####%$###++..++@$$$#####$$###++...+@$$$#####%$###++.+@##$$$$$$$$$#@#$$+......++@@$$$#@#@@+....++@##$$##@##$$$@+...++###$$#####$$$@+...++@@#$$###$$$$$@+..+++###$$#####$$$@+...++@@###$$$##@@@+....++@@###$$$@##@@+....+@@###$$$##@@@+.....+@@###$$$@##@@+...",
-"..++@@@#@####@#@@++...++@@@#@###@@#@@++..+++@@@#@##@#@#@@@+...++@@@#@##@@@#@@@+...++@@@@#@###@#@@@+..+++@@@#@##@@@#@@@+.+@@#@#@#@@@@#@#@@++......++@@###@#@+++.....+@+@@@@@##@@@@++....+++@@@@#@#@@@@++....++@@@@#@@#@@@+++....+++@@@@@@#@@@@++....+@@@@#@#@#@#@@++....+@@@#@#@#@#@@@++...+@@@@#@#@@#@@@++....+@@@#@#@#@#@@@++..",
-"..++@@@#@#@@@@#@#++...++@@@@#@@#@@#@@++...++@@@#@@#@@@#@@++....+@@@#@#@#@@@#@++...++@@@#@#@@@@#@@++...++@@@#@#@#@@#@@++..++@@#@#@@@@#@#@@++......+++@####@+++.......+++@##@@#@@+++.....+++@@#@@#@#@+++.....++++@@#@@#@@@++......+++@###@#@@+++......@@@#@#@#@@@@@.......@@@#@#@#@#@@@......@@@#@###@#@@@.......@@@@##@#@#@@@....",
-"...+@@@@@@@#@@@@@+.....+@@@@@@#@@@@@@+.....+@@@@#@@@@@@@@+....++@@@@@@#@@@@@@+.....+@@@@@@#@@@@@@+.....+@@@@@@#@@@@@@+...+@@@@@@@+@@@@@@++........+@@$$$@@+..........++@@@@@@@@++........++@@#@@@@+@+........++@@@#@@@+++......+.++@@@@@@@+@+......++@@@#@@@#@@@@+......++@@#@#@@@@@@+....++@@@@@@@@@@@@+......+@@@@@#@@@@@@+...",
-"....+++@+@++@+@+.+......+++@+++@+++@++......+++++@+@+++++.......+++@++++@++++.......+++@++++@++++.......++++@++++++++.....+++@++++++++++.........++@@$$$@++............+++@+@++++.........++++@+++++..........++++++@+++...........++++@++++.........++++@@++@++........+++++++@++++........++@+@+@+@++.........++@+++@++++.....",
-"......+.+.++.+..+........+.++++.+++...........+++.++++++..........+.++++++............+.++++.++...........++.+++++++........+.+....++++...........+@++++++..............+++.+..............+.+.+++...............++++................+++++.............++..+++.............+++++++.............+++.++..............++++++.......",
-"...................................................................................................................................................++++++.......................................................................................................................................................................",
-"................................................................................................................................................................................................................................................................................................................................",
-".......+.+......................................................................................................................................................................................................................................................................................................................",
-"...+++++++++@++..............+.+........................................................+++++................+.+...................................................................................................++................+.+.................................................++@@++++...............................",
-"..+++@@@@@@@+@+++..........++++++++...........+++++...................+++++............++@@+++..............++++++++......................................................................+++++..................++++++............++++++.....................................+++++......++$$$#@++..............................",
-".+@@$#$$$@##$$@@@+......+++@@@@@@@++........+++#@+++.................++@#$++.........++@@$$$@@...........+++@#@#@@@@+...................................................................+++#@+++................+@@@@@+...........+@@#@#++...................................++@#$+++...++@$$$##++..............................",
-".+@@$$$$$##@$$#@@+.......+@@#@#@@@+++.......++@@#@@++...............+++@$#@++.........++@$$$@@++..........+@@##@@@@@@+...............................+..................................++@##@@++...............+@@@##++.........+.@@###+++.................................+++@$#@++....+@$$$##@++.............................",
-".+@@$$$$$###$$@#@+.....+++@@#@#@##+++.......++@##@++++.............++@@@$#@+.........++@@$$#@@++........+++@@###@@@@++.......++++++++++............++++++...............................++@@#@+@++...........++++@@#@@++........+++@@###@+++........+++++++++++...........+++@@@$$+++....++@@@##@@+++............+++++++++++....",
-"++@@@@@##$$$##@@+++...++@#@##$$$#@@+.........++@@###++............+++@##@@+++.......++@##@@@##@++.......++@@####$$@+@.......++@#@@+@@@+@+..........+@@#@+................++++++++......+++@@@##@++++.........++@@###@@@++......++@@##@@@@#++.......++@@@@+@+$$+++........++++#@#@@@@++...++@@@##@++++++........++++$$@++#@@@@+..",
-".+@@#@###$$$##@@++....++@#@##$$$##++.........++@@###@++...........+@@###@@++........++@##@@@##@++.......++@#####$$@@+......++@+#@@@@##@@+.........+@@@#@@+............++++++@++++++..+++@+@@@###@++++....++++++@@###@@++++...+++@@@#######+@+....++@@@@##+@@#$@+++....+++++@+###@@@@+++..++@#@#######@+@......+++@+$#@@@@#@@@++.",
-".+@@###@@@@@$$@#@++..+@@###@@##@#@@++.......++@#@####@++.........++@#@####@++.......@+@@#####@@++.......+@+#@####@@+++......+@@@##@#@@@+++........+@@$$$++...........++@#@##@@##@@@...@@@##@@@@@##@@@+....@@#@#@@+@@@##@@+....@@@@#@@@@@##@@@+....@@#@#@@@@@##@@@+...+@@#@#@@@@@#@#@#@@..++@@@##@#@#@@@@.+....@@#@##@@+@#@#@#@@.",
-".++@###@@@@@$$##@@...+@@###@@####@@++.......++@@##@#@#@++......+++@@###@#@@++.....+++@@######@@+++.....+++@#@#@##@@++.....+++@@#@#####@++........++@@$$$@++........+++@@##@###@##@@..+@@##@@@@+@@##@@++..+@@##@@@@+@##@@@++..+@@###@@@@@@##@@@...+@@###@@+@+###@@++..+@@###@@@+@@@##@@@...+@@@###@###@@@++..++@@##@#@@@+#@###@@.",
-"..@+###@#@@@$$#@#++.++@@###@@##@##@@++....+++@@#@####@@@++.....++@@#@###@#@@++.....+@@@#@#@###@@++.....++@@#######@@@+.....+@@@######@@@+++.....+++@@$$$+++........++@@@####@##@#@@.++@@###@@+@@##@#@++.++@@###@@+@@@###@++.++@@#@#@@+@@####@++..+@@@#@@@@@@##@#@++..+@@@###@+@@#@###@@...+@@@$$#####$$$@++..+@@###@#+@@@####@@.",
-"..++#@#$$$$$$$$$$@+..+@@$$$$$###$##@@+....++@##$$#@#$$###++...++@##$$@##$$##@++...++@##$$##@$$##@++...++#@#$$@#@$$##@@...+++@##$$@#@$$###++.....++@@@@@@@++++.....++#@#$$@##$$###@+..+@@$$$@@+@+#####++..+@@$$$@@@+@#####++..+@@$$$@@@+@@####++..+@@$$$@@+++#####++..+@@$$$@#@+@@#$$$@@...+@@#$$#####$$$@@+..+@@$$$@#+@@@@$$$@@.",
-".++@@##$$$$$$$$$$@+..+@@$$$$$@#@$$##@++...+@###$$@#@$$###++...+@###$$#@@$$###++...+@###$$#@#$$###@+...++###$$@#@$$###++...+@####$###$$###++...+++@@@@@@@@@@+++....++###$$@#@$$###@+..+@@$$$@@++@@####@+...@@$$$@@++@@####@+..+@@$$$@@@+@#####@+.++@@$$$@@@@@@####@+.++@@$$$#@+@@#@$$$@@...+@@@$%###@#$$$@@+...@@$$$#@@@@#@$$$@@.",
-".++@@@#$$$$$$$$$$@+..+@@$$$#$###$$@##++..+++###$$@#@$$###++..+++###$###@$$###@+..+++####$@#@$$###++..+++###$$#@#$$###@+...++###$$@@#$####++...++@@@@@@@@@+@@++...+++###$$#@#$$###@+..+@@$#$@@@+@@####++.++@@#$$@@@+@@####++..+@@$$$@@+++@####++..+@@$$$@@++@@####++..+@@$$$##@@+#@$$$@@...+@@@$$@@@@@####@+..+@@#$$@#@+@#@$$#@@.",
-"..+@$$$@#@@@@@$$$@+..+++####@@@@@@###++...+@$$$@@@@@@@$$$@+...+@$$$@@@@@@@$$$@+...+@$$$@@@@@@@$$$@+..++@$$$@@@@+@@$$$@+..++@$$$@@@@@@@$$$@+..+@@$$$$$$$$$$$$$++..++@$$$@@@#@##$$$@+..++@###@@++@@@###@+...+@###@@++@@@###@+..+++###@@+@@@@###@+..++@###@@@+@@@###@+...+@@@@##@@@##@#@++...+@@@$#@@@@@####@@...+@@@###@@@##@#@@+.",
-".++@$$$@@@@@@@$$$@+..++@####@@+@@@###++..++@$$$@@@+@@@$#$@@..++@$$$@@+++@@$#$@+..++@$$$@@@++@@$$$@@..++@$$$@@+@+@@$#$@+..++@$$$@@@+@@@$$$@@..+@@$$$$$$$$$$$$$++..++@$$$@@#@###$$$@+...+@###@@@+@@@###++..++@###@@@++@@##@@+..++@###@@+++@@##@@+..++@###@@++@@@###++...++@#@##@@@###@#++...+@@@##@@++@@@@##+...++#@@##@@@###@@++.",
-"..@@$$$@@@+@+@$#$@+...++###@@+@@@@###@+...@@#$$@+++++@$$$@@...@@#$$@+@+@+@$$$@@..+@@#$$@++@++@$#$@+..++@$#$@+@+@+@$$$@@..+@@#$$@+++++@$#$@+...++@+@@@@@@@@+@@+...+@@$$$#@###@@$$$@@..++@###@@+@+@@###@+...++###@@++@@@###@+..+++###@@@+@@@###@+...++###@@@++@@###@+...++@@@$$@@@$$@@++....+@@@$$@#@@@$$$@@+....+@@@$$@@@$$@@@+..",
-".++@$$$@+@+@+@$$$@+..++@###@@@+@@@###++..++@$$$@@++@@@$$#@+..++@$$#@@++@+@$$#@+..++@$$$@@++@+@$$$@+..++@$$$@+++@+@$$#@+..++@$$$@@+@+@@$$$@+...+.+++@@@@@@+++++...++@#$$@####@@$#$@+...++###@@@+@@@##@@+...+@###@@@+@@@###++..+++###@@@++@@###++...+@###@@+@+@@##@@+....+++@$$@@@$$@@+.....+@@@$$#@#@@$$$@@+....+++@$$@#@$$@@+...",
-"..@+$#$@@@+@@@$$$@@.+.++####@++@@@###@+..++@$#$@@@+@++$$$@@...@+$$$@+@@+@@$$$@@..++@$$#@@@+@@@$$#@@..++@#$$@@@+@@+$$$@@..++@$#$@+@+@+@$$#@@....+++@+@@@+@++.......@@$$$@@###@@$$$@+...+@####@+@@#@###@+..+++####@+@@@@###@+...++###@@@@@@@###@+..+++###@@@@@@@###@+.....++@@#$$$#@@++.....+@@@$$$$$$$#@#++......++@##$$$##+++...",
-"..+@$$$@#@@@@##$#@+..+@@###@@@@@@@###@+..++@$$$@@@@@#@$$#@+..++@$$$#@@@@@##$$++..++@#$$@#@@@@@$$$++..++@$$##@@@@@#$$#@+..++@$$$#@@@@@##$$++......++@@$$$+++.......+@$$$$$@@@##$$#@+...++###@#@@@@####@+...++####@@@@#@###@+..+++####@@@@#@###@+...++####@@@@#@###@+.....++@@@$$$@@++.....++@@@##@@@@@+@++........++@#$$$#@@+....",
-".++@#$$#@@@@##$$$@+..++@###@@@@@#@###@+...+@#$$##@@@##$$$++...++$#$##@@@##$$$++...+@$$$#@@@@##$$$@+..+++$$$##@@@#@$$$++...++$#$##@@@##$$$@+.......+@@$$$@+.......+@+$$$$$@@@#@$$$++...++####@@@@#@###@+...+@@##@#@@@#####@+....@@####@@@#####@+...++@####@@@#####@+......+@@#$$$@@+......+@@@@##@@@@++++.+......++@@@$$$@@+.....",
-"..++@@@$$$$$$$@@@@..++@#$$$$$@@@$$$$$#@...++@@@$$$$$$$@@@++..+++@@@$$$$$$$@@@++...++@@@$$$$$$$@@@++...++@@@$$$$$$$@@@++...++@@@$$$$$$$@@@++......++@@@#@++........+@###$$$$$$$@@@++....++@@$$$$$$$$$$@@....+@@@$$$$$$$$$$#@....+@@@$$$$$$$$$$#@...++@@@$$$$$$$$$$@@.....+++#@###@++......++###$$##@@++.........+++@@####@++.....",
-"..++@#@$$$$$$$#@@++.++@#$$$$$@@@$$$$$#@...++@#@$$$$$$$@@@++...++@#@$$$$$$$@@@++...++@#@$$$$$$$@@@++...++@#@$$$$$$$#@@++...+@@@@$$$$$$$#@@++.......++@@@@++.......+++###$$$$$$$#@@++...+++@@$$$$$$$$$$#@....++@@$$$$$$$$$$#@.....+++$$$$$$$$$$#@.....+++$$$$$$$$$$#@....+#@#$$$$$@++.....++@###$$#@@@.+.........+@##$$$$$++......",
-"...+@@@$$$$$$#@@@+...+@#$$$%$@@@$$$$$@@...++@@@$$$$$$$@@@+....++@@@$$$$$$$@@@+.....+@@@$$$$$$$@@@+....++@@@$$$$$$$@@@+.....+@@@$$$$$$#@@@+........++@@@@++.......++@###$$$$$$$@@@+.....+++@$$$$$$$$$$#@.....++@$$$$$#$$$$@@.....+@+$$$$$#$$$$@@....++@+$$$$$#$$$$#@...++@##$$$$#@+.......++###$$##@++.........++@##$$$$#@+......",
-"..+.++++++@+@+@++...+++++@+@+++++@@@@@+.....+++++@+@++@++.......++++++@+@+@++.......++@+@+@+@+@++.......+++++@@@+++++.......++++@+@@@+@++...........++++..........@@#@#@@@@@++@++........+++@+@++@@@@++......++++@+@@+@@@@+......++++@+@@+@@@@+......++++@+@@@@@@++...++#@#$$#$$++......+++@#@#@@#@++.........++#@#$$$$$+++.....",
-".....++++++++++.+....+++++++++++++++++.......++++++++++.+........++++++++++.+.........+++++++++.+........+++++++++++........+++++++++++.+............+............+@@#@@+++++++.+.........+++++++++++++.......++++++++++++........++++++++++++........+++++++++++++...++@#@#@#@@++.......++@@#@#@@@+..........++@#@#@@@@++......",
-".......++++++..........+.+++.+.+...............+.++++..............++++.+................+++...............+..+.++..............+.+.+............................+++++++++.++................++++.++.............++.+++..............++++++..............++.+.++.......+@@@#@@@@++........+++++@+++............+@@#@@#@@+.......",
-"...................................................................................................................................................................++++..+.............................................................................................++@++@@+++..............................++++@++@++.......",
-"................................................................................................................................................................................................................................................................................................................................",
-"........................................................................................................+++++++++++++.....................................................................................................................................................................+++++.................................",
-".......................+...............................................................................++++@+++@++++++...........................+++++++++..............++++............................................................................................................++++++++................................",
-"......................@+@@+......................................+..+.+.+.............................++#$$@##@#@#$$$++.............++++.........+@@@@@@@@@+............+@@@+.............................................................................................+++....++.....+@#$$$@@++++++..........................",
-"....................++@@@@@+.................................++++++++++++++++........................++@$#$##@#####$$@+..........+++@@++.......++@@@@@@@@@@++..........++@@@@+.................+++++++..........+++.................................+++++...............++++++++++++....+@#$#$@@++++@+++........................",
-".........++.........++@@@@@++................................++++@@@@@@@@@@@+++......+++++............++$$$####@##$$#@+...........++@@+++.......+@@@@#@@@#@++.........++@##@+++................+++@@+++........++++++.............+.+.+.+.+........+++++++++++.+........++@@@@@++@@++...+#@$$$@@@@@@@+@++++.......+++.....++....",
-"......++@+@++.......@@$$$$$@++..............+++++++++.......+@@$$$$$$$$$$$$$$#+......@@@@@+..........++@$$$@#@#@#@$$$@@.........++@@$$@@+.......+@@####@@$$++.......++++@$$$@++++.............++$$$$$@@......++@@$$$++........++++++++++++@+++....++@##@#@@@+++++++....++@@#@@@@@$$+++..+@#$$$#@@@@$$#@#@@@....+++@@+.+++@@@.+..",
-"......++@@@@@+......++$#$$$@@+.......+.....++++@@@@@++++....+@@$$$$#$$$$$$#$$$+.....+@@@#@++.........++@#$$###@###$$$@+......+.++@@@$$@@++.....++@@@##@#@$$@++....++++@@@$$$@@@+++...........++@$$$$$#@....++++@@$#$@++......++++@@@@@@@@+@@@+...++@@##@#@@@@@@@@++...+++#####@@@$$@@+..@@@#$$####@$$##@#@@....+@@@@+++++@@@@+..",
-"......+@$$$@@+......++@@$$$@@++...+++@@..++@@@$$$$$##@@+....++@@@+@@###@@@@++++.....+@@#@#++.........++@###$$$$$@#$$$@@..++@+@+++@@@$$@@++.....+@@@###@@@$$+++...++@@#@@#$$$@#@#@@+..........++@#@#@#@+..++@+@@@@##@@+@++....+@#$$$$$$$$$$$#$++.++@#$$$$$$$$$$$$$$#...+@@@@@##@@@$$@+++.+@@@@@$$@@@#@$$$#@@....++@$$@+++@#$#@@+.",
-"......@+$$$@@++.....++@@$$$#@+++.++@+@@..++@@@$$$$$##@@@++..++++@@@@###@+@+@+++......@@@#@++........+++@####$$$$##$$$@@..+@@@@@@+@@@$$@@@+...+++@@@@##@@@$$@@++..+@@####@$$$###@#@@..........++@@###@@@...@@@@@@#@##@@++++..++@@$$$$$$$$$$$$$@+..+@#$$$$$$$$$$$$$$$...+@@###@#@@@$$@@@+..++@@@$$@#@@#$$$##@....++@$$@@@@@$$$@@+.",
-".....++@$$$@@@+......++@$$$@#+++.+@@@@@.++@@#@$$$$$##@@@+++.+++++@@@###@@++++......+.@@##@@.........+@+@###$$$#$##$$$@+.++@@@@@@@@@@$$@@@++..+++@@#@##@@@$$@@+@.++@@#####$$$@##@#@@.........++@@#@##@@+.++@@@@#@#@#@@@@@@++.++##$$$$$$$$$$$$$++.++@@$$$$$#$$$$$$$#$.+++@@@#@##@@@$$@@@+.++@@@@$$@@@#@$$$@#+....++@$$@@@+@$$$@@+.",
-"......++@@@$$++......++@@##@@++++@##$@@.+@@$$$@@###@####@@+.+@@@@@+@###@@@+++++.....+@@@#@++........++$$$$$##@####$$$@#.+.$$$$$$$$$$$$###++.@+@#####$$###$$@#@@.++@@$$$##$$$#####@@........++@@#$$$$$@+.++$$$$$$$$$$$$$$$@@..+@@$$$@@@@@@@$$$@+..++@@@@$$##@$$@@@@+.++@$$$$$$$$$$$$$$#@...@@##$$@@@@@$$$@@+....++@#$@@@@@###$$+.",
-"......++@#@$$+@.......+@###@@@+++@$$$@@.+@@$$$@@####@###@@+.+@@@@@@@###@@@@++++.....++@##@@+........@@#$$$$##@#@##$$$#@.++$#$$$$$$$$$$###++.+@@@####$$##@$$###@.++#@$$$@#$$$#@####@........++##@$$$$$@@.++$$$$$$$$%$$$$$#@@..++@$$$@+@+@@@$$#@+..+.+@@@#$###$$@++++.+@@$$$$$$$$$$$$$$$@.++@@@@$$@@@+@#$$@@+.....+@#$@#@@@####$+.",
-".....+++@@@$$@++......++@@#$$@@+@@#$$@+.+$$@@@@@@@@##@@@$$+.+#@#@##@$$$##@#@#@@.....+@@#@#++.........@@@#@#@##@#$$###@@..++@@@@$$@@@@@###@+.@@@#@###$$###$$@@##.+@@@$$$@@$$$@@#@@#@.........@@####@@@@+.+@@##@#@@$$$@@@@@++..+@@#$#@@++@@@$$$@+....+.++@@###@@+@++....++@#@#@#@@@$$@@@+.++@$$$$$@++@@#@#@@+....+++#@$$$##@@@@++.",
-"......++@@@$$@@+......+@@#@$#@@+@@$$#@+.+$$#@@@@@@###@@@$$+.+@@##@##$$$##@#@#@@.....++@#@#++........++@#@#@#@##@$$###@@..+++@@@$$@@@@@###@+.@@@###@#$####$$##@@.++#@$$$@@$$$@@@#@#@........++@######@@+.++#@#@#@@$$$##@@@+...++@$$$@++++@@$$$@+......++++####@@+......++@@#@##@@@$$@@@+.+@@$$$$$@@+++#@#@@@.....++@@$$$##@#@++..",
-"...+++++@+@$$@@++......+@@@$$@@@@@$#$++.+$$@#@+@@@@##@@@$$@.+@@@@#@#$$$####@#@@.....+@@@#@@++........@@@#@##@#@#$$###@@....++@@$$@@@@@###@+.@@@@@###$$@##$$@#@#..@@##$$@@$$$@@@#@#@........++#@###@#@@@.+@@#@#@@@$$$@@@@@++..+@@#$$+@+++@@$$$@+.......++@###@@+++.....+++#@###@@@$$@@@+.+@@$$$$$@+++@@###@+......@@@$$$##@@@++..",
-"..++@@@#@+@##@@@+......++@@$$@@@@@+@++..@$$@#@@+@@@$$@@@##@.++@@+@@@###@++@++++.....++@$$$++.........+@@$$$$$$$$$$###@+.....+++#####@@@@+#@.+++@@@@@##@@@$$@@@+.++@#$$$#@$$$#####@#........++@@@$$###@#.++@####@@####@@++....++@$$$+@+++@@$$#@@.......+++@###@++.......++@#@##@@@$$@@++.+@@#@#$#@@@+@@@@#@+....+++@@$$$##@++.+..",
-".++@@@#@@@+##@@@++......+++$$@#@@++++...@$$#@@@+++@$$@@@##@....++++@###@@++++++......@@#$$@++........++@$$$$$$$$$$#@#++......+@@#@#@@+@+@@@...+++@#@##@@@$$@@++..@@@$$$##$$$#####@@.........++@@$$####@..@@@###@@####@@++.....@@$#$@++++@@$$$@+........++@@#@#+++.....++@@#@##@#@$$@@++.+#@@#@$$@@@+@@#@##+.....++@@$$$##@@++...",
-"++@#$$@@@@@@@##@++......+++@@$$$@++++...+####@@+@+@####@##@.....+++@###+@+++........++@$$#@+..........++###@#@@@@@###++.......+@@$$$@@@++++....++@@@##@@@$$@@@+..+@@###@@$$$@@@#@@@........+++@+###$$##..+@@$$$@@##@##@++....++@$$#@@+@+@@$$$@+........++@@@##++.......++@#@#@@@@$$@@+...+@+@@@#@@@@@@#@#@@...++@@@#$$$$$+@+....",
-"++@$$$#@@@@@@###@++......++@@$$$@@++....+##@##+@++@@#@####@.......+@@##@+++.........+++$$$@++........++@####@@@@#@@#@++......++@@$$$@@++++......+@@@##@@@$$@@@+.++@@###@@$$$@@#@@@@.....++++++@@##$$$##.+++@$$$@@#####@+++....@+$$$@+@+@@@$$$@+.........++@@##@++......++#@####@@$$@@++...+++@##@#@@@#@@#@+..+++@@##$$$$$@@++...",
-"+@+$$#@@@@@@@##@@@+.......+@@#$$+@+++...+@##@#@@+@@##@#@##@.......+@###@+++..........+@$$$@@++........++###@#@@@@@##@++........+@$$$@@++.+......+@@###@@@#$@#@+..++@@##@@$$$@+@@@@+..+++++@@@@@@##$$###..++@#$$@@#@###@+++...+@@#$$@@@@@@@$$#@+.........++@@##@@++.....++@#@@@@@@$$@@+.....+++@#@#@@@@#@#@+.++@@@@##$$$$$@@@++..",
-"+##$$$$$#####$$$#@@........++#@@##@@++..+@@$$$#@@+@@@$$$$$@......+++####@@++........+++@###@++.........@@@#$$#@#@@++++........+++@@@#@@++......+.@@@##@+@#@$$$@...+++++@@$$$@@@+++...+@@#@@$#$$$#####@@...+@###$$@@@@@###++...+@$$$#@#####$$$@@..........+++@#@@@++.....@@@#####@$$@@++......+@@#####$$$@@+.+@@$$$$$@@@@@$$#@++.",
-"+##$%$$$#####$$$#@@........++@####@@+++.+++$#$##@@@@@$$$#$+.......++###@#@++.........++##@##@++.......++@#@$$##@@@+++...........+@@@##+++.......+@@@##@++@@$#$@...++++++@$#$+++......+@@##@$$$$$#####@@...++###$%@@##@#@#++..++@$$$#######$$$++...........+@@##@@@.....++@####@#@$$@++.......++@###@#$$#@++.+@#$$$$#@+@#@$$$@++.",
-"+$$#@@@@@@@#@#@#$$@.........++++@@$$$@+..+++@@@@$#$@@@@@@++.......+@@###@@++..........++@@$##@@+.......+@@@$$###@+++.............+++@@@@@+.......+@@@@+@++@@@@#......++@+$$$@+++....++@@@###@@@@@@@@@#@....++@@@@@+@+@@#@#@...+@@@@+@++@+@###@+...........++@@###@@....++@@@#####$$@@+........++@@@#@@@@++..+@@#@@+@+++++@@@$$@.",
-"+$#@#@@@@#@#@##@$$@.........+++@@@$#$@@...+++@@#$$#@+@+@+++.......++@####@++...........+++$$@@@+.......++@@$$###++...............+++@@#@@.......++@@@#+++++@#@#........++$$$++.......+@@@#@#@@@+++@@@@#....+++@@#++++@@@@#@...++@#@@++++@+#@#++............+++@@#@+.....+@@@##@#@$$@@+........++@@@#@@@++...++@@@@@++++++@@@#$@.",
-"+$$@@@+@@@#@#@#@$$+...........++@@$$#@@.....++@@#$$++++++..........@@@@#@++...........+.+@#$#@@++.......++@#$@#@++................++@@@@@+.......+++@@++.++@@@@........++$$$+++......++@@@@#@@+@++++@@@.....+++@@+++++@@#@@...++@@@++++++@##@++.............+@@#@@@.....+@@@###@#$$+++..........+@@@@@++....++@@@@++....+++@$#@.",
-"++++++++++++++@++@+............++++@@@@.....++++++++++.............++@+++++.............++++@@@+.........+++@+@+++..................++++.+.......++++..+...++++........+++@@+.........++@+@++++++++++++......++.+...+++++@+...++++++....+.++++...............++++++......++++@@+@@@@++...........+++++++......+++........++++++.",
-".+++++..++++++++++...............++++++.......+++++++................++++.................++@@++..........++++++............................................+++.........++++.+...........+.+++.......+................+.+.................+++................+.++.........+++++++@@+...............+.+.......................++.",
-".................+..................++................................+...................++.+...........................................................................+++..................................................................................................++++.+............................................"};
diff --git a/hacks/images/matrix0b.xbm b/hacks/images/matrix0b.xbm
deleted file mode 100644 (file)
index 9662141..0000000
+++ /dev/null
@@ -1,308 +0,0 @@
-/* Created with The GIMP */
-#define matrix0b_width 160
-#define matrix0b_height 182
-static unsigned char matrix0b_bits[] = {
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb,
-   0xfb, 0xbf, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xbf, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xf7, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xff, 0xfb, 0xff, 0xb7, 0xff, 0x7d,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff,
-   0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xdf, 0xff, 0xfe, 0xfb, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xf7, 0xff, 0xdf, 0x7d, 0xf7, 0xdf, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xbb, 0xfb, 0xff, 0xff, 0xdf, 0x7f, 0x7f, 0xff, 0xfb, 0xff, 0xff,
-   0xff, 0xff, 0x7b, 0xff, 0xff, 0xfd, 0xfd, 0xff, 0xef, 0xff, 0xff, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xef, 0xfb, 0xbf, 0xff, 0xf7, 0xfe, 0xff, 0xff, 0xfe, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xdf, 0xfe,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
-   0xff, 0xfb, 0xfd, 0xff, 0xbf, 0xbf, 0xff, 0xff, 0xff, 0xef, 0xbe, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xff, 0xff, 0xf7, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xfb, 0xfe, 0xff,
-   0xff, 0xff, 0xff, 0xfb, 0xf7, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xf7, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xff, 0xff, 0x7b, 0xbf, 0xbd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0xfe, 0xef, 0x6f, 0xf7, 0xff, 0xef, 0xdd, 0xff, 0xff,
-   0xff, 0xff, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
-   0xff, 0xfb, 0xff, 0xfe, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff,
-   0x7f, 0xf7, 0xff, 0xfb, 0xde, 0xff, 0xff, 0xfb, 0xfe, 0xf6, 0x7f, 0xbf,
-   0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 0xff, 0xff, 0xfb, 0xff,
-   0x7f, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xef, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf7, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
-   0xdd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0xbf, 0xff,
-   0xff, 0xfd, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff,
-   0xff, 0xfd, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xbf, 0xff, 0xff, 0xf7, 0xff,
-   0x7f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xdd, 0xb7, 0xdf, 0xfe,
-   0xfe, 0xfe, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
-   0xff, 0xff, 0xfe, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfd, 0xff, 0xff, 0xf7, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xdf,
-   0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff,
-   0xfd, 0xee, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xdf, 0xbf, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xff, 0xff, 0xfd, 0xfb,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
-   0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xf7, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xdf, 0x7f, 0xf7, 0xfd, 0xbf, 0xdf,
-   0xff, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xfe,
-   0xfb, 0xff, 0xff, 0xfd, 0xff, 0xef, 0xf7, 0xff, 0xfe, 0xff, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xff,
-   0xef, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xf7, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
-   0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xbf, 0x7f, 0xff, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xf7, 0xdf, 0xfd,
-   0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xdd, 0xdf, 0xdf,
-   0xfe, 0xfb, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xdb, 0xff, 0xff, 0xff,
-   0xfd, 0xff, 0xdf, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff, 0xff,
-   0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x7f,
-   0xf7, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x7f, 0xff, 0xff,
-   0xfb, 0xbf, 0x7f, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x7f, 0xfb, 0xff, 0xff,
-   0xff, 0xbf, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0xff, 0xbf, 0xff, 0xfd, 0xff,
-   0xf7, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xff, 0xff, 0xef, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x7f, 0xff, 0xff,
-   0xfd, 0xff, 0xbf, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xef, 0xff, 0x7f, 0xff,
-   0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb,
-   0xdf, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfd, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xbf, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0x7f,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff,
-   0xff, 0xff, 0xef, 0xfe, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xf7, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xbf,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff,
-   0xef, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xdf, 0xff, 0xbf, 0xff, 0xee, 0xff,
-   0x7f, 0xff, 0xfb, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xff,
-   0xbe, 0xff, 0xfb, 0x7f, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xbf, 0xff, 0xfd, 0xff, 0xff, 0x7f, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff,
-   0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xf7, 0xef, 0xff, 0xfe,
-   0xfd, 0xff, 0xff, 0xff, 0x7e, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff,
-   0xdf, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff,
-   0xdf, 0x7f, 0xdf, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xdf,
-   0xff, 0xff, 0xff, 0xfb, 0xff, 0xef, 0xbb, 0xfb, 0xff, 0xff, 0xff, 0xfd,
-   0xfd, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xfe, 0xff, 0xef, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x7f, 0x7f, 0xff,
-   0xff, 0xf7, 0xff, 0x7f, 0xff, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xfd, 0xff,
-   0xef, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xfe,
-   0xf7, 0xdd, 0xbf, 0xef, 0xff, 0xf7, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0xfb,
-   0xff, 0xfe, 0xff, 0x7f, 0xef, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xbf, 0xff, 0xef, 0xff, 0xff, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xbd, 0xff, 0xff, 0x7f, 0xff, 0xdf,
-   0xff, 0xfb, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff,
-   0xff, 0xdf, 0xff, 0x7f, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xf7, 0xff, 0xbb, 0xff, 0xff, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xfb,
-   0xf7, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xb7, 0xdf, 0xff, 0xfe, 0xf7, 0xff,
-   0xff, 0xbf, 0xff, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xff, 0xfd, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff,
-   0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdd, 0xff,
-   0xbf, 0xff, 0xfe, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f,
-   0xf7, 0xee, 0xf7, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
-   0xfd, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xdf, 0xff, 0xfd, 0xff,
-   0x7f, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfe, 0xfb, 0x7f, 0xff,
-   0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xfb, 0xf7, 0xff,
-   0xff, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xbf, 0x7f, 0xff, 0xfd,
-   0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xbf, 0x7f, 0x7f, 0xff, 0xff, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0xdf, 0xff,
-   0xff, 0xfb, 0xff, 0xef, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xf7, 0xff, 0xfb,
-   0xef, 0xfb, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xfe, 0xbf, 0xff, 0xdf, 0xff,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xf7, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xff,
-   0x77, 0xff, 0xff, 0xef, 0xbf, 0x7f, 0xef, 0xfd, 0xff, 0xff, 0xff, 0xdf,
-   0xff, 0xdf, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff,
-   0xfe, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xfe, 0xff, 0xfb, 0xff, 0xef, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf,
-   0xff, 0xfb, 0x7f, 0xff, 0xff, 0xfd, 0xdf, 0x7f, 0xff, 0xbf, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xfe, 0xfb, 0xff, 0x7f, 0xff, 0xf6, 0xff, 0xff, 0x7f,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
-   0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfe, 0xff, 0xef, 0xff, 0xff,
-   0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff,
-   0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xfd, 0xfe, 0xdb,
-   0xbf, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
-   0xfb, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff, 0xdd, 0xff, 0xff,
-   0xff, 0xff, 0xfb, 0x7f, 0xff, 0xff, 0xff, 0xfb, 0xdf, 0xdf, 0xfd, 0xf7,
-   0xf7, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0xdf, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xdf, 0xff, 0xff,
-   0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
-   0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xdf, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xff,
-   0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff };
diff --git a/hacks/images/matrix0b.xpm b/hacks/images/matrix0b.xpm
deleted file mode 100644 (file)
index 66697f3..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-/* XPM */
-static char * matrix0b_xpm[] = {
-"160 182 16 1",
-"      c None",
-".     c #000000",
-"+     c #030E03",
-"@     c #061406",
-"#     c #081E08",
-"$     c #0B2A0B",
-"%     c #0F390F",
-"&     c #165016",
-"*     c #000100",
-"=     c #051205",
-"-     c #051405",
-";     c #061706",
-">     c #061806",
-",     c #061606",
-"'     c #020802",
-")     c #030B03",
-"...............+.................++@+......++++.............................................................................................................++..",
-".............+@@@+....+++@+++...+@@##@+...++##@++...+++++.......+.+......++++.......+@@+....+@@++......+@@++...............................................++@@+",
-".+..+..+..+..@$$#++...@@#@@@+.+.+####@++.++#$$#@+.+.+@@++..+..+.@+++.+...+@@@+.+..++@#@++...+@#@+..+.++@$$#+.+..+++@+.+..+..+..+..+..+..+..+..+..+..+..+...+#$#@",
-"...........+.#%%#@.+.+@$#$$#+..+@#$$$#@..+@#$$$#@..+@###++....+@##@+.....+##@+.....+###+.+..+###++....+#%%$@+....+@#++..................................+..@#$#+",
-"..+..+...+..+@%%#@...+#$$$$#@+.+#$%%$#@+.@#$$$$#++.+####@+....@#$$#++..++@##@+..+.+###@+.....@##@+..++@$%%%#@+...@$$#+..+..+..+..+..+..+..+..+..+...+.....+@##@+",
-"...+...+.....#%%$++..+@$$$$#+.+@#$%%%#@.+@#$$###++.+@$$$@++.+.##$#@++....+#@++....+#$#+...+..@#$#++..+#$%&%#@..++#%%$@++.+..+..+...+++++++++..+...+...+...+###+.",
-".....+...+..+#$%$+.+.++@@@@+...@$%%%$#@..@#$$$$#+..+@#$$#+...+#$$$#@+....+++...+..@$$#++.....@#$$@....#$%%%#@+.+#$%%%#@...........++##$#$#@+....+...+..+.+@##@+.",
-".+...........@$%#+......+++.+.+#$%%%%#++.+@#$$$$@+.+@#$##@+..+@$%$##++.......+...+@$%#+.....+.#%$@+...+$$$$#+.+@$%%&%%#@.+..+..+...@$%%%%$#++............+@##+..",
-"...+.+..+.+.+@$$@+............+#%%%%$#+.+@##$$$$@+.@@#$$#@++.+#$%%%$@.+........+..@#$#+.+.+..+###+.+.++####@+..+#$%%%$@+....+.+....+####$#@+..+.++.+..+..###@+..",
-".............+@##...+....+....+#$$%$$@+..+#$$%%$#++.+@####+.++#$$%%$@+.+.+.+......+###++....++#$#@.....++++...+.+#%%#++..+.+@@++..+.++@@+++....++@@+...++@##++..",
-".+....+...+..+@#@+....+....+...@#$$##++..+#$%$$#+...+@####+..@#$$%$$#+.......+.+..+@##@+.....@##++..........+....@$$#+.....+##@+............+..+@#@++..++##@+...",
-"...+..........@@+..+.........+.@##$##+...++#$%#@.+...+##@+++.+@#$$$#@+.+.+.........+@$@++.+.+##@+..+......+...+..+##@.+...+@#$@+..+..+.+.......+@#@+...+###@.+..",
-"......+.+.+.+.+.+...+.+.+.+....+###@@+.....+##@+......+++.....++@@@@++.....+..+.+...@#@+....++#++...+...+......+..+++......@#@@..........+..+..++@+...+.##@+....",
-".+.+...........+.+..............++@++.+....++@+...+.....+..+...+..+.......+......+...++..+....+..+....+...+.+....+....+.+.+++@.+...+................+..+@@++.+..",
-"...++++.....+.+.......+.+++..+..+++++...+....++.....++++.+...+..+.+.+.+.+.@+@+....+++.+...+.+.++.+..+..............+........+........+...+.......+.......++.....",
-"...+@@@+++.++@@@++.+..+@@@@@+..++@#@+++....+@@@++..++@#@@++....+@#@@++.+@@@@@@++..++@@@@+....++@+++.....+....+.+...............+.+....+.....+.+.......+.+@@#@+..",
-".@@##$$@+..+@$$$@...++@#$$$#++.+##$$#@+....+#$$+..++#$$##@+..+.#$%$#+..+###$##@++++#$$##++.+@####@++.+....+......+.+.+.+....+..+..+......+....+.+.+.+..+@$$$#@+.",
-".+@$$$$#@+++@$%%#+...+@$$$$#@+++#$%$$#@.+.+#$%%#+..+#$$$##++..@#%$$#@+.+####$$@+++#$$$%#@+++@#$$$#@+.....+.+.......+.....+..++@@@+...+.++.+.++@@++.....+#$%%$#@.",
-".@#$##$#@+.++#%$#+...@@##$$$@+++##$$$#@...+#$%$#+.+@#%%$$#+.++#$%$#@+..++@####@++@#$#$$#@+.@###$$%@+.+.+@@@+.+...++@@+....++@@##@++++@@@@++.+@###@@+.+.+#$$$$#@+",
-"+@#$####@@..+@$%#+..+.++@####+..+@#$$$@+.+@$$$%#+..@#$%%$#++.@#%$$$#++...++###+..@#$$#$$#+++#$##%%#+...+@$@+...+.+@$@@.+..@@#$#@@+.+@####@@+.@@#$$#@+..+@##$$#@.",
-".@#$@@###++.++$$#+....++@$$#++.++#$%$#++.@#$$$%#++.+##$%%$@+.@$%%$$$@+....+###++.+#$$$$#@+++#$$$%%#+...+@#@@.....+@#@@..++#$$$#@+..@#$$$$$@+.+@@$$$$#+..+@#$$#@.",
-"+@#####$@@..+@$%#+...+.@$$#@+...+@#$$#@.+@$$%$%#@.+.@@##$%#++@$$%$%%@+.+.++##++.+@#$$$$$@+.+@$$$%%#++...+@++.+....@@++...@#$$$@++.+@#$$$$$@++.+@#$%$#+..+@$$$@+.",
-".@#$#####++.+@$%#+...++#$$#@+.+.@@##$#@.+@$$$%%$@..+@@@#$%#.++$%$$$%#+...+@##+...@#$$#$$#+.++#%%%%#...+.++.+...+..+.+..+.+#$$$#@+..@##$#$$@+.++@$$$$@+..+@#$@+..",
-"+@#$####@+..+@$%#@++.+#$%$#++.+@#@##$#@+.@#$$$%$#+++#@##%$#+.@#%$$%%#+..++###++.+@$#$#$#@++.@#$$%$@+....+@++......@@++....@#$$$@@+++###$##@+++##$$#@+....@##@...",
-".+#$$$$#@+.+@#$%#@+..@$%$$#@+.+#$#$$$#+..+@#$$%$@.++##$#$$@+.+#$$$$$@+...@#$@+...+#$$$$$@++.+#$$$$@.+..+@#@@..+.++#$@+.+...@@#$#@+.+@@@@@@++.@####++.+..+@#@+.+.",
-"+.+##$#@+..+@#$$$@+++@#$$$##@.+@#$###++.+.+@##$#@+.+@$#$#@+..++###$#@....+##@+.+..+##$##+..+@####++....+@$@++...+@$$@+...+..++@@++...+..+...+@@@++.......+@++...",
-"...@@#@++..+@@###@+..+@####@+...@##@+......+@##@+...+@@#@+.+..++#@@@+.....+++...+.++@#@+.+.++@#@@.+.+..++@+.....+@#@@.........+..............++.+...+.+..++.+...",
-"+.+.+++..+..+++++++...++++++.+...+++++...+..+++++.+..+++.+......+++..+.+.+.+........++.+.....++++........+.+...+.+@+++.+..+.....+..+.+..+.+.....................",
-".....+........+....+....+.+....+..+....+....+.........++.+..+.+...+........+.+..+.+..+.+..+..+..+......+.+.+....+.+........+.+...............+.+.+.+..+..+.+..+.",
-"+.++@@@+.+..++@@+....+@@@@+++....++@@@+..+@@@@++.+.+@++++++...+@@@+@+.+..+++@++..++@@+@+++..++@@+++.+..++@@+++.++@@@@@.+.++@+++..+.++@+.++@.+.+++.@+.+...++++...",
-".++##$#@..+++@#@@+.+.+@###@@+.+++@###@@++@####@@++.+#####@@+++@#####@+.+@@@##@@+++###@##@@++@@###@@..+++@##@@.+@@##@@#++.@###@+...+@#@@@@@#++@@#@@@#@+.+@@@##@+.",
-".+@#$$$@+..+@$$$@++.+@$$$$$#++.@#$##$$#++#$$$#$$@++@#$$$$$@++@$$$#$$@@+@##$#$$#++#$$###$#@.+@$$$$@++..+@$$$$@++#$$$$$#@++@$$$@++.++#$$#@#$#@@#$$##$$#++@#$$#$$@+",
-".@#$$$%#@+.+@$%$#++.+@#$$$%%#++#$$###$#++#$$##$$$@@@#$$$%$@++@#$$$#$#@@#$$###$#@+#$$###$#@.++$%%$@+...+@@$$#@++#$$$$$#@.+@#$$@+...+#%$$$$%$@@$%%$$%%#@@#$$##$$#+",
-"+@#$%%%$++..##$$$@+..@#$$$%%#@@$%$#@@@@++@#$#@#$$@+@#$$$$$@.+@#$#$$#@@@$%##@##@++@$#$#$$#++.+@$%#+.+...+@#$@+.+@$$%$$@+..@#$$++..++$%%$$%%%#+#$%$$%%$@@$%###$%#@",
-".@#$$%%#@+.+@$$$$#++.##%$$%%##@$%#+++++.+@###@###@+@#$%%$$++.@#%$$$@++@$%#@@@#@+++#$$$###+..+@$%#+...+.++###@.+@$$&%#@+..+#$#@....+#%%%%%%%#@##$$%%%#@@$%#@@#$#@",
-"+@$$%%%#@.++#$%%%#@.+@#%$$$%$@#$%#@..+.+.@#$@@@##@+@#%%%%@@.+@#%%%$@.+#$%$@@##@.+@#$#$$##++..#$%@@...+++@@$@++.@#%%%$@+..+@$#@++.++$%%%%%%$@@#$$$%%%#@#$%#@@#$#@",
-".@#$$$%#@+.@$$%%%$#+.@#$$$$$#@#$%#@+.++.+@#$@@#$$@+@#$%%$#@+.@#%$$#@..@$$$##$$#++@#$##$##++.+@$%#+.++@@@##$@@.+@#$$%$#+..@#$$@@#+.@$%%$$%%%#+##$$%%%$+#$%#@@#$#@",
-"++#$$$$#@++#%%$%%%$#+##$$#$$#@@#$#@@@@@++#$$###$$@@@$$$$$$@@+@#$$$@+.++#$$#$$$#++@$$$$#$@@..+#%%#@+.@#$$#$$#+.+@$$$$$#@++@#%$$$$@++$%%$#$%$#@#$$#%%%#++#$###$%#@",
-".@#$%$$#@.+#%%$$%%$@+#$$$$$$#++@#$$#$#@++@$%$$$$#+@#$$$%$$#@@#$$$#@+..+@#$$$#$#+@#$$#$$$#@+.@#$%$@++@#$$$$#@+.@@$$$#$$#++@$%$$%$#++#$$##$%$#@#$$$$%%#++@#$$$$$#+",
-".+@#$%$@+++@$$##$$#@@#$$$$$$@+.+@##$#@+.+##$$$##+++#$$$$$$#+@#$$$#++...+###$##+++@$$###$#+++@#$$$@+.+@##$$@@..+#$$#@@$@+@@$$$$$#@++#$#@@@$#@@#$###$$#..+##$#$#@.",
-"..+@##@@..++@@@+@#@+.@@#@@@@+..+.@@@@++..@@#@#@+...+#@##@@++++#@@++..+..++@@@+..++@#@@@@@+..@@@#@@+..+@@@@++..++@@@@@@+++@@@#@#@+..@@@+++@++++@@+++++....@@@@+..",
-"..+.++++........+.....+..++........++.....+..+..+...+..+.+...+.+++.....+...+.+....+.+.+++.....++++.....++.......+.++.+...++@+++...+.++.++......+..+...+...+.....",
-"..+.......+.+.+..+..+..+...+....+...+.+....+.++..+..++.+.+........+.+...+.+..++...+.+....+.+.+..+.+...+.+++.+...+.@@++...+++.........+@@@+...+..+...........+...",
-"++@@#@@++....@@@++...+@@##++.+...@@#@@.+.+@@@@@@+.++++++++++++@@+++@+++++++++++++++@@@@@@+.+@@@@@@@+.++@@@@@.+..+@$$@++.+@@@@.+.+..++@#$#++....++@++...+.....+..",
-"+@$$$$#@++.++#$$#@++.#$$$$#@+..++#$$%$#+.@$$%$%$#++@$#@###@++@##@@@##++@##@@#$#++@$$##$$#@+@$$$#$$#@++#$$$$$@+..+@$$#+...@@#@+......+#$%$@+..+.+##@+.....+......",
-"@#%%%%$#++++#$$%$$@+@#%%%%##@+.+@#$%%%$@+#%%&%%%$@@$%$##$%#++#%$###%$@@#%%##$%$#@#%%%$%%$@@#%%$$%%$@@@$%%%%$@+..+#%%@+...+@##++.+..+.+#%$@.+...#$%#++...........",
-"@##$$$#$#++##$#$$$#+@#%%$$$#@++@#$$$$%$@@#%%%&%%$@@#%$##$%#@+#$$###$$@@#%%$$$%$#@#$%%$%%$@@#$%$$%%$@+@#$$%%$@+..+#%$@+...+@##@+......+#$$@...++#$$$@+..+...+.+..",
-".@#$#####@@$%####$#++@#$$#$##@.@#$$$$$#@+#$%%%%%$@@#$#@#$%$@+##$#@#$#@@$%%%%%%$@++$$%$$$@.+@#$$$$$@++@##$$$#@...+#%$@.+...+@$$@.+..+.+#%$@+...+##$$@++...+......",
-".@#$$$#$#@#$%#@@###@+@#$%$$$@+.@#$$$$$#+.@#$%%$##+@###@#$%#++@#######@+#%%%%%%$@++@$%%$#@..+@#$%$#+..+@#$$$@++..+@%$@+....+@###+.....+#$$@+.+.+@###++..+...+....",
-"+@#$%$$$@@@$$#@@#$#++##%%%%#@+++#$$%$%#@+.+#$%$@+.+###@@$%#+.+@$####@++$%&%%&%$@.+@#$$$@++..+#$%$@+..+@$$$#@+...+#%$@..+...+@#@@++...+#%$@.....+++++.........+..",
-"+@$$%$$#@+@#%$##$$#++@$$%$%#@..@###$$%$@.++#$%#@.++#####$%#+++@$$$$#+.+#$%%%%%$@++@$$$$$+.+.+#$%#@...@@$$$#@@...+#%$@+......@#$@+..+.+#%$#+.+......+.+.+..+.....",
-"+@#$$$#@..+#$$$$$$#++#$$$$$$#@+@$$$#$%$@...@$%$@..+@####$$@+..@#$$$@+..@$%$$$$#++@$$$$$$#@..+#$%#++.+@#%%$$$@+..+#%$@+.+..+.+@##@+..++$%$@...+..+............+..",
-"@#$$$#++...@$%%%%%#++#%$##$$#@+#$$$$$$#@+.@#$%#@+.+@###$##@+..@#$$$+.++@#$#$###+@#%$$$$$$@+.+#$%#@+.+@$$$$$$@+..+@%%#+......+@#$@...++#%$@+............+.+.+.+..",
-"+@#$#@+..+.+#$%$%$#++@#######+.@#$####@+..+@$##@...+@####@++...@###+...+@##@##+++##$###$#+..+@#$#++..@#$$#$$@+...@$$#@.+.....+@@@+..+@$$#++...+...+.+...++++++++",
-"+++@@++....+##$$$$@.++@@++++++.@+@@@@@+...++@@@++...+@@@@+...+.+@+++....++++++.+.++@@@@@+++.++@@++.+.++@@@@++..+.@##@@...+...+++.+..+@###+.+..........++@@@@@@@+",
-"....+.....+.+@@@#@@...............+..................................+.......+...+.++.........+.+......+.+.......++@+++............+.+@@++......+....+.@@@####@+",
-".....+.......+.....+.++...+.....+...+..+....+.+.+..+..+.+.+..+.+.+++..+...+......+....+.......+..........++.+..+.........+.++.+........+...+.+....+....+++++.++.",
-".+.++++...+.....+....+@#+....+...........+...+@@++..+..........++@@@++..+......+.@@@+....+.+.++@++.+.+..++@+..+@@@+.+.+...+@@@++.+.+............................",
-"..+@#@++......+....++###@+.......+...+.+...+.@##@+....+....+..++@$$$@++...+.+...+##$@+.......@@#+......++##@..@@$@@.......@#$$@......+.+....+.+.+.+.+......+....",
-"..+#$$@...+.+.+.++...#$$#++.+.+...++++....+.@#$$#+++.+.+++....+#$$$#@+..+.+.++.++@$$@@++....+@$#@+...+.+@$#@@.+@#$@@@.+.+.+#%$#+..+.++.++++....+.+....+.+++..+..",
-"...@$#@+....@@##@+..+@#$$##++..+@@@@@@@++.+@#####+.++@@@@@+.+++#%%$#@+.+@@@@@#+.+@$$##@@+..++#$#@+...++@#$#@+.@@###@@@....+@$%#+..+@@##@@@@++@@@@@@@+..++@@#@@+.",
-".+.+@#++.+.+@$$$$@+..@$$$$$#++.+#$$$$$#+++#$$$%$#+++#$$$##@+.+#$%%$#++.@#$$$%$@++@$$%$$@@+..+#$$@+....+@$$%#++.@#$$$$@@+...@$$@+.+@#$$$%$$@++#$$$$$@++.+#$$$$#@+",
-"....+++....@#$%%%#++.@$%$%$$#@+@$%$$%%$++@$%%$%$#++@$%$%%$#@++#$%%$#+++#$$$%%$#+.@#$$$%#@+..@#$%@+....@@#$$$+.+@#$%$$@+..+.@$%#+..@$%%%%%$$@@#$$$$$#@++@#%$$$$#@",
-"+.+..+.+.+.@#$$%%$@.+@#$$$$%$@+#$%$##$#@+#$$$$$##++@%%%%%%$++.+$$$#@.+@$%$$#$$#++@$$$$#$@++.+@%%#+..+..@@$$#@+.@$%%%$@+...+@$$#+.+@#$$$%$$#@@@$$###$@+@#$%$#$%$@",
-"..........+@$%$$%$@.+@####$%$@+#%$#@@##++#%%##$##@@#%%%%%%$@+.+#$#@+.+@$%$##$#@+.@#$#####+..+@$%#@.....++@$$+.+@#%%%#@+...+@%%#+.+@#$$$$$$#@+@$$#####@+#%$$#$%$@",
-"...+.....+.#$%$%%$#.+@$$$$$%$@+#%%$####@+#$%$$$$#++#%%%%%%$@.++#$$#@.+@$%$$$$$@++@$$###$#++.+#$%#@+.+...@#$#@.+@$$%%$@++..+@$%#++.@##$$$$$#@+@#$###$#++#%%$#$%$@",
-".....+...+.#$%$%%$#++#$$$$$$#++@$$$$#$#@+#$$$$%$#@+#$%%%$$#@+.@#$$#@+.@#$%$$$#@++@$$$$$$#@.+@#%%$@@...@@@#$#@.+#$$$$$$++.++#$%$@++@#$$#$$$$@@#$$$$$$#@+@$$%$$$#@",
-".+....+...+@$$%$$$#++@$$$%$#@+.+@$$$$$#+.+#$$$$$#+++##$$$$@+.+@$$$$@+++##$$%$$+++#$$##$$#@.+@#$$$@@+..+@##$@+++@###$$#@+.+@#$$$#++@#$$#####@@@$$##$$#@.+@$$$$#@+",
-"...+.......+@@###@++++@###@@...++@@#@@@+..+@####++..+@###@++..@@###++..+@#$$$#@..@@@@@@@@+..+@##@@+..+@@##@@..+@@@@@#@@...@@##@@.++@@#@@@@@+++@@@@@#@+.++@###+..",
-".......+....++++.+....+.++.+......++++.....+.+.++..+.+.+++...+.++++++.++@@@#@@+..+.+.+++++.+..++@.....++@@++....+...++.+.+..+++.+..++++++++...+++++.++.....+.+..",
-".+.+....+....................+...............+..........................++.@++.+..................+.....+........+.+........+.........+............+..+....+....",
-".....+...........+........+.+........+..+.+.+..+.+....+....+.+.....................+........+.+.....+......+..+...@+++.....+@@++....++@++...+...........+....+..",
-".......+.+....+....+..+.......++.+....+...++++.....+....+......+.+.+.....+....+.+....+.+.+......+.......+.......++@@@+.+...@@#@.+...++@@@+....+..+..+.+.........",
-".++++++...+.+.++++.+..+.+++.+...+.++++..++@#@@+.+...+++.+.+.+.+.+.++.++.++.++.+...++@.++....++.+.+@.+.+++++++...+@$$@+....+@$$@+....+@#$@+..............+....+..",
-".@@##@@@+.+.@@####++.++@@@#@++..+@#@+++..@#$$##@.+++@@@@@@+.+@##@@##@+++@@@+@#@@.+@#@@##@@+@#@@@@#@+.+@@###@@...+@%$@+.+...@$%#+.+...@$$@+.+..+.+.+.+.....+.....",
-"@#%%$%##+++@#$$$%$#+++#$%$$#@+++#$$$##+.+@$%%%$@+.+#$$@#$#@@+#$%$$$%$@@#$$##$$$@+@$%$$%$#+@#$$###$$@.@#$%%%#@+..+#%%@.....+@$%@+....+@$%#+....+@+@@++.+.+....+..",
-"+#%%%$$$#+@#$$$%%$#+.+#$%%$#@+++#%%%$#@.+@$%$$#@+.@#%$#####+@#%%$$$%#@@$%$$$$%$@+@#%%%%$@@+#%$$#$%$@+@@$%%$$@..+@#%$@+.+..+@$%#+.+...@$%#++.++@#$##@@+....+.....",
-"+#$$$$$%$#@$%$$$$$@.+.@$%$##+.+@$%%$$#+.++#$$#@+..+#$$###$@++@#$$#$$#@+#$%$%%$#@.+@$$%%#@+.@$$%$%$@@.@##$%$@@+..+#%%@+.....@%%@+....+@$%#+..+@$$%%$$@++......+..",
-".@$$$$$%$#@$%$$%$$@+.+@$$$@++.++#%%%$#@+.+@#$@@+..+@$####$#@+@@#$#$#@++@#%%%%$#@++@$%%$@@..@@$%%$$@.++#$%%$@@...@#%$@...+.+@$%#+.+...@$$#+..+@$$#$$#@...+.+.....",
-"+@#%$$$$#+@#$$$$%#@.+.#$%#+++.+@#$$$%$@+.+#$$#@@++.@#$##$$#@.+@$$$$@+..@$$$%%$@+..@$$%$#@@..@#$%#@+..@#$%$##@@..+#%$@@....+@$$@+....+@$%@+....@@@#@@++.......+..",
-"+@#$$$#@+.++@##$$$@+.+#$%##++.+@#$$$%$@+..@#%$##++.@#$$$$%#@+.+#$$$@...+@$$$$$@+++#$$%$$@@.+@#$$@@...@#%%%$#@+..+@%$@+.....@#$@..+...@$$@+.....+.+.+......+.....",
-"+#$$$#+++...+@#$$$@+++$$$$#++++@##$$$#+..++##$#@+.+++###$$#+..+@##@+.+.+@###$@+..@##$#$$@@.@#$%$@+...+@$$%$#@+...@##@++.+..++@++....+@##@+.+.+.........+.....+..",
-"+#$%##+.....++#$$$#+.+@#@@@+..+++@@@@++....@@@@++...++#@##++...+@@++....++@+@+..+.@@@@@@@..@#$$#@+.+.++@@@@@+....@@@+........+...+..++@@.......+..+.+.....+.....",
-".@###+.+.+....+###++....+.+.......++.+.+.....+.........++.+.+.................+..+.......+.+@#@@@.....+.++....+...+.+.+.................+..............+.....+..",
-"..+.++....+....+++.+.+..+.+...+.+..+.....+.+....+.+.++.........+.+.+....+.+++......+.+......++@...........+.............+..+.+.....+.+....+.+...+...+.....+.....",
-"*======*...+.+...........++++....+++++.......+......+@++@@+.+...+++..+..+@@@@@@.+......+......@@@++.+..+.++.+.+.+.+.+...........+..............++@++...+.+.+.+..",
-"-=%%%%=-.........+.+.+.+@##+....++###@+...+.+.+.+.+@######@+..++@#@.....+#$$$#@...+++@+.+.++@@##@@....++@@@@..........+.+....+.......+.+....++@@###@+....@@#++..",
-";%%%%%%;.+.+.+.+......+@#%$#@+.+@$$%$@++.++@@@@@+.+@$%$$%%$++..@$$@+.+.+@$$$$$@@+..@.@@@...@#$%%%$@@..+@##$@+.......+.....+.+.+.+.+......+...+#%%%%#@+.+@#$$#++.",
-";%%%%%%;.....+.++....++#$%%#@..+@$$$$@+..+@$$$$#@.+@$%$%%$#+..++$$#+...@#%%$$@@...@+++@.+.+@$%%%%$#@..@@$$%#+.+.+++++++..+@@@@@@@...........+@$%&%%$#@..+####+..",
-">%%%%%%>.....+@@+.+..+@#$$$#@+++#$$$@@.+.@#$$$$#@@.+#$%$%$@.+..@$$@+.++@$%%$$$@@.......+..+@$%%%%$#@.+@#$$$#@...@@@@#@@+.@#$$$$$#@+.++@+@+.++@$%%%%$$@+..+@@++..",
-";%%%%%%>.+...+@#@+..++##$#$#+..@#$$$@+...@#$$#$$#+.+@#%$$#@+..++#$@+..+@$%%%$$#@....+....+@#$%$$$$#@+.@#$%%#@.+@@$#$##@@.@#$%$%%$@.@@@@@@@+.@#$%%%%$#@+...+.....",
-";%%%%%%;....+@###++..+##$##@+++@$%%$@+..+@#$#$$#@++.@#%%$@+....@##@+..+@$%$$%%#@++........@#%%%%%$$@.@@$$%%#@+.##%$$$#@+.@@@##$%$@+@@#$$$#@++@$$$$$$#@+.........",
-">%%%%%%,.+...#$%#@...+@#$$$#+..@$%%$@@+..@#$$$$$#+.+@#%%%@@+..++##@+..++@$$$%$$+....+.....@#%%%%%$#@..@$%%$@@.@#%$$%$#@...+.@@@$#@.@@@###@+.@@$%%$$$#@...+.+..+.",
-">%%%%%%,....+#%%$@+..++#$$$#+++@#%%$##@++@##$$$$@+..@#%%$#+....@$$@+...+@#$$%%@@.+.....+..+@#%$%$#@+@.@@$##@+.+#$%$$$$@@......@@@+..+@@++++.+@#$$%%$@++.........",
-";%%%%%%;.+..+@%&$@+...++#%$@+.+#$%%%%$#+.+@#####++.+@$%%%#@+..+@$%#+...@#$$$%#@+....+......@@#$$$@@....+@@+....@@#####@@....+..+............++@$$$$#@.+...+.+...",
-";%%%%%%;....+#%%$@+....+@##@...@$$%$$$@++.++++++..+.@#$%$@+....@$$@+..++#$$%$@@..+.....+....+@##@@.+............@@@#@@@+.+........+.....+.....@@#$#++...........",
-"-=%%%%='.....@#$#++.....+@++.+.+@#@##@@.............+@@@@++.+..@#$@+...+@#$##@......+....+..++@@++........+..+..+++@@+.......+.+....+..........++@+...+.+..+.+..",
-"*=====)...+..+#@@...+.+..........++.++.+..+.+..+...+..+++.....+.+@++....+@@+@.+..+.................+.+.+.................+.+......+...+...+.+.+.+..+............",
-"....+.+.......+.+......+++.+.+.+..+...........................+.@++++.+....+........+.+..+...+.+..........+.........+.+..@+@...+...@@++.....++@+++......+....+..",
-"+..++@+++..+.+.+..+....+@@@.....+@@@@+.+.....++.+.+..+.....+.++@###@@+..+.....+..+.........+..@@++.....++@.+.+.+.+......+@@#@+....+@@@@.+.+.+@#@@++.++....+.+...",
-".++@@@@+.....++@+...+.+@@#@@....+@##@+...+.++++........+.....@@$$$%$@+.....+..........+.....+@##@..+..+@@@@.............@@$#@.+++.@@$#@+++++@@$$@@@+++....+.+.+.",
-"..@@$##@++...@##@++..++@##@@.+..@@#$#@+....+@@@++...+.+.+++.+#$%%%%$#++.+......+.+.+.....+...@$$#@....@@###@@....+.+.+..+@$#@@.@@@+##$@+@@@@@#$$$@@@@+.+..+@+...",
-".+@@$##@++.+@#$%#@+...@@#$#@...++##$#@+....+@@@..+++@@++@++.+#%%%%$#@....+.+...+.+....+....+.#%%#+.+.+@#####@.++.@.@.+..+@#$#@@@@@+@#$@@@##@@@#$$##@@@...++@@+..",
-"..+@###@+..@#$%%%$@@..@#$#@++...@#$$#@+.+.+.++++..+@##@@#@@++@%%&%%#@@...+@@@.+.++.@........+@$%#@....##$$#@@..+#@#@#@@.+######$@@@@#$$#$$#@@#$$$$$$@++..+@##++.",
-"..++@@@++.++$%%&%$#@.++@$##@..+.@####+............@#$$##$#@++@$$&%$#@...+@@#@..+.++..+.+.....#$$#@..+.@#$###@.@@##$$$#@.@@$#$#$$#@@@$#$$#$##@##$$$$$@+..++#$#+..",
-"....+++....+#$%%$#@+..+@#@@++...+@#@@++...+..+....+#$$#@#$@@.+@$%%%#@@...@#@@++.++.+......+..@#$@++..+@$$%##++.@#$$$%$#++@##$$$%$@@@##$#$$##@@#$$%%$#+.++@#$#@+.",
-"..+........++@$$$@+...+++++...+..+@+...........+...@$$$#$$$@.++#%%$#@....+@@..++.+++.@.+.....+@@+.....@$%%$@@.+@#$$$%%@+.@@#$#%%$@+@#$###$#@@@@$$$%%#@.+@####++.",
-"........+..++##$@@.+.................+..+.+.......+@#$$$$$$@..+@%%%#@@+......+.++..@@#@+..+.....+....+@#$$#@+.+@#$$$%$@+.@###$$%%@+@#######@+@##$$%%$+++@$$##@++",
-".+.+.+.....+@#$$##@+..+..+.+...+..+.........+..+..+@$$$$$$$@+.@#%%%$#.....+.++.++.@@#$#@..........+....@##@+..+@###$$#@..@@##$$%%@+@@#@####@+@###$%%#+.@@#$#$#@.",
-"........+.++#$$$$$@+.................+.............@#$$#@@@+..@$%%%$#@++..++.++.+..#$%#@+...+.+................@@@##@@+..+@@@@#$$+++@++@###@+@@@@@$$#+.+@#$$$#@+",
-".....+.....++@#@#@@+...+...+.+..+.+....+.+..+..+.+.@##@@+..+.++@$$$##+...+.++.++.++@#$@+........+.+.+....+..+..+.@..+....+.++++@@+....++@@@+.+.++++@++..+@#$#@+.",
-".+.+..........++++..+....+..........+..............+@@@+.+.....@@@@@+..+.++.++.++..@##@+..@...@.+......+.+..........................+...++....+..+.+......@@@+..",
-".+.@++.+...+..+++.....+++@.+..+.++@@+....+..+....+..++@++.......+...+..+.++.++.+.++@@@...+.+.++@@.@.+.+@@@@.+..+.@.++.+..+++++...+....++++.+..++@@++.+.+....+...",
-"..+@@@+.......+@@++....@@@++....+@@@@@+....+++@+.....@@@@+..+.++@@@@@+.++.@@@@++..@##@@++.++.+@@@@....@@##@@....+@@@+@+...+@@+++....+.+@@++....@#@@+.....++++++.",
-".++@#@++...+++@#@+..+++@##@@..++@$$$#+..++@@@@@+.+.++@##@+....@@$$$$#@.@@#####@.@+@#$##@.+.@@@####+.+@@#$$#@@.+@@####@@..+@@##@+.+..++@#@@+..++@###@+.++++@@@++.",
-".+@#$#@.+...@@$#@+...+@#$$@++..@@$$$#@+..+@###@@...+@#$$@@...+@$%%%%$@@##$$%$$#+@@$$%$$#@@.@$$$%$#@+.#$$$%$#@++@$$$$$#@+..@#$$#@+..++##$#@@.++@#$$$@++..######++",
-".+@$%$$+...+@$$$#@...@#$$$#@...@#$%$#@...@#$%$#@...+@$$$#++...@$%%$$$@@#%$##$##@@#$%%%%%@+@@$%%%%$#++#$%%%%%@++#$%%%%%@+.@@$$$$@@+.+@$$%$#@..+##$%$#+.++#$%%$#+.",
-".+@$%%$@.+.+@$%%#@++.+@$%%#@+.++@$%%#@+..@@#%%#@+..+@$%%#@+..@#$%$%##@#$%$@@@#@+@@$$$$%%@.+#$$$$%$@.+@$$$$%$#.@#$$$$%$@+.+@#%%$@+..+@#%%$@++.+@#%%$@++..@#$%$@@.",
-".+@$$%$@+..+@$$%$@.+.+@$$%$@+..+@$%$$#+..+@$%%$@+..+@$$%$@+..@@%$%$$@+@$%#@++++..@#$$$$#@.@+#$$$$#@+.@#$$$$#@.+@#$$$$#@...@@%%$++...@@$%$@....+#$%$@..+.+#$%$+.+",
-"++#$$%$$@+.@#$$%$$@.++#$%$%$@+.+#$%%$#@@.@#$%$%#@+++#$%$%#@++@#%%%$$@@@$%#@.+.@.@@#$%$$#@..@$$%$$#@.+@$$%$$#@+.@$$%$$@@+..+@$%#+....+#$%#++...+@$%#++....@$%#+..",
-".@$%$%%$#@+@$%$%$$#@+@$$%$%$#@+@$%$$%$#@.@$$%$%$#++@$$%$%$#@@@%%%%$#@+@$%$#@##@.+@$%$%$#@+.@$$%$$#@.+@#%$%$#@.+@$$%$%#@+..+@$%#@+...+@$%#+....+@$%#@..+.+#$%#+..",
-"@$$%$$%%$@@#$%$$%%$@@#%%$$%%$@@#$%$$%%$@@#%%$$%%$@@#$%%$%%$@@$$%%%$##@+#$%$$#$@+@@$%$$$$@@@@$%$$$$#@+#$$$$$$@@@@$%$$$$@++.@#$%$++..+@#$%$@++.++#%%#@+...+#%%$@+.",
-"+#%%$$$%$@@#%%$#$%$@@#%%$$$%$@@$%%$#$%$@@#%$$#$%$@@$%$$#$%$@#$%$%%%$$@+@#$$$$#@+@#%$$$%$#@@#%%$$%$#@@#$%$$%$#@@#%$$$$%#@++@$$%$@@.+.@$%%#@+..+@#$%$@@++.##%%$#+.",
-"@#$$##$$#@@@$$##$$$@@@$$##$$$@@@#$#@$$$@@@$$###$$@+@$$##$$$@@#$$$$$$#@..@#$$#@+.@#$%$$$$#@@#$$$#$$#+@#$$$#$$@@@#$%$$$$@+.+@#$$$@++.@@#$$$#++.+@#$%##+..+@#$$##++",
-".+@@@@@@@+++@@@@@@@+++@@@@@@@++@@@@@@@@+++@@@@@@+++@@@@@@@@@@@@@####@@+.@###@....@@#@@#@@.+@####@@@..@@###@#@.+@@@@@@@@...@@@@#+....+@##@@+..+@@@#@+++..+@##@+..",
-".++.+.++....++@+@++....+.+.+....+.+.+.....++++.+....+++++++..+.+++.+.....@@@+.....+.+.+.....+++@++.....+++@+....+@@@++.+....+++.+..+..++@.+.....++.+......+.++..",
-"..+.+..+..+.@@##@@@.+.++++........++@+.....++@.+.....++@+.+......+............+.........+...+++.....+...+++......+@@.....+..........+.@@@+...+.+.....+..+.+.....",
-"..+@++++.+.@##$$$#++..+@@+++..+..++@@++.+.+@#@@+.+.+@@###@+..+.+@++@.+.+........+...+.......+@@@++......@@@@+.+.@@##@+....+++++.+....@@#@++.+.++++.......+@@@+..",
-"+@@#@#@@@++@$$$$$$@+..@@#@+.....++@#@+....+@$##@....@#$$$@@..++@@@@@....+.+.+.+...+.++@++..+@##@@+.+.++@@@@@...++@$##@+.+.+@@@@@+.++@@###@+.++@@@++..+.++##$#@+.",
-"+#$$$#$$#@@#$$$$$$@@.+@##$@@++..@@#$#@@..+@##$#@+.+@@#$%$#@+..@####@@..+@@.+.@@.++.@@@#@++.+#####@@+.@@@#$#@@.+@@$#$##+++@@####@++@@###$##+++@$$#@@++...@#$$$@+.",
-"@#%%$$#$$@@#$%$$%%$@++#$$#$#@.@@@$$$$#@.++#$#$$$@.+@#$$$$$@.@@###$$#@+.@@#@@##@.++@##$$$@@+##$##$$@@+@$$##$$#@+#$$##$$@++#$###$$#@@#$$#$$$#++@$%$$#+++++#$$%%#@+",
-"@#$%$$###@@#$$$%%%#+@@$$$$$$@++#$$$$$$@++@#$$$$$@+@@$##$$$#.@@$$#$$$#++@#$$#$$@++#$$$$%%@@@$$$##$%#@@#$$#$$%#@@#$$#$$$$@@#$$##$%#@@$%$$$$$@++@#%$$$#@+.+##%$%$@.",
-"@$%%$###$@@#$$%%%%$@@$$$##$$#@@$%$##$$#@@$$$@#$$#@@$$$##$$#@@$$$##$$#@.@#$%$%#@+@#%$$$%$#@@#$###$%#@@#$#@#%%#@@#$#@#%%#@@$$#@#$%$@@#$$$$$$@+.@#$$#$$#@++#$%%%$#+",
-"@#%%$#####@##$$$%%#@@$%$@@#$#@@$%$@@###@@$%$@@#$#@@$%$@@###@#$%##@#$#@.+##%%%#@+@$%%$#$$#@@###@@$$#@@#$#@@$%#@@#$#@#$%$@@@$#@#%%#++@#$%$$@+.+@#$##$$#@.+##$$$%#@",
-"+#$$######@##$$$%%$@@$$$@@#$#@#$%#@@$$#@@$$$@@#$#@#$%#@@$$@@@$%#@@#$#@++#$%$$#@.@$%$###$#@@#####$%#@+@##@#$%#@+@$@@#$%#@@@##@#$%#+.+#$%%#@+..@#%$$$$#@.@#$$$$%$@",
-"+#$$$##$#@@$$$$$%$$@@$$$##$$#@@$$$##$$#@@$$$##$$#@@#$$##$$#@@$$$##$$#@.@#$$$$$@@@$$%$$$##@@@$##$%%@++##$#$%$#++##$$$%$#+@#$#$$%$#+.+@$%%#++.+#$%%$$$@++@#$$$$%$@",
-"+#%%%%%$#@@$%$#$%%#@+@#$$$$$@++@#$$%$$@@+@#$$$$$@+@@#$$%$$@@@@#$$%$$@+.@###@##@@+#$%$%%$@.@@#$%%$$@+.@#$$%%$@+.@#$$%%$@+.@#$%%%$@+.+@%%%#@+.@#%%$$#@+..@$$$$%%$@",
-"@#$%$%$$#+@#%$##$$@+.+@$$%$#@..@@#%$$#@+.+@$$%$#@.++@#$%$#@..@##%$$#@...@@@.@+@.@##$$%$#@..@@$%%$#@.++@$%$$#++.+#$%$$#@.+@#$$%$#@..+#$%%$++.+#$$$@+...+@$%$$$$#@",
-"+@@###@@+.+@#@@@@@++..+@@#@@.+.++@@#@@....+@@@@++..++@@@@++...+@@#@+..+..........@@##@@@...++@@#@@...++@#@@+....@@##@@...++##@@@.+.++@#@@+..+@#@@+..+..+@@@@#@++",
-"..+++++..+...+.+.+......++........++.+.+.....++.......++.........+.+...............+.+..+.....+.+.+....+.++.+.....+.+......+.++......+.+..+.+..+.+.......++.+...",
-"...........+...+...+.+.....+....+........+.........+...+..+...+.......+.+.+.+...+..+.......+............+.....+.+.....+....+...........+.....+....+...+.......+.",
-"+.++++.+.......+++.....++++..+...+++.+.....+.+..+....+@@+..+.......+..............+.@++.+....+.+@@+..+..+++........+.....+.+++.+.+.+...++++....+++.+.......+....",
-"..++@+...+.+.++@@@....++@@@....++@@#@+.+..+++++....+.+@@@.....+.+...++.+.++.@.....@@@+........@@@+....++@@@+....+++++.+...++@+......+.++@+...+++@@+.+..+++++....",
-"..+@#@@+.....@@#@@.+..+@##@++..+@$$$#++...+@@@@++...+@@#@++..+.+.+.+.++.++..+.++..+@##@+.+.+.+@@@@++...@##@+++..+++@@++...+@#@++.....+@@@++..+@##@+.....++@@++..",
-".++###@+..+++@###@..+.@#$$#@...+@$$$#@+.++@###@@..+.@#$$@@..+@@@@@@@@.+++@@##@@.+.@#$$#@...++@#$#@..++@#$$#@+.+.@####@@.+.+@$@@+..+.+@##@+...+@#$#@+.+.+####+.+.",
-"++@$$%$@+..+@$$$#@+..@@$$$$@+.++#$%%$@+..+@$$$$@@..@@#%$$@++.##$$$$##@.@@$#$$$#@+@#$$%$##@.@@$$%$$@+.+#$$$$$@++@#$$$$$@+.+@#$$@+....+#$$@++..+@$$#++...+@$$$@...",
-".+#$$%$#@.++#$$$$#@.++#$$$%#@..@#$$%$$+.+@#$$$%#@.++#$$%$#@+@#$%%%$$$@@@$%$#$$$@+@$%$$%%#@@@$%$%$%#@+@$%$$$%$++@%%$$%%$+..+#$%@+..+.+#$%#....+@$%$@+.+.+@$%$@+..",
-"+@#$$$%$++.@#$$%%#@+.@#$$$%#@.+@#$%$%#++.@#$$%%#@+.@#$$%%#@.@##%%%$$$@@#%$$##$#@@#%%$$$%$@@#$%$$%%$@+#$%$$%$$@@#%%$$$%$@+.+#$%#+....+#$%#+.+.+@#%$@.....+#%%#...",
-"+@$%%$$#@++@$$$%$$@.+@$%$%$#@+.@$$$%$$++.@$%$$%#@+.@$%$$$##+@#$%%%$$$#+@%$$####@@#%%$$$%$@@$%%$$$$$@+#%%$$$$$@@#%%$$$$$@..+@$%#@....+@%%#@....@#%$#.+.+.@#%$#+..",
-"+#$%$$$#@.+@%%$$$#@++#$%$$$$@+@#%%$$$#@+@#$%$%$$@.@#$%$$$#@@@$$%%%%$$@.@$$$$#$#@@#$%$$$$#@+#$%$$$$#@@#$%%$$$$@+#$%%$$$#@+.@#$%$@++.++#$%#@+..++$%$#+...+@#%$#++.",
-"+#$%$$%$#+@@$%$$%$@++#$%$$$$@++@$%$$$$@+.#$$$$$$@@.@%%$$%##@@$%%%%%$$@+.##%%$##..@$$$$$%#@+@$$$$$$$++@$$$$%$#@+@$$$$$$$+++@#%$$@+..+@$%%$@@+.+@$%$##++.+#$%%#@+.",
-"++#$#$$#@++@#$#$##@+.@#$#$$#@++@#$#$$#@++@#$#$$#@++@##$#$#@@+#$$$#$##@..@@$$$@+@.+@#$###@+.+@##$$#@+.+@#$$$$@+..@##$##@+.+@#$$$@++.+@##$##+.++##$$#@+..+@#$$##+.",
-".++#@@#@@..++@@@@@++.++@@@@@+.++@@@@@@+..++@@@@@@...@@#@@@+..@@@@@@@+....@$$#@....++@@@@+...+@@@@@....++@@@+.....@@@@@....+@@@@@+...@@@#@@+.+.@@@#@++..++@@#@++.",
-"...++++.+....+++++......++++....+.+++.+...+.++++...+...+..+...+.+....+.+.+@@@+......+.++......+.+..+......+.+..+..+++..+....++++.....++++....+.+++.+.....++.+...",
-".+.+.++..............+..............+................+.+..........+............+.........+....+......+.+..+.........+............+......+..+.+++.+...+..........",
-"+@###@@@+.+.+++@+++...++@+..+.+.+.+++++.+.++@@@@.+....@@@@@.+.+....+...+.+........+.+.......++++.+......++++.+.+.+@++...+.+........+.+.++++.+###+...........+...",
-"+@$%$%$#@..++@@#@+....+@@@+......++@@@.....@$$@@...++@@##@+...++++.@......@+.+.+.....+.+.+..+@@@.+....+++@@+....+@@@@+....++++++.....++@@@+++$$$@+++..++.+++.++.",
-"+#$%%$$#@+.+@#$$#@++..@@#@++.....+@##@+..+@@$$$@++..@@$#$#@+...@@@@@++...+@@@.......++@@+..+@@#@@+++.++@@#@@+..+@##$@+++.+@@@@@+++..+@@##@+++@$##@+++...@@@@@+++",
-"+##$$%$$@+.@$$$$$@..+.@#$##@+.+.+@$$#@+..+@#$$#@+..+@#$$$#@.++@####@+..+.@###+.+.+@@@#@@@@+@@###@@+.++@##$#@@+++@$#$#@@.+@@#####++++@@####@++@#$$##@+.++######@+",
-"+@$$%%%$@@@#$$%$$#@+.@@$$$$@@+.+@$$$$#@+.@@$$$%#@+.+@$$$$#@+.+##$$$#@@..@#$$@@+..+@#$$$$#@+#$$##$#@++#$$##$#@+@@$$###$@+@#$$#@$#@+@##$##$$$++@#%$$$$@++#$$##$$$@",
-".@$%%%%&$@@#%%$$$$@.+@$$$$%$@@+@$$$$$$#++@$$$$%$#@+@$$%$%$#++@$$$$%$#@+@##$$$#@.+@$$$%%$$@@#$$#@#$@@+#$$###$@@@#$$#####@+#$$$@#$@@+#$$$#$$$++@#%$$$%#++#%$$#$$$@",
-"+#$$%$%%$@@#$$$$$$@++#$%$$$$$@+#$$$$$$$@+@%%$$$%$@@#%$$$$$#@+#%%$#$%$@+@$%%%$##++#%%$$%%$@+@$$###$@++@$$####@@@#$$###$@@@#$$####@@+@$$$$$$#@.@$$$$$$#++@$$$$$$#@",
-"+#%%$#$%$@@@$$$##$@@+#%$$#$%$@+#%$##$%$@@$%$$#$%$@@#%$##$%$@@#%%$#$%$@.@#$$$$#@.@#%%$$%%$@@@#$#@#$@@+@#$###$#@+@#$#@#$@@+@$$###$#+++#$$$$#@+++$$$$$%#+.+#$$$$#@+",
-"+#%%$$$%$@@#$$$#$$#+@#%%$$$$$@+#$%$$$%$@+@%$$#$%$@+#%%$#$%$@@#$%$$$%$@+.@#$$#@+.+#%%%$$%$@+@#$$$$$#++@#$#$$##++@#$$$#$#++@##$$$##+.+@#%%$@+.+@#%$$$#++.+@#%%$#..",
-".@$%$%%$#@+#$$$$$$$@+@$%%$%$#++@$%$%$$$@+@$%%%%$#@.@$%%%%$#@.#$%%$%$#@...@##@...+@%%%%%$#@.@@$$$%$$@.+@$$%%$#@++@$$%%$$+.+#$$$%%#@+.@$%%#+..+@$$$#@@....##%%#@..",
-"++#$%%$$@+@#%$$$$%#@.@@$%%$$@+.@#$%%$$@+.@#$$$%#@+++#$$%$#@+.@@$%%%#@@...@@@@+..+@$$%%$$@.++@$%%%$#@++@$%$%%#+.+@#$%%$#@+.@$$%%$$+++#$%%#++.+##%##++..++#$%%#+..",
-".++@@#@@+.++##@@@#@+.++@@#@@+...+@@#@@+...@@##@@+...@@##@@....@@@#@@+.....++....+@####@@@...++@###@+..+@@###@+..+@@###@+..+@@###@+++#$$$@...+@###+..+..+#$$$@+..",
-"....+.+.....+.+.++......+++..+.+..+.+..+...++.+......++++++.....+.+....+...+.....++@+++.......+.++.+....++.+......++.+......++.+...+@##@+.+..+@@+.+....+@##@+...",
-".+......+..+..........+.........................+.++@@+@+++.......+.+...+.+.+.......+...+.+.........................................+++.+..+++@+..+.+.....+.+...",
-"...+.+....+@@++....+......+....++++++++..+..+......+#####$@@+.+..+.@...+.@@@@@@.+..++@+.....+.+.++.+..+.++..+.+.+..+.+.+.+.+.+.+.+....++.+..+###@++.+...+....+..",
-"...++++...@@$@++.....+++++.+.++@@#####@+..@+++....@@$%#$$%$@....+@#@+..+@@####@..+.@@#@++.....++@#@+..+++@+.....++++++...++@@@+++.+++@@@@@++@$%####@++..++++.@+.",
-"+..@#@@+.+@$$$@+.++++.@##@@++.@#%$%%$$@@..+@@@.+..+#$%%$%%$@++@@@#$#@+..@###$#@+++@#$%$@+++...+@$$#+++@@$#@++.+@#####$@++@#$$$##@@.+####$#@+@$%$#$$$#+++@#@@##@+",
-"..+@$$@+..@$%$@@++@++@#$%$#@@+@@#$$%$#@+.+@@#@...+@#$%%%%%%#@@@##$%#@.@@##$$%$@@+@$$%%$#@+....@@$%$@+@#$$$$@@++#$%%%%%$@+#$%%%%%$#+@#$%$%%#@@#$%$$$%#+.+@$##$$#@",
-"...@$$$@+.+@$$#@@##@@$$$%$$$@@@##$$$#@@+..@##@+...@$%%$%%%$#@#$$$$%$@@@##$%%$%#@@$%%%%%$#@.+.+@$$$$@@$$$%%$$@@@$%%$$%%$@@@$$%%%%#@+#$%$%%%$#@#$%$#$%#@+.#$$$$%#@",
-".+.@#$$@..+@$$$#$$$#$$$$#$$$#@@@#$$$#@@+.+@##@+..+@#$%$%%%$@@##%%$$$#@@##%%$%$#@@$%%%%$$#@+..+@$$$#@@#$$%%$$#+@$%$##$%$@++@#$$$#+++@#$$$%%#@#$%%$##$#+.++$%$$$@+",
-"++@@#$$@@..+#$$$#$#@$$##@$#$$@@#@#%$$@@@..@$$@+...@#$%$%%$#@.+@$$$$#@@@@#$$$%$$@@$%%&%$$#@+...@$$$$@@$$$$%$#@++#%$#@$%%@..+@###@...+#$$$$%#@@$$%$####++.@#%%$#@.",
-"+####$$#@..++#$$#@@@#$$##$$#$@++@@$#@@+..+@$$#+...+@$%$%$$#@..+#$$##@+.@@#$$$%#@@#$%%%$$@@.+++@#$$$@@#$%$$$@+.@#%$#@$%$@+..+@##@++.@#$$$$$#++##$#####@+.#$%%$#+.",
-"#$%$#$$$@+..+#$$$@++@$$#@#$$#@+.+@##@@.+..@#%#@+..+@#$$$$#@++.+@$$#@@.+.@###$$#@@@$$%%$#@++.@@#$$%$#@#$%$#$@+++#%%$#$%$@+..++@#@.+.+@#$$%$#.++##$#$##@@##$%%$#++",
-"#$%%$$$%$@+..+#$##@@@#$$#$$$$+..+@##@@....@###@+...@#$$##@+....@###@@..+@@###$#@++@#%%$@+++@#$$$$$#@@@#$$###@++#$$##$%$@....+@##@+.+@#$$%$#...@@#$$##+@$$$$$$$@+",
-"$$$$##$$$@+.+.+@#$#@+@@##$##@++..@#$@@+..+.@#$@@+..+#$$#@++.....@@@@@+..+#@@@##++.+@$$#+..+@##$###@++@####@@@++@$##@##@@.+...+@#@+..@##$$$@+...+####+++#$##@###@",
-"#@@@@@@##@....++@##+.++@@@@@+....+@@@.......@#@@...++###+...+....+@+....++++++++...+@#@+..++@@@@+@++..+++@+@@+.+@+@+@@@+......+@+++.++@###@.+..+++++..+++++.+@@@",
-"+++.++++++......++++...+++......+..@.++......@@.+....+.+.+....+.....+..............+@@+.....++.+................+....+.....+.+..+.....++@++.......+.+......+..+."};
diff --git a/hacks/images/matrix3.xpm b/hacks/images/matrix3.xpm
new file mode 100644 (file)
index 0000000..76602f5
--- /dev/null
@@ -0,0 +1,692 @@
+/* XPM */
+static char * matrix3_xpm[] = {
+"512 598 91 1",
+"      c None",
+".     c #020202",
+"+     c #22BE22",
+"@     c #168A16",
+"#     c #166A12",
+"$     c #124E1A",
+"%     c #0E3E12",
+"&     c #96BE5E",
+"*     c #0E2A0E",
+"=     c #071E07",
+"-     c #26CB26",
+";     c #669A3E",
+">     c #8ACA4A",
+",     c #061606",
+"'     c #4A962E",
+")     c #6ABA3E",
+"!     c #42862A",
+"~     c #50CE94",
+"{     c #1EAE1E",
+"]     c #56F24A",
+"^     c #3EBA6E",
+"/     c #020E02",
+"(     c #66F65E",
+"_     c #367622",
+":     c #268A3E",
+"<     c #26D226",
+"[     c #2AD62A",
+"}     c #4A9E72",
+"|     c #264E16",
+"1     c #2B9F4D",
+"2     c #42EE42",
+"3     c #6AC6AA",
+"4     c #127E12",
+"5     c #3E9222",
+"6     c #3CAE67",
+"7     c #5EB632",
+"8     c #B2D26A",
+"9     c #134A16",
+"0     c #265A1A",
+"a     c #2ADE2A",
+"b     c #2AE62A",
+"c     c #020A02",
+"d     c #1E921A",
+"e     c #4AA232",
+"f     c #224616",
+"g     c #1E662F",
+"h     c #227E3A",
+"i     c #0E5A0E",
+"j     c #82AE52",
+"k     c #52BE8A",
+"l     c #165626",
+"m     c #66AA3E",
+"n     c #2A9646",
+"o     c #66C29E",
+"p     c #5A8636",
+"q     c #9ECE5A",
+"r     c #1A3612",
+"s     c #1A9E1A",
+"t     c #6AEE8A",
+"u     c #0B310E",
+"v     c #020602",
+"w     c #0A260A",
+"x     c #36822A",
+"y     c #2EEE2E",
+"z     c #16320E",
+"A     c #4AAA6E",
+"B     c #2AAA4E",
+"C     c #82BE4A",
+"D     c #4DAE7B",
+"E     c #3A965A",
+"F     c #6ACAA2",
+"G     c #56F262",
+"H     c #3AEE3A",
+"I     c #32621E",
+"J     c #127212",
+"K     c #76AA4A",
+"L     c #1A5E2A",
+"M     c #227A37",
+"N     c #1E6A32",
+"O     c #227232",
+"P     c #C2D672",
+"Q     c #104616",
+"R     c #1A3E12",
+"S     c #68D6B2",
+"T     c #4EAA2E",
+"U     c #061A06",
+"V     c #62C299",
+"W     c #061206",
+"X     c #0A220A",
+"Y     c #3E7626",
+"Z     c #4AEE4A",
+"..............................................................................................................vvccccccvvv....................vcccccccv........................................................................................................................vvccccccv....................vcccccccv................................................................................................................................................................................................vcccv.......",
+".............................................................................................................vc,,=====,Wcv..................v/,,====,/v......................................................................................................................v/,=====,Wv..................v/,=====,/v..............................................................................................................................................................................................v/,=,Wv......",
+"............................................vc/W,UUUW/cv...................vcccccccccv....................c,,Xuu%%%%%%%uw=Wc...............W,wu%%%%%u*U/v...................v/W//cv............................................................c/ccv.......................cWUuu9iiiQ%uXWcv..............WUu%%QQQQ%uU/v.....................v/W,,,Wcv............................................................................................................................................................c,=u%%%uXUcv...",
+"............................................WUUXX*uuwXUWc.................cWU=======U,,W/v................W=uu%$9iii#iiQ%uXU/............./,uu%ii#i$QuuX,c...............v/,,,==UUWcv........................................................cWUU=U,,/c..................../X*%9Jdd@Ji9%*Uc............./=u%ii#@@Ji%uX,cv...................c,UXXwXU,Wc........................................................................................................................................................./Uw%Q$iiQuwUc...",
+"...........................................vWUUXXX**wUUWWv..............vc/WUUUUUUUUUUUUWcv..............c,U*%Q$$iiLiil9%uXUc............vWUXu%$L#l$%uXUUWv.............v/WU=UU=UUWcv........................................................//,U=U,=WWv...................cUXuQOEE:l$Qu*,c.............cXu%9LM:EMluXU,cv..................cW,UUwwwUWW/v.......................................................................................................................................................vW=XuQiiiQu*=c...",
+"..........................................v/U=w*u%%uuw==Wv..............c/====w=====w==U,W/c.............c,wu%9LLgLggNL$Quu=Wv..........v/UU*u%lOMhL$%uw=,/c............cWU=XwwXw==,Wv......................................................v/=UwXwXUUWc..................c/Uwzlx}AEOL$%*Uc............v/X%QLO!DAEL%*=UWv.................c/,Uwuuu*w=,,cv......................................................................................................................................................cWUu%lgNgL%uU/...",
+"..........................................cUX*rf|III|z*U=/v............cW,U*zzzzzzzzzzrzw=,cv............/U*R0II__YYxY_I0f%XUv.........vcWwuR|IYp';YI0RrX=,/v.........v/W=*zrRfrRz*X=c.......................vvcccvv.......................v/,*zrRrrzXUWv................v/UXz%I;jj;YI|R*Uc............c/X%|0Y;jj;YRrwU,c................vWUw*r|I0|RzU=/v....................................................................................................................................................../Uwr|_YppY|%XW...",
+"........................................./UX%|Ip;jj;pIRrX,c...........cWU*Rf0I#Ilfl0IOI0RzX=/v........../WXr0_x!555eee5x_I|RX,........vW=wR9I_!m)C)K'_I0fzXU/v.......v/WXzR0O____L|zXUc....................v//UXU=U,,Wcv..................vWUzf0ON_L0frXWv..............v/=wrR0Ym&Cm!I0frU/............cUwr0Ix;C&KpI|RzXWv..............c,Uw%|Ypm;;Y|R*UWv...................vc/W,/cv........................................................................................................................v/U*%|I;K)K;Yfz,v..",
+"......................................../=u$Js+[tttZ~+@#%uUv........v/,u%iJs+-<+{ss++<+{@#9%=/........vWXu%#@<abyybyayy[<{dJ%*v......vW*%Q#@+ab]Zt(Zba+s4#$u=/......c,Xu%i@{-bbaa+d#QuU/.................cW=*u%%%Q%%%u*U/v...............cUu%i@{<[a+s@#%=Wv............vWw%$4d+-aZ2a+@Ji%wUv...........cUu$4d+-2ZHa+s4i%wWv...........cW=u%$J1-]tZ]^@#9%w=Wc.............../W=wuuuu*=/v....................................................................................................................../Xu$Jd+a](][B49*c..",
+"......................................../X%$41<H](Z]a+sJ$u=/........v,*%iJ@{+ab-+{++aa<+s4i%u,v.......c,uuQJs<bybybyyybb-+s4$*W.....c,wuQiJs<aH2(t(GHb-{s4i%u,.....c,Uu%9#@<baybb<sJQ%*U/...............c,XuuQQiiiii$Q%uXWv.............vWXuQJs+bbb[{@J%*Uc............/Xu%Jd{-abyb<s4i%uXWc...........v,X%i4s+aybb<+s4$uX,c........./,wu%Q#@B<]]]2a{Ji9%u*X/............./WXw%%Q%%uwXWc...................................................................................................................../X%$Js^a2G]2+Jiw/..",
+"......................................../,Xu$J:AoSSk6:#Quw,/........vWUu%iL4ds1d@44@1sn@Ji9uXW........v/w*%$Jds1{B{B+B{s@4L$%Xc...../Uw*%QiJ:1Bk~S~k6Bn4g$%*U/.....c,=wu%$J@ss{Bs@4iuwUWc..............v/UXuu99$lll$9%*XUWc.............v/U*u9J@sBs@4lQuUWc............cUXuQ#hn111n@L%uwU/v............./WXuQLMd11s@:Ji%w=/c........./Uw*u%QLNEkS~kEMlQ%uuXU/.............cW=Xu%QQ%uXUW/.....................................................................................................................cUXu$#:6k~k}MQuW...",
+"........................................vUwu|g!}3SS3}ML9uU,c........c/=uQllO:}}EMNMM}}}xg$%uXWv......./,U*ulN:nnn11111n:MNL9uUc....v/=XuQLOM:n1ADkkkAAEMLl%uX/.....vWUX%%lg::nnn:hg$Quw,/.............vcW=u%$LOY!!x_Nl%*=Wc.............c,=*%lOEDA}:Nl%*=/c............c,wu$gMM:nn:g$%wUWc.............../UUu9LM:n::Mgl%XUWc........v/U*%%R$L_EkFFk}OLLlQuu=/............vW=X%$Ih_g|uw,cv...................................................................................................................v/=wz$gME6A}:LRX,v..",
+".......................................vcUXr|YpjPPP8jp_fuXWc.......v/WXrRIIp;&&jp!ppj&&ppI|%X/.......vW=Xu%|N!5'5''ee5'!Y_Ifrwc....c,wu|I_!5''emTmmj&&jp_0Rrw/.....cUw%|0I_x!5x5!!_I|R*UWv...........v/,U*r|Op;j&&&jp_|zX,c.............cUX%fIpK&8&;Y0R*=/v............cU*R0_!55!!!I|zw,/v...............cUU*f0_x5'!'YIf*=Wc......../U*%|III_Y;&88&;xIIII|%*,............c/=z|Yjjj;YR*U/v...................................................................................................................cWX*%0Y!'''xY0zUc...",
+"........................................WUrRO5;&PPPqje!IRw=/......../=wf0Ox;jq&C;5'm&P&K!_If*,v....../UXrR0_x'eTTTTmT7TT5!hI9*/...v/Uz|Nx5eTTTTTTT7&qqC;!I0Rw,v...v/=zR0_x5Eeeeee55x_|rwU/v........../UXz%0O!}j&PPqCm5OfzXWv...........v/UzfIx;&&8qKpI|zUWv...........vWXzf_:eeTTe5_lrXU/v...............v,XzRIx5eeTe5_0%*=c.......cWXz0N_x!'eKq88qj'55xx_0r=c..........vW=*RIp&8q&pIR*=/.................................................................................................................../U*r0_'eeee'_|RXW...",
+".......................................v=u$J{-y]tt((Za<s#%*Uv.......UuQ#s+-a]((2abb2t(t2+{@#%Xc....vW=%$J@{+aay2HZ2Z22Hyya<{@$=...Ww%$4{aabyyybyyyy2Z]H[+{@#%=c.../=u$Js{-byybyyyyba+@#%u=W.........cUu9i4s+[y2Gt]Z2H[{4$uw/.........../Xu$4{<b2](2a+@#%*Uc.........../Xu$4{[aybab-sJ9uXc................vUu9#d+[bybyb+@i%*Uv.....c,*%i@{<[bHH]((((ZZbb[<{d#u,..........c=u%#1-]((]<1#QuUc.................................................................................................................c=u9#s-a2ya[+sJ$uW...",
+".......................................c,%$Js<a]((((Zb+dJQu,c......vWu%Jd{<bHGGZyaaHZt]H+{@#QUv.....,u%#@{+ayyb2GGGGGG2yybb+@iXv.vU*%$4+[yyybyb[<-<[baa<+{@#%Uv..vWXu$Js+[aabaybbby[-sJ9uwU/........cXui4d+<byyaa-<aaa{4$%XW..........vWu%i4+bayyba+@J$uw,v...........cX%i4{ayyybb+@#%*,v.................c=%i4+abyyya+@#QuU/.....v=u%i@+<bHGG((t(t(G2yb-+@i%U.........v,*%$#1aGGG]<{4i%XWv...................................................v...........................................................c,w%$J1a2ZH<+{@#%uUv..",
+".......................................vcUu%Nh1kFSFFD1Mi%*Uc........cU*%#4h16~~61:n1k~kEhgi%*W....../X*Q#4d1BB^~~StS~~~^+BsMl%W...cUw%$41B{Bs1d@h4@:nndhJgi%X/..../UwuQLJ@d1BsBsBsssdJ9uXUWc........cUX%iJMd1B1nhMM@:@J9uUUc..........vcUX%L@n1nn::Ji%uU,v............v,wu$h6^~^B:J$%X,c.................../=uQ#@1^^~6:L%*X,c....../=*%i4:n6~S~StSStS~^1d4i%*,........./UU*%$O}~~SkENl%*=Wv............................................vcvvvcc/ccccccccvvv................................................c,=u%iO}~^6:4lQuw,v...",
+"......................................../UX%lhpD3SS3A:OL%XU/........c,Xu$LN:}kkA:hMEAoAEgl%uXc......cU*%lNM:nBBk~SSSSF~ABn:Olu,...c,Uu9O:111n::hNOOMhhMOllQuw/....v/U*%lLNh::nnnnnn:hg$uw=,c........vWwr9LMMnnnMONNNNg$%w=W/...........c,wu9g:hMMOL$%*U,v.............cWXulhAkVkEOl%*=Wc...................cU*z$g:DVFAELuw=/v......cWXu9LNxBkSSSFSSSFk}:ML$uU/........c/,w*zlgEV3SAENQ%wU=Wc.........................................../W,,,W,W,W,,,,,W,,Wc.............................................../,X*rlNEkkEML9%X,v....",
+"......................................../UXr|_pjPPP&Kp_|%w,c........c,Xz|0Ix;mK;YYYpKj;p0Rrw=/.....v/Uu%0Ox5;mKC&q888qCKe55_|uW...c=UzRO!'''''p!Y__YxY_II|RzXW....v/U*%|LI_!5!'x'!ExxI|%wX=Wv.......c,wr|I_x';5!_IIIII|uX=WWv..........c/UuR0_x_I00RuwWcv.............c,Xr0pjqqj;_|zXU/....................v/XuRIp&&8&pI%*=/v......cWU*R0OY;j&8PPPP8&j;x_0|uU/......vcWUUwzR|_p&qqj;I|%rXXUUc........................................vcW=wwwXwXXXXXXXXXUUUWc.............................................v/=wrf0Y;KKpI|%zU/v....",
+".......................................vWUzfg!;jPPP8Kex0fXU/......../UwRlI_x';;px__!;;;Y0RzXWc....../Xz|IY'e7&>>>C>q88>)7T5x0z,...cW=z|_'TTe)))Tee'555x_I|frXW.....cUwz|0Ox5'ee1eTee5!_0|rXU/v....../Uwf0Ix'm)m'xM__OL|RzX=,/.........vc,w*f0_I0||rz*U,c............../Uwr0'Cqq>;Y0f*=c.....................W*R|Ip&8q&;Y|zX,v......c,=*R|Ix'mC&PPP8>)m5xI0R*Uc.....v,UX*RQ|LI!m&88&;!I0RRzzX,v.....................................cW,X*zzz%fRRf%fR%RR%Rr*wUW...........................................cW=*%0_x'e)m'_0R*UW.....",
+"........................................,u9Js-bGt(t(Z[+@i%XW......../=zi4@s{+++{ss{+<-+@#Qu*,v.....v,u$Js-a2Z((2HHZG(((2yy[+di=.../=u%#s-yyHZZ]2bbyyba<+s@#9uXv....c,*%$4d+ayyyyyyayy[<{@J9*,c.....vU*%#@{+a2]Z[<+{ssd4#$%u*Xc.........c,X%i4@dJi9%%uU/..............vUu%Ld^Z((G[B@#%w,....................v,u$h1<(((([BJ$zXc......vUu%$Jd{-ayG((((G2b<{@J$%X/....cUuu$i4ds{+-2((((H++sd4JiQ*,....................................cUu%$i#J#@dd@@@@@@@@44J#i%Xc.........................................cUw%i4{+-abya+@Jl%=W.....",
+".......................................vUu%ld+[](((G2a+@iuX/.........W*9#4d@sss@44@s{{dJi%uUcv.....cUu$#s+aa2GGZybyHGGG2yya+49Uv..c,*%i@+[bbHZ2Hyyyyyyb+{@#i%wW....c,XuQ#@+[yyyyyaybba-{@JQu=/....vcUw%#@{+aZG]b-++{s@@4J$QuX,.........v/XuQJJJiQ%u=Wvv..............cUu%id-2((ta+@i%u/....................c=u9#1-2((]a{J$u,v.......,X%$Jd{<bHZG(tG2yb-{dJ$%=c....WuuQ#@1{+^<aZ(t(G2a[<++s@i%U...................................v,u%9J@sB{{{+++B+{+{+{{B@Jiu,.........................................WUu%i@+abyyb<+@iQu=v.....",
+"........................................vUu%$O:6FSSk6MgQuX,c.........v/=u%%%$QQ%%%%Q9$9u*=,c.......cWwu9LJ:n6~~^BBB^~~k1nM4#%wc....vUwu$#4h:n66BBBBB^^B1@MiQuUc....v/UX*%i4nsBBB{B{ss@4#$%wUWv....vvWUX%$OhEk~~611d:4Jgli$QuX/...........cWUuu%*XU,cv................v/wu%L:k~SkEO$%XUc....................vWwuQLEk~Sk}O$uXW......../Uwu%lJn6k^DA66^^6nM#i%*,...../=u%g:ADk^kVFSSSSSkkkAA}:luU...................................v/XuQNE}DDDAAAAAkAAAAAADEMl*W........................................./UX%$J@1s1nnh#QuXUc......",
+"........................................v/UX%lOEk3SAEg$%*=/...........v/UUwXX*wXXXXw**U=W/v........cWUw%$Lg:}kkAE::EkVAENgl%u=c....v/,uu%lLOh:n111B6kkDE:ML9uUv.....c,=XuQgMnnn661nn:hLl%*U,c......v/=X%$LNpDooABnnMNggNNL$%XW............ccc//WWc....................c,Xu|xAVFkEN%*=,c....................c,U*%0hAVFkEg%*Uc........vWU*%lgEAkAEhxE}VDEOLQ%XWv...vWwu|I}33333SFSSFSSS3SS3o}Ir,....................................,Xz|YAooSoSS3SSoS3SSS33opLu,........................................./=*%lO:11nhOL%u=,/v......",
+"........................................v/UwzfI;&88jpIRrXUc.............c/U,,UU=,=U=,=,Wc..........cW=XrR0IpK&&mp!p;&&jpII|R*Wv.....WUwwzf0I_Y!''emmC>C;5!_fr,.....vc,=XrfO!''Tmme5'x_0|RuX,c......v/=XR|IY;&88jmee!x____IlRX,...............vvvvv...................v/U*r|pKqq&pI%*w,c...................vc,U*%0pjqqj;I%*=/.......vc,U*R|I;j&Kp!Ypj&j;I0|RX/v...vWwz|pj&PPPPPPPPPPPPPPPP8;YR,...................................v,w%0pjPPPPPPPPPPPPPPPPP8;IR/........................................v,XzfIx''55_I|uX,cc.......",
+".........................................c=Xz|I;&88&;Ifzw,/..............vccc///W///W//c.........../U*r|I_!5K&qje5;K&qC;!_g|z=v....v/UXzRfg_x!5eTT77>>C7T5!_|wc...../U*zR0_5eTm77mTe55_g0RzXW......c,Xrf0O!;&qq>C)7e'5!55!N|r,v......................................vW=ufIpjq8q;Y|rwU/v...................WU*rf_;Cq8&;IRzUW........c,wuf0Y;C>K}!5;Kq&;xI|RwUv...c,wQRpjPPPPPPPPPPPPPPPPPPjYfU...............vcWWWWWcv...........vWzf|p&PPPPPPPPPPPPPPPPPPjIf,.......................................c,=r|Nx5TTT5xLRz=/c........",
+"........................................vWX%$41a](]]<ni%uUc..................vccccccccv.........../XuQ#d-[Z]((((Z2H]t(]H[<{diuW...v/Xu%i4d+---[ayyyH2G2Hyba+@Q,....c=*$#4{+abyHyHyyyy[-+{4i%=v....v,*%i4s+-HZZZ]ZZ]22yHab[+@9wc.....................................v/UuQ#s<t((([B4i9u=c..................v=u%i4s[G((GaB#Qu=c......vWXzQ#d{[ZZH-++<HZ2a+@J$zwc.../XzfgEVtt(t(t(tPtt(t(tttS7nlw.............v/Uwuu%uuw=Wcv........v,*$_}~tttttttttt(ttttttF7:f=...............v/,,UUW/v..............v=uQ#d+aayyya+@iQuUc........",
+"........................................./uu9#s~ZGG2<@#%w,v......................v...............vWw%i4B2Gt((t(t(G(((((2ya<si%W...vUXu$Js{-aa<aa<[bayyybyyb+@i=..../w%#4s+-bbyb2byyybyb[+sJQ*W..../U*%i@+<bayHHZGGG(GGHybb+@i*c....................................../Xu%i:+[ZZ]a+d#QuX,v.................vUuQi41<2GG]-s#9u=/......./=u$#@s+<a<{{s{-a-+s@#$uX/...v,*%$Js+7-~ZG((((((2[--++dJQUv...........v,U*%Q$$Q%uuXUc........./w%$4sT+7+7--7-7---7+++{@#%,..............c,UXwu*uX,c............./=%iJ{aayybb<{4i%*,c........",
+".........................................vWUu%gn^V~A:L%w,c......................................../Uw%LEDSSSFSSSSSSSSS~^B1@g%X/...vW=Xu$J@@dd@@@@@d:n1BBBBs49u,....vUX%$#J4@n1^^BBB{B{1s@gQuUc....c,Xu9N@n11BB^^~~~SSS~BBs@L%U.......................................v/=*%lh}6^61:J$u*=/v.................v/U*%LhE6^66:L%u=Wc.......v/,w%$LOJNNl$lighJL$%uw,c.....vWX*uR$Lgg_:A~SF3}xhOIL|Quw/...........v/,=wuQ$i$9u*U,/..........c=wzQQiiLi0gLLgL00iflQ9%uWv.............c/UUwX*XXU=Wv............/Uw%$4d1ssn@4L%uU,c.........",
+"..........................................c,UuRIE}}EN%*UWv........................................vWUufO}Dko3F333~oo3kD}:Mg$uXv...v/Uw%lNM:nEEE::M::n}B11n:LQ*/....v/Uu%QlLgM:nB11nnnnn:Mg%*=c....c,=u9lM:nnnn16^Vk3SFk}:hO$u,v......................................v/WU*QL:E1EnMg$uw,/c.................c,=ufLN:E1EnO$%XU/........../X*u%QQ9%uuuu%9%%u*XUcv......v/UXwuuRlLO}3SFkEO0$Q%uwXWv...........c/,Xu9LgNglQuwUc..........vWUXw*z*uzR%Ruzzuuuu**wXUWv............v/=X*u%%%u*U,/...........v/UXuQg:nnMMML$u=,c..........",
+"..........................................c,UwR|I_IIfuwU/.........................................vWU*%0Yp};}mmDmmDm};p!O0|rX,v...cWU*R0x!E;mjK;}'';jCKm5'xIRX/.....c/U*rfl0Ix5'e'5!x!!!xI|u=c....c,Xr|_x''''''';emjq&jp_NIfuW........................................c,X*RIY!5''!_|RX=/v.................cUUz|IY!'''!I|zX,c..........v/ww**u**XXw**z*XU=,Wv........v/UUw*zr|Y;&88j;I|fruX=Wv...........v/U=*r$I__OI0%*UWv..........v/UUUwXwXwX*XwXXXwXwU=U,c.............cWwRR|0I0|%*=Wv.........v/,wXR|_x''Y_I0f*UWv..........",
+"..........................................vW=*uf0II0rzX=/..........................................cX*z0Y!'eTT777TmTeT'xI|%zXW....vUwzf_5Te7C>qCmm7)>>>mT'xIf*c.....c/UUurrlIx'TTT555Eee5_0rX/....cUwR0xeTTTee'''emCq8Ce!YN0r=v.......................................c,=r9Ix5eee5!_|RX=/................vWXzfN!5eee5!O|rw,c...........//,U=w=U==,=UX==UW/v..........v/,U*rf0Y;&88&;Y0%zX=/c............cU=ur0O5555xI|Rw=/...........c/,=U=U=U=UUU=U=,U,,/ccv............v,X%|I_x!x_0rXUWv........v,wzf$_'mKe!_0|rX=/v..........",
+".........................................vcU*%l#@ddh#9z*,.........................................v,XRlM{-[aHHyyyyyyyy[+d49%w,....v=u9#d<yyyZGZZZ22Z2Z2b[-s49*W.....v/Uw%9iJd+[yaya<aayba+@izW...v,u%#@+yyybybybbyyZG(]H<+{dJ%/.......................................c,*9#d+[aayya+@#%uX/..............vWw%$4{aayyb[+dJQu=/...........c/,,=w*XU,/,,=XUW/v............c,=zQg:B~(((ZaB4i%uwWv...........v=u%iJs<bHHba+@#%u,v...........vcWW,W,,UX,W,////,W/..............vWu%i4s+aba+s#Qu=/......./Xu$J@s+aG2[^@4i%uUW...........",
+"..........................................cUu%94n{s@#Q%*Wv.........................................W*%94s<aybHbyyybyba<{4i9uX/v....WX%id+ayybH2GGGGG2ya[{s4i9*c.......c,u%iJd+aaybaabyaba{@i%Uv..c,w%i@+[byyyyyyyb22GG2Hya+s#%W........................................WX%i4{<byaya+@#QuXU/............./Xu%i@{ayaaba{@i%w,/.............vc/WWW//c.cWWWv...............cUu%i4{[G(G]-s#$uX,c............/=%$Jd+aZGZH[+@i%*X/..............v.v.vcvvv..v.vvv...............vUuQ#@{-ayba{4$%XW.......,X%$4s{-[2Za{@#$%=W............",
+"..........................................v/Uu%g:1E:LuXUc........................................../Uwu9#4:1B6BBBB{Bsn@J9uw=Wv.....cWXuiJ4h@n1Bk~SS~6n:Ji9%XU/.........v,XuQi4dB{BssssBs@49uwc....v,X%i4dBBB^^~~k~kkkk^^kA6h$u/........................................./Uu9i4@s1{1@#$%w,cc............vc,XuQL4sB{d@@J9uwUc...................v.........................v,wuQNEkS~knL%*UWv.............cWwu$N:A~SF^1hL%*=/v..............................................cUuQ#4nB^^6:luwUc......./Uw%$Ohn161EO$%*wWv............",
+"...........................................c,XRN}kDEg%w,c..........................................vWUu%lghMn11B111n:Mgl%uU/v.......c=Xu%$lLLO:D3SSAEOLQuXUUWc..........v,UX%Lhn111nnn::hL%uUc....vcUw%LM:E}V3ooSookA6AV33Ah|*/.........................................vUXu9LOhnBE:N$%uU,v............vWU*%$gMEEE:Ol$%*U/v..............................................cUwrl!DV3Dxfuw=/v.............c,Xu$N:}AkD}hLQuU/v...............................................v,w%LhEDV3A_|uXWc.......c,XulOh::E:OL%*U/v.............",
+"...........................................c,XfI;jj;Iz=Wc..........................................vWUwr|I_x!'eee''E!_I0rw=/v.......vWUXuzzrR|Y;&&&KY0fuw=/c............vW=Uzl_x!x!!!xx_I0zX=c....v/UXr|Ox!;j88&P&&j;;mj&&jpfuv........................................../U*rR0YpjK;_0|%w,c............vW=w%0IpKK;!I|%*=Wc...............................................c,Xz|p;&j;YRzU,c.............cW,Xr|Y!p;;p!I|zw,/.................................................,Xr|_pj&&KY|*UWc.......cUXR0Y!!'!!I|%wU/v.............",
+"...........................................c,wr|pppY|rU,/..........................................c,=zRL_x5eTTTTeTTe5_|r*U/........vc/W,Uwwr|I'mCC;Y|zwUW/.............vW,wzR0__xx__OII0fz=Wc.....c,w*f0IYpp;;jjj;;'xppjppIzX/..........................................c,XuR|_mCCm!_0|zUc............/,*R0I!eC>K!I|r*UWv...............................................vW=*r0pppp0f*=/v.............v/UuRgxee}''Y0frXUcv................................................WXrRIpp;ppIf*=Wv......./=*fg!5eee5_lzX=c..............",
+".........................................../=zf|INI0frw,c..........................................v=u9#@{-[yyyyyyybb[{4$uX,........ccc/,=uuQ#@-[Hy-BJ$uX,c.............vW=*%QiJ4@@@4JLi$9uw,c.....c,wuQLJM:x'''5'5ndd15!YI0f*c..........................................cU*%Q#s[ZZ[^{dJiuW...........v/X%#@{+a]G2Bd#Quw,c...............................................vW=zflgOOL|%u=/v.............WXu9#s-ybba-{4i%uXc.................................................Ww%$#Ox!xI0Ruw,v......vWuQ#s-aaaa+@#%uUc..............",
+"............................................W=u%%99%uu=/...........................................v/w%i@s+aayyyyyabb<{4$uXc.............v,w%94{aa-+dJ$uXW................WU*%Q$9iiii$9%%uw,/v......c,*%%$iii#i##J#4J#i#Lll%*Uc..........................................vWXu9Ld^22a+s@#Qw,v...........cU%i4d+<b~a{4i%u,/v................................................vU*u%Q9$%%u=Wv..............cU*%Js[ab-+{dJQ%wWv.................................................v,u%Qiiii$%uu,v........Uu%#s+<b<+{4i%w,v..............",
+".............................................vWUXXXXW/v..............................................WXu$#J4nsBBs1ssd4g9uU/v..............c,XuQ#@@hJ9%*=,c.................v/WUXXXXX**XUUUcv..........c,=w*uuuuuuuu%u*u*uX*X,v............................................vWUw%$NhxNL$9u*Wv.............cXu%QLNxMO$%*,/v...................................................v/,UwXwU,/c................./UX%i4444NiQ%wUWv..................................................../,=wu**XX,/v........./X*%iJ444#i%uwUc...............",
+"..............................................v//WW/cv...............................................v,u%%$LgMMhMhhNL$QuUUc................cUUu9lLlQuw,/v....................c/,U/WW//W,/v.............vc/,,UUUUUXXUXwUUU=,/v..............................................vcUUurr9Ruuw=W/v.............vcUX**uRRzuX,/v......................................................v//,W/cv.................vc,ww%lLlQuu*=WWv......................................................v///W,,/c...........c,Xu%lLLlQuuwWcv...............",
+"................................................v..v.................................................vc,*uzRRl0Il0lfQ%u*Ucv.................c,Xur%zuX=Wv......................vvvv.vccvv.................vv/WWWWWW,WWW//cccv................................................vWUUww**XUUWcv..............vc/,U=wwwUUWWc..........................................................vcv....................c/UXzRRRr*wU,cv.........................................................vvvcvv............vWUzrR|lRR*XU/.................",
+"......................................................................................................v/UUX**zrrz*wwXXwUW/..................vcWUwXwUUW/v..................................................vvccccccvvvcc......................................................./UUU=U,W/v.................vWW,W,WWUW/cv.................................................................................vWUXurRuwXUWcv............................................................................v/,wzrrrR**U,/.................",
+"......................................................................................................../,U==ww=,//cW,U,c.....................vWUUU,/cv.......................................................................................................................v/WW,W/cv...................cc/cW//cvv....................................................................................c/U=wwwUW,/..............................................................................vc/,=wwXXUUWcv.................",
+"............................................................................................................vvvv......v...........................v......................................................................................................................................................................................................................................................v.vvvvvv..................................................................................v.vvvvv.v....................",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+".............vvcccvv..........................................................vvcc/ccvv....................vcc/////cccccv.......................vcccccvv...................vvc///Wccccvv........................vcccccvv................vvcc/////////ccvv....................vcc//cccvv....................vccccccccv...........................................................................................................................................................................................................",
+"..........v//,UXXXX,,,,cv.................vcW,,,,,,,cv...................vc,,,,XX*XwXU,,/v...............v/,U=XXXwXXXUUW/c.....................c/UU=U=U,Wcv............vc,,,XXww***wwXU,,Wcv.................vc,UUUUXXX,,,/c........vc,,,XXw*****X**XwXU,/v...............vc,UXXXXw=UU//c.................cWWUU=w=XUU,/vv................................................................................................................................................................................vvccccvv...............",
+".........c,Xwu%Q$$iQQ%u*=UWcv..........cWU=wu%%%Q%%%w=,/c..............v/,wu%%%ii#i$Q%%u*=Wcv..........vc=wu%Qi##ii$Q%%u*X,v.................v/U*u%%%%%uu=,c.........c,=*u%Qii#iiiiiiiQ%%u=,c..............v/=Xu%%QQ$iiQ%uuXWv....v/=w%%Q9ii####iii#i$QQ%*XWc..........vWU=u%%Qiii$9%%uwX,/v............vW=*u%%Q$$$Q%uu==Wcv...........................................................................................................................................................................vc,=Xww*w=UUUU/v.........",
+"......./W,Uu%QiiJ4JJi$Q%uuXUc.........W,Xu%%9iiiiLi$9%wU/c............c,U*u%9i#J@@4J#i9QuuXUWc.......v/,X*u%9#4@@d4J#i$%%uw=Wv..............cWXuuQ$iiii9%uXU/.......c,X%%$iJ4@@@@@@@4J#i9%uXW............cW,X*%%Qii#JJJJii%uX/....c,w%QiJ4444@@@@4@@@J#i$QuXU/........c,=uu%$iJ4@4J#i$9%uwUWc..........v,U*%QiiJJJJiiQ%uu*U/.........................................................................................................................................................................c/,UXuuu%u%u%uuuX,/........",
+"......v/,U=w%%$#JNJNL$%%*wUUcv......vcW=UXu%QiiLL##i%*=W/v............cUUXuu$i#JM@MJgi$%u*w=,c.......c/,Uwu%QiJN4M4O#Li%u*XU,c............../,=*%Q$i$i$Q%*U/c......v/=Xu%9iL4MOMNN4OJgli$%uU/...........v/,Uwwu%QiLJ4NJLi$%uU/...v/=Xu9iL#O4M4M4M4M4MJli$%uU,c......vc/,Uwu%Q$LJN4N#iQ%u*w=,/.........v/UUwuQiL##Jgi$Q%uXw,Wv.......................................................................................................................................................................v//U=w*uuuu%uuuwXwU,v.......",
+"......cWUUuu%LlOM:MhNNlQuXw=,v......v/UU*u%QLLNMhMML$zX,/v...........c,=wuuQlgMM:::MMhL$%u*XUc.......vWUwu%%lgMM:::MMOLQ%u*XU/.............c,UXu9lLLNNNLQuw=/v.....cWUw%QLLMM::M::::hhONLQuwWv..........cWU=Xu%9lLMM::MhNLQuXc..../Uw%lLgMM::::M:M::MMONLQuw,v......v/WU*u%%lgOMhMhNLl9%uuXU/v........vWUwu%lLMMhMONNl9u*XU,c......................................................................................................................................................................vvW,UX*%%%QQQQ%%zuX=U,c......",
+".....v/Uw*R|IYY!!'5!!_II|r*XUc....../,wz%|0I_ppp';p_I%*UWv..........v/UXrR|IY!p''''''p!I0|%*w/......v/=XzR|IY!p!'x''xp!I0|r*X/.............c=wuRI_pppp!_I%*X/v....v/,X*%|IYp''''''!5!!__I|uXUv..........cUXz%fI_Ypp'''!!YI|%wW..../UzRI_Y!!5!''''!''!!x_I0rXUc.....v/,w*%|0I_Yp5'!5!xYII|%zXUc......../=*R|IYY!x5!xY_II|frXU/........................................................................................v..................................................vcvv.......................vc,=*zR0II_I__IIIf%*XU/v.....",
+"....v/XuR|I_pmmmTTTTmKm!_I|Rw,.....vWXu9Ix!5mmCC)C)m!0rw,/..........WUwR0Ox!em)mTeTT7)me!_I|*,v.....WU*fL_!!eKm)TTTm7mm'!_Ifz=v...........v,XR|Ip;jjjjj;!IrwU/....cW=uf0_!eK)7eTTeTTTe55xIf*U/.........c,wr|Ip;KKKCC)7TT5xIf*,v..vU*R#x'1'eTTT'TTTeTTTee5_|rX/...../,wz|I_x'mmmmTTTmKme!__0RwW.......c,Xr0p;;meTTTeTe55!M0f*,v....................................................................................vcWW,WWcv.........................................vc/WUW,/cv...................../,wrfIp;KKjjKKKK;!I|R*w,v....",
+"...vWw%i4s{<HZZZHyHHH]2[<+s4$u/..../X%i@+abHZ(t(t(tZ+di%*Uv.......vcXu$J{<[H2]ZZHyH2ZZZHba+s#uW....v=ui4{<bbZ]G]2yH2]]ZHa<+@iuW..........v,u%#d+~((t(((]<d#%uW....,XuiJs+[H](]Hyyybybyya+s#QuW.......v/=u$#d+<tt(Z(Z]2yyb<dJQXv.vWu9J{-yyyyyyyybyyybybyy[+@i%Xv...cUuQJs+aaH2]2HyHHHZZ2y[+sJQw.....vWUu9#s-]Z2yyyybyyyyb[{J9*/.................................................................................cWU=wuuuuuw=U/...................................../,UXuuu%uuwU,cv.................v,uQ#@{-]tttt(t]tH[+s4i%*,v...",
+"...c,u%i@{+[H]GZbyby2G]y[-{@i%,...v/X%is<byH]((t(((ta@#%*Uc.......v,X%i@+ayb2GG2ybyH]GZHya<sJ%U....cU%9@+abH2GGZHyyZGG2yyb+sL%,..........c=%$Js+[t((((G]a@#Qu,v..v,*%i@{+<HGGZ2byyyyyyaa-s#%uW.......cU*%i4B+H(((tGGG2yyb-sJQ=v../wQJs<byyyyyyyyyyyyyybyb+@i%w/..vWXui4{<ay2ZGZHyyyZ]G2yya{@9Xc....c,*%941a2ZZyybyybyybyb+@i%U...............vc///cv............................vcWW/cv.....................v/,,*uu%Q$$QQ%uwW..........c////////////////c......../,Xuu%Q9Q$Q%u*X,,/.............../=uQ#d+a](((t(t(G(a+{@J$uXW...",
+".../UXuQL4:n6^~^^BB^^~k61@4g%w,....v,X%ih@16kFSFSFSkngQuU/v......../UX%i4d1B^~~^6BB^^~~6B1dJ9u/....cWwui4d1B^k~^6B6^~~k6BsdJQu/........../Uwu$O:AVSFSS~kEN%*Xc..../U*%$J:n6k~k6BBBBB{ssd4i%*U/......v/U=uQihnAoSSSS~~^B1d4i%*W...v/X%#4s1BnBBBBBBBB^^+BBsMi%w/....cUw%i4:s1^^~^^BB^^~~^B1s4L%U...../,Xu%Lh}~~^BBBBB{B+BBB@LQu,..............vcW,,,W/c..........................vc//,,W/v..................vc/WUUXuu%QQ$99%uw,.........vc//WWWWWW,,WWWWWW/v.......cWU*uuQ9$9Q%u*XUU,cv.............WU*uQLh}k~SSSSSF~k6:hJi%uU/...",
+"..v/Uwu9LM:nnAAEn::n166E::MLQ*/....vW=w%lNO:EDD3SSFA!L%uX/........./,XulM:nE}AA}n::n}DA61n:N$uW....cWUu9lM:nE}}E:::EBA61En:#9wW.........v/Uw%$ghEAk3o3FDEL%XU/....c=XullNMEA^61::h::::MgLQuX,c.......c,wu$O!EDDkkkA}EnMMgl%uUc..../U*%lgMMhMMMM:::11}B1n:O$uXWv.../,Xu$g:nE1A6}nn:nEBA11n:ML%Uv...vcWwr$LMEAAEn:h::nEA^6}:L%*/............./WU=U=U,,W/........................vWU===U,,/v................c/WW=w*u%Ql#h__NlRu=v.......v/WW,,,==========,,,Wc......c,wu|IN_ONL$QuuwUU,/cv..........v/UwuQLNn}kDAADADkDE:hNL9*Uc...",
+".../U*%0_!5'''!!_I_Yxp'''''_0rW.....cUUzR$|IYYpj&8qjpIRuU/.........c=Xu|_''''!!Y__I_!!;'e''_|zW....c,U*f0Yx!x___I__Y!'ee5'xI|*/.........c,X*fI_'';';mj>&pIrXUW....cUXz|IYx'';5!______OII|%uwUc.......WU*%|pKjjm;;pxxY_I0|rzX,/..../UXzRf|l000III__!'5e5'x_fzUc....cUXz0_!''e5'xY_Yx!'';e5'xI%W....c,UuR0I_''ex___I_x;K&>K;I|r,...........vcW=Uw**wX=U,c......................c/=UXXw*X=,/v..............v/,=XXurR|IYpjjjKp0r*c......vc/==wwXXXXXX*XXXXXUU=U/.....c,*Rp;KjKp!II|RR**X=Wcv........../U*%|IY!';'pYYp''e;''!_frwW...",
+".../Ur|g5TTTe'5x__I_x5'TTTe5IR=v....c,UX*rf|0YYK&8q&pIfzXW.........cUwz0x5e'5xYNIg__5'eeTeexI%,....vW=*R0_Yx__I__N_!'eeTTTex0z,........v/U*%|_'eTTTA7C>&;IRzw/v..vc=*R0_!5eeTe'5xxxxxx_g0QrX=c......W,zf0Y;C>CT}eE5x__NL|%zwUc....cW=X*zRfrfQ|LINx5eTTTe5_|rXW....W=zfl!TTTTT'5x__x5'eTTTe5_fwv...cU*f0_x!eTe5x_N__!eCqq&m!0rUv..........cUXzz||00fr*X,c..................../UXzrR|00|rzU,c...........vWUXXzR90LNx!'mCq>j;Y|r,.....c/,*zRfRf||0|0|0||||fRr*=/..../Uz|p&&>)7e5x_OI0RR*X=,c........./Xz|0_x5TT'!Y_x5eTeTTe!N|*Uv..",
+"..v=u94s[ybybb-+{ss{+[bbybb<{#*v.....W,uuQlg@n+2G(t]<1#%u,v.......v/XuQ#s+-+{{ssss{+[ayyyyy-sLw....v,w%iJ@@s{s{ss{+-aHHHyya+diX......./UXu$Js+aHHbybHZG]aBJ%u,v..v/*%i@{<aH222222HHHaa<+s4i%uW...../w%i4n-2tG22byba[-+{@4#QuwW....v/UXuu%%Q9i#4ds-[byyab-s#9uUv..c=u%#s+yybyya[-+++-yayyya<{J%/...,u9#d{-[yyy[++{{++yZ((Z[+dLu.........vW=u$#@s--+{@$%*Uc.................c,w%$J@s+<<+@i%uUc........vWUuu$iJ@s+<<aayHZ22H+s4QU....cUu%i4@sss{{{++{+{{{{s@4#%=v.../XRNBa222yybH[aa+s4#Q%uw,c......c,u$Jd{+[ay[-+++ayyyybyasJ9*c..",
+"..vU%$J{<yyybb<+ssss{<abyyy-s#uv......c,uuQi#dB[GG(G-siQuX/......../=u%9#4@@@@dd@@s+abyyyya<siXv...vc,u%ii#J4@d@s{+a2Z2yyab+@iXv....../XuQi@{[ZZ2ybby2GG[{J$uXc...,X%i@{+ayG(G(GGGGG2Ha-{@#%u,....c,u9Jd{-HZGZbybyyba<{s@J9%*,.....vcUUwu%u%99#@s+ayaab[+diQ*,...v,u9#@+byyyaya<+++aayyyyy[{J%W..v,uQJs{<abbba+{{s++[2G(GH+@#Xc........vUuQ#@{[HGG[BJ9uU,.................c=u%J@+-22]aBJQu*W......vcW,u%Qi4s+-babyyyyaa<+s4iu,.../UXuQJs+<aa<<aaabaaaa[a+{@iuW...cXuQ#d{+<byyGGGZa-s4iQ%uuX/v....cUuQJ@s{<aaa++{+<[bbyyy-{49w/..",
+"..v/XuQJ:B{B1d@JliL#J4d1B{Bdg%U........vWUXu9Lh}F~~kng%uUWv........vc,=Xuu%%%%Q9$i#4d1{BBBshL%U......cWUX*uu%$iLgNh1^~~^BBd4iuW......./UwuQLhBk~^1nn1^~kENQuX/....cUw%iJ:16~~SSSStSS~^1n4LQuU/....v/X%9#h:6~~^BB1sBsn@hLiQuwU/.......v//,=UUwu%$#4sB{sd44$%X=v....cUw%i4nsBBBsn@44@dsB{B1sdNQ=v..v/UuQ#4@s1BBdhJNNNh1k~~k}hL%U..........W=u9#:E~~~k:luw,c..................WXu9g:6k~~kxluXU/.....vc/UUXuuQ#4:sB{B{BB1dMMNl%wWv...vWUwui4@@sssssssBssdsssn@L%Xc..../XXuRLJMnB^~SS~^nM#$%%*X=Wv....v/,X%$iJ44@@MJJh@dsBBBBd#$u,...",
+".../=uQL:n11n:gL$9%lLgM:11nhL%Uv........cWUurlNEVF3Dxl%*=/v.........vc/WUXXXw**%%9LgMnn111nN$uW......v/W,UXXu%9lLNNEAkk61n:gQuW......v/=*u9LgEAkDEMM:}kDEN9uUWv...cWUu%LN:AoSFSSFSSSVAn:ML%uU/...../Uu9lg:Ek~kEnnnnn:MOLL%uX,c..........c//WUXuQlOhnn:hOl9uwcv....cWUu%g::nnnn:MNONh:nnnn:Ml%U..../U*ulLMMn1nMOgLLNOEA3FkEO$%Uv........vcUX%LhEkF3Dx$uXWc.................v/=u%LM}kF3Dx$u=,c.....c/W=wuu%QLNMn11B11n:MLL9%wUc....cW=XulO:nnnnnnnnnnnnn:n:MLQ*W....v/UXu%$NMnDVSS3DEMLL$%u*XUW....v/,wX%QlLNggLLLLOh:n11nhL%wWv..",
+"..v/UzRI!'5'5xI|QRR|0Ixx''5x0%,.........v/,XzfI;&qqjp0R*Uc...........vcWW,U=Xw*%||IN!5'e''x0rX/.......v//WUX*%|IYYp;&&Cm5!Y0rX/......cWUzr|IY;KCm'!!pK&j;IfrX/....cWU*%|I_;C&q888&q&CK;'!Y|%X,....vWXz|II!K&&Cm;5'5'5!!YI0%*Uc...........c/W=UzR0_!}'!Ig|%X=c.....v,=zRIx!5';5;pp_pp;5e5'!_fz,..../U*%|I_x'5'!IIIIIY;jqq&;Y|zU.........v/U*R0Y;j>&Kp|rw=c.................v/UufIY;j>&K_|zU/v.....c,UXr||0IY!!''''''!YI||%rX,v....c,wur0Y!E5E5'E55}5E5}5'!!I|u/.....cW,w*r|_!;j&&&KpxY_II|f*X,v....c/Uwrr||0IIILII_!!5''5x0RX/...",
+"..vUXrl_ETTee5xN|ff0Nx5eTTT5_fUv........vcUXr|Y;&88j;Ifzw,v...........vc,,=wwuR|g_x'm))Te5xIfX/.......vcW=Xur0Yp;jj&q8>me5xI|zW....../Uu%I_!5emmm'!5e)>&;_0R*,....cW=zf0Ix'mo)KKjCC)>7CKm;Ifr,v...v,XRL_!'m>q>CCC)mTemmK;p0r*W..........vc/,U*RlI!m)m'Y0|zXUc.....c,wr$Ix5'm)CCCjjjjCCme5x_0rUv...cUwf0Ox'm))5!__x!'K>8P&Kp0RUv........vWwz|I!'7))m!0rXW/.................vWUz|Nxe)))m!|rw=c...../Uw%0_!!'mK7mTTT55xN0fRrXU/v....cUXr0_5eTTTTTTTTTTTTTTTT5x0r,......c,=Xrff_!;KKKmTT;m;;p_0Rwc.....c,X*rRfl0N__x'em)7TT'xIRz,...",
+"../X%$@{[yyyaa+s@4J@{+[ybyb-{4*v........./wulO1a(((Z<n#%u=c............vWUXu%$#d{<aaZZZaa+{4i%/......../Uwu$Js+Htttt((Z2[<+s49=....v,wuiJ{<bayyybbaaa2G][+@JQwc.../U*%i4@{-b2H[a-[Hb2GG]][B49*/...WuQ#d+-y2](((GG]2HH2]ZZ<BJQXv.........c/,w%$#@{-2ZZ[{@#%uX/...../w%iJd{-[2t(ttt((t(]2H--{dLwv...vX%#@{-aZ]]H<+<<bb2(((t]+dLu........./,u9Js+ayHH<sJ9uXWv................cUuQJs+abHH-BJ$uXc....vU%$4{-yaH2Z]Hbyb-+d4#Q%%u=c...../*%i@{[yyyybyyybybyyybyyb+dLw......cWw*%$#4s++aaHHHH]Z]H-{@$=.....vWXu%QiJ@{+-[[2]]2Hy[+@iuUv..",
+"..cX%94{ayyyy[+s4JJ@{+abyybas#*v........./X%i4B-GG(G<siQuXW............./Uwu$i@s-abH2ZZa+{@J9w/.......vcU*%$Js^-tttt(GZaa-+s4iXv.../=u9i@+ayyybyyaa[b2GGH+sJi%W...cUX%Qi4d+[a-+{+<-yy2GG]2{4iu,.../u%#s+aa2G(GGZZ2HyHZGG([{J9wv.........vWwu%i4@+<H22<{Ji%u,v....vWw%i4{+abH2Z]Gt]GGG2Ha<<{d#uv...vW%i4{+aH22H[aabyHZ((tt2+di*c........vUw%i4{+[a[+@iQuU/v................vWX%i@{+aa-+@i%u,c....vX%i4+ayyHGGG2ybb+s@J$9%uX,v....v,*%i4+aaybyybyyyyyybyyyyb-siXv.....vWUXu%9J@s++-ayy2GGG2a+@iXv.....vWwu%iJ@{-byy222aya<sJ9uU...",
+"..vWwu9JnBBBs:4gl%9lJ@n{BBB@OQU..........cWXuQO}~SSkng9uw,c.............cWX*%$O:Akk^D6E:Ni9u*,........vc/,wu%lOx'}e66^6B1n@MiuW....v,wuQOn^~k^^{Bs11Bk~~A:MiQu/....c/=Xu%9i#JOgLNJ4:1^~~~AML%*/..vcXw%i4:16~~kA661n1Bk~~~}:l%U...........cWwuQLOMn661ML%uXU/......cU*%iMd11B6^AA6A6A^^6Bsd@g%=.....cXu9iNh16^k^^^^6^^~SS3}ML%U.........vcWwu%$i###iQuw,cv.................../Xu%$i#J#iQuX,c.....vWu%i@1BB^~~~6Bd@4g9%uX=W/v......cUX%i4d1sBBBBB{BB{BBBB{1shi%W.......v/W=wu%lLJh@nB^k~S~k1h#%W.......vWUXu9L:1^^^A66n:4#i%*U/...",
+".../Uu9g:n11:MNl%u%llOMn11nhL%Uv.........c=UufLEkF3AxL%*U/c............v/,=*Qlg}Do3D}:OLQuXwWc.........vW,UXXr9lINhxEE111n:g9uW....v/U*%LEko~k6111n1}kVV}:OgQu/.....cW,UX*u%%%%%QlLgM}VFVAY$%wW...cWw*lLM:AVoAE:M:hhEAVFV}N$%=v..........vWUu9LOM:nE:NQuX,/v......c,w%lN:nnE11E::M:nE11EnnML%Uv....c/=*R$gMEAV333kA6D3FSk}O$%W..........v/WUXuuuuuuw=,/v....................c/UXuuuuuuwU,cv....../X%$Nn1B6kVkA:MMg$%%XXUWc.......c,wuQLh:n:nnn1n11nnnnnnn:O$u,........v/,UXu%9$gO:16kFSFDEOluW........cW,XulhDV3kAEMgL$%*wU/v...",
+"..vWU*R0x''e5xII|RR|0O!!'e'xI%,..........c=XzfIp&qqjp0%*=Wc............c,UXr|IY;&P8&;pI|%*U=Wc.......v/WU==wX*rf|II_!''ee5'_|u,...../=uRI;&8&Cm''''emj&&K5YI|rW....vcWU=Xw****uzr||IY;&q&K!0f*/..v/=wrfIYpm&&jYYIYIY!K&q&KY0rXc..........c,Uz|I_!!'x!IRr=U/......vcUXz0_5'e''''_YYY!''eee5!IR=v....c/,=uR0Y';&PPP&Km)&qq&;Y|%,..........vv/WU=wwXXUU,/v.....................vcWU=wwXUX==Wc......v/XR|_xeT)C&CmpxYIIR%*=,/c.......cU*R|IY!5''''''''''5'''5x_|z,.......vc/=UXzR|0I_!'mCqP8j;_|zW........vW=wz|pj88&;!I0RR*XU/v....",
+"..v,Xr$_5TTTe5xO00LIIx5TTTT5gfUv.........cUwz|_;&qq&;I|rX=/v..........v,UuRlI!;j&P8&m!N0RzwU/c.......vWUwX*zuzRf0I_x5TTTTTe!IrW....v,wR|_K&8q>77TTTT7>qqCe'!IfU....vWUw**zuuz*urflII'K>qqKpI|*W.../UufL_xeKq&j;Yx__Y'K>q>KpIfz/........../UzfLx!5'ee5O|zX,c.......WUzfL!TT7TTT'5xxx5eTTeTT5_|*c....v/,X*R0x5m&PPP>)77>qq>;!0rUv..........vcW,UX*wXw=,/c.....................v/W,=XXww=UWcv.......,wR0x'TT7>>C7e'!xOI|%zwUWv....../UzRI_neeeeTTTTTTTTTeTTe'x0rW.......v/UX*rf0I_xx'T7Cq8qC;x0r,........c,U*rIp&qq>K!_0Ru*=Wc.....",
+"../X%i4{[ybyaa+{s@ds{-aybyb[{J*v........v,u%L4B[(((G[B@i%X,/.........vWuQiJs+[2GG(G2[+s4i%uw,c......WXu%ii#ii$iJ@@{<aybyybb+d#X...vWX%#dB[((GZyybyyy2G((ZHb<{Ju...vWw%QiL#$$$9Q$#@s{<2(((Z<s4QU...Wu%id+-aZ(ZZ[+++++<2(((H+sJ%W.........c=u$4{-ayyya<sJ$%X,......vUu$Js<ybyyyba<+++[yyyyyyb{4%/....cW=u%i@{<a2](((2HZG((GHBdLwv..........v/,w*u%uuuX=Uc....................v/,=X*uuu%u*Xc........,%i4{-abH2Z22HHba<{sJ#Q%wU/.....W*%i@+[ayyybybyybyyyybyyb+sLw......vUXu9i4@{<[HaHbH2Z]22-{4QU........cXu%Ld<2Z]]y+s4$%uXWv.....",
+"../wu$4{<yyyyb<{sdds{<[yyyy<{#*v.......c,XuQ#@+aGG(2a+@i%uwU/.......c,uQi4@Ba2Z22HHb<+dJi%u*Wv.....v,w%iJ@@dJ##J@d{+-bybyya<@iXv..v,*Q#d+abHHyyyyyyy2G(G2yb[+4uc..WwuQ#4@@4ii$$i#@sB-2GGG]-{J9U..vWwQi@{<bHGZ2<+{{++<2GGt2<sJ%,........./wui4{abaayb-sJ9u,c.......UuQ#s-byyyyba-+++<byybyy[{J%/....vW,wuQ#d{+a[Haybyy2GG][+@iXv..........vWUUwuu%uu*U,Wv..................../,Uwuuu%uuuXW........cX%i4s{+-ayyZ2GZHbb+s4#$%uXW....WX%i@{ayyyayyyyyyyyyyyyyb-dLXv..../,X%%iJs<a2GG2Hyybb[++s@iuW........vWu%iM+aHHa-+@J$uwWv......",
+"..v,Xu$JnBBBB@:4g#LJ4h@1BBB@JQU......vc/WU*uQlh}~SSkENL%uXUWc......c/WX%$LJ:D~~^611:hJ$%u*UUc......c,UuQiOJgL$9iiLJ4@s1{BBs:i%,....c,*%lJ:1BB^B^^^^+^~~~^6B@4iX.../Uw%$#JgL$99%Q9LNOnAFSFD:gQu,...v,w%iOh16~V6nMh4OMnA~S~A:g9Xv........./UX%i4dsBBsn4L%X=/v......./Xu%Ld1{BBss@@4444@1{BBBsO9X......v/=w*%$NOhh::ndn6~~~~}M$uW...........v/=UUXwX*w=UW/v....................cW,=ww*wwX==Wv........WXu%QiLJhn1k~~~~BBdJi$%u*U/..../=Xu9Jd{B{B{B{BBBBBBB{Bs1@i%W....vWUX*uQL4n6kSSS^61:hJl$%%uUv........vcU*%lOn111h#Q%*UWv.......",
+"..vcw*%LMn11n:MONLLlOhhnn1nhlu,v......cW=w*uflN}VFFDENl%uw=U/v.....v/=wu$LgM}V3AEn:MOL$%uww=/v.....c,wuRLgONL$l$llLNO:nnB1nh$uW....vWU*RlO:n11nB16B66kF3k1::N9=v..cUXullgONL$$$lllLN:DVS3DML%Xc..../XuQLNx}VV}MNLgLOxDVFV}_l%Uv........vcUwzQg::nn:hO$uwWc........WU*%lMn1n1n:MggggMhnn11n:N%Uv.....vcUUXu%lLLggOhM:}AFFD!L%X,...........vW,wwu*uXXX=Wcv....................cWUUXwuuuwUUWc........v/,w*u%$LOEA~~~^6n:OL$9%*wW....vW=u9LM:nnnn111nnnnnnnnn:#$u,....vWUwu%9lO:}kFSFDEhOlQRuX=U/..........cU=uQgM:nhg$uwUWv........",
+"..vcU*%0_x''''!Y_IOIY!!'5'!_|*W.....vc,UU*%R|IY;&P8&;_I|RzwX,c.....cWUzR0YYpj&8j;'!xYII|%zXXWc.....cUXr|IY!YYNI0I0IYxp''e55_|uW.....c,Xr|I_!!5'eeemmC&q&j;'YIfw...cUXzlI____III0IIYYpj&q&KY0Rwc....cU*%|Ip;&&;p_I_IYpK&q&m_0rU........../U*%|Y!}''5YI9u=Wc......../UXR|_5'e''p!Y_IYx!''ee'!IRU......v/UwXzR0I___Y!!pmj>&Cp0rXW..........v/UXu%f|fQRzw=Wc...................v/Uw*r%|$Rf*XUWv........v/,Uwzr|I!;&&CKm5'!YI0f%*Uv...cWU*%|OYxx!x!!!!5x5!x!!xYI|*W...vc=*R|IIY!5mj&&&K!Y0fzu*U,/v..........cU=rRI!!5xI|zw,/v........",
+"...cUwr|_5'TTmm;555'emmTe'5Ifz,...../,Uuf|0Oxp;j8PP&K'!_N0|R*,v..../U*fIp;mj&qqCmTe555x_I0|Rw,v...v,Xu|_;mmm;55x:x5'm777TT'x0zW.....vWwuf0I_!5'ee7T7>>8qCTe5x|=v../=u9Ix5';e;'5!55;mK)>C&;Y|rXc....cUwR|0xK&qje5''5emC8qqKpIfXv........vWU*RIpm7)m'xIRzXWc......../UuRLx'TT77mm'E5';)))eTe5O|=v.....c,w*f|Nx!!55'emm)C)CmpIRw/..........vWwr|I_ppp_0rX=Wc.................vWU*%lI!p;p_0RwW/.........cW,=wrf0Yx;;mTTTTmm;;YIRz,...v,UXz|0I_x_x_xx_x_x_x___I|%w/...v,wfIp;;;'eTmjj;'YI|z*XU,/v..........v/UXzl_5e'!O|%XU,v........",
+".../UuQJd+-b22Z2bbbH2ZZHa-+@#%U.....,*%i@{+<bbHZt(t(ZHab-+sJ$*/.../=u$h+~]GG(((2Hyyybya[+{dJQ*/...Ww%i@+H]]2HabyyabHZ]Z2yya{4QU....../X%QiJ@s{-bbbybZG(G2yya+JU..v,uQJ{-ayHZ2HHbbH2]]22HHa1J9u/....WXu%l41[((GZyayay2G((Z[^@#u/.........UuQ#s-]]ZZ<{@i%u,c........Ww%i@+abHHG2ZyyayHZ]2Hya-s#*c....v,*%iJs+aabaybHZ2]2bHa{hir=.........v,uQ#s+aZ]Z~TJQuXW................v,w%$4{-aZ]]~{N%u,c........v,UXu%$gO@sB+-aH2]]22<{49U....WXu%QiJ4@@@4@@@@@4@@444#Q%u/...WwQh<2]2ZHHb[<+Bs@#$%uu=,c...........v,*%$4{-bb-{4i%*Uv........",
+"...cX*%i@{+[a2ZZbyyy22Zaa+{@i%Uv...vUu%J@{<abyyZ(((]2yyba-{@i%U...Ww%$4+H2GGGGGZyyyaybyba-{4iu,.../X%iM+~2GZ2yyyyyyH2Z2bb[-s#u,......vU=%%iJ4s+-byyyyZGGHyy<siU..v,*9Js<baHZZ2byyH2GZ2yba+diQwc...vc,X%%#1<2ZZHHHyybH22G]a{4i*c........vWu%#n<ZGZ2+d#$uX,v........cwuQJs<abbZZ2Hyyy22ZHyb<+4iwc....W=%9#@s<ayyyyyHZZHyy[-s#Qu/.........c,u$Js-[2Z]H<@iuX,v...............WXu%#@+a2H]]2+49uXW........vv/,Uwu%i#4@s+[[[22]2<{4i=v...vcUX%%9lii##i#L###i#ii$%%uUv...,*94^[ZZHya<+{s@4i$Quw,/v.............WXuQJs<bb<{4$%wWv........",
+"..../WUu%$LO:E66BBBB661nh#iQu,c....v/wu9#4@ns1B6^kkk6B{ss@Mi%XW...v,w%lhED^k~k^^^{B{B{{sd@4i%X/...vWUu$Nn1}6BBBBBBB6^661:4#9u=v.......c/,XXuQiJ@d1BB^^^^BBs:J%,...cWX%$#@:16^6BBBB6^^1n:4#$u=W.....v/W=XulNE16B^6BBB6666E:LQuW..........cX*%L:66A1hl%*U/...........c=X%$J4:16^66BBB6^61:@Ji%uW...../Uu%QiJdsB{BBBB661n:4L$uXWv.........cW=u$N:16^^1xl%XUc...............v/=*u$h1D^666Ehlu=/v............vc,UXw*%9iNh:EEEMOl%*c......vc,UU*uX*u*uwwwuwu**XXU,c..../U*fNxEE:nMOL$9%%uwXUcv...............cUwuQ#@@sh#Q*XWv.........",
+"...../,UXu%lLh:nnn1nE:hNlQuwUW....../UX%LOh:n111166611nn:MO$u=c...vcXuRg:E1B161111111nnn:hg$uX/....cUXz$LOhM:nn111111E:OL9uuw/.........vWWXXu%lNM:1111B1En:hL%,....c,=u%$LM:n111E11EnhOll%uXWv.......c,wwz|LOMnn1111:nMMOLQuXW..........cWXzQg:EEhL%*w,c...........v/UXu%QLN:nn111n1EnhNl%uwU/.....cUw%QLgMnn1n11E:MNLl9%*X,/..........vWU*%LN:EEE:gQuw,c...............vWUXulx}kA}nxOl%XU/...............v/,=wX**%RR|l|lruw,v.......vv/WWWUUWUU===W=,WW,W/cv....v/U*rflllll%%uwXUUWcvv................vc,XuQOhhMluwU/..........",
+".....v/,=w*z|I_x''''!YY0Rr*UU/......cUXrL__!!''e5'5'5'5!!YO|z=/...v/UrfIx5''''eee'e5}5'x!YN|uU/....vWUur|0IY!'''5''''x_0|ruX,/..........c/==uflIx!5''e''5!!_IzW....v,=wur|Ix!''e''''xI0fz*wUc.........c,XuR|IY!'''''!xII0|r*U/..........vWU*R0Y!xY0RXU/c............c,UXzr|Ix!'''e'''!_ffzwUWc.....cUXrf0IYx''''55!_0RRuX=U/v.........../UXR0Ix!''xIf*UWv...............vW=Xr|pj&K5!YIfzX,c.................vc,UU=wuzzrrr*=U/..........cvvvccccccc/c/cvvv........vc,X*zrrzzz*XX=U//c....................c,Xz|NxYIlz=Uc..........",
+".....vcWUw*rR0_!5ee5!xO0RzXUc......./UufI_!5eeTTTTTTTTee5x_0RXc...vWXuRIx'eTTeeTTTTTT1eE5x_|rXc....vc,*r|IN_!5eeTTTe55x0Ru*UWv..........vcWU*r0Ox5eTTeTTe'5xIR,....vc,Uwr|g!5eTTTTe5!g|Rr*UWv.........v,UXz|0_x55eee'x_I0fzUUc..........v/U*R0_xx_f%*=,c............vcWUXrf0x5eTTeee5!g|zzX=,c.....c,wzR0O:5eTee'5x_0fzwwUW/v...........cU*R|_x555xI%*=/c.............../,Xr|Y;C>Ce!_g|zw,c...................vcUUUXXX*UXUU,/............vv.v.....................c/,Xrrrz***=UU/cv.....................cUwz|Ixx_|rXU/..........",
+"......vW,wu9i4d{--[-{s@J9uX,v.......,X%$4s++[[[baabb[aa<<{sJ9u/...c=u9i@{-[aaaa[b[bab[a<+{@JQu/.....cUr9#4ds+-[a[aaa<{s4$%z=c...........vcUXu$Jd{+a[b[[a-+{s4$U....vc,wu9i@{+[[aa[a-{4iQ%uXW...........WXu%iJs{-[a[-+{d@Jl%XUc...........,*%$4d{sd#9uX,v..............cUu%i4s+-abaa[<{@iQ%u,/......c,u9i4d{--a[[<+sd4i%uwU/c............v=%iJ@{+-+s@$%X,v..............vUuQ#4{[ZZH[+{@#%uXc....................v/WU=w**X==W/c.....................................c,UXuuuuuw*X,/v......................v/=uQ#@ss@#QuXW..........",
+"........c,uuQiJ4@ssd4##$%X,v........v,uQi#@ss{+{{{+{{{{s@4Ji%=c...vW*u$i4s{{+{{+{+{+{{{sd4J9%Uv......W=%Qi##4s{{+{{{s@Ji%uwWv............vcUu%9#4@s{{{{{s@4Jiuc......cWwu$i4@s{{sssd4i9uwUWv..........v/WUu%i#4@sssd@4Ji9%uU/v.........../=w%9#JJ#$%*Wv................c=%%iJ@ss{{{s@4i9%u,,v......vWX%Qi#4s{{ss@44ii%%=,cv............../w%i#4@@@Ji%u=c...............c=u9J@+<bb[{@4#9%=Wv......................vvcW/W,/vvv.......................................cWWUXwXUX,cv.........................vWw%9iJJi$uX,c..........",
+"........../UUXuu%%%%uuwXUcv.........vcUXuu%99$$ii9i$iQQ%%uuwU/.....v/Uwuu%$$$i$$$i9$i$9$%%uXU/........vWUXuuu%Q$$i$$Q%u*XUWv...............cW=Xuu%9$$i$9Q%%u*W.........cW=wu%%Q$9%Q%uu=,cv..............vvcUXuuuQ%Q%u*uu=,/v..............c,XXuuu*XU/...................c,UwuuQQ$$QQ%uu=,Wv..........v,,uuu%9$9%%%uuX,,v.................vcWXuuu%uuwX,cv...............vWUu9LNM::hiQuu=,v...........................................................................vv.vc/cvv.............................c,=wuuwX=cv...........",
+"..........vccWWWUU,WWW/cvv...........vc/,UUX***X=w=ww*XXXUUW/........cWUwwX*u*uuu==X=XX=XUU,/..........vc/,,Xw*wu*wwX=,//cv.................vcW,XXXX*wwwXUU,Wc..........v/UUU=X==UUWW/cv..................cccWUWUUU,UWW/c..................vcWWWU,Wc.....................v/WUXwXw=U,WW/cv.............v/WUwwXwwXXUUWW/.....................c/,UU,WWW/cc.................vUUu%%$LLQ%*XU/v...................................................................................................................vW,UWUU/v............",
+"...........v..vvcccvvvv...............vcc//W,WW/vvcc/,W///cv..........c/W,,,,,WWW/cvcvcW//v...............v//WW/W,,,W//v......................vvWW,WW,,,W//cv.............cWWW,Wcvcvvv.....................vv.vvvvvvv.v......................c/cccvv.....................vcvcc,//ccvvvv.................vc/WW,W/////vv......................vv/ccvv.v...................vc/UXw***XUWW/v.....................................................................................................................cc/ccv..............",
+".............................................vv.....vvv...v.............v.....vv........v.....................vv....................................v....v..................v...............................................................................................v..v............................v.vvv..............................v.........................vvv.vvvvvvvvv..........................................................................................................................................",
+"...........................................................................v................................................................................................v.v.................................................................................................................................v..............................v................................................................................................................................................................................",
+".............vvcc/cccc....................................................vccv.v.........................................................................................vvcccc/ccccvv...................vvc//ccccvvcv.....................................................................................vcccccccv........................vcccc/ccv................................v..........................................................................................................................................",
+"............vcW,/WW//Wc...................vvvv.........................vc/v/ccccccv.........................vvvvcvvvvvvvvv.............vcccccvcv.......................vv//c///WW///cccv..............vcccc//W////////v.......................vv.vcv....................vvccvv....v.vc/cv...............vvvc////////v.......................v/c//////vv...............vccvccvvvvvvvcvvccv................vvcccvvv............................................................................................v..cv..............",
+"..........vc/W,U=U,,,Wcv................vc//W/cc///cv.................c/W/W/WW/////W/vv....................vvc/W/W///////vv.........vccW//W//,///cccv.................c/W//WW/WWW,WW/Wc/cv...........vc//WWW,,,WWWW,U,W/cv..................vc//WW///cccvv............vc/,WWW/cccc/W///W/ccc.........v////////WWWW////cv.................../W/WW/WWWWW/cv...........vc///WW//////////W//W/v............v//W/W/,,/ccccv...............cccv............c//cccv..........ccccccv.....c/ccccvv..................c//Wc/c.............",
+".........vWW,U=XwXXX=UU/v..............vc/,,,=UUUU,,/c..............vcW,==U=====UUUU,W/cv.................v/WW,====UU,,,,,/v.......cW,WU=U==U=U=UU,U/cv.............vc/,UU===UUXUXU====,W/vv........./W,,,UUUUUUU=w=XUUUU,Wcv.............c/WW,,U===UUU,W/vv........c/,U=U=U,=,W,W,U,U,,=WW,c........cWW,==UUUU=U=U=U,,,ccv..............vc/U,UUUUUU==U,WW/c......vccW,,UUU=,=,,,=,,,,=,U,/v........../WU,UU=UU==UWWW/v.............cWWW,W/cv......vcc,,WW,Wv.......v/,W,WWW/ccvcc/,WW,UWWcc.............vc/W=,,,,U/cc..........",
+"......../UUX*rrf|||fRr*UUcv...........v/,UXX*zzzz**XX,W............v/UwwzzRrRRfRRzz**wU=Wcv.............vc,UX*w**zrzz**X*w=U/.....v,XwzzzrRRRRRzrzzXwU,/v..........v/UwXzzrzRrrR%RRRrrzz*XU/v......cWUX**uzrRRRfffrRrRRrzzXX,v..........vc,UXw*zzzzzzz**wXU,c....../,=XwXzzzu*X*Xwww***z*u*XUv......cWUww**zzrRRrRRzzzwX=UW/............c,,wwzzRrRRRrzruzwwU,v....cW=XX**zrzz***wXX******wXUc.......vWUX*zzrrRRrz*XwU,/v..........vWUXw*XwXX,,/ccccWU=Xw**XU,v.....c,UXw**wUUUW,U=XXw***wXw,/...........v/UUwX***XXX=UWv........",
+"......v,*%9i#J@ss{{sd4#%u=,c.........c,w%%$iiJ4JJ##$Quu/v.........v,XuQi#J444@dd@JJ#iiQ%*=,/v.........v/,wu%9ii##J44J##iii9%%,v...,u%ii4444@@@444J#i$%uuU/v......./U*%$iJ4444@4@d@d@44JJi$%*,v....cUu%$i##4444@@dd@@44@@J#iQu=v......v/W=u%9$i##44444J#ii$Q%Xc....cX%9i###4JJ#ii$$ii#######i%=v...cWX%%ii#iJJ@@@@444##iiQ%*Xc........../=u%$i#J@4@@@@444#ii%*,...v,u%$i##JJJJ#ii$$ii#####i9uUv...../Uu%$iJ4444d@JJi$%u=W.........v,*%Q$###i$%uwXUXXuu9ii##iQuU...cWXuQiiiii9%%uuu%9i#i##ii9%Xc......./,UXuQQii####iiQ%w=Wcv.....",
+"......WXu9iJ@{-[bHHa-s@i%*XU/........cX%$#J4@s{{ss@@#9uwW........./=u%#4s{{{{++++{ss@4#$%uuU/........c,U*u$iJ4@sss{{{@@@44JJ$u/..cw9J4ds{{{+++{{{ss@4i9uuXWv......WXu9J@s{+{+{+{+++{{{{sd4$%=/...v,wuiJ@@{{++{{+++++{{+{{@4Ji*W......c,XX%Q#J@@{{+{{s@@@4JJi%Xv...,u9J4@ss{{ss@4JJJ4@sssss@@Juc..vUUu$J4d@s{{{+++{+{s@@4J$%X,v........v,XQi4@@{{{{+++{{{s@JJQ=...v=%iJ@@ss{{s@@4JJ4@@sss@@J9uW....vWwui4@s{{{{++{s@4iQu=,v.......,wQiJ@@s@@Ji%%*u*u%$i4ds@@4i*/..WXuQ#4@d@4Ji$%%QiJ4@ss@@4Ji%W....../,U*%ii4@dssd@@4iQ%uXU,c....",
+".....v/UX%QL4:B^~~~k1M#9uX,Wc.......cWUu%iLJMM@h@:4J$%uUUv........cUXuiJM@h@:@d@n@:@h#i9%*XU/........c,=Xu%$l4M@hdn@:@MJN#li9u/../X%i#4@h@@n@@:@:@M@gi%uX=,c.....v/X*%iJM@@n@n@nd@sn@@:@4#QuX/..../Uu%L4@@:@@n@n@@n@@:@:@4JiQw/.....cW,wXu%il4M@:@nd:4JNJli$%=c..vW*%iLJM@@:@h4gligJM@@d:@4Jluc..vWU*%iJ4h@@nd1@n@n@@MJgi%uUc.........v,=u$#44:@@:@n@d:@@Jg$uU...c,uQiO4:d:d:MJgLL#JM@:@@Ji%X/....v/Uu%L4@hd@:@n@:4l$%*Ucv......./w%$LJO4@Mi9%uwww*uQiJh@h4L$u/vvWX*%iJM4OJL$Q%uuQiJN4:44gi%uW.....v/UUXu%iL44M@h4N#$%uw=U,/v...",
+"....v/=Uu%$LMn}AoFFk}:gluwUWc.......vUXu9$gOh:n:n::NL%*w,/........cUX%lN::n:n:nnn:::MNL$%uwUWv....../UUXwu%$NOM::n:::MNMNgLLQuW..c*9lLO:n::n:nn:::MMOLQuu*=UW.....WUu%LNM::::nnn:n:n:h:MNg$uXW..../U*QLO:::nnn::nn:nnnn::MgL%u/....v/U=XuuQlNhMnn::::MMONNLl%X/..v,w%$NMM::n::OgLLLOM::::hMgLuc..vW=X%lgMMM::n:nnn::MMNgLQ*UW.........cWXu$LOO::::n:nh::MNL$u,.../=u%LNMh::::hNLgLgOhh:::NL%X/....v/UwQLM::n:nnh:MMNl%*=Wv.......WXu$gOMMMMgl9uuXwu%$LNMhMNN$u/.vWU*%lNhhMNgLQ%u%9lgh:h:MgL9u/...../,=w*uQlgOM:::MhNL9uu*=UWv...",
+"....cWw*%|0Ix'eC&q&&KpYIRuwWc.......c=wu|0__!!'5'p'_I|uXUWv......v/w*R0Y!!'''''!''!5!xIII|%*Uc.....cW=wr%|0IY!!555'5!'!!YY_I|%W..cw|0Yx!'''''5!'''!!Y_I||R*XUv...v,wz|IY!5''5''''55'''5'!Y0RX,....,Xr|_Y''''5'''E55'5''''!YI|u/..../UX*rR|IIYx!!'5!'!!!!YYIIfw/..cUzf0_!!'''!xY_III_!'''''!_0zc..v/=uR0I_!!55''p''''!!YI0RrUW........./UXz|OY!'5E'''''!!!_I0r,.../Xr|0_!!'''!!Y_II_!p''!!YI|*W..../UX*fIY!5'''''!!xI0fuU,c.......W*%|IY!p!!YI0R%ru%|0_!p'!!I0*/vv,Xz|I!p!!Y_I0|Rf0IY!p'!!YI|u/...v/UU*rRf0IYY!555!xYII$RfzwU/...",
+"..../U*R0_x5'ee)C>&&Cme!Ifzw,v....../UzfL_x5e7KKK)Km!I|RwU/v......,Xr0x5eTTm7mTeeTTee;e;pYIR*,v...vWXuQ0O_!';eeeeeTeTem;me55_|=v./w0_!'mK7mTTTeeeeee'''p!Y0RX,...v=*fgxEeemK)meTeTTTTmjmm5_0r=v..cUuQIxE'eT7m7TTTeeTemmmmT'!OfU.../UX%$IOY5';eeTTeTTTm;mee5xgRW../Xrl_!5mmmmTe5xh_x5''Tmmm;'_fW..v,Xr|Ix55eeTm))KmTeTe5:_0rX/v......../=*fIx5'eeTmmKmTTTe5xI|=v..,wr0_!e7KKmTe5xxx!;KKmTT5x0RU..../U*RLxEeemKmmTee5!O|rw,/......v,z|Nx'm)Km'!_Il|$0Ix!mmKKe!IR,.c=%|I'e77mm;'_IIg_!'emmm;5_0r,...c,XRR0OYx';'eeeeTee''p!Y|r*,v..",
+"..vWXuQJs<bayyyH2HH22Z2-{@#%*,......WwQJs-[b2]G((t(Za<s4$u=c.....vw%#d+aya22G2Hyyyyby22ZZa^4i*,...Wu%#@+<bH2]ZHbyyyHHH2ZZZHa-@u/./%@+[Z]GZZHbyybbbbyyH2Z2~{49wc.vWu$Js[yyHZ]G2HyyyHH2ZG]][^sJ%W../*$4{<yyHZZ22HyyyyHH2GGZ2y[+4u..vUu$4s+ab2222HayyyH2Z]tZ2aa+iU.vU%i@+[22G]ZHyb-++<ayH2GZ]2[+4wv./Xu$4{+aayy2ZtZ(]Hyayy-{4i%=c........Wu%#s<byyyb2]GZ2ybyb-{#*v..=QJs+[2G]G]Hyyba[bZtGZHbb-sLu.../=z$Js-ayH2G]HHyya+{@$%U,v.....vXQJ{-b](GZ2ya+sds{-aHZ(G(Za{LXvcu#@{[Zt]]Z2[<{{{+[H](GG2a<sLw..v,u9Js+<bH2Z2HbyyyyHH]Z2~{J$*/..",
+"...Ww%$J{-bybybyyyby2]Ga+@J$%Uv....vW*%Js+aa22GG(GttZ[+@i%*W.....cwQ#s-bby2ZGZHybyyyy2GG]Z+di%W../=uQJ{-yb22ZZyyyabyy2GGGZHb<d%v./%@+b2GGG2HyyyyyybyH2]]][+@#%,..W*$4s<aybZGZ2yyyyabHZ(t(2<sJ%,../*9J{<ayH2GG2byyyyyy22GZ2yb+4uc./w%i@+bbH2Z22byyaay2Z]]G2Ha+iW..W%i@{a2GGGZyyaa<+-byyZGGGZH+4uvvc=u9Js+abayHZG(GG2bbba<{49u,v.......vWu%Js+aaayy22GZHyybb<sJuv.v=%#@+a2GGG2byababH2GtZyb[+siXv...UuQJs<byHGGGZybba+s4iu=/v.....vw$4{<2Gt(GHba-{ss+<a2Gt(tZ[{J=vc*L@^a2G]t(G2a+{+<ba2G(GZH+siXv.vUui4{[yy2Z22yyyabby2G]Z[{4i%,..",
+"...WUu%i4s1B{1s1sn11^~k6Mg9%X,......v,X%iJ:n1^k~V~~k61:#$uw,.....v,X%i4nBB^^~^611n1BB^~~~knL%*W..cU*ulhB^^^^^61nnnnnn6^kk^6B@iX..cwlMn6k~k^B11s1s1ns1^~S~DEg9u/..c,w9i@nBB^^^61nns111^~SF6:g9u/...,uQ#@1nB^k^61n1nsn1^^k^^B14$,v./UuQNn6^^^^661nnnnn16^kk^B1M%/..cXu$O:6^~k^6Bd@44hd1B^k~kDEhl=...cU*%i#4@:n1^SSSk11d@4Ji%u,v.........v,X%iJ4@:nB6^^^6B1s@4l%U...Ww%Lhn6kk^^BB{s11B6~^61n@Oi%,....cUu%i4:@1^F~kBnd@Ji%uU/........Uu$N:AVSSSkB1@4JN@n1^~SSSDENQW.v=%ihE^k~~~~D1:h@:n1^~SSk1h#%U..v,*%N:B6^^^66nn1nsn1^~~~DnL%u/..",
+".../UX%Lh:nnnn::h::EDkk}MLl%*/v.....v/UwrQLgnE666A661nMg%uUWv...../Xu9LO:nE}1nn:Mh:MnDVF3DxL%*/..cUurL:AkkAEEMMOgLggO:EE}1nnMQW...,%LNnE6A1n:MOONONO:}kFVA:glu,.../wu9LM:n1}6EhhOOOM:DVFVAxLRXc...WXuQgM:nE6}nhONOOOh:nEEnn:guc..cU*fNEkkkD}nhOggggOhEE1EBE:Nuc..cWu9lN:}661n:MNggOM:EE666EhL%W..vc/Uwu%Q$gO:AVFVDEOgLQ%uwUc..........vcUUu%$LLOMnB6nn::hl$%w/...c=u9LMn16ABEnnnnE1EB}:h#LQu=c....v/U*%QLOh}kkD:hNlQzuUW.........Ww%lNEoSSSk6n:ggNO:EA3SSoDhL*WvvWuRL:E6AkVVAEhMNOM:AVFVD!N$*W..v,*%NEAkkDEnMOONONM:}VF3Dxg9uW..",
+"...W=*%0x5'''x5!!!';K&C;!IIRrUv......cUXuR|I!''e'eee5'xIRzXWc.....cUw%lIx!'e''x____YpmCqqjpI|u/..vUwRI;&&&Kp!II0lf||0_!!''5!_rc..vUr|Ix}em;!xIIL00IIp;&qqC;_0zW...cUzR0_Yx'e;'YOIOIYpK&q&KY0%X/..vcU*R0_Y5'e5!_OIIII_Y!5x'!xI*v../Uz|pK&q&mpYIIl|l|0IY!'''5!_zc..cWXr|Ix5eee5!xOIgI_!55ee''_0r,...vcW=X*zr|IY;q8&KpI0f%wXU,c...........vW,X*rR$0I!'''5xYO0fuX/...c=zr0Y!eem;'x'emmTe''Y0|RuX,v.....c/=*zf0Y;&jKYI0|R*XU/.........W*R|Yp&PPP&;5!_INY5;m&PPPjY0zc.vUz|I!'emCq&j;!!xYYp;&q&jpI|z,..c,uRY;&q&KpY_0L00IIp;&q&CpY0zW..",
+"..v/XzR_5TTTeen5555m)qCK5x_|rXW....../Uwrf0_xem777TTTe'_0fz=/v...vWU*r0_!5eTTe5!xxxx'K>qqC;_|zW../Ur|YK>qqCT!_I0lfff|_x55'''xr/..v=R0_5T77me!xI0000_xK>qqCm5If,.../wr9I_55ee7e5xx_xx')>qqKpIf*/.../XzfI_5'eTTe!_M___x5'5'ee5Nzc../Xr0pCqq>)ex_00|||0O!5eeee5_rc..c=wR0_5'TTTe'5x__x:5eTmTe'x0%,....vcW=*rR0IpKq8qjpO0|z*==/v...........vvW=w*rf0_!eTe'5x_0fr=/...cUzf0xeT77TeeeT)77TTex0fz*wW......./UXrf0YmC&mp_I|%*=,c........v,uf0p;&PPPq)T5!!x5e7C8PP8jpIr/.vU%|_5T77&q8Cme'5!x;)qqqC'_0rW..v,z|YK>q>)e!_If|00I!)>qqCm5_fU..",
+"../=%$J{<ybyyyybyyHHZ(]2a<{@i%,...../UXuiJd{-yHH2HHyyyb+sJiu=c...v=u%i@{[byybyaa[a[abH(((G[+49W..U*i4Ba((G2a+{@#ii$i#@{+-<--{ic.v/ui4{-yybyb<+s@J#4d+H]GG2H[{4X..vWuQ#s+ayyHHa[-++-[a2GG]aB@9uW..v,uQ#s+[ybyya-+++<-<abaa[[<s%c.vU%Ld-]GGZ2[+s@#ii#4s+[aaba<d9c..cw%i4{ayyyyyy[<-+-aayH2Hb[+@iU.....v,*u%$4s+Zt((Z<1@L9uXUc.............v/=u%Qi@{-byyaa-{4i%u/..vUu%L@+[yHyHyyHHH2Hby[+@L%%w,v....../XuQihBaG]2+{dJl%wUW........c*QJs+~(ttt(ZHaaabbyH](tttt+@%/.vXi4{-yyH]((2Hbyy[<[Z(((2a{@i=..cwi@^[(((2[+sdJ#i4s+HZ(G2H[+@uv.",
+"..cX%i4{[yyyyyyy2Z2GGGGH[-{@i%Uv...vcU*%9Jd{aH22Hyyy22y<{@i%*,...v,u%i@{<ay2Z2ybbbbbyZGGGGa{@%/..,%id+H]GGZa+d4i9Q%Q9#4ddsss4%/..Wui4{abyyy[-{d4#i#@{aaH2byb+Juc..WuQJ@+<aybyya<-abH2HHya+@#Q*c...,u%Js+aabyab<<-<[yyaa[+{ss#uc..U%4s<2GG]H<{@Jii9iJd{+<<-<{@%c../Xu$4{-ybyybybbbbbyyybyyyb+@i=....../Uwu$#d+[G(G2+s4i%*Ucv..............c,XuQiJs<ayyb[+{4i%XW...,w%i@+abyby2Z22Z2Zy[<s4i%uX/.......vUu%i@B[2G[<sJJ$uw=c........c=QJd+[((((GGHyaaayHZ((((]2+@%c.vXQ4{<yyHZ22yyyyabaaHGGGGa+4i=v.cuLd+2GGZ2<{dJi9i#4{ayHHyyb+4uc.",
+"..v/XuiOsBB{BBB^~SSSSS~DnhJi%X/.....cWUXu9gM6^~^1n1B^~knNLQuXW....vUX%iJ@1B~~~^B{sBB^~S~SkEM$wc..W*%L:A~~~AnOi%uwXww*u%%%%%%uUv.v/UulJn1BBsd4gi%%uuQLh11B11s:iX...cU*%i4@nsBBBnd:1D~^BnhMLQuXW....cX*%i4ds1{Bsn@M16k^1@JLiQ%uU...Wu9OEk~~~}:Jl%uuu%Qi#JJ4J#iQw....,Xu$O@BBBB{BBs1s1{BB^BBB1hiuW......./U=u%lhA~SFA:l9uXWc................vc,UXu%i@1B{1d4g9uXWc.../UXu94nB^^~~~~Z~~~B:Ji%uXUW.........c,*ulO}k~6:N$%wU,/v........vWwQLhEkS~S~~~61d1B^~SFSSV6:l=..v,uQJ@BB^^B^B^{B{1:nA~S~^EOl*W..c*QLxA~~~A:O9%u**uQLM1BB11shiX..",
+"...W=uQg:nn11E1DkSSSSVk}:ML$uwW....vv/=*%$LMEkk}nhMEAkA:O$9%X/....v/X*QLN:EkVkBEn1n1}kSS3VEN$wv..c*rlN}VFVAMl%uXU=,,,===www=U,...cUu%LMn11nhgl%uwX*%lOMnnnn:Ml=v..c,XuQLO:E1EnE:EEAVkEMLl%uw,c...vc,X%lLh:EB}E:x:EDVD:N$%u*wU/...Wufg:DFFk}Olru*uuz%lLLgLL$QuUv...c=u%Lhn11111n1n1nnnB11B1:OQXc........cUXuRN}VFV}M$uX=Wv................./W==wu$g:nnhhNL%uw,v.../Uwu9LM11^~SSSSSFkENLQuX,Wv.........vWUu%IEDkEOL%u==Wcv.........Wwu|O:kSSSS~kAE:EEkkFSSFV}OQ,v.vWw%L:n1B11166^6E:::DVSoA:l%uW..c=RLhAVFk}Ol%uwUX*rlNh:nnn:OQU..",
+".../U*fIx'eeeeeKKCCjCCm;xYI|zX/.....c/=uf0IY5mm5pYYp;KmpYI|%*,v....WUzfII!;jq&Ke'e'Tmj888jpY|wv../*R0YK&8&KY0ruw,WWWWW,,=U==/c.../UzfIx'''!xI|R**XXzRIY!55'!Y0=..v/UXr|I_!;j&jjjjj&&&;Y0|r*U,c...vcUX%lIY!;&&jjjjj&&jpI|R*XU/v.../z|Ipjq8&;I0Ru**%f0I____I0|zU...vcUzf0x'emmee5e'ee'eTmme'!_f=v.......vcWXrfI;&q&K_|rU,/..............vccccWU=zRl_x'5x_I0R*UW....cUXr|I!'mm>>8888q&;Y0Ru=,/c.........v/U*RI;j&;_|ruUU,Wv........./wr|Ipjq8q&CKKjjjKKCCq8q&;YfU..v,z%I!'ee'''mjCCK;!pK&q&jpIRz/..cXRIYK&q&;_|zzw=X*z|0Y!!55!_f=..",
+"..vWXr$_5TT7T7e7777)777T5x_0RXW....v/=*R0Nx5eTTe555'eTTe5_O|RXc...v,X%|Ox'm>q>C7TT7T7>q88&K!Ir/.v/z|I!Kq88jp0RrU,W///WWW,=UWWc...cXR|O5TTTe5M0%z*wzz|O!5'eee!Iwv../=zRl_x;j8P88q8P8q&;YIfr*w,c..../=Xf0_5;jq8P88888qC;_|r*=,c...vW%|Y;C88&KxI|Rrr|Nx555'5!xg|*c...WXrlI5e77777TTeTTTT7))7T'_|wv........c=wz|_K&qqKp0%zU/...........vc/W,=U=U=*r|Ix'ee5!_I|rX/v...c,z%0_5T7)>8PPP88&m!I|R*U,c.........vWUuf_;C&K!I|r*w=,,Wcv.....v,*r0x;Cq8q>7)C&88&))Cqq8>K!|Xv..,*|N5TTT''em>q>C)em)q8qCp_|zW..vw|I'Kqq>KY|RzXXw*z|Ox5eeTe!0Xv.",
+"../X%$4{abH2HHybHH2b222Ha<+d#%U....cUu9#d+-bbHyyba[ayHyba<+@i%,.../w%i@{-[HZ((2HbyybH2(((G2-{LW.vUQJs+2](([^dJ$u*UWWW,=,U=U==/...,ui4{[bbyaa+d#$Q%%iJ{<ayyya-d%v..Wu%#@{-H](((t(((((Z2+dJi%u*W...vWu%#@+[H]t(ttt((((G<1#9uXWv...vXi@{[]((]a^@JiiJd+ayybyyb<{@%/..vU%i@{[bHHHbyyyyyyyHyyHyy[{J%c........W*%lOBHt((2+:#Q*,.........v/,wuuu%uu%uQiJs+abbb-+sJ9uUv..v/X%i@+[yHZG((((((G2<+d#9%X,v........WwzQ#1[(22+{4LQ%uuuuXU/v...cX9#@+[]t]GZH2G((((Z2ZG((G2^@uc.vwQJ{-yyyybb2G((ZZHHZG(GZaB4$U..c%4B<2G(G2+@l$%%%9i@{-[yyby-duc.",
+"../wui4{aybybyy2bGGGZGZyyb-s#%Uv..c,u%i4{+aayyyyb[abyyyyb-+@#%Uv../X%i4{+aHGG2HyybyyyZG((2H<s#,..U9J1+2G(GH+sJ$%*=,W,,,U=UwUW/..v/%94{<yyyy-+@#Q%%Qi4{-bbbby<@%v.vWuQi@+[[2(t((((G(GG[+s@i$%uUv...UuQJd+<[((((((((((2-diQuX/v....w$:+a2G(Ga+dJ#iJs+aayyyya-{@9U...W%i4{<yyb2yyyybbyyyb2byya+4u/.......vWw%i41[(GtH+di%uWv......../=uu%Qi$$9%%9iJs+bbya<+s4$uU....W*%i4{abyyGG(((((GH[{sJ$%u=c........W*%i4B<2G[<s@#$%%%uuuuX/...vU%id+bGGGGZyHG(t(GZb2GG(Z[+d%c.cwQ4s<yyHyyyy2GGGHbb2GGGZ[{4i=v./u4s-2(GtH+@#9%u%$#@{abayba<d%v.",
+"..cUXulJnBB^BB6^~SSSS~~^Bs@g9u/...v/XuQihdsBB^^^BB66^^^BB@M#%uW.../WX%lJM:1kk^6B1111B^k~kk61M9UvvWuQL:D~~~AngQuXUW//W,,U=,,,/c...cXu$4nBBB1@4L%u**uuQJ@sssBs@iw...cUu%iNdn6k3FoV~~~SkB:N#$Qu*W....cU*%L4:nAV3FoooF~~knL%uU,v.....,%$OEk~~~}:g99Q9#@1BB^BBBn4g%,..v/Xu$JdB^^^^BBBB1BBB^^+6BsMiwv........c=X%lh}FS~A:L%u=/........./U*uQQi$Q%uuuuQ#@1Bsdd4g9uXW....cWX%i4nBB^^~~F~~~kDBnNi%uw=c........c,wu$O}kkA:gi9%uwuu%uuX/....Ww%lO1k~S~^11A~kVk616~~~~A:iXv..=u94:BB^B11B^^~^6B6^~S~^Ehi*/..cX$N:A~S~}hi%uwX*u%i4dssB{1@lw..",
+"../,Xu%g:n111116k~~S~~k6E:ML%=W...cW=w%Lh:E1AkoVVVkVo3VABnhg9uW...vW=*QLOMnE6n:hOMMMM:1}A1nnNl=..cX%LN}oSoDMLQuw=,WW,,==UU==,/...cwuQgMn1nnhg$%uww*u9LOM:nn:h9Uv.vc=X%lNO:E66A6}E}kVk}MNLL$QzUv..v/U*%lLM:E66}}E}}k3DY$uU=c......Ww$g:AFFkEOLlQ9lgMn16kkD6nML%W.../Uu%LMn1111n:hhMM::E1n1n:OQXv.......v/Uwu$N}VFVDML%XU/v......../Xu%lNOMLQ%uuu%lNnnn:OgL9uUWv...v=*uQg:1111}1}}ADAAA}:LQuXU/........vWXuRgEDk}NL$Quuu%$$Q%*,v..v/X*|g!kFSVDE:E}D6E::EAFFk}M$wv.c,w%Lhn11EnnEE1}11E6kFS3DxLQ*/..vU%0MDV3V}hl%uw=Xu%lOMnnnn:h$Xv.",
+"..c,XufIx''e'''TmKCjjCme5'xIR=c...c/X*RI!'emC&8888&P88&jme'Y0*W...vWUufI_Y!'''YNIIII_!'''5'5Y|*vv/XR|Y;&8&KYI|z*UUU,UXXuzXXwU/...cXrRIx5e''YN|fu**ur|IY!E''!OfU...cUXz|I_xx'5''x!;mCj;!YIII0Rw..../UXr|I_x5'e'5!!;KjKpfuU,c......W*fIpjqq&;YI0|||Ix'mC&>&K;x_RU..v/UrfIY5ee''!x_IOIYx!'e''5_|*W.......c/UXrRY;&q&;Y0%zU/v........W*%0_x'5!I|%%rR0_5'5!_I|%uUWv...v,XR|I!'mme''E''}m)&j;_0|rX,........c,XrfI;&jKYI0|ff|lIII|Rwc...Wwr|Ipjq8&;p_!5'5'!Y;jq8&;Yfw..v,zf0!''e''5''''''eKCq8&jpIR*v..v=f0p;&8&;_I|%zX*zR0_!'}'5!_fU..",
+"..cUwz|N5TTTTTeTTT77777Te'5O|wc..vW=*R0Y'm)C&q8&888&88q&)mT5_f,.../=*r0Nx5eTT5!_O_O_x!EeeTTe5Iwv./*RIYKC>Cj'xI0R%*w*rR0000|9fwv.v/wRl_5TTT'5x_0$R%f|N!'meee'Y|=..vcUuR0_x5eTTe'55emC)m'5:xx_L*c...cUufN_!5eTeT'nx'mKKY|*=,c......Wr0I'jqq&m'__gIN_xeT)>>>)T'x|U..c,rr0O5TTTee5xx___x5eTT7e'_0RW......vc=wzR0YK&8qjpI|rw=Wc.......Wr|I!emme!OIILI_5mAT55_gfz=Wv.../UzR0_5T77me'''5em)C)m'xg0R=c......v,XzR0YmC>K'_II#0_!'''Y0rU..v/ufLYmCqq>K5x!5''5xx;C8P&K!I*v..,ufO5TTTTe'5'5'em7)>q8qC'Y|wc..cwRIpK&qqK'_N0Qfr$0_'TmmTT5_fUv.",
+"..Ww%$J{[ybyyybyyyyybyyyby<{@Q=...UziJs-2]]GZ]]ZZZZZZZ]Z]ZZ[+Jwv.c,u9id{<aayyb<+{{{{+[yyyyyb<@%vvW%iM+[ZZZHya+s@JiiiJ@{-<<+{4$/vcU%#d{aybyya-+s@@@ds+[2Z]2a-{#u..vWu9#@+-ayyyab<-abHHbbyybaa{$/..v,u9Js+[ayyyy[<--aa+:L%*U/.....vU%4s-H2]HHa<+{{s{+[yy22bZya+JU..,w9#@{aybyyy[-+{{+-ayyyyya+s#X......,=u%$4d+H(((2-s@#Quw=/v....vwi@+[22Z2[+{sds+a2Z2b<+sJQ*Uv...,uQJs+[yHbybya[<[yH22bba+sJ%,.....v,X%9#@Ba(]H-++{{{+a]H2<1#Xv.v=%#s+aG((]2<+++++++-[](((2+@%v.vX94{-yyybyyb--<ay2]G(((Z<B4%c..WQ#d{a222Hy-+s@4J@s+[]2ZHb<{Ju..",
+"..c=ui4{<byyybyyyyyyyybyyb[{49=v..,%i4{<ZG(GZyybbabbyyyZG(G2{JX..vUuQJd+<byyyba<{{{{<aaayayb-duc.,u$4s<yyybyaa{@@4J4@{abbab-{$/vcU%Js+[yybyb<+sd@@s++HZGGZa<@#Xv.vWuQJs+abyyyya-<<<[abyaybba{i/...,ui4s+ayyyyaa-++++s4$%XUc......UQ#@+ayyybya<+{{{++-yyyyyya+iW.vWuQJs+ayyyaab<+{s{<[byyyya+s#uv....,wu%$#@1+2G(tZ<s@#i9uwUc....vXi@+aZGGZa<{{s{+[ZZZa-{sJQu,v..v,%$Js+ayyyyybb<-<-ybyyby[{49Xv..../=u%i#@^a2GHa+{{{+<[]G][{#uv.v=QJs+[ZGGGb-+{{s{{++bHGGZ2+@%c.cXi4{ayyyybb-<++-aGG(((tZ[{4%W..Wui@{<yyyyyb<{@@@s{-HGGGZa+s#*v.",
+"..vWXu$JnBBBBs1s1s1s1Bs1sd@gQu/..v/w%lOEk~S~^11@:ddnnnB~SSFD:QW...cXu$#4d1sBBs@h4O4N@d1{B{BB@Lwv.cwu9#dB{BBBs@@glL#L4@@ssss:J%c.v,*Q#4nBBB{1@@Ng#NgMn6~~~^1hi%W..v/Xu9J@d11B6Bn4@@h@ddsBs{1sM%/..vWX%i4Md1sBB1d4hOONiQuUWc......./XzlJnBBBBBs:4N4O4h@sBB{B1sM%/../=u%i4@BB{Bsd@4JJJ@d1BBBB1@g%U...vvWX*u%9lO:A3S~DnNL9%u*U,c.....U%lh}~~~~EnOhJh:}~~^1:Jl9*Uc...v/X%9#@1BBBBsd@444@1BBBs1sM#%W...../UXuQ$#M6kk61:MMMhED~~~6:lXv..,u9N:}^S~k6:OJgLL#Oh1^~S~A:LXv.vU%9JdB^^B1s@4Mh:6~SSStSknOlwc..vUu9OdBB+BBsdhNNggh:A~S~^EhiuW..",
+".../Uu%LM:n1nn:::hhh::::MOL$uX/...WwulN:DFS3k}::hMMM:E}koS3}_Q/..vWwuQgM:nE1}E:h_N_Oh:EE11n:MQ,..cWXulN:n1nn::hOONgNMMnnnn:Mi*v.c/*%LOnB61EE:MhONNOh!}kVkDhLQuW...WXulgM:nE61}:xMMx:MnnEEE1:M%c...WXzlOh:E1}BE:hOgglQuX=Wv.......c,*RlMn111En:MOOMO_M:nnnn:hl*v..cUu%lO:1}61E:MggLNNMn6A66EML%,...vWUwu%$LIOx}oS3D!hgL$%uwUWv...v/*$gEDF3k}:h_ON:}Ak}:gL9uXWc..../wu9LMn161En:MONgOhn1EEEEhg%=v...cWUurlIN!}kVAE:xhhYEAoFV}N$w..vWw%lhEkFFk}MgLl$l$LO!DoFV}Mlwv..,u$g:116}E:hOLNhEkFSFS3D!L%*/..vWX%lM:EnnEE:hONO_hE}V3V}hLQ=c..",
+"...WUwz|N!5''E'xYY_Yx!xYOI0fu=c...Wwr|Y;&PP8&jmp!Yx!;mjq8P8jpfW.../X%0Y;Kjj&&jj;j;;j;jKKKm'YgrW..vWU*fI_x!55';;;;;;;;;5''!__|uv.vWz|Ip;j&&jjKKK;;;j;jjjKm;I|rwc...WwrIp;Kjjj&jKj;j;j;KKKKK;xYrc...,wrIp;Kjj&jjj;;p_I|RXUc........vWXr|Ix!';mm;;;;;K;;;;''xxI|w..v/Ur|Ip;j&jjK;pYIIYp;Kj>CjKp_fU...c,Ur|0IYp;j&PPP&j;pY_I|rXUc...vW*f0pmjCjKjK;;;;KKm;_I|%*UWc..../X%|_pKj&jjK;p_II__!emKjK;_0Xv...cUXr|Yp;j&88&j;m;KKj&88&jYf=...,zRIp;&P8&;pOI|R|0_x;&888jpI*v.vWz|Ipj&Cjj;pYIIYpmjqPPPjpIR*/.../UzfI_!';mKK;;;;;jjKKKmpI|%,v..",
+"..vcUwufIx5eemTe};'';''!Yg0Rz,c...Wu|Y'j&PPPqq>m'5!eK>8PPPP&'I,..v,*fI;&&88888P&8P&8qq>q>7;Y0r,.../=*R0N_x'eT)&&88q&C)mTee!g|*c..,%Ixm&8PP8q8&8P8888qC)me'I|r=v..v,z|Y;&&8888P&88888qqqqqC)exfW..vWr|YK&q8P88888&C;YIR*=/........./=rQI_x'mCqqqq&&88&77ee5xNf=c..W*R0x;C888qq>K'xx!mCqq8qq&KxIXv.v/Uu|N5';&&PPPPPP8>Km'5_0rU/....Wwr|Y5m7)&&88qq>C7m5_0fzw=cv....,*|I!K&PPP8qCmx_N_x';Cqqq&mxR/..vW=r|pj&8&PPP8qq&q&88PPP8jpfXv.vW*l_'jqPP8Ce!_0$|I!'j&PP8&mYrv..=r0!K&888P&j'Y_Y5ej&PPP&;I|z,.../=*r0_x5mC>>qqq&q&qCmTe!IRzUv..",
+".../Xu%i@{+aH2]ZZZZZZZH[+s@#Qwv..v=Q4{-Z((((((]2a--b2]((t(((aduv.cX%g1~((((((ttttt(t(((G(Z-{O9=.../UuQ#d{{-ay2](t(((GZyya-+d#uc..Uis+2Z(t((((t(ttttt(]ya[+@L%wv..vw$h+[(((((((ttttt((((((ZH[+JU..cX$M{2t((((((t((Za+@#zwUv......../w%i4@{+HZ((((((t((ZHyb-{@Luv.cU%#d-b](((((GH-++-2Z(((((]H-4w..vUui4+ab2]tt((t(t((2Haa+@iuU....,*9#s-bHH](t(t((2yb+sJi%wXc.....=%J{-2((((((Za^sss{+a]t((][+4X..vWuQNTS(t(t((((((((t(t(tt>{Ou..vw$4+a2(((]]H-{@J4d+a2((((][+i,.cw$@{H(((((t2^ss{<[2Gtttt71J%U.../X%$J@s+[]](](((((ZZHa<{4$%Xc..",
+".../Uw%$#@{<[ZZZtGtGGZZa+s4i%,v..v=%#s+a[]Z]2HH[+{+-a[2tZtZa-d%c.cX%#@^[Z[HZZ]Z]ZH2222H2aa{@JQU...v/w%iJ@d{+-b[H222aHba<<{@Jiuc.vWQ4{-<ZZ2]a2][]ZHZ[yb[<{dJ$%=v..cXQ#s~[222SZ]]]222Z[HHaHb[+sLXv.v=Q#1<[22Z22ZZ2H~+sJiu=cv........c,uQi4@s+-2[2H2222bab[+{@J$Xc../ui@{-aH]Z2H2-<{{^<[H2HHHb[{Jwv.vUu$Js+-[[2]](t]Z22bba+sJQu,v...Wu%i4{+-[[HHHHH2Ha-{@i%*=/v....vW%#d+<[ZZS2Za+s@4@@{+-2[2[<{LU...,w%J{7HZ]]2t22HHH22]]]]a<dLXv.v=%Js+aHZZ2a-+@Ji#4{<a[]HSa<siWvvw%#d^[ZSZH2-{d@d{<<[222-{4#%U...vWu%iJ@s+<[2[H2[H2aa+{s4#Qu,v..",
+"...v//=*uQlOn}^k^kkkkAA:gl%uUv....WX%$LOM_MMMMOO#LLLOMMxMhhhN$Xv.vWXu$#_hxxhMxMM__M_hMhMONL%uU/...../UXu%%iiNOh_MMhMhhJLi$%%wWv..vU%9g__hx:xx:___hxM_O#Li%uXU/...vWXu9#__MxMxMMxMxM:xMhMMOJL$u/..v/XuQN_MY:MxMM_hON$%*=c...........v,X*u%QLgO__MxMMMhO#ii9%uXW...vWu9LgMxhMM_hONLL#OMYMMMhhOi%W.../U*%iNJhM_OMxhx:x:M4J#9%*,c.....WXuu$iNO_MMx::MhOL$%uw,c......v/Xu$#O_x:MMM_N$%%%9$Lg_N_Ogluc...c=wu$#O__MMMM:MhMxMxMMM_N9u,..vWw%$#OO_hhhOL$%%%%$LN__MMOg9wv.v,X*$#_MM__hOL$Q$iL#O_M_gl%uX/...../X*u%%iNNO_MhxMMhOL$9uuX,c...",
+".....cWUw*uflOOx::::hhOl%uwU/v....cUwu%fllllLllQ%r%R9lllllll9uW...v,wzR$llLLLLLlLLlLlll|Q%u*UW......cW,,Uwur%%9l0llll9Q%u*XUU/...vWUuzRllLLLL#LL0lllQQ%uwXU=/v....cWXuR$llLLLLLLLLLLL0llll9%uUv.../UXuRllLLLL0Ll$QruUUcc............v/UUwwurRl$lLLLl9Q%uuXX,W.....WXur|ll0Lll|Q%urrfllLLlLlQ%=v...vWU*uR$$llgLLLLLgLL$Q%uXU/v.....cW=wXu%QlllLLgL$%%uXUW/........cUXur$llL0ll$%uXXwwur%ff$Q%u,v...c/,wur9lll0LLLLLLLLLLll$%uXc...cUwurQllll$9%uXXXuuzf9ll$QRu,...c=wuR$lll9lQ%u*uuz%Q9l$QuXU/......vc/UUXuuRR|lllll$%u*XXU,c....",
+"......vcUUXuzf||IIII|ffr**U,v....../=*zzrf|ffRRrzwuzzrfffRrR%*W..../UXzzfRff|||fffRffrRRz*X=Wc......vccW,=XX*zrRfffRRRzuX==,/c..../Uwuzrrff|||||fRfRrzuww=,Wc.....v/U*zrRR|||f|||||fffrfrR%z=,....c,=wrrrf|f|f|fRrww=Wv...............//,=Xu*rrRRfrfRrzww==/v.....c,Xuzrff|ff%zr*wzzrfrfffrrz,v....c,=*urRRR||||||0|ff%zwU,c......vcW==wzzrf|||||RuXw=,cv........cU=uzzrR|RRrRu*wU=Uww*rrrz*X/....vcWUurzrffR||||||||||RR%zX,v...v/=X*zzrRRRruw=UUXw*uzrRRz*X/...vW=wrrRfRrrzXwUwwX*rzRrz*UWc.......vcW=UwXu*rrrRRr%z*w=W/v.....",
+".......vcUUX*zzff|fffzrwX=,Wc......cW=wrrzzfrru*XXwXwzzzzrrr*=/....v,=Xz*rzzrrrz*zRRrrr*wXUU/v.......vcc/,==w**zzzzrr*XXUU/cv.....c,UX*rrrRRrfRRRrzruw*UUUccv....../WUurzrrf%rrrrfRzzzrzuz*XU/.....cU=*urzRRRrRrz**UWc.................c/,UU**rrrrruzXwUUU/v......v/UwurzrrrzzzXXwXXzrr*zzrzX,.....vcUUwz*rrrrRRf|RfRuz*X,Wv.......v/WUUw*rrrRRfRuwXU,Wc........../,U*rrRRRru**UU=,=UXXXuz*wU/.....c/UU*rzzzrrrfRfff%RRrr*XU/v....cW=**zrr*u*XXU,U=X**ur*z*wUc....c/XXrzzruz**U=UUwUX***w==/.........vvcWU=Xwzrrzuz*XUUW/.......",
+"......../UUwuz%Q9ll9QruwU,//v......v/=wuu%%Q%%*ww==uuu%u%%u%uUv.....c,=wXwuuuu*uuuu%%%uu==W,c............c,Xwuu%u%%u%u=U,,/c......vWU=*u%%%QQ%Q%%%u%uuX=,Wcv.......v/U*u%%%%%%%%%Q%%%u%*uzu*U/.....c,=Xu%%%%%%%9%u*XWv..................v/U=X*u%u%uuu*X,,Wcv......v/,wuu%%99%uu*X**uu%%u%uuu=/.....vv,Uwuzu%%9QQ9$Q%%%uuX,c.........v/,W=X*%99%Q%uuUUWc...........vW=wu%%%%%uuX=WWW,,XXw*uuwWv.....v/,=uuwu%%%%Q%Q%%Q%Q%uuX=/.....vW,wu*uuwuXUU,,W,=Xu*uuuu=W.....v/=*uu%uuu==U,=UXwwXu*wXW/............vWX*uuuuzzuw=,,/c.......",
+".........c,,U=XXXwuuuu=Wcvvv........v/WUXX=XwUU/ccc/,U=XUUXU,/v.....vc/c/c/cc//ccWXX=,U,/vv.v............v//W,=wu*ww,,cvv.v.......vvvW,===wwXwXXXUX=UUWv............vc/=XwuuuwXwXwuuu*XXUUWW/c......v/WUU=XXwXX=,UWcv.....................v.c,=Xu*uwXWcv...........v/WUU==X*XwUUU,,WU=Xu*w=W/v......vcW,UwwXw=wwuuuuw*wU/v.............vvW=wwuuXX=,/vv.............v/,U=XXX=UW/vvvv.cc,WWWU/v........v/UU,WUXXXXXXXXXX=U=W,cv......vW,XX=W/cccvvvvc/,WUU==UWv.......vWUX=uXUWvvvvcW/WWWW,//v.............v/WUUX=UUWcc...........",
+".............vvcvcW//cv................v..v.........v..vvvvvv.....................v.vvv......................v.vc/vc......................vvvcvvvv.v....................cc///c.v.vc//cv..vv..............vvvvcvv..............................vvcc/vv.................v...vccvv.....vvvv/cvv.............vv.vvc/,W//c/cc...................cvccvv....................v.vvvvvvv........v...v.................vvvvvv.vvvv.v.v.............v............vv................vvcc.......v.vv......................v.....v.............",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+"...........................................................................................................................................................................................................................................................................................................................................................................vvcvccvcvv.................vvc/cvv............................vcc/WWU,U,,W/v...........................v.............................................",
+".......vc////W,,,,////cv....................vc///////cv................c/////cvvvc//ccv.....................vc/WW//cvv..v.............v////WW,///cvvvc//cv................vccv.......vc//cv..............vc/cv.........................vc////cv.....vcc/cv..............vcv...vvv...v/W//ccv..........vc////cv...v///////Wcv.............vc////////////v................vW=uu%u%u%uuu=U/v..........vWUXwwu*=,/cv........................c,wu%Q99999Q%u=/v..................vc/WU,UU,Wc..........................................",
+".....vW,UXX=wXXX=w=XwXU,W/c...............cW,UUXUXUXUW/c.............vWUUXUUXX=U,UXU=U/c.................v/,=UXUwwXX,,UUW,cv........./,,X=w=wXwXXU=W==UU=,Wcv.......cW,,U,=UU,WW,,,,,=XXU=,,/.......vW,U,=XXU,,/ccc/W,,,,U,,c........c,=UUUXUU/cccc//UXUU=,,/v......cW,,U,=,U,,U,,,,,=XUXXU,/v.......vWUXwXUX,,,,,,UXXX=wUU,c..........vW,XX=wXwXwXXXXU==,,/v..........c,*u9i#JJ4##i%%*UWv........c,=uu%%%uuXXU/c.....................v/U*uQiJ444JJi$%u=/v................c,UX**u*wXUW/.........................................",
+"....vcWU==XUUX=XXXwU=wUU,WWv............v//WU==w=wU==,,Wcv..........c/W==wwwXwXwX=wXU=,/v...............vc/WU=XUX=XwX==UU=/c.......vvW==UUXUUXwwwwwX=ww==U,cv......vcWU=UUXXUU//WWUUUUUw=UUWWv.....ccW,UUUU==,WW/W//UUXX=XXU/v.....c//WUww==U=WW///WW==w=XU=Wc.....v/WU=XUX=XUUUUUUwU=w==wUUWv......v/UUU=wUwXUU,==U=UXUwwUU/........vc/UU=XU=XwUww=ww=UXU=,c..........c,XuQi#JJNJL$%uw=Wc......../UXuuu%%uuwU,cv.....................cWUwu%i#JM4L#iQuX,c.................c,=wX*uuw==W/v........................................",
+"...vWU=wXX*uuuuuu*u**XwUUUWWv..........vc/WU=XXX*X**XwUU,Wc........v/,=X**u*uuuuw*XwwUUU,c.............cW,==wXwuuuuu**XwXU=W/......v,UUXw*wuu%uuuuuuuXXXX==Wc......c,==Xw*www===U=UwXwwXXwX=,c...../,U=wX*wXXXU,=,,=UwwwXwwwXc...../,==wXXX*wUUU,=,==XXXXwXXU/...../,=wXwww*w*XwwwwXwXX**X*XUW...../UUX*w*X*Xww=XUXwXww*XX*X,v......v/WWUUXwuu*uu*uuu**XwXUUW........../UX%lgMM:hhNLQuXUWc.......v/U*%lLL$$%uw=Wc.....................cW=Xu%lgMMMhMglu*U/v................c,U*u%9%%uU,Wc........................................",
+"...c,UXzrRRffRfffRRrRrRz*XU,/v........v/,=w*zRRrRRrrzzwX=UWcv.....v/UX*zRRRfRf%rRRrrrzwX=U/v..........cWUXXzrRRfRfRfRRRrz*XU,c....v/Uw*zrrR%f|||R||RfRRRzzX=Wv....vWUXwzzrrrzzXwXw*rzrrRrz*XX/....vU=XzzrRRrrzzXUwUwXzzRzrrzzW....cWUXzzrRrzrzwXUXUXzzrRrRrzX,....cUXXrRRR%rrrrzzzzrRrrrRrrzXW....cUX*zrrRrrRzrzrzzrRzrRRrrzX/.....vc,==wzzrRfRfRfRfRRRrrrzXUc........vWwz|Ip;;m5!YI|%wU/v........WUz|I_!_I0Rz=W/v...................v/Uwu%fIY!;;;;pIfuXWv...............cW=*%|lII|f*U,Wv.......................................",
+"..v,XRflII__________IgI00frw,c.......v,X*rr|0Ig__I_OI0|RzzwU/v....c=zRlIII____Y___IgI0RRzXU,c......../UXzr|INI__Y_____IOI0|zX,v...c,ur0IO____Y__Y_YY___II0fzXW....W,zRlIIOIOI0|rRQ|LIN_IN0|fr=c..vWXu90INI_I#I$fRzrRQ0gIOIgIfz/..v,wR90IOI_NIl|RRrR$0IOINII0Rwc..v,Xr$0gI___I_gI0l0IgI_NI_NIfwv..vWXR|0IOIO_IOIL000NI_NI_INIf*v....cWU*RR$0I___________IOI0fzW.......vcUwrIpC&>C)TexI|Rw=/v......v,*fg!555!_#fzwU/...................v,U*R|NxET7)CCK;IRzU/..............v/XzR0_!!!_I|rXW/.......................................",
+"..Wu$4{<H[2[2[H[HaaHab[<{sJ$%=v...../=uQi4d+<a[HH[2a[<sd4#$u*W...v=%#d+-bHa22[2HaHHaa+{@#9%uX/......cU%$#4{-H[Ha2aHaH[22[<s#Q*/..cw%#d+[a2[[2[HH2Ha2[2a2[<@#%=v..cu%#@+a[2[2[+{dds{<<ab2a[+{4%,..cX9Js+ab[H[a<+@J#Jd{<aa2Haa+4*v.c*Q4s<[aH[a[+s@44@s+-bbHaa<{J*vv,*i4{<[H[a2[a[++{+<a2aH[2a<{i/..cu94{<[b2[H[H<+{{+-aa2[2[a<{#X...c=u%i@{+--[Ha22a2H[2aHHa-@#Xv....../,u%#s~Zt(G2Hb-sJiuwWc....../w%#d+yyya<+@i%*Xc.................vcXu9#@{<ay2Z((Z-1#9u=v............vUuQ#@{-222[+@#9uU/v.....................................",
+".vU%L@-2GG(Gt(tG((G(GHyba+@#Qwc..../Uu%iJd{<ay2GGG(GGa-{s4i9uUv..v=Q4{<yGGGGtG((GGGGHb<{@#i%u=v..../UuQi@s<HGGGGG(G(GGGG]H+@i%U../*i4BaGG(tG((GGG(G(G(GGG[+@iuv..Wui@B[]G(GG2y+{s{<bb2]GGHb-siXv.W*i@+bHGGG2yb<{@4@{-aH]]G2H<s%cvUui@+a2ZGGZyb<{s@s+ayH]GGZH<d%cv,%i@+[HGG(((GHa-+-H]G((GG2a-#,..cuLs<b2]G((GZH[++-2G(GG(G2y-@uv..WwuQJ{<byHGGGt(Gt((GGGGGa{J%c......cXu$#1-(((G2bb+sJ$%wWv....../=%i@{<bbyb-sJ9uX/................../=uQJ@{<by2GGG]as#Qu,/............W=%$Jd^aGGG2<s4$uXUc.....................................",
+".vWu9NEk~SSS~SSS~SSS~^BBsdJ9uwc..../UXu%i#4sB^~~S~S~~61:4L9uX/...v,uiMn6~~SSSSSSSSS~^Bn4l$%uXUv...v/UwuQgMEk~SS~SS~SS~S~~D:l9*W../X%l:A~SSS~SSSSSS~SSS~S~D:l%w.../X%L:D~~SSS~6nN44:1B^~S~^6dJQW..WX%L@1^~~S~^1d4lig4nB^~SS~^14uvv/*%#:1^~S~~^BdhJ#4:1B^~S~~^1Jwv./*9#:Bk~S~SS~^1::16~SSS~S~B:$/..vU%#:1k~SSSS~^1M:n6~SS~S~~6@LX.../Uuu$4nBB~~S~SSSSSS~SS~~D:luc......cWw%9OEVSS~^B14lQ%X,v.......v,X%iJ@@ss1@J9uX=c..................vWUX%iL4nB^~SSk}M9uwWv............/UX%$O:DFS~DnOi%*U,c.....................................",
+"..,XRLEkFSSSSSSSSSF~3k1nnhNl%u,...v/UuuQlgM:E6kFFFSFkDnMNL$%X,v...WwQgn}VSSSSFSSSFFkD:nNNLQ%wU/...v/UX%$LNEDVFSSSFSS~SSS3A!L%*c../XRl_}VSSSSSSSSSSSSSSSSFDxN%Uv../Xz|hDVSSSFk}MNLgMn}kFSFkE:g%U..cwu$MEDVSFk6nMglllN:E6VS~kA:L*v./U%lMEDFSFk61:MNggMn1k~SFkA:Lwv./XzLMEAFSSSS3DEMMxAkSSSSFk6:Q/...U%LhEkFSSSSVD:hh:AkSSSSFk}:lwv.v/Uw%lN:116VSSSSFSSSSSSSVDxl*c......vWUu|NEkFF3}:Nl%uXU/........vcXw9lOh:nn:L9uwU/...................vW=wuQlOM}kFFkENQuU,c...........v/Uwu$l:}VS3A:g$%w=/c.....................................",
+"..,wRIY;j&CCCCCCjCjCjK;'}!xI|%,...cUXz|IIY!''mKj&j&CjK;;;_I|zUv...,*fIx;&88qqC&&jjCKm''x__I|zUc...c,wz|I_!'KC&j&j&jC&&q8qjpIRz/../Xf0pm&q8q&&PPPPP8&&qq8qjp0R=v..cwz|_K&8qq&mp_I0I_x'jq8qj;xIR=..cwr|YpK&88&;!YI0f0IY'K&8q&mpIwv.WXz0_'Kq88Cm'!Y___Y5;K&88&;pIwv./Xz0_pj&88q&&;pY_p;j&q8P8j;xR/..vU%0Ypjq888&&;pYY!;j>q88qj;Yfw.../UX%0_5eTmC&&j&&&&&q888&KY0Xv......c,UuRIp&8q&pY0fzw=/c........v/=X%|g_x;;5Y|zX=,v..................v/W=Xzr0_pjqq&;IRr=,v...........c,Xz%0Yp;j&&Kp_IRz=,c.....................................",
+"../*R0_;m7))))mmTememmTTTT'5_|=v..WXr0N55eeeeememTmmm)C&Cj'I|wv..vWuR0!;Cq8qC)7mmmeTTTTee'!Nf*W..v/U*RN!5eT777mmmm7m)>888&'Y|rWv.czRI!K>8q&Cj&PPP8&K)Cq8qCp_|wv../Xr0!Kqqq>me!_IgI_!')&8qCexIRW../XR0_')qqqCmx_I00IO_'Kqq8>m'g*vv/wR0_')qqqCm'5555555e)q8q>m!I*v./wR|_'Cq88qC)T5xxxe)C>q88C;xf/..v,r|_'jqqqqC)e5!x5e7)>q88CeY0=.../XzfI5eTT7mmmmemmKCCq8qqjp0*v......c,wrf_;&88&;Y0RzX,c..........vUwzf|_'mCmp_|fzXW...................vW=wuf|_;&8P&;Y|zXW/.........../Xur0_5e7))77T5xIfzXWv....................................",
+".vUz9Os-bybybybbaa[ayybyyyya-4X..v=Q#d+bbybybyba[<aayH]((Za+@%/..v=Q#@+[Z(GG2Hbyabbbbybybyb+@9=..vU%i@+ayyyyyyba[bbyyZ(((]<B@9=.vUQJs<]((GZ2HZt((((22]G(G2-B4uc..W%l@+2((]]H[+{ddss+<]]((2[+diwv.Wu$4{<H]((2b<{s@4@s+<b]((ZH+@%vvW%i@+a2(((]Habbabbb[b2(((ZH+d%c.Wu$Jd+2(((G2Hba-a[aH2G(((][{fW..cuiJs<2Z((ZZHa[<<[bHZ](((2a{Lu...,uQJs-yyybybyyabyyH2]((G2+hQ/......c=zi4B[(((][+@#9uXc..........vUu%$Jd-2]Z[+s4i%u,v.................c,Xu%#4{-Z(((aB4$uXW.........v/=u9#s+ay2ZHHyyb<{Ji%X/....................................",
+".vWuQid+bayyyyb[<<<<abyyybyy-4=..vw%J{<y2Hyyba-<++-<[H22ZZa+s$W..vU%#@{aHZ2ZHyy[a-<bbbyyyyb<@iXv.vw%#@+aybyyyyaa<--[bH2GZH-{49Uv.UQ4{^2GGGZHa2((((2yy2G(GZ<{J%c..U%iM{a222Hyb+s@4@s{-bGGGZ<+@i=..cw94s+b22Z2[+{d4#4s{<a2222[+4uc.Uui4{-HGGG2ybay22HbbaZGGGGa+4uv./wQ#dB-2GZZZHybbbyybHZZ2ZH-d$/..cX%J@{[2ZZ2ybyb-<ayyy222]a+@i=v.vWuQJs<bbyyyybababbH2ZZZH[{4u/......c=%$4Ba2GGGa{@i%uU/.........../XuQiM+[2yb<{sJ9%=Wv................v/U*%i41[2G(([{4$%X,v........cU*%iJ{ayHHyybHyHb{4i%uU/...................................",
+"..c=*%iJ:11{BBd44JJJ4ds1BsB{n$W...=u$h1k~~^Bn44N##J4:n66661nM%c.../Xu$g:B6^^B1d@@M4@d1sB{Bs:#%W..v,*9#@1BBBBsn@@h44:@1666Eh#$u/../u%N:A~S~^1E6~SS~A11^F~~knN9wv..cw%LO16^B1n@hi9%Q$N:6~~~DnOi%W...,w9LN1B^6Bn:Jl$Q9LNhn6B^B:OQUv./Xu$#:6~~S^611^~~~611^~~Sk1hiwc.vWwu9#M:16^~~^^BBB^~~^6EE:O9Xv...,X%$NMnE16BBsndd16~~^6EnxO$*c...cU*%i4ns1sdnd@:d1^~~^}1n:L9=......../XuQOEkS~kENl%XU/.............WUX%9On1111@Mi%*U/v..................cWUuQgn^~~k}Nlu*Uc.........c,Xu%iM1^k6111B^k6:lQuX/c...................................",
+"..cW=u%LMhnnnnMOLLLlLNM:nnn:h$W..vWu$NEVFFkEMN$9%%QlgMn111n:M%/...cUuRlM:111n::hNNggM:n1Ennh$u,...W*ulOn11nn::NgNNNgMMnn::g$%X/..cXrlMAkFVA::}3FS3}x:}3FVAxLQ=v../Xr9g:n11nhNLQuu%RLO}kFVAhNQu/..v/=u9LMn1nn:gLl9r%$LO:nnEnMl*W../UuRLN}VSFkEEEkFSoAE!DoSFDENQU...cUXuRlgh:EkVk11EB^VoA:MNg$uUv...c,XzRLgM:n1nn:MM:6kk}:MgLQu,v...c,Xu9lO::MMhNhOM:EkV}:MOLQuW.......v/XufLEkS3D:l%*=Wc.............vWXuRlO::n::NL%*=,c..................v/UXRl_DoFkENQuw,c.........c,=*QlOEkk}:hMEAkAML%u=,v...................................",
+"..cU=rR0Nxx'''_II000I_x!!'''xf/..vUr|Y;&8qj;Y0|%rurfIY''ee'5Y|U...vWwz|_x'e;5xx_IIOIYx!'e''_0z,.../Xr0_!'e''x!_IIIII_Y'5!xIRR=/..cw%|YK&&&Kpp;&8P&;ppK&q&KY0fU...cUzfI!'''5YI0%z*uR|Y;&q&Kp0Rz/..vWU*%0Y''''Y_0|RRR|I_x'e'!_|R,../Uzf0Y;&8q&;p;&8P&j;;K&8qjpIRU...vW=Xrf0Y!;jq&KeemC&&KpYI0R*W....vWU*r|IIx!''5xY!pKK&mpYI|ru/....v/U*R0IYxx_____YpK&&KpYI|rwW.......v/Uz|I;&88jp0z*=/c............../UwR|I!!'x!YI|rXU/...................cUwr0pj8q&;IfuXWc.........vWXur0Y;&j;YYY;KjKYIRzwUc...................................",
+"../,Xr|Ix5eTAe5xOIIIOx5eeeee!0,...UR0!m&q8C;xI|RzrrRLxeTTTTe5IXv../=Xr|_ee77me55!xx!'5eTTee!0rW..v,wr0_eeTeTT''5!!xx!5ee'x_0R*W../Uz|I;C>>m!pK&8P8jp'mC>&Kp0R=v../Xzf_5TeTe5xI|RrrR0xmqq>j'I|*,..c,=zf0xeTTT5xYN00lI_xeTTTex0zW..cXrRIxK>8qC7Tj&PP8jmej>8q>;Y|U..../Uwzf0_xmC>>)mm)&q>K'YI0RwW....v/UXz|I_x'Tee'''e)>Cm'_I0RwW.....WU*R0gxYxxxxx!5eC&Cj!YI|RX/........WXR|_;&PP&;If*X=c..............v/XzfIx5eeT5xN|rw,v.................v/=*RIpjqP&jY|rw=c.........c,wrfI!mCCm!_x;)CKpI|RXUc...................................",
+"..cX%$4{+[aybb-+{{ss{-[ybyyy<4=..vu#d+H(((2[+d#$99$i@+ayybya-s%c.vWu%i@+ayHHHbbyb[ayyHHyyya+diX..v=%$4{<ayyHZ2H2Haabaaaa[+s4L%Wv.,u%Ld^[H2[-<~((tt2<-aH2a+n#$wv..,u$4{[yyyya+sJi$$#@^[((GZ<B49U..cXu%#d+bbybya-{sds{-[yyby[+@9Uvv,u$Jd+HZ((]H2Z(((((HH2(((Za{Mu..../XuQi4d+[H]]Z2Z]Z]Za+{@J$%,.....c=uQi@s+ayyH22ZZ]Z2[+s@J9uW.....,w%Q#4ds{{+-abybH2Z[+s@#Qu/.......v=%$4B[(((]-1#%u=c..............v/X%i4{+ayyy-+sJ9%,c................/,u%L:^](((~{xi%wW........./X%lJd{[HH[+{{-y2a+sJiz*/...................................",
+"..cU%$4s<abyyba-{{{{+<bayybb[JU..vuL@+[2GG2a{4iQ%%%#@{[yyyyyas%c..UuQi@+bbbyyybyayyy2G2Hyya{@9Uv.v,uQ#@+abH2GGt((G2bbbba<{s4$uU..cw%$i@s+++++2G((]~-++++{dJ9%Xc.vWui@{ayyyb-+@J$9i#d+aZG]2-s49=v.v,w%i@+[ybybba+sss{<bbbyab{49U..,u$Js^[GGGG2HGt(t(22y2GGGG[{J*v..v/UXu%#4s+ay2GG(GZ2b-{dJi%wWv....vc,u$i@{-bbHGGGGZ2a<{@#$u=/....v/Uu%9iJ4@s{abyyybyb<{@#$%=c......./*u$#1<GG(]<siQu=c...............cWu%i@{aabyb[+@JQ*=,c..............cwu%#d+HG]]H{JQ%*,.........c=u9J@{+[-+{ss{+a<{dJ$%=/...................................",
+"..v/wu$#4d1BBB1nh:h:dnsBsB{14$/...=9L:A~~~kng9%*w*u%iJ:@1s1snJuv..cU*%iMsBBB^+BBBBB^~~~^1s@J$u/..v/UX%iJ4n1^V~~~S~k^Bsdd:4LQuU/.../wXu%9LNOO:}kSF~6xOgLLlQ%*Uc...c=ui41B{Bsd4L$uuuQLhA~~V6:g$uW...v,Xui4ds1{1sd@JNJ4dsBB{1@4$uc..cXuQ#:6~~S~^^kFSSS~^~~~S~kBh$U...../UwXuQL4:16~SS~^6nhJ$%uwUv.......vW=u%iM1B^~SS~k61hLQuwUc.......v,=*u%$ig4dBB^BBBnMLQ%w=,......../UwuQNEk~~kEL%*Uc.................vWXuQ#@s1{1{:Ji%XU/c..............v,XuQgnD~~~}N$uwWc.........v/Xu%$LL4NLlllLJNJL$%u=Wv...................................",
+".../Uu%LgMn}DkD}E}E}EE111n:Mguc..vUzlOEkF3DxL%uw*wXuQLM::nnnhi*v../,Xu$OnB1166k^^D6^A6Bn:ON$zU/...vUXu%9Lg:E}DDDkDDDD}}EEYgRuUc...v/=Uwur9$Lg:kF3V}OL9Q%u*XU/c...v,u%g:En1nhN$%uuuR|N}kFVDxL%w/....c,u%lOM::nn:OLLLM:n:::hOl*,v..cUuRlO}k~S~kkDAoDAk^kVSSFk!gQU.....vcUw*u$lMn6AAkA}E:Nl9uXU/v........v,Xu9LOn}VSSoAnOLQuXUc.........vWUX*%$LNnA^^D1:MN$%*wU/......../UXXR0EkF3D!$%XUW..................cWUu%LgM:EE}M$u*UWv...............c=uRLxA33V}N9uU,c..........cWU*uu%%%%uuuu%9%%uX=Wc....................................",
+"..vWUrR0_Y;jq88q&q&&&Km''5xO0*c..vUz|Y;&qqjpI|%zuzzR|IY!55'5Y0Xv.v/UXz|I!eem)&&qqqqCKm'x_0ffuUc...c,Xwzf|IIY!!'};m)&>&&&&;YRr=/....vW,UXXrr|Yp&q8j;Ilfruw=W/v.....WuRIx''}xYI|ruwz%|Y;&q&KYIfXc..../UUz|gYxx'5'Y_II_!'5xY_0|u,..../wr|Y;&q8qq&jmp;;K&q8q8qjpI|U.....v/UXur|I!''mAmAe'5Y0RrXUW.........v/Uwr|IY;&&8&;YI|%*=,c.........c/,Xu%|I!;jq&j;YI0|%zXUW........c,w*RI;j8qjp0R*U/..................cWU*r|0I_;jjpIR*=Ucv..............cU*%IpKqq&;IRrw,c..........v/WUww*uXw*wXX*uXXwU,/v....................................",
+".../Xz|_x5m&8PPP8P88q>77Te!_0*c..vUf0!K&88&e!O0|9ff0I:5TTeT'5I*v.vW=*rlx'T77>>q8888q)eexNI|RzX/..vcUwzzf0g_x!55eT7Cqq88qqjp|rX/.....v/,=wuR0Y;&88&KY0Rzw=,Wc.....c=z$_5TTTe5_LRrzrr|YK>qqKp_|zW....c,wz|Ixx5eTE5x_x5eTe55_g|z,v..v,zfI!Kq8888q>mA'mCq8888q&mYfw.....vWU*r|I_5eTTTTTTTex_0RzX,v.........cUXR|Ix;&8P&K_I|R*U/v........vc,wwz|O!')>q8Cmx_g0fz*X,c......./UXr|I;>88C;IRrX,v..................cUXrf0O!mCCmY0RzwUv.............v,Uzf0pjq8&jY|rXUc..........vv/W,U====U=UUU=w=,W/v.....................................",
+"..c=%$4s<aH](((((((((Gyyya+s4u/../uLd+2Z((GH-+{s@@@s+aayybya-s9/.vU*Qi@+[HHH2(((((((2Haa+s4i9uW...,w%$#4d{+-<[yyyb2G(G((G2+n#%,......v,wr9i4{[G((GaBd#$%X=/v.....W*$4{abyyba+sJ#$iJd+[((GZ<{49U...v/XuQJd+-ayyba-+-ayyb[<+s#Q*c..cXQ#d+[((((((G2bba]((((((2aBJu...vW=u%$#@s-ayHHHyybyy-+dJi%u/........v,*u$Jd+2t(((2BdJ$%*Uv........cU*%9i4{[a2G((ZH++{@4#$Q*,......./X%$4Bat((G<BJ$uXW..................v,u%L4d+[2Za+d4#Qu=c...........v,u%$#s-2((ZaB4Q%wW............v/,W,UU,,,U,,UXXUWv..........vvvvv////Wcvvv////Wcv.......",
+"../=%i4{-[HZG((GG(GG22yyaa{4iuc..cwi@B<ZZ2HHHa++s{{+-yy22yyy+4%cvcUu9Ld+bbHHyZZZZGZGZ2ya+{@JQu,..vWu%#4s{++<-ababyyZ2GGGGZ<sJ9U......vWwu%lJ1<G((([+@J$u*,/v.....Wui4{<yyyb[+s@J##4d^HGGGH-s49U....c,X%i@{+ayyya<<abyyy<+s@#QUc..cw%#@+aZGZt(GGHbbyHG(GGGZZ-{JXv..cUwuQiJs{<yHyHyyyyyyb+{@#QuU........./X%Q#dB[G((G[+@J$uwWv.......v,Xu%9#d+by2]G]Za-+{+s@JiQ=v......vUu$#1[GZ(]asJ$%XU/................../=%%#@s<byb+{@Ji%u,...........v,u%i4B<Z](t[{J$%*,...............vcccv.vvvccc//c.........vc/U,W,,===UU,W,,===UU,,,,v...",
+"..cWwu$N@@16B^AB1}1}En:h4Jl%uUv..v,uQg:16^^^^^1::@:d16~~~k1:Jlw..v/=uQih1B^^B^B6nB66k~^B:4g$%XW...Ww%94:n@d@4@4d:n116^~S~DEN$u,.......cUXu%$OEk~SkEMlQuw,/c......cXu$JnB{Bsn@4ll$$LN:6~~~Dng$uW.....c,XuQiJn6^^BddnB^^B:JiQuw/...v,XulOn6^^~~S~61n1^~S~~^66:#%W...c=Xu%iL4:1^~^61116^~Bn@gi%u,........./,Xu%lOEkSS~}hLQuXUc........v/,Xu%9gn6~^^B61nhM@n@M#$%W......../=uQNE~SSkEN$%*UWc...................cUXuQLh1B1:4g9%*U/...........v/Xu%lOEk~~k}Ml%wWc......................................vc/W,===UXU====w=XXUww=UUW,c...",
+"..c=XuQLOhn1}1E:::hhhgLl%%u*UWv..vWXz9g:n1}kk^}n::nnEAVFSAEOl%W.../Uu%lOn111En:xhM:}AkkE:ONl%*/..v,u%LNnEn:hNNNgONhhEAVFVDxLQu/......v/W=X%lgEkFSk}gl%uUUWc......cWu%LMnnnnhMgLLlLLgM}VFV}ML%Xc......c,Xu%lM}kD}:M:}kk}O$%*U/v...vcUurLM116kVVAE:M:}VFk661nM9uW.../Uwu9LOMn}kVDE:MnAkk6EMhg9u=v........cWwuQlNEkVFk}O$%uwU/.......vcWU*uQLOEkkkEEE:hMh:nnnMl%Xv......v/Uu%L!kFFAELluX=,c...................v,=XulN:::hNLl%*U/...........vW=Xufg!D3FV}IQuX,c......................................vW,,=UXX*uuu*XX*u**uu**w=wUc...",
+"..cUXr|Ixx';T;'!!!YY_0|rzzUUW/..../UXr|YY';m&Cm;;;5';K&&&jpYfr,...W=rfIY'mmm;xxY_YY;KjjK'p!I|%W...Wz|Ix;mm'!______YYpK>qqjpIRz/......vWUXz%0Y;j88j;Y|RrwU/c......v/X%0_5''5!xY_IIIIYp;&&C;Y0%*c......vW=wufY;KKm;;;mjKpIRzw=/v...vW=uR0Y'emmCCK'Y!!;C&&mm5!_|w/.../XuR0Yp;;j&&Kp!Yp;&&Km;pYIR*c......../UXr|IYp&P8&;Y0fuw=,v.......cU=rf0Ip;&&jm''!xY!'me;'Y|*v......v,UzfIp&qqj;_0fuwU/v...................cUwufIxx!x__0|u=W..........vcWwur|Ip&qq&;I|u=Wv.....................................vcUX*zzrRf||RfR%rfffRfRRrr*w,...",
+".vWw%|O5'Tm)C)me'55x_0fr*w=,/c....c=wr|0_xem7C>&C&C7TmKKKK;xIfUv.v,ufIx;)CCC)m'!x_Y'mC)C7CK;Y|wv.vXrIYmC&&jm5'55555emCq8q);_|zW.....v/UwzfI_pjqP8qK'x0Rzw=/v.....v,Xrf_5eeeee'555'5'em))7;Y|rXW......vcUXz|I'7)CK&CC7m5_|rX,Wv....WUzfI!Te7C))m'5x5T)CC)77eY|z/..c,zfIY;j&&&&)me55'm)CCC&&K'_|U......./UXr|Ix;j&PP8jp_Ifz*UWv.....v/=u|N!'mjqqCmTee''emC>Cm!IrW......c/=zRY;&88&m'x#|zwUc...................c,Xz$Ix5eee5!g|z,v.........c,Xuf0_5m&q8&K_|rX,c......................................,*%|0LIN__h__O_O____x__OI0Rwc..",
+".vU%i@+[yyHZ]ZZyyy[-{@L9uu,Wv...../Xz$#4s+-bH](((tZ2yyyyyaa+s4Xv./wQJs+a](((2Ha[+{+-aH2]GZZ[+@%c.cuJs^2t((t2yyybayayy](((]<B49U.....WXu$#@{<bZt(((Z[[{4#%u=/v....vUu$Js-aybybyyyybbbbHHHy[{J$*/......v/w%$4s<y2G(t(]2b-s4l%XW....vUuQJs<yy2H2bbb-+-bHb22Hy[+@QU../*i@{-tt(((ZHb[a[[bHHZ(t(Za+4u.....v/Xu%i@{-a]((((2b-{@i9u=/.....Ww%$@+[byZ((]HyybyyH2GZ]H-s#U.....vWXz9#1[((((2a[{@#Quw/..................cUu9#@{-ayyb<{@i*,........v=uQ#@{<[2G(((~{O$%X/.....................................cui4s{+<-aab[-[<-[<b[bbb<-{@$,..",
+"..,%i@+ayyyZGG2byab+{@i%u=,......./X%QL@s+<byZG(GGGZb2byyya<s#*cv/uQJs-H2GGG2yya+{{+bbHZGGG2-s%c.cu#s+2t((G2yybyyyyyHG((G2[sJQU....vW*%iJd+[y2(((tZy-{@#QuwUc....v=u9Js+aayayybbbyyyyyyyy<sJ9*/.......c=uQ#s<abZ((GZHa+d#$uX/....vWu$Js<yybybyb<+<[byyybyyb{4Q,..,ui@+aZ(((G2bba<<[bbyZG(t]a+@uv....c,Xu$#@+ay]t(tGZb<{@#Quw,c...v,w%id+byyHGGGbyyyybHG(G]Z<siX....../UuQ#1aZ(GG2ya+s4i%uU/..................WX%i4{<byyyb+@i%W......../=%iJ@{<y2GG(][{4$uXc.....................................,%L@{<<ababyybbabbabbyyab<+siw..",
+"../X%l4sB^^~~~^BBsdM#9%X=/v.......c/=u%iNhB^~~kk^k~~~~~~^^1:JQU..vUuQ#h1^~~~^B1@4gJMd16^~~k6:guv.v=%L:AVSS~6BB1BsB1BB^~~k6:LQw/....v/Uw%$#4nB^~SSF^Bn@L$%XUWv...../U*%iJ@dsB{B{BBs1BBBBB1dg9uW.........cU*%9OnBk~F~kBn49uuU/c...../Xu%#@nB+BBB1@M44n{B+BBB@4$wc..cXulNEAFSS~^B1d@@d1B^^~S~k1:i=.....v/U*%Qihd1^~SS~kBn4l$uX,c...../U*%i4nBB~~~k6BB{1BB^~~~A:g%/......c,=u%NEk~~~6Bn4gi%*XWc..................cWXuQi@1^~~Bnl%X/......../U*%iNMnB6~~~kEgQuXWv.....................................Wu$i4@@sssssssssssssss{ssd@g%=..",
+"../Xu9OMn1BB^61EnnMgL9u=/cv........c,w%lLMEAook66^V~SFFVVkEMLu/..vWX%lNE6Dk^61:hLLLLOhn6D^DEM$*v..Wu|NhDADA61nnnnn111B}A}:NQu,v.....vUXuQlN:EAAkkD}EhOL$uw,/c.....c,X*%$LN:n111nn1nnnn::Mg$uXW.........c/U*%LM:6Dkk}:Ml%XUWc......c,UuQg:nn11n:OLLgM:nn1nnhL%Uv../UzQNhEkkkk61:hNNMhnBDkkDD:N9=....../=Xu9Lg:1}AkoD6E:ML$%*U/.....c,=*%LhnnBAkD1nnn1E1AAkAEN$wc......vWUw*lh}kk66n:ML9u*=Wv..................v/,=ufgxk~VDxluw/........cUwu9LN:n6ADkA:0%*U/....................................../uQLNM:nn111n1nnnn1n1nnnnnMOQU..",
+"../Xr|Ix'eeemTee''xN|R*=cv.........c,Xz|IY;jq&&mmK>q88qqqj;_0z/.../XR0I!5eeme'5Y0||l0I_''e;!Y0wv.vWw%0Yp};}'5eeee'''''!xYI|r*,......vWwuf|O!'em}m6e'!_0|%*UWv.....v/U=*uRl_!}'e'ee'''!x_I0%XU/........vc/Uwr|Ix'}e}'YI|rw,c.......vWUXR0_x!!!!_I0|0_!!!5!!_fRU...vUz|IY'}mmee'xOIIO!'eeeme'!I|U......cU*zfI_!5eemmme5!YI|%wU/.....c,UuR0_x!'emee'e'e'eTee'!I|w......../Uwr|I''me''5YI|%X=,c..................v/W=Xr0pKqqKp|uU/........cU*rfL_x'eTee'_|zwU/v...................................../z|I_!'}e;'e}ee}'}e}e5}5''x_f=..",
+"../Xr0O5eeTeTTTTT'!_0f*U/..........vWwRlIY'&qqC77)>qq8qqqCm!Izc...WwR0_x'TeTT'5_0ffRfIO!ee55_0*v.vWur0_!5'eeTeeTeTTTe5xYII|rX/......cW=rr0I5eTTTTTTe5xI|r*=Wv......vWUXur|I5'TTTeTeT'5x_I|r*Uc.........cW=Xr|IY5ee'!xg|RXUc.......c/Uwr0_x5!5x_I|||Ix!!!x_I|zWv..vWz$IYx'TeTee5_II_x'TTTTT5!IfU......c,X%|0_5TTTTTTTe5xI|RzU/.....c/=*f0_!5eTTTTTTTTTTTTTe!If=v.......cUur|_'TT7TT55_LfrX,c...................cWUwr|pC&>jp|rX/.......vWX*R0OxeTTT7Te!0f*=,v.....................................WrL_5eT7777TTTT7TeTeT7T7TTex0=..",
+"..W*QJ@{+a<[<aa[a+{@Ji%X/..........cUu$#@s-[ZZHabbHZGZG2Z[^s4u/..vUu$J@s{<-[<+{@Ji$i##d{+++{@#*v.c=rl#@s{++--<aa[bb[<+sd4#$%X,......c,w%9#@{+[[b[a[-+s4#$%=Wv......./Uuu9i4s+-aabbaa-+s@Ji%w,v.........c,wu%i4d{+++{d4iQuXW.......v/=%Q#@s{{ss@J#iJ4@ssssd4i%,...vU%L4d{+<aa[<+d@4@s+-[a[<+s4$X......cXuQ#4d+-[[a[a[<{dJ#9%X,v....cWX%94@s+-aababaab[aaa[<{@iXv......./Xu$4{-ayybyb-{@#$uX/...................c,XuQg1-Z2-1#$*/.......cUuQ#4{+ayyyyb[+4i%wUc.....................................U9@{-byyHybybyyyyyyyybybyyb+4u..",
+"..c=%9i4@ssssssssd4i$%uWv...........W*%$i41{+++++-<aab<<<{@Jiuc..v/*%$i#4@sss@4i$%%%Qi#J4@4J#QXv..,u%$l#J@dssssssssssd4#iQ%*X/......./=u%QiJ@sssssss@JiQ%XWv........vcU*uQiJ@ssssssss@4i$9u=c.........../,w%Qi#4@4@J#$QuU,c........cU*%9i#J4J#i9QQQiii##iii%*Wv..c,uQiiJ@@ssss@Jiii#4@ssss@Jiuc......v/wuQ9J@sssssss@4iiQ%*=/v.....c/Xu9iJ@dssssssss{ssssd4i%X........cWu%id<abbbb[+s4#Q*Uc....................vUX%$4ds{s4i%*/.......vWu%i4@+aaabab<sJQuX,c.....................................U94s+[aayyyyyybyyyyaybybya[{#Xv.",
+"...c,Xwu%%999Q9Q%%%*XU,v.............c,X*u$LgLLiLiJJJ4JO#iQu=W.....c,Xwuu%%9%%uu*wwwwXuu%u%uwU/...vWU**uu%%99Q9$$$9QQ%%uXUU/v.........vW=Xwu%%99999Q%u*,,/v...........c/UX*u%%9Q9999Q%uuXXWv............vc/UUwuu%u%uuXXUvv..........v/=X*uuu*u*wXXXXuwwuw*X=W.....c,=w*u%%99%%%uuuwu%%%9%Q%u*W.........WUwXu%%9Q$Q9Q%uuw=U/v.........c,=uu%%QQ9$$$i$9$$9Q%%u=/.........vUXu9iJ44JJ#i$%uwWv......................c,XX%Qll9%*XW.........vWUu%QiJ4M4hJ#$%XUcv....................................../X%$i#J4M4h@h@@:@:@:@h4h44#iwc..",
+"....cWUUUwww*wwwXw==,/v..............vcUUXu%%Q%%%%9$l9$Q9RuXU/.....vcWUUXwwXwXwUW//WW=UUUXUX,/......//U=XXX*X**wXw*wXXUU,Wv............v/,=Uww***wXwXU,Wv.............../WWUwX*w**wXwXU,/cv...............vv/U,U=XUUU,Wc.............vcWWUUU=W,UU,/,WUU,,/W/v......v/WUU=XXXXXUXUU=UUwXX*XX=Wc.........v/W=U=w**w*XwXUU,Wc............v/WUUXw**XuuuuuuXXwXU,c...........cWwXuu%%%%u*XUUWv.......................vc,=X*uruw=/v..........c,U=*u%%%9%%u*XU/v.......................................v,=wuu%%QQQ$$l$$l$l9ll$Q9%%w,...",
+".....vc,,UU=UUU=U,Wccv................./UUX*rruwwur%RrRzzww=Wc.......vcW,,,=,,,Wc..vccW/WU,,Wv......vvcW,UU=UUU=UUU=U,/ccv..............vc/WUU=UU=U==Wcv.................cc/=U==UU=WWW/cv...................vcW/,UU,//cc...............cc/,/,/cvvv..vccvvv..........vc/W,,,,,////c///,,W,WW/v...........vc/W,,=U==U==,//cv..............v,UU=U=U=U=UUUUUU,//v...........c/=UXX*u*ww=U,Wcv........................v/,=XXwX,Wc...........vcW,=U***u**X=,/v........................................vWUUUX**uzzuzzrurzzz*zzzu*wX,...",
+".......vc/W/,,WWWW/c...................ccW,UUwUU=U*w***wwX,/c.........cWWW//WW//v....cvccc//c.........vvvcc//WW//c/cccv.....................c//,,W////c...................vvv//c//ccccv......................vvcccccccc..................vvcv........vv...............vv..vvvvvv.v.vv.vv.v...............vvc//c/c//c//cv.................vc/cW///W///WW/ccv.............vcW,,UXXUXU,W/v..........................c/W/,,,W/v..............v//WU=X=UU,W/c..........................................vcWUUUw=UX=XXXXXXXX=XUUXUUWv...",
+"..........vc//c///c....................v.cW,/WW/WW,UUUUWW,/v..........v//Wc/ccvcv....v....................vv.vv..............................vc///ccW/c.......................vvvvv.v.........................v.vv.v..v.......................................................................................vvcvcv.vv....................vvvvvvccvvv.v................c/W,,W,U,W,/vvv..........................v/////cv..................vvcWWU,W/cv.............................................v/WWUU,U,,WUW,U,U,UU,U,W/....",
+"..............v.....................................v..v..............vvvvvvv..................................................................v..vvvvv.................................................................................................................................................................................................................vvv.vvvv.................................v.v...........................v........................................................v....v.v.v...v..........",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+".................................................................................................................................................................................................................vvvvcvvv.......................................................................................v...............................................................................................................................................................................................................",
+".....................................................................vvcWW/Wcvv..................................................................vc////ccv....................................................v/WU,=,=U,,/v.........................................vv/////cvv..............................v/WWW/cv...........................vc//cv.................vc/W/W/cv..........................vv/WWW/W//v............................................................................................................",
+"..............v//W//cc.............................................cW,XXXw*wXU/c...............................................................v/U=XXXXXU,W/c..............................................c/,UX**zuz*z**XUWc.....................................v/,UX**z*XU,cv..........................vc,UXXXwXUWv......................vc,UXwXU,,cv............cW,UX*z*XU,Wc......................vc/UXX**zwXXUW...........................................................................................................",
+"...........vW==*uuuuX=/v..........................................WXu%%$i#iii%uwWc...........................................................vWX*%%$i#iiQ%uw=/...........................................cWXu%9ii###J###i9%*=c...................................v,uu%Qii#i$%%*U/v......................vcUwu%%9$$$%w=/v..................v/=u%QiiiQ%u*U/v........vW=*%Q$i#iiQ%uX/...................vc,uu%ii####i$Qu,c.........................................................................................................",
+"...........W=uu%Q$9Qu*U/v.........................................Ww%$iJ@@ddJiQuw,c..........................................................W=u%Q#4@d@4Ji%uX,..........................................v,XuQ$#4@@ssss@@4i$%XW...................................v,uQii4d@d4iQ%uXWv.....................vUX%Qi#J44Ji9uXW................../=u%iJ4@@JiQuuX/v......./Uu%$#4d@@4iQ%u=Wv................v/UuuQiJd@sdd@4i%u,/........................................................................................................",
+"..........vWUuu%Q99Qu*=,c........................................./X%$Lh:}EnOl%uU,/v.........................................................WU*u$g:n:MM#i%wUc.........................................vcUXw%QL4M:n666EEnN$uw/...................................vWu%igMEEE:L9u*=Wv.....................c,XuQ$N:EnML%XU,v................cWUw%LxEEnML9uXU/v.......cUw%$M:}nnMLQuwU/v................v/,Xu%LNnE1}BE:l%XU/........................................................................................................",
+"..........c=XuQ$LLLl9uX,/.........................................W*%LM:DkkAEg$zw,/c........................................................vWX*RLx}A}n:ML%uUW.........................................vW,=u%LM:n1DkkVVkA!L%Xc...................................v=u$N:}DkA}h$%*X,/....................v/,w%$O:}VA}_%u=Wc...............vcW=uQY}DkAEO$%w=Wc......v/=uRLEkDk}nNL%X=W/v...............vcUu%$NEDkoVoA}NR*U/........................................................................................................",
+".........v/wr%|I_xYI0fuU,v......................................../wRI!;j&&jpY|%*=W/v.......................................................c,XzRI;jCm;'x_|zU,........................................v/UXX%|_x;;mj&&C&&KpIrw/...................................c=r|Ypm&>C;pIRuwUWv..................../UXR0Y;K&&jp|zw,c...............vW,=u|pj&&j;Y0R*U/c.......cUufYpj&jm;xI|uw,Wc...............v/Xzr|Ipj&&qq&jYfrUW........................................................................................................",
+"........./U*R0_pmKK;xIfrX,c.....................vcccv............v,zfIYe7)>)exO|R*UU/v...............................v...................../UX*R|I'm)7TTexIfz,v...................vvv................./WwrR0!'m))C)))))K;p|zw,....................vvcv.........../Xr0_5m)C7m5_0RzwUWv...................,Ur|I!e7CVmp0RXUc.............../WX*R0xm)>)e!O|rw=c......vWUzfI;))77T5x|R*X,/cv..............cU*f|I!m)>q8qKp0R*,v......................vcvv............................................................vv...............",
+".........Uu9Js+H]t(]-{@i%XUc.............v/WWWUW=XU=,/v...........U%#@{-HHHHy-+@#$%uw=WWcv..............vc/,,,UUUUU=UU=UW/c..............cW=*u9i@B-aybyyy-sJ9u/..........vW,U,UUUW,=U,cv............c,XuQ#@{[2Z(GZ2HHbba+n#9uUv.........v/W,,,UU,U=U==U,,WW/v....,ui4s+yy2yHa<sJi%uuUWcv..............vcXu$4s-byHbH+d#%*/............./,Xu%$Jn<aHHbH-{4$uXW......v=*QL@+bHbHya+@i9%*X,=,WWc........../=z9L@B-a]G(G]-:#%u/............vW,,,U,UUU=X==UUUUWWWc........v/,,,UUUU,U,U,U,,U/v..................vW,,U=UX=,UW/v.........",
+"........v,uQJs<[]t(ta+@#%uX/.........../W,UX*uuuwuuuuX,/cv.......vU%i@{<bbbyab+s4i9%uu*UUWcv...........cWUXX*uuuu%uuuuu*uX,Wc..........cW,U*%%$J4s<ayyyyba{4i*/.......v//,=w*uuuuuuuuwX,c..........cWU*%iJs-a2G(GGHyaa<+{@#%u,.......v/W,,Xw*uuuuuuuuuuuuu*U,c..v/uQ4s<ayybbb-+@#$QuuuX,/cv...........c,u%i4s[abyya+@i%u,v...........cWU*uQi4s<ybyya<{4i%*W......v,u%i4{-byyyb<sJi%%uuwu*XU/.........c,u%iJs+aHGGG2<sJQu,v.........vW,=X*uuuu%%uuuu%uuuu*U,/......vW,Xwu*u*uuuuuuuuuwX=W/cv..........c/WW==uuuuuwuu**X,W/v......",
+"........./UuQN:}~SS~}hgQuU,c.........vv/WU=wXX*uX**XX===Wcv.......cX%9J:sBBB1sdM#$%uuw*XU=W/..........v/U,XwXw*uu%uuuuuXXXUWcv.......v/WWU=Xu%%$#J:d1BBBB@JQu=v.....vc/,,,=X*wuuuuw*wXUU,v.........cW=Xu%iJ:1^~S~~61dd:4Ni%XU/......vc/,==ww*wuu%%uuuuuwXXw=Uc...cUuQL41B{BBsd4gi9%u*XU=,Wcv..........cWUu%$JhsBBB14L%*U/............c,=wu%$LJ:1B{Bn4J$uXU/......./UwulJMd1BBBd4l%uu**XwwUU/v.........vW=u%LNn6~S~k:lQuUc.........v/UUXwXXwuuuuu%uuuuuu*w=Uc......cW,=X****XwXwwwXw**wUUW/v........vcWWU,XXw**uuu***X=UWWcv.....",
+"........v/UXzQIEAkVAEhL9uwWc.........v/W=wuuu%%%%%%%uuXUUWc......./XuQlOn111n:MOLL$%%%uw=U=,/v.......v/U=wwuu%%%QQ$$$%%%u*XUWc......v/WU=Xuu%%llLOM:n111n:LQu,v.....cW,=Uwuuu%%QQ%%u%u*wU,c........c,X*u%lO:n}kkkAE:MMNgLQuXUc.....vcW=UUX*uu%QQQ$$QQ%%%%uu*=/...v,X%lg:n11nn:hOLl$Q%uuX=,Wc........../=w*%lgM::1n:O$uXUc...........c,UXuRQlLOMn11n:MLQuw,c.......c,w*%LOM::nn:g$Q%%%%%uu*wUc........../WXu%LM}oS3D!l%XU/.........vUX*uuu%%%Q9$QQQ%QQQ%%u*U,v.....cUXuuu%%z%u%%%%%%uuuXU=W/v.......v/,==X*uu%%9Q%%%uu*X=UWc.....",
+"........./W=zr|Yp;K;p!_|uUWc........v/,UXr%|||gIII00|fR*w,/v....../U*%0_!'ee''!xY_IIl||%zXX=Wc.....v/,=XXz%||lIIIIIIII00|fuwUc.....v/,=X*u%|0II__Y!5''ee'!IRuW.....cW=Uw*z%||0IIII00|f%*X=Uc......vW=*R|0Ix!eem7mm''!x__I|rX,c.....cWU=w*zR|00IIIIIIIII00|RRz,...v/UzfIx'ee''!xx__II0|%zX=U/v........v/UXzf0Ix!'5!xI|uwU/v.........v/=wzR|0I__!5''x!YI0rXUc.......c/=XR|N_x55'xII0|$0|0f|fzX/..........v/UwrRI;&qqjp0R*U/........cWwr%||0|00IIII_IIIIII0|%*X/....v,*zf|$0l00||00I000|frXXUWc......cW,UX*u%||l0IIIII$RR*w=W/.....",
+".........cWUwrfI!eeTe'xIRzUc........cWwuR|IN_xxx5!!x__0|zXU/......cUzRIxeTTTTeee5'55!x_0$frzXWv....WUX*R|LI_xxxx55555!xxxI|R*,v....W=*%9|LI_x!55''eeeTTTT5_lzUv...vWU*%9flIxxxx5!x5xxO0|fzXXWv....cUXR0N_5'Te77)77ee'55x_0%*U/....cWXrrQ|0N_xx!!55!5!5!5!xO0f=v...WwrlI5eTeTee'5'55!x_I|fr*=c......../UwRfL_!5eeeex_0R*=Wv.........c,wr|N_x:55ee'ee55xI|rX,v......c,UzfIxx5eeT5x___xx!__OI|z=v........../U*r|Ym&qqCpIRrwWv......./XrlI_xx!x!5''5555!!x!x_0|z=v...WXrlI_x!!xx_xx!x!xx_g0|RzXU/....vWU*%9|lI_xxx!55!x__0|Rz*,/....",
+".........cUXu%$@B-[aab+s#Q*W......./U*%i@s+-aaHbHbbaaa+@#QuuWv...v,u9#s-byybHHHHHHHbbaa<{s@#Q*/...c=%Q#@s+-<byybbbbyHaHab<{4iuW.../w%$4s{+a[ybHHbHHHH2byy[{49wv.../*%i@s{+-abybyybbb[-+s@J$%w/....Wu9Js+-ay2HHZZZ2Hyybb[+d#%*U...v,u%#@s{+aaybybbyyHayHab[<sJ%v..v=%i4{-yyyHH2HHHHabba+{d4iQw/....../=uQ#@s<[yyHHH[+d#%uU/........c,u%#d{-[ayayHHHHHaa{@i%w/......WXu%#d+[aybyb<-+<aaya<+{@i%W..........,X%$JB[(((G<1#Qu=c......cX%#@{<[bbybHbyHbybyybaaa+sJQ,..vwQJs+-abab[a<ababaaa-{s4J$u=v..vWu%i4s{+<[bbbbbayya<+{@Ji%w/...",
+".........v/U*u9iJs{+<-+@i%*,v....../Xu$J{<[bH22G2GGG2Gb+@iQu=/..../wQ#d+ayyHZZGGZ2GGGG2yb[+@i%U...WuQi@+-byHZHyyyb2ZGG(Gt2+d#%U..vWu%Js<[byZ2GGZGGGGG2Hbya{4i*c..v=uQJs<[byZZHybybZ]2yba+sJ$uUv..vUuQ4{-yyHHGGGGGG2bybya-s#9u,v...Uu$4{<abbZ2yyybHZGGZGG2H[+@uc..v=%i4{<yyy2GGG2G2GG2Ha<{s4i%U......vXu9L@{-byHZGGH-s#QuXc........v,u%Js-abyyyb2GZGZ2H+@i%w,......cUu%#s+<byyybbabyHGZHba-s#%U.........v/w%$J1aZ(tZ<sJQuX/......cX9J{<yHGGGG2GG2GZGGGGG22b-s#wv.vX94{-y2GG2ybyyyyyyZHHa+s@JQw/..vUuQ#s<[by22HybyyH22yb[+sJ9u,...",
+"...........vWUXu%9$#J4Ji%X,c.......cUwu$4nBB^~~S~S~S~~kngQuwU/....c=X%i@1BB^~S~SSS~SS~~^BB@4QuW..vWXu$4dBB^~~~^^B^~~S~SS~DEg$u/.../Xui4dBB^~S~S~S~SSS~^^B149uU...vWX%ihd1B^~~~^+B^~~~^^{@M9%*W..../Xu$4d1B^~~StS~~^^{B{s@g%uU/....Ww%L@1BB~~~~^{^^~S~SSS~^B:iuv...Ww%lJnB^^~~SSSS~SS~~61M4L%*,.......Wwu%iJ@1B~kSSk1g%uUWv.........c=u%#@s1{B^^~~SS~~knN%*U/......./=*%i4@d1{^Bsn@6^~~^6sh#QX,..........c,wu9O}~S~kng9u=,v......v,ui4n^~S~SSSSSS~SS~S~S~~614$=..vU%ih1^~SS~^+B+B+6~~~^BdMJ$uXc..vWX%i4ns6^~~~^+B^~~~^BBsNi%*W...",
+"............vcUUwuu9lLl%*U/v.......c,Uu$N:n6^~~~SSSSS3kxN9%uUc....cWwu$O:n1AkSSS~SS~SSV6BE:N$uW...,X%lN:E1^VFV61BBkSSSSS3o!I%wW...,*rlN:n66~SSSSSSSSFk^66:gQuWv...,X%lNn16^VFkD6B6kFkk11:Ol%*,v...cUX9LMn1^~SSSSS3kB1nn:ML%X,c...v,u%LM:1B^V~^6B6D3SSSSS~DnMlXv.../wu9lMn1^kSSS~S~SSS3An:NLQ*W......./,uu$LMn1DFSS3EN%*U/..........cUX%LMhnn1B^~~~SSFk!luwUc......vcUX%lLOMnEBEn::Ek33DE:ML%Xc..........vW=*RlEkF3Axl%XUcv......v,u9g:}kSSSSSS~SSSSSSSS~k6nM$Uv../uQg:6kSSFkB616116VokE:Mg$uUc...,*%lOn16k~Fk6116kFV^61nhl%XW...",
+"..............c,UwXzRl|rw=/......../UXr0_x';)&>q>>>q>&Cp_|Rrw/....c,Xz|O!eTmCq8qq&>q&&Cmme'Y0zW...W*%0Y'em7&&&me'mK&8PPPPjpIfw/...W*%IY5;mK&q>&>Cqq8qj7m5!IRu,...v,uRIY5mmCCq&KmemC&CKme'!0%*W....cUX%0_!'KCqq888&K;E!!_N|rXWc...cUu|I!';m&&&&K'mK&88P8q&K'YfX....cUzf0x'em)&qqq>q&qq&m'!YO|z,......./U*zf0Y!;KqP8&pIRr=Wv.........c=Xr0Nxx!'emC>&>qqjp0zwU/......vc,Xz|IOx';T;'';;j&&K!!I0rw/..........v/U*RIp&q&jp0%*U/........WwRIxm)&q888888qq88888>jmp_|w..vWufI!K&q8q&)mmmemmC&C;x!_If*c...WwrIY5;mKC&Km'emK&CKme'x0R*,...",
+"..............vc,Uwrrr%zXWc........c=z90_55e7)CC>CC>>q&m!_0Rz,v...cUwRfx'T7))&>CCKK)7CCC)Cm'_|wv.v=r|_'m)C)>CKm'''m)&PPPP&;_|r,..v=r0Y'7)C)CC)C))CC>CC7TT'_lzUv...=r0YeK)C)CC77meT7)CCCC)5Y0rUv...c,wR|IY5e)CC>q&&m'5x__0|zwUv...W*RI!;))CCCC7meemC>>>>>)m5_0wv...WXz|N5Te7)7>C)C)))CC7Te'xOR=v......cUXrR0O!5j&8P8;Y|zXWv.........v/wzf0I_x5'eK)CC>q&;If*U/v.....v/Uwfl_!5e)CC7K)j&CCe5_I|zX/..........c=wr|Y;&8q&pIfzXW.......v,z|I!e)>>>>>>>>>>>>>>>C7TT5I*v.v,*|I!eC>>>C)7mmeem)))TT55_0*,..v=R0_;77C)>C7e'5e7)CC)Cm;Y0RXv..",
+"...............vW,wuuu%uXUc........W*QJ@{-[byyyyyHy]GGZa<+s49*/..v/w%i@+aHHZ2ZyHa<<aHbH2G]][+4%v.vu#d+2]]GZ2Hb[--+aaZGtttt-B4%=..vuLs+2ZGGZHHa[-[yyZyHHyba{49Xv..vuJs-2Z((]2HHaaabybH2Z]]2-sJuv...WU*%i4s+-HH22Z2ya++s@4#$%u=v...=$4{[H]Z]ZHH[<+aaHH222Hya+dLuc..vUu$J{abybyybHba[aHbHHbyy-{4uv......cXu%$#@{+2(t(t~{#9uX/.........vWXu9i#4ds{+<[byZGZ[1J9uUv...../Uu%#d+-b2ZGG(ZG]ZHa<+dJi%w/..........c=%i4{[(((Z-1#9uU......./X%#4{-yHb2H2HHZyHy2Z22HHby<s%c.vXQ#@{[HHH2bHyy[-[aHHyHyba+di=..cu#s+H](]2yHb-<+aayy2ZG]H<sJ%,..",
+".................cW,=UUW,cv.......v,u%Jd{+<byyyyyyyyGGGH-+{4iuW...,w%i@+[ybyyyy[++++-ayGG(G2+duc.vuL@+HGGGZy[[{{{{+<[2(t(2<@#QUv.cuJs-HG(GZbb<+++-ayyybyy[{4iuc../u#1<2GGGGHybbabyyyyGG(t2<s#uc...cU*%$#@s+aybyyyy<{@4JiQ%u=c...v=94{aZGGG2y[<+{+<ayy2yyy-{4i*v...W%iJ{<yyyyyyb-++<-bbyyyya{Juc......vW=u%i#d+aZ(]Z[sJ$uX/..........vWwu%Qi#4@s{+<[2GG<{Jiu,c.....v=uQid{<bHGG((((G2aa+s@#Qu=c........../Xu$MBaZ((Z<sJ9u,v......vX%$#s[abyybyyyybyyyyybyyyy[d%c.vX%iJs[aybyyyba<++[abbyyyb<@iXv.cuJs-2G(GZba-+{{+<[yZ(]G2<s4$U..",
+"...................vc.v............cXu9#4d@BB^^^+B^^~~36nhJluXc...c=w%$@1BBBBs1@hJN4h:1k~~~AMLu...=9L:A~S~^nM4#ili#OMn6A}Ehl%Xc..vXQL:A~S~^n:hJNJhdsBBBBBn4iuU...cw9NEDSSS~~^^6^B^k^~~SS3D:g9X.....cWUu%QN4d1sB{B1@Oi%%*XUW/.....,ulOE^~~~^Bn@MJM@1B^^^BB@gQu,...vcUu9JnB^^^B1dhOJO@dnsBB{1J$=........vWUwu%LO}kS~k}gQuwUv...........c/,,Xwuu9lLJh:6kkENQuwW.......cXu%i4:1^~SSSSS~DnMgl%%*UW............Wwu$O}~S~kEL9uXc......../Xu9Lh1^^+BBBBBB{BB{BB{1BsnJ*v..WXu9L@1B+BBs1@4JM4d1sBBBs:i%W..vX%N:A~S~61hJJg#JhMnD~~~Ang$uW..",
+".................................../=*%Lhn1B6kk6A1B6VFo}:OlQuUc...cWXu$N:11nn:hNLLLLgOxD3Fk}O9Xv.vUrlN}VS3DxNl$%%u%$lgNMMNl%*U/...URLM6kFV}xNLllLlO::111n:gQzUv..vX%LpDSFSSoVV333FFFFSSS3AxL%Uv.....c,UX%$NMnnnnn:Nl%uXUWcv......Wu%L!DFSVDE:MNgNMn11B11nhL%*W....W=w%LNn1BEnhOLlLLNOMn11n:N%=v........vWUur9I:kFFkEN%uUWc..............//,UX*%9lNh}kDEg%*U/......./=X%lLM:6oSFSSS3}:glQuXU,c...........v/XuRgEkS3AxL%*UW......../=u%lOnB6Bn::nn111nnn:nnnnhiw..v/Uu%LOn111n:MNlLLLOh:111:O$uW..vUf0MAVFV}hLL$$$$lN:}3FVDxL%u/..",
+"..................................v/UufIx'emCqq&)mmK&q&;pYI|z=c...c,Xu|I!'e'pxYII||00IpK&q&;_fw..v=r0_K&q&KYI||Rrzrrf0III0fR*Uc..v=R0YK&q&KYII0|00Ix!'ee'!I|*,...vXRIpjPPPP8888PPPP88PPPPjpIRX......cW=wr|N!x''55xI|%*=,/v.......cX%0pK&q&);'xYYYp'mKmme'Y0%X,..../=*%0x'ee;xY_I||0I_x''e'!IfU.........cWUXz%Ipjqq&pIfuXWc...............vcW,U*%fIYK&jp0r*U/......vcUXzfIY!K&PPPPP&;pI|fu=,/c.........../UwrfIp&8qjp0RwU/v.......c=X%f_'em''5!5''''''''!'''Y0w.../U*%f_!'e''xOI0|0IOx!''e'_|zW..vUR0p;&q&;YI||RRR|0Y;&q&KYIR*/..",
+"..................................v,Xr$_'T77>qq>C))Cq8qK'!O0RX/...WUzf0xeTT7T5!_OIIIgY'Kqq>Kp0*v.vXfI!Kq8qCp_I|fruzR|0IOII|Rz=/..vX|Ipj>q>K5_I0IIOx5eT77e'_lrUv..c*fYp&PPPP88P8PPPPPPPPPP&pIfXv.....cWU*R0_5eeTee5_0r*X=Wc......./wz|!KC&>C)Kmm;mm)>>))7T5IfzW..../Xz|_5TTeT5x_gIII_x5eTTe'x|wc........v,=zr|I;Cq8&KY0R*U/v...............c/=w*R|I!K>&;Ifr=/v.....c,=z9I_!')qPPPP8qK!xIlrzXWc..........v/U*r|Y;&qqC;_|RwUc......./U*R0x'TeTeeeeeTTTT'eeeeee5I*v..cUz|IxeTTT'5x_I0IOY55TTTe!IrU..vXfI')qqqK'II0|l|0_xK>qqK;I|z,..",
+"..................................Wu%id+[HZZ]Z]ZbyHZG((2b-{d#%W...Uu$Js+aHH2Hya<{sss++H2((G2+@%v.c*Jn+HZ(G2[+s@JiQ$i#@s{ss4iQuW..cu4s<2(((2a+{sss+-[ayH2H[+@iXv..cuh1~t((((((G(G((((((((tt^sOuc.....WXu%Ld+aybyby[+d#9uuw,c......,r$4saHHH2]]tZ](](]]222H<s#Qwv..vUu9J{-yyyya[+{d@s{+[ayyy[+@%,........cXuQL@{<(((][BdJ$%X,v.............v/UX%Q#@s+H]Z[B49z=c...../Uu%#d+[a2G((((((2a[{@#Q%XWv........v,wu9#:+[(((Z-B@#%uX/.....vWu%#@+ayyyyyybbybyyybyybyy[s%c.v,ui4s-ayybbb-{sds{-abyyby<sLw..cu41-ZG(GH<+sdd@ds{-2G((2<B49=..",
+".................................vWu$Js-HZGGZ2HyyyyHG(G2y<+@i%Uv.v,%i4s+aybybyb-+ss{+-yZ(Gt2+@%c.cu#s^2G(GGa<{dJi$ii4@s{{s4#$%U../u#1+HGtGZa<+{{{+<byybHya+4iuc..c%Js-t(((GZZbHyHy22ZG]Z2[+@Luc....vWwuQi@+aabybya+@JiQuXUW/.....W*%#d+aby2ZGG]tZ(GGZZHyb[sJ9Xv..vU%i4{<yybyb<{ssd@{+aybybb+@$U.......c,X%$#@B[2]((a+@J$%uXUv...........c/UXu%i#@{^[2]<sJ$uU/...../Xu9#s+[yb2ZGGZZZZ2y-s4i9u=c.......c/=u%$Jd^aG(tZa{4#Q%*U/.....Uu%id+bybyyaayyyyyyaybyyay-{%c.v,%i4s<byyyy[<+ss@{[[byyyb[s#Xv.vu#s<2G((Za-{sdds{<aZGGG2-sJ9U..",
+".................................v/Xu$Nn^~~~^1:d:@n1^k~6n:4lQ*/.../X%9#@nBBBB{Bd44Jhd16~~S~6MLwv.v=%L:6oSSk1nMgi9%9QiN4hJJl$%X/..vw%N:D~SSk11@h444sB{BBBBn4l%Uv..vw$On^~SS~^BB111n1n1111BnOi%U......cUXuQi41sBBBs14g$%uw==/c.....v,Xu9#4Mn1DDDAkD^kk^^BBBdJQuW...vWXu$J@BBBsn@4Ni#L4@nsBBBs:i%W......v/UU*%QLhEVS~~}hL$%uXU,c..........vcW,=Xu%$LOnDkkEgQuX/v.....c,Xu%i4d1B^^^BB6^^~^1MLQu*Uc......./,Uwu%9lh6~SSkEMlQu*XUc...../Xu%l@BB^BBss1{BB{B{1sB{BB@4*v.v/*%iJ:sB^BBdh4LLLJ4d1B{BBdJ9U..vX%N:D~SSk6n@JLggM:6k~S~^ng9*/..",
+"................................../=u%NxD~Fk}xMOONM:AkkE:MgL%uW...WXu9lO:1161En:OggOMnEkVVV}O%X..v,%lO}kFVkE:Mgl$$$llLNNNNL$%*W..vURlM}VS3DE:OggLMhE1611n:gl%U...vUrlYD3SFk}1:::M:M::nnn:ML9uUv....v/Uwu%LO:nnnnn:hL$%uuXU,/......cWw*zQLgh::E::::EE1111nM$%X,v..v,X%$Lhn11n:hgLllLlOhn1B1hOLu,....../,=wu%9$NEVFFkEOL$%uw=,c.........cW===Xwu%$LN:AoA!g%uUc....../U=*%LNM:n1661E16kVDEMLl%uXc.......c,wwu%lLOEoSFD:gL$%uw=,v....WXX%lM:166En:nnnnnnnnnnnnn:lwv../Uu%LNn166E:hLilLLMM:n11nhg%=v..=%lhDVSVkE:MONLNO:nk3Fo}hL%=v..",
+"................................../UrRIpKqq&KpY!YYppj&&K'YYIR*W...WXuf0Y'mmK7m;'YYYYp'mC&q&;If=...W*|I;&>&)m'!YYIIIIYY!Y!YII|uc...Ur|Y;&&qj;5YYYY!'mm)mm;xY0Rwv..v=z|YK&q&&m;'p!!p!p'';e'YIR*,...../UX*%|IY!''e;5'!II0Rfr*U,v.....v/UXuzf0IYYYY!!!!'''e''_0RX/....,w%0I!;e;'pYYIL0I_Y!';T;'Y0rU....vcUU*uf|0Ipp&PP&;pII||%z=/........vWUU**r%R|0IYpmjjp0%*=/......cUXr|IY!''em;5''mCq&;pYI0frW......cWUu%R|IYY;&P8&;YIl|RrwUc..../Xuf0Y'emme'x'''''''''x''''I*v..WX%|I_'mmm;x!II00IY!';e;5!I|X...Wz|Y;&&&jmpxY_YY!p;Kq&&KY0r=v..",
+"................................../Xz|_pCq8qCmm;mmmC&qqCKm;!0%W...W*fIx'm)C>>CCKKm;mmKCC>&j;Yf=v.v,z|_;7C>C7mm;;;;;;;;;mm'5_Ir,..vW%|_;)>CC)mmm;;mKC>CCC)m5_0*v..vWr|Y;C>>CCC)KKKm7mm7))m'_|rUv...cUXrlI_5emjC)C)Km;'!x_0|zU/v.....c,=*Rf0_x5E5'5'eeeTTTe!0%*,...v=r0_!mCCC)Km'!__xpeK)CC)m'_|=....cUUzRL_xppK&&PP8jm;xxOI|r=c......cWXufQ0LI_xx55e)))pIf*U/......WXr|I!;mm7eTeeeemCq8jm;;!_0wv....c/XzlI_!p;j&qPP&j;'!x_0|*,v...W*f0x'mCC)mTeeeTe))))TTT)Kmxrv.v,*|Ix'm)C))m;'___!em7CCC)'xI*c.v,z|Ym)>>C)7me;;;m77C&>&;Y|RUv..",
+"................................../*9Js<]t((tZG]tZZt((((]]H-1Lwv.v=QJ{ab]](((tG(tZt](Z]222a+:iX..vw%#@<bHHZGZG]]2GZ2G]G]22b<s#X..cX$#s+yHH2GGtZZZ]](((Z((Za+d9/..cwQ#s-HH]ZZ((]t]t]]]]]Z]a+49Xv..vWuQJs-aH2G(t(t(]]]2H[a+di%=c...../Xu9#@s+-[yayyyyyyyybb+di%=v..cuid-[ZtGt(tZ2-++-[]Z((t(Z[<@%v...W*%id+[bH2ttt(t(tt]Haa-s#u,.....v=u9J@s{+<-bbbayHHy+@i%u,v....v=%94+a]G]2Hya[-[a(t(((22[-{$W...v,u%#s<[bZtttt(t(t(Zab[+@iuW..vX%4s[HZ((GZHyyyyy2ZtZ2HHZ]]^Lc.cw9@{[H]t((Z]2[+++[Z]t(t((2[{$c.vwQ#s-bHb2GZtZZZ]Zt]ZH2H[sN$*c..",
+"..................................cw%#d+2Zt(t]tG]tGG((tG2t]<s#u..vw%4s-H2GG(Gt]]G]]GGG2Hyb<{49=v.vU%i4{<ayHZGGGGZt]G2t]t]Z[-s#wv.v=%i4+-by22]GGtGtGGGGGttZb-s%/..vU%i@+-ayHZ]ZG]GZtGt]]]t[{49wc...Uu$J{<bbHZGG((ttt]2yya<si%uW.....WXu$J@{+bbbyybbyyybyb-{49%Uv..vwis+a2t(tZt]2<++<aZ]GZtt]H-suv..v,w%id-bbHZ(t((t((]2Hya<{JQ=v..../=%i4s+-aabybyyyby[+@i%w,v....c=%$M{~Z2ZHyba[++-Z(ttZt]2a{J=...c=u9J{-ba2Z((tt((tZZHya<siuU..v=$4{aa2GGG2ybyyyb2ZZZHyHZZZ-i/.vwi@+aH2]GttGGa-+-a2ZZt(tGHas$/.cU%i@{[ayH2GGGtGt]GZZyy-+@i%=c..",
+"...................................WXuQg:}6AAA^ADkAAA^kDA6ExL%W...,*QNME}DDkAAAADAAAD61n:hJl%X/.../Uu%iO@:E}A6D6ABDAAD6D6E:O$uW.../=u%iJM:1AADA^kDkDkAkA6EnOiXv.../Xu%L4M:16DAAAk^AAAA66Exg%uW..../XuQ#4:116AkAk^k6661n@4iuX/v...../w*%$g@dsB{B{B{BBBsd@4i%*Xc...vUuLOnEAkA^A}E:OOhn}AA^AA}nMiw....c=w%i4::16AkkVAkAA611@4L%XW...../Uw%l4@@@s1{BBBB1n:gQ*=,c....../wu9Nn6A611d@4OOxEAADk661:J%/..../=uQ#4:nEAAkVVAkkD61n@Ji%,c..vWwQNhEAADA11ndnnn1666nn166Ex%v..Wu9J:n6AA^A66:MOh:E6^A^AAE:Nuv.vW=u%L4h:E6ADADADDD61::4i%u=c...",
+"...................................cUXufLOMM:x::::::xM::hMNl%X,...WUu%LNhM::::h::::::MhNLl%uX,v...cW=wu%9lNOhMMM::::M:MhONL%uXc...v/U*u9lLghh::x::::::x::OL9%Uv...c,Uuu%lLgMM:::x:::MMNNNl%*U/v...c,XuQLgOMxh:E:::::MONL$%*U/.....c,Xu%lNMnnn11EB111nMglQuXU/c...vWu%lLM:::::MNLll$g:::x::OglrWv...c/UX%$lgO_Mx!!:!::xONglQu=/....v/,w%LN::n111111n:OLQuXWc......./UwuQIMhMhNLll$llOhMM:x:OlQwc....cUUu%lLgMMMM!h!:x:hNgL$%X,v...c=uQLOh:::hONNgNMMxMMhOOMMMl*c../XuQLOM::::xMOlllgh:x:::MOL%X...c,U*u%llgOM:M::::M_NLl%ruU,c...",
+"...................................vWU*zff0IIIIYIYIIIIIYII|f*U/.../U*rf|IIIIIYII_IIIII0|rRuXU/....v/UX**zrf0IIIIIIIYIII00|%uXUv...v/UwXzrf|IIIIYIYIIII_III|ru,...../,w*zzR|0IIIYIYIII00||RzX,c....cWwur|00IIYIYYYYIYII0|%rX/v.....c,Xz|0_x}ee'eemme'!_0RR*=Uc...../XzR|IIYYIII0fff|0IIYIIII0fu/....c,==zRf|0IIINYIYI_II0|frXUc.....cUwR0Y!''''eeee5xI|%w=/v.......cW=u%|IIII0|||rRf|IIIYIII|%U.....v,=*zf|00IIIIYI_IIII0|Rz=W....cU*R|0IIYIIILIL0II_IIIIIIII|X..vcU*Rf0IIIYYII0fff|IIIYIII0|r,..../,=*uzR|0IIIIIIIII|f%zXw,/....",
+"..................................../,U*R|l0IIIIOI_IYIOIII|ruX/...c=wz%|0INIILIIgIOII0|Rr*X=Uc.....v/,U*urRfII_I_OINII0|RRz*XWv....vWUUwuR|0IIIOIIIOIgIOI0|Rz,v....c,,=**zf|0OIOII_II0||Rz*=,c....cWUwRf|INIO____YNII||fr*UW......cUwRlIx5TTee7777mex_0frwUWv.....WU*R|0I__YNI|9rRf|IgI_OI0|fw/....c/Ww*rR||INIIIOIOII0|R%zXWv...../UXfIxEeTT7TTTT'xg|r*UW........vWUXz00II0l|fR%rr|IIIOOI0|rUv...../Uwz%f|0IIOIOII_II||f%*X/...v/UwuR|INI_N0I0000IIOI000IO0R=v..cUXzf|0IOIIOI|fzzf0IOINI0lf*W....cWU=Xzrr|IIYIIINIffz*XwUWv....",
+"..................................../=Xz%lLJ@@:@@:@@@:@@@4#$u=c...c=u%$LJh@h4J4M@@@@hJl9%z*UWv.....v/,=wu%QiJh@@Md@@h4O#l9%uwW....../,Uuu%iJ@:@@@@:@@M@@@JL9%Xc....v/,=zz%$LJ@M@@@@h4Nl$9%uX,v....c,*u9ii4h@d@s{sdd@4#i$Q%uWv....v/Xui4d+-byyyabybaa+sJ$%uU,c.....WuzQi#4@dd@JL$9%$#4@@M@@4iQ*/....vW,u%9$i#4hd@:4:@@4#i$Q%u,v....v,u%i@+-aabyybab-{4iQuU/........cWUuQ#4@4JilQ%%%9lJ@ddd4Ji%U......cUwuQ$iJ4:@:@@@@@4#iQ9%wW...vWXu%$L4ddd@4JJJJJ4@@4###J4OiX...c,w%$#4M@@:44#i9$i4M@:44Li$%,...../,wuu%liJ4:@@:@J#9%%u=,/v....",
+"...................................../=Xu%Qiiiili#####LiiiQ%XWv...v/U*%Qiiiiiii#iLiii$%uu*,/..........cUww%%$iii#i#i#iiQ%%uXWv.......v/U=u%iiiilL#iii#i#i$Q%u=c.....vvWUw*%Qii#L#i#ii$%%uu=/v......c,uu%QiigiJJ#4JJ#i$%%u=WWv...../U*%iJ@{+<+-<+<++s@Ji%*U/v......v,*uQiiLJ#i$Q%%%%Ql#i#iii%%Uv......cWXu%Q$i#i###l#ii$9%uw,c......W=u$Jd{{+<<-<<{s4#$uX,v.........cUwu$iii$Q%uuuu%9$iLJi#i%*W.......c,w*%Q$ii#i#L#iiiQ%%*=Wv..../,Xu%$i##iii$9$QiiLii9QQiiiu,v...cUu%Qiii#iliQ%%%Qiliiii$%%=c......v/W=*uQiili#i$i%uX,UWc......",
+"......................................vcc/,XXu*uwuX*wuuXXX,,c.......vc,UXX*XXwXwuwwXXwUW//v.............c/,==wwwwXwww=UUW//v...........ccc/=X**wXw*wXwXXXX,/cv.........vvcW,=XwXw=w===WWW/cv........vWUUUwwuwuu*u*uwwX,,/vv........c,Xwu%$iiiiiiiii%%*XU/v........../,=X**wwXXwUUUUXXwXwXXwUWv........vcc,,XXwXXu*wwwXXX,/v........v/UXuu9$iiiiii9%u*XU/c...........vWUXXXXwU==U,UUwXw*uw=UWWv........./,UXXwwuwu*uXwwXUUWv......vcc,UXXuwuwXwXXXXwww*XXX=UU/......v/UUXww***XXUUUUwwuwXXX,,c...........c,,X*u=X=UUWcc..........",
+"........................................vvcccc/c//WcW//Wcccv..........vvc/c//////W//ccv....................vc/W///W/cvv...................vv/cWWWWWW///c/ccv..............vccc///W/cv.v.............vvv///W////WWW//W/cv.............cWWWUU=XXXXwXUUWW/c.............vc///W//ccccc///W/c/ccv............v.vcc///c/W/c/ccc............c//WW,,==UUU=,W//c..............vvc/W/cccvccc//,,WWWcvv............v///,WW,,UW,//c/v..........v.c/W/U,WWWWW////c/WWccvvv.......vvc/WW/Wc/ccc//c/c///ccv..............ccccWcvvv.............",
+"..............................................v...v..........................v........................................................................v...........................v........................vvv...vv...................vv..vvvvvvvvvv......................v....................................v...v...................vvvv..vvv.vvv.............................vcccccvv.................v..vc/c//ccc.v..............vvvc//ccvcvv.v...v....................................................v...................",
+".....................................................................................................................................................................................................................................................................................................................................................................................vv............................v............................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+".................................................................................................................................................................................................................................................................................................................................................................................vccvv..........................................................................................................................................",
+".............................................................................................................................................................................................................................................................................................................................................................................vc/,U=XX,/c.....................vW,UUUWc...................vc,UUU,,cv..............................................................................",
+"............................................................................................................................................................................................................................................................................................................................................................................cWWU=zRrrwXU/v.................v/,XzrrrXU/.................cW,XrR%*X,Wcc............................................................................",
+"........................................................................................................................................vcc/W,/cv........................................................................................................................................................................................................................../UUw*zf00|rwXUWv...............cW,*%|00|R*UW.............../UXwzR00frzXwUWv..........................................................................",
+"......................................................................................................................................vWUXwuuuuX,W/c.....................................................................................................................................................................................................................vWwuQ$iJ4ss@i9%*,/..............v,u%iJ@ss@#QuXc.............cUu%9i4ss@Ji$%uwWc.........................................................................",
+".....................................................................................................................................c/Uwu%%Q9Quu=UW/....................................................................................................................................................................................................................WwuQiJ4@s{s@iQuuUc.............vW=uQJs{++sJ$%u,.............cUuuQi@{+{@4JiQuu,c........................................................................",
+".....................................................................................................................................cW=*u%%9$9u*=W/c...................................................................................................................................................................................................................c,X*%$g4MM@ML%uXU/.............../Uwulh161ng%uUW............../Uw*%i4h@M4gi%*U,c........................................................................",
+"....................................................................................................................................v/=Xu%Q$LNLQuU=Wc...................................................................................................................................................................................................................c,U*9LM:::MO$%X,/v.............../UXrlxDkk}OQ*XWv.............v,UXulg::::MN$uw,/........................................................................",
+"..........vvcvv................................vcvvcccvvcvv..............vvvv...................................vvvv...............vc,wuR|LI___|%*=U,/vv................vv..............................................................................................vccvvv.....vccvv..................................................vcvvvccvvvvvvvv...............W=w%0Y''''Y_|rw=/v...............c=wr0p&&&j_|uXWv............../=Xz|IY'5;'_0%XUWv.......................................................................",
+"......vc/,UUU,,,,,,U,,//cv...............v//W,,,UUUUUUUUW,,/v..........c/WU,/,,WU,W,WWW//cv................vc//,,U,,W,///cv........vWUzf0Oxx555_0RR*XU,/c............vcWW,Wcv.....vc/WWcv............vcW,W,WWWW//W//W,,UW,WWc........cc/WWW,//cvv...vc/WWWWc.........vcW,WUU,/////W,WUU,/v..........vc/WWW///cvv..v/WWWWWW/v...........vc/,WUUUUUUUUUUUUWcv............v/Xz|I'mC)T!O0%XU/v..............vWU*fI;&qq&p0RwU/.............cW,wz0O!;))7;Y|rwUc.......................................................................",
+"...vWWXuuuu%u%%%%%u%u%uw=,W/cv........vW,,Xuuu%u%%u%u%uuu**=,v.......cWUX*u%uuuuuu%u%u%uu=Ucv............cW=X*uu%u%%u%uuuw=Wc....../=u$Js{<[bbb+s@#iQ%uX=Wv.......vWUXwuuuu=,,WW,,=uuuu*XUWWc.....v/W=wu%wu%uuuuwuu*uu%%uu%uw/.....cW=X*uu%uuwXUX,,,=uuuuuuuUc...../U==uu%uuuu*uwuuu%uu%u=Ucv....vWW=wuuuuuuXX,=,==wuuuuuuu=Wv.......c/,wuuu%u%%%%%%u%uuuwU/v.........vW=%94+[(ZZH+dJi%wW..............v/Xu9NB[(((]-1#QuW............./UX%Q#d+[]]]2+@iz*W.......................................................................",
+"...c,*u%QQ$$$9ii99$QQQQuu*wU,c.......c,UXu%%QQQ$9$$$$9$9Q%%uwW.....vW=wuu%99QQQQQQQQQQQQ%u*XWv.........cWUw*u%%99$QQQQQ%%%uuX/.....,*%i4{+<bbya<{@4#iQ%u*X,Wv....cUuu%%%%%%uuw*w=uuu%%%%uu*U,/....c,Xu%%Q$9Q$QQ%%%%%QQQQ$QQ%uXc.../=wuu%QQQQ%uuuwuuuu%%QQQ%%*,v.../=wu%%99$99%%%%%%9Q$9%%uXX,v...c=*u%QQQQ%%uuuXu*u%%QQQ%%uuX/......c,wuu%999$9$ii$$$99Q%uuX,c.........W*u$4^aZtZH+@#9%X/..............vUXuQ#1a2(G2<sJQu,v............v/Xu9i4^aGGG2+@i%X,.......................................................................",
+"..vWUXu%9QQ$$$9$9$$99%%uuX==Wc......v/U=wwu%%9QQ9$QQ$$$9Q9%u*,.....vWU*u%%%%%%%%%%Q999%%uuXUWv.........c,=w*u%QQQ$Q9%9%%%uuXU/....vWU*%i4@nsB{Bd@O#i$Q%uX=UWc....cUX*u%%%%uuwXXwUwuu%%%%uXw=Wc....c,U*%%Q9QQ99%%uu%%QQ9Q9QQ%u=c...cUw*uuQ99%%uuwXXwwuu%QQQ%%uUc.../UX*u%QQQQ%%uuu%Q99QQQ%uX=,c.../UX*u%9%Q%uuwXXXw*u%QQQQ%uuX/....../,X*u%%QQ$$$il$9$Q%%%u*wUc.........cU*u$:A~~~}Ml%uXWv..............v/,wu9N}~S~kEL9uX/..............v/U*%Qh1k~~k:l%wUc.......................................................................",
+"..vWXu%lLNNNNgL#ONONLLL9%uuXUWv...../=U*u%%$LLNOONNNL#ON#gLQ%Uc...v,Uwu%$lig#NilliLggLLL$%uw,c........./UXuuQ$LN#OOgiLLll$%uwWv...cWwuRgMEE1}6}E:xM_ONl%u*UWc..../Uu%f$ggI$%u*wXuuRlgiL$Q%*U,c..../Uw%QLIg#INgglQQQlI#NIN#Nl9u,..v/U*%%lLIggL$%%uuu%%$LNINi$%u/..v/XuQ$LIONINi$QQligIONIg$%X,c..vW*%%$NINNLl%uuw*u%$L#NNILQ%*,.....cWUwuQ$LLNON_N_ONN#NL$Q%XUc........./U*z|_}oFV}O$uX,/...............vc,Uu%LEko3Ax$uXU/...............v,U*9I}VF3DYlzX,c..................vvcccvvv.............................................",
+"..cUz|0_;;KKp'p;;jK;;!_I0|%rXUv....v/wz%||I_xp;mKK;5p;;j;;pI0r/...c,X*|0Y!p;;;YY_Yp;';px_0RzU/........c,wzR|I_x;;jK;p!YYY_I|uUc...c,wr|_;j&&&&&jjjjKK;pI|r*UWv...W*RI_p;K;_0fzuzR|Yp;p!YI|%XUc...v,*%0Ip;jKK;jp_I0I_;KKK;j;pIRU..v,wR0_p;m;;p_I||f|0I_p;K;;pIRU..v,XRIp;mjK;;pIIIYpK;jm;;_|rUc..vWz|Ip;;K;p_I|Rr%f0_p;;j;pI|%U....cW=XR|IY!p;jKjKjjjK;p!YI0rwc........v,UuR|YK&8&;_|zXWc...............v/,=rRI;jqqjp0rXU/................WXzRI;&8&jp0Ru=c...............vc/,/W,,,/W/c/cccvv.....................................",
+"../*RIx;C&q>Cm77CqqC)Te5__I|rXW....WXzR0_x!'T7C&q>)mT7&qqCm'_fU..vcUwRL!5emC&Cm5''m&>)mT'!IRz,v....../UXzR0Ox'mC>qqC7TTee55_|*/.../Uz|I;Cqq8PP88qqqqq&mpI|rwWc...,RIx;C&&&m_I0|f0Y;&CKT'5_0RXWv...Ur0Y5m&&qqq&C;!!!;&&qqqqCm'I*v.vUR0_'K&q&Cm'!_I#Ix''K&qqjm'I*v.vUz|pj&&qqqC;!Y!;j&qq8qj;Ir*,...=l_'mKqqC)'!_0l0Ix'mC&q)K'_|wv...cUXu|_5eTC>&qqq&qqq&)T'5_|w,........cU*r|Ipjq88KY|rw=c................cUXrfY;>qqCpIRz=Wv..............v,Xr|Yj&88&;I|Rw,v...........v//,UXXwwXXXwXUXXwXUU,/....................................",
+".v=QJ{-H2]((Zy2]](]Z]bya[+{@#%=...W*%#@s+-ayy2](((Z22Z(G(]H[+@u..vUu%Js[yyHZ]ZHyyy2](2Hby<{J9*/.....W=uQi@s+[bH2Z(]]Hybyyb[+4$=..vWu$4B[Z(((((((((((((2<{4i%uW..vw#{<a]((Z2-{s@dd+a(]2Hya<@#%*c..vXid<b2]((((G]H-[a2](((((ZZa{9c.vuLs-b2]((]yya+{{+<byHZ((ZH[{%c.cuid^]((((((Ha-<b]G((((]~sO%X..v*4+a2Z((ZZya+{ss+[bHZ((]]a-@%c...W*%i@+ayy2G((((((((]2Hy[{4Q=........,*%i@{[]((Z2B4$%X/................W*%$41[(((Z<sJ$u=c..............c=z$OB~(((Za+@#%uUc........vW,*u%%9ii$iii$$9$$$Q%%%uWv..................................",
+".vUQJ{<y2GGGZ22HGZ]GHyyyya<{4$=v.vUuiJs+-byyyy22]Z2ZyZGGGZHa+J*v.vWu9Js[ayH]GZ2yyyZZZ2yyba{4i%U....vWuQi4@{<byHZG2G2Hyyybyb+@i=v..,u$J1<ZG(((t((GGGZGZa-s4i%=c...wLs<yH]G]H<+ssdsB[HZHyyb-sJQu,..c*i@+bHG(GGG]Hab<aH2GGGGGZHas%c.vuid<b2GGGGbyb<+++[yy2GGGZHa{%c.cXid+2ZZGGGZHaabyZGGG]Z2[s#%=v.cu4+[HGGG]Hya<{{{<aybGGGG2b+4%/...Wu9i@+bby22GGGGGGGGGZbba+4%Uv......v,uQ#@+<2GG(a+4$%*W................W*%i4B<GG(G<sJ$uX/..............c=%$4{[G(tG[+@J$uX,v.......WXu%Q$iJ4@@@444J#JJJJi$%%*/..................................",
+"../w%#M1^~~~~~~^^^^^6B^B^B1:g%U...Ww%$h1BB6+6^6^^^^~~~~~~k6:J$=..vcUX%#4dn6~~~~~^^^^^6+BBd4$uX/....v/wu$#4:1B^~^^^^^BBB{B{1@iuW...cUu%L:D^k~kkkk^A66D}ng$QuXW....=%#h1^~~~6:h#LLNOn6^^BBsd#QuUc..vU%iMn6~~S~k^61:@:16k~~SS~B:Nu...U%iM1^~SS~B1s@nddn1B^~S~~6:#Xv.vUulMEA^k~~~61:nBk~~k^A}:L%*,..v=QO:6~~~~^B1@4O4:1B^~~~~6n4$X....cUu%L41BB^^^^^^~~~~~^Bn@J9u/.......v/=uQg:}k~S~AM$uwUc................/UXu$hEV~~kEL%uU/v............../Wwul_}~S~~6nOQuwWc.......v/UXuQ$igM::MMOJliilJJNiQu=c..................................",
+"../=uQghDk~~~kkAE::nnn16kkDEg%U...,wRL:Dk~A}nnn::16AkV3~kAENl*,.../,wuQLNhEkFVFFVV6Ennnn:ML%uUc...../Uu9g:nn6kk6}Enn1B1B1nnO9u/.../,Xu|g:En}661EEE::hN09uww,/v.../*lg:D33o}:NLl|lLO:nnB1nhL%*Uc..vWX%LN}kF~kDEnhMOM:E6AVFokEO%Uv.v,u$N:AVSFD1::nnnn::n6VFFkEM$w...WwR$Ohn}AVkA:M:EkkkAE:hL%u=/...Wu9g:Akkk6EE:Ngg_n}6kkkAEN$uWv...v,XulOn111E1}1}1BVF3D:MglzXW.......c,U*9g:}k3ok}N9uUWc................vW=zRLEkS3DxL%*Uc...............c=wzRgEkFFkAnN$uU,c.......c,=u%lNNx}AA}::MhggOM::h$%wW..................................",
+"..v,*R0Y'mKKKK;p!YI__!'K&q&;pRw...Wu|I;&qqC;!YYY_YxmmK)m);xIf*,...cWU*%|IY;jq8qq&&mpxx!!x_|zX,....../=z|_!'m)&>K;5''''e''5!I|*W...c,U*%0Y!55'e''x__III|r*U=/c....,wRIYK&>&mpOI0||II!!''e5YI%*Uc...,*r|I;j&>Cm5!Y__Yx!;)&q&jpIRU..vU*RIYKjqqj;x!'em''p'K&q&KpYR=...WXr|0_Y'KC);pxp;jCK;!YI|RXUc..v,wR|YpmmmjKKpYI_p;)j7m;'Y0R*/.....WXu|N!'''''';emmC&&;pII|uX/.......cUUz|_!mCqq&;_RrU/v................cWUzfI;&&8jp0ruU/...............vWXzfI;&qqCm'_|uwWc......./Uwr$IY!pKjCK;'p!!Y!!5'!If*/..................................",
+"..v,*R0Y'TT77TT5_____x')q8qj!I*c.vUr0pK&8q&mxxN__Yx'TTT7TT!I|zW...c,=wr|Ix;Cqqq&CK;xYY___0|rw/v....v/Xz0_5eeC>qC)KmmTeTeT'!ORz/...c,=*f0_5'eTTT55__Il|fr*w,/v..../zfI!m7CCm5xI00IIx5eTTTT5N|rUc..vcX%|I'7CC)mTe5x_x5Tm)C>CK'IfW..vWrf0!m7>C)TemmCC)meeKC>>)'Y0=v../U*R|I_pe)CCmmmmC77'!I0Rzw,c...cXrfO!5e7)>Cm!xx;C>>mT'!I|rXW....v,Xr|_!5eeeTm)jCCC&&;!_0RzUc......./=wr0_ee>qq&KY|Rw=c................cUwzfY;&8q&pIfzw/v..............c,wrR_;&qq>7ex0RXU/......v/Xz|Y'mmm)>CC)C)KmmeTTTex0r,..................................",
+"..v=%$4{ayyyyyb-+{s{{+a](((Z<dQc.cuLd+Zt((]H++{{{+-ayyyyyb+d#%U...c,X%9#@+a]GZZHHa+{sd@@Ji$%uW....vWXu$4s-bH2Z((]Z]ZHyyya[+d#%U...cU*%i4{-byyby[-{@@L$9%u*=/c....,%i@+b2byy[+{d@ds+-ayyyaa{J$uW..v,u9#@+ayb2ybb-+++[yyHHHy[{h$U..cwQi@{aH2HHHbZ]t((2HbHHH2H<sJ*...v=uQi4s{-HHZ]Z]22Hb+{@#$%uXc.../=Q#d+-[H2Z]H[<[[]]]Ha[+@LQ*/..../XuQ#@{-<[byH((t]]HH-{@J$%w/.......cXu$4+aH2G(Za^4izXc................/w%$Ona(((Z<1J9uXc.............v,X%$#s[]((]2[+@$uwUv.....Wu%#d-HtZZ22H2Z]t(t]ZHyaa+@iU..................................",
+"..c=%i4{[ybybyyb+{+{+<a2G(G2-d%/.vu#@^aZ(GZH-++{{+<ybyyyyb+@i%Uv..v,XuQi@{[Z]]ya-+{d4J#iiQ%u=W....vUX%94s+ayZGG(tGGZyabaa<{d#QU.../UXu94s<abyyba+s4#iQ%u*XUWv....WuL@{[yybb<+sJ44d{<ayyyy-{4iuW.../=%$4s<byyyyba++<abbyba<+sJ%U..v,%i4{<bbyHyH2(((G2yyybyy[+siXv..vUu%iJ@{+[y2GG(ZHa-+dJi%u=Wv...v,w$4s{<a2GGZyayH22Hb<{sJ$u,v..../=u%i4s{+<abHG(GG2y[+s4J$%=c.......c,uQ#s<aZG(]H{4$%X/................Ww%i4BaG(t]-sJ9%Uc..............WX%i4BaGGG2a<{J9u=/v.....Wu9J1<2GGGZbyZGG(((GZHbyb+@9=..................................",
+"..v/XuiOdBB^6^^1n@M:@nBk~~~DhLuv..,%ih}~~~k6n@::@n1^^^^BBs:i%=/....vW=*uQNn^~^BdMJl$%uuwwUU,cv...../,wu9#@dB^~SSSS~~6Bdd@@4L%uW...v/Uwu$#4@s1{1@MiQ%uwXX=W/cv....cw%ihsBBB1@4Ll9iLJ4dnBB{:49%Xc...v/Xu9LJ@d1BBsn44@@1{Bsd:4i%X/..v/Xu$JdBB^^BB^VFSSk6BB^+B14L%W....cUXu%9#hnB^~SS~61M4$%uuwWv.....vcUu9igM1Ak^kk^k^^}:4LQ%=/v.....v/U*%$#J44:nD~SS~^Bn4N$%uUW.........vWXu$Onk~~~AMluw,c................v,XulOEkS~knlQuwc...............cUw%$O}~S~knML%u=/.......cXuQgEk~S~^66~~~SS~S~6B1@49u/..................................",
+"...WUu9N:116AVkAn:::nE6kF3V}_9X..v,u9IEkF3k61nnM::}kVk611nN$uw/.....cUUu%0xAVDEMNL9%wXU=U=Wc.......c,U*%LgM:Bk~~F~kk6En::Mgl%X/....cWUu%LOh:nnnhLl%u*ww=U=W/c....vWu9L:n11nhgL$QQLgMMnn1nMg$*Uv....cWXuQLgM:n1EMMON:E1E:MLlru,v...WUuRLMn1111EAVSSFkAE6A6BhO9u,....cW=Xu%LOMEDVFFk1:OLl%uUWcv.......cUwu%lhnDD333VDEML%uwU/v.......c=Uu%lLgMxEAVFFk}:Mgl9uww/v.........cUwul_A3Fk}O%uX,c................v/Uu%IEkF3DxL%XUc...............vWU*fgEVS3D_L%u=/v.......v,XzlY}VkAEEnADVkkVkAEn:OLz,v..................................",
+".../XzfN!'emj&&j;5''emKC>&j;IRX...W*%Ipj&&Cme''x';j&&jme'5_|zX/.....cUXzRIpK&j;YI0fr*wU=,,/c.......c,U*%|I_Yp;mTm7mK)jm;'!_IR*/...vcWUu%0I_x5'5xI0f%u*XwUUUWc....vWwRI!'''!!_I00|0I_x5'e'!I|z,.....vWU*%|II!;KmpxYY'KK;YI0RrX/....WU*%|Y''eeeeK&q88&&jKmm'!_|*W....cW=*%f0_!;Kqqqjm5YI|%*w=/v.......vW=*%|Y!;j8P8&;p_|r*UWc........cUUuR0IYp;jjjjKm'!_II0RrwUv.........c,Xz|Yj&8&;_RzUUc................vWU*fIp&8qjp0RX=c................,UufI;&q&jY0zX,/v.......v/U*RIppp'__YYp;p;';!!IN0Ru,...................................",
+"..v,Xr|_'TT7Cq>>)K)m7)7CC7KpI%Wv../Xz|Y;)))7TeTTem)>>C77T'xIf*W....v,w*%|Y'C>C;5__0QRzwUUWWv......./U*r|I_x555eTTT77>>>)Te5x0r,....c,Uz|Ix:'eTe5_IL|$RfrRzwXU/...vUrl_5TTTe5!__NIOx5'T7TT5x0RXc....vcUXz|0Y')>Cm'5'mCCm!I|%X=W..../U*fN!eT7m7))>q88qq>C77T'_|z/...c,=*zfl_x'TCqqq>me5x0|R*X,c.......c,XrrI_5m&8P8&m5I|rX=/........v/=*r9IO!;C>C)7Te'xxx__#|RX,........v/Uwz|Yjq8&KY|R*UWc...............vU*zfY;&88&pIRzU/...............v,*r|_;q8qCpIfzX/........./,XrfIIYIIIIIYY_YYYx_I0|R*Wv..................................",
+"..v=%i@{ayyHHH2ZZ]ZZ2HyH[<+n#QU...cwR#d+-[2yHyyyyyH22yybyb<sJ9U...v,*%lJd+[]G]aa++s@#i%u*U=c.......,u9i@{-[byaybyHy2ZG2ZHHb<d#X..../XuQ#d+-ayHHa<+{{sssd4JiQu=v..cX94{[yyyyya<++++<[b222Ha+sJu,...../Uu%#4s-HZZHHbH2]][B@#9u=W....UuQ#d-ayb2ZZGGGGG((G2Hby[{4%W...Ww%9#@s-[y2G((G]2Hb<{@Ji%uUv......WXu9L@+[y2(((]<+d#%u,c........c,u9#@{+[y]GZHHyyya-[<<{s#%U........cU*%ih^2(((2B@#%*Uc..............vWX%$JB[]((Z<ni%uW...............Wu%l:T~(((Z^sJ$uUv........cU*%lN@@@M@@M@M@@d@@d4Ji%uW...................................",
+"../Uui@+abyyyyy2ZGZZ2ya[+{@4iuUv..cU*QJ@{+<ayybbybyybyyyya+sJQ=v../Xu$J@{<aGG2yb[-+{@J$%u*U/.......,uQJs-bbyyyyyyyyybH222G2[sLwv...vWu%Ld{<aH22yb[<<aa<-{s@JQwW..vw94{<yyybybb<<-abyy2ZG2H<s4$,.....v,XuQ#:{ab2ZZGZ2HHa{4i%u=c...vW*%#@+abyb2GGZyH2G(GGyyaa{#%c..vUuQ#@{+ay222HHHH22yaa+sJ$u=W.....c,uu9Js+ayH2Z2[+s4i%=,v......../Xu$4{<ayZ2GZyyyyaybbba[{@$Xv......./U*%i@BaGZt[+@i9uXW...............WXu%JB<ZZGZ<@i%uUv.............vWwQ#@+aG(G2-s4$uU.........vW=uQ$ii#iii#iJi#JJJii$9*U/...................................",
+"..v,Xu$41B^^^BBB6A661n@O#iQ%u,/....c,wR9i#4hdnsn1sBBB^^^{1M#Qu/.../UXuigME6k~~6Bdn@4gi9u*U,/v.....v/Xu$4n{B+B^BBB1BBB6^~SS~6JQ=....vc=w%i#M1^~~^B1snsBs1@:JluXc..vUuQ#@B{B{B{snd@s1B^~~~~^nOiu/......vWUXu$On16~~~S~B1hLQuXWv.....vUX%$J@1B^~~~61n1^~Sk61d@#%Uv..v/Xu9J@nB^~~^nn16^~~B1@hi%*Uc.....v,Xuu$#:11B6BBnML%u=/v.........cUX%94nBB~~~~BBsBss{{B{s:#%U........./Uu%lMDo~~AMl%uwUc...............c,=u%NE6k^B:L%XUW.............../=*%iM}k~FD:lQuU/..........vcW,=XwwwwXuwu*uu*uuXXU,v....................................",
+"..v/*u$g:n1nnn::MhNOgLl$ruuUUW....../,=wu%QLLgNNOMhnn1661:Ml%w/...v=w%$Oh:}kVkAn::hhOLQ%w=,/v......WUu%g:n116611nnnnn1AVSSVEO%Uv....cW=u%Lg:}kV6Ennn111nnMOluUc.../UuQN:n111En::::n1B^~~V}:LQuW.......v,=u%lMn}kFSVk}:N$u*U/v.....vc,X%lOM:}VoA}Mh:}VVAE:MLQu,....WXulgMn1Akk}:h:EAkk6E:Ml%w=/...../Uwu%lNM:111EnMLQuXUc........../,wu$g:E1k3FA}nnnn1n111nMl%W.........c==*|O}oFV}_l%uU,c...............cW=XzlhE1}:O9uw,c..............c/UurlO}kF3D_|uX,c.............cc/WW///c/WU,==,WWccv.....................................",
+"..vW*%|Ix''e''!YYII0|fRrrw=,/c......cWU=Xzzrf|00I__xx;eme5_fR*W...cU*fIY!5K&q&m'5!!x_I|RzX,/v.....v,U*fgx}eeeme''5''';K&88j;IRU.....c/U*z|0Y;&CKe5'5''55!x_fzUc.../=*fIx'''Te;'!'''emCqq&KpI|uc.......vWU*r|Yx;jq>CKe!IfuwU/.......c,UzfIY!;j&jpYYp;&&K'Y_I%*Uv...WX%0Yp';C&&;pY!;C&Cm''!IR*U/..../WXz|0I_!';eee'xIRuUUc..........c,Xu|_!'mj&qCm''''}'ee55_0r,.........cU=*fY;&qC;_0RuU,/v..............cc,wz|I5''!IRzUWc.............v/,XzR0Y;&q&KYfuU,c.................v..v.vcc////v.v.......................................",
+"..v,*|NxeT7eee'!_OI0|Rr*XUU,/........vc,==wuR|0IO_x5'TTTTe!I|z,...W*r0!5mmC>q&CTe'em'!_0fzX,c.....c/=uRO5TTTT7e7m)m))))j&&jpIrW.....vWUXzRIY;)C)m)m77TTe5!N|rXc...cU*r0_x5Tm7)mmmemT7>qqqC5_fz,........cUwr|_!e)C>>)'xNR*U,c......./Wwz|NYx;)Cm'!_pmCCm5x_0fzUc..vUz|Y57mCC>Cm5!xeCq>C)m;!IR*W...v,wR0_p';mK)7C)7'_|rw,/........../Uwr0_5e7)q>&))m7m)7mTTex0rU.........c,wz|!KqqqK'I|Rw=,c..............vW=Xz|_5ee5If*w,c.............c,Uwr0I!m>qqjp0rwUc........................vvvv...........................................",
+"..,ui@{-aHHHyyy[++sdJi%u*X,/c.........v/UXu%Q#4s{+abyHHHHba{@iX..vU%L@<Z]]tG(Z22yH22Za+@J$uXW...../,u%id-yyyyyHZZ]ZZ]ZZZ22-Bhi=......WXu%$J@+[22]G2ZHyy[-{dJQuc..vWw%$#4s+[yHZG]]22HHZG(G][+@9U......../,uQ#@{-HHHHa+{4i%u,v.......W=u9#@{+-aHa<{{{<Hba++s@i%=c..vwi@+2]]ZZZHaa--HZZ(ZZZH<@L%U.../*$JB[]Z](((]Z]]aB49%XUv.........Wwu$4+[yy2G(ZZG]Z]]ZHyya+@Q=.........c=uQ#BaZ]]2<{d#QuXWv.............vWXu%#s-[<+@i%wU/............v,XuQi@{-2]GGaBOizX/.......................................................................",
+".vU%id+a2ZGGGZ2yb++sJ$uuU/v............v/UwuQ#@{--y22ZGGGZb[sLwv..U%id^22Z]ZG2HyyaHZ2-{@J$u=/v....v,X%i@+aaybyb22]GZG]2a-+{dJ%,......v,*uQ$4{+[2Z2Z2yb[<{s@i%Uv...v=u%9#4s+[yyZ2GZHyb2ZG22a{4Q,.........,wu%#@{-bba<{@J$u=Wv.......vWuuiJds+[[<{sds+-a-+s@Jiu=v..cX9N{~2G]Hyaa+++[2ZGG]]Z<di%Uv..,u9@+~ZGZttt(tZt[{J$uw/v........./Xu9J{[ayHZGGGZGG2G2Hba-{J%Uv........cUu%i:+aHbaa<s4$%*,c..............cUw%$Js{{@#QuX,v............v,u%9ls+aba2a<s#%u,v.......................................................................",
+"..Wu%g:6kSS~~~~^B:MJ$%=,c................c,=*%i4:16~~S~SS~BnJ9U...cXu$NE}A6A611nnnEEEhLQuuU/......./,Xu9iJ4@:::n}A}A}}E:NLi%u=c.......cWUX*ulLMnED}1nh4#i$QuX/.....c,=Xu%iN@:1}6A1Enn1}6}:hL%Xv.........cW=Xu9L4h@hJLQ%w=/v.........vWUu%Qi##J#iQ9QL#JNii$%uU/....W*Qg:}}B1n:@JNOME}}A}}:OfuU/...c=u$h1D^kkkkkkD6EN9uX,v...........WU*%iJMdE1DDDDDAAA1E:@Ji%*/..........v,=uQLOMh@d:Jiu*=,c...............cWUuu%QQ%uXU/c............../Uwu%ghn::MNLQuXUv........................................................................",
+"../=%lM:6kFFFVk}nMO$%wU/v................./UXz$LM:1k~FSFVD}hL%Uv..vWUuRlLNgggNLLLLgL|9ruwU/.........cWU*u%%$lLLLgNNNgNLl%uu*Uc.........c/,=XuuR|ggNlLQ%%uuwX/v......v/UXwu%lLLgNNNLLLLgggl%u*,v........../W=XXu%Q9QRuwX,v............v,UU*uu%uuuuwuu%uuu*XX,/v..../=wr9lgNLL$$9%%flNNNNLlruU,v..../Xr|Nx::hEE:E:Mg9%XUc............vWUwu%%lLNNNgggNNNNLl9%uwU/...........vW,urQlLLgL$%uUUWv................cW,w=wwX=U/c...............cWXw%9ggNLl$%u=Uc.........................................................................",
+"../Uz|IYp;m;K;}pxIN|rX,c..................c,XzR0IYp;;K;K;;xI|zW..../W=**zRfffffRRR%Rr*wUW/v.........vW,Uw*uzrRRR%RRf%RRrrwUUWv..........c/,=ww*zr%fRR**w=U,,c........./,=XwzrRRfRfRff%R%rrzwU/...........vcW==X*uz*wX=,/..............vW,=UXXXUX=wwU**Xw=,,/v.....cWUw*rrRRRRzu**zrrRRRzrXwU/...../=*f|IYIYYYYYII0%zUWv.............vWU=w*rrRffffRfRfRRr**XU/v............/W=zzRff|fRXw=/c..................cc,WWWWWc.................v/UU*r9|RfRr*w,Wv.........................................................................",
+"../Xzf0Ox!'''55x_I0fz=Wc..................c,=*f|Igx!5''''!YI|z,....cWUU**urrRrRrzr***XU,/v...........cWUUUXX***zwuuzwu***U=,c............cWW=UX*******UUUU/v...........v/,=**zuzrrrzz*zzuwXUUc............v/,==w=wXXUUWv...............cc/,,=UUWU,,U,WU,WWcc......cW,UX*z*****wwXw***r**w=U,/....v/Uzr0I________I|rwU/v..............cWU=X*z*uzuzrrRrr**XU=,/............vc,U=Xwuuzu*wUW/v...................ccc///v..................vc,=X*zurz**XUWv..........................................................................",
+"..,*%iJd{++<<-+{d4JiQuU,v.................c,Xu$#4d{++<+-++s4L%U....v/,=wz*r%%%%u*uuuuwX,v............cWW,Uwwuu*zzzuz*uuuXU,/v............v/,UXw*w*zuuuXU,,/v...........v/UXwuu*uu%%z%*u*uX=W,v............vc,UUXXX==,//v.................vc/WWWW///c,W,,W/vv......c/,,UwuuuuuuwXXuuuuuzu*X,,c.....Ww%l4ds1ssBsdd@#$z=/...............c,WU=uuuuuuuwu%%uuu=,,,c............v/UUXwuuuuuu*=Wv.....................v.vv.....................c,XwuuuwuuX,W/v..........................................................................",
+"..cU*QiJ@d{{s{d@##$%wU/...................v/Uw%$i#4d{s{{dd@#9u/.....vvc,U==U,U,===UUWWcv...............vvv/UUUX==XX==U,W,/cv...............v/WWW==U=,,cv................vv/WWUUU=UUUU=UU/ccv...............vc/WW,W/c.v..........................vv.v..vv...........v.v//WUWUWW,,WWW,WWUW,,/v......vWw%iL##JJJ##Li$uw,v.................vvc/,UU=,=X=UUUUWWv................v///WU,=UUUWv.................................................v/UU,==UU/cv............................................................................",
+"...vc,UXuuu%%%uuw==Wcvv......................v/,Xwuu%uu%uuuX=Wv............v.v.v.v.v........................v.v..v.................................v.........................vv...v...vv.................................................................................v.vv..v..vv..vv............vc,U=X=X=wXUU,/v.......................vv.v..v..v.v........................v.vv........................................................v..v.v...............................................................................",
+".....vvvvvvv.vcv.................................v..vccvcvvv....................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+"...vc/////////W///////cv........................................................v...........................................................................................................................................................v/UWWWWUWWWcv.......................................................................................................................................................................................................................................................................",
+"..v/UW,UU,U==wUXU=XwXUU/v..................................................../W,W,,,W/v........................c////W/cv................................................c/WWWcv.....c/WWcv.................v/,,,,,/cv....................c/,=wwuuuuwu*XU,cv.................................................vc//////cv........................vccccv.......................................................................................................................vcW/WW/cv............................................",
+"...v//////W,Uu*wXw*uuXXWc..................................................vvcW,UUUW,Wc......................vc,WW,WWWccv.............................................vc,WWW,WWcc/cc//W,,//cv..............cWUU,W,,/cv..................v/,U=wXX*X*X*wXU=//c..............................................vcc/WW,,WW/cv.....................ccvc/WW/v.....................................................................................................................vccW/W,,/cvv..........................................",
+"...c////W,UXz%%%u%Q%R%u*Uc.................................................v/,UUwwXwUU/c...................vv/,U=====U,W/c...........................................v/,U=====U,,W,,,=,=U=UWc.............cW,==XwwU,Wv.................vcUUw*uuuu%uuuuuwX=U/c............................................v//W,,,,==,WWW/....................cWWW,WWW/v...................................................................................................................c/WW,,==U=,Wccv...................vc/cccccv............",
+"..v///W,=*Rf|0I00|00|||f%*,v..............................................v/W=w*zRrz*w,/v................vcWUU=X***uwwU=Wcv........................................v//,=*uz****X=U=wXw***Xw=,v...........v/UXzuRzzwU=cv...............cW,wXzr||0$000|||%r*w=c................vvvvvvvvvcv...............v/WU==ww*X*XwwUU,cv................vcW=UUXXX==U/v...............................................................................................................vv/,=UwXX*XXXXU,Wcv...............c/,U=,=,UU,/cv.........",
+"..cWWUwzflIgxx!!xx_IOIO_I0r=..............................................cWw*R|N_NI|R*=Wv..............vWUXzRR|||0|0|fzX=/v.......................................cW=*rQ|000||fRRRR|||0||RrX,.........../=Xz$I_OI|RXUc............../W=wz9I_!p;;;;;p!x_I|zX,v............v/WW,,,,,U,UWWcv............vW=Xwzr%||0|||R%r*U,/c.............v,Uurff|ffRzXUU/............................................................................................................vcWU=urfR|||||ffRzXU,/............./,UUwXzXz**XXU,Wc.......",
+".v,Xwui4s{<-byyHaba-----+{@$W...........................................v,XuQi4{<bb<s4i%wUc...........v/,*%9#4ds{{{{{s@#Q%uUc..........c/WWWWWcv....vW,WWWcv......c,u%i4s{+{+{{@4J4@s{{{{s@Jiwc........v/,u9#s-ba-sJ$uXc...........v/Xu%9J@+b22]ZSZ22aba+si%w/..........v/,X**u****uuuuu==Wc........vW=wuQiJ@dss{{ssd@J#Q%uXWv........../Uu%iJ@@ss@@JiQuXWv.........................................................................................................c,wu%9i4@ss{{{ss@4#$%uwWv.........cWwu%Qii#ii#iiQ%uX=/......",
+"..WXX%is{<a22ZG2G2Z2Z22y[<{#w...........................................c,u%i4s+ayy[{4iQuw,/v.........cUwu9i4s{+-a[--+s4i9uX,........./,X=wwwXU,W/W,,=XwwXX,/.....Wwu%#s+ba[a-+{sd@{+-<[a<{@#%,.........WX%94+abyb{4$%w,............,*uQi@+aH22]]Z]]ZHybasJQu,.........c/Uwu%%%%%uu%%9QQ%uX,v......v/Uw%9iJ@s++--<-+{sd4Ji%u=c........./U*%iJ@s{{+{ss@#Qu=/v.......................................................................................................cUXuQ9#4s{++<<<-{{s4JiQ%*W........v,wuQi#4@@dd@d4#$%uwU/.....",
+"..W=Xu$J:1^~~~~SS~S~S~~~B:4$wc.........................................v/,Xu%lh1^^^Bng$%uXU/c.........cWUu%$hn1616^B61:gQ%uUW......../W,UUXU==UU,UU=UUUX=X=U,v..../U*u$M1^^^^6B:MJh:1666^B1MluW.........WU*%i:B^^BMiuwU/...........v,X%Q$O:6^^^^^^^^^^BBs4$uXW.......vv/WUX*u%Q%%uwu%$$9u*UWv.....v//=*%%$NMn1B6B6B61nMOi9%*=c.........c,Uu9L4h4@:@nn:LQwU/v.......................................................................................................cUXu%$iO:161B66B1E:NL$%uXW.........WX*%iNhnEEEnE:NQ%uXUW.....",
+".v/Xu%9g:6k~SSS~SSSSSSFVAENL%,.........................................cWUwz$LM}k~VA:Nl%u*U,Wc.......c,=wuQN!AkV~kVVkk}MLQuX,v......cc,w*u*uuuwXwUwXww*uuu*XWc....cU*%L!DkV33oAEMOMEDVFo33D:L%U.........c=wzL:kkkDx$uX,c...........vU*%$LOEAkD}EEEEE111n:N$uX/........c/==wu%$LiQuu%l#OLQ*=Wv.....c/,U*%LNhEDkVko~VVkDEMNL$zXW........v/Uwu9gM::Mhn}A}M9u=,c......................................................................................................c/=w%llN:}DkVkVkokkA:OLl%u,v......../=u$O:EDkkkVk}ML9uwUcv....",
+"../U*%|IpK&q88q8q88P8P8qC;YIRU.......................................v/,=XuR0Ipm&8qC;YI|%zwU/v.......c,X*%|Y;&qqq8qqq&jpI|rXUv.....vWUUzrffRR%Rzrzrzrr%RfRRzUc..../UzRIp&PPPPP&;pYY;&PPPP8&pIz,........v/U*%Ip&q&jp0rXWc..........vWXu%0IpK&Cje'''''5'ee!_RrUW........c/UXu%|0II|QR%0___fuUWc.....c,=X%|IY!;&qqqq8qqq&K!xI0RwW.......vcWUuR0_x!!!!;K&jp|rX,c...........................................vvv....vvvvv..............................................v/,Uzf0_Y5j&qq8qqqq&j;!_IRuW........v,Ur|Y;m&qqqqq&pI|%wU/.....",
+".v/u*f0xmCq8PPP8888PP8P8&)'Y0*c...............vc/W/cv................c,X*R$I_!;j888Cm'xg0fRw=/.......cUwz|IYK>q88q888qj'_0%zU/.....c,Uu%0LIIOII0L000L0IIN00Rz,..../=rR_K&8PPPP8j'p;jqPPPPP&;IrW........v,Xz|I;&88C;Ifzw/..........W,wR0I_'Kqq)meeeeeTTTT5_|uX/........cW=*Rf0I__LfR|Ix5_0z=,c....v/UzR|O!5e)>q888q88qq)T55_0rU.......vW=*rl_5eeneeTC>&;Ir*UW................vcvvvvv//ccccccv........vc/WW/,W,,,UU,,,W///v........................................cUXrR0x5'm)qq888888q>7'5xNf*c......./,*Rg!e)>q8q8q&m_0fzX/.....",
+".vWuQ#d+2](((((((((((((((Z[+d9/.............//UUwuX==,/c...........v/UuQ#4s{<bH]((((Haa+{@J9uW......c,u9#4{<2G(GGGG((G2+s4i%uW...../wu$Js+++-<+-+-+<+<<-++s4$%/...Wu9N1~](((((tZa[[Zt((((((a1iX......../=ui4Ba(((]<sJ$u=v........cXuQ#d{-aZ((]ybyyyybyyya{J$%U......../Uu%iJ@s{s@#iJd+-{4$uXW..../wu$Js+bHH2ZGGG((GGGG]HHa[s4u/...../UXu$#d+[ayaybH2GZ<1#9uXc............/,U=wX=U=Xw***wXXUU/.....vc,X*uuu%%%%%%%%%%%uu*wUW/v....................................W*%i4+<yy2GG((G(G(GGZ2Haa+@L=.......,u%id<a2GGGGGG2[{M#QuXc....",
+"..W*%#@+HG(((((((((((((((Gb+4%/............c,wXuuu%uuXUWc..........c,u%i4s+ay2GG(((G(G2[+s4i%Uv.....cw%i4sB-yGG2yyyaHa<+@#9%=/....v,u9i@+[bbHH2222222Hyyba+@i%U...Ww%id+a22ZZGZHb<aHG((ZZ2[+@iU.......v/Xu9JB[2GtG-sJQu=/........c=%$4s+<yZGGGyyyababaaa-{4$uUv.......cWu%iiJ4d@Jiii4ss@JQuX/....,*Q#@+[222GyZ2GGGGG2H2Z22[+@$,...../Uu%i#@+ayyyyybZG]asJ$uXW..........vWUXuu%u%u%uu%%%%uuuX,/...vWXXu%%9QQiiiiiiii$$$Q9uuXUc...................................vWuQ#@+2Z2GGGG((GGG2222G2H[{#*v.....v,wui@{<bbybHyHa+sJi%*U/....",
+"..v,w%lxD~SSStStStStPtSFS~}hiXv............c/=wX*uuu*==Wcv.........cW=uQ#@:1^~~S~~S~S~~1:gi%*W.....vcUw%iNhn6~~6n:hMMMgLQ%XUWv....v/=uQ#@sBB~~~~S~~~~~^^{1dJQu/...v,Xu$gMn16k~k6n:n6k~kB1nMgQuc........c,wu9OEk~~kEL9*=Wv........v,*%i4nnBk~~k6Bssd@d@@44iQuU/........vv,X*uu%9Q%uuu%$iQ%*=Wc..../UuQL:6~~~~^^~~~S~~+^~~~~6:L%W.....c,wu%iJ@1B{BBB^^~kEN$uX,c.........v/WUU**uuuu%uuuu%uu**wUc...cW=X*u%QQQ$$ili$$i$Q%%%uuU=c.................v.vv..............vWXu$O1^~~~St~StS~~^^^~~~kBMiX.......vWUu9LJMhh:MMhhL$%*w=/v....",
+".../wRlM}3~SSSSSSPtSPSSSFkEO$Xv............c,UXuuu%%u*UW/v........v/WXuQLM:E6kVokkkkV3DENL$%XWv...../U*%LNhn1kAEMgLLL|$%uX=,c.....c,Uu9i:n16Akk~k~k~kkk611:gQuW....c,Xu$gOMEAkkEMM:}k~AEMON$*,v........cWUXRLEVFFDxLuwUc.........vWurl_:E6AkVk6}BE:hhhMOL$uX,c..........vWUUXw**XUUXuuu*XUWcv....cXuQLMEk~~k^^^~F~k6666kkkAxg%,.....v/=u%$LM:n11116kVAEN%uwWc.........cW=wuu%9QQQQQ9Ql$$%%uuUc...vUXu%lLNIONOOIONONNN#gNlRuU/..............vvccW//W//cccv........WX%lgEAk~~~~S~k~~k^^^kk~DEO$wv.......v,Xu%lllLLlll$%uX=,cv.....",
+"...cXr|YK&q88PP8PPPPPPPP8j;IR=............./=wzR||l|Rrw,/c........vW=X%0_x''emm;;p;;mm;p_0f%Xc.....cW=*%0IY!;m;!YI||f%rz*X,/v.....c,Uz|I!'eeT)mmmmmm)mmee5!_Rz/....cW=z%0IYpK&&m'xpmj&KpYI0R*U.........cW=*rIp&qqjp0%X=/.........v,ufY;KjCjKKjjCjK;'!_OII|zXWc...........cWUU====UUUwww=,/c.....v/Xr|Ip5mm7C&&KKKKmemeemmm5p_fU.....cWwRfIIx''5!!5'K&j;Ifrw=/........vWUXzR0II___II0I__YII|fuW.../UuRIp;;j;j;jK;jK;jK;;;pIR*,........vcc/W/W,,,UU,UU,WW,Wv.......,*fIY';mm)&q&CKmmmCCCmmm;5YIw........./UXu*RR%RRrrz*wUU/vv.....",
+".../Xr0xC>88P8P8PPPPPPP8q>;Yf,............/WXu|IN___N|z=,c........cUXr|I5eTeTTe'!xx5'Te!xO0f*,.....vUXz|gx55eTe'xOI|Qrr*w=,c......cUwr|_5TeT7T7TeeTTT7e7TT'_0z,....vWUwR|g_')>>KeeT7>>)'_I|R*,v........c,UufI;&8q&pIfzXW........./*fIpK>q>C77Cqqq>)ee'5xg0R*=c............vcWW,WWWW,,UU,/v.......W*fN!eTm77Cqq>)TTTTe77TTTe'x0X....vWwu$I_x5eTTe''TC>&;!0RzU/......./,Uz%|Ox5'5'55x_55eee!_IfU..vW*fI;&&qqqqqqqqqqqqq8qqjpIR=c......cWUUXXX****zzz****wXXUWv....v,%l_5eTTT)>qqC7Tm)CqC)mTTe'_r/........vWUX*X***wu**UUU/v.......",
+"...,ul@^2((((t(((t(t(((((G~@Q,...........c,*%i4{{+++s@9uU,v......vWX%i4{[byHybb[+++-ayb-+s@i%U...../w%i@{-ayyyyb-+s@#i%%u*U/......Ww%i@+ayyyyyyyyyybyyybybb+diX....vWUuQ#@{-Z]]2HyHZ](Z-{dJ$%=c......../XzRL5a(((2-ni%uX/.......vUQ4{[]G(G]H2Z((((GHya[<{@#$uW..............vccc/W//W/W/c........UQJ{-ybyyH]Z(2HHyyyyyyyyyyy-s%....c=u$4s+-ybyyaybH2]]a+d#$u=c....vWw%%iJs-ayybyba<<abyyya-s#u..v=Q#1-((((((t((((((((G((]<B4Q,....v/U*u%QiiiiLi#JJ#iii$9%uwUv.../*i@+abyyy2G(G2HbyH]((2Hyyba+#,........./,U=w*uuuuXXUU/c........",
+"..vWul@+HGG]((G((tt(t((((Z<d%W...........v,*%i@{++-+{4i%wUc......./X%i4{ayyyayb<+{{<[b[+{dJi%Uv...c,u%i@+ayyyyyaa++s@#$%uXUc.....vWu%i@+ayybyybybabyyyyyyya+di=v...v/wu%i@{+HGZZyHyZ2ZH<{@J$uUv.......v/=u%#s^ZGtZ<@#%u=c........=94Ba2GGGZyHZG((G2ybyba-sJi%Uv...................vv.vv.........vX9@{ayyyyy2GGZbyayyyyyyybyaaduv...cUui4s+[abyyyayy2GG[+@J$%Xc....WXu%$J@{<yyyyyyaaabyayaa<s#Xv.v=%#5<H2ZG]ZG]]]G]GZGGGG]a{4i=....c,u%9$#J4@@ddd@d@d@@4Ji$%u,.../Q#s<byyyyH2GG2yyy2ZZZybyyya+#=...........vccWUUUW,,W/c.........",
+".../X%l:A~SSStFSttFtFtSSS~EN%/............/Uu%$J4444giu*U/........v,XuiOsBBBB1d@h4O4M@@Jl$%XUW....c,wu9OnB^^^~^^B11:Ni%*=Wc.......cUuu$41B{BB1s1dsns1BBBBBsMi%W.....vWU*%QN:E^^~~~k~k^E:Ni9uX/.........vWU*%L:}6AE:l%*=/.........WwQNnk~S~~^6^^kk^^6B^B61:l%*W...................................U%i4@BB{B^~~~kBn@ns1B11s1Bsdgwv..../UuQLJ@n{B{sB1B^k^Eh#9%X/.....WXu%QiO:1B^B1s1sssB{B{B@4l%U...WX%lME}6A6A^AAAA^k^~~S~kEMiu,..../WX%9igMMEnnEnEnE:E::MNQuU/...vX9Jd1s1BB6~~~^^BB^^^^61nsBsM%c.................v...............",
+".../=ufMA~SFSSSSFSPSSFSSFkENrU............c,Xu%liLlLi9uX,c........./XuQg:111n:hNLLLLNLL$9uXXUc....cWXu$N}kkFFVFVVVA}hLQuU/c......./=Xu$N:11nn:MMhOMh::111BnO9u/.....vcUUu%lg:1AVooVkA}:OL%uX=/.........v/=wu$NM::hLQuXWc.........cwrlxDF~Vk611EE1}116kVkDEN%*,..................................v/*lO:n1E116V3D:MOOM::nnnnnn:LX....v/=*%lLgMnn11111}BE:hL$%wWv...v/Uu%LNMn}k6E:::nn11111:ML9uW...c,wzlNhM:::::::::nEAV~FAENQ*W...v/=wQLghEAAkkkkkVDVAVVAELzXW...v,%LMnnnnn}kFVk61111611nnnn:Muv.................................",
+".../Xr|YK&q888PPPPPPPP88q&pIfU............/UXzR|0III0|uX,/v.......vWXz|I!5e'5xY_NII0II0|Rrw=,/....c,=r|pK&q88P8qq&&KpI|u=,c.......c=wu|O!'e''!xY____!5''e''_frW......vWU*z|IY'K&PPP&m'xI0RzXWc........../WwrfIYYYY0R*w,c.........cUzfY;&q&jm5'5''''eK&qq&;_|z,...................................WwfI!'eemmCC&K;Yx_x5'55'5'5xIw....v/U*%|L_Y'eeemeTem'!_I|%XWv...v,*%0_!pKj&C;xx!!};e'e'!I|%XW...cW=zR|0IIIII_IYYY!pK&qqjpI|z,...v,=u|IY!;j&&&&&&q&q&&&j;Yf*W....Ur0_x'5'5;jqq&Kmmeee5'''5'5Yrv.................................",
+"..vW*f0!jq8888PPPPPPPP88q&mYRU............cUzf0_x!!xxLf*=Wv.......vUXrlM5TTTeeE!xxxxxx_O0Rr*U/....cU*z|YKC&&888q>>Cmx_|R*UWv......cU*R|xeeTeTT'55!55eeTTTe'x0zW......./XzR0_5e)&PPP&7T5xI|Rw=/..........c=wr0_5'5!_|RXU/.........cU*RIpK)))7m)mKmmm7)q88&K!IrUv..................................WzfN5em)))>>q>Km;e;mmTTeeee!IXv...cW=z|0Ix'7)7)7C)7)7'xOI|r=c...WXz0Y;mmCCCCmeeem7))Tee5O0r*/...c,U*zf||00000III_x'm>qq&mY0zW...cWwr|__'e7C>C>>C>C>C>Cj;IRwW...vUfIn5''eT7&88C))77TTTTeeee5_R/.................................",
+"../w%Ld^Z(((((((t((t((((G]<1iU...........c,u$4{<byya-{J$uw,v....../X%$4{aybyyyyba<[abaa+s4#QuU..../=%lh{<HH2](((2bya+s4i%uXWv....vWw%i@+ayyyyyyabbyabyyyyya+di=......c=%iJd+[b2G((((Zya+s4iQuW.........v,u%id+[yaa{4i%*Uc......../Xr$Od{-aHyHZ]]222H](((][+d#*v.................................vU%#@+a2]Z]((((GZG(2ZZZHyyya+4uv.../U*Q#d{-b]G(]ZG(]]Za+{dJQwc..vU%#d-2Z]ZZ2yyyybH]]]ya<+s4$%U...c,=*zQ$liil#JJJ4d{+2]((ZaBdiX.../=uQJ@{+-aayyybybbyHbb<Bh$r=...vXi@+ayybH2]((]HHybyyHyyybb[{$W.................................",
+"../uQ#@+ZG(((ttttt(t(((G(G<d9U.........../w%i@+ayyyyb+@i%*,c......cXu94{<ayyyyaybbbbaya<{@#9u,v...vXu$Js+[yy2GGZyyb-{s4#QuuU/.....,u9i@{ayybybyyyyayyyybyya+@iXv...../X%i4s+ayZG(((Gyy[+s4i%uW........./=u9i@+byy[{@i%uUv........cUu%$Jd{+-[abH2222GG2222a{4iXv..................................U%#d+a2G]((GG((tG(tGGZbyyaa+@uv.../U*%i@{[aZGGG(GG(GZH-{sJQwc...Uu#n<]GGG2ybyybyHGG2ya-{sJiuUv...c,Xwuu%%%%Q9iiJ4@+aGGG]a{@iwv..v,wQ#@s{++<<-aaaaa[-<+{dJ9uWv..vX$@{<byybHGGZ2ybyyyHybyyyb<s9/.................................",
+"..cU*%L:ASSFttttStStFSt~SkEgu/..........vWUu%N:B^^^^6ngQuw/v......./=*Q#dsB{B{B{n@ss1Bs@JlQuX/...../Xu9L4:1B^~~^11n:Jg9%uXXU,v....vU*%ihsBBBB{B{sBsB{B+BBBsMiuW......cUX%QL4:B6~SSS~6Bd@L9u*U/.........c/Uu%l@1B{1M$uwU/.........vWX*u%$LJ4hh:nn16~~~~^B1:LQu,...................................W=%iMn^~S~S~SSSSSSSSS~^B{B@4QU....v/UXu$Lh}~~SSSS~S~kBMOiQuW..../X%LEkS~~^BBnsBB^~~^1d@N#QuX/.....vc/WUUUw==Xwwu9lMEk~~kENl*W....c,Xu9$L#JM4M4@h@@4O4J#$%*X/...v,u9J@n{B^^~~~^BBBBB^^^^+B1@Luv.................................",
+"..c,XulMASSSFPSSSFSSSSSSFkElu,...........cX*QNEkVV33AEI9uUWv.......cWUu9OM:n111nEEEnnn:NL9uXU/.....WU*RlLM:ED33DEhhNN$9%uuw=Wc....v/XuQNMnB1661EnE1}6}6111:N$u/....../,XuQLgMn}oFSSk}nMgL9uX=c.........vW=XzlNn}BnN$uX,c..........c=wur9LNNOOON::Ek33A1E:NluXWv..................................cUu9LMEk~~S~~~SF~FF~kk611:hL%U.....cWww%lN:Ak~~~~~okA:NlQ%XW..../Xr$:Dk3VD61nnnEAVVDE:MN$%uU/......v.vvc///WW,=XXrlhAkk}hL%uW.....cUwuu%9llllllLlLLl$QQ%uX,v....,X%lg:nB6k~F~6Enn116666A1:N$X..................................",
+"..c,wr|pK&PPPPPPPP8PPPP8qjpI%W..........v/Uu|_K&q8PP&;_RrXc........c,=*r0OYx''mKjjjjm5!_0|rwU/.....WU*%0IY!;C&&Kp__III|$f%z*U/v..../U*RI!5'emKCjjjCCjCKm'5!If*/......c=XuR0IY!;j8P8j;!_I0RuXUc.........v/=uR0pmjj;_|rX,c..........cUX%|IIY_____Y!pj&&K;5xIfzUc...................................vWXr|Ipmj)K)C7K))CC&Cme''!O|zW.....c/=XzR0Yp;;;T;m;;'Y0|r*U/..../UufYpmKKjjK;'!';KKm}5!xIRrX/............vcc//W=X*fIYpppI|rX/....vcWUXwuu%rrRRr%RR%RRru*=,c...../Uuf0_!'m7Cq&Ke'';KK)mme5YIfU..................................",
+"../U*|Ipj8PPPPP8888PPPP88&mY|=..........cU*f|!j>8PPP8jY|rw,v.......c/Uwr|0O_5T7&888&CmexIRr*U/....vWXz0I:5emCq>K'xx___OIgI0fzXv..../Ur|_5eT7C>>q>qqq8q>7Te5_|*/......cUwR|I_5'K&8PP&m':_I|Rw=c.........c,Xz|I;C>qC;IfzXW........../XR|_5555xxx_x!eCq>)'5YLR*w/...................................vWXrfI!e777T7777m7))777TT!_fz/.....vWU*rf|I_xx'''''!YI|Rr*U/....cX*r0xxe7C>C7e'eTT77TTT'_0RX/...............vcWW=*r|IY_I0%*Uv.....v/W,=UXXw*u*u***z**XX=Uc....../UXz0_5TT)>>>)meT7>>)77T'x0rU..................................",
+".vUu94{[Z((t(((G(t((((((GZ[BJuv........./*%#n+]((((ttt{Mi%wc.......cWXu%iJ@{<bH]((((]y-{@iQuwW....cw%i4{[yHHZ((Zaa-<<+-<+<{d#%W...cU*9J{-bby2GG(GG((G]2Hya<s#%W.....v,u%i4s+-b2]tt((2a[+s4#%uW.........cUu9Js[G(ZZ<sJ$uXc........v=%#s+byyya--+--HZ]]2b<{@i%*,...................................c,u%i4{[byyyyHybHy2Hybybb-d#uW.....v,Uu%$i4d{{++++{sdOL9%uU/....c=r$4s+aH2]Z2bbbyyybyyyb+s#Q=................v/,Xu9L4@@4LQuUv......c,UwX*uuuuu*u*wuuu*=,/v......,*%$4{-byy]]Z]HHb2Z]Z2yya{@$w..................................",
+"..Uu9J1<bGG(GGGG(G(GG(GGZH<{4uv.........,*Q#:+HG((((([{4$%*,........vcU*%iJd{<b2t((GH[+sJ$%u=v....,uQJd+bZGG(((GZH2H22H2ZHa+@9=...cU*%#@+-[abyyybyaaHHab[<+di*W...../,uQi@s-b2G((((GG2b+{@J9uU........./Xu$J1<2GGZ[sJ$uX/......../w%Js<baaybb<-<aaZGZb[+s4i%X/...................................v,X%9Jd+abyyyyyGZZybyyb<-{4i*v.....vcUXu%Qi#4@4@@@@4#i9%u=Wc....c=u9L@s+-bHyyybyyayyyyyy<{4iXv.................c,w%9iLiiQ%XW.......vv//W,,,,WU,WW,WUUWWv......../=uQi@{-<byy222ZZZZ2yba<+s#%,..................................",
+"../Xu$NM16~~SSSSSSSSt~~~6EML%=..........cUX%l:A~SSFSSDMl%XUc.........vc,X*uQiNn6~S~kEh#i%*UWc.....cXuQgEk~SSSSSS~S~~~S~S~~kEg%,..../UXu$#J4hhMMMOOONNO4O4J#9u=v.....c/=uQLJnA~~StFSSS~6nNL$%X/.........vWXu9OEkSSkEg9uUWv........cUuQJdsB{BBBB116^k~kB:4LQuXUc...................................vc/UXu$i4M@1B^~~~~^^sn@J#$%u,........vc/=UXuuuu%u%u*uXXU/cv....../Uwu%$NM:1BBBB{1dnsBBBB@Ml%U...................v/UX*uXX,Wc................v...v....v...........vcUXu9i#4:nB6^~~~~+B1:4#iQuUv..................................",
+".vWU*%LNMnEkk~~~~~~~kkk}nhLQuW........../,UufO}FSSSSV}NQuw,c...........v/,X*%lNEVS3D:N9uX=Wc......c,Xrl!DSSSSSSSSSSSSSSSSFkEL*W...../Uwu99lll$$9%%%%%%9ll9%%X/......cWU*%lg:DoSSSSSS~V}hL$%uUc..........cUu9IEVSVDxL%*=/v........v,XulMnB1AkkkkDkkV~AxglQuX,c.....................................vc/,Xu%QLNM:6kS~~6E:MLl%u*,c.........vcc,UUUwUUUUU=U,Wcv.........cWUXu%LOM::nnn:hN:n11n:OL%U....................vc/WWW//v.......................................vcUXwuQ$gN:1^~S~k6nMOlQ%uXWv..................................",
+"../Uw%lIOY!p};;;;;;E;;'!II|RXW..........cUU*fY;&PPPP&pIfuU,c............cW=XrfIpj&&KY0%zUWc.......c,Xz|pjqPPPPP8q>qq>qqqq&jpIrW.....vW=XrzrrRRRzruzuzuzrRru*U/......vWU*rflY;&qPPPPPq&;_I|z*Uc.........v/U*%Ipj8qjp0%XUc.........v,Xr0Y''mK&q&qq&q&&jpI|R*U/v.......................................cW=XuRl0Yx;C&&Cm'Yg|fzX=Wv...........vvcWW,,U,W///ccv..........v/U=wzfI_x!5!!x__Yx''5_I|z,......................vcvv............................................c,w*zf0_Y;m&&&K;!_L|fuwU/...................................",
+"..c,Xz|IIM_Y!x!xx!!!!!Y_I|frXc..........c,wr|YK&q8&8&;YRzwWc.............c,=*R0pK&j;YRzwU/........cUwR0YK&&qqqq&>C>C>>>>>CKpIzW......cUwwuruzu***wwwXur%rzu=Uc......c,=wrfIYmC&&88qq&C;!0|Rw=c.........vWU*RI;&8q&pIRzUc........../XR0_5eT)>qq&>>>CC;Y0%rwUc........................................vc,=wrr|I_pmKCK;x_0$zzX,c..............vvc/c//cv................v/,X*r|0_xxx__Ig_x!!x_0RzW......................................................................vWUwzzf0_x;mj)m'xI0|z*U,c...................................",
+".v/Xu%i@dss{sndnsBssBssdJiQ%uc..........WXuQOs[2ZZZ]2<n#QuX/.............cU*rQ#s-[<6dg%zX/......../wz$Os-[22HH2H2HHHH2HHHa[B49U......vW=uuuuuuuwXXXXXXu%uuX,,c......c,*u9i4n+[222Z22aa+B@#$uXc........vcXzR#1-]((2-:i%*W.........vUu$4s+<bH22ZHHHba-B@#9%w,c.........................................vWU*%QiJ@s{+B{B@Jl$%uu,v...............vcccvv...................cWw%Qi#J@d@@@44@d@d@4#$%,......................................................................./Uuu%9i4@{++{Bs@#i$%uU,c...................................",
+"../=u%ilJJ@@@44@@@dd@@4Ji%%u,v..........cUu%id+[ybyy[+si%u=/..............W=u%94d{{@#9%uWv......../UuQi@s++-+---<--a[[--++s@L%,.......vc/U===U=,,,,W/WWU,UWc........v,Xu%$l4s++-+-+-++s4JiQu,c.........c,*9in<22GZ+@i%*,v.........,uQJ@{+-[bbbaa<++s4#Q%*,/...........................................vc,X%%Qi#J444J#$9%uwWv..........................................vWXu%%ii##iiiiii#iiiQ%=c........................................................................c,wuuQ$#JN44J#iQ%uwWc.....................................",
+"..v/=Xuu*%u%%%%%%%uQQ%%*uXUWv............/UXu$J:dnsnd4l%*Uc...............vc,w*%$$$Qu*U/v..........vWXu%9LL####JJJJJJJN#Li$9uUv............vv.cv...v.v.v.............vWUU*u%QLL#N#N#L#$%u*XUc.........../U*%L:}D6}hluXUc..........c,XuQiNJ4@@@@M@NL$%uXU/...............................................vc,,XwuuuuuuuX==Wc..............................................cW=UXwwuuwwuw*uuXwXU/..........................................................................cW=UXXwuu*zuuuw=,/v......................................",
+"...cW,WWWW,W,WW,UU=UUUWWW/cv.............vW=X%lgOMNhg$%wU/v.................v/Uwwuuww,/v............v/,w*u%uuz%%%%z%u%%%uuuwU/v........................................cWUUXuu%uzuu%uuuXUUW/v...........c,=*RLM:hOl%*U/............c,wu%QllLgLLLl$9%*XUcv..................................................//,,UUXUUU,Wcv................................................vcWWW,//,,W,,,W=,W/v............................................................................vc/,W,U=UUUW//cv.......................................",
+"......vvvvvv..vvv...vvv..v................/U=*R||l0|fr*=/c...................c/U,UUWW//..............cW,U=X****X***u*wXwXUUW/...........................................cW,,U=X***wXXX==Wcvv............./Uwr|0II0RrwWc...........vcW,w*zzr%fffRRzuX=W/......................................................vv/c/cc/vv........................................................v.vc//cWccccv.................................................................................vvc////ccv.........................................",
+"..........................................v/,X**rrzrr*XU/.....................c/WWW/cc...............v/W,UUU=XUwXUUUUUUU,U/cv............................................vc/,UUUU=UUU,U/cv...............cWX*ffI0|RXUWc............vcWU=w**zw****wUU/c..........................................................v..................................................................vvcv.........................................................................................vcv.............................................",
+"..........................................vv/WXwwu*XwwUWv......................vcccv..................cc/,,W,WW,WWWUUU,W,W/.................................................cW,WW,,,,WWc.................v/,Xu%$$9%XUWv.............vvWUU==wXXwXUU,,Wc..........................................................................................................................................................................................................................................................................",
+"............................................vvvvvcccvvv..........................v......................v..v.vv.vvvvvv.v.......................................................vv.v..v...................vvvc/W,,//cv...................ccvvccvcvv..............................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................v...vv...............................................................................................................................................................................vc////cv.......................vc//cv..........................vcWWWWWW/cv.................................................",
+"............vc/////ccv......................................................c/W/WWWW/cv...................v//W////cvv....................................................................................vc//W,,,,,WU,,,,W/c..................................................................................vccccv..............................................................................vW,,XX**w==Wcv.................vWW=X*zw=UWcv..................../W=wzuzzzzX=,,/c..............................................",
+"..........vc,Xwzzz*wU,c...................................................c,UX*zuuzzXUWc................vcUXwuzzzzXX,cv.................................................................................vWUX*z*zr%rR%rRr%zz=Wv.............................................................................v/WUUU=U,cv............................................................................,X*RR0000|RzX,c................WwrR|000|RzX,cv.................vUzR|00I#IL|fR*XU/v............................................",
+"........vWX*%$#JJJ#9%uw,c...............................................c,Xu%i#J#4JJi%uwWv............v/Xu%$#J444JiQu=Ucv.......................v///cv................................................vW=*%9iJ4@ddddsdd@@4#$u,...........................................................................cW=wu%9$QQ%*U/v....................cW,,UUWWcv...........................................Ww9J@s+-<+s@J9u=Wv............./*i4s{---{d4i%=,c.......vcv.....v=$J@{-<-a-<+s4J$%*,,cccccv.....................................",
+"........WXu%9J4@s@4J$%uX,c.......................cccv..................c,wuQiJ4ssd@@Ji%uX,c.........../Xw%Q#J@@d@@JiQuXUWc..................v/WW,,XXU,c.............................................c,=wu%%i4dss{{+{{+{{s@@#%Xv.........................................................................c/U*uQi##JiQ%uXc.................cW,U=Xw*w*XX,,c........................................vWui4s+[baa-s4i%*U/v............/uJs{-bbb-{4J$uXUc..vc/W,,=,/...c*#@{<bbyybb-+s@J$u*U=,WWU,U/..................vcc/cv...........",
+"......v/UX*uQiLJJ#li%u*XUc...................vc/c///cv................./UX*uQi#JJ4Jli%uX=Wc..........v/=Xu%$#g4NJgi$%u=Ucc..................v/W,===wU,/v...........................................vvW=XXu%QiJ4J44@44@M44Jl9uW.........................................................................v/,Uwu%Qiii$%XU=c................v/,==XwX**uXwUUW/.......................................vWX%i4@ssBs@4l9uX,cvv....ccv....c=%#4@sBsd@gQ%XUW/cvcWWW,UUUWv..v=%iJ@s{{{{Bd4Jl$%*U,WWW,==UW.................ccW/W//cv.........",
+"......c/,Xu%QlLgggNLl%uwU/v..................cW,U==U,/v...............vW,wuQlLggOONNL9u*UU/v.........cWUw%$LLgOOggLLQu*=,cv................v/WUUUXXXwU,Wv..........................................cWUX*%Q$LLOMMxMxx:MxMMONQu,v........................................................................c,U=*uQlgggL9uwW/................cWUX*uu%%%%uu*=U//.......................................WX%lghn1EEMgl%X=W/c.cvc/cW/c...v=QLM:n1E:OLQuw=WW/W,,=XXwwX,c...UQLO:nn111n:MgL$%*wU===UXXX,v...............v/,,=,=,W/v........",
+"....../U=uf0I___Y___I0%*wUc.................vWUwzzz*w=/c..............vWUXR0I_Y__Yx__I|%*XWc........./UXr|I___xxxx_IIRrwU/v...............c/UwzzrRRRRwUWc.........................................vW=wrf|I_Yp;Kjjjj;j;j;K;pI%,........................................................................v/,XuR|IYp;;pIRuU,v..............v/,=z%|0I0I0||%zw=,c......................................WXz|I!;KmK'Y0f*U,/cc///,,==Uv...URIY;mKm;!I|%X=,,W,UX*rRRfrXc..v=fI_x!''5''!!__0RuwUUXzzrRRu/..............v/UUXXXX==Wc........",
+"....v/,wufg!5e'5e55e5x0fzXUc...............v,UzR||0|R*=,c.............c,=rf_5555'5eT5x_0RzwWv.......vWUuRg5'e5'5ee'5hI|RwU/..............v/Xw%|0LII_0Rz=/v......................................../UXzl_!'emC&&&PPP888qq&&Kp0*c......................................................................./,wzf0_pm&8&jpIr*U/v............c,UXzQI_!5555x_I|R*UWc.....................................,*fI_;)>>Cm5_f%*=,,W,Uwwzzz*U..vwlI5mC>>7'xIfuXXUXwz%|0Ix_IR,..vw0_5EeeeTTTee'5_0fuzz%f0g_I|X............../UXuf9|fRXU/v.......",
+"...v,Xu%i4{[ayyybybya-s4iQ%=/............vW=u%i4s{{sJ$%u=W............/Xui@+byayyyyyy[{dJ$%Xc.......cXu%#s[abyyyabya<{@J$uUc.............WX%$Js{{+++{4$uXc.......................................v,u9#@+ayHHZG(ttPtttt(((ZZ-:%,.......................................................................Wwu$#@+[H]t(t~d#9u,c..........v/Xu%$#d+[bybyyaa+sJi%*=c...................................vU%#@+[]((]H[{@i%u*uuu%Qi#44Juc.vu4{-HG(GZa+d#9%%%Q$#4s{+a<{J*..c%4+-ayyyayyyyyb<s4#ii4@s+-+s%c............vUu$J{++s4iuXW.......",
+"...cUuQi4@+aybbaabbyya{@Ji%u,c.........../X*%QJ{-Ha-s#%uwUWv........../X%$4{[abababyaa+dJiuX/......./=u9Js<bbaybyH2b<{@JiuX/............/UuQi@{<aa[+{J$uX/..........v/WWW,,W/cc...vcWW,,/v.......c=%9Jsa22ZGZ]Z((((((ZZ22Z[+4%W......................................................................./Xu%i4{<y]((][sJ$uX/..........cUwu$#4{-bbabbabb[+@#$%X,v...................................,%i4{<bHH2H<{@i%%uu%9iJ4@ss@%c.cuJ@+[222Ha+sJ$%%9iJ@{+<a<<{#wv.cu4s<[aayyyybbba+{@4J@s{+aa-s%c............/X%i@+aa-@i%XUc......",
+"...cWw%QLJ:sBss@@dsB{n@Li$uw/v..........v/UXu%LnA~~6:$%*U,/c..........c,wu$#@dd@ds1{Bd4iQuwUc......../U*%i4dds1B^~~BnJl%uUWc............/,Xu$J@sssd4LQu=Wv..........c/W,W,UWWWW/cc//W/W,W/c....../U*%iMA~SS~A16~FSF~k6B11nxO$Xv.......................................................................vWUXu9LMEk~Sk}N$uwWc..........c,Xu%i#@sBs@ddssBs@Ji%uX/............vvv.....v..............v/Xu9L:1B6B1:4$%wwXw*u$LJ4:d4uc.v=%lOnB6BBn4l$%uu%$i4@@d@@4#%=..cX%iJ4dnB^~~^Bd@4JLlL#4@@sd@LXv............c,w%l4dd@L%*,Wv......",
+"...cWUu9LNhnnnhhNM:n::MNL$uU/v.........vc,=wuRL!kFoAxL%uwU,W/.........c,U*%lNNhhhM:nn:L$uuU/........vcU*%lgh:hnn1kkDxlQuX=,c...........vcU=uQg:1n:NL$uwU/v.........c/,,U=X==U,,,,U,,,==w==WWv....v/wzlI}oSSo}E}VFSFkA1EnhONQuUv........................................................................vW=*r$NEAF~kEN%uUWc.........vc,wuQ$gMnn:hhhhnnnMg$QuXWv.......vvccccc/ccc/c/ccv...........cUu%lg:1n1:MLl%uwwX*%lgOMM:Nuc.vU*9NMn11::MLQ%uu%lLO:nnnMNluW...,u%LgM:n6kkDEhOOLLLgOMh:::h$w............./U*ulghhN$uXU/v......",
+"...c,wr|0_Y5''!_NY!''!xI0|z=c.........cWUX*rf0Y;&qqjpI|%rwU,,v........vWU*rlI_O_xx!'5YI|r*U/........v/Uur|I_x!!'KC&KpI|RX=Wc............cUXzfIx'E!_0Rz=W/........../UUwuzzuwXXUU=Uww*uzz**X,/....vW*R|Y;&PP&;p;j8Pq&Ce'!!IIRzW.................vvvvv...................................................v/U*r|I;j88jpIfu=Wc........../U*%|IO!5'!Y__xx''xII|%XUv......v//W,=,WU/WWW,,W/Wcv........./U*R0_x''5!xI0fzwwwz|0__x!!Yrc.v=*fIx5'''x_I0ffR|0IYE5'!_O0r,..v,uRl__x'K&&K'YY_II0IYx!!'x_f=............v/U*%|INII|rw,Wv......",
+"...vUwr|I_5eTT'!x55Tee!_I|rX/.......vWUXurR0IIpKq8q&m!_0$RrzUW........c,=ufI_x!555ee55N|%zU/v.......v,UuR0Ox55ee7CC)'_0RrXW/............/Uwzl_x5'5O|R*U,c........./U*RQ|0L0|frz*X*zR00I00|Rz=/...v,uRIYj8PPPjmm&8PPq>)T'5xN|u,v...............c/,,W/cv................................................../w*R|Y;&q8q;_|R*Uc..........cUr9I_x5ee15:55eTe5xOI|rU/....vWUw*zzzz*X**uz*u**XUWc......../wr|IxeTTTe5!_09R%f0gx!5'E5xrc..Ur0_5TTTe5!xIL00g_:5eeTe!_0%,..v=R|Ox5eTC&qCT'55:xx!5Eee'5_|=v...........cUUrQ0_xx_I9z=,c......",
+".../Xu$#@s-[ybybaayyya<s@#QuW....../Uu%$#4d{++[]t((]H-++sd4#%wc......v/Xu9#@{-bbbyyya+s4$%uUc.......c=u%i@{+abybHHZH[+{4i%XUv...........,w%$Jd++<{@#$%X,v........vX%#@{+-a-{s@Ji$iJ{-a[-+{sJQ=v..v=QNn^~ttP(2HHZ((((2Hya[<s4$*c.............c,wwuuuuw=UWc..............................................vWu%#4{a]((([B4i%*Uv........c=u$Js{<ayya[<-bayyb<{dJ$u,.../,u%i#44JJ#i##JJJJ#i9%uXWc.....vU%i4{+yyyyaa<{{d@@s{-[yyya-{9/.vu$d{ayyyyy<<{ss{+[ayyyya+{@Lw..c%4s+[[byHZ22Hyaybaabyayb<+dLX............W*%$Js{<<<s4iuXW......",
+"...c=u%iJs+abybbbbbyaa{@Ji%w,v..../Uwu9i@s{+-abZ(((GHba-<{s#i%,.......,XuQJd+[ayybb[-{@#$%*XW......./=u%i@{-bayybybyb+s@i%wUc.........../Xu%#4dss@J$%uUc........./w94s<abbba-s@4i#@^2GHyb[+@iuW..v=QJd+Z(((tZb2G(((Z2ybba-{49wc............c,wu%%9$%%uwX,v..............................................Wu%i4BaZG(ta{4i%*,v........c,u$Jd+<bbyb<-[abbyb-+s4$*W.../XuQ#@sss@444@4@@s@4#9%uw,/....vU%i4s-bybyba-+{sss+<abaya<+@%c.cuJd+[yybyaa-+{{+[byayaaa+s4iXv.c%@+aaybayyyyyyyaybbybyaa-s4$=v..........v,u%i4s<bb[{4i%*,v.....",
+"....cUU*u9#@1ssndds1d@N$%uX,v.....cWUXu$N@nnn1BkSFS~^61sn:hLQwW......./=XuQL@1sBB{sd@4L%uXUWc.......cWwu%gh:s1sBBBB1d4Ji%*=Wv............W=Xu%$i$%u*U,v..........cUui4d1{+BBd4giQQL:6^^BBs@#Qw/..v,X%lh}oSS~^^^~SS~~^B{n@4#$u,............v/UX*%QQQ%%uw,/v.............................................vcXX%QOEk~~~}ML%uUW.........cWUuQLJ@nsBsd@@1sB1s@JLQu,v...v/Xu$#JM4N#g#NJOOMMgi%u*XUWv...vW*%iOn6^+Bsd@@M444@@sB{Bs@JiXv.v=9#41B{BBsd@M@h@n{B{BsBs@O$%U..v*i4@dds1sBBBB{B{sBssB{Bd4l9u/..........v/,Xu%i4@{Bs4$u*Uc......",
+".....v,U*uQLghMMMMhhOL%uXU,v......v,=*R$:}ADADD3SSSFVkDAAAEMluW.......cU=u$gMn111nnnMNLQuw=/v.......cUUu|OE}En::n1n:hNL9%X,c.............vcWXXu**ww,/v............,urLhEDk^D:OLl$$lNE}1Bnn:g%*W...cXuRLM}AkADkVSSSFk61n:hgL%uWv...........v/U*%QLNON$%XU=/..............................................c=*u|gE3FSV}Y$%*U/v........c/=X%$Lg:nnn:hh:n1n:NL$%*Wv....WXulOh:::MNOOgM:EExN$Q%*U,c....,w%LN:n}111n:::MO:::nnnn:ML%w..v=%gM:E16BEnn::::nn1111n::OL%,..v=9LOM:nn1nnnnnnnnnn1nnnhg$uU/..........vW=wuQLNn1EnN$uU,c......",
+"....../,wXz$|gO_hYN0lfuww,/.......vW=*f_;&&qqqq8PPPPPq&qq&j;IR=.......cUXrl_5E'''E''!YI|%*=,v.......c=Xz|pjj;'!5''''YI0fuUWc...............c,,UUU,Wcv............v,uR0_;C&&C;YI0||0I!'5'e'!_Ru/...cUwr|Y'}e)C&q8PP8&m'5!_IIruW...........cW,wr|0O!!!_|%X,Wv............................................vcU*%0Y;&P8&Kp0RuUWv........c/=wzflIx'''E!!5'''xI0RuX/v...vWX%0!''''5!xYY!;jj;!I0|rX=/....WwfIY''ee'}e5'!!!''E''''!YIfw..vw0_5'eemme5e5'e5eee'e'e'5xIf=..vUR0O!5''e'e55'5''E'''5!xI|RXc..........cWXrf0Yp;)K;Y|rX=c......",
+"......vWU*uf|0_x___I|rzXUWv.......c,*z|pK>8qq88PPPPPP8q8qqq;YfU......./U*fI5eTTTeTeTT5_IRzXWc......./Uwr0;CC)e'5eeT5:_0RrwWc................vc///ccv.............v,z|I!m>qq&m'YI0II_5'TTTeex0z,..v/Uur0_'eT)>q8PPP8q)Te5xxN|z,v..........c,wr$I_5eTe5_|z=Wc............................................v/wz|Ip;&PPqK!_|rw,/........cW,XrQI_5eTTeeeeTTe5_0|rXUv.../X*fg5eeTTTT'55'7&>je!xN|Rw,v...Wu|_5TTTT7eTTTTTeTTTTTeee5_0*v.v*I5eTT7e777TT7T77TT7TATeee!Iwv..XfIx5TT7TTTTeeeeTT7Teee5xIRzW........./,wu|Ix5mC>>C'IRwUWv.....",
+"......v/=u%l#4d{{sdJ#$%wXWc......./=u$4B2G((t(((((t((((((ZZa5Lw......vUuQJs-byaybyyyb<{d#9uw/v....../XuQh^]Z2bbyyyya+{@i%uUW................vccc/cv..............W*QJs+HZ(GZH-+{dss+ayyyyya+d9=...W*%i@{[ayHZ(((((((]Hyb-+sJ$*c........../Xui4s+abyy[{4$uw/............................................W=u$4s-2](((2-{4i%*Uc.......c,Xu$Jd+[byyyyybybb-+d#$uXc...WuQJs<yyyyyyyayHZ](2Haa+sJiuW..v=%4{-byyyyyybyybybyyyyyyb<{4%c.c%@-bybyybyyyy2HHHHbybyybyb<d%c.c*Ld{-ybyyyyybbybyHHHbyya+s49U......./Wwu9i@{ayHGG(]-n#%u,c.....",
+"........c,*%%i#4@4Ji9%u=W/........c=uQ#1-[bH22Gt(t(((Z2H222+diXv......,u%is+abbabbaba+s4iQu,/......./XuQ4{[babbabba<{@#i%XW......................................c=Q#@+[HZ22a<{ssds+aaybyyb+@i=v..v=uQJs+<[yH2]t(((GZyyaa+sJQwc........../=ui4{<byHHb{4$%X,v................vc//cv....................vWw%9Js+<2]22a+{4$%uU/.......v,X%$#@{<byayaybyyb<{@J$u=/...WuQid<ayby2HyybyH2ZZZHHb+@#QUv.vw%J@+<abaybybyyyyyybyyy2ya{@%c.cu4{-bbbybyyybybHyHyyyyyyyya{Qc.vui4s+[baybyyyZy2Hbb22Hyy<s4QU.......W*%%iJ@+ayHGZG]<@#%*Uv.....",
+".........vWUX*u%uuuXw,/v...........WUXu$NOMM:hEk3SS36nh:MOOl%u/.......cUXu$J4@ddsdd@4J$%uw=cv.......v,Uw%0Oh:@@@@44JlQuXU/v......................................vWw%lOnB6^B1:h#LLLJ@nBBBB1@$uW....c,Xu%i#J::1^~S~S~^BBd@4gQuW...........v/Uu$J:6~~~B:9uXWc................vcc///cv...................vWUwu9NM:x::E:hJ9uX=Wc........vWXu%i#4nsB{B{BBsn4Jl%uXWv...c,X%9#4:1^~~^BBB166k~~~^nO9uW...,Xu%i#44@h@ndnBBBBBB6~~~kBMLXv.vU%$J44@@nsBBBBBBBB11@n11^k6Mu...Wu%9iJ4@hdn6^~~~^^6~~~~^nN$uW......v/Xu%QiN@1B^kFkDnL%w=/......",
+"...........//WUUUUUW/cv............./UX*zRQlLNhEoSFAEONL|%Ru*,v.......vW=XuQLLNONOgNL$uX=/cv.........vWUwuRlLLggOLLQ%XX=,v........................................W=u%LMn11n:MgLllLlOM:111:Olu/.....cW=w*%QlNhEAFSVk61n:MgL%w,v.........../Uw%lNnAkA}g%wW/................v/,,,,,,/v..................v/UUu%$LLggggNLl9uwU,v.........cUX%QlO:nnE111nn:Ol$%*=/....v,w*%lLOnBkk61nn1E1DVFFDEgl%,...c,Uuu%QLLNNM:n166111EkV~V}O$w..vW*uQllgOM:n1nnn:n:n:hh:EDD}gwv..cWUuu9lLgO:Ek~~k6B1AFFkD:LQuW......cUwu9LOO:nEE}}}:N$uwUWv.....",
+"............vcWW///vv...............v/=wX*rf|IYpK&jKpI0frzuXU/........vc,=*zRlllllflRR*U,cv...........v,=wrr||lf0|Rzu=U//........................................./=*R0Y''e'!YNI0000_x!'e''_0*W......cWUXuzf0Ypj888&Ke5xYI0fwW............/=Xzf0Yp;pY0rw/v................v/=U=Uw=U/v..................c,UXr%||||||||RzX=,/.........vWX*%|I!pmmmmKmm;;!I|RzUWv...v/Xzr|IIp;)7me'''5;mq8q&;Y0r,...vWUX*%f|0I_x!''me;5';jqq&KYfw.../Xr|0IOYx!''!!!!xx!!!!!'m;pI=...c,=w*zf0OY!;mj)Km;ejq8&jpIR*/.....cWUuRIx!'''''!_YIIRrXUUv.....",
+"..............vcv.v..................cWUwrr|0I_'m))m5Y0|rzXU,c........./,UUwrrrRrRRrr*=UWc.............cUXXuuRrRzur*=UWc..........................................WUzRg!eTTee5!xh__x!'TTm7e5IfU.......c,=*rfIY;Cq88q)Te5!_g|r,v...........cW=*Rf|III|R*U/................cUw*rRfRrzwUWv................v/W=XzzzrzQrzurw=,cc.........cUXf0O!;)&>q>>q&>7;!_0fz,v...c,wzf0gx5em7T7Teeee)q88&K!IR=...c/,UzR|0g_5'eTTTTTeT)>q8>KpI*v.vWurlIx55eT'e5!_xYx55eTTee5p0Xv../,UwzRQIx5eTm77Tee7Cq8qj'_|r,....v/UwRIx'TeTTTe:x__0|RzwU,v....",
+".....................................Wwuz%Qi4s+[yyya<{@J$%u*=W.........vW,Xwuu%%%%%%uu=,/c.............vW=uuu%%%%uuwX,/...........................................Uu9#s-byyyyyb[<<-abbHH222[{#u......./XX%Qi@{-Z((((]Hya<+sJ$wc...........c,X*RQ|l|frRzX,...............cXu%i4s{s@#9%wUc................c/Uwuu%%%%%%uuwXU/v........cWu%J@{-2Z((t(((((GH+{sJ9uc...WXu$Jd{+<yyHbyyyybHZ((((2<s#u...c,Xu%L4s{+[bybybyyyHHG(((2+d%c.vX%$4{-ayyyya-+{{{+-ayybya-{J*v../X*uQi4s-byyybyHyHbZ(((]a+hiU....c=u9#s<byybyya<++{s@#$Q%uUc...",
+"....................................vWXu%%QiJd+abbyb-{@J$%%*X/v.........v//,=uuuuww==WWvv...............vWW,U==XwuXU/v...........................................vUu%#d<yyybyyabbabbyybGGG2a{4*v....../U*uQi41<2G((GZyyba+s49*c............vWX*u%Q%%uu=,cv.............v,w%i4s<[<{@iQuX,.................cW,U*w*u*uww=,,/v.........vWwQL@{+[ZG((t(((GG[-{@JQw/.../w%$J@{+<aybyyybyyb2G((G[+s#Xv...c=uQ#4s{<byyyyyyyybHGGtG2<s%c.v=%i4s<baybaa+{{s{{<bbyybb<{Juv.vW=u%$Jd{<ayyyyyyyyyZG(G2[+@i=v...vXu$Js<byyyyyb[+{{s@@Ji$%uU...",
+"...................................../,UwuuQlL4n1BB1@Ml$%uwUWc............vvcc/cWW/vvv....................vv.vvvc//c..............................................WX*%i@1^^+B{BsssssB^^~~~k6M$X......./,Uwu%iOnASS~k^^Bsd@Ni%U...............v/WUU,,W/cv...............c,Xu%L@BBB@g9%*UW...................vv//c///cvv.............v/WXuQLhEAk~~k~k~k^EOL$%u/v...v,Xu$L4:nBB{BBBBBBB^~~~kEhLQU...../X*%iJ4@1sBBs1s11B6~~S~A:guv.vU*%i4:ss1s1@4g#LJO:166B1sMJ%U...cWX*%9g4d1BBs11BsBB~~S~kEMl%W.....WXu9#@1BBBs1d@MJO4M4giQ%*,...",
+"....................................vc,wu%QQLNMMn:nhhNL$Q%u*Uc.................v................................................................................../UX%lMn66B1B1n::::1B^~~FkEgQUv.....c/,=*uQlgxA3SSV^6En:MO$%Uv................vc//vvv................./Uwu$Nx6AAEO$%uXWv......................v....................vWUXuR$NhE:EEE:ExhN$%u*U/...../*%lOM::n111n::EDAAAA}EMLQ*W.....cU*%$NM:nnnnnnnnn1BkFS3Dxl*v..WuQlO:nnn:hNll$LgM:n11nnMOl%,...c,wuQLMM:n:nn:nnnE1^FS3DEOL%,...../=*%Lhn111n:hNgLgOMMNL$%uUv..",
+"....................................c/UuR|0II__x5!!xY_II0|frX/..................................................................................................../UXz|_'5Tmmmmm;m;;emj>qq&;Y0=......vWUXzR|IYpj8PP&Cm5'5!_IrU........................................v/XzRIY;&q&KpI|rXUc............................................cWUw*rzR|000f0|||%r*XUWc....v,wRIx5'ee''5!!!;&&Cm'!_IfzX/....v/UufIxx'55''''5'''mCq8&KpI*v.vWr|IYE''!_g0|f|0_x5'''!!YO|r,.../Uw%0Y!555x5!5!5''mjqP8jpY0rW.....cU*%0_5'e'5!YO_I_Y!5_I0fzU...",
+"...................................v/=*R0Oxx:55'5ee555x__O0|z,v..................................................................................................vWU*RIxe7T7C>>&>CC)77>>qq>K'I*v....vW=*R|I_!'m&8P8>C77mTe'_|*c......................................./=wr0_'Kq8qC;x0RzU/............................................./,WwXrrrrfRfRzrr*wU=Wcv..../=r0x'TeTTTTe5''7CqCm'5xI|z=/....v,Xrl_5TTe5e'ee'eTe)>q8qCexrc..UR0O5eeT'xOI00I_x'eeeee55_IfU..v/UzR_5eee1e'55e5'T7>qP8&m!_fU...../UzQI:eTeATT'5x!51ee5x_0|wc..",
+"..................................vWwu$Js+<[bayyyaybbba<<+s@iuW..................................................................................................cXu9#d+bHH2GG((G]ZZHbZG((]H[s%c...vWXu$J@{-a2ZG((((G2Z222H+@Q,......................................v,u%i@+[Z(((]b+s#QuXc............................................vW,XzuRRff$f9f%%zuXUc.....vUui4+[yyyybybbab2ZG2a<+{@i%w/....Ww%$@+abbyabaybybyH2(((GZa+ic.cuLd{-byb-{s@@4@{-ayyybya[<sLu...,u9J{[byaabaa[ayayH2(((]H-{#X....v,*QJs-yyyybyybaaayyyb-+@J%W..",
+"..................................vUw%i@+[yyyybybyyyyyyyby-{JQ=..................................................................................................c=uQis-ybH222Z2Z2HHabbHH2H-+4%v...vWX%i@s+aHGG((((GGGGGGG2-d$U......................................c,wQ#@+bZZ(G2H+sJ9uX/.............................................vvW=*wuuuu%uwuu=UWcv......U%$4{abbybbba[<aaH2[<+s@J$u=v...vW*%$4+[aaa<<a[babbabGGGGZa{i/.v*#@{<aaa+s@JJ4d{<yybybyyy[+4*v.vWw%Js<aaa<<+++<-aabZGGGZy<sLXv...v,X%id+[yyyyyybbbbybya<+s4%,..",
+"...................................WU*Qg}^~~~~~~~~~~~~~~~kB:LuW..................................................................................................v/Uu%iMs6^B6}En::::hhOMMMOLlu,....vcUw%igMn^~SSStS~SSSS~~kEg%/.......................................WUu$N:1k~S~kBMLQuU,v................................................./cc/,/,W/ccvv.........c=u%L4ddd@@4444h:::hgi$%uXWc.....c,Xu9i444JJJJJJJJ@h1^~S~^nNuc..U%9iJJJJ#Q%%%%lOn^^^B1BB^6nL=...cUX%i4444JJiii#J44n6~S~^1:JQU....v/,X%i4@s1B+BB1s1BB{B1@4L$*v..",
+"...................................c=Xrg1kkVV~V~V~F~k~VkkoDxlu,.................................................................................................../=XulOnn1En:hggLl$9QQfRfRrw,v.....v/UX%lg:}k~~FSSS~~~F~3Dx$*/......................................./=*%LMED3F3A:O$uX=Wv......................................................v................v/XuQLOOLll$lllLggL$%u*XU,Wv.....v/,XuQQLl9%%u%%QQlNx}kVk}hLuv.v/Xu%%%Q%uuXX*uRL:Ak6nnnEDA}l=v..v/Uu%$llQ%%%%u%%$LMEA~VDEO$u/.....v/,XulNN:E6^AAAAADkA:OL$uUv..",
+"...................................cUXr|p;jKKKjjjKKjKjKjKKpY|wW...................................................................................................c,Xz|O!'e'!YI0fRfzzuwwXXX,Wv......./UwzR|Yp;jjjjjjjjKjKKpYRXv.......................................c=w%|Y!;j&j;pIfuUW/v.......................................................................v/U*%ffl|r*zrffff|f%zXw=,//......./W=*rrRRru*X**uzR|Ip;m;p_|=.../Uw*z*u**wUUwuz|Yp;;!Yx!;;p|,..../,wzrffrrwwuX*urfIp;;KpY|fz/.....vcWw*%|0Ipj&>&&q&>&jpI|r*W...",
+"...................................vW=*z0IYYp!!!p!pp!p!pYpI|zX/...................................................................................................cUwu|_'eT'x_Ifr*wUW/W/////.........c,=*uf|YYp!p!p!p!ppYYIfrU........................................cWwz0Ix'mK;'_0Ruw,/........................................................................./,wwrrrrrr*r*z*%rr*wwU/cv........./UXuur*uwwwU=wurfR0YYYI|zUv..vUUXww=XUU==XUzz|IYI_IIYII0z,....vWU*rzwuXwUUwX*zzf|IYYI|fzXc......c,=Xzf|_'C>qq>qqq>C;IRrw,v..",
+".................................../UXzr|0Nh4x@@@4@@@:4OON0|RwW..................................................................................................vWXuQJs<[b-s@Jlr*,Wv................c,Xur9lNJM@:@@4h44NOL0Qr=v.......................................WXuQJ@{+-[<+dJ$%XU/........................................................................v/,Xwu%%%%uuuuuu%uu*XXU/vv.........c,=uuuwXXXwXXXuu%$|LI#LQzW....WUXXuX*XXUUX*rR|lg#JJ#gN0|*W....vWUXwuuXXwXUX*u%%9|0LN#l9%u/......c,Xu%lL41<2HHHHH2y-B4$%*,...",
+"...................................v/,Xu%Q$i#LiiiiiiL#ii$$%uu,v.................................................................................................../U*%i4s+{{4#$%uUW...................v/=u%%Q$$9$iiiii$i$$%%u,v......................................v/,w%i4@{+<+s@i%u=/v..........................................................................vW=w*wuw*X*Xw===UWWWv.............vWU,U,=UUX=UUX*uu%%9%%%w/....v/WUW=,,W/W,UX*u%%9999QQQuwc.....v/W,UUWWc//,W=uwu%%Q%%%u*,v.......vWw*%9i4@sss{{sssdJi9uUv...",
+".....................................vcWUwXXuuwXXX*uuww*XXXU/v....................................................................................................cW,Xu9i##i9uwXUvv.....................vcW,XX*wXwwX**w*wX,W/v........................................vc,Xu%9L#JNi9uXU/v.............................................................................vccc///c/c//v.vv.v...................vcccc//cc,U/WU=UWWc........v.vv.v....cW,U=U,UUU,=,c...........vvv...v.v/W/WU=UWW//v.........v/W,=wz%%Q%QQRQ%%uXX,c....",
+".......................................vcc//,WUU,UWWW,,W,W/cc.....................................................................................................vc/,Xu9%QQ%X=Wcv........................vvcW,,=UW=,,WWWWc.............................................vWU=uu%%%uXXWc......................................................................................v.....................................vvvvv...v......................v/cvcvv.vvv......................v.vv..v................vcW,UXwXXXXXXXUU/c.....",
+".........................................vvvccccc/ccccccvv...........................................................................................................cWU***XUW/vv............................vccccvccv...v...............................................v//WW,WUW/Wc..............................................................................................................................................................v.......................................................vc//WW,,WWWWccv......",
+"...............................................v..vv...................................................................................................................vvcccvv.v...........................................................................................vvvvv.vv..........................................................................................................................................................................................................................v.v.......v........",
+"..........vvvcvvvv.............................cccvcccvcv....................vvvvccvv.........................vvvvvvv..................................................vvcc///cc/ccvv...........................v.......................................................vcvccccccvv............................vvvcccvv....................vvv///cvv.....................................................vvvvvvv................................vvvvvvvvv..................vv/,===,/vv..........................................",
+".......v/UwXu*uuw=U/v........................c,U=XwuuuuXU,v...............vWU=uuuuuuwUWv................c/WW,U==wwww=U,Wc..............................................vc,X*u%Q%%u*w=,Wv.....................cvcc/cccccc//c...........................................v,,ww*uu*XX=U/.........................vWUww*u*ww=,c................/UwuuQ%uuXU,c................c///WWW,,WWWWWcv...............vWUXXuuuuXU,Wc.........................v/,U=uuuuwwU,/c.............vW=wui$ii$%w=U,/v.............................v........",
+".......v,Uu%Q$9%uX=Wcv......................vcWX*u%%$9$%UUc...............vUXu%Qiii%uXUc...............v/W,U=X*wwwww*X=,,c..............vvvvvvvvvccvvvv...............v/WXu%9iiL#iQuw=/c...................vcWW//WWWW/W////vv..............vvcccc//ccvc/cv............vWU*%9$Q%u*XU,v......................../,UuuQ$%uuX=,v..............vWXu%9i$QuuXUWv...............c/W/,=WW,U,=,,U/v..............v,U*uQ$9%uUUU/v........................vWUXw%Q9%%uX=Wc.............c,*uQiJNgi9%XU,Wv................vvvvcvv.vvcccv........",
+"......./UXu%$LNl%uX=,c......................cW=wu%%LLN$%X,c..............c,Uw%QLLggl%uU,/..............v/==Xu%%%%%%%u*XUW/..............vc//WWWWW//W///c..............v/,wuQLghhNg9%wU,v..................v/,,U,U,UU,,=,,,,Wc.............vcW,,UU,,U,,WWW/v...........c,UuQLNL$%uuwU/......................v/W=Xu%LLlQu*UW/.............cWUw%lLggLQu*wU/v.............//W,==Uww=U=Uw=U,Wcv............/Uwu%$gL$uXU=,Wv.....................c/W,UXu%LNL%u*X,c............c,wu%$gM::OlQuXUWc..............vc/WW//////W/////.......",
+"......cW=Xrf0__I|%*U,Wv...................vc,UXzR|lII_0R*UWv............v/=Xzf|I___IRrXUWv............cW,Uwz%||||||||%zwU,c............v//,,UUU,,,,,,WW/v.............cWU*%|I_x!x_0RzU,c.................cWUXwwwXww**XwwXXww,v..........vcW,UUwwXXwXwXXU==/v..........c,Uu|I_Il|f%*wUcv...................vW,Uw*%|I_I|%zw,/v...........c/Uwz|I___I0|zw=Wv............vW,=Xzuzuzwzuzz**Xw,/v..........cWUXz|0_O0RrX=U,cv...................v/W,=wzR0I_IlRzX,c...........vWU*%|0_!!5YI0fzXUc.............cWWW,=U,WW,W,,,,/Wcv.....",
+"......c=X*%0_x5xI0RR*UWv.................v/UX*R|N__xxxO|zwWv...........v/=Xr$IM!5'5:I$R*=,c..........vWX*rr0I_xx____OI|R*X,/..........v,UXw*uzu**XX**uX=Uc...........v/UwzlIh5'e'5xLRzU,c..............vWU*zfR|||||||0||||RRw,........vv/,XwzRR|||||||Rrz**X,v.......cW=*RLxxxx_g0RzXU/v................v/UU*rR|L_55xg|rXw,c........../,wur|#x5'55_g0rzXU/..........cWUwuR|NI0$||l0I0||rzX,v........v/,wz%0_:!_I$|R*wU/v................../W=wz%|L_x5x_|%zX/..........v/U*r|Nx5'ee5xN0fzX,v.........../UXw****XUww**zuXXwU,c....",
+".....v/w%%i4+-ba-+s@#%uUc...............v,Xu9i4s+aa[<+sJQuw/..........c=w%$Js+abbyya+sJ$uXUv........vWw%iJ@{-aybHH[aa<s@i%*Uv........c,u%$i#J44#$$i#J4#%uX/.........v/Xu%#d+-yayb[<s4i%X,v...........v/Uw%i#@dssss{sss{ssd@4iuc....v/W==uuQ$#4ddssssd@4JJ#iQ*W.......WXu9#@+<a[a-{@#i%u=Wv.............c,Xu%$Js{-<bb<sJi%uXUv.......vWXu%iJs+<yayaa<s4i%uUc........c,XuQi@{<<{{ss{+-+sd4#Q*,c......./=*u$i@+[ba++s4i%uw,/v..............vWX*%Q#@{+-aa<{@#9u,v.......vc,X%$4s+ayyyyyb-{4iQu,c........c,*%$i##JJiQQ$iJJJ#i$%uX/...",
+"......,uuQi@{aabba+s4iuX/...............WXu%i4d+[bab<{@#9uXWv......../UwuQ#@+bayyybba{@i%uU/.......cWUuiJs{<HZGGGGGHya+sJ$uXW......../Xu9#4ds{s@J#J@{{@i%*U/........cUXu$Js-babbbb<+@#%u,/...........cWXuQJ@s{{{{+++++{+{{{@J%,....c,X*u%$iJ@s{{{{{{{{s@444iQwv.....c,u%9#@{<abyb<{@J$%uX,c.........c/,,=u%QJd+[bbab-s4i%u*U/......c,X*%9#s+[bayyyab<sJ$%wU/c.....v/XuQi4s<[[<+{+-<a-+s@4iuXW......v/UX%9#@{aybba-{4i%u*,/c...........vc,UuuQi@+<[bbb<s4i%uX/.......cUXu9id+baayaybyb<sJ$%u,c......v/w%9J4@ss@4#iJ@@s@@4J$%w,...",
+"....../U*u%iJdss1s@4l%XU/..............cWU*uQiJ@sB{s@J$%uU/v........v/,X*u$#@sB{B{Bs@M#QuUWv.......c,UX%$JMn6~~~S~~k^1@gQuX/c.......v/U*%QiJM@MJi9iJM4L%uUWv.......v/=Xu%iJdsss@dd44L%*=Wc...........cW=wu9JM@:n:@dn@::d:@MOl%/....c,U*uu9$LJM@:@:@:@hh4OgLi%U......c,w*%9LJ4dB{B@4g$%uXXUWv.......v/,U=wuu%iJ@sss1d@gi%uw=Wc......c/UXu%$J@s1{B{BBs@Jl%uX=/c.....c,w*%$LJdsdd@M@@ssd@4gi9*U/.......c,=Xu9i4@ss1s@MiQuXw=,/v..........cWUU*u%iJ@ssss@@L$%XUWv.......c,UXu$#@1{BsB{1{1@4$%wXUc......c/U*%9l#JhJgi$i#4h4#l$%wU/...",
+".....vWww%QlghM::::Nlu*U/v............v/=wu%$LgM::nMgl%u=,/v........vc,wuQ$gMnnnnn::hO$%X=/v.......v/=*%lLO:E6A^kkk6n:g$uX=Wv......../Uw%QLghhMgLLLLggi%X=Wv.......c/Uwu%lNh:n:n:hNL$%=Wcv...........cWUwRLMEE}}}}}E}}}E}}}EIRU...cWU*u%$$NxEEEEE}EEEEEExMOlQwc....vW=w%%llOMMnnnnMgLQ%uuwU/.......c,U=u%%Q$LNM:n::hNL$Q%*UWc.....v/=wu%9LNM:n:nnnnnhgL$%uU,c...../UXu9LgN::::MhM::::MNgl%*=Wv......v,U*%%lgMMnnn:hN$%%*XU,c.........v/,=wu%QLN::nn:hOLQuuw,c......./Uwu%$LM:nn:::nnn:g$%uwUc......c,=w%lLgOMMNLLLgOMOOLl%uX/...",
+"....v/,wzR00IOY!5!!YIfu=Uv............cWwrR|II_x!!!Y0|uX=Wc.........cWUz%0I_Yx5x!xxxYN0R*=Wv.......c/=*%0__x!'';';''x_0fuU,Wv.......cUXzR|0__!!YIIIIII|%XUWv......./,XzR|0NYxE!Ex!I0RrXW/v...........c,Ur|p;&&&8&8&q&&&&&&8&pIU..v/,wr|0IY;jj&&&&&&&&&&&jKpY0*/...c/Uu%||IOYx!!'5!!x_I0|RrX,v.....c/=*z%|0II_!x'Ex!xYII0|rwU/.....c,*rQ0IO!x!!xx!5!'!Y_I|R*U/....vWXz%fI__x'x'xx_!!!!___0RuXWv.....vc==uR0II_xx5!!xYI0|%zXU,v.......v/,Xuzf|II!xE5!!_II0RuwUc.....vc,XuflIOx!!:!xxx'!!_II|zX/.....v/=wuf0I_Y!!Y____x!x_II|%X,...",
+"....cWXz|0__xx5EeTe5_0R*UWv..........WUXuf0Ih5551e5x_|RzU,/c......../UwR0N_!1eee'5x5!_IfzX,c......vc=Xz|_x5''5eTTTT'!_0Rzw,/v......vWU*R0O_x5e55:xxx_N0R*=Wc......cWXzf0Nxx5'eTTT'!N|%wUWc...........cU*z|pCq8PPPPPP88qq8PPPjIw..c,wz$Ix!'K>qqqq888888qq>)7'_|U..v,wz|I_x!55'''eeTe''!!x_0|*,v...cUwu|0__x!55eeeee''55!x_0Rz=c...v,zR0_x!5'eee''5eeee55!xI|z=v.../,*R0_x5'eeeeee'}eee''x!N|rXW....v/UXzf0g_xx5EeTT55x_I0|RzU/......v/WXzR0I_h55eeTe5xx_g0RzX,v....vWXzf0Ox!55e555'5eee5x_0|z,v...../Uz|L_x:'555!:x55e55x_I|z,v..",
+"...v,*%i4s{+-aabyyy[+@J$u=/........vWXu9#4s{<bbybbb-+@J$u*Uc.......v,u9Js+-[byabyyab-+sJ9uX/......vW*%i4+-ayyybyyybb-+d#QuX,v....../XuQ#@{+[byybb[<<<{@#%uXc.....v,*%i4s{<abbybbbb-{@i%uU/..........v,u%i:+2Z(]((((((ZGZ]]tt~!%v.,uQ#s<aHH22ZZZZZ]]]]GGGZ2bb+4uv./*Q#s-bHH22H2Z2H222222a2+dJ%=v..WuQ#s-bHHHH2HH2HHHH22H[[B@9u,...,ui@{[HHH2222HH2222ZZ2Ha+dJ%,...=%$4{<H[ZZ22HH2HHH2222H[+@i%,..../U*%i@s++-abyybybb-<+s@Ji%=v....v,Xu9#4s{+<[byyyyy[<+{d4i%*/...v/Xu$Js+-aayyyayyyybbb<+{4i*/....c=u$4s--ayyyyabayayab<+s49u/..",
+"...vWu%i4s+<byyyyyyy+s4i%u,v.......vWw%iJs{-ayyyyybb<s4i%u=/......./XuQJs+<byyyyyyyyb+sJ$uX/.......,*ui@+abyybyyyyyya{sJ$uwWc......WXu$Js+-bybybyyyb<{@#QuU/......Wu%i4{+abybyy2yb<{d#9*=Wv........../u%L@+[2G((((ZHbyybaHba-@ucv,u$46[ZG22yHba<<-a[yyyyyyya+@*vvUu94+22GGGG(GGGGGGGG((Gt[{4i*/.vU%9@+22GGtGGGGGGGGG(t(((-sJQXv.vU%i@^22GGGG(GGGGGGGG(((Z~{4iXv.v=%#@^2GGG](GGG2GGGG((t(]~s#%Uv.../Xu9J@{+abbyyyHyybba-+{dJQ*W....c,*%i4s{<-byyyyyyyyb<+{@#Qu,....,X%$4{+abyyyyybyyyyyaa-{4iuW...v,w%i4{<bbyyyyyyyyyyyb[<{4i*/..",
+"....cUuQ#M@1B^^~~~~k1Ml9uX/........./=X%L4:1B^~~~~k6nML9*X,v.......cWXu9J:sB^^~~~~k61:#%uwUc.......cUXui@nsB^~~~~~k61h#$%X=/.......cUwuiJ@nB^~~~~k^B14#$uw,c......cUuQLM@1B^~~~~~^1M#QuU/c...........cU*%$hn6kSSS~^B1@:::s1B@LXvv/Xui:D~~~^B1@MJNgNO:nsBB11sMiU.v/w%l:A~~S~SSS~~~S~~SSSSFAML%Xc../*%l:D~~~~SSS~~~~~SSSSSF}h$uW.../X%Lnk~S~SSSS~~~~~~SSSS~}Ml%W...Wu9On^~~SS~SS~~~~~~SSSS~}#$uW....vWU*9#@:1B^^~~~~~~^BBd:J$u=c....vWU*Q#4:nB^~~k~~~~^^1@:J$u=c....c,Xu9J@1B^^~~~~~~~^^Bs@4lu=v..../,XuiJdsB^^~~k~~~~^^{1@4L%=v..",
+"...vc=w%LMn1AVoS3S3V}hL%*U/v........cWu%Lh:EAVoSSoSA}OL%*=Wc.......vW=*9gM:1AkFFSSFDENL9uU,c.......cUXuQO:nB^ooS3SSAENL$uw/c.......cWUu9NMn16kFVoSoDEOLQuX,c......c=w%Lh:16koSSSoV}ML%*=,c...........v=wu|N:EDFSSFDEn:OOMxn:h%U../XrlYD3~3D:Mgl$9%9$LM:n:nn:g%W../UufgEADDkkVkDDDADDDSSSV}O$%Uc../Uu|hEADkkkkkDAADDAVSSSV}g$*U.../Xu$N}AAkkkVkDADADDkFSFV}NQuW...WX%lh}DDkkkkkDDDAAkoFSSkENQu,.....cUX%LM:EAVF3SSSSFVk}nMN$u,v...../=*%LM:E6kV3SSSSVk^}n:g9u,v....cW=u9gh:1BkVFFVVSFkk6n:O$u,.....vW=uQN:n16~VSVSVFFV^1n:Olu,v..",
+"....vUX%0O!;K&q8PPP&;YIRrw/v........c,X%0_x'j&qPPPP&j_I|uX,/.......v/U*fIx!'KCq8PPP&;_I|%w=c.......vWUz|gxx;K&8PPPPj;YI|zw/c.......cWUz|OY''j&qPPPPj;YI|rX,c......cUwR0_x'mCq8PPP&;pIRz=Wc...........cUXr|Ypmjq8q&K;!!Y_x!5!IRW../wR0pK&q&mp_I|rrurf0_Y!!!xYIz,..cU*R0Ypp};}mpppYYpp;j8q&;_|RUc../UuR0Y!'';}m;!!Yppp;&qqj;_|r,.../=ur0Yp};emm;!!!!!p;&qq&pYRr,.../Xz|I_5';}mm'!!!!!pj&8qj;I|u/....v/UwR0__'Kj&8PPPPP&j;5YIlz,......cU*%0_x'mC&q8PPP&&j;xYI|*,.....cWU*fI_!'KC&8PPP8qjm;!YI|*,.....cWUz|gY!eKC&PPPPP&&K'!xIf*,...",
+"....v/wzRI_!mCCq8PPqje!NRzw,v......vc,wzQI_!mj&q8PP8C;!NRzX/v.......cUX%0Ix'm)C8PPPqm'!N|zU,v......vcU*r0Ix5mC&8PP8&m5xNfzw/v......vW=*R0_x'7)&PPPP&m5xLRzU/v.....c,Uzf0Y!eKCPPPP8j'xLfzwWv.........c/=ufIxmCC&>CC)TTee5555xI%,..,z|_'Cqq>m'_0RrzzzrRI_xxxx_0r/..cWu%|Ix5'TTT1!x_YMx;Cqq&;Y0rXc../U*R|_!5'eTe'5Yxx5EmCqq&;I|*Uv..cU*R|_!5'6mme!xY_!'mCqq&;IfuW...cUuRIYx5eemm'xx_x!')>qqC;YRz,.....c,XzRIYY;Kj&PPP8&jepx_0RX/....../UXrfI_Y5;K&8PP8CK5!xO0%*/.....v/,XR|I_!'mj&8PPqCK'!xI0R*,v....cW=*R|I_!5mj&PP8qCm'!YI|R*Wv..",
+"....v/u%$#d{-H2G((t(2ba{@i%w,v.....v/U*%$Js{[aZ]((tt2H-{4$%wW.......v=u%i4s+[yZZ((t(2b[{4i%wWv....../Xu%L4d+[HZG(((GHb-{J9%=c......cUwuQ#4s+aHZ((tt(2a<sJ$uwWv....cUwu$Js+[HZ](t(tZH<{4i%XWv.......v,Xu$Js-]]]Z22Hyyyyyyy[+{@9=v.U$4Ba]((([-s4i9%%%9$J@ssss@JQW../=zl4s+bayyba<+++-ba2ZG2-B4lu/../X%l4{+aybyya<++<[aHZGG2<1#%=.../Xrl4{<aybHHa-++--b2ZZZ2<n#%=...Wu%i@{-[yyH2a-++-[b2ZGZ2+n#%U...../Xu%$#@s{+~Z((((a-+Bd4#QzU......vU*%$#4d{+[2(((Z2<+sdJiQuU.....cW=u%i#4d{+[](t(Za<+1@Ji9uXc....c/=*%$i4dB-[t((((H<BsdJi%uUv..",
+".....c=u9iJ{<yyZG((G2Ha+@i9uX/......WXw%9#@{<y2ZG(]ZZyb+@i%uU/.......,X%$J@+ayH]Z(GGZHa{4i%u=/......cUu%Q#@{ab2Zt(G22ya{4i%*,......c,XuQi@{+byZG(((Z2y[{4i%*Uc..../=Uu%#@{<b2G(t(ZZHa+@iQuXWv......cUu%i@BaZGZyybyybyyyyyb+s49U.vw9@{[ZG(tH+sJi%%uu%%iJ4@dd4iuW..v=uQ4s-abyyya<++-ayyyby[+d#Q*c..c=u94s<aayyya-++<byybyya+@i%Uv../Xui4s<aayybb<++<byyybb+{4i%Uv.v,w%i4{<abbyya<++<babyy[-{4i%Uv....vWXu%9#4d{+[(((ta+s@4iQ%*Wv......c,u%Qi#@{+HG(t]a+{dJiQu*Wv....vW,Xu%9i4@B<HG(t]a{sdJi9%*Wv.....c,wu%%iJd{<2((tHa+{@Ji%%*W...",
+".....v,wu%lNn^^^6A6A^k6ng$uXU/......vWUwuQlhE^kk6A6^k^6n#$u*Uc......./UXu9Lh1^^^A6Dkk^6:g9uwUc......c,U*uQihB^^^6AD^^^1:L9uXWv.....vW=XuQiO:B^^^DAA^k^BML9uX=c....cW,Xu%Lhn^^^^DDD^kBnN9%XUWc....../Uwu%LO}^~~^+B+BBBB+BBsh#$uW..WulOEkS~~}hL9uw=U==Xu%%QQ9Qu=v.../Xu9N4@n1BBd@h4:sBB1nd:#$uXW...v,Xu9#4ds1Bsn4h4:1Bs1ndM#QuXW...c=X%$#4d1BBB1@M@dnB1nd:NL%u=/...cUw%lN@:s1BBn@Mhd1B1ndhOi%u,c......v/,XXu%lLx}~~SkEMLQ%uw=,v.........W=Xu%%N:}oSSkEML9%uXUWv......vcWUw*u%$N:D~S~AEOl9%uU,/........v/UwXu%lg:A~S~A:NiQ%uXU/v...",
+".....v/X%QlOEAk}E:xEDVAEN$QzX,v.....c/=X%9lO}DV}En:EAVA:gl%uXW......v/=wu9LMEAk}E:n}AVA:N$%uU/.....v/W=*%$LN}Ak}E:nEAkDxN$%uXc.....v/,w%QLN:Akk}E::}AV}:LQ%uU/....v/UwuQLNEDkAE:nEAVDEOL9uw,c......c,wzQlOnA^66111AAAAAA}EOl%Xc..,*QI:AoFkEO$%XU,,W,=UX*w*Xww/v...WU*%llM:nnn:MOOM:nnnhhN$uX/v..../U*%lOhhn1n:MNNM:En:MMN$%X,v...cWUu%LgMMnnn:MNOM:nnhMgLQuUU/...v/X*QLOh:nnnMhNMhnnnMMNLruU,v........v/UXur$NEVFFA!LQ%*=,/c.........../UU*RlN}VSoAxLQ%*U=Wc........vvW,UX*RlN}oS3DML9uwU,v...........cW=Xurl_}V3V}Ml%uXUWv.....",
+"....vWXuR0IY;&&mpYYpK&j;YI0fzUc....v/,wzR0Ip;&&KpYYpj&j;_I|f*,v.....cWXu|0IpKj&;pYY;j&j;YI|f*,.....v/UXz|0Ipm&C;p_!;j&K;_I0%*W......cU*%|I_pK&C;p!Y;j&jpYI|%*,v...c,Xzf0IY;&&KpYYpK&C;_IIRzX,v.....cU*%|II!;mee;TmC&8qq&&;Y0rwc..WzRIpjqq&;Y|%*X=,,,U=wXwwXUUc....WUuR0I_x'm''xMY!'''!Y_0|zw/.....WUuR0_xx'm;!x_xx'e''Y_0fz=/....vWUur0Ixxe;'xYYx!};'Y_0|RzU/v..../X*R0_x''e;!Y__x'e'Y_0|ruU/..........c,=wrfI;&88jpIfzXU,c............cUUwzfI;&q&KYIRzwUWc...........cW,=wufY;&8&jY|fuUW/............v/,Xr%fY;&8&;Y0R*UWc......",
+"...v/,wf0_!')C>K':!5C>>)'!_0R*/....vWUzfI_!'K>CK'55;)q>K'x_0rw/....v,wz|L_!')>>)'x'eCqCm'x_0R=c....c,wr|I_55K>&7'''eC>Cm5!_0r=v....v,XzlIx!5Cq&m'!'m&>Cm!xI0r=c.../UrRL_!')C&)'55'C>&)e!h0R*U/....cUwr0OxxeTe7T77C>88888&jpIf*/..,z|_;Cqq&K!I0fzu*w**zuzuzu*UW..../U*$Ix5emC)meee'))7'!O0RzX,v..../Xu|g_'emCCmee'T))m'x_0|zX,v...c,wzlIx5e7CCmee'mC)m5_I|R*w/....vWXr|N_5')C)meeem)Ke!NI|Ru=Wv.........cWU*R|Y;&88j;I|%*=Wv............cW=*r0Y;&qqjpI|rX,Wv............c,UzrfYK&88jpIr*w,v.............cW=wfIYjq8qjp0%*w,.......",
+"..v,*%$4{-aH2(GZHabH](]2y[-{J$X...v,X%$4{-yy2(GZ2baH](Z2y[<sJ%=...v,*%i@{aaH2(ZZyaa2ZGZ2aa+sJ%,...v,*%i@+<yHZ(GZHaHH]G]Hy[+s#%W...v,u%#d+[b2Z((ZH[aZGGZHaa+s#%W../Xui4{<bH2](]HbbHZ(Z2ba<{4iz=v..vUu9Js+[bbH2222H2](((Z]Z[+@#%W..Ul4{[2(G]H++s@#i$$i###JJ##i%wv...UuQ#d+[HZGGZ2yy2ZZZ[+{4#$%w/...c=u$4{+[2Zt(ZHy2HZ]Z[+s@J$%X/.../Xu$4s+[HZGGZHbHZZZ2-{dJi%uXc...cXu$4{+aH2GG2ayy2]]2<{dJi%*Xc.........cU*%L@B[(((]<1J$uXUc...........v/X*%iM{[(((2^s#$uXUc............/w*%L4B[t((Z^@L%uUv............./=z%LM^[t(ZZ+Mi%u=v......",
+"..c,u%id+byb2GGGHyyHGGGHyya+@iwv../=u%Jd<byy2G(ZHyyHGGGHyb[+@iwv..vUu$Js-byHZGGZyyH2G(GHyy[+4QU.../=uQJs-byyGGGZHH22GG2yyb[{49X.../Xu$J{<byHGG(ZbyH2G(2yyb[{49=vvWwQi@+aybZGGGHybyGGG2yba+diQw/../=%i4{[byHGGGGGGZ2HyHHHa<sJi*W..U%41<2GGGHa+{s4JJJ44@ssss@4i*/..vUuQJd+<a2GGZbyy2ZGZa+s@J$%uUv..vU%$4s-aa2GGZyyb2ZG2<+s@Ji%wW.../Xu$J{+aa2GG2yyb2G]2<{s4i$%*W...WX%$4s<-HZZGZyyb2GG[-{@4i$%u,.........c=u%i@Bat((]-sJQ%X,v............/Uu%i46aG((Z<d#9uw=c............/U*Qi@^aG(Z2+di%u=v.............c=u%i@TaGtt2+@i%u=/......",
+"..v/XuQ#@1B6~~S~~^B^~S~^^Bs@g%U...c,XuQJ@1B^~~S~^^B^~S~^^{n4L%U...vWXuQJ@1B^~~S~^^^^~~~^^BsMi%W.../Uwu$4ns6^~~S~^^^^~S~^BBs4l%,.../U*%94nBB^~~S~^^^~~S~^+B@4iuW..cUu9#@1{^~~~~~^^^~~~^^{sM#QuUc../UX%L@s1B~~S~StS~^6Bn1n:hL$%=v..c=%L:A~~~^1nMJgi$iNJMMM@h4l9wv.../XuQi4:1^~~^BBB^~~kEMJl$%uw/...v/Xu9N@:B^~~^6B6^~~knMOl$%uX/...cUwu$Nhn1^~~^6BB^~kDnMgi$%uX/...c,wu$Jhn1k~~^BB6^~~6nO#LQ%*U/..........cUu%l_}~S~kng9uw,c.............c/U*%$M}~S~^EgQuXUWc............cWU*%$hA~~~^:g%uXWc............../XuuihA~S~A:L%*w,c......",
+".../=*%LMn1}kFFk^616VFFkBEnh$%Uv..c,=*%LMn11^3FkA6BDVo~AB1nMl%Uv.../Uu9NMn1}kVF~^16D3FF611:M$u,...c,UuQghn16kFVk666kVFk6BE:NluW...cUXu$g:n16k~FV^66k3Fk61n:O9uW../=u%LMnn6^F~V^66DkF3k1EnhL%*Uc..cUu%LOnn6^FSSSSSFAnn::hONLQuUv..v,*lOEDDkA6EnMNOOOOM:EEEMOLQUv...W=*%lOhn6kVD}n1}kVAEMLLl9%w,v.../Uu%LOhEDkkA111AVVA:NLll%zXW...vWXu$lO:EDVkA1EEDkVAMNLL$%uX,...cWwuQLOMEDVkD111AkV}xOLl$%uXW........../UXuRg}VF3DxL%uX,/.............cW=XrlgEVF3DhL9uw,/v...........vc,=Xu|O}VFVDxL%u==cv............v/Uwu|N}VF3}_l%*UW/......",
+"..v/XzRI!'mmj>&Cmmemj&&CKe'!0rU...cUXr|Ix'mmC&&&KmmKC&C7me'YIRU....,XuRI5'mmCq&Cmemm&q&Cmm'Y0zW...c=Xr|Y!;mmC&CCK)mj&&>7me'Y0R=...cUXr|_5;mmC&qjmmKC&qCKmepY0r,..c=zR0Y;eKC&qCKmm)&qqCme'!IRzUc..cUzRI!';mj&qq88&&j;'!!Y_II|f=v...Wwf0!';eKCKm'5!!5';mjjj;YIR=v...cUuR0_YpKCCme5'mK&jpYII0||rUv..v/UzR0YY'KCCm;''mj&KpYII00|zU...vWUuf0_x'KCCm;''mj&KpIIII|Rz,...cWXzR0_x;KCCm'';mj&;pYIII||u/........vcWU*r|I;&qqjpI%zX=,v...........v/WwuR|Y;&8&jp0fuwUWc...........v/,wuR|YK&8&jplRrX=/v...........c/U=z%0Y;&P&j_IfzX,Wv.....",
+"..cXu9I!;)7CV>C77TTT)>>C>Cm;Y0Xv..cUuQI!m7CC)>>))777)C>CCC)eY0*v..c=z|I!m))CC>))7TT7)C>CCC7;_f=...WXr$Ixm7C)>>C7777)C>CCCC)'Y|Xv..,wRlI'm)7C>>C)777))>7>)Cm5_|Uv.Wuf0x;7CC>>C77T7)CC&>CC7;x0R*/..Wzf0!;)7CCC&C&&>C7Te5!5xxx_lrW..vWwr0_xem)>>C7TTTTT7>>q>K'O|*c..v,*R0Ix5e7)7me'5e)CKm'55xx_0*/..vUXr$Ix5e7)7Te''mm)mT55xxx_lXv../Uwr|_x'e7C)Tee'm)jm;5!xxx_f=v../=*f0_x5e777m'5em)Cme5xxxxO|=........cUXzz|0p;q88C;_|fz*XUc.........vcUw*zfIYK&88Cp_0RzwX/v.........c,Uw*f|Ipj88qjp_0%z*=,c.........c/=Xzr|Ipjq8qj'I0RrzU,c....",
+".vU%i4{-H((]]yybybyyHH2]G(]H+@9c.v=%i4{<ZGGGGZH2ybyybHZGZG]2+@%c..Uui@{<]((GZZZybyyyy2ZZG]][+@%c.vXQ#@+a]Z((Z2yybHyby22GZG]a+4%v.vXQ#@+[Z((Z22HHybyHbZZGGG][B4ucv=94{-2Z](]ZHybyyyb22]G(]2<s4Q=vv=94{-2]]]Z2HH222Hbyya-<<aaa{#X..v,uQJs+[a2]G]HHyHHHHG((Z2<{4%W..W*9#d{-abHZbH[a[[bHyybbbab-s#U.vUu%L@{<[bH2Hbab[yyyyybyyab-s%c.vUuQi@{-abyHHb[[a[yHbyybybb<d%v.vUu$4s+<byH2yya-[ayHHayyba[<@%v....v/,X%9i#4s+Ht((G[+s4#i9u=c......./,w%QiJ@s-2t((Z[BdJ#$9u,v......v/=*%9#4@{+Zt((]a{dJ#9QuXc......vWXu%$iJ@{<2(((Z-{s@Ji%u=/...",
+".v,%i@{<ZG(GG2yyyyyyyb22G(t2-s%/.v=QL@B[G(((2yybyyyyyybG((]H-s$/.c=Q#dB[GG(GGyyyyyyyybZGGtG2<s%c.vw%#@+[GGGGGyyyybyyybyG((t2+d%c.vw%J@B2G((GGyybyyyyyy2G((GH+@%cvUid{<ZG(GGyyyyyyyyyy2(GtZ-{4i=vvXi@{a2G(G2bbybyb2yyaba[abyy+4uv.vWuQ#s{<aH2222y2Zbby22ZZ[+sJu/..,u9Js+ayyb22ya[<abyybyyyyya+#wvvW%$Js+ayybyyyb[<[bbyyybyyaas$/..U%iJs+ayybHHyba-byyyyyyyybas%/.v,%i4{-yyybHya[<abybyyyyyyy-s%c..../UX%Q#4@s{-HG(t(b-{s@JiQu,....../,wu$#4@sB<2((tGb<{d@Ji%*,......vUw%QiJdB+-2G((2[+s@4Ji%w,......cXw%$J4@{{-ZG(Gta+{s@Ji%X,...",
+".vWw%LhEkSSS~^BBs1s1BB^~~SSk1Muc.vWuQLh}kSSS~^BB1s1sBB^~SS~D1Nuv..,uQN:AV~SS~^B1@ns1BB^~SS~D1Nuc.v,u9N:D~SSS~^B1s1s1B^^~S~~^nLuv.v=u$OnA~SSS^^B1s1sBB^^S~S~DnL*cvW%g:}kSSS~^B1s1s1{B^~~SSknMiuW..W%l:}kS~SkBBB^~~~~~^{BsBB^^Elw....W=u9iJMn16^~~~~^^B61}EhNlu=v../w%iM16^~~~~^1s1s1BB^^^^B{n49U.v/*u$ME6^~~~^^BB11sBB^^^^+Bn4uc../X%$M16^~~~~6Bss1BBB^^^^+1@J*v.v/X%L:1^^~~~^^1s1sBBB^^^^B{d#Xv...v/,Uu%iN4:nE^SSS~D1:M4g$%X,......cUXuQiNh::1kSSSo61@OJL$%X,.....vcUXuQiL4M:BkFSS~61dMJL$%X,.....v/=X%QLJM:n}kSSSk6nMMJl$%XW...",
+"..WX%LM}VSSSk61:hMMhn16oSSokENuc..WX%L:}VSSFk11:hhM:nBDVFSSDEOuc.vWu9Nh}oSSFA6n:hMM:nBD3SSFAEOuv..,w9N:}oSSVk6nnhMh:n163SS3AEg*v..Wu$g:}oSSFkBnnhMM:n1k3SS3D:guv.WuLMEkSSSk61nMMMhn1AkSSFDEMl%,..,rLhEkSS3k}16kFVFFVV6}16D3D}L=v..../,wur$gO:n6^^^6n:MOLlf*=,v...W*rlh}kV~FV~D6B11116k~~kAE:gQU..WX%lhAkVVFFVD6661B6Bk~Vk61:Luc../XzlxDkFVV~V^}B1116BkV~kAE:iwv..,XrLxDkFoFSVD6B1116^k~~k6E:LX....vW=wulLMM:n}DFSS3D1n:MNL%u,v...../,w%lghM:E}DFSS3AEnnMJL%*/.....vWUw%lgO:nE}oSSSoAEn:hNL%*/......cUw%lgM::nAoFSSVAnnMMNL%X/...",
+"..WwRIY;&8P8&me5Y__x5;m&8P8&;Yrc..W*RI!;&8P8jm55Y__x''m&PP8j;_zv.vWz|_!m&8P8Cm'!x_Y!'eK&PP8j'Yuv..,ufIpj8P88jK5!___x'eC&PP8jpIzv..Ur|Y'KqPP&Cm'x___x'eC&PP8jpI*cvWR0!;&888&m55Y_Yx''K&8P8&;p0zWv.,%Ip;&PPqjmmjq8888qqCK)Kjq&;0w.....v/,=*R|IY'mmTm;5YI|RzwU/.....cw%0pjqq888qCKmmmKm)&qq>);!NRU..W*fIpjqq888q&mmmmmKK&qq>je!Izv../XRIp&qq888q&)emmm)C>qq>);xIwv..,*fIp&qq888&CK)KmKKC&qq>K'x0w....v/U*%0_Y5'}m&PPPPjm5'!xI|uUc.....cUXr0_x5'eK&PPP&je''xYI|u,.....vWU*%0_x!5eK&PPP&je'5!xI|u,....../U*R0_x!5eK&PPP&Ke'!!_I|z,...",
+"..W*|I'm&888&7ee!xxxeT7>8P8&m!Rc.v,*|O'7&8P8>)T'xxx5ee)qPP8CT_Rc..,zl_'K>PP8)7T5!x55eT)q8PqC;_rv.vWz0x;Kq8P8>7T5xx!5e7)qP88Cmxrc.vU%IxejqPPqC7T5xx!'T7C888qCm_rv.U%_xmC888>)Te!xx!eT7&8P8&m5IR,..UR_'j&88q>mmCqP8888q>))7C8&jI*......c,=*R0_5eT777e'_0fzXU/v.....WXrIpCqq888q>)))7))C>8qqCT'_R,..Wz|I;>q8q88qC7T77))>>8qq)m5_rc.v/*%I;Cqq888q>)777))C>qq>)T5I*v..WrRI;Cq8888>C))7)))>q88>CT5I*v...v,Uz|Ix5'Te)&PPP8C7Te'5x0RX/....vWUz|O!5eeT)&PPPqC7Te55_Lr=v....c,wz|_!5eTT7&PPP8C7TT55_0z=v....v,Xrl_!'eTm)&PPP>7TTT55_|*Uv..",
+".vUQJs+[Z((G]Hy[<+<-ayHG(((]H+iW.vX9J{<HZ((G]Hbb+++-yH2](((2a+i/.vXQ4{<HZ(((]Hya-+-[yy2]((G2a+$/.cX$4{aH]]((Z2ya++-[ay2](((2[{Qc.vX9@{[ZG(((2by[++-aaHZ(((GZ[{9WvXls-aZZ((Z2y[<+--by2](((2H-s#XvvwLs-2](((]2HZ]((]G(]222y2]]~_*v.....c,*Ri@+-bH2Z2H-{4$%*Xc......Wul@-HZG(((Z2Hy2yHyZZGGZ2b<siU.vU%J1+2]GGGGG2ybybyHZG(GG2y-{9/.vU%l@-2ZG]GZZZbyyyyy2ZGGZZa<@uc.vUQN1<]GGG((GHbyyyyHZG(G22a+@uv..v/XuQ#s-[ayyHZ((((Z2byb-+@izW..../Xu9#s+[yyb2]((((2byyb-+@iuW..../=u$4{-aayy2Z(((GZyyya<{4$u/....c=u$4{[ayyb2]((((Zbyya<{4$*c..",
+"..=%i@{<a2HHbba<+{++abaaHbH[-{i/.vU%#@+-bayHayb-+++<[aaaHHH[<s$/.vX%#@+[aH22yy[<+{+[[abb2HHb+d$c.v=QJs+-aHHHbb[-+++<aayaHaH[+d9c.cw%Js+[HHHHyba<+++<baya22a[<d%cv=id{<aHaHbya<++{<aabyaHHa-+di=vvwid+-[HHbybayybyyHbyybybyH[+4u......c=u%i@+bH2GZZ[+s#9uwWv....../wQN{[yyyH2yybyyybyyyHHya<{@9Uv.,%i@+abyyyyHyyyyyyyyyyyyb-+4%c.vW%9J{ayyyHHyyybybyyyybHyb<{4uv.vU%i@+[ybHyHbyyyybyyybHyba<{Juv...cUu%is{<abbayaHHHyab[<<{4i*W....cWw%J@{<abyyb222Hbyab-+s4iu/....vUu%J@+<baayHH22Hayaa-+s49*/....vUu$Js+[[bbya222aybb[<+sJ$w/..",
+"..cXulLOM:::nd@4J#JJ4h:::nhMOl*v../w%$LMh::n:d@4Jg#J4@::h::h#lu...Ww%$NO:::::d4J#LJ#4:@:::MhJ$Xv.vWw%lNOM:h:dd@4###J@:d::::h#$w..v,*%lNNM:h::d44##JJh::::::M#$Xv.Wu$LOM::n:@@4#i#J4h:d:::hJ#9*/..Wu$NOM::::@@:dnnnn11s1snd:MluW.......cU*%Lh1^~~~^nOl%uXWv.......vWu%LOM:n:111dssndn@nn::@OL$wc..vU*%Lh:@n1nnsnndn@nnnn:@hJLQ=...cX*%lO::nn11ndnd1@ndnnd:h4L%=.../U*QLh:@1111nsnsndnnnnn:4OiQU.....cU*%$JJ4@d:n::::nd@44JlQu=v.....c,X%iiJ4@:dnn:n:nd@@4#LQuUv.....v,*%i#J4@:dhn::nd:@4JJiQu,v.....cUu%iJJ4@:n:nhnnn@@44JiQ*/...",
+"..v,*uQlLlLggLllQQQQ$LLLgLLlQ*Uv..cWXz9$LLLLgLllQQQ9llLgNLLlQuWv../Uu%QlllgggLL9%%QllLLLLgL$9%U...cUu%QlLLNLLLl9QQQ9lLLLLLLl9%Uv..,Uu%9lLLNLLLl9QQQllLglggLlQuW.vcXuQ$lLgLNllQ%%QQ$LlLLLLl9%%=v../wz%$lLggLllLLL#gggOOOOOgLl%Xc.......cWUu9LMEAADEO$%*=Wc.........cUw%$iLgOOOONNNNOgOggLLl$%u,v..vWUu%$lLNgNOgONJgN#gggll$9%uWv.../,u%$LLLOONOONOgNgNLgLllQ%u,v..v,Uu%$LLNNOONNgNOggggggLl$%wW.....v/,X%%llLLLggNgggNLL$$9uXc.......cUw%99lLLlggNggLLLl$9%u=/......./,*%%llLLgNgNgggLLLlQ%u,/......v/UuuQllLLgggNLgLLLL$$%uU/...",
+".../UwzzRRf%fRRrurrzrRrfRRRRrX/...vW=w*rrffRfRrruzzzRrRrfrRRzX/...v/U*zrRR%Rf%ruzuurRRffrRRRr*,..../U*zzRrffrfRrzzzzzfffRrRruX/...cWX*zr%rRfrRRrzzzrRRRfRf%Ru,v..vUwzzrRfrffrruuzrrrRRfrfrz*X,v...,*uzrRRfRRRR|ff|fR$|l||RfRzW........vc,Ur%|IIYYI|z*w,/v..........W=*zrRQ|l||||fR9f|fQfRRrzX/....cW=w%Rrl||||$||$RfffffRRruX/....c/XzuRfRR9|9|$|$fRRfffRrr*Uc..../,ww%RRf||||$RRf9ffffRfrr*X/......vW=X*zzfrff$|f%fRRRRuzXU/......./U=XzzzRfRf$|fff%rR%z*X,v.......cW=*zzrRRfRfff||fRRzz*w/v......./Ww*zrzrRf|ffffQ%Rrrz*wWc...",
+"...v/,X**z*z*zwuw*X*z*r*zuz**X/....cWU=wu*wuz*u*w****z*uzr**wX/....c,=X*u*zzwzu*wwXXwwuzuzu*XUc....c,UX**rwwu****w*X*wwwuu*zwU/...v/,UX**ru*uzuX*XXw**u*z*zXXWv...WUX*u**u*wu*=ww**r**zu**wUUc....c,wwu*u*rrzrrrrrrrrrzzur*wX,v.......vWWUXzuff|ffz*UUWv...........vWUwurzzzzr%rzrzzz%rzu*XUU/....vW,=*wzuzz%rrzrrruzuzu*XwU,c....v/WUwuurzruzrRruzuuzwu*uXU,v....v/,w**uzuz%rrrrrzuuz*rwuX=Wv.......vWUXw**uzzzrrrzru*Xw=U/........v/,==X*u*uzzrrzzzr*XwU,c........./UUU*wuzzzuzzzzur**w=U/........./,UXwuruurzr*uzz*u*w=W/....",
+"...vcW=uwuuuuuuuuu*uuuuuuuuwu=/....cWXwXuuu*uuuuu*wwuuuuuuuuwUc....v/UUu*uuuu*u*w*Xwuwuuuuu*w,c....v/W=wuuuu*uuu*uuuuzuuuuuww,v....v/,=wuuuuuuuu*uuwuuuuuuuwXW..../UUwuuuuuuw*XXwuuuuuuuuuu,Wv....c,=wuuuwuuuu%%%%%%%%%%%uu*,c.........c/,Xu%%QRR%%uUW/............vW=wuu%%%%u%%%u%%*uuuu*=,/c.....c,=*uu%u%%%%%%%%u%uuuuuXX,c.....vWUwuuu%%%%%%%%u%u%uuuuw,/......c,=wuuu%%%%%%%wu%u%wuuuwU,v.......v,=wuuuuu%u%%u%uuuuX,/v.........c,UX*uuuuuu%%%uuuuwXUWc.........vW,=wuuu%*%%%%uu*uuw,,c.........v,Uwu*uu%%u%u%uuuuwXUWc....",
+".....v/WUUWUWUW,WUU,W,UUU,U,/c.....v//WUUU=UU,W,WW,,WU=,,,WUW/v.....vv/W,,U,UUWW,W,,WUUUUWUUWc.......vv/UU=UUWUWUUWUU==UUWWU,c......v.c/,,=UWUWWW/W,UU,UU,UU,/.....vW,,==UUUWWWW,,WU,=U,,WWWv.......cWWWUXU=U=,=UX==wwXXXXUWc...........vc,=XXwwww,,/v..............v/WUU==XXX=X=U,=wU,UWWcvv.......v/UW,==UUU=XXU,X=X=UUWWcv........cW,UXXXXX=U==w=X,UUWW/v........v/,UU=U=X=,,=XU,X==UWW,,c..........vcWWU,U=XUUU==UUWWcv...........cW,UU=XX=UU=U,UUW,cvvv.........v.vvWW,,U=====X=UWWW/v............/WWU=XX=X=XXX=,W,W/v.....",
+"...........v..vv..v.v.vvv.vv............v.v.v.vvv....vvvv...............v.v.vv........v.v..................vv.v..v.......vv.............v....v..v....vvvv.v.............v..v.vv.v..v.vvvv..................v.v.vv.v..vvvv..................vvvvvvv........................vvv...vv..vv.vv..............v...vv.v.vv.......v..............vvvvv......vv..vvv.................v.vv...v...vv.................v.vv.vv.v....vv....................v..v.vv..v....................vv........vv...................v..vvvvv.v.vv.v........",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+"..........................................vc/WWWUUWW/vvvv..................c/W/cv...............................vcWWWcv.....................vc,UUUU/v.......................vc/WWWWWW/vv................................................................................................................vcWW,UWWcv.............................vcWWWWcv....................cWWUUUUWcv............................................................vcWW/vv........................................................................",
+"...................vv...................v/Xu%Qii$#i9Quu*uX=/v..........vWUXu$i%%uuXU/v.......................WUXw%99Qu*=W/v.............vWUUXu$L#$i%uwU/v..............vWUwwu%Qiiii9$QuuwwU/v..................................................................................vvv.vc//cv.............v/Uu%Q9iQ%u*=Wcv......................cW=*%%%$Qu*W/v...............c,*QiiLii9u*UWcv...................vvv..............................vWUww%%9%uXUWc................................................vWUUUUUW/v...........",
+"......c/WW/W,,WW/W,WWW/cv.............vW,wu%ii4@d@@4Jiii9Quu,c.........Wwu%iJJJ$i9%uuWv....................vWXw%QiJJJi$u*U/v............/=u%QJ@d@@Ji$%uUWv............vWUu%QiiL4@444JJii9%uXWv...........v/W/,WWW,W/WWcv....................................................vcW,U,,,UUXX,,,c..........c=u%$JJJ#i$9u*Uc.....................v,wu%QiJJJ$%uUW.............v,=uQi4@s@4JiQu*UWc..............v/W,,UWWW,,WWWc.....................v/=u%Qiiii9%uXU/...........c/W//cv...........................vc,=wuu%uuU,,/c........",
+"......c/W=,WUU,=U,U=,WW/c.............v,UXu%ilJM@M4JlLiiiQuXUc........./Uu%$##N#i$%uX,v....................cWwX%%9#JJ$9uw=/............vcUXu%i4@@MJ#9%uU/v............cWUX%QiLJN4MJL#lLi$%wUWv..........vcW,W,,,WU=,WWcv..................................................vc//,W,U,U==XwUUWWv........v/UXuQi#L#LiQuXUcv..................v//U*u%Qi##iQuwUWv...........vcWU*%iJM@M4Li%uwUcv.............vcW,,W,WWWWUW//cv....................cUXu%QiL##9%*UWc..........v/,,,=WW/cc......................../WUw*uu%u*=,,Wcv.......",
+"...../W,=Uw=UUwUUX=U=U,,W/v..........v/W=w%$LOM:h:MMONMNL$%wUc........v/=X%LNMMNML9uw,c...................vW,Xu%$LNMMNQuXU/............v,=*u$gMn:nMgLQuwU/v..........v/,=u%LgM::::MhNOONLQuw,c..........c,===U,U=UU===,Wc................................................cW/,=U=Xw*wuuuuwUUWc.........c,w%lgMhMhN$%w=,c..................c/,Uu%$LgM:Nl%*=,c...........vW=*u%lM:nn:OL$%X=,c............v/W,UU=U=======,W/v................../,=w%9lLMMNL%u=,/.......v//WU===U=U,WW/......................v/Uw*uuQ%%u*X=,Wc.......",
+"...v/U=UwXzzzzzz*uz**wXU==,/v......../WUXuf0_xx'''!xYxxY_0RuU/........v/=*RI_!!!x_$ruU,v..................cU=u%|0I_!x_|rXUW...........v/Wwuf0Y!}5'!_I|%*=Wc..........vWUwr|I_x'''5!_____I|uX,c........vcWUX***wXw*uX*wUUWv.............................................vcW=UXw**uzRRrfRfRwXU/........vc,X%0_x!!x_lR*U,Wc................v/,=X%f0I_x!_0RzUUcv..........c,UuR|Ix5'55__0Rz==Wc..........v/,U=*u*XXUX*uXXwUUWcv...............cWUwz|$I_x!_IfuX,/v.....v/==w**zw*wXUU,,c....................vWUX*%f|0l0RrzX=,/v......",
+".../X*zRRl|l0$00l000||fRz*XXU/....../Ww*zfl_!5eTTeee'''5xg|zXW........c,Xr9_:eee'5_|rzU/v................vW=zf0g_x5e'_0RzU,v..........v/wz|0O5eTTTe5xO0R*=Wv........vWU*z|Nx55eeTTe'555x_0RwUc........vU=*%Q||R%RRf||rrzwUW..........................................cW,XwzrRR|00LIII__N0|rX,v......./=XrrIx5eee5!0frXU,/v.............v/UUzRlI_:5eex_l%zX,v.........vW=uf0Ox5eTTT5x_0fzXw,/........v/Uww%f$||R%RQ||frzzXX,v...........vv/,=wR|L_x55T5_0fzXUc.....WU*zR|fl0||Rru*XUWv.................v/,uf00N_Yx__L|fzXU,v.....",
+"..vUQ#4d{++++++-+++++{@4J#iQu=v....v=u9iJ@{-bybyyybHyyb<+s4$uXv......vWwu9Js-bayya<sJi%w,/v.............cW*%i@{<<bay[+@#9uXc.........v,=%i@{<ayybyyy-+d49%w,v......c,*%$J@+ayyyyyyyHHya<{di%*W.......v,wu$4s{sd@4@s{{@4#iQu,v.........ccc//cv.........vccccv........cUu%Qi#4ds++++<<aabb-s4Qu/.....vW=u%iJs+[byya<{@#$%uX,Wcv.......cW,Xu%%i4s+-aayb-s@#9%*Uc......v/U*%i4{<ayyyyyba<{@JiQuXc......vWUu%iJs{{s444d{{s4J#i%u,v........v/=X*%%$Js+<[byb[+@Ji%u,..../wuiJs{++++{d44#$%*=Wv..............c,*%i@{+[bbHaa-+s4i%uU/v...",
+"..Wu$4s+-bayybbbbaabaa<{@@J#%uW...v,X%iJ@s+byyyyyy2Z2Hb-+d#$%wW......c,XuQ#@{-byba<{@J$uwU/v............,wu$4s<abyb[<{@i%uX,v........c,*%Js<abbayyyab-{@J$u=,v.....vUuQ#@{[ayyybybH22b[+s4iu*,.......WUu%i@<[<{{{{-a<+s@4i%wW......../W=wXXUWWcv..vcWW,U=UUU/......c=w%QiJ@{+abbbbayy2G]2<@#%=v....cUw%$i4s{<aayyb-s@iQuuXUU/....../UXuu%%i#@<byybb-+s4iQuuXW......Wwu%$#s+abbaaaayba+s@Ji%w,v....c/U*%9Js+<<+s@{+<<<{s@Ji%XW......cW,UXu%%$#@+[ybbba+s@#$%uUv..vWuQJs<babaaa-{s@J$uwUWv............c,XuQJs-by22GGHya+@#9%*Uc...",
+"..c=%i4d1{B+B+B{B{B{{Bsd4NL$%w/...v/U*%iN4:sBB^^^^~~~^nh4i$uXUc......c/=wu%i#@s{B{n4g9%ww,/c..........vc,w*ui4sB{{sd4gi%uU,c.........c,Xu$4dsBssssB{s:Jl$%*=Wc.....v,*%QiJ@1B{6^^^~~~1:JlQuXWc......v/,Xu9Jds@@N44@sn@JLiQuU,v.....vc/,U==w=U,/cccc/W,UUUUU,Wv....v/UXu%$#4@ns{B{B+^^~~~kEgQwW....vcW=XuQ$#J4dB{s1@4#$%u*wUW/......cW=XXuuQiJ@1{{ss@4giQ%uXU/.....vWUwu%$J@sBsss1sB{s:4Ji%uw,v....c/=Xu%iJ@1s@4g4@ss@@4gi%uX/.....v/,U=Xwu%%9J@s{B{s@4JiQ%u=Uv.../Xui4d{B{B{Bs@4gi%uXU,/c...........c,X*%9Jd1^~~~~~BBdJ$%uU,c...",
+"../=uQLhE6666111111nnnEE:!MNRuU...cW=u%$LNMn1B16B6kkkA:OLL9u*=/......v/,UXu9LN:n1n:Mg$%uUU,/c.........c/=U*%$g:11E:MNi$%*wW/v.......v/,=*QgMn:::M:nnnMOL$%wUWv....../X%9LgM:1B1666kkkEMLl%u=Wc......cW==u%g:n:MOgh:nnMOL$%*=Wc......vW,wuuuuXU,WW/W,,UwuuuwwUc....vWUu%LLOMEE1111B66kVSFkEN%*,....vW=Xu%9$LLNhnnn:MgL$Q%u*w=/v....cW=Xwuu%9lg:n1nnhhgN$l%uwUWv....cWU*uQlghnn::hhnnn:MOLL9uX=/...v/,U*%QlO:n:OgNgM:::MNgLQuX,v..../,UwXuuu%QlgMn1nn::NgLl%uXU/..vWUuQN:n1666}n:MNL$u*==,Wc.........v/Uwu%LNE6AAAkDA^}EMLQuwUc...",
+"../Xr|Ipm&C&)me'5''E5'eKj&jpIRXv..cUXr|IIx!55ee;TmC&CKpY_I0fuX/....../W=wu%|I_x'E5!__0RR*wUWc........v,Uw*rfI_x}'E'xYI0Rr*UWc.......v/UwufOx'5!!x!'5'!_I0RuU,c.....v,X%|0Ixx'eemTmCCj;YI|Ru=Wv.....v/,Xw%|I!'!xxY!!E!!_I0Rz=,c....../UXrR||frX=U=,UU=zr|||R*Xc...v/X*RI_YpmjjK'5'mC&qqqq&;Y|z,....c,wrQ|0IO__xx55xx__I00|%zzUc..../UwuR||0II_!55E!!x_III0RR*=c...vW=Xrf0I_!E'!xxxx'E!YY_I0fuXc...c,w*%|0I_!'5YOIIxx'!!x__0fuUc...cW=*r%||l0IIO!!E'5x!Y_II0fr*W...,UzRN!''))CK'!!_I0|%wXUU/v........vWXzR0Ip;CCK;p;mjC;pI0|z=/...",
+"..,X%l_')>q>C7TTeeeeTe7Cq8qKpI*v.vWXu|Ox55eTTTeeem7)7TT55!xg0R,...../WX*zr0Ox5eTTTe'5x_0|rz=,v......cUX*uRl_x5TTTTee5x_L0fzwWv.....c,Uwz|I_5eeTeeeTTT5xOI|rzU/....v/U*R$IM!eTT7777777e!OI|r*U/.....vUX*R|NxEee'eeeTee5x_I|%*Uc...../WXr9IINI|fr*Xwwzz%|I_I0f*,...WUzfIx5eTC>>)mee7>>88P8&K!If=v..v,wr0_x5!55555!5!55555!x_L|rU...c,wr|gxx5555E55''55'55!xhI|rW...vUuR$_:5'eTT5!xx5eeene55!O0r,.../Uzf0_x5ETe'!x_x5eeTee'5!O|rW.../wr|0g_x!5!555eeee1Te555xxNfwv.v/Xz|_5em)>qC7T55xxI0fRzX=Wv......./U*f0_x'm>Cme'emC>);x_0fwW...",
+"..U%#d+[]((G]yyyybyyyyHG(((2+dQcv/X%#@+byyyyyba[-abyHbHyyaa+s#Xv..vWXu%$J4{+abbyybyya<+{d4i%uW...../XuQi#@s<abyyyyyyy-+{@4iQ*/....v,u%$#@{-[yyyybyybyb<+sd#$uUv...Ww%Q#@s+-byyy2b2y2Ha-+s4#Qu=v...cUu%$J@{-aybybbyyyy[<+{dJ$%,.....,u%id{++{s4#i$$iiJ4s{++s49wv..Uui4{ayyH2G(2HyHH](((((]2+s4u,..WuQJs-bybyyaa<+<<bbbayaaa+sJ*v.v=uQJ{<babyyaa<--abbyybyba<sJ*v.vWu$4{-bbyyyya<++-yyyybya[+sJ%vvv=%94{[bybyya-+++-ayyayya[+s#Xv.v=%#@{-bbbbbyyababyyyyyybaa+d%c.vU%9J{[yH2G(ZHyyb[<+s@4#iQ%X/......Uu9Jd{-bZG]HbayH]G]b-{sJQwv..",
+".v=ui@{a22G22yyabbabbab22G]2ad9WvW*9id<bybyybyb<[[byyyyyyyb-s#uv..cU*u$J@s+ayyyyyyyyyya<+sJi%=v...cUuQi4@s+ayybHHyyyby<<+s4$%Xv...W*uQi4s{<ybyyHHbyyyya<+{@#QwW..c,u%iJs{+ayybyyyyyybba<+sJ$%w/..v,X%$#4s+abayyyyyybyya<+{4i%=v...v=u$Js<bb-{s@4J#J@@{+aba+@iXv..U%i4+[b2yZ2ZHyyby2GG(G(G[-s4$,..,%$4+byybyyya+++<[yyyyyyb<{#uc./=%i4+ayyyyyba<++<ayyyyybb-{#uv.vU%i@+yyyyybb<+++<abbyHyyb-s#%W.vw%#@+yyyyyyb<+{+<byyybyyb<s#u..vX9Js+bybyyyybbaa[byybyyyyb<{$c.vUu$J{[byZGGG2ybyya-+{s@4iQu=c.....WuQJs+[a22ZybbbyGG2a<+s49Xv..",
+"..,*%$O:1^^^^1s1dddd:nn6^^ABn4uc.cUu9Ln^~~~~^^sn@@ns6^~~~^B:#%U...v/XuQL4:1B^^BBB{BB{B^B1ng$uXv...c,w%$JM:nB^^^B^BBBBB66B:OQuUc.../X*%$g4dnsBBBB6BBBB^^6Bng$%Xc..c,UuQL4:@sBBBBBBBBBB^^B1:gQuXc..cUU*%iJMdsB{BBBBBBBB^^61:L9u,.....WXu$h1^6Bnh4giiLJMn1^6^nN%U.../X%i:6^~~^661111B6^~^kk^6nMiuWv./*ui:B~~~^Bs:4444:1B^~~^BdJ$Xv.cW*%L:^~~^^Bs@4444d1B^~~^B@NQX...W*%LnB~~^^Bsd4J4hd1^k~~^B:JQXc..Wu%Nn^~~^BBs:4N4h@1^~~~^1:#%U..v,u9J@1^~~~^^{n@@4d1B^~~~^BnLuv../Xu%#@nB^~SS~~~^^^^1n@MJi%uUv....v/XuQiM:n6^61nnn6~~kB@M#$u,...",
+".vWUu9lOnB66nn:MONggNNMn}61n:N%cvc,XuLEAk~FFVDE:MM::EAkFVkEMLR,.../=w%lNMn}^k66nnnnE1AkkV}x$%X/...c=*%LO:n}kkD1nnnn116kVk}M$zX/..vWUu9gMn:n1nnnnnnnn16k3D}Ml%X/..cWwu9g:nn11111nnn11BDookEO9uUc..c,wu$gMnn11nnn:n:nn6DkVkENQu=v...v/XzL!Dkkk1EMOlLLh:nBkkk}ORUv../XRL:A~Fk6E:::M::111666En:hluW../Xzl:Dk^k6EnMLlLgM:}^VFk}MLQUv.vWwzlxAk~k6}:OLlLNN:BkVVk}hL%Uv.vWw*0:kV~k6E:NLLLgM:D^FVkEML%Xc..WX%LEAk~k6EhgLlLghn}VVVkEML%Uv../w%lNEDVSVkEn:ONgM:16kVFV}ML*v..cUXu$LME}3SSF~F~FVkDnE:Mg$uX/...../UX%LNN:n11n:::}V3DEhOL%wWv..",
+"../XrfIY;mK7;5!!_IOIIIYp;ee''YRcvv,wRIp&qq888j;!YYxx'Kq88&;_I%W.../XuRIYx'mC&Cm5!5''ej&qqjpIRz/..v/Uu|Ix5'mC>Cm'x5''mK>qqjpIRwW..vUwz|_xE'ee'''5!5''mCq8&jp0Rz/..cUw%|_!'e'ee5'5!5''mjqq&KY0Rwc..cU*%0Y!E'ee5'55555'K&q8&;Y|rXc....,Xr0pK&jCmm'!I__x';KC&j;IzW...WwfIpjq8&Kpx!!!!x''emme;5!xIrWv./Xz0p&qq>K}!_I|00NY;&qq&m!IRUv.v/wr0pjqq&)5!_I|0NI!;&88&;!IRU...WwRIp&q>&m'!_0f00Ipm&qq&;_I%Xc.vWwRI;&qqCm5xI0l|I_pK&q8&;_0RW.../Xr|Ipj&8&&;5xOIIx!'K&&q&;_|w.../Uwu|IYp;&&8q&&&&&&mee'!YIRz/.....cU*%0_Yx';''p';j&8j;Y_0fu,...",
+"..,*R0_'mC>CCK)e5!xxx_x'mTTT'5fW.cU*R_;>q88P8>m'555'e)q88&K5I|Uv..,*fLx'TT)>>Cme'5ee7Cqq8C;Y0rU..cUzRIx'e77>>)m'55eTTCq8qC;_0R,../UzfN!eTeTTTe'5''eTTCq8qj'_|z,..cXz|O!TTTTTTT'5'5eTm&qqqj'I|z,vv/Xz|O5e7TTTTTe'5'eT7C88qjpI|zW...v/UrR_pm)m))me'''m7C)mm;pIR,v..Wr|Y;Cq8qK;55eeTeeeTmmTTTT5_|U../*RI;Cqq>)T5_NI0IY!K&88>jx_|wv.c=wRI;>>q>)T5xgI0IY5m>q8&m'I|=v..WzRI;Cqq>)TE_ILI__5K>88>K5I|Xc..,*f_;Cq>>)T5_00II_'m>88qKpIRU...WXr|I'm&&&)Te5!xx!'TmCC>j;Yf=v.v/=zR0_x'mC&&jjKmjjm77TTT5xNRU....v/=zQIx5ee7))KCj&qqCe5x_lzUv..",
+"..UQJs-a]((((GG2Haa<+++<bybyy-JUcWuRJB[]ZG((GZ2yabb[bZ(((]H+sJXv.vX9J{-HH222Z2a[<-aayyG(G2a+s#Xv.,u$Js-HHZZ]]2aa<-<ay2Z(ZZa+@Lwv.W%i4{aH22yyyy[<[[bby2ZGZZa+diXvv,%i@{[HH2byyaa---[ay2]GZ2[+@iU..,%i@+[HHHyyyaaa-<[bHZ](]2a{@9U...v,w%lhs+<2](Z2baHZ]G2a<+:#9Xv.vXi@+[GG(G2a[ayyyybybyybybyb+@*vvUQ#s[ZGG]2y[+d@dd{+H((((Z-{Juc.cw9#{<ZGGZZy[{d@@s{-HZ((]2<s#uv..UQ#B[2ZG2Hy[{s@4s+<2](((2<{J%W.vXQ#s[Z]Z2Hb-+d@ds+<HZ((]H-sJu...Ww%Ld+ayH2yHya<++[ayyHHHH-sLw...W*%i@{<[ybHHa<<<<aaaybyyyb+4u....vUu$Js<[bb2ZZ]G((((GH[-{@i%/..",
+".v=%Js<HGG((((G2yb[-+{+-abyyb<J,v/w9Js<yyyyH2ybyyyabaHGG(Ga+s#Xv.vwi@{aHGZZHy[+{{{++aabH2Hya{#uv.W%i@+a2GZ2Hy-<{{{++-ayHHHb-{JwvvW%#@+a2]G2yb[++{++--yyHHya<s#Xv./%#@+HZGG2yaa+{{{+<abbHHya<sLwvvU%Js+H2GGyyaa++{{+-aaHHHy[<siX...v,X%$Jd{+a2GG2HyH]GGZa+s@#%=..vwl@BaZGGZH<abayaybabyyyyyya+JucvXQ4s<yyyyya<{@J4ds+[2(GGH<sJuc.cX%#s-ybyyya+{@##4s+[2GGG[+sJ*v.v=%Js<yyyyba<{4JJ4s+[GG(2H<sJ%Wvc=QJ{ayHyyyb<s@44@B+aGGGG[+s#Xv../X%i4{<ybybyyb[<-<yybyyya+diXv.v,*9i@{+abyba<+++{+<bayyyya<duc...v,uiJ{+ayyyHGGG(t((2Hb<{@#%U..",
+"..W*QN:1kSSSSS~^Bn@44#J@dns1s:$WvcUuQJnBB^+6BBBBBBs:n6~S~k6ML%U...UuLM6~S~~1:@OLiLJ#hnBBBB1sMlXv.c*%LM6~~~^1:4JLiL#JhnBBBBBn4lX..cw9N:A~S~^Bd4J#i#i4MnBBBB1n4$Uvv/uQgnA~~~^1d4JLiL#JhnBBBB1dJ9U..WuQOn^~S~^1d4JiiiLJ:1BBBB1@N9U....cWX*%$NMEk~~~^^^~FV6:ML9%X,...,%lhEk~~~6n@sB{B{ss@ss1sB114$,vv,uQg:BB^B1dhJi%%$LOEk~~k}hgQwvvvUX%L:BB^B1dMg$%%9LhE~~S~}ML%,...Ww%Nd1B^s1@O#9%%9Lh}~S~k6MgQwc..Wu%g:BBBBn@ML9QQ$#h}~~~kBhL%U..../=u%L4@d16^^B1@d1^^^B1dhJ$u,...cU*%i4hd1BBs:hJO4O@ns1BB{1d#Xv...vWUuQJ4@sBB^~~~~S~Sk61@h#$u/..",
+".vWX%LNEAFFSSV^}:hhNllLgM:::n:Q/vc,XRlMnn1111B166}n::}kFFDEgluW..vWufO}VFFA:OL9Q9%%lLh:n11n:hLwv.cXrlN}k~VA:NLQ%%%9$LM:n1nn:M$wv./X%l_63SFA:NLlQ%%%$LM:n11n:N$Xv./X%LMA3S3D:Oll99%QlNhnn11n:N$=v./*RLxAFSV}:NL$%%%%lLMnn1nn:O%U.....c,X*zQNh}k~VkkAkVDENL$%uU/...WufNEV~Fk}:O:n1En:h::nnnnn:O%U..cX%lM:1nnnhll%uu%%N:AFFkEOl%W..v/Xrlh:11n:hNl%uu%RNEDF~kEO$zUv..WwRlMn11n:ML$uuu%lNnkFFkENlzUc../*rLMn1nn:NL$uuu%$#EkFFDEg$uW....c/Uu%lLOMEkk6E::E6kDEMNL9uXc...c,Xu9LM::nn:MggLlggh:nnnn:M$X...../U*%lgMMn11BAAkDkkA}EE:O9uW..",
+"../X%|_pjqqq&7}'Y_II0|0I_x!5'_R/vc,X%|Y5'e'''mKKCK;x!;&qqj;I|z,..vUr|Y;&qqjpI|%uuuz%|_!!'''5Y0wv.c=R0Y;&q&KpI|rururf|_!'5''!Y0Xv./XR0YK&q&KYIlRuzuzf0_!5'5'5Y|X../*RIYj&q&;YI|%zuzzR0_!5'''5Yf=v.c*RIpK&q&;Y0f%ruuzR0_x!'55!_|U.....c,U*rRIY';C&q8&jK;pI|fuwU/..vWz|Ipjqq&;!Y!'e'!xYY!x'5''x_fU.v/Xz|Y5'e5!_0|R*uur0pjqq&;_|R,...WXr|Y5'''!_0|zu*r%Ipjqq&p_|zW...WXR0Y''''xOIfz*wr|Ip&&qjpI|RUc.v/*f0x''''x_0Rz**ufI;jqqj;I|z,....cW,Xz||I!;C&m;x';C&Kp_0|r*,v...c,Ur|I_x'''5YIII0IIx!5'''5Y0w.....WUzR0Ix!''e''p!p;mKjjjKp0zW..",
+"..,*RIYe)qqqC7e'x__NIIIx55eee5|/.cUzfg!e7TTTTT)>C)m''7>8q>;Y0RW...=f0xK>qqj'I|Rzz*zr0_5eeeee5I*v./*RIpKqqqK'I|rrw*uRL_55eeee5I*v./*|I!Kqq>j!I|rrwurrI_5eeeTe!Iwv.Wzf_p)qqqK!I$rzu*zRIx55eeT'!0wv.,r|_pCq8>KY0Rr*z*r|0_55eTeex0wv..../Uwzf0Nx'm)qP88C7T5xI|RzU/...=r0_mC88>K'55eTee:x55eeeee'xfUv./XR0xeTTT'x_f%zzr|I'C>q&m!0RUv.vW*%IxeTTT5xN|RzrR|I;Cqq&mY0RU...WzRIxTTee5!N|RzuR|_;>8q>m!0rXv..,zRI!TTee'xg0Ruzr|I;>qqC;Y0zW....vcUwuf0IxKC>)TeemC>C'_0RrX,....cUX%|Nx5eTTe5xh__xx5eeeTee!I*v...v/Xu|Ix55TTTe!xxE'T)>qq&;YfU..",
+"..U%i@+[2GGZZHy[-{ssdss-[byyb<JUvW*QJs[bbyyyyH2HHHbHHZG((G[+@iw..cu#s+HG(GZ<sJi%%%$i@{[aabby[s9c.W%J@<H]((2<B4iQ%%9#d+[yyybb-d%/vUQ41-Z(((2<s4l9%%$#d+[yyyyb<@%cvUl4B-]((Z[^dJlQ%%$Jd+aybbya<@%cvU$4{aZ(GGHBdL$%%%$Js+[yyyya+@uc...vUu%i4s+-bH2((((22Ha+s@#$uU...wi@{a((((2yybyyya<--ayyyyy[+JuvvU%#4+bbyya<{@L$iL@s-]((Z[^dLuv.c=%#d+bybyy<{4#9i#@{<Z((ZH+d#Xv..U%#s-byyya[{@L$$i4{a]((][+diu/.v=QJs-byybb<{@L$$ih{a(((Z[BdiX....vc,Xu9Jd{[]Z22222]]H-14i%w,....,u%i@{-ayHHHb[<<<-aaHHbyya+4uv...vUz$4s<[ayyya-++-aHHG(GZ[B4uv.",
+".vWu$#s+ayyyyb[<{ssddd{+byayb-J,c/wQJs<yyyyybybybHybyHGGGGa+dLXv.vu4d^[GGGZ-{@i$%9$Jd+ayyybbad%/vUQJs+2G(GZ-{@i$%9$#@+aaybby<s%c.U%4s+2GGt2<s4iQ%9iJs+bayyab-@%c.U%4s<ZG(GH+s4iQ%9i#s+bbbybb-@uv.X94B-2GGGa+s4iQ%QiJs<bbayyb-@%/..vWXu$J@{-b2ZZ2ZHZ2ZZy-+s@i%Uv.vXiM+[Gt(G2yayybab-<abbbyyyb+4*vvU%id+byyyb-{dJii#@Ba2GGGb+@#Xv.cX%#@-byyyb<{@Jii#@B[ZGGG[+@Lwv.v=Q#s<byyyb-{@Jii#@B[GGGta+d#u/vvwQJs<yyyy[-s4#ii#@BaZGGGa{4iwv.....cUu9iJB<b22G(GG2H[+@#9uwWv..v/*%i@{<bH2G2ybybbyy22GZ2y<{4uv...vU%$J{+bbbyya<+++--y2G(]H+4uc.",
+"..cXu%Lh1B^BBsd44LiiiLJMs1sBs:9WvcUuQJ@BB^BB1s1BB6B6^~~S~~}hL%,..vX%L:DFS~kENN$%uu%Qi@s{{B{1dJ*vv/*9L:A~S~DnMi9%u%%9#@sB{{Bs@Lwv./wQN:A~S~AnNL9%uu%9J@sB{B{s@iXv./*QNEA~SVDngi%%uu%$J@1{B{Bs@LwvvWulOE^~~~6:gi9%uu%9J@n{B{1d@l=..../U*u$#h:1k~~^6B^~~~^n@Ni9uW...WrlOEkS~~~BBBssdd@4dsB{BBsnM9Uv.WX%i@1BBBs@4gi9%QiOEkSS~}hi%Uv.vWX%i@1BBBs:4l$%%$LOBk~~k}ML%,...Ww%i@1B{Bd@JL$%%QLhE~~~kBML%,v..WwQ#@BBBBd@gi9%%QLM6kS~k1hl*W......vcUXu9LM16k~SSF^E:Jl%XUWc...vcU*%iO@n^~~~^^{{B+^~~~~^1:#uU...../wu$J4ns1Bsd4O4O4:Bk~~~EhlX..",
+"..cUXu$g:111n:hOll$%QlNM:nn:nM%c.c,XRLhn16}n:::::n11^k~SFAEOluW...U%lO}3F3D:OL$%%u%$LM:n11n:h$wv.cXRlN}VFoDhN$Q%%%%$LMnn1nn:N9=v./wR0MD3FVA:NLQ%u%%lLMnn1nn:OQUv./XRlhDVF3A:gL9%u%%lNMn11nn:O9=v./u%LxD33V}MN$Q%u%QlgMn111n:gQUv...c,wu9Lg:Ek3kAn16A3VA:MNL%w,...,u$NEkFSF^61n:::MOOM:11nnnMN%,../Xz9O:11n:MgL$Q9Rlg:6FFk}Olu,..v,wu$O:1nn:MLL9Q%9lO:kFFkE#$uWv../w%lMn1En:MN$9%Q$$NEkFFVEgQu,..vWX%lM:11n:NN$$Q%9LIEk~Fk!NQuW.......vW=Xu9LMEAFSFV}:Ol%*=,/v....cUXuQLg:}kFV66B11n6kFSFDnOl%,....vWUu%LOM:nnnMNgLNgOEkFFk}O9=v.",
+"..cU*%0Ipem;'xx_I0fl|0I!''}5!Ir/vcUXRIx'mme'!Yx!!!';7Cqqq&p_|z,..vWr|_;jq&jpYI0|$||0I!'}ee5!_RU..cUr|Y;&q&jpYI|$|||0I!'em}5!_fUv.cXR|Y;&&&mp_Il|f||II!'ee;EY_RU../Xz|Y;&&&Kp_I||Q||0_x'ee}!xIR,.v/wfIpK&q&;pII|||f|0O!';e5!!0rW...v/U*%|I!p;j&C;'';m&jK;!YI|w,...WuRIpj&q&Cme'!!x___x';ee5'Y0z/../Xz|I5'''!xII0|||II;jq8&;I|zW.../wr|O!'''!_II||||0Ypjqq&;I|zW...cXz|I5''5!__00|||IYpCqqj;I|uW...WXz|_5''5!YO0||||I_;&qqjpI|u/........cUXuR|_pK888j;_I|r*=W/v....c,X%|IYpK&qqCmee'emK&&CKYI|*W....cUXzR0__!''E!_III_Ypj>q&pYR=..",
+".vWwzf0xm)C)me5!x__O_x!'m)7m'_rc.v=z|I')))Ke'5!!x5eT7C8P8&;Y0RU...=r|I;)C>)T5!x_ON_x!eK7Cme!_|Uv.cXr|Y;C>C)e5xx_N_hx5')))m'!I|=../Xz0Y;C>C7T5!_O_N_x!eK))m'!I|Uv.cXr|Ym)CC7e5x__O___5;)C)m'xIRU..W*z0YmC&C)e5x_ON__Y!e7))m'x0R,...vUXz|Y;m7)C))e55'm)C)mmmpIRUv../*fIpK>>>CCCmeE5!n!'m)C)T5_0zW../=r9_5TTTT'5x_IN__';Cqq&KY0rUv../Xr0_5TT'e'5x____Y!m>q8&;Y0%,...Wwrl_'1Teee!x___OY!m&qq&;YRz,.../XRl_5TTee'5___N_Y'm&qqC;Y|zW........c=wr|L_!Kq88&;!O0fzUUWc....WXr|Ix5eKqq>C)7TTTT7mK;pY|R*/.../,XzfLx:eeeTeE555!!'m>qq&mY0wv.",
+".vU%$Jd+ZZ(G2Hb[<<+--abZ](]H-{$Wc/*QJ{-]ZZ]Hya-<--by2](((([+:iX..vXQOs-HyHHyya[<<--aaH]]GZ[+@lwv./u$Js-HZHHyyaa<-<-aa2Z]ZZa+@lwv.,u$g1-HyHbHyba-<-<aaZ]GZZ[{@iXv.Wu94{<b2yHbya<---[[b2ZZ]2[{diU../r$4{[HHHbyya<<--a[H2]G]H-B49U..vWu%#s<ZZZZ2H[<+++-yH2ZZ22BJ*v.vURi@+aH222GZZHaaaaaH2Z]][<s4%=..W*$Js-ayyyyaa<++-<a2]((2[B@$Xv..Wu94{<ayybya<-+--[a2(((([14$w...Wui4{<yyybya[<+<<aaH]((Z<1#%=v.v,ui@{<yyyyba-+++<[b2]((Z<1#9=.......cUuQi4s+a2t((Ga-{dJ$%*UW...vwQ#@+<aH2((G2byybyyb<++n4iQ*W...Ww%$4{-[yyybyybbbyyaZ]((Z2B4uv.",
+"..U%i4{-ZG(GGyyybbabbyHZGZZ2+d$/vWu9J1a]GG2Zyb<<<abyHZ(((ta+4iwv..=%L@+[ybyyyyyabbyyy2ZG22<{@iXv.cwQ#s+abybyyyabbayyH2ZGZ2-{4$=vvcw%i@{[yyyyyyabbbbyHZZGZH<{49U..cw9#s<bybyyyyabbyyyyHZ]ZH+{J%Uv./*%Js[ayyyyyyybbyyyy2GZ2[+sJQU...v=Q#@^2]ZHa-+{ss{+<[H2Z]aB#Xv..U%id+bybyZ]G2yyyyyy2GGGGa+@#%Wv.cw%Jd+aabbyyyababyyH22G]<sJ9wv.v/w%#s+bbbyyyba-ayyy2ZGG]<s#Q=v..W*QJs<aaayyybbabayyHZGGZ-si%Uv..Wu9Js-aaybyyyababyb2ZGG2-s#%U.......Ww%$J@+[HGG((GHa+s4i%u*,c..vX%J@+byyZGGGHyyybba-+s4#iQu=v...,u%i4{<yybyyyyyybbyyZG(G][+@uc.",
+".v/w%LOEk~SS~~^^^6^6^^kAkA6Eh$wv.cXu$N}~SSS~^B144@d16~~SSV}hL%W.../=u$N4:dnBBB^6^6^^^^6A6EMLQu,...c=u$JhdnsBBB^^6^6^^k6A6EhLQw/..v/Uu9L4:dnsBBB^^^6^^DAD6EOL%w/...,w%iJhdnsBB^^^B^6^^66A}nOl%wc..v,X%$4MdnsBBB^6^B^^^^^A6nOl%*/...v/X%lM:}EE:h#l9$$iJM:E}ExL%U.../w%ihsBB^^^^^^^^^^^^kAD}:Oi%Xv.../XuiJ4dnB^^^^6^A^^^^^^6:l%u/...cUXuiJ@d1B^^^^66^^^kk^A6:L%w/...vWXuiJ@d1B^^^^6^^^^^^^^B:l%XW...vUX%iJ@dB^^^^^6^^^k^^^DBMluw/.......,wu%$On1^~S~SSk6nML$%*Uc....Uu$Jn6^^~S~~^BBsn@h#$$%uXXUc..../UuQL:1^^~~~^^BsBB^^~SS~k}Ol=..",
+"..WX%LhEkFSSFF~V~VVoookDEn:OluU..cUu|NnkFFSSVDEMNgM:EAoSFkENQu,...v,Xu%lLgh:16kkVVVkkD}:MgLRu=v...c,wuQLgOMnB6kkVVVVVA}n:hL%uUc...cUXu%LlOhnB6kkkVVkkAE:Mgl%u,v..vc=XuQLLNMnB6kVVVVVk}n:ML$ru,v...cUwu9LLNhn1Bk~koVVDAE:hLl%w,v....c,wz|LNOLL9%%uwuuR9LNNNlRu,v../U*9L:n116BAkVFVFVVkDE:hg$uXWv.../UXu9LL:}k~VVV3F3VkAEE:g$uX/..../U*u9lgM6kVV3o3VVVD6EExN9u,v...vWU*u9LO:Ak~VVV33VVkAEExg%*wc...v/UX%$Lg:A~VF333333k6EEML9u,v......v/*%$LN}Do3SSSSoV}Mgl%uUc...vWulOEkVFFSFk}E::NLQRu*XUU,cv....c=*Rg:DVFFSoVAEnn}k3~SSFk!g%Uv.",
+"..WwfI!;Cq888888qqq8P8&Kp!_0f*W..vUuRI;&q888qjp_IN_x'm&qqjpI|uW..../=*rflL_!'m&q888q&m'YI0frUWv..../U*rflI_x'm>888qqqK'xY0frXWv....WU*uf|N_!eK>q888q&;pII0RzXW....vWU*r|lI_5'Kqq8888&;pYI|fu=/....vWwXrR0I_';)&8888q&mpYY0RzUW.....cWU*%ff||%z*ww=XX*zfR||fzXW.../U*RIY!''mm)Cq88qq&C;x!I0ru,c....c,wwr|0Y;Cqqq8888qjm'xY0f*=/....c,w*%|IYK&qq888qqqj;'YY|RX,...../UXur|I_K&888888qqj;'xY|RX=/..../U=ur|IpK&q888888&j;5!Y|zXW.......v,*R|IY;&qPP88PPqjp_0|uXc...c,*fY;&q888qjm5x_I|%zXX=,/c......cUu%I;jq888q&K'!'K&q8qqqjpIzW..",
+"..W*f_5mCqq88P88P8888PqK'x_0RwW..c,zfY;>qq88qC;Y_IY!')>qq&;IRwW....vWXuf|0_5TK>8888q>K'x_0Ruw/....v/=Xuf|0_'T)>q888q>j'!_Ifrw,.....cUXzr|IY'T)>8888q>m'xI0R*X/....v/U*rf|Ix57)>88888>m!YN0r*XW.....cU*uf0Nx5TC>q888q>m'x_0R*X/....vc,=*rRffRrwXU====**rfffrzU/.../wwfN!eeT7)7>q888qqCm'x_0R*=c....vWUuuR0YK>qq8q888q>m'5_IR*U/....c/U*zf0!K>q888888qCm55_0rXWv....cW=XrR0pmqq888q888Cm'x_0rw,v....c,UzrRI!C>8888888qCT'!_0rX/.......cUzR0_!K>q8888888C;_I|RX/...cwr|_K>q888q>Te5xI|zw==Wc........cU*RI;>q8q8q>K''eKq8q88q&p0z,..",
+".vU%#s+a2GGZGG((G(G(G(Z[-Bs4izU.v/w%L@<]Z(G(ZZ<{dds+-HZG]2+:i%U....vWXuQiJs+aH]](G(]][+1@4l%u,.....cXu%Qi4s+[H2G(GGGZH-{s@i%w,.....vUu%Qi4s-aH2G]((G2[^s@Jl%wW....v/=u%$i4{+bH]G(]GZZ[+s@#$%=/.....c=uQi4@{<a22GG(G]]a+{d4$uw/....v/,Xu%999%uuwXUUUw*z%QQ$%%wW...Ww%id+byyyyHHGGGGGGH[+{@J9uXc....cW=u9lJs-]GGZGGG(GHa[+{4$u=/....cW=z%L4BaGGG((GGGG2b-+s4$%Uv....c,wu9i4{a]G(GGGG]]2ba+{J$u=v....c,w%9i4Ba]GGZGG((G2a<+sJ9*=......./X%$4d+aZGG(GG(GZH-{@Ji%W...c*%#s-](GGG]2[a+{4i%u=,cv.......vWw%l@+2ZGGG]2H[[aa]]GGG]HBOu,..",
+".vU%$4s+-babbbbaHabbb[~+s4Ji9*/..vU%iOs+a[[a[+{@JJ4@s+<[-+d#9*/.....vWX%Qi4s{+<aaaa[-+s@#iQuX/v....v/=u%QiJ@{+abab[a<+s@Ji9*=c......v,w%%i4d{+aabbaa+{d4#9%*Wv......v,X%9i4s{+abaa[a<{@4#$%*Wv.....vc=u9i#4s{+abba[a<+s4#i9*Wv......v/,uu%%uu=WW//,,Xwuu%%uw,v...cX%9@{<[a[<[bybbba[<{@4#$%*,v.....v,X%QL4B<abbbbb[a<+s@Ji%*,v.....v,w%%L@{<abaHbbba-+s@4iQ*Wv.....vWu%Q#h{-aabbbbb-<{s@JiuU/......cWw%9#d{aabbbbab-<{s@Ji%*/v......c,*%iJ@B<[baaba[<+s@#i%wW...c=%iNs<aaba[++s@JiQuw,v..........c=u9#s+aabba<+{{{+-aaa<-{@iu/..",
+"..c,Xu%$iL#g#gNNONgLLLi|Q%u*U/v...cU*uQlLLLLLlQ%uuu%%$lLl$%uX,v.......cUXu%9$iLLNLLLl$%%uwX/c........c/UXuu%9$iLLLLLLlQ%u*XWv........vcUX*u%9lLLLLLLlQ%uuXU/v.........vWX*u%$iLL#LLLllQuuwUW.........vWU*uu9$lLLLLLLl$QuuXU/.........vv///W/ccvv..v.c/,=UUUWc....v/wu9J4444#i#####LLL$%%uw=/v........c,=*uQlL#L#L#LLll9%uu=/v.......vc,X*%QlLLLNN#lLilQuuX,Wv........cUXu%9LiLL###Nii$Q%u*Uc........v/UX*%$LLLNNNNLLl$%%uXWc........v/,UXuuQiL#g#LNLLLQ%u*UWv...vc,*%QlLLLLLL$Q%uuX,/v...........v/UXu%lLiLgLLLl$lliLLLL$fuXW...",
+"...c,UXuuuuuuuu%%%urruuu*UUW/v....vWUXw*uu*zuu*XXUUUX**u*wUU/v.........vW,UXwuu%%zuuu*XUUWcvv.........vcWUwwwuuuuuu****UU,/............v,UXw*u*uuuuu*wUU,Wvv...........cW,=ww*uuur*uuwwUU/v............cWUww*uuuuuuwu*wXU,/v.........................vvvvvv.......cWXuQlllQ%uuuwuuu*uuXUU,/c..........v/,ww**uuuuuuuu*wwUW/c..........ccU=wwuuuuuuuu**wXUWv..........vcWUU*uuuuu%uuuuXw==,/..........vc/Ww*wuuuu%ruuuXXUUW/...........v/,UXXuzuuuuuzu**XU,W......v/U=wXuuuuu*uwUU,//..............vWUUwwuuuuuuuuu*zuuuu*XXU,c...",
+"....vW,U=UwUw*ww**XXw==UUU,Wc......./WU==X=UU==,,,,,,UUU==W/c...........v/WUUUwXwwX=w=U//cv.............c/,UU=ww=wXX===U/cv.............c/W,,=Uwww=wU=U/cv..............c/,UU==UUwU=XUU/cv.............v//WUU=w=w=w=UUUW/c.........................................cUXzrzzz*wX*XU=XX==U///v............vc/,=UwUX====UXUU,/v............./U===wUU=wwwUU=UWc............../WU==XXXX*wUwUUUW/v............ccWU==XwwXuXUwUU,Wc.............cW,=UUU*U*==U==U,/cv........cWU==w==wUX=U/c.................cWW,UUU=w=X=wwUUX=U=XU=Wc....",
+"......c/U=U=UUUUUUUUUUUWWcvv.........ccWU,UUUUW/c//c/W/WW,/v..............vc,U,,=UUUWU/v.................vvv/,,WUU,,UUWvv..................vW,=UUUUWU,cv.................vc/W====U=U,,v..................vccWW,UUUUU=UWWc..........................................vcUUww*X=w==UUU,,UUW/v................c/,UUU=XUUUU,/cvv..............v/,,UUUUU,,,=UW/cc..............vcWUU,,U=,UU,,/cc...............v/W,U,UUUW==W=,ccv.............vvcW,==UU=XU=UW/ccv..........v/WUWUUWU,Wcv...................vc/,U=UUUUU,U=UUUUU,,/c.....",
+".......vcW/WWWWUU,,WW/c................v//WWW/cv..v..v.vc/c................./WW/WWWW/cv...................v.vcWW/WW//W/.....................vc,,,,,WWcv...................vccW,,,,,,WWv.....................//WW/W//WW//v...........................................vWU==UWWWWUU,WWWW/cv..................v/W,WWUWW,/cv...................cW/,UUWWW/WW/v.................c//W/W/WWWW//v...................v/WWW,,//,///v................vv////W/,WU,,c...............vc,WW,W/,/v......................v///W/W/W//WW/W/,WW/v.....",
+"..............v.v........................v...................................v.v................................vvvvvv......................................................vc//////c...........................v.v...................................................vvvvvv.vvvvvv..v......................vvvv.vv.........................v.vvvv..........................vv..............................vv.......v.......................v.v.v.......................v..v............................v.v.vvvv..v.v..........",
+".............................................................................................................................................................................vvvvvvvv........................................................................................................................................................................................................................v..................................................................................................................",
+"...........................................................................................................................................................................vcccc//c/v.......................................................................................................................................................................................................................vvv.................................................................................................................",
+".........vcccccvv.................................vcvcv........................vcvv........................................................................................vcW,,,,WW/v...................................................................................vvvcvcv..................................vccccvv....................vcccvvvv....................................................vvccvvv.................................vcvvcvv.........................vcv............................................",
+"........v/W,,UU,/cv...........................vc/WWUUWWc...................vcWWU,U,/v.....................................................................................vW=U**w*Xw=Wc.................................................................................cW,,UU,UWv..............................v/,,,,W,,/v.................vcUUU=U,/cv.................................................c/U,U=,Wcv..............................c/,UUUUWWv.................vc/W,WUUWc...........................................",
+"......../Xuu%%%%u=,/v.......................vc,Xuu%%%%*=/v...............vWXuu%Q%%%w=Wc...................v/,UUUUUUWW/c..................................................v,u%9$#i#iQ%X,v..............................................................................vWXuu%%%%uuU/v..........................cWUXu%%9%uu=,c..............v/XXu9%9%%w,,c..............................................v/Xwu%%%%u=,c...........................c/Uwu%%%%uuUc..............vc,Xu%%%%%uXWv.........................................",
+".......W=u%QiJJiQu*X,c....................v/,Uu%%$iJJi%wUc..............vWww%9iJJJ$%*U/................v//,==uuuuuuuuwUWv.................vcc///cv..vv...................WX%9#4@d@@J$u=,v.............................................................................cU*uQ$#JiQ%uX/.........................v/UXu%iJJi$%uX,c.............cU*%$iJJJ$%uU,/................vc/cccccvccc................./=w%QiJ#i%uX=v........................./U=uu$iJ#$Quw=/............vWXXu%i#J#i9u=Wv.................vccccccc//cv...........",
+"......v/,Xu%QiL$%*X=Wcv...................v/,UXuu%$i$%uUWc..............cW=XuQi#li9uwU/................cWW,wXuww****uwX,/v..............ccc/////ccccccv.................vWUu%iL4:4Mi%*UWv............................................................................v/Uwu%QiLi%*X=Wv........................c/,U*u9ii9%uX=,c............v/U=u%9ili9uX=Wc..............cc/c////ccccc/vv..............vW=Xu%$liQuXUUc.........................cW=wu%iii9%uUU/v...........v/UX*u$iiiQ%wUWc................vv//////////cv..........",
+".....vvWU=u%lLLl%uwU,/v..................vW,U=w%Q$$LL9*=,v.............v/=Xu%$$LNLQuXUWv..............vc,Uw*u%%%u%%u%u*XU,c............vc/W,WWW///W///cc................cWU*%lNMM:NL%uwU/............................................................................v/,=w%9LLl%u*X,/v......................v/,=wu%lLLl%uwU/v............cWUXu%LLNL$%uUU/v............vv/WW,/W/////W/Wccv............vWUwuQLNN$%uwU,v.......................v/,UXu9$gL$u*w,Wv..........vcW=wu%lLgL$%*=,Wv..............vc//,,W/WWWWWW/cv........",
+"......cWUwuR0II0|%r*=,cv................vcW=wuR|0IIIl|uU,c............cW,=*%|0I__I0RrXUc.............v/W=X*rR000|0|||f%zX=Wv..........vcW===XUU==,==,,Wcv...............c,wzR0Ix!!xI|zw=,v...........................................................................cWUw*%fI_I|QrzXW/v.....................c,UXu%|III0QzwU/............./,w*%|I__I0f%wU,/...........vWW,=UUU=,,,=,U,,,Wcv...........cWUwuRII_0|%r*UW.......................cUwwuR|IIIlRuU,Wv..........vWUXu%fII_IIRrwU,/.............v/W,====U,,,,U==,/v.......",
+"......c,wXR|_:5x__L|RX=/................vWX*z9I_xxxx_|rwU/............cWUu|0_x!555_L|rXU/............/U*zf$IY!pp5pp!x_I|RX=,v.......vcWX*zRRRrzX*zzRRzX,c...............cU*R0x!555!xI|RXUc...........................................................................cW=wrfIxxxx_#|RzUWc.................../UXzf0INx5x_|rz=/............/Uwz|Ix!555x_0|zXU/.........vWUwuRRfrz***zRRuzXU=/v..........v,=*R|Ox!x__0|r=W....................vWUwr||g_x5xI|rwU/c.........vWUwr0Oh!555xN0rz=Wc...........vWU*zrR9Rzu**uRrrX,cv......",
+"......cUu%i4{-yaaa+{J$uXWv............vWUw%$Js+ayba+s49u*,v..........c=u%i@+aybabaa+sJQuXc........../Xu$J@{+[2ZZZZ2Haa+sJ$%XW......c,Xu%i#@ds4#ii#4@@#%u=c............v/=u9Js<byya<+{sJQw,v............v//////Wccc/////Wcv.................vc/WWWW/W///Wcv...........c,u%$#d-aba-<{@i%u,Wv...............v/Xu$#@{<<aaa+@i%u,..........vWXu9Js+[bbyyaa+di%u=c......vc,u%$#4@s@JiiiJ@d4i$%u=Wv.........cXu%iJ{-yaa-+sJQu,.................v/U*%$Js{<abb<s#$uwUc........vWw%QJs-byybba+sJ$u*,v........./Uu%iJ4@dd#iiiJ@@4$u=/v.....",
+"....../U*%$4{<aybb[+@i%uUc............/,XuQJ@{aybb[+sJ$%X,v.........c,wu9Js-bbyyyya-s4$%X,v........vWX%i@{+aHZ]G]G]Zyy<{@i%*Wv.....cU*%iJ@s{{s4JJ4s{s4$uXWv...........c,wui@{-baba<<{s4$u=/.........v/,,==www=U===Uw===UUWv............vc,,,UXXXXw*Xww=UU/cc.........v,wuQis+bayba<sJ$u*U,c............../Uu%i4{-<bab[{@i%uWv.........v,X%iJ{<bybybyy-{J$%*Wv.....vUwu9#4@{{s@4J4@{{dJiQ%u=/........./,u%$4{<byab<{4iu=W................cUwuQi@{<[bba+s#9u=/v......../Xu%i@+byyybya<{@i%*,c........v,*u$i4d{+{d4J4@s{@i%wUv.....",
+"....../W=XuQ#@dsss@@L%*XUc...........v/,X*u$#4@sBsd4L$uw=c.........v/,X*%$J@sBBs1ss@Ni%w,/v........./UuQiO:n6D^kkk^^B1@JiQ*Uc......vWUu%9LJ4M4#li##4Ji%wUcv...........c,X*%i4@sds@d44g$uwWc........vv/,UUUUUX=U,,=UUUX=UUUWcv..........//WUUwwwwXwwXUX=U=,cc.........v/Uwu%i4dssss:Ji%uX,W/v............c,U*uQi4@sssn@J9%XU/..........c,U*%i4@s1B{1ss@4i%u=Wv.....v,U*uQi#4M4glL##44#i9%*w,Wv........v/=wu$J4dsss@4$%wU/................/=X*%$#4@ssd@4$uw,/.........cWUXuQL@nsBs1s1@4i%u=,v.........cUXu%9iJ44JlLLJ4Ni%XU/v.....",
+"......cW,w*%lLhM:n:ML%uw,/v.........vcW,=*%$lOh::hNl$u*UW/.........v/=wu%lLh:::::::MOluX=/v........./=X%LON::EEE6B6En:NL%uwUc......./UX%9LlONOgLgLONlQuU,Wv...........vW=X%$NMh::n:ML$%uU,c........cW,U=*w**w**XXXw**w**wXUUWv.......vc/,U=wX**uu*u*uw*wXU=/v.........c,Xu%lLOh:n::N$Q%wU,/v.........../UUXu%$LM:::hMg$%*wU/.........v/,w*%lM::::::::hg$Qu*U/.....vW=*u%$lgMOOLLLgNNNL$%uXUWv........vc,Xu9$NNh::Mglu*=/...............v/Uwu%$gM:::Og$%*U,v.........v/=*%9LN::::::hNg$uwUc..........cUwu%lLgOOgNLLlgLluw,/......",
+"....../,UXuR0IO_!'5xI|%*UWc..........c=U*uf0OYxx!x_0|r*=,c.........v/Uu%f0I_x!xYx_!x_If*w,c........v/=*%0_Yx!x!5'''5xYI0%w=,c......c,XuR|II______N__I|%w=Wv..........v/UwuR|IxxE5'x_I0Ru=,v.......vWU=*zrrRrR%RrrrrRrR%RrzwU,v.....v/,,=w*zRRRR%Rff%frRRzXUWc......../W==u%|0NYx55!YI|RrXwU/v........v/WUw*%|IIx!E5_OI|%*wXWv.......v/=U*rfIY!xxxxx!!YOI|RrX/.....cW=*rf|II__IIIIOY_II||rwUWc........v/=Xuf0N__!!x_0R*UW...............cWUuR|I_xE!xI0fuwW/v.........cW=*%fI_x!xxYYx_I|zwU/.........vc,XuR|I__Y____I_0|%XUc......",
+"....v/WXwR90I_xEeTe5xg|rz=Uc........cUXuR|N_x5Ee55x_0QrXUW........./=*RlI_x5555555555_0%*U/v.......c,XR0Ox55555'TTTe'x_0|rX,/.....c,Xz|0O_x555!5!!!!xO|zXU/.........vW,XzR|_:5'eeTe5x0|R*UW......./UwzR|0ILII00000LILII0L|RrX,...../UU*zrRl0IIOINIOILII0|fzw,v....../U=XzR0N__5'eT'5xO0|Rzw=W.......c,U*z%|lIM55eee'x_N0|RzXW.......cUX*z|Lx'1e'555E'5x_N0fz,v...v/=Xz|LO_5x55:x!x5!x__L|RwUc........cWU*R|g_xEee'!I|zw,v............./Uwz%0Ih5eee5_0RzX=/..........cWXz$I_!5e'5555x_LfzU/.........vWUwr|I_x555!!!xx_0r*=/......",
+"..../X*%iJd{+-[byyHaa+sJi%u=/......cUu$#@s+-ayayyb[-s@#%uuWv......vUuQ#s{<ayyyabyyya[+@#Qu=/......c,*%#d+ayybyyyyH2bya+s4$%*Uv....W*%i4s++aayHbbyyya-{@i%u,v.......vWu%Q#@s+[yyyHyba-{@#$uwWv....v=uQ#@{++++++{+{++++++++{dJ9wc...Wwu9iJ4@{{++<<-+-<++++{@#Q*/...../=u%$J@s+<<yyHbyba<{s@Ji%uW.....cUu%$#4d{+aayHyyaa-+{dJi%uW.....cUu%iJ@{<ayayabHybba+{s4i%W...vU%9J@{+<bbbababbyb-<{{@J9uUv......cU*%$#d{<[ayby-{4i%X/............/=%9#4s+-[ybaa{@i%u=c..........,*%i4s+[byabbbb<+@#%uW........./UuQi4s+[yyyybb<-{di%uW......",
+"...cWXuiJs+<b2Z2G2GHya+@#Qu*,v....vWu%J@{+aHZ2GZ2Hyb<s4i%u=Wv...../Xui4{<bb22GG2ZHyyb<d#9uwU/.....cXu%#@-[yyy2GGZG2Hyy-{Ji%*U/..../u%i@{<byyZZ2G2yyya{@i%u=/.......c=u%J@{<ayZZGZGZyb<{4iQuX,c.../X%i@+aH22HHaaaaabH2222Ha-sJ%,..vWu%i4s{+[yH2H22222H222[+@i%U....v,X%$J@{<[b22Z2ZZ2Hy[-{s@i%=v...c,X%9Js{+[y2Z2GGZ22Ha<+{4i%U....c,*%i4s+ay2Z2GZG2ZZ2yb<+@#%Uv..Ww%i4s-<by2ZZG2G2HHyaa+s4$uXW....../Uu$i@s-22GZZ2H+@i%w,...........cU*%i4{<H2ZGG2H+d#Qu,c..........Wu9#@{-b22GGG2H-{@i%X,v......../Xu9J@{-b22Z2ZHa<{@i%w,v.....",
+"..vcWU*%#MnB^~S~SSS~^BsOi%u=Wv....v/XuiJ:nB~~SSSS~^B1@l%uwU/v...../Uw%L@n1^~~SSS~~~Bs:#9uXU/c....../UX%i@1sB~~S~SSS~^B@M$%*=,/...vcUu9#@1B^~~SSS~~^^s:L9uwU/......vcUXu9J:1B^~S~SS~~B1@L9uX=Wv...cXulM6k~~SS~^^{B^^~~SS~~^1:#%W..cWwu$g4d16~~~~~SS~S~~SSV}M$u,....v,Uu%L4:16~~SS~S~S~~61@MJ$uW....c,UuQiM@16~~~S~SSS~~^Bn@N9u,....cWXu%N@n1^~~~S~SSS~~^B1dJ9uW...WUw%L4n16~~~SSSSS~~^B1dMi%uUc......c,w%QLh}~~SSS~A:luXUc...........c,XuQLh1k~SSS~^:g9uX/..........vcUuQiNn6~SS~S~^nN$uX,/.........cWwu9LO:A~SSSS~6:g$uw=/......",
+"...c/=X%LM:EDkFF~FFkk6nML%uX=/.....WXz$NMn}kVF~~F~k6E:LQuX=,v.....cUX%lM:n}kF~FSFkk6n:g$%u=,c.....vcUwulO:n1AVFSS~VkABnOL%uXUc....c=w%LM:EDkFFSFFVk6EML$uX=/.......cWXulNMn}kkF~FFVkAE:N9%uUWc...cUufN}k~3SFVkDB66kk~Vo3VA}:O%U..cU*rlN:nEAVFF33o3FFFSSSV}N$uWv...cUwu9NM:EAkVSSS~F~Vk6}En_L%Uv...cUwzQOM:EAk~FFS~~FFk6EE:O$%=v...c=wu$NMEBDoS~~FSSFFVA}E:O$%W.../XuQgMnEBk3~S~FSSF366En:gQuX/......v/UuR$NED3SSSSAxlzw,/...........v/wu%lgEDVSSSoAx$uX=/...........cUXu%LN}kFSSS3}hL%u=cv.........vWUu9lLM}kFSSS3}Ml%uU/vv.....",
+"...c,U*%0_x!;;KKKmKmKKmpI0fuU/....vWX%|O!'';KKKKKmKKK;_0f%XUc....v/=wR|_x';;KKKjjKKKmpY0|zwUc......cWwzfgY!'}KKKKjKmKK;!I0%zU/....cUwR0_x';KKKKKKKjKK'_0|zX,v......cWXu|_xx';KKKKKKj)m;YI|%*Uc...cUzRIp;KKjjjC&&&j7KKKKKKKKmp|=v.cUu|YpKKKKjjjKK;KKj&8PP&j_0rU....cUXr0p;jjjCKjKK;jjKCmKKKpYRXv.../Uuf0p;jKKjjKj;K;jjj7KK;pIRXv..vcU*QIp;KjCjjjjK;jjCjCKKKpIfX...Wwr|Y;KKjCjKK;KKjjCjjjK;_0r*/......v/,wrR0Y;K&&Pqjp0rw,/...........v/Uuzf0Y;m&qPqjp|R*U/...........c,=urf0_;j&88&j_|r*=c.........../WXuf|Ip;j&88&KI|%*U/.......",
+".../Wwz|Nx5eee}';e'mCCCm5_0fzUc...v,ufI_55ee''};'m7>Cm'_g|Rw/.....WU*RIx5E'}';'}5m)>C75_I|rXWv....v/=wR0Ox!5''''';e7C>7;!_0R*/...vcwz|N!5'}'}';';mC>Cm!_0|rU/v...../UwRLx5ee}'''}'m)CCK'xI0RX/..v/Xz|I!eTTT7m&q8qq)me'''mmC&;Iwv.W*fIpK&>>CmeppYxp'Tj8PPPjpIf=v..vWUrfI;C>q&)mm';''TT7>>q>)pIzW..vW*r0YKCq>C7m}''p''T)C>q>Kp0z,..vWXz|Ym&>qC)m}'p''em)C>q&)pI*c.vWz|Y;C>q>)mA;'p'em)CqqqC;_|z,.......cUXur|IYpjq8q&pIfzX/............cU=*R|I_pKq88jpIRzU/...........v/U**f|IY;jq8qjpI%XU/...........cW=Xz%|IY;Kq8qjpIr*=/.......",
+"..v,*%$J{<aayyybbabb]]ZH-+s@$uW..v,u94s<bayybb[bbb2Z]2a<{@#%uc....Uu9#s+ayyyababaHHG]Z[<{@#%w/..../,u%#@{-[byabb[ab2]G]a-{sJQuc..vWui@{<abybaabbbaZ(Z2[+{4i%=/...v/XuQJs+ayyybbabba2G]2a<{dJ9wc..,u$4s-byyyyy]((((2abbbbyZ((~nu/vUQJ{a]((G2ya+1ds{+aHtt(ttT@#*v..cXz$4B[(((GZyaa<-abb2](((ZasLXvv,uQ#@+2(((GHy[<<<<ba2](((Z<sL=v./Xzi4+HZ((G2yb[<-aayyG(((2<s9c.vXi@+[(t(GZHya<-aaH2Z(((Z-BJ9X.......c,wz9LMs+2G(tZ<1#Qu=v...........c,wu9L4B+2t(t]<:#9uUc..........vWXu%Qghs<2t((Z+d#%u,...........c/X*%$g@{<Zt(t2Bdi%u,.......",
+"..vUw%i@{[byabyyabbb2GZ2a-{@i%Uv..WuiJs<abbyybbbayHGG2b++dJQu,...vU%QJs<bbbbbabbby2GG2b<+@#Qu,v.../=*%L@{<babybabbyH2G2ba+s4$u,..vU%i4{<bbyybybabHZGGHa-{di%u,....Wwu$Js-aabyybbbay2GGZb-+sJQuW..W%i4s<bayyyyZ(((GZyb[aab2Z(ad%vv=i4{[HGGG2a+s@44ds+-[tZ2[{@iwc..c=%i4BaG(GGyyba-<<ayyGG(GZ[{JwvvUu$Js+2G((2Hyba--<ayHGG(G2[s#X../w%l@B2G(G2Hyya-<ayyy2GGt2-d%/.cui@^aG((GHyyb-<-bybZ(G(]a{49=v.......c=u%$Jd^[G((Z-sJ9u=/...........c,Uu%i4d+[GGtZ<s#QuX/..........v/UXu%iJn+2G(t2+d#Qw,v...........vWwu%i41+2G(]H+@#QwW.......",
+"...WXu%L4dnsB1BB6B6^~~~6nMJi%=/.../Xu$J4s1BBBB1616~~~k1:4LQuU/..../XuQL@@s1BBB161Dk~~61h4iQuXc....c/Xu%i4@ns1B6B616k~~k6:@Jlu,/..vWX%$J@nsBBB1B166~~o^n:4i%*UW....cUXuQL@d1s1BB16B6k~~k1M4g9uX/..cX%lJ@ns1B6^oSFS~^11ns11^oVDNwv.WulOE^~~~6:MLQ%%9lLO::x:hLQuW...v,X%$hAF~S~^B1ddnd1B6~~~SkEN%U..WXu9N:D~SS~BB1sndn1B6k~S~^ngQ,v.cU*%L:A~SS~^Bs1d:@1B^^S~~Dnguv..U%LMA~SS~^BBsndnsB6~~SSk}Nl%W........./UwuQih}~S~kngQuw/c............c/=wuQL:D~~~D:gQu=,c...........vW,UXu9LMA~~~A:L%uUWv............vW=wuQg:A~FF6ML%*=c.......",
+"..v/UX%lOh:n}ADDVAV3oSo}:OiQu=/..vWXu%LM:n1AAkoDoooSoA:MgL%XU/....Wwu9LM:n1ADAoAVo3SoD:hNl%XU/....c,Uu%LNM:nDAD3A3o3S3k}hgl%u=c...,*ulgM:n}DkVDkk33S3}:OlluX,c....cW=u%LM:nEDkAVAVVoSoAEhgL%XUc..W*%lNMnn1AAo3SSS3DBnnnEEDoo}IX../uQLEDFFkEMLl%%uRQl0gOhNL$%uWv...,Xz|N}3SSk61nn:nnn1}kSSFD:LRU../UuRl_}3SSk61Ennnnnn6kFS3DxL%W..vUXrlYDVSFkB1nnnnnnnAkFFVDx$*v.vW%lI}oSS3A}nnnnnn11koSSkEN9uW.........cWX*u9NEVS3Dxl%uU,v............v/W=XrlN}kF3Axl%*UWv............v/=w*ulg}oS3D_l%w=/v............vcUUuu|N}VS3}_$uwWc.......",
+".../w*R0_5';m&888P88PP&jpYI|zX/...WX%fIxx;;C&88888PP&jpYI0f*U/...v,Xz|I!!;m&q88P88PP8jpYI|RwU/....v,UufI_5';Kq88888PPP&;YIIRz=c...Ww%0_x';m&&888&PPP8jp_I|rXUc....cUXr|Ixp';j&88888PPPjpY_lf*Wc../ufI_x''mC&PPPPP8jm'5'emjq&;Iwvv/*fIpjqq&;pII0|R||0II_YII|RuU...v,uR0Yj&PP&Ke}e5''eemj8P8jpIr,../Uuf0pK&P8&KTeme'ee'mjqP8jp0%Wv.c=uf0pj8Pq&mee}''e'eK&88&Kpf*v.vWz|Y;&PPqjT'}'''eeeC&P8j;I|z,.........cWUwzRY;j8qjp0ruU,c.............cW=Xu|I;&8&jp0RuU,c.............c,U*z|Y;&8&KYfr*=,c.............c==*r|Y;&8&K_|%*=Wv......",
+"..v,XR|_'em)C&q&8&8&88&j'!_0rX/...,*fI!'mm)C&88&8&888&;5xIQrwW...c=r|g!eTm)&q&8&8qq8&j;!_NRzw/..../UzR0_'mm7C&q&8&qqq8&K'!O|rX/..vUz|_!eTm7&q&qqqqq8&j'!_0%zU/...v/UufI!5TmC&q8&q&&88qCe5YN|rwc.vUfLxETT7mCq8PPPPqC7T7TT7&8&KY*v./u|I'Kq8&)e'!xh____x!!'!!_I|=v..cXzfIpj8PPqC7eT7TTTe7C&8qj;I|Uv./XzRIpj8PPqC7)777eTT7CqqqjpIf,.vWXzfIpj8P8>)7TeTeTTT)&88qK!I*c.v=R0pj&PPqC7TTeTeTe7)>q8&;Y0%W.........c,wzR0YK&88j;I|r*UWc............/,X*R|_;q88CpIRr*U/c............cUwzf0pK&8qjpI|rXU/v...........v/UXu|IpKq8qjpIfrX,c......",
+"../wQ#@+[22GZ]]]]]]]]Z]2a<+d#%U..vwi@{[ZGZ]]]2]]]Z]ZZHb-+s49uXc..Wui@+-]]]ZZ]]]ZZZZ]]2y[+sJQu,...v,u$4{<22ZGZ2Z]ZZZZ]ZZHb<{@iuW..cui@+[Z]]G2Z]]Z2ZZ]22y[+s#9uW...vUui4{aZZZZ]]ZZ]]ZZ]]2b[+s4$u,.c*@+abbyby2Z]((t((GHybybHHZ2-:%vvWri@+a2]Z]Z2HabbababH2H2[a{4%v..Wu$Jn^Ztt((2HybybyyyH22]]H<{J*v.,ul4n+tt(t(ZHH2Hyyyyy2Z]ZH-s#XvvU%l4B-tt(((2byyyyyyyH2]ZZH+sQc.cuL@^2t(((ZHbyyyyHbH22ZZHa{@lw.......vWU*u$#d+2G((ZaB@i9u*U/..........v,*%$#@^[(((ZaBJi9uXUc.........vc,u%$Js+2(((Z<s4i%uXWv.........v/Uu%$Js+2(((2+s4i%uXWv....",
+"..WuQ4s-2GGGZyaaa-aayybyb[+di%Uv.v*id^aGt(2Hb[<<[baybyab+{4i%X/../%#@+H2GGZHy[a<<[yHybaa+sJ$uUv...U%i4B[ZGGGZyb[a-aayyyya-{@i%U..v*#s+HGGGZyba[-aayyyyaa+d#QuUv...U%i@+[ZG(G2baa-[bbbyyya-{4iuW.cu4+byyyyby[aG((((Zbyyyyyyya<duc.,u$Os-byHZZG2yyyyyyHZZ]G2a+duc../u$Jd+2((((Zyyyyyyybbyybya+s#Xvv/u$4s+2(((G2yybyyyyyyyyby[+sLwvv,%i4s<Zt((G2yybyyyybyyyyyb+d9/.v*#dBZt((GZyyyyyyyybyyyya-{@iXv....../,Xu%iJd^[G((Za{@#$%*XU/........c,wu9i4@^aG(GZa{4#Q%uUWv.......vWUXu%i4s^[G(tZ-{4#9uwUc........cWUwu%i4s+2Gtt2<@4i9u*U,c...",
+"..cwu$N:D~~~^Ed:@:@n1BB1d@4gQuW..vU%Lh6~SSkBn@:@:d1BBBsn44L%uUc..cX%LhD~S~k11:@:::B^BBdd@N$uXW..../X%lhEkSS~61::@:dn1B1sn@Nl%XW..v=Qg:D~S~^1n@:@:@1BB1d@4#QuU/...vW*%lh}k~~~6n:@:@n11BBsdMJ$%w/.vXiMs1BBB1snnAFSFSk^BBBBBBB1:i=v.c,w%l4:11Dk~^^^+^{B^^k~^6n4iXv..vUuQL:AFSFS^^B{BBB{BBBBBB1:gQU..cUu9gxAFSF~^^{BBBB1BBBBBBnM#QW.vcUuQg!kSFS~^BB{BB{BBBBBB1n4luv.vU%LM}SFSS~^BB{BBB{BBBBB1:Ji%U......v/UU*u%9Lh6V~~kEMLQuuXUWc.......vc,Xu%QiN:DVS~knOiQu*XU/v.......cWUXuu%9g:Ao~~DnNlQu*X=Wv.......c/,wuu%$N:A~~~A:gl%uuX,Wc...",
+"..cU*fLxDFF3D:MMOMhMEB1n::NLQu,...,%lNEVSFk}:hOhM::E1EnMMg$%*Uc..cURlN}VSFDE:MMOM:E}6EnMhN$%X/....WXuQNEk~FVA:MMMOM:E1En:MOL%*/..v=rlM}VF3DEMhMOhhn11E:hMLQuX/..../XulNEkF3V}:hOhMhnE1En:hgl%w/..U%O:n111EnxED3SS3k611nnnnE:M$=..v,UwzQLgMn}Ak^kkA61E11}E:gl*U...vWXR|O}oSSVk6111nnnn1E11E:NL%U..vUXRlM}oSFk66111nnnnnEBEE:Olu,..cU*RlY}3SFk^6Bnn1nnnE1E1E:OlXv..Wu$IE3SSV^61E1nnnnnE1EE:MLRuW......vW=*u%QLgM}oSFDEOLl%u*=Uc.......cW=w*r$LLY}oS3A:OL$%u*=Uc.......cWUwu%$lNM}3S3DxNLQ%u*U,c......vc,=*%%lLgx}oSoDxgL$%uwwUc...",
+"..cU*f0pK&q&j;!x!!!'KKKe5!x_|z,..vWz|Y;&qq&;p!!pp;;jjK;'!_I%zU/../wR|Y;&8q&;'!!!!pmKjK'x!_0f*,..../XrRIpj88&K'!!!!p;Kjj;'!xI|uW..v=R0p;q8&j;x!!!!pjjjm'!!_0RXW..../Xz|Y;&q8&;p!!!!';jCK;5!xIf*/vv=f_5;mKKKm;KjPPP8&jmm'''mm;p|=...cU=wzR|IYx;m&q>Cme'''!xI|f*,...cUXzfI;jj&jCKme5''e'emKjK;_0z,..v,Xr|I;j&jCCKme5e'''eKjKK;_0r,..vWXzfI;j&&CjjK;5'emKKCjCKpYf*v..WwfIpj&&&jC7m5e''e'mjjj;pIRzW.....v/Uw%|IIIYpj&PP&;p__I$RzUW......vWUX%f|IYYpj&PP&;p_I0|Rr=/......vW=uR|II_Y;j&P8j;!YII|fuXc......v,U*%|IIYY;j8P&&;Y_Il|%*=/...",
+".v/XrfNp)q8q>mTTTTm)Cq>C7Te!IRUv..=RI_m&88qC7TT7))&88C7Te5_0rwWv.cwfIpK>8q>)TTTTTmC8q&)Te5_|*Uv...,XR0Y;&qqq)mTTTT77q8q7mT5!0r,..vXfIpjq8q>7TeTTT)C8q&7ee5I|z,v..v,zf0Ym&q8q)7TTTemCq8&)TT'_0z,..X0x57)>>q&qq8PPP8q>>)7T7)CC;I=v..v/UX*zfL_5T)>qq>)Te'5!!N|RXW...c,wzfI!m)7C>>C77TTTT7)qqqjpIRW..vW=zfI'T))C>>C77TeTT)Cq8&jpI%,..c,=rfIpmm7C>q>)7e77>>qq8&K!0*v.v,*z0Y;))7>>C)7T7eTmCq88&;I|u,.....c,wrl_x5'emC8PP8CTe55!O|r,v...../UXf0O!55Tm&8PPqKT'55xI|z,v.....c,*r0_!5'em&8PPq)Te5!hI|z,v.....WUrRIh!5'em&8P8&)Te5!xI|*W...",
+"..,u9Js-Z(((2HyyHHHZ((G2Hyy-sJXv.vXLd+[]((ZZHHy22Z]((]HHy[{@i*U..,%#d+[((GZZHyyH2Z]((]Zyy[{@9Xc...,z$@{[]((G]yyby22](((2yya<diX..cuJs+2G((2HyyH2H2Z((GZyaa{J9Xv..vU%l@{a(((GZHyHH2Z](((ZHba+@9=vcu4+a2]G(G(G((((((((Z2yHy2]]-_*..../Xu%Qi@{<bZG((Z2ybya-{d#$u,...c=u%Ld+ayHGG(Z2bybyHHZ(((]^@iU..cUuQgd+ayH2ZGZyyyyyyZ](((]6dLXvv/XurlM{[yH2ZGZHyH2Z](((((~+_uv..Url4{-y2Z]GG2yyyyHH](((t~s#r=....v,u9#d+aybyHZ((((2Hyyaa+@i%/....v=uQJs+ayay2]((((2Hyyaa+@iu/....v=u$Js-abyb2]((((2yyyba+@i*/....vUu9Js-abybH](((GHyyyaa{@$wv..",
+"..Ww9#dBa2ZZHyyyybHH222Hbya<sLXv.vXi4BaaH2Hyyyybyb2222ybba{4$%Wv.cwi4B<b2ZZbyyyybHH222yyy<{49wv..vWu9Jn<a2ZHybyyybH22Z2ybba+@i=v.vul@+-2Z2HyybybHH2Z22yyb-sJ9wc...Wu$4B-H2Z2bybybHbH222yyya{@9UvvwJ{<bH22Z2Z2Z]Z]ZZ2HHbyyy2[{#=v...v/Uw%iJs+[HyZ22yyb<+s@J9%wW...vW=%i4s<aaaH2Hyyyybyy2ZHZa{4%W.../=ui4{<aabHHHybyyyyHH22[-{4%,..c,X%9Jd+<ayHHHyyyyH22ZZ22-{#uv.v,uQid+-abH2ZHybyyyyHZ2Z[^@i%Uv....UuQis+<abybHZ]Z2yyabb[+si%U....v=u9Js+<byybHZGZ2ybybb-+@i%U....c=u$Js+-bayy2ZGZ2ybybb[+@i%W....v,%$4s+<bbyy2ZGZHbyybb[+4iXv..",
+"..vWXu9NMnnn1B1B1BBB11BB1sn4i%U..vWw%iO::11BBBBBBBB1111sn@gQuXcv.vWw%LM:n111n1BBB11E111sn4#9uW....vUXu$N:nn1BB1BB111111B1s@JluW...UuQLh:E11B1BBBB11E1111d@l9uW..../=*u$O::1B1BBBBB1n1111sndJ$uc..W%iN:11B1111En::nn1BB11n:hOlwc......vWUw%iJh1B^^BB1@4#$%u=,cv....v/Uw%$LJhhn11BB1BBB1n:x_N0%=v...vWU*%$iJhdnB1BBBBBsnn:!hI9%=v..v/,=*u9i#O:nn111BB111nxM_gl*U....WX%QiJ4M:n11BBBB11nxxh_LQuUc.....cUu%iJ4dns111111B1ssd@4l%Uc.....WX*%i44dns11111BB1{sd@JiuUc.....,XuQ#44ndB1B1111B1sdd@Jiw=v....v/XuQ#4@ns1B1111B1sss@@J9uU...",
+"...cWUurLNM:Mn::n::nnn::n:ML9*/...cU*rlghM::h:n:n::M:::nMO$uw,c...vUuRlgOh:::::n:n::M:::MgQuXWv...v/Uwz$LOM:::nn:nn::::::hOl%X/.../UufLNhM::n:n:n::::::MMLQuUWv...vU=*rlghh:::::n:n:MM:::Mg$zU/..W*%lLM::nEn:MOgOOhn::n:hOLQzU........c,wu%LN:16A1n:hL9uXUWv........c,Xuu%9LOMh::n::::OOLllRu,v....v/UUu%%$gh:n:::n:n:MNllQuwc.....v/UXXu%$LOh:n:::nnxOgl$%zw/..../UUuu%QLOM::::@:n:MOLlQRuU,v.....c,Xu9lgMM:nnnnnn:n:hhNlQu=c.....cWX%9lgMMnnnnnn:n::MMgl%u,v.....c=X%$LOhM:nnnnnn:n:MMgl%uW......c,X%9LLO::nnEnnnn::hhNL9w/v..",
+"...vW=u%|I__Y!!!5!!!!!xxYx_|%XW....W=zf0I_x!!!!!!!xYYYxx_I9uXWv..../XzfIIYx!!!!!!xYY_YYY_IR*Uc.....v,=*ffIYYx!!!!!!YYY_Yx_IfzUc...c,wr|I__xx!!!!!xY___x__0%*=/....v/U=zf0__Yx!5!!!!xYYYY__I|uU/../wrR0I!xx!!YYI0IIYx!!!xYIfRX,........c,=r|IY;KCCm'YI|%XU/v.........vc,wwzr|I_Y!x!!!!xII|fr*Uc......cW,=*r%0Ix!!!!x!!Y_0|fRX=/......cW=UXzr|I_Y!!5!!xYI0Rfz*U/...../,ww*zf0IYx!!!!!x_I0|Ruw,c......cWXuf0LIx!!!!!!!!x!YOI0R*W......cWUuf|IOY!!!!!!!!xxYOI0R*,......c,wz|00__!!!!!!!!xx__I0%w,......vWwzf0IOYx!!!!!'x!Y_OI0RwW...",
+"...v/UXr|0I__xx!!!xx______I|rX/..../XzR0I__xx!!xxY_I____I0R*U/.....WUrf0I__xx!x!xx__O__Yg0RzXW......cX*R0II__xxxx!xx_I____gfrXc...cUXz|0I__Yx!!!xx______I|r*U/....vW,=zf|I___x!!!!___O____0frUc..cU*R9I_Y____I000II_____O0fzXWv......vcU*%I!e)>qq7;_NRzw,c...........c/WXwrf0I__xxxxY_I0|%r*Uc......vc,Uw*r|I__xxxx_Y_I0|%z*Uc.......c/,=wr|0__xxx__Y_I|Rr*UWv.....v/,X*rR0I__x!!x__I0|fzwUWv......vW=zf|0I_x!5!!5!!x__II|R*Wv.....c,wzf|0I_x!5!5!5xx_YNI0f*,v.....vWUuff0I_x!5!55!!x__II0fw/......v,Xzf|0IYx5!5!5!5xxIII|RX/...",
+"....c=u%i#J4Jdss{ss@d444444i9*W...v/X%$##J@ds{sssdd@J4444i9zXW.....,X%$##4@sssssssd4@@@44#9%w,.....v/Xu9iJ44dsssssd@@@J444#i%Xc...c,u%$#JJ@4dsdss@d4@4@44i9u=c...../,=u9i##@@dssssdd444444#9%XW../Xu%$#44@4444LL##J@4@44JLQ%w/.......v,X%#s-b2]Z]Z[{@i%u,v...........v/W=*u$iJ44dd4@44#li%zw,c......vcW,wu%$#4@ssd@@44JLiQz=,c.......vc,wu%$iJJ@@@4@44#iQ%uXW.......c,=u%Qi##4@4@@J4J#i9%uU/.......v/=u9ii#4@dsss{ss@@@JJiQuW......v,w%$i#JJdssdssss@@44#i$*U......vUX%$i##4@ssssssss@@JJi9u,.......W*%$iJJ4ds{sdsssd@4JJi9uW...",
+"....v/Uu%Q9iiiL44#####iii99%wUc..../,X%%$$iJ4J4JJ#i#ii9$Q9u*=/.....c=uu%9ii######J#i#ii$$%%uX/....../,wu%Q$i##J#L####ii9$$%%wWv....cWX%%Q$$i###J#J#i#ii$99u=Wv......v,*uQ$$9ii##J#J#iLii$9Quw,v...WXu%Q9li$i9$9$Q99$$$$9$%uwUc.......vWXui4{-b[H2<{@J$%X,v.............vc,*%Q9iii##ii9$%uu*W/.........vc,X%%Qii###iii$$%%uwWv..........c,=u%Q$iiiiiii99%u*=Wv.........c,Xu%Qi9iiiiii$%%uwU/v......../,Xuu9Qli##LJ#J#ii$iQ9uXW......vc,=*%QQii##J#J###ii$9Quw/v......v,=u%Q$i#####4##i#i$Q%uwWv......c,=%%Q$l####Li##ii$QQ%%=/...",
+"......vc,XXwu**uuuuu*uwXX=U/c.......vcWWXXwwuuuuuu**XwwXXUU/vv......v/W,=X*uuuuuuuuXwXwXXUW/c........cc,,=XX*u*uuuuwuXwwXX,Wc.......vcWXXX*Xwuuuu*uw*XXXUUUcv........./WUXXXw**w**uuuXXXXXUWc......c,,XwX*X*XXXXXwXwX*wXwUWc..........vWUw%$LOOgOIl%uX,/c.................cU=Xwww*wX*Xw=W/c.............vcW=XXuuuuwXwXX=Wcvv............ccc/UXXX*XwXX=UW//v............vc,UXwXXXXwXXw=WWcv...........vcWUUwXwuuuuu*u*uXXUXUv.........vcWUXwXwuwuu****XXXU=Wc.........vvWUXXX**uuuuuuww*XU=//v........vvW=wXwuuuuuwuuwXXX=,Wcv...",
+".........v///W//W/W/W///W/v............cv//W///WWWWW/WWW//v...........vvc/WWU,WWW/,,W////cv...........v.vc////W///W//,W//cv...........vv/,WWW//W/W/WWWW/W/v............c//,,=,W,,WW,WUWW/cv..........//c//W/WW/WW/W/W/////v.............c,=Xuuz%*u=UWW/v..................vvc/cWW/WWW/ccv.................vcc/c/W/,W//cv...................vvc///,WWWcvvv.................c//W,W,W/Wccv................vcW/WW/WWWW,,WWWWWccv............vc//W/W//,WWW,W/cv.............v////WWU,W,////c//.............vvvc//WW,W//,,W,W//v......",
+"................v.v.vv..........................v..v.....................vv.v..vvvv.v.......................v.v...vv..v.v.................vv.v.v.vv.......................vvccvvccccvcvv..............v..vv.......v......v...............vvcWWW,W/vvv........................v..v.v..v.......................v..v.vv.v............................v...........................v.vv.v......................vvvvv.v.vvcc....................v..vvv..v......................vvvv.vvvccvvv.........................vv.vv............",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+".........v..vvv.v............................................................................................................................v.v..................................v.............................................................................................................................................................................................................................................................................................................................................",
+".....vc/,W,,UUU,WU,U,U,,,,/cv................vccccccccv........................................................vcc/ccvv....................cWW,W,,,Wc......................vcc//WW//vvvvv......................................................................................................................................................v//WWW/cv..................cc//W/cv..............................................................................................................................................",
+"....vc//UUUUXX*XXXUXwXUUWWWcv..............vcc///////W/cv................vv/ccvv..............................vc//W//ccc..................c/,UUXUUU,/v....................vc//W////////cv................................................................................................................vcccccc..............................vcc/////ccv................v//W/WW/ccv...............................................................vccvv...........cW,,,,,,//v..................................................",
+"...v/W,==w**uu%uuuuuuuuX==,,c.............v//,,,,U,U,W,W/c..............c/,/WW,/cv............................vc/W,,WW,c/................c/,U=ww*wXU,/v.................../W,=,=U=,,,,WW/c...............................................................................................................c/WW,,W/............................vcW,,U,=U,/v................c/WWU,U,,/Wc...........................................................vcWWW/,/c.........cUUXwuuuXwUWc.................................................",
+"...c,=U*zr%RR|||fffRfRR%*XUU/............v/,,UXXwwwwXUUUW/v...........v/W,===U=U//v.........................vccW,UUXwU=W/v..............v/,=Xzzrrruw=U/v................v/,=UXXw**XXUXU=,Wv............................................................................................................vcW,UXUX=U/v........................../W=U=wXwwU,/v.............vc/U=wwwwXwUWcv........................................................vc,UX=wU=U/v......./WUXz%|RRrzw=Uc................................................",
+"..v,XzR|0OI___x_O_N____I0|Rz=c..........c/UwzRR||RfrRRr*wUUc..........cWXwzRRfz*wU,c........................vW=X*uf||RzXUWc.............W=*rf$I_OI0RR*w,c.............../UwzR9|0|||RRRzz*UUc..........................................................................................................v/U=urR%Rz*XUWv.......................cUwzRrRRfRzwU/.............c,X*rr|||RrzwUc.......................................................c/UX*R|||r*wWv.....vWXuf0IY__g|RRXU/...............................................",
+"../*QJ@{-a2a2a2aaaa[ab[[+sd#%=v.......cWXu%9J@ss{ssdss@#$%uXW.......vWXuQi4sss4#$%uwWv.....................c=u%Qi4{+<s49u*Uc..........vWw%iJs+<aH<+s4i%*U/............vW=u9#@s+++{{d@@44J$uXWv.............v....vc//W/cv......................vc///cv................................................v,w%Q#4sss4i$%w=Wc...................c,w%iJ4@sssd#QuXWv.........vW=u9i4@{++{@iQ%XW....................vvv..vccccccv.................../,wu%$#@+<+d#QuU/v.../*9#@+[2aaa+s4iuXWv......................v/WWW/W/c///W/ccv......",
+".v,%i@{a2GGG(GG2yyyy22Gyb<{@iuW......c,XuuQJ@+[[<-<+++{@i9%u,/......cUu9i4s+[-s4i$%u=Wv...................c,w%$i41<Z2<@i%uXW........../=uQ#@+a2GGGa+@JQuXU/.........../=uQi4{+[aba-{{sss@J9*,c........cW,,,W,,,,,UU=UUU,/...................c,,UU=UU,c............................vccv.............../=uQi4{<[+s4iQ%uXU/................v/,=uQJ@{+<[-+@i%*Uc........vWXu%i4s+aab-{4$%u=,..............v/,,,,U,,,,X====U,cv................/UXu%9#@Ba2a+4$%uU/...cw9JB~t((Zya+@#QuX,c..................c/W,,===wUX=U=wUU=U,/v....",
+"../*%LM1^~S~SSS~^B^^~~~^1@4l%w/......cWXXu%$J@dsdd@dn@4#Qu*=Wv......c/UuQi4@sd@l$%uwU/v..................vWUXu9$LM}kkEN9uUWc.........cWUwu$Nh6~~~~6:J$%XU/c.........../Uwu$#4dsBss@@M4#Jl$u=Wv.......vcWUUUUUUUUUwU==UU,,v................vc/UUwUwUUU/v........................vccc//cvv............vWU*%$i4dsn4l$%uwUUc...............vccUUwu$J4@dss@J9uX,c.......v/WUXu%i4@sB{14LQuwUWv............vcWUUUUUUU=UUUUXUU,/cv.............vc/==Xu%QN:DkA:l%wXUc...vU%$MA~S~~^B@#QuXUW/v.................ccW,UUUU==U=UU=wUUUU/c....",
+"..WX%lO:DkSSSSVk61B6^~kAnhOl%wW.....v/==uu%LN:n::n:nn:OLQuXU/v......vW=*z$gM::ONL9u*wU/..................cWUw%QLLhEAAEL%*=Wv.........c,UX%9LMEk33k}:g$%*=,c..........cW=*%9LM:nn1n:MhNOLL%uU/v......vW,U=ww***wwXX**Xw=U,Wc...............cW==w*uuuw==Wv.....................v/WWWWWWWW/cv........../,=*uQlO::MNLl9uX=UW/v............cWW,=wu%lLhM::::L%u=,c.......c/,w*uQLOMnn1nMg9%*==/v.........v/,U==ww***wXww****wU,,cv..........vcWW,UXuurlgxAk}xl%uwU/....Wu$I}3FVk6n:L9uw=,W/v...............c,,,=w*u**X*X*w*X*wwUU/v...",
+"../XR|YpmjC&&q&CCjKCCCm;!Yg|zX/....v/,X*%|0OY5E;;;;;5'_I|uwUc.......c/,wufI_!!_Y_I|%ww,c................c,=Xuf0__!;K;p0fu=,v........v/=wzfIIp;Kj&K;p_I|zwU/........../UXuf0__!}'e};ppY_I0R*U/......vc,=X*rR%fRrrzrRfRRz*XUcv.............vWUXzRf||RrXU,c...................c/WW,,,UUUUUU,,W/c......v/U=urf0I!!!x_II|%*wX,/c.........ccW==UX*r|IY!E!!x_IRuXUWv.....c,=X*zf0__x5'5'!_I|%Xw,/v........c,=Xzzrr%RRRzzrR|||fzU=,c.......v//WW===w*%|IIYp;K;Y0RrwU/....W*fIpj&jKe'!I|RzX=U//v............vcW=UXXRf||frrrrffRrrr*X,c...",
+"..W*RIx'e77))CC&qqq>&)7e5xI|RXW....cUXufI_!5eTT7CC>)mT5_lr*U/.......vWU*r|I_n5ee55_0RzX,/v............./WU*z|Ix5''e;'Y0RzX,/........c,Xz%0x5'Temmmee5xL|rXWv........v/XzR0_5TTT7T7)7);xOIfz=/......v,wuf|LIx__L000g_hI0|R*=/v...........cUU*f0g_xxx0f*U/v................v,U=Xwuzzuzzzzzz*XX,v...../U=ur|0g_:55'e5!_0frzwXUWv.....cWUUw*zr%|0Ox5eTe5!_N0Rzw,/....v,Xz%|0I_51eTeTTe5!_0Rz*UUc......cUX*%Q00O_xOIL00Yp;pY|RzX,v.....v/UXXw*zzzf0_5'eee;'x_0fz*,v..v,*RI!;m77Te5xIlRRz**UUWv........./WUw*rr|Ip;;!I00N_x__#0|fzUv..",
+".vU%Js+bbybyyb2Z(((((2Ha-+s@i%U...c=%9#@+abayyH2ZG(G2ya{@i%uXc.....vW=*%$4s+-aabyb<{4iQu=,c..........v/Uu%iJs+[ybyyb-{@i9uU,c......v,*%i4s<aybba[bbyb<{@#%X,c......v,u%i4s+aybyyH2]GZa+sd#QwW...../,w%i4@{-[a<{{{+-aa-{dJiu,c..........vU*%$4s+[bb[{@$%X,c.............cWXu%%$i#JJJJJJJJJi$Q%=v..v,X%%i#@s{+-aybyya+s@J#iQ%*Wv...v,wuQ$#JJ4ds+[ybyaa<{{@4i9%X/.../uQi4d{+-ayyyyayybb-s@#$%*=c....c=uQi@@{+-<ba+{{{<2]2+1Ji%uW....vUwu9$ii#J4@s<aybyyaa+{@@J#%,...URl4n[aaHyy[<{s44J#iQ%uXW/.....v/=u%$iJ4@+HZ2<+ss+-bb-<+s@#%,..",
+"..UQid+<byyyyyy2]ZtZZ2bya<{@J%Uv..W*Qi@{aayyybb2ZGZHHy[+@#9%w/....../Xu%iJs-byyyyba+s4i%uX,v........./U*uQJ@{<yyyyya<{4#QuwWc....../=uQ#@{<byyybbayya<{@#%uUc....../=uQi4{-byybyH2ZZ2[+s4#%*W.....W=u$J@s+<bab<<-<bba<{s4i%X/........../U*%i4{-yyyy+@i%uUc...........v/,Xu%9#J4dsssss{sss@4#iuW../=uQiJ@{++-<<abbbba-{s@JJ$%*/.../wu9iJ@ss{{++<ababb--+{@Ji%u,..vX%i4s{+<abaabaybayya+s4J$uXW..../X%i4s++-bbab<{{{-[22a{@Ji%=c.../w%$i4@@@sss{<abbbab[-+{ss4i*v.vUuQ#d+aybyyy-<+{ss@4Ji9%uUW.....Wu%i#@@{+<[22[{{{+ayab[a+{@iX..",
+"../*%iJ@nBBBB11EE1}6k~~61shJl%W...WX%$J4sB{B1s1B6B^^BBn4iQuw=c......cUX*%$JMsB{B{Bsn@g$u*UWc........v/UXu%i4@1sB{BBs:Mi%uX=Wc......cUXuQiJ@nB{BB{B{BshJiQuU,c......cUwu%9#@1B{BB^B^6BnNL9%w=c.....cWUu9i#4@ssBssss{sd4Jl$u*Uc..........cW=uQih1^~~^1NQuXWc...........vWUXu%$##M@@:@:@:@:@M4li%W../UuQiN4:@n@@4@@@@@d@d:4O#$uX/...cXu%i#N@:@M4444@@dnsn@:4g$%XW...=%ig4nss1sd@d@@dssBsn@Ni9*U/...vWX%$#hdssss@44NOO:E16ndMJ$u=v...c=u$iJO@M@:4M@@@@:dds1sn@MJ$Xv../w*%i4@nBB{Bs1@nddMJL$9%*U/....vWwu$l4h:n11}E:NJ4@@sBsssn4#$w..",
+"..cUu%lN:n1nnn:::hxEDVVAEn:Olu,.../X%lNM:n1n::hnE1Ennn:OL%uXU/.....vcUwu%$Nh:n1111::MN$%uwU/v......v/,=wu9LM:n1111nn:O$9uwUWc.....v/U*uQlLM:nn1nn1nn:MLQ%*wU/v.....c,UXu9LN:nB11111EnMN$9uXU/v....c,w*%$LNMnnnnn11n1:NL9%u=,/..........c,Xu%LOn6VFDEL%X=,c..........v/,=wu%LN::nnnnn:nnnn:MOL%U../Uu9LhMnnn:MggLLgN::nn:MO$%wW.../Uu9lO:hn:hNlgLNgOhnnn:hN$%X/..vW%LOO:nn::hOOgONhn1n::hgQuXWv.../Xulgh:nnn:MNLNLNO:nnn:MOl%XW...c=%llM::nn:MhNgggOh::nn:nMglwv.v/UXz$LMhn1}B1nnnnnhMLL$%uw,v....,X%lNhnnnnnn:hLLLN::nn1:::OlXv.",
+"..cUuR0_x'e''!!YYx!pj&qjm'!_0z,..vWXr0Ox''e'5xx!'''''5x_0RuXU/.....v/U*%f0_x5''eee''x_IRR*XU/......v,U*r%|O!!''eee''xYI|Rrw=,v....c,wuR|II_'5'ee'e''!YI|Rzw=Wv....v/Uwu%|I_5'eeeeee'!YI0|%X=Wv....cWXzf0IO!55'e}5e}5!_I|%zwU/.........vWUXr|IY;jq8&;If*UU/v........./,Uurf|I_55'}''e''5'''5YI|Uv.WUz|IY!E5'x_III0INx!'55xxIfu/...WX%|I_!'55!_II00IOx5''5!_If*W..vUR0_!E5'5x_gOIN_Y5''5!!_|rX,v.../*r|I!!5''x_IIIIIYx''''x_0RX/...vUr0_Y5'''!x_OIIgIM!!'}''!_|wv..cUwu|I_xxemm''''5'5xIII|%wUc....,wR0_x!5e'''xYI0I_x5''e''x_0wv.",
+"..cUzf0x5TTee''''''m&qqCmTe!I|=v.vUufIx5eTTTe''eTTTeTe'x_0fR*,v....c=rR0N_!5eTTTTTTT'5_O0fRw=/....v,XrR0g_!eTTTTTTeTT5x_L|%zU/....cU*R0N_:'eTTTTTT7TT5x_N|Rz=W....c,wr|g_x5eTTTTTTTTT5x_I0Rz=/..../wuR0Nx!'eTTTTTTTTe5x_I|zX,v.......v/UwzRl_'mCqq&;_0%zw=,c.......cWXzf0N_:'eTTTTTTTTT7TTe5_0=../*R0M5eT7Te5xNIgI_5'eTee5xIr=v.v/*rL_5eTTT'!xNIgI_5eTTee5xIrU...X|N5'TTTe'!____M5eTTeT5!_9zXW...,ufNx5TTTT'!h_OI_x'TTTee5_0r,...cX|IxEeTTTee5x_I_x55eTmTT'!gzv../=*rl_!'Tm7m7TTTTTT55!x_0|zXc..vUz|_x'T7mTee5x_N_x5eT7TeT'xIzc.",
+"..WX%#@{ayyyHH2222Z]((((ZZ2[{#*cv/*9J{+aH22ZZ2HHbyyHH2Ha[+s4i*/...cUu#d+-abH22HyyHH22Hb-+s4i%=v...,u%#d+-aaH22HbyHH22ba[+sJ$%=v..c=%94s-aayH22HbyyHHHyba+sJ9%Uv../X%i4s<aab22HyyHb22Hyaa-s4iu,.../=%i@{<abH22HyyyHH2Hyaa+s#Qu/......cUw%9#Jd{-[HZ22-BdJiQ%*X/v....c=u%#@+-baH2Hyyby22ZHbyyy<{4*vvU%#@+[a222Ha++sss+<yyyyyy<{JuW.vU%#@+aH222ya-{sss+-ayyyyb<sLuv.cu4{[aZZZHaa++{{+-yyybyba{@$%,..v=QJs+a2222aa+{s{{-[bbyyya-diX.../u#d+aHZ22Hy[<+{{<[byH2ZZa<d9c..W*%#@+-bH2ZHHyyyybyHHH2[+sJ9=..vwQJs+aH2ZHHyb<+{+<ayH2ZZHa-s9,.",
+"../*%i4{<yyb2ZGGGGt(t((((G22+4uc.W*QJs-b2GGGGGZ2yyyy2GZyya-s#QU..cUu$J{<yyy2G2byyb22Z2byb<sJQuW../=%$4{[yy22Z2yyyy2GZ2yya+@i%wW..cX%#@+ayy22G2yyybHGZHybb+@i%Xv../w%#@<ayyZ2GZHbyy2G2yyya<@#%=c..Wu%Js-byb22GZbyyb2G2yyaa{4iuU....c,=X%QiJ@s{+<[baa+{d4i$Q%*=c....Ww%$J{<yy2ZZZHyyyyGGZybyb-{#ucvU%i@+a2ZGZHb<{sss+<abyyyb[{JQW.vUQ#s+a2ZGG2b<+sd@{<yyybyb<{Juv.cuJ{<H2GG2y<-{s{{<ayyyyy[+4i%Uv.vw%Js<bZGGGHa<{ss{+ayyyybb<sLwv..cuL@+aH222byy<+{+<ayy2Z]2a+@%c..,*%i@{<aHGGGHyyyabbHZ]tZa+s#Xv.v=Q#@+[H222yyy<+{+<byHZZ22b+4%c.",
+"../UXu$#@1BB~~SSSStSFtSSSS~6:lwv.cU*%#M1k~SS~S~~^BB^~~~^B1@Jlu,..cUw%i@1B^^~~~^BBB^~~~^{B@O$uX/..cU*%i@1B^^~~~^BB^^~~~+BB@g%uUc../Xu9#dB{^^~~~^B^^^~~~^{1@#QuW.../Xu9J@1B^^~~~BBB^^~~^^{1@#QuW...cXuQ#@BB^~~~~^BB^~~~~+B{@l%w,..../W=Xu%$il#Jh4:@:@M4LLi9%uw=/....cU*%ihsB^^~~~^BB^^~~~^BBsM#%,v./w%ih1^~~~^1:4LLLJd1{B{BBdJ9*/.v/X%LM1^~~~^1:4g#L4:sB{B{Bd#%U..vwlO:6~~~~Bn@g#JJ:sBB{BBsMi%X/...,uQL:BkSS~61@M#i#4@1B{B{1@L%U....,u9LM1666BBBd@M4@n1B6661:N9=...c=X%i4:16~~k1:d:d:n166^61n49X.../Xu$NM166^BBsn4h@:nB66661:N%=..",
+"..c,wu9LM:n1AoSFSFSSSSSFSFVAMlXc.c,*%lOED~SSS~~AB111k~k61n:O9uW..vU*z$MnB1^~Vk61n1Dkkk611:OQuUc..cUX%lhnB1^k~A1nn16~^k6Bn:N%u=c..cUu%LMn1B^~kk1nn1^V~A611hL%w,v..v=*%Lh116k~VA1nnE^Vk^61n:L%w,v..cXu9Nhn1B^^~A1n1B^~k6}BnMl%wW....c=XwuQlLLgOOOO_OOgg#LlL9%uXW....WXu%$Mn11kkV^61E1k~Fk611:O9uW../wuQgh}o~VA:NLLlllOnn111n:g%Xc..WX%$O:A3~kA:MLl$lLMnnB1BnML%Uv.vU%LM}k~~DEMgLlllO:n1nB1nOQu=/...,Xr$OEk~FVA:ML$llLhn11B1nMl%W...vWX*%LM:1E11n:NNNOn11nEEhOluW...cWXu9lOM}kkAnhggggN:E1E1n:M$=v..c,wu9NMnn1n1n:hgMMn111EnhN$uc..",
+"..cU*r|Ip;mK)&q&&&&&&&88P8&Kp|Xc.vWXz|IpKC>&>&Cm;5'5KKKm''!_0z,..vUuR0Y;mKj&CK;!!';j&jKmm5_|rw/..c=*R0!;mmKCjm'x!'mKCKKmm!_Rzwcv./XR|Ip;jKKCmm''!pmj&jKmmxI|uU...c=zRI!emKj&CK'x!'KKCKKm;!IfuW.../wr0_pmKK)Cmm5!!;KCC7Km;!IR*,...vcUzrRIYYppppppppppppYp__IR*,..../Xr|I!;mKC&&Km5'ejC&CCmm5Y|*W..cwzfI_;CCCmp_I0|0L_!''ee5xI%Xc../=zRIpmCCC;!YIl00I_!''ee5xIzU..vUR0Y;j&CK'YIIf|0Ox''ee5!_|zX/...Wwr|IpmC&C;p_I0|0I_5'eee'_lz,....c,XuRI_!''e;'!YY!;;e'!xI0R*W...c,Xz|IY!;Kj;!IILII_Y'''''xY0X....cW=r|I_x!;e;xx__!;e;'!YI0r=c..",
+"../Ur|I!;C&CCCjjj;;K;Kjq888KpI*v.cWwz|N5m))>))7e'x!'e777TTexIrUvv/wr0_;7C>Cjm;5x!!'m)C>CCmpI|*/../*R0Y;7>>)7m;5!!!5mKC>>CK!If*/..c*RI!mC&>Cmm'xx!x5mKC>CCm!If=c.v/ufI!mCC>CKm'!!!!'m)C>>Cmx0fXv.vWu|I!mC&>)Km'!!!5'mKCC>);Y0R=v...,uQIY;jjjCj&&&&&&Cjjjjjj;YfXv..v,*R0_;C&>CKKmTTT7)>>>>&Cm'IfW../UrRI!e)))T'!_gI0I_5eTTTT5_|z/../Xr$I!e)7)e'x_I0IIM5eTTTe5OfUv..UR0_'7))7e5_NIII_!eTTTTex0RwW...WXrfOxm))7e5x_I0INx5eTTTT5IfU....v/=wRlI_5m)7m}'5;KCK'xI0RrX/...cUwr|Ox5m))m'x____x5'TTTee!0wv....cU*f|I_5m7)m'''e))m'xI0Rz,...",
+"..,u$4s-2Z((Z2ya-^+^-a2Z(((Z-sQ/v/UuQJd+aHH2HHb[<+++abybyyy<sLwv.UQJ@+H](G]H-++{{{+<a2]((Z[{4i=v.W%Js+2]((ZH[++{{{+[HZ((G]a{4$=vvUQJs+HZ(ZZa<+{{{++<yZZ((H<{Juc..U94s-2((ZZa<+{{{++ay]G(22-sJuc..U$4{a](((Z[<+{{{{+[HZ((ZH+sJuc..vw9@+<Ztt((t(t(t(t((((tttS+xuc..WuQJs+H]((ZHbyyyby2H]G(((ZaBJu.v,*9id+[HbHya<+ss@s+-byyyy[{4%W.v,w%#@+[2HHy[-{sdss+-ayyyba{J*v.vX$@{[HHHHa<+{dss{-[yyyya+d#%U..v,u9#d+abHby<<{sdss+[aybyy<{Lwv...vcU*%$J@+[Z22HZ22]22<{@#%uUc..v,w%i@{-a2ZG2aa<-<-<a2ZHHa[+4uv.....Ww%i4s+aZ2Z2HZH2Za+s4i%u,...",
+"..Wu$J{<2GG2Zy--++{{++[ZGGG2<d%W.vUu$Js+yybHyyb<++{+-aayyyy<si*vvWQJs^[G(G2a++ssss{+a2G(GGa{@iwvv,Q#s^[G(G2[<{s@ss{+[HG(Gt[{4i=v.UQ4s-2G(GZa+{sss{{+[HGGtZ-{4%c.vUQ4s<2G(]]<+{ss@s{+[HGG]2<s#uv..U9@B-HGGt2a+{s@ss{+-ZGGG2+s#uv..vX$4{-a2Ht]Zt]t(tttZt]]Z]a{Juv../u$Js+HG(GZyybbyyyybyG((G2[{#Xc./X%i4{ayybyb-+ssds{<[yyyya{4%,v./u$l@{aybyaa+{s@ds{<byyyba{Juc.vw$J{<bybyb-+s@d@{+<byyyb+@i%Uv..Wu9Jd+byyyaa-{ss@s+<byyyy-s#u.....vWXu%i4{<y2ZGGGG2H[+@J$uUc....W*9i@{<b2GGGbbabbba2GG(Zb<sJwv.....cU%Q#@{<yy2GGGZ2ya{4i%u=/...",
+"..cX%9NnD~S~61h4ggJNOhnA~S~D:L*c.vW=u%#hsB^BBnd@JJJO4d1BBBBd#QU.v/u9N:A~S~kEhJLLLLNO:6~~SkENluW..cuQ#:DV~~DnM#NLLL#O:6~~~kEOl*W.v,u$N:D~~~AnhOLLL#NO:6~S~Dng%Xv../u$NnA~S~6:MJLLLL#h:AF~~A:N$w..vWuiOnk~S~Axh#LiL#OhnA~S~A:LQXv...Ww%lg_x!hEEEEE'EE5EE!!!!_L%U...cUu9g:A~S~kB1s1{BB11B^~S~^EN$U..cUwu9JnBBBss@h#LigJ@dnBBBsM$uc..cUu%iOnB{B1d@JNLL#J4dnBBBn4lXv../w%N:B{B1sh4Ni#iJ4@1{BB14#QuW.../Uu%iM1BBBsdMJLLL#4h@BBB{@J%,......./UXu%N:1B~~SS~^BnJL%u=v.....cUu%ih:n6V~~^BBBs1B^VS~k1ML%U......vcU*%lg:1^^S~S~B1:gQu*U/v...",
+"../UuRLxAVFV}MNLllllLgM}VFo}hlwv.v/,Xu9N:111n:MgL$lLOM:n1nnhl%Wv.cX%$O}k3VD:gLL$lllNNEkFVDENQuW../Xrlh}VF3D:LLl$lllNOEkF3DxgQuWv.cXQ0MD3Fo}Mgllll$lNM}VFoAxL%wv..W*RLMAVVV}xLLlllllgMDVFV}xl%Uv..WuRNxAVok}hlllQ$$LNhDVFV}ML%=c...cUwzRQ|lgIgggNOONggg0llQ%u=/v..c=uRlN}VFFkEnnn11nn:n}kF3D:LrUv.cWUu%lMn1En:OllllLLM:n11n:N9uW..c,=uQg:n11n:OlllllLMM:11n:N%wv.vWX%lMn11nhMLllllLgMnn1nnMl%XW...c=Xu$O:111:hNllllLLMh:1Enhl%,.......vW=w%$g:EA3SFk}:OL%u=Wv.....cWUuQLN:}k3VkDDA}DADkkk}:glu/.......c,Uw%lOhEkFSFk1hO$%*U,c....",
+"..WUr%0pK&q&KYII0||f0Ip;&PqjY0wc.v/,Xz|I!'e''xYI0||0O_x5'e5xIRU../XR|Y;&q&KpII0f|||IY;&qqjpI|uW..WwR0_;&q&KpI0|||0|IY;&qqjpIR*W../*R0Yj&q&KYI0||||0IY;&q&KpIR=v../*fIpK&q&;pI0||||0IYK&q&KYIRUv../zRIpK&q&;YI||RR|0IpK&q&;p0RU....vWUw**zf||0IIIIIII0|fzz*uXUc...cUwR0Y;&qqj;'''ee'!!pK&qqjpIRUv.v,UuR0x'e'E!x_0l|0OYx5'e5!_fzW..c,UzRI!Ee'5!Yg0|00I_x5'e5!IR=...,X%|_5'eE!_O0|f00IY!''e!_fRX/...v,Xz|I!'''xxII0|f0I_x5'e'!IRU.......c/U*z|IY;j8P8j;_I|zXUc......cU=z|IYx;&q888&8&8&Km;e!_0Rz/......vc,=*r|Ix;j8P8jpY0|z*=Wv....",
+"../Xz|I'jq8qK'x_gIIN__'jq8qjpI*c.vW=z%0xeeTTe5xxOII__55TTTe5_fXvvc*fI!m>qqC;!_IIINIY!m&qqC;Y|zWv./u|Ip)>qqK'x_gINI__!K>qqC;I|zW../zfI!j>q>K'__IIII_Y'7>qqj'I|Xv..,r|IpC8q>K5__IIII_Y'K>qqjpIfwv..,r|I'Cqq>K!YO00LI_Y'Kqq>KxIf=v....cW,X*zrf0I__Y!!Y_I0Rr**XU,c...cUzfIpmqqq>7mem77T'''Kq8qC;Y|U..cWwr|O5TTTe'5x_N___55eTTT5_IRUv.vUwu|O5TTT1e5x_Ig_M5'TTTT5_0wc..W*rNxeeTT'!x_OIN_:5TTTTexI|z,.../Uwr|M5TTTe5!hIOO_x5eTTTT5O|wv.....v/,wuf0N5;j8P8C;x0|rw,/....../=XRl_!'m&888P8888qCTe'!_|RX/......cW=Xz9I_!ejq88j;_IfuwWc.....",
+"..Uul4s<Z((GZa-<{{{{+<b2G((2-dRW.cXu$Jd+byyyyba+{ss{+bayyyy<{4%cv,%#@+2](G2aa<+{{{+-b2G((G-B#$=v.W%Js+2G(GZa[++s{{+[a2G(G2<1J%Uv.UQOs-2(((Za-<{{{{+-bZ(((Z<nLuc..U%4B-](((2a-+{{s{+-HZ(((2<dLuv..Ui4{[](((Za<+{ss{+-H2((G2+1#*v....c/UUzr$L@s+[[H2a^s4LQ%*XU,c..v,u$Jd+2G((ZZ22Hb2yybHZ(((G<slw.vcXu$J{<ybyby[<++{+-bybyyya+sLXv./Xu$J{<yyyyba-+{{+<ayyyyya+@%c.vUQ#d<yybyba[++{+<[byybyy<sJiXv../X%i4{bybyyy[<+{++<aybyyb-{4%v...../X*%i4d+[yyZ(ZH[{@#Qu,c.....v,u%#@+-yH2](]]]Z]ZZHa-+s4iQ*c.....v,XuQi4s+aHZ(Z]2+s4i%wU/.....",
+"..,u94s-HGGGZyy[-+++ayyZGGG2+s%cvcU%i4s<aybyyb[-{{{+<[yyyyya+d%cv,%Jd+[GGG2yya<+++ayyZG((]<s#%Uv.W%#@+2ZGG]yba-++-aby2GGGZ<d#%,.vU%4s^bG(G]yya-+++abyZG((Z+@i*c.vUQJs<2GGG2yba+++-ayHZGGtH+@iXv..UQ41<2GGG2Ha<+{++[yyHG]t[+@Luc.....vcUXu%i4{ay2tGGasJ$%u=,/v..../w9Js+2G(((GGZ2yyayybZGGG2<diUv./=u9Js-byyyyya<++-ayyybyyb+s#wvv/=%$Js-bbyyyaa<-+<[bbyyyya+s%/.v=%id+ayyyyyb-+++-yybyyya-sJ9wv..WX%$4{-yyybyba+++aayyyybya+@%c....cUX%Q#@s<ayyyHH[<{4i%wWc.....cXuQ#@+aabyHyH[a<-<++{s4JiQ*,v.....cU*%$J@{<byyyHH[+sJ$uXWv.....",
+"..cU*%LMAk~~^^B1d::nnB^^~~k6:lwv.v,*%iJ:sB^BB1s:4NJ4hdB^^^Bn4luv./X%lh}kS~~^BBs:dnnB6~~~V^:L%w/v.c=%lM}k~~~^BBn::d1B^^~~~6:lu=c../X%Lh6~~~k^Bs1:::1B6^~~kD:L%Uv../X%LMAk~~~^Bsn:::1B^k~~k}M$uU...c=QL:A~~~k^B1::h:1B^~~~k}M$%,.......v/WUXu9N:6^~~kEgQuX,c.......v,uQL:}~~SSS~~6n11BB^~~~~A:lu/..v/UX%i@1B{BBBsn@:nsB^^^^BB:#%U..v/=uQ#d1BBB{Bs:@dnsB^^^^B1@#uv.vWXu$4dBB{BBB1@:n1BB^~^^B@O9%W...c,Xu$JnB{BB{BsnndnsB^^^^BsMlu.....c,Uuu9#4:nB6^BB1hLQuXWv......v,Xu9#4d1BB^11:hhOO#L$Q%uXXWv......c,wu%iL4nBB6^BBnNi%*=/c......",
+"..c,XuRg:6Dk^D6D}}}}DDDkkA}xg%U..c,X%lNE}kAkD}}xONgM:}DAkkDEML*cvvUX%L:}DDDD6D}}}}AAAAAADENQu=/..vU*QL:6D6^6DBA}}}AA6kAk}Eg%u,v..c,ufg:}DAkDD6}}}}DAkDDDD:N%*W...cU*%g:66^A6DB}}}}AADkDDA:NRw,v..c,u$NE}DD^DD}}}}}}A6A^6}xL%XWv.......v//=X%LO:DDD}xLuXUc.........WX%lNEAkk~FFVA}}}AD66A6}EOQ=c...v/=X%LM:n1666}E}}A66kVkDE:gQ,...c,Uu$gM:nE6A}}EE}66AkkkDE:l*c..cUX%lN::EB66}}E}66k^kVDDENL%U....c,Xu$gM:n166A}}}}666kkkDEhLXv...vcUwuQLgMEDD^A^AEMl%w,/........W*%lLM:n6A6}nMMOglQ%uwXUUc......../UXu$LOMEAAk^ADnOQuXWc.......",
+".../U*R|Y!';KCqq88&P8&&j;'!I0r,v.v=*RI!K&8PP8&&;pIYpK&8888&jp_uvvv=Xr|Ip';mj&q8&C8&8&jm'!Y0r*,c..vWXR|I!;eKC&q&8&88&&Ke;xY0r*,...v/XR|_!';KC&q&8&88&&j;'xI0zX,.../U*zRIp';)Cqqqq&qqq&j;!!I|RXW...vW*%0Y!';K&q&PP&P&q&K;'!I|rX/.........v/Uwz|I_!;}YI|rw,c........v,Xr|I!}mmC888q&q8&q&Km'!Y0r=v...v/Uwu|0_Y;K&&q&&&&q&q888j;_0U..../UwR|I_!;j&&&&q&q&qq888j;_rc..v,U*R0I_pK&&q&&&&q&q88P&jpIRU....vW=*%|IOp;j&>&&&&qqqq88&jp_zv...vWUz|IYp;j888&q&;Y|zX,c.......v,X%0_!';j&&C;'!Yg|rzXU=WWc.......vWwz|_x!;j&8&q&C;_fz=,c.......",
+".../U*r|Ix5e)>8PPPPPPPqCe5xIfr,..vUz0Yej&PPPPP&j5!!;j8PPPPP>mxRc.v/wu|N_5'7q8PPPPPP88Cm'!Y|RwUc.../=u|Ix'57>q8PPPPP8qCe5!_|RX,v..vWwz|Ix'eCqPPPPPPPPqCe'!_|rw/...c,Xr|gx5TK>q8PPPP88qCe'!I|rXW...vWwr|_!'e)q8PPPPPP8q7T'xI|zU/..........c=Xz$I_!!E!I|zUUc........v,XQ|_5TT7CqPPPPPPP8qCe'!O|rU.....c,Xz|0_!m>q8PPPP88q8PPPqK'I*v..v/=Xr$I_xm>q8PP88888PPPP&m!|/..cWw*RQIx5Cq88PPP8888PPP8je!0wv...vWUXr|0I!m>q8PPPP888PPP8&mxRc.../UufN!eTmC8PPP8qCp0RwU/v......cU*|g5T77>88>7Te5_|R*w=//v........W=*|g!eT)>8P888&KY|rXUc.......",
+".../XzQgd+[b2](G(((((((2a<+@#%=v./w94+bZ(((t((t][--b]t(((t((2-L,vcWw%L@+[a2Z(((((((((Zaa+{4$u,c...Ww%L@{-[2Z(((((((((2b-+s#9u=v...Wu%#d{-a2(((((((((]Z[<+sJQu,.../X*$#d+-y2G((((((((GZa-+d#Q*W...vUz9Js+[bH]((P((((((]a-+@#%u,.........vWXuQ#@{-<-+dL9uUc........cw%i4{-yyH2((((((((((ZH[+sNQ=v..../X*%#4s+[]((((((((((((((][s%c.../Xu9#4s+HZ((((((((((((((2-#W..c,*%9i4{-](((((((((((((((H+@uv...vW=*Q#4s+2Z(((((((((((t((a-i/..vWuQJ{-yyH]((((((2+hiz*Uv....../uQJ{-ayyZ((ZHyb[{4i%uU/v........vUu$4{[yH2((((((Z2B4$%w/.......",
+"...v,uQ#@{+a[2]ttttt]Z2H<-{@iu,..cu$4{-b](ttttt[[++-2ttt(ttHa{i/.v,wu$Js+<[2](tt(ttZ2b<+{d#Qu=v...Ww%i4s{[[2]Z(ttt]ZHH[<{@i%uWc..vWX%i4s{<[2Z(ttt(t]Z[<+s@#%*Wv..v,u%i@{+aa2t(tt(tZZ2H<<{@i%,c...vWu%i@{<a[2G(ttttZtZa<+{4i%X/..........c=u%iJ@{++s4i%u,v......../*%i@{abyb2Z((t(tt(tZ[-+{@J%U.....vWwu%J@{<22GZ((GG]](tttZ[<@%c...vW=u9Jd{-22(t(t((Z((ttt2a-i/...v,w%$#d+[2]Z((((GZ((tt]a[+Juv...../w%iJ@B-2ZZt((t(]((tt]2a+i/...,uQJ{<ayH]Z(]]]Z[+@$%X,v......cw9Js<yyyHZZ2Hyb<s#QuX,v..........,uQ4{aabHZ(((G]]-{J$uUc.......",
+"....vWUu%$LOMx:5E'EEx:xMOil%u,v...Wu%#OMxE'';ExMOONN_!''E5:xhLuv..v/=*%$LNhx:!E5EEE!::NL$Qu=Wc....vc,u%$$#h:::E5EEE::hO#lQu=Wv....vW=u%$iNMx:EE'EE:::hgL$%uX/v....cUXu%$LOM:hEEEnE:!:MOL$%w=v.....v,XuQ$iOhxEE}5'E!:xhOi$%uXWc...........vWUu%9iii$%wU,c.........v,*%L4:BBB6EEEEEEEE::hOL$%u=v.......W=Xu%$NM:EEnEEnEEEEE!:hg%,.....v/UXuQlOh:EEEEEEEnE5E!:MLuc....c,UXu%0h:EnEE:EEEEEEExhOi%U.......c,Xu%lOx:EEEEEEEEE5E!:OL*....cUX%#@s1B6A^A66}ng9uXWc........,uQi@nBBB6^BB1d@g%*=Uc..........v/X*Q#ds1BB^^6^6B:g%uXW........",
+".....v/U=uuRfl|llflLlll9%uXX=/....c,Xur%|ll$ll|$9%99l$l|l|l$%uWv...c/U=wu%ffl$ll0lll|9%u*wUWv......vWWUuurr||$ll|ll|$Q%uuXU/v.......v,X*u%f|||$l0|l0l$%u*XUWc.....vcW,Xuu%f||lf$ll$l$Q%u*XUc......vcWU=uzR$|$|0l0llll9%uwXU/c.............v/W=ww*uw==Wc.........../w%$Nhnnn:MOgLl0L0l|$%uuw=/v......../,UXurfl|llllllll0ll|Qu=v......c/UUXurf|l|l|llLl0$ll$%%,v.....v/UUwrRf|ll0L|llll0ll9%u=c.......v/,X*urfl|ll0ll0ll0$l9Qu,v...cWwuQOM::nnEnnnhN$u*,v........v/Xu9lO:n:nn:::Mg$uU,/v...........c,XulOh:nEnEE::Yg$uw,v........",
+"......vWUUXXuw*zrrrfzz*u*w=UWc....vW=w*z*rRrrrrzuz*zzzzzzzzzzXc.....cW,U=Xuzrzzrrrzz*ruXUU,c........v/W=w**zzzrfzzzzz**X=UWc........v/,U=**z*rzrRfrzzzXX==Uc.......vcW,U=*uruRRrrrzzz*XX==Wv.......v/,,UX**uzzrRrzzz**ww=,Wc...............c/UUUU,UW/v............W*%lIIYxYII|||frfrrzz*XUU/c.........v/,U=**zz*zzzzzrrRzrzzX/........v/WU=**zzzzzzzrfrrrz**X/......vcW=UX**zzrRRrrzzzRRrz*U,v........vcWUw*wzzrrrrRrRzRfrz*,c....c/Uur0_YxxYYYYYI|f*=/..........c,wR0I_x!!!Y_II0|uUW/............c,Xu|I_YxxYxYY_I|%*U/v........",
+".......c/,,XXuw**wuzzw*X=UWWc......c/UwXw*zuu*wXwX*Xww**XwXXUUc......vWWUUX*X*zur*w*wXX=U,cv.........vW,W=X*wr*z**w*w*X=,WWv.........cWWUUXX*Xrurwuz*XwUUW/v........vcW,UUXX*rur***X*XwUW/c.........vcW==UXw*Xuzr**ww*==/Wc.................vv//WW/cv............v/Urr|00I00RfRrzzur*w*U=,W/...........v/,UUUw*w******uz**wX=/.........vc/UXwX*****z*zrww*wwUc........c/,=Uwwzuz*u***zr**X=Uc.........../WUX*X*uuruzr**z*z*X,v....v/Uwr||0II_gII0|fzXU/........../UXrr0IIII_I00||rww,cv............/,XzQ0III_I00||RrUUc.........",
+".......vc/,,=wuuu**u***wX,//v......v/,X*w*zzwwXX=XXwzu*uz**u=W........c/,WUw**u*zuu**XXUW/v...........cWW,Uwwz*uzuu**wX,Wc/...........//,,Xwu*uuzuw**XX,/cc..........v//W,Xwwu*uz****XX,cv..........v//,UwXw*z**zuu***XUW/v...................vvcccv............../=*%Q99l$$9QQ%uuu**w*X=,/v............vW,UU=***uzuuzu**w*XU/..........vc,,=wuzzzzzuzuzzzwX,c........c/c,UX*u*u*zuzuu*u**X,v...........v/,wXwz*zu*ruzu**wXXW......vWw%%i$J##Li#i%9%*U/........../=w%%iiLJ###Li%Q%u=Wv............./Xu%%9i#L#L#$$Q%uXWv.........",
+".........vvcW,UU,==UW,W,ccv..........cWW,=,U,,,WW/,,WW==UUWWWv........v..v/WW,U=UUUW,,WWv.................//,,,W,UUWWW//vv...............c/,W,,UWW,W,W/vvv.............vvvcWWW,WWWWWWW/cv............c/cccW==U===UU,,WW/v........................v................./UXXu*u*uwXwXwUUUW,WW/v...............v.vcWW,,WWUUUU,W,,W/..............vcWWWWWU,,UUUUUWWc...........vv/WWU=UUUUU,U=WWW/c..............c/U,U=,=XXXUU,W,W/v.......c,=wXu**uuu*XuX=,c............/U=w**uwu%uuuuw,W/cv..............cUXwu*uuuuwuuw=UWc..........",
+".....................v.v.................v......v........v..................v.....v............................v..v........................vvv....v.............................vvvv...........................v.....................................................v.v.v.vvvv.v.vv.v................................vv..........................vv.....v.....................v...v...v.v.....................v..vvvvv..v............vvvvvccvcv.v.v...............vvvvvccvvvv..vvv..................v..vvvcccv.v...............",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................",
+"........................................................................................................................................................................vcW,WW,WWWW,WWWWWW/v.......................................................................................................................................................................................................................................................................cWWWWcv......................................................",
+".....................................vWWWW/cv......................................................................................................................./,UXwu%%Q%QQ%%%%%%Q%%%*w,v.....................vccv.................cW,U=UU=UU==UUUWc...................vW,UUUUUcv...........................................................................................................................................................................W=uu%%%uwXUUW/v................................................",
+"...................................c,,=Xw=XU,Wc..........................................................vcccv..vvccccvv...........................................c,X*%Q9iiiiiiiiiiiiiiii$%*W....................c,UU,WWW/v..........cWUXwuuu%u%%uuu*XU,/.................c,,XuuuuwXWv..................................................................................................................................................vcWW/ccvc//ccv.........vUu%$$iiiQ%uuXU,,WWW/ccv........................................",
+"...................................cUUXX*ww=U,Wv.....................................................vccccW/cccc/c/W//c/cccv.......................................cWwXuQ$LLi$li$l$$$iLLLLi%uW..................vc/,==U,/WWc..........cW=w*uuuuuuuuuu*w=,c................vcUUX*uuu*=,c...........................v//ccvvv...............................................................................vv...........................vvvc/WWW/////WW/Wcc.......vUu%9iLLi$%u*w=UUU,W///cvv......................................",
+"..................................vWUu%%%zuuwUWc...................................................v/W,,W,,,,,,,U,=,U,,,W,WWc................vcv...................c=XrlO!:xMhOOOgOOOOMxExMI%=v................vc/,UX*wU=,/c..........c,Xu%%QQQQQQQQQ%uX,/v................/,wu%Q$%u*=,c........................v/,/,W/,W/c.................vcc//vv...................................................vcccc/vv........................v/W,===UUU,,,,,U,,//......v=%LOM!E!NLQuuXw==Uw=,,,W/v.....................................",
+"..................................cUwR|00f|%rXU,v.................................................v/WUU=XXXwwXXwwX*w*wXwUUU=Uv...........vv////cv.................v/UuR_jj&j;'x!!!!!'';j&jjp|uc...............v/W=w*rrRzX=W/.........v/=uR00IIIIIIIII0f*UWv..............v/,U*R0I_IRzX=/v......................vc/=U=wU=UUU/v..............v/WW,,WW/c..............................................vc/W=,=,,/Wccccv..................v/W=UXX*ww*XXUXw*wwU,v.....vu0YpKj&j;_I|%zzzzzz*X==UUWc.............vccccv......vccvvv.....",
+".............v//W,cv.............c,*%0____II0fzXU/................................................/Uw*zrR%ffRfRrRRfRfRfRRRuzX,v.........c/UUUUX=UWv...............cU*rIp&qq>CTTTTTTTTTC>qq&;Ir,..............v/UwXu|$00|Rzw,v......../,XR0__xx!xxxxxxx0RzX,v............c/,XuR0_!5xNfzX=Wv....................v/Uwzrzrrzrz*=Wv..........vvW,=XXw**XXU/v...............vccccccccvv.vc/////ccv......v/UUw*z*zz*XwX=U,////ccvv........../UU*rRffRfrRrrrfRRr*X,v..../rxe6Cqqqj'xI00|l|0||Rrzz*wX/.........../,,,,WWW/cccW,WWU,/c....",
+"...........vWXuuu%wwUWc.........vUuiJs+[a<++s4#QuwW....................vcW,UU==U==U=UUWcv........vU%Qi#J@@@dddd@d@dddd@d@4J#$*/.......vWXu%Q99Q%%w=/v............v,u%Ln-G((G2HyyybyybyZG((GaBJu...........vc/,wu%$#d{{s@#9%u,v......cUu9#@+<bbybbaabaa{4$%wW..........cWXu%9i4s-bba{@iQ%u=/v................v/U*%$#44@44J#iQu,........vc==*u9i####iQ%wWv............cW=*wuwuuuuwwXw*u*uu*w=U/....vUu%Qi##J##ii$$Q%%uu**uw=U,v......vWXu%iJ@@d@@@J4J4dd@J$%uU/...,i+aH2G(G2b-+sssss{{s@4JJ#iQw/........cWwu%%uuuXXU=X*uu%uuuX,v..",
+"........../,Xu%$i$9%uXU/........vwQ#@+ayyyy[-s4iQu=W.....cccv.........vcU=Xuu%%%%u%uuu*U/v.......vX9#4s+^-<<--<<a<<-<-<-+++s4$=......v/Uu%$ii##iQ%uU/.............Wu$J1<2GGG2yybyyyyyyHGGG][{4*v.....vccWW,U=*uQiJ@{<<+sJiQ%wc.....v,XuQJs+abybybabyya<@i%u=/.......v,,XuuQi4s+ayya-@JiQ%uu=/...............cUwu$Jn++--+{@4#QXv......c,UXu%Q#4@@ss@J$%u,,v......../,=uuu%%Q%Q%%%QQ%%%%QQQ%uuX/...WX%i#4@sss@@4J#ii$9Q%%%u%uX,v...../Uw%i4s{{{{sss@ss+<+sJ$%uX/..Wi{bHZGGGZyb<++{{<[<<{{ss@4#%,......v/UuuQ$ii$%u**uu%9$$i9%uwW..",
+".........v/,U*%Q$$9uw=,/v........UuiOn6~~^~^6:L9uwUWv...v///c........v//,UX*uu%uuuuuwww=Wcv......v=QgMEAkk^kk^kkk~kk^k^k^kAB:l,......vWU*%$i###L$uwU/v............/wu$hE~SS~~BBBs11BB^^~S~~6M$w.....vc////,U=w*%QLOEAAEMiQuX=c.....v/UUu9J4@@s{{BsBB^^1N%*=Wv......v/UUX*u%%ignB~~^1O$%uuXXU,v..............c,w*%O}Akkk^61M#QU.....vc/,==Xu%$O:}A6EO9uXU,c.......v/WUwuu%%QQQQ%%%%%%%%%%%%uXUc...,Xu$L4M4:@O4N#iii$9%%%%uuuX,v...../=U*%L4ndn@:@h44:166:L%uXUc../%4nB~~S~kBBn@@:11^^61@:@MJL%=......cWUXu%iLi$%uXUwXu%i$$Q%XXW..",
+".........c/Uwu%LLL$QuX=Wv.......vWu9gnAkFF3VA:g$%X=W/cvc/WWW/v.......c/UUwuu%Q$$$Q%%%u*UUWcv.....v=9N:}k3333FFFFFoSFFVVVVkoDE0U......c/=X%lgNMMOl%X,Wc............/Ur$gEkF~k^111n1n111^FSFVEOQUv...cWW,,,,U=UXu%lgN}DV}_L9%uU/.....vW,=*%lMh:nn1nnE6kDEg%*U,c.....v/UU*uu%%Qlg:DV3VEML$Q%u*XU/..............cUUuRO}3FFoVk}:gQXv..../W,UUX*%$LMEAVkDxL%uXUWv......c,wXu%%Qlllll$$$$$$$$lLl9zw=/.../u%lN:nnnnn:MOONLL$l$$$9%zuXW....vWUwuQgMnnn:nMOOO:}AA}g$u*=c..vXLhE6V~~k6nn:::EDVVAEnn::hNlwv.....cWUu%$LONi%u*wXw%9LNLl%uX,..",
+"........./,Xu%0__YI0%*U,c.......vWwf0pKjq88qjpY0f*U,W/WW,XX*=c......v/,w*rR|II_Y__II0|%zw=Wcv....vURIp;jjj&j&&&qq&&&&&jCjjK;p|U......c/=uR0_Y!x_Ifu=/c...........v,Xr|Ipj&qCCKmmmm;e;mj8PP&;YR=...c/=XXw*w****%R0Ip;&&j_I0RrU/.....vWUXuf0Oxx'E5'5'K&&;_RrU,c...../Uwz%||0III!;j88&;p_Il0|fr*,............../Uwr|Yj&&8&&C;!If*c..vcWUw*ur%R0I!;KCjKpI|r*UUWcv..../U*zRII_Y_p_YY__p_YYY_pYY|fw/v..W%fIp;;K;K;;;pppppYYp__Y_I|zW....cUX*%|_x'5'''!xYY!K&j;_0RzXc..vXf_!mKCjK7;''x!;mj&jKm;''!xIwv...../=XuR0_p!Y0QrurrRI_pxY0fzU..",
+"........./Xr|Ip;m;!_IR*U/........Wur0YpKj8P8>m!_$z*=UUUUuR|0|wv...../Uur0g_!pjj&jj;'5_O0RzwWc.....=f|Ipp;;;m;KCCCCK;;;;'pppY0zW......c=Xr|Ih5ee5_0RX=c...........cUzf0_'mC7CC>CCCCC777&PPP&jY|Xv.cUwrf|||||||9|I__'K&qj;xI0R*,...../UwzR0_x5eTTTeee7>&m!0RzXU/...vWwr|g_x555''KqPP8Ce555!x_O|*c............/Uwz|I!;KCCC)me!I|wc..cU*R||0LI_x55em)7m!_0|R%zXUWv..vW*RIxp;jjj&j&jjj&jjjjjjKKpIRXv.vX0Y'm&&qq>>CCCCCCj&jj&jjjKpIw...vWXrR0_!1eTTeTe'n'')>>K!_0f*,..vw|IY!mm7)CCme'''mjCCCC>)7e5OR/....vWUzR0_')K;YI0|$0_pmjK;!N|*/.",
+"........c=%i@{[]]Ha<@J9uUc......vWz$Jd+<2((((2[+diQ%zu%%iJ@{sQ/...c,*%$Js<[bZ]ttt(]Ha[+{4i%u=c...v*$Jhn{B+++aaHHHyH<+++BsdMIlr,.....vW*%$4{<[abb+@#%u,v..........Wu9#d{<y2H22(G(((Z]2H](tttt+h%vvWu9J@sssssd@@ds{+[HGG2[<{@JQ*v.../=u9iJ@+<[bbybabb2]]H+d4iQ%Uv..cw$Js+babbybH2((t(ZHHbbbba+sJX.........../XuQL4B-byHbyby[+d#%W.vU%iJss{{{<<ayybyyb-+ss@Ji$%wW..v=$J{a2ttt8(tttt(tt(((((]Z-1#%/vc%s-a]((tt](GZGG]](tttP(tt(~T%v..,*%i4s-[yyyyyyaa[[b](G2-+{@iX..vui@s+-[H2ZG]yaabyH2ZG(GZ2b[sLW..../=z$#@+<]]H+{ssss+aZ]Z2b+s$=.",
+"......../w%#@+aZGZb-sJ$%*U/......W*%i4B+HG(ZZHb<sJ9%%%%Q#@s+d$/..v,X%9#@{<bH]t(((GZHyba+@i9u*,...vwQiJ4@sB{+<ayyby[<+{sd@4ii%u/......W=%i4s-byb[+@i%XUc..........W%i4@+[ybbyGG((GGGZy2Z((((Z+du/v,u$4s{{++{{{s{{+<ayGGZb<{sJQ*W..WU%%$i@s+abayyybab2G]2+s4iiQ*W..Wwi@{-byybyyy2((((Gyyybyba<{Juv.........c,Xu9J@s<byyyyya<{@iu/.vU%i@s{+++<byyyyyyb<+{{s@4i$%X/.v=9@{[2((((((((((((tt(t((ta{Ju,.c%d<HZGt(((G((((((((((((((]2{$c.vUuQ#@{<yaayybayba<[2GG2a+{dLwv.cX9Jd{+aaHGG2ybbbyyy2GGGGHba{QW....cX%9#@^aZ2H<+{{ss^[GGG]H-s#Xv",
+"........cWXulM}k~^6n4l%XU/v......v,XuQL:}k~S~61@gQuuwuu%$JM4Juv..v,Uu%i#Mn1Bk3SFS~~^{1d@Jl%uXW....,u%9iiLJJMhnB^^Bnh4gliQ%%uw=v......v,wui#4dsB@@l%*,Wv........../u%LO:1^^~~~~~S~S~~^^~SSSFA:#*v./XuiN:@::n:hhh:::1D~~k1:hJ$uXc../Xuu%$#4@ddsBBB1n16~k6nM#lQ%*/..WX%i4@1{^BBB6^~SSSk^B{B{Bs@OiX..........vWUu%$#J:1BB^BB1dJl%Xc..WuQ#M@nnnd1BBBB6BB1:hMMOgL9%Xc..Wuihn6oFtSSSSS3FFSSFSSSS~DO9X/.vwiM1AFSFSFSSS~SS~SSSSFS3Vk}Nuv..W*%$JM@BBBBBBBBs1n1kV~kB:M4$w..vUu%L4hd16~~k1n@dnsB^S~S~^1@Luv....vWXu%iNBk~6nh4N4O:6k~~^61N%U.",
+"........vW=urlx}AD6}ML%*=Wc.......cUXzQgEDkkAE:NLQu*wu%0h:xhLuc..v,w%QLMn}}AADDkkA61E1n:MLQuXWv..vUuQllLLLLNNMn1B1:MgLlQ%*uXU,v......vWUu%LOh:n:Nl%wU/v.........vWu$OxE}^Vkk^kkkkkk616k3SSo}xLwv./X%g:E}}1}}}}}}}}Dko3DEnMMl%Xc..Wu%9$gOM::nn166EnEAVVA:MONLl%U.vWX%lO:B6^^A11A3SSo^6111nnn:N9=v.........v==uQLNMn}A^DkD}:g9u=v../ulNE}}}A}AADDDkkD}}}EEExOL%w/.v,u$LMEoSSFoKD}}A}}DDkoSSo}Nf*cvvUrLO:}}DkFS~~kkkFS33D}}}EEOlU..vUu%lME}DDADk^AD}}}DVFoVA}ExLwv../X%lNM:nAV3AEMMOMMEAVSFk}:O$=......c,XufLEAkA:hOOOhxED^k^6}hlUv",
+"........vWUwr|Ip;mjj;I%*=,c.......c,U*%0Y};eep!_0|ruu%|p;j;pI*v..cU*flYpKC&CK;;mmmme'5''xYI|u=c..c*fIIIIIIIN_x'}e5!Y_I|||fRr*,v......./Uzf0N!!!!_0%wUc..........vUfIpj&&q88&Cmeee;'emmjq88&Kp_zv./Xf_jjq&&&8&8&8&8&88&Cm''xIfwc.vU%0IIx!'}5mmj&CKm;Kq&&;'!!__fwv.WX%IY;K&&qCmmK&88qjm'eee5'!x0U.........vcUX%IY!'mC&qq8&j;I|z=v..WrI;j&q&8&8&888P8P&&&&&&j;p|zW../*%|Ipj&8&jpYYYYYY!p;j&q&;Y|zc.v,*r|IYYp;j&&)mA)C&&KpYYI0|R*W..vUR|YpjC&q8q&q&>&&q&8PP8&&jKYz...WX%|_x!;K&&jpYIgI_Ym&q&Cp_If=......cW=Xr0pj&j;x!xx!!'emm7jj;0X.",
+"........c/U*rfN!e)>&KYRzXU/v......c,w*fI!eTTee5x_0$ff0I;CqK5_zc.vcXRIY5mC>qCm'eT777TTTTTe5!O|z/..,rLx!:5xxxx5'Tm7Te5!x_INI0lfrW......vWXrlI_5eT'xIfzUWv..........=fY;Cqqq88qC77TTTTT7)>q88q)e_rcv/*Rpjqq88PPPPPPP888q>>77T'x0z,vvX0N_5'TTT7))>qqC7)C88C7Tee5!O*v./*|O'TCq8q>)7Cq88qC7TeTTTTT5Iwv........cUXr|_ETe7>>8888&K!IRXc.v=f_K>q8PPPP88PPPPPPP88qq>K'IRW..,wf0_;jqP&KpYYI___x5'Cq8qjpIRW..WXuR|0IY;7>>)7T77>CmpYI0frrXW..vwfIYmCqq8PP8q8qqqq8PPP88qqKprc.vUz|I!'Tm)qqC;Y____!m>q>CexNfU......vWU*RI;C>CT'''55eTTTT)>&;I=v",
+".......cWX*%QL@+[2]]aT49uw,c......cUu%Ld+ayyyHya+{@4@s+HZG2-d9c.v,%4{a22ZZ]2HabybyHbyyayyH[<@iXv.=is-abbbbb[aH2ZZZHbyba<+-+{sJuv.....cXui4s+[byb-s#Qu=c.........vu#s[H]]ZZZ]2HbyybHH2Z]G]G]Hb+$/vWRI1a2]Z]]((((((Z]2G2bHyyb+sLwvc%d+<aabyHH22Z((2H2Z((Z2yyyb[{%/cX94+[H](((]2H2G(((ZHyyyyyyaad%v........WX%i4{byyH]ZG(]GHa+@L%/.v*O{[]ZGZ(]((]((((((((ZGZHa+dl=vvU%#@{[ZG(GZ+{sdds{+<HZ(((H+@i=v./*zQLJ@s+aZH2Hy2Z2Za+1@Nl9Rw,..c%#4s<H]]](]]22]]ZG]((((GZ2[B%c.cui@{[H2Z](tZ-+sss{+[2Z22a<s#w......cUu%Ld-H2ZZ22HHyyyyyyyH[^_Xv",
+".......vUwu%$#4{<aGG[+4QuX,v......vWu%i@+ayyH2G2[{sds{-[GZ2+@%c.v,%4^HZ2Hybya<<abyyyyybaH2]-s#wvv=is<byyyayyy2G((G2yyabaabbb+@%c...../X%94s+ayba<sJ$uXW..........U$@+byyyyyybyyyyybHZGZZyybyas$/v,u$4@{+<-[2G(G2yyyyyyyybyb-sJ*cW%d+abyybyyyyZGGZHb2GGZybyay[s9cvUi@+abZG(GZaabGGGG2abayybyy[s%c.......vWwu$@{[yybyyyyyyb-{@#u/vcuLs[byHyyyaaH(((((ZHyyyb<+sJ%W.v=%L@+<ZGGG2+s44Jds+<aZGGtH+@$,..c,uuQ$L4s{<byyyyyya+s@JiQu*X/..vX%iOs+-yyyyyyybyyyHG((ZHba{Juv.vu#s+a2GG((tZ<{ssss{<byyyy-{#uv.....v,X%9@{-y22GGZHbyyyb[-+s4iX.",
+"......vcW=Uwu9lO:6k~6MluUWc........v,XuQJ@n16^~^EMggNhn6kkAhQw...Wul:^~~6B1nd@:@nd1BBsn16~k}O%U.vU%JdssBsB{BB^~SS~~^{BBss1ssdJuv.....v/wu$#4@sBd@#QuwWv........../*$4:nBBBBBBBBB{BB^~~~^^BB1dNuv.vUw%9lgOO:Ek~k61ddndn1{BBB@J9=vcui4@nsBBB+^^~~~~^^^~~k6Bsssdguv.W%ihnB^~SSkBn6kSS~^nd@1s1s1@Nu.........cU*ui4nBB+^BBBB1n:JL%*c.v=9#:1BB111n:n63SSS^BB1d:hL$uUv../wu$On^~~~A:L9%%9LJ:1^~S~}O$wv...vWUXXuu$LJ:sBB+BBnMgQ%*XU/v...vWX*%$#4@1BBB{Bs1@@16~~^1:hJ%U..cX9N:A~S~SS~DENLLLLN@11B1sdh9=......./,wu$O:n^~~S~~^^BsdhJL9uw/.",
+".....v/,UUw*u%lL_Eko}O$uwUc........vcUXulNhn1kVDENLLLOh}kDELuWv../wlYAkk1nM:NNgMM:nnn:::}kkEg%Uv.W%LN:::nnnn1DVSSFD61nnnnn::hlXv.....v,UuQLOhnnnO$%*U/c...........U%LN::n1nnnnnEnE1A~~k611n:hlXv.v/W=Xr9lNgxAkkE:MMMMMnn11nhLQUvcw$LOh:n1n11B^~~^11633k}nn::h$Xvv/u9O:Ek~FoDExEkSFk}hh::nnn:hiXv........c,Uu%g:nE166nnn::OL$%Xc..,rLh:nn:n:MMMEoSSFAn:MMOLluXW.../Uu9LxDVokEOl9uuuQLO:A3Fo}OfUv...../W,Uwu%lN:11nn:Mg$%uUU/v.....v/UXzQLO::nn1nnMMhh}ooAxMglR,...w9L:Ak~SSS3AhLlQQ9lOMn:n:hgQUv......cWUX%lg:Ak~~~^61EhON$%uX/v.",
+"....cWUwwuz%R|lI_;j&;Y0r*=,v........cUXufNY!;j&j;_III_YpK;pf*/...cw|pK&j;'x_OIII_!'ee5!x;Kj;YRwvvWu|g_xxxx!!'mjqq&K}5!!!xxY_I0X......v,U*R0O!';5!0R*=/c..........v,r|I!'';mmmm;mmmKCqqCmee5x_|X...cW==w%R|Ip;Kj;!xY___x!5'!YIfUvv=RlI__!!'''mm)CKm;)&&K5!!!_IRU../z|I!;Kqqqjpp;&8P&Kpx!555'5!IX.........c,U*%0_5'mKKm5'5!x_0Rw/.v,R|Y5''''5!Y!;jq&&m'!YOI|RzU/.../XzRIpK&q&;YfRrurr0Ypj&P&K_|X.......cWUU*u|Ox''e'5xI|z*=Wv......v/UX*r0_!5'''''!YYpj&&KpII|z,..vw|Ipmj&qqq&KpI0|||0_!55!!xIRU.......c,=Xz|Ipm&q8qCm'xYII|rw=c..",
+"...c,w*r|l0g_x_YY;KCm5_0rXUWv.......v/U*R|_!eC>Cm55x__Y_ppIRwW...,r0pjq>7'5!__O_xxmC)m'eT))e!I*c.cXR|0II__x!'e)CC7m'!:___Ig0|RUv.....cUwz|I!;)C);Y|zX=c..........cX*$I!;7CCCC&>&&&qq88q)7Te5_0wv...c/,X*f|Ixm7)T'e'5!xx5!!:!xI*vv,zR|0I_x55eT7))7TT7>qC;5xxI0RWv.,r0x5mCq88&mmK&8PqCTeeeeTee5N*v........c,=*R0_!'mC>)7TeT'5xIRWv.=rIx'eTeTe'5x;)C>7me5x_0|R*Uc...W*R|OpC>q&KYI|rrRlIY'CqPqKp0*c.......vW=Xz|I5eTTT5!_LfzU,v......./==rR0x5eeeTee5!''j8&j'Yg|rW..v*Ix'7)C7>q>j'_I000N_5'eee5x0X.......c,XzR0_'Kq88qC)T5xO0|zXUc..",
+".vWwu$i4@s+<[b<++aaHy[+d#%uX/v......v,X%Qi4{-2]GHbba+{{ddhLf*W..vwLs-Z(ZZHba+ss{{-a]]ZyayyHyasQc./X%Qi#J4@ds+[b22yb-+{@@4N#L$uU.....vWXu$Js+HZtZ[B4$uwW.........vWu9#@{[]Z(((]((((t(G((2yya+sLu....v/UXz$#@{[aHyyby[-++++++<<s9cvUuQ$#Jd{-abyyyyyaH]](Z<+{s@#QWv.Xi@+ayG((((HH2(((t]2yyyyyyaa{%v......c/WXu%i4s{<y2]]2yybyba{JXvvwi@+ayybybb[[a222yyy[+sJi9u*/..vU%L@{[Z(GG[^dJLi#d{+aZt((Z+n9/......../XuQ#d-ayyyy[+@#9uXc......./Xu%i@{[yyyyyybb[aZ(t]<{s4$=../%d<ayyyZZGGH<+{sss{+aybbyb-s%v.....c=*%$#@{<Zt(((ZHy[+d4#9uw/..",
+".c=uQi@s{<<bbb[+-<bbyb+s#9uwUv.......c=*%9J@^a2H2yya-{s@4i9%=v...U$:<2ZZyyy[<sss{[[H2Hbyybya-{$/.v,Xw%Q9ii4d{<yyyy-+s@4#i$$9Q*c......c,u$Js^[ZGG2+@i%wW........../*%$JBaZZG(t(t]tZ(t]]2Hyyb+diXv....v/=*%$Js<bbyyyyb++{{sss{{d%c./*%%9i4s+<ayybybyaHG2Z-+{@J9u,.vUQ@{<bZ2GGZHbZ((((2Hayyyyyy<s%c...v//WUXuu%iJ@{+[2222HHyyba+#XvvU%4{<ybHyyyaay2yyyyab+@J$%uUc...U%i@BaHG(Ga{d4iiJ@{<a2G(t2-@Q/........v=u%l@+aaayaa+@#Quw/......./=*%9J{aayayabaaab2]tZ-{d49Uv.c%s+abbybH2Z2[++{ss{-aabbya<d%v....c,wu%i4s{-2(((GZ2ya{s4i%*XW..",
+".cU*%$Nn166BBd@h4:ns1snJi%X=,c........vWXu%$N:}6^~^61hLi9uXUW...vW*Lh16^BBsn4JggghE66BB1BBBBdOuc...c/,XXuuQiJ:sBBBd4LlQuuXXwX,.......v/Uu%L:6~~~A:L%uUW..........v,XuQ#:6^^kAAA}1}}}66BBBBn4i*/......vcWU*%lJ:1^^~^6:4J#i9$i$%Uv.v/,X*u%iJ4dn{1Bsn16k~6nM4L9uXc..,uQ#h1B^^^1116VSSS^1nnsns1d@Lwv..vv//W,=wX*%$L4hn6^~~~~~^B14Q,.vWwQ#416~~^^1nnB^B+BBs@#Qu*=/v.../XuiOnk~~~6:LlQ%9iO:1k~S~D:lwv.........c,wu9J4ddBssMiQuXUc.......v/=XuiJdsBsB{s1@n16~kDxNL$uW..v=QiJJ4@:1B661:@h4gJ@ds1ss1@Lu....vWUXu%QLh:1A~SSS~~^1M#9%uU,c..",
+".vU*RlO}kVkA:hNgLMM:nn:ML%uXUc.........v/Uw%$LMEAkVkEOL%%*w,c....c*fO:11nnn:ML$$LLMn1nnnn11nMNz/.....v/UUwu%lM:11nhgl%uX===,Wc........c,Xz$g}VFV}Ml%*XWv..........cUXzlMn}11En:xhhOMMx:nn::gQXc........cWU*ulL:AkVV}Mgi9%uuu*=v....cWUU*%LgM:n1n:hMEkkA:hNLQuUc..cU%lgMn11EnhMEkFSV}:Mh:::hNLQU..v/W,,==UXwuz9llOMn16^~~k^1:l%W..WwuQgxAVFVAn:nnnE111:OL%uwXWv.../wufgMAV3k}MLl$QQlgM:AoFo}O$wv.........cW,Xu9NNM:n:hL%uw=Wv.......cUwu%LM:nnnn:MMhh}VV}hN$%w/..vWXuu%QlgO:nn::MNgLgOh:::n:O$Uv...v/wwu%lLhnEkFFSSSFDEhLl%*=Uc..",
+"v/XuR0p;&q&K'YOII__xx55_I0%z=c........../U=*%|IpK&q&;_I|%zUWc..../XfI!'''5'!YI0|0IY!'''55''5xIrW......cW=U*z|O!e''xI|RuwU,,W/v........cUXzfY;&q&KplRrXUc..........cUXz|Y5'e''!!YY__YYx!5'5!IRUv........vWUXz|0Yj&q&jpI0|%uXw=W....../U=ur0I_x!''!YY;j&KpxYIRzUc..cUzfI_x'e'!YY;j8q&;YI_____I0r,..vW,=UXu*uurf|0I_x'm)&qqq)m'IR,..cXr|IpK&q&Kp!!''5''e5_I|%*X,c...cXz|IpK&q&;YI0|||0I!pjq8&KYf=v.........v/,XuRlIO!E5xI|%wUWc.......v,UzrIY!'''5!_Y!pj&&;_I|rX/..v/UX**uR0I!x!x!!Y_IOY!5'!x!I$=v.../,wrR|IIx'eC&8PPPq&;_I|RuX=c..",
+".Wuf0Y'CqqqCm'!x:!5'eeT'xIlf*U..........v,X*rl_')>q>K!_I|%z=/..../wfI!TTTTTe!_NII_xeTTTTT7Te5_RW......v/,w*R0_eTTT5xN|R*wUWccv........c==zRIK&8qK'_|%*XUW........./=*R0xeTTTT5'5!xxx!!5''5x0RUv........v/U=z|IpKqqqj'!O0frwXU/.....vc,XzfI_55Tee'x'mC&)e'5xNfz/../UzQ0_5eTe'!';&88qK!x_x__OI|r,../XuRf9||lII__Yx!'e7>>qq>)7'x|U../Xz9I5)>q>CT'eeTTTTTe5_g0|rwWv../XR|I'Cqq&K'xM___xx'TCqPqjp0zc.........v/Uwzf0Ix5ee5xg|RzXWv....../Uwr|O5e1TeeE555;C&qK!_0f*/...c,==**rl_!eee5e5!x!5'eeTe5_|Xv...Uu90N_x5'T7Cq88P88&K'x_LfzX,..",
+"vXi@{[HZ((t]]2ababyyHHHba+{4#uv........../XR$#@+H]]22[<{dJ$%=c...,ui@+abH2HH[<{{{+-[ay2222Ha+s$,.......cUu%i@+[byyb<+sJ9%*XW/........v/Xz$JBaZ]]2a+s4i%uwWc......./u%i@+[yyHyHyab[[a<--<<+s4$*c.........WX*%#d+[GG]Hy-+@#9%uw,......WXu%#d+<byyyb--[2Z22HHa+@iwvv,w%i4d+-aa[--2t(((2-{{{s@@4#%W.v=9J@s{{++<[bbHHHHH2ZZZ]GHya{#wv.WuQ#d+2ZGZ2ZHHyyyyyybb-+{sJiXc.v,ui@B-](((2aa[a-[aaaHZ((tH^@9/..........c,uQi4@{-yyb<+s@i%w,......Wu%i@{[byyyyyabbHZ((2-{@#%U...cUXwuRQJs+aayyyyyaayH2Hy[<s#uc..cu#d+[a222ZZ]GZ]G(GZ2Haa+@iQwc.",
+"v*is<bZGt((((G2yybyb2Z22y[-{4%c..........v,u%i4{<ayyyya-{4i%*W.../u9Js+a22GZHa+{{{+<bH2G2GGa+@%c.......vWX%i@+ayyyyb[{@i9uwWc........./wu9Js<HHHyyb+@#$%uw,c......cXui@{abybZZZyybbaa+{{s@JiQwc.........c,w%9Js+abyybb+sJ$%u*W.....v/Uu9is{-bbby[++<aH2Z2GH-{#Xv.cXuQ9J@s{{{++[Z(Gt[+{@@J#i9%w/vvw#s+-abayyGGGGG]2Hyyyyyyy-+sJXvv/=%i4{-yyH]GG2yyayyyyyyb[+@#%Wv.,%i4BaHG(GZyyyaybyyyHGG(]H+@QW...........vUu9J@s<bayaa<{4iuUv...../X%i@+<bbyyyyyyyHZ]tH+{@#%U...vcUXwu%i4{<byayayyy2Z2Z2a{@iu/v./%@+a2]t(GGG2Hb[bbyH22]]<{4i%,.",
+"v=%NnB^~SFSSS~^^B{B^^~~^^BdhLuv...........v,X*%LOn11BBBdM#9%wW...cU*%iNnA~~~^B@h4h@:nB~~~~kENQU........v/UX%$41B{B{BsMLQuX=/v.........c,X*%LM1BBBB1n4iQuXU,c.......WXuQJd1B6~~~^B{{d@JL$Q%u*X,..........vc/U*u$LNM:d1s:Ji%u*=/......//U*%iJ4dsBsn4O4hn6k~~^Eh9=...c,wXu%%$ilNhEk~~~AhNlQuu*XU/...U9J@1s1BB^~~~~S~~^B^{^BBs:4$%/..v,XuQN:1B6~V~^1n@dss1{B{s@g9u/..cUu$g:^~~~^6B{B{BBBB6^~~o6:Lu.............c=XuQi4ds1{sn@L9u,......vWwu$4@1sBB{BBs1Bk~oD:g$%X/.....v/,=XuQiJ@sB{BB{^^~~k6nN$uUv..cu#nBk~SSS~~1nh4h:nB6~~kA:l$uW.",
+".U%g:6AkoookA6611111B^^k6}nhluc............/,=w%lLNM::nE:xN9z,..../U*z$g:E6}EEE:x:MOhn}AA}EO$uW.........c,Uu9g:n111n:Oi%uw,/c..........vWUuQLOM:E11EMLl%uw,/.......cWXzlNM:nAF3k1nnMgLQ%uXX,/v............v/Uwu%$LgM:hMNLl%*UW.......c,UuQLgMh:nhLlLLM:6AA}:N$wv..vv/,Uwwwu%$LED33kENQu*X==,Wc..vU%gM::nn166kkDDA}En:n:n::Mg$w/..vcUXu$Lhhn}DD}:OOOOMM:nnnhOL%,v.cUuflMEDD^}n::hh:h:n16kkAEN%=v............vc,wu%LNh::n:Mg$%Uc.....v/Uu%LMh:nn11nnn1AVV}MLQuU/......vcW,Uu9LOh:nnn11BAD}Eg$%XW...cX$OE}DAkD}}xgLlLLOME}AA}ExI%Uv",
+".URY;jCK;};'p!!'5'''emm)CC;!0*v............c/U=X%$0I_xxmKKpIfw.....WXuzR0I_Y!;K&jjpYIY_YYII|zX/.........c=U*RIx''eee5_0RrX,/v.........../Wwz|0I_pKjK5Y_|%*UWv......cWU*%0IY'jq&Cm'EYIlruw=U/v..............vW=wuuR|g_x__II|%X/......vcWU*%|IOx!x_0fff0Y!p''p!I*.....vcWU==wrfIp&q8j;IRzwU,W/vv...U%0_xx''eeee;'p'YY___xY!x!_|zc...v,=wr|0IY!pp!YIl00LI_x!5!!_fUv.cWX%|I!';'x_INIgIgI_!'emepIrU.............vc/=XzfL_xx''!_I|*/....../UX%|Ox!5''e'''mK>&;_IRzUc.......v/W,XzrLO_xxx5'!!!_IfrzU/...cw|I!p;;;p_Y0|RR||0IIx!p;KKpIwv",
+"vUfYK>C)e'':!x!5eeeTTT7CqqjpI*c............vWWUw*rf0O!emC&K!I*c...vc,U*rR|I_!mCqq>K!_I__I|fr*Uc.........vWwzRI5TTTTeexI9r*=/v...........c,Uwrf0_;C>Cmex_0zwUc.....vcW=*r|I_'jqqC7Te5I|ruU,/v...............vvWUX*zf0_x5!xxgf*W.......v/Uzf0I_x!!IffRf0_x!5'ee_zc......vWU=*zfIpj8qq;YfrXwWccv....WR0_!eeTeTTe5!!x__II__xx55!NzW...v/UXrfLI_x!!_I0||00gx5eee'5IX..v=*r|Ix5'5xII0|00Ig_!'TTe5IfU..............vW,w*f0Ix'eee5_Ir,.....v/Uur0_!5eTTTTTT7C>&K!I|rX/........c/W=XR|I_x5''E'xYO0fzw,/v...*|OY:xnxYI|RRrrrrR|I_x5;C&KY*.",
+"vXg1[(Z2a[-+++<[yybbyyH2Z(H-dQc............./UX*uQiJs+[2G]H-s9c....cWXzrQLJd+[Z(G][^s@s@@l9%uXc.........v,u9id+byyyyb+d#$uXWv...........c,XuQi4s<]]]Hy[+@i%wW....../Uw%$Jd{-H](2Hbb+@#Q%=,c.................v/U*uQi@{+-<<+s#%U.......v,X%$J@{+-+s#$Q9Jd+<-byb+9c.......v,Xzrl:-t((]<1#9uw,vv....vXl@{-abyyyaa-++{@4@dss{+<a-@$W....WXu%iJ4d{++{4##LJ4@{+aaab<suv.cXr$4d+<<<{dJ#i#J4@s+[yya+diw..............v/Uu%$4@+[bbb[+s#X......c=zi4{-[ybyyyyyy2GG2+d4$%/........v/,Xu9J@{+<[ab<+{d4$%*=c...vuJs{+-<+{@N$9%%%%9i4@{+a]]~1%c",
+"vXid~[2[<<{{ds{<-[bbbaaHZZ[+@%/..............cUXuu%i4{<a22a+d9/.....vc,*%QiJ1[[2]H<s4444#Q%wU/v.........vWX%i@+ababb[+@i9uX/v............v,w*Q#@^[2Hya<{4i%X,v.....vW,u9i4@+[22yyba{4$%u=c...................cWU*%9#@{+++{4#%Uv.......v=uQiJ@{+{@iQ%Qi4s{+-a<s9c.......vv,*ui4{-222<@i%u=v......vX$4s{[[aaaba<{sd4JLJ4@s{+-{@%c....v/=u%$L4s{s4J$$9$9#s{<<<-+4uv.c,*Q#@s++{dJi$QQ9##ds[[aa{4%=v..............c,=uQ#4{<aaa<{@iXv.....v=u9Js{<abyabybbH22a+dJ9wc..........v=u%i4@{{+<++s@@#$uXWc...cu#@ss{{s@#$9%uuu%%Q#@sB-aH[s%v",
+".W*$OxhhNii$Q$$iJJJ44hM::x_L$X................v/UUXu%$LMxn:hiuv.......v/UXu%$OM!:MOl%%%%uXU/v............cW=u%i#JJ4JJLQuwU/................/,Xu%L_:n:d4J9uXWc.......vc,Xu%9N_::::4Ji%*UWc......................v/UXu%$iii$Qu=v........v/UXuu%$ii%u*wXw%QiiiJJQ=..........c,UufNxEE:O$uX,c........cw%$i#JJJ4##ii9Q%uuu%%Q$ii$%=.......v,Uwu%%Q9%u**X**u%$i##iiu,...v/Uu%9iLiQuu*wwXuuQ$iJJJi%X/................vc,Uu%$iJ#iii%w/.......cU*%9$iJ4@h@@hnnBE:N$%*,............vW,*%9$iiiii9%%u*U/v.....Wu%Q$$$Q%uXUUU,W,UXu%QlN_h_|=v",
+"vWwwz%f%uu*u*uu%u%%%Q9Q|ll9rX,v.................v/UUX*zR|llLlXv........vc/,=*rffRRru*wwUUW/.............../WUXuu%%%%%u*XUc..................v,U*rrRLggL$%u=Wc.........cW,=*zR|$lQQ%uX=,c........................vcUUwuwwuu*,cv.........vcWWUXwwwX=,W,=U*uuuuu=v..........v/,UXr|LLlfuXU/v........vWX**uu%%%%uu**ww=UXXX*uuu*X/........v/,,UXXwXUU,,,UX*uuuuu*Uv....v/WXwww*XUU,UWUUXX*uu%uuw,v..................vWUw*uuuuuXXUv........cWU*uu%Q$l9llLOOOL9uXU/..............c,ww*uuuuuuXXU/cv......c,UXwX*wUU//cvv.vW,==**zR%%w/.",
+".cU=XXX*wXU=U==wX***uzzz*r*X,c..................../WUXX*zzf|fX..........v/WUUX*zu*XUU,WW/vv...............vc,UUX**u*XX=W/v..................vcWUwuzR|0|fuX,cv..........cW,=wXzzrz**wUW/v..........................cWW==U=UU/............v/WWUUUUW//ccWWU=UXUU,............cW=UXrffRrw=/c..........cUU==ww*XXUU=U,U,,W,,UU=UU/c..........vc/,,,,/////WW==U=X=,c.....vc//,,U=U,W//ccc,UwwX*XXU/....................cW==UXw===Wc.........cW,=XX*zzzzzzr|I0RrwU/c...............cWUUUUUUU=U//v........./WUU=UU/cv......v/W,=UUXXU,v.",
+".v/U=UwUU,,W=,UU=UX=X=XXXXXUWv.....................c/,=XX**zzWv...........c/UUXXU=,,W//v...................c/,UUUUUUU,/cv....................vcWUXXzRRfr*U/cv..........cWWWUUwXXXXUU,/............................vvcc/,,,/v.............vc/c//ccv....cc/U,UU/............v/W=Xw*zzwX,Wv...........//WUUUUUUU,//cccc/c///WWW/............vv.vvv..vvcv///,U,,/v.......vcc//c/ccvv..vc/,,=,,W/v....................vccWU=U,UWWc.........c///,UXXX*w*zrrRrr*U,/v...............vcW,UUUU,Wcv............vc/c//cv........v//WUU=,U/..",
+"..c/,WUUW/Wcc//W/WU,UWW,UUU,/.......................vcWUU====/.............vWWUUW,W//cv....................vc,,WU,,,W//cv......................vcUU=wXwwUWv............vcc/,WWUUUU,W/c..............................vvvccc.................v..vvv........v////............vc/,W=UUUW///v...........vc///WUU,/Wcv.......vvc/cc.......................vv/////c.........vccvv..........v////W/cv......................vWW,W///v...........////,,UUUUU=XwwwXUU/v.................vc//W,W/cv...............v.v............vc/,WWW/v..",
+"....vvvvvv..v.vvvv.v.vv.vvv...........................v....vv................vvvv.............................vv................................vvvvvcv.v...................vvvvvv.v..........................................................................................v.vvvv....................vvv.v..........................................................................v.............................v......................vv.v.vvvvccvv................................................................vvv...."};
index c810265d0f6c793c5623e23116643c126f1d7ace..b15f89c6b336b58ccbf1fd036ecbe70d7f4ac1ad 100644 (file)
@@ -1,8 +1,8 @@
 .TH XScreenSaver 1 "27-Apr-97" "X Version 11"
 .SH NAME
-halo - draw circular interference patterns
+moire - draw circular interference patterns
 .SH SYNOPSIS
-.B halo
+.B moire
 [\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-random \fIboolean\fP] [\-ncolors \fIint\fP] [\-offset \fIint\fP] 
 .SH DESCRIPTION
 The \fImoire\fP program draws cool circular interference patterns.
index 1a6cd69f879f8dbcd68accfe65730e4336f8da0c..3898a8e360daa8fa1b1c336696ab12566039ea98 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998, 2001, 2002
+/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998, 2001, 2002, 2003
  *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -592,7 +592,7 @@ main (int argc, char **argv)
                                    XtNbackground, (Pixel) bg,
                                    XtNborderColor, (Pixel) bd,
                                    XtNinput, True,  /* for WM_HINTS */
-                                   0);
+                                   NULL);
          XtDestroyWidget (toplevel);
          toplevel = new;
          XtRealizeWidget (toplevel);
@@ -603,7 +603,7 @@ main (int argc, char **argv)
          XtVaSetValues (toplevel,
                          XtNmappedWhenManaged, False,
                          XtNinput, True,  /* for WM_HINTS */
-                         0);
+                         NULL);
          XtRealizeWidget (toplevel);
          window = XtWindow (toplevel);
 
@@ -623,7 +623,7 @@ main (int argc, char **argv)
 /*
       if (dont_map)
        {
-         XtVaSetValues (toplevel, XtNmappedWhenManaged, False, 0);
+         XtVaSetValues (toplevel, XtNmappedWhenManaged, False, NULL);
          XtRealizeWidget (toplevel);
        }
       else
@@ -632,7 +632,7 @@ main (int argc, char **argv)
          XtPopup (toplevel, XtGrabNone);
        }
 
-      XtVaSetValues(toplevel, XtNtitle, version, 0);
+      XtVaSetValues(toplevel, XtNtitle, version, NULL);
 
       /* For screenhack_handle_events(): select KeyPress, and
          announce that we accept WM_DELETE_WINDOW. */
index c58f6aef69aedee357c8cabac933b2a3b893e117..0df716b6028b992ccb12c836ee9d556403716e27 100644 (file)
@@ -38,7 +38,7 @@
  * software for any purpose.  It is provided "as is" without express or 
  * implied warranty.
  *
- * $Revision: 1.23 $
+ * $Revision: 1.24 $
  *
  * Version 1.0 April 27, 1998.
  * - Initial version
@@ -169,7 +169,7 @@ static long delta(struct timeval *, struct timeval *);
 /*
  * The Bogie.
  *
- * This represents an object that is visable on the scope.
+ * This represents an object that is visible on the scope.
  */
 
 typedef struct Bogie {
@@ -205,7 +205,7 @@ typedef struct {
     int width, height;         /* Window dimensions */
     int minx, miny, maxx, maxy, /* Bounds of the scope */
        centrex, centrey, radius; /* Parts of the scope circle */
-    Bogie *visable;            /* List of visable objects */
+    Bogie *visible;            /* List of visible objects */
     int current;               /* Current position of sweep */
     int sweepnum;               /* The current id of the sweep */
     int delay;                 /* how long between each frame of the anim */
@@ -362,6 +362,7 @@ newBogie(char *name, int distance, int tick, int ttl)
 
     Bogie *new;
 
+    distance *= 1000;
     /* Allocate a bogie and initialize it */
 
     if ((new = (Bogie *) calloc(1, sizeof(Bogie))) == NULL) {
@@ -1383,6 +1384,26 @@ init_sim(void)
     return si;
 }
 
+/*
+ * Creates and returns a drawing mask for the scope:
+ * mask out anything outside of the disc.
+ */
+static Pixmap
+scope_mask (Display *dpy, Window win, sonar_info *si)
+{
+  XGCValues gcv;
+  Pixmap mask = XCreatePixmap(dpy, win, si->width, si->height, 1);
+  GC gc = XCreateGC (dpy, mask, 0, &gcv);
+  XSetFunction (dpy, gc, GXclear);
+  XFillRectangle (dpy, mask, gc, 0, 0, si->width, si->height);
+  XSetFunction (dpy, gc, GXset);
+  XFillArc(dpy, mask, gc, si->minx, si->miny, 
+           si->maxx - si->minx, si->maxy - si->miny,
+           0, 360 * 64);
+  return mask;
+}
+
+
 /*
  * Initialize the Sonar.
  *
@@ -1418,7 +1439,7 @@ init_sonar(Display *dpy, Window win)
 
     si->dpy = dpy;
     si->win = win;
-    si->visable = NULL;
+    si->visible = NULL;
     XGetWindowAttributes(dpy, win, &xwa);
     si->cmap = xwa.colormap;
     si->width = xwa.width;
@@ -1463,6 +1484,14 @@ init_sonar(Display *dpy, Window win)
                                        dpy, si->cmap);
     si->grid = XCreateGC (dpy, win, GCForeground, &gcv);
 
+    /* Install the clip mask... */
+    {
+      Pixmap mask = scope_mask (dpy, win, si);
+      XSetClipMask(dpy, si->text, mask);
+      XSetClipMask(dpy, si->erase, mask);
+      XFreePixmap (dpy, mask); /* it's been copied into the GCs */
+    }
+
     /* Compute pixel values for fading text on the display */
 
     XParseColor(dpy, si->cmap, 
@@ -1773,13 +1802,13 @@ Sonar(sonar_info *si, Bogie *bl)
     Bogie *bp, *prev;
     int i;
 
-    /* Check for expired tagets and remove them from the visable list */
+    /* Check for expired tagets and remove them from the visible list */
 
     prev = NULL;
-    for (bp = si->visable; bp != NULL; bp = (bp ? bp->next : 0)) {
+    for (bp = si->visible; bp != NULL; bp = (bp ? bp->next : 0)) {
 
        /*
-        * Remove it from the visable list if it's expired or we have
+        * Remove it from the visible list if it's expired or we have
         * a new target with the same name.
         */
 
@@ -1790,7 +1819,7 @@ Sonar(sonar_info *si, Bogie *bl)
            DrawBogie(si, 0, bp->name, bp->tick,
                      bp->distance, bp->ttl, bp->age);
            if (prev == NULL)
-               si->visable = bp->next;
+               si->visible = bp->next;
            else
                prev->next = bp->next;
            freeBogie(bp);
@@ -1820,17 +1849,17 @@ Sonar(sonar_info *si, Bogie *bl)
                (4 * 64));
     }
 
-    /* Move the new targets to the visable list */
+    /* Move the new targets to the visible list */
 
     for (bp = bl; bp != (Bogie *) 0; bp = bl) {
        bl = bl->next;
-       bp->next = si->visable;
-       si->visable = bp;
+       bp->next = si->visible;
+       si->visible = bp;
     }
 
-    /* Draw the visable targets */
+    /* Draw the visible targets */
 
-    for (bp = si->visable; bp != NULL; bp = bp->next) {
+    for (bp = si->visible; bp != NULL; bp = bp->next) {
        if (bp->age < bp->ttl)          /* grins */
           DrawBogie(si, 1, bp->name, bp->tick, bp->distance, bp->ttl,bp->age);
     }
index d46fcb6f9505d27b4ae25e6d4fac178678127c10..523fcc436af2b20c28bda14a474239071ee575bd 100644 (file)
@@ -26,7 +26,7 @@
 #define END_ARC 23040
 
 struct info {
-    Bool writable; /* Is the screen writable */
+/*    Bool writable; / * Is the screen writable */
     double xspeed; /* A factor to modify the horizontal movement */
     double yspeed; /* A factor to modify vertical movement */
     double xamplitude;
@@ -432,14 +432,17 @@ screenhack (Display *display, Window window)
     fgc = XCreateGC (display, b, GCForeground, &gcv);
     gcv.foreground = get_pixel_resource("background", "Background", display, xgwa.colormap);
     bgc = XCreateGC (display, b, GCForeground, &gcv);
-    make_uniform_colormap (display, xgwa.visual, xgwa.colormap, colors, &ncolors, True, &info->writable, True);
+    {
+      Bool writable_p = False;
+    make_uniform_colormap (display, xgwa.visual, xgwa.colormap, colors, &ncolors, True, &writable_p, True);
+    }
 
     if (ba) XFillRectangle (display, ba, bgc, 0, 0, xgwa.width, xgwa.height);
 
         /* info is a structure holding all the random pieces of information I may want to 
            pass to my baby functions -- much of it I may never use, but it is nice to
            have around just in case I want it to make a funky function funkier */
-    info->writable = get_boolean_resource ("cycle", "Boolean");
+/*    info->writable = get_boolean_resource ("cycle", "Boolean"); */
     info->xspeed = get_float_resource("xspeed" , "Float");
     info->yspeed = get_float_resource("yspeed" , "Float");
     info->xamplitude = get_float_resource("xamplitude", "Float");
@@ -663,7 +666,7 @@ screenhack (Display *display, Window window)
         else
             current_time = current_time + info->speed;
         screenhack_handle_events(display);
-        if (!info->writable)
+/*        if (!info->writable) */
             usleep(10000);
     }   /*  End the while loop! */
     free(info);
index 3b390f039a16783bae5754b60c226538434865f3..84e63f698ec881387bf39148d9103e3032a3ac8d 100644 (file)
@@ -1,5 +1,5 @@
 /* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules.
- * xscreensaver, Copyright (c) 1997-2002 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1997-2003 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -37,7 +37,11 @@ ERROR!  Sorry, xlockmore.h requires ANSI C (gcc, for example.)
   extern GLXContext *init_GL (ModeInfo *);
   extern void clear_gl_error (void);
   extern void check_gl_error (const char *type);
+
   extern void do_fps (ModeInfo *);
+  extern GLfloat fps_1 (ModeInfo *);
+  extern void    fps_2 (ModeInfo *);
+
 # define FreeAllGL(dpy) /* */
 #endif /* !USE_GL */
 
index 09fe155f846964b50d5f069446651538b5e69ddd..dacf312c6549e3e5d9d7449f736aeee69f3dc695 100644 (file)
  *
  * The movie people distribute their own Windows/Mac screensaver that does
  * a similar thing, so I wrote one for Unix.  However, that version (the
- * Windows/Mac version at http://www.whatisthematrix.com/) doesn't match my
- * memory of what the screens in the movie looked like, so my `xmatrix'
- * does things differently.
+ * Windows/Mac version at http://www.whatisthematrix.com/) doesn't match
+ * what the computer screens in the movie looked like, so my `xmatrix' does
+ * things differently.
+ *
+ * See also my `glmatrix' program, which does a 3D rendering of the similar
+ * effect that appeared in the title sequence of the movies.
  *
  *
  *     ==========================================================
  *         washed out.  They also definitely scrolled a
  *         character at a time, not a pixel at a time.
  *
+ *         And keep in mind that this program emulates the
+ *         behavior of the computer screens that were visible
+ *         in the movies -- not the behavior of the effects in
+ *         the title sequences.
+ *
  *     ==========================================================
  *
  */
 #include <X11/Xutil.h>
 
 #if defined(HAVE_GDK_PIXBUF) || defined(HAVE_XPM)
-# include "images/matrix0.xpm"
 # include "images/matrix1.xpm"
 # include "images/matrix2.xpm"
-# include "images/matrix0b.xpm"
 # include "images/matrix1b.xpm"
 # include "images/matrix2b.xpm"
 #endif
 
-#include "images/matrix0.xbm"
 #include "images/matrix1.xbm"
 #include "images/matrix2.xbm"
-#include "images/matrix0b.xbm"
 #include "images/matrix1b.xbm"
 #include "images/matrix2b.xbm"
 
 #define CHAR_COLS 16
 #define CHAR_ROWS 13
 #define CHAR_MAPS 3
-#define FADE_MAP  0
 #define PLAIN_MAP 1
 #define GLOW_MAP  2
 
@@ -113,17 +116,15 @@ static unsigned char char_map[256] = {
 
 #define CURSOR_GLYPH 97
 
-typedef enum { TRACE0, TRACE1, TRACE2,
-               KNOCK0, KNOCK1, KNOCK2, KNOCK3,
-               KNOCK4, KNOCK5, KNOCK6, KNOCK7,
-               NMAP0, NMAP1,
-               MATRIX, DNA, BINARY, HEX } m_mode;
+typedef enum { TRACEA1, TRACEA2,
+               TRACEB1, TRACEB2, SYSTEMFAILURE,
+               KNOCK, NMAP, MATRIX, DNA, BINARY, DEC, HEX } m_mode;
 
 typedef struct {
   Display *dpy;
   Window window;
   XWindowAttributes xgwa;
-  GC draw_gc, erase_gc;
+  GC draw_gc, erase_gc, scratch_gc;
   int grid_width, grid_height;
   int char_width, char_height;
   m_cell *cells;
@@ -143,6 +144,7 @@ typedef struct {
   int nglyphs;
   int *glyph_map;
 
+  unsigned long colors[5];
 } m_state;
 
 
@@ -154,8 +156,7 @@ load_images_1 (m_state *state, int which)
       state->xgwa.depth > 1)
     {
       char **bits =
-        (which == 0 ? (state->small_p ? matrix0b_xpm : matrix0_xpm) :
-         which == 1 ? (state->small_p ? matrix1b_xpm : matrix1_xpm) :
+        (which == 1 ? (state->small_p ? matrix1b_xpm : matrix1_xpm) :
          (state->small_p ? matrix2b_xpm : matrix2_xpm));
 
       state->images[which] =
@@ -166,16 +167,15 @@ load_images_1 (m_state *state, int which)
 #endif /* !HAVE_XPM && !HAVE_GDK_PIXBUF */
     {
       unsigned long fg, bg;
-      state->image_width  = (state->small_p ? matrix0b_width :matrix0_width);
-      state->image_height = (state->small_p ? matrix0b_height:matrix0_height);
+      state->image_width  = (state->small_p ? matrix1b_width :matrix1_width);
+      state->image_height = (state->small_p ? matrix1b_height:matrix1_height);
       fg = get_pixel_resource("foreground", "Foreground",
                               state->dpy, state->xgwa.colormap);
       bg = get_pixel_resource("background", "Background",
                               state->dpy, state->xgwa.colormap);
       state->images[which] =
         XCreatePixmapFromBitmapData (state->dpy, state->window, (char *)
-                (which == 0 ? (state->small_p ? matrix0b_bits :matrix0_bits) :
-                 which == 1 ? (state->small_p ? matrix1b_bits :matrix1_bits) :
+                (which == 1 ? (state->small_p ? matrix1b_bits :matrix1_bits) :
                               (state->small_p ? matrix2b_bits :matrix2_bits)),
                                      state->image_width, state->image_height,
                                      bg, fg, state->xgwa.depth);
@@ -186,7 +186,6 @@ load_images_1 (m_state *state, int which)
 static void
 load_images (m_state *state)
 {
-  load_images_1 (state, 0);
   load_images_1 (state, 1);
   load_images_1 (state, 2);
 }
@@ -222,7 +221,6 @@ flip_images_1 (m_state *state, int which)
 static void
 flip_images (m_state *state)
 {
-  flip_images_1 (state, 0);
   flip_images_1 (state, 1);
   flip_images_1 (state, 2);
 }
@@ -296,6 +294,7 @@ init_matrix (Display *dpy, Window window)
 {
   XGCValues gcv;
   char *insert, *mode;
+  int i;
   m_state *state = (m_state *) calloc (sizeof(*state), 1);
 
   state->dpy = dpy;
@@ -323,6 +322,26 @@ init_matrix (Display *dpy, Window window)
   state->erase_gc = XCreateGC (state->dpy, state->window,
                                GCForeground|GCBackground, &gcv);
 
+  state->scratch_gc = XCreateGC (state->dpy, state->window, 0, &gcv);
+
+  /* Allocate colors for SYSTEM FAILURE box */
+  {
+    XColor boxcolors[] = {
+      { 0, 0x0808, 0x1E1E, 0x0808, DoRed|DoGreen|DoBlue, 0 },
+      { 0, 0x5A5A, 0xD2D2, 0x5A5A, DoRed|DoGreen|DoBlue, 0 },
+      { 0, 0xE0E0, 0xF7F7, 0xE0E0, DoRed|DoGreen|DoBlue, 0 },
+      { 0, 0x5A5A, 0xD2D2, 0x5A5A, DoRed|DoGreen|DoBlue, 0 },
+      { 0, 0x0808, 0x1E1E, 0x0808, DoRed|DoGreen|DoBlue, 0 },
+    };
+  for (i = 0; i < countof(boxcolors); i++)
+    {
+      if (XAllocColor (state->dpy, state->xgwa.colormap, &boxcolors[i]))
+        state->colors[i] = boxcolors[i].pixel;
+      else
+        state->colors[i] = gcv.foreground;  /* default black */
+    }
+  }
+
   state->char_width =  state->image_width  / CHAR_COLS;
   state->char_height = state->image_height / CHAR_ROWS;
 
@@ -378,16 +397,20 @@ init_matrix (Display *dpy, Window window)
 
   mode = get_string_resource ("mode", "Mode");
   if (mode && !strcasecmp(mode, "trace"))
-    state->mode = TRACE0;
+    state->mode = (((random() % 3) == 0) ? TRACEB1 : TRACEA1);
   else if (mode && !strcasecmp(mode, "crack"))
-    state->mode = NMAP0;
+    state->mode = NMAP;
   else if (mode && !strcasecmp(mode, "dna"))
     state->mode = DNA;
-  else if (mode && !strcasecmp(mode, "binary"))
+  else if (mode && (!strcasecmp(mode, "bin") ||
+                    !strcasecmp(mode, "binary")))
     state->mode = BINARY;
   else if (mode && (!strcasecmp(mode, "hex") ||
                     !strcasecmp(mode, "hexadecimal")))
     state->mode = HEX;
+  else if (mode && (!strcasecmp(mode, "dec") ||
+                    !strcasecmp(mode, "decimal")))
+    state->mode = DEC;
   else if (!mode || !*mode || !strcasecmp(mode, "matrix"))
     state->mode = MATRIX;
   else
@@ -398,34 +421,35 @@ init_matrix (Display *dpy, Window window)
       state->mode = MATRIX;
     }
 
-  if (state->mode == DNA)
+  switch (state->mode)
     {
+    case DNA:
       state->glyph_map = dna_encoding;
       state->nglyphs = countof(dna_encoding);
-    }
-  else if (state->mode == BINARY)
-    {
+      break;
+    case BINARY:
       state->glyph_map = binary_encoding;
       state->nglyphs = countof(binary_encoding);
-    }
-  else if (state->mode == HEX)
-    {
-      state->glyph_map = hex_encoding;
-      state->nglyphs = countof(hex_encoding);
-    }
-  else if (state->mode == HEX)
-    {
+      break;
+    case DEC:
+      state->glyph_map = decimal_encoding;
+      state->nglyphs = countof(decimal_encoding);
+      break;
+    case HEX:
       state->glyph_map = hex_encoding;
       state->nglyphs = countof(hex_encoding);
-    }
-  else if (state->mode == TRACE0)
-    init_trace (state);
-  else if (state->mode == NMAP0)
-    ;
-  else
-    {
+      break;
+    case TRACEA1: case TRACEB1:
+      init_trace (state);
+      break;
+    case NMAP:
+      break;
+    case MATRIX:
       flip_images (state);
       init_spinners (state);
+      break;
+    default:
+      abort();
     }
 
   return state;
@@ -464,7 +488,7 @@ insert_glyph (m_state *state, int glyph, int x, int y)
   if (!to->glyph)
     ;
   else if (bottom_feeder_p)
-    to->glow = 1 + (random() % 2);
+    to->glow = 1 + (random() % (state->tracing ? 4 : 2));
   else
     to->glow = 0;
 }
@@ -477,7 +501,8 @@ feed_matrix (m_state *state)
 
   switch (state->mode)
     {
-    case TRACE2: case MATRIX: case DNA: case BINARY: case HEX:
+    case TRACEA2: case TRACEB2:
+    case MATRIX: case DNA: case BINARY: case DEC: case HEX:
       break;
     default:
       return;
@@ -529,7 +554,7 @@ redraw_cells (m_state *state, Bool active)
         if (cell->glyph)
           count++;
 
-        if (state->mode == TRACE2 && active)
+        if ((state->mode == TRACEA2 || state->mode == TRACEB2) && active)
           {
             int xx = x % strlen(state->tracing);
             Bool dead_p = state->tracing[xx] > 0;
@@ -562,8 +587,7 @@ redraw_cells (m_state *state, Bool active)
             int g = (cell == state->cursor ? CURSOR_GLYPH : cell->glyph);
             int cx = (g - 1) % CHAR_COLS;
             int cy = (g - 1) / CHAR_COLS;
-            int map = ((cell->glow > 0 || cell->spinner) ? GLOW_MAP :
-                       (cell->glow < 0) ? FADE_MAP :
+            int map = ((cell->glow != 0 || cell->spinner) ? GLOW_MAP :
                        PLAIN_MAP);
 
             XCopyArea (state->dpy, state->images[map],
@@ -584,12 +608,7 @@ redraw_cells (m_state *state, Bool active)
             cell->changed = 1;
           }
         else if (cell->glow < 0)
-          {
-            cell->glow++;
-            if (cell->glow == 0)
-              cell->glyph = 0;
-            cell->changed = 1;
-          }
+          abort();
 
         if (cell->spinner && active)
           {
@@ -684,7 +703,7 @@ handle_events (m_state *state)
           KeySym keysym;
           char c = 0;
           XLookupString (&event.xkey, &c, 1, &keysym, 0);
-          if (c == '0')
+          if (c == '0' && !state->tracing)
             {
               drain_matrix (state);
               return;
@@ -705,6 +724,38 @@ handle_events (m_state *state)
               else
                 return;
             }
+          else if (c == '[' || c == '(' || c == '{')
+            {
+              state->insert_top_p    = True;
+              state->insert_bottom_p = False;
+              return;
+            }
+          else if (c == ']' || c == ')' || c == '}')
+            {
+              state->insert_top_p    = False;
+              state->insert_bottom_p = True;
+              return;
+            }
+          else if (c == '\\' || c == '|')
+            {
+              state->insert_top_p    = True;
+              state->insert_bottom_p = True;
+              return;
+            }
+          else if ((c == 't' || c == 'T') && state->mode == MATRIX)
+            {
+              state->mode = (c == 't' ? TRACEA1 : TRACEB1);
+              flip_images (state);
+              init_trace (state);
+              return;
+            }
+          else if ((c == 'c' || c == 'k') && state->mode == MATRIX)
+            {
+              drain_matrix (state);
+              state->mode = (c == 'c' ? NMAP : KNOCK);
+              flip_images (state);
+              return;
+            }
         }
 
       screenhack_handle_event (state->dpy, &event);
@@ -765,6 +816,10 @@ hack_text_1 (m_state *state,
   int y = *yP;
   int i = state->grid_width * y + x;
   Bool glow_p = False;
+  int long_delay_usecs = 1000000;
+
+  if (long_delay == -1)
+    long_delay = 0, long_delay_usecs /= 6;
 
   if (y >= state->grid_height-1) return;
 
@@ -775,8 +830,10 @@ hack_text_1 (m_state *state,
 
       long_delay = done_p;
               
-      if (*s == '\n')
+      if (*s == '\n' || x >= state->grid_width - 1)
         {
+          if (*s != '\n')
+            s--;
           x = 0;
           y++;
           i = state->grid_width * y + x;
@@ -824,7 +881,7 @@ hack_text_1 (m_state *state,
               cell->glyph = char_map[(unsigned char) *s] + 1;
               if (*s == ' ' || *s == '\t') cell->glyph = 0;
               cell->changed = 1;
-              cell->glow = (glow_p ? 8 : 0);
+              cell->glow = (glow_p ? 100 : 0);
               if (visible_cursor)
                 {
                   m_cell *next = &state->cells[i + 1];
@@ -849,7 +906,7 @@ hack_text_1 (m_state *state,
             }
           else
             if (long_delay)
-              matrix_usleep (state, 1000000);
+              matrix_usleep (state, long_delay_usecs);
             else
               usleep (20000);
         }
@@ -861,164 +918,258 @@ hack_text_1 (m_state *state,
 
 
 static void
-hack_text (m_state *state)
+zero_cells (m_state *state)
 {
   int i;
-  int x = 0;
-  int y = 0;
-  const char *s;
+  for (i = 0; i < state->grid_height * state->grid_width; i++)
+    {
+      m_cell *cell = &state->cells[i];
+      cell->changed = (cell->glyph != 0);
+      cell->glyph   = 0;
+      cell->glow    = 0;
+      cell->spinner = 0;
+    }
+}
+
+
+static void
+hack_text (m_state *state)
+{
   Bool typing_delay = False;
   Bool transmit_delay = False;
   Bool long_delay = False;
   Bool visible_cursor = False;
+
   switch (state->mode)
     {
-    case TRACE0: if (state->grid_width >= 52)
-                   s = "Call trans opt: received. 2-19-98 13:24:18 REC:Log>";
-                 else
-                   s = "Call trans opt: received.\n2-19-98 13:24:18 REC:Log>";
-                 transmit_delay = True;
-                 visible_cursor = True;
-                 break;
-    case TRACE1: s = "Trace program: running";
-                 transmit_delay = True;
-                 visible_cursor = True;
-                 break;
-    case KNOCK0: s = "Wake up, Neo..."; break;
-    case KNOCK1: s = ""; break;
-    case KNOCK2: s = "The Matrix has you..."; typing_delay = True; break;
-    case KNOCK3: s = ""; break;
-    case KNOCK4: s = "Follow the white rabbit."; typing_delay = True; break;
-    case KNOCK5: s = ""; break;
-    case KNOCK6: s = "Knock, knock, Neo."; break;
-    case KNOCK7:
-    case NMAP0:
-    case NMAP1:  s = ""; break;
-
-    default: abort(); break;
-    }
+    case KNOCK:
+      {
+        const char *blocks[] = {
+          "Wake up, Neo...",
+          "The Matrix has you...",
+          "Follow the white rabbit.",
+          " ",
+          "Knock, knock, Neo."
+        };
+        int nblocks = countof(blocks);
+        int j;
+        typing_delay = True;
+        transmit_delay = False;
+        long_delay = False;
+        visible_cursor = True;
+        for (j = 0; j < nblocks; j++)
+          {
+            int x = 3;
+            int y = 2;
+            const char *s = blocks[j];
+            if (!s[0] || !s[1]) typing_delay = False;
+            zero_cells (state);
+            hack_text_1 (state, &x, &y, s,
+                         typing_delay, transmit_delay, -1,
+                         visible_cursor, True);
+            matrix_usleep (state, 2000000);
+          }
+      }
+      break;
 
-  for (i = 0; i < state->grid_height * state->grid_width; i++)
-    {
-      m_cell *cell = &state->cells[i];
-      cell->changed = (cell->glyph != 0);
-      cell->glyph = 0;
-    }
+    case TRACEA1: case TRACEB1:
+      {
+        const char *blocks[10];
+        int j, n = 0;
+
+        if (state->mode == TRACEA1)
+          blocks[n++] =
+            (state->grid_width >= 52
+             ?  "Call trans opt: received. 2-19-98 13:24:18 REC:Log>"
+             : "Call trans opt: received.\n2-19-98 13:24:18 REC:Log>");
+        else
+          blocks[n++] =
+            (state->grid_width >= 52
+             ?  "Call trans opt: received. 9-18-99 14:32:21 REC:Log>"
+             : "Call trans opt: received.\n9-18-99 14:32:21 REC:Log>");
+
+        if (state->mode == TRACEB1)
+          blocks[n++] = "WARNING: carrier anomaly";
+        blocks[n++] = "Trace program: running";
+
+        typing_delay = False;
+        transmit_delay = True;
+        long_delay = True;
+        visible_cursor = True;
+        for (j = 0; j < n; j++)
+          {
+            const char *s = blocks[j];
+            int x = 0;
+            int y = 0;
+            zero_cells (state);
+            hack_text_1 (state, &x, &y, s,
+                         typing_delay, transmit_delay, long_delay,
+                         visible_cursor, True);
+          }
+        matrix_usleep (state, 1000000);
+      }
+      break;
 
-  if (state->mode == NMAP0)
-    {
-      /* Note that what Trinity is using here is moderately accurate:
-         She runs nmap (http://www.insecure.org/nmap/) then breaks in
-         with a (hypothetical) program called "sshnuke" that exploits
-         the (very real) SSHv1 CRC32 compensation attack detector bug
-         (http://staff.washington.edu/dittrich/misc/ssh-analysis.txt).
+    case SYSTEMFAILURE:
+      {
+        const char *s = "SYSTEM FAILURE";
+        int i;
+        float cx = ((int)state->grid_width - (int)strlen(s)) / 2 - 0.5;
+        float cy = (state->grid_height / 2) - 1.3;
+        int x, y;
 
-         The command syntax of the power grid control software looks a
-         lot like Cisco IOS to me.  (IOS is a descendant of VMS.)
-       */
-      const char *blocks[] = {
-        "# ",
+        if (cy < 0) cy = 0;
+        if (cx < 0) cx = 0;
 
-        "\001nmap 10.2.2.2\n",
-        "Starting nmap V. 2.54BETA25\n"
+        XFillRectangle (state->dpy, state->window, state->erase_gc,
+                        cx * state->char_width,
+                        cy * state->char_height,
+                        (strlen(s) + 1) * state->char_width,
+                        state->char_height * 1.6);
 
-        "\010", "\010", "\010",
+        for (i = -2; i < 3; i++)
+          {
+            XGCValues gcv;
+            gcv.foreground = state->colors[i + 2];
+            XChangeGC (state->dpy, state->scratch_gc, GCForeground, &gcv);
+            XDrawRectangle (state->dpy, state->window, state->scratch_gc,
+                            cx * state->char_width - i,
+                            cy * state->char_height - i,
+                            (strlen(s) + 1) * state->char_width + (2 * i),
+                            (state->char_height * 1.6) + (2 * i));
+          }
 
-        "Insufficient responses for TCP sequencing (3), OS detection "
-        "may be less\n"
-        "accurate\n"
-        "Interesting ports on 10.2.2.2:\n"
-        "(The 1538 ports scanned but not shown below are in state: filtered)\n"
-        "Port       state       service\n"
-        "22/tcp     open        ssh\n"
-        "\n"
-        "No exact OS matches for host\n"
-        "\n"
-        "Nmap run completed -- 1 IP address (1 host up) scanned\n"
-        "# ",
+        /* If we don't clear these out, part of the box may get overwritten */
+        for (i = 0; i < state->grid_height * state->grid_width; i++)
+          {
+            m_cell *cell = &state->cells[i];
+            cell->changed = 0;
+          }
 
-        "\001sshnuke 10.2.2.2 -rootpw=\"Z1ON0101\"\n",
+        x = ((int)state->grid_width - (int)strlen(s)) / 2;
+        y = (state->grid_height / 2) - 1;
+        if (y < 0) y = 0;
+        if (x < 0) x = 0;
+        hack_text_1 (state, &x, &y, s,
+                     typing_delay, transmit_delay, long_delay,
+                     visible_cursor, False);
+      }
+    break;
 
-        "Connecting to 10.2.2.2:ssh ... ",
+    case NMAP:
+      {
+        /* Note that what Trinity is using here is moderately accurate:
+           She runs nmap (http://www.insecure.org/nmap/) then breaks in
+           with a (hypothetical) program called "sshnuke" that exploits
+           the (very real) SSHv1 CRC32 compensation attack detector bug
+           (http://staff.washington.edu/dittrich/misc/ssh-analysis.txt).
 
-        "successful.\n"
-        "Attempting to exploit SSHv1 CRC32 ... ",
+           The command syntax of the power grid control software looks a
+           lot like Cisco IOS to me.  (IOS is a descendant of VMS.)
+        */
+        const char *blocks[] = {
+          "# ",
 
-        "successful.\n"
-        "Resetting root password to \"Z1ON0101\".\n",
+          "\001nmap 10.2.2.2\n",
+          "Starting nmap V. 2.54BETA25\n"
 
-        "System open: Access Level <9>\n"
-        "# ",
+          "\010", "\010", "\010",
 
-        "\001ssh 10.2.2.2 -l root\n",
+          "Insufficient responses for TCP sequencing (3), OS detection "
+          "may be less accurate\n"
+          "Interesting ports on 10.2.2.2:\n"
+          "(The 1538 ports scanned but not shown below are in state: "
+          "filtered)\n"
+          "Port       state       service\n"
+          "22/tcp     open        ssh\n"
+          "\n"
+          "No exact OS matches for host\n"
+          "\n"
+          "Nmap run completed -- 1 IP address (1 host up) scanned\n"
+          "# ",
 
-        "root@10.2.2.2's password: ",
+          "\001sshnuke 10.2.2.2 -rootpw=\"Z1ON0101\"\n",
 
-        "\001\010\010\010\010\010\010\010\010\n",
+          "Connecting to 10.2.2.2:ssh ... ",
 
-        "\n"
-        "FFF-CONTROL> ",
+          "successful.\n"
+          "Attempting to exploit SSHv1 CRC32 ... ",
 
-        "\001disable grid nodes 21 - 40\n",
+          "successful.\n"
+          "Resetting root password to \"Z1ON0101\".\n",
 
-        "Warning: Disabling nodes 21-40 will disconnect sector 11 (27 nodes)\n"
-        "\n"
-        "\002         ARE YOU SURE? (y/n) ",
+          "System open: Access Level <9>\n"
+          "# ",
 
-        "\001\010\010y\n",
-        "\n"
-      };
+          "\001ssh 10.2.2.2 -l root\n",
 
-      int nblocks = countof(blocks);
-      int y = state->grid_height - 2;
-      int j;
+          "root@10.2.2.2's password: ",
 
-      visible_cursor = True;
-      x = 0;
-      for (j = 0; j < nblocks; j++)
-        {
-          const char *s = blocks[j];
-          typing_delay = (*s == '\001');
-          if (typing_delay) s++;
-
-          long_delay = False;
-          hack_text_1 (state, &x, &y, s,
-                       typing_delay, transmit_delay, long_delay,
-                       visible_cursor, True);
-        }
+          "\001\010\010\010\010\010\010\010\010\n",
 
-      typing_delay = False;
-      long_delay = False;
-      for (j = 21; j <= 40; j++)
-        {
-          char buf[100];
-          sprintf (buf, "Grid Node %d offline...\n", j);
-          hack_text_1 (state, &x, &y, buf,
-                       typing_delay, transmit_delay, long_delay,
-                       visible_cursor, True);
+          "\n"
+          "RRF-CONTROL> ",
 
-        }
-      hack_text_1 (state, &x, &y, "\nFFF-CONTROL> ",
-                   typing_delay, transmit_delay, long_delay,
-                   visible_cursor, True);
-      return;
-    }
-  else
-    {
-      if (state->mode == TRACE0 || state->mode == TRACE1)
-        x = y = 0;
-      else
-        {
-          x = ((int)state->grid_width - (int)strlen(s)) / 2;
-          y = (state->grid_height / 2) - 1;
-          if (y < 0) y = 0;
-          if (x < 0) x = 0;
-        }
+          "\001disable grid nodes 21 - 40\n",
 
-      hack_text_1 (state, &x, &y, s,
-                   typing_delay, transmit_delay, long_delay,
-                   visible_cursor, False);
-    }
+          "\002Warning: Disabling nodes 21-40 will disconnect sector 11 "
+          "(27 nodes)\n"
+          "\n"
+          "\002         ARE YOU SURE? (y/n) ",
+
+          "\001\010\010y\n",
+          "\n"
+        };
+
+        int nblocks = countof(blocks);
+        int y = state->grid_height - 2;
+        int x, j;
+
+        visible_cursor = True;
+        x = 0;
+        zero_cells (state);
+        for (j = 0; j < nblocks; j++)
+          {
+            const char *s = blocks[j];
+            typing_delay = (*s == '\001');
+            if (typing_delay) s++;
+
+            long_delay = False;
+            hack_text_1 (state, &x, &y, s,
+                         typing_delay, transmit_delay, long_delay,
+                         visible_cursor, True);
+          }
+
+        typing_delay = False;
+        long_delay = False;
+        for (j = 21; j <= 40; j++)
+          {
+            char buf[100];
+            sprintf (buf, "\002Grid Node %d offline...\n", j);
+            hack_text_1 (state, &x, &y, buf,
+                         typing_delay, transmit_delay, -1,
+                         visible_cursor, True);
+
+          }
+        long_delay = True;
+        hack_text_1 (state, &x, &y, "\nRRF-CONTROL> ",
+                     typing_delay, transmit_delay, long_delay,
+                     visible_cursor, True);
+
+        /* De-glow all cells before draining them... */
+        for (j = 0; j < state->grid_height * state->grid_width; j++)
+          {
+            m_cell *cell = &state->cells[j];
+            cell->changed = (cell->glow != 0);
+            cell->glow = 0;
+          }
+      }
+    break;
+
+  default:
+    abort();
+    break;
+  }
 }
 
 
@@ -1074,17 +1225,14 @@ roll_state (m_state *state)
   int delay = 0;
   switch (state->mode)
     {
-    case TRACE0:
-      delay = 3;
-      state->mode = TRACE1;
+    case TRACEA1:
+      state->mode = TRACEA2;
       break;
-
-    case TRACE1:
-      delay = 2;
-      state->mode = TRACE2;
+    case TRACEB1:
+      state->mode = TRACEB2;
       break;
 
-    case TRACE2:
+    case TRACEA2:
       {
         Bool any = False;
         int i;
@@ -1102,7 +1250,7 @@ roll_state (m_state *state)
             free (state->tracing);
             state->tracing = 0;
           }
-        else if ((random() % 10) == 0)
+        else if ((random() % 20) == 0)  /* how fast numbers are discovered */
           {
             int x = random() % strlen(state->tracing);
             if (state->tracing[x] < 0)
@@ -1111,19 +1259,44 @@ roll_state (m_state *state)
         break;
       }
 
-    case KNOCK0: delay = 1; state->mode++; break; /* wake */
-    case KNOCK1: delay = 4; state->mode++; break;
-    case KNOCK2: delay = 2; state->mode++; break; /* has */
-    case KNOCK3: delay = 4; state->mode++; break;
-    case KNOCK4: delay = 2; state->mode++; break; /* rabbit */
-    case KNOCK5: delay = 4; state->mode++; break;
-    case KNOCK6: delay = 4; state->mode++; break; /* knock */
+    case TRACEB2:
+      {
+        /* reversed logic from TRACEA2 */
+        Bool any = False;
+        int i;
+        for (i = 0; i < strlen(state->tracing); i++)
+          if (state->tracing[i] > 0) any = True;
+
+        if ((random() % 15) == 0) {
+          if (any)
+            state->mode = SYSTEMFAILURE;
+          else
+            {
+              int x = random() % strlen(state->tracing);
+              if (state->tracing[x] < 0)
+                state->tracing[x] = -state->tracing[x];
+            }
+        }
+        break;
+      }
 
-    case NMAP0:  delay = 4; state->mode++; break; /* knock */
+    case SYSTEMFAILURE:
+      XSync (state->dpy, False);
+      matrix_usleep (state, 6000000);
+      state->mode = MATRIX;
+      state->glyph_map = matrix_encoding;
+      state->nglyphs = countof(matrix_encoding);
+      flip_images (state);
+      drain_matrix (state);
+      matrix_usleep (state, 2000000);
+      if (state->tracing) {
+        free (state->tracing);
+        state->tracing = 0;
+      }
+      break;
 
-    case KNOCK7:
-      delay = 4;
-    case NMAP1:
+    case KNOCK:
+    case NMAP:
       state->mode = MATRIX;
       state->glyph_map = matrix_encoding;
       state->nglyphs = countof(matrix_encoding);
@@ -1135,15 +1308,15 @@ roll_state (m_state *state)
         {
           drain_matrix (state);
           if (! (random() % 5))
-            state->mode = NMAP0;
+            state->mode = NMAP;
           else
-            state->mode = KNOCK0;
+            state->mode = KNOCK;
 
           flip_images (state);
         }
       break;
 
-    case DNA: case BINARY: case HEX:
+    case DNA: case BINARY: case DEC: case HEX:
       break;
 
     default:
@@ -1163,13 +1336,12 @@ hack_matrix (m_state *state)
 
   switch (state->mode)
     {
-    case TRACE0: case TRACE1:
-    case KNOCK0: case KNOCK1: case KNOCK2: case KNOCK3:
-    case KNOCK4: case KNOCK5: case KNOCK6: case KNOCK7:
-    case NMAP0:  case NMAP1:
+    case TRACEA1: case TRACEB1: case SYSTEMFAILURE:
+    case KNOCK: case NMAP:
       hack_text (state);
       return;
-    case TRACE2: case MATRIX: case DNA: case BINARY: case HEX:
+    case TRACEA2: case TRACEB2:
+    case MATRIX: case DNA: case BINARY: case DEC: case HEX:
       break;
     default:
       abort(); break;
@@ -1210,7 +1382,7 @@ hack_matrix (m_state *state)
       if ((random() % 4) != 0)
         f->remaining = 0;
 
-      if (state->mode == TRACE2)
+      if (state->mode == TRACEA2 || state->mode == TRACEB2)
         bottom_feeder_p = True;
       if (state->insert_top_p && state->insert_bottom_p)
         bottom_feeder_p = (random() & 1);
@@ -1223,7 +1395,7 @@ hack_matrix (m_state *state)
         f->y = -1;
     }
 
-  if (!state->mode == TRACE2 &&
+  if (!state->mode == TRACEA2 && !state->mode == TRACEB2 &&
       ! (random() % 500))
     init_spinners (state);
 }
@@ -1268,7 +1440,7 @@ char *defaults [] = {
   "*delay:                10000",
   "*insert:               both",
   "*mode:                 Matrix",
-  "*tracePhone:            (212) 555-0690",
+  "*tracePhone:            (312) 555-0690",
   "*spinners:             5",
   "*density:              75",
   "*knockKnock:                   False",
@@ -1290,6 +1462,7 @@ XrmOptionDescRec options [] = {
   { "-dna",            ".mode",                XrmoptionNoArg, "DNA" },
   { "-binary",         ".mode",                XrmoptionNoArg, "binary" },
   { "-hexadecimal",    ".mode",                XrmoptionNoArg, "hexadecimal"},
+  { "-decimal",                ".mode",                XrmoptionNoArg, "decimal"},
   { "-knock-knock",    ".knockKnock",          XrmoptionNoArg, "True" },
   { 0, 0, 0, 0 }
 };
index e646305a8dd8a28f88da039ce37258c51f0eba13..4f8bc1d1f6413323d7783d935c64665cd49b7df5 100644 (file)
@@ -12,8 +12,14 @@ xmatrix - simulates the computer displays from the movie
 [\-trace]
 [\-phone \fInumber\fP]
 .SH DESCRIPTION
-The \fIxmatrix\fP program draws dropping characters similar to the
-displays in the Wachowski brothers' film, "The Matrix".
+The \fIxmatrix\fP program draws dropping characters similar to what
+is seen on the computer monitors in the Wachowski brothers' film,
+"The Matrix".  
+
+Also see
+.BR glmatrix (1)
+for a 3D rendering of the similar effect that appeared in the title
+sequence of the movie.
 .SH OPTIONS
 .I xmatrix
 accepts the following options:
@@ -37,6 +43,10 @@ The delay between steps of the animation, in microseconds: default 10000.
 .B \-density \fIpercentage\fP
 The approximate percentage of the screen that should be filled with 
 characters at any given time.  Default 75%.
+
+When running in a window, typing \fB+\fP will increase the density and 
+typing \fB-\fP will decrease it.  Typing \fB0\fP will momentarily
+drain the screen.
 .TP 8
 .B \-top\fP | \fB\-bottom\fP | \fB\-both
 If \fB\-top\fP is specified, the characters will only drop in from the
@@ -45,11 +55,14 @@ is specified, then instead of sliding columns, the characters will appear
 as columns that grow downwards and are erased from above.  If \fB\-both\fP
 is specified, then a mixture of both styles will be used.  The default
 is \fB\-both\fP.
+
+When running in a window, typing \fB[\fP will switch to top-mode, 
+typing \fB\]\fP will switch to bottom-mode, and typing \fB\\\fP will
+switch to both-mode.
 .TP 8
 .B \-small\fP | \fB\-large
 These options specify the sizes of the characters.  The default
 is \fB\-large\fP.
-
 .TP 8
 .B \-trace
 Start off with a representation of a phone number being traced.  
@@ -58,6 +71,9 @@ When the number is finally found, display The Matrix as usual.
 .B \-phone\fP \fInumber\fP
 The phone number to trace, if \fB\-trace\fP is specified.
 .TP 8
+.B \-crack
+Start off by shutting down the power grid.
+.TP 8
 .B \-binary\fP
 Instead of displaying Matrix glyphs, only display ones and zeros.
 .TP 8
@@ -80,6 +96,7 @@ to get the default host and display number.
 to get the name of a resource file that overrides the global resources
 stored in the RESOURCE_MANAGER property.
 .SH SEE ALSO
+.BR glmatrix (1),
 .BR X (1),
 .BR xscreensaver (1)
 .SH COPYRIGHT
index 922564af25e23ce2f993436a69771b888b2998cd..c509c246dc7a6d6f0d37e6d8f39edd0559f7a3cb 100644 (file)
@@ -1,4 +1,4 @@
-# Auto-generated: Tue May 20 05:57:07 PDT 2003
+# Auto-generated: Mon Jun 23 16:14:14 PDT 2003
 driver/demo-Gtk-conf.c
 driver/demo-Gtk-support.c
 driver/demo-Gtk-widgets.c
@@ -15,6 +15,7 @@ hacks/config/atunnel.xml
 hacks/config/barcode.xml
 hacks/config/blaster.xml
 hacks/config/blitspin.xml
+hacks/config/blocktube.xml
 hacks/config/bouboule.xml
 hacks/config/bouncingcow.xml
 hacks/config/boxed.xml
@@ -33,6 +34,7 @@ hacks/config/cosmos.xml
 hacks/config/critical.xml
 hacks/config/crystal.xml
 hacks/config/cubenetic.xml
+hacks/config/cubestorm.xml
 hacks/config/cynosure.xml
 hacks/config/dangerball.xml
 hacks/config/decayscreen.xml
@@ -63,6 +65,8 @@ hacks/config/gears.xml
 hacks/config/gflux.xml
 hacks/config/glblur.xml
 hacks/config/glforestfire.xml
+hacks/config/glknots.xml
+hacks/config/glmatrix.xml
 hacks/config/glplanet.xml
 hacks/config/glslideshow.xml
 hacks/config/glsnake.xml
@@ -77,6 +81,7 @@ hacks/config/helix.xml
 hacks/config/hopalong.xml
 hacks/config/hyperball.xml
 hacks/config/hypercube.xml
+hacks/config/hypertorus.xml
 hacks/config/ifs.xml
 hacks/config/imsmap.xml
 hacks/config/interference.xml
index 8377ffcf36748ed45f262db04bb6781fecc674b4..b25565df30d36d16a63c1370cc4a3af8162f00fd 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -5917,5 +5917,9 @@ msgstr ""
 "lenses el resultado es similar a mirar a través de varios lentes "
 "superpuestos mas que un simple acercamiento. Escrito por James Macnicol."
 
+#, fuzzy
+#~ msgid "Copyright  1991-2002 %s"
+#~ msgstr "Copyright  1991-2002 %s"
+
 #~ msgid "Copyright (C) 1991-2002 %s"
 #~ msgstr "Copyright (C) 1991-2002 %s"
index e7bbffafc1bf4cd14f1009a8b97a01869d1f2595..998d5836a2b082b26785fee1064e85657fbc80ee 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -5406,5 +5406,9 @@ msgid ""
 "than just a simple zoom. Written by James Macnicol."
 msgstr ""
 
+#, fuzzy
+#~ msgid "Copyright  1991-2002 %s"
+#~ msgstr "Copyright  1991-2002 %s"
+
 #~ msgid "Copyright 息 1991-2002 %s"
 #~ msgstr "Copyright  1991-2002 %s"
index b4cc41fb5d6a1faebe146ad10112afcf20d6d4e7..ece3d8b1e2ea23d8d4a89ad2cd59679b9ef90ac7 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
@@ -5384,3 +5384,7 @@ msgid ""
 "option the result is like looking through many overlapping lenses rather "
 "than just a simple zoom. Written by James Macnicol."
 msgstr ""
+
+#, fuzzy
+#~ msgid "Copyright  1991-2002 %s"
+#~ msgstr "Copyright 1991-2002 %s"
index a1945002f2b6fd7ff9b69b848bf874c42b7c6c1d..2d33cd1507ebfb295444aae31134405a324f9570 100644 (file)
@@ -113,6 +113,7 @@ HDRS                = alpha.h colors.h fade.h grabscreen.h hsv.h resources.h \
                  yarandom.h erase.h xshm.h xdbe.h colorbars.h xscreensaver-intl.h
 STAR           = *
 LOGOS          = images/$(STAR).xpm \
+                 images/$(STAR).png \
                  images/$(STAR).gif \
                  images/$(STAR).eps
 EXTRAS         = README Makefile.in ad2c
diff --git a/utils/images/screensaver-cmndln.png b/utils/images/screensaver-cmndln.png
new file mode 100644 (file)
index 0000000..fdb8e13
Binary files /dev/null and b/utils/images/screensaver-cmndln.png differ
diff --git a/utils/images/screensaver-cmndln.xpm b/utils/images/screensaver-cmndln.xpm
deleted file mode 100644 (file)
index 1ac62dd..0000000
+++ /dev/null
@@ -1,357 +0,0 @@
-/* XPM */
-static char * screensaver_cmndln_xpm[] = {
-"24 24 330 2",
-"      c None",
-".     c #878583",
-"+     c #000000",
-"@     c #85817B",
-"#     c #D8D6CE",
-"$     c #DBD8D0",
-"%     c #DEDBD3",
-"&     c #DFDCD5",
-"*     c #E0DDD6",
-"=     c #DEDBD4",
-"-     c #DCD8D1",
-";     c #DAD7D0",
-">     c #D8D4CC",
-",     c #D4D0C9",
-"'     c #D0CDC5",
-")     c #CCC8C0",
-"!     c #C6C2BA",
-"~     c #C0BCB4",
-"{     c #B9B5AC",
-"]     c #B2AEA5",
-"^     c #ABA79E",
-"/     c #A39F96",
-"(     c #9E9A91",
-"_     c #DAD7CF",
-":     c #787B72",
-"<     c #62695D",
-"[     c #676E62",
-"}     c #686F63",
-"|     c #6C7367",
-"1     c #6E7468",
-"2     c #70766C",
-"3     c #71766C",
-"4     c #70766B",
-"5     c #6F756A",
-"6     c #6E7268",
-"7     c #6C7066",
-"8     c #666A61",
-"9     c #62675D",
-"0     c #5C6058",
-"a     c #565A51",
-"b     c #50544C",
-"c     c #4A4D46",
-"d     c #83837B",
-"e     c #98948B",
-"f     c #D9D6CE",
-"g     c #454B45",
-"h     c #444B44",
-"i     c #3A433A",
-"j     c #414941",
-"k     c #474E47",
-"l     c #4E554E",
-"m     c #505750",
-"n     c #545A54",
-"o     c #515751",
-"p     c #4D534D",
-"q     c #494E49",
-"r     c #444A44",
-"s     c #3D423D",
-"t     c #373C37",
-"u     c #2F342F",
-"v     c #898983",
-"w     c #938E85",
-"x     c #D6D2CB",
-"y     c #EEEEEE",
-"z     c #B4B4B4",
-"A     c #747874",
-"B     c #555C55",
-"C     c #5A605A",
-"D     c #5E645E",
-"E     c #606660",
-"F     c #616761",
-"G     c #616661",
-"H     c #5E635E",
-"I     c #5B605B",
-"J     c #565A56",
-"K     c #4D524D",
-"L     c #484D48",
-"M     c #414641",
-"N     c #393D39",
-"O     c #92928B",
-"P     c #8C887F",
-"Q     c #D1CDC5",
-"R     c #3A423A",
-"S     c #E8E8E8",
-"T     c #FAFAFA",
-"U     c #828782",
-"V     c #636963",
-"W     c #696F69",
-"X     c #6B716B",
-"Y     c #6E746E",
-"Z     c #6C716C",
-"`     c #6A6E6A",
-" .    c #656A65",
-"..    c #606460",
-"+.    c #4E524E",
-"@.    c #464A46",
-"#.    c #3E423E",
-"$.    c #858178",
-"%.    c #CBC8C0",
-"&.    c #EAECEA",
-"*.    c #A2A9A2",
-"=.    c #686E68",
-"-.    c #6E736E",
-";.    c #717671",
-">.    c #747974",
-",.    c #737873",
-"'.    c #707470",
-").    c #6A6F6A",
-"!.    c #656965",
-"~.    c #5C5F5C",
-"{.    c #515551",
-"].    c #4A4E4A",
-"^.    c #404540",
-"/.    c #91908A",
-"(.    c #7E7A71",
-"_.    c #C4C0B8",
-":.    c #505650",
-"<.    c #525852",
-"[.    c #646A64",
-"}.    c #6D736D",
-"|.    c #767B76",
-"1.    c #797E79",
-"2.    c #797D79",
-"3.    c #787C78",
-"4.    c #737773",
-"5.    c #6B6F6B",
-"6.    c #666966",
-"7.    c #5E615E",
-"8.    c #565956",
-"9.    c #4C4F4C",
-"0.    c #434743",
-"a.    c #8F8E88",
-"b.    c #76736A",
-"c.    c #BEB9B0",
-"d.    c #4A514A",
-"e.    c #565C56",
-"f.    c #5F655F",
-"g.    c #707570",
-"h.    c #787B78",
-"i.    c #6D716D",
-"j.    c #666A66",
-"k.    c #5D615D",
-"l.    c #555855",
-"m.    c #444744",
-"n.    c #8E8D87",
-"o.    c #706C63",
-"p.    c #B5B0A8",
-"q.    c #4C524C",
-"r.    c #565B56",
-"s.    c #686C68",
-"t.    c #727672",
-"u.    c #777A77",
-"v.    c #767976",
-"w.    c #6C706C",
-"x.    c #646764",
-"y.    c #545754",
-"z.    c #4C4E4C",
-"A.    c #8D8C85",
-"B.    c #6A665D",
-"C.    c #AEA99F",
-"D.    c #4B514B",
-"E.    c #666C66",
-"F.    c #757975",
-"G.    c #767A76",
-"H.    c #747774",
-"I.    c #6E726E",
-"J.    c #626462",
-"K.    c #595C59",
-"L.    c #525452",
-"M.    c #4B4E4B",
-"N.    c #424642",
-"O.    c #8B8A84",
-"P.    c #646057",
-"Q.    c #A4A096",
-"R.    c #484E48",
-"S.    c #535853",
-"T.    c #595E59",
-"U.    c #626662",
-"V.    c #696D69",
-"W.    c #717571",
-"X.    c #6F726F",
-"Y.    c #646864",
-"Z.    c #484C48",
-"`.    c #414441",
-" +    c #898881",
-".+    c #5E5B52",
-"++    c #9B978D",
-"@+    c #434943",
-"#+    c #555A55",
-"$+    c #636763",
-"%+    c #676B67",
-"&+    c #6B6E6B",
-"*+    c #676A67",
-"=+    c #646664",
-"-+    c #5F625F",
-";+    c #535653",
-">+    c #464846",
-",+    c #3F423F",
-"'+    c #86857E",
-")+    c #59564D",
-"!+    c #928E84",
-"~+    c #3E443E",
-"{+    c #464C46",
-"]+    c #505550",
-"^+    c #616561",
-"/+    c #616461",
-"(+    c #5A5D5A",
-"_+    c #4D504D",
-":+    c #474A47",
-"<+    c #424542",
-"[+    c #3C403C",
-"}+    c #85847C",
-"|+    c #535047",
-"1+    c #8A867B",
-"2+    c #393F39",
-"3+    c #3F453F",
-"4+    c #4F544F",
-"5+    c #585C58",
-"6+    c #5A5F5A",
-"7+    c #5C605C",
-"8+    c #5B5F5B",
-"9+    c #575A57",
-"0+    c #525552",
-"a+    c #484B48",
-"b+    c #3E413E",
-"c+    c #383C38",
-"d+    c #828079",
-"e+    c #4E4A41",
-"f+    c #908C83",
-"g+    c #272E27",
-"h+    c #4A4F4A",
-"i+    c #505350",
-"j+    c #515451",
-"k+    c #505450",
-"l+    c #494C49",
-"m+    c #464946",
-"n+    c #3D403D",
-"o+    c #383B38",
-"p+    c #262A26",
-"q+    c #7F7E76",
-"r+    c #4B483E",
-"s+    c #939088",
-"t+    c #999589",
-"u+    c #A29D93",
-"v+    c #A39D93",
-"w+    c #A19C91",
-"x+    c #9F9B8F",
-"y+    c #9D978D",
-"z+    c #9A958A",
-"A+    c #969186",
-"B+    c #938D83",
-"C+    c #8F8B7F",
-"D+    c #8D887C",
-"E+    c #898579",
-"F+    c #868175",
-"G+    c #837E72",
-"H+    c #817D70",
-"I+    c #7F7B6D",
-"J+    c #7D796C",
-"K+    c #959186",
-"L+    c #8D8A82",
-"M+    c #706C62",
-"N+    c #726D62",
-"O+    c #716C62",
-"P+    c #706C61",
-"Q+    c #6E6A60",
-"R+    c #6C675D",
-"S+    c #69645A",
-"T+    c #656156",
-"U+    c #615E53",
-"V+    c #5E5A50",
-"W+    c #5B584C",
-"X+    c #58554A",
-"Y+    c #565348",
-"Z+    c #545046",
-"`+    c #524E44",
-" @    c #504C42",
-".@    c #4E4A40",
-"+@    c #4D493F",
-"@@    c #78756B",
-"#@    c #6B665C",
-"$@    c #6A665C",
-"%@    c #6B675C",
-"&@    c #6A665B",
-"*@    c #68645A",
-"=@    c #666157",
-"-@    c #625F54",
-";@    c #5F5B51",
-">@    c #5D584E",
-",@    c #5B574C",
-"'@    c #58544A",
-")@    c #504D43",
-"!@    c #4F4B40",
-"~@    c #4D4A40",
-"{@    c #4C483E",
-"]@    c #21201D",
-"^@    c #4B4741",
-"/@    c #4F4D46",
-"(@    c #4E4A45",
-"_@    c #504D48",
-":@    c #53514C",
-"<@    c #514F48",
-"[@    c #4E4A46",
-"}@    c #4A4843",
-"|@    c #46433E",
-"1@    c #43413B",
-"2@    c #403D38",
-"3@    c #3C3933",
-"4@    c #383630",
-"5@    c #35332D",
-"6@    c #35332C",
-"7@    c #36342E",
-"8@    c #13120F",
-"9@    c #46443E",
-"0@    c #4E4C46",
-"a@    c #55544E",
-"b@    c #5D5B56",
-"c@    c #64625E",
-"d@    c #65635D",
-"e@    c #62605B",
-"f@    c #5F5D58",
-"g@    c #5C5A55",
-"h@    c #595752",
-"i@    c #54534D",
-"j@    c #4F4D47",
-"k@    c #484640",
-"l@    c #42403A",
-"m@    c #3F3D36",
-"n@    c #3D3B33",
-"o@    c #3E3B34",
-"                                                ",
-". + + + + + + + + + + + + + + + + + + + + + @   ",
-"+ # $ % & * * * = - ; > , ' ) ! ~ { ] ^ / ( +   ",
-"+ _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e +   ",
-"+ f 5 g h i j k l m n n n o p q r s t u v w +   ",
-"+ x 5 g y z A B C D E F G H I J K L M N O P +   ",
-"+ Q 5 R I S T U V W X Y Z `  ...J +.@.#.O $.+   ",
-"+ %.5 g &.*.Y =.-.;.>.>.,.'.).!.~.{.].^./.(.+   ",
-"+ _.5 :.<.C [.}.,.|.1.2.3.4.5.6.7.8.9.0.a.b.+   ",
-"+ c.5 d.e.f.=.g.,.|.3.3.h.A i.j.k.l.9.m.n.o.+   ",
-"+ p.5 q.r.f.s.g.t.3.2.u.v.t.w.x.~.y.z.m.A.B.+   ",
-"+ C.5 D.n H E.w.'.F.G.4.H.I.s.J.K.L.M.N.O.P.+   ",
-"+ Q.5 R.S.T.U.V.I.'.W.I.X.` Y.7.l.+.Z.`. +.++   ",
-"+ ++5 @+K #+I $+%+&+` s.*+=+-+K.;+].>+,+'+)++   ",
-"+ !+5 ~+{+]+r.k...U.U.^+/+7.(+y._+:+<+[+}+|++   ",
-"+ 1+5 2+3+R.4+J 5+6+7+8+K.9+0+9.a+0.b+c+d+e++   ",
-"+ f+5 g+2+^.@.h+4+i+j+{.k+9.l+m+<+n+o+p+q+r++   ",
-"+ s+t+u+v+u+w+x+y+z+A+B+C+D+E+F+G+H+I+J+K+r++   ",
-"+ L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@r+r++   ",
-"+ @@#@$@%@&@*@=@-@;@>@,@'@Y+Z+`+)@!@~@{@r+r++   ",
-"]@+ + ^@/@(@_@:@:@<@[@}@|@1@2@3@4@5@6@7@+ + 8@  ",
-"  + + 9@0@a@b@c@d@e@f@g@h@i@j@k@l@m@n@o@+ +     ",
-"    + + + + + + + + + + + + + + + + + + +       ",
-"                                                "};
diff --git a/utils/images/screensaver-colorselector.png b/utils/images/screensaver-colorselector.png
new file mode 100644 (file)
index 0000000..f18c86f
Binary files /dev/null and b/utils/images/screensaver-colorselector.png differ
diff --git a/utils/images/screensaver-colorselector.xpm b/utils/images/screensaver-colorselector.xpm
deleted file mode 100644 (file)
index 486c019..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-/* XPM */
-static char * screensaver_colorselector_xpm[] = {
-"24 24 223 2",
-"      c None",
-".     c #000000",
-"+     c #FEFDFD",
-"@     c #FAE2DD",
-"#     c #F2AEA1",
-"$     c #274AFF",
-"%     c #5F79FF",
-"&     c #607BFF",
-"*     c #637CFF",
-"=     c #7B90FF",
-"-     c #FCF8E9",
-";     c #FAF4DF",
-">     c #FAF5E1",
-",     c #F6EBC5",
-"'     c #F4BBAF",
-")     c #EB8672",
-"!     c #A7B5FF",
-"~     c #A8B7FF",
-"{     c #AAB8FF",
-"]     c #F5E7B8",
-"^     c #F5E8BA",
-"/     c #F5E8BC",
-"(     c #EDD37C",
-"_     c #ADBAFF",
-":     c #EDD47E",
-"<     c #E88975",
-"[     c #8590C8",
-"}     c #090600",
-"|     c #8791C8",
-"1     c #A4B0F2",
-"2     c #F9F4E0",
-"3     c #F2E6BB",
-"4     c #F1E5BB",
-"5     c #F5E8BD",
-"6     c #F6E9BD",
-"7     c #EB8773",
-"8     c #A6B3F9",
-"9     c #574F4F",
-"0     c #FDFDFC",
-"a     c #8791C6",
-"b     c #E3DFD3",
-"c     c #F6EABF",
-"d     c #F1A89A",
-"e     c #EC8773",
-"f     c #D83C1D",
-"g     c #778DFF",
-"h     c #96A2E0",
-"i     c #575050",
-"j     c #FDFAF8",
-"k     c #7A83B1",
-"l     c #D8CEAE",
-"m     c #ECD47F",
-"n     c #E7C652",
-"o     c #6D6767",
-"p     c #F9F1EA",
-"q     c #F6F2ED",
-"r     c #F2ECE5",
-"s     c #F2EDE7",
-"t     c #D7C5B2",
-"u     c #D6D6D6",
-"v     c #BCBCBC",
-"w     c #625C5B",
-"x     c #F9EEE4",
-"y     c #4F4D4A",
-"z     c #868077",
-"A     c #B6AEA3",
-"B     c #EDE2D3",
-"C     c #FBF0E0",
-"D     c #F8D39F",
-"E     c #E1D3C4",
-"F     c #E1D4C6",
-"G     c #E2D5C7",
-"H     c #CAB197",
-"I     c #9C9C9C",
-"J     c #615C5B",
-"K     c #F9F0E4",
-"L     c #746C67",
-"M     c #FEFDFC",
-"N     c #FFFEFD",
-"O     c #131210",
-"P     c #897C69",
-"Q     c #D8C3A5",
-"R     c #F5C27A",
-"S     c #CBB298",
-"T     c #F3F2F2",
-"U     c #98948F",
-"V     c #F9EFE3",
-"W     c #A09489",
-"X     c #766D68",
-"Y     c #736961",
-"Z     c #A3A3A2",
-"`     c #B3A188",
-" .    c #DAAC6D",
-"..    c #E3D6C8",
-"+.    c #E8E5E2",
-"@.    c #97938E",
-"#.    c #F6E9D8",
-"$.    c #84817A",
-"%.    c #FBF3EA",
-"&.    c #908C86",
-"*.    c #F1EDE7",
-"=.    c #7B7975",
-"-.    c #878786",
-";.    c #070000",
-">.    c #928470",
-",.    c #CEA468",
-"'.    c #E4D7C9",
-").    c #CBB39A",
-"!.    c #E2DFDC",
-"~.    c #A8A199",
-"{.    c #F0E0CE",
-"].    c #C8BFB4",
-"^.    c #D5CCBF",
-"/.    c #DFD7CD",
-"(.    c #DAD3C9",
-"_.    c #DDCFC4",
-":.    c #928C84",
-"<.    c #8F816E",
-"[.    c #CFA56A",
-"}.    c #DBCAB8",
-"|.    c #AF8A62",
-"1.    c #040000",
-"2.    c #D9D5D2",
-"3.    c #D9CABB",
-"4.    c #D7C8B8",
-"5.    c #DECFBF",
-"6.    c #D8C9B9",
-"7.    c #E3D3C2",
-"8.    c #C9BBAC",
-"9.    c #D9CEC2",
-"0.    c #7F766D",
-"a.    c #887C6A",
-"b.    c #D39B49",
-"c.    c #060100",
-"d.    c #C0BDBA",
-"e.    c #8C8782",
-"f.    c #C2B5A7",
-"g.    c #BFB4A6",
-"h.    c #B8AB9D",
-"i.    c #BAAD9E",
-"j.    c #BEB0A2",
-"k.    c #948A7F",
-"l.    c #716860",
-"m.    c #FDFCFC",
-"n.    c #F5E7E6",
-"o.    c #E0B2AD",
-"p.    c #93B48E",
-"q.    c #332C2B",
-"r.    c #5D5954",
-"s.    c #79736C",
-"t.    c #958C80",
-"u.    c #8D8379",
-"v.    c #988D82",
-"w.    c #706760",
-"x.    c #55565D",
-"y.    c #ADB0BC",
-"z.    c #94A0EB",
-"A.    c #E9C8C4",
-"B.    c #E9C9C6",
-"C.    c #EACBC7",
-"D.    c #D69B95",
-"E.    c #AACFA4",
-"F.    c #6A8166",
-"G.    c #201A1A",
-"H.    c #57514F",
-"I.    c #625C59",
-"J.    c #625A53",
-"K.    c #6B625A",
-"L.    c #585251",
-"M.    c #696764",
-"N.    c #080000",
-"O.    c #545666",
-"P.    c #BCC1E1",
-"Q.    c #8D9AEA",
-"R.    c #EACCC9",
-"S.    c #C4EFBD",
-"T.    c #ABD0A5",
-"U.    c #A3AB9C",
-"V.    c #050000",
-"W.    c #0C0303",
-"X.    c #080100",
-"Y.    c #030000",
-"Z.    c #2C2A30",
-"`.    c #545665",
-" +    c #6B6E80",
-".+    c #C5CBED",
-"++    c #8E9BEB",
-"@+    c #F6E9E7",
-"#+    c #EBCDCA",
-"$+    c #EBCFCC",
-"%+    c #D79C96",
-"&+    c #CBF5C4",
-"*+    c #BADFB4",
-"=+    c #ECE4E2",
-"-+    c #DED7D5",
-";+    c #D8D1D0",
-">+    c #E0DBD7",
-",+    c #E9E6E3",
-"'+    c #FCFBFA",
-")+    c #030500",
-"!+    c #7E8195",
-"~+    c #CACFEE",
-"{+    c #929EEB",
-"]+    c #D89E97",
-"^+    c #CCF5C6",
-"/+    c #C8EFC1",
-"(+    c #0B0505",
-"_+    c #14100F",
-":+    c #090806",
-"<+    c #000100",
-"[+    c #8B8EA3",
-"}+    c #CED3F3",
-"|+    c #7D8CE8",
-"1+    c #F0DAD7",
-"2+    c #BA554B",
-"3+    c #96EB88",
-"4+    c #97EC89",
-"5+    c #8FDF82",
-"6+    c #74B369",
-"7+    c #6A74B0",
-"8+    c #5E679A",
-"9+    c #6971A9",
-"0+    c #5B6EE2",
-"                                                ",
-"  . . . . . . . . . . . . . . . . . . . . . .   ",
-"  . + @ @ @ @ # . $ % & & * = . - ; > > > , .   ",
-"  . @ ' ' ' ' ) . % ! ! ~ ~ { . ; ] ] ^ / ( .   ",
-"  . @ ' ' ' ' ) . % ! ~ { { _ . > ] ^ / / : .   ",
-"  . @ ' ' ' ' < . & ~ [ } | 1 . 2 3 4 5 6 : .   ",
-"  . @ ' ' ' ' 7 . * 8 9 0 . a . b / / 5 c : .   ",
-"  . d ) ) ) e f . g h i j . k . l ( : m : n .   ",
-"  . . . . . . . . . . o p . . . . . . . . . .   ",
-"  . 0 q r r s t . u v w x y . . . z A B C D .   ",
-"  . r E F F G H . I . J K L M . N O . P Q R .   ",
-"  . r F F G G S . . T U V W + X M Y Z . `  ..   ",
-"  . s F G G ..S . . +.@.#.$.%.&.*.=.-.;.>.,..   ",
-"  . s G G ..'.).. . !.~.{.].^./.(._.:.;.<.[..   ",
-"  . }.S S ).).|.. 1.2.3.4.5.6.7.8.9.0.;.a.b..   ",
-"  . . . . . . . . c.d.e.f.g.h.i.j.k.l.;.. . .   ",
-"  . m.n.n.n.n.o.. p.q.r.s.t.u.k.v.w.. x.y.z..   ",
-"  . n.A.B.C.C.D.. E.F.G.H.I.J.K.L.M.N.O.P.Q..   ",
-"  . n.B.C.C.R.D.. S.T.U.V.W.N.X.Y.Z.`. +.+++.   ",
-"  . @+R.#+#+$+%+. &+*+1.=+-+;+>+,+'+)+!+~+{+.   ",
-"  . @+#+#+$+$+]+. ^+/+1.(+V._+Y.:+. <+[+}+|+.   ",
-"  . 1+D.%+%+]+2+. 3+4+4+4+5+6+. 7+7+8+9+z.0+.   ",
-"  . . . . . . . . . . . . . . . . . . . . . .   ",
-"                                                "};
diff --git a/utils/images/screensaver-diagnostic.png b/utils/images/screensaver-diagnostic.png
new file mode 100644 (file)
index 0000000..52de31a
Binary files /dev/null and b/utils/images/screensaver-diagnostic.png differ
diff --git a/utils/images/screensaver-diagnostic.xpm b/utils/images/screensaver-diagnostic.xpm
deleted file mode 100644 (file)
index d1bc0a6..0000000
+++ /dev/null
@@ -1,296 +0,0 @@
-/* XPM */
-static char * screensaver_diagnostic_xpm[] = {
-"24 24 269 2",
-"      c None",
-".     c #000000",
-"+     c #F8F8F8",
-"@     c #D8D8D8",
-"#     c #D1D1D1",
-"$     c #E0E0E0",
-"%     c #797979",
-"&     c #373737",
-"*     c #3F3F3F",
-"=     c #424242",
-"-     c #444444",
-";     c #4E4E4E",
-">     c #474747",
-",     c #464646",
-"'     c #4A4A4A",
-")     c #484848",
-"!     c #4B4B4B",
-"~     c #737373",
-"{     c #BCBCBC",
-"]     c #BABABA",
-"^     c #939393",
-"/     c #A2A2A2",
-"(     c #959595",
-"_     c #383838",
-":     c #36442C",
-"<     c #5F7751",
-"[     c #68815A",
-"}     c #758F67",
-"|     c #708A62",
-"1     c #748D64",
-"2     c #6D8660",
-"3     c #6D875E",
-"4     c #617951",
-"5     c #5C724B",
-"6     c #4F663F",
-"7     c #4B5F3A",
-"8     c #141B0E",
-"9     c #E5E5E5",
-"0     c #FAF7EC",
-"a     c #D2D2D2",
-"b     c #5A5A5A",
-"c     c #3E3E3E",
-"d     c #4E6443",
-"e     c #FBFEF6",
-"f     c #C2D9B7",
-"g     c #A0BD93",
-"h     c #98B48A",
-"i     c #9CBA8D",
-"j     c #92AE85",
-"k     c #92AF81",
-"l     c #839E72",
-"m     c #769363",
-"n     c #6D8957",
-"o     c #65814F",
-"p     c #222C1A",
-"q     c #CDCDCD",
-"r     c #E4E3E3",
-"s     c #A8A8A7",
-"t     c #748A66",
-"u     c #FAFFF4",
-"v     c #D2E2C8",
-"w     c #C6E2BA",
-"x     c #B3CFA8",
-"y     c #B7D4A9",
-"z     c #CEE1C6",
-"A     c #A4C096",
-"B     c #89A379",
-"C     c #83A06E",
-"D     c #B5C8A7",
-"E     c #88A86F",
-"F     c #293520",
-"G     c #EAEAEA",
-"H     c #696969",
-"I     c #515151",
-"J     c #141414",
-"K     c #505050",
-"L     c #454545",
-"M     c #728664",
-"N     c #DFF4D6",
-"O     c #FDFFFB",
-"P     c #E8F3E1",
-"Q     c #B2CCA8",
-"R     c #B9D4AF",
-"S     c #FCFFFA",
-"T     c #D1E2C8",
-"U     c #8AA67A",
-"V     c #89A677",
-"W     c #F8FBF5",
-"X     c #C2D2B4",
-"Y     c #26301D",
-"Z     c #E6E6E6",
-"`     c #767676",
-" .    c #626262",
-"..    c #7A7A7A",
-"+.    c #6C835E",
-"@.    c #E6F2DC",
-"#.    c #E2F0DC",
-"$.    c #FFFFFF",
-"%.    c #B1CCA6",
-"&.    c #D6E7D0",
-"*.    c #D2E2CC",
-"=.    c #F9FEF6",
-"-.    c #839E71",
-";.    c #BACEAD",
-">.    c #C7D6BB",
-",.    c #F8FBF4",
-"'.    c #2A3520",
-").    c #EEEEEE",
-"!.    c #898989",
-"~.    c #848484",
-"{.    c #7E7E7E",
-"].    c #858585",
-"^.    c #586E4B",
-"/.    c #C8D6C2",
-"(.    c #9BB48C",
-"_.    c #E3EEDD",
-":.    c #9BB690",
-"<.    c #CCDBC5",
-"[.    c #809E72",
-"}.    c #D0DEC8",
-"|.    c #718C5F",
-"1.    c #B7C5AE",
-"2.    c #668150",
-"3.    c #CAD7C2",
-"4.    c #242C1C",
-"5.    c #F1F1F1",
-"6.    c #B0B0B0",
-"7.    c #B3AF9A",
-"8.    c #8A8A8A",
-"9.    c #9F9F9F",
-"0.    c #556B46",
-"a.    c #EDF5E7",
-"b.    c #9AB38A",
-"c.    c #D4E2CE",
-"d.    c #C3D6B9",
-"e.    c #F5FBF2",
-"f.    c #7F9D6D",
-"g.    c #BDCDB4",
-"h.    c #9AB08A",
-"i.    c #E2ECDA",
-"j.    c #566D45",
-"k.    c #A4B298",
-"l.    c #232A1C",
-"m.    c #D0D0D0",
-"n.    c #F7F7F5",
-"o.    c #C7C7C7",
-"p.    c #4F4F4F",
-"q.    c #404040",
-"r.    c #57694B",
-"s.    c #DAE5D1",
-"t.    c #859E76",
-"u.    c #B6CBAA",
-"v.    c #E7ECE4",
-"w.    c #DFEADA",
-"x.    c #6B865B",
-"y.    c #869E79",
-"z.    c #D1DACA",
-"A.    c #C4CFBC",
-"B.    c #4A6039",
-"C.    c #6C7D5E",
-"D.    c #40453B",
-"E.    c #E4E4E4",
-"F.    c #B5B5B5",
-"G.    c #E0DFDE",
-"H.    c #909090",
-"I.    c #4F6042",
-"J.    c #829A72",
-"K.    c #7A9368",
-"L.    c #88A277",
-"M.    c #DAE4D5",
-"N.    c #8EA67E",
-"O.    c #5A7349",
-"P.    c #C7D0BE",
-"Q.    c #6C7F5A",
-"R.    c #4A5F38",
-"S.    c #617250",
-"T.    c #2E3426",
-"U.    c #838383",
-"V.    c #2B2B2B",
-"W.    c #282828",
-"X.    c #747474",
-"Y.    c #3D4C30",
-"Z.    c #5A6E49",
-"`.    c #687E58",
-" +    c #788E65",
-".+    c #6C805C",
-"++    c #6B825B",
-"@+    c #5C734C",
-"#+    c #586F48",
-"$+    c #627355",
-"%+    c #526643",
-"&+    c #4E6140",
-"*+    c #647455",
-"=+    c #21281A",
-"-+    c #F3F3F3",
-";+    c #989898",
-">+    c #979797",
-",+    c #343F28",
-"'+    c #4F6142",
-")+    c #5C6E4E",
-"!+    c #718462",
-"~+    c #687C5A",
-"{+    c #778968",
-"]+    c #758968",
-"^+    c #76896A",
-"/+    c #6E7C60",
-"(+    c #687859",
-"_+    c #647457",
-":+    c #738465",
-"<+    c #1C2117",
-"[+    c #F7F7F7",
-"}+    c #F2F2F2",
-"|+    c #BBBBBB",
-"1+    c #CCCCCC",
-"2+    c #B8B8B8",
-"3+    c #878787",
-"4+    c #585858",
-"5+    c #616161",
-"6+    c #666666",
-"7+    c #6F6F6F",
-"8+    c #727272",
-"9+    c #6E6E6E",
-"0+    c #646464",
-"a+    c #6D6D6D",
-"b+    c #D6D6D6",
-"c+    c #C6C6C6",
-"d+    c #DFDECD",
-"e+    c #8E8E8E",
-"f+    c #A4A4A4",
-"g+    c #C0C0C0",
-"h+    c #CBCBCB",
-"i+    c #CACACA",
-"j+    c #DFDFDF",
-"k+    c #F4F4F4",
-"l+    c #F5F5F5",
-"m+    c #C5C5C5",
-"n+    c #2F2F2F",
-"o+    c #7D7D7D",
-"p+    c #5C5C5C",
-"q+    c #040404",
-"r+    c #575757",
-"s+    c #9C9C9C",
-"t+    c #AFAFAF",
-"u+    c #A7A7A7",
-"v+    c #AEAEAE",
-"w+    c #A8A8A8",
-"x+    c #B2B2B2",
-"y+    c #E9E9E9",
-"z+    c #C9C9C9",
-"A+    c #DBDBDB",
-"B+    c #525252",
-"C+    c #202020",
-"D+    c #2D2D2D",
-"E+    c #828282",
-"F+    c #787878",
-"G+    c #9A9A9A",
-"H+    c #BFBFBF",
-"I+    c #C1C1C1",
-"J+    c #3A3A3A",
-"K+    c #3C3C3C",
-"L+    c #6C6C6C",
-"M+    c #434343",
-"N+    c #2E2E2E",
-"O+    c #303030",
-"P+    c #545454",
-"Q+    c #C2C2C2",
-"R+    c #DCDCDC",
-"S+    c #868686",
-"T+    c #676767",
-"                                                ",
-"  . . . . . . . . . . . . . . . . . . . .       ",
-". + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # .     ",
-". $ % & & * = - ; > > , ' ) ! ~ { ] ^ / ( .     ",
-". $ _ : < [ } | 1 2 3 4 5 6 7 8 9 / 0 a b .     ",
-". $ c d e f g h i j k l m n o p $ q r s - .     ",
-". $ * t u v w x y z A B C D E F G H I J K .     ",
-". $ L M N O P Q R S T U V W X Y Z ] `  ....     ",
-". $ ' +.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.]..     ",
-". $ ) ^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9..     ",
-". $ , 0.a.b.c.d.e.f.g.h.i.j.k.l.).m.n.o.p..     ",
-". $ q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.L .     ",
-". $ c I.J.K.L.M.N.4 O.P.Q.R.S.T.9 U.V.W.X..     ",
-". $ = Y.Z.`. +.+++@+#+$+%+&+*+=+-+;+8.].>+.     ",
-". $ = ,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+.     ",
-". $ 3+' ! K 4+5+6+7+8+9+0+a+~ b++ c+d+e+f+.     ",
-". $ ~.g+h+i+h+q j+b+k+-+-+l+).i+m+b+k+# n+.     ",
-". $ > o+p+0+q+r+= s+t+u+v+] w+x+y+..z+^ & .     ",
-". A+8+p+B+C+b D+; , E+F+G+p+^ >+H+I+J+K+L+.     ",
-". { !.7+M+N+O+P+e+v+|+{ H+Q+q @ R+S+{.T+b .     ",
-"  . . . . . . . . . . . . . . . . . . . . .     ",
-"        . . . . . . . . . . . . . . . .         ",
-"                                                ",
-"                                                "};
diff --git a/utils/images/screensaver-locking.png b/utils/images/screensaver-locking.png
new file mode 100644 (file)
index 0000000..61ee436
Binary files /dev/null and b/utils/images/screensaver-locking.png differ
diff --git a/utils/images/screensaver-locking.xpm b/utils/images/screensaver-locking.xpm
deleted file mode 100644 (file)
index 9b7ba2d..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/* XPM */
-static char * screensaver_locking_xpm[] = {
-"24 24 179 2",
-"      c None",
-".     c #000000",
-"+     c #A5A5A5",
-"@     c #EEEEEE",
-"#     c #ECECEC",
-"$     c #E7E7E7",
-"%     c #E3E3E3",
-"&     c #CBCBCB",
-"*     c #424242",
-"=     c #D4D4D4",
-"-     c #E8E8E8",
-";     c #B5B5B5",
-">     c #DFDFDF",
-",     c #C8C8C8",
-"'     c #5B5B5B",
-")     c #A4A4A4",
-"!     c #818181",
-"~     c #DDDDDD",
-"{     c #BCBCBC",
-"]     c #2D2D2D",
-"^     c #EDEDED",
-"/     c #BABABA",
-"(     c #D6D6D6",
-"_     c #777777",
-":     c #E2E2E2",
-"<     c #757575",
-"[     c #E6E6E6",
-"}     c #AFAFAF",
-"|     c #DCDCDC",
-"1     c #616161",
-"2     c #E5E5E5",
-"3     c #D2A06E",
-"4     c #AD8562",
-"5     c #C99560",
-"6     c #C48F5A",
-"7     c #EFDBBF",
-"8     c #E5C7A0",
-"9     c #D8B385",
-"0     c #D4AC7C",
-"a     c #D0A873",
-"b     c #CAA06A",
-"c     c #C79C64",
-"d     c #C89C64",
-"e     c #C3985F",
-"f     c #C09054",
-"g     c #BC8545",
-"h     c #B67A38",
-"i     c #9A5E1B",
-"j     c #F0DABF",
-"k     c #E4C6A0",
-"l     c #D6AF80",
-"m     c #D3AC7B",
-"n     c #D0A570",
-"o     c #B48D59",
-"p     c #81643D",
-"q     c #6E5534",
-"r     c #BC9A6D",
-"s     c #C79C65",
-"t     c #C39860",
-"u     c #C09256",
-"v     c #BC8645",
-"w     c #B67C36",
-"x     c #985E1A",
-"y     c #EED8BC",
-"z     c #E3C39C",
-"A     c #D3AA7B",
-"B     c #CDA36C",
-"C     c #81643E",
-"D     c #21190E",
-"E     c #0C0905",
-"F     c #43331F",
-"G     c #D3B185",
-"H     c #C49961",
-"I     c #C09358",
-"J     c #BC8746",
-"K     c #B77D39",
-"L     c #EED8BB",
-"M     c #E2C29B",
-"N     c #D6AE7F",
-"O     c #D2A97A",
-"P     c #CEA46E",
-"Q     c #6A5232",
-"R     c #080604",
-"S     c #D2B287",
-"T     c #C2945A",
-"U     c #BE8E50",
-"V     c #BA8442",
-"W     c #B47834",
-"X     c #975C1A",
-"Y     c #EFDABE",
-"Z     c #E4C49D",
-"`     c #D7B080",
-" .    c #D4AC79",
-"..    c #CDA570",
-"+.    c #846641",
-"@.    c #19130C",
-"#.    c #7A6A53",
-"$.    c #CEAA7B",
-"%.    c #C19458",
-"&.    c #BE8C4E",
-"*.    c #B9813F",
-"=.    c #B37834",
-"-.    c #975D1A",
-";.    c #EFD8BB",
-">.    c #E0C199",
-",.    c #D3AA7A",
-"'.    c #D0A774",
-").    c #CBA26B",
-"!.    c #A58152",
-"~.    c #2E2316",
-"{.    c #CBAC83",
-"].    c #C39861",
-"^.    c #C09257",
-"/.    c #BA833F",
-"(.    c #B37934",
-"_.    c #9B601E",
-":.    c #E3C29C",
-"<.    c #D2AA78",
-"[.    c #896C44",
-"}.    c #1C150C",
-"|.    c #A08C72",
-"1.    c #C19257",
-"2.    c #BD8C4C",
-"3.    c #BA813E",
-"4.    c #B27733",
-"5.    c #A36B2F",
-"6.    c #EDD6B8",
-"7.    c #E1BD94",
-"8.    c #D1A874",
-"9.    c #CEA46D",
-"0.    c #C69C64",
-"a.    c #44341F",
-"b.    c #17110A",
-"c.    c #766246",
-"d.    c #D0AF84",
-"e.    c #BE8E51",
-"f.    c #B67D3A",
-"g.    c #B07530",
-"h.    c #A67137",
-"i.    c #EED8BA",
-"j.    c #E0C099",
-"k.    c #D1A973",
-"l.    c #654F32",
-"m.    c #503F28",
-"n.    c #4E3D27",
-"o.    c #705737",
-"p.    c #D0AE81",
-"q.    c #BD8C4E",
-"r.    c #B9803D",
-"s.    c #B67D38",
-"t.    c #AB783F",
-"u.    c #EED5B7",
-"v.    c #DFC096",
-"w.    c #D2A776",
-"x.    c #C89D65",
-"y.    c #CFAD80",
-"z.    c #D4B68F",
-"A.    c #D5B68F",
-"B.    c #D2B38A",
-"C.    c #C69D66",
-"D.    c #C09155",
-"E.    c #BC8A4B",
-"F.    c #BE8A4C",
-"G.    c #A9773C",
-"H.    c #D5AE7E",
-"I.    c #CFA772",
-"J.    c #C49256",
-"K.    c #C08D51",
-"L.    c #BA8849",
-"M.    c #B78342",
-"N.    c #B48240",
-"O.    c #B68241",
-"P.    c #B88544",
-"Q.    c #BB8949",
-"R.    c #BC8748",
-"S.    c #BA874A",
-"T.    c #B98548",
-"U.    c #B27B3B",
-"V.    c #88521A",
-"                                                ",
-"                                                ",
-"                  . . . . . . .                 ",
-"                . + @ # $ % & * .               ",
-"              . = - ; . . . > , ' .             ",
-"            . ) - ! .       . ~ { ]             ",
-"            . ^ / .           . ( _ .           ",
-"            . : < .           . [ } .           ",
-"            . | 1 .           . 2 / .           ",
-"          . . 3 4 . . . . . . . 5 6 . .         ",
-"        . 7 8 9 0 a b c c d c e f g h i .       ",
-"        . j k l m n o p q r s t u v w x .       ",
-"        . y z l A B C D E F G H I J K i .       ",
-"        . L M N O P Q . . R S T U V W X .       ",
-"        . Y Z `  ...+.@.R #.$.%.&.*.=.-..       ",
-"        . ;.>.,.'.).!.~.. {.].^.&./.(._..       ",
-"        . y :.N <.B [.}.. |.t 1.2.3.4.5..       ",
-"        . 6.7.8.9.0.a.b.. c.d.e.J f.g.h..       ",
-"        . i.j.A k.).l.m.n.o.p.^.q.r.s.t..       ",
-"        . u.v.w.P x.y.z.A.B.C.D.E.V F.G..       ",
-"        . H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V..       ",
-"          . . . . . . . . . . . . . . .         ",
-"                                                ",
-"                                                "};
diff --git a/utils/images/screensaver-power.png b/utils/images/screensaver-power.png
new file mode 100644 (file)
index 0000000..38c861d
Binary files /dev/null and b/utils/images/screensaver-power.png differ
diff --git a/utils/images/screensaver-power.xpm b/utils/images/screensaver-power.xpm
deleted file mode 100644 (file)
index 2a38341..0000000
+++ /dev/null
@@ -1,230 +0,0 @@
-/* XPM */
-static char * screensaver_power_xpm[] = {
-"24 24 203 2",
-"      c None",
-".     c #1E1D19",
-"+     c #000000",
-"@     c #D3CDBA",
-"#     c #EDE6CD",
-"$     c #E1D6B0",
-"%     c #C2B997",
-"&     c #786C42",
-"*     c #ECDB9D",
-"=     c #EEDA94",
-"-     c #E7D185",
-";     c #E2CC7E",
-">     c #D2C185",
-",     c #E9DFBB",
-"'     c #CFC7A8",
-")     c #A6996B",
-"!     c #948450",
-"~     c #C2AE68",
-"{     c #B39F5E",
-"]     c #A99858",
-"^     c #73663E",
-"/     c #F6F0DA",
-"(     c #EEE0A8",
-"_     c #F1E1AB",
-":     c #EBD99B",
-"<     c #E5D28E",
-"[     c #CFBD7C",
-"}     c #B9A96F",
-"|     c #988B5B",
-"1     c #8D8054",
-"2     c #B6A56B",
-"3     c #B9A86A",
-"4     c #A7955D",
-"5     c #9B8952",
-"6     c #907F4A",
-"7     c #897C4F",
-"8     c #FCF9ED",
-"9     c #F3E9C6",
-"0     c #F2E8C4",
-"a     c #EEE1B4",
-"b     c #EADCA9",
-"c     c #E7D8A5",
-"d     c #E4D6A4",
-"e     c #DFD2A0",
-"f     c #D8CA97",
-"g     c #C3B47E",
-"h     c #B1A16F",
-"i     c #998A57",
-"j     c #867846",
-"k     c #7D6F41",
-"l     c #93875C",
-"m     c #F0DD96",
-"n     c #FBF7E9",
-"o     c #FBF9EF",
-"p     c #F5F1E1",
-"q     c #F2EEDF",
-"r     c #F7F2E4",
-"s     c #F4EEDC",
-"t     c #EBE4C9",
-"u     c #DDD1AA",
-"v     c #C0B284",
-"w     c #A89A70",
-"x     c #928554",
-"y     c #9A916C",
-"z     c #8A7F59",
-"A     c #74673A",
-"B     c #F0DB90",
-"C     c #F8EFCE",
-"D     c #FDFBF1",
-"E     c #FBF8EC",
-"F     c #F8F4DC",
-"G     c #F0E3B2",
-"H     c #E4D295",
-"I     c #E0D19A",
-"J     c #D7C895",
-"K     c #C2B584",
-"L     c #B2A479",
-"M     c #9C8F65",
-"N     c #796B3D",
-"O     c #6E6236",
-"P     c #6B6036",
-"Q     c #ECD88E",
-"R     c #F8EFCD",
-"S     c #FDFBF4",
-"T     c #FDFBF5",
-"U     c #FBFAED",
-"V     c #F0E5B1",
-"W     c #DCC77B",
-"X     c #D1BB70",
-"Y     c #C4AF69",
-"Z     c #AA9856",
-"`     c #99874F",
-" .    c #857544",
-"..    c #76673C",
-"+.    c #6C6037",
-"@.    c #5E5433",
-"#.    c #BCB59B",
-"$.    c #EEE5C5",
-"%.    c #FCF9EC",
-"&.    c #FCFAF2",
-"*.    c #FAF9EC",
-"=.    c #EEE2AD",
-"-.    c #DAC578",
-";.    c #CDB76D",
-">.    c #BEAA64",
-",.    c #A89656",
-"'.    c #97854B",
-").    c #847544",
-"!.    c #74683C",
-"~.    c #5A5337",
-"{.    c #36352F",
-"].    c #A6A5A5",
-"^.    c #C4C3BD",
-"/.    c #E5E3DE",
-"(.    c #F4F2ED",
-"_.    c #F8F4E5",
-":.    c #ECDEA6",
-"<.    c #D9C377",
-"[.    c #CBB56C",
-"}.    c #BCA863",
-"|.    c #A89759",
-"1.    c #897B4D",
-"2.    c #6B634A",
-"3.    c #5B574B",
-"4.    c #3F3E3D",
-"5.    c #353535",
-"6.    c #A3A3A3",
-"7.    c #BCBCBC",
-"8.    c #D7D7D7",
-"9.    c #E6E6E6",
-"0.    c #E5E5E5",
-"a.    c #BFBFBF",
-"b.    c #A2A2A2",
-"c.    c #929292",
-"d.    c #868686",
-"e.    c #787878",
-"f.    c #6C6C6C",
-"g.    c #5D5D5D",
-"h.    c #525252",
-"i.    c #424242",
-"j.    c #363636",
-"k.    c #BBBBBB",
-"l.    c #D4D4D4",
-"m.    c #E2E2E2",
-"n.    c #7A7A7A",
-"o.    c #737373",
-"p.    c #5B5B5B",
-"q.    c #A5A5A5",
-"r.    c #B8B8B8",
-"s.    c #CFCFCF",
-"t.    c #E1E1E1",
-"u.    c #A0A0A0",
-"v.    c #939393",
-"w.    c #888888",
-"x.    c #767676",
-"y.    c #7B7B7B",
-"z.    c #7E7E7E",
-"A.    c #5F5F5F",
-"B.    c #404040",
-"C.    c #A4A4A4",
-"D.    c #B7B7B7",
-"E.    c #CCCCCC",
-"F.    c #E0E0E0",
-"G.    c #DFDFDF",
-"H.    c #B6B6B6",
-"I.    c #A1A1A1",
-"J.    c #878787",
-"K.    c #777777",
-"L.    c #757575",
-"M.    c #828282",
-"N.    c #414141",
-"O.    c #C8C8C8",
-"P.    c #DDDDDD",
-"Q.    c #DCDCDC",
-"R.    c #B4B4B4",
-"S.    c #595959",
-"T.    c #B5B5B5",
-"U.    c #C5C5C5",
-"V.    c #DBDBDB",
-"W.    c #B1B1B1",
-"X.    c #7F7F7F",
-"Y.    c #B3B3B3",
-"Z.    c #C1C1C1",
-"`.    c #D9D9D9",
-" +    c #D8D8D8",
-".+    c #ADADAD",
-"++    c #C0C0C0",
-"@+    c #6F6F6F",
-"#+    c #686868",
-"$+    c #535353",
-"%+    c #959595",
-"&+    c #6B6B6B",
-"*+    c #5C5C5C",
-"=+    c #515151",
-"-+    c #2A2A2A",
-";+    c #8A8A8A",
-">+    c #D6D6D6",
-",+    c #242424",
-"'+    c #919191",
-")+    c #626262",
-"!+    c #494949",
-"~+    c #343434",
-"{+    c #111111",
-"                                                ",
-"              . + + +                           ",
-"      + + + + @ # $ % & + + + +                 ",
-"    + * = - ; > , ' ) ! ~ { ] ^ +               ",
-"  + / ( _ : < [ } | 1 2 3 4 5 6 7 +             ",
-"  + 8 9 0 a b c d e f g h i j k l +             ",
-"  + m n o p q r s t u v w x y z A +             ",
-"  + B C D E F G H I J K L M N O P +             ",
-"  + Q R S T U V W X Y Z `  ...+.@.+             ",
-"  + #.$.%.&.*.=.-.;.>.,.'.).!.~.{.+             ",
-"  + ].^./.(._.:.<.[.}.|.1.2.3.4.5.+             ",
-"  + 6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.+             ",
-"  + 6.k.l.0.m.7.b.c.d.e.n.o.p.i.j.+             ",
-"  + q.r.s.m.t.r.u.v.w.x.y.z.A.B.5.+             ",
-"  + C.D.E.F.G.H.I.v.J.K.L.M.A.N.5.+             ",
-"  + 6.D.O.P.Q.R.b.c.d.e.o.L.S.i.j.+             ",
-"  + C.T.U.V.V.W.I.c.d.e.X.M.S.i.j.+             ",
-"  + C.Y.Z.`. +.+I.v.J.K.z.J.g.N.5.+             ",
-"  + C.Y.++ +8..+I.c.J.K.@+#+$+i.j.+ + +         ",
-"  + %+Y.++ +8..+b.v.J.e.&+*+=+i.-++ +           ",
-"    + ;+++`.>+.+b.v.J.e.&+*+=+,++ +             ",
-"      + + L.'+@+&+)+S.!+~+{++ + +               ",
-"          + + + + + + + + +                     ",
-"                                                "};
diff --git a/utils/images/screensaver-snap.png b/utils/images/screensaver-snap.png
new file mode 100644 (file)
index 0000000..720f51a
Binary files /dev/null and b/utils/images/screensaver-snap.png differ
diff --git a/utils/images/screensaver-snap.xpm b/utils/images/screensaver-snap.xpm
deleted file mode 100644 (file)
index 4627900..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-/* XPM */
-static char * screensaver_snap_xpm[] = {
-"24 24 200 2",
-"      c None",
-".     c #000000",
-"+     c #0E0E0E",
-"@     c #181818",
-"#     c #D6D6D6",
-"$     c #DCDCDC",
-"%     c #EFEFEF",
-"&     c #EBEBEB",
-"*     c #E8E8E8",
-"=     c #DBDBDB",
-"-     c #969696",
-";     c #070707",
-">     c #939393",
-",     c #ECECEC",
-"'     c #D4D4D4",
-")     c #D8D8D8",
-"!     c #FCFCFC",
-"~     c #FBFBFB",
-"{     c #8B8B8B",
-"]     c #7E7E7E",
-"^     c #797979",
-"/     c #F0F0F0",
-"(     c #E7E7E7",
-"_     c #DADADA",
-":     c #CCCCCC",
-"<     c #CDCDCD",
-"[     c #B5B5B5",
-"}     c #6D6D6D",
-"|     c #6B6B6B",
-"1     c #686868",
-"2     c #656565",
-"3     c #707070",
-"4     c #959595",
-"5     c #909090",
-"6     c #BEBEBE",
-"7     c #BDBDBD",
-"8     c #B4B4B4",
-"9     c #A2A2A2",
-"0     c #F5F5F5",
-"a     c #D0D0D0",
-"b     c #BCBCBC",
-"c     c #C3C3C3",
-"d     c #C7C7C7",
-"e     c #CFCFCF",
-"f     c #D7D7D7",
-"g     c #BFBFBF",
-"h     c #ADADAD",
-"i     c #757575",
-"j     c #A6A6A6",
-"k     c #030303",
-"l     c #6A6A6A",
-"m     c #060606",
-"n     c #8E8E8A",
-"o     c #EFEFEE",
-"p     c #C5C5BF",
-"q     c #BABAB4",
-"r     c #9D9D98",
-"s     c #999997",
-"t     c #B1B1B2",
-"u     c #C8C8C8",
-"v     c #E1E1E1",
-"w     c #DFDFDF",
-"x     c #CECECE",
-"y     c #C1C1C1",
-"z     c #818181",
-"A     c #AAAAAA",
-"B     c #717171",
-"C     c #D4D4D2",
-"D     c #C1C1B4",
-"E     c #6C6A57",
-"F     c #5D5C49",
-"G     c #444230",
-"H     c #505048",
-"I     c #969697",
-"J     c #AEAEAF",
-"K     c #252525",
-"L     c #212121",
-"M     c #747474",
-"N     c #AFAFAF",
-"O     c #E0E0E0",
-"P     c #929292",
-"Q     c #D6D6D3",
-"R     c #B8B8AB",
-"S     c #5E5E49",
-"T     c #53523D",
-"U     c #40402C",
-"V     c #343423",
-"W     c #A9A9A9",
-"X     c #7A7A7A",
-"Y     c #393939",
-"Z     c #363636",
-"`     c #A0A0A0",
-" .    c #F6F6F6",
-"..    c #DEDEDE",
-"+.    c #9F9F9F",
-"@.    c #888888",
-"#.    c #9D9D9D",
-"$.    c #6E6E6E",
-"%.    c #D2D2CE",
-"&.    c #B9B9AC",
-"*.    c #5F5F4A",
-"=.    c #52533D",
-"-.    c #31301F",
-";.    c #646463",
-">.    c #A3A3A3",
-",.    c #B6B6B6",
-"'.    c #C2C2C2",
-").    c #3E3E3E",
-"!.    c #595959",
-"~.    c #484848",
-"{.    c #4B4B4B",
-"].    c #464646",
-"^.    c #BABAAC",
-"/.    c #605F4B",
-"(.    c #51523C",
-"_.    c #3F402C",
-":.    c #313120",
-"<.    c #626261",
-"[.    c #A5A5A5",
-"}.    c #F1F1F1",
-"|.    c #ACACAC",
-"1.    c #585858",
-"2.    c #E4E4E4",
-"3.    c #989898",
-"4.    c #3B3B3B",
-"5.    c #979797",
-"6.    c #61604B",
-"7.    c #54533F",
-"8.    c #42412E",
-"9.    c #30301F",
-"0.    c #5E5E5D",
-"a.    c #999999",
-"b.    c #838383",
-"c.    c #3C3C3C",
-"d.    c #B3B3B3",
-"e.    c #4F4F4F",
-"f.    c #808080",
-"g.    c #666666",
-"h.    c #C6C6C6",
-"i.    c #BABAAD",
-"j.    c #60604B",
-"k.    c #52523E",
-"l.    c #303020",
-"m.    c #989899",
-"n.    c #B2B2B2",
-"o.    c #B1B1B1",
-"p.    c #C5C5C5",
-"q.    c #606060",
-"r.    c #545454",
-"s.    c #676767",
-"t.    c #B9B9AB",
-"u.    c #5F5E49",
-"v.    c #51513C",
-"w.    c #40402D",
-"x.    c #313020",
-"y.    c #5E5E5E",
-"z.    c #CACACA",
-"A.    c #C0C0C0",
-"B.    c #4C4C4C",
-"C.    c #8C8C8C",
-"D.    c #CBCBCB",
-"E.    c #B8B7A9",
-"F.    c #5C5C46",
-"G.    c #4F4F3B",
-"H.    c #403F2C",
-"I.    c #BABABA",
-"J.    c #B8B8B8",
-"K.    c #9C9C9C",
-"L.    c #020202",
-"M.    c #AAA99A",
-"N.    c #51503D",
-"O.    c #464632",
-"P.    c #383825",
-"Q.    c #2D2C1C",
-"R.    c #555554",
-"S.    c #949494",
-"T.    c #8F8F8F",
-"U.    c #848484",
-"V.    c #6F6F6F",
-"W.    c #626262",
-"X.    c #5A5A5A",
-"Y.    c #545450",
-"Z.    c #363731",
-"`.    c #33332E",
-" +    c #30302B",
-".+    c #373633",
-"++    c #A8A8A8",
-"@+    c #A1A1A1",
-"#+    c #868686",
-"$+    c #727272",
-"%+    c #0A0A0A",
-"&+    c #444444",
-"*+    c #505050",
-"=+    c #535353",
-"-+    c #7C7C7C",
-";+    c #7F7F7F",
-">+    c #7B7B7B",
-",+    c #787878",
-"'+    c #737373",
-")+    c #616161",
-"                                                ",
-"                                                ",
-"            . . . . . . . . .                   ",
-"        + . @ # $ % & * = - . . ;               ",
-"    . @ > , & ' ) ! ~ ~ # { ] ^ . . .           ",
-"  . / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 .         ",
-"  . 0 a a b b c d e f f g h i j k . l .         ",
-"m n o p q r s t u v w ) x y z A ^ B 5 .         ",
-". C D E F G H I J u i K L M N O , u P .         ",
-". Q R S T U V } W u X Y Z `  ...+.@.#.$..       ",
-". %.&.*.=.U -.;.>.y ,.'.7 % ..).!.~.{.- ]..     ",
-". %.^./.(._.:.<.+.[.A W 9 }.|.1.2.3.4.1 5..     ",
-". %.^.6.7.8.9.0.a.>.W W ` % b.c.d.e.f.g.h..     ",
-". %.i.j.k.U l.0.m.n.o.d.W g p.q.r.3 s.W +..     ",
-". %.t.u.v.w.x.y.- z.y A.A.j A.3.B.4.C.D.y..     ",
-". %.E.F.G.H.:.!.P '.y I.J.K.a.N I.8 b y.L.      ",
-". p M.N.O.P.Q.R.@.o.|.|.j S.T.U.V.W.X.. m       ",
-"  . Y.Z.`. +.+| U.A W ++@+5 C.#+$+i ^ . %+      ",
-"  . &+r.*+=+!.s.$+-+z ;+>+^ ,+'+| q.)+.         ",
-"  . . . . . . . . . . . . . . . . . . .         ",
-"                                                ",
-"                                                ",
-"                                                ",
-"                                                "};
index b99499dad119c70a0db5f587190168367f81a785..53cd3519cebe86eb1c76be98481630af7642f98a 100644 (file)
@@ -1,2 +1,2 @@
 static const char screensaver_id[] =
-       "@(#)xscreensaver 4.10 (20-May-2003), by Jamie Zawinski (jwz@jwz.org)";
+       "@(#)xscreensaver 4.11 (23-Jun-2003), by Jamie Zawinski (jwz@jwz.org)";
index a6262e9ad2100020364a8f57ec8234645504eb60..02a26d851c542408a9a0df976dac101e68908a30 100644 (file)
@@ -1,25 +1,25 @@
 Begin3
 Title:          xscreensaver
-Version:        4.10
-Entered-date:   20MAY03
+Version:        4.11
+Entered-date:   23JUN03
 Description:    A modular screen saver and locker for the X Window System.
                 Highly customizable: allows the use of any program that
                 can draw on the root window as a display mode.
-                More than 150 display modes are included in this package.
+                More than 160 display modes are included in this package.
 Keywords:       screen saver, screen lock, lock, xlock, X11
 Author:         jwz@jwz.org (Jamie Zawinski)
 Maintained-by:  jwz@jwz.org (Jamie Zawinski)
 Primary-site:   http://www.jwz.org/xscreensaver/
-                 xscreensaver-4.10.tar.gz
-                63K   xscreensaver.README
+                245K xscreensaver-4.11.tar.gz
+                64K   xscreensaver.README
                 1K    xscreensaver.lsm
 Alternate-site: sunsite.unc.edu /pub/Linux/X11/screensavers/
-                 xscreensaver-4.10.tar.gz
-                63K   xscreensaver.README
+                245K xscreensaver-4.11.tar.gz
+                64K   xscreensaver.README
                 1K    xscreensaver.lsm
 Alternate-site: ftp.x.org /contrib/applications/
-                 xscreensaver-4.10.tar.gz
-                63K   xscreensaver.README
+                245K xscreensaver-4.11.tar.gz
+                64K   xscreensaver.README
                 1K    xscreensaver.lsm
 Platforms:      Linux, Irix, SunOS, Solaris, HPUX, AIX, FreeBSD, NetBSD,
                 BSDI, SCO, OSF1, Ultrix, VMS.
index 718f33e356d4a7f42a6218e67ef0170539af5a66..552817dcfdb3f5bd956b8551f1a643ee87f8d563 100755 (executable)
@@ -27,7 +27,7 @@ Entered-date:   $DATE
 Description:    A modular screen saver and locker for the X Window System.
                 Highly customizable: allows the use of any program that
                 can draw on the root window as a display mode.
-                More than 150 display modes are included in this package.
+                More than 160 display modes are included in this package.
 Keywords:       screen saver, screen lock, lock, xlock, X11
 Author:         jwz@jwz.org (Jamie Zawinski)
 Maintained-by:  jwz@jwz.org (Jamie Zawinski)
index ea0011848b92550de982c8874bd49adc7528d4be..93da1d7c19611c7b50036bcae4a4a3129965c275 100644 (file)
@@ -1,5 +1,5 @@
 %define        name            xscreensaver
-%define        version         4.10
+%define        version         4.11
 %define        release         1
 %define        serial          1
 %define        x11_prefix      /usr/X11R6
@@ -34,7 +34,7 @@ Buildroot:    %{_tmppath}/%{name}-%{version}-root
 A modular screen saver and locker for the X Window System.
 Highly customizable: allows the use of any program that
 can draw on the root window as a display mode.
-More than 150 display modes are included in this package.
+More than 160 display modes are included in this package.
 %{?USE_GL:See also the xscreensaver-gl package, which}
 %{?USE_GL:includes optional OpenGL display modes.}
 
@@ -42,7 +42,7 @@ More than 150 display modes are included in this package.
 Un économiseur d'écran et verrouillage modulaire pour X-Window.
 Hautement configurable: permet l'utilisation de n'importe quel programme
 qui peut dessiner dans la fenêtre root.
-Plus de 150 modes d'affichage sont inclus dans ce paquet.
+Plus de 160 modes d'affichage sont inclus dans ce paquet.
 %{?USE_GL:Voir aussi le paquet xscreensaver-gl, qui inclut}
 %{?USE_GL:des modules optionnels OpenGL.}