diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -1,25 +1,28 @@
 # Define these 3 lines to use GMP for Integer.
 # For MacOS with homebrew:
-MHSGMPCCFLAGS=-DWANT_GMP=1 -L/opt/homebrew/lib -lgmp -I/opt/homebrew/include
-MHSGMP=-ilib/gmp
-MCABALGMP=-fgmp
+#MHSGMPCCFLAGS=-DWANT_GMP=1 -L/opt/homebrew/lib -lgmp -I/opt/homebrew/include
+#MHSGMP=-ilib/gmp
+#MCABALGMP=-fgmp
 #
 # installation prefix
 PREFIX=/usr/local
 # Unix-like system, 64 bit words
 CONF=unix-64
 #
+# Using GCC enables global register variables on ARM64, which gives a 5-10% speedup.
+#CC=gcc-14
 CCWARNS= -Wall
 CCOPTS= -O3
 CCLIBS= -lm
+CCSANITIZE= -fsanitize=undefined -fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract
 CCEVAL= $(CC) $(CCWARNS) $(CCOPTS) $(MHSGMPCCFLAGS) -Isrc/runtime src/runtime/eval-$(CONF).c $(CCLIBS)
 #
 GHC= ghc
 GHCINCS= -ighc -isrc -ipaths
 GHCWARNS= -Wall -Wno-unrecognised-warning-flags -Wno-x-partial -Wno-deprecations
 GHCOPTS= -O
-GHCEXTS= -DNOTCABAL -XScopedTypeVariables -XTypeSynonymInstances -XMultiParamTypeClasses -XFlexibleInstances
-GHCPKGS= -package mtl -package pretty -package haskeline -package process -package time -package ghc-prim -package containers -package deepseq -package directory -package text
+GHCEXTS= -XScopedTypeVariables -XTypeSynonymInstances -XMultiParamTypeClasses -XFlexibleInstances
+GHCPKGS= -package mtl -package pretty -package haskeline -package process -package time -package ghc-prim -package containers -package deepseq -package directory -package text -package bytestring -package filepath -package array
 GHCTOOL= # -F -pgmF Tools/convertX.sh
 GHCOUTDIR= ghc-out
 GHCOUT= -outputdir $(GHCOUTDIR)
@@ -43,12 +46,12 @@
 all:	bin/mhs bin/cpphs bin/mcabal
 
 targets.conf:
-	echo [default]           > targets.conf
+	echo "[default]"         > targets.conf
 	echo cc = \"$(CC)\"     >> targets.conf
 	echo ccflags = \"$(MHSGMPCCFLAGS)\" >> targets.conf
 	echo conf = \"$(CONF)\" >> targets.conf
 	echo ''                 >> targets.conf
-	echo [emscripten]       >> targets.conf
+	echo "[emscripten]"     >> targets.conf
 	echo cc = \"$(EMCC)\"   >> targets.conf
 	echo conf = \"$(CONF)\" >> targets.conf
 
@@ -61,7 +64,7 @@
 	make generated/mhs.c
 
 sanitizemhs:	ghcgen targets.conf
-	$(CCEVAL) -fsanitize=undefined -fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract generated/mhs.c -o bin/mhssane
+	$(CCEVAL) $(CCSANITIZE) generated/mhs.c -o bin/mhssane
 
 # Compile mhs from distribution, with C compiler
 bin/mhs:	src/runtime/*.c src/runtime/*.h targets.conf #generated/mhs.c
@@ -69,12 +72,12 @@
 	$(CCEVAL) generated/mhs.c -o bin/mhs
 
 # Compile cpphs from distribution, with C compiler
-bin/cpphs:	src/runtime/*.c src/runtime/config*.h generated/cpphs.c
+bin/cpphs:	src/runtime/*.c src/runtime/config*.h #generated/cpphs.c
 	@mkdir -p bin
 	$(CCEVAL) generated/cpphs.c -o bin/cpphs
 
 # Compile mcabal from distribution, with C compiler
-bin/mcabal:	src/runtime/*.c src/runtime/config*.h generated/mcabal.c
+bin/mcabal:	src/runtime/*.c src/runtime/config*.h #generated/mcabal.c
 	@mkdir -p bin
 	$(CCEVAL) generated/mcabal.c -o bin/mcabal
 
@@ -88,6 +91,10 @@
 	@mkdir -p bin
 	$(CC) $(CCWARNS) $(MHSGMPCCFLAGS) -g src/runtime/eval-$(CONF).c $(CCLIBS) src/runtime/comb.c -o bin/mhsevalgdb
 
+bin/mhsevalsane:	src/runtime/*.c src/runtime/config*.h
+	@mkdir -p bin
+	$(CCEVAL) $(CCSANITIZE) src/runtime/comb.c -o bin/mhsevalsane
+
 # Compile mhs with ghc
 bin/gmhs:	src/*/*.hs ghc/*.hs ghc/*/*.hs ghc/*/*/*.hs
 	@mkdir -p bin
@@ -106,7 +113,12 @@
 ghcgen:	bin/gmhs src/*/*.hs lib/*.hs lib/*/*.hs lib/*/*/*.hs
 	bin/gmhs $(MHSINC) $(MAINMODULE) -ogenerated/mhs.c
 
+# This doesn't keep MicroCabal updated.  I'm not sure how to do it
+#generated/mcabal.c: MicroCabal/.git
+#	bin/mhs -z -iMicroCabal/src -ilib -ogenerated/mcabal.c MicroCabal.Main
 #
+#MicroCabal/.git:
+#	git submodule update --init --depth 1 MicroCabal
 generated/mcabal.c:
 	bin/mhs -z -i../MicroCabal/src -ilib -ogenerated/mcabal.c MicroCabal.Main
 
@@ -136,14 +148,14 @@
 	@echo "*** stage2 equal to stage1"
 	$(CCEVAL) generated/mhs-stage2.c -o bin/mhs-stage2
 
-cpphssrc/malcolm-wallace-universe:
-	mkdir -p cpphssrc
-	cd cpphssrc; git clone git@github.com:hackage-trustees/malcolm-wallace-universe.git
+# Fetch cpphs submodule
+cpphssrc/malcolm-wallace-universe/.git:
+	git submodule update --init --depth 1 cpphssrc/malcolm-wallace-universe
 
 # Use this cpphs for bootstrapping
 USECPPHS=bin/cpphs
 
-bootstrapcpphs: bin/mhs cpphssrc/malcolm-wallace-universe
+bootstrapcpphs: bin/mhs cpphssrc/malcolm-wallace-universe/.git
 	MHSCPPHS=$(USECPPHS) bin/mhs -z -XCPP '-DMIN_VERSION_base(x,y,z)=((x)<4||(x)==4&&(y)<19||(x)==4&&(y)==19&&(z)<=1)' -icpphscompat -icpphssrc/malcolm-wallace-universe/polyparse-1.12/src -icpphssrc/malcolm-wallace-universe/cpphs-1.20.9 cpphssrc/malcolm-wallace-universe/cpphs-1.20.9/cpphs.hs -ogenerated/cpphs.c
 
 # Run test examples with ghc-compiled compiler
@@ -154,8 +166,13 @@
 runtestmhs: bin/mhseval bin/mhs
 	cd tests; make MHS=../bin/mhs cache; make MHS="../bin/mhs +RTS -H4M -RTS -CR" info test errtest
 
+# Run test examples with sanitized mhs-compiled compiler
+runtestsan: bin/mhsevalsane sanitizemhs
+	cd tests; make MHS="../bin/mhssane +RTS -H4M -RTS -CR" cache
+	cd tests; make MHS="../bin/mhssane +RTS -H4M -RTS -CR" EVAL="../bin/mhsevalsane +RTS -H1M -RTS" info test errtest
+
 # Run test examples going via JavaScript
-runtestemscripten: bin/mhseval bin/mhs
+runtestemscripten: bin/mhseval bin/mhs bin/cpphs
 	cd tests; make MHS=../bin/mhs cache; MHSDIR=.. make MHS="../bin/mhs -CR -temscripten -oout.js" EVAL="node out.js" info test errtest
 
 
@@ -166,7 +183,9 @@
 
 #
 timecompile: bin/mhs
-	time bin/mhs +RTS -v -RTS -s $(MHSINC) $(MAINMODULE)
+	@date
+	@git rev-parse HEAD
+	time bin/mhs +RTS -v -RTS $(MHSINC) $(MAINMODULE)
 
 #
 timecachecompile: bin/mhs
@@ -175,15 +194,29 @@
 	time bin/mhs +RTS -v -RTS -CR -s $(MHSINC) $(MAINMODULE)
 
 #
+timemhscompile:
+	@date
+	@git rev-parse HEAD
+	time mhs +RTS -v -RTS -z -imhs -isrc -ipaths $(MAINMODULE)
+
+#
+timegmhscompile:
+	@date
+	@git rev-parse HEAD
+	time bin/gmhs -s -imhs -isrc -ipaths $(MAINMODULE)
+
+#
 cachelib:
 	@-rm -f .mhscache
 	bin/mhs -CW AllOfLib
 
 #
 clean:
-	rm -rf src/*/*.hi src/*/*.o *.comb *.js *.tmp *~ bin/* a.out $(GHCOUTDIR) Tools/*.o Tools/*.hi dist-newstyle generated/*-stage* .mhscache targets.conf .mhscache dist-mcabal cpphssrc Interactive.hs .mhsi
+	rm -rf src/*/*.hi src/*/*.o *.comb *.js *.tmp *~ bin/* a.out $(GHCOUTDIR) Tools/*.o Tools/*.hi dist-newstyle generated/*-stage* .mhscache targets.conf .mhscache dist-mcabal Interactive.hs .mhsi
 	cd tests; make clean
 	-cabal clean
+	-git submodule deinit cpphssrc/malcolm-wallace-universe
+	-git submodule deinit MicroCabal
 
 oldinstall:
 	mkdir -p $(PREFIX)/bin
@@ -227,8 +260,8 @@
 
 ######
 
-VERSION=0.11.4.0
-HVERSION=0,11,4,0
+VERSION=0.12.6.1
+HVERSION=0,12,6,1
 MCABAL=$(HOME)/.mcabal
 MCABALMHS=$(MCABAL)/mhs-$(VERSION)
 MDATA=$(MCABALMHS)/packages/mhs-$(VERSION)/data
@@ -238,15 +271,18 @@
 BASE=base-$(VERSION)
 BASEMODULES=Control.Applicative Control.Arrow Control.Category Control.DeepSeq Control.Error Control.Exception Control.Exception.Base Control.Monad Control.Monad.Fail Control.Monad.Fix Control.Monad.IO.Class Control.Monad.ST Control.Monad.Zip Data.Array Data.Bifoldable Data.Bifunctor Data.Bitraversable Data.Bits Data.Bool Data.Bounded Data.ByteString Data.Char Data.Complex Data.Constraint Data.Data Data.Double Data.Dynamic Data.Either Data.Enum Data.Eq Data.Fixed Data.Float Data.FloatW Data.Floating Data.Foldable Data.Foldable1 Data.Fractional Data.Function Data.Functor Data.Functor.Classes Data.Functor.Compose Data.Functor.Const Data.Functor.Contravariant Data.Functor.Identity Data.Functor.Product Data.Functor.Sum Data.Hashable Data.IOArray Data.IORef Data.Int Data.Integer Data.Integral Data.Ix Data.Kind Data.List Data.List.NonEmpty Data.Maybe Data.Monoid Data.Num Data.Ord Data.Proxy Data.Ratio Data.Real Data.RealFloat Data.RealFrac Data.Records Data.STRef Data.Semigroup Data.String Data.Text Data.Traversable Data.Tuple Data.Tuple.Instances Data.Type.Equality Data.TypeLits Data.Typeable Data.Version Data.Void Data.Word Data.ZipList Debug.Trace Foreign Foreign.C Foreign.C.Error Foreign.C.String Foreign.C.Types Foreign.ForeignPtr Foreign.Marshal Foreign.Marshal.Alloc Foreign.Marshal.Array Foreign.Marshal.Error Foreign.Marshal.Utils Foreign.Ptr Foreign.Storable GHC.Generics GHC.Stack GHC.Types Language.Haskell.TH.Syntax Mhs.Builtin Numeric Numeric.FormatFloat Numeric.Natural Prelude System.Cmd System.Console.GetOpt System.Compress System.Directory System.Environment System.Exit System.IO System.IO.Error System.IO.MD5 System.IO.PrintOrRun System.IO.Serialize System.IO.TimeMilli System.IO.Unsafe System.Info System.Process Text.Printf Text.ParserCombinators.ReadP Text.ParserCombinators.ReadPrec Text.Read Text.Read.Lex Text.Show Unsafe.Coerce
 
-$(MCABALBIN)/mhs: bin/mhs src/runtime/*.[ch] targets.conf
+$(MCABALBIN)/mhs: bin/mhs src/runtime/*.[ch] targets.conf $(MDIST)/Paths_MicroHs.hs
 	@mkdir -p $(MCABALBIN)
 	@mkdir -p $(MDIST)
-	@echo 'module Paths_MicroHs where { import Prelude(); import MHSPrelude; import Data.Version; version :: Version; version = makeVersion [$(HVERSION)]; getDataDir :: IO FilePath; getDataDir = return "$(MDATA)" }' > $(MDIST)/Paths_MicroHs.hs
 	bin/mhs -z $(MHSINCNP) -i$(MDIST) $(MAINMODULE) -o$(MCABALBIN)/mhs
 	@mkdir -p $(MRUNTIME)
 	cp targets.conf $(MDATA)
 	cp src/runtime/*.[ch] $(MRUNTIME)
 
+$(MDIST)/Paths_MicroHs.hs:
+	@mkdir -p $(MDIST)
+	@echo 'module Paths_MicroHs where { import qualified Prelude(); import MHSPrelude; import Data.Version; version :: Version; version = makeVersion [$(HVERSION)]; getDataDir :: IO FilePath; getDataDir = return "$(MDATA)" }' > $(MDIST)/Paths_MicroHs.hs
+
 $(MCABALBIN)/cpphs: bin/cpphs
 	@mkdir -p $(MCABALBIN)
 	cp bin/cpphs $(MCABALBIN)
@@ -260,8 +296,8 @@
 	bin/mhs -Q $(BASE).pkg $(MCABALMHS)
 	@rm $(BASE).pkg
 
-install: $(MCABALBIN)/mhs $(MCABALBIN)/cpphs $(MCABALBIN)/mcabal $(MCABALMHS)/packages/$(BASE).pkg
-	@echo $$PATH | tr ':' '\012' | grep -q $(MCABALBIN) || echo '***' Add $(MCABALBIN) to the PATH
+#install: $(MCABALBIN)/mhs $(MCABALBIN)/cpphs $(MCABALBIN)/mcabal $(MCABALMHS)/packages/$(BASE).pkg
+#	@echo $$PATH | tr ':' '\012' | grep -q $(MCABALBIN) || echo '***' Add $(MCABALBIN) to the PATH
 
 # mkdir ~/.mcabal/packages/array-0.5.6.0
 
@@ -269,7 +305,8 @@
 	rm -f generated/mcabal.c
 	make generated/mcabal.c
 
-minstall:	bin/cpphs bin/mcabal $(MCABALBIN)/mhs
+minstall:	install
+install:	bin/cpphs bin/mcabal $(MCABALBIN)/mhs
 	cp bin/cpphs bin/mcabal $(MCABALBIN)
 	cd lib; PATH=$(MCABALBIN):"$$PATH" mcabal $(MCABALGMP) install
 	PATH=$(MCABALBIN):"$$PATH" mcabal install
diff --git a/MicroHs.cabal b/MicroHs.cabal
--- a/MicroHs.cabal
+++ b/MicroHs.cabal
@@ -1,6 +1,6 @@
 cabal-version:       3.0
 name:                MicroHs
-version:             0.11.4.0
+version:             0.12.6.1
                      -- *** When changing the version number, also
                      -- *** run 'sh updateversion.sh'
                      -- *** Yeah, it stinks.
@@ -58,7 +58,7 @@
                        -fwrite-ide-info -Wno-deprecations
                        -main-is MicroHs.Main
   main-is:             MicroHs/Main.hs
-  default-extensions:  ScopedTypeVariables TypeSynonymInstances MultiParamTypeClasses FlexibleInstances
+  default-extensions:  ScopedTypeVariables TypeSynonymInstances MultiParamTypeClasses FlexibleInstances FlexibleContexts
   other-modules:       MicroHs.Abstract
                        MicroHs.Builtin
                        MicroHs.Compile
@@ -77,12 +77,11 @@
                        MicroHs.IdentMap
                        MicroHs.IntMap
                        MicroHs.IntSet
-                       MicroHs.Instances
                        MicroHs.Interactive
                        MicroHs.Lex
                        MicroHs.List
+                       MicroHs.Names
                        MicroHs.MakeCArray
-                       MicroHs.MRnf
                        MicroHs.Package
                        MicroHs.Parse
                        MicroHs.State
@@ -108,6 +107,7 @@
   if impl(ghc)
     hs-source-dirs:    ghc src
     build-depends:     base         >= 4.10 && < 4.30,
+                       bytestring   >= 0.5 && < 0.20,
                        deepseq      >= 1.1 && < 1.8,
                        filepath     >= 1.1 && < 1.8,
                        ghc-prim     >= 0.5 && < 0.15,
@@ -116,6 +116,8 @@
                        process      >= 1.6 && < 1.10,
                        directory    >= 1.2 && < 1.6,
                        text         >= 2.0 && < 2.5,
+                       array        >= 0.5 && < 0.6,
+                       ghc-internal >= 9.0 && < 10.0,
 
   if impl(hugs)
     hs-source-dirs:    hugs src
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -46,10 +46,14 @@
  * There is only deriving for `Bounded`, `Enum`, `Eq`, `Ord`, `Show`, and `Typeable`.
  * Kind variables need an explicit `forall`.
  * Always enabled extension:
+   * AllowAmbiguousTypes
    * BangPatterns
    * BinaryLiterals
    * ConstraintKinds
    * DefaultSignatures
+   * DeriveAnyClass
+   * DerivingStrategies
+   * DerivingVia
    * DoAndIfThenElse
    * DuplicateRecordFields
    * EmptyCase
@@ -63,11 +67,14 @@
    * FunctionalDependencies
    * GADTs
    * GADTsyntax
+   * GeneralizedNewtypeDeriving
    * ImportShadowing
    * ImportQualifiedPost
    * IncoherentInstances
+   * InstanceSigs
    * KindSignatures
    * LambdaCase
+   * LiberalTypesynonyms
    * MonoLocalBinds
    * MultilineStrings
    * MultiParamTypeClasses
@@ -98,15 +105,16 @@
    * TypeSynonymInstances
    * UndecidableInstances
    * UndecidableSuperClasses
+   * UnicodeSyntax
    * ViewPatterns
  * The only extension that is not always on is `CPP`.
  * `main` in the top module given to `mhs` serves at the program entry point.
  * Many things that should be an error (but which are mostly harmless) are not reported.
- * Text file I/O uses UTF8, but the source code does not allow Unicode.
+ * Text file I/O always uses UTF8, as does the source code.
  * The `BangPatterns` extension is parsed, but only effective at the a top level `let`/`where`.
  * More differences that I don't remember right now.
 
-Mutually recursive modules are allowed the same way as with GHC, using `.hs-boot` files. 
+Mutually recursive modules are allowed the same way as with GHC, using `.hs-boot` files.
 
 ## Example
 The file `Example.hs` contains the following:
@@ -138,6 +146,12 @@
 with the notable exception that `Foldable` and `Traversable` are not part of the `Prelude`.
 They can be imported separately, though.
 
+### Not importing `Prelude`
+To completely avoid importing the prelude (which can be needed in base to
+avoid circular imports) use the incantation `import qualified Prelude()`.
+This will not even try to open `Prelude.hs`.  It also avoids the automagic
+(qualified) import of `Mhs.Builtin` that normally happens.
+
 ## Types
 There are some primitive data types, e.g `Int`, `IO`, `Ptr`, and `Double`.
 These are known by the runtime system and various primitive operations work on them.
@@ -179,7 +193,8 @@
 * `-PPKG` create package `PKG`
 * `-L[FILE]` list all modules in a package
 * `-Q FILE [DIR]` install package
-*  `--` marks end of compiler arguments
+* `-ddump-PASS` debug, show AST after `PASS`.  Possible passes `parse`, `derive`, `typecheck`, `desugar`, `toplevel`, `combinator`, `all`
+* `--` marks end of compiler arguments
 
 With the `-v` flag the processing time for each module is reported.
 E.g.
@@ -342,7 +357,7 @@
 * `cpphs`
 * `hscolour`
 * `mtl` changes not merged yet, use [github.com/augustss/mtl](https://github.com/augustss/mtl)
-* `parsec` changes not merged yet, use [github.com/augustss/aprsec](https://github.com/augustss/parsec)
+* `parsec` changes not merged yet, use [github.com/augustss/parsec](https://github.com/augustss/parsec)
 * `polyparse`
 * `pretty`
 * `time`
@@ -379,6 +394,7 @@
 * `-rFILE` read combinators from `FILE`, instead of `out.comb`
 * `-v` be more verbose, flag can be repeated
 * `-T` generate profiling stats (if compiled with `-T` as well)
+* `-B` ring the bell on every GC
 * `-oFILE` just read the input, run garbage collection, and write out the resulting graph to file.
 
 For example, `bin/mhseval +RTS -H1M -v -RTS hello` runs `out.comb` and the program gets the argument `hello`,
@@ -449,10 +465,13 @@
 To compile with Hugs you need [a slightly patched version of Hugs](https://github.com/augustss/hugs98-plus-Sep2006)
 and also the [hugs branch of MicroHs](https://github.com/augustss/MicroHs/tree/hugs).
 
+The patched version of Hugs is needed to work around undefined behavior with arithmatic overflow.
+Hugs provided Linux distribtions or other third party package managers may or may not work.
+
 ## Using GMP for `Integer`
 The default implementation of the `Integer` type is written is Haskell and is quite slow.
-It is possible to use GMP [GNU Multi Precision](https://gmplib.org/) instead.
-To use GMP you need to uncomment the first few line in the `Makefile`, and also
+It is possible to use the [GMP](https://gmplib.org/) library instead.
+To use GMP you need to uncomment the first few lines in the `Makefile`, and also
 modify the definition that directs the C compiler where to find GMP.
 
 ***NOTE*** To switch between using and not using GMP you need to do `make clean`.
@@ -470,14 +489,86 @@
 
 To identify that it is MicroHs that is the compiler it defines the symbol `__MHS__`.
 
+# Contributing
+Contributions are very welcome!
+
+When modifying the compiler, run `make newmhs` or `make newmhsz` (the latter compresses the binary)
+to generate a compiler that includes your changes.
+
+## Libraries
+
+The libraries live in the `lib/` directory. Adding missing functions/instances/types from the report is a welcome contribution.
+Common things from `base` and GHC boot libraries that use a lot of GHC-specific code (such as `array`, `bytestring`, `text`, ...) can also be added.
+
+## Tests
+
+The test suite is located in the `tests/` directory.
+
+To add a new test, create a `MyTest.hs` file and a corresponding `MyTest.ref` file for the expected output.
+Then add it to the `test` rule in `tests/Makefile`:
+```makefile
+	$(TMHS) MyTest     && $(EVAL) > MyTest.out     && diff MyTest.ref MyTest.out
+```
+
+If you want to test that a module fails to compile with a certain error message,
+add it to `tests/errmsg.test`, for example:
+```
+module E() where
+x :: Int
+x = y
+-----
+"../tmp/E.hs": line 4, col 5: undefined value: y
+
+=====
+```
+
+To run the test suite, do
+* `make runtest` to use the GHC-compiled compiler
+* `make runtestmhs` to use the MicroHs-compiled compiler
+* `make runtestemscripten` to use the MicroHs-compiled compiler targeting JavaScript
+
+## Primitives
+
+If you want to add a new primitive, you need to modify a few things:
+* in `src/runtime/eval.c`
+  - add a variant to `enum node_tag`
+  - add an entry to the `primops` table (mapping the name of your primitive to the tag)
+  - add a `case` in `printrec`
+  - implement the primitive by adding a `case` in `evali` (you can use the other primitives as a guide)
+* in `src/MicroHs/Translate.hs`
+  - add an entry to the `primTable`, to make the primitive available in the interactive mode
+* in `ghc/PrimTable.hs`
+  - add an entry to `primOps`, if the primitive should be available in the GHC-compiled interactive mode
+* in `hugs/PrimTable.hs`
+  - add an entry to `primOps`, if the primitive should be available in the Hugs-compiled interactive mode
+
+Then you can use the primitive via the `_primitive` keyword (`_primitive "myPrimitive"`).
+
+# Thank You
+A big thanks goes to the people who have contributed to MicroHs:
+@dmjio
+gay@disroot.org
+@gergoerdi
+@jmaessen
+@juhp
+@kolmodin
+@konsumlamm
+@liolin
+@rewbert
+@thimc
+@treeowl
+@TristanCacqueray
+@yobson
+
+
 # FAQ
-* 
+*
   * Q: When will it get _insert feature_?
   * A: Maybe some time, maybe never.  But it doesn't hurt to ask for it.
-* 
+*
   * Q: Why are the error messages so bad?
   * A: Error messages are boring.
-* 
+*
   * Q: Why is the so much source code?
   * A: I wonder this myself.  10000+ lines of Haskell seems excessive.
        6000+ lines of C is also more than I'd like for such a simple system.
diff --git a/Tools/Addcombs.hs b/Tools/Addcombs.hs
--- a/Tools/Addcombs.hs
+++ b/Tools/Addcombs.hs
@@ -23,7 +23,7 @@
   file <- hGetContents ifile
   let size = length file
       chunks = chunkify 20 file
-  hPutStrLn ofile $ "static unsigned char combexprdata[] = {"
+  hPutStrLn ofile "static unsigned char combexprdata[] = {"
   mapM_ (hPutStrLn ofile . showChunk) chunks
   hPutStrLn ofile "};"
   hPutStrLn ofile "const unsigned char *combexpr = combexprdata;"
diff --git a/Tools/Compress.hs b/Tools/Compress.hs
--- a/Tools/Compress.hs
+++ b/Tools/Compress.hs
@@ -72,6 +72,6 @@
     error "Non-printable ASCII in input"
   let bs = compress initTable f []
   ofile <- openBinaryFile ofn WriteMode
-  hPutStr ofile $ 'Z' : (map chr $ toBytes bs)
+  hPutStr ofile $ 'Z' : map chr (toBytes bs)
   hClose ifile
   hClose ofile
diff --git a/generated/cpphs.c b/generated/cpphs.c
--- a/generated/cpphs.c
+++ b/generated/cpphs.c
@@ -1,1721 +1,2164 @@
 static unsigned char data[] = {
-122,76,90,49,220,133,0,0,31,118,55,46,48,10,56,51,52,10,65,32,
-95,48,32,95,50,52,32,64,95,50,53,32,95,51,53,32,64,95,51,55,
-32,1,64,64,224,22,4,1,52,48,224,22,13,0,50,224,22,0,1,49,
-49,192,23,6,51,49,32,64,67,39,32,224,17,0,5,64,66,32,95,49,
-50,160,11,7,83,32,83,32,95,50,51,54,64,4,0,56,96,45,0,57,
-64,25,24,49,32,64,102,114,111,109,85,84,70,56,32,34,45,45,99,112,
-112,34,32,64,64,64,64,73,64,90,1,50,53,64,97,96,70,224,100,0,
-1,53,57,64,76,3,39,32,83,39,224,191,0,10,64,64,67,39,66,32,
-66,32,95,50,54,64,38,0,50,96,58,224,105,23,6,118,101,114,115,105,
-111,110,128,109,96,182,192,77,64,72,8,55,54,32,64,67,32,95,49,52,
-64,64,64,5,7,79,32,35,51,50,32,64,75,96,91,0,55,96,150,8,
-64,95,50,56,51,32,95,50,56,96,130,224,147,59,2,104,101,108,160,254,
-224,144,12,65,7,2,52,56,32,224,49,1,6,85,115,97,103,101,58,32,
-96,50,224,173,4,224,34,1,20,32,91,102,105,108,101,32,46,46,46,93,
-32,91,32,45,68,115,121,109,32,124,128,7,3,61,118,97,108,64,11,12,
-73,112,97,116,104,32,93,42,32,32,91,45,79,64,45,4,93,92,49,48,
-38,64,84,224,75,6,17,92,57,38,92,57,38,91,45,45,110,111,109,97,
-99,114,111,93,32,96,11,3,108,105,110,101,96,10,64,8,5,112,114,97,
-103,109,97,96,14,224,10,2,3,116,101,120,116,224,85,24,4,115,116,114,
-105,112,96,46,96,9,3,45,101,111,108,96,13,5,104,97,115,104,101,115,
-128,97,4,97,121,111,117,116,96,10,3,117,110,108,105,224,83,1,224,78,
-8,0,32,98,75,3,32,115,116,100,64,7,8,45,111,112,116,105,111,110,
-115,32,96,58,7,105,110,99,108,117,100,101,61,64,235,4,110,97,109,101,
-93,161,115,225,210,8,7,66,32,67,32,67,39,32,83,98,214,128,8,160,
-9,160,12,96,13,224,29,0,0,39,97,171,0,66,64,11,224,8,5,0,
-39,65,187,0,66,226,27,2,0,66,98,42,226,26,3,1,56,53,224,91,
-0,224,38,3,193,250,128,10,225,253,6,6,110,107,110,111,119,110,32,128,
-219,130,5,64,178,67,129,98,9,1,50,56,128,57,224,55,6,10,44,32,
-102,111,114,32,118,97,108,105,100,160,59,4,115,32,116,114,121,226,70,5,
-226,65,2,130,151,193,105,225,38,4,3,55,32,35,49,225,59,0,96,123,
-96,237,224,234,2,64,141,224,231,1,96,155,5,53,53,32,95,55,56,64,
-245,3,57,56,32,64,96,64,228,91,1,1,55,54,224,169,2,18,65,116,
-32,109,111,115,116,32,111,110,101,32,111,117,116,112,117,116,32,98,205,20,
-40,45,79,41,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,
-100,96,156,224,152,2,64,111,128,0,131,153,0,67,161,69,68,134,0,56,
-64,126,129,110,0,66,161,155,1,50,54,196,169,3,64,95,56,48,65,141,
-7,95,50,50,50,32,95,49,56,128,72,129,233,128,26,2,95,49,56,160,
-246,2,95,56,48,65,99,2,95,56,48,101,11,1,56,48,96,215,1,56,
-48,68,164,2,64,95,56,68,50,192,0,9,58,56,51,51,32,64,10,65,
-32,89,66,25,1,32,66,96,142,130,95,98,31,64,5,226,66,0,0,66,
-69,144,96,164,64,185,128,188,224,9,11,160,65,66,104,9,66,32,95,55,
-54,51,32,64,95,53,96,177,160,6,1,64,66,96,111,1,80,32,68,185,
-192,119,161,16,64,251,128,65,2,32,61,61,65,137,128,212,64,125,0,85,
-160,25,1,95,49,97,183,128,0,224,82,43,128,61,224,82,68,0,51,224,
-82,29,1,95,56,129,205,192,72,160,2,224,60,0,98,11,129,124,128,20,
-224,39,4,64,116,224,39,4,128,16,224,17,0,66,71,224,16,6,225,135,
-0,0,83,101,133,0,51,67,73,4,54,32,64,35,52,66,76,128,0,224,
-44,2,192,63,224,64,7,0,66,166,120,224,62,0,0,55,98,75,96,0,
-195,94,128,104,226,192,4,164,98,66,19,0,80,96,26,225,20,5,224,101,
-2,128,103,224,101,7,224,164,2,224,43,0,64,91,3,83,32,95,56,71,
-215,1,95,51,135,139,224,133,10,224,82,1,97,141,1,39,32,64,128,224,
-127,7,224,52,1,97,72,224,51,3,160,26,96,53,68,31,64,54,130,13,
-2,95,49,54,64,150,129,182,96,48,163,42,225,96,6,128,153,193,84,225,
-72,15,160,38,98,92,96,101,192,17,128,130,224,175,5,96,40,192,129,160,
-135,160,6,0,58,99,214,3,10,65,32,83,96,145,96,153,3,32,95,56,
-50,96,170,128,131,64,162,224,173,16,97,105,96,38,224,167,13,0,54,99,
-247,162,116,164,127,65,47,2,95,56,50,68,107,136,87,3,80,32,64,85,
-99,45,96,73,132,209,3,95,50,51,48,136,103,200,92,4,79,32,35,52,
-57,136,181,64,0,2,85,32,65,64,9,3,95,51,48,49,99,53,224,115,
-0,2,64,35,54,229,199,1,224,188,30,2,66,32,90,128,193,224,191,7,
-102,202,69,35,0,50,64,178,193,98,132,180,225,148,9,96,44,0,83,64,
-207,226,254,14,99,238,193,8,97,5,64,234,2,55,54,53,160,33,230,46,
-1,3,47,92,57,50,230,163,1,96,115,64,230,2,50,52,57,160,42,233,
-118,14,200,15,128,58,165,220,224,113,4,0,57,64,59,4,52,56,32,35,
-49,65,96,96,0,74,160,3,67,32,95,54,64,135,105,211,69,238,64,29,
-0,58,99,47,3,10,65,32,79,66,63,224,113,13,169,64,134,178,0,56,
-100,209,224,45,20,73,89,192,44,68,212,224,44,18,233,132,1,192,48,65,
-97,224,48,18,224,44,5,66,12,224,44,18,73,200,192,42,68,151,224,42,
-18,105,196,192,43,65,31,224,43,23,73,240,192,47,66,53,224,47,18,138,
-18,160,44,0,50,65,117,225,17,19,106,52,192,44,65,219,224,44,18,106,
-86,192,43,67,121,225,151,20,2,119,97,114,140,65,2,95,56,50,65,196,
-195,104,96,0,0,58,98,15,1,10,65,99,173,134,182,3,85,32,64,58,
-98,77,224,21,0,64,98,128,21,0,56,96,21,64,19,1,52,32,66,93,
-0,58,99,59,224,40,0,64,183,128,40,0,54,160,40,3,95,49,53,48,
-67,219,1,95,49,99,100,0,58,100,129,100,150,224,1,8,3,39,32,95,
-56,66,186,72,231,109,186,108,138,0,56,64,125,162,126,224,26,14,203,7,
-224,27,11,134,49,224,19,5,66,62,224,18,6,100,0,106,238,72,255,224,
-27,9,224,17,5,100,251,224,112,14,135,8,224,19,4,97,251,224,18,6,
-100,201,224,18,5,168,99,224,84,10,97,182,65,59,0,52,225,126,0,0,
-48,193,126,137,174,3,80,32,35,57,192,17,133,247,3,80,32,35,56,192,
-17,131,234,3,80,32,35,55,192,17,129,243,2,80,32,35,193,198,64,183,
-128,17,0,53,192,17,225,235,0,0,54,192,17,129,234,3,80,32,35,51,
-192,17,193,230,74,200,128,17,129,222,64,162,192,17,224,180,0,192,179,65,
-203,79,217,1,54,54,137,68,199,58,168,232,2,67,32,60,69,82,161,145,
-224,25,9,138,1,224,26,13,97,40,139,71,231,138,0,160,26,172,172,0,
-85,70,147,69,194,233,171,1,64,25,130,167,1,64,85,194,168,129,224,0,
-85,64,61,104,187,224,49,5,64,102,160,49,128,37,134,12,133,98,128,0,
-224,132,13,161,227,224,87,15,64,30,224,87,21,224,59,17,65,21,224,59,
-10,2,56,49,49,132,28,135,123,224,160,1,225,67,15,98,192,224,189,13,
-224,91,1,225,66,7,103,210,225,66,15,224,44,6,64,96,224,43,11,224,
-116,13,168,103,224,70,9,102,205,224,114,30,99,194,224,114,11,225,3,14,
-194,70,224,25,9,136,9,224,168,11,100,85,224,124,11,109,123,224,168,30,
-137,193,225,27,31,226,210,16,226,209,20,224,43,6,226,203,2,225,27,6,
-192,115,227,98,5,225,0,16,226,219,1,224,97,6,226,213,2,224,141,24,
-226,197,2,224,141,5,224,44,11,226,117,15,69,90,1,49,55,98,252,64,
-123,0,58,96,6,70,116,0,39,100,116,107,11,173,176,106,167,233,247,1,
-204,81,64,27,106,206,1,49,53,96,240,112,159,0,51,64,128,167,61,224,
-16,1,106,173,160,17,74,7,99,113,96,116,133,118,236,212,3,192,1,108,
-82,160,0,224,29,20,224,26,17,224,23,14,224,20,11,224,17,8,224,14,
-5,224,11,2,192,8,109,157,128,0,0,58,103,147,101,192,71,197,1,57,
-48,243,21,3,30,51,52,38,99,112,112,104,115,115,114,99,47,109,97,108,
-99,111,108,109,45,119,97,108,108,97,99,101,45,117,110,105,84,190,1,101,
-47,96,33,6,45,49,46,50,48,46,57,128,12,2,46,104,115,64,58,4,
-44,56,48,58,49,138,207,102,23,80,144,2,10,65,32,65,99,0,75,66,
-193,0,58,112,169,96,122,138,239,0,90,204,105,0,58,112,202,96,43,0,
-90,224,43,0,0,54,96,17,241,47,3,65,239,245,231,0,193,169,129,242,
-143,7,224,29,1,173,94,2,55,57,57,225,228,1,66,103,98,222,242,238,
-2,2,95,56,48,86,108,2,53,54,48,150,118,142,197,1,56,48,143,239,
-1,64,80,233,136,15,3,115,116,100,105,201,133,0,48,64,72,108,77,1,
-95,53,143,56,0,58,113,177,71,19,2,53,55,56,150,230,0,58,96,38,
-96,208,65,147,2,95,56,48,78,224,1,56,48,64,254,131,118,1,95,53,
-108,118,64,205,246,122,1,2,53,55,52,243,125,3,14,84,70,45,56,47,
-47,82,79,85,78,68,84,82,73,80,172,119,97,25,243,196,4,87,47,96,
-201,1,50,55,129,13,1,95,53,109,108,0,58,96,217,1,10,65,65,146,
-0,50,96,148,131,73,225,101,3,225,68,2,1,95,53,110,124,97,54,224,
-22,2,129,114,225,67,1,128,91,247,118,1,96,103,131,45,96,128,97,89,
-0,58,97,105,131,181,160,174,225,173,2,1,95,55,67,200,64,102,0,55,
-83,160,1,95,55,64,82,1,95,55,119,120,0,58,97,197,128,57,226,11,
-13,96,234,0,55,142,3,195,12,224,142,3,228,15,3,98,0,97,130,2,
-55,53,55,71,85,102,76,1,55,57,101,239,145,115,99,52,233,185,0,0,
-55,78,205,109,214,133,29,234,86,1,0,55,85,178,2,95,55,56,129,182,
-2,95,50,56,109,178,83,192,0,54,179,132,96,136,2,54,49,48,64,214,
-137,1,171,25,0,55,68,108,128,58,128,70,64,103,160,6,241,21,0,0,
-58,97,11,65,158,1,32,80,66,237,77,254,0,75,88,21,67,194,98,211,
-0,58,96,86,162,85,64,106,160,133,64,142,64,11,64,139,0,55,117,145,
-98,245,120,96,97,42,85,4,101,110,0,55,96,46,2,95,55,57,193,135,
-0,57,66,172,97,14,96,120,148,56,227,56,0,0,79,67,78,176,147,131,
-85,129,206,145,3,241,46,17,179,64,164,145,114,134,227,182,0,239,126,8,
-206,240,197,207,145,37,224,119,0,2,64,64,82,69,155,161,37,162,78,160,
-127,166,219,224,122,10,224,39,25,163,254,146,25,64,40,100,66,79,194,209,
-165,224,144,27,224,180,28,130,118,0,58,97,108,165,16,64,37,226,99,1,
-98,102,98,138,242,133,20,0,57,224,151,1,64,177,193,70,138,23,228,55,
-1,10,98,101,103,105,110,123,99,111,100,101,125,132,50,160,158,161,253,242,
-248,4,241,137,2,201,46,225,162,10,224,120,9,240,241,22,2,101,110,100,
-224,128,3,224,130,7,226,128,0,228,93,0,97,62,2,95,55,57,162,11,
-96,0,132,55,225,195,18,0,54,224,150,3,224,181,9,69,136,192,30,128,
-96,211,78,1,95,51,69,158,128,247,72,46,64,208,0,57,64,55,0,54,
-228,241,3,1,55,57,116,149,70,44,0,53,119,117,2,64,95,50,68,155,
-131,56,96,123,224,200,0,224,100,2,96,57,70,102,116,0,164,26,224,241,
-1,247,143,0,128,114,0,51,102,19,225,30,0,0,57,105,208,160,44,225,
-52,14,0,58,96,8,69,214,0,50,133,215,96,53,3,10,65,32,90,160,
-1,86,180,96,38,133,238,115,70,224,4,3,96,6,168,38,0,58,96,229,
-224,37,11,0,90,66,207,160,34,133,203,3,75,32,75,51,64,110,64,142,
-96,49,0,89,162,50,161,70,226,185,11,0,54,101,37,69,19,64,141,3,
-95,49,57,56,110,74,96,0,2,66,32,82,160,64,213,47,71,232,249,239,
-0,128,76,130,5,150,202,135,247,224,2,0,182,223,224,21,13,164,169,224,
-2,0,224,43,0,224,15,2,134,59,162,89,64,3,224,19,0,193,36,224,
-16,2,247,79,0,130,30,224,154,11,234,131,0,192,83,228,248,2,96,96,
-0,80,101,201,69,217,128,24,1,95,50,81,170,212,227,96,5,3,95,55,
-56,55,227,74,3,6,112,114,111,103,114,97,109,99,72,224,21,1,5,99,
-111,109,109,101,110,146,70,228,134,1,118,253,228,191,4,164,217,163,181,102,
-9,192,49,224,228,3,160,225,246,163,3,107,100,4,67,32,95,57,55,129,
-186,172,60,224,61,3,193,17,161,14,161,11,224,255,4,133,132,224,249,4,
-96,253,224,176,41,224,177,53,192,60,225,196,46,162,89,128,157,96,30,67,
-61,227,78,0,225,198,26,225,176,3,225,220,13,181,241,225,203,103,68,65,
-103,220,128,213,198,192,161,29,227,152,1,224,68,19,0,58,96,140,104,65,
-161,51,96,60,160,5,230,165,2,230,44,12,76,77,64,3,193,5,248,27,
-3,195,151,128,212,254,102,6,4,76,105,110,101,32,160,53,193,51,128,35,
-4,64,95,49,51,52,64,203,193,61,224,59,8,0,58,160,56,129,39,64,
-50,224,34,8,0,32,86,232,5,32,98,101,102,111,114,160,102,102,95,254,
-186,5,64,35,0,46,254,185,4,192,172,97,141,224,10,8,224,101,8,1,
-73,110,158,113,192,63,225,252,3,64,107,224,251,14,2,32,97,116,128,159,
-224,255,138,96,0,225,177,163,0,58,99,172,98,191,64,1,2,80,32,73,
-139,113,195,22,167,202,227,24,0,231,218,3,132,72,224,195,10,231,255,4,
-224,14,0,64,67,0,58,107,164,176,93,75,185,2,55,32,95,74,143,1,
-95,54,227,128,0,78,237,64,25,0,53,80,135,2,95,55,54,202,74,131,
-25,74,166,103,100,172,94,0,56,64,60,0,55,79,100,2,95,55,56,64,
-112,204,87,108,247,236,16,3,236,145,31,96,173,0,80,64,39,77,53,227,
-181,1,216,126,0,58,109,127,239,239,1,175,200,96,24,136,156,0,85,128,
-22,224,24,3,136,165,96,24,64,2,97,25,0,58,96,176,128,22,0,51,
-168,191,160,49,64,27,241,133,3,0,89,193,126,64,1,134,82,97,138,173,
-248,140,175,158,69,249,37,0,133,55,197,202,232,51,7,160,21,96,18,192,
-88,140,252,224,35,7,224,41,3,224,43,1,96,136,65,251,228,223,20,7,
-95,95,70,73,76,69,95,95,227,33,3,224,91,65,2,76,73,78,224,91,
-21,166,56,224,91,43,2,68,65,84,224,91,80,2,84,73,77,224,91,6,
-96,57,192,89,255,195,0,106,75,98,237,237,34,1,4,67,32,95,54,53,
-203,221,143,221,158,210,224,163,2,224,2,7,192,30,225,115,3,224,106,2,
-224,193,7,224,49,2,224,151,15,224,85,0,224,14,3,207,61,196,62,224,
-30,0,230,3,0,224,173,6,224,118,2,234,112,6,224,18,2,128,56,64,
-200,240,214,0,64,3,224,24,3,164,130,96,18,165,90,99,229,149,89,192,
-5,152,97,225,34,1,0,79,128,149,64,48,72,209,192,189,3,95,54,51,
-51,158,216,0,54,64,87,127,191,175,49,104,163,252,133,2,224,173,3,224,
-175,1,224,22,65,225,172,13,160,25,97,15,97,80,141,151,64,22,225,95,
-5,224,89,5,118,135,160,0,226,202,3,128,85,192,35,96,85,224,59,4,
-226,231,12,227,2,0,129,65,161,45,96,137,0,95,81,202,68,157,114,222,
-1,54,54,177,15,224,210,4,182,167,104,231,192,115,128,88,242,234,3,96,
-15,1,54,55,99,65,64,16,230,48,7,230,33,8,224,101,0,226,46,6,
-226,52,3,224,233,2,226,54,1,234,120,5,226,58,16,227,94,4,98,62,
-224,56,1,110,82,129,43,1,95,54,129,131,226,41,6,226,252,7,103,24,
-246,150,55,22,76,97,110,103,117,97,103,101,47,80,114,101,112,114,111,99,
-101,115,115,111,114,47,67,64,34,8,47,77,97,99,114,111,80,97,115,246,
-182,0,5,49,53,50,58,50,50,196,119,225,112,6,2,95,53,49,161,105,
-65,90,230,90,0,2,95,55,55,83,212,0,55,234,182,8,7,37,72,58,
-37,77,58,37,83,234,190,1,2,95,55,55,179,209,224,238,9,224,108,55,
-6,100,32,37,98,32,37,89,224,108,33,65,222,96,18,64,117,232,154,1,
-2,95,55,55,104,19,224,38,17,1,52,50,64,43,98,82,2,95,55,55,
-249,198,2,224,101,6,227,158,2,97,251,96,223,64,30,244,182,3,232,182,
-0,160,2,96,19,226,69,3,231,150,7,160,2,224,39,12,226,192,0,224,
-120,9,224,124,15,224,181,8,224,141,3,131,233,234,139,0,224,194,17,224,
-97,36,173,85,67,246,104,204,138,36,160,231,128,10,224,75,0,64,142,3,
-95,52,51,49,97,126,205,92,241,50,7,141,106,2,95,55,55,64,97,245,
-50,2,103,107,0,55,152,135,225,48,0,1,95,55,84,111,129,26,1,95,
-54,73,255,144,113,64,0,0,58,106,44,105,83,247,148,4,1,95,50,119,
-19,96,149,247,75,1,170,234,169,85,64,61,64,106,235,40,2,0,75,91,
-147,0,49,227,190,2,75,93,6,98,114,101,97,107,115,44,76,162,227,205,
-70,6,72,97,115,104,68,101,102,75,193,163,206,3,50,53,58,54,131,12,
-224,138,130,107,190,0,75,154,178,1,75,50,96,7,0,58,97,186,202,231,
-64,14,219,3,153,156,64,17,0,54,96,17,228,31,1,0,55,90,34,225,
-143,3,66,49,89,226,76,213,0,50,73,95,118,237,2,35,49,48,89,108,
-129,158,139,149,2,73,32,58,96,40,64,78,2,55,55,50,64,13,139,124,
-3,94,71,69,84,73,121,3,77,73,76,76,96,36,139,124,112,192,225,57,
-1,16,100,101,102,97,117,108,116,84,105,109,101,76,111,99,97,108,101,64,
-214,0,58,100,146,148,118,230,55,0,228,86,3,67,20,1,49,53,248,171,
-0,0,55,130,103,148,239,213,109,172,134,195,78,220,27,227,232,4,224,30,
-1,128,16,91,210,68,143,160,40,227,138,1,120,221,234,104,12,2,79,32,
-35,90,133,131,159,224,57,2,224,132,6,224,112,1,224,9,8,0,39,236,
-110,5,172,125,163,114,202,137,244,246,9,224,5,3,245,2,27,224,233,0,
-229,22,7,236,151,6,171,107,136,107,1,85,32,132,95,225,39,2,128,67,
-247,0,0,225,15,11,237,189,2,228,206,3,157,147,225,144,1,160,10,1,
-95,53,160,23,231,195,3,193,145,233,52,9,225,1,51,225,101,3,243,159,
-0,229,248,10,233,129,12,225,21,12,224,81,4,225,27,27,0,52,225,27,
-4,224,124,4,96,229,232,223,0,64,182,249,227,0,225,26,1,224,110,1,
-226,211,4,224,198,9,160,2,224,29,1,166,119,231,29,6,224,188,0,97,
-73,224,17,3,243,227,3,96,214,161,150,97,130,161,161,179,177,1,95,55,
-179,254,64,0,234,172,0,224,105,1,236,226,6,224,1,1,237,190,15,227,
-85,4,224,57,2,224,85,13,224,79,1,226,149,33,192,199,100,224,192,188,
-193,134,160,106,244,137,1,1,49,53,244,138,6,224,54,3,224,53,16,244,
-191,7,224,52,3,0,75,225,187,4,157,51,129,237,160,6,135,72,224,38,
-2,64,16,64,98,160,67,227,56,2,91,103,81,110,0,73,167,126,226,196,
-1,226,184,15,226,170,3,250,28,2,128,113,64,5,0,58,108,231,231,188,
-42,104,151,0,58,104,109,69,237,94,163,103,187,128,212,0,67,75,199,165,
-181,73,244,192,96,182,204,96,2,236,147,3,239,137,3,133,219,162,2,2,
-64,95,55,64,106,191,201,2,95,55,54,158,116,0,54,97,42,160,179,108,
-109,128,233,2,83,32,85,66,20,242,91,5,98,226,160,4,230,102,1,64,
-177,179,101,240,79,12,7,35,105,110,99,108,117,100,101,103,229,180,39,192,
-59,246,115,16,0,49,244,3,2,160,92,224,81,2,116,75,0,49,224,80,
-1,224,140,1,0,53,65,251,224,75,18,64,242,129,184,225,141,2,5,64,
-83,32,95,50,53,75,217,92,100,1,95,49,73,134,64,117,159,181,1,54,
-53,175,103,224,173,13,3,57,50,38,47,160,94,161,85,65,170,0,54,243,
-28,0,110,8,130,119,161,174,226,15,0,1,51,48,72,35,98,86,2,95,
-50,51,102,246,160,42,0,58,64,117,135,253,5,53,49,32,75,32,85,228,
-96,0,227,184,1,129,26,224,11,0,1,95,55,238,202,0,0,58,96,199,
-243,156,0,224,46,1,224,61,17,192,8,220,121,64,75,244,16,0,128,144,
-244,11,0,0,52,169,53,66,59,201,53,169,39,64,255,128,18,0,50,105,
-75,1,64,58,98,111,226,181,0,231,199,3,132,145,135,237,229,139,2,225,
-40,1,196,175,194,240,160,164,2,95,55,53,96,232,245,64,1,99,196,3,
-95,50,57,49,195,53,225,105,3,99,0,67,206,1,95,55,75,40,227,121,
-0,0,54,141,159,0,95,75,143,64,13,130,9,1,95,55,65,233,0,58,
-99,43,245,66,1,161,4,96,206,182,141,80,83,86,64,175,244,96,69,160,
-114,1,95,55,66,138,0,85,100,227,201,138,0,52,108,152,64,48,229,82,
-0,1,95,55,83,39,0,58,96,195,106,12,4,53,52,32,95,54,69,197,
-128,197,0,58,96,31,249,185,3,231,177,17,132,240,129,48,134,177,132,4,
-2,95,55,49,108,227,128,93,129,243,64,165,128,13,229,165,2,96,35,2,
-54,56,55,234,184,0,163,36,0,55,64,13,0,58,96,46,226,79,2,137,
-112,225,179,1,225,188,4,230,95,4,232,142,1,225,135,0,64,201,228,149,
-0,102,81,202,132,2,95,50,52,64,209,0,50,123,62,64,15,0,48,235,
-92,1,4,50,55,53,32,95,64,30,228,14,9,31,85,110,109,97,116,99,
-104,101,100,32,35,105,102,58,32,112,111,115,105,116,105,111,110,115,32,111,
-102,32,111,112,101,110,12,32,99,111,110,116,101,120,116,32,97,114,101,58,
-228,13,0,64,83,95,45,131,229,107,43,0,50,95,76,129,155,196,28,232,
-80,1,134,7,98,212,224,227,6,202,109,0,85,229,225,1,232,135,3,224,
-42,5,243,89,25,231,175,4,200,117,231,178,3,129,57,200,125,224,25,3,
-243,30,0,224,69,9,224,72,0,224,184,7,96,75,224,146,13,163,179,167,
-209,114,117,67,29,185,109,192,0,226,6,10,160,53,224,31,20,226,44,0,
-130,183,224,171,2,163,250,224,36,6,224,71,16,160,43,224,146,2,224,41,
-15,224,50,1,224,191,26,224,45,2,224,93,5,192,175,224,31,4,224,2,
-12,224,52,4,224,191,23,224,56,17,99,32,224,42,2,224,5,6,225,61,
-7,224,60,6,225,211,8,224,1,5,248,15,25,0,100,111,73,248,13,3,
-224,0,0,224,189,6,224,152,3,224,14,9,224,152,72,4,117,110,100,101,
-102,224,151,27,225,103,6,225,69,7,224,151,71,1,105,102,224,152,144,224,
-151,15,227,123,3,224,151,12,192,11,227,213,0,128,0,224,143,19,224,190,
-7,224,43,19,224,187,27,224,184,11,225,79,6,226,113,6,224,210,4,224,
-141,68,2,101,108,115,227,17,12,224,143,113,225,31,13,172,14,120,55,64,
-2,64,130,248,220,4,224,5,27,245,25,2,240,55,1,224,139,18,1,110,
-100,224,140,1,201,187,231,212,51,96,80,84,38,96,84,231,170,5,231,113,
-14,192,0,225,143,112,225,3,3,224,0,3,224,144,111,5,112,114,97,103,
-109,97,224,145,11,243,51,0,226,33,8,192,10,128,122,143,16,224,22,3,
-192,146,104,136,224,11,10,241,48,9,128,126,192,16,253,85,8,128,245,232,
-107,6,233,112,4,65,20,239,138,2,87,68,186,252,107,254,224,212,0,160,
-0,233,4,3,224,178,4,225,120,7,228,216,4,224,159,1,224,1,1,225,
-147,11,224,39,11,64,1,228,204,26,143,17,225,142,9,231,206,6,229,120,
-12,224,112,9,224,156,10,224,36,9,64,1,224,153,25,6,119,97,114,110,
-105,110,103,224,153,8,226,153,4,226,168,6,224,125,65,4,101,114,114,111,
-114,224,123,11,224,2,9,225,15,0,224,99,6,224,161,0,224,69,2,224,
-140,11,228,203,29,80,104,224,143,7,224,73,7,209,114,100,229,82,26,0,
-49,79,125,224,0,1,227,94,1,192,183,128,127,192,9,227,89,1,224,8,
-4,64,201,205,204,139,238,2,95,49,53,94,79,1,50,57,68,238,1,50,
-57,100,238,128,72,114,148,101,4,122,10,64,67,2,95,50,57,142,146,0,
-66,99,37,1,51,48,252,141,2,160,27,143,235,224,211,6,225,205,6,225,
-226,2,228,10,1,224,38,8,224,19,10,224,16,7,224,13,0,110,125,131,
-212,128,28,128,20,70,1,1,51,48,65,135,5,51,54,48,32,95,53,64,
-10,192,0,227,219,3,226,12,34,237,32,9,64,1,236,235,14,0,83,64,
-71,225,97,0,225,197,0,65,44,238,148,2,192,0,225,211,12,231,51,4,
-230,233,3,193,166,64,76,0,54,83,171,70,241,2,95,53,48,124,26,128,
-22,231,8,0,128,15,231,11,5,0,87,131,148,20,58,32,117,110,107,110,
-111,119,110,32,100,105,114,101,99,116,105,118,101,32,35,130,157,98,2,147,
-191,224,61,8,78,241,2,105,110,32,231,60,10,224,205,9,166,3,97,236,
-128,152,226,41,4,226,13,9,129,203,1,95,53,124,246,225,167,6,226,245,
-255,128,2,226,245,4,128,31,160,45,226,247,11,118,122,2,95,50,51,225,
-168,1,225,92,3,128,206,0,50,66,63,225,249,49,231,4,2,160,228,130,
-163,65,119,128,5,194,162,128,168,231,122,26,96,31,226,64,3,163,12,227,
-9,1,128,185,226,237,3,226,184,48,224,148,31,64,0,231,232,7,161,208,
-232,185,16,118,80,247,85,1,226,17,1,226,190,0,129,224,224,131,1,96,
-50,1,53,56,119,179,83,247,0,54,93,145,2,95,50,57,129,64,225,74,
-1,224,98,0,0,85,161,89,192,86,228,64,3,121,15,224,193,1,128,145,
-64,5,148,187,247,16,16,225,42,2,1,49,52,82,213,88,50,128,0,224,
-213,0,151,179,148,238,224,80,2,117,14,163,199,224,0,0,224,222,1,160,
-9,161,98,0,50,96,86,224,160,6,225,138,16,99,122,97,13,226,206,1,
-224,49,21,3,95,54,55,54,116,212,192,106,224,49,35,128,16,64,0,226,
-220,1,229,151,3,225,194,1,225,226,3,193,134,2,95,55,49,225,184,4,
-129,160,227,172,1,84,200,224,119,2,160,34,100,169,130,4,224,41,15,64,
-21,65,243,85,139,0,49,218,59,224,59,38,96,180,102,143,224,70,6,192,
-55,98,148,161,33,128,13,128,6,64,102,160,86,2,95,55,49,152,105,225,
-197,12,228,176,2,196,230,226,160,2,224,28,8,224,15,5,224,64,3,64,
-26,224,33,5,69,2,133,169,228,39,0,64,18,99,251,164,124,228,9,0,
-160,10,247,50,4,123,191,0,48,64,19,1,52,57,128,19,165,248,96,0,
-224,206,8,76,110,135,181,1,95,50,123,100,233,224,2,128,80,134,99,70,
-15,96,112,226,65,7,252,54,0,194,191,192,17,224,91,5,98,211,248,119,
-0,224,116,24,224,58,17,193,37,162,13,128,217,202,92,96,20,228,124,2,
-162,46,192,15,162,52,224,14,1,136,229,192,53,96,32,134,44,192,101,97,
-79,135,90,0,55,65,79,160,232,0,55,96,251,64,45,2,95,52,51,64,
-243,130,135,224,197,7,192,46,231,110,5,0,55,64,78,224,30,2,160,153,
-128,19,224,14,5,160,178,162,54,160,9,96,8,167,39,120,178,226,223,3,
-254,28,0,248,251,13,64,32,100,217,1,51,51,254,212,0,110,65,1,64,
-35,228,211,1,225,124,1,64,252,0,56,96,76,131,232,222,52,2,95,51,
-48,253,72,0,226,186,3,161,154,73,192,226,115,1,226,198,1,230,244,12,
-232,111,6,225,0,5,192,83,230,80,14,164,225,232,52,0,226,215,1,229,
-163,1,225,98,2,225,231,1,64,124,202,248,235,44,4,139,35,224,49,4,
-225,129,0,224,77,5,160,31,248,24,4,224,30,6,224,114,1,248,25,41,
-224,156,5,229,157,7,224,2,1,248,224,10,226,76,0,224,90,10,138,57,
-224,90,0,239,67,9,224,32,3,224,206,8,139,254,0,50,80,109,192,209,
-110,21,245,214,13,224,43,26,96,39,224,30,17,192,73,224,0,1,227,233,
-2,236,215,7,224,166,2,224,195,1,224,189,5,224,105,15,244,24,6,225,
-21,6,224,78,42,244,247,4,224,173,5,224,77,1,224,74,1,0,67,224,
-74,17,243,34,5,128,46,99,44,101,137,128,19,226,50,1,96,151,96,13,
-128,22,237,145,1,224,57,2,125,41,128,34,66,61,192,122,93,49,0,64,
-132,39,96,80,97,103,128,101,64,34,253,4,0,128,34,200,166,232,182,10,
-244,190,92,224,207,3,112,164,225,93,0,128,103,69,100,224,217,11,224,251,
-24,161,87,196,73,230,240,0,160,0,225,26,1,238,201,4,233,55,36,97,
-51,125,84,236,185,2,194,9,224,10,2,232,28,4,194,55,226,243,1,232,
-193,0,224,240,19,230,192,1,137,17,224,223,7,224,122,1,161,77,235,108,
-4,225,254,0,198,86,192,85,231,228,12,231,203,13,228,135,5,99,172,239,
-74,4,226,173,2,97,148,231,93,34,224,186,1,231,64,18,230,51,9,231,
-62,85,231,28,0,231,29,10,231,26,5,231,25,5,161,13,135,16,224,242,
-26,224,225,19,231,21,5,231,14,3,96,13,2,49,57,48,238,65,3,31,
-51,52,38,99,112,112,104,115,115,114,99,47,109,97,108,99,111,108,109,45,
-119,97,108,108,97,99,101,45,117,110,105,118,4,101,114,115,101,47,96,33,
-30,45,49,46,50,48,46,57,47,76,97,110,103,117,97,103,101,47,80,114,
-101,112,114,111,99,101,115,115,111,114,47,67,64,34,64,5,0,73,69,185,
-2,46,104,115,64,89,4,44,54,56,58,53,132,193,0,58,96,145,1,10,
-65,139,167,64,174,86,218,132,186,196,197,65,62,65,80,226,115,3,194,117,
-0,58,97,172,3,10,65,32,80,77,180,0,53,64,228,163,242,231,93,3,
-96,233,65,90,130,163,201,111,160,15,0,35,96,81,192,12,145,144,201,145,
-0,58,96,8,96,159,238,218,4,2,95,50,57,64,146,64,176,228,138,0,
-65,69,107,134,0,58,98,174,5,10,65,32,85,32,90,224,1,2,0,75,
-244,221,0,0,58,106,57,96,85,98,223,65,216,5,54,53,54,32,64,73,
-64,33,128,253,194,29,128,184,99,4,96,208,75,173,171,179,2,95,55,52,
-69,1,1,55,52,143,60,1,32,79,65,51,0,80,64,40,64,29,165,90,
-245,158,12,80,33,0,35,158,159,0,32,129,136,208,77,0,79,129,1,162,
-92,96,6,97,147,132,107,128,171,0,75,172,90,98,145,96,178,226,64,12,
-97,234,2,48,58,48,193,233,64,94,1,10,65,64,158,0,54,224,41,2,
-3,112,114,101,68,96,136,0,100,64,39,0,58,96,187,1,10,65,102,255,
-145,226,0,54,79,94,74,100,97,241,96,4,138,116,0,58,64,72,129,102,
-1,75,50,65,93,129,96,0,58,97,15,128,22,0,51,96,22,98,243,0,
-58,97,44,161,115,64,1,194,49,64,0,227,64,1,168,57,227,164,6,129,
-146,224,25,15,233,31,2,224,29,13,233,64,3,224,33,16,224,36,3,224,
-37,20,224,40,4,224,41,23,224,44,5,224,45,26,224,48,6,224,49,29,
-224,52,7,231,19,3,224,38,4,232,246,6,237,157,0,224,0,1,193,138,
-224,55,5,224,103,14,224,40,19,224,43,6,224,83,30,224,75,16,224,41,
-50,192,232,199,165,165,151,244,52,6,224,5,9,235,200,0,225,21,3,192,
-1,0,89,224,96,1,224,28,9,224,32,6,224,172,14,230,140,1,224,42,
-2,224,74,11,172,84,192,155,233,44,1,192,5,224,105,2,192,67,230,201,
-5,192,250,64,25,245,55,1,160,13,224,2,4,224,242,16,165,215,5,67,
-32,60,32,64,35,237,46,3,224,67,9,128,218,192,34,224,70,5,160,203,
-128,70,139,46,224,37,10,148,100,224,22,4,75,220,192,19,224,103,3,238,
-31,6,224,13,5,97,94,230,139,9,64,0,65,32,0,85,81,218,105,34,
-102,123,81,179,224,27,0,129,66,64,74,65,98,98,10,69,219,0,49,74,
-37,255,179,3,224,182,3,64,1,224,186,0,224,25,4,0,82,224,187,0,
-227,133,7,128,24,224,41,1,225,236,1,224,184,5,138,43,224,44,7,225,
-176,0,224,64,4,96,185,238,225,5,102,147,128,0,224,221,9,96,5,149,
-188,236,14,5,1,32,32,236,233,0,224,252,11,224,134,1,128,13,234,255,
-1,65,89,0,50,129,106,103,184,170,155,224,0,4,224,178,1,128,1,238,
-253,9,226,70,17,128,28,162,70,236,11,1,224,37,4,225,8,1,3,67,
-32,61,61,224,39,17,193,177,225,155,8,229,27,0,224,81,1,251,135,0,
-224,100,4,64,44,96,42,160,173,160,26,96,17,89,240,172,215,225,4,1,
-192,106,240,69,8,192,36,64,61,75,252,2,95,53,56,160,52,226,124,12,
-224,78,0,224,1,17,226,143,1,224,43,21,194,161,224,37,9,225,151,10,
-225,49,0,224,1,1,226,183,15,234,230,3,224,47,4,252,209,13,226,189,
-13,241,159,3,196,217,227,159,9,233,186,2,130,129,65,47,193,48,225,55,
-8,162,174,229,35,4,224,228,47,227,93,2,224,228,27,194,91,227,162,6,
-227,35,2,224,154,5,226,138,2,227,188,9,228,154,0,67,111,227,186,12,
-224,82,11,224,237,121,224,68,2,224,237,43,69,183,224,237,17,231,103,6,
-224,233,11,226,2,10,192,2,128,40,224,38,0,231,168,0,224,73,16,224,
-70,27,160,108,224,65,11,224,62,4,224,53,2,193,86,225,9,2,226,216,
-2,228,83,10,225,45,7,128,5,224,77,11,160,209,64,21,0,85,142,155,
-0,50,119,83,128,79,0,67,76,204,247,50,2,224,89,60,108,30,224,89,
-5,212,60,224,89,15,225,24,2,194,67,96,4,224,67,2,229,23,17,226,
-3,3,133,152,225,128,0,64,14,161,79,65,107,129,111,192,44,201,40,69,
-57,0,82,236,165,0,77,117,226,216,2,236,170,8,192,53,160,253,129,171,
-242,47,4,224,38,0,144,15,168,116,165,31,160,94,240,8,85,7,84,111,
-107,101,110,105,115,101,208,8,5,50,49,53,58,49,51,244,204,7,224,1,
-5,234,199,3,224,31,11,224,35,7,225,119,6,224,2,2,234,239,12,224,
-83,14,234,242,39,161,122,227,133,6,64,43,234,246,67,241,189,0,128,229,
-224,68,7,224,74,35,235,65,255,225,39,10,235,65,255,235,65,17,226,46,
-48,243,2,0,226,46,18,224,86,6,235,2,8,96,78,225,116,8,231,228,
-13,1,49,50,227,50,1,224,43,2,182,215,225,115,26,226,37,7,96,228,
-192,8,64,48,151,147,94,1,0,50,116,126,247,23,10,225,143,4,1,45,
-123,232,40,4,227,197,9,196,90,224,154,1,235,243,0,224,19,4,64,57,
-194,95,87,221,246,159,7,234,246,2,226,110,22,233,31,14,227,32,11,225,
-57,33,0,49,65,14,160,0,226,174,34,1,125,45,226,174,20,226,7,2,
-198,203,226,141,9,128,21,224,160,4,227,143,13,224,225,11,227,143,33,224,
-225,3,192,59,226,28,23,251,51,7,224,254,18,224,84,0,195,89,224,88,
-3,160,147,117,132,122,68,128,139,233,144,5,224,67,1,192,1,229,148,62,
-135,72,229,148,13,224,47,2,228,75,6,102,42,224,161,5,226,24,9,229,
-165,17,224,0,1,224,188,1,160,140,96,62,239,189,21,224,52,6,231,12,
-6,239,152,2,163,145,231,181,2,224,76,1,228,227,29,225,127,2,224,37,
-5,225,125,10,226,197,2,231,133,10,128,24,224,102,8,226,200,8,185,18,
-224,90,7,194,200,225,19,7,224,198,1,224,45,1,225,16,2,224,89,2,
-224,90,12,201,70,129,34,154,88,224,50,2,224,44,3,227,16,10,64,99,
-1,95,55,120,191,64,14,162,13,249,136,2,224,63,22,98,120,192,63,224,
-54,2,224,65,8,225,80,10,160,246,224,241,5,64,144,224,194,11,160,129,
-227,125,29,103,154,226,219,23,192,14,160,26,224,47,5,228,237,21,64,1,
-242,38,213,242,40,9,224,46,18,242,43,5,224,40,6,228,8,10,225,57,
-0,224,1,1,227,75,15,242,46,144,224,229,9,224,226,10,224,152,4,230,
-244,75,224,62,2,226,224,9,229,188,0,69,235,232,242,2,230,212,3,224,
-101,6,64,1,224,202,47,233,220,13,224,203,72,0,53,137,75,233,194,16,
-163,39,237,250,10,226,131,47,243,205,155,224,83,8,224,241,122,243,209,84,
-240,86,7,224,237,6,232,105,1,226,222,7,224,178,0,102,250,228,37,3,
-237,13,2,224,53,4,225,72,13,224,31,1,225,69,15,0,51,115,149,224,
-44,7,227,15,32,224,62,2,225,37,19,0,57,225,37,3,1,39,39,225,
-37,5,224,99,1,224,196,68,0,83,226,77,12,2,66,32,90,226,29,11,
-165,86,224,219,4,232,24,3,226,244,19,1,55,32,128,128,0,79,128,7,
-244,40,0,224,101,7,225,162,88,135,117,237,109,11,192,5,225,189,17,244,
-214,46,1,66,32,160,245,148,224,225,2,8,231,218,17,227,26,73,224,204,
-2,224,95,24,228,34,0,160,95,228,153,8,96,2,160,101,224,83,3,202,
-201,224,80,18,224,77,30,224,73,25,224,70,27,193,221,224,65,10,224,62,
-4,224,53,2,162,20,64,12,194,25,247,161,197,224,89,81,247,251,77,224,
-173,9,229,57,4,228,87,9,224,48,18,100,141,64,185,64,53,0,52,228,
-141,8,227,23,6,224,180,1,66,29,64,14,162,15,66,43,130,47,192,44,
-206,221,248,97,217,4,57,52,58,49,49,230,162,1,235,99,5,224,237,3,
-192,1,248,74,1,224,25,7,192,1,228,206,3,224,37,15,224,35,4,224,
-30,10,97,42,248,181,4,224,36,9,192,1,248,220,5,229,11,7,224,2,
-0,132,20,160,11,224,162,26,225,199,2,166,169,224,5,8,224,68,3,160,
-73,227,20,2,163,26,228,241,6,240,205,1,224,1,1,229,20,16,224,156,
-16,164,225,241,80,8,64,0,229,184,3,229,113,10,230,111,5,224,95,27,
-249,85,3,224,95,0,238,242,4,128,5,224,106,20,224,97,20,233,232,3,
-224,38,8,164,91,3,67,32,61,61,224,42,20,248,152,15,242,67,3,240,
-28,9,240,26,6,240,24,8,228,33,0,235,147,9,241,141,7,128,108,234,
-77,31,248,174,7,1,39,32,232,63,13,224,69,3,224,154,3,96,12,229,
-253,1,98,170,241,111,0,128,63,248,151,8,224,79,3,224,1,3,240,90,
-3,226,59,2,164,169,128,1,225,52,10,225,104,7,241,86,1,224,102,9,
-229,45,0,224,28,11,234,166,0,224,79,6,192,107,198,203,224,31,5,166,
-160,230,127,2,234,209,15,228,21,10,225,247,8,193,68,202,82,162,43,193,
-89,160,32,128,73,245,177,2,225,172,0,183,173,229,208,2,197,209,224,103,
-5,246,80,1,226,137,64,244,223,22,224,64,4,225,41,10,241,210,2,228,
-192,0,208,165,224,222,19,245,58,6,128,191,224,126,1,224,13,4,129,69,
-224,117,12,64,113,225,78,2,252,166,3,233,168,1,128,0,224,201,1,64,
-1,246,47,255,246,47,221,226,154,0,131,135,229,44,9,96,207,245,162,8,
-224,0,1,192,166,160,170,164,58,167,162,227,139,13,224,52,5,194,212,224,
-22,9,193,234,249,43,6,224,37,5,226,174,10,64,1,239,162,4,224,134,
-4,225,39,0,160,25,64,220,226,195,6,128,21,246,182,39,230,112,21,224,
-0,0,224,167,5,224,1,9,246,144,8,237,196,9,161,90,224,166,0,225,
-99,12,194,90,225,145,5,224,42,11,224,123,1,227,141,16,231,207,50,231,
-144,1,224,103,11,224,64,4,229,69,10,232,14,2,229,67,3,181,29,8,
-95,50,51,57,32,95,50,52,49,236,165,4,224,165,2,224,83,13,224,146,
-11,0,83,255,157,33,232,98,12,101,214,224,142,1,244,195,19,129,151,226,
-97,2,96,109,199,14,232,19,14,224,149,3,232,16,1,224,21,1,96,25,
-225,253,2,224,47,3,192,72,238,104,4,225,40,7,226,39,2,224,244,10,
-231,247,19,230,162,5,195,62,231,244,6,224,163,1,160,16,192,58,128,148,
-132,193,248,142,7,128,56,99,100,0,79,135,33,225,230,1,232,6,2,225,
-6,6,243,184,3,193,109,200,210,226,212,19,129,23,224,69,3,224,92,6,
-232,41,102,228,68,4,64,62,225,8,13,192,57,233,184,4,224,229,17,96,
-132,224,153,8,194,146,250,149,15,228,15,6,224,67,17,103,57,224,67,2,
-246,110,2,224,130,5,225,7,9,244,165,4,225,7,27,240,211,5,224,51,
-30,240,209,8,226,136,5,224,158,3,224,178,0,98,25,192,188,229,243,0,
-224,16,0,2,55,50,56,96,16,160,127,4,66,39,32,95,55,132,184,96,
-30,252,165,0,64,0,230,29,17,225,26,5,64,11,225,116,6,227,220,0,
-227,123,1,224,151,1,128,16,177,30,128,5,104,51,224,89,1,96,37,226,
-148,2,224,173,1,194,48,230,238,16,192,93,243,148,27,227,151,0,224,117,
-1,128,1,253,62,1,224,80,0,224,224,6,227,180,1,128,209,230,246,5,
-162,92,224,67,1,224,61,7,224,64,2,224,61,22,163,42,224,59,11,224,
-55,4,224,52,2,225,15,4,128,158,244,242,16,224,243,1,228,237,2,228,
-234,4,225,78,14,244,47,10,224,76,71,192,223,96,51,226,140,9,160,217,
-128,204,224,60,6,128,0,226,124,1,226,133,4,224,169,6,165,42,105,192,
-140,137,128,98,237,188,12,128,50,230,187,1,224,98,8,228,195,12,226,231,
-0,96,253,224,56,13,224,59,1,225,71,9,64,6,237,122,4,244,42,108,
-5,49,55,49,58,49,50,232,34,4,108,126,229,71,1,2,50,51,56,232,
-90,4,97,144,196,134,196,92,0,73,129,236,0,83,165,80,224,51,20,100,
-177,0,51,224,59,1,2,64,95,49,104,210,1,83,39,64,56,64,24,2,
-52,55,57,98,74,2,50,51,54,165,156,232,208,2,1,95,96,160,173,224,
-47,2,1,56,48,224,47,17,0,39,224,48,0,224,33,15,7,40,41,44,
-91,93,59,123,125,128,38,224,37,15,3,32,92,57,38,224,33,21,22,58,
-33,35,36,37,38,42,43,46,47,60,61,62,63,64,92,57,50,38,94,124,
-45,126,192,52,193,28,230,220,2,83,0,224,20,4,83,149,143,40,128,11,
-231,4,0,7,58,55,52,51,32,64,10,65,162,240,130,130,98,224,163,1,
-130,241,67,59,109,156,130,106,4,80,32,95,49,56,140,187,226,146,1,224,
-30,1,225,231,20,224,215,1,3,108,105,110,101,226,33,0,224,71,50,5,
-112,114,97,103,109,97,224,73,0,232,50,0,128,208,224,68,30,2,100,101,
-102,224,142,1,132,79,193,67,224,52,17,4,117,110,100,101,102,128,51,193,
-16,64,183,1,95,49,98,129,1,95,54,97,40,227,118,83,4,72,97,115,
-104,68,96,185,195,120,3,56,56,58,53,96,145,0,90,64,191,4,55,50,
-57,32,64,108,83,192,0,196,45,160,163,128,235,160,2,6,95,50,53,48,
-32,95,55,66,39,1,95,49,66,251,243,225,0,97,252,193,249,224,208,102,
-0,57,160,208,233,173,3,226,35,1,199,250,160,13,165,26,225,186,15,3,
-79,32,35,52,234,101,4,238,114,0,130,222,225,10,0,120,39,162,131,199,
-83,75,247,97,58,0,50,65,85,161,233,1,52,56,225,12,2,16,105,110,
-99,111,109,112,108,101,116,101,32,109,97,99,114,111,32,98,85,8,105,116,
-105,111,110,58,92,49,48,163,231,224,56,10,2,32,32,35,130,128,0,32,
-163,213,0,39,160,34,100,221,1,52,56,73,226,224,184,0,3,95,55,51,
-51,96,16,233,243,7,224,204,0,129,37,232,242,4,160,203,227,10,17,224,
-80,9,235,121,8,227,154,31,64,74,238,187,3,226,96,1,161,100,64,65,
-232,91,5,227,255,10,228,121,0,161,14,1,55,51,72,0,197,220,243,188,
-0,1,95,57,139,138,103,156,128,96,237,104,0,102,62,192,76,194,221,116,
-168,162,221,128,204,192,25,0,55,192,25,1,95,55,64,209,224,31,1,5,
-54,49,48,32,95,54,180,104,132,28,231,250,0,65,161,0,54,171,13,64,
-8,1,51,48,65,17,1,57,51,64,9,96,48,235,40,5,128,147,64,40,
-0,57,65,52,0,54,64,87,0,51,229,174,5,197,156,2,95,53,49,242,
-31,0,195,176,97,7,0,53,226,22,0,226,65,1,0,35,229,5,2,224,
-56,2,224,55,4,0,52,224,55,11,229,133,0,224,53,2,64,163,96,167,
-64,253,67,10,129,7,67,252,169,81,227,138,12,130,19,238,71,2,226,24,
-10,64,188,234,5,7,195,195,195,189,224,76,1,136,229,234,153,1,2,95,
-49,53,64,163,199,41,96,95,224,33,1,130,79,73,253,237,115,1,235,19,
-3,247,153,1,224,167,22,225,30,2,0,35,230,87,1,195,81,128,108,228,
-137,22,241,163,7,224,98,28,192,59,176,98,229,154,1,140,194,225,6,8,
-160,245,64,12,226,114,5,224,12,3,128,0,164,21,224,53,0,163,192,225,
-74,8,225,73,7,68,117,224,23,12,244,186,2,2,64,64,89,96,181,227,
-19,1,229,135,2,224,138,6,0,58,110,66,6,10,65,32,75,50,32,58,
-96,69,64,11,2,32,75,32,64,25,0,48,160,13,0,65,64,13,65,195,
-1,10,65,65,204,1,48,32,99,228,224,4,1,0,58,99,159,64,28,4,
-50,53,49,32,75,75,152,10,32,67,32,80,32,75,32,95,54,54,49,226,
-221,2,2,114,101,112,70,136,8,109,101,110,116,44,32,97,116,32,230,173,
-88,3,50,53,58,54,129,206,224,139,131,76,3,224,141,130,0,90,140,173,
-97,217,96,157,0,52,224,157,131,66,93,0,55,226,93,14,101,67,65,218,
-101,132,64,9,201,100,96,12,96,214,64,17,160,216,96,18,141,153,224,26,
-1,227,56,0,0,58,102,139,2,10,65,32,65,15,0,90,68,144,192,4,
-151,44,0,58,96,100,1,10,65,224,29,7,224,34,5,0,52,160,34,81,
-145,101,192,3,95,53,49,50,99,34,139,216,227,34,23,69,255,5,98,114,
-101,97,107,115,227,33,120,224,138,113,1,64,90,225,198,0,97,93,193,193,
-65,86,89,115,225,182,0,0,58,107,29,161,112,128,27,165,180,224,10,24,
-232,216,1,0,32,83,47,226,3,0,133,2,192,44,224,7,11,224,70,2,
-224,59,2,0,58,96,163,226,30,6,224,60,5,128,41,0,58,96,217,98,
-103,0,90,121,135,0,58,115,217,96,57,2,80,32,35,69,153,0,85,66,
-48,91,72,1,10,65,64,18,1,51,32,71,254,0,58,119,253,192,38,66,
-248,128,38,130,148,67,4,79,110,0,58,113,146,226,197,1,160,96,130,124,
-224,144,11,0,58,115,95,160,28,1,80,32,155,3,0,80,96,72,129,10,
-3,80,32,35,53,192,128,128,225,0,80,121,23,96,17,81,215,128,17,0,
-54,192,17,128,203,113,105,234,66,1,112,109,145,76,3,95,55,49,53,73,
-106,70,230,1,54,52,69,9,0,53,138,50,64,128,170,131,129,41,144,49,
-1,58,55,64,6,239,19,0,80,15,224,65,14,73,250,67,102,170,121,70,
-237,0,52,231,75,1,1,95,54,182,37,96,86,2,58,55,49,193,77,0,
-66,169,83,238,167,4,157,157,96,8,152,212,1,95,55,143,170,233,24,6,
-200,116,247,253,8,128,207,96,8,5,95,54,52,32,95,55,233,27,0,224,
-60,4,246,0,2,162,145,64,189,96,224,72,87,2,55,32,95,215,247,103,
-242,128,48,2,95,55,49,182,240,160,20,136,146,224,33,2,165,209,192,38,
-64,238,196,188,226,2,1,194,189,0,58,96,39,194,186,98,85,64,235,196,
-199,65,66,72,37,2,95,50,56,96,195,193,39,225,108,7,233,88,1,225,
-108,1,96,37,225,238,13,64,101,194,121,129,218,118,197,75,245,0,54,143,
-188,201,180,116,115,96,138,237,234,16,31,67,97,110,110,111,116,32,101,120,
-112,97,110,100,32,35,105,102,32,100,105,114,101,99,116,105,118,101,32,105,
-110,32,102,1,105,108,237,203,3,205,205,3,95,49,51,52,73,18,139,223,
-224,81,5,110,33,1,32,32,251,88,2,224,142,1,3,66,32,95,48,65,
-20,128,225,114,161,1,54,49,64,157,156,45,0,53,225,51,2,201,106,128,
-190,3,55,53,32,95,247,179,2,224,113,5,31,87,97,114,110,105,110,103,
-58,32,116,114,97,105,108,105,110,103,32,99,104,97,114,97,99,116,101,114,
-115,32,97,102,116,1,101,114,64,216,238,180,17,142,227,97,2,3,115,105,
-111,110,224,247,47,224,240,1,130,70,97,147,2,95,55,48,101,142,225,146,
-41,4,112,97,114,115,101,225,145,78,227,75,3,225,145,17,64,13,171,148,
-225,154,11,1,95,55,141,223,225,161,90,225,1,56,225,155,3,2,95,49,
-50,192,241,64,0,1,58,55,72,110,72,97,224,224,0,96,8,0,57,174,
-198,236,236,12,1,47,47,128,80,143,38,161,16,0,58,97,16,64,73,4,
-49,49,32,95,53,107,230,1,55,48,176,252,224,17,0,0,51,76,7,0,
-53,111,53,96,8,64,19,6,54,48,49,32,95,54,50,224,178,3,1,124,
-124,160,97,1,54,50,74,86,64,163,128,38,162,80,229,247,1,160,68,99,
-65,64,217,68,92,96,141,64,40,224,141,7,0,55,224,141,45,0,38,177,
-243,224,141,10,165,158,224,141,14,141,225,96,141,172,234,1,51,50,96,35,
-64,113,224,10,13,224,135,9,79,111,0,51,207,111,224,188,2,224,140,2,
-96,217,96,218,224,129,0,129,204,224,49,5,1,55,48,176,116,224,17,2,
-212,19,224,38,7,128,21,224,212,5,170,175,224,83,9,246,170,1,0,52,
-130,52,81,106,1,52,53,113,164,1,57,56,103,247,194,122,128,53,0,49,
-72,166,224,17,5,0,53,171,109,3,95,54,50,57,64,248,224,220,2,97,
-242,0,58,96,228,225,67,28,225,89,31,225,225,1,1,62,61,161,225,224,
-144,1,2,52,51,56,64,195,161,68,225,150,12,1,54,50,225,150,1,224,
-200,2,68,11,160,55,224,117,21,0,60,224,117,9,100,72,224,60,18,64,
-117,244,251,0,224,55,2,72,43,224,116,29,0,61,224,116,9,225,185,1,
-224,61,24,0,33,224,61,9,105,45,192,61,0,58,98,81,225,165,6,226,
-45,3,0,51,137,139,224,29,1,226,144,7,66,105,226,144,38,224,18,4,
-130,63,128,50,0,58,96,6,224,141,6,225,84,12,89,64,225,84,8,1,
-57,55,162,197,225,139,16,0,52,243,8,0,226,1,4,224,55,2,0,58,
-96,209,225,16,16,2,54,56,54,225,16,23,65,212,225,16,8,100,229,225,
-16,37,64,50,0,58,96,6,227,68,17,224,228,13,226,230,11,0,53,99,
-29,225,27,20,0,55,226,167,11,136,21,175,62,228,237,14,224,56,11,1,
-49,53,96,196,229,79,0,138,3,1,95,49,100,39,74,97,2,95,54,56,
-224,33,0,2,95,54,57,86,11,128,11,0,50,70,164,224,11,0,75,83,
-128,11,1,55,48,86,36,0,50,64,98,128,17,108,136,64,9,106,92,1,
-83,32,85,60,237,145,0,0,80,136,179,227,9,1,12,73,110,116,101,103,
-101,114,58,32,100,105,118,105,105,57,3,98,121,32,48,167,105,237,205,1,
-108,8,64,64,83,89,121,120,86,33,75,157,179,102,224,17,9,128,64,237,
-115,5,135,235,245,177,1,247,197,3,3,32,95,54,57,129,23,128,37,104,
-220,1,95,54,108,1,2,95,54,57,101,105,128,42,98,29,192,36,171,254,
-160,12,0,83,171,147,66,6,0,85,83,187,128,79,233,41,0,109,132,64,
-5,160,88,183,65,153,78,136,131,0,85,84,0,128,0,0,67,64,73,245,
-190,0,160,0,0,58,97,113,1,10,65,160,194,64,58,1,95,52,74,7,
-1,95,50,64,62,0,58,96,49,252,197,3,64,9,0,89,161,61,224,19,
-0,237,96,0,64,63,2,67,32,79,246,137,1,246,121,5,192,219,173,33,
-235,134,3,128,238,128,69,152,154,71,170,3,57,32,95,53,213,40,141,79,
-142,85,120,226,0,51,224,28,2,96,241,100,27,98,54,106,235,192,12,2,
-95,49,57,197,70,0,51,99,204,216,57,129,219,0,58,97,95,140,188,224,
-211,1,206,161,173,216,206,30,224,7,2,71,95,0,52,105,231,1,52,53,
-99,250,129,196,0,80,97,142,64,16,160,6,193,150,96,26,77,69,64,21,
-64,59,127,143,1,52,53,162,94,64,32,160,49,96,28,192,216,96,58,0,
-39,160,46,96,26,168,68,250,58,1,143,144,0,83,251,92,0,238,193,5,
-243,36,1,64,69,107,61,0,52,69,90,224,117,0,143,219,150,193,224,253,
-1,0,39,96,254,161,193,97,122,0,54,132,188,192,95,160,163,128,220,160,
-12,98,99,196,226,0,57,96,217,154,42,224,197,16,64,39,64,48,192,243,
-225,16,3,227,134,2,139,250,65,109,96,197,81,219,98,13,239,86,0,121,
-245,112,242,104,217,1,67,39,66,133,1,95,54,65,249,162,139,224,77,3,
-224,13,5,0,58,99,144,112,252,228,80,6,15,108,97,115,116,58,32,101,
-109,112,116,121,32,108,105,115,116,100,74,129,44,2,85,32,64,81,246,128,
-98,67,73,96,8,100,255,224,89,0,0,79,114,4,64,127,0,58,97,13,
-227,72,0,132,232,0,75,98,124,134,138,99,223,0,58,97,255,175,173,68,
-24,220,120,227,56,1,113,79,98,43,0,52,80,246,65,133,138,220,128,14,
-0,58,100,9,2,10,65,32,88,56,64,45,255,62,1,249,87,1,192,93,
-96,70,158,174,131,186,228,148,0,243,104,11,64,133,234,84,1,1,49,55,
-96,125,138,85,67,102,234,85,5,128,116,133,105,0,67,131,153,129,166,96,
-48,133,88,64,47,166,116,96,0,64,60,0,58,101,54,161,39,130,187,1,
-95,50,74,114,129,29,132,171,224,27,7,97,71,0,56,204,91,1,50,53,
-64,246,138,233,137,126,1,95,49,68,197,0,58,102,146,97,106,3,75,51,
-32,75,65,53,0,58,70,250,160,81,1,95,55,70,214,67,23,195,225,154,
-119,250,231,0,163,24,67,20,250,225,2,109,145,0,35,66,152,164,188,129,
-96,193,181,252,127,4,1,35,49,163,213,0,85,71,31,73,223,167,172,193,
-159,224,50,10,224,89,0,154,187,224,89,16,188,98,96,89,106,119,224,89,
-0,128,19,106,195,168,26,135,216,114,81,129,71,0,82,66,175,193,189,84,
-202,131,50,1,58,54,73,9,116,2,64,215,1,95,54,66,42,83,139,78,
-85,161,191,193,240,0,54,108,224,0,54,84,51,0,58,64,109,224,54,21,
-128,212,1,95,54,130,194,192,53,131,9,224,108,18,192,191,147,83,192,54,
-227,50,1,64,1,251,45,3,226,196,0,226,200,0,128,16,255,128,3,128,
-253,224,47,0,195,113,64,2,101,78,229,0,1,128,2,212,38,224,91,4,
-193,248,224,22,0,164,239,128,98,230,69,0,0,64,156,231,192,57,134,21,
-224,117,0,231,38,4,224,162,0,67,59,130,89,105,224,96,61,64,27,1,
-95,51,68,81,68,177,244,205,0,192,171,2,79,32,64,84,13,97,196,225,
-65,5,198,84,0,58,97,93,135,246,234,230,6,234,121,12,0,55,127,193,
-201,248,130,29,234,253,4,2,54,48,55,66,82,67,215,1,54,48,95,211,
-181,36,64,208,238,56,2,162,192,2,95,54,48,84,67,64,46,64,70,1,
-50,54,96,105,137,121,130,240,212,56,165,248,192,103,64,23,0,48,129,38,
-224,85,52,0,58,96,8,128,255,224,199,5,149,103,225,231,1,98,46,228,
-245,0,149,19,230,31,1,0,100,120,246,0,100,170,97,160,53,225,82,5,
-193,236,240,37,4,239,77,5,1,54,51,99,143,129,60,225,71,4,65,189,
-78,70,99,228,241,248,13,1,44,41,210,73,235,233,5,225,167,0,128,0,
-194,137,225,75,2,98,84,3,95,53,49,56,65,174,73,105,167,185,132,19,
-245,194,6,0,90,69,84,1,53,48,96,214,96,139,236,206,3,96,0,227,
-70,2,225,5,10,224,18,10,225,21,7,228,149,1,66,182,164,228,234,75,
-0,224,45,12,65,72,224,65,12,66,31,134,149,224,166,6,224,88,9,224,
-184,7,229,231,13,97,249,225,128,12,226,3,5,230,3,0,131,220,0,67,
-139,83,129,82,229,186,0,139,218,87,64,64,118,98,94,127,205,165,69,224,
-179,0,65,199,0,56,237,120,9,225,163,0,224,5,3,139,189,0,75,128,
-45,94,150,224,69,13,1,64,75,64,103,224,26,3,0,57,224,26,1,66,
-105,224,26,13,68,63,0,48,233,24,2,252,66,70,7,67,112,112,73,102,
-100,101,102,252,64,0,4,51,56,58,49,50,161,82,0,75,234,239,0,128,
-233,227,103,1,133,83,224,10,0,225,81,0,168,168,120,229,225,7,15,225,
-78,7,171,68,160,81,165,235,64,13,161,198,225,98,7,64,24,252,30,1,
-224,111,38,67,79,64,1,67,144,197,101,98,179,91,169,1,95,54,82,196,
-229,111,8,224,113,6,238,204,0,96,169,224,69,1,197,28,109,6,130,31,
-94,14,67,113,211,208,224,89,10,225,224,104,1,52,53,225,224,1,0,58,
-101,212,251,193,2,231,159,2,0,80,136,233,69,16,227,164,2,231,44,6,
-71,38,134,8,235,48,4,192,21,167,140,96,69,64,252,172,121,0,58,68,
-245,128,118,149,153,120,108,85,215,1,95,52,64,144,65,209,90,235,133,124,
-225,26,1,2,39,96,95,128,184,0,58,102,229,74,116,2,53,56,56,136,
-120,0,53,80,240,96,168,108,247,97,227,65,107,0,48,228,49,3,25,69,
-120,112,101,99,116,101,100,32,101,110,100,32,111,102,32,105,110,112,117,116,
-32,40,69,79,70,229,203,0,0,58,103,114,251,229,15,0,54,75,124,106,
-201,226,12,3,175,243,224,103,1,0,35,95,247,0,32,128,82,165,252,248,
-151,1,0,49,98,100,208,40,81,226,210,82,160,31,91,225,1,49,54,112,
-169,192,146,137,214,76,84,64,225,194,93,131,139,138,193,234,150,5,1,64,
-35,92,49,192,188,0,80,70,103,225,200,3,193,138,160,26,0,51,99,50,
-64,49,162,150,140,195,162,16,161,242,229,153,1,78,160,224,92,1,224,10,
-0,235,70,13,221,122,96,33,237,68,1,229,145,0,224,44,4,170,212,98,
-55,75,60,64,153,128,172,224,26,0,224,108,1,66,160,98,91,64,217,112,
-87,226,168,3,140,58,232,74,1,236,64,15,192,87,224,204,6,224,159,13,
-129,84,129,211,129,246,224,124,1,66,33,225,75,11,194,2,240,16,0,206,
-16,224,134,11,128,86,131,120,225,56,0,224,107,16,224,242,3,128,0,2,
-58,54,55,139,203,2,65,32,58,96,139,3,10,65,32,75,64,10,222,37,
-210,65,128,235,130,72,224,144,12,158,123,225,6,13,87,116,122,240,152,183,
-160,7,192,231,135,102,230,48,1,224,61,1,190,216,131,161,2,95,54,55,
-96,70,2,58,54,55,238,120,0,104,2,200,253,0,54,157,20,133,105,133,
-254,96,56,0,58,96,56,74,66,161,86,232,219,33,172,27,233,139,3,101,
-178,0,57,96,119,234,215,2,106,212,234,28,0,160,140,233,230,19,161,161,
-230,104,3,224,135,16,224,43,7,237,6,3,230,239,0,134,93,96,44,67,
-220,232,184,5,97,7,194,228,167,46,225,124,3,231,49,6,145,46,206,152,
-230,198,8,64,250,65,82,166,254,224,207,0,245,114,3,224,7,7,197,217,
-129,196,230,238,14,128,0,230,223,101,2,51,55,55,230,223,0,0,58,97,
-182,240,183,4,132,17,225,95,5,225,104,6,180,126,212,132,189,69,195,132,
-83,198,133,208,0,51,82,130,130,65,109,180,1,54,54,64,39,145,88,112,
-214,2,53,32,95,109,140,243,33,1,254,165,1,224,60,13,128,42,162,33,
-83,16,194,44,230,93,4,5,109,97,99,114,111,32,128,226,194,4,166,96,
-129,228,224,51,10,1,32,101,198,250,128,55,224,136,0,190,147,230,152,1,
-224,145,6,192,91,224,74,2,23,97,114,103,117,109,101,110,116,115,44,32,
-98,117,116,32,119,97,115,32,103,105,118,101,110,128,90,224,77,5,160,208,
-194,9,132,40,165,94,64,2,1,95,54,132,249,64,141,247,146,4,234,21,
-2,202,5,101,160,193,179,3,95,53,56,48,65,155,204,22,66,231,160,95,
-98,135,0,53,228,110,1,108,123,132,224,2,54,51,51,106,47,91,165,167,
-40,165,121,245,45,4,65,246,64,95,81,193,224,98,5,128,39,224,97,9,
-65,47,99,95,67,76,71,187,193,63,165,184,133,79,101,8,0,56,134,33,
-228,63,0,0,58,99,52,72,204,2,52,50,56,67,181,0,58,96,64,177,
-144,71,162,0,75,64,83,0,49,225,130,2,4,101,120,112,97,110,89,102,
-4,44,32,97,116,32,227,81,70,4,72,97,115,104,68,109,90,234,51,0,
-2,53,58,54,130,54,224,137,129,109,105,224,139,128,67,206,225,23,129,66,
-87,0,58,98,143,228,251,4,224,9,1,99,64,0,54,110,243,195,134,99,
-62,88,157,1,95,54,135,250,182,74,84,146,182,170,64,83,138,136,232,71,
-0,246,230,1,128,71,216,203,67,165,224,53,2,244,95,1,226,206,12,228,
-80,2,226,206,118,224,137,112,226,206,10,224,139,114,226,206,8,224,139,114,
-0,32,112,133,0,58,101,78,226,68,19,2,114,101,112,64,127,64,165,226,
-70,120,224,139,114,226,72,10,224,141,116,152,209,82,224,224,148,128,0,58,
-106,231,144,126,0,52,85,245,0,53,73,104,1,95,54,76,214,0,58,64,
-165,64,27,2,73,32,58,96,16,103,151,71,150,2,95,54,53,103,214,120,
-10,2,95,49,55,65,102,128,56,2,49,56,54,224,11,2,224,80,0,0,
-58,96,6,64,63,4,49,51,53,32,75,182,139,0,52,252,229,3,6,110,
-111,32,102,105,101,108,201,148,96,29,144,7,86,26,160,105,0,52,76,57,
-96,11,0,58,96,6,96,145,0,57,67,0,0,50,76,176,1,49,54,233,
-156,3,25,67,111,110,116,114,111,108,46,69,120,99,101,112,116,105,111,110,
-46,73,110,116,101,114,110,97,108,64,98,224,39,1,10,82,101,99,83,101,
-108,69,114,114,111,114,96,123,97,165,0,58,96,226,227,100,2,0,73,141,
-114,64,28,99,133,1,75,51,65,33,74,99,177,32,122,48,147,125,73,81,
-69,240,64,8,0,54,80,210,1,95,50,185,53,198,34,234,171,0,73,133,
-141,98,238,27,8,198,125,96,37,0,53,102,141,64,79,81,18,1,54,53,
-173,89,1,58,54,77,4,97,6,0,51,68,169,0,52,66,92,96,28,1,
-95,54,73,216,160,11,0,49,124,136,0,49,64,132,1,95,54,129,231,160,
-35,88,4,160,11,0,53,97,92,160,11,64,76,96,11,0,58,96,6,216,
-165,115,15,110,54,0,50,111,130,0,54,191,196,242,242,3,243,26,3,3,
-95,54,53,50,95,103,143,37,0,54,96,216,224,6,5,0,58,64,107,64,
-95,0,85,68,221,1,75,52,94,130,96,21,250,27,0,160,117,224,114,6,
-224,101,6,94,1,224,101,11,0,58,64,214,224,94,3,193,221,175,55,224,
-94,29,1,52,56,224,94,16,66,166,128,94,96,93,167,230,74,217,224,94,
-1,224,91,5,96,82,1,52,51,225,23,8,0,58,65,153,160,53,66,14,
-128,46,64,126,64,129,0,53,158,177,141,59,224,49,1,0,54,162,127,91,
-153,0,49,66,178,0,58,64,42,224,69,13,255,3,3,224,71,7,129,227,
-97,36,0,90,158,151,64,21,129,153,96,73,1,51,55,213,230,83,11,140,
-163,178,196,96,13,177,174,236,209,1,2,95,49,53,76,45,188,24,128,30,
-64,22,224,130,0,204,187,191,138,255,148,7,177,72,160,162,124,119,161,1,
-100,24,191,171,96,217,76,145,99,24,96,180,130,56,76,151,0,51,112,169,
-65,100,0,58,96,35,1,10,65,83,60,2,49,32,58,96,19,161,181,1,
-64,58,96,39,255,147,6,64,116,0,10,84,102,0,58,96,249,96,29,127,
-254,0,51,193,113,233,246,0,109,6,129,0,175,39,137,243,91,51,110,244,
-130,67,115,48,97,163,160,254,97,98,64,21,224,136,2,129,134,224,92,2,
-209,14,145,222,170,83,109,249,112,172,211,26,0,58,100,71,224,165,2,163,
-61,192,141,143,216,189,89,0,64,78,93,195,10,2,95,54,48,128,66,2,
-95,54,51,176,191,118,163,96,35,162,9,160,35,160,139,0,58,82,13,129,
-98,224,93,7,1,54,48,98,107,96,93,99,199,224,93,0,249,43,1,146,
-11,224,95,11,197,21,225,67,0,125,76,239,159,0,224,148,13,247,75,1,
-227,203,3,0,51,64,203,224,230,12,99,42,0,66,88,171,224,77,12,130,
-115,239,229,5,31,87,104,101,110,32,108,111,111,107,105,110,103,32,102,111,
-114,32,97,32,110,111,110,45,101,109,112,116,121,32,115,101,113,28,117,101,
-110,99,101,32,119,105,116,104,32,115,101,112,97,114,97,116,111,114,115,58,
-92,49,48,38,92,57,38,102,82,0,58,97,91,135,102,0,48,243,7,0,
-179,61,0,48,206,253,69,255,243,140,3,224,41,8,207,120,249,199,5,0,
-58,115,180,128,92,253,223,3,67,64,148,123,130,57,230,94,6,131,125,253,
-76,1,128,16,224,249,5,241,41,10,177,93,241,7,6,2,103,111,116,160,
-35,224,157,6,0,58,64,187,64,156,120,158,0,89,100,27,65,121,0,83,
-224,140,3,240,88,7,0,64,130,249,243,43,42,14,112,111,108,121,112,97,
-114,115,101,45,49,46,49,50,47,64,43,5,84,101,120,116,47,80,64,19,
-200,254,4,49,48,57,58,55,128,173,177,71,113,16,0,51,66,1,224,14,
-1,246,0,3,68,113,224,25,13,64,228,213,124,247,81,9,159,241,246,95,
-0,247,229,10,0,50,177,242,145,102,0,57,81,102,67,56,209,42,96,64,
-192,12,128,44,100,42,97,102,2,51,48,48,82,52,214,244,224,134,50,72,
-181,224,133,31,96,43,224,132,75,0,49,155,61,225,11,30,96,44,224,134,
-8,181,215,224,134,51,91,143,224,133,31,96,43,224,132,16,130,235,240,106,
-1,101,141,128,148,229,53,1,251,224,5,255,220,12,8,44,59,40,41,91,
-93,123,125,96,195,97,230,101,0,116,19,228,247,0,71,140,224,99,6,252,
-77,2,64,171,251,24,6,0,57,250,34,0,165,155,128,6,1,95,49,80,
-165,128,97,156,54,165,100,228,31,8,13,66,97,100,32,99,104,97,114,97,
-99,116,101,114,58,132,1,212,242,167,191,167,248,249,96,1,161,152,128,116,
-250,146,0,212,222,251,59,15,96,176,192,33,136,118,161,88,160,46,160,71,
-224,202,0,64,62,113,213,116,242,230,167,3,231,61,0,125,142,161,207,225,
-222,0,96,103,231,91,1,225,220,0,162,6,193,229,192,91,213,5,224,48,
-8,224,46,14,129,14,226,91,6,224,62,10,96,54,254,11,30,1,95,39,
-229,122,0,192,215,224,98,27,64,79,64,101,96,11,65,130,128,47,3,64,
-67,32,79,230,145,2,226,156,23,22,33,64,35,36,37,38,42,43,46,47,
-60,61,62,63,92,57,50,38,94,124,58,45,126,160,145,129,226,193,223,170,
-26,97,220,224,204,15,1,101,69,224,58,12,252,198,0,226,66,2,227,219,
-9,215,166,224,110,2,226,14,8,192,130,225,135,11,226,22,12,231,17,5,
-0,43,231,10,3,226,33,5,226,25,7,224,180,30,131,132,224,180,84,0,
-45,224,180,34,224,128,65,0,79,139,109,194,75,224,124,30,196,114,224,197,
-8,3,109,105,115,115,73,129,7,43,47,45,47,100,105,103,105,168,113,224,
-39,8,14,97,102,116,101,114,32,101,32,105,110,32,102,108,111,97,224,38,
-15,6,108,105,116,101,114,97,108,164,181,64,30,100,183,79,94,164,188,216,
-162,224,204,8,224,68,1,2,46,46,46,227,123,1,96,229,195,69,160,0,
-0,89,190,227,65,57,0,85,101,65,64,221,171,73,225,168,9,10,110,100,
-32,111,102,32,105,110,112,117,116,64,191,165,80,224,35,4,2,115,116,114,
-65,5,160,190,128,34,96,121,198,20,97,167,129,134,97,78,232,174,7,193,
-205,247,8,10,77,52,0,50,99,68,64,68,166,158,97,179,64,135,129,151,
-87,3,233,153,80,3,49,56,58,52,211,47,228,147,3,110,40,0,50,65,
-138,250,64,0,64,0,250,60,4,64,36,0,55,65,95,96,39,230,132,2,
-126,207,113,0,96,60,225,157,0,0,67,102,236,2,51,48,51,69,7,203,
-253,129,159,234,144,5,225,160,13,160,166,0,58,107,105,114,219,254,226,2,
-81,63,72,162,2,95,53,57,199,119,0,56,229,54,3,235,89,0,0,97,
-225,201,0,71,72,163,167,225,182,7,115,79,235,171,1,224,70,1,3,98,
-105,110,100,128,51,235,250,4,143,241,224,17,3,0,53,191,191,224,143,15,
-224,132,3,4,32,104,97,115,32,115,143,3,110,97,108,32,198,92,65,141,
-224,150,41,236,170,5,97,45,0,54,142,154,237,173,2,2,54,50,52,131,
-31,238,54,8,238,83,19,0,58,64,213,175,60,0,50,78,244,64,69,237,
-6,7,96,238,162,229,237,93,2,165,110,224,205,3,111,148,224,20,7,128,
-226,224,194,2,224,238,12,225,204,14,0,44,109,22,0,39,231,157,0,224,
-152,14,134,19,224,138,4,132,126,224,27,13,138,191,224,27,12,0,49,129,
-24,224,28,14,157,221,224,28,15,229,229,0,224,28,11,169,20,224,28,13,
-224,144,18,144,232,224,27,13,131,196,224,27,14,99,163,224,83,14,192,55,
-101,83,64,27,102,62,224,157,15,251,145,0,224,28,10,237,124,0,64,24,
-0,52,81,171,239,18,5,229,159,8,18,117,110,114,101,99,111,103,110,105,
-115,101,100,32,101,115,99,97,112,101,240,0,1,1,105,110,225,253,4,1,
-58,32,73,12,97,251,233,81,2,207,146,224,139,7,145,229,224,27,14,97,
-126,224,27,14,98,42,224,27,14,97,153,224,27,14,97,97,224,27,13,0,
-55,97,22,224,27,14,214,190,224,27,11,209,196,224,27,11,224,195,18,115,
-36,224,27,14,69,244,224,27,16,245,169,0,224,27,10,97,79,228,179,9,
-0,56,157,221,230,192,79,5,51,48,56,58,49,52,163,240,80,195,227,239,
-5,224,141,8,66,185,229,216,24,196,125,0,35,130,204,235,135,13,0,39,
-66,109,1,86,84,228,108,0,224,124,26,65,62,224,124,33,83,244,224,124,
-20,1,85,83,228,233,3,0,53,85,231,224,4,16,224,154,22,111,87,230,
-240,33,224,67,13,66,57,225,91,34,160,186,224,154,61,224,86,1,166,248,
-226,9,61,224,67,22,67,71,224,154,33,244,239,0,224,242,24,226,40,37,
-210,11,224,174,24,225,228,59,224,242,38,224,243,32,100,63,224,156,54,101,
-183,224,156,34,210,55,227,188,28,113,149,227,188,33,171,194,227,188,16,4,
-83,79,72,39,32,160,9,192,8,1,84,88,192,9,0,73,192,8,1,89,
-78,192,9,5,85,66,39,32,111,114,160,12,0,80,240,129,1,228,119,73,
-144,161,224,186,17,0,82,228,119,9,225,220,90,102,208,224,197,33,177,102,
-225,31,27,104,10,224,157,55,224,67,28,226,122,1,228,253,0,225,101,16,
-2,78,85,76,225,240,1,2,78,65,75,225,241,35,104,80,228,64,34,225,
-241,23,1,76,70,230,230,35,231,99,37,142,29,224,123,17,0,72,231,98,
-82,89,199,224,124,20,0,71,226,234,40,225,122,39,165,32,224,218,73,105,
-227,224,218,18,1,70,70,226,94,1,0,70,224,230,1,232,74,20,225,249,
-60,224,67,22,230,96,37,148,128,227,159,26,230,251,58,226,216,38,243,99,
-0,224,155,24,224,242,28,224,155,22,68,80,224,155,33,218,61,233,38,92,
-231,150,39,193,211,225,56,25,77,139,224,88,34,192,245,227,108,63,224,246,
-22,224,157,38,185,191,227,178,13,2,111,110,101,83,7,99,173,0,69,232,
-39,0,2,69,79,84,192,9,1,78,81,192,9,1,84,66,192,9,0,77,
-227,225,1,2,69,83,67,227,226,14,224,197,23,234,52,59,226,0,37,0,
-49,225,10,1,224,88,60,224,224,59,224,156,1,234,52,35,226,2,28,229,
-99,37,0,52,224,174,38,129,74,224,85,23,0,53,230,181,38,134,92,224,
-86,25,228,149,37,0,49,135,142,224,86,25,238,105,37,146,117,96,20,231,
-13,16,1,68,69,233,109,2,2,68,76,69,224,12,2,6,67,91,49,46,
-46,52,93,227,62,9,228,67,23,239,15,38,164,246,234,175,94,237,199,38,
-198,204,225,65,17,1,67,82,225,51,1,2,67,65,78,225,46,40,228,104,
-106,196,102,233,125,73,233,124,23,0,66,226,110,3,0,66,233,125,2,228,
-83,62,225,39,23,236,173,37,196,242,224,207,17,1,65,67,236,159,2,154,
-20,127,69,1,54,48,89,12,0,49,64,53,194,223,224,29,8,1,50,48,
-224,29,2,218,82,224,31,0,86,74,1,95,48,160,137,154,89,0,49,64,
-208,213,224,3,95,54,50,50,224,63,2,224,250,8,86,106,93,63,0,49,
-68,139,8,67,32,95,52,51,56,32,95,51,123,88,0,35,150,199,3,32,
-95,55,53,224,18,0,0,57,104,35,246,149,22,249,187,4,4,99,116,114,
-108,45,182,154,8,109,97,108,102,111,114,109,101,100,150,139,0,94,97,18,
-246,140,3,125,145,224,204,2,96,226,64,225,4,49,53,55,32,95,119,189,
-2,95,49,54,64,252,64,5,128,160,160,0,225,143,2,187,81,224,17,3,
-128,40,224,17,2,152,9,228,96,4,180,79,224,35,2,224,34,8,129,69,
-224,17,3,174,26,224,17,2,224,88,8,162,236,227,87,8,224,234,2,158,
-140,68,6,225,91,6,253,143,7,217,216,225,98,4,162,89,0,58,123,103,
-1,10,65,118,99,0,83,66,210,0,54,70,222,224,61,1,6,100,101,99,
-105,109,97,108,129,117,0,39,66,21,0,48,64,111,158,254,10,66,32,95,
-50,48,55,32,64,95,50,48,96,176,3,95,49,57,56,94,98,160,188,97,
-106,1,95,54,70,217,0,58,66,82,186,216,0,53,76,143,186,205,157,25,
-155,200,1,73,32,96,143,0,49,224,143,20,2,111,99,116,224,141,37,161,
-73,0,54,104,100,224,140,0,0,48,224,100,20,2,104,101,120,224,240,36,
-131,204,1,95,54,116,53,192,99,71,121,92,35,227,44,3,5,95,49,53,
-50,32,35,64,236,124,190,71,116,1,35,53,152,253,224,38,9,123,65,224,
-38,0,187,23,64,174,224,39,6,102,187,224,39,0,152,248,3,95,50,50,
-57,226,3,2,8,100,105,103,105,116,84,111,73,110,189,240,227,30,13,192,
-16,163,40,64,86,193,204,224,49,28,96,176,224,49,22,64,39,96,255,65,
-33,0,56,129,133,0,39,127,182,191,247,157,44,0,95,126,120,64,0,128,
-27,64,5,228,134,1,100,179,1,48,55,190,14,93,76,160,115,64,38,128,
-42,227,38,1,153,93,1,39,66,65,197,1,66,39,96,5,2,32,95,52,
-107,15,253,191,3,131,71,225,230,13,64,17,121,159,1,95,53,123,95,224,
-37,15,160,129,1,95,50,117,163,64,164,96,52,0,51,69,1,2,66,32,
-80,197,83,224,64,20,160,108,131,18,229,39,9,3,92,49,48,38,227,209,
-0,108,193,5,114,32,109,111,114,101,131,208,192,55,224,47,1,0,32,97,
-250,0,115,227,238,0,66,232,158,185,226,145,18,65,249,0,58,99,49,160,
-42,1,50,51,129,188,1,52,32,65,51,128,14,226,173,28,226,169,25,64,
-104,159,2,136,210,225,215,1,97,214,224,125,1,0,52,86,46,0,67,64,
-13,0,54,167,115,231,49,3,1,96,95,199,43,230,173,2,0,54,65,110,
-230,120,22,0,69,254,247,0,10,110,32,105,100,101,110,116,105,102,105,101,
-190,246,91,14,225,87,4,1,79,32,102,22,221,6,1,58,54,89,26,96,
-186,1,56,56,132,204,1,95,49,96,228,0,58,96,122,64,25,2,54,48,
-56,100,103,64,1,0,80,64,133,64,203,130,154,197,175,0,53,103,33,1,
-95,53,127,22,162,249,0,58,97,2,128,64,0,57,229,53,0,98,82,2,
-95,53,57,108,3,2,54,32,89,100,191,5,83,32,73,32,64,75,65,111,
-96,4,162,66,192,50,99,135,98,135,0,89,69,117,99,78,64,13,64,57,
-192,55,198,74,129,144,96,10,213,76,2,89,32,66,65,131,0,80,225,71,
-24,9,102,97,105,108,101,100,32,116,111,32,124,96,3,32,97,110,121,79,
-93,20,116,104,101,32,112,111,115,115,105,98,108,101,32,99,104,111,105,99,
-101,115,58,66,196,97,87,99,199,1,53,32,121,198,64,11,3,49,48,32,
-85,99,171,129,110,224,100,8,224,57,1,224,55,1,97,243,0,53,157,99,
-196,47,67,214,128,10,164,15,129,10,224,19,2,0,83,96,14,228,116,0,
-128,2,128,20,224,55,2,225,36,4,224,26,3,0,90,161,41,192,38,128,
-76,96,11,0,39,102,220,192,91,1,95,49,100,11,0,80,160,64,194,57,
-226,38,1,134,238,97,157,64,62,74,172,159,71,132,246,193,3,64,52,0,
-58,65,31,128,45,128,115,0,80,70,103,0,48,134,103,2,85,32,58,66,
-106,166,114,0,39,64,2,96,59,0,49,196,176,0,75,101,13,1,95,54,
-131,153,64,157,130,79,0,48,99,35,0,85,64,31,0,65,224,33,3,66,
-105,225,125,5,12,73,110,32,97,32,115,101,113,117,101,110,99,101,225,138,
-14,133,82,101,113,99,193,0,54,194,116,69,146,224,137,12,161,33,101,40,
-89,39,160,139,170,137,128,35,64,230,132,184,97,14,133,85,0,51,229,177,
-0,224,80,5,0,58,96,117,128,43,3,54,32,95,50,104,98,227,5,0,
-133,156,193,85,106,189,0,49,250,92,2,1,54,48,64,75,0,58,64,210,
-129,74,0,85,193,144,2,90,32,90,69,151,2,51,48,49,235,249,5,198,
-241,131,37,234,153,0,0,90,162,199,64,109,160,85,96,0,0,58,96,11,
-97,176,0,75,96,228,0,58,97,129,96,16,0,73,97,207,163,247,0,48,
-196,197,65,21,132,28,101,17,1,95,51,224,230,0,194,59,235,160,7,64,
-237,3,83,32,64,82,227,177,3,225,198,1,159,236,8,115,97,116,105,115,
-102,121,58,32,131,184,236,160,7,96,95,130,109,99,60,100,186,0,48,161,
-11,224,75,1,6,82,97,110,32,111,117,116,67,233,10,105,110,112,117,116,
-32,40,69,79,70,41,197,51,137,221,1,64,58,96,148,64,73,2,51,50,
-51,64,71,0,53,64,168,224,153,10,0,110,164,60,130,86,106,218,2,95,
-51,51,96,219,101,26,1,51,51,96,62,64,11,0,58,96,6,163,11,228,
-233,1,0,83,202,89,67,202,227,193,9,99,184,99,187,98,94,0,58,96,
-98,96,226,72,115,96,248,192,77,64,190,133,16,0,58,96,165,64,37,96,
-177,166,82,192,35,128,226,129,235,232,159,0,224,14,6,232,144,7,1,95,
-49,70,45,133,245,77,170,192,10,96,48,100,23,96,6,64,114,192,18,224,
-230,5,229,208,9,0,67,162,125,65,54,96,181,229,197,4,1,95,51,71,
-52,166,117,1,50,54,224,114,0,0,58,96,18,97,153,225,72,3,136,185,
-142,53,163,23,0,57,160,250,64,50,166,217,0,51,68,99,224,122,1,102,
-66,191,15,96,130,128,80,134,171,224,74,8,64,11,0,58,96,6,2,10,
-65,32,67,90,0,85,128,16,194,210,0,90,128,242,65,171,69,59,0,58,
-96,82,161,238,64,20,224,28,5,64,118,5,10,65,32,73,32,58,96,192,
-103,54,64,141,1,54,32,64,28,129,227,71,126,128,170,1,95,51,73,198,
-160,183,1,95,51,139,128,224,45,0,129,235,66,66,134,22,129,222,230,39,
-2,96,197,129,120,132,237,96,140,69,114,64,25,0,83,160,58,0,64,96,
-18,224,5,4,230,115,6,160,60,230,147,2,230,129,14,129,195,224,35,1,
-224,116,2,194,229,224,114,0,73,106,243,213,2,230,245,2,160,73,160,46,
-102,91,240,193,5,161,159,192,160,162,198,134,37,2,49,56,50,128,46,100,
-206,64,5,96,91,198,171,2,64,64,79,68,203,198,221,224,174,92,0,52,
-175,18,224,174,67,224,109,17,192,154,224,42,0,224,118,44,96,61,66,136,
-166,246,2,79,32,35,64,93,224,136,5,224,238,20,128,115,0,82,64,107,
-67,88,224,199,4,98,147,0,39,96,2,99,151,98,222,128,39,224,120,24,
-224,255,1,64,1,0,89,192,23,226,245,1,226,178,5,224,48,4,72,237,
-224,66,6,200,239,224,63,9,70,215,244,250,0,161,222,192,182,3,95,50,
-54,49,71,160,224,98,8,1,95,50,82,79,0,52,224,24,10,232,161,5,
-23,87,97,114,110,105,110,103,58,32,67,97,110,39,116,32,102,105,110,100,
-32,102,105,108,101,235,201,1,224,62,3,237,101,0,224,19,2,237,110,7,
-17,51,52,38,32,105,110,32,100,105,114,101,99,116,111,114,105,101,115,72,
-247,1,92,57,224,77,0,238,185,3,160,77,160,73,0,53,142,194,224,13,
-0,0,50,237,198,6,224,68,1,225,154,20,224,147,9,18,49,48,38,32,
-32,65,115,107,101,100,32,102,111,114,32,98,121,58,32,135,49,5,49,51,
-52,32,95,50,171,198,224,60,0,83,203,134,148,130,16,1,52,56,77,68,
-244,117,9,6,109,105,115,115,105,110,103,97,48,160,81,244,158,3,224,144,
-2,207,145,161,209,70,232,96,97,2,95,53,54,169,202,130,166,97,98,0,
-50,97,182,224,39,6,94,59,129,110,192,157,235,34,0,160,63,102,77,72,
-112,72,4,225,88,0,225,101,0,1,95,53,98,215,169,97,131,29,160,19,
-128,0,113,38,68,101,1,95,50,70,18,170,101,82,99,64,39,0,52,101,
-234,135,99,0,85,102,127,0,90,64,111,147,171,0,58,96,31,230,68,0,
-67,203,0,54,235,152,0,75,35,64,23,0,51,112,165,160,222,238,150,15,
-84,177,0,47,161,228,204,163,0,58,96,102,2,10,65,32,109,90,97,247,
-129,77,228,57,0,97,202,64,107,0,58,96,50,1,10,65,224,124,0,224,
-212,1,229,183,7,97,48,132,119,161,5,225,26,12,0,58,96,7,96,81,
-0,58,65,94,166,234,225,154,1,72,210,64,105,2,95,53,50,65,114,65,
-182,1,53,55,136,242,192,35,3,95,53,55,52,226,142,2,15,85,84,70,
-45,56,47,47,82,79,85,78,68,84,82,73,80,128,238,135,60,227,236,1,
-0,95,94,41,1,95,53,121,35,66,39,110,227,98,6,107,101,1,95,53,
-87,63,161,223,226,38,2,65,78,136,101,65,43,197,17,152,215,1,55,57,
-146,91,0,35,129,244,129,68,224,61,1,68,53,73,184,192,116,226,110,6,
-225,46,0,151,18,176,172,192,175,128,161,224,193,3,65,24,0,53,128,78,
-97,80,192,73,240,11,0,96,102,4,10,65,32,75,51,69,147,0,58,96,
-38,9,10,65,32,94,103,101,116,98,32,58,96,202,106,67,5,54,57,32,
-79,32,95,80,70,0,79,68,215,0,48,160,66,0,58,97,1,180,148,128,
-230,1,50,51,66,184,227,170,11,225,115,13,243,244,6,20,117,110,107,110,
-111,119,110,32,116,101,120,116,32,101,110,99,111,100,105,110,103,235,231,2,
-97,203,0,51,65,97,0,58,65,209,130,10,67,118,0,54,74,157,0,55,
-226,85,1,193,81,0,90,64,175,224,27,0,96,54,170,10,0,52,140,32,
-65,151,1,95,53,113,215,0,73,102,122,3,50,32,64,85,64,47,161,237,
-130,204,3,85,32,75,50,110,106,0,58,96,24,106,229,2,51,53,32,77,
-202,97,113,0,49,205,216,99,106,0,49,67,165,132,220,96,122,64,92,2,
-95,49,52,75,23,96,11,0,58,96,6,96,132,2,57,32,75,70,61,0,
-52,67,44,229,48,3,23,67,111,110,116,114,111,108,46,69,120,99,101,112,
-116,105,111,110,46,73,110,116,101,114,110,150,72,224,39,1,3,83,111,109,
-101,224,35,0,97,40,161,153,64,215,106,123,161,31,145,0,138,250,72,194,
-0,53,90,64,1,95,52,96,168,0,58,65,62,224,230,0,109,224,96,30,
-9,10,65,32,99,97,116,99,104,32,58,96,63,147,88,226,238,4,67,115,
-0,55,203,78,2,95,53,54,76,145,83,113,224,160,1,6,111,112,101,110,
-70,105,108,173,31,226,203,1,0,58,99,178,99,213,67,12,78,70,96,57,
-171,47,64,179,136,62,167,106,146,141,1,95,53,70,9,136,31,64,167,64,
-3,200,46,131,44,100,176,231,39,2,241,141,7,166,36,96,128,130,9,228,
-75,8,64,209,164,75,68,196,194,118,0,49,127,29,227,95,3,131,113,224,
-33,2,117,161,96,90,130,54,183,170,99,25,0,53,80,40,75,186,68,30,
-183,57,116,37,224,32,6,0,52,96,101,224,19,6,98,188,1,95,53,105,
-209,1,95,53,131,253,224,119,0,120,132,96,138,96,114,1,95,50,66,162,
-3,95,53,53,57,97,83,130,105,5,94,102,108,117,115,104,67,212,64,22,
-213,77,228,181,1,80,80,228,255,7,196,196,135,24,224,5,0,78,175,64,
-4,64,118,64,3,224,135,4,64,186,97,166,99,86,97,49,225,124,1,23,
-104,67,108,111,115,101,58,32,72,97,110,100,108,101,32,97,108,114,101,97,
-100,121,32,99,64,21,175,205,228,208,5,85,115,97,145,128,77,134,234,228,
-213,1,141,5,0,58,97,22,132,197,0,65,64,242,64,22,97,9,0,66,
-79,56,109,115,96,51,131,148,0,58,96,60,129,41,1,53,53,90,167,0,
-48,96,52,130,141,6,65,46,119,114,105,116,101,65,39,130,140,0,94,96,
-157,97,56,130,46,135,122,1,95,53,112,22,2,53,49,32,64,62,160,87,
-129,244,7,116,111,70,117,110,80,116,114,64,50,198,184,123,117,98,227,65,
-18,226,227,10,161,100,224,9,6,102,195,66,242,164,152,226,239,3,160,6,
-0,58,97,106,224,81,0,104,226,128,144,224,14,5,224,11,2,192,8,136,
-189,0,58,96,95,112,80,3,52,54,32,58,96,145,100,154,78,255,68,31,
-0,58,64,23,128,18,133,50,82,119,2,95,53,52,97,162,1,49,55,80,
-36,100,70,2,95,49,56,72,123,192,11,192,62,64,63,208,24,197,50,192,
-154,148,146,248,235,8,184,241,176,52,193,20,64,174,75,165,105,94,160,19,
-96,31,101,125,1,95,53,99,36,2,95,49,52,230,79,3,227,238,0,160,
-43,96,30,224,36,16,234,40,4,64,46,66,231,230,215,13,101,101,224,84,
-28,128,174,192,197,128,230,224,183,5,98,214,224,106,22,148,23,224,98,5,
-1,32,40,128,98,224,134,9,75,143,234,254,2,224,130,0,96,115,70,146,
-161,188,102,146,96,11,0,58,96,6,193,164,0,75,140,85,0,57,71,10,
-245,153,0,2,67,32,60,190,44,224,18,6,84,220,224,19,8,64,224,233,
-250,0,160,19,153,110,175,73,160,19,68,209,0,85,224,212,2,0,105,70,
-230,3,114,117,112,116,196,17,224,28,3,14,114,101,115,111,117,114,99,101,
-32,118,97,110,105,115,104,192,34,224,35,4,5,116,105,109,101,111,117,188,
-52,224,110,8,66,144,224,45,3,7,117,110,115,117,112,112,111,114,122,154,
-3,112,101,114,97,231,71,0,224,38,4,12,104,97,114,100,119,97,114,101,
-32,102,97,117,108,192,91,224,243,8,67,143,224,243,7,104,146,224,132,6,
-65,240,224,243,5,14,97,112,112,114,111,112,114,105,97,116,101,32,116,121,
-112,135,45,224,35,6,11,118,97,108,105,100,32,97,114,103,117,109,101,221,
-20,224,34,4,245,21,3,224,115,8,68,165,224,44,3,13,112,114,111,116,
-111,99,111,108,32,101,114,114,111,114,224,111,9,5,115,121,115,116,101,109,
-224,29,3,224,240,9,225,247,10,225,246,10,225,245,10,225,244,7,1,117,
-110,149,218,12,105,101,100,32,99,111,110,115,116,114,97,105,110,220,1,224,
-40,4,2,115,101,114,224,147,4,224,210,4,1,101,114,110,15,6,111,110,
-32,100,101,110,105,225,10,15,226,2,7,6,105,108,108,101,103,97,108,225,
-254,19,2,101,110,100,86,46,78,101,225,251,14,225,230,10,225,229,7,226,
-188,0,5,101,120,104,97,117,115,226,224,21,3,98,117,115,121,225,201,14,
-224,86,6,12,100,111,101,115,32,110,111,116,32,101,120,105,115,162,22,224,
-31,3,199,101,96,30,221,84,96,0,196,11,64,168,196,11,149,46,64,6,
-196,11,3,95,49,53,52,197,93,112,213,64,136,135,146,236,156,3,239,242,
-8,135,228,0,45,96,112,143,229,0,53,68,147,160,121,128,109,64,83,0,
-58,96,6,228,121,4,228,233,8,1,48,120,128,183,71,13,1,51,53,70,
-3,0,52,67,68,1,95,53,105,44,2,64,95,53,100,130,224,209,1,135,
-31,128,99,167,36,203,181,75,106,0,53,75,173,1,95,53,101,103,1,53,
-51,69,52,0,50,119,75,96,77,2,95,50,48,96,171,160,11,0,53,224,
-11,1,119,15,128,11,0,53,76,131,0,58,96,12,8,10,65,32,117,114,
-101,109,32,58,96,73,64,13,3,113,117,111,116,64,14,167,86,1,49,50,
-128,177,88,250,128,183,97,44,88,95,128,71,1,64,58,96,144,219,5,115,
-6,134,222,137,124,65,111,76,81,136,105,238,90,4,224,22,1,102,85,74,
-128,3,95,49,57,48,225,58,2,82,13,10,46,47,108,105,98,47,68,97,
-116,97,47,76,69,10,103,101,114,95,84,121,112,101,46,104,115,64,29,4,
-44,54,48,58,49,162,23,128,69,0,57,79,167,149,90,70,177,0,79,64,
-129,186,34,161,133,224,34,2,224,26,3,224,23,2,212,64,1,95,49,151,
-193,0,49,88,182,0,58,96,239,171,24,1,95,53,106,253,75,6,68,157,
-155,22,130,99,91,56,96,7,0,56,70,129,123,226,96,66,1,56,32,134,
-88,97,129,113,15,75,78,129,56,65,14,3,54,52,32,95,111,57,132,239,
-1,66,32,143,41,0,95,95,164,128,148,0,53,224,9,0,1,54,51,191,
-220,187,11,224,46,12,64,36,220,201,96,113,139,57,246,31,2,233,170,1,
-128,23,125,71,168,189,225,172,1,0,95,79,40,128,223,224,241,41,128,12,
-128,115,118,127,132,15,68,18,224,96,1,77,59,224,96,46,128,254,88,204,
-224,100,1,128,224,160,216,192,215,224,102,5,64,213,100,4,224,100,22,224,
-144,47,240,26,6,18,78,117,109,101,114,105,99,46,115,104,111,119,73,110,
-116,65,116,66,97,76,75,7,110,101,103,97,116,105,118,101,231,24,7,129,
-32,128,2,138,69,170,117,224,231,3,64,5,224,196,31,247,48,0,1,50,
-51,224,23,3,224,84,62,77,149,224,23,2,224,254,32,232,191,3,1,98,
-97,188,134,192,149,119,18,226,174,6,194,164,0,83,81,214,202,22,246,14,
-0,108,31,224,49,5,194,105,160,83,192,11,226,117,8,224,70,4,74,231,
-192,49,151,107,131,43,160,22,225,73,12,244,74,2,224,10,2,224,55,2,
-225,95,3,0,51,92,11,140,20,177,116,186,10,225,81,16,0,58,100,110,
-241,116,20,0,83,104,243,4,46,73,79,46,69,200,98,224,28,1,1,73,
-79,241,103,12,77,12,191,25,82,107,80,83,96,22,166,111,1,54,54,97,
-3,103,54,188,111,71,57,224,9,1,128,29,92,222,128,240,175,247,106,168,
-64,0,2,95,49,55,240,7,0,0,58,96,6,147,145,2,56,32,58,96,
-63,142,247,0,58,112,174,228,156,0,239,217,1,71,27,98,122,141,57,240,
-169,0,182,117,162,18,224,47,1,119,245,108,121,113,3,134,236,0,50,224,
-44,1,101,251,1,32,95,67,204,174,146,128,214,97,118,1,95,53,85,49,
-64,6,131,112,1,64,58,113,75,180,32,0,80,148,65,0,95,71,38,192,
-5,116,75,0,58,96,47,242,172,0,243,190,3,1,95,53,129,21,162,121,
-240,26,2,111,126,128,226,183,123,224,55,4,97,47,224,177,0,242,117,0,
-164,209,0,95,65,158,160,160,134,64,15,73,79,46,112,101,114,102,111,114,
-109,73,79,32,94,38,99,143,244,64,31,133,244,4,102,112,102,105,110,65,
-102,130,67,4,102,112,110,101,119,64,14,129,253,8,94,97,100,100,95,70,
-73,76,69,64,18,129,249,96,18,2,117,116,102,97,167,207,243,1,95,53,
-76,239,64,166,1,64,58,65,102,129,26,0,58,96,21,146,137,243,93,5,
-148,203,64,172,192,224,96,11,129,76,238,33,1,0,79,80,95,213,215,224,
-23,7,0,57,199,157,224,24,5,71,142,224,23,8,226,237,1,1,119,43,
-164,73,1,95,53,104,177,110,159,242,149,0,98,157,1,95,53,103,139,225,
-95,3,194,18,226,104,8,0,58,98,133,105,13,1,49,51,101,224,0,58,
-96,61,163,34,192,221,120,32,119,64,169,210,192,6,131,4,96,118,0,58,
-96,6,113,103,1,73,110,73,103,64,33,114,225,84,106,64,15,129,162,130,
-240,103,225,181,4,132,82,101,22,195,15,136,163,180,98,91,205,164,118,224,
-47,2,130,38,77,199,99,120,1,51,50,180,89,216,238,65,204,100,0,146,
-104,250,100,0,229,95,0,99,26,194,119,0,48,88,253,130,124,1,67,32,
-232,104,0,192,18,1,58,53,67,88,164,78,1,75,52,64,2,132,192,2,
-58,53,48,130,45,1,95,51,92,110,1,51,54,74,138,70,75,87,13,74,
-174,128,11,2,52,57,52,168,185,2,52,57,54,160,90,3,64,95,53,48,
-80,102,96,33,0,58,96,6,162,139,64,139,1,95,51,82,163,0,58,64,
-34,128,22,69,91,65,129,0,66,99,108,0,51,82,174,3,95,53,48,49,
-82,15,0,48,80,87,0,57,240,87,1,67,144,0,51,72,216,0,80,64,
-165,0,95,149,31,230,13,0,97,103,134,110,250,47,1,98,219,96,84,64,
-184,68,2,224,23,8,160,76,149,74,227,190,0,128,27,219,18,192,24,192,
-52,2,95,52,57,98,164,64,21,71,138,129,131,65,120,3,67,32,61,61,
-173,158,2,95,53,48,97,53,0,53,226,231,3,2,98,105,110,206,38,224,
-61,0,231,10,1,100,118,241,150,14,65,11,0,51,235,20,3,128,110,224,
-44,16,81,95,163,112,0,51,167,120,98,131,128,12,225,54,0,224,237,1,
-255,130,4,65,162,0,54,130,1,0,53,76,171,96,33,65,171,77,60,84,
-142,128,219,132,228,0,58,96,228,224,43,1,157,155,2,95,51,52,89,230,
-1,95,51,173,44,0,58,96,46,187,87,0,48,131,52,103,48,0,58,64,
-76,162,36,0,51,84,212,2,95,53,48,99,177,76,193,128,22,66,26,64,
-85,1,95,51,117,85,193,139,96,18,0,52,66,34,162,240,160,5,161,21,
-0,52,76,243,96,255,146,254,64,233,64,50,150,56,0,58,96,101,196,17,
-71,234,70,204,64,229,239,105,4,97,232,224,25,12,97,45,246,180,2,224,
-25,1,102,142,97,220,0,85,226,23,5,128,135,162,184,247,191,0,160,43,
-96,131,226,72,6,148,220,130,140,96,36,192,217,140,36,64,0,224,129,12,
-97,114,224,85,16,132,227,224,85,8,98,69,224,144,22,143,188,224,58,19,
-238,50,2,224,145,3,100,113,224,171,12,167,113,224,112,14,99,74,224,171,
-45,143,150,224,171,20,224,59,16,100,50,224,59,9,158,189,160,0,134,38,
-130,101,0,58,96,6,226,77,0,114,147,239,87,1,128,3,196,38,164,77,
-69,9,160,86,100,154,192,12,2,49,55,52,224,17,0,1,64,75,64,16,
-128,134,230,55,2,123,56,224,23,0,224,24,0,224,93,0,182,209,224,99,
-4,224,86,4,233,69,0,224,142,12,0,52,70,40,224,47,5,224,24,2,
-0,52,225,3,1,193,1,101,235,96,6,185,234,67,113,129,77,65,7,106,
-10,104,0,224,179,1,128,123,67,5,197,106,150,152,64,138,93,51,96,107,
-96,85,198,42,119,200,227,29,9,164,221,192,31,69,19,0,52,75,173,224,
-24,1,229,211,6,110,26,64,0,0,58,70,181,132,145,128,36,104,77,107,
-237,64,230,89,183,74,56,113,78,0,50,114,0,128,19,233,215,0,96,110,
-76,110,140,25,192,66,224,63,2,175,82,128,112,64,254,171,8,224,10,1,
-0,58,96,172,231,11,4,230,109,14,175,134,198,111,204,220,99,103,97,199,
-227,223,4,160,27,97,22,160,49,229,28,4,230,50,11,0,53,230,95,1,
-224,131,14,160,241,231,63,2,225,96,10,78,140,160,0,101,106,0,58,72,
-39,99,27,69,222,1,95,52,72,39,0,58,96,80,64,19,229,219,5,133,
-206,0,58,96,35,96,49,66,133,0,51,65,42,128,10,0,52,66,89,192,
-10,64,193,128,10,124,130,160,10,224,32,1,97,140,1,52,57,161,238,64,
-85,173,38,1,51,56,96,30,96,111,0,56,92,183,96,36,138,47,224,142,
-0,1,57,51,161,185,230,110,4,160,58,97,219,198,80,236,223,4,224,43,
-9,83,253,224,43,9,161,158,224,25,1,224,18,1,1,52,56,97,108,2,
-95,52,56,164,169,0,58,96,165,162,36,90,197,130,1,155,83,0,58,96,
-38,224,188,6,129,54,96,193,99,215,96,11,131,205,66,123,224,40,5,224,
-55,11,155,87,128,10,227,152,0,231,116,1,1,53,55,194,214,224,196,7,
-106,140,226,102,0,133,48,160,77,1,55,57,195,86,64,0,224,68,5,224,
-66,2,237,233,0,0,58,97,59,224,217,6,96,145,64,38,224,199,5,225,
-173,4,224,74,12,0,54,224,74,13,65,98,224,74,5,66,23,206,213,160,
-70,64,94,224,233,8,225,171,2,2,95,52,56,163,116,64,105,227,208,1,
-65,171,0,80,66,95,64,30,172,37,100,182,0,85,96,20,163,2,224,123,
-3,0,50,101,63,127,169,1,95,52,67,73,225,73,6,68,45,225,141,8,
-0,55,224,53,4,1,56,48,96,53,1,50,51,118,216,64,53,234,128,1,
-1,95,39,234,126,3,224,205,10,134,5,170,246,0,58,99,66,192,183,64,
-232,128,183,131,70,224,168,6,1,95,49,81,158,0,58,96,126,224,29,6,
-67,1,0,52,85,41,0,58,96,41,160,29,102,114,3,95,49,53,50,181,
-25,64,233,73,255,0,35,99,177,0,58,96,48,224,42,9,102,22,224,42,
-0,128,169,0,58,96,98,225,74,5,0,52,102,154,0,55,65,150,181,174,
-97,16,135,253,0,79,241,134,2,1,46,46,65,18,224,17,3,1,58,58,
-128,17,3,79,32,35,54,172,127,96,12,68,148,224,12,0,87,218,160,13,
-224,57,1,0,60,120,128,224,17,3,1,45,62,224,75,1,224,48,0,96,
-62,107,37,224,44,5,0,61,96,44,229,131,0,161,167,226,207,3,0,52,
-77,0,224,20,9,99,68,0,58,100,251,193,173,64,248,97,173,64,49,111,
-248,226,17,13,22,33,64,35,36,37,38,63,43,46,47,60,61,62,63,92,
-57,50,38,94,124,58,45,126,64,136,0,58,97,62,139,130,226,163,2,0,
-53,97,83,99,230,0,82,76,80,64,79,136,78,227,50,3,66,148,226,101,
-9,226,90,2,71,229,224,91,9,152,175,141,203,237,22,2,80,15,232,181,
-2,66,20,102,255,192,31,224,161,10,128,24,67,129,104,52,227,208,4,224,
-151,17,237,19,0,64,23,129,137,0,58,96,202,227,168,9,1,95,52,101,
-80,224,72,4,67,67,65,141,248,166,2,0,58,102,157,193,150,64,101,129,
-150,131,38,225,150,15,8,44,59,40,41,91,93,123,125,96,129,136,64,105,
-228,189,10,82,225,3,64,75,32,89,225,1,6,0,89,96,238,69,204,0,
-64,231,95,1,224,58,6,111,173,228,248,5,65,54,121,42,228,112,1,0,
-35,99,46,105,85,0,51,77,166,205,76,231,181,6,224,91,15,193,23,141,
-114,225,91,4,224,18,1,0,52,67,24,193,175,143,79,140,58,129,220,201,
-107,132,77,65,47,0,52,225,47,0,129,0,225,131,10,73,251,246,41,3,
-64,90,145,102,97,10,225,236,0,0,95,82,40,97,96,208,168,0,80,153,
-2,97,163,64,69,225,117,11,65,246,225,58,4,96,194,0,85,137,137,232,
-210,1,162,102,2,51,55,56,64,4,103,124,66,201,128,200,224,201,8,137,
-53,226,200,5,224,109,0,1,64,90,226,176,5,1,95,52,239,173,2,0,
-58,105,21,192,189,68,11,128,189,175,149,225,225,10,230,84,7,131,170,224,
-95,2,83,242,237,0,0,225,223,4,232,48,6,226,51,11,165,162,224,20,
-6,130,72,224,20,5,0,49,66,83,224,21,9,103,200,224,21,9,65,235,
-224,21,9,128,174,224,21,7,224,109,11,96,230,226,224,8,128,85,225,17,
-4,129,115,240,56,8,193,163,224,17,3,130,127,224,17,2,184,24,224,17,
-2,83,178,224,35,6,224,34,8,105,98,224,17,4,193,121,224,17,1,224,
-88,8,138,29,224,16,2,144,79,225,163,8,74,134,104,213,224,95,8,229,
-21,5,105,145,104,250,226,193,0,226,190,5,0,67,124,89,1,95,52,71,
-122,73,20,0,52,205,24,92,185,3,95,52,53,56,67,121,170,222,227,147,
-10,76,72,77,125,217,60,224,171,12,68,62,132,213,226,102,23,100,54,224,
-20,8,136,73,224,20,6,226,35,11,110,30,224,20,8,226,55,11,148,57,
-224,20,6,103,115,224,20,8,114,139,224,20,7,226,118,11,70,253,224,20,
-9,224,209,11,103,241,224,20,8,224,209,11,73,4,224,20,9,224,209,11,
-161,205,224,20,5,73,184,224,20,9,224,209,11,107,84,224,20,8,224,209,
-11,107,22,224,20,8,224,209,11,75,159,224,20,9,224,209,11,109,21,224,
-20,8,224,209,11,106,72,224,20,8,224,209,11,228,26,12,110,243,224,20,
-8,228,47,11,107,149,228,47,10,227,249,8,154,40,224,17,3,91,85,224,
-17,6,227,215,8,180,40,224,17,3,102,94,224,17,4,134,15,224,17,3,
-228,155,8,90,78,224,17,6,228,84,8,187,125,224,17,3,228,138,9,228,
-192,9,224,179,8,135,88,224,17,4,224,179,8,188,118,224,17,3,224,179,
-8,229,26,10,229,97,26,229,62,9,224,178,8,229,61,15,224,16,1,224,
-175,8,224,174,8,224,173,8,225,96,9,224,153,8,224,16,7,128,169,103,
-210,2,50,32,79,176,156,233,95,0,2,52,54,51,254,50,3,1,79,72,
-109,191,224,79,7,224,47,17,224,46,8,128,178,0,79,224,98,16,2,78,
-85,76,224,51,7,96,161,224,49,17,2,83,84,88,224,49,7,96,245,224,
-49,17,0,69,224,49,9,97,56,224,49,18,1,79,84,224,49,7,96,200,
-224,49,18,1,78,81,224,49,7,97,190,224,49,17,2,65,67,75,224,49,
-7,98,1,224,49,17,1,66,69,225,43,8,98,68,224,49,18,0,83,224,
-48,7,98,134,224,48,17,0,72,224,247,8,98,200,224,48,17,1,76,70,
-225,242,8,225,191,22,0,86,224,98,8,131,79,224,49,17,0,70,224,99,
-9,225,241,22,1,67,82,224,49,8,225,241,22,1,83,73,224,49,8,225,
-191,22,2,68,76,69,224,50,8,225,192,22,2,68,67,49,224,50,8,225,
-193,22,2,68,67,50,224,50,8,225,195,22,2,68,67,51,224,50,8,225,
-197,22,2,68,67,52,224,50,7,133,134,224,50,17,1,78,65,226,190,8,
-133,203,225,99,18,1,89,78,224,50,8,227,186,24,0,66,224,50,8,225,
-201,22,1,67,65,224,101,9,227,188,23,0,77,224,49,8,225,252,22,1,
-83,85,224,151,9,225,252,22,2,69,83,67,224,50,8,225,252,22,0,70,
-227,190,8,135,172,224,49,17,0,71,224,49,9,225,250,22,0,82,224,49,
-8,136,52,224,49,17,0,85,224,49,9,225,248,23,0,80,224,49,8,225,
-247,22,0,68,228,234,9,188,191,242,174,5,224,0,17,238,95,11,221,1,
-0,58,111,64,242,13,13,1,83,39,146,14,145,249,122,175,123,143,224,75,
-0,144,36,122,246,0,85,210,143,224,19,0,185,26,112,67,233,177,2,201,
-172,143,162,242,61,14,82,59,64,0,80,170,0,58,65,14,64,161,0,80,
-160,98,147,0,122,116,0,90,160,4,112,95,145,117,71,203,192,217,178,60,
-1,52,53,86,254,1,54,48,143,161,128,9,4,49,49,49,52,49,101,109,
-0,58,109,56,111,174,3,53,54,32,58,109,44,159,44,64,55,64,10,159,
-44,77,100,64,13,246,160,29,250,202,26,0,58,109,244,64,120,96,159,68,
-101,1,95,52,68,5,1,95,52,95,236,1,95,52,68,68,1,95,52,88,
-4,74,245,106,249,1,56,48,238,4,0,0,52,97,163,1,95,52,97,52,
-224,13,1,67,173,0,73,96,174,0,54,160,213,0,57,65,122,75,102,84,
-252,147,27,0,58,96,39,224,29,2,154,135,224,29,1,186,54,224,59,1,
-1,95,49,77,223,0,58,96,102,64,25,0,54,78,141,130,173,0,52,118,
-100,87,206,2,95,52,52,86,142,0,52,154,184,118,57,1,55,54,224,176,
-0,0,55,97,16,64,10,0,58,96,6,83,131,155,25,224,5,2,160,78,
-144,255,162,166,128,6,0,58,96,80,224,52,27,224,59,2,0,58,96,139,
-224,52,20,224,98,2,160,59,0,58,96,198,224,52,27,224,112,2,0,58,
-97,1,116,87,0,66,98,163,188,166,93,134,158,232,211,78,188,186,1,95,
-52,106,17,2,95,52,48,131,138,255,12,2,4,85,32,95,52,48,98,37,
-93,83,170,56,64,97,162,47,0,54,65,84,0,52,98,237,89,223,0,58,
-97,136,220,201,0,50,66,60,64,25,120,19,64,31,192,148,243,140,2,254,
-128,16,236,168,0,99,176,112,34,110,241,128,127,130,22,83,222,226,26,2,
-96,25,130,22,0,83,128,195,99,150,0,66,66,242,226,64,7,195,221,160,
-4,1,83,32,67,225,224,48,32,193,90,253,141,4,182,158,224,208,1,158,
-19,244,123,4,224,238,4,110,92,1,95,52,135,9,65,96,1,50,53,67,
-174,187,241,1,64,75,96,210,160,60,160,108,128,111,164,177,160,114,215,39,
-64,88,192,25,160,121,224,115,22,224,113,5,224,111,3,224,49,17,94,41,
-224,0,5,0,58,100,37,193,245,1,52,50,67,93,0,48,96,45,160,16,
-0,56,69,113,126,107,1,50,50,127,156,70,155,165,2,0,51,87,68,1,
-52,48,237,4,1,66,56,132,123,224,155,3,0,58,96,119,101,67,1,51,
-51,64,67,68,212,97,243,108,253,122,12,224,17,4,0,73,118,94,3,95,
-52,51,52,160,21,3,95,52,51,53,224,10,1,0,55,65,226,97,220,113,
-28,64,18,0,57,224,18,6,0,58,96,150,133,103,161,119,225,132,1,67,
-55,99,65,102,211,68,195,101,155,0,64,96,35,65,58,64,5,83,90,1,
-52,51,66,180,192,41,0,52,87,75,192,41,96,235,64,149,246,166,1,224,
-60,20,82,5,224,59,17,0,58,64,193,195,20,2,75,52,32,129,205,0,
-58,96,113,128,196,163,213,224,86,20,96,85,118,200,96,85,0,58,65,41,
-129,218,0,89,227,25,1,131,14,130,40,185,133,0,82,224,22,4,249,226,
-2,64,106,132,192,151,25,0,89,129,56,128,1,81,86,215,135,194,210,121,
-211,225,8,4,1,32,64,65,237,193,111,97,232,96,49,102,92,65,2,224,
-159,3,224,82,1,192,76,133,1,96,66,87,111,77,10,3,95,49,57,56,
-151,227,160,164,200,121,224,1,3,88,122,224,153,2,224,20,5,224,17,8,
-224,14,5,224,11,2,192,8,131,143,96,109,132,162,0,85,97,165,67,92,
-0,58,67,5,129,37,99,47,102,186,73,241,0,58,99,41,192,222,128,216,
-0,58,96,25,101,73,129,81,213,146,98,181,99,69,225,165,2,131,201,161,
-18,192,92,227,45,9,64,0,199,88,64,33,225,81,3,64,64,0,85,225,
-222,0,224,18,0,137,106,192,21,160,104,224,29,0,128,39,251,82,3,0,
-58,68,7,128,88,72,129,1,50,57,234,89,2,17,102,111,108,100,108,49,
-58,32,101,109,112,116,121,32,108,105,115,116,106,104,68,3,0,54,96,146,
-226,132,6,0,83,229,87,4,96,91,0,54,194,229,160,134,0,85,248,229,
-6,102,59,97,29,251,151,1,192,189,194,197,99,29,105,85,100,128,0,49,
-130,117,231,117,0,100,145,64,22,167,6,133,118,100,137,1,52,48,97,69,
-2,67,32,95,119,0,128,13,96,151,166,245,231,185,3,230,223,2,136,240,
-64,6,97,217,69,99,167,86,73,100,68,101,65,201,64,254,217,136,64,15,
-104,213,171,56,1,95,49,126,228,96,77,0,58,96,6,226,71,1,137,199,
-0,49,96,89,130,96,102,230,163,184,106,185,230,211,4,128,113,233,137,2,
-96,153,231,93,1,128,209,168,251,134,114,64,59,165,22,253,167,2,101,29,
-161,157,97,92,232,130,3,130,24,224,86,2,198,45,187,244,129,39,229,112,
-1,64,196,72,121,96,55,1,52,49,91,46,128,155,104,146,147,211,124,73,
-162,149,161,25,224,46,3,160,102,160,44,231,145,3,224,184,11,224,134,15,
-233,2,0,224,137,8,192,90,224,134,27,224,181,2,225,11,5,160,73,161,
-11,97,122,0,48,227,35,2,21,92,51,52,38,46,47,108,105,98,47,68,
-97,116,97,47,73,110,116,101,103,101,114,96,7,6,114,110,97,108,46,104,
-115,64,33,3,44,53,52,58,144,207,0,58,97,255,103,49,0,49,89,189,
-71,72,0,58,96,121,163,39,97,154,128,242,97,204,64,9,99,1,96,23,
-233,120,0,75,89,121,177,98,213,133,57,212,175,226,4,0,64,59,228,39,
-4,134,125,128,5,227,238,8,19,105,109,112,111,115,115,105,98,108,101,58,
-32,120,115,32,62,61,32,121,115,96,179,1,75,50,65,8,224,245,42,3,
-57,48,58,54,132,50,134,59,130,111,128,211,226,116,0,227,220,3,166,240,
-227,219,2,81,193,166,245,228,213,0,203,106,82,16,232,138,0,196,226,224,
-80,12,134,163,224,80,7,97,206,96,69,65,151,64,24,230,109,0,0,83,
-105,169,104,68,196,71,225,110,8,132,77,164,120,196,150,196,126,224,55,1,
-64,124,224,14,3,228,153,1,2,95,49,57,139,58,0,58,96,132,164,33,
-65,230,65,176,234,232,19,169,254,96,190,0,53,229,77,11,64,82,0,54,
-196,227,1,95,50,70,200,170,142,66,87,227,71,3,129,134,203,228,0,50,
-121,194,166,32,160,120,198,129,83,229,132,98,96,53,0,80,64,197,1,53,
-32,98,29,172,141,195,100,108,159,165,165,193,151,227,183,2,163,213,68,244,
-99,154,0,64,142,182,148,119,96,17,204,212,0,58,96,7,206,79,130,245,
-1,52,48,110,73,0,48,103,142,104,54,0,52,79,167,1,95,52,84,233,
-142,79,96,73,142,79,96,10,0,58,96,6,7,10,65,32,117,62,61,32,
-58,96,40,96,12,64,11,133,55,1,117,60,96,24,131,154,3,117,60,32,
-58,96,95,64,11,2,99,109,112,64,13,130,28,0,75,143,233,64,219,64,
-13,0,50,64,25,129,102,0,75,66,82,0,58,97,16,99,220,1,48,51,
-227,220,0,68,58,227,220,2,164,207,130,97,231,12,9,162,208,231,14,8,
-227,42,15,97,224,64,110,162,213,231,251,1,68,210,95,197,236,187,1,227,
-130,45,224,91,1,227,130,9,224,95,4,227,130,31,224,80,2,130,195,64,
-69,65,165,64,24,227,130,6,131,94,227,93,0,101,153,231,218,2,224,11,
-3,0,58,96,71,209,47,92,244,1,95,56,128,158,98,42,0,48,195,189,
-66,98,177,46,227,54,7,99,211,141,2,92,161,0,58,96,47,103,160,138,
-223,234,169,5,163,104,0,48,130,53,2,42,32,58,96,105,1,10,65,64,
-25,0,58,97,20,147,55,0,51,67,230,147,87,113,226,2,64,58,51,64,
-206,201,24,107,124,160,243,174,31,225,73,0,172,114,3,83,32,95,50,127,
-21,0,64,170,215,128,56,99,87,235,148,3,107,78,193,90,97,112,0,66,
-104,251,225,110,1,96,142,0,53,97,251,0,80,193,155,225,139,2,100,45,
-64,225,194,76,224,231,1,96,197,236,178,2,192,39,97,221,96,86,236,160,
-2,96,99,139,77,0,50,75,80,96,36,0,58,96,34,244,75,13,197,54,
-243,56,0,162,98,234,239,1,163,56,243,72,4,234,234,3,236,249,1,129,
-22,162,137,98,0,0,50,74,220,0,54,66,6,169,50,224,69,16,129,135,
-224,160,6,167,251,128,25,116,123,64,92,164,213,2,66,32,95,64,37,235,
-83,2,73,253,129,151,245,179,0,97,32,0,55,71,240,127,224,209,134,165,
-111,245,51,5,0,58,116,50,234,158,0,238,218,2,99,83,81,74,129,102,
-225,172,2,65,95,129,172,128,133,224,58,44,131,197,224,58,44,189,213,194,
-147,224,67,0,224,56,25,128,243,2,95,51,49,232,95,3,15,118,97,108,
-68,105,103,58,32,66,97,100,32,98,97,115,101,136,68,0,83,137,24,134,
-171,109,92,0,51,67,165,0,35,80,196,205,110,96,17,1,64,35,67,172,
-224,48,17,100,76,224,48,5,0,49,132,131,69,141,224,49,11,98,30,224,
-49,5,0,55,96,242,2,95,49,56,68,51,66,48,68,108,204,121,98,102,
-232,7,0,144,222,0,49,86,167,96,5,128,78,255,11,0,224,61,39,133,
-11,224,61,12,224,48,13,97,32,130,153,0,51,138,208,224,231,15,225,74,
-11,96,171,224,231,10,224,107,23,224,99,34,85,79,224,99,42,0,58,67,
-217,133,159,224,206,33,173,159,224,106,37,0,58,97,55,232,136,0,132,23,
-0,56,128,5,142,6,102,105,67,205,2,95,51,56,68,104,72,136,128,114,
-104,136,128,10,0,58,96,6,0,10,168,136,96,40,96,12,64,11,134,46,
-72,123,96,82,3,10,65,32,105,104,123,96,102,119,108,228,145,5,72,58,
-99,94,128,142,0,35,168,54,224,20,5,121,74,224,20,7,152,215,224,21,
-7,100,152,224,42,8,124,219,231,43,2,96,21,138,36,153,167,250,118,3,
-163,203,224,17,19,129,78,224,16,19,132,192,224,16,7,2,58,51,56,210,
-82,230,61,10,132,120,106,220,103,47,122,150,135,33,192,23,192,35,135,57,
-149,161,199,69,224,35,4,238,122,3,233,39,2,245,129,6,0,39,68,198,
-224,21,2,224,66,0,102,122,245,8,7,199,210,129,75,128,85,77,160,64,
-66,139,2,246,231,2,96,4,66,145,230,60,0,0,89,160,93,147,71,65,
-135,102,203,108,144,140,33,237,254,2,97,32,192,58,198,188,151,223,226,228,
-3,192,151,225,104,1,128,136,102,169,69,180,129,100,84,189,128,0,192,23,
-193,126,96,25,1,95,51,161,226,103,68,64,73,160,48,96,141,2,58,51,
-56,231,240,0,1,51,56,96,168,251,231,1,1,58,51,73,162,232,13,9,
-64,175,129,161,0,82,220,51,231,30,3,0,58,96,72,227,15,7,91,3,
-231,110,17,236,214,1,224,49,0,0,56,168,212,68,6,123,205,0,35,129,
-1,0,58,96,25,64,94,1,51,50,75,194,121,206,96,133,188,63,1,51,
-51,64,118,128,86,1,51,51,64,34,96,11,0,58,96,6,137,30,73,232,
-1,51,55,74,46,70,241,92,47,1,95,51,83,190,124,173,64,150,64,39,
-118,15,138,12,64,42,135,238,104,235,128,65,96,193,103,59,203,62,96,17,
-134,25,96,10,246,161,3,76,150,0,51,74,199,195,33,0,51,121,229,69,
-19,96,182,64,29,227,63,2,97,200,128,29,0,50,97,180,141,109,96,42,
-161,174,3,54,56,32,35,87,105,133,27,64,243,154,204,0,51,66,122,192,
-138,224,40,0,142,60,0,54,97,127,162,49,0,58,96,190,225,223,2,115,
-31,0,51,103,54,105,213,138,72,77,4,238,36,2,2,32,95,51,135,137,
-96,98,97,225,66,234,0,51,233,229,0,0,58,96,120,129,64,0,51,151,
-78,0,58,64,40,129,179,0,53,64,205,66,13,0,58,96,104,160,203,65,
-11,0,90,126,130,157,91,0,58,96,196,228,76,4,128,156,212,120,251,213,
-1,228,247,3,96,253,144,45,64,245,224,113,2,66,31,0,58,96,27,96,
-19,1,52,51,91,1,0,51,110,195,0,58,96,28,224,156,2,91,118,96,
-104,175,156,0,51,65,60,1,95,51,70,114,67,52,1,58,51,191,112,107,
-58,65,251,0,58,96,27,192,202,96,44,70,230,1,58,51,190,191,138,150,
-246,213,8,1,58,51,190,183,129,241,1,48,57,64,145,108,187,135,1,0,
-51,94,189,1,58,51,190,206,160,238,100,199,0,89,118,12,66,89,64,77,
-172,98,184,81,192,97,64,5,129,26,0,50,88,202,3,95,50,51,57,74,
-211,190,33,130,176,64,33,235,21,2,224,236,0,226,81,7,64,205,164,179,
-129,134,129,40,168,119,96,11,132,219,161,191,3,95,51,53,55,234,44,2,
-19,80,114,101,108,117,100,101,46,114,101,97,100,58,32,110,111,32,112,97,
-114,202,50,155,113,1,95,51,77,3,80,168,224,57,19,8,97,109,98,105,
-103,117,111,117,115,224,64,3,1,64,58,97,39,2,10,65,32,66,64,64,
-13,205,214,0,90,101,190,0,58,64,81,64,16,109,243,255,83,0,228,154,
-5,229,191,1,156,27,166,48,226,239,6,236,116,11,108,108,229,163,8,0,
-58,97,28,194,106,1,95,51,80,208,0,58,96,49,224,19,2,99,4,191,
-142,195,4,80,163,65,93,226,95,0,65,172,0,58,97,128,96,182,163,110,
-228,65,2,64,165,105,89,192,153,174,130,2,95,51,51,72,224,161,193,0,
-51,69,106,96,11,0,58,96,6,64,76,96,178,0,53,132,35,131,128,196,
-32,143,202,1,95,49,64,166,191,33,64,63,100,56,1,95,50,228,67,0,
-2,95,51,52,224,86,2,191,114,248,18,1,0,66,134,162,238,255,0,224,
-18,3,1,66,39,181,235,161,46,191,122,128,147,118,180,133,2,71,127,128,
-135,96,218,160,135,64,159,160,135,128,10,96,251,64,10,0,58,96,6,225,
-42,0,0,55,225,42,0,142,194,64,12,225,30,4,128,85,129,30,166,244,
-64,6,97,165,229,167,3,64,172,74,36,64,155,64,61,67,171,65,59,64,
-47,193,233,229,185,3,195,151,0,67,110,123,224,49,0,132,111,191,133,2,
-73,32,58,96,44,192,10,196,44,1,95,51,69,214,0,58,99,137,160,16,
-65,51,231,191,5,0,58,96,36,192,232,88,92,135,146,224,5,0,101,27,
-207,145,96,67,98,45,100,209,232,56,5,160,30,97,33,224,30,10,165,38,
-250,34,1,230,146,4,68,66,224,46,3,122,65,132,240,1,95,51,92,100,
-161,118,66,2,253,10,0,100,129,132,168,122,135,227,110,1,137,184,64,26,
-81,115,224,21,1,69,47,103,85,228,175,1,193,23,160,165,224,24,0,161,
-217,168,253,97,217,96,11,0,58,96,6,129,80,167,243,93,164,0,58,64,
-34,163,110,99,145,189,185,192,123,98,175,99,150,189,146,0,80,166,56,161,
-54,130,64,101,178,0,58,96,240,232,154,1,65,149,128,43,249,24,7,138,
-97,181,234,192,19,128,114,216,20,224,32,2,224,9,10,113,110,225,218,5,
-232,44,7,0,64,101,232,68,143,103,131,97,115,192,17,131,139,1,95,51,
-86,49,100,226,224,55,8,224,177,7,129,162,226,95,0,162,89,64,41,192,
-83,224,84,5,224,82,5,224,81,11,224,91,4,224,82,9,224,181,1,224,
-56,17,226,230,5,224,57,18,225,108,9,224,9,2,101,244,160,63,193,245,
-160,230,224,236,16,96,98,227,56,2,194,241,139,108,224,113,1,160,218,97,
-155,98,172,186,234,99,103,2,51,50,52,64,4,146,96,130,66,96,0,224,
-96,0,0,83,96,164,154,95,224,147,30,226,150,5,224,96,2,131,153,178,
-53,225,1,0,161,4,224,13,22,99,149,130,112,97,96,224,237,0,109,218,
-128,13,224,253,1,227,240,0,96,244,149,20,219,219,175,239,225,15,6,224,
-244,4,64,97,224,96,22,245,123,0,192,95,162,122,128,94,228,22,3,194,
-3,226,190,6,225,67,29,225,216,24,160,105,225,206,21,226,190,21,192,9,
-195,208,226,240,25,224,49,11,224,176,2,228,6,9,225,89,8,229,236,4,
-224,43,5,224,45,6,225,52,0,224,137,18,96,135,226,27,5,193,59,224,
-138,21,252,178,10,124,148,2,48,58,48,252,147,0,64,0,173,209,96,67,
-173,209,96,11,0,58,96,6,114,92,144,39,132,116,64,35,64,98,237,219,
-6,182,65,0,58,64,64,229,238,0,64,134,0,58,96,46,192,70,66,16,
-98,73,192,55,96,71,93,254,64,21,105,248,96,21,198,111,2,95,51,51,
-103,172,0,51,135,172,96,85,140,19,64,23,128,17,108,80,64,53,134,26,
-92,15,233,15,0,162,40,171,173,66,59,105,204,153,151,64,158,206,94,99,
-206,70,216,98,96,2,95,51,50,72,142,96,11,0,58,96,6,198,178,162,
-157,128,202,65,20,103,185,96,190,78,96,68,5,64,80,71,4,91,37,96,
-7,253,113,4,97,55,76,135,64,42,130,50,224,42,14,240,213,8,209,150,
-71,187,236,145,5,164,116,128,152,96,252,1,83,32,85,253,128,162,97,112,
-144,185,0,50,91,174,224,164,25,224,212,1,0,49,75,253,160,24,224,186,
-39,168,49,224,241,46,195,3,129,114,224,218,6,224,158,0,224,215,38,224,
-139,39,196,233,227,153,4,129,86,97,252,96,137,169,89,225,151,2,230,7,
-1,224,184,2,64,5,163,2,225,155,184,128,247,225,159,3,224,231,14,225,
-168,103,224,152,5,123,8,133,205,235,4,1,236,61,1,97,162,102,88,167,
-40,224,174,1,0,50,253,163,1,225,90,46,128,87,224,7,1,224,132,108,
-224,95,10,224,94,67,96,80,128,181,224,222,110,78,158,1,50,57,230,231,
-2,31,115,116,105,109,101,115,58,32,112,111,115,105,116,105,118,101,32,109,
-117,108,116,105,112,108,105,101,114,32,101,120,112,101,3,99,116,101,100,102,
-255,0,58,69,227,140,176,109,83,173,62,0,83,158,130,175,78,141,48,193,
-194,96,52,0,54,160,52,133,143,0,80,102,124,253,236,2,64,14,212,69,
-128,1,195,30,224,11,0,224,59,2,96,81,231,49,0,0,50,211,207,70,
-159,207,175,88,129,76,67,75,247,174,44,143,178,141,130,111,178,77,10,175,
-178,160,10,206,182,64,76,212,28,163,171,128,5,134,202,213,107,103,41,64,
-123,189,205,102,253,131,236,160,28,137,173,224,28,7,238,190,11,140,160,224,
-65,9,182,151,64,24,71,240,97,234,174,123,96,73,79,194,96,49,0,58,
-96,6,224,178,0,138,205,156,178,0,66,226,49,2,192,75,71,164,199,198,
-132,130,128,46,138,179,90,249,224,34,4,0,58,96,125,128,93,1,95,50,
-104,209,64,121,96,35,0,58,96,6,110,133,0,58,96,67,114,247,128,1,
-120,238,64,33,194,0,248,172,1,96,4,159,25,128,205,0,58,97,4,1,
-10,65,193,210,0,58,97,37,96,76,224,55,6,224,85,0,130,4,224,85,
-8,224,34,3,130,20,234,52,0,240,136,8,64,240,255,203,0,97,114,133,
-21,133,18,160,14,0,85,163,135,160,38,230,191,3,169,116,0,67,129,146,
-98,115,128,64,113,27,130,153,64,17,143,228,1,52,55,65,62,146,32,73,
-33,0,58,117,93,161,59,0,48,242,173,0,211,246,70,13,161,241,0,90,
-179,247,140,109,64,130,167,44,131,24,168,201,244,36,4,251,124,2,202,236,
-196,97,225,40,1,96,228,64,85,1,95,51,68,58,128,0,224,38,10,224,
-123,2,2,64,58,51,68,93,144,119,228,72,5,15,105,110,105,116,58,32,
-101,109,112,116,121,32,108,105,115,116,100,52,68,31,225,98,0,224,122,4,
-193,62,224,123,1,0,58,96,9,97,44,231,25,0,2,115,101,113,192,221,
-128,19,224,16,2,228,29,11,64,68,0,54,129,74,90,251,2,50,52,57,
-161,6,246,112,2,224,178,1,3,35,108,105,110,181,183,65,227,103,118,0,
-56,224,210,2,8,123,45,35,32,76,73,78,69,32,96,35,107,121,75,19,
-69,99,0,57,139,130,0,50,75,86,2,95,51,48,97,99,224,56,1,3,
-32,35,45,125,128,87,2,58,51,48,217,71,225,9,2,67,31,181,39,235,
-90,1,66,129,64,72,195,120,2,95,51,48,68,149,149,238,128,15,68,198,
-96,15,0,58,96,41,96,86,242,198,0,225,101,1,207,228,98,68,242,138,
-0,0,58,64,63,162,101,1,95,50,76,119,248,173,5,0,35,108,167,224,
-28,15,108,123,224,18,5,66,191,96,86,244,42,1,0,48,65,14,0,54,
-65,104,160,165,194,254,230,45,0,0,85,224,169,0,192,175,231,11,2,171,
-162,174,78,0,64,224,211,1,128,17,96,32,243,123,5,164,221,236,150,1,
-0,58,96,131,98,0,225,110,4,3,95,50,57,56,239,150,2,96,61,128,
-241,96,53,97,208,225,79,6,226,223,5,5,102,111,108,100,114,49,226,225,
-8,226,156,0,0,83,164,121,130,154,119,136,224,10,2,135,229,128,105,216,
-17,98,80,0,49,65,44,100,20,0,57,133,240,96,217,160,20,193,188,2,
-58,50,57,195,26,0,95,65,57,71,84,0,58,96,48,199,8,197,117,77,
-221,192,103,231,101,0,224,29,0,224,31,2,64,32,251,189,0,65,177,125,
-229,133,224,2,58,50,57,130,41,3,95,50,51,50,70,19,84,57,0,49,
-68,187,0,58,96,38,197,120,88,207,1,50,57,216,12,5,51,53,32,75,
-32,85,209,11,64,2,134,254,0,49,187,225,129,13,64,107,64,17,227,44,
-2,3,32,97,116,32,67,137,131,102,194,15,224,63,2,0,48,65,200,129,
-170,224,66,14,2,99,111,108,192,61,130,76,224,57,8,66,75,137,31,224,
-61,8,15,92,49,48,38,32,32,32,32,117,115,101,100,32,98,121,32,160,
-73,128,62,1,50,57,235,195,0,128,20,85,194,128,20,2,95,49,52,65,
-189,96,11,0,58,96,6,133,23,98,116,226,106,1,162,170,131,46,2,95,
-50,56,151,48,96,7,160,47,65,89,90,109,0,49,152,187,126,125,250,65,
-0,1,50,56,129,250,2,80,32,73,80,211,240,166,10,31,99,112,112,104,
-115,115,114,99,47,109,97,108,99,111,108,109,45,119,97,108,108,97,99,101,
-45,117,110,105,118,101,114,115,1,101,47,96,33,6,45,49,46,50,48,46,
-57,128,12,2,46,104,115,112,221,3,55,57,58,49,164,169,1,50,56,130,
-79,87,16,128,147,96,110,192,147,167,160,2,32,58,50,191,164,1,95,50,
-95,49,1,50,56,98,48,191,155,2,95,52,56,99,57,94,220,2,95,50,
-56,105,91,1,49,55,66,206,64,38,73,125,66,106,192,11,71,17,96,11,
-0,58,96,6,194,69,132,204,225,162,4,10,69,120,105,116,83,117,99,99,
-101,115,115,219,168,97,229,0,50,95,125,68,150,3,53,53,32,95,95,41,
-196,149,225,231,11,64,68,5,70,97,105,108,117,114,165,244,224,36,1,0,
-79,132,11,139,51,3,95,49,51,55,162,55,0,35,243,187,0,161,248,160,
-210,97,248,96,11,0,58,96,6,72,103,68,1,163,190,0,50,191,11,137,
-129,160,16,128,73,0,58,96,178,97,42,0,57,65,104,0,50,83,166,1,
-49,54,230,118,3,6,83,121,115,116,101,109,46,64,174,64,167,224,192,5,
-2,67,111,100,128,189,96,171,0,58,97,105,171,60,0,83,125,19,100,56,
-136,178,90,112,0,58,65,165,64,33,224,70,1,130,7,0,34,96,27,186,
-158,4,50,55,53,32,95,121,231,1,50,55,130,5,169,4,192,80,2,64,
-95,50,95,236,0,67,64,42,94,121,97,101,0,58,64,54,128,125,2,95,
-50,54,196,180,128,33,0,58,96,47,105,127,64,29,95,113,96,7,71,242,
-0,49,94,160,64,33,130,52,6,94,112,117,116,98,32,58,96,27,96,140,
-0,54,65,144,0,95,75,175,0,79,64,50,0,48,161,152,0,58,96,69,
-234,37,2,96,26,167,91,209,218,69,109,229,130,8,229,105,6,96,126,228,
-102,2,224,232,4,143,13,2,95,50,54,64,47,100,58,64,244,1,54,52,
-64,4,158,98,230,23,5,11,66,97,100,32,72,97,110,100,108,101,32,109,
-193,155,96,37,95,242,129,241,0,54,129,163,179,103,233,126,2,221,41,160,
-121,98,44,1,50,54,70,7,129,53,1,54,55,98,61,192,32,128,76,188,
-155,3,57,54,32,58,96,32,65,219,2,112,50,112,64,13,129,186,2,95,
-54,54,103,43,246,95,13,117,30,228,118,0,163,223,224,6,12,224,42,2,
-127,103,132,19,224,42,29,160,28,224,49,10,224,42,15,224,49,10,224,42,
-22,224,49,3,68,102,76,159,149,85,96,6,163,21,65,71,104,141,74,3,
-103,55,0,54,162,152,1,32,95,92,250,81,163,0,58,98,18,160,48,178,
-150,209,154,0,80,132,96,0,50,207,143,203,101,130,87,98,118,129,197,223,
-126,0,58,67,10,128,76,0,85,131,49,85,246,64,60,0,58,66,84,64,
-25,71,147,103,137,0,58,96,27,100,248,162,6,0,95,81,248,226,175,4,
-224,167,2,134,75,226,199,0,0,53,98,97,1,58,50,82,215,235,146,11,
-3,104,101,97,100,232,176,8,0,75,64,238,64,57,97,2,119,42,168,242,
-128,250,200,207,220,232,115,122,129,66,1,95,50,64,156,75,89,98,184,104,
-22,96,18,1,95,50,126,75,224,25,4,193,119,128,33,224,34,0,203,68,
-3,67,39,32,79,96,28,0,53,184,101,128,138,2,95,50,52,70,33,93,
-4,64,28,0,55,68,2,0,35,192,35,216,4,137,21,167,95,235,217,12,
-1,45,79,167,195,96,66,165,215,199,137,224,49,13,9,45,115,116,114,105,
-112,45,101,111,108,128,58,224,169,116,224,171,28,160,167,225,116,255,225,116,
-58,224,173,23,4,104,97,115,104,101,168,129,227,6,255,227,6,255,227,6,
-196,64,0,233,30,0,242,109,2,176,84,114,114,251,82,8,110,225,134,72,
-242,147,0,207,181,154,135,0,95,242,151,2,64,174,161,25,96,38,185,254,
-137,126,128,52,0,67,143,237,160,35,104,190,248,160,6,224,117,4,147,50,
-112,252,103,234,176,167,224,85,0,243,182,5,224,10,0,160,137,160,22,64,
-0,159,118,224,154,0,96,220,96,62,243,89,5,224,193,0,224,39,1,224,
-175,3,128,1,104,18,225,76,1,170,110,255,179,0,224,170,9,240,220,2,
-224,0,0,160,131,108,96,225,79,9,98,7,225,224,13,0,111,129,224,64,
-65,0,82,142,147,192,91,224,252,4,128,10,76,74,192,0,251,148,5,128,
-202,160,121,219,166,194,13,226,1,0,212,145,225,240,22,96,35,244,181,23,
-0,49,205,120,171,188,224,178,8,192,12,96,180,2,95,50,52,248,228,5,
-225,187,34,128,196,226,112,0,152,125,225,192,2,244,70,25,3,97,110,115,
-105,193,103,224,212,1,224,78,2,224,72,31,9,116,114,97,100,105,116,105,
-111,110,97,164,7,192,255,162,40,224,61,21,1,115,116,153,168,160,0,108,
-77,64,53,0,53,76,218,0,53,70,158,0,49,78,122,235,49,0,224,34,
-20,139,127,128,128,226,123,46,0,120,226,123,4,229,6,0,224,77,46,4,
-105,110,99,108,117,237,94,1,226,207,8,100,229,229,82,3,160,48,0,61,
-225,19,2,228,88,1,225,149,2,128,132,224,127,24,0,80,224,71,0,226,
-48,0,224,69,9,107,41,245,60,3,133,162,224,70,2,0,67,96,70,224,
-30,17,128,31,128,225,225,41,46,0,65,225,119,11,224,250,51,3,45,104,
-101,108,167,101,224,73,55,82,142,2,105,111,110,224,76,60,224,75,7,64,
-59,64,76,225,48,2,196,146,240,12,0,227,75,0,228,10,12,198,88,140,
-243,64,64,100,123,225,169,1,135,136,231,107,3,195,59,77,185,131,59,224,
-18,0,118,226,128,18,96,123,98,167,225,12,18,224,33,44,225,154,5,227,
-207,5,117,2,227,207,6,224,66,10,1,110,111,249,6,1,192,0,2,95,
-50,53,212,143,132,46,224,243,2,224,254,3,64,41,225,155,10,2,68,85,
-73,96,79,2,58,50,53,210,96,1,53,49,118,29,88,247,153,175,96,5,
-96,103,128,114,0,58,96,176,224,43,3,177,42,128,46,224,41,1,0,58,
-97,90,224,40,5,129,224,224,35,0,0,58,97,144,224,34,3,0,75,224,
-119,5,97,36,230,47,0,0,58,100,251,240,47,0,250,86,8,0,58,96,
-43,111,183,0,58,64,80,128,10,0,73,111,72,210,129,175,67,66,64,123,
-254,133,98,192,18,1,66,39,96,21,225,133,1,240,66,7,96,120,138,188,
-65,174,106,182,128,154,87,61,148,94,162,146,1,32,95,83,172,148,236,144,
-19,249,39,0,65,93,103,11,98,226,3,53,55,32,95,119,213,0,35,212,
-196,96,178,64,30,216,54,89,53,0,58,105,253,96,17,0,65,96,31,129,
-134,159,95,128,31,248,73,1,159,112,107,79,128,17,115,234,64,174,246,203,
-2,128,232,0,58,107,130,97,132,1,52,48,129,45,66,37,161,70,84,108,
-225,70,1,83,235,178,185,2,95,50,51,96,66,113,206,99,117,0,58,96,
-6,1,10,65,92,13,4,117,97,108,32,58,96,33,161,174,2,95,50,51,
-136,193,64,131,0,58,113,225,248,211,1,124,251,216,211,64,39,96,141,88,
-211,101,165,192,167,64,38,3,10,65,32,82,160,190,0,58,96,28,242,13,
-2,129,165,218,120,96,144,214,174,241,181,42,92,50,96,67,129,12,241,181,
-8,3,116,97,105,108,241,181,8,97,153,64,57,128,220,254,76,8,64,66,
-64,27,2,73,32,58,96,16,247,139,2,0,50,122,49,90,50,215,139,179,
-99,119,139,192,11,224,80,0,0,58,96,6,215,139,2,95,49,53,84,249,
-160,61,231,98,4,6,101,114,114,111,114,58,32,96,158,183,17,96,38,0,
-58,96,6,246,225,20,8,67,111,110,116,114,111,108,46,69,64,66,64,64,
-224,26,1,96,18,2,67,97,108,137,1,100,100,0,58,96,194,123,210,163,
-52,213,228,64,7,230,63,1,134,76,0,95,99,100,130,26,0,50,66,248,
-67,199,171,79,98,10,2,95,50,50,163,93,147,208,0,58,64,160,130,139,
-150,85,64,30,227,211,3,253,90,4,131,183,235,159,0,0,58,98,92,220,
-110,225,200,5,9,109,100,53,67,111,109,98,105,110,101,161,206,133,99,64,
-143,66,75,158,4,123,203,109,239,0,48,65,38,96,177,0,89,96,116,64,
-251,102,177,66,130,236,192,1,252,255,5,164,78,64,71,0,49,75,9,198,
-226,2,95,50,50,65,6,97,15,0,56,164,6,0,95,92,121,2,95,50,
-49,214,75,128,190,130,133,8,94,109,100,53,65,114,114,97,121,66,63,226,
-102,0,226,222,0,0,57,66,9,64,42,2,95,50,49,97,9,100,142,247,
-52,1,96,192,247,96,1,0,49,89,63,224,46,2,169,168,192,46,2,95,
-49,48,65,129,227,22,5,0,49,247,46,0,64,200,162,202,64,20,120,67,
-64,211,171,203,229,2,10,206,53,224,106,0,225,53,3,192,25,232,94,5,
-2,67,32,95,87,211,96,67,3,95,50,49,48,129,35,4,95,49,57,56,
-32,128,82,64,0,225,117,1,238,224,7,247,182,2,64,62,109,188,224,45,
-2,96,96,172,116,229,134,7,226,141,0,142,116,224,70,0,224,43,10,194,
-119,224,38,0,160,16,0,58,65,97,226,178,0,221,213,0,58,96,135,99,
-185,0,50,69,60,0,49,68,226,193,253,129,247,0,35,96,238,92,95,0,
-58,97,153,4,10,65,32,35,49,88,72,64,28,128,57,67,238,127,198,1,
-49,48,108,105,95,194,2,95,50,48,192,80,64,11,64,34,192,11,0,53,
-224,11,1,96,164,128,11,65,70,64,98,131,73,214,77,152,139,137,163,238,
-97,6,225,105,3,65,172,128,50,161,239,65,110,69,96,66,229,64,148,71,
-98,70,185,96,15,70,44,1,50,48,162,60,96,17,0,57,128,33,131,63,
-224,33,7,192,139,0,95,78,56,224,38,16,224,71,25,81,139,93,144,97,
-200,192,84,224,194,0,67,164,0,83,162,123,96,190,73,7,224,76,16,128,
-22,99,172,66,137,224,40,16,130,157,199,204,97,40,3,66,32,95,57,224,
-90,19,96,93,65,43,97,160,0,49,97,148,200,203,0,75,66,55,128,192,
-0,58,96,27,224,21,1,96,49,0,58,96,140,224,42,2,128,20,65,23,
-96,20,68,192,194,123,64,23,232,87,0,64,101,64,133,224,37,12,0,54,
-194,18,128,2,113,48,98,176,71,142,0,57,96,58,130,152,227,185,1,4,
-95,50,48,50,32,135,2,0,48,220,84,224,27,5,128,114,130,109,136,184,
-224,174,1,128,238,4,114,101,109,32,58,98,204,130,230,0,53,69,214,99,
-24,100,2,65,163,0,57,94,180,98,185,64,54,128,250,99,172,107,72,193,
-122,0,58,96,39,185,60,228,144,1,91,137,100,56,236,59,1,1,32,95,
-93,2,168,1,100,236,69,22,255,190,8,23,46,47,108,105,98,47,68,97,
-116,97,47,73,110,116,101,103,101,114,95,84,121,112,101,46,191,161,1,52,
-53,223,161,169,233,0,57,134,212,0,95,111,175,1,54,49,228,174,1,160,
-30,101,234,64,28,130,49,76,231,132,218,132,75,116,64,142,77,0,67,99,
-97,167,61,100,227,64,239,95,233,160,83,170,186,96,69,128,13,0,79,64,
-215,0,79,238,86,2,97,56,110,241,224,21,1,2,95,49,57,133,230,66,
-154,65,48,218,109,2,95,49,57,72,140,0,56,76,91,0,57,113,230,128,
-31,168,112,1,56,52,97,98,1,95,56,66,6,96,32,7,10,65,32,97,
-110,100,32,58,96,55,128,66,0,56,65,141,160,33,130,12,0,80,64,31,
-129,251,0,75,64,10,129,240,0,65,64,10,129,238,169,48,0,49,68,247,
-72,235,128,60,129,224,2,73,32,58,96,16,233,48,1,0,49,93,174,1,
-95,49,94,91,169,48,224,56,0,83,168,192,11,224,80,0,0,58,96,6,
-167,48,74,74,196,158,1,95,49,65,74,64,31,202,174,0,85,132,29,2,
-95,49,56,65,31,102,166,0,80,227,188,1,160,47,224,15,8,64,65,129,
-11,171,111,96,23,191,90,135,136,142,206,98,201,106,133,68,220,224,68,0,
-200,8,160,21,160,154,97,225,2,95,49,56,162,77,1,49,56,98,35,0,
-56,65,232,0,58,96,159,65,17,1,53,53,65,30,129,91,0,90,64,190,
-0,58,96,39,161,105,64,59,193,66,235,206,3,96,104,171,206,254,244,7,
-224,14,5,192,184,178,144,96,145,75,248,128,202,0,58,96,6,204,23,160,
-42,73,37,0,55,103,111,192,42,130,100,64,6,192,42,65,31,3,95,49,
-55,53,96,139,129,58,3,47,61,32,58,96,17,132,124,64,38,99,1,159,
-20,204,185,0,75,206,245,131,79,162,255,237,186,2,212,77,136,100,237,186,
-17,198,178,96,176,160,77,96,175,192,17,0,58,96,6,228,202,4,228,212,
-2,160,59,255,12,2,0,58,96,60,100,187,1,55,49,64,202,129,134,66,
-251,0,55,196,212,1,51,53,174,231,2,95,49,52,234,136,3,11,110,111,
-32,109,97,116,99,104,32,97,116,32,132,74,96,32,96,7,1,51,56,64,
-81,130,235,75,195,128,11,0,58,96,6,235,195,29,3,120,99,101,112,84,
-180,0,46,68,189,0,114,180,187,224,39,1,2,80,97,116,64,22,0,77,
-64,128,2,70,97,105,235,215,3,99,105,129,2,0,83,199,236,1,95,49,
-76,190,163,38,77,135,192,10,64,128,0,52,65,158,69,105,228,122,0,78,
-204,96,5,80,149,0,54,228,129,0,107,218,98,138,0,54,162,65,129,28,
-86,119,162,72,113,251,78,119,65,153,98,94,1,55,32,128,15,99,44,98,
-30,129,38,68,183,66,46,96,91,224,39,3,161,71,224,235,1,6,39,92,
-57,50,38,39,39,165,174,161,92,96,175,224,99,3,98,16,139,227,224,17,
-3,133,135,234,160,3,224,168,1,0,64,160,35,133,186,64,156,161,22,97,
-198,128,158,130,99,96,101,224,147,3,64,146,70,72,160,148,64,0,0,58,
-96,147,226,123,0,75,41,226,215,3,136,188,166,218,1,95,49,70,74,160,
-108,97,102,69,95,129,102,171,214,97,132,225,163,0,0,54,102,127,1,49,
-54,99,6,67,95,64,229,66,193,0,90,64,28,96,197,166,138,224,163,5,
-224,160,0,230,73,2,138,13,139,118,121,57,225,22,7,96,0,5,79,32,
-80,32,35,55,242,127,3,64,79,0,97,96,79,96,27,0,56,224,27,7,
-0,98,224,27,1,73,13,224,28,5,0,102,224,28,2,0,48,224,28,7,
-147,139,128,28,0,51,224,28,7,110,202,128,28,0,57,224,27,7,143,198,
-128,56,0,49,224,28,7,0,118,224,56,2,224,143,8,64,3,227,52,1,
-225,193,0,0,54,229,134,0,65,76,164,213,158,140,1,49,53,89,37,102,
-12,64,18,3,50,32,64,35,74,127,64,53,203,230,1,53,56,64,56,196,
-81,239,232,0,225,189,0,96,70,100,15,96,17,0,58,96,6,110,230,104,
-35,237,58,0,240,223,0,0,54,76,50,1,55,57,172,190,128,19,250,95,
-2,64,30,64,69,132,170,64,67,226,230,2,0,53,205,204,224,64,0,97,
-121,226,96,9,64,69,105,145,236,141,0,160,40,226,52,3,224,10,1,64,
-50,84,84,96,7,173,89,96,250,129,28,128,123,84,189,224,74,4,0,58,
-96,102,237,92,8,106,156,4,10,65,32,111,114,72,143,0,53,234,236,1,
-224,33,2,131,85,2,99,104,114,64,33,129,160,0,85,106,138,135,85,180,
-183,149,3,128,213,68,36,134,14,180,177,225,197,6,82,104,225,197,1,106,
-138,64,43,129,184,1,117,60,70,212,244,155,0,198,40,180,161,66,26,180,
-158,96,107,0,58,100,44,131,245,0,89,153,60,0,80,128,6,206,143,0,
-58,96,146,139,31,0,50,64,47,231,82,2,0,49,82,205,1,95,49,65,
-206,0,58,99,123,199,83,180,28,0,61,96,11,241,72,0,96,37,128,165,
-191,151,83,126,68,2,83,161,132,45,133,186,96,121,97,14,130,115,130,110,
-180,58,96,39,105,142,84,47,0,58,96,35,170,73,84,3,66,125,0,58,
-96,26,96,43,199,205,194,123,107,41,160,10,139,15,167,173,224,32,4,237,
-191,0,229,0,0,243,243,1,97,34,224,65,4,224,64,5,64,240,98,115,
-104,10,130,61,180,203,135,202,224,169,3,108,165,96,246,242,108,1,96,28,
-161,50,117,140,97,31,180,123,182,127,0,58,97,59,205,135,128,36,129,104,
-178,62,96,100,65,61,83,208,81,61,1,95,49,98,55,64,40,129,131,81,
-222,7,83,116,114,105,110,103,32,58,96,27,170,61,75,25,96,46,106,35,
-97,168,64,209,160,26,141,148,113,171,0,95,106,137,0,58,96,102,128,220,
-128,56,84,118,77,227,224,31,0,129,139,4,110,101,119,67,65,128,112,4,
-76,101,110,32,58,96,39,224,213,7,180,167,75,168,180,114,129,135,2,115,
-101,113,103,7,85,239,128,43,64,44,129,22,72,239,180,13,193,137,128,1,
-113,225,225,160,3,224,20,3,224,17,8,224,14,5,224,11,2,192,8,191,
-199,64,120,226,211,1,238,200,3,110,177,3,10,65,32,79,64,144,214,13,
-0,48,72,99,1,95,49,78,251,0,64,224,8,0,2,95,49,48,93,183,
-115,217,0,95,94,215,224,11,1,67,87,192,11,72,42,192,11,97,194,83,
-134,0,58,96,18,65,192,4,112,111,107,101,87,132,123,179,159,4,94,112,
-101,101,107,160,18,179,50,170,175,1,95,49,82,30,64,72,99,173,179,68,
-207,23,143,219,96,34,224,50,4,133,249,160,50,226,132,1,1,95,49,101,
-29,72,90,114,21,116,62,0,58,96,39,7,10,65,32,116,111,73,110,116,
-64,128,129,37,3,116,111,80,116,68,252,177,248,239,138,5,96,98,227,25,
-0,189,67,0,39,206,122,64,8,1,95,49,101,131,131,123,0,95,134,139,
-131,119,105,203,240,163,5,176,185,96,50,130,59,99,133,1,95,49,80,136,
-65,197,128,64,1,67,32,96,66,0,95,110,146,1,64,58,65,140,160,68,
-229,151,0,176,185,114,241,115,28,72,49,0,58,97,189,5,10,65,32,113,
-117,111,64,225,176,184,226,74,1,226,78,2,226,117,73,241,3,3,164,149,
-244,114,2,1,95,49,80,200,163,176,224,22,1,163,182,245,102,6,244,99,
-3,0,58,86,101,128,198,1,95,49,81,25,0,95,70,166,0,58,96,40,
-66,82,3,102,114,101,101,64,235,167,236,138,109,224,96,5,86,11,150,74,
-211,204,246,8,3,144,85,1,95,49,81,62,224,121,3,0,58,96,177,236,
-238,4,64,171,133,105,96,254,219,56,128,49,151,154,160,98,245,129,1,165,
-103,193,72,224,119,2,1,64,95,81,150,128,162,133,119,0,57,250,254,8,
-134,46,177,217,111,75,99,205,0,58,177,208,75,146,0,83,106,253,142,170,
-214,73,2,83,32,95,80,139,65,111,130,78,224,88,7,96,87,176,228,146,
-240,168,17,176,216,68,199,0,58,176,206,96,182,105,141,98,162,247,156,0,
-226,167,7,176,240,248,82,6,8,117,110,100,101,102,105,110,101,100,74,16,
-0,58,176,255,243,99,7,177,11,0,95,72,218,99,179,105,205,67,12,0,
-95,73,241,233,194,12,65,111,233,190,2,71,73,64,1,2,95,56,48,224,
-37,3,233,159,2,64,37,96,19,96,10,0,95,71,73,0,58,177,121,2,
-66,32,95,80,25,0,95,81,97,0,58,177,130,0,85,97,186,77,126,113,
-254,146,95,0,80,96,7,97,114,225,113,0,0,95,80,109,64,120,70,94,
-81,152,128,0,0,58,177,174,83,103,131,162,74,202,224,13,1,70,211,225,
-43,6,179,76,14,58,32,117,110,115,117,112,112,111,114,116,101,100,32,119,
-69,47,2,115,105,122,158,239,86,251,77,91,71,137,178,4,0,89,162,158,
-237,135,3,243,17,1,194,142,215,220,81,151,129,11,65,81,0,48,192,12,
-129,78,1,56,55,128,231,98,30,178,35,4,105,110,118,32,58,178,15,0,
-115,74,39,177,217,73,62,177,213,4,115,104,108,32,58,177,128,2,43,32,
-58,177,125,3,45,32,58,56,129,94,2,73,32,58,177,120,230,147,7,241,
-132,0,66,217,100,218,241,136,0,2,53,32,95,114,214,79,214,0,95,80,
-48,0,95,80,64,0,95,112,144,80,136,2,95,55,54,235,131,0,0,55,
-160,9,0,58,177,125,131,227,98,252,131,240,96,37,0,53,131,164,69,152,
-177,122,224,29,1,224,49,1,224,39,5,128,235,227,121,2,177,144,3,62,
-61,32,58,177,14,2,62,32,58,176,232,74,220,176,229,2,60,32,58,176,
-228,5,105,99,109,112,32,58,208,156,74,152,78,202,0,95,79,229,0,58,
-176,77,74,149,175,245,65,85,174,234,2,80,32,58,173,50,196,60,164,119,
-194,97,224,20,11,224,17,8,224,14,5,224,11,2,192,8,229,193,0,173,
-148,236,67,5,173,126,4,110,101,103,32,58,173,124,2,42,32,58,173,90,
-2,45,32,58,173,30,2,43,32,58,172,130,224,148,68,0,58,172,193,199,
-149,64,17,225,225,0,73,206,68,153,66,26,76,138,96,12,166,31,1,64,
-58,172,217,116,15,172,216,2,73,32,58,172,207,64,41,102,74,84,155,172,
-198,64,29,128,224,64,9,128,224,8,94,109,97,108,108,111,99,32,58,172,
-160,224,158,2,0,58,172,168,2,85,32,58,172,164,224,198,14,0,58,172,
-161,64,19,0,95,142,91,76,140,0,58,172,170,104,26,108,65,172,162,6,
-114,97,105,115,101,32,58,172,164,7,65,46,114,101,97,100,32,58,172,167,
-13,73,79,46,103,101,116,65,114,103,82,101,102,32,58,172,174,4,95,51,
-50,32,95,108,139,75,200,228,78,1,4,115,116,100,101,114,111,225,0,58,
-172,156,2,73,79,46,128,20,1,32,58,172,151,96,59,108,215,224,59,8,
-1,111,117,112,1,0,58,172,172,0,75,149,201,172,43,128,73,4,111,117,
-116,32,58,172,30,4,95,51,54,32,58,172,27,2,73,32,58,172,20,128,
-95,67,179,76,0,224,95,4,0,105,112,153,0,58,172,41,3,75,52,32,
-58,172,35,128,91,3,105,110,32,58,172,11,129,89,0,95,116,91,236,230,
-0,253,189,2,108,11,162,70,232,59,3,97,132,0,95,76,0,66,75,172,
-68,225,195,3,236,27,6,0,50,185,48,162,72,76,1,1,64,58,172,31,
-93,219,128,250,1,65,46,162,20,172,13,76,208,0,58,172,14,13,73,79,
-46,112,101,114,102,111,114,109,73,79,32,58,172,1,117,162,232,37,2,0,
-58,172,14,0,95,64,192,66,134,96,123,124,250,90,20,225,4,0,3,62,
-62,32,58,171,179,0,95,64,66,69,8,118,38,80,75,96,248,75,130,111,
-8,1,95,50,72,87,128,9,160,85,95,41,96,59,187,234,73,22,163,37,
-139,173,99,38,171,172,128,35,96,32,116,209,192,32,0,95,101,85,171,190,
-1,95,55,88,160,224,47,12,96,150,122,116,145,181,129,25,87,102,194,229,
-164,81,0,58,171,167,119,212,0,58,171,146,131,222,138,217,240,83,0,171,
-26,0,49,171,119,192,12,96,199,206,42,224,61,1,142,137,208,87,195,82,
-171,126,1,95,51,97,243,110,40,129,219,71,255,129,81,73,94,96,36,181,
-66,0,95,69,156,69,155,128,232,2,75,32,58,201,37,79,11,128,205,2,
-66,32,58,164,81,9,79,46,114,101,116,117,114,110,32,58,128,201,97,181,
-2,61,32,58,128,197,2,80,32,58,226,192,3,228,30,0,229,0,32,0,
-58,226,178,1,228,89,11,231,83,0,0,50,143,100,64,200,1,95,56,118,
-130,224,0,255,224,0,255,224,0,255,224,0,31,1,32,125,
-};
-unsigned char *combexpr = data;
-int combexprlen = 34276;
+122,76,90,49,117,168,0,0,31,118,55,46,50,10,57,51,57,10,65,32,
+95,48,32,95,50,52,32,64,95,50,53,32,95,51,53,32,64,95,51,55,
+32,1,64,64,224,22,4,1,52,48,224,22,13,0,50,224,22,0,1,49,
+49,160,23,7,51,54,50,32,64,67,39,32,224,17,0,5,64,66,32,95,
+49,50,160,11,7,83,32,83,32,95,51,54,54,64,4,0,56,96,45,31,
+57,32,95,51,55,49,32,73,32,64,64,102,114,111,109,85,84,70,56,32,
+34,45,45,99,112,112,34,32,64,64,64,64,64,24,3,95,51,56,54,64,
+12,64,73,224,103,0,1,56,56,64,79,3,39,32,83,39,224,194,0,10,
+64,64,67,39,66,32,66,32,95,51,57,64,17,0,50,96,58,224,108,26,
+6,118,101,114,115,105,111,110,128,112,96,188,192,80,0,66,64,228,7,53,
+32,64,67,32,95,50,51,64,67,64,5,7,79,32,35,51,50,32,64,75,
+64,94,1,52,50,96,153,9,64,95,52,51,50,32,95,52,51,51,96,13,
+224,150,61,2,104,101,108,161,4,224,147,12,0,66,128,147,224,49,1,6,
+85,115,97,103,101,58,32,96,50,224,176,4,224,34,1,21,32,91,102,105,
+108,101,32,46,46,46,93,32,91,32,45,68,115,121,109,32,92,124,128,8,
+3,61,118,97,108,96,12,12,73,112,97,116,104,32,93,42,32,32,91,45,
+79,64,47,2,93,94,42,64,84,224,75,6,15,94,41,94,41,91,45,45,
+110,111,109,97,99,114,111,93,32,96,11,3,108,105,110,101,96,10,64,8,
+5,112,114,97,103,109,97,96,14,224,10,2,3,116,101,120,116,224,81,20,
+4,115,116,114,105,112,96,42,96,9,3,45,101,111,108,96,13,5,104,97,
+115,104,101,115,128,93,4,97,121,111,117,116,96,10,3,117,110,108,105,192,
+79,224,74,6,0,32,98,71,3,32,115,116,100,64,7,8,45,111,112,116,
+105,111,110,115,32,96,54,7,105,110,99,108,117,100,101,61,64,223,4,110,
+97,109,101,93,161,105,225,203,8,7,66,32,67,32,67,39,32,83,98,213,
+128,8,160,9,160,12,96,13,224,29,0,0,39,97,161,0,66,64,11,224,
+8,5,0,39,65,177,0,66,226,20,2,0,66,98,35,226,19,2,1,52,
+51,64,23,128,71,224,38,3,193,240,128,10,225,243,6,6,110,107,110,111,
+119,110,32,128,219,129,251,64,178,0,39,193,255,0,52,67,210,226,43,9,
+10,44,32,102,111,114,32,118,97,108,105,100,160,59,4,115,32,116,114,121,
+226,60,5,226,55,2,130,141,129,101,225,36,4,3,54,32,35,49,225,57,
+0,96,121,96,235,224,232,2,64,139,224,229,1,100,26,4,56,50,32,95,
+55,67,191,4,95,57,57,32,64,96,64,228,88,0,64,234,224,120,1,18,
+65,116,32,109,111,115,116,32,111,110,101,32,111,117,116,112,117,116,32,98,
+193,20,40,45,79,41,32,99,97,110,32,98,101,32,115,112,101,99,105,102,
+105,101,100,96,156,224,152,2,64,111,128,0,131,144,0,67,161,67,0,83,
+64,31,68,182,129,108,0,66,161,153,1,51,57,196,178,4,64,95,57,49,
+48,98,159,6,56,53,32,95,50,48,57,96,72,129,231,128,26,2,95,51,
+51,160,246,2,95,57,49,96,191,1,57,49,97,196,1,57,49,66,54,2,
+95,57,49,160,71,128,103,128,0,1,58,57,65,85,3,10,65,32,89,66,
+23,1,32,66,96,142,130,93,98,29,64,5,226,64,0,3,66,32,95,53,
+128,68,64,185,128,188,224,9,11,160,65,66,102,10,66,32,95,56,54,54,
+32,64,95,54,57,64,56,160,6,1,64,66,96,111,1,80,32,68,176,192,
+119,161,16,64,251,128,65,2,32,61,61,65,137,128,212,64,125,0,85,160,
+25,2,95,49,50,131,8,96,236,224,82,42,129,133,224,82,68,195,153,224,
+82,22,2,95,57,50,129,185,160,72,160,2,224,60,0,98,11,129,124,128,
+20,224,21,0,64,1,194,27,64,92,1,52,52,64,4,4,55,32,64,35,
+52,67,78,160,0,224,85,3,64,162,224,85,4,65,155,224,81,4,0,67,
+160,121,224,19,4,224,99,12,0,55,160,181,198,57,0,39,64,2,100,71,
+226,176,3,164,80,64,103,0,80,96,26,225,4,4,224,97,1,98,239,1,
+57,51,66,23,0,53,161,57,224,87,9,192,140,128,11,2,67,39,32,64,
+82,225,86,6,224,52,2,96,237,224,51,3,160,26,96,53,67,225,64,54,
+129,207,2,95,49,54,65,140,129,120,96,48,162,236,1,32,64,225,87,4,
+131,39,193,38,225,126,16,128,38,98,30,96,101,192,17,128,130,224,175,5,
+96,40,192,129,160,135,160,6,0,58,99,152,3,10,65,32,83,96,145,96,
+153,65,37,67,245,0,83,128,131,194,121,225,255,11,0,83,64,233,128,251,
+226,66,0,224,37,3,71,216,196,48,130,13,224,32,6,0,56,96,70,225,
+254,14,96,194,69,178,68,120,0,66,64,150,6,49,32,64,95,56,54,56,
+160,33,229,30,1,2,47,92,92,229,145,1,64,46,1,95,57,72,154,96,
+62,98,148,164,188,65,170,1,95,57,102,209,97,169,64,190,0,85,99,106,
+0,64,64,235,133,14,2,95,51,54,67,254,4,79,32,35,52,57,136,222,
+5,64,64,64,85,32,65,64,8,3,95,52,53,48,99,102,224,166,0,1,
+64,35,96,45,128,0,65,50,2,95,51,55,192,160,232,211,17,199,118,128,
+181,165,69,224,234,4,105,220,3,55,55,32,35,101,129,96,0,64,68,5,
+67,32,95,55,54,55,169,51,69,87,65,64,0,58,98,214,5,10,65,32,
+79,32,80,230,52,2,232,148,0,104,99,1,57,49,64,49,224,33,9,72,
+161,160,32,65,34,224,32,7,232,192,1,128,36,0,50,64,142,224,36,7,
+224,32,4,129,60,224,32,5,72,236,160,30,66,118,224,30,7,104,224,160,
+31,65,156,224,31,12,73,0,160,35,65,219,224,35,7,137,22,160,32,65,
+21,224,201,8,105,44,160,32,74,174,224,32,7,105,66,160,31,65,217,225,
+43,9,2,119,97,114,107,30,2,95,57,50,65,76,162,27,128,0,0,58,
+97,139,1,10,65,98,85,133,155,1,85,32,64,21,0,52,224,21,2,65,
+27,128,21,0,51,96,21,64,19,1,52,32,65,217,0,58,98,177,224,40,
+0,64,225,128,40,0,49,160,40,1,95,49,130,142,1,95,49,96,123,0,
+58,99,164,99,185,224,1,8,4,39,32,95,57,49,139,26,2,51,55,50,
+98,135,0,54,64,18,66,146,130,6,224,26,14,133,112,224,27,12,97,247,
+203,177,192,19,98,249,224,18,5,99,118,64,129,1,49,53,139,213,224,27,
+6,224,17,5,198,193,224,112,11,102,187,224,19,6,100,46,224,18,5,108,
+120,224,18,5,101,10,224,84,13,96,252,0,58,103,16,161,126,0,48,161,
+126,64,26,128,18,0,57,192,17,133,26,3,80,32,35,56,192,17,131,102,
+3,80,32,35,55,192,17,129,243,2,80,32,35,193,198,64,183,128,17,0,
+53,192,17,225,235,0,0,54,192,17,129,234,3,80,32,35,51,192,17,193,
+230,73,173,128,17,129,222,64,162,160,17,65,158,128,17,192,179,65,203,78,
+187,1,54,54,136,41,198,93,165,138,2,67,32,60,69,71,161,145,224,25,
+9,136,230,224,26,13,97,153,135,191,230,173,0,160,26,168,167,0,85,69,
+59,69,70,232,144,1,134,89,66,167,1,64,85,194,168,129,224,0,85,64,
+61,103,176,224,49,5,106,37,128,49,128,37,133,90,132,222,128,0,224,132,
+13,98,103,224,87,17,98,106,224,87,20,224,59,17,65,21,224,59,10,2,
+57,49,54,67,134,206,173,224,160,1,225,67,15,96,64,224,189,13,99,76,
+225,66,12,107,111,225,66,15,224,44,6,64,36,224,43,11,224,116,13,163,
+247,224,70,9,102,73,224,114,30,144,229,224,114,10,225,3,14,194,70,224,
+25,9,136,64,224,168,11,176,228,224,124,9,64,24,224,168,31,64,94,225,
+27,33,226,210,16,226,209,20,224,43,6,226,203,2,225,27,6,192,115,227,
+98,5,225,0,16,226,219,1,224,97,6,226,213,2,224,141,24,226,197,2,
+224,141,5,224,44,11,226,117,15,101,90,82,227,101,63,68,113,133,19,76,
+165,209,206,77,106,64,74,172,157,96,20,128,216,206,82,96,8,205,205,1,
+49,53,162,252,99,85,201,126,224,16,3,105,105,224,122,0,96,117,0,54,
+160,117,224,1,9,172,95,160,66,224,29,18,224,26,17,224,23,14,224,20,
+11,224,17,8,224,14,5,224,11,2,192,8,108,147,128,0,0,58,103,148,
+101,193,5,75,32,95,51,51,57,232,93,2,31,92,34,47,118,97,114,47,
+102,111,108,100,101,114,115,47,122,50,47,56,52,112,116,102,51,98,120,55,
+104,53,52,48,112,23,107,110,99,121,48,121,50,120,112,99,48,48,48,48,
+103,110,47,84,47,109,104,115,105,110,64,13,15,48,48,57,57,57,53,46,
+104,115,92,34,44,56,48,58,49,138,84,134,32,134,140,65,100,0,75,139,
+239,69,113,136,79,106,116,0,90,203,26,0,58,111,184,96,43,0,90,224,
+43,0,134,148,240,29,3,103,217,208,31,193,170,129,243,143,125,224,29,1,
+172,138,2,57,48,50,225,229,1,66,112,98,231,241,218,2,3,95,57,48,
+51,79,172,0,55,80,175,136,101,76,131,0,48,162,131,0,80,233,133,4,
+3,115,116,100,105,169,130,96,182,108,129,2,95,54,57,99,76,0,58,112,
+147,103,16,81,104,73,143,0,58,96,38,96,196,65,143,2,95,57,48,78,
+0,1,57,48,66,205,131,115,1,95,54,108,132,64,193,245,86,1,2,54,
+56,54,242,93,3,14,84,70,45,56,47,47,82,79,85,78,68,84,82,73,
+80,129,96,236,209,0,242,164,1,86,14,96,189,0,52,168,217,1,95,54,
+108,197,0,58,96,205,1,10,65,65,134,0,50,96,148,131,70,161,50,1,
+57,48,100,173,1,54,55,72,163,96,49,0,58,96,167,226,242,0,2,95,
+57,48,96,95,97,104,110,121,0,95,96,15,128,127,160,199,193,115,192,15,
+128,215,134,226,239,49,3,0,95,96,155,0,95,143,192,0,58,96,123,97,
+246,98,48,64,103,65,64,64,192,97,141,0,58,97,157,74,103,96,85,225,
+225,6,3,95,56,54,57,104,118,2,95,57,48,141,156,65,61,0,56,86,
+252,64,57,130,81,228,10,3,226,63,4,97,42,0,56,118,193,227,72,0,
+247,36,1,192,223,239,230,0,161,194,1,56,54,82,120,100,143,1,95,56,
+83,56,96,39,135,199,96,223,137,246,1,56,53,138,138,197,90,234,147,1,
+1,56,56,65,103,0,56,119,76,84,84,150,32,82,226,1,55,52,202,144,
+5,66,32,95,55,50,50,64,214,98,145,203,86,1,56,52,66,62,96,58,
+128,70,2,64,95,56,110,5,2,95,56,52,229,51,0,0,58,97,11,65,
+222,1,32,80,67,33,77,183,0,75,87,46,66,157,99,7,0,58,96,86,
+162,149,69,66,160,133,64,142,1,54,32,128,139,1,56,56,96,218,65,112,
+0,54,70,24,64,249,66,230,133,171,1,56,57,102,11,1,56,57,143,246,
+6,95,56,57,56,32,64,58,97,14,96,120,147,90,227,108,0,0,79,67,
+130,0,95,143,243,131,137,161,206,162,249,239,187,10,177,35,224,39,25,163,
+178,130,154,64,40,99,246,65,33,208,133,198,21,128,16,224,136,0,3,64,
+64,82,32,129,199,224,103,0,0,83,160,103,178,36,228,86,0,240,28,8,
+207,21,224,90,27,224,35,27,70,254,0,55,97,65,204,6,128,37,226,62,
+1,98,65,98,101,241,192,20,97,151,128,115,65,12,192,181,138,47,228,82,
+1,10,98,101,103,105,110,123,99,111,100,101,125,132,77,160,158,161,216,242,
+51,4,64,99,224,133,1,164,117,225,17,8,224,120,9,240,136,25,2,101,
+110,100,224,131,3,224,133,7,226,94,0,197,226,129,65,2,95,56,57,129,
+215,128,0,164,132,226,33,17,100,13,192,153,224,184,9,112,194,160,30,128,
+96,210,140,2,95,52,53,66,250,96,81,68,196,69,88,4,52,50,32,95,
+51,72,15,224,147,0,0,56,84,229,6,95,53,49,54,32,95,54,91,138,
+81,165,163,140,2,95,56,57,142,49,192,200,224,100,2,96,57,64,205,115,
+62,178,46,224,241,1,246,143,0,128,114,1,52,53,129,137,193,30,106,138,
+160,44,225,52,14,0,58,96,8,69,244,0,50,133,245,96,53,3,10,65,
+32,90,160,1,85,180,96,38,208,55,0,90,64,149,224,4,1,96,6,168,
+64,0,58,96,229,224,37,11,0,90,66,210,160,34,133,169,2,75,32,75,
+70,66,96,142,201,171,193,152,201,164,226,188,7,69,198,100,89,64,30,0,
+82,160,47,212,92,71,233,248,222,0,128,59,129,244,99,164,166,114,224,2,
+0,128,20,224,21,14,163,230,224,2,0,224,43,0,224,15,2,134,8,162,
+72,64,3,230,30,2,129,19,224,16,2,246,78,0,130,13,224,154,11,234,
+133,0,192,83,228,89,2,96,96,0,80,101,150,67,26,128,24,1,95,51,
+70,98,180,183,128,5,3,95,56,57,48,244,113,3,6,112,114,111,103,114,
+97,109,99,55,224,21,1,5,99,111,109,109,101,110,114,67,128,75,165,21,
+71,176,229,12,3,165,38,163,167,101,214,192,49,224,228,3,160,225,245,208,
+3,103,205,72,199,0,56,84,36,84,126,224,59,0,224,47,0,160,251,161,
+14,161,11,224,255,4,133,209,224,249,4,96,253,224,176,41,224,177,53,192,
+60,225,196,46,162,89,128,157,96,30,67,44,227,61,0,225,198,26,225,176,
+3,225,220,13,181,119,225,203,103,68,48,103,169,128,213,198,178,161,29,227,
+152,1,224,68,19,0,58,96,140,104,14,161,51,96,60,160,5,230,151,2,
+236,134,3,1,92,34,160,246,230,115,0,128,46,97,114,128,196,253,67,6,
+4,76,105,110,101,32,160,52,193,35,221,118,2,49,51,53,69,174,135,110,
+224,59,10,191,166,136,50,96,50,224,34,8,0,32,86,129,5,32,98,101,
+102,111,114,160,102,253,151,10,64,35,0,46,253,150,2,192,170,97,123,224,
+10,8,224,99,8,1,73,110,157,78,192,63,225,234,2,96,105,224,249,14,
+2,32,97,116,128,157,224,253,136,96,0,225,173,161,0,58,99,150,98,169,
+64,1,0,80,72,166,66,252,195,0,167,163,103,203,224,15,2,103,179,132,
+50,224,193,10,231,216,4,224,14,0,112,80,107,91,173,93,75,112,2,55,
+32,95,126,205,115,224,99,106,78,216,64,25,0,54,90,232,2,95,56,55,
+217,132,131,19,74,221,103,61,172,21,0,56,105,21,0,56,108,251,109,117,
+204,14,68,17,0,53,235,199,3,236,72,31,96,173,0,80,64,61,127,101,
+233,190,3,216,117,0,58,109,57,239,221,1,175,182,96,24,136,120,0,85,
+128,22,224,24,3,0,54,224,24,1,64,2,97,28,0,58,96,179,128,22,
+0,51,168,155,160,49,64,27,200,119,64,1,0,89,193,129,64,1,134,63,
+237,178,3,140,105,157,95,249,28,0,133,36,197,183,232,32,7,160,21,96,
+18,192,88,140,182,224,35,7,224,41,3,224,43,1,96,136,235,100,3,226,
+103,1,7,95,95,70,73,76,69,95,95,227,23,2,224,79,54,2,76,73,
+78,224,79,20,166,13,224,79,32,2,68,65,84,224,79,68,2,84,73,77,
+224,79,5,96,45,192,77,254,173,0,105,247,98,192,236,209,1,92,88,0,
+53,203,36,143,103,0,55,230,142,1,128,151,224,2,7,192,30,225,79,3,
+224,106,2,224,181,7,224,49,2,224,151,15,224,85,0,224,14,3,206,199,
+196,17,224,30,0,229,210,0,224,173,6,224,118,2,234,45,6,224,18,2,
+128,56,64,200,240,96,0,64,3,224,24,3,229,253,0,231,253,1,99,184,
+149,32,192,5,152,40,225,34,1,0,79,128,149,64,48,72,142,192,189,3,
+95,55,52,52,64,168,2,50,48,49,172,249,238,197,0,104,96,252,76,2,
+224,173,3,224,175,1,224,22,65,225,172,13,160,25,97,15,97,80,205,182,
+225,95,7,224,89,5,118,78,160,0,226,190,3,128,85,192,35,96,85,224,
+59,4,226,219,12,226,246,0,129,65,161,45,76,156,1,64,95,113,234,83,
+11,0,57,65,76,0,54,142,53,192,62,224,115,1,161,202,224,115,0,128,
+88,242,116,3,96,15,1,55,56,242,103,0,230,3,7,229,244,8,224,101,
+0,226,46,6,226,52,3,224,233,2,226,54,1,234,53,5,226,58,16,227,
+94,4,98,62,224,56,1,109,254,129,43,1,95,55,128,145,226,41,6,226,
+252,7,119,56,246,92,76,5,49,53,50,58,50,50,196,94,225,88,6,2,
+95,54,53,224,9,0,230,18,2,2,95,56,55,79,26,1,55,52,234,102,
+5,7,37,72,58,37,77,58,37,83,202,110,2,95,56,55,225,50,0,226,
+111,13,224,104,47,6,100,32,37,98,32,37,89,224,104,31,65,190,96,18,
+64,113,232,77,1,2,95,56,55,161,171,224,38,14,2,49,52,51,64,43,
+96,36,2,95,56,56,226,58,0,224,101,8,227,126,2,97,219,96,219,64,
+30,244,32,3,232,105,0,160,2,96,19,226,37,3,231,70,7,160,2,224,
+39,12,226,160,0,224,120,9,224,124,15,224,181,8,224,141,3,131,201,234,
+60,0,224,194,17,224,97,36,172,242,76,194,104,124,137,215,160,231,128,10,
+224,75,0,64,142,2,95,50,52,129,126,204,249,2,95,49,55,93,165,64,
+9,2,51,52,49,208,176,2,95,56,56,64,8,244,48,2,103,63,1,56,
+56,138,60,193,48,1,95,56,95,111,129,26,1,95,55,86,38,144,14,64,
+0,0,58,105,223,105,3,246,254,4,1,95,52,68,39,128,253,246,181,1,
+243,37,0,105,5,96,61,145,135,202,219,5,75,32,95,55,54,51,227,158,
+2,75,14,6,98,114,101,97,107,115,44,76,81,227,173,63,3,50,53,58,
+54,130,243,224,113,105,107,63,0,75,154,30,1,75,50,96,7,0,58,97,
+136,202,101,64,14,139,242,106,189,65,140,0,58,99,98,88,124,227,233,0,
+1,56,55,124,91,225,93,1,97,255,0,55,148,65,0,50,73,1,97,129,
+2,35,49,48,151,166,64,67,139,19,2,73,32,58,96,40,64,78,2,56,
+55,53,64,13,0,54,96,13,3,94,71,69,84,73,38,3,77,73,76,76,
+96,36,138,250,112,43,225,32,1,16,100,101,102,97,117,108,116,84,105,109,
+101,76,111,99,97,108,101,64,214,0,58,100,92,147,208,229,229,0,228,36,
+3,66,226,91,226,98,227,0,58,68,143,161,247,98,196,131,66,172,7,195,
+28,219,135,227,182,4,224,30,1,128,16,91,62,84,246,160,40,227,88,1,
+120,21,234,10,1,2,79,32,35,89,178,96,126,224,45,2,224,120,6,224,
+100,1,224,9,8,0,39,235,224,5,171,239,64,16,228,74,0,231,217,6,
+164,95,240,88,3,244,85,13,224,182,3,241,240,2,228,172,10,232,21,12,
+161,8,158,188,140,182,160,61,172,83,224,8,2,234,101,4,224,69,2,225,
+42,7,0,49,236,164,2,224,157,5,132,122,246,168,1,224,50,0,0,52,
+224,50,5,224,185,2,187,100,167,179,64,244,248,102,0,229,9,3,157,108,
+225,253,1,160,10,1,95,54,85,222,128,0,160,96,224,186,3,226,37,2,
+225,50,9,160,2,224,29,1,165,151,230,61,6,224,220,0,97,164,224,17,
+3,242,160,3,96,246,161,241,97,221,161,252,178,110,1,95,56,124,225,128,
+0,225,115,3,224,2,0,225,124,31,230,10,2,192,45,224,73,13,224,67,
+1,225,141,8,225,192,4,192,175,100,26,147,96,161,42,244,58,1,243,46,
+1,2,49,57,49,243,47,5,224,54,3,224,53,16,243,100,7,224,52,3,
+127,210,193,163,155,164,130,0,160,6,134,79,224,37,2,64,16,64,97,160,
+66,226,4,2,89,253,80,40,0,73,166,133,226,214,1,227,11,15,226,177,
+3,248,175,2,128,113,64,5,1,58,56,75,206,230,195,42,96,15,0,58,
+103,116,69,38,93,20,102,194,128,212,0,67,74,174,196,238,133,207,132,43,
+149,112,96,2,235,122,3,238,112,3,133,20,161,245,94,52,158,64,64,207,
+2,95,56,54,130,109,212,245,235,84,1,128,233,2,83,32,85,66,7,241,
+21,8,98,204,160,4,229,162,1,64,180,178,34,251,9,15,8,35,105,110,
+99,108,117,100,101,32,202,39,210,182,224,48,15,1,92,34,242,192,2,243,
+6,8,0,35,115,6,0,49,192,77,224,138,1,0,54,66,62,224,69,14,
+64,239,131,93,255,4,3,0,83,64,125,4,57,32,95,56,54,123,200,0,
+51,66,89,64,111,126,35,0,54,251,225,23,2,92,92,47,160,95,161,83,
+1,64,58,127,178,242,252,2,162,117,161,172,146,217,95,22,0,53,130,24,
+76,120,1,51,54,102,57,160,42,0,58,64,118,135,52,5,56,48,32,75,
+32,85,228,69,0,227,169,1,129,21,224,11,0,1,95,56,128,65,128,127,
+135,151,192,44,192,46,224,61,17,192,8,219,10,64,75,242,197,0,128,144,
+242,192,0,0,52,168,108,66,57,200,108,168,94,64,255,128,18,0,50,104,
+130,64,18,227,20,2,165,68,128,9,132,130,135,48,229,112,2,225,40,1,
+196,160,194,238,160,164,1,95,56,92,178,243,248,3,99,194,3,95,52,52,
+48,247,196,0,225,105,2,98,254,67,204,1,95,56,88,171,227,119,0,0,
+55,72,187,190,147,64,13,128,135,1,95,56,78,48,0,58,99,41,201,57,
+147,199,193,24,181,69,0,39,66,231,156,227,0,54,170,218,98,131,116,109,
+1,53,49,72,80,67,71,162,147,64,5,0,79,149,41,229,78,0,1,95,
+56,75,3,0,58,96,195,105,67,1,53,55,82,32,230,214,0,0,58,96,
+31,248,91,3,231,241,2,68,223,129,31,134,133,131,241,1,95,56,96,205,
+97,25,253,141,3,128,13,229,145,2,96,35,2,55,57,48,233,222,0,135,
+238,1,95,56,93,246,0,58,96,46,226,62,2,136,162,225,162,1,225,171,
+4,230,63,4,232,189,1,225,118,0,64,184,228,130,0,102,61,201,170,1,
+95,51,69,48,2,95,52,51,96,179,3,39,32,95,48,234,130,1,0,52,
+74,122,126,106,227,248,8,31,85,110,109,97,116,99,104,101,100,32,35,105,
+102,58,32,112,111,115,105,116,105,111,110,115,32,111,102,32,111,112,101,110,
+12,32,99,111,110,116,101,120,116,32,97,114,101,58,163,251,64,81,129,136,
+67,211,106,79,1,52,51,206,109,228,10,0,232,78,1,133,242,98,193,224,
+225,6,211,209,0,85,229,204,1,232,133,3,224,42,5,242,43,25,231,141,
+4,238,112,0,224,40,1,161,55,200,79,224,25,3,241,240,0,224,69,9,
+224,72,0,224,184,7,96,75,224,146,13,163,160,167,187,66,104,100,245,184,
+18,192,0,226,4,10,160,53,224,31,20,226,42,0,130,181,224,171,2,163,
+231,224,36,6,224,71,16,160,43,224,146,2,224,41,15,224,50,1,224,191,
+26,224,45,2,224,93,5,192,175,224,31,4,224,2,12,224,52,4,224,191,
+23,224,56,17,99,30,224,42,2,224,5,6,225,61,7,224,60,6,225,211,
+8,224,1,5,246,213,14,4,100,101,102,105,110,109,127,224,0,7,224,177,
+6,224,140,3,224,14,9,224,140,61,4,117,110,100,101,102,224,139,26,225,
+79,6,225,45,7,224,139,60,1,105,102,224,140,132,224,139,14,227,75,3,
+224,139,12,192,11,227,165,0,128,0,224,131,19,224,178,7,224,43,19,224,
+175,16,224,172,10,225,55,6,226,65,6,224,198,4,224,129,57,2,101,108,
+115,226,213,11,224,131,102,225,7,12,225,179,6,224,131,86,1,110,100,225,
+140,121,5,112,114,97,103,109,97,224,133,10,199,81,0,66,119,194,192,13,
+96,98,250,185,4,141,143,224,22,3,192,134,103,28,224,11,10,239,150,9,
+128,125,192,16,250,187,8,128,233,230,255,6,232,4,4,65,8,238,9,2,
+84,202,184,98,106,127,224,212,0,160,0,231,152,3,249,157,5,225,108,6,
+227,156,4,224,159,1,224,1,1,225,135,11,224,39,11,64,1,227,144,15,
+141,127,225,130,8,230,86,6,228,48,12,224,100,9,224,144,10,224,36,9,
+64,1,224,141,14,6,119,97,114,110,105,110,103,224,141,7,226,117,4,226,
+132,6,224,113,54,4,101,114,114,111,114,224,111,10,224,2,9,224,247,0,
+224,87,6,224,149,0,224,68,2,224,128,11,128,34,224,132,12,78,181,224,
+131,6,224,61,7,207,193,78,22,112,105,0,51,75,149,224,0,1,227,46,
+1,192,171,128,115,192,9,227,41,1,224,8,4,64,189,204,46,138,82,1,
+95,49,108,109,1,52,52,77,15,0,52,83,121,64,46,113,229,80,227,151,
+240,128,20,75,64,0,52,109,78,157,115,1,95,52,172,96,224,27,3,142,
+60,224,211,6,225,181,6,225,202,2,227,218,1,224,38,8,224,19,10,224,
+16,7,224,13,0,108,223,238,69,1,209,22,107,243,77,173,2,95,53,49,
+79,130,108,76,160,0,227,171,3,226,0,34,235,132,9,64,1,235,79,14,
+0,83,64,71,225,97,0,225,197,0,0,66,236,246,5,192,0,225,211,12,
+253,0,1,128,251,237,32,0,193,166,64,76,77,196,0,50,113,209,0,54,
+65,177,193,144,237,63,0,128,15,237,66,5,0,87,131,123,20,58,32,117,
+110,107,110,111,119,110,32,100,105,114,101,99,116,105,118,101,32,35,130,156,
+98,2,146,14,224,61,8,4,94,42,105,110,32,96,38,237,73,7,224,203,
+7,165,209,97,234,128,150,226,39,4,226,11,9,129,201,1,95,54,98,139,
+225,165,6,226,243,255,128,2,226,243,4,128,31,160,45,226,245,11,116,199,
+1,95,51,80,213,160,0,225,92,3,96,206,89,157,96,97,225,247,44,230,
+208,2,160,226,130,159,65,117,128,5,194,158,128,166,231,70,26,96,31,226,
+62,3,163,8,227,5,1,96,13,226,233,4,226,180,46,224,146,31,64,0,
+231,178,7,161,204,232,131,16,245,158,6,226,13,1,226,186,0,129,220,224,
+131,1,96,50,1,54,57,145,21,3,66,32,95,55,90,229,2,95,52,52,
+191,84,225,72,0,224,98,0,0,85,161,87,192,86,228,58,3,119,87,224,
+193,1,128,145,64,5,147,6,245,86,16,225,42,2,255,119,3,224,67,1,
+210,218,179,57,224,80,2,115,89,163,195,224,0,0,224,222,1,160,9,161,
+98,0,50,96,213,224,160,3,130,205,194,80,128,16,229,46,0,224,70,15,
+129,169,99,149,66,252,226,233,1,242,87,44,107,48,93,182,226,48,10,241,
+246,11,224,149,21,3,95,55,55,56,127,43,192,237,224,49,35,128,16,160,
+201,230,26,7,226,69,4,226,101,3,194,9,1,95,56,88,93,226,59,1,
+193,93,193,195,83,167,224,119,2,160,34,101,40,130,135,224,41,15,64,21,
+66,118,84,106,93,143,224,59,43,96,180,103,12,224,70,6,192,55,99,23,
+161,33,128,13,194,27,116,80,160,54,129,49,226,72,10,192,55,229,32,0,
+64,0,227,35,2,224,28,8,224,15,5,224,64,3,64,26,224,33,5,69,
+129,117,244,160,161,102,234,149,249,129,102,213,251,128,230,246,0,8,122,139,
+0,50,64,19,65,20,64,19,166,119,96,0,224,206,8,76,187,131,3,2,
+95,51,56,117,204,249,154,10,134,229,70,145,96,115,226,68,7,251,5,0,
+195,38,192,17,224,94,5,99,58,247,72,0,224,119,27,224,61,17,193,43,
+162,19,128,223,202,223,96,20,229,5,2,162,52,192,15,162,58,224,14,1,
+137,104,192,53,96,32,134,177,192,101,97,85,135,223,1,56,53,232,251,1,
+1,56,53,128,246,70,28,92,208,162,141,224,200,10,192,49,231,246,5,0,
+56,251,232,0,224,139,1,165,180,224,171,2,224,170,0,226,63,1,160,9,
+96,8,167,175,119,154,226,232,3,252,240,0,3,95,49,55,52,160,9,2,
+51,52,49,97,184,160,32,0,57,69,101,1,52,52,253,156,0,110,151,2,
+64,35,49,230,148,0,225,127,1,222,254,195,241,221,9,1,95,52,168,45,
+237,79,10,76,171,1,95,51,102,110,160,78,226,207,0,231,126,12,232,247,
+6,225,0,5,192,83,230,220,14,164,234,232,188,0,226,224,1,230,47,1,
+225,98,2,225,234,1,64,124,203,126,235,178,4,139,169,224,49,4,225,129,
+0,224,77,5,160,31,247,2,4,224,30,6,224,114,1,247,3,41,224,156,
+5,229,166,7,224,2,1,247,202,10,226,76,0,224,90,10,138,193,224,90,
+0,239,165,9,224,32,3,224,206,8,204,132,0,56,224,209,1,110,143,244,
+227,13,224,43,26,96,39,224,30,17,244,161,9,227,236,2,237,93,7,224,
+166,2,224,195,1,224,189,5,224,105,15,243,85,6,225,21,6,224,78,42,
+244,40,4,224,173,5,224,77,1,224,74,1,0,67,224,74,17,243,107,5,
+128,46,99,44,0,95,69,143,128,19,226,50,1,96,151,96,13,232,232,6,
+224,57,3,124,0,128,34,66,61,192,122,92,8,156,9,230,213,2,128,101,
+64,34,251,236,0,128,34,201,19,233,35,115,192,207,113,30,225,93,0,96,
+103,101,182,224,217,11,224,251,24,161,87,196,73,96,14,165,61,160,220,228,
+193,5,239,85,6,233,64,27,97,51,74,236,237,65,3,194,9,224,10,2,
+232,37,4,194,55,226,243,1,232,202,0,224,240,19,230,195,1,137,26,224,
+223,7,224,122,1,161,77,235,248,4,225,254,0,198,86,192,85,231,234,12,
+231,209,16,228,138,5,99,175,239,213,4,226,176,2,97,151,231,99,37,224,
+192,1,231,70,18,230,57,9,231,68,85,231,34,0,231,35,10,231,32,5,
+231,31,5,161,16,135,22,224,245,29,224,228,19,231,30,5,231,23,3,96,
+13,2,51,51,57,227,142,2,31,92,34,47,118,97,114,47,102,111,108,100,
+101,114,115,47,122,50,47,56,52,112,116,102,51,98,120,55,104,53,52,48,
+112,23,107,110,99,121,48,121,50,120,112,99,48,48,48,48,103,110,47,84,
+47,109,104,115,105,110,64,13,15,48,48,57,57,57,53,46,104,115,92,34,
+44,54,56,58,53,132,179,0,58,96,122,127,251,0,85,131,33,87,34,132,
+172,196,183,65,42,66,145,226,101,3,194,103,0,58,97,152,4,10,65,32,
+80,32,131,251,99,191,111,255,231,79,2,97,117,65,70,130,149,201,97,160,
+15,1,35,57,164,123,96,12,96,43,233,131,0,0,58,96,8,96,159,239,
+88,4,2,95,52,52,66,16,64,176,228,124,0,1,64,64,171,129,0,58,
+98,157,5,10,65,32,85,32,90,224,1,2,0,75,225,88,0,0,58,106,
+46,96,85,98,206,65,196,0,55,64,227,65,192,160,253,194,9,128,184,98,
+243,1,52,54,64,108,68,23,139,174,1,95,56,64,221,1,95,56,105,123,
+3,67,39,32,79,65,51,0,80,65,206,145,90,240,146,8,0,35,157,121,
+0,32,199,85,96,174,0,79,128,243,162,55,96,6,97,133,132,79,128,157,
+0,75,172,71,98,111,96,164,226,27,10,5,92,34,44,48,58,48,225,215,
+0,0,49,96,225,2,95,56,52,224,37,3,3,112,114,101,68,96,131,0,
+100,64,39,0,58,96,169,1,10,65,102,223,114,74,65,4,1,95,54,65,
+226,97,223,96,4,138,84,0,58,64,72,129,84,1,75,50,65,75,129,78,
+0,58,96,253,128,22,0,51,96,22,98,30,0,58,97,26,161,97,64,1,
+194,31,64,0,227,23,1,168,25,227,126,6,129,128,224,25,15,232,255,2,
+224,29,13,233,32,3,224,33,16,224,36,3,224,37,20,224,40,4,224,41,
+23,224,44,5,224,45,26,224,48,6,224,49,29,224,52,7,230,243,3,224,
+38,4,232,214,6,237,128,0,224,0,1,193,138,224,55,5,224,103,14,224,
+40,19,224,43,6,224,83,30,224,75,16,224,41,50,192,232,199,133,165,110,
+244,158,6,224,5,9,235,168,0,225,21,3,192,1,0,89,224,96,1,224,
+28,9,224,32,6,224,172,14,230,102,1,224,42,2,224,74,11,172,52,192,
+155,233,12,1,192,5,224,105,2,192,67,230,163,5,192,250,64,25,245,161,
+1,160,13,224,2,4,224,242,16,165,197,5,67,32,60,32,64,35,237,14,
+3,224,67,9,128,218,192,34,224,70,5,160,203,128,70,230,228,0,224,37,
+7,148,208,224,22,4,75,188,192,19,224,103,3,237,255,6,224,13,5,97,
+94,230,121,9,64,0,65,32,0,85,81,195,100,209,102,105,81,156,224,27,
+0,129,66,64,74,65,98,98,10,69,201,89,105,234,212,2,225,39,9,224,
+186,0,224,25,4,0,82,224,187,0,227,133,7,128,24,224,41,1,225,236,
+1,224,184,5,250,190,2,224,44,2,225,176,0,224,64,4,96,185,238,193,
+5,104,237,128,0,224,221,9,96,5,150,40,230,161,5,1,32,32,236,201,
+0,224,252,11,224,134,1,128,13,234,223,1,97,89,170,111,71,166,160,11,
+224,0,4,224,178,1,128,1,238,221,9,226,70,17,128,28,162,70,235,146,
+1,224,37,4,225,8,1,3,67,32,61,61,224,39,17,193,177,225,155,8,
+229,27,0,224,81,1,251,237,0,224,100,4,64,44,96,42,160,173,160,26,
+96,17,90,88,172,183,225,4,1,192,106,240,37,8,192,36,64,61,75,220,
+2,95,54,57,161,109,226,124,12,224,78,0,224,1,17,226,143,1,224,43,
+21,194,161,224,37,9,225,151,10,225,49,0,224,1,1,226,183,15,235,96,
+1,224,47,6,253,55,13,226,189,13,241,127,3,196,217,227,159,9,233,168,
+2,162,129,67,51,161,48,225,55,8,192,105,238,23,13,226,134,6,253,227,
+14,227,172,16,253,218,3,224,50,6,229,99,4,226,240,9,197,205,224,51,
+3,225,111,35,254,230,3,230,4,5,96,2,195,79,228,226,19,1,51,32,
+240,207,2,228,2,2,226,21,9,228,102,19,224,125,8,227,78,0,224,123,
+19,0,49,224,123,15,160,57,163,112,232,203,10,224,41,1,128,91,224,248,
+6,0,66,192,40,224,38,0,231,127,0,224,73,16,224,70,27,160,108,224,
+65,11,224,62,4,224,53,2,161,192,64,12,193,10,226,175,2,228,42,10,
+225,46,7,128,5,224,77,11,160,209,64,21,0,85,142,73,113,133,1,56,
+50,99,64,0,67,76,145,246,233,2,224,89,60,97,241,224,89,5,211,243,
+224,89,15,225,24,2,194,68,96,4,224,67,2,228,238,16,226,2,3,130,
+204,225,127,0,64,14,161,78,65,106,129,110,192,44,200,254,69,15,0,82,
+236,123,0,77,71,226,216,2,236,128,8,192,53,160,252,129,170,241,229,4,
+224,38,0,143,188,168,74,164,245,160,94,239,181,78,5,50,49,53,58,49,
+51,227,158,13,192,1,234,134,3,224,31,11,224,35,7,225,96,6,224,2,
+2,234,174,12,224,83,14,228,156,1,225,52,0,234,177,20,161,99,227,109,
+6,64,43,234,181,67,232,131,3,227,246,10,224,74,35,235,0,255,225,39,
+10,235,0,255,235,0,17,226,46,48,229,9,2,224,37,5,226,46,2,224,
+86,6,234,193,8,96,78,225,116,8,231,205,13,224,181,3,224,43,2,182,
+118,225,115,26,255,209,5,161,39,192,8,64,48,151,50,93,163,83,64,246,
+182,11,225,143,5,1,45,123,232,17,4,233,62,53,194,95,87,124,0,35,
+234,166,1,224,36,2,224,58,10,232,247,14,224,233,7,96,42,225,40,32,
+0,49,135,159,96,0,226,157,34,1,125,45,226,157,20,225,246,2,198,163,
+226,124,9,128,21,224,160,4,227,126,13,224,225,11,227,126,33,224,225,3,
+192,59,226,11,23,250,193,7,224,254,18,224,84,0,195,72,224,88,3,160,
+147,117,46,121,210,117,172,233,103,6,224,67,1,192,1,229,131,62,135,55,
+229,131,13,224,47,2,228,58,6,123,71,224,161,5,226,24,9,229,148,17,
+224,0,1,224,188,1,160,140,96,62,239,107,21,224,52,6,230,251,6,239,
+70,2,163,128,231,164,2,224,76,1,228,210,29,236,173,2,224,37,5,225,
+125,10,226,197,2,231,116,10,128,24,224,102,8,226,200,8,120,92,224,90,
+9,194,200,225,19,7,224,198,1,224,45,1,225,16,2,224,89,2,224,90,
+12,201,53,129,34,153,221,224,50,2,224,44,3,227,16,10,64,99,2,95,
+56,51,152,61,226,13,0,249,36,2,224,63,22,98,120,192,63,224,54,2,
+224,65,8,225,80,10,160,246,224,241,5,64,144,224,194,11,160,129,227,125,
+28,96,142,226,219,24,192,14,160,26,224,47,5,228,237,21,64,1,241,212,
+213,241,214,9,224,46,18,241,217,5,224,40,6,228,8,10,225,57,0,224,
+1,1,227,75,15,241,220,144,224,229,9,224,226,10,224,152,4,230,244,75,
+224,62,2,226,224,9,229,188,1,0,57,240,243,3,0,45,230,212,3,224,
+101,6,64,1,224,202,47,233,203,13,224,203,72,1,56,32,105,73,233,177,
+16,161,200,232,221,7,224,5,6,224,229,14,225,11,7,225,182,16,243,126,
+255,224,122,4,196,248,224,123,19,243,126,21,240,27,7,225,59,6,232,63,
+1,225,117,7,224,179,0,102,208,227,251,3,241,220,18,224,95,60,105,71,
+224,95,30,226,25,1,128,95,225,191,10,244,69,9,169,2,224,80,23,224,
+77,30,224,73,25,224,70,27,160,108,224,65,11,224,62,4,224,53,2,129,
+65,234,137,11,244,147,190,224,89,81,244,237,77,226,0,13,128,164,97,219,
+226,19,0,224,41,6,160,188,224,247,1,224,1,3,161,241,227,34,15,224,
+74,6,233,41,6,98,20,192,88,224,85,6,236,226,7,235,101,12,128,82,
+239,20,11,192,5,232,26,7,224,155,5,225,102,42,3,66,32,79,32,128,
+70,97,112,160,12,225,187,0,233,129,13,226,41,9,229,33,0,1,51,48,
+160,78,224,73,6,224,50,18,64,94,229,84,1,1,39,39,197,84,224,50,
+22,224,170,7,224,148,23,64,190,64,51,0,52,224,222,3,192,58,194,21,
+193,191,128,76,165,83,128,87,98,24,132,14,192,44,205,215,247,51,194,4,
+57,52,58,49,49,230,214,1,234,70,5,224,214,3,192,1,247,28,1,224,
+25,7,192,1,230,150,3,224,37,15,224,35,4,224,30,10,97,19,247,135,
+4,224,36,9,192,1,247,174,5,230,211,7,224,2,0,228,13,3,230,217,
+3,224,200,18,193,176,168,217,224,5,8,224,68,3,160,73,227,117,2,163,
+123,228,67,13,224,116,4,224,34,6,224,157,4,224,154,13,164,183,240,51,
+8,64,0,231,128,3,231,57,10,232,55,5,224,95,27,242,19,4,192,95,
+237,213,4,128,5,224,106,20,224,97,20,232,245,3,224,38,8,164,188,3,
+67,32,61,61,224,42,20,247,106,15,241,38,3,234,227,9,229,211,8,237,
+12,33,247,128,69,1,39,32,244,179,22,240,130,6,96,12,162,112,194,170,
+243,208,5,65,169,243,210,7,225,240,13,239,61,3,226,59,2,164,146,128,
+1,225,52,10,225,104,7,240,57,1,224,102,9,229,22,0,224,28,11,0,
+90,224,79,14,192,107,166,210,224,31,6,167,1,230,224,2,231,113,14,228,
+21,11,225,247,8,193,68,199,142,162,43,193,89,160,32,128,73,244,148,2,
+225,172,0,129,122,229,185,3,197,186,224,103,5,245,51,1,226,137,64,243,
+194,22,224,64,4,225,41,10,240,181,2,228,192,0,207,136,224,222,19,233,
+32,6,128,191,224,126,1,224,13,4,129,69,224,117,12,64,113,225,78,2,
+251,120,3,235,112,1,128,0,224,201,1,64,1,245,18,255,245,18,221,226,
+154,0,131,135,229,44,9,96,207,244,133,8,224,0,1,192,166,160,170,164,
+58,167,162,227,139,13,224,52,5,194,212,224,22,9,193,234,248,14,6,224,
+37,5,226,174,10,64,1,228,251,0,224,73,1,160,2,225,39,0,160,25,
+64,220,226,195,6,128,21,192,176,230,31,9,225,19,14,227,228,3,225,67,
+4,224,0,4,224,167,5,224,1,9,245,115,8,236,115,3,225,90,4,224,
+166,0,225,99,12,194,90,225,145,5,224,42,11,224,123,1,252,138,34,227,
+68,7,96,42,229,230,0,224,105,6,227,204,21,231,254,25,224,130,23,229,
+94,7,9,51,54,57,32,95,51,55,49,32,73,244,37,4,242,106,3,224,
+50,3,0,56,148,78,224,54,5,236,222,6,226,207,2,231,192,1,198,194,
+231,199,14,224,193,3,243,224,13,65,114,231,246,11,234,13,8,231,170,10,
+225,219,5,225,32,10,231,171,19,230,86,5,194,242,231,168,6,224,163,1,
+160,16,192,58,128,148,129,213,247,37,7,128,56,99,24,0,79,134,213,225,
+73,1,231,186,2,225,6,6,240,106,3,193,109,200,134,225,91,10,224,54,
+0,129,23,224,69,3,224,92,6,231,221,103,227,248,3,64,62,225,8,13,
+192,57,233,108,4,224,229,17,227,64,18,232,0,16,227,132,50,245,47,2,
+224,130,5,225,7,9,241,59,2,225,7,29,241,24,5,224,51,30,240,109,
+8,226,136,5,224,158,3,224,178,0,98,25,192,188,229,167,0,224,16,0,
+1,56,51,134,82,229,92,1,1,95,56,152,125,96,30,251,60,0,64,0,
+229,209,17,225,26,5,64,11,225,116,6,227,220,0,227,123,1,224,151,1,
+128,16,176,187,128,5,103,231,224,89,1,96,37,226,148,2,224,173,1,194,
+48,230,162,16,192,93,245,16,27,227,151,0,224,117,1,128,1,251,213,1,
+224,80,0,224,224,6,227,180,1,128,209,230,170,5,162,92,224,67,1,224,
+61,7,224,64,2,224,61,22,163,42,224,59,11,224,55,4,224,52,2,225,
+15,4,128,158,246,110,16,224,243,1,228,237,2,228,234,4,225,78,14,245,
+171,10,224,76,71,192,223,96,51,226,140,9,160,217,128,204,224,60,6,128,
+0,226,124,1,226,133,4,224,169,6,165,42,105,116,140,61,128,98,237,112,
+12,128,50,230,187,1,224,98,8,228,195,12,243,169,7,224,155,13,236,108,
+2,224,106,1,128,44,243,199,101,5,49,55,49,58,49,50,250,159,4,108,
+27,229,48,1,2,51,54,56,129,110,196,99,196,57,72,66,64,44,165,45,
+224,39,8,68,130,1,50,54,224,47,1,2,64,95,49,97,252,0,83,65,
+200,1,53,56,64,24,1,49,50,98,27,2,51,54,54,165,109,232,202,2,
+1,95,96,160,149,224,47,3,0,52,224,47,17,0,39,224,48,0,224,33,
+15,7,40,41,44,91,93,59,123,125,128,38,224,37,15,2,32,94,41,224,
+32,21,22,58,33,35,36,37,38,42,43,46,47,60,61,62,63,64,92,92,
+92,94,92,124,45,126,192,52,193,15,230,172,2,82,132,224,20,4,67,146,
+142,172,128,11,230,212,0,7,58,56,52,54,32,64,10,65,162,192,130,82,
+98,176,162,209,130,193,67,11,0,54,64,48,130,58,3,80,32,95,51,229,
+236,0,194,98,224,30,1,225,206,9,234,62,15,3,108,105,110,101,226,11,
+0,224,74,53,5,112,114,97,103,109,97,224,76,0,232,8,0,128,214,224,
+71,33,2,100,101,102,224,148,1,132,40,193,76,224,55,20,4,117,110,100,
+101,102,128,54,193,28,64,192,2,95,50,48,112,46,0,54,129,52,227,82,
+75,3,56,56,58,53,96,120,0,90,64,169,0,56,65,230,107,124,192,0,
+195,240,160,138,128,213,160,2,3,95,51,55,57,64,51,0,53,64,216,142,
+205,161,252,97,239,225,236,0,224,183,76,0,57,160,183,233,87,3,225,250,
+1,199,164,160,13,164,196,225,139,18,3,79,32,35,52,234,18,4,237,211,
+0,130,187,224,244,0,119,136,162,93,199,0,75,164,97,36,1,51,54,144,
+98,65,47,1,51,56,224,246,2,16,105,110,99,111,109,112,108,101,116,101,
+32,109,97,99,114,111,32,98,41,7,105,116,105,111,110,58,94,42,128,200,
+224,54,10,2,32,32,35,130,82,0,32,163,176,0,39,160,34,68,175,64,
+7,224,182,3,3,95,56,51,54,96,16,233,158,7,224,202,0,129,38,232,
+157,4,160,201,226,223,20,224,83,9,235,39,8,227,117,34,64,77,0,49,
+224,77,2,226,78,1,161,104,64,68,232,12,5,227,221,10,228,90,0,161,
+20,0,56,74,148,229,188,0,243,33,0,1,95,57,105,94,96,16,160,96,
+237,25,0,102,18,192,76,194,203,110,174,162,203,128,207,160,25,65,102,128,
+25,1,95,56,64,191,224,31,1,6,55,50,50,32,95,55,52,202,208,231,
+171,4,65,167,0,54,170,190,64,8,7,52,53,53,32,95,52,52,50,64,
+9,96,31,234,217,5,128,147,64,40,0,57,64,136,0,54,64,87,0,52,
+229,143,5,197,125,1,95,54,139,30,128,116,131,158,97,7,226,28,1,226,
+71,1,0,35,228,224,2,224,56,2,224,55,4,0,55,224,55,11,229,99,
+0,224,53,2,64,163,96,167,64,253,67,14,129,7,0,80,224,243,0,227,
+145,13,130,22,237,248,2,226,27,13,68,77,233,185,7,195,205,195,199,224,
+79,1,136,153,234,77,1,2,95,49,53,134,195,135,13,96,98,224,33,1,
+130,82,73,177,240,215,1,234,199,3,160,203,224,170,28,225,36,2,0,35,
+230,56,1,195,93,128,111,228,150,22,241,202,7,224,101,31,192,62,176,28,
+229,145,1,140,124,225,12,8,160,251,64,12,226,123,5,224,12,3,128,0,
+164,36,224,53,0,163,204,225,80,8,225,79,8,163,170,224,23,8,237,160,
+4,0,89,96,181,227,28,1,229,151,2,224,138,6,0,58,109,252,6,10,
+65,32,75,50,32,58,96,69,64,11,2,32,75,32,64,25,0,51,160,13,
+0,65,96,13,0,50,96,13,4,95,56,51,51,32,99,237,224,4,1,0,
+58,99,168,64,28,4,51,56,48,32,75,75,82,10,32,67,32,80,32,75,
+32,95,55,54,51,226,230,2,15,114,101,112,108,97,99,101,109,101,110,116,
+44,32,97,116,32,230,164,63,3,50,53,58,54,129,181,224,114,106,75,139,
+224,116,105,0,90,140,28,97,142,96,132,0,52,224,132,106,65,249,0,48,
+225,249,14,100,232,65,143,101,41,64,9,200,247,96,12,96,189,96,17,162,
+209,64,18,140,239,224,26,1,226,212,0,0,58,102,48,2,10,65,32,64,
+246,0,90,68,50,192,4,150,54,0,58,96,100,1,10,65,224,29,7,224,
+34,5,0,55,160,34,70,43,101,101,1,95,54,75,88,0,58,71,207,226,
+190,27,69,164,5,98,114,101,97,107,115,226,189,95,224,113,88,1,64,90,
+225,148,0,97,43,193,143,65,36,88,75,225,132,0,0,58,106,126,161,62,
+184,103,224,10,30,232,75,1,0,32,82,83,225,209,0,132,108,192,44,224,
+7,11,224,70,2,224,59,2,0,58,96,163,225,236,6,224,60,5,128,41,
+0,58,96,217,98,53,0,90,120,95,0,58,114,253,96,57,2,80,32,35,
+64,245,0,85,97,254,130,195,4,80,32,35,51,32,71,113,0,58,119,77,
+192,38,64,255,96,38,95,7,101,15,142,193,0,58,112,182,226,147,1,128,
+96,64,25,224,213,10,64,144,0,58,114,131,160,28,1,80,32,153,219,0,
+80,96,72,129,10,3,80,32,35,53,192,128,128,225,0,80,119,161,128,17,
+128,202,3,80,32,35,54,192,17,128,203,112,141,233,181,1,111,168,70,149,
+72,108,0,49,70,232,6,55,52,55,32,95,55,53,68,165,0,53,137,153,
+64,128,169,246,129,41,143,132,2,58,56,50,129,9,128,74,79,98,224,65,
+14,73,141,70,44,169,236,0,67,72,223,0,49,230,181,0,1,95,55,168,
+195,96,86,2,58,56,49,193,77,200,198,237,245,4,156,117,96,8,151,248,
+2,95,56,49,170,64,232,136,4,199,225,247,33,8,128,207,96,8,1,95,
+54,69,6,232,139,0,224,60,4,245,36,2,162,145,64,189,96,224,7,64,
+95,49,57,49,32,95,57,231,92,3,128,48,1,95,56,144,158,224,20,0,
+135,252,224,33,2,165,134,192,38,64,238,196,138,226,2,1,194,189,0,58,
+96,39,194,186,98,85,64,235,228,149,0,72,144,0,50,72,61,101,60,233,
+51,0,225,108,7,232,197,1,225,108,1,96,37,81,88,225,238,9,64,101,
+194,121,129,218,117,233,74,249,1,55,56,99,222,201,33,115,151,96,138,237,
+97,16,31,67,97,110,110,111,116,32,101,120,112,97,110,100,32,35,105,102,
+32,100,105,114,101,99,116,105,118,101,32,105,110,32,102,1,105,108,237,68,
+3,205,70,2,95,49,51,75,144,151,54,224,81,6,4,58,94,42,32,32,
+250,163,2,224,140,1,5,66,32,95,48,32,95,67,29,162,53,2,95,51,
+57,64,16,67,185,3,95,51,54,53,225,49,3,168,210,96,52,2,52,50,
+52,64,4,128,54,224,193,8,31,87,97,114,110,105,110,103,58,32,116,114,
+97,105,108,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,97,102,
+116,1,101,114,64,214,238,43,17,142,88,97,0,3,115,105,111,110,224,245,
+47,224,240,1,130,68,97,145,1,95,56,82,253,225,144,43,4,112,97,114,
+115,101,225,143,76,227,71,3,225,143,17,147,144,109,188,225,152,11,1,95,
+56,146,211,225,159,90,224,255,56,225,153,3,2,95,49,50,192,241,64,0,
+1,58,56,84,109,72,43,224,224,0,96,8,0,56,174,53,236,85,15,1,
+47,47,128,83,174,152,129,19,0,58,97,19,64,76,5,49,49,32,95,55,
+48,67,189,2,56,49,49,99,158,224,17,1,1,52,56,78,158,78,140,65,
+124,128,19,5,55,49,51,32,95,55,241,240,5,2,124,92,124,160,99,0,
+55,64,219,0,55,117,149,96,40,162,83,229,248,1,160,70,99,68,0,51,
+181,71,128,143,171,228,224,143,3,0,48,224,143,45,1,38,38,224,141,16,
+143,213,224,141,17,212,245,64,40,64,141,1,52,55,68,209,96,113,224,10,
+13,224,135,9,78,224,0,51,206,224,224,188,2,224,140,2,96,217,96,218,
+224,129,0,129,209,224,49,5,1,56,48,143,232,224,17,3,66,53,128,188,
+224,38,5,128,21,224,212,5,170,126,224,83,9,245,255,1,1,53,55,64,
+20,2,51,52,49,159,143,130,115,128,41,0,49,72,116,224,17,5,0,52,
+188,122,2,95,55,52,64,247,224,208,3,96,188,0,58,96,216,225,55,28,
+225,77,31,225,213,1,1,62,61,161,213,224,144,2,5,53,57,32,95,53,
+56,161,56,225,138,12,1,54,50,225,138,1,224,55,1,1,56,50,224,55,
+1,224,117,21,0,60,224,117,9,1,55,53,224,60,21,64,117,244,103,0,
+224,55,2,72,32,224,116,29,0,61,224,234,10,225,173,0,224,61,24,0,
+33,224,61,9,105,34,192,61,0,58,98,69,225,165,6,226,33,3,0,54,
+137,128,224,29,1,226,132,7,72,33,226,132,38,224,18,4,130,63,128,50,
+0,58,96,6,224,141,6,225,84,12,80,20,225,84,8,1,57,56,65,84,
+160,86,224,54,13,242,109,0,225,78,3,73,116,192,55,0,58,96,209,225,
+16,16,2,55,56,57,225,16,23,73,6,225,16,8,170,174,225,16,35,64,
+13,0,58,96,6,227,68,17,224,228,13,226,230,11,0,53,225,27,25,0,
+55,224,54,10,0,55,71,88,1,56,48,166,120,228,225,14,224,56,11,1,
+50,50,72,69,160,56,0,58,97,21,101,209,0,50,68,39,1,57,49,96,
+90,0,50,192,33,2,95,55,57,69,145,128,11,2,50,50,55,224,11,2,
+0,56,224,11,0,1,56,48,68,93,2,50,51,54,192,17,108,125,64,9,
+106,81,0,83,102,234,237,134,0,0,80,136,170,227,9,1,12,73,110,116,
+101,103,101,114,58,32,100,105,118,105,105,48,3,98,121,32,48,167,98,237,
+194,1,107,253,64,64,82,184,5,80,32,95,50,49,54,64,4,71,83,146,
+197,224,17,9,128,64,237,104,5,135,228,245,25,1,247,48,3,65,0,128,
+55,128,37,104,213,1,95,55,118,186,2,95,56,48,101,123,128,42,98,29,
+192,36,171,243,160,12,0,83,139,136,2,56,48,49,75,192,0,65,128,134,
+233,34,2,109,121,64,5,160,88,182,169,152,186,136,124,0,85,83,95,128,
+0,80,230,0,48,199,157,192,0,0,58,97,113,1,10,65,160,194,64,58,
+1,95,50,151,49,0,55,109,80,64,49,252,14,3,64,9,0,89,161,61,
+224,19,0,237,85,0,64,63,255,30,4,245,222,5,192,219,173,22,235,125,
+3,128,238,128,69,78,82,109,232,66,95,0,52,99,127,160,220,206,74,120,
+74,73,216,192,28,96,241,68,27,0,49,109,89,0,67,67,8,192,12,1,
+95,50,78,21,64,0,2,95,53,52,134,227,151,161,129,219,0,58,97,95,
+140,177,224,211,1,206,150,173,205,206,19,224,7,2,71,83,0,53,78,0,
+2,95,53,56,106,111,129,196,0,80,97,142,103,226,128,6,193,150,96,26,
+77,58,64,21,64,59,0,54,66,235,1,53,56,183,131,64,32,160,49,96,
+28,200,185,96,58,0,39,160,46,96,26,168,56,249,165,1,143,133,0,83,
+250,200,0,238,182,5,242,231,1,64,69,0,56,67,150,1,53,55,174,126,
+193,122,161,125,225,229,0,96,17,64,87,161,193,97,122,1,55,57,110,41,
+192,95,160,163,128,220,160,12,0,67,224,37,0,64,253,97,107,153,146,224,
+197,16,64,39,64,48,192,243,225,16,3,227,134,2,101,143,98,209,64,137,
+0,50,86,4,98,13,239,75,0,121,93,112,231,104,216,1,67,39,66,133,
+1,95,55,64,21,162,139,224,77,3,224,13,5,0,58,99,144,112,241,228,
+80,6,15,108,97,115,116,58,32,101,109,112,116,121,32,108,105,115,116,100,
+74,129,44,2,85,32,64,81,235,128,98,67,73,96,8,68,255,224,89,1,
+0,79,113,249,64,127,0,58,97,13,227,72,0,132,232,1,75,32,64,23,
+134,138,99,223,0,58,97,255,175,162,68,24,219,230,227,56,1,113,68,98,
+43,1,53,53,64,187,2,95,53,54,97,47,160,14,0,58,100,9,2,10,
+65,32,87,151,133,33,222,123,248,185,1,192,93,96,70,158,4,131,186,228,
+148,0,243,93,11,64,133,234,72,1,0,49,112,250,2,95,49,55,64,11,
+65,129,234,84,2,254,240,0,133,105,0,67,131,153,129,166,96,48,224,47,
+1,194,229,64,0,64,60,0,58,101,54,161,39,130,187,1,95,50,84,14,
+129,29,132,171,224,27,7,129,71,204,79,0,50,127,90,103,7,169,126,1,
+95,51,71,46,0,58,102,146,97,106,3,75,51,32,75,68,0,0,58,70,
+250,160,81,0,95,71,112,103,216,195,225,153,217,131,67,184,210,251,179,1,
+0,35,132,73,100,8,65,58,161,169,161,85,178,45,224,47,3,0,49,82,
+240,196,198,224,79,10,0,49,172,171,0,85,82,85,0,54,231,200,1,128,
+16,0,55,224,16,2,160,18,231,236,3,135,170,84,16,163,195,1,82,32,
+225,143,2,84,145,131,4,0,58,104,219,115,201,64,221,1,95,55,67,108,
+64,135,0,55,92,204,129,145,193,194,115,25,1,95,55,84,159,0,58,64,
+109,224,54,22,192,137,84,169,224,54,1,130,220,224,54,17,129,68,1,95,
+53,122,108,224,53,0,0,54,227,4,0,97,76,250,94,2,226,150,0,226,
+154,0,225,112,0,196,242,128,253,224,47,1,195,67,64,2,101,32,228,210,
+1,128,2,211,237,224,91,4,193,254,224,22,0,164,193,128,98,230,23,0,
+0,64,102,200,224,57,0,133,231,224,117,0,230,248,4,224,162,0,67,13,
+98,7,137,178,96,61,64,27,1,95,50,83,58,67,178,254,6,1,160,171,
+1,79,32,115,212,97,196,225,64,5,198,255,0,58,97,92,97,53,103,158,
+234,191,9,224,13,1,233,226,2,0,55,71,234,233,209,0,130,36,234,214,
+4,2,55,49,57,66,89,64,111,0,55,96,39,0,56,194,198,70,174,238,
+17,0,96,168,3,95,55,49,56,160,44,64,68,1,51,56,64,58,108,60,
+133,186,192,209,96,59,224,98,0,75,112,64,65,224,81,48,0,58,116,89,
+136,195,224,187,5,99,16,167,40,196,248,103,183,244,213,2,229,236,1,6,
+100,101,102,105,110,101,100,170,46,160,53,225,70,5,193,231,224,100,3,239,
+26,6,0,55,92,245,193,48,225,59,4,71,28,1,56,49,163,239,241,190,
+16,1,44,41,210,18,235,185,5,0,52,233,84,1,96,135,162,135,225,71,
+2,147,218,0,52,69,96,0,55,78,240,204,108,132,17,245,135,6,0,90,
+69,36,0,54,75,104,0,55,109,150,236,158,4,96,0,227,68,2,225,8,
+10,224,18,10,225,24,7,228,147,1,66,180,164,242,234,27,0,224,45,12,
+65,75,224,65,12,66,26,82,193,224,166,8,224,88,9,224,184,7,168,208,
+69,143,255,254,31,226,9,5,230,10,0,130,185,0,67,139,38,129,85,229,
+203,0,139,173,87,8,104,173,97,137,66,9,165,70,224,182,0,65,202,0,
+56,237,75,9,225,166,0,224,5,3,139,144,0,75,128,45,93,250,224,69,
+13,1,64,75,82,202,224,26,3,232,244,1,93,171,224,26,14,71,165,243,
+213,4,251,241,63,4,51,56,58,49,50,161,59,0,75,234,171,0,128,210,
+227,86,1,133,61,224,10,0,225,58,0,168,100,120,150,224,240,15,225,55,
+7,171,0,160,81,165,213,64,13,161,175,225,75,7,64,24,251,207,1,224,
+111,38,67,59,64,1,67,124,197,72,98,159,92,1,1,95,55,142,64,229,
+82,6,224,113,6,238,136,0,96,169,224,69,1,197,3,65,52,162,8,3,
+32,95,55,55,67,93,211,140,224,89,10,225,201,81,1,52,53,225,201,1,
+0,58,101,165,251,91,2,231,114,2,0,80,135,214,64,255,227,121,2,230,
+255,6,70,249,136,227,234,213,4,192,21,167,95,96,69,64,229,172,161,0,
+58,68,202,232,13,1,213,54,2,95,51,54,93,23,69,79,128,28,128,24,
+152,25,67,217,0,54,87,60,0,67,67,231,0,54,197,113,225,32,1,2,
+39,96,95,128,213,0,58,102,206,74,54,2,55,48,48,136,104,0,55,83,
+58,96,197,108,185,97,233,64,21,1,50,32,224,64,2,25,69,120,112,101,
+99,116,101,100,32,101,110,100,32,111,102,32,105,110,112,117,116,32,40,69,
+79,70,229,189,0,0,58,103,91,251,156,15,0,55,75,62,106,139,226,18,
+3,248,96,8,0,35,95,149,0,32,128,82,133,238,248,82,2,0,51,64,
+226,98,122,64,20,81,164,210,20,128,31,2,49,52,51,64,36,174,251,128,
+146,137,143,0,80,160,225,194,99,170,174,104,53,234,150,5,1,64,35,75,
+96,192,188,0,80,66,141,70,206,193,229,193,167,160,26,0,53,99,56,171,
+146,64,0,140,133,162,45,162,15,229,139,1,78,98,224,92,1,224,10,0,
+235,111,13,75,223,129,6,203,114,227,221,0,235,76,10,169,22,64,26,65,
+211,64,153,128,172,224,26,0,224,108,1,66,189,208,89,144,25,224,223,0,
+192,173,235,215,19,128,79,169,249,99,6,162,186,237,112,5,224,224,2,224,
+179,13,129,104,128,115,98,10,224,144,2,66,53,225,95,11,224,44,19,224,
+199,3,128,0,1,58,55,86,17,5,10,65,32,65,32,58,96,76,3,10,
+65,32,75,64,10,211,95,209,216,128,172,130,29,224,244,12,0,51,96,86,
+224,199,13,124,60,90,125,132,175,160,7,193,75,135,42,230,11,1,224,61,
+1,190,100,131,118,1,95,55,131,231,1,58,55,80,170,141,161,103,201,200,
+196,0,55,144,123,133,68,133,217,96,56,0,58,96,56,224,205,1,114,77,
+232,169,36,171,231,233,89,3,126,240,154,156,234,160,2,68,22,233,236,0,
+233,173,20,161,161,230,67,3,224,128,16,224,43,7,236,203,4,230,203,0,
+134,57,96,45,67,178,232,125,5,97,8,223,208,167,10,225,125,3,231,13,
+6,144,198,172,137,230,162,9,64,244,124,125,134,218,224,208,0,245,10,3,
+224,7,7,197,204,129,197,230,202,14,128,0,230,187,78,2,51,55,55,230,
+187,3,66,46,240,57,4,131,153,225,73,5,225,82,6,180,0,212,6,188,
+187,195,111,92,58,100,54,66,187,0,54,155,166,114,132,1,95,55,113,145,
+144,218,108,195,66,49,107,99,242,163,0,224,69,0,224,60,14,128,42,162,
+12,255,142,16,5,109,97,99,114,111,32,128,227,193,238,166,32,129,206,224,
+51,10,1,32,101,198,186,128,55,160,136,96,53,64,144,230,88,1,224,145,
+6,192,91,224,74,2,23,97,114,103,117,109,101,110,116,115,44,32,98,117,
+116,32,119,97,115,32,103,105,118,101,110,128,90,224,77,5,160,208,161,243,
+179,132,165,10,64,2,1,95,55,127,218,96,178,247,20,4,233,219,2,201,
+203,181,168,160,223,0,54,88,99,235,200,4,66,212,160,98,66,116,1,54,
+55,228,92,1,108,48,132,206,2,55,52,52,71,217,123,42,166,235,165,203,
+244,178,4,65,249,64,98,81,116,224,101,8,128,42,224,100,9,65,53,96,
+11,67,60,65,223,193,69,165,169,133,64,64,125,65,119,69,211,228,48,0,
+0,58,99,36,72,146,2,53,54,57,67,165,0,58,96,64,177,69,71,104,
+0,75,64,83,0,51,225,136,2,4,101,120,112,97,110,88,238,4,44,32,
+97,116,32,233,253,64,2,53,58,54,130,35,224,112,104,108,236,224,114,103,
+69,130,224,229,104,65,243,0,58,98,43,228,157,4,224,9,1,98,226,0,
+55,74,236,160,20,0,95,142,79,70,97,1,95,55,146,40,181,110,83,228,
+181,206,64,83,137,234,231,212,0,246,10,1,128,71,142,208,132,242,224,53,
+2,0,54,226,106,21,227,242,2,226,106,93,224,112,87,226,106,10,224,114,
+89,226,106,8,224,114,89,0,32,111,137,0,58,100,134,225,224,19,6,114,
+101,112,108,97,99,101,64,140,225,226,95,224,114,89,225,228,10,224,116,91,
+151,116,81,130,224,123,103,0,58,105,171,143,24,0,52,74,247,123,157,2,
+95,55,54,121,7,91,131,5,10,65,32,73,32,58,96,16,70,107,1,52,
+56,109,193,75,171,1,95,55,104,111,1,95,51,93,96,160,56,0,51,106,
+245,192,11,84,52,96,11,0,58,96,6,121,117,3,51,54,32,75,175,161,
+0,49,232,36,3,6,110,111,32,102,105,101,108,200,110,96,29,104,1,117,
+54,128,105,0,49,107,69,96,11,0,58,96,6,96,145,0,57,66,156,1,
+51,53,72,65,0,50,251,147,3,17,67,111,110,116,114,111,108,46,69,120,
+99,101,112,116,105,111,110,46,95,246,3,114,110,97,108,64,98,224,39,1,
+10,82,101,99,83,101,108,69,114,114,111,114,96,123,97,140,0,58,96,226,
+227,0,2,0,73,140,55,64,28,99,33,1,75,51,65,33,73,61,175,186,
+120,185,146,29,91,214,69,40,64,8,0,55,88,177,1,95,51,88,224,229,
+129,1,233,133,1,72,92,105,252,157,235,236,224,3,197,181,96,37,150,65,
+65,161,0,53,65,3,0,53,172,30,0,58,107,200,124,76,5,52,56,32,
+95,50,53,65,44,96,28,1,95,50,224,40,1,1,95,51,81,57,1,95,
+51,140,67,1,53,52,129,194,154,247,160,106,1,53,53,224,20,9,1,50,
+57,65,216,160,77,0,57,65,216,96,11,0,58,96,6,151,70,109,214,138,
+246,203,44,128,2,128,184,142,19,78,18,0,53,86,225,136,245,242,15,1,
+152,204,88,143,64,7,73,90,218,127,128,60,236,15,0,5,50,56,52,32,
+95,50,124,24,234,194,4,76,31,160,50,65,37,1,53,51,128,22,90,187,
+125,39,160,0,224,113,90,0,54,224,113,5,224,42,6,224,15,7,0,58,
+65,111,97,66,170,182,217,216,224,153,12,207,89,3,95,50,56,51,224,148,
+0,64,163,141,30,130,124,224,13,1,224,149,16,128,80,0,58,66,0,98,
+50,2,56,32,58,96,42,199,253,171,226,0,55,84,208,135,241,81,144,139,
+104,177,73,161,36,64,5,235,103,0,64,152,0,50,74,239,186,141,128,30,
+64,22,253,205,0,136,157,0,53,160,14,253,219,8,131,27,0,64,192,194,
+224,40,0,0,35,242,147,0,154,190,2,95,55,53,132,77,0,53,132,141,
+111,88,100,137,77,100,0,58,96,29,1,10,65,81,186,0,49,64,218,132,
+32,96,245,0,58,96,39,114,209,0,58,96,223,96,24,126,43,65,106,232,
+255,5,107,171,128,230,194,219,104,252,0,54,121,48,233,107,0,67,147,4,
+64,95,49,57,49,192,228,97,216,64,21,224,117,2,251,107,4,105,92,175,
+164,144,109,169,92,108,164,111,65,210,20,0,58,100,24,224,165,2,129,167,
+226,47,1,160,5,112,174,0,64,77,8,1,75,52,130,47,1,95,55,147,
+238,68,47,149,47,149,43,96,35,158,206,192,35,160,139,0,58,80,157,129,
+79,224,93,7,0,55,92,105,160,93,98,71,224,93,0,129,24,117,153,149,
+152,224,95,10,239,54,1,124,253,227,134,0,170,78,147,217,123,186,97,111,
+245,211,7,209,97,99,26,0,52,66,204,224,231,12,240,54,1,179,177,224,
+137,11,188,8,229,245,1,31,87,104,101,110,32,108,111,111,107,105,110,103,
+32,102,111,114,32,97,32,110,111,110,45,101,109,112,116,121,32,115,101,113,
+24,117,101,110,99,101,32,119,105,116,104,32,115,101,112,97,114,97,116,111,
+114,115,58,94,42,94,149,184,0,58,97,92,135,56,215,150,241,212,0,0,
+48,205,163,64,210,242,28,3,224,41,8,0,49,192,41,241,245,4,0,58,
+114,68,128,92,241,252,2,124,200,133,105,130,58,230,48,6,98,150,251,170,
+2,239,214,11,239,213,10,176,9,239,179,6,2,103,111,116,160,35,224,157,
+6,0,58,64,187,64,156,119,10,0,89,161,221,68,33,224,140,2,239,1,
+10,0,64,172,90,241,196,75,4,49,48,57,58,55,128,173,175,243,98,89,
+0,52,68,233,224,14,1,244,151,3,68,88,224,25,13,66,46,0,83,64,
+213,64,25,252,8,2,128,30,68,59,96,57,244,246,20,1,49,50,98,138,
+224,33,18,135,98,224,66,19,153,2,99,42,245,58,8,88,49,64,234,70,
+20,88,135,165,229,208,52,96,164,192,12,96,43,230,75,0,6,95,52,52,
+57,32,95,53,68,78,129,45,224,66,27,128,139,224,67,53,96,240,224,66,
+6,1,55,50,165,249,224,134,30,97,85,224,67,15,196,6,228,111,0,101,
+43,129,196,228,211,1,249,233,5,255,91,16,7,59,40,41,91,93,123,125,
+96,195,1,230,6,0,104,216,228,200,0,71,19,224,102,6,250,89,3,0,
+50,225,183,6,2,64,35,57,135,34,229,60,1,128,6,157,253,128,97,154,
+66,165,5,227,191,8,13,66,97,100,32,99,104,97,114,97,99,116,101,114,
+58,131,161,211,62,167,44,167,127,226,160,1,162,203,128,116,64,192,128,31,
+233,163,3,226,99,10,102,222,192,33,135,253,161,91,160,46,160,71,224,202,
+0,65,90,126,196,115,59,230,72,3,230,222,0,85,234,100,109,132,154,129,
+226,96,50,230,252,1,233,144,1,200,186,129,232,192,91,211,75,224,48,8,
+224,46,14,129,14,226,95,6,224,62,10,96,54,252,23,30,1,95,39,229,
+26,0,230,165,0,224,98,26,64,79,64,101,96,11,102,240,96,47,3,64,
+67,32,79,230,49,2,226,159,26,22,33,64,35,36,37,38,42,43,46,47,
+60,61,62,63,92,92,92,94,92,124,58,45,126,160,148,129,229,193,226,169,
+164,97,223,224,207,15,1,101,69,224,58,12,202,246,128,18,229,17,15,132,
+6,224,110,4,226,17,8,192,130,225,138,11,226,25,11,230,180,6,0,43,
+230,173,2,226,36,6,226,28,7,224,180,30,214,170,224,180,82,0,45,224,
+180,34,224,128,65,0,79,138,254,194,78,224,124,30,196,117,224,197,8,3,
+109,105,115,115,73,33,7,43,47,45,47,100,105,103,105,168,20,224,39,8,
+14,97,102,116,101,114,32,101,32,105,110,32,102,108,111,97,224,38,15,6,
+108,105,116,101,114,97,108,164,184,64,155,254,128,7,214,235,224,204,8,224,
+68,1,2,46,46,46,227,126,1,96,229,195,72,64,0,94,74,194,198,0,
+85,101,65,64,218,170,234,225,165,9,255,151,3,0,105,184,145,224,35,6,
+2,115,116,114,65,2,160,187,128,34,96,118,198,20,97,164,129,131,138,198,
+232,78,6,193,202,245,178,10,64,186,221,36,230,161,0,97,176,106,188,97,
+148,80,222,233,54,77,3,49,56,58,52,210,133,228,144,3,121,45,126,23,
+248,131,0,64,0,248,127,4,97,89,64,48,96,39,230,129,2,124,252,81,
+6,128,60,249,206,0,0,67,102,233,0,52,81,168,105,152,96,0,129,156,
+234,45,8,225,160,13,160,169,1,58,55,66,32,114,77,253,25,2,221,110,
+1,95,55,72,173,194,70,224,72,2,202,249,0,97,225,201,0,71,72,163,
+164,225,182,7,64,181,235,75,2,224,70,1,3,98,105,110,100,128,51,235,
+154,4,0,52,98,105,224,17,3,64,58,93,240,224,143,15,224,132,3,4,
+32,104,97,115,32,115,1,3,110,97,108,32,198,92,65,144,224,150,41,236,
+74,5,97,45,206,225,130,122,0,83,158,156,160,96,99,60,77,229,96,15,
+237,232,8,0,58,64,200,174,208,116,19,64,57,236,153,8,106,31,128,93,
+236,240,2,165,94,224,192,3,91,31,107,61,224,213,9,224,181,2,224,225,
+12,225,191,14,0,44,108,169,0,39,231,144,0,224,152,14,134,3,224,138,
+4,155,247,224,27,13,235,157,5,224,27,4,0,49,99,147,224,28,15,156,
+25,224,28,15,163,232,224,28,13,229,242,0,224,28,11,224,144,18,97,83,
+224,27,14,196,90,224,27,12,133,111,224,83,13,192,55,101,70,0,83,198,
+46,224,157,15,236,170,0,224,28,10,141,10,64,22,3,83,32,95,54,144,
+41,238,165,3,229,146,8,18,117,110,114,101,99,111,103,110,105,115,101,100,
+32,101,115,99,97,112,101,239,144,1,1,105,110,225,253,4,3,58,32,92,
+92,97,249,233,66,2,207,35,224,137,7,157,88,224,27,14,97,124,224,27,
+14,98,40,224,27,14,97,151,224,27,14,97,95,224,27,13,93,186,224,27,
+16,214,33,224,27,11,97,235,224,27,14,224,195,18,149,122,224,27,13,0,
+56,224,83,18,0,56,102,136,224,27,14,228,67,0,228,164,5,81,168,86,
+232,230,177,75,5,51,48,56,58,49,52,163,235,83,76,227,234,5,224,138,
+8,66,198,229,198,24,196,120,0,35,130,199,235,117,16,4,39,92,92,86,
+84,228,104,0,224,125,26,65,60,224,125,33,152,25,224,125,19,1,85,83,
+228,230,3,1,55,48,78,254,224,4,15,224,155,22,112,21,230,224,34,224,
+67,12,110,167,225,93,33,160,186,224,154,61,224,86,1,211,223,226,11,60,
+224,67,22,67,70,224,154,33,99,88,224,242,28,226,41,37,167,174,224,174,
+25,225,228,59,224,242,38,224,243,32,100,62,224,156,54,101,182,224,156,34,
+236,242,0,227,189,27,124,114,227,189,33,128,248,227,189,18,4,83,79,72,
+39,32,96,7,128,6,1,84,88,128,7,0,73,128,6,1,89,78,128,7,
+5,85,66,39,32,111,114,96,10,0,80,240,102,1,228,109,73,151,44,224,
+175,18,0,82,228,109,9,225,210,90,102,197,224,198,33,183,242,225,32,27,
+103,255,224,157,55,224,67,28,226,112,1,228,243,0,225,102,17,2,78,85,
+76,193,240,2,78,65,75,225,241,35,104,68,228,53,34,225,241,24,1,76,
+70,230,221,35,231,91,37,142,6,224,124,18,0,72,231,90,82,0,50,224,
+125,24,0,71,226,236,40,225,125,39,165,24,224,219,73,105,218,224,219,19,
+1,70,70,194,96,0,70,224,229,1,232,65,20,225,250,60,224,67,22,230,
+87,37,221,96,225,149,24,230,242,58,226,217,38,208,202,231,74,62,224,155,
+22,68,81,224,155,33,168,40,224,243,63,229,96,22,231,141,38,193,211,225,
+56,25,119,11,224,88,33,192,245,227,107,63,224,246,22,224,157,38,218,175,
+227,177,15,2,111,110,101,82,241,3,39,92,92,69,168,34,2,69,79,84,
+128,7,1,78,81,128,7,1,84,66,128,7,0,77,195,216,2,69,83,67,
+227,217,14,224,188,23,234,34,59,225,247,37,0,49,225,1,1,224,88,60,
+224,224,59,224,156,1,234,34,35,225,249,28,229,90,37,122,29,224,174,34,
+129,74,224,85,23,0,53,230,171,38,134,82,224,86,25,228,140,37,220,160,
+224,86,24,238,87,37,146,96,96,20,231,3,17,1,68,69,233,101,0,2,
+68,76,69,224,10,0,6,67,91,49,46,46,52,93,227,59,9,228,55,23,
+238,250,38,164,234,234,164,94,237,178,38,247,139,0,225,62,17,1,67,82,
+193,50,2,67,65,78,225,45,40,228,100,106,196,98,233,111,73,233,110,24,
+0,66,226,106,1,0,66,233,111,2,228,78,62,225,38,23,236,160,37,196,
+237,224,206,18,1,65,67,236,148,2,153,241,4,53,32,64,95,53,80,92,
+6,95,55,51,48,32,95,51,189,77,224,29,10,0,49,224,29,2,218,47,
+224,31,0,86,49,1,95,48,160,138,154,54,0,50,64,209,213,201,2,95,
+55,51,92,23,192,63,224,251,8,86,81,159,176,0,48,64,54,2,95,49,
+53,66,138,0,53,64,76,0,35,123,237,88,218,92,94,128,18,0,57,96,
+71,246,124,22,249,149,4,4,99,116,114,108,45,182,129,8,109,97,108,102,
+111,114,109,101,100,86,114,1,92,94,97,17,246,116,3,125,103,224,203,2,
+96,225,64,224,5,49,57,49,32,95,57,98,99,0,51,81,184,96,5,128,
+159,193,84,225,143,1,187,45,224,17,3,128,40,224,17,2,151,239,228,94,
+4,180,57,224,35,2,224,34,8,188,81,224,17,2,174,14,224,17,2,224,
+88,8,162,235,227,86,8,224,234,2,158,98,68,5,225,90,6,253,104,7,
+217,190,225,97,4,162,88,0,58,123,64,1,10,65,118,75,0,83,66,210,
+0,55,76,214,224,61,1,6,100,101,99,105,109,97,108,129,117,65,84,0,
+55,123,112,158,212,97,196,0,50,126,50,96,229,3,95,51,52,49,94,56,
+128,188,152,185,1,95,55,78,3,0,58,66,81,186,190,1,55,48,66,53,
+154,179,156,245,155,161,67,0,0,58,98,137,224,143,18,2,111,99,116,224,
+141,37,161,73,1,53,52,98,8,192,140,0,49,224,100,20,2,104,101,120,
+224,240,36,131,204,1,95,55,105,95,224,99,0,0,48,96,99,227,43,4,
+6,95,49,53,51,32,35,52,64,147,99,54,0,51,71,116,152,229,224,38,
+9,123,39,224,38,0,186,253,64,174,224,39,6,102,185,224,39,0,152,224,
+3,95,51,54,48,226,3,2,8,100,105,103,105,116,84,111,73,110,189,201,
+227,30,12,224,16,0,163,40,64,86,193,204,224,49,28,96,176,224,49,21,
+96,39,96,255,1,64,58,97,39,65,133,0,39,127,143,191,208,157,20,158,
+81,64,0,128,27,64,5,228,133,1,100,178,0,49,73,216,103,66,1,95,
+55,207,227,64,38,128,42,227,38,1,153,69,1,39,66,65,197,1,66,39,
+96,5,2,32,95,53,122,63,224,117,0,96,11,125,148,96,7,2,83,32,
+95,252,136,3,0,67,68,84,128,74,226,9,16,160,124,1,95,50,115,138,
+67,144,99,150,0,50,64,245,2,66,32,80,197,77,224,62,18,160,67,222,
+175,229,33,9,1,94,42,227,202,0,108,169,6,114,32,109,111,114,101,32,
+165,16,254,229,7,0,32,97,243,0,115,227,231,0,66,225,66,142,98,59,
+0,56,97,138,1,54,32,65,26,128,14,226,83,1,229,184,0,226,128,0,
+229,202,2,194,133,224,45,10,194,134,224,45,2,130,139,64,124,159,8,171,
+141,225,185,0,97,184,224,145,1,0,54,88,81,5,67,32,95,51,54,54,
+167,85,231,16,3,1,96,95,199,12,230,142,3,78,114,230,89,22,0,69,
+254,191,0,10,110,32,105,100,101,110,116,105,102,105,101,190,190,1,92,34,
+225,62,4,1,79,32,101,246,220,206,1,58,55,86,184,128,184,103,46,3,
+49,32,95,49,102,64,0,58,96,120,96,25,1,50,48,100,71,64,1,0,
+80,64,35,66,230,130,122,197,143,1,55,48,132,23,99,25,162,217,0,58,
+97,0,128,64,0,49,229,21,0,98,55,2,95,55,48,137,24,1,32,89,
+100,159,0,83,72,26,0,75,65,119,96,4,162,39,192,50,99,103,98,108,
+0,89,69,85,162,198,64,4,224,55,1,198,42,128,62,96,10,194,117,0,
+89,66,238,2,39,32,80,225,69,24,18,102,97,105,108,101,100,32,116,111,
+32,112,97,114,115,101,32,97,110,121,79,44,22,116,104,101,32,112,111,115,
+115,105,98,108,101,32,99,104,111,105,99,101,115,58,94,42,97,85,99,165,
+1,55,32,121,141,64,11,3,50,50,32,85,99,137,129,108,224,98,8,192,
+55,224,53,1,97,237,0,54,159,19,196,11,1,32,66,128,91,227,235,0,
+129,6,224,19,2,0,83,96,14,228,80,0,128,2,128,20,224,55,2,225,
+32,4,224,26,3,0,90,161,37,192,38,128,76,96,11,0,39,102,184,192,
+91,1,95,49,97,202,0,80,160,64,194,53,226,34,1,198,242,0,89,132,
+117,74,136,136,126,132,210,193,1,64,52,0,58,65,29,128,45,128,115,0,
+80,70,67,86,198,5,10,65,32,85,32,58,66,102,166,78,0,39,64,2,
+64,59,72,125,132,80,0,75,96,85,1,95,55,155,146,132,181,97,125,99,
+29,0,85,64,31,0,65,224,33,3,66,101,225,123,5,3,73,110,32,97,
+255,236,0,225,136,12,1,83,39,65,121,101,75,99,185,0,56,194,110,69,
+108,224,135,12,161,31,64,137,0,52,94,155,160,137,170,98,188,62,0,58,
+68,14,168,25,64,18,64,44,70,49,224,80,11,0,58,96,117,128,43,3,
+54,32,95,52,97,59,226,255,0,133,123,193,83,67,210,1,52,49,250,31,
+2,0,55,103,166,0,58,64,210,129,72,0,85,193,142,2,90,32,90,69,
+118,1,52,53,67,201,235,211,2,198,203,131,31,234,115,0,0,90,130,195,
+96,220,160,85,96,0,0,58,96,11,97,174,0,75,96,228,0,58,97,127,
+96,16,0,73,65,205,64,196,67,241,203,121,97,21,132,22,101,9,2,95,
+52,53,192,230,233,44,0,235,121,6,64,237,3,83,32,64,82,227,171,3,
+225,196,1,0,80,67,153,9,46,115,97,116,105,115,102,121,58,32,131,178,
+236,122,7,96,95,130,107,99,58,100,180,0,50,161,11,224,75,1,6,82,
+97,110,32,111,117,116,67,227,10,105,110,112,117,116,32,40,69,79,70,41,
+197,45,137,183,64,73,130,161,3,95,52,55,56,64,21,0,55,69,198,224,
+153,10,0,110,164,54,162,86,74,180,2,95,52,56,76,149,133,20,1,52,
+56,102,24,64,11,0,58,96,6,163,9,228,227,1,0,83,202,51,67,200,
+227,191,9,99,182,99,185,98,94,0,58,96,98,64,152,1,54,51,108,251,
+130,33,138,122,229,10,0,0,58,96,165,64,37,97,28,130,61,224,35,1,
+96,226,129,235,232,121,0,224,14,6,232,106,7,1,95,49,193,6,2,64,
+95,50,97,231,128,10,96,48,64,10,0,58,96,6,64,114,192,18,224,230,
+5,229,202,9,0,67,162,125,65,54,96,181,229,191,4,2,95,52,57,224,
+127,0,1,95,51,97,69,192,103,130,140,1,95,51,225,72,3,136,152,142,
+14,172,223,96,50,71,187,0,58,96,6,128,50,67,230,224,122,0,134,60,
+107,168,128,130,160,80,139,81,224,74,7,132,251,64,6,2,10,65,32,67,
+90,0,85,128,16,194,210,0,90,128,242,65,171,69,57,0,58,96,82,161,
+238,64,20,224,28,6,130,95,2,73,32,58,96,192,97,209,2,32,95,54,
+73,158,2,58,54,57,170,64,1,32,80,66,24,0,80,78,222,100,40,224,
+12,0,139,164,192,45,129,235,66,66,233,245,0,230,37,5,96,197,129,120,
+132,237,138,13,166,60,0,83,160,58,0,64,96,18,224,5,4,230,113,6,
+160,60,230,145,2,230,127,14,129,195,224,19,2,64,62,0,66,143,83,243,
+150,2,202,124,192,42,134,2,227,8,3,132,165,224,215,2,224,40,3,0,
+64,224,76,3,174,196,128,57,224,110,12,100,250,224,206,1,162,244,134,81,
+0,50,67,86,64,46,100,252,64,5,96,157,198,215,2,64,64,79,68,249,
+167,9,224,64,56,224,199,0,224,73,44,135,103,66,9,128,30,4,79,32,
+35,52,54,224,91,3,203,255,225,1,15,128,114,3,82,32,95,51,78,47,
+224,153,5,98,37,0,39,96,2,99,41,98,112,128,39,224,119,24,225,239,
+1,64,1,0,89,192,23,226,135,1,226,68,5,224,48,4,72,125,224,66,
+6,200,127,224,63,9,70,105,244,100,0,161,241,192,182,2,95,51,57,64,
+29,200,253,224,78,1,3,95,52,50,52,64,4,224,24,9,232,49,5,23,
+87,97,114,110,105,110,103,58,32,67,97,110,39,116,32,102,105,110,100,32,
+102,105,108,101,203,83,224,60,3,236,212,0,224,19,2,224,78,6,19,92,
+34,32,105,110,32,100,105,114,101,99,116,111,114,105,101,115,94,42,94,134,
+110,225,168,1,64,2,192,72,160,68,0,54,146,164,224,13,0,0,54,237,
+48,4,224,65,0,225,144,20,224,139,8,17,94,42,32,32,65,115,107,101,
+100,32,102,111,114,32,98,121,58,32,134,183,2,49,51,53,72,117,183,77,
+160,58,69,255,97,100,164,117,64,74,243,213,15,6,109,105,115,115,105,110,
+103,97,39,160,84,244,1,6,224,148,2,206,247,161,203,70,116,142,238,0,
+54,80,146,193,20,67,11,77,51,0,55,65,176,224,39,6,0,57,106,32,
+224,163,3,234,172,0,160,63,65,51,70,64,73,20,225,89,1,225,102,0,
+1,95,54,111,188,168,237,131,23,160,19,128,0,112,140,100,98,1,52,51,
+64,66,137,241,64,200,64,39,0,54,101,118,134,239,0,85,102,11,0,90,
+64,111,148,86,0,58,96,31,229,208,0,78,14,0,54,235,34,0,74,173,
+105,226,1,53,53,96,31,96,222,238,26,15,2,92,92,47,161,230,204,43,
+0,58,96,100,2,10,65,32,108,222,97,249,129,75,228,48,0,97,206,64,
+105,0,58,96,50,1,10,65,224,122,0,224,210,1,229,53,7,135,251,100,
+110,161,3,225,24,12,0,58,96,7,96,81,0,58,65,92,166,116,225,152,
+1,3,67,32,95,54,93,89,2,95,54,54,71,147,65,180,0,54,170,186,
+192,35,2,95,54,56,226,201,3,15,85,84,70,45,56,47,47,82,79,85,
+78,68,84,82,73,80,128,238,133,238,227,228,1,0,95,78,147,2,95,54,
+57,146,1,1,54,55,64,141,0,58,98,4,204,133,132,83,2,95,54,56,
+168,119,224,150,4,2,95,54,56,97,255,230,69,1,64,34,115,31,97,9,
+152,76,1,55,57,145,209,0,35,228,234,1,162,133,103,31,224,42,2,65,
+174,64,254,5,35,50,48,57,53,49,104,23,3,35,53,53,50,65,245,193,
+142,224,124,2,0,52,177,31,226,173,4,225,111,0,150,182,130,113,0,67,
+68,157,75,51,0,52,77,30,243,182,3,20,71,101,116,67,111,110,116,101,
+110,116,115,58,32,115,117,114,114,111,103,97,116,138,115,129,102,193,42,129,
+28,225,60,3,65,147,82,19,1,95,54,96,105,224,131,0,227,143,0,0,
+58,97,87,4,10,65,32,75,51,70,7,0,58,96,39,9,10,65,32,94,
+103,101,116,98,32,58,97,59,105,59,3,57,57,32,79,81,238,80,77,1,
+95,52,72,180,138,145,97,116,180,116,129,37,0,51,64,112,225,228,22,243,
+200,6,20,117,110,107,110,111,119,110,32,116,101,120,116,32,101,110,99,111,
+100,105,110,103,235,225,2,98,59,0,51,108,232,66,65,130,122,67,228,1,
+56,48,64,4,132,166,100,239,97,63,0,55,192,20,64,46,169,252,1,52,
+56,67,10,2,54,56,49,97,12,66,247,0,73,68,27,71,109,0,85,64,
+23,130,85,64,53,140,234,0,50,110,90,0,58,96,24,106,215,2,51,54,
+32,77,188,97,94,0,49,143,232,0,85,96,35,1,95,51,247,83,0,0,
+52,96,142,64,92,3,95,49,52,50,192,11,0,58,96,6,96,132,5,57,
+32,75,32,95,51,67,253,1,51,50,225,0,3,65,223,19,114,111,108,46,
+69,120,99,101,112,116,105,111,110,46,73,110,116,101,114,110,150,20,224,39,
+1,3,83,111,109,101,224,35,0,97,32,193,133,195,14,129,23,123,178,203,
+103,0,83,64,242,0,55,108,155,100,163,0,58,65,54,224,230,0,109,210,
+96,30,9,10,65,32,99,97,116,99,104,32,58,96,63,147,86,227,75,4,
+3,64,95,54,53,152,134,70,18,0,54,83,19,0,54,91,72,224,160,1,
+6,111,112,101,110,70,105,108,173,17,226,242,1,0,58,100,26,100,61,67,
+98,78,56,96,57,171,33,71,159,158,37,167,202,146,121,1,95,52,83,84,
+136,127,64,167,64,3,200,142,96,52,97,191,244,94,3,241,123,7,166,141,
+96,128,130,9,228,179,8,64,209,164,179,69,44,194,110,0,49,127,58,227,
+76,3,131,94,224,33,2,84,124,128,90,216,109,228,86,2,0,54,108,89,
+0,51,65,113,247,5,1,143,193,224,32,3,0,52,109,33,224,19,6,104,
+165,1,95,54,116,104,1,95,54,103,3,224,119,1,120,80,96,138,96,114,
+1,95,52,76,76,3,95,54,55,49,97,83,130,105,5,94,102,108,117,115,
+104,67,192,64,22,213,32,229,18,1,1,54,50,208,243,229,103,1,65,69,
+132,244,224,5,0,78,157,64,4,64,114,64,3,224,131,4,224,13,6,228,
+137,6,134,115,1,95,52,69,32,1,95,54,117,69,228,142,3,101,74,64,
+175,228,125,0,0,65,64,190,64,22,96,213,0,66,78,246,109,49,96,51,
+138,185,0,58,96,60,128,245,1,54,54,85,157,0,48,96,52,130,89,8,
+65,46,119,114,105,116,101,32,58,96,26,65,4,4,99,108,111,115,101,65,
+4,64,126,231,172,0,1,95,54,103,125,2,54,51,32,64,62,160,87,129,
+192,7,116,111,70,117,110,80,116,114,64,50,129,95,80,244,0,90,68,254,
+167,3,65,56,103,220,68,13,66,128,118,76,67,115,96,233,224,9,1,96,
+29,110,185,138,140,161,224,152,36,101,1,0,50,96,133,65,240,0,58,96,
+6,129,6,0,58,98,137,129,177,225,180,4,67,123,117,75,75,26,229,21,
+2,171,156,230,247,8,68,6,0,53,231,119,0,0,53,100,148,0,54,89,
+75,234,87,1,67,92,113,166,131,70,198,190,79,148,0,54,121,191,1,95,
+54,205,164,0,58,99,38,165,231,0,80,134,8,0,95,106,50,160,5,102,
+18,0,58,96,47,228,135,0,231,9,4,0,54,146,5,103,124,226,41,4,
+97,141,119,89,135,118,224,55,6,90,112,224,177,1,228,80,0,162,164,0,
+95,204,155,0,58,96,177,79,83,4,79,46,112,101,114,93,91,4,73,79,
+32,94,38,162,3,64,31,0,54,96,31,6,102,112,102,105,110,32,58,64,
+118,128,14,2,110,101,119,64,14,130,1,8,94,97,100,100,95,70,73,76,
+69,64,18,130,2,96,18,3,117,116,102,56,64,18,207,212,1,95,52,67,
+243,64,166,64,89,187,119,229,45,7,137,89,126,132,160,213,158,144,129,65,
+235,31,3,3,79,32,35,49,79,227,101,205,224,26,10,0,57,199,178,224,
+27,8,74,135,224,26,11,229,3,1,1,119,43,234,70,0,142,1,228,166,
+4,98,144,1,95,54,100,236,225,96,3,194,19,226,105,8,0,58,98,134,
+103,18,1,49,52,99,66,0,58,96,61,163,21,192,233,106,100,102,134,1,
+95,52,115,226,192,6,130,247,96,118,0,58,96,6,100,174,70,55,1,32,
+58,96,160,97,95,246,84,0,166,209,138,221,246,115,10,166,47,77,250,171,
+1,224,47,2,130,24,77,21,104,195,1,54,51,204,0,171,35,71,15,99,
+228,132,105,236,151,0,67,240,97,42,199,66,66,105,0,52,66,219,170,31,
+0,67,123,74,156,3,160,18,2,58,54,52,232,60,0,118,15,182,156,64,
+24,168,67,2,53,49,55,64,4,0,56,64,255,99,143,0,53,83,76,160,
+11,1,54,50,160,80,3,95,54,51,48,160,90,65,152,0,49,192,33,0,
+58,96,6,182,38,70,54,1,95,53,83,19,0,58,64,34,128,22,92,1,
+66,97,0,66,99,94,0,53,117,95,0,54,77,220,2,53,57,56,78,30,
+75,51,169,249,67,130,0,53,65,208,0,80,64,165,166,236,155,196,96,246,
+115,170,67,168,236,100,1,98,216,96,84,64,184,123,22,224,23,7,160,76,
+135,23,227,176,0,128,27,205,69,192,24,192,52,1,95,54,101,67,96,21,
+83,83,129,131,102,140,2,32,61,61,75,103,97,29,85,125,0,54,68,106,
+226,216,1,2,98,105,110,182,6,224,61,1,175,80,235,229,0,234,146,2,
+65,0,0,51,225,0,0,96,102,234,179,5,79,64,227,131,0,0,53,224,
+172,0,1,80,32,160,12,225,30,0,224,213,1,241,150,4,65,138,211,204,
+85,158,96,33,119,248,0,56,70,205,192,195,200,52,64,204,224,43,2,0,
+50,64,121,9,95,52,57,57,32,95,56,32,95,52,70,195,128,38,131,34,
+77,117,78,139,98,96,103,43,75,15,130,13,0,53,85,239,1,95,54,69,
+147,0,58,65,239,160,22,98,3,0,50,116,49,66,162,225,116,0,64,18,
+0,54,161,192,100,177,2,51,57,52,64,23,131,61,196,24,157,193,1,95,
+53,134,190,0,58,96,93,195,227,185,50,0,83,180,40,78,86,2,67,32,
+60,88,149,64,43,224,25,12,104,0,149,127,207,251,160,25,96,232,97,189,
+155,70,225,248,0,98,105,194,153,233,109,0,160,43,96,131,226,41,6,64,
+99,160,48,128,36,192,202,96,194,96,0,224,129,12,166,152,224,85,14,101,
+13,224,85,9,98,50,224,144,22,65,14,224,58,21,224,145,1,225,45,4,
+100,82,224,171,12,96,202,224,112,16,99,43,224,171,45,101,156,224,171,21,
+224,59,16,106,167,224,59,9,144,209,160,0,165,248,98,86,0,58,96,6,
+226,77,0,112,155,71,23,98,142,66,149,229,139,0,96,107,66,185,70,116,
+193,207,136,172,160,159,0,50,67,84,128,17,2,64,75,51,64,116,232,203,
+2,102,24,108,230,224,23,0,224,24,0,224,93,0,118,239,224,99,6,224,
+86,4,233,24,0,224,142,13,1,51,49,224,47,7,224,24,2,0,53,76,
+229,160,21,161,1,133,204,64,6,208,192,165,72,67,243,129,85,65,15,105,
+229,0,56,100,21,224,187,0,128,131,67,13,128,17,96,104,224,91,0,96,
+86,198,12,0,85,227,30,13,164,215,192,31,107,74,0,50,77,1,224,24,
+0,229,181,7,147,150,96,91,132,221,0,80,170,250,173,123,2,95,53,52,
+68,192,79,151,90,18,0,53,138,30,81,179,128,19,233,171,0,172,96,96,
+14,159,153,96,66,224,63,2,4,95,51,52,49,32,188,158,64,247,202,220,
+224,10,1,0,58,96,172,230,237,4,230,79,14,131,53,248,77,1,255,95,
+0,108,247,115,51,227,224,2,160,27,97,22,160,49,141,4,230,32,7,0,
+53,241,60,1,224,119,13,160,229,231,21,2,225,84,10,79,110,160,0,109,
+60,0,58,71,253,99,16,69,203,2,95,54,50,116,99,64,80,64,19,229,
+200,5,133,187,0,58,96,35,96,49,72,46,0,53,116,167,128,10,116,116,
+160,10,64,152,160,10,97,106,64,10,0,54,109,147,128,10,93,219,1,95,
+54,171,82,96,135,177,47,0,53,112,203,74,120,1,95,54,66,25,0,58,
+96,36,137,246,224,142,0,1,52,53,161,173,230,91,4,128,58,114,203,128,
+243,64,20,236,167,3,224,43,9,64,214,224,43,9,161,146,224,25,1,224,
+18,1,0,54,85,218,105,53,165,219,0,58,96,165,251,112,6,72,7,123,
+112,96,38,224,188,6,129,54,0,57,64,193,100,251,96,11,131,194,67,114,
+224,40,5,224,55,11,113,77,160,10,163,59,224,39,3,1,56,55,194,202,
+224,196,7,207,89,130,90,191,148,128,77,84,135,227,54,0,224,68,6,224,
+66,2,237,177,0,0,58,97,59,224,217,7,64,145,64,67,224,199,5,225,
+173,4,224,74,12,235,216,0,224,74,5,70,1,224,74,6,0,49,104,0,
+224,18,1,128,94,224,233,8,225,171,2,1,95,54,145,224,96,105,66,87,
+225,171,2,0,80,66,95,64,30,171,251,100,170,0,85,96,20,222,86,224,
+146,2,0,56,110,64,113,76,1,95,54,95,243,225,73,6,183,137,232,239,
+5,1,48,48,224,53,4,144,157,247,119,12,1,95,39,234,84,3,224,205,
+10,136,102,170,31,0,58,99,66,192,183,138,38,64,20,131,70,81,249,2,
+95,49,53,119,21,125,182,224,185,6,1,95,51,64,61,64,47,210,65,1,
+95,51,75,212,114,47,232,160,5,224,18,6,65,179,247,211,0,168,52,114,
+74,231,211,4,231,152,2,233,66,2,224,10,2,253,253,0,128,66,64,20,
+224,29,1,224,75,4,233,6,2,233,141,4,224,151,6,65,40,101,0,234,
+20,5,224,50,1,224,60,2,224,39,6,67,133,224,39,12,65,31,131,220,
+225,79,3,127,221,225,79,2,139,4,106,234,0,58,97,92,224,47,7,64,
+186,1,95,54,65,19,0,58,96,38,211,22,71,203,0,95,84,203,0,49,
+80,34,0,35,114,171,1,67,32,224,17,1,1,64,35,120,123,0,58,96,
+58,225,164,17,96,249,233,140,14,224,244,3,233,56,14,224,34,2,0,58,
+96,171,160,190,66,220,80,137,1,35,49,85,65,64,199,103,104,0,54,141,
+251,64,244,224,199,14,110,193,224,199,5,0,49,101,45,0,58,96,59,224,
+200,2,226,51,5,224,146,11,0,58,96,117,224,251,22,224,18,5,65,245,
+224,18,6,66,66,226,83,26,224,10,13,226,44,31,0,58,98,24,228,51,
+5,1,54,48,79,69,99,196,161,82,99,249,138,219,0,79,246,47,2,1,
+46,46,67,251,224,17,3,1,58,58,128,17,2,79,32,35,83,164,71,251,
+96,12,90,2,224,12,0,0,49,71,27,128,13,224,57,1,1,60,45,224,
+75,7,1,45,62,224,75,1,224,48,0,96,62,189,183,224,44,3,0,61,
+96,44,200,107,128,0,229,184,5,0,54,141,177,224,20,5,79,234,129,5,
+132,81,100,150,65,103,100,150,64,49,161,197,228,250,11,22,33,64,35,36,
+37,38,63,43,46,47,60,61,62,63,92,92,92,94,92,124,58,45,126,64,
+136,0,58,97,62,142,88,229,140,2,100,97,137,103,0,82,79,39,195,4,
+224,37,3,133,125,229,78,9,229,67,2,71,129,224,91,8,170,95,144,138,
+239,213,2,118,146,235,147,1,66,20,105,220,192,31,224,161,10,128,24,70,
+106,98,127,230,185,4,224,151,17,239,234,1,161,236,96,170,231,36,10,0,
+56,73,95,65,74,224,72,4,74,160,65,141,2,67,32,79,224,62,0,105,
+134,193,150,64,36,65,150,96,37,225,150,18,8,44,59,40,41,91,93,123,
+125,96,97,136,96,105,231,166,10,122,133,0,75,126,27,225,1,3,0,89,
+96,238,72,181,0,64,234,72,1,224,58,6,126,7,231,225,5,65,54,65,
+104,231,89,2,0,35,112,186,108,50,0,52,85,46,161,238,234,158,7,224,
+91,15,193,23,152,45,225,91,4,224,18,1,0,53,96,46,161,148,146,14,
+132,66,129,220,204,72,249,74,0,0,50,67,217,167,247,187,134,225,131,9,
+0,53,80,90,195,73,130,54,96,6,0,95,113,193,225,236,0,0,95,138,
+83,0,58,107,53,193,163,132,103,64,20,228,85,8,129,117,66,164,225,58,
+5,64,194,0,85,96,179,150,231,162,86,97,150,1,53,51,81,106,122,21,
+108,41,128,200,224,201,8,137,145,226,200,5,224,109,0,121,25,227,243,5,
+226,175,0,64,168,227,248,2,66,251,128,189,175,111,225,225,10,233,61,7,
+161,54,224,95,1,0,67,123,237,206,131,224,146,4,235,25,5,226,51,11,
+166,133,224,20,6,128,243,224,20,5,0,49,160,108,224,21,6,136,213,224,
+21,8,102,75,224,21,8,70,229,224,21,9,224,109,11,96,230,226,224,8,
+128,85,225,17,4,129,115,194,235,225,21,0,193,163,224,17,3,175,138,224,
+17,1,162,204,224,17,2,104,158,224,35,5,224,34,8,129,204,224,17,3,
+132,194,224,17,3,224,88,8,134,252,224,16,2,98,203,225,163,9,77,111,
+107,190,224,95,8,229,21,5,108,122,219,211,128,18,226,190,5,168,89,1,
+53,56,96,45,1,50,49,79,36,111,245,7,51,49,53,32,95,50,56,54,
+64,27,169,191,227,147,9,0,56,78,88,80,90,182,232,224,171,12,100,62,
+132,213,226,102,23,117,134,224,20,8,128,167,224,20,6,226,35,11,124,96,
+224,20,8,226,55,11,110,32,224,20,7,125,168,224,20,8,65,234,224,20,
+8,226,118,11,93,203,224,20,9,224,209,11,94,195,224,20,9,224,209,11,
+106,44,224,20,8,224,209,11,112,139,224,20,7,0,56,224,209,11,0,56,
+224,209,11,97,255,224,20,8,224,209,11,0,56,224,209,11,0,56,224,209,
+11,111,0,224,20,8,224,209,11,98,97,224,20,8,224,209,11,107,195,224,
+20,8,224,209,11,228,26,12,98,166,224,20,8,228,47,11,110,126,228,47,
+10,227,249,8,156,217,224,17,3,82,219,224,17,6,227,215,8,146,101,224,
+17,4,144,46,224,17,3,143,1,224,17,3,228,155,8,166,246,224,17,3,
+228,84,8,80,91,224,17,6,228,138,9,228,192,9,224,179,8,135,88,224,
+17,4,224,179,8,111,86,224,17,5,224,179,8,229,26,10,229,97,26,229,
+62,9,224,178,8,229,61,15,224,16,1,224,175,8,224,174,8,224,173,8,
+225,96,9,224,153,8,224,16,7,128,169,103,210,2,48,32,79,179,133,0,
+48,160,29,3,95,53,57,49,236,32,2,2,83,79,72,112,168,224,79,7,
+224,47,17,224,46,8,128,178,0,79,224,98,16,2,78,85,76,224,51,7,
+96,161,224,49,17,2,83,84,88,224,49,7,96,245,224,49,17,0,69,224,
+49,9,97,56,224,49,18,1,79,84,224,49,7,96,200,224,49,18,1,78,
+81,224,49,7,97,190,224,49,17,2,65,67,75,224,49,7,98,1,224,49,
+17,1,66,69,225,43,8,98,68,224,49,18,0,83,224,48,7,98,134,224,
+48,17,0,72,224,247,8,98,200,224,48,17,1,76,70,225,242,8,225,191,
+22,0,86,224,98,8,131,79,224,49,17,0,70,224,99,9,225,241,22,1,
+67,82,224,49,8,225,241,22,1,83,73,224,49,8,225,191,22,2,68,76,
+69,224,50,8,225,192,22,2,68,67,49,224,50,8,225,193,22,2,68,67,
+50,224,50,8,225,195,22,2,68,67,51,224,50,8,225,197,22,2,68,67,
+52,224,50,7,133,134,224,50,17,1,78,65,226,190,8,133,203,225,99,18,
+1,89,78,224,50,8,227,186,24,0,66,224,50,8,225,201,22,1,67,65,
+224,101,9,227,188,23,0,77,224,49,8,225,252,22,1,83,85,224,151,9,
+225,252,22,2,69,83,67,224,50,8,225,252,22,0,70,227,190,8,135,172,
+224,49,17,0,71,224,49,9,225,250,22,0,82,224,49,8,136,52,224,49,
+17,0,85,224,49,9,225,248,23,0,80,224,49,8,225,247,22,0,68,228,
+234,9,0,49,129,45,242,174,5,224,0,17,238,95,11,245,236,0,111,64,
+242,13,13,1,83,39,253,46,1,123,196,190,109,224,75,0,144,36,125,212,
+0,85,210,143,224,19,0,187,247,112,67,233,177,2,201,172,143,162,242,61,
+14,82,59,64,0,80,170,0,58,65,14,64,161,0,80,160,98,147,0,125,
+81,0,90,160,4,112,95,0,53,113,117,71,203,192,217,146,60,79,116,109,
+110,76,56,0,95,149,221,3,49,49,52,49,101,107,3,95,51,54,48,225,
+108,3,30,97,116,97,46,67,104,97,114,46,99,104,114,58,32,105,110,118,
+97,108,105,100,32,99,111,100,101,112,111,105,110,116,97,137,77,117,0,49,
+79,231,74,250,79,231,3,50,56,55,32,96,19,150,98,96,9,224,98,1,
+0,58,109,153,214,55,237,243,2,249,195,13,253,225,26,0,58,110,46,124,
+56,90,193,85,42,3,95,53,54,51,64,5,76,242,2,95,53,54,96,5,
+76,233,75,47,107,51,0,56,66,94,142,62,0,53,108,48,1,95,53,108,
+34,224,13,1,67,231,0,73,96,214,0,54,160,214,1,49,54,64,4,0,
+55,125,139,181,142,0,58,96,39,224,29,0,2,51,52,48,224,29,6,188,
+183,224,59,1,1,95,49,78,46,0,58,96,102,64,25,0,54,78,199,77,
+69,1,95,53,77,54,1,95,53,77,39,1,95,53,77,24,1,95,53,77,
+9,1,95,53,76,250,1,95,55,110,211,96,176,0,55,97,16,64,10,0,
+58,96,6,83,189,158,48,224,5,2,160,78,145,57,162,224,128,6,0,58,
+96,80,224,52,27,224,59,2,0,58,96,139,224,52,20,224,98,2,160,59,
+0,58,96,198,224,52,27,224,112,2,0,58,97,1,116,145,0,66,98,221,
+191,189,87,126,0,64,96,19,211,136,191,209,2,95,53,53,140,245,84,23,
+117,138,99,155,67,4,67,134,66,225,64,20,160,38,98,47,64,123,97,124,
+65,84,78,236,1,95,53,78,221,0,58,97,136,223,224,0,51,111,47,128,
+31,0,58,96,31,192,148,243,198,2,228,10,0,116,23,98,239,99,220,0,
+53,112,20,192,13,1,51,50,85,89,111,1,128,127,130,22,84,24,226,26,
+2,96,25,218,107,96,84,99,208,0,66,66,242,226,64,7,196,23,160,4,
+1,83,32,68,27,224,48,32,193,90,132,59,246,216,5,224,208,1,1,67,
+39,69,28,244,181,4,224,238,3,64,97,65,31,112,233,97,96,97,78,125,
+177,64,0,0,75,99,193,160,60,160,108,128,111,164,235,160,114,215,97,64,
+88,192,25,160,121,224,115,22,224,113,5,224,111,3,224,49,17,113,25,224,
+0,4,0,58,100,37,193,245,1,53,54,87,80,0,53,96,37,160,16,3,
+57,32,95,50,86,126,3,95,50,56,53,68,59,0,50,82,194,132,219,5,
+53,55,48,32,95,50,79,159,205,62,64,114,68,19,224,155,5,0,58,96,
+119,129,242,2,52,32,75,66,146,0,58,64,59,128,118,0,89,193,111,98,
+177,225,174,1,230,78,3,192,21,162,217,224,29,0,160,165,248,54,2,0,
+58,64,177,128,88,69,43,229,208,4,16,102,111,108,100,108,49,58,32,101,
+109,112,116,121,32,108,105,115,197,194,0,53,82,133,0,58,64,252,224,146,
+4,0,83,226,1,4,96,91,131,58,118,97,199,3,65,200,240,135,0,98,
+229,97,13,248,123,1,192,189,119,80,163,157,133,255,64,182,1,95,50,138,
+82,228,31,0,97,59,69,237,162,74,130,32,5,95,57,56,32,95,49,147,
+178,66,109,224,13,1,96,151,0,54,228,105,8,227,137,3,133,154,64,83,
+128,231,165,181,1,54,54,102,14,68,91,0,80,187,198,214,108,64,15,64,
+9,200,28,2,95,51,50,69,170,96,77,0,58,96,6,96,110,98,33,134,
+113,0,50,96,89,195,192,0,73,195,49,135,157,227,125,4,128,113,230,51,
+2,96,153,228,7,1,128,209,165,218,131,28,64,59,163,69,250,139,2,68,
+255,193,157,97,92,229,44,3,226,255,0,192,86,194,215,184,216,129,39,131,
+146,128,15,133,35,130,246,0,53,71,196,128,155,99,219,130,223,121,45,162,
+149,161,25,224,46,1,224,102,0,160,44,228,59,3,224,184,11,224,134,15,
+229,172,0,224,137,8,192,90,224,134,27,224,181,2,225,11,3,224,73,0,
+161,11,65,217,1,51,57,227,35,2,6,92,34,47,118,97,114,47,67,42,
+31,101,114,115,47,122,50,47,56,52,112,116,102,51,98,120,55,104,53,52,
+48,112,107,110,99,121,48,121,50,120,112,99,48,12,48,48,48,103,110,47,
+84,47,109,104,115,105,110,64,13,14,48,48,57,57,57,53,46,104,115,92,
+34,44,53,52,58,141,212,0,58,98,32,104,159,104,160,68,19,0,58,96,
+154,163,72,97,187,129,19,254,105,0,99,34,96,23,202,46,67,88,164,101,
+226,19,0,64,41,228,54,4,133,4,128,5,227,253,8,19,105,109,112,111,
+115,115,105,98,108,101,58,32,120,115,32,62,61,32,121,115,96,161,2,75,
+50,32,225,4,78,3,57,48,58,54,132,98,0,64,97,221,130,159,128,226,
+226,164,0,228,12,3,2,85,32,65,129,219,228,11,0,1,53,57,251,66,
+0,229,5,0,200,68,90,192,229,100,0,197,18,224,80,12,99,22,224,80,
+8,97,254,96,69,65,166,64,24,166,7,98,154,0,80,64,172,2,95,49,
+57,91,28,101,227,107,34,132,150,196,180,196,156,224,37,1,64,106,224,14,
+3,228,183,1,1,95,50,180,176,0,58,96,114,164,63,65,227,0,85,231,
+176,22,166,198,96,172,68,178,229,107,8,64,82,133,153,64,140,0,51,68,
+133,167,86,66,84,227,101,3,129,116,200,172,1,52,51,108,132,134,62,160,
+120,202,162,1,53,54,196,128,96,53,76,112,0,53,94,140,75,158,137,85,
+195,130,105,103,96,179,193,127,169,166,131,213,163,243,69,18,157,109,107,126,
+1,52,48,97,118,96,17,201,156,0,58,96,7,3,10,65,32,75,65,181,
+0,58,96,84,64,13,2,50,32,58,96,114,96,25,0,75,96,25,133,29,
+2,95,53,53,75,201,131,82,67,209,227,82,2,164,102,129,200,230,163,9,
+162,55,230,165,8,226,145,15,97,89,64,110,162,60,231,146,1,68,105,102,
+42,232,252,0,226,233,46,224,91,0,226,233,9,224,95,4,226,233,32,224,
+80,1,130,60,134,218,0,58,96,24,226,233,6,130,215,226,214,0,101,48,
+231,113,2,224,11,3,0,58,96,71,1,10,65,77,224,0,58,96,147,143,
+49,2,53,52,54,65,104,64,76,109,162,64,40,232,46,2,72,84,96,87,
+232,87,0,224,200,1,72,22,98,45,1,95,51,125,181,0,64,66,183,161,
+72,198,56,162,208,225,75,0,160,7,0,83,96,167,225,73,1,104,26,128,
+240,101,243,0,53,97,127,0,80,193,31,225,15,0,224,8,0,143,13,0,
+52,225,215,0,1,51,52,174,186,64,191,0,54,192,220,240,14,7,195,247,
+238,193,0,160,127,233,206,1,162,128,238,209,4,233,201,3,200,31,169,74,
+195,59,97,231,0,52,73,187,73,199,220,163,224,69,16,129,80,240,57,12,
+160,27,112,62,64,92,163,150,2,66,32,95,73,94,234,50,2,93,14,131,
+41,241,118,0,253,113,6,205,15,164,48,240,246,5,0,58,111,187,144,91,
+225,175,0,235,241,1,167,235,163,125,225,111,4,65,144,129,111,128,73,224,
+62,48,129,241,224,62,48,161,48,194,97,129,141,226,121,2,224,60,21,165,
+154,2,52,54,50,231,65,2,15,118,97,108,68,105,103,58,32,66,97,100,
+32,98,97,115,101,135,5,0,83,98,226,64,49,64,9,99,186,67,139,126,
+206,0,49,69,112,0,35,98,254,190,224,96,17,87,56,97,29,68,192,224,
+49,11,190,106,224,49,3,126,20,72,216,70,177,67,5,66,178,203,67,156,
+78,198,179,134,163,95,56,128,5,128,78,250,185,0,224,61,39,131,189,224,
+61,12,224,48,13,238,47,0,66,246,224,231,0,2,95,53,52,71,48,224,
+192,9,224,68,23,225,36,15,165,235,225,36,3,133,12,224,99,41,132,38,
+0,58,67,164,164,219,224,109,27,102,224,0,58,96,214,179,133,130,7,224,
+127,39,0,58,97,37,70,250,227,240,6,254,32,8,128,131,224,20,5,77,
+38,224,20,8,147,152,224,21,7,255,155,12,0,49,102,30,254,118,7,127,
+9,254,118,9,253,104,10,224,17,8,128,212,224,16,19,132,25,224,16,7,
+1,58,53,79,133,207,181,229,156,7,227,189,5,181,184,230,64,1,134,92,
+128,11,134,97,144,137,166,109,224,35,5,236,184,3,231,206,2,240,105,6,
+0,39,68,19,224,21,2,224,66,0,100,75,227,58,2,189,120,230,194,0,
+235,241,0,70,216,64,66,137,34,241,207,2,96,4,66,23,0,48,197,114,
+0,89,160,93,102,252,97,135,70,42,134,179,97,15,192,41,198,10,146,182,
+226,89,3,192,134,225,87,1,128,119,66,136,1,52,57,110,247,0,49,64,
+9,179,51,224,23,1,161,109,128,25,1,95,52,80,49,64,0,70,146,0,
+50,224,48,1,96,139,0,58,94,66,200,27,113,65,226,51,1,3,64,58,
+53,51,203,110,230,186,8,129,144,0,82,215,68,230,108,3,0,58,96,72,
+226,254,6,195,56,225,32,0,230,188,5,234,229,1,224,49,0,0,51,98,
+136,1,58,53,64,24,119,76,93,98,117,238,64,25,64,94,1,52,55,82,
+8,0,48,118,70,64,133,183,80,0,52,86,220,192,86,0,56,77,206,96,
+11,0,58,96,6,132,13,72,255,1,53,51,139,129,1,95,51,87,21,1,
+95,52,82,18,151,190,0,51,243,251,1,178,7,64,42,139,184,104,57,236,
+120,0,0,53,89,161,233,212,1,96,17,99,211,151,222,0,49,233,219,2,
+107,44,89,58,195,16,0,52,99,253,68,154,96,182,64,29,227,46,2,97,
+200,96,29,0,52,86,76,0,52,152,36,0,58,96,42,161,174,3,50,52,
+32,35,111,41,232,228,1,147,72,91,0,192,138,224,40,0,152,59,97,14,
+0,48,162,49,0,58,96,190,225,223,3,118,228,123,12,105,35,146,10,75,
+154,236,51,2,2,32,95,52,140,72,96,90,65,106,64,79,1,95,53,156,
+65,128,86,129,255,0,85,65,62,110,232,0,58,64,40,97,179,1,53,48,
+97,179,118,69,64,104,128,125,97,11,0,90,108,164,158,30,0,58,96,196,
+228,59,5,128,156,179,246,242,66,0,228,230,4,96,253,171,0,92,56,224,
+113,1,66,31,0,58,96,27,98,57,7,57,57,32,95,56,32,95,52,101,
+108,0,58,96,29,224,43,1,66,224,0,58,96,105,173,172,0,52,71,50,
+1,95,53,78,26,67,53,1,58,53,69,98,128,224,0,50,97,252,0,58,
+96,27,192,203,96,44,0,48,114,197,75,176,235,197,0,164,108,128,8,75,
+93,1,58,53,73,212,225,242,0,0,54,67,180,121,9,209,165,70,90,1,
+58,53,69,146,243,56,4,66,134,2,66,32,80,98,90,64,77,68,192,137,
+72,212,109,233,20,4,1,95,51,68,2,1,95,51,85,38,2,51,55,49,
+118,136,204,113,128,36,234,103,2,224,239,0,226,85,7,64,208,196,183,97,
+138,129,43,97,143,163,183,207,0,97,195,3,95,53,49,51,233,108,2,19,
+80,114,101,108,117,100,101,46,114,101,97,100,58,32,110,111,32,112,97,114,
+201,114,150,76,3,95,53,49,52,174,187,224,57,18,8,97,109,98,105,103,
+117,111,117,115,224,64,3,65,36,130,47,66,68,64,13,129,252,101,153,128,
+16,129,249,109,14,64,158,228,158,10,229,178,1,150,246,166,35,226,243,6,
+235,198,11,155,253,229,167,7,0,58,97,28,226,110,0,0,52,143,178,64,
+49,224,19,2,97,224,64,125,227,8,2,0,95,111,42,79,123,194,99,136,
+205,65,129,96,183,163,115,228,70,2,64,166,251,173,5,141,158,2,95,52,
+57,225,153,0,2,95,52,57,69,111,96,11,0,58,96,6,64,76,96,30,
+0,49,97,218,163,133,196,37,130,19,2,95,49,51,224,64,0,0,49,99,
+187,101,88,0,50,98,7,96,10,1,53,48,224,86,3,229,99,0,249,226,
+0,102,167,98,160,224,18,7,1,66,39,180,29,161,47,0,48,219,139,64,
+79,0,48,160,147,101,97,224,135,0,134,108,197,247,192,135,128,10,96,251,
+133,176,64,6,225,42,0,0,51,225,42,0,142,21,64,12,225,30,5,96,
+85,161,30,132,175,64,6,64,64,0,51,229,172,3,173,150,100,243,139,61,
+0,95,97,41,64,203,0,58,96,6,224,50,4,64,109,195,158,0,67,96,
+58,224,49,0,133,240,64,6,5,10,65,32,73,32,58,96,44,192,10,239,
+173,0,5,52,57,54,32,64,58,99,141,160,16,82,53,231,199,5,0,58,
+96,36,160,235,0,52,125,65,103,154,224,5,0,101,35,206,231,96,67,109,
+38,64,44,0,54,224,69,0,162,217,98,143,224,27,9,165,39,248,81,1,
+230,148,4,68,64,232,136,3,120,112,132,241,1,95,52,95,10,161,115,65,
+255,175,120,132,186,164,169,120,182,227,108,1,137,169,64,26,80,140,224,21,
+1,69,48,103,87,228,173,1,193,17,128,0,224,24,1,129,214,200,255,65,
+214,128,11,0,58,96,6,129,74,167,245,73,105,0,58,64,34,163,107,128,
+14,231,238,0,226,172,1,99,148,64,87,64,25,0,80,166,58,161,52,107,
+91,0,52,73,224,64,34,195,244,72,157,97,144,128,43,247,72,7,234,183,
+1,224,19,2,128,115,214,53,224,32,2,224,9,10,65,59,150,129,225,213,
+0,232,47,7,133,231,101,239,66,214,97,116,192,17,131,137,1,95,52,90,
+46,129,242,224,55,7,224,177,7,129,163,226,90,0,162,84,64,41,192,83,
+224,84,5,224,82,5,224,81,11,224,91,4,224,82,9,224,181,1,224,56,
+17,226,225,5,224,57,18,225,108,9,224,9,2,101,243,160,63,193,246,160,
+230,224,236,16,96,98,227,54,2,194,242,139,111,224,113,1,160,218,97,155,
+98,173,185,26,64,125,2,95,52,55,70,6,0,56,102,92,162,66,96,0,
+224,96,0,113,176,64,122,200,243,224,147,25,226,150,5,224,96,2,131,154,
+177,117,225,1,0,161,4,224,13,22,99,150,130,112,97,96,224,237,0,99,
+245,128,13,224,253,1,227,241,0,96,244,173,239,154,11,125,168,225,15,9,
+224,244,4,64,97,224,96,22,130,105,224,95,2,162,122,128,94,228,23,3,
+194,3,226,190,6,225,67,29,225,216,24,160,105,225,206,21,226,190,21,192,
+9,195,208,226,240,25,224,49,11,224,176,2,228,6,9,225,89,8,229,234,
+0,128,181,224,43,3,224,45,6,225,52,0,224,137,18,96,135,226,27,5,
+193,59,224,138,21,250,211,78,5,49,52,49,58,49,48,250,213,0,64,0,
+142,22,128,133,142,22,128,11,0,58,96,6,113,239,144,91,132,182,64,35,
+137,88,238,32,4,181,212,0,58,64,64,230,49,0,64,200,0,58,96,46,
+192,70,66,82,70,169,0,52,192,55,96,71,76,35,64,21,72,67,128,21,
+198,178,2,95,52,56,103,233,0,56,135,233,96,85,108,87,96,23,128,17,
+74,61,96,53,102,92,1,56,48,135,57,229,112,0,200,108,163,0,248,114,
+2,64,158,206,163,96,106,71,172,98,162,3,95,52,56,51,192,11,0,58,
+96,6,198,245,162,223,128,202,119,207,130,243,0,66,115,48,100,71,64,80,
+99,111,0,50,96,22,0,50,79,35,248,201,1,96,239,85,134,64,42,130,
+116,224,42,14,247,204,2,130,57,128,122,135,254,236,213,5,164,182,128,152,
+159,79,96,80,2,52,56,50,224,80,2,162,150,128,195,224,43,5,224,196,
+0,118,43,96,138,106,250,224,205,23,224,206,40,207,11,227,44,4,242,187,
+0,210,199,136,237,224,232,2,229,154,1,224,184,2,64,5,162,83,224,236,
+9,128,72,224,240,3,224,56,13,224,249,104,224,152,5,119,175,132,177,233,
+233,1,235,28,1,96,243,101,60,166,12,224,174,1,79,198,160,98,224,138,
+39,101,199,167,2,224,7,2,224,132,108,224,95,10,224,94,67,96,80,128,
+181,224,222,110,64,16,1,54,48,229,203,2,31,115,116,105,109,101,115,58,
+32,112,111,115,105,116,105,118,101,32,109,117,108,116,105,112,108,105,101,114,
+32,101,120,112,101,3,99,116,101,100,101,161,0,58,68,133,229,129,4,226,
+166,23,128,137,224,195,1,1,95,50,82,200,224,186,16,192,46,224,177,4,
+224,45,30,147,118,99,115,108,55,108,218,172,197,0,83,157,34,174,210,140,
+183,194,100,96,52,243,207,1,177,241,0,58,69,183,165,207,82,144,96,44,
+242,31,0,128,38,64,80,224,11,0,224,59,2,64,81,95,21,240,19,0,
+64,200,1,58,52,70,171,174,28,64,205,1,95,52,69,159,0,58,77,191,
+128,22,222,228,175,114,0,58,96,31,69,230,1,32,58,96,48,175,111,0,
+52,92,58,76,5,75,185,173,239,111,114,173,69,79,114,108,204,143,114,192,
+10,206,115,64,87,129,196,1,95,51,164,137,128,5,134,74,213,48,102,169,
+70,109,239,73,1,96,120,233,111,7,224,28,7,238,129,11,140,98,224,65,
+9,175,168,96,24,112,100,129,179,158,205,143,127,128,49,0,58,96,6,224,
+178,0,138,143,153,81,0,66,227,15,2,192,75,66,9,199,70,133,96,128,
+46,96,33,1,49,53,224,34,7,0,58,96,125,128,93,1,95,50,104,59,
+96,121,136,115,64,6,110,71,0,58,96,67,114,184,128,1,120,162,1,64,
+58,96,199,210,193,224,4,3,158,44,128,205,0,58,97,4,1,10,65,194,
+14,0,58,97,37,96,76,224,55,6,224,85,0,206,255,224,85,6,224,34,
+3,232,6,1,235,43,2,237,99,2,64,240,254,222,0,97,114,131,140,131,
+188,160,14,0,85,164,101,160,38,230,238,3,168,244,0,67,129,146,98,115,
+128,64,112,216,130,76,64,17,97,59,1,54,48,65,34,207,117,0,58,85,
+35,64,10,196,187,128,145,193,227,0,90,179,170,140,33,199,83,96,31,96,
+42,64,22,96,10,160,141,251,34,5,87,246,130,71,133,49,225,26,1,96,
+214,64,85,2,95,52,53,237,161,0,224,38,10,224,123,2,64,195,193,227,
+229,24,6,15,105,110,105,116,58,32,101,109,112,116,121,32,108,105,115,116,
+101,4,68,77,225,84,0,224,122,4,193,48,224,123,1,0,58,96,9,97,
+198,231,233,0,2,115,101,113,192,221,128,19,224,16,2,228,75,11,64,68,
+234,176,0,86,22,0,56,161,6,246,38,5,224,181,1,3,35,108,105,110,
+181,109,64,24,101,45,0,56,224,213,2,8,123,45,35,32,76,73,78,69,
+32,96,35,65,49,106,136,66,31,93,22,81,113,65,187,1,95,52,125,107,
+224,88,2,3,32,35,45,125,128,87,2,58,52,53,196,204,225,12,2,67,
+20,180,220,234,207,1,64,86,64,72,195,109,2,95,52,53,68,149,149,164,
+128,15,67,145,96,15,0,58,96,41,96,86,242,126,0,225,104,1,207,155,
+98,71,242,66,0,0,58,64,63,225,29,0,0,49,64,151,2,95,52,53,
+68,53,97,228,1,51,32,224,192,3,9,94,41,94,42,94,43,94,44,94,
+45,166,207,64,118,224,111,7,158,202,230,43,1,64,85,110,169,248,189,3,
+96,60,130,250,102,159,64,26,1,52,53,153,186,85,253,1,95,50,66,84,
+0,58,96,137,67,30,1,54,54,130,132,130,230,233,237,0,2,67,32,60,
+93,201,111,56,224,26,12,123,179,224,26,14,97,158,224,26,13,98,219,227,
+122,0,224,26,4,160,221,0,85,65,146,64,226,68,44,1,61,61,192,25,
+160,254,99,224,195,32,224,44,12,161,17,224,44,8,224,117,14,97,52,224,
+72,12,156,77,224,117,30,134,236,224,117,10,225,7,14,98,58,224,145,13,
+176,172,224,100,10,135,70,224,145,30,109,157,225,7,33,98,180,224,72,12,
+103,166,224,117,31,66,21,225,7,13,226,97,14,194,16,225,35,10,105,56,
+224,173,13,187,194,224,128,10,98,233,224,173,31,111,201,225,35,32,79,124,
+224,72,13,96,25,224,117,31,96,242,226,43,16,96,118,225,34,5,195,78,
+224,145,10,226,189,16,96,25,224,145,32,226,189,16,224,45,12,226,134,15,
+225,200,15,96,164,225,253,13,97,199,224,26,13,98,144,224,245,13,165,119,
+224,154,10,226,244,15,224,44,12,226,216,15,224,117,14,100,240,224,72,12,
+226,244,15,224,44,12,226,160,15,225,7,14,98,115,224,144,13,99,31,224,
+99,12,226,215,15,224,44,11,226,186,15,224,116,13,96,29,224,70,11,226,
+212,15,224,43,11,226,155,15,225,3,15,194,10,224,25,9,198,159,224,168,
+9,99,52,224,124,11,226,235,15,224,43,11,226,233,16,224,114,12,226,150,
+16,226,149,35,226,148,16,228,28,14,225,0,16,226,174,16,226,173,36,228,
+24,35,229,77,16,111,10,0,50,105,77,142,64,64,6,174,113,64,46,1,
+95,54,74,46,141,80,0,53,138,242,239,33,2,0,85,233,108,0,128,5,
+64,0,64,119,192,239,114,23,128,136,0,64,233,150,1,128,17,96,32,251,
+246,5,173,149,244,206,1,0,58,96,131,105,168,64,182,234,49,0,3,95,
+52,52,55,96,224,138,134,96,61,0,35,79,222,192,53,205,94,233,162,1,
+235,165,5,86,131,1,114,49,235,167,8,65,60,129,197,64,140,160,14,141,
+147,224,10,3,64,121,192,105,202,211,105,209,2,49,32,95,135,220,1,52,
+52,216,90,125,205,136,83,236,255,0,1,52,54,193,99,78,56,72,160,0,
+58,96,48,207,252,206,45,86,21,192,103,252,195,0,224,29,0,224,31,2,
+64,32,0,51,192,83,93,219,0,52,98,29,110,152,2,58,52,52,207,8,
+1,54,51,74,151,0,48,97,48,124,240,64,38,206,48,0,85,96,16,129,
+226,6,95,49,51,54,32,75,32,130,68,0,66,121,232,175,182,0,51,136,
+21,161,13,98,29,0,49,236,40,3,4,32,32,97,116,32,76,76,0,32,
+215,159,192,66,128,63,1,49,51,76,127,134,38,129,31,224,66,9,2,99,
+111,108,192,61,130,76,224,57,8,66,75,0,55,65,218,224,61,9,13,94,
+42,32,32,32,32,117,115,101,100,32,98,121,32,160,71,128,60,1,52,51,
+101,177,192,0,2,95,49,52,76,85,96,20,2,95,49,52,81,38,96,11,
+0,58,96,6,141,219,98,114,226,104,1,162,168,165,197,0,52,119,139,64,
+47,130,110,64,47,65,87,1,75,50,204,17,2,58,52,51,130,31,111,249,
+2,58,52,51,129,248,0,80,77,125,1,75,32,249,30,78,3,55,57,58,
+49,205,114,0,51,130,85,95,145,163,245,64,8,192,155,130,83,3,75,32,
+58,52,83,20,120,121,0,50,81,13,83,149,1,58,52,67,79,152,141,127,
+17,64,61,2,95,52,51,96,249,1,51,50,76,186,64,38,89,227,68,61,
+192,11,66,124,96,11,0,58,96,6,194,75,131,130,225,168,4,10,69,120,
+105,116,83,117,99,99,101,115,115,128,173,161,235,0,52,115,237,6,32,95,
+49,56,50,32,95,83,18,231,78,1,225,237,9,64,68,5,70,97,105,108,
+117,114,174,189,224,36,1,0,79,132,17,148,207,3,95,49,51,56,162,61,
+168,217,226,0,2,165,28,98,0,145,192,64,6,115,69,102,214,193,245,67,
+28,178,63,160,16,128,73,0,58,96,178,97,42,0,57,65,104,0,51,78,
+157,1,51,50,228,111,3,6,83,121,115,116,101,109,46,64,174,64,167,224,
+192,5,2,67,111,100,128,189,96,171,0,58,97,105,180,54,0,83,66,120,
+209,108,68,107,0,58,65,161,64,29,224,66,1,6,49,46,50,48,46,57,
+34,96,27,130,95,1,95,52,97,159,110,76,76,153,177,82,3,39,32,95,
+48,228,139,0,0,52,64,87,78,238,76,23,129,97,0,58,64,54,128,121,
+2,95,51,57,228,203,1,64,33,0,58,96,47,110,185,101,32,134,238,132,
+245,78,199,179,90,2,95,51,57,64,78,5,50,48,57,53,49,48,64,61,
+4,35,53,53,50,57,103,240,99,69,1,52,48,112,37,0,48,101,170,70,
+157,1,95,52,75,233,1,95,52,108,28,224,211,1,17,104,80,117,116,67,
+104,97,114,58,32,115,117,114,114,111,103,97,116,161,223,1,95,51,74,227,
+0,58,96,147,98,216,105,226,0,73,96,18,245,144,1,64,105,132,168,250,
+239,1,224,9,5,99,203,0,52,76,28,2,95,50,48,64,187,65,123,1,
+95,51,194,198,130,193,64,154,224,81,0,64,1,149,193,164,252,192,14,224,
+11,2,192,8,209,132,64,95,97,143,3,49,55,32,58,96,145,96,13,67,
+99,75,216,0,58,64,23,227,99,3,0,48,114,9,139,197,131,99,139,255,
+131,99,192,11,67,99,96,11,0,58,96,6,227,99,1,115,38,128,1,102,
+167,104,125,246,189,1,224,5,0,97,182,161,148,64,11,64,174,144,199,73,
+254,128,19,96,31,131,54,0,52,139,142,227,121,5,0,58,229,162,1,230,
+25,2,224,36,15,193,27,229,206,0,67,90,130,57,0,51,85,11,65,125,
+224,72,28,128,162,192,185,209,108,224,171,3,98,222,224,94,10,230,106,12,
+0,40,196,122,224,122,7,0,79,131,221,185,13,224,118,1,228,53,0,205,
+106,68,53,96,11,0,58,96,6,231,60,1,67,68,64,78,0,85,254,52,
+1,236,54,1,224,18,6,96,180,224,19,7,64,212,242,188,0,160,19,97,
+159,236,107,6,66,231,0,85,244,129,4,5,116,101,114,114,117,112,217,129,
+224,28,4,14,114,101,115,111,117,114,99,101,32,118,97,110,105,115,104,192,
+34,224,35,4,89,218,1,111,117,201,17,224,110,7,64,235,224,45,3,20,
+117,110,115,117,112,112,111,114,116,101,100,32,111,112,101,114,97,116,105,111,
+110,224,120,9,12,104,97,114,100,119,97,114,101,32,102,97,117,108,192,91,
+224,243,8,67,119,224,243,7,147,151,224,132,5,150,132,224,243,3,14,97,
+112,112,114,111,112,114,105,97,116,101,32,116,121,112,164,46,224,35,5,12,
+118,97,108,105,100,32,97,114,103,117,109,101,110,192,131,224,34,3,3,102,
+97,105,108,225,18,0,224,115,7,151,255,224,44,1,4,112,114,111,116,111,
+72,171,4,101,114,114,111,114,224,111,9,0,115,101,243,224,29,3,224,240,
+9,225,247,10,225,246,10,225,245,10,225,244,7,21,117,110,115,97,116,105,
+115,102,105,101,100,32,99,111,110,115,116,114,97,105,110,116,167,89,224,40,
+4,0,115,91,161,224,147,2,224,210,4,13,101,114,109,105,115,115,105,111,
+110,32,100,101,110,105,225,10,15,226,2,7,6,105,108,108,101,103,97,108,
+225,254,19,9,101,110,100,32,111,102,32,102,105,108,161,153,224,247,8,225,
+230,10,225,229,7,226,188,0,5,101,120,104,97,117,115,226,224,21,3,98,
+117,115,121,225,201,14,224,86,6,10,100,111,101,115,32,110,111,116,32,101,
+120,236,8,0,224,31,3,6,97,108,114,101,97,100,121,128,30,161,82,128,
+0,196,11,174,69,100,11,64,11,0,58,96,6,196,11,2,95,51,49,96,
+37,64,206,74,73,0,55,64,136,1,95,52,71,31,236,31,3,247,116,8,
+5,72,97,110,100,108,101,150,118,1,95,49,134,2,204,227,192,109,140,80,
+64,6,228,121,4,228,233,8,1,48,120,128,183,103,131,0,55,134,108,105,
+208,137,91,1,95,52,169,21,192,209,174,137,96,99,141,253,64,6,7,10,
+65,32,116,111,73,110,116,70,204,201,221,110,60,71,66,1,95,50,64,198,
+1,95,50,72,113,1,95,50,106,72,139,39,1,50,50,101,152,128,11,0,
+51,96,94,160,11,102,201,160,35,106,115,64,12,128,85,0,54,102,143,0,
+57,103,16,64,169,120,99,76,201,128,42,1,64,58,96,115,64,43,1,54,
+53,70,184,110,6,69,235,1,95,49,72,139,1,95,49,91,132,1,95,49,
+91,166,1,95,49,78,192,1,95,55,64,109,96,74,1,95,55,64,156,96,
+10,0,58,96,6,169,235,3,95,52,48,53,254,105,18,255,36,1,174,159,
+158,68,148,4,64,166,103,210,87,201,184,90,4,67,32,95,54,52,234,196,
+4,102,20,64,146,3,57,56,32,95,96,220,0,49,73,104,96,9,72,217,
+0,35,125,34,170,240,224,46,11,96,36,78,222,104,95,64,113,137,220,175,
+108,200,128,253,152,0,137,247,199,125,187,171,96,202,94,41,253,6,0,224,
+241,38,128,12,186,158,75,36,131,95,67,98,224,96,1,77,58,224,96,46,
+128,254,111,129,128,192,169,185,192,13,176,53,138,137,224,222,4,96,20,233,
+237,4,106,164,64,27,128,33,224,152,5,67,136,159,210,224,162,45,240,86,
+6,30,78,117,109,101,114,105,99,46,115,104,111,119,73,110,116,65,116,66,
+97,115,101,58,32,110,101,103,97,116,105,118,101,230,122,7,147,57,224,2,
+2,137,148,192,206,64,5,234,95,2,160,168,161,219,77,33,139,202,224,46,
+31,0,50,153,198,128,48,224,227,22,224,237,3,224,225,27,232,4,3,2,
+98,97,115,197,227,128,139,0,89,161,185,226,163,3,194,153,92,157,0,57,
+201,91,161,180,225,235,1,224,49,2,194,94,160,83,192,11,226,106,8,224,
+70,4,145,167,128,49,74,251,160,124,193,40,128,60,97,70,224,249,1,97,
+88,156,39,224,10,2,224,55,2,253,149,0,65,53,73,14,139,65,128,65,
+99,165,224,92,2,97,116,224,92,1,99,180,170,38,4,51,57,56,32,58,
+102,5,238,58,27,3,73,79,46,69,199,181,224,28,1,6,73,79,69,120,
+99,101,112,231,115,0,174,65,76,71,7,10,65,32,94,112,117,116,98,64,
+99,210,0,3,57,57,32,79,64,6,2,32,64,79,68,236,0,48,170,224,
+0,58,109,150,80,10,0,50,64,2,64,15,204,249,0,83,225,128,0,76,
+81,129,73,243,14,2,242,245,5,0,51,160,252,241,242,0,238,114,4,129,
+147,3,95,51,57,52,65,22,96,17,75,158,70,170,0,57,118,44,226,106,
+6,3,66,97,100,32,135,2,1,32,109,207,33,96,37,0,57,180,189,0,
+58,64,207,133,187,100,135,255,208,2,126,80,192,151,175,178,0,51,110,135,
+110,134,98,114,243,153,2,128,76,173,158,3,57,55,32,58,96,32,79,101,
+2,112,50,112,64,13,0,54,166,106,0,54,130,179,96,98,224,5,0,70,
+59,104,92,64,1,210,4,177,101,224,6,12,224,42,2,117,99,145,153,224,
+42,29,160,28,224,49,10,224,42,15,224,49,10,224,42,22,224,49,3,182,
+30,129,162,0,58,96,6,98,24,0,82,100,83,2,51,56,57,144,157,0,
+58,65,214,129,139,0,95,84,171,69,31,0,58,98,15,5,10,65,32,97,
+110,100,65,68,130,133,196,17,227,70,2,0,80,164,206,176,232,130,41,173,
+219,131,195,0,66,129,207,0,64,85,254,129,172,207,236,0,85,224,135,8,
+130,186,68,14,117,31,0,58,96,27,104,84,162,16,0,95,85,43,226,185,
+4,224,180,2,132,17,226,209,0,0,56,100,155,2,58,51,56,243,226,0,
+226,164,5,3,104,101,97,100,246,70,8,0,75,64,251,64,57,97,15,106,
+125,0,89,128,205,165,12,164,193,96,226,96,252,165,164,230,180,2,164,239,
+132,233,192,5,151,138,2,95,51,55,131,103,230,55,0,228,151,5,98,252,
+117,230,96,40,1,95,51,70,214,229,79,3,128,6,224,38,0,224,87,6,
+160,47,192,159,148,249,3,67,39,32,79,96,33,0,53,164,51,128,30,96,
+185,3,95,50,48,49,175,104,64,33,0,54,68,93,0,35,86,207,96,40,
+64,4,163,250,133,76,132,22,128,85,64,54,1,57,32,228,208,2,1,45,
+79,131,231,128,71,207,127,228,106,0,178,180,224,52,7,9,45,115,116,114,
+105,112,45,101,111,108,164,37,224,188,131,229,43,4,224,192,20,237,25,0,
+225,169,255,225,169,104,193,171,181,242,96,54,3,95,51,55,49,87,176,224,
+198,4,4,104,97,115,104,101,238,11,1,227,137,255,227,137,255,225,169,255,
+227,137,51,64,18,131,120,224,9,12,234,103,3,65,166,236,39,5,64,14,
+227,203,0,215,6,72,100,86,19,0,49,89,73,96,176,128,0,224,39,0,
+119,9,225,246,4,160,62,236,71,2,142,223,236,102,5,160,17,192,71,138,
+15,192,17,121,49,64,14,238,178,2,192,90,108,148,97,20,0,54,160,150,
+224,89,0,168,255,225,67,0,250,133,0,139,43,128,22,96,0,75,178,225,
+13,2,64,173,160,146,108,133,224,94,8,171,4,224,65,2,225,58,1,64,
+116,179,44,96,181,129,48,97,234,229,12,16,0,111,195,45,138,21,151,227,
+96,93,224,179,4,128,10,174,149,96,0,229,53,0,225,173,2,160,124,96,
+17,225,192,36,225,179,6,160,7,123,194,193,135,224,68,11,0,49,220,14,
+227,45,2,224,182,4,192,12,96,184,4,95,51,55,55,32,116,170,224,196,
+6,238,208,0,250,34,6,123,194,2,51,55,56,160,110,225,67,15,3,97,
+110,115,105,230,76,0,224,174,0,224,81,2,224,75,34,4,116,114,97,100,
+105,78,17,0,97,195,217,160,220,162,11,224,64,24,1,115,116,213,247,96,
+0,109,61,96,56,64,45,0,56,100,244,189,51,140,33,224,34,20,140,111,
+128,131,226,98,49,180,189,162,98,228,225,2,224,80,47,4,105,110,99,108,
+117,238,84,1,226,185,8,100,174,229,45,3,160,48,0,61,225,25,2,131,
+250,196,15,226,169,0,64,135,224,130,27,0,80,232,61,6,225,234,6,163,
+7,102,112,133,57,224,83,1,224,70,3,0,67,96,70,224,30,17,128,31,
+128,228,225,47,49,0,65,225,128,11,225,0,54,3,45,104,101,108,231,105,
+0,224,76,56,2,118,101,114,88,184,224,79,63,224,78,7,64,62,143,239,
+228,163,4,128,87,177,17,227,99,0,228,164,12,198,0,248,248,2,65,220,
+225,181,1,135,108,231,74,3,195,80,106,59,99,80,224,18,0,78,199,160,
+18,96,123,98,182,225,15,18,224,33,44,225,160,5,227,228,5,87,229,227,
+228,7,224,66,10,4,110,111,108,105,110,227,103,0,128,0,3,95,51,56,
+49,64,249,240,251,0,224,243,2,224,254,3,64,41,225,158,13,2,68,85,
+73,96,82,3,58,51,56,54,178,219,7,56,48,32,75,32,85,32,90,167,
+129,97,143,64,162,0,56,165,223,64,43,211,121,160,43,178,50,128,46,224,
+41,1,0,58,97,93,224,40,5,129,227,224,35,0,0,58,97,147,224,34,
+3,89,118,224,119,2,65,39,224,121,0,64,46,240,252,1,128,37,224,119,
+0,72,114,0,58,96,43,112,181,0,58,64,80,128,10,0,73,80,70,70,
+118,96,56,176,65,66,67,0,85,65,102,133,122,192,18,1,66,39,96,21,
+225,136,1,232,64,0,232,108,2,170,187,97,177,242,247,1,88,158,153,0,
+162,149,120,27,184,181,145,17,82,40,85,99,0,64,65,93,103,3,98,229,
+216,186,155,82,64,0,128,178,144,249,0,85,84,75,84,248,0,58,105,218,
+192,17,65,217,0,58,98,233,209,165,122,95,107,64,128,17,0,51,96,68,
+129,95,243,78,5,0,58,107,115,84,168,64,133,0,48,98,20,0,58,66,
+29,193,59,89,244,225,59,1,74,105,179,182,2,95,51,54,102,241,114,203,
+99,109,0,58,96,6,10,10,65,32,115,101,113,117,97,108,32,58,96,33,
+161,163,2,95,51,54,191,223,0,52,96,72,128,191,187,88,97,9,1,95,
+50,66,77,0,58,96,39,98,7,1,54,51,165,169,192,170,64,38,242,239,
+2,129,137,65,237,129,145,0,58,64,49,96,58,242,151,43,0,54,97,113,
+2,58,51,54,129,15,242,151,8,3,116,97,105,108,242,151,8,0,65,96,
+150,211,57,2,95,52,55,86,112,132,121,0,53,128,178,129,62,2,73,32,
+58,96,16,118,151,0,56,96,92,1,53,54,65,61,0,53,74,65,2,95,
+51,50,68,178,160,56,92,150,224,11,0,65,29,96,11,0,58,96,6,96,
+220,253,0,0,160,61,231,88,5,126,137,1,58,32,96,158,156,111,128,38,
+0,58,96,6,247,24,20,6,67,111,110,116,114,111,108,247,22,11,96,18,
+2,67,97,108,137,0,100,75,0,58,96,194,123,152,163,24,214,208,64,7,
+230,41,1,134,54,0,95,99,39,130,9,0,53,172,195,203,49,97,249,2,
+95,51,53,163,65,140,140,0,58,64,160,130,122,119,65,96,30,96,109,0,
+85,225,154,7,9,109,100,53,67,111,109,98,105,110,101,161,160,133,28,64,
+97,66,29,0,90,100,194,2,95,50,54,167,252,0,48,92,222,119,47,0,
+89,117,42,64,205,102,106,66,84,236,41,1,194,88,235,214,2,160,190,66,
+41,198,155,2,95,51,53,127,103,64,225,188,82,1,64,95,87,69,2,95,
+51,52,186,123,160,205,130,155,8,94,109,100,53,65,114,114,97,121,66,17,
+196,194,226,176,1,0,57,76,86,64,155,1,95,51,140,92,100,68,247,242,
+1,247,134,4,3,95,51,52,57,224,46,5,169,112,192,46,1,95,49,89,
+12,226,232,6,132,176,96,146,130,184,98,156,130,167,128,211,172,30,228,184,
+10,205,162,224,106,0,225,53,3,192,25,232,26,5,253,178,3,0,95,92,
+15,189,118,251,242,1,237,159,6,238,28,5,248,116,2,64,52,101,163,224,
+45,2,96,96,172,130,229,60,7,250,108,2,248,154,4,224,43,10,165,140,
+224,38,1,160,16,0,58,65,97,226,132,0,0,90,150,255,64,21,195,139,
+99,184,71,94,225,253,0,129,247,0,35,96,238,87,39,0,58,97,153,1,
+10,65,126,214,0,58,96,28,128,57,66,242,68,159,1,95,49,94,224,1,
+95,51,68,151,0,95,127,229,96,80,191,229,192,11,95,229,224,11,0,68,
+0,128,11,65,70,64,98,131,42,2,114,101,109,64,98,167,107,191,242,96,
+148,97,126,255,240,0,96,53,64,54,130,147,97,40,128,131,190,139,0,58,
+96,39,183,108,226,12,1,69,207,97,180,233,112,1,1,32,95,70,102,165,
+79,98,104,64,180,1,51,57,227,158,2,31,92,34,47,118,97,114,47,102,
+111,108,100,101,114,115,47,122,50,47,56,52,112,116,102,51,98,120,55,104,
+53,52,48,112,23,107,110,99,121,48,121,50,120,112,99,48,48,48,48,103,
+110,47,84,47,109,104,115,105,110,64,13,15,48,48,57,57,57,53,46,104,
+115,92,34,44,51,57,58,49,168,246,103,64,1,51,52,165,197,67,90,1,
+95,54,226,79,2,96,30,1,50,49,101,29,100,108,65,53,1,49,54,160,
+19,193,236,113,121,139,179,255,218,1,160,199,0,83,65,20,73,9,160,83,
+168,17,96,69,128,13,0,79,64,252,0,79,235,185,2,68,98,64,29,224,
+21,3,2,95,50,49,98,8,1,50,50,64,70,0,58,97,119,3,10,65,
+32,65,65,165,220,16,134,53,0,51,134,8,81,210,0,58,65,62,195,152,
+64,16,230,53,2,1,50,49,103,115,68,114,166,53,192,56,66,78,192,11,
+66,31,96,11,0,58,96,6,164,99,1,51,53,64,234,189,85,1,51,51,
+130,223,0,51,130,143,121,246,132,222,94,182,132,222,0,80,128,47,64,203,
+160,47,224,15,8,64,65,229,166,0,104,102,64,23,100,73,177,181,171,143,
+105,93,69,37,0,51,157,191,160,68,65,22,224,21,2,160,154,137,82,1,
+51,51,133,104,2,95,50,48,101,79,95,87,64,96,167,228,1,53,53,65,
+30,200,189,0,58,96,45,193,52,232,180,4,64,90,168,180,252,215,7,224,
+14,5,192,170,241,213,0,200,222,96,188,0,58,96,6,200,253,2,50,57,
+56,64,93,192,50,69,182,99,99,65,236,160,26,147,211,224,26,3,0,58,
+96,91,202,124,130,125,64,77,130,115,220,246,201,161,1,75,50,234,127,2,
+234,151,15,197,134,234,155,27,224,8,1,64,214,96,142,129,253,229,213,3,
+192,9,128,44,252,229,4,0,58,96,54,105,155,3,50,51,32,58,66,127,
+64,13,0,80,64,10,201,121,1,51,54,171,184,2,95,51,49,232,150,3,
+11,110,111,32,109,97,116,99,104,32,97,116,32,131,196,96,32,128,149,68,
+219,130,211,136,176,96,11,0,58,96,6,232,176,29,223,178,5,46,73,110,
+116,101,114,177,167,224,39,1,2,80,97,116,64,22,0,77,64,128,2,70,
+97,105,232,196,4,67,81,129,2,0,83,100,4,146,179,65,93,129,67,98,
+231,160,10,72,56,0,52,88,196,0,49,129,125,131,244,67,162,96,5,77,
+105,0,54,227,251,0,104,199,130,128,130,142,161,28,83,64,238,207,3,67,
+236,66,229,116,80,1,56,32,128,15,99,20,106,33,132,177,224,24,1,161,
+56,224,220,1,4,39,92,92,39,39,165,23,161,75,96,158,224,82,3,97,
+246,136,237,224,17,3,132,240,231,170,3,224,151,1,0,64,160,35,168,82,
+224,139,0,142,148,106,130,224,133,3,3,92,92,92,34,238,147,2,0,58,
+96,131,64,244,65,24,0,58,97,234,105,188,241,133,4,89,199,0,49,74,
+150,249,214,2,67,235,0,67,183,16,160,136,94,231,129,18,64,39,97,111,
+162,168,190,246,244,166,2,73,181,96,176,161,144,64,59,129,144,160,200,96,
+62,193,205,1,51,49,137,19,0,49,112,83,255,193,3,0,90,64,28,105,
+192,64,61,224,231,3,0,38,239,222,1,131,181,104,173,247,236,0,201,10,
+136,195,118,58,225,89,7,224,60,1,149,8,160,223,128,77,160,223,96,224,
+64,56,128,79,96,177,65,32,225,163,6,96,191,100,49,128,180,64,194,226,
+92,3,77,221,208,78,244,93,1,224,210,16,80,45,0,80,103,71,224,30,
+1,2,78,85,76,96,30,96,25,0,49,224,25,3,2,83,79,72,224,25,
+1,0,50,224,25,4,1,84,88,224,25,1,0,51,224,25,3,0,69,224,
+25,3,0,52,224,25,4,1,79,84,224,25,1,0,53,224,25,4,1,78,
+81,224,25,1,0,54,224,25,3,2,65,67,75,224,25,1,0,55,112,246,
+1,57,55,161,240,96,19,145,10,0,57,69,77,224,19,0,0,57,96,19,
+0,49,65,221,224,20,1,1,49,48,160,21,0,48,224,21,4,0,49,160,
+21,224,64,4,1,49,50,128,21,0,48,194,91,128,21,0,51,160,43,0,
+52,224,108,4,128,43,226,134,0,128,42,224,248,4,0,83,153,176,128,25,
+224,248,4,0,83,145,147,128,25,224,248,4,2,68,76,69,224,26,2,0,
+55,224,26,4,0,67,137,37,128,26,0,56,224,26,5,0,50,224,26,2,
+250,53,4,2,68,67,51,225,203,2,226,0,4,2,68,67,52,224,26,2,
+226,1,4,1,78,65,225,127,2,69,174,224,187,2,1,89,78,224,26,2,
+226,3,6,0,66,224,26,2,225,11,4,1,67,65,224,53,3,226,5,5,
+0,77,224,25,2,225,12,4,1,83,85,224,79,3,225,12,4,1,69,83,
+149,173,128,26,225,12,4,1,70,83,224,25,2,225,11,4,0,71,224,25,
+2,72,74,224,25,1,0,82,224,25,3,225,9,4,0,85,224,25,2,107,
+76,225,63,2,0,69,131,64,198,23,224,0,21,110,253,140,184,0,58,101,
+112,69,54,229,30,0,77,142,0,49,79,119,0,35,109,10,173,160,96,17,
+1,64,35,175,231,66,41,103,164,0,48,76,112,66,81,240,54,6,196,244,
+108,124,103,112,96,17,0,58,96,6,133,165,68,70,237,182,0,209,45,0,
+51,66,248,0,95,84,172,109,58,96,19,250,141,2,96,30,64,69,136,11,
+64,67,230,88,2,1,56,50,206,4,192,64,99,115,229,151,8,96,69,108,
+145,205,90,192,40,235,89,3,224,10,1,96,50,0,49,133,32,205,213,96,
+250,129,33,102,75,0,50,84,242,224,74,4,0,58,96,102,5,10,65,32,
+99,104,114,65,36,136,4,148,234,165,129,139,48,64,41,135,190,65,21,134,
+173,2,95,51,48,64,32,225,149,11,106,163,225,149,5,77,134,96,113,70,
+217,141,109,0,51,77,241,237,67,2,2,60,32,64,98,210,224,19,8,129,
+227,172,166,160,19,69,202,234,1,1,234,11,2,224,40,7,66,13,224,40,
+12,224,102,8,65,253,224,61,7,64,251,224,102,13,107,217,3,67,32,61,
+61,64,38,112,239,134,88,224,97,3,0,58,97,34,106,233,72,239,249,116,
+3,226,86,5,65,233,1,53,57,240,31,0,0,54,111,237,145,56,65,137,
+77,27,1,50,57,139,33,1,95,50,80,238,0,51,112,210,1,95,51,81,
+197,192,41,2,64,95,50,109,230,97,247,64,123,131,54,4,111,114,100,32,
+58,96,18,9,10,65,32,98,115,105,110,100,101,120,64,16,163,17,2,50,
+52,56,96,156,231,49,0,78,222,82,140,107,222,103,168,4,67,32,95,57,
+56,77,215,128,230,80,189,96,11,239,41,1,105,143,242,141,4,19,87,111,
+114,100,56,46,115,117,99,99,58,32,111,118,101,114,102,108,111,119,99,255,
+81,203,224,108,9,0,57,224,108,3,98,193,224,109,42,8,112,114,101,100,
+58,32,117,110,100,224,110,3,73,164,0,50,66,217,143,3,64,14,87,20,
+1,95,50,107,94,67,23,0,56,74,203,129,79,224,245,3,154,210,128,5,
+193,159,0,49,86,62,200,149,2,95,50,56,67,156,192,57,224,194,1,224,
+31,13,224,89,1,237,28,2,128,123,96,84,224,20,2,96,54,96,20,0,
+58,96,62,225,167,6,79,145,192,80,139,38,129,160,0,49,241,203,3,225,
+32,9,225,141,19,160,82,96,195,192,82,97,134,224,83,23,225,115,13,112,
+139,65,102,99,230,68,28,224,174,3,225,89,7,105,158,161,51,1,51,48,
+97,156,224,137,2,224,25,1,69,119,224,71,3,64,19,0,48,192,72,131,
+203,67,186,224,83,1,128,77,160,58,65,75,165,147,106,76,155,102,224,133,
+1,87,213,68,20,241,14,1,64,5,109,7,225,244,0,243,231,6,64,66,
+171,144,203,121,219,188,96,131,129,53,0,56,106,216,128,28,192,76,203,49,
+65,122,134,69,241,71,5,0,32,160,53,160,252,140,162,224,165,0,224,42,
+1,243,161,0,64,225,224,218,16,128,136,224,218,67,129,44,224,218,69,96,
+165,224,218,11,238,155,0,178,160,71,176,64,44,128,179,224,125,5,160,192,
+96,202,160,180,162,222,64,91,149,35,64,150,164,72,211,5,192,9,0,58,
+98,81,99,111,1,56,55,108,2,2,95,56,56,147,82,0,58,98,117,154,
+36,87,148,0,58,67,175,224,42,0,100,99,96,39,128,9,0,50,64,34,
+64,35,184,110,67,190,2,95,50,53,86,147,101,200,2,95,50,53,85,100,
+96,11,239,11,1,65,86,166,16,224,18,4,129,25,224,18,4,132,189,224,
+18,4,65,0,224,18,6,134,211,224,18,4,64,151,224,18,6,224,132,10,
+68,168,224,18,6,135,134,224,18,4,130,140,224,170,5,224,190,11,224,191,
+10,105,38,224,19,7,224,193,10,105,148,224,19,7,224,195,10,148,146,224,
+19,6,224,197,10,113,110,224,19,7,224,199,10,116,171,224,19,7,225,135,
+11,224,199,10,98,138,224,19,7,224,199,10,104,94,224,19,7,224,199,10,
+104,196,224,19,7,169,21,224,19,4,64,199,251,177,7,17,111,69,110,117,
+109,58,32,111,117,116,32,111,102,32,114,97,110,103,191,54,168,46,64,7,
+99,3,0,95,130,179,64,7,99,46,1,95,50,107,74,64,7,106,67,1,
+95,50,91,188,64,7,91,207,96,7,132,224,0,50,92,45,96,7,160,79,
+184,70,0,50,124,236,64,7,160,79,103,237,64,7,160,79,64,180,64,7,
+93,94,96,7,160,79,101,188,64,7,160,79,87,92,96,7,160,79,93,247,
+96,7,160,79,148,88,1,95,50,94,212,64,7,94,234,96,7,160,79,100,
+112,0,85,241,119,1,137,220,98,69,234,4,7,64,41,234,147,53,128,7,
+96,8,96,150,234,145,14,128,7,96,8,169,190,234,143,33,128,7,96,8,
+132,189,224,38,7,65,55,64,29,97,63,64,8,133,113,224,99,8,99,12,
+224,119,7,130,248,224,80,5,65,72,64,71,97,80,64,8,204,139,224,38,
+4,99,71,0,85,143,84,128,8,129,1,66,187,224,39,4,130,227,224,59,
+5,161,22,147,93,64,8,129,22,64,9,96,237,224,189,9,64,41,224,208,
+7,64,160,224,19,7,131,141,224,109,5,65,55,64,90,97,63,64,8,134,
+170,224,38,7,130,56,128,7,96,8,134,54,224,98,7,132,63,224,58,5,
+65,33,64,49,97,41,0,85,113,112,224,96,9,140,49,96,6,64,7,138,
+30,224,94,8,64,155,224,18,6,132,57,224,75,4,65,47,0,85,114,26,
+96,7,129,52,224,35,6,160,246,192,245,231,159,0,225,48,5,226,0,10,
+161,255,193,6,193,154,130,6,135,214,106,204,230,221,0,96,179,0,39,233,
+232,1,104,116,236,229,3,108,199,128,46,224,12,5,169,239,107,6,192,78,
+99,193,224,25,12,196,195,0,57,224,19,2,0,57,77,21,96,11,0,58,
+96,6,137,24,84,152,0,39,88,57,77,68,0,56,92,173,77,88,97,110,
+244,173,2,96,11,184,71,192,105,160,98,148,63,224,6,4,0,58,64,107,
+224,95,5,224,92,6,224,79,6,97,34,224,79,10,0,58,64,192,235,232,
+7,69,47,170,241,0,56,98,34,171,232,235,147,17,2,73,110,116,235,230,
+19,160,80,65,107,224,80,0,254,5,8,224,81,9,235,228,12,1,73,32,
+64,2,65,247,0,57,235,224,1,128,85,225,247,3,189,27,225,187,0,0,
+57,235,223,1,128,44,224,25,1,235,223,1,160,25,128,90,224,77,1,130,
+145,224,82,0,128,76,160,57,65,65,0,51,235,3,17,235,2,72,166,155,
+135,2,235,1,16,135,41,64,10,235,1,4,128,53,235,1,7,235,0,14,
+96,222,224,215,16,96,113,224,215,67,130,4,224,215,68,133,128,224,215,9,
+235,216,10,64,43,235,215,33,136,80,203,215,64,148,235,215,15,98,73,157,
+160,64,13,0,56,217,151,75,186,195,82,78,177,1,95,50,83,113,203,243,
+132,240,96,83,224,28,15,0,58,98,172,156,0,64,77,128,100,0,65,96,
+100,0,54,96,13,124,230,64,179,88,160,128,150,252,171,0,192,222,64,45,
+254,65,0,3,50,32,75,52,126,4,64,21,132,21,192,21,97,64,0,58,
+68,70,128,114,64,136,91,93,101,32,128,17,0,49,192,17,129,93,152,148,
+128,17,129,2,152,140,96,17,73,48,128,17,0,52,192,17,192,204,70,63,
+128,17,128,211,152,116,128,17,128,215,152,108,128,17,128,187,152,106,128,17,
+221,21,70,247,128,17,224,179,0,71,18,128,18,224,180,1,192,181,66,126,
+160,18,192,182,74,29,160,18,192,183,74,56,160,18,192,184,74,83,160,18,
+192,185,66,29,160,18,192,186,74,137,160,18,192,187,74,164,160,18,192,188,
+65,164,160,18,192,189,74,218,128,18,72,250,128,18,224,189,0,73,22,128,
+18,225,115,1,192,189,66,148,160,18,192,189,75,70,160,18,192,189,75,97,
+160,18,192,189,75,124,160,18,192,189,75,151,160,18,192,189,75,178,160,18,
+192,189,75,205,160,18,192,189,71,36,183,65,113,232,70,154,156,191,2,50,
+53,49,214,135,99,155,198,141,0,53,128,220,123,183,102,34,64,19,128,221,
+224,69,9,230,150,10,224,71,0,227,118,0,0,51,66,191,64,18,64,25,
+96,90,224,1,3,67,217,96,0,224,20,11,224,17,8,224,14,5,224,11,
+2,192,8,93,0,131,86,86,255,195,64,0,90,128,130,64,21,239,150,0,
+71,224,87,20,0,58,117,70,15,10,65,32,34,94,95,94,44,94,41,94,
+66,94,57,94,59,96,5,18,53,94,54,94,57,94,58,94,57,94,52,94,
+57,94,57,94,73,94,38,96,7,0,66,96,19,30,57,94,89,94,32,94,
+53,94,57,94,54,94,60,94,51,94,60,94,89,94,33,94,53,94,58,94,
+54,94,58,124,32,96,75,22,57,94,67,94,59,94,61,94,57,94,60,94,
+61,94,50,94,55,94,58,94,45,94,61,96,13,8,58,94,40,94,40,94,
+60,94,33,96,75,31,60,94,40,94,50,94,56,94,66,94,40,94,57,94,
+86,94,32,94,58,94,70,94,32,94,87,94,33,94,58,94,71,94,2,33,
+94,32,224,3,102,224,33,59,224,3,53,224,9,1,0,66,224,15,6,64,
+5,0,66,96,5,2,33,94,67,224,19,6,224,43,3,224,79,13,224,69,
+9,224,15,1,2,33,94,50,160,67,0,67,96,9,0,34,96,25,224,5,
+3,224,3,21,224,33,25,192,37,192,77,224,129,3,224,3,99,0,70,96,
+5,128,11,64,5,128,23,193,77,224,3,2,1,124,68,97,21,28,90,94,
+33,94,81,94,49,94,67,94,60,94,75,94,49,94,77,94,60,94,68,94,
+49,94,70,94,60,94,49,96,3,6,80,94,60,124,111,94,35,224,57,0,
+64,21,64,7,4,48,94,48,94,49,97,83,8,57,94,32,94,67,94,48,
+94,60,96,25,67,73,2,32,94,48,160,3,64,41,0,80,96,11,3,72,
+94,32,124,193,29,225,211,3,224,3,35,64,179,64,9,0,58,160,15,96,
+75,5,124,50,94,32,124,47,224,75,40,224,3,13,8,61,94,68,94,35,
+94,37,94,37,224,73,56,224,3,37,224,29,19,224,67,31,224,3,145,1,
+48,124,65,79,130,49,4,69,94,57,124,40,98,53,0,52,96,17,18,61,
+94,61,94,59,94,48,124,44,94,35,94,52,94,35,94,57,94,35,224,5,
+4,6,71,94,48,94,90,94,50,98,97,67,189,69,87,6,74,94,48,94,
+69,94,45,229,179,0,0,59,96,5,64,73,0,74,96,53,64,25,14,57,
+94,95,94,50,94,49,94,73,94,50,94,84,94,35,101,231,10,67,94,57,
+94,50,94,50,94,35,124,98,96,73,4,50,94,70,94,35,101,187,6,69,
+94,35,94,49,94,49,96,117,4,61,94,67,94,35,96,39,64,51,2,66,
+94,50,96,89,8,50,94,77,94,57,94,48,94,45,64,63,1,94,93,99,
+59,0,35,64,193,3,124,88,94,50,96,119,64,33,0,48,64,51,5,124,
+32,94,50,94,72,160,81,0,61,96,139,0,49,96,235,6,35,94,59,94,
+59,94,85,96,205,64,29,128,35,0,66,96,5,66,119,64,35,0,78,96,
+101,64,83,64,23,64,17,64,15,16,74,94,50,94,68,94,48,94,87,94,
+50,94,60,94,69,94,50,96,137,0,45,96,19,3,72,94,35,124,70,103,
+2,49,94,87,96,205,6,95,94,35,94,36,124,53,96,167,0,36,96,151,
+8,66,94,36,94,71,94,35,94,67,96,15,2,36,94,36,160,249,65,27,
+129,103,199,7,2,49,94,78,160,55,4,36,94,48,94,71,96,103,0,48,
+97,11,64,7,64,185,2,48,94,70,96,5,64,85,129,145,128,217,128,101,
+64,215,64,15,128,63,128,7,64,27,65,197,64,29,192,75,65,85,64,121,
+64,35,64,121,64,21,65,27,2,69,94,40,98,15,65,157,128,29,64,37,
+64,75,64,243,224,63,1,224,139,7,224,5,7,64,55,64,101,64,125,64,
+247,128,71,64,23,65,85,64,185,2,35,94,70,224,191,0,65,13,128,135,
+64,37,128,155,65,17,224,125,1,0,72,224,181,0,224,121,11,0,68,225,
+5,6,129,203,192,59,129,3,129,71,0,78,160,51,224,251,3,66,191,64,
+127,0,50,98,133,64,55,225,125,27,224,119,7,129,217,225,127,13,64,93,
+128,141,225,129,17,66,225,65,125,128,245,64,33,65,113,65,41,128,245,65,
+41,64,13,193,101,128,9,192,17,192,39,64,7,0,75,161,169,128,123,64,
+5,128,29,64,145,129,145,128,213,0,69,96,35,163,51,105,35,0,69,97,
+251,69,131,64,131,128,43,129,5,128,131,0,86,96,5,0,79,225,109,4,
+130,213,129,215,64,165,224,237,1,192,53,128,173,225,119,9,64,39,2,57,
+94,70,98,113,194,243,0,57,224,111,10,67,37,225,107,9,0,68,96,117,
+193,171,128,235,128,123,64,11,64,219,226,143,1,224,117,3,128,17,2,36,
+94,75,225,147,0,0,36,226,93,3,99,201,64,23,227,79,3,225,59,3,
+68,141,65,93,64,45,0,36,96,189,225,201,7,0,72,96,209,132,35,192,
+159,0,81,161,155,68,63,194,205,128,207,66,79,131,15,128,85,65,173,130,
+133,66,129,128,201,128,183,128,217,0,57,64,185,1,124,47,96,115,64,201,
+68,71,64,57,67,187,68,131,68,103,235,85,0,0,124,64,123,226,49,1,
+129,67,128,131,193,89,128,69,69,9,128,143,128,35,69,47,64,89,224,123,
+1,66,127,0,95,96,55,2,66,94,61,101,37,75,129,64,11,64,251,66,
+57,64,41,0,73,96,251,69,195,128,3,75,237,64,3,64,185,97,217,0,
+124,64,103,64,175,0,77,97,27,67,169,134,107,64,119,69,197,64,33,128,
+251,64,63,64,87,134,163,0,68,107,247,64,115,96,213,1,124,42,97,127,
+129,161,65,37,133,107,129,111,129,191,64,143,2,69,94,57,97,23,192,21,
+131,69,193,221,129,63,65,113,134,17,0,76,226,135,0,128,211,129,239,0,
+36,163,31,64,13,2,61,94,61,167,75,73,13,137,101,64,139,71,79,137,
+141,1,66,124,129,221,197,153,196,47,224,17,0,98,97,224,13,1,70,171,
+224,45,18,102,15,2,48,124,56,224,51,4,195,87,64,201,4,72,94,57,
+94,83,98,133,131,153,0,73,98,123,2,48,124,85,167,241,0,69,170,43,
+4,52,94,68,124,107,98,189,10,57,94,80,94,50,94,41,94,89,94,50,
+97,155,3,66,94,48,124,70,223,71,39,2,66,94,39,97,167,67,71,130,
+179,65,15,4,72,94,48,94,82,162,229,66,129,0,57,96,17,64,31,64,
+17,67,73,65,57,195,181,160,19,1,124,51,224,49,0,66,73,66,203,129,
+91,65,229,135,147,142,21,64,37,195,59,130,237,68,137,64,185,72,163,72,
+51,64,133,0,45,168,67,64,219,0,34,66,233,1,124,52,160,167,66,57,
+3,35,94,35,124,75,79,65,175,3,68,94,48,124,65,243,69,73,0,94,
+160,151,199,123,132,213,229,29,1,65,227,128,29,66,101,65,67,199,139,72,
+97,195,15,4,74,94,48,124,43,162,183,65,53,195,147,97,117,0,124,74,
+181,68,169,226,125,1,64,55,66,167,64,161,128,245,131,75,130,163,131,11,
+128,123,0,73,160,45,224,219,0,224,7,0,0,70,97,33,65,3,64,31,
+67,45,5,37,94,79,94,35,124,131,139,72,97,0,46,162,173,67,67,197,
+17,192,93,64,187,192,201,64,73,66,21,67,227,0,72,169,15,128,171,64,
+227,195,65,195,61,131,29,99,61,96,243,128,91,198,13,128,31,128,99,64,
+135,0,57,99,207,65,219,64,209,192,69,65,71,67,175,131,55,130,23,193,
+83,2,69,94,49,162,65,138,155,65,173,0,42,162,171,76,149,0,71,102,
+3,129,179,2,57,94,76,225,61,0,66,251,65,51,196,177,128,105,129,237,
+8,43,94,33,124,62,94,49,94,76,77,31,0,124,76,147,4,36,94,49,
+124,63,237,53,2,224,3,255,224,3,17,193,143,224,3,181,64,197,2,71,
+94,32,228,245,0,0,69,162,89,81,235,64,23,192,7,224,31,11,207,51,
+192,3,192,43,0,77,160,43,128,15,0,34,224,7,8,79,21,0,48,241,
+53,0,0,34,114,125,2,66,94,60,102,13,224,23,3,64,19,0,67,160,
+75,192,21,66,231,0,60,96,73,0,68,111,145,0,60,163,7,224,81,7,
+64,23,8,74,94,41,94,68,94,45,94,69,179,57,6,55,94,56,94,53,
+94,55,224,7,0,67,57,2,42,94,43,96,35,0,41,102,23,64,25,69,
+63,2,51,94,51,99,245,0,58,101,239,0,74,179,127,4,51,94,73,94,
+57,160,83,68,119,2,45,94,40,173,39,74,135,77,219,64,45,77,193,224,
+13,1,69,233,69,183,70,183,0,59,107,77,67,161,2,67,94,37,99,245,
+4,37,94,75,94,35,96,21,71,177,80,149,64,5,64,11,242,89,1,128,
+7,192,23,0,58,96,247,71,229,64,15,192,3,64,245,64,51,145,55,67,
+249,64,49,64,17,65,227,71,121,80,129,65,75,64,65,128,25,8,61,94,
+79,94,40,124,34,94,39,160,51,0,39,104,137,137,171,64,47,0,68,96,
+43,0,58,96,147,128,51,192,5,0,70,96,5,0,94,160,31,192,25,128,
+17,2,66,94,75,116,41,0,61,232,201,0,0,83,160,39,64,53,4,53,
+94,54,124,80,96,15,8,93,94,61,94,88,94,58,124,39,103,125,1,58,
+124,64,49,0,85,97,179,10,61,94,84,94,48,124,59,94,40,124,77,96,
+19,4,40,94,65,124,54,96,51,69,139,10,58,124,53,94,61,94,71,94,
+58,124,110,96,19,2,65,124,119,224,107,2,224,3,11,4,93,94,40,124,
+43,105,15,129,145,0,94,160,7,224,3,7,0,79,64,77,5,92,95,94,
+61,94,65,225,189,0,224,3,30,1,124,62,224,47,2,0,95,160,11,6,
+66,94,65,94,58,124,47,96,207,129,37,64,231,76,183,66,49,64,103,6,
+48,124,104,94,61,124,47,242,13,2,193,243,227,163,3,243,11,1,64,5,
+67,135,79,165,243,175,111,224,3,73,0,33,162,205,128,13,70,197,64,7,
+74,43,67,137,86,135,2,57,124,37,163,223,64,21,100,15,1,124,55,168,
+203,71,27,77,145,0,35,104,81,73,101,138,17,224,5,33,80,125,196,29,
+64,3,67,247,64,7,128,5,68,21,132,61,64,5,128,23,196,73,226,7,
+5,71,191,67,251,64,41,137,133,64,49,2,53,94,76,177,233,215,203,224,
+3,3,1,52,124,64,205,0,89,98,11,2,88,94,61,106,25,6,65,124,
+85,94,61,94,89,106,157,0,61,184,9,6,61,94,49,94,50,94,39,226,
+123,11,96,91,224,87,8,96,5,64,27,2,72,94,39,232,175,0,0,52,
+117,41,128,139,0,39,96,81,128,153,74,251,137,187,72,33,69,59,66,97,
+3,50,94,52,124,73,187,74,77,64,13,136,119,75,91,137,233,132,43,79,
+127,0,61,82,185,1,124,37,96,109,64,23,2,79,94,50,100,11,138,153,
+67,233,0,71,100,91,2,78,94,40,98,247,2,73,94,40,99,7,64,15,
+2,66,124,63,78,205,2,124,51,124,64,47,0,50,128,13,5,94,65,124,
+35,124,125,176,65,4,49,94,72,124,118,141,243,100,7,4,72,94,48,124,
+39,233,23,2,68,113,64,37,65,39,64,121,73,55,72,239,0,83,102,147,
+226,155,53,224,3,19,73,87,69,193,73,181,66,65,0,49,224,73,48,179,
+199,171,131,0,39,173,75,137,213,4,86,94,60,94,72,118,195,150,197,224,
+3,13,246,153,41,224,3,69,79,69,224,17,3,224,35,13,224,195,3,88,
+213,64,9,224,185,35,70,249,192,5,224,3,19,248,61,3,64,5,66,217,
+128,7,128,3,224,47,5,0,84,104,63,129,189,66,71,2,49,94,33,100,
+25,211,87,139,71,68,93,235,243,1,71,19,139,181,147,255,146,5,77,105,
+77,195,67,251,148,63,1,36,124,67,57,0,79,160,55,64,19,204,99,76,
+177,0,81,171,159,66,185,149,221,64,105,64,29,0,91,108,35,132,151,64,
+121,78,1,142,9,64,65,0,92,242,191,0,236,213,3,236,151,5,76,125,
+68,121,69,33,64,81,71,213,64,77,141,251,85,201,131,41,112,189,111,97,
+144,17,192,225,128,7,67,207,129,5,77,33,64,23,65,75,64,55,141,85,
+131,113,77,117,144,229,173,189,96,245,144,51,140,123,64,75,174,117,160,25,
+0,87,177,103,131,195,79,77,224,121,1,64,17,129,137,64,19,78,149,146,
+27,224,7,5,229,235,6,112,83,74,47,64,219,194,109,6,67,94,48,124,
+79,94,33,110,255,128,211,224,5,1,0,57,96,9,192,207,65,143,2,50,
+124,87,101,143,0,50,101,135,65,119,64,63,64,15,65,61,2,46,94,70,
+100,147,2,46,94,46,192,7,1,94,71,160,9,2,47,124,49,96,9,4,
+47,94,66,124,109,128,163,1,124,105,101,19,64,157,0,33,96,79,74,245,
+70,191,129,227,2,50,94,58,176,3,146,63,128,3,224,5,0,112,121,4,
+80,94,60,94,79,65,129,3,124,106,94,50,101,217,4,79,94,61,124,63,
+160,95,87,47,71,1,69,125,148,195,94,47,69,125,83,213,222,55,64,215,
+64,17,134,149,74,215,230,67,11,224,3,3,65,125,64,7,144,71,139,7,
+129,235,134,85,192,3,139,31,0,52,105,43,66,91,152,211,138,61,64,161,
+0,65,161,157,87,247,66,69,254,207,58,160,59,192,165,65,69,2,49,124,
+44,162,43,80,185,131,145,226,43,9,140,35,128,31,87,181,0,58,126,251,
+64,9,65,63,0,67,169,159,66,105,0,66,121,93,137,163,65,83,144,191,
+145,205,193,161,114,97,112,99,0,50,66,47,1,124,122,184,235,64,221,66,
+49,0,44,178,93,4,72,94,61,124,52,103,127,1,40,94,74,245,95,105,
+65,161,76,3,145,59,2,61,124,46,96,47,68,77,4,65,94,65,94,48,
+195,219,98,117,76,23,4,35,94,90,94,40,97,85,90,29,64,73,66,247,
+0,83,104,13,67,147,0,39,103,151,0,37,96,129,67,99,0,48,177,135,
+144,103,64,55,64,37,67,247,2,39,124,41,103,57,6,32,124,39,94,33,
+124,77,160,195,210,33,73,117,64,187,0,35,101,63,135,97,0,71,164,207,
+132,117,0,74,109,125,0,78,96,5,0,70,253,45,0,75,177,67,51,0,
+78,96,5,66,235,141,135,64,195,64,59,66,249,2,66,124,54,163,175,71,
+207,65,101,64,147,68,1,71,195,2,48,124,41,109,69,3,72,94,49,124,
+64,191,193,175,67,5,81,79,129,117,65,45,128,23,150,227,69,97,0,40,
+96,11,65,173,86,85,65,255,69,97,4,72,94,40,124,47,225,177,4,64,
+85,2,68,94,40,96,125,141,169,64,63,65,215,64,25,2,57,124,63,170,
+79,65,45,65,163,64,51,2,79,94,40,99,101,77,227,132,199,137,29,138,
+151,134,21,211,191,65,179,130,97,147,23,69,55,0,40,99,155,74,61,64,
+7,64,33,64,89,197,187,73,7,129,5,0,61,101,235,64,89,131,57,64,
+55,116,45,99,223,64,169,64,15,201,159,64,243,64,215,64,133,64,11,84,
+81,154,21,118,229,65,7,3,124,79,94,48,85,81,3,124,54,94,48,94,
+105,1,94,76,96,7,70,211,102,173,162,23,134,141,243,67,3,64,209,69,
+183,85,7,146,143,92,223,2,49,94,85,111,181,0,48,109,195,0,65,64,
+93,1,94,94,65,27,1,124,41,96,147,64,185,157,23,129,53,97,19,64,
+123,96,99,64,237,74,3,129,153,64,197,70,201,66,197,75,45,77,239,64,
+193,129,79,75,229,2,48,94,84,96,209,0,40,105,189,203,209,134,83,84,
+27,0,78,164,219,65,43,85,195,64,183,230,97,1,128,45,135,21,68,21,
+216,143,198,205,68,51,0,45,97,43,134,85,68,151,156,185,219,77,65,11,
+2,66,94,35,97,35,148,37,71,133,193,31,70,149,64,75,131,25,70,83,
+128,83,128,119,102,189,120,103,64,119,84,59,135,147,136,15,64,135,134,113,
+138,159,64,53,133,89,64,199,67,97,65,9,221,71,244,53,1,64,5,202,
+15,160,233,107,41,246,247,7,132,147,69,17,101,243,168,21,64,73,64,193,
+66,47,192,223,199,101,251,175,33,129,91,128,141,154,187,251,175,1,153,233,
+64,47,64,91,85,91,128,53,192,31,84,137,194,77,64,229,154,155,192,119,
+132,185,64,9,64,71,156,77,192,95,64,217,64,5,225,5,1,136,57,65,
+113,136,203,66,83,64,155,2,92,94,48,98,29,192,237,64,49,129,63,131,
+167,213,89,192,57,137,217,0,93,186,21,192,121,192,221,129,31,128,243,129,
+167,195,41,0,65,66,161,97,89,194,89,64,169,224,51,5,0,86,97,235,
+98,143,102,27,192,97,245,237,1,128,39,137,243,129,17,129,151,73,173,0,
+82,173,99,128,37,64,47,192,153,161,215,224,45,0,0,83,106,37,2,48,
+94,90,161,75,224,49,1,130,241,65,111,67,37,64,47,134,119,77,235,65,
+219,2,65,124,56,165,89,226,167,1,99,29,1,124,99,102,101,4,32,94,
+95,94,33,96,55,68,197,68,85,226,39,1,132,131,226,31,1,91,25,87,
+149,226,15,1,193,9,66,1,137,211,64,121,67,31,87,31,64,185,160,77,
+0,124,67,5,225,71,3,133,3,192,235,64,59,0,90,96,103,2,73,94,
+35,173,239,64,89,196,187,65,197,65,151,234,183,1,67,183,2,45,94,50,
+183,1,225,99,1,65,253,69,3,74,241,131,231,4,57,94,65,124,53,186,
+73,144,61,193,85,122,137,0,124,128,185,152,129,225,127,1,130,69,128,43,
+0,82,230,69,0,0,57,248,247,0,0,85,162,189,64,55,226,17,2,0,
+124,234,167,1,137,217,66,241,64,85,64,63,198,85,131,39,139,103,224,141,
+1,135,9,129,105,71,253,221,193,128,103,194,75,228,189,1,0,66,64,213,
+250,119,2,139,73,222,93,64,211,106,113,121,247,64,29,66,35,64,133,224,
+75,1,66,131,101,83,0,124,77,21,136,129,2,84,94,40,115,207,2,67,
+94,59,104,197,0,76,167,125,10,89,94,50,124,101,94,48,124,110,94,39,
+184,189,66,205,1,65,124,66,253,1,84,124,90,207,0,96,163,173,64,49,
+0,72,99,9,0,79,122,149,64,215,69,201,65,77,0,95,98,193,100,53,
+5,124,70,94,50,124,53,66,157,97,83,85,25,197,9,64,147,0,77,98,
+61,0,68,123,217,64,211,154,169,133,153,154,61,197,3,129,61,250,143,1,
+157,223,131,139,65,103,221,25,76,43,67,21,193,213,103,63,166,131,64,145,
+65,73,0,67,104,75,2,66,94,49,98,131,147,121,129,35,0,65,96,143,
+195,47,0,86,105,165,2,57,124,100,188,27,136,7,71,9,66,17,135,13,
+0,76,121,99,77,145,64,119,79,243,65,49,65,125,66,131,4,50,124,47,
+124,117,97,117,98,3,81,147,0,124,64,141,65,255,64,65,4,50,124,69,
+124,102,96,73,158,107,64,5,64,73,73,95,70,139,65,171,0,50,69,11,
+168,149,64,13,64,87,65,143,154,123,74,207,0,82,105,221,76,79,64,225,
+66,15,138,169,194,69,128,57,158,163,65,37,3,45,94,94,124,68,103,2,
+65,124,111,190,177,64,245,4,67,124,51,94,61,97,227,65,207,64,49,0,
+86,142,45,4,124,115,94,61,124,75,85,2,65,124,117,129,89,212,241,0,
+124,79,33,197,153,75,5,68,55,2,71,94,45,101,25,137,195,0,35,114,
+43,3,67,94,35,124,75,157,86,5,0,65,107,39,4,35,94,61,124,121,
+167,41,68,143,160,7,1,124,86,178,113,0,88,86,35,96,191,76,59,76,
+47,64,7,138,139,0,81,160,13,64,21,234,179,1,190,135,224,13,0,152,
+89,88,187,152,111,234,203,1,74,221,224,63,1,64,37,128,43,128,45,203,
+9,224,29,7,80,163,64,93,137,191,192,33,224,157,3,224,7,23,0,91,
+176,183,10,88,94,32,94,58,94,88,94,33,94,58,117,251,224,15,55,177,
+15,1,124,49,67,55,86,237,1,124,54,101,119,1,61,124,66,143,67,231,
+1,35,94,87,119,129,147,67,41,66,87,67,67,72,99,2,35,94,72,106,
+1,0,73,113,43,0,83,117,187,68,167,2,33,94,65,100,49,133,51,0,
+80,162,19,221,195,64,5,172,157,4,124,61,94,49,124,65,15,2,35,124,
+111,108,249,202,227,73,215,153,75,195,209,75,27,84,29,131,201,2,35,94,
+80,254,83,0,132,15,66,191,2,59,94,67,96,143,68,67,0,49,224,25,
+0,85,65,192,53,68,247,228,35,1,2,67,124,95,229,141,0,137,55,237,
+209,3,1,65,124,136,239,108,67,64,147,67,127,3,124,33,94,32,93,33,
+96,163,64,99,228,115,4,1,94,70,96,151,0,58,114,5,75,215,0,59,
+74,221,99,25,78,5,148,227,1,65,124,77,217,128,111,135,175,128,117,195,
+165,195,119,192,145,134,213,64,5,129,7,224,3,1,131,217,224,61,7,224,
+3,9,224,31,1,128,83,224,241,3,224,101,1,128,117,0,80,238,189,0,
+64,13,129,1,0,80,85,145,171,243,0,66,68,69,121,65,68,57,0,99,
+182,165,0,78,175,35,128,7,96,5,1,124,36,165,75,0,76,96,243,4,
+32,94,61,124,55,108,251,102,51,192,65,121,197,144,183,0,61,100,159,87,
+253,0,65,118,239,2,65,124,122,98,115,4,60,94,69,124,87,160,45,70,
+113,66,33,175,49,1,124,118,160,135,86,95,65,35,0,75,160,39,65,105,
+224,13,0,1,124,55,118,115,64,225,147,149,90,101,64,15,68,95,64,181,
+224,53,1,0,61,107,77,1,66,124,90,165,64,215,66,251,64,33,207,161,
+64,65,66,183,64,81,64,181,192,247,90,167,136,49,128,23,2,65,94,82,
+97,3,0,91,165,37,0,72,161,193,4,66,124,77,124,93,96,9,66,121,
+2,50,124,32,97,19,193,223,0,65,101,91,161,201,2,124,44,92,96,35,
+166,13,0,58,80,27,229,215,0,2,68,124,107,96,7,0,83,114,161,0,
+68,135,33,1,124,97,96,41,0,38,104,99,129,197,64,97,96,111,5,124,
+43,124,56,124,80,108,229,74,233,2,95,94,45,96,93,69,199,4,35,94,
+67,124,124,109,171,0,47,68,3,1,124,123,96,9,64,131,224,15,2,31,
+34,32,58,50,52,53,32,64,10,65,32,95,54,32,95,49,54,51,32,64,
+95,54,32,89,32,66,32,66,32,83,32,85,64,18,5,52,32,64,64,64,
+64,64,16,1,90,32,224,7,1,12,83,39,32,83,32,64,66,32,67,39,
+32,83,39,64,8,14,83,32,64,95,49,52,52,32,95,54,57,32,64,35,
+49,160,52,0,67,64,23,224,38,0,26,66,32,64,64,67,32,67,32,95,
+54,52,32,95,49,55,51,32,64,64,95,49,55,52,32,95,50,49,64,120,
+7,51,52,49,32,35,49,50,56,96,59,128,53,64,110,10,95,49,50,51,
+32,64,67,32,95,57,56,160,41,224,53,19,3,85,32,35,48,224,64,0,
+31,66,32,80,32,95,51,51,57,32,102,114,111,109,85,84,70,56,32,34,
+92,34,47,118,97,114,47,102,111,108,100,101,114,31,115,47,122,50,47,56,
+52,112,116,102,51,98,120,55,104,53,52,48,112,107,110,99,121,48,121,50,
+120,112,99,48,48,48,10,48,103,110,47,84,47,109,104,115,105,110,64,13,
+17,48,48,57,57,57,53,46,104,115,92,34,44,50,48,50,58,56,34,128,
+105,65,12,97,15,96,114,128,13,64,176,224,230,28,128,228,2,64,67,39,
+65,36,6,95,49,57,49,32,95,57,64,50,160,24,96,245,96,16,3,67,
+32,95,53,192,11,192,63,3,95,50,49,53,64,227,4,50,51,55,32,64,
+160,55,224,28,0,129,119,64,70,96,151,2,95,50,51,64,22,64,8,1,
+52,49,225,80,0,160,78,128,140,225,60,2,64,71,64,11,2,95,50,52,
+64,33,3,58,50,52,52,130,39,2,50,52,50,66,53,0,51,96,13,7,
+98,115,117,110,112,97,99,107,64,17,0,50,96,17,64,110,4,95,50,51,
+57,32,64,57,1,48,32,64,56,0,49,96,24,2,66,32,89,66,34,65,
+203,0,58,96,25,64,44,65,41,0,67,129,44,4,55,53,32,95,55,64,
+160,96,118,97,185,130,124,130,7,128,57,96,189,64,92,0,67,225,42,3,
+192,190,0,64,128,49,0,58,96,33,96,139,64,115,64,61,0,80,128,6,
+160,68,64,33,0,56,128,205,5,49,50,53,32,95,50,64,21,3,95,50,
+49,50,64,10,64,114,192,11,0,53,96,11,1,50,55,161,96,64,11,66,
+131,160,11,1,51,48,224,11,2,0,54,224,11,0,64,9,1,50,49,64,
+80,1,50,50,97,57,64,22,1,10,65,163,0,99,41,129,236,66,48,128,
+255,64,2,64,151,162,72,226,78,0,66,4,225,192,1,192,37,64,16,128,
+52,64,77,96,5,99,122,129,28,0,49,64,7,2,85,32,65,193,44,0,
+50,64,137,0,51,130,25,98,68,1,50,51,99,210,64,136,2,95,55,57,
+130,88,160,19,7,64,64,83,32,73,32,64,75,64,183,162,127,224,125,0,
+1,83,39,65,69,194,84,99,251,129,131,66,54,0,75,192,172,98,232,96,
+128,64,18,224,128,7,162,251,192,139,96,71,130,135,96,16,224,54,15,0,
+64,128,206,97,103,0,53,97,223,0,54,97,81,64,45,2,75,52,32,128,
+174,0,58,96,27,224,21,2,160,20,130,182,2,85,32,90,96,1,0,75,
+128,231,0,58,96,89,160,44,64,13,130,188,224,37,9,130,187,225,148,0,
+97,1,1,95,49,66,36,3,95,50,50,57,96,58,130,202,0,85,64,134,
+192,57,0,58,96,27,130,129,161,181,6,95,50,50,54,32,64,65,64,49,
+67,157,224,27,10,96,136,0,50,130,43,96,77,224,196,1,64,30,8,10,
+65,32,117,114,101,109,32,58,98,150,64,13,3,113,117,111,116,64,14,163,
+152,2,49,50,54,100,10,100,100,164,118,3,54,32,95,51,67,152,226,148,
+7,64,83,129,0,0,73,64,65,128,253,0,83,99,141,65,145,226,93,0,
+163,155,2,56,54,32,131,150,98,175,130,196,224,22,4,165,167,0,56,229,
+109,79,3,53,52,58,49,165,108,132,202,0,49,64,208,0,49,67,111,98,
+167,0,79,64,166,0,79,97,67,160,36,224,34,3,224,26,3,224,23,2,
+198,220,2,95,50,49,66,128,2,95,50,50,100,175,65,38,100,155,1,95,
+49,67,30,1,95,56,68,10,0,49,198,213,0,58,96,37,65,111,1,56,
+52,98,202,1,95,57,96,53,64,32,128,53,0,56,101,138,128,20,129,233,
+2,75,32,58,96,112,3,10,65,32,80,64,10,129,205,196,15,131,50,162,
+226,96,184,96,14,161,250,0,49,226,212,0,98,16,96,36,0,58,96,34,
+64,131,1,53,57,64,47,3,50,32,95,56,97,238,128,10,65,224,128,10,
+0,49,64,134,3,64,95,49,57,96,194,64,34,0,73,97,222,96,220,71,
+172,1,49,54,100,178,230,157,7,134,4,230,180,9,224,22,13,128,45,96,
+185,97,15,129,38,64,31,101,246,192,24,64,19,130,104,96,243,0,53,133,
+196,0,55,97,141,64,66,2,35,50,53,69,111,0,58,96,44,98,208,1,
+55,55,64,4,0,56,98,206,65,137,2,49,56,48,96,5,64,101,0,56,
+96,22,0,56,69,189,96,61,2,95,49,56,104,30,96,73,128,38,0,57,
+131,14,96,12,135,26,2,95,49,57,224,110,0,1,95,49,136,79,134,228,
+0,48,69,203,192,11,0,51,224,56,8,196,242,98,246,71,214,230,169,1,
+224,27,5,0,49,65,145,96,28,1,95,56,69,91,0,64,66,38,192,41,
+2,95,50,48,102,93,64,18,224,81,51,65,179,224,81,6,66,115,1,50,
+48,224,220,1,1,50,48,70,180,192,11,0,56,66,254,4,95,50,48,57,
+32,160,67,0,75,160,8,0,75,66,7,64,8,0,58,96,43,5,10,65,
+32,90,32,85,66,185,0,48,130,206,6,112,111,112,99,111,117,110,68,102,
+64,68,196,181,0,66,96,109,2,53,32,64,70,64,135,131,0,58,64,113,
+97,182,64,24,0,58,64,139,226,183,3,133,87,224,1,9,165,105,224,0,
+2,0,58,96,88,64,72,2,51,54,48,228,74,2,18,97,114,105,116,104,
+109,101,116,105,99,32,111,118,101,114,102,108,111,119,68,17,0,58,97,1,
+131,78,165,78,0,83,228,191,5,192,5,2,95,50,48,103,27,3,95,50,
+48,50,227,96,0,230,231,0,71,149,130,142,135,37,1,49,57,66,140,230,
+211,2,131,160,226,241,3,128,66,0,58,66,47,128,234,224,228,15,224,1,
+3,224,240,9,64,0,0,58,96,147,96,68,102,34,64,169,192,211,65,108,
+1,49,57,98,255,64,147,0,58,66,171,161,90,0,51,224,108,42,0,58,
+96,75,224,92,4,64,244,132,141,2,95,49,57,101,24,96,252,0,58,67,
+33,160,105,225,193,17,224,103,14,0,58,96,73,224,195,5,71,53,128,195,
+67,135,224,89,0,224,92,14,224,84,7,0,58,96,58,231,106,1,224,1,
+21,225,103,12,0,58,96,131,197,56,69,51,101,45,133,39,133,38,131,240,
+229,38,7,227,156,1,101,4,139,25,68,232,0,58,96,47,103,60,137,12,
+98,68,64,232,226,40,1,0,58,64,88,160,184,232,34,1,96,45,5,10,
+65,32,42,32,58,96,126,129,42,1,95,49,64,149,130,89,226,122,12,101,
+131,0,58,68,220,160,49,236,121,3,228,75,10,138,34,98,221,64,154,70,
+204,224,29,3,1,95,49,71,196,234,103,1,1,95,49,100,74,227,214,0,
+64,106,226,4,0,136,146,224,2,2,193,85,64,51,160,223,224,30,3,225,
+133,3,0,58,96,104,224,178,62,229,147,0,160,178,65,111,224,178,4,226,
+40,0,0,51,224,141,3,226,23,6,0,58,96,56,224,183,7,226,66,14,
+0,58,96,117,226,178,0,100,242,64,154,64,18,4,120,111,114,32,58,102,
+150,2,10,65,32,128,11,129,208,4,97,110,100,32,58,102,187,111,97,0,
+54,137,50,3,95,49,54,54,66,57,64,212,167,33,224,1,31,107,255,224,
+0,10,224,57,25,192,1,224,65,14,224,56,25,128,1,224,62,13,224,55,
+25,64,1,224,59,12,224,54,25,224,56,13,224,53,44,224,50,41,224,47,
+38,224,44,35,224,41,32,224,38,29,224,35,26,224,32,23,224,29,20,224,
+26,17,224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,192,8,109,
+113,224,0,9,0,58,74,28,229,83,1,224,1,23,227,202,4,224,68,3,
+0,54,96,68,0,73,67,165,238,61,4,139,103,101,125,99,186,0,53,171,
+43,1,95,49,128,10,105,143,160,11,73,63,160,11,0,55,102,24,160,11,
+69,170,192,11,107,147,74,235,173,152,138,218,132,69,64,6,5,10,65,32,
+117,62,61,64,134,132,82,1,117,62,64,11,132,81,1,117,60,96,24,132,
+82,3,117,60,32,58,96,114,64,11,2,99,109,112,64,13,132,71,100,95,
+96,110,101,210,192,157,64,11,0,58,96,187,3,10,65,32,47,64,73,64,
+18,160,244,0,54,128,244,0,75,64,10,206,70,1,54,50,64,13,209,223,
+145,221,64,20,160,29,0,48,64,13,128,152,7,98,115,108,101,110,103,116,
+104,64,17,232,147,0,101,30,142,99,74,186,64,21,0,82,142,27,64,16,
+170,68,145,238,1,49,53,64,156,1,35,49,78,244,2,58,49,53,170,63,
+96,182,0,52,97,107,0,53,75,233,1,49,53,103,162,0,53,110,214,0,
+53,104,67,76,40,129,77,96,65,129,77,96,10,0,58,96,6,225,77,0,
+64,40,193,77,64,58,225,77,0,64,77,193,77,64,95,3,10,65,32,105,
+129,77,64,115,96,201,139,25,2,58,49,53,128,218,65,35,64,16,143,106,
+0,51,64,13,225,119,3,85,70,2,95,49,52,101,216,64,188,193,108,64,
+17,3,10,65,32,61,96,11,226,98,1,64,37,128,143,115,23,111,114,209,
+202,80,221,0,90,64,7,110,222,1,95,49,83,44,64,6,114,77,0,49,
+179,121,113,243,97,30,82,236,0,58,96,29,96,22,71,52,192,73,3,50,
+51,32,35,109,142,160,10,178,5,195,116,224,32,2,143,218,116,135,177,239,
+0,89,243,122,0,115,62,224,65,4,224,64,5,64,200,64,0,96,58,163,
+88,179,244,139,145,128,163,128,244,211,248,1,95,49,83,130,71,210,0,58,
+96,29,200,97,64,14,232,112,0,99,134,0,58,97,8,167,40,164,18,0,
+58,97,36,194,112,128,36,129,92,75,223,0,54,137,134,114,66,81,1,130,
+70,146,75,1,58,49,178,17,11,94,109,100,53,83,116,114,105,110,103,32,
+58,96,27,180,188,2,66,32,95,98,99,81,250,0,64,97,74,64,15,213,
+141,116,41,0,49,141,116,108,32,0,58,96,102,128,234,160,56,0,48,73,
+177,1,90,32,224,31,0,129,10,4,110,101,119,67,65,128,112,2,76,101,
+110,64,115,129,10,224,213,4,178,54,2,65,32,58,99,48,240,37,0,2,
+115,101,113,142,16,96,8,101,20,0,58,99,54,144,82,81,250,192,75,224,
+1,1,229,137,78,0,58,85,51,193,123,229,92,2,0,58,115,22,3,10,
+65,32,79,64,144,129,80,4,95,49,48,54,32,78,100,78,61,110,109,96,
+8,3,95,49,49,48,66,60,101,21,0,49,112,169,192,11,67,201,192,11,
+0,57,224,11,1,81,116,1,95,49,81,154,0,58,96,18,65,192,6,112,
+111,107,101,87,111,114,73,98,177,179,4,94,112,101,101,107,192,18,162,105,
+65,183,75,72,145,227,0,49,81,124,0,58,64,90,160,193,241,85,2,96,
+34,224,50,4,101,170,192,50,226,132,1,1,95,49,81,127,67,97,68,246,
+1,95,49,81,163,64,33,129,132,2,116,111,73,79,48,96,21,96,14,1,
+80,116,74,18,177,178,243,217,5,96,98,227,39,0,246,12,0,129,116,67,
+197,64,93,66,136,183,4,69,134,1,64,95,76,196,108,163,0,58,65,59,
+193,138,229,119,2,177,65,237,122,1,79,206,65,197,128,64,85,114,66,170,
+142,226,0,58,65,140,160,68,234,217,0,175,255,1,95,49,80,71,76,108,
+0,35,101,191,176,4,148,121,64,27,193,18,226,78,8,226,117,73,176,81,
+203,246,64,32,2,95,49,49,88,144,64,34,1,95,49,79,65,163,176,224,
+22,1,163,182,81,221,99,179,163,186,119,222,194,182,176,111,64,78,79,202,
+0,95,70,65,0,58,96,40,66,82,3,102,114,101,101,64,235,173,230,101,
+166,224,96,6,0,95,78,205,0,95,79,86,140,148,96,34,192,114,97,187,
+97,131,165,136,192,23,0,58,96,177,246,8,4,64,171,133,119,96,254,0,
+39,87,16,224,49,0,0,73,161,9,225,0,3,193,225,225,72,1,224,119,
+2,64,115,178,79,96,130,249,241,11,165,129,176,111,205,48,96,156,130,20,
+92,11,0,83,118,247,123,248,129,79,64,226,1,32,95,79,224,65,113,130,
+80,224,89,7,96,88,176,106,145,26,132,39,0,58,176,84,68,201,0,58,
+176,35,96,184,71,255,130,164,250,230,0,226,169,7,176,53,242,25,6,8,
+117,110,100,101,102,105,110,101,100,114,15,240,36,0,233,249,4,0,58,239,
+248,3,99,181,72,195,99,14,0,95,72,235,0,83,238,137,11,65,113,238,
+87,2,144,17,85,225,0,48,224,37,3,224,33,0,128,249,240,37,1,0,
+95,79,246,0,58,176,31,2,66,32,95,116,183,112,52,240,15,0,129,153,
+93,59,1,56,50,176,45,0,80,96,7,97,114,225,113,0,112,170,64,120,
+97,11,143,6,96,212,181,41,85,6,99,164,96,92,193,184,244,70,0,252,
+144,0,247,176,1,194,68,0,67,103,243,150,180,128,191,65,5,0,48,253,
+194,0,97,2,1,56,56,128,155,97,210,176,121,4,105,110,118,32,58,176,
+26,4,115,104,114,32,58,176,3,72,232,175,233,0,97,128,23,129,143,4,
+115,104,108,32,58,175,111,2,43,32,58,175,76,2,45,32,58,175,67,2,
+73,32,58,175,64,230,86,7,175,75,130,155,100,157,239,80,0,0,53,158,
+110,0,95,75,27,0,95,75,45,0,95,75,62,0,95,75,80,0,95,113,
+132,74,35,149,59,74,34,96,9,0,58,175,118,131,166,98,189,131,179,96,
+37,0,53,131,103,69,91,172,96,224,29,1,224,49,1,224,39,5,128,237,
+227,59,2,172,74,74,129,172,64,2,62,32,58,171,229,74,125,171,227,2,
+60,32,58,171,225,138,122,171,225,106,79,108,107,75,216,0,58,171,235,74,
+76,171,232,65,98,171,207,2,80,32,58,171,205,195,255,164,58,194,34,224,
+20,11,224,17,8,224,14,5,224,11,2,192,8,229,132,0,172,47,250,236,
+5,172,57,4,110,101,103,32,58,172,55,2,42,32,58,172,49,2,45,32,
+58,172,45,2,43,32,58,172,37,224,148,68,0,58,172,100,199,88,64,17,
+225,225,0,73,145,68,90,66,26,75,255,96,12,165,226,1,64,58,204,113,
+3,53,53,32,58,172,54,2,73,32,58,172,51,64,41,66,76,76,41,0,
+58,172,59,64,29,128,224,64,9,168,134,7,109,97,108,108,111,99,32,58,
+172,56,224,158,2,0,58,172,58,2,85,32,58,172,57,224,198,14,0,58,
+172,74,64,19,0,95,76,37,1,64,95,108,73,172,72,103,221,107,253,172,
+77,6,114,97,105,115,101,32,58,172,79,7,65,46,114,101,97,100,32,58,
+172,80,13,73,79,46,103,101,116,65,114,103,82,101,102,32,58,172,46,4,
+95,51,50,32,95,108,47,75,108,229,59,1,5,115,116,100,101,114,114,101,
+56,172,65,2,73,79,46,128,20,1,32,58,171,196,96,59,75,148,224,59,
+9,2,111,117,116,128,59,205,35,67,160,0,58,171,207,128,73,4,111,117,
+116,32,58,223,110,3,51,54,32,58,171,205,2,73,32,58,171,195,128,95,
+154,78,224,95,6,1,105,110,96,94,171,219,3,75,52,32,58,171,189,128,
+91,3,105,110,32,58,171,186,129,89,0,95,75,19,102,69,135,247,231,167,
+0,0,95,75,109,194,70,231,254,3,97,132,0,95,107,236,64,104,205,69,
+225,195,1,171,190,203,222,2,50,56,32,101,26,162,72,75,176,1,64,58,
+171,202,93,75,171,192,0,46,162,20,171,197,76,147,0,58,171,175,13,73,
+79,46,112,101,114,102,111,114,109,73,79,32,58,171,185,0,75,107,3,231,
+232,1,0,58,171,99,0,95,64,192,66,134,96,123,104,157,88,2,225,4,
+0,3,62,62,32,58,203,107,64,66,69,8,110,137,0,51,232,241,0,90,
+229,156,18,72,26,188,28,160,9,0,58,221,250,156,139,72,217,163,37,75,
+33,0,95,74,209,90,26,224,35,2,96,32,118,153,192,32,0,95,101,85,
+221,21,0,55,86,206,224,47,12,96,150,116,254,65,163,0,58,171,108,113,
+122,96,9,71,177,168,123,129,19,153,11,253,0,4,138,156,128,253,234,221,
+1,0,49,171,58,192,12,96,199,171,10,129,27,96,61,142,76,235,48,2,
+143,80,194,228,97,243,109,235,129,219,71,192,129,81,73,13,96,36,64,199,
+64,193,69,156,69,155,128,232,2,75,32,58,128,203,143,216,200,210,0,58,
+164,81,9,79,46,114,101,116,117,114,110,32,58,128,201,97,181,2,61,32,
+58,128,197,2,80,32,58,226,192,3,228,30,0,229,0,32,0,58,226,178,
+1,228,89,11,231,83,0,0,50,143,39,64,200,1,95,57,67,143,224,0,
+255,224,0,255,224,0,255,224,0,137,1,32,125,
+};
+unsigned char *combexpr = data;
+int combexprlen = 43133;
 #include "mhsffi.h"
 static struct ffi_entry table[] = {
 { 0,0 }
diff --git a/generated/mhs.c b/generated/mhs.c
--- a/generated/mhs.c
+++ b/generated/mhs.c
@@ -1,5293 +1,6318 @@
 static unsigned char data[] = {
-122,76,90,49,235,156,1,0,26,118,55,46,48,10,50,49,52,48,10,65,
-32,95,48,32,95,50,51,32,64,95,50,49,52,32,64,66,224,15,2,64,
-5,2,64,66,32,224,18,4,16,50,32,64,64,64,83,39,32,66,32,64,
-66,39,32,67,32,83,64,50,6,83,32,67,39,32,83,39,128,10,9,64,
-95,49,50,54,32,95,50,50,53,96,48,96,10,22,56,32,64,102,114,111,
-109,85,84,70,56,32,34,45,45,118,101,114,115,105,111,110,34,64,75,17,
-64,64,67,39,66,32,85,32,95,50,54,48,32,95,49,51,49,32,224,41,
-1,8,77,105,99,114,111,72,115,44,32,160,48,0,32,64,49,96,35,3,
-95,50,54,56,64,105,224,46,4,16,44,32,99,111,109,98,105,110,97,116,
-111,114,32,102,105,108,101,224,55,5,2,50,54,57,128,112,1,64,75,96,
-197,64,198,64,123,2,64,67,32,224,178,25,6,110,117,109,101,114,105,99,
-224,186,6,2,66,32,80,160,184,96,143,224,89,0,129,54,65,13,96,99,
-64,5,1,95,56,64,181,65,81,64,12,8,50,51,50,32,95,50,49,32,
-64,64,124,5,50,55,49,32,64,35,64,12,0,66,128,77,64,7,224,218,
-5,6,102,108,97,103,115,32,61,96,200,4,64,95,49,49,55,64,53,0,
-54,160,107,1,64,67,128,100,161,173,0,83,64,27,0,55,64,27,128,121,
-224,23,4,96,165,224,23,10,97,26,65,13,0,66,65,219,10,95,50,56,
-50,32,64,85,32,75,32,65,161,163,65,234,2,39,32,64,96,208,2,95,
-50,56,98,12,1,56,52,65,59,5,67,32,95,54,49,54,65,140,0,52,
-64,92,0,75,96,161,3,50,48,50,52,160,105,3,67,39,32,80,64,231,
-0,39,64,86,13,48,56,57,32,64,95,55,49,57,32,95,52,48,55,224,
-224,2,11,99,111,109,109,97,110,100,45,108,105,110,101,64,228,2,35,48,
-32,96,3,129,83,2,95,50,49,64,4,1,48,57,128,17,96,144,3,95,
-50,49,48,129,1,64,100,98,191,0,49,129,125,64,9,64,207,1,85,32,
-129,142,64,199,96,150,224,43,0,128,150,3,95,50,49,51,65,39,162,206,
-4,32,95,54,56,51,96,106,96,205,0,54,65,171,64,34,64,213,129,94,
-128,60,129,210,2,95,49,51,64,225,226,57,2,64,147,1,53,50,65,153,
-96,13,5,79,32,35,52,54,32,129,15,193,28,3,67,39,32,79,96,105,
-2,50,49,48,131,108,128,8,160,6,161,61,192,45,96,0,9,58,50,49,
-51,57,32,64,10,65,32,65,106,224,1,17,65,197,3,48,50,50,32,65,
-52,2,95,49,51,131,186,98,69,1,79,32,224,138,2,96,96,65,195,64,
-25,97,189,224,203,0,227,6,4,224,190,4,2,95,54,49,64,143,160,150,
-0,79,64,34,227,35,9,6,108,105,98,47,103,109,112,98,161,96,53,128,
-236,64,85,64,106,224,40,1,3,47,108,105,98,224,37,1,0,64,224,25,
-2,3,111,117,116,46,67,194,162,229,96,196,224,6,28,96,151,224,6,0,
-160,20,0,54,129,159,160,6,224,27,3,224,113,1,6,100,101,102,97,117,
-108,116,64,112,65,104,0,56,97,104,2,66,32,89,97,229,98,20,0,83,
-194,190,65,40,4,67,32,64,64,80,226,234,0,162,9,64,5,64,13,163,
-242,133,9,228,81,25,164,66,224,69,53,0,118,224,69,60,0,113,224,69,
-60,0,114,224,69,60,0,108,224,69,60,0,115,224,69,60,1,67,82,224,
-70,61,0,87,224,70,61,224,69,60,0,84,224,69,60,3,88,67,80,80,
-224,72,60,0,122,224,69,60,0,81,224,69,3,195,182,198,223,128,85,232,
-155,30,0,111,224,73,0,64,58,0,82,96,66,230,42,2,230,34,0,101,
-101,102,34,224,117,60,2,112,116,99,224,120,21,128,97,224,126,0,0,49,
-224,126,0,103,179,165,99,135,146,1,64,67,69,119,198,240,224,156,12,161,
-87,64,14,64,30,128,33,192,25,64,10,193,127,224,10,1,224,207,9,6,
-49,50,57,32,64,35,52,70,44,192,182,0,66,138,17,225,191,3,233,97,
-4,128,50,1,49,48,192,51,165,85,64,34,160,49,69,107,135,23,64,246,
-0,67,231,147,1,0,50,224,241,0,231,29,0,233,108,0,224,195,84,192,
-160,224,195,15,128,49,225,174,21,224,188,1,225,174,4,1,54,54,64,43,
-225,174,6,224,206,109,0,49,74,126,224,206,16,226,246,14,224,170,110,202,
-247,224,170,21,74,162,224,170,10,224,176,1,192,102,160,168,224,13,0,224,
-171,24,224,41,1,160,57,224,16,0,2,66,32,90,224,16,5,170,110,224,
-192,4,140,41,128,37,226,50,17,74,21,226,50,11,77,164,226,50,9,224,
-219,127,0,55,225,111,0,224,219,71,226,98,99,0,56,204,102,128,48,224,
-204,6,108,201,192,202,69,210,196,150,0,54,225,68,0,229,85,107,0,57,
-109,242,229,84,37,236,232,2,229,84,123,224,194,0,128,48,225,119,6,226,
-68,6,224,187,1,226,68,4,0,55,128,18,229,83,8,192,113,128,125,225,
-27,1,224,201,5,0,67,224,201,62,239,155,0,224,201,12,226,65,4,0,
-55,226,65,14,227,96,13,160,139,97,204,0,50,64,171,240,40,6,7,85,
-110,107,110,111,119,110,32,80,48,1,58,32,104,83,205,129,174,12,2,35,
-49,48,129,26,239,79,4,224,0,2,193,210,64,229,97,33,129,224,144,182,
-0,53,96,144,1,50,48,64,8,224,117,1,0,46,136,189,224,34,20,137,
-89,224,25,11,0,97,232,250,0,129,201,129,31,174,160,225,199,2,226,13,
-19,233,16,35,161,62,227,11,6,114,79,161,135,65,34,224,39,15,80,192,
-224,39,26,0,51,231,42,1,224,39,21,224,185,1,224,39,11,0,39,224,
-40,1,232,68,2,224,20,1,230,229,1,160,61,224,108,21,224,46,8,224,
-39,14,233,109,3,224,39,19,229,201,1,224,39,19,0,48,231,140,2,224,
-79,21,229,78,3,224,39,19,228,184,2,4,54,49,32,95,55,96,135,1,
-57,51,192,9,2,56,49,32,115,79,128,0,224,64,0,0,83,224,64,11,
-65,98,1,55,57,128,57,3,64,95,50,55,82,120,233,12,7,101,64,112,
-33,0,55,112,33,6,95,54,56,52,32,75,32,82,88,132,5,224,1,19,
-108,207,224,0,5,224,50,41,224,47,38,224,44,35,224,41,32,224,38,29,
-224,35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,20,11,224,17,
-8,224,14,5,224,11,2,192,8,96,5,100,189,151,3,224,0,10,66,31,
-0,54,226,31,5,0,90,224,146,4,224,1,13,226,31,255,224,34,21,226,
-31,156,226,29,18,66,28,0,53,226,28,5,224,100,1,235,89,6,224,1,
-17,226,43,255,224,34,21,226,43,101,225,244,13,65,239,0,52,225,239,15,
-64,1,161,243,225,245,255,224,37,24,225,245,91,225,202,11,65,200,0,51,
-225,200,17,193,198,224,84,7,224,1,9,225,197,255,224,34,21,225,197,58,
-224,23,14,227,167,12,65,221,0,50,227,166,19,227,168,2,225,227,255,224,
-37,23,225,227,65,225,178,10,65,176,0,49,225,176,21,225,178,3,225,179,
-255,224,37,23,225,179,36,225,150,9,65,149,0,48,225,149,23,128,1,225,
-155,2,225,158,229,225,53,6,0,58,144,75,225,50,27,192,1,225,58,5,
-64,0,224,49,23,225,62,12,224,136,2,64,132,158,244,224,132,28,224,128,
-7,224,43,19,128,1,225,189,107,225,104,4,64,225,239,180,6,224,78,21,
-225,100,8,224,46,21,64,1,224,228,60,224,181,3,64,180,0,54,224,180,
-31,224,176,6,224,40,17,192,1,227,81,151,227,40,5,65,11,237,56,16,
-224,1,1,225,5,3,224,31,11,224,1,5,228,84,192,224,38,29,224,35,
-26,229,211,8,65,119,236,192,20,224,1,11,228,161,9,224,88,2,64,81,
-235,73,10,64,51,224,87,23,225,177,255,224,35,3,224,32,23,224,29,20,
-224,26,17,224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,241,24,
-16,66,19,235,127,22,128,1,226,89,4,224,34,13,224,1,3,226,46,230,
-225,95,7,65,86,235,37,12,97,70,224,83,15,224,1,1,225,62,230,224,
-35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,20,11,224,17,8,
-224,14,5,227,98,15,66,10,139,154,94,55,156,222,156,81,0,50,126,189,
-0,50,128,10,0,56,219,33,123,240,1,95,48,91,201,89,16,0,51,124,
-147,156,3,89,6,128,9,224,31,0,219,110,1,54,54,89,81,157,124,89,
-111,1,57,53,89,85,0,57,186,172,0,54,123,52,1,57,52,89,98,64,
-31,0,67,96,75,220,196,252,194,6,11,67,97,110,110,111,116,32,102,105,
-110,100,32,188,25,2,66,32,85,221,185,3,32,95,56,49,224,155,1,96,
-80,3,95,50,49,49,96,139,224,10,3,64,9,1,56,32,64,253,0,49,
-139,101,64,109,1,50,57,128,58,224,227,6,2,50,57,49,64,19,87,221,
-1,51,50,64,148,64,65,224,33,5,2,49,49,54,156,151,0,66,224,128,
-2,64,82,1,54,48,157,162,78,148,3,79,32,35,53,225,71,0,96,29,
-224,112,1,128,41,224,234,6,0,32,192,224,0,89,127,165,64,56,128,99,
-3,67,39,32,89,154,155,190,180,161,122,120,131,93,141,128,174,1,49,48,
-222,48,1,67,39,92,227,64,167,0,55,190,42,193,111,252,247,3,64,225,
-0,57,65,244,129,154,0,64,161,177,65,36,140,5,159,2,66,80,190,124,
-128,15,64,112,125,148,0,53,127,118,1,50,57,94,222,192,6,0,49,97,
-133,93,114,66,42,160,21,64,82,139,118,66,109,1,49,52,97,95,225,81,
-4,0,56,98,28,130,77,225,81,0,221,227,225,134,0,222,253,0,50,64,
-77,64,223,0,56,128,37,226,57,12,22,103,101,116,68,105,114,101,99,116,
-111,114,121,67,111,110,116,101,110,116,115,58,32,99,130,79,3,111,112,101,
-110,193,110,129,94,158,66,0,66,64,5,225,233,4,98,84,223,5,65,11,
-65,145,0,83,97,111,224,138,9,226,150,0,224,65,3,97,149,224,24,9,
-67,135,254,228,1,225,190,3,226,90,8,1,95,50,127,155,65,85,224,18,
-2,65,89,65,181,1,49,52,128,123,65,101,0,54,97,101,9,94,99,95,
-100,95,110,97,109,101,32,64,19,139,47,7,94,114,101,97,100,100,105,114,
-96,18,137,202,0,75,224,145,5,0,54,66,40,225,128,4,194,168,191,65,
-225,91,1,64,91,0,58,129,63,67,238,0,56,98,204,1,57,52,128,145,
-224,66,29,6,118,101,114,115,105,111,110,224,69,1,0,50,66,57,1,95,
-50,193,6,224,69,29,13,99,111,109,112,105,108,101,114,58,32,109,104,115,
-45,96,74,1,95,55,132,8,224,64,29,6,100,101,112,101,110,100,115,224,
-134,1,0,53,66,138,64,46,3,48,53,32,85,99,112,160,51,0,64,128,
-231,192,66,4,79,32,35,52,53,163,222,128,187,129,140,1,57,52,66,16,
-130,86,225,195,2,96,126,224,118,1,15,101,120,112,111,115,101,100,45,109,
-111,100,117,108,101,115,58,162,138,165,79,227,1,3,0,85,99,160,131,84,
-224,79,17,4,111,116,104,101,114,224,77,7,192,60,129,80,228,127,1,0,
-95,66,183,100,128,0,54,225,14,7,164,131,64,24,129,213,1,55,48,160,
-217,128,0,66,60,139,181,128,170,0,66,224,151,7,226,188,0,227,181,2,
-0,39,64,101,2,56,32,95,64,114,223,84,98,252,229,8,14,15,66,117,
-105,108,100,105,110,103,32,112,97,99,107,97,103,101,128,147,129,82,101,1,
-163,171,230,123,7,67,158,66,64,0,55,64,217,95,156,229,51,3,67,180,
-196,98,132,197,227,232,1,2,95,50,56,163,76,101,86,160,48,0,39,224,
-5,8,224,230,3,192,131,224,232,30,192,234,128,10,224,239,5,3,87,114,
-105,116,224,238,9,133,211,66,120,226,181,9,2,32,116,111,193,168,68,249,
-224,0,0,224,219,0,96,195,128,108,224,183,6,161,160,0,39,96,2,4,
-32,95,49,57,54,69,58,192,70,160,46,2,50,49,48,100,83,160,79,134,
-97,96,8,200,54,1,67,32,102,122,64,41,131,47,0,55,68,207,0,85,
-102,181,3,64,85,32,65,96,156,1,50,54,96,69,224,21,5,2,64,95,
-57,100,250,163,99,136,73,164,61,227,254,0,64,15,160,174,129,49,225,169,
-6,192,195,225,126,29,225,127,22,6,67,111,109,112,114,101,115,68,142,3,
-32,116,105,109,193,128,129,73,225,130,0,101,125,71,79,67,246,134,139,4,
-52,48,32,95,55,131,31,225,155,2,1,109,115,194,175,168,121,229,232,2,
-1,95,49,168,59,1,32,95,64,6,64,190,64,176,0,53,97,125,195,108,
-64,51,104,117,73,198,73,58,134,42,67,123,141,29,1,66,32,232,34,1,
-225,144,1,168,9,239,67,1,128,7,230,90,4,141,56,65,174,131,37,105,
-162,64,88,140,31,0,83,196,240,2,53,49,55,129,222,94,166,1,95,49,
-68,211,198,241,104,79,1,64,35,165,236,166,135,131,13,0,80,227,154,1,
-98,128,224,50,4,101,46,161,8,168,70,99,147,135,226,129,219,228,64,2,
-66,20,200,90,74,78,96,181,68,184,65,17,0,53,97,147,64,14,0,53,
-128,57,1,48,53,65,0,231,149,0,224,163,3,0,73,64,9,89,214,224,
-174,2,161,4,104,54,226,14,8,195,134,103,64,104,44,9,102,32,116,104,
-101,32,102,111,114,109,96,20,0,45,198,187,131,130,169,101,4,53,32,95,
-49,53,130,110,97,81,139,102,195,129,64,1,235,187,30,224,11,2,192,8,
-73,240,128,86,67,109,133,125,2,95,50,52,67,185,2,57,50,52,67,197,
-0,55,64,224,0,73,105,189,67,186,224,121,0,2,95,49,56,65,255,101,
-201,129,127,96,21,1,54,51,65,32,65,2,70,20,0,54,106,27,65,60,
-1,57,52,70,232,1,49,55,129,113,96,77,137,184,66,114,202,0,162,94,
-65,112,229,49,5,204,22,195,158,2,67,32,95,106,82,97,104,225,96,2,
-14,107,103,80,97,116,104,32,105,115,32,101,109,112,116,121,230,174,0,130,
-178,129,255,96,6,0,79,66,67,0,79,235,68,0,192,27,128,135,96,105,
-134,134,231,52,5,228,29,13,3,32,95,50,55,103,197,0,49,131,180,0,
-35,131,98,228,27,22,6,73,110,115,116,97,108,108,229,158,9,64,99,168,
-23,229,155,6,0,105,234,89,0,64,81,230,39,0,233,103,5,196,94,70,
-144,224,13,1,229,191,0,224,208,4,3,95,50,48,57,65,228,132,72,128,
-86,224,226,0,128,50,224,253,10,64,53,65,241,203,230,161,63,225,172,1,
-99,120,200,19,225,91,2,161,123,135,94,231,215,19,161,81,0,35,99,91,
-231,203,14,4,99,114,101,97,116,231,193,1,224,84,6,102,3,224,219,1,
-69,254,101,1,66,56,78,143,192,150,128,193,101,53,78,61,66,192,66,240,
-165,48,2,95,56,48,166,43,169,41,236,218,8,64,116,97,171,96,57,97,
-179,138,173,233,204,10,224,101,3,234,147,4,238,179,1,64,0,0,75,132,
-81,98,218,64,196,197,162,1,48,54,99,47,70,243,2,90,32,75,96,47,
-64,21,214,180,96,43,69,122,1,50,49,64,180,64,26,213,87,2,32,95,
-53,75,201,64,25,0,50,128,25,137,105,193,227,0,80,109,238,0,32,133,
-38,68,213,239,173,2,225,112,1,1,46,47,161,107,135,110,167,123,64,84,
-0,49,128,84,179,96,2,50,49,48,66,145,0,48,69,15,64,22,134,0,
-129,144,78,48,64,89,69,91,96,28,240,50,0,163,224,1,95,52,102,23,
-2,50,48,57,111,85,96,49,128,61,64,54,101,98,166,226,2,95,52,53,
-100,0,174,7,96,48,64,126,64,64,224,125,0,97,17,64,21,229,188,1,
-2,95,50,57,97,4,96,33,110,139,98,125,195,68,80,71,71,21,1,95,
-51,71,78,226,156,0,224,30,8,0,55,86,181,224,30,8,2,95,51,55,
-64,6,227,58,8,1,95,50,69,192,208,73,96,125,129,183,168,237,96,212,
-224,99,2,109,72,66,107,0,48,80,51,1,35,53,69,156,79,99,237,166,
-0,65,165,163,27,235,124,0,162,240,97,91,129,102,2,48,57,51,96,223,
-228,78,2,225,218,2,66,155,0,55,229,2,1,71,249,129,133,229,25,1,
-129,152,238,156,0,96,13,0,64,231,122,4,140,147,129,6,228,186,2,229,
-92,3,131,250,168,43,0,85,72,221,142,86,238,96,3,64,186,129,232,0,
-80,192,32,64,190,161,169,194,174,0,89,230,12,0,0,66,64,134,134,119,
-64,17,224,54,2,224,140,0,160,87,130,149,2,94,109,107,142,162,97,80,
-1,10,65,228,72,2,4,85,115,97,103,101,109,230,2,32,91,45,199,129,
-0,93,64,11,6,110,117,109,101,114,105,99,224,19,3,0,118,64,4,0,
-113,64,4,0,108,64,4,0,115,64,4,0,114,64,4,5,67,91,82,124,
-87,93,64,9,3,88,67,80,80,64,7,3,68,68,69,70,64,7,4,73,
-80,65,84,72,64,8,0,84,64,4,0,122,64,4,0,105,192,18,4,111,
-70,73,76,69,64,8,1,97,91,96,18,64,10,0,76,96,10,3,124,80,
-75,71,96,14,0,80,64,8,12,32,91,45,81,32,80,75,71,32,91,68,
-73,82,96,22,5,116,84,65,82,71,69,96,82,26,111,112,116,99,32,79,
-80,84,73,79,78,93,32,91,77,79,68,85,76,69,78,65,77,69,46,46,
-124,96,94,0,34,129,68,232,54,1,234,243,7,231,104,3,236,246,1,230,
-95,9,0,55,101,75,230,74,0,224,42,1,68,193,0,53,101,4,115,64,
-0,90,229,231,13,72,76,133,26,106,174,229,254,0,135,111,128,0,64,27,
-0,85,160,35,128,9,160,10,224,183,11,230,235,2,206,46,132,210,162,6,
-160,167,231,12,2,224,21,8,224,24,1,192,239,166,250,160,80,173,158,224,
-96,3,232,15,31,236,33,28,16,116,111,112,32,108,101,118,101,108,32,100,
-101,102,110,115,58,32,96,0,237,167,0,230,93,3,3,49,48,32,35,198,
-89,236,46,1,165,134,128,22,232,46,5,7,40,117,110,112,114,117,110,101,
-180,223,224,76,3,224,64,2,0,95,112,123,68,11,0,49,233,14,2,225,
-18,24,238,183,9,231,198,22,228,168,1,152,36,161,19,160,53,132,160,241,
-7,4,224,201,2,0,61,160,193,68,210,68,118,224,166,6,225,208,5,131,
-250,224,186,1,174,144,76,22,3,95,50,48,51,168,234,226,85,1,226,164,
-4,104,186,106,254,146,122,229,110,5,224,55,4,226,143,12,224,119,5,234,
-191,4,226,55,68,9,102,105,110,97,108,32,112,97,115,115,130,49,226,55,
-3,163,157,97,82,128,59,226,59,0,160,74,238,109,17,231,239,2,238,109,
-4,163,245,162,5,129,5,206,21,130,167,240,8,16,224,225,1,65,126,139,
-27,170,102,228,66,1,236,79,3,5,54,32,95,57,54,57,160,146,141,150,
-1,54,32,129,143,0,53,97,15,130,237,1,57,49,198,248,0,51,96,41,
-78,92,1,55,54,64,54,0,48,231,234,0,232,198,11,0,104,192,215,104,
-146,128,92,1,50,48,77,199,1,95,55,134,206,64,14,160,201,192,225,161,
-137,226,106,1,161,94,192,30,225,82,3,96,19,98,72,1,48,51,109,66,
-104,181,1,32,95,225,102,0,2,35,49,48,72,248,225,125,20,6,32,108,
-105,110,101,115,47,225,131,2,237,14,4,229,135,3,100,238,194,250,160,123,
-100,212,128,155,110,188,1,50,48,73,87,225,5,2,3,99,111,109,98,192,
-91,165,7,224,53,4,72,152,224,53,10,235,110,1,225,190,3,3,95,55,
-53,52,226,156,2,3,109,104,115,99,224,42,7,229,202,0,230,25,11,64,
-106,206,225,160,126,236,166,4,201,55,224,168,0,227,75,7,1,95,54,73,
-173,193,208,106,237,97,197,98,243,1,95,55,194,53,235,255,6,224,11,0,
-210,165,240,99,1,193,223,64,80,160,76,227,227,1,96,13,136,248,242,144,
-0,1,48,56,184,50,105,63,4,95,49,48,51,55,65,214,98,194,81,102,
-225,29,2,2,97,105,110,227,89,3,2,58,50,48,86,25,107,218,128,224,
-137,105,103,22,130,92,105,183,76,57,64,16,224,156,0,226,116,4,236,111,
-1,67,67,101,32,81,198,70,30,147,28,226,90,2,0,125,192,126,64,29,
-1,85,32,172,112,226,221,3,90,21,224,13,1,238,71,2,174,74,96,48,
-224,17,4,192,20,226,150,2,224,48,8,224,51,10,224,57,3,226,136,3,
-224,29,17,224,65,3,133,234,194,51,194,184,224,45,11,128,41,224,37,8,
-229,135,0,236,129,1,166,145,97,101,129,229,136,143,72,166,3,95,49,57,
-51,131,172,4,95,49,56,49,32,133,169,2,95,54,51,98,157,98,125,68,
-118,65,85,1,75,52,161,118,224,159,6,67,49,0,49,106,148,64,6,196,
-100,224,31,1,99,38,224,234,8,225,5,2,192,40,246,169,2,123,55,1,
-95,54,85,110,224,34,7,224,62,0,99,48,128,120,224,34,3,64,18,131,
-90,128,15,178,27,65,2,124,10,81,102,78,57,0,57,192,56,192,42,128,
-145,132,106,147,111,224,99,6,99,149,103,242,160,17,2,95,49,48,250,202,
-2,225,9,13,225,3,2,192,161,224,165,5,192,156,160,220,233,148,1,160,
-184,193,21,131,132,0,55,198,68,177,145,96,147,96,208,70,62,64,122,214,
-94,227,61,1,77,151,142,216,229,210,4,128,0,226,46,0,0,67,97,229,
-0,50,175,134,234,195,6,3,64,66,32,82,64,213,0,53,217,176,173,183,
-128,237,232,74,5,234,235,1,142,226,231,229,5,1,65,32,228,40,0,224,
-122,1,142,254,226,110,1,161,20,96,21,201,73,224,207,1,254,41,0,228,
-54,12,228,20,2,4,64,92,49,48,38,230,17,0,143,98,160,67,69,125,
-233,114,3,163,127,137,46,160,9,131,32,230,165,3,2,95,57,56,65,29,
-96,239,100,98,160,134,193,61,65,60,192,85,2,80,32,90,240,212,0,132,
-180,192,25,65,32,0,85,96,42,130,129,3,85,32,75,51,64,2,160,11,
-224,53,0,86,129,224,11,0,236,186,0,0,54,71,103,66,154,2,55,52,
-50,229,142,1,0,52,86,250,102,35,233,87,8,1,78,111,75,136,3,105,
-110,105,116,87,179,4,102,111,117,110,100,85,158,187,197,170,160,227,109,1,
-69,187,213,20,1,95,49,84,219,2,95,50,48,145,126,100,59,125,11,135,
-130,129,42,96,140,118,251,105,25,191,179,81,119,247,120,10,195,91,130,34,
-196,199,132,167,64,233,130,74,65,79,247,136,1,194,94,224,94,36,161,198,
-164,101,224,108,0,96,176,141,212,161,88,224,107,4,96,106,226,206,0,124,
-225,0,54,128,224,194,131,71,141,225,98,8,11,35,105,110,99,108,117,100,
-101,32,92,51,52,130,112,218,142,2,79,32,35,69,74,236,208,2,71,205,
-233,196,11,7,109,104,115,102,102,105,46,104,205,40,2,95,53,57,71,34,
-103,205,225,72,24,150,12,224,244,6,224,13,0,99,200,192,36,224,46,2,
-224,10,6,163,241,225,124,5,129,14,129,18,225,24,0,225,16,0,136,156,
-1,50,48,119,81,227,161,0,224,212,1,31,115,116,97,116,105,99,32,115,
-116,114,117,99,116,32,102,102,105,95,101,110,116,114,121,32,116,97,98,108,
-101,91,93,32,2,61,32,123,64,239,227,205,6,234,194,1,82,122,168,251,
-0,64,224,87,3,4,123,32,48,44,48,135,244,224,22,3,1,125,59,224,
-17,7,224,121,8,1,42,120,64,11,96,127,1,32,61,128,135,96,52,228,
-12,3,247,130,6,24,85,110,105,109,112,108,101,109,101,110,116,101,100,32,
-70,70,73,32,102,101,97,116,117,114,101,225,170,0,2,50,48,55,84,166,
-0,53,75,171,0,54,106,101,0,51,75,200,97,187,64,28,169,110,203,18,
-225,206,1,65,107,65,195,232,31,1,225,151,1,132,133,160,5,193,240,0,
-83,99,120,2,83,32,73,130,83,71,144,228,136,0,96,3,96,12,231,18,
-6,135,129,224,85,0,99,114,75,12,4,61,61,32,64,35,133,110,192,30,
-166,168,231,100,1,242,145,2,116,204,2,50,48,56,230,62,1,194,16,68,
-26,0,54,244,246,0,184,251,170,118,130,89,128,23,217,7,64,19,91,62,
-199,104,211,128,97,49,227,29,12,5,100,121,110,97,109,105,203,128,64,85,
-0,85,97,118,64,189,224,238,3,224,85,37,6,119,114,97,112,112,101,114,
-224,85,7,101,17,192,85,225,48,1,224,77,23,130,236,235,7,2,97,30,
-155,117,193,226,192,253,186,15,193,231,137,247,71,223,237,233,23,224,94,0,
-194,58,136,149,1,48,56,103,6,0,54,161,155,97,200,108,237,160,23,162,
-121,224,132,12,226,124,11,128,19,225,64,14,68,212,199,131,224,85,1,196,
-139,224,93,0,194,177,224,84,3,225,74,4,149,111,64,74,96,0,194,116,
-230,29,0,64,14,225,129,4,0,66,71,101,64,212,97,155,245,144,2,226,
-2,3,225,176,33,3,118,97,108,117,163,196,224,102,13,141,201,0,39,64,
-103,1,95,53,76,209,192,242,224,138,7,224,17,4,161,107,192,139,226,246,
-1,104,40,133,142,226,93,1,64,38,231,203,15,231,204,9,1,98,97,103,
-188,11,101,105,103,110,32,105,109,112,111,114,116,32,135,198,253,88,10,99,
-150,151,147,109,49,64,14,150,146,104,139,64,14,0,51,128,14,0,50,86,
-69,64,201,253,132,2,222,253,224,13,9,231,81,1,253,109,0,64,62,150,
-132,224,105,0,149,155,192,105,67,168,1,10,65,230,27,4,5,71,69,84,
-82,65,87,229,176,7,11,71,69,84,84,73,77,69,77,73,76,76,73,224,
-27,7,2,97,99,111,112,60,224,19,4,2,100,100,95,86,18,224,23,11,
-3,117,116,102,56,224,23,8,0,115,142,170,224,19,4,1,116,97,224,19,
-12,0,50,224,20,7,4,99,97,108,108,111,99,225,224,21,4,3,108,111,
-115,101,112,121,224,21,4,224,171,9,2,101,120,112,224,18,7,4,102,108,
-117,115,104,224,59,8,3,102,111,112,101,224,145,8,2,102,114,101,98,172,
-224,19,3,2,103,101,116,224,60,8,5,103,101,116,101,110,118,224,21,7,
-7,105,115,119,105,110,100,111,119,224,148,8,2,108,111,103,224,18,7,0,
-109,224,230,12,6,109,100,53,65,114,114,97,126,129,224,23,6,0,66,225,
-129,11,7,109,100,53,83,116,114,105,110,224,94,9,3,101,109,99,112,224,
-70,9,4,101,109,109,111,118,224,225,8,1,112,117,224,225,9,225,194,10,
-3,115,113,114,116,224,19,8,4,121,115,116,101,109,224,21,7,225,235,10,
-5,116,109,112,110,97,109,224,122,8,1,117,110,225,94,11,5,117,110,108,
-105,110,107,224,166,8,4,101,101,107,80,116,102,73,224,22,4,2,111,107,
-101,224,22,14,3,87,111,114,100,224,69,11,224,23,11,66,204,13,108,122,
-55,55,95,99,111,109,112,114,101,115,115,111,224,82,8,224,34,0,1,100,
-101,224,36,21,2,114,108,101,224,70,22,64,33,224,69,23,2,98,119,116,
-224,69,22,64,33,224,69,19,64,235,4,95,117,105,110,116,227,162,8,65,
-29,224,25,14,192,51,1,49,54,224,52,16,224,26,10,192,53,0,51,227,
-208,8,224,53,0,224,26,10,192,53,1,54,52,224,53,16,224,26,10,64,
-53,224,212,16,224,211,16,224,210,17,224,209,17,224,208,17,224,207,17,224,
-206,17,224,205,17,3,117,115,104,111,227,92,9,129,3,224,26,13,64,53,
-224,52,17,224,51,17,65,82,225,107,16,224,207,15,224,205,15,224,97,13,
-1,108,111,228,143,9,128,98,224,25,12,64,51,224,50,16,224,49,16,1,
-117,108,224,102,18,224,103,17,224,104,17,224,51,16,1,102,108,224,255,13,
-224,23,10,5,115,105,122,101,111,102,225,25,11,160,25,224,100,11,192,26,
-224,27,11,70,163,1,100,105,227,215,8,103,13,224,23,10,3,114,101,97,
-100,224,46,11,2,95,100,95,229,124,11,1,99,104,224,44,10,126,241,224,
-20,7,4,103,101,116,99,119,229,50,8,6,103,101,116,95,98,117,102,224,
-180,11,3,98,95,114,100,224,27,17,1,119,114,224,27,11,6,110,101,119,
-95,109,112,122,224,144,8,4,112,122,95,97,98,231,83,8,96,22,0,100,
-224,147,8,96,22,0,110,224,22,12,1,99,109,232,26,8,64,22,64,197,
-224,47,12,64,24,1,115,105,224,25,15,0,117,224,25,12,82,2,1,95,
-115,224,56,16,224,30,0,224,61,14,229,194,9,64,22,2,109,117,108,224,
-22,14,1,95,50,232,239,10,64,27,1,110,101,232,18,9,8,112,122,95,
-112,111,112,99,111,117,226,158,9,64,27,1,115,117,231,135,8,64,22,5,
-116,100,105,118,95,113,224,104,16,128,30,224,182,12,4,116,115,116,98,105,
-224,106,12,0,120,224,231,9,5,119,97,110,116,95,103,129,161,240,39,3,
-224,0,92,75,60,147,143,145,18,81,111,75,107,124,84,0,49,93,252,2,
-95,49,49,124,104,0,50,204,236,240,107,1,3,95,49,49,50,91,175,96,
-32,0,54,92,180,1,48,55,85,105,240,140,1,64,94,147,213,2,95,52,
-55,237,44,0,2,48,55,53,143,197,224,5,5,160,24,1,95,49,89,144,
-85,75,122,202,128,6,224,45,25,224,52,3,224,45,18,224,84,3,160,52,
-224,45,25,224,98,4,1,53,56,224,232,1,0,53,81,136,128,11,64,234,
-0,54,96,234,3,115,99,109,112,76,242,64,66,122,164,0,90,114,252,0,
-90,176,244,142,193,86,240,1,50,48,87,90,175,200,128,80,96,5,96,75,
-141,75,224,56,9,81,90,78,185,237,188,8,0,123,116,31,148,32,0,83,
-246,214,5,224,36,1,64,34,4,44,32,109,104,115,68,65,1,114,95,96,
-44,212,77,224,37,1,1,125,44,96,24,96,0,110,65,224,105,11,224,104,
-31,224,99,24,193,7,224,210,15,224,104,64,225,101,4,65,99,142,160,156,
-69,146,180,129,89,0,90,117,149,225,117,1,247,31,0,207,110,149,230,96,
-8,151,55,2,50,48,53,81,85,224,154,5,225,98,1,114,48,113,49,81,
-43,155,6,152,131,96,172,64,121,0,83,96,29,116,239,125,125,224,17,5,
-67,146,64,46,239,202,8,2,49,49,49,64,12,224,116,1,207,191,16,38,
-32,109,117,115,116,32,98,101,32,80,116,114,47,70,117,110,172,41,79,84,
-240,175,12,2,40,72,115,128,37,0,41,193,47,224,40,4,177,10,64,5,
-96,180,241,166,7,64,165,153,190,211,151,193,20,193,222,159,225,65,0,160,
-43,129,7,226,211,1,147,89,227,133,0,129,130,97,107,179,232,64,31,96,
-68,64,87,97,34,243,142,0,82,78,2,50,48,55,99,161,128,100,182,106,
-126,149,226,53,8,0,59,98,49,64,15,7,95,85,110,105,116,40,115,44,
-144,233,249,244,12,4,79,32,35,52,49,224,234,2,115,20,226,141,3,64,
-32,222,68,224,65,0,65,0,1,54,51,224,115,2,192,98,2,32,95,52,
-65,185,2,50,48,55,101,104,7,52,52,57,32,95,52,53,54,225,15,0,
-224,110,6,0,95,153,66,89,187,131,35,129,60,191,72,65,141,1,53,49,
-181,102,228,68,3,66,223,241,115,1,224,254,6,64,252,1,116,111,162,155,
-161,173,128,246,2,50,48,54,68,243,224,49,8,225,33,35,64,122,145,175,
-67,90,129,222,118,13,229,162,2,0,85,97,156,66,93,1,54,53,82,173,
-64,120,128,197,64,61,145,222,124,106,224,130,2,98,152,0,58,128,40,166,
-177,0,54,64,104,1,95,56,65,61,64,24,134,202,227,58,5,65,12,184,
-101,64,34,166,142,224,90,5,12,80,114,105,109,105,116,105,118,101,115,46,
-73,79,192,101,0,54,161,61,0,85,98,149,224,199,3,97,183,180,246,192,
-31,244,161,0,224,241,10,181,32,64,29,0,85,226,205,1,230,109,0,225,
-6,3,160,43,245,108,1,128,139,134,74,147,33,225,203,10,98,200,163,182,
-96,93,68,151,225,209,5,229,200,11,225,212,0,226,3,5,253,200,3,224,
-51,8,226,197,1,96,44,227,27,7,64,172,134,186,68,240,155,125,101,53,
-163,170,2,67,32,60,161,64,131,223,248,44,3,96,21,161,79,0,90,64,
-4,0,85,164,4,224,36,3,165,59,86,129,192,89,226,74,10,96,37,229,
-214,1,224,30,7,96,105,224,211,1,229,29,3,226,20,2,192,18,128,0,
-224,115,2,100,173,1,95,53,67,184,169,18,130,135,1,50,48,156,229,184,
-185,253,71,12,165,176,225,87,8,17,78,111,116,32,97,32,118,97,108,105,
-100,32,67,32,116,121,112,101,221,67,2,49,51,57,99,25,65,90,134,177,
-164,116,229,200,14,226,204,2,4,70,108,111,97,116,117,5,246,163,13,224,
-31,2,0,64,224,79,27,0,73,139,64,224,76,13,192,28,224,73,28,210,
-136,224,74,13,224,29,0,224,75,17,3,68,97,116,97,96,69,96,4,112,
-248,224,75,17,128,30,224,76,17,132,90,224,63,13,70,31,224,62,22,0,
-83,116,11,8,46,73,79,46,72,97,110,100,108,151,245,225,1,13,194,83,
-231,55,3,0,53,67,25,0,80,168,62,225,167,13,135,212,8,46,67,46,
-84,121,112,101,115,46,128,67,66,102,236,73,3,3,67,67,104,97,236,94,
-8,1,67,83,224,21,12,0,85,224,43,13,241,61,11,1,67,85,224,22,
-13,161,239,224,42,5,224,20,11,0,76,239,223,10,1,67,85,224,21,12,
-5,80,116,114,100,105,102,239,32,8,3,67,83,105,122,239,196,8,1,67,
-83,224,21,12,0,76,224,110,14,224,22,12,1,84,105,144,28,225,142,0,
-224,0,1,67,110,135,64,230,44,17,228,56,1,64,45,134,243,224,45,17,
-224,42,2,134,224,229,146,10,3,118,111,105,100,234,205,1,232,106,9,224,
-41,1,8,40,105,110,116,32,115,41,32,123,229,144,5,224,32,1,0,59,
-158,194,128,202,73,49,103,26,169,82,3,95,50,48,51,94,85,1,50,48,
-72,185,136,86,64,9,64,102,5,48,53,32,35,49,50,165,43,0,53,105,
-212,64,65,174,39,2,50,48,53,103,88,167,115,64,31,3,10,65,32,94,
-246,69,10,77,4,64,37,192,233,0,50,101,127,96,10,0,48,94,197,128,
-126,101,139,64,231,69,46,160,23,198,144,64,18,0,56,67,19,219,43,2,
-95,50,50,69,116,173,228,5,95,54,32,64,95,51,110,180,1,48,52,135,
-62,0,52,109,64,134,111,224,58,1,64,31,136,214,128,232,67,97,1,48,
-52,106,156,0,49,172,122,224,26,4,90,228,3,95,49,57,51,69,186,64,
-9,2,56,49,32,169,156,224,153,2,224,156,5,97,43,138,107,167,76,192,
-203,1,95,57,128,160,136,222,224,30,15,187,87,188,199,225,9,2,160,152,
-0,53,64,12,123,15,224,65,0,224,222,1,95,31,231,196,0,224,245,3,
-0,53,102,120,0,49,224,165,1,224,0,1,65,156,136,86,0,94,154,99,
-97,174,135,187,124,106,65,173,64,18,134,115,84,17,1,67,65,153,115,2,
-76,101,110,96,44,131,30,0,94,179,13,96,18,163,3,6,56,56,32,75,
-32,95,57,64,211,192,7,1,95,57,112,33,96,231,2,95,57,52,224,11,
-2,111,68,128,11,1,49,48,64,170,128,12,65,5,0,52,162,145,0,50,
-65,232,65,169,2,66,32,95,79,153,136,210,200,181,0,48,66,74,96,30,
-1,95,51,71,142,64,136,170,66,224,136,17,97,143,160,136,160,11,96,136,
-128,11,160,136,96,12,224,136,1,2,50,48,52,67,52,224,137,3,158,96,
-160,137,1,50,48,93,89,192,138,64,5,0,58,128,67,65,38,85,59,1,
-80,116,99,21,64,37,96,18,153,216,96,18,131,71,174,81,108,229,105,129,
-227,6,9,141,35,2,95,49,48,98,49,64,58,0,54,163,99,64,51,0,
-52,126,155,112,190,204,7,64,71,67,251,128,163,66,208,0,51,96,214,96,
-87,66,32,192,189,65,101,98,74,64,217,128,58,130,15,0,94,156,73,96,
-167,130,14,0,94,91,58,96,15,162,4,244,223,3,96,23,130,9,65,37,
-64,82,237,41,0,228,159,1,30,115,116,97,116,105,99,32,117,110,115,105,
-103,110,101,100,32,99,104,97,114,32,100,97,116,97,91,93,32,61,32,123,
-229,150,0,64,165,197,2,146,161,0,48,129,96,6,50,48,51,57,32,35,
-50,170,17,224,90,3,1,125,59,100,249,224,20,5,224,104,5,10,42,99,
-111,109,98,101,120,112,114,32,61,96,116,128,49,159,142,229,107,8,69,106,
-192,47,5,108,101,110,32,61,32,192,45,229,156,1,235,52,1,141,177,2,
-79,32,35,69,116,134,89,198,95,65,24,197,251,0,89,64,55,74,190,0,
-85,64,56,98,70,96,16,95,13,224,7,1,229,8,1,69,151,206,6,107,
-90,238,2,1,0,52,65,239,160,95,65,219,109,29,1,49,51,240,97,1,
-224,160,6,133,38,75,187,0,52,160,161,64,56,130,148,64,97,1,75,52,
-160,2,0,90,64,4,224,186,0,70,49,102,225,1,57,54,65,226,0,51,
-130,119,66,110,0,52,84,40,0,50,66,85,64,23,210,248,1,75,51,128,
-62,64,19,130,72,64,245,2,66,32,80,96,196,205,52,133,74,0,67,105,
-2,225,1,11,225,9,0,161,2,96,0,64,18,140,158,1,55,48,70,5,
-0,54,100,17,64,104,209,212,0,75,132,190,0,51,130,159,96,15,96,208,
-224,1,5,224,222,0,224,227,0,206,185,0,75,224,43,8,224,53,15,192,
-57,129,216,76,111,0,80,97,121,226,246,1,2,64,95,54,98,19,135,91,
-64,146,227,116,0,64,188,1,50,48,97,58,198,209,128,14,163,47,0,35,
-77,78,194,62,0,75,76,76,101,235,237,93,1,0,83,237,93,8,97,35,
-237,29,0,224,25,3,96,58,109,49,237,141,4,64,154,0,85,128,140,160,
-161,231,111,0,224,195,3,1,50,48,140,236,224,196,2,64,0,115,39,237,
-162,3,96,101,115,85,224,62,27,2,85,32,83,128,144,2,95,49,51,86,
-71,97,39,65,45,110,15,99,243,97,14,2,50,48,48,174,32,160,17,5,
-66,32,95,57,56,52,64,4,0,53,64,4,0,54,227,175,2,192,9,168,
-255,96,41,0,53,164,64,0,50,161,98,131,112,96,0,225,69,12,193,2,
-224,219,5,96,21,66,28,161,135,224,34,10,96,165,224,34,4,225,74,9,
-1,56,57,136,174,225,10,2,0,58,128,213,195,186,64,162,0,55,98,193,
-64,169,111,79,110,232,1,53,55,78,121,101,164,2,51,50,56,73,168,105,
-160,65,212,96,31,72,192,97,67,0,35,134,102,0,64,224,23,8,2,54,
-53,53,67,185,98,66,224,24,4,78,154,1,49,49,137,247,1,49,50,229,
-57,3,2,116,102,56,76,47,5,58,32,98,97,100,32,204,57,226,73,3,
-0,83,197,55,64,147,96,237,1,55,57,137,60,164,177,1,35,50,106,103,
-163,224,229,102,0,224,46,11,68,212,1,35,49,193,159,224,44,35,224,41,
-32,131,79,98,115,72,0,1,49,57,65,15,160,168,145,128,224,27,20,224,
-26,4,160,20,97,13,225,8,28,0,50,128,47,224,216,81,224,187,47,224,
-184,22,0,49,98,179,224,139,39,224,111,12,203,167,0,67,64,74,64,39,
-66,230,134,92,70,29,100,65,0,85,130,252,0,54,200,70,131,43,64,63,
-132,43,101,85,1,49,51,98,247,71,30,0,50,70,118,209,234,134,139,128,
-46,224,28,15,96,206,224,28,3,67,9,131,90,131,147,109,82,0,56,224,
-19,0,64,59,97,44,224,181,0,99,207,64,150,96,74,224,150,0,231,108,
-15,247,47,3,64,14,231,123,2,69,25,128,230,201,231,2,95,50,54,71,
-83,232,134,4,17,87,101,108,99,111,109,101,32,116,111,32,105,110,116,101,
-114,97,99,78,88,17,32,77,105,99,114,111,72,115,44,32,118,101,114,115,
-105,111,110,32,67,157,2,95,50,54,74,218,183,147,64,147,224,89,1,0,
-51,75,0,129,63,74,174,64,105,224,100,1,8,85,115,105,110,103,32,71,
-77,80,229,60,0,237,152,3,1,95,55,70,45,153,26,236,163,6,1,54,
-51,107,63,64,88,198,126,2,95,55,49,107,107,71,162,101,193,96,141,0,
-75,65,31,128,58,179,41,4,67,32,95,54,56,132,243,64,160,0,49,103,
-204,187,112,129,31,136,62,6,95,54,56,52,32,75,32,70,171,128,1,136,
-6,192,13,224,1,17,0,67,161,118,224,0,2,224,50,41,224,47,38,224,
-44,35,224,41,32,224,38,29,224,35,26,224,32,23,224,29,20,224,26,17,
-224,23,14,224,20,11,224,17,8,65,254,232,22,0,224,0,1,65,254,137,
-212,224,92,5,224,1,13,225,233,10,226,31,255,224,37,23,226,31,151,224,
-14,5,224,11,2,192,8,108,64,224,0,5,66,60,179,197,68,255,0,54,
-76,240,2,95,49,57,82,181,68,190,128,15,0,54,69,168,68,208,224,34,
-0,69,47,0,54,89,117,109,120,0,57,73,200,1,95,55,100,155,0,55,
-119,190,0,64,224,77,2,64,39,229,67,6,85,165,7,32,39,58,113,117,
-105,116,39,69,173,64,8,13,44,32,39,58,104,101,108,112,39,32,102,111,
-114,32,64,9,133,96,224,73,2,101,152,0,54,79,97,64,115,64,162,224,
-91,10,31,87,65,82,78,73,78,71,58,32,67,111,109,112,105,108,101,100,
-32,119,105,116,104,32,71,72,67,44,32,115,111,32,108,84,110,15,101,100,
-32,102,117,110,99,116,105,111,110,97,108,105,116,121,182,48,99,97,169,134,
-65,24,177,172,225,7,1,1,55,54,140,3,1,57,55,75,113,160,234,146,
-171,224,33,2,1,49,57,156,146,230,5,1,129,51,97,135,129,54,165,255,
-160,33,0,49,75,157,192,30,229,252,1,104,8,0,57,113,147,224,222,1,
-4,46,109,104,115,105,96,174,224,19,1,1,62,32,128,191,87,126,96,192,
-111,51,160,203,203,127,66,2,231,223,2,0,35,84,175,135,148,225,213,1,
-70,130,81,25,193,6,224,190,4,2,95,50,48,93,72,0,80,128,194,225,
-117,6,1,66,121,151,213,225,66,3,161,69,237,246,1,1,95,53,77,56,
-96,223,162,104,134,193,105,234,96,179,226,53,20,11,85,110,114,101,99,111,
-103,110,105,122,101,100,80,110,2,109,97,110,185,5,224,82,9,194,244,79,
-64,96,10,71,9,142,82,109,246,117,232,64,25,5,85,32,64,95,53,56,
-148,123,78,186,226,230,13,126,172,181,254,232,114,4,8,65,109,98,105,103,
-117,111,117,115,192,144,186,149,113,215,141,150,0,53,73,33,205,77,224,169,
-11,64,0,64,118,0,53,67,70,64,8,99,77,72,45,137,137,160,62,65,
-127,96,70,0,58,129,136,1,10,65,250,227,17,67,80,96,135,1,95,56,
-130,79,160,114,142,184,249,169,17,2,99,108,101,172,188,64,56,228,17,3,
-74,164,0,56,232,171,0,227,223,4,1,56,50,142,203,72,161,1,55,49,
-232,160,1,200,181,1,49,57,85,9,200,181,168,229,1,95,54,81,45,225,
-16,14,224,159,16,4,114,101,108,111,97,187,24,0,56,227,119,7,100,128,
-227,142,9,163,166,227,141,19,2,95,55,48,208,96,225,251,5,1,56,50,
-106,249,224,218,8,225,0,4,165,46,225,217,14,224,203,16,4,100,101,108,
-101,116,131,53,224,120,8,97,111,96,129,180,31,194,23,66,87,66,38,128,
-26,0,50,97,207,226,43,3,66,45,157,221,224,144,11,224,139,16,2,116,
-121,112,224,137,11,66,114,158,241,224,73,32,1,107,105,163,148,224,73,9,
-66,214,224,73,34,230,2,0,0,75,228,23,12,64,81,226,65,16,204,70,
-99,43,144,31,224,88,1,0,67,131,169,5,115,58,92,49,48,38,102,132,
-0,32,96,0,96,9,172,44,96,26,130,109,64,26,160,9,5,109,111,100,
-117,108,101,128,28,99,42,96,55,128,9,9,97,108,108,32,100,101,102,105,
-110,105,70,86,128,35,129,226,3,32,100,32,32,192,9,224,32,0,4,40,
-115,41,32,100,96,36,65,123,1,32,101,64,72,3,115,104,111,119,126,218,
-4,32,111,102,32,101,96,28,65,78,0,32,96,159,224,28,4,0,116,96,
-28,65,33,128,186,7,116,104,105,115,32,116,101,120,96,23,117,181,128,0,
-8,101,118,97,108,117,97,116,101,32,64,19,1,101,115,76,253,64,33,3,
-100,101,102,110,160,33,11,97,100,100,32,116,111,112,32,108,101,118,101,224,
-192,3,64,38,0,34,110,98,65,101,141,123,227,87,7,236,201,0,227,87,
-9,1,49,57,121,90,134,116,77,244,197,58,1,79,32,115,79,97,160,65,
-194,131,77,0,80,227,139,0,64,57,66,239,0,75,227,198,13,229,144,12,
-1,57,57,99,165,2,50,48,49,119,214,0,50,130,28,235,42,3,64,198,
-0,54,235,35,0,2,95,50,56,218,137,214,101,2,80,32,79,146,143,130,
-57,230,60,6,198,64,224,13,1,0,85,224,13,2,96,25,241,231,0,103,
-108,0,64,88,162,102,106,135,114,0,54,123,218,193,15,245,165,0,128,18,
-64,172,64,230,1,50,48,100,133,96,172,246,34,0,0,50,86,37,128,19,
-214,34,230,130,6,98,19,198,116,64,26,192,252,224,41,8,247,151,0,161,
-147,225,139,3,128,98,140,71,224,49,1,73,168,0,95,102,74,64,29,138,
-40,226,8,75,2,49,57,57,143,136,226,8,63,92,160,98,8,1,49,57,
-113,89,192,0,64,198,217,121,226,8,46,225,250,64,97,249,0,48,112,97,
-225,249,2,233,46,2,0,54,114,57,158,105,117,43,0,73,97,135,64,43,
-248,63,0,64,28,64,19,132,228,3,80,32,95,56,86,6,128,5,64,23,
-184,146,226,8,5,132,199,98,12,130,49,0,55,112,238,224,36,5,0,40,
-224,37,13,224,32,1,5,41,32,119,104,101,114,100,167,12,105,109,112,111,
-114,116,32,80,114,101,108,117,100,224,17,3,18,83,121,115,116,101,109,46,
-73,79,46,80,114,105,110,116,79,114,82,117,196,129,25,97,117,108,116,32,
-78,117,109,32,40,73,110,116,101,103,101,114,44,32,68,111,117,98,108,101,
-41,224,32,3,1,73,115,157,83,1,32,40,128,7,224,28,4,0,83,69,
-19,2,40,40,41,96,20,98,218,129,12,0,54,226,168,20,161,172,1,32,
-83,98,29,3,49,32,95,57,134,154,0,57,242,241,0,234,243,1,130,190,
-66,22,226,151,7,1,64,90,130,222,71,168,0,95,247,44,1,98,19,124,
-58,74,96,160,96,0,49,97,247,64,12,203,251,227,40,50,135,230,224,144,
-9,66,69,96,78,0,64,72,26,224,26,0,130,112,224,86,2,227,253,16,
-64,163,97,54,224,157,4,227,104,2,1,55,50,66,143,104,115,3,83,32,
-95,50,92,218,103,124,223,59,192,42,0,80,96,205,170,204,243,25,1,224,
-61,1,224,32,0,242,234,9,164,198,0,54,136,227,1,50,48,94,187,0,
-80,64,122,179,237,226,170,2,91,159,163,168,65,23,225,131,0,64,202,223,
-167,237,103,1,64,79,1,83,32,64,101,65,110,0,89,160,7,64,107,0,
-53,94,91,193,150,224,24,1,155,133,192,13,164,4,64,13,0,39,132,41,
-205,188,163,210,128,18,64,54,227,218,0,241,172,5,148,40,0,54,94,150,
-64,30,69,77,229,203,9,19,114,97,110,115,108,97,116,101,58,32,110,111,
-116,32,102,111,117,110,100,32,138,238,155,33,139,85,0,54,128,89,64,232,
-209,249,0,89,206,77,0,83,130,97,98,225,192,212,186,206,141,1,0,80,
-111,181,174,19,129,105,129,124,100,75,196,225,131,36,64,76,64,17,249,249,
-4,128,239,224,32,18,133,202,165,22,224,32,11,130,194,161,66,250,27,3,
-192,24,0,85,64,155,99,72,128,165,250,200,15,5,100,121,110,115,121,109,
-163,249,218,198,1,95,49,86,150,193,118,224,99,8,96,157,0,85,225,140,
-31,65,136,6,32,112,114,105,109,111,112,161,136,150,187,1,50,53,66,57,
-170,110,78,218,0,52,85,221,155,193,1,50,48,64,87,128,0,224,228,10,
-194,47,0,85,160,223,251,186,0,226,132,0,65,185,225,52,8,128,34,128,
-79,98,204,224,28,3,98,16,224,105,8,96,21,95,62,97,228,224,116,5,
-1,49,50,192,164,224,32,3,225,13,24,69,215,5,115,115,105,98,108,101,
-174,233,129,15,0,57,173,22,98,147,178,80,125,45,76,188,143,4,0,54,
-193,158,112,226,70,213,216,230,96,52,135,149,236,13,6,93,223,199,139,67,
-127,224,30,9,81,137,96,30,0,79,224,30,13,0,53,160,30,64,4,236,
-106,16,1,67,39,204,178,224,67,11,88,35,96,67,65,150,224,30,10,192,
-98,89,220,224,98,16,0,83,128,98,99,134,224,67,9,67,219,96,67,68,
-61,224,197,10,0,51,160,30,67,167,224,61,10,192,30,67,108,224,30,10,
-192,160,67,215,224,30,10,193,65,68,250,224,191,16,0,66,128,191,68,252,
-224,67,10,82,164,96,67,73,16,224,98,10,0,50,160,30,0,82,224,98,
-19,1,75,50,96,98,100,134,224,36,17,0,51,128,36,66,110,224,36,17,
-0,52,128,36,70,191,225,244,18,0,66,161,245,226,89,13,0,52,193,85,
-0,43,224,30,13,193,85,0,45,224,30,13,192,242,0,42,224,131,19,2,
-113,117,111,145,167,64,8,224,40,19,1,114,101,132,229,2,114,101,109,224,
-38,19,0,117,224,80,0,96,9,224,42,20,192,82,64,8,224,40,19,2,
-110,101,103,96,39,2,110,101,103,224,38,19,211,140,2,97,110,100,224,38,
-19,0,111,146,94,1,111,114,224,36,19,0,120,160,37,0,120,224,38,21,
-2,105,110,118,96,38,2,105,110,118,224,38,19,2,115,104,108,96,38,2,
-115,104,108,224,38,21,128,116,1,115,104,224,116,20,0,97,192,39,64,8,
-224,79,20,2,117,98,116,92,130,128,84,160,12,224,48,19,6,112,111,112,
-99,111,117,110,128,48,192,12,224,48,19,2,99,108,122,96,43,2,99,108,
-122,224,38,20,0,116,160,38,0,116,224,38,20,1,61,61,96,37,70,56,
-224,36,17,0,47,128,36,0,47,224,36,10,69,10,196,6,0,60,224,67,
-19,0,60,128,67,0,60,224,67,14,195,56,0,62,224,67,19,0,62,128,
-67,0,62,224,172,20,1,117,60,96,36,0,117,224,141,20,0,117,160,142,
-0,117,224,143,11,224,38,2,0,62,128,37,224,149,20,0,117,160,150,0,
-117,224,151,21,1,111,114,131,42,1,111,114,227,42,20,0,99,162,104,0,
-99,226,103,21,1,102,43,96,37,0,102,228,166,10,224,36,2,0,45,128,
-36,228,172,10,224,36,2,0,42,128,36,228,178,20,1,102,47,128,36,0,
-47,224,36,20,162,76,0,102,226,77,21,0,102,162,78,0,102,226,79,11,
-224,38,2,129,199,0,102,225,199,20,0,102,161,199,0,102,225,199,21,0,
-102,129,199,0,102,225,199,20,0,102,161,199,0,102,225,199,21,0,102,197,
-26,64,8,224,40,20,83,188,128,41,115,198,224,42,19,1,114,101,182,224,
-96,9,224,42,19,3,105,116,111,102,96,41,64,8,224,40,19,2,115,101,
-113,96,39,2,115,101,113,224,38,22,1,117,97,165,42,96,10,224,44,19,
-224,43,1,224,42,24,2,115,99,109,149,200,64,8,224,208,20,192,40,64,
-8,224,40,19,0,117,192,40,64,8,224,40,19,1,114,110,129,33,1,114,
-110,225,32,20,3,73,79,46,62,161,242,128,10,224,44,24,224,43,1,224,
-42,22,5,114,101,116,117,114,110,192,46,128,13,224,50,22,0,112,81,41,
-192,49,96,12,224,48,22,7,115,101,114,105,97,108,105,122,151,194,224,16,
-3,224,56,22,1,100,101,224,58,8,224,18,2,224,117,23,2,116,100,105,
-224,216,0,96,12,224,48,25,1,111,117,224,216,0,128,13,224,50,25,1,
-101,114,133,5,224,13,0,224,50,22,7,103,101,116,65,114,103,82,101,129,
-248,224,16,3,225,118,23,7,101,114,102,111,114,109,73,79,225,122,0,192,
-16,224,113,23,0,99,224,106,0,0,99,224,42,19,3,114,97,105,115,129,
-103,96,9,224,42,19,4,99,97,116,99,104,96,42,96,9,224,42,19,239,
-2,2,128,10,224,44,19,4,110,101,119,67,65,147,72,1,76,101,129,188,
-224,18,5,224,60,19,3,112,101,101,107,192,42,96,58,224,16,3,224,56,
-31,192,118,224,19,6,224,62,19,2,116,111,73,163,15,96,9,224,42,21,
-1,80,116,130,46,96,9,224,42,21,1,68,98,132,192,96,9,224,42,21,
-2,70,117,110,224,88,1,128,12,224,48,19,5,65,46,97,108,108,111,130,
-22,160,11,224,46,21,3,99,111,112,121,160,45,64,10,224,44,21,0,115,
-195,174,128,10,224,44,21,230,78,0,128,10,224,44,21,2,119,114,105,188,
-145,160,11,224,46,21,167,228,64,8,224,40,19,2,98,115,43,136,162,64,
-8,224,40,23,0,46,224,41,0,0,46,224,42,23,224,84,1,224,85,22,
-160,167,64,8,224,40,21,168,142,64,8,224,40,21,136,144,1,98,115,232,
-145,20,1,98,115,168,146,64,8,224,40,21,134,79,1,98,115,230,77,20,
-1,98,115,166,163,64,8,224,40,21,199,31,96,9,224,42,21,3,112,97,
-99,107,160,43,64,10,224,44,21,1,117,110,224,46,2,128,12,224,48,21,
-4,108,101,110,103,116,132,201,192,12,224,48,21,3,115,117,98,115,163,105,
-192,12,224,48,19,192,9,96,48,224,22,0,224,48,18,1,116,111,224,46,
-0,128,10,224,44,19,3,104,101,97,100,224,46,0,192,12,224,93,20,2,
-97,105,108,224,95,1,160,12,224,191,20,0,112,171,189,0,112,235,190,21,
-1,112,50,129,208,64,8,224,40,21,1,110,101,170,105,64,9,224,42,21,
-0,102,167,191,96,9,123,106,148,3,224,0,106,84,1,186,249,87,83,88,
-159,87,211,0,55,183,234,183,223,244,146,6,1,32,61,85,153,0,110,154,
-85,116,141,224,44,0,0,54,110,75,248,223,3,153,57,252,221,4,2,95,
-105,116,103,237,64,27,155,63,221,65,188,53,253,65,37,64,70,155,110,224,
-98,4,160,96,0,54,149,20,6,51,55,56,32,95,51,57,96,223,0,56,
-118,73,0,56,85,34,64,237,1,51,53,128,41,217,134,1,95,54,83,55,
-88,181,3,95,54,56,51,96,148,0,51,64,54,149,106,149,197,186,210,64,
-54,152,242,9,95,54,56,52,32,75,32,85,32,75,184,182,64,197,89,2,
-90,254,248,144,0,64,47,152,57,224,144,4,0,57,89,157,224,137,2,149,
-200,216,67,83,38,217,12,182,109,64,45,0,55,253,45,0,0,75,128,53,
-221,95,153,50,153,21,224,59,1,125,50,128,10,64,218,86,124,0,52,67,
-34,118,216,0,80,120,197,0,79,96,174,193,96,0,51,208,16,96,4,4,
-90,32,90,32,83,184,231,1,85,32,96,14,0,67,64,48,161,230,3,95,
-49,57,56,119,158,152,73,128,0,192,109,1,95,53,92,5,2,50,51,57,
-160,32,1,35,51,246,245,1,160,33,2,49,57,56,152,58,160,232,0,39,
-89,200,154,253,0,53,67,67,128,88,87,36,65,208,3,95,52,53,51,120,
-72,0,50,65,49,1,95,53,85,198,64,185,224,41,1,122,161,192,0,249,
-140,0,187,137,160,100,183,30,0,55,247,224,1,128,138,163,4,85,159,96,
-59,224,17,6,66,64,92,233,160,0,65,121,131,65,65,251,0,90,64,202,
-0,55,96,202,0,58,128,48,3,10,65,32,89,250,213,0,154,29,124,166,
-130,31,254,153,1,64,46,195,12,255,19,0,161,163,250,228,0,225,181,0,
-149,62,97,40,0,83,94,246,248,194,6,64,181,1,57,49,65,111,1,52,
-51,252,234,0,64,78,0,54,96,13,226,89,3,224,54,1,97,63,66,231,
-157,129,87,95,96,237,192,130,96,113,251,121,1,162,94,255,91,2,64,194,
-131,136,121,37,154,66,220,135,4,67,32,95,51,49,65,173,0,51,93,245,
-225,233,4,192,34,64,160,188,149,160,117,252,200,4,0,51,87,142,155,205,
-157,3,65,246,253,8,2,1,95,53,83,7,128,0,193,48,3,66,32,95,
-56,192,32,2,95,55,51,219,33,224,121,7,163,84,0,67,162,39,97,236,
-0,53,99,19,0,80,89,70,98,115,161,7,65,198,98,244,153,211,161,70,
-224,105,5,96,97,1,95,55,90,149,1,95,53,100,102,224,167,3,193,42,
-0,54,161,42,162,141,192,61,7,95,51,54,51,32,95,50,53,195,73,224,
-32,0,160,172,64,155,164,80,64,10,65,172,64,77,196,189,157,99,188,137,
-224,2,0,128,47,191,129,156,32,224,24,3,224,25,11,156,67,96,0,224,
-71,0,224,29,3,224,61,2,224,33,2,224,42,3,224,69,6,224,37,11,
-224,2,4,224,40,1,224,113,17,224,23,0,224,44,2,99,86,224,2,23,
-224,48,4,225,31,8,128,34,224,17,6,224,49,41,96,17,224,53,3,225,
-189,0,224,1,9,224,94,5,225,27,23,224,2,3,224,56,5,224,57,4,
-225,9,24,225,6,5,225,249,16,224,61,15,224,125,9,224,65,42,224,68,
-11,225,40,2,224,55,12,224,2,7,224,64,9,224,134,6,101,19,224,86,
-3,224,145,22,224,86,15,225,184,9,224,1,7,0,83,230,121,3,0,35,
-101,96,224,0,7,224,195,13,224,2,17,225,103,12,224,138,40,232,118,0,
-224,0,3,224,108,13,224,2,21,224,138,57,231,141,2,224,0,1,225,177,
-3,192,108,161,182,224,96,6,224,177,19,224,89,8,224,143,13,224,1,1,
-224,153,5,135,253,224,0,5,226,209,12,224,2,19,224,131,54,199,64,224,
-0,3,224,116,25,192,2,227,82,15,224,131,37,136,85,224,65,33,224,114,
-11,224,47,19,225,119,8,0,50,135,140,224,0,4,224,223,19,224,2,9,
-224,126,52,231,138,0,224,63,15,224,115,28,224,106,13,128,1,224,112,6,
-232,155,0,224,0,0,224,97,13,192,2,226,228,19,224,118,34,228,143,9,
-224,115,31,224,118,52,227,240,9,227,75,14,195,240,224,92,8,224,41,7,
-224,80,5,224,130,11,128,1,229,3,6,227,223,8,227,220,11,228,117,28,
-224,129,5,224,124,13,225,7,8,224,126,7,230,156,1,96,44,225,19,7,
-225,13,16,227,228,9,224,122,9,224,124,7,237,139,3,232,38,8,231,31,
-7,136,183,224,14,15,224,154,1,224,110,3,192,142,224,19,3,225,126,6,
-227,228,1,224,73,3,64,38,141,6,1,95,49,76,160,8,67,32,95,50,
-55,52,32,95,53,109,182,110,122,64,19,1,52,54,224,18,0,228,46,4,
-224,127,1,64,65,235,118,1,64,0,193,70,128,106,143,225,75,28,110,32,
-236,170,0,224,69,3,235,90,12,234,83,8,224,253,7,0,67,77,189,1,
-53,50,238,244,0,0,35,79,127,224,88,27,160,152,224,83,0,192,43,231,
-48,6,192,169,192,46,64,14,224,40,12,163,105,224,37,0,224,34,10,129,
-58,208,143,224,25,3,229,245,5,0,73,192,13,173,189,64,5,233,77,2,
-96,126,142,185,224,220,3,97,116,64,16,1,64,80,225,59,1,226,228,8,
-130,62,160,236,98,93,224,248,1,224,25,2,77,84,172,217,161,1,225,208,
-3,224,74,10,226,203,11,65,10,192,139,224,18,2,226,44,5,3,95,50,
-50,57,226,56,2,226,55,17,240,1,0,110,7,224,85,5,177,87,224,16,
-20,77,143,224,16,4,143,138,2,55,51,32,242,175,1,31,92,51,52,38,
-109,104,115,47,83,121,115,116,101,109,47,67,111,110,115,111,108,101,47,83,
-105,109,112,108,101,82,101,97,7,100,108,105,110,101,46,104,115,64,39,5,
-44,49,54,50,58,53,115,15,224,140,5,163,89,225,121,1,224,237,17,224,
-142,5,238,125,18,224,41,9,226,210,10,225,231,0,228,93,0,64,5,225,
-148,8,227,49,8,192,62,130,185,192,65,128,8,130,208,66,74,227,224,5,
-226,154,1,224,2,0,239,227,11,224,120,3,224,67,4,79,152,64,35,68,
-94,79,209,132,108,224,135,1,162,3,96,128,160,5,64,136,224,132,3,243,
-98,2,6,32,95,55,57,32,95,55,103,100,112,143,160,71,64,53,177,224,
-114,114,243,43,3,224,42,3,64,41,64,230,226,100,12,224,0,1,224,199,
-0,145,83,224,238,10,161,98,97,64,224,171,2,97,177,128,36,99,90,224,
-163,3,196,48,162,232,242,89,0,160,54,0,67,224,243,4,128,43,128,5,
-224,48,5,224,55,1,100,62,164,67,224,6,3,225,133,10,241,139,2,192,
-87,129,251,193,111,227,127,18,224,168,2,128,44,225,162,9,224,235,5,224,
-181,11,224,174,5,224,127,0,166,230,160,175,162,143,224,147,1,128,107,134,
-179,2,95,50,56,96,201,128,6,225,130,1,231,42,0,128,15,245,119,5,
-225,3,12,226,170,2,227,135,1,3,49,57,56,51,149,132,224,234,1,228,
-197,10,98,137,64,252,226,135,0,96,246,236,214,0,229,72,2,1,64,64,
-84,62,148,1,225,58,1,224,241,2,161,75,227,81,5,1,85,32,237,34,
-1,227,31,8,226,63,3,231,97,6,224,95,12,225,12,2,226,204,9,224,
-105,2,224,32,2,227,223,15,225,51,31,97,195,243,161,9,211,189,225,55,
-15,224,220,8,224,22,2,225,196,4,96,115,228,151,1,224,171,9,226,139,
-5,228,126,8,162,140,164,50,161,128,70,188,244,140,0,133,14,226,136,0,
-128,27,225,105,0,163,104,224,63,3,128,240,71,72,224,67,15,0,67,135,
-30,224,70,9,226,2,0,228,239,5,226,185,14,227,188,8,195,99,131,169,
-164,239,228,184,19,161,193,224,13,2,96,182,131,102,225,154,5,228,187,2,
-87,187,1,54,49,225,68,1,251,103,12,6,92,56,38,32,92,56,38,199,
-39,153,183,182,213,247,230,0,164,82,128,134,0,82,224,10,1,224,177,10,
-193,232,227,6,7,228,167,0,226,253,3,192,20,96,199,226,159,6,174,9,
-224,26,5,231,118,4,98,99,64,163,225,131,0,132,137,65,180,137,220,134,
-84,248,17,3,64,23,248,30,1,99,106,96,4,161,163,164,206,128,249,0,
-52,96,7,0,50,122,117,164,190,134,171,129,70,96,196,2,95,52,55,99,
-71,230,185,1,230,32,3,98,46,139,190,0,49,128,76,119,35,0,53,134,
-17,0,55,248,18,4,187,32,1,50,52,72,128,64,225,64,20,0,51,128,
-20,232,76,2,0,49,231,236,6,67,102,4,50,51,50,32,95,109,194,172,
-13,119,225,0,35,98,13,2,50,49,50,233,64,2,12,103,101,116,82,97,
-119,32,102,97,105,108,101,100,129,243,225,64,3,1,95,51,66,28,128,143,
-155,93,7,94,71,69,84,82,65,87,32,64,17,155,57,5,85,32,75,50,
-32,65,183,78,153,210,0,95,75,41,121,207,1,95,54,91,254,3,58,49,
-57,55,153,211,64,25,122,63,224,242,0,0,54,128,30,153,195,3,95,49,
-51,51,64,90,0,55,153,15,226,78,0,224,208,1,3,95,49,57,53,152,
-226,226,8,4,224,246,9,0,50,90,160,160,242,1,54,48,129,113,224,247,
-1,12,83,97,118,105,110,103,32,99,97,99,104,101,32,157,138,124,221,5,
-50,53,32,95,49,53,96,53,0,54,154,244,130,149,0,55,90,242,128,16,
-64,158,0,54,188,105,123,130,1,54,50,97,137,67,114,64,27,152,81,249,
-110,1,2,57,50,52,97,13,64,165,0,73,128,34,161,218,4,57,50,53,
-32,85,231,65,0,229,242,5,64,244,64,62,231,101,2,202,158,224,26,1,
-227,81,2,192,19,161,23,224,122,2,0,57,66,157,0,57,165,221,224,18,
-10,192,19,0,53,90,247,0,57,205,64,224,40,4,0,51,75,121,128,11,
-98,15,64,206,230,45,0,224,224,0,129,46,64,223,162,165,224,223,8,224,
-229,2,224,231,1,224,235,4,232,83,4,232,18,6,224,40,5,225,54,88,
-129,30,192,221,174,12,225,22,3,131,26,224,19,5,66,105,225,52,4,64,
-69,64,62,165,3,224,47,49,225,96,0,225,153,10,192,52,239,235,0,65,
-132,131,175,225,132,6,225,12,47,66,28,1,57,53,130,27,224,18,3,222,
-47,226,67,5,225,24,5,128,20,0,55,166,133,64,154,132,56,224,154,3,
-224,128,43,225,1,3,64,25,64,121,237,27,0,224,35,10,128,11,64,176,
-224,11,3,128,0,64,149,164,187,64,149,1,95,57,109,111,128,79,0,58,
-128,7,227,177,104,226,113,9,160,255,225,19,0,225,14,10,227,211,5,224,
-254,34,65,180,192,226,0,66,64,6,226,231,1,97,84,65,13,64,48,64,
-42,133,157,1,85,32,132,206,64,22,192,57,0,80,225,206,30,226,247,25,
-224,213,17,1,49,57,139,140,224,74,32,64,163,133,149,225,220,5,190,3,
-64,7,192,27,79,108,97,44,64,89,147,79,224,188,8,192,90,224,13,5,
-228,66,26,128,39,160,27,0,53,96,195,64,126,133,45,160,62,255,247,2,
-1,54,50,95,168,1,55,50,96,40,234,74,6,70,224,0,52,152,15,96,
-99,139,94,255,243,0,0,54,102,199,67,52,130,115,236,252,7,64,141,103,
-77,0,51,172,215,64,135,132,48,64,135,2,95,50,52,139,107,0,49,65,
-93,128,29,131,179,11,73,79,46,115,101,114,105,97,108,105,122,101,71,168,
-64,30,72,21,18,97,100,100,95,108,122,55,55,95,99,111,109,112,114,101,
-115,115,111,114,64,30,64,128,136,34,0,52,64,2,0,90,224,1,2,0,
-75,247,97,2,64,41,162,126,4,48,32,95,54,52,78,38,5,54,55,54,
-32,95,55,118,8,160,218,96,23,104,0,0,52,83,51,3,66,32,95,54,
-65,214,64,16,139,54,104,183,96,37,171,150,64,87,130,171,103,168,100,36,
-0,55,72,36,0,55,73,195,96,30,0,54,192,30,72,36,0,64,232,37,
-6,13,42,42,42,32,69,120,99,101,112,116,105,111,110,58,104,39,96,52,
-130,76,168,126,128,174,10,55,49,53,32,95,55,48,49,32,95,55,129,145,
-72,182,224,204,6,129,125,193,230,224,230,4,129,12,98,3,237,185,0,128,
-239,224,230,0,0,55,97,211,0,51,96,97,0,49,235,177,3,2,46,104,
-115,242,213,0,132,121,225,45,1,128,109,96,64,128,10,0,55,82,207,128,
-254,129,224,0,53,75,207,192,179,97,85,225,69,0,2,64,95,51,72,205,
-1,64,85,162,156,203,30,162,170,224,163,4,64,255,1,64,95,133,248,224,
-31,8,64,102,64,113,224,92,7,241,178,5,65,89,131,138,64,178,1,56,
-50,98,129,2,54,56,51,96,165,99,211,131,65,64,39,168,97,6,54,56,
-52,32,75,32,85,101,98,79,36,2,95,55,49,128,200,64,35,130,207,243,
-94,0,245,119,2,64,80,0,48,64,201,0,83,68,194,97,24,64,61,224,
-7,3,77,79,172,8,64,14,241,39,5,195,234,234,111,9,161,115,130,77,
-173,46,225,169,1,14,99,111,109,98,105,110,97,116,111,114,115,58,92,49,
-48,141,100,0,95,233,115,1,236,184,1,225,16,0,131,118,224,196,11,129,
-217,0,51,67,226,128,30,225,245,2,97,217,0,52,65,217,1,49,55,101,
-181,237,152,4,193,180,0,89,165,165,226,140,5,1,49,57,166,197,64,27,
-85,113,227,84,5,193,36,192,81,196,90,192,121,225,26,2,1,54,52,196,
-170,235,139,0,226,206,0,225,35,19,2,112,105,108,75,156,14,117,115,101,
-100,32,98,111,111,116,32,109,111,100,117,108,139,167,2,64,95,54,244,47,
-6,224,249,22,244,62,2,226,151,11,179,139,224,192,1,96,163,0,85,98,
-230,64,224,227,147,0,64,238,226,5,31,192,233,224,225,13,17,116,111,116,
-97,108,32,105,109,112,111,114,116,32,116,105,109,101,32,64,0,96,220,64,
-96,206,26,4,54,49,48,32,35,103,174,140,154,0,52,98,37,224,70,1,
-0,109,227,245,1,129,149,238,249,4,249,136,2,128,140,65,203,64,7,143,
-15,2,95,55,48,196,92,1,49,51,70,239,65,242,65,14,137,64,216,209,
-66,129,237,210,1,109,184,0,54,77,170,0,64,64,14,2,55,48,55,205,
-224,64,40,64,58,131,187,226,79,8,225,46,0,128,142,111,139,143,64,162,
-185,226,64,2,65,54,68,163,225,161,1,64,247,193,169,225,170,2,207,75,
-162,197,1,80,32,97,232,98,17,97,184,161,19,115,59,252,182,0,119,93,
-129,203,129,226,2,95,50,51,64,108,68,44,78,41,64,225,0,49,234,213,
-0,143,221,250,253,1,129,44,1,49,57,71,29,129,29,64,148,134,224,70,
-208,79,5,96,21,201,32,230,232,1,64,21,0,54,195,203,67,51,229,162,
-12,162,82,0,54,66,185,1,95,55,97,89,65,15,0,57,70,91,0,57,
-65,154,65,44,0,54,74,141,1,95,54,66,105,64,139,162,181,193,217,64,
-47,69,4,226,118,8,17,67,97,110,110,111,116,32,102,105,110,100,32,112,
-97,99,107,97,103,227,81,7,162,247,226,231,1,196,40,128,157,232,44,0,
-2,95,55,57,133,232,64,212,135,11,230,141,2,3,112,107,103,34,106,23,
-64,60,226,57,3,144,222,1,95,55,80,242,64,30,165,195,3,49,57,51,
-56,72,43,68,117,98,63,97,2,226,67,1,130,247,162,41,64,5,193,51,
-128,11,1,95,54,80,90,128,31,129,210,81,175,187,75,228,153,30,109,88,
-231,149,9,0,51,96,121,225,14,10,0,55,75,58,225,96,8,0,91,64,
-10,129,82,227,199,3,0,50,81,39,224,16,0,163,68,97,113,4,79,32,
-79,32,35,64,222,66,185,132,166,4,79,32,35,57,51,248,242,1,96,107,
-0,56,224,107,10,132,61,69,37,229,20,7,226,94,20,2,32,95,55,73,
-230,232,59,10,128,54,68,34,230,76,8,1,95,56,68,43,213,249,65,70,
-128,83,227,180,4,224,99,0,241,179,10,225,103,5,166,200,229,71,27,170,
-218,229,71,14,1,32,40,225,107,5,241,194,8,65,77,70,10,193,77,96,
-71,224,12,0,229,243,4,64,129,71,242,230,213,2,205,188,224,231,182,246,
-71,1,234,88,10,0,56,73,86,0,56,83,131,64,0,103,59,78,118,231,
-59,0,160,79,2,49,57,52,96,103,225,254,15,227,90,26,227,50,13,226,
-198,1,115,137,0,100,226,205,7,234,48,4,134,60,0,67,102,190,1,56,
-48,166,176,0,51,150,235,4,95,49,56,49,32,135,119,64,0,68,78,233,
-57,0,232,161,41,224,172,23,104,148,224,170,5,227,118,40,0,45,64,68,
-131,123,97,161,229,186,19,233,4,3,101,195,3,111,117,110,100,172,143,229,
-189,2,202,181,225,239,22,1,49,57,106,52,225,240,4,0,57,194,3,97,
-58,135,242,103,166,0,54,75,127,111,226,203,126,65,63,135,20,133,186,96,
-50,64,81,199,7,168,15,64,26,229,207,0,97,13,229,94,1,1,54,53,
-69,23,226,98,0,128,31,224,182,3,225,71,0,230,124,0,0,56,72,109,
-128,0,224,40,2,227,167,1,254,121,4,225,239,30,161,168,128,97,195,127,
-225,123,6,6,112,97,114,115,105,110,103,161,109,192,0,209,225,192,128,224,
-148,3,64,8,154,60,250,66,0,224,143,51,226,13,8,64,145,1,101,100,
-236,64,2,100,15,1,57,49,237,77,4,224,160,0,192,2,181,117,234,19,
-1,161,114,224,169,3,250,242,1,230,244,7,194,223,224,181,2,229,1,1,
-217,25,1,57,49,66,74,0,55,67,121,3,64,64,95,53,81,101,169,88,
-128,241,109,155,96,10,224,208,5,194,217,7,97,109,101,32,100,111,101,115,
-98,227,12,97,103,114,101,101,32,119,105,116,104,32,102,105,160,29,193,132,
-161,66,133,13,130,255,160,14,0,79,156,199,153,120,231,20,1,225,19,14,
-138,14,224,25,12,193,218,226,180,17,64,0,225,244,4,224,2,3,230,64,
-4,228,20,6,65,22,146,36,0,49,186,116,2,95,57,49,234,241,0,64,
-32,83,96,172,198,224,0,2,227,73,1,224,1,1,67,240,224,31,19,106,
-253,224,31,18,64,1,224,226,21,224,56,18,233,49,8,0,57,82,177,224,
-0,5,169,179,224,2,1,162,135,224,69,2,73,174,224,101,6,224,41,3,
-224,127,9,224,29,5,225,189,14,225,198,1,225,2,22,226,198,0,229,42,
-9,117,7,0,49,94,19,0,75,231,79,1,224,0,0,225,252,16,226,5,
-4,227,250,30,99,81,227,250,24,9,116,121,112,101,32,99,104,101,99,107,
-228,0,3,232,25,1,1,57,50,69,173,81,138,230,108,2,0,45,64,0,
-224,44,0,224,0,5,225,16,11,128,182,229,129,3,224,176,1,123,160,128,
-113,245,206,13,173,58,243,138,8,224,114,23,226,202,5,97,92,225,214,20,
-225,254,2,224,196,30,232,72,1,65,214,84,207,174,246,224,0,3,224,74,
-13,224,156,7,224,37,15,227,73,24,224,210,20,64,2,236,229,0,224,186,
-41,224,150,17,64,1,224,192,5,224,43,21,224,198,24,224,200,19,225,152,
-1,224,88,9,224,227,3,109,198,224,80,12,249,83,4,224,83,3,224,74,
-9,224,2,4,224,80,4,224,31,10,224,94,3,224,79,8,192,85,226,87,
-2,224,30,9,208,192,224,0,1,224,102,16,224,36,0,230,34,17,128,41,
-128,103,110,179,224,8,12,232,209,58,228,70,8,6,100,101,115,117,103,97,
-114,232,68,4,132,58,212,138,224,0,4,197,33,233,108,13,224,5,9,225,
-6,1,228,255,6,64,0,96,188,225,7,4,235,138,17,64,0,225,123,1,
-139,150,224,19,6,235,162,15,2,100,111,110,176,222,224,116,9,232,57,5,
-224,79,2,224,77,6,0,44,224,64,0,128,30,237,129,7,176,153,160,29,
-232,212,7,0,115,173,183,64,31,232,176,4,224,60,4,224,57,10,1,32,
-43,160,119,224,53,16,224,50,16,224,161,12,238,29,6,224,0,6,128,100,
-227,25,0,96,203,194,131,224,8,28,225,225,5,235,18,1,96,26,234,47,
-17,1,95,54,108,59,193,85,0,52,119,237,234,51,2,3,95,55,50,48,
-224,225,2,10,73,110,116,101,114,97,99,116,105,118,101,225,85,0,1,95,
-50,70,140,226,50,8,96,120,141,121,128,131,122,195,225,104,10,3,108,111,
-97,100,206,115,234,83,18,225,102,2,175,137,160,38,225,88,16,228,106,3,
-225,44,6,236,47,0,128,14,225,61,6,1,64,67,196,21,139,140,228,31,
-0,200,145,224,13,0,191,100,227,107,0,129,74,113,192,243,109,3,75,5,
-1,48,48,74,82,160,164,231,152,9,224,136,0,241,16,6,192,193,64,27,
-224,94,3,73,12,116,232,128,37,84,153,143,131,120,202,224,11,0,224,92,
-1,224,32,2,224,45,4,64,0,65,74,0,52,64,159,192,17,224,16,7,
-224,32,8,3,83,32,95,57,65,238,88,190,213,245,213,242,193,13,181,179,
-64,190,80,44,1,49,48,186,21,132,231,224,11,1,1,49,50,105,42,64,
-0,2,85,32,75,192,23,227,17,2,133,199,196,61,144,126,81,28,128,42,
-67,100,97,133,122,70,110,247,160,0,224,154,11,250,91,1,171,150,224,10,
-4,224,184,4,65,102,192,0,224,231,11,141,140,194,95,94,179,4,61,61,
-32,64,35,143,32,64,84,144,7,246,188,5,225,184,4,192,238,64,204,96,
-54,3,95,49,55,55,206,69,79,215,162,47,79,199,150,204,7,95,51,55,
-56,32,95,51,57,67,30,1,52,56,127,64,67,125,64,6,65,154,64,7,
-0,53,117,215,64,58,189,201,1,51,57,79,79,1,52,57,88,5,0,55,
-117,166,156,74,224,177,0,0,49,67,102,8,95,52,57,55,32,95,52,57,
-57,224,37,0,227,113,1,11,101,120,112,101,99,116,101,100,32,101,111,102,
-131,167,64,197,1,95,50,93,6,96,139,248,169,2,64,127,224,120,4,1,
-49,56,77,86,0,49,159,134,100,46,192,53,96,247,82,58,228,99,4,3,
-77,97,105,110,96,100,4,79,32,95,49,56,99,68,224,31,4,0,109,192,
-31,163,242,64,115,182,227,67,196,160,116,1,55,56,224,51,4,110,219,135,
-98,224,152,1,0,55,67,203,169,229,96,18,64,158,97,85,225,101,2,1,
-49,55,124,251,4,55,56,52,32,35,115,127,64,11,65,74,1,56,49,97,
-120,128,24,131,23,192,13,142,49,224,235,5,3,67,39,32,79,128,47,0,
-55,196,172,99,150,224,179,16,3,119,104,101,114,229,101,1,138,15,225,81,
-10,194,193,224,107,3,193,89,225,148,1,0,51,129,32,96,220,224,4,51,
-1,49,56,88,116,0,95,89,128,161,30,65,40,65,71,111,47,2,95,49,
-53,127,68,225,53,1,224,209,3,3,100,97,116,97,129,131,0,49,112,164,
-128,8,186,80,224,81,1,224,91,10,1,49,54,130,229,224,85,11,5,110,
-101,119,116,121,112,161,220,1,49,57,116,146,225,182,5,75,170,224,87,14,
-1,53,49,85,191,90,63,128,5,96,65,67,172,4,95,49,55,57,52,65,
-100,0,48,121,230,99,197,77,90,94,10,244,241,8,193,115,0,50,64,99,
-70,180,96,4,128,0,224,226,12,224,216,3,226,100,4,224,216,3,224,213,
-29,0,56,135,214,224,84,4,0,55,90,34,224,84,13,137,155,192,86,0,
-50,194,183,225,125,23,162,159,128,79,224,5,9,224,97,3,5,102,111,114,
-101,105,103,131,162,224,125,18,2,64,95,52,71,18,1,52,48,96,65,100,
-112,224,45,7,4,99,99,97,108,108,224,71,12,3,99,97,112,105,163,26,
-65,129,0,56,224,132,8,4,117,110,115,97,102,195,61,192,34,0,56,171,
-87,2,95,49,56,113,34,192,191,1,56,50,101,110,225,73,1,225,13,11,
-225,23,12,128,56,225,5,11,3,99,108,97,115,153,212,65,189,96,88,193,
-198,163,73,225,202,2,0,49,97,135,3,95,52,57,48,72,211,224,104,8,
-71,61,1,52,56,96,193,145,218,224,184,0,98,60,224,26,4,96,27,228,
-145,2,228,21,1,162,224,96,254,0,55,64,61,1,57,50,193,14,224,219,
-13,227,113,16,6,105,110,115,116,97,110,99,194,156,161,55,224,86,1,208,
-124,224,86,13,130,161,228,30,11,4,101,102,97,117,108,194,155,97,178,228,
-242,1,99,149,204,200,229,172,0,1,49,55,67,136,226,67,3,107,124,106,
-192,0,50,96,222,157,161,224,100,1,1,40,41,162,125,73,103,128,71,162,
-35,2,55,57,50,70,255,0,49,65,75,145,100,225,72,3,224,207,15,1,
-57,50,153,169,227,191,23,149,141,226,112,6,64,59,128,236,160,79,0,85,
-97,63,132,135,224,82,11,5,112,97,116,116,101,114,195,91,0,57,65,254,
-225,105,18,68,185,230,201,11,224,81,16,130,128,97,106,226,70,6,128,178,
-225,237,5,224,105,2,228,30,10,225,217,5,4,114,105,118,105,110,94,145,
-128,217,226,77,16,227,134,4,0,52,224,97,0,4,56,57,53,32,80,101,
-168,101,169,65,244,250,111,7,197,191,224,240,2,224,10,13,225,165,17,224,
-24,5,1,114,111,168,49,225,191,0,228,177,10,228,195,24,5,110,111,109,
-105,110,97,228,197,13,6,112,104,97,110,116,111,109,192,100,224,126,6,11,
-101,112,114,101,115,101,110,116,97,116,105,111,192,65,167,205,159,163,227,29,
-4,72,201,74,255,205,222,67,6,224,156,8,232,114,11,198,73,232,100,9,
-0,53,97,251,64,21,227,119,27,66,184,224,99,1,232,143,7,139,205,75,
-46,0,32,139,88,96,34,0,49,155,152,75,68,73,28,96,89,1,48,55,
-67,80,159,159,1,32,95,65,248,71,88,0,57,132,83,237,228,2,224,201,
-7,1,56,48,238,35,3,1,60,45,161,47,224,212,15,174,104,233,249,3,
-1,49,56,81,124,224,212,4,96,234,226,208,10,233,155,2,96,56,121,114,
-1,49,57,71,38,224,117,0,225,2,9,237,201,5,110,36,79,104,66,91,
-238,40,0,96,0,65,227,157,56,96,93,65,107,195,149,0,56,98,229,108,
-176,136,144,185,219,64,50,156,48,2,85,32,83,65,104,82,185,2,67,32,
-60,178,141,224,18,6,68,119,224,18,6,64,239,236,21,4,130,205,118,104,
-1,85,32,236,49,6,135,61,160,27,2,95,53,53,108,136,161,254,128,235,
-237,16,6,224,44,17,224,42,4,138,59,160,42,1,75,50,79,13,193,82,
-0,67,224,174,5,139,82,236,196,3,224,58,3,240,70,0,100,36,128,108,
-224,116,2,108,189,224,90,0,0,58,128,24,253,37,0,2,80,32,35,75,
-218,161,198,193,170,64,37,253,75,1,2,80,32,35,98,145,0,80,109,108,
-69,199,67,144,229,19,1,107,12,167,238,3,49,56,57,52,128,38,0,54,
-235,133,2,1,49,56,66,211,229,186,15,68,230,229,186,23,231,47,6,111,
-81,229,168,8,64,118,141,145,145,225,194,143,224,13,5,97,43,224,136,8,
-110,193,74,77,103,72,128,181,229,147,0,126,171,74,220,0,57,224,146,2,
-5,83,79,85,82,67,69,164,208,232,122,3,0,55,94,187,64,0,68,74,
-64,73,224,128,6,232,236,4,96,239,174,45,224,150,10,0,67,145,95,160,
-35,80,11,96,80,224,111,4,98,7,96,133,234,30,0,225,64,9,0,97,
-201,160,0,55,168,7,192,44,233,130,15,225,0,4,98,63,224,82,7,2,
-104,105,100,198,231,224,144,12,168,102,174,66,85,237,197,132,232,103,2,224,
-98,21,8,113,117,97,108,105,102,105,101,100,128,101,65,224,174,254,237,176,
-12,224,203,9,67,71,102,34,123,148,248,10,0,112,238,145,2,65,99,204,
-240,180,7,2,49,55,53,201,214,156,95,208,185,123,154,101,127,171,82,96,
-223,1,56,48,96,206,233,51,15,128,16,128,49,234,161,13,224,44,2,136,
-1,0,49,169,65,224,25,8,233,39,25,128,104,224,141,22,233,193,22,192,
-127,224,173,9,65,128,143,94,2,90,32,90,113,243,64,17,135,162,68,42,
-210,111,64,7,196,72,133,220,0,90,128,21,192,50,133,190,66,243,194,0,
-81,86,4,83,32,95,52,49,98,50,102,146,99,147,134,190,229,169,11,128,
-31,0,90,161,187,139,2,96,0,0,58,99,169,228,126,2,233,167,25,160,
-39,235,22,20,227,149,3,146,230,239,71,0,96,45,225,50,12,64,139,133,
-74,232,194,8,196,29,228,38,5,192,99,99,134,224,185,0,239,3,0,170,
-182,65,161,160,23,141,80,130,159,83,75,241,139,7,148,144,162,109,64,142,
-133,192,0,85,213,132,241,148,27,241,145,11,148,225,231,251,8,137,148,0,
-80,119,118,72,217,96,150,225,154,0,213,32,64,25,64,129,70,182,64,249,
-65,80,70,8,2,79,32,35,83,205,232,251,1,64,176,0,54,133,211,64,
-87,134,236,244,142,0,224,2,1,223,115,128,212,128,1,131,252,85,205,0,
-54,75,67,196,116,224,36,5,64,1,252,170,1,248,76,4,250,109,22,128,
-114,96,15,167,160,192,25,161,22,103,146,232,186,5,247,244,0,64,19,145,
-95,113,62,241,68,2,202,36,160,100,128,8,224,221,0,224,27,1,160,125,
-224,119,3,96,122,201,144,113,239,246,75,1,0,83,93,86,0,51,180,190,
-96,32,65,131,120,88,65,129,106,125,86,183,250,240,2,67,103,138,47,245,
-215,0,247,233,5,224,147,1,152,158,3,64,95,52,52,64,83,105,249,0,
-90,98,208,66,96,72,18,107,86,64,8,96,16,0,53,130,236,0,55,67,
-166,2,95,55,52,64,121,0,49,115,76,0,79,66,207,226,0,0,96,171,
-128,46,160,0,2,95,51,55,160,12,64,160,64,84,2,55,52,50,193,220,
-224,73,4,225,7,1,249,80,4,15,66,97,100,32,71,65,68,84,32,114,
-101,115,117,108,116,32,228,246,0,224,47,1,122,199,2,57,49,51,120,125,
-70,151,66,196,1,54,56,133,250,0,50,64,97,0,57,160,97,230,68,2,
-167,169,128,0,66,180,182,26,0,49,135,100,128,82,64,53,131,119,96,149,
-89,205,0,48,192,235,233,198,0,99,217,64,131,128,114,136,24,224,194,3,
-1,58,58,96,176,251,121,7,129,160,250,33,7,0,95,68,30,192,123,64,
-151,135,63,107,16,96,156,0,64,69,153,101,103,160,255,0,50,112,217,202,
-48,215,245,226,252,1,0,95,66,33,96,124,69,197,183,214,174,152,160,66,
-71,239,1,51,50,96,223,0,52,224,139,1,224,74,2,224,68,9,120,109,
-160,70,224,67,17,224,49,4,120,89,253,182,1,129,41,134,224,65,189,192,
-16,139,22,96,16,64,255,182,29,241,109,6,237,95,6,106,87,228,244,5,
-107,79,96,153,224,58,3,160,102,224,23,5,2,52,56,57,247,86,5,0,
-57,136,219,237,182,5,1,45,62,162,119,224,65,0,224,112,5,166,82,224,
-27,0,237,99,7,224,25,1,196,10,224,11,0,192,8,249,213,3,64,251,
-175,75,239,200,10,232,44,1,224,9,11,232,64,1,100,83,193,13,193,0,
-246,71,1,118,65,224,78,24,234,230,10,226,26,2,96,8,192,106,129,113,
-131,244,64,24,0,79,70,43,0,79,226,15,0,224,137,10,153,224,1,49,
-57,105,148,192,15,64,252,136,135,225,189,4,0,54,249,18,6,67,238,0,
-56,67,146,84,110,225,239,0,225,117,3,97,81,64,77,136,192,225,74,11,
-225,44,0,96,181,130,12,2,49,57,48,184,3,224,29,2,245,79,4,103,
-200,96,194,226,56,3,224,45,0,2,54,49,51,110,151,1,32,89,129,36,
-155,157,165,254,128,166,188,129,228,134,2,168,202,235,225,13,251,92,3,104,
-83,0,56,202,98,232,241,0,237,96,2,1,57,48,211,168,250,1,8,69,
-18,194,97,65,254,100,245,224,115,13,129,114,194,220,64,47,169,26,224,47,
-24,65,141,64,47,174,124,236,158,15,2,52,32,35,138,26,236,143,9,64,
-61,0,54,224,61,3,0,57,75,41,203,195,130,46,64,35,197,183,153,18,
-0,56,66,86,64,12,0,56,128,127,236,125,3,225,65,3,226,6,17,234,
-43,10,130,161,227,15,24,64,2,82,41,191,253,64,86,65,244,64,65,102,
-139,226,201,1,1,55,57,170,70,246,48,24,168,121,172,232,92,108,231,113,
-5,246,43,6,192,107,97,130,96,50,234,224,11,65,35,225,87,1,225,202,
-16,136,32,99,14,0,56,117,247,225,4,22,130,220,66,206,227,249,9,192,
-66,161,161,224,15,0,64,141,196,229,225,229,9,128,43,64,35,164,12,128,
-35,1,56,57,72,134,2,49,55,56,162,100,195,219,0,56,236,138,0,229,
-181,1,4,85,73,100,101,110,112,135,242,38,12,90,140,96,25,69,127,96,
-29,138,13,0,83,64,8,1,95,53,98,8,0,50,71,215,160,42,163,186,
-144,117,105,14,0,64,110,110,192,30,99,86,96,159,224,174,3,241,76,16,
-98,234,64,33,114,135,236,252,5,251,70,2,0,56,163,85,224,55,0,0,
-56,64,228,64,6,66,243,245,39,3,128,126,195,165,163,19,84,87,64,6,
-0,48,65,46,96,107,224,156,0,160,161,192,88,242,26,9,224,184,14,247,
-192,8,228,147,26,167,33,224,80,13,181,76,226,140,13,224,170,2,228,67,
-1,0,52,151,111,237,3,5,4,105,110,102,105,120,182,143,224,44,3,0,
-55,76,165,224,44,12,0,114,167,213,224,90,4,0,57,160,198,224,45,8,
-200,2,192,146,226,113,10,3,100,105,103,105,226,112,11,130,246,162,112,0,
-75,75,13,80,229,106,20,65,159,84,122,0,54,134,231,248,65,10,1,67,
-32,224,32,0,224,33,8,180,56,160,91,194,156,224,36,0,160,0,228,9,
-4,224,64,12,238,173,0,0,56,222,208,230,59,1,66,55,0,54,98,55,
-134,205,128,51,116,97,97,185,98,110,150,12,194,3,130,123,125,157,79,238,
-128,83,0,48,76,187,163,49,167,233,98,102,74,226,205,60,231,223,1,130,
-133,100,90,141,244,137,51,120,76,163,139,128,53,183,188,168,143,135,100,103,
-87,237,148,1,192,30,227,228,0,192,14,110,76,160,74,96,56,224,16,0,
-145,23,224,67,2,178,136,232,254,4,248,48,0,232,118,3,165,8,232,250,
-3,107,118,146,152,192,13,224,91,3,73,67,192,159,225,2,5,160,21,0,
-66,66,110,129,169,224,16,0,228,43,3,0,53,193,197,224,156,2,0,39,
-97,225,65,64,238,238,0,232,125,0,110,235,230,95,5,136,160,160,18,110,
-236,238,231,3,160,115,248,55,6,96,101,197,243,167,57,238,115,9,65,229,
-134,116,225,58,3,224,229,2,64,166,64,82,236,218,2,235,91,3,228,231,
-10,129,54,225,57,5,231,79,2,224,18,0,231,85,10,64,247,96,132,192,
-221,224,218,22,89,248,175,102,96,201,134,176,99,220,96,129,146,13,71,194,
-250,213,9,246,74,20,167,92,160,176,246,246,9,232,147,1,187,55,167,94,
-104,95,128,144,135,42,224,75,22,231,173,42,161,254,160,8,64,245,231,130,
-3,224,4,26,237,138,3,243,61,3,243,52,5,71,2,189,209,230,245,1,
-132,198,160,202,225,151,5,240,92,0,224,210,11,0,83,97,174,128,34,65,
-62,0,53,115,117,160,49,245,211,0,251,74,9,71,97,130,24,68,176,231,
-107,8,0,51,248,240,15,69,30,96,82,180,130,135,103,235,114,10,137,147,
-224,86,4,92,63,67,116,2,95,56,53,236,69,8,224,95,2,128,244,165,
-150,224,95,16,67,91,225,20,15,65,97,160,55,224,181,6,168,87,224,123,
-11,0,56,144,167,96,113,224,196,18,2,49,49,52,64,248,173,194,237,26,
-4,161,69,229,198,1,224,51,6,107,227,224,51,4,160,17,224,50,11,0,
-53,108,47,225,130,22,225,34,7,165,16,224,189,5,66,200,170,46,224,78,
-14,173,213,97,210,226,200,6,225,92,11,188,249,154,224,0,51,118,143,226,
-89,5,149,237,226,254,16,0,51,68,208,224,128,4,233,244,4,226,254,7,
-1,49,56,100,106,64,9,232,174,1,0,56,137,9,240,174,5,1,46,46,
-232,216,0,226,49,10,142,4,0,58,130,248,1,10,65,145,157,64,14,138,
-58,247,253,4,96,114,135,224,2,56,53,32,64,15,0,54,192,15,0,52,
-231,227,1,2,49,56,56,124,73,64,35,228,40,1,194,79,1,48,49,114,
-25,0,53,164,97,227,95,4,64,21,64,62,98,196,160,8,64,71,250,57,
-18,128,91,1,56,54,171,5,162,108,95,157,96,7,172,105,149,169,1,49,
-56,64,103,64,80,242,74,7,160,69,224,137,0,73,56,64,46,129,105,225,
-95,1,68,144,64,201,248,142,4,0,111,244,133,0,247,106,8,0,56,154,
-142,148,239,237,226,23,97,224,73,27,117,237,166,140,230,138,4,1,95,49,
-108,135,130,189,64,145,236,236,16,4,81,117,97,108,68,96,152,236,236,19,
-96,151,104,231,236,212,3,250,10,3,104,42,232,9,0,121,169,1,95,50,
-128,10,0,56,234,234,4,161,4,236,253,0,135,113,106,128,104,15,150,48,
-2,50,54,51,97,253,248,40,4,192,207,237,217,4,238,94,19,2,95,49,
-48,128,6,250,29,11,1,105,102,219,11,164,211,224,37,0,98,126,64,68,
-228,21,3,224,62,7,2,116,104,101,155,144,224,65,48,2,101,108,115,182,
-151,224,65,2,226,228,2,141,176,224,213,12,0,55,171,109,224,213,19,130,
-87,0,55,102,102,244,149,15,239,235,9,129,97,219,187,2,80,32,35,182,
-209,64,22,64,144,99,196,224,147,13,231,148,4,224,147,3,1,108,101,255,
-213,0,128,148,78,109,225,47,4,237,52,5,225,151,4,64,119,242,66,17,
-64,119,225,225,16,1,99,97,161,96,225,161,10,224,39,3,0,111,225,51,
-7,99,58,64,120,164,197,241,134,2,68,237,235,70,6,105,76,229,174,6,
-233,71,0,229,188,8,102,110,78,136,230,183,0,226,48,0,167,65,128,170,
-224,56,7,1,56,55,160,128,224,231,21,224,193,3,160,196,0,54,225,61,
-16,113,181,199,177,139,49,96,132,96,54,133,147,236,89,4,64,36,106,7,
-235,104,4,96,187,129,210,228,136,10,98,171,128,81,133,157,64,81,97,40,
-225,70,3,224,206,3,252,148,2,128,208,242,147,13,64,120,64,79,225,120,
-0,108,238,134,214,0,55,64,124,235,14,4,115,103,85,252,96,61,100,83,
-68,172,64,127,225,115,1,64,84,222,233,225,47,16,225,249,2,157,151,232,
-72,0,176,47,231,57,1,224,99,10,64,98,132,191,140,253,0,51,73,209,
-0,89,245,238,0,69,68,156,154,141,230,181,242,109,39,65,200,238,30,3,
-160,176,168,155,225,145,2,0,54,130,163,230,180,2,98,20,64,22,225,162,
-11,1,51,56,74,89,113,185,96,81,71,34,224,81,7,129,94,224,17,0,
-232,181,11,139,15,237,134,5,232,221,17,237,64,12,198,68,141,165,166,223,
-220,94,64,134,96,58,143,201,128,182,139,176,193,11,64,225,236,112,35,231,
-205,6,178,80,0,56,96,82,224,23,10,108,12,64,8,235,240,50,66,4,
-226,36,5,192,13,235,43,9,139,237,235,230,20,1,49,56,102,91,192,19,
-99,106,64,14,229,41,11,0,56,146,43,224,153,8,137,127,248,150,7,202,
-100,224,154,4,224,86,13,229,128,4,224,86,2,0,54,96,142,224,86,5,
-64,106,224,241,17,129,226,225,72,22,133,59,130,70,224,74,17,66,28,0,
-49,74,108,0,52,152,215,0,57,181,17,228,113,11,8,95,112,114,105,109,
-105,116,105,118,229,70,0,104,143,224,154,7,249,205,7,206,117,122,71,98,
-127,134,47,135,55,64,20,135,55,64,56,233,128,16,5,115,116,114,105,110,
-103,233,128,10,129,223,243,252,0,169,35,160,104,133,156,128,104,64,222,160,
-104,170,255,211,73,65,195,84,6,0,50,84,7,248,15,4,235,86,0,96,
-54,133,72,67,125,64,79,102,206,147,167,65,218,233,106,1,171,181,226,4,
-10,137,180,135,29,235,7,2,253,217,2,193,168,228,101,1,133,5,192,116,
-97,192,160,116,228,209,9,65,187,229,231,0,224,8,18,231,153,6,128,109,
-230,174,5,98,6,132,96,128,51,224,12,18,197,131,192,231,228,181,0,143,
-129,209,240,165,164,160,6,194,161,224,135,7,230,101,0,224,86,10,76,210,
-226,93,2,237,150,12,224,63,9,193,102,128,63,0,55,96,222,237,208,13,
-229,106,8,224,197,2,241,203,9,160,99,232,126,4,0,48,152,209,230,252,
-37,232,194,7,0,53,96,163,224,227,31,224,224,2,64,59,238,176,19,224,
-221,5,192,218,224,210,3,0,58,133,41,195,52,64,84,131,51,64,87,226,
-135,1,97,214,130,134,64,172,230,76,5,228,254,12,0,53,67,253,228,227,
-5,217,60,210,68,164,121,224,51,2,64,26,228,138,13,235,43,15,224,63,
-5,190,192,200,81,65,124,227,166,2,225,35,4,1,60,45,192,79,143,80,
-1,56,53,74,175,97,21,64,57,247,136,0,1,53,51,79,167,64,186,128,
-15,143,167,73,45,64,28,143,14,65,84,224,103,1,225,199,1,239,167,23,
-0,52,172,255,116,25,64,71,164,86,227,150,2,64,6,232,179,10,139,33,
-163,148,245,170,2,142,53,245,167,10,151,11,0,50,116,33,143,30,64,118,
-224,51,1,232,249,17,96,152,132,148,0,85,232,131,1,2,67,32,60,165,
-139,0,83,224,18,5,0,50,64,83,229,176,4,96,17,178,218,133,177,160,
-120,224,39,6,133,216,160,38,0,90,224,38,3,111,95,184,239,64,141,165,
-8,249,24,0,0,54,79,129,224,75,4,132,88,115,7,64,114,1,85,32,
-224,165,6,195,224,250,82,6,224,48,0,160,135,224,162,13,224,37,10,193,
-40,65,209,226,9,2,125,93,232,168,15,167,119,172,65,224,19,1,96,71,
-227,125,4,97,136,131,125,65,4,160,24,96,26,134,251,138,32,96,35,96,
-36,0,54,227,209,1,0,49,64,82,131,210,66,117,216,55,236,189,2,66,
-9,80,151,241,126,6,229,171,1,0,56,84,130,252,116,0,226,47,9,2,
-83,32,95,114,98,3,95,49,50,57,147,82,64,108,163,49,224,82,2,92,
-232,224,100,5,0,52,68,111,224,79,8,234,232,6,64,86,65,231,129,107,
-138,229,64,96,163,116,195,146,189,255,72,242,64,29,163,74,3,49,56,52,
-48,67,192,64,22,224,142,6,68,160,227,90,10,136,181,227,20,22,64,81,
-255,43,0,235,59,119,65,9,230,99,5,192,13,233,254,12,139,62,96,8,
-102,12,213,121,176,231,235,88,23,98,5,192,19,130,17,0,58,129,53,78,
-116,68,33,153,17,120,64,2,49,56,51,66,17,155,163,0,95,101,70,64,
-44,194,221,2,80,32,35,233,165,1,64,41,129,80,234,14,10,5,108,105,
-116,101,114,97,126,142,227,204,13,224,18,5,65,6,228,16,10,243,182,0,
-243,91,5,107,16,96,172,199,162,224,35,19,208,67,0,83,64,228,228,248,
-2,224,90,20,0,49,67,124,64,0,234,203,17,224,58,16,65,46,160,0,
-65,38,0,54,227,220,2,225,60,1,234,249,2,132,158,96,21,245,248,8,
-202,172,245,146,0,74,248,243,3,8,208,239,224,40,17,0,61,224,40,1,
-64,248,64,107,231,4,4,231,108,5,224,45,1,167,108,0,54,72,94,199,
-108,64,65,224,57,15,224,144,1,231,166,0,171,57,96,57,244,242,4,0,
-55,68,125,229,110,22,1,56,48,64,174,229,110,7,65,19,224,71,0,224,
-64,8,199,214,224,255,3,4,102,111,114,97,108,98,142,224,155,2,1,55,
-48,192,155,68,77,141,142,97,187,232,14,1,245,184,0,241,186,12,69,33,
-225,9,2,161,122,124,164,106,199,68,53,2,95,49,48,101,211,64,84,153,
-43,124,183,233,133,13,128,54,224,40,1,229,207,4,0,50,229,172,0,64,
-165,165,45,104,238,64,25,225,145,15,1,58,58,224,245,7,74,64,193,145,
-64,90,98,135,72,152,243,238,1,224,147,1,67,166,114,119,0,67,100,38,
-99,64,64,20,0,67,231,195,8,96,229,232,55,4,103,120,198,3,100,83,
-2,95,49,51,247,235,3,159,214,242,164,3,224,121,2,71,28,128,163,201,
-220,229,80,3,162,30,72,172,64,34,131,56,100,104,0,67,70,137,94,142,
-203,184,96,96,69,50,0,51,106,132,206,129,137,96,65,128,96,23,163,215,
-64,76,227,25,5,64,98,193,179,1,56,50,64,163,64,35,198,175,168,211,
-0,48,69,211,88,38,134,214,0,55,96,105,64,39,226,241,0,229,36,10,
-4,76,73,100,101,110,107,39,248,180,19,225,123,1,64,217,89,91,129,134,
-66,45,96,219,0,53,64,227,1,95,50,121,188,217,83,0,67,64,7,0,
-56,184,193,97,252,140,143,216,175,228,188,2,142,245,129,161,192,30,161,120,
-215,63,71,16,182,18,227,109,1,64,99,70,209,195,59,97,151,252,122,0,
-248,54,8,64,80,64,104,245,58,3,226,250,3,128,139,227,101,3,193,143,
-64,222,245,32,6,235,66,0,160,98,156,186,64,145,233,38,0,224,37,12,
-140,202,243,172,4,224,40,11,79,186,224,77,8,232,120,1,0,57,81,148,
-250,196,0,64,205,235,210,1,65,195,0,66,99,54,65,209,96,14,97,210,
-96,121,5,66,32,85,32,64,90,161,209,218,100,0,49,68,69,0,35,80,
-162,131,242,64,127,96,12,193,72,98,96,132,67,224,187,7,97,30,202,98,
-1,95,55,72,24,75,123,0,56,66,238,96,27,0,54,96,27,220,227,64,
-22,128,42,0,51,64,189,170,89,0,51,98,57,128,12,0,79,96,235,1,
-80,32,131,178,65,145,0,51,115,85,64,60,252,149,23,229,5,5,64,202,
-239,39,2,229,142,5,4,109,111,100,117,108,210,165,139,82,243,150,14,0,
-55,160,16,105,120,227,134,0,69,184,224,50,30,250,26,10,233,182,4,190,
-198,145,185,224,25,10,224,190,11,5,112,97,116,116,101,114,249,224,0,138,
-20,224,141,21,224,70,11,2,116,121,112,248,240,1,128,127,224,173,23,82,
-213,224,76,13,5,100,101,102,97,117,108,239,117,0,128,147,65,182,132,205,
-0,90,96,1,94,214,96,20,231,194,6,129,168,129,91,101,192,64,35,231,
-172,4,0,56,84,126,64,6,0,57,130,73,231,129,0,228,215,10,136,4,
-228,211,19,137,252,0,83,172,77,0,83,163,9,253,110,17,251,235,1,128,
-47,253,160,15,232,113,5,253,157,5,228,240,0,97,64,131,64,224,23,15,
-97,0,64,234,229,227,2,136,174,229,227,10,65,25,229,227,17,0,81,229,
-228,28,192,214,229,215,55,224,209,22,132,42,0,79,226,54,2,219,116,224,
-19,4,3,108,97,115,115,224,20,7,3,100,97,116,97,224,19,8,226,115,
-1,224,22,5,2,114,105,118,182,13,224,23,4,127,52,224,17,3,222,59,
-224,19,3,233,170,1,224,21,6,2,101,105,103,99,114,224,22,3,158,39,
-224,17,4,3,109,112,111,114,224,146,8,157,141,224,17,5,2,102,105,120,
-224,20,12,224,123,8,96,21,0,114,224,21,9,4,115,116,97,110,99,224,
-191,8,178,250,224,18,3,228,238,1,224,21,3,3,110,101,119,116,164,1,
-224,22,3,157,198,224,17,3,228,110,2,224,22,3,247,238,5,224,25,3,
-223,212,224,19,4,224,106,10,252,162,0,245,48,1,224,0,8,66,54,0,
-54,228,66,0,2,66,32,90,70,98,160,23,169,152,110,215,230,7,7,236,
-136,0,1,49,55,149,84,234,150,5,212,243,64,23,202,236,186,2,165,226,
-103,209,167,16,111,39,64,113,230,131,0,227,106,10,5,83,121,109,79,112,
-101,97,167,238,115,8,205,165,231,143,4,227,125,2,64,23,231,142,3,106,
-186,233,44,1,131,79,1,67,32,137,43,1,79,32,96,31,246,101,3,233,
-188,48,99,213,64,96,0,55,112,97,131,237,227,238,16,0,55,141,2,233,
-198,34,97,53,234,208,0,225,53,10,228,159,36,64,184,224,168,2,228,117,
-30,254,139,1,194,20,72,94,4,83,32,95,52,49,224,144,0,137,27,73,
-77,224,130,8,140,70,233,59,4,225,80,0,230,8,4,192,252,204,119,160,
-126,238,116,6,235,206,2,115,240,96,35,244,162,5,133,234,133,225,0,58,
-128,37,64,29,0,54,226,36,5,1,64,35,79,21,88,84,76,141,64,39,
-230,8,19,0,81,226,158,49,141,110,231,39,1,226,162,2,129,9,224,23,
-4,64,10,226,187,20,96,32,194,188,226,219,50,230,179,11,226,206,53,226,
-71,18,97,95,230,190,9,142,221,224,17,3,152,40,224,17,3,132,106,224,
-17,3,136,78,0,79,239,14,5,128,14,232,61,0,193,1,64,119,0,54,
-96,119,64,231,151,145,135,153,0,53,68,255,64,30,213,167,236,36,2,75,
-78,247,235,8,64,240,247,233,8,235,209,4,64,77,174,202,179,144,0,52,
-82,63,238,170,6,67,61,64,41,131,214,237,149,6,234,29,1,212,119,229,
-68,0,64,30,64,55,195,143,0,90,65,170,96,6,224,7,0,111,116,64,
-35,227,52,5,203,208,105,252,99,66,64,28,237,17,0,157,49,144,68,109,
-162,251,50,5,0,67,67,58,7,64,95,50,48,53,32,95,56,244,244,1,
-255,30,26,229,252,1,224,197,5,143,189,251,88,1,0,85,225,220,2,1,
-91,93,65,220,224,83,5,225,25,0,245,4,1,197,48,0,58,128,214,224,
-207,4,237,225,3,251,147,8,0,53,83,223,251,147,2,64,64,213,32,97,
-81,192,4,167,38,109,6,247,199,1,97,31,96,139,99,32,242,85,9,0,
-55,91,14,130,1,0,66,131,75,241,28,10,221,164,224,84,4,100,33,226,
-113,2,64,100,100,11,236,85,9,64,102,238,12,0,229,150,5,64,78,229,
-151,4,1,95,52,64,8,3,95,52,56,48,66,187,2,55,32,75,132,8,
-100,12,229,183,13,131,221,229,183,4,229,55,3,195,87,88,132,65,119,224,
-178,0,64,19,230,171,19,0,85,230,172,39,99,162,230,171,34,98,232,163,
-203,95,17,130,34,96,47,2,50,54,51,244,17,5,149,244,67,149,226,12,
-6,131,58,230,238,76,230,236,4,230,235,9,78,17,129,61,2,48,53,32,
-80,8,1,55,55,64,83,0,80,96,9,0,56,64,79,243,179,7,98,85,
-0,55,154,115,153,170,96,71,64,162,112,55,0,75,97,148,64,59,226,193,
-0,128,146,194,122,192,13,64,97,99,228,78,90,64,240,64,54,208,153,224,
-39,1,96,199,64,202,96,20,68,3,163,13,0,55,65,156,112,152,143,117,
-64,6,97,6,248,162,7,0,51,96,173,152,161,129,153,96,50,169,10,0,
-51,234,99,3,8,65,109,98,105,103,117,111,117,115,149,2,128,34,0,53,
-99,18,65,208,143,223,81,62,224,246,0,0,54,96,176,84,189,227,125,2,
-0,49,96,7,0,53,112,205,99,252,224,108,12,4,58,92,49,48,38,224,
-103,2,224,29,5,11,32,32,102,111,117,110,100,58,32,32,32,32,128,36,
-98,98,224,94,1,98,163,100,212,101,231,101,43,99,119,230,184,4,2,69,
-79,70,64,61,166,155,160,62,71,210,0,48,162,128,224,120,10,8,101,120,
-112,101,99,116,101,100,58,128,120,96,202,67,207,0,53,75,181,201,55,225,
-2,1,196,21,102,174,0,54,64,237,164,99,2,49,55,55,65,116,160,25,
-0,55,66,119,96,75,104,60,84,11,78,93,120,226,96,4,65,213,196,209,
-65,220,213,158,129,203,239,251,0,198,124,69,44,240,21,6,233,32,7,64,
-22,243,87,13,224,65,0,96,79,130,106,233,20,7,227,39,1,224,69,10,
-196,202,224,69,5,137,119,96,22,163,127,224,91,6,240,176,17,242,224,2,
-64,0,162,174,160,126,133,188,102,74,67,50,162,83,95,153,67,131,67,134,
-64,112,0,66,170,19,132,36,224,171,1,128,44,96,169,162,7,65,97,133,
-54,2,66,32,89,151,178,224,188,0,224,13,1,103,218,164,216,1,85,32,
-99,168,224,175,1,7,108,97,121,111,117,116,76,83,160,177,128,252,225,137,
-6,64,144,192,25,224,2,0,128,47,64,37,128,1,225,181,4,251,8,0,
-160,143,64,199,160,43,224,59,0,224,56,12,255,167,0,128,27,98,129,225,
-3,3,224,31,6,103,105,151,250,192,99,129,63,64,7,64,247,226,204,0,
-69,20,179,87,199,169,129,99,0,80,97,213,70,227,213,139,224,52,1,192,
-0,224,140,14,192,33,224,139,2,65,37,169,16,129,57,66,61,96,239,197,
-53,225,9,1,229,68,2,193,240,192,202,224,24,2,225,36,0,100,149,89,
-146,162,131,0,53,235,33,0,224,156,3,96,11,163,187,128,217,2,54,32,
-95,150,214,128,42,224,245,1,104,62,72,245,98,135,224,252,13,96,121,224,
-44,10,151,218,64,73,228,44,0,228,40,0,64,0,64,21,96,34,227,55,
-1,128,28,198,154,96,0,224,213,0,96,7,130,114,195,119,226,21,3,133,
-169,193,100,226,128,1,253,217,0,96,66,64,24,227,57,0,161,123,97,47,
-123,151,0,56,161,6,163,242,192,122,225,8,11,171,181,229,8,3,132,250,
-0,50,64,77,231,242,0,224,230,3,129,165,132,213,161,235,193,140,161,201,
-225,164,0,96,185,225,22,1,224,152,0,128,226,224,151,24,160,106,225,164,
-0,129,209,193,94,64,81,138,32,224,158,4,224,88,43,128,172,192,88,231,
-22,1,64,94,226,59,13,96,46,103,92,0,53,187,236,160,0,128,89,229,
-194,14,225,60,1,99,65,228,183,1,100,118,96,25,145,65,96,67,225,108,
-1,129,73,229,235,5,160,81,164,236,226,75,2,160,120,227,57,1,1,95,
-49,77,145,70,159,86,249,0,32,162,21,224,59,1,132,60,225,14,1,226,
-220,3,227,204,1,163,207,224,193,0,131,179,192,13,239,182,5,224,157,0,
-224,191,1,230,173,18,129,214,224,133,7,64,97,227,73,1,1,48,53,224,
-183,2,64,147,132,203,0,53,86,151,229,225,7,7,32,101,114,114,111,114,
-32,125,101,231,128,78,128,72,133,22,229,28,1,224,126,19,227,227,5,161,
-41,96,38,64,23,207,241,228,62,0,164,205,226,61,2,161,134,102,145,97,
-33,161,65,97,249,224,16,3,129,244,130,16,193,78,131,91,224,13,9,225,
-222,1,64,252,1,50,55,165,26,193,26,224,166,3,76,211,84,212,231,122,
-0,229,234,8,161,69,108,66,111,235,64,40,225,76,1,5,115,121,110,116,
-97,120,129,76,225,74,25,71,159,207,115,1,80,32,139,116,0,85,139,33,
-140,43,2,75,50,32,64,12,139,188,74,125,0,65,137,55,67,181,3,10,
-65,32,73,64,29,64,157,96,29,162,113,233,152,0,196,89,192,255,193,63,
-192,19,219,231,180,128,97,40,225,101,0,96,8,75,136,2,49,55,54,130,
-115,224,70,3,234,143,0,96,22,165,109,226,241,3,64,36,65,157,97,92,
-69,18,129,72,0,52,197,110,2,55,54,53,96,5,118,0,245,83,3,237,
-141,0,229,72,2,199,180,226,37,6,164,37,229,252,5,224,7,3,162,4,
-226,102,1,226,13,0,165,253,64,178,64,60,224,33,12,128,27,224,26,6,
-129,35,160,137,98,48,230,115,0,224,38,13,130,47,101,87,161,248,105,242,
-137,247,173,88,96,229,96,11,205,105,163,189,0,64,66,14,65,242,64,7,
-206,92,3,32,95,49,49,93,190,238,40,11,141,51,238,40,2,174,45,183,
-159,138,191,164,81,1,54,53,228,175,1,160,114,65,160,225,155,6,73,80,
-2,95,55,50,252,80,3,8,77,104,115,46,66,117,105,108,116,153,59,65,
-178,1,53,32,96,35,2,95,49,51,87,210,225,197,2,224,58,6,5,80,
-114,101,108,117,100,170,254,66,187,142,8,0,75,98,199,0,54,236,96,0,
-129,67,64,35,224,11,2,192,8,210,137,79,166,195,57,64,247,131,56,64,
-119,160,69,160,44,64,20,0,51,224,90,2,201,135,226,204,3,195,42,194,
-205,230,92,3,192,125,130,202,128,32,128,26,2,95,49,50,127,125,2,95,
-49,55,83,253,98,180,88,213,131,47,228,172,4,195,35,160,96,227,52,1,
-227,172,2,233,220,1,96,23,224,25,11,96,251,228,214,3,224,182,0,164,
-195,160,17,128,6,224,60,0,128,32,64,154,188,64,0,57,65,171,0,49,
-82,52,226,10,2,1,95,53,132,152,112,211,174,124,78,109,1,49,55,101,
-12,1,95,55,77,199,128,125,128,32,194,147,224,15,1,130,171,193,29,1,
-53,52,64,48,128,130,1,95,53,111,158,128,146,0,95,143,105,102,173,117,
-247,194,139,1,67,39,76,167,64,25,0,80,128,91,160,252,227,153,1,171,
-53,141,134,132,5,64,18,64,44,131,88,160,162,161,12,163,70,128,143,0,
-54,118,85,135,35,0,54,86,51,72,29,0,50,207,230,163,123,161,5,3,
-66,32,95,55,102,9,1,49,53,235,72,0,77,135,64,202,0,54,117,235,
-1,49,50,118,201,1,49,52,65,84,64,7,186,174,81,204,131,251,102,247,
-96,96,64,6,99,24,130,81,1,95,49,166,3,161,14,112,113,100,45,106,
-164,177,216,65,175,136,90,128,164,192,68,65,144,235,219,4,192,84,129,111,
-224,20,4,0,89,225,74,0,197,68,194,56,161,25,194,81,64,0,96,24,
-227,20,4,234,44,0,162,254,162,129,64,153,0,57,73,29,131,228,224,100,
-11,192,9,96,10,246,72,3,192,153,199,159,226,228,0,244,185,5,64,103,
-1,95,54,89,126,224,0,7,194,148,66,113,132,8,135,66,111,35,73,84,
-192,128,224,117,7,224,7,3,224,205,2,64,18,134,49,131,225,227,119,2,
-224,2,7,224,140,0,128,15,227,176,1,224,36,12,224,37,20,224,40,4,
-224,41,34,235,168,0,0,39,131,240,235,10,17,228,202,0,160,55,192,1,
-175,153,243,112,6,224,5,3,231,21,4,196,196,224,66,1,99,189,161,227,
-132,86,237,17,1,108,177,1,54,57,227,209,1,163,133,242,187,0,196,51,
-3,95,54,49,51,64,12,0,50,130,253,192,22,192,228,224,88,3,224,85,
-9,192,50,230,192,0,0,95,101,135,160,0,197,12,224,2,17,226,244,3,
-225,25,2,161,53,225,113,5,224,28,19,225,176,3,193,133,193,24,229,250,
-4,224,20,0,224,8,2,1,95,57,238,232,0,225,170,0,225,108,1,224,
-197,3,64,15,226,30,3,0,89,160,32,224,101,0,225,250,7,171,63,160,
-42,192,19,197,172,96,129,160,172,226,105,7,192,92,160,62,192,195,98,26,
-224,5,3,193,65,224,57,3,162,47,224,25,10,160,2,224,25,17,226,167,
-1,225,112,3,192,164,64,19,226,245,1,225,39,5,133,232,205,231,232,211,
-2,160,68,96,86,224,80,0,228,209,2,224,224,8,68,212,96,26,128,39,
-0,53,102,175,64,53,202,78,228,55,0,64,126,155,240,71,240,230,192,7,
-224,28,16,2,95,49,55,197,160,128,0,102,180,151,20,192,0,224,246,2,
-226,20,3,129,7,224,210,4,160,247,224,128,7,224,215,0,224,236,3,224,
-218,0,198,230,224,249,2,200,47,226,93,11,226,192,1,228,0,2,226,92,
-255,226,92,45,226,90,1,96,0,226,2,14,225,67,3,64,13,226,8,31,
-229,120,2,224,26,0,193,4,231,203,4,128,155,192,149,74,18,64,147,245,
-4,3,64,0,96,149,64,106,227,2,13,127,219,224,120,8,224,136,10,237,
-186,3,160,57,176,12,227,105,17,128,212,128,185,111,180,0,56,137,169,226,
-238,7,230,201,2,160,3,234,65,5,225,76,2,224,90,1,232,138,3,98,
-147,225,175,3,240,125,1,226,246,3,200,177,229,234,1,161,6,140,30,227,
-142,16,64,84,243,115,3,128,0,225,103,4,128,179,64,40,0,80,137,255,
-239,79,4,232,144,3,130,200,192,208,225,42,3,224,98,1,226,82,6,233,
-156,1,224,89,8,163,79,64,251,64,66,65,62,135,82,224,80,4,224,75,
-16,225,207,1,161,172,203,139,64,67,196,15,224,72,2,203,96,249,22,11,
-2,110,111,116,90,143,4,111,114,116,101,100,184,106,160,0,73,224,221,56,
-0,82,64,105,110,199,66,68,2,55,52,50,202,131,2,95,55,52,78,130,
-203,84,65,113,187,62,251,139,6,0,32,142,177,0,54,84,155,192,93,145,
-93,225,19,5,225,113,3,132,90,229,31,0,228,137,4,226,215,5,164,60,
-224,26,0,224,69,0,225,202,1,64,0,96,13,235,103,4,224,28,1,227,
-230,1,130,129,194,112,128,36,226,141,0,224,11,1,1,83,32,200,72,229,
-147,28,162,180,228,227,0,97,248,144,60,223,129,194,239,243,93,5,163,40,
-128,16,224,193,2,229,177,3,192,155,227,54,4,228,119,2,96,56,172,65,
-1,48,51,231,11,4,225,47,2,96,103,225,80,0,230,121,7,224,38,50,
-161,85,134,105,96,38,228,45,21,225,39,14,163,217,128,108,244,153,0,164,
-31,224,21,14,165,137,161,11,129,238,85,254,133,127,245,93,7,225,74,1,
-225,181,25,250,241,6,225,182,5,224,146,2,237,113,1,224,13,11,245,73,
-14,161,42,230,61,2,98,147,224,185,1,224,0,3,230,45,0,224,183,29,
-224,182,18,224,171,88,224,170,37,225,97,19,224,170,93,198,159,198,172,128,
-1,195,225,224,16,0,232,211,0,128,14,224,206,14,224,96,0,192,54,192,
-167,224,16,2,233,171,4,160,16,227,241,11,224,122,1,131,244,224,66,2,
-233,12,3,128,1,96,223,148,156,128,209,160,88,166,62,131,177,232,97,1,
-148,170,2,52,55,57,228,200,0,159,125,2,95,49,50,83,98,1,95,56,
-81,127,230,87,2,228,82,9,241,189,0,64,139,97,197,128,97,193,77,128,
-8,160,5,238,245,4,193,52,169,101,160,170,137,49,145,139,177,131,224,117,
-0,195,195,229,208,5,230,4,1,128,27,225,74,0,224,217,4,192,68,209,
-233,0,90,97,60,96,176,96,220,84,104,210,9,0,54,116,209,93,95,230,
-180,3,192,97,160,126,160,118,160,17,96,196,100,130,152,186,243,61,2,1,
-95,54,123,154,231,78,18,231,67,8,15,117,110,100,101,102,105,110,101,100,
-32,109,111,100,117,108,101,231,83,7,111,151,97,171,0,79,225,141,0,192,
-244,199,29,231,54,2,231,113,8,128,2,162,95,224,21,6,160,81,226,59,
-1,96,69,163,53,1,95,56,150,124,128,87,112,96,231,61,0,231,79,0,
-246,253,5,64,57,128,51,225,67,1,96,61,65,28,202,154,99,30,96,208,
-236,7,7,224,148,1,171,16,98,221,160,135,244,101,1,137,12,1,90,32,
-254,27,3,130,180,64,12,226,56,4,171,148,0,55,225,137,0,180,180,224,
-78,4,96,202,248,79,0,224,133,37,1,64,75,224,57,0,192,63,66,78,
-154,67,97,184,81,224,1,48,48,224,93,1,194,35,96,39,151,175,247,213,
-6,1,46,46,66,1,64,30,0,54,247,124,10,65,154,160,20,236,198,5,
-164,38,1,50,52,96,93,224,11,2,129,220,128,12,138,114,65,45,196,222,
-170,1,133,78,64,20,192,65,128,0,224,48,16,224,40,7,66,179,105,57,
-64,163,152,53,226,142,1,226,14,1,226,64,1,224,9,4,224,29,1,224,
-9,4,233,176,1,233,186,2,228,64,3,107,102,75,37,98,136,1,50,48,
-167,9,98,196,68,3,245,199,0,98,191,0,95,93,249,0,55,87,126,1,
-95,55,236,66,0,66,152,4,50,51,52,32,95,89,62,80,84,0,48,245,
-138,1,97,255,1,50,51,86,184,147,96,97,2,249,254,3,133,69,128,21,
-224,23,10,140,6,245,209,13,166,193,228,193,1,168,204,132,87,226,220,2,
-129,92,232,212,9,224,148,6,224,128,0,96,15,225,215,6,224,7,9,234,
-218,27,224,166,2,96,16,231,105,1,239,1,3,161,181,229,227,1,237,243,
-1,133,138,193,79,66,252,182,131,224,223,8,224,0,3,65,133,131,166,0,
-95,125,173,64,6,65,214,160,119,225,173,15,195,176,225,176,36,225,24,5,
-238,252,4,97,35,130,106,0,80,225,196,13,224,84,1,129,79,193,6,129,
-1,192,39,227,167,7,128,195,68,84,210,194,226,3,30,160,228,224,85,26,
-98,42,226,89,50,68,181,69,240,165,172,224,239,9,228,52,6,193,250,193,
-75,226,54,1,224,13,5,199,61,96,153,160,43,236,85,2,236,88,1,226,
-72,5,160,34,224,61,0,126,42,227,85,15,236,45,0,226,241,7,160,132,
-224,10,2,225,175,1,133,98,225,49,6,70,225,172,215,166,18,233,47,8,
-193,72,66,232,225,69,3,250,240,0,1,55,55,165,36,128,99,224,219,0,
-224,156,9,241,57,17,192,54,193,56,227,123,1,225,51,0,193,40,133,18,
-64,52,224,93,2,0,83,160,53,124,90,226,120,3,0,85,96,43,235,153,
-4,0,95,114,62,0,85,101,242,192,216,227,193,1,64,0,226,150,12,224,
-166,26,160,146,64,169,228,22,7,224,80,6,228,39,2,224,0,2,64,180,
-111,84,229,212,5,88,235,105,36,133,1,227,166,16,225,217,6,124,77,200,
-13,224,104,7,0,49,95,61,72,159,0,56,106,238,129,195,130,178,224,5,
-0,64,64,2,55,56,57,231,248,0,224,6,5,192,7,97,113,0,52,105,
-83,89,179,0,54,115,227,155,115,102,140,72,252,230,140,0,71,58,0,51,
-103,58,3,85,32,75,52,96,196,64,18,155,144,105,132,89,246,228,253,0,
-2,55,48,50,167,16,132,8,2,95,50,56,73,163,212,126,65,108,129,238,
-103,29,1,55,53,72,133,1,51,57,162,165,233,149,0,100,55,96,56,233,
-162,2,224,57,19,160,217,98,32,204,44,98,235,64,171,210,91,1,95,50,
-71,126,64,17,146,15,96,242,98,135,77,153,96,117,96,11,138,152,128,13,
-227,102,1,227,234,2,133,209,65,22,128,150,1,49,48,97,155,225,134,0,
-96,31,1,48,54,66,205,227,166,2,96,87,65,63,64,160,228,224,1,160,
-85,94,108,65,147,143,236,128,86,224,17,1,192,46,128,165,161,190,0,50,
-172,240,65,8,0,56,66,13,160,249,64,99,94,127,0,50,102,119,129,249,
-157,81,0,54,96,167,228,167,4,131,152,130,130,98,139,0,51,66,197,68,
-42,72,185,172,26,2,79,32,35,74,96,99,15,2,95,49,49,70,229,0,
-52,130,30,64,122,205,146,2,95,49,48,70,250,0,52,74,35,3,95,49,
-57,51,67,76,64,9,2,56,49,32,240,11,0,96,104,67,212,224,44,3,
-81,111,176,229,0,58,131,80,129,175,0,55,86,100,1,49,50,98,207,1,
-51,49,106,230,66,154,1,49,50,66,226,72,106,71,129,64,49,138,219,64,
-49,64,83,160,49,0,54,130,251,224,36,0,138,216,98,156,137,188,161,222,
-230,183,0,193,185,191,122,133,1,0,83,97,189,65,45,65,76,0,57,235,
-19,2,1,45,62,109,21,64,70,2,79,32,64,96,31,72,33,68,18,64,
-64,196,60,160,68,128,71,164,109,224,74,7,0,61,160,74,226,46,2,64,
-36,1,55,52,66,98,160,72,228,175,3,160,76,160,162,192,79,2,79,32,
-35,76,189,224,121,0,226,190,5,192,41,164,224,135,156,226,116,3,228,242,
-1,79,197,2,54,50,52,138,193,96,8,64,6,161,194,128,93,225,24,5,
-0,53,194,235,161,8,96,15,64,106,230,142,1,225,73,9,6,79,32,35,
-56,53,57,52,192,175,225,70,20,224,199,1,224,240,6,1,56,54,76,216,
-225,34,3,225,61,11,193,17,225,18,1,99,16,224,16,3,98,18,238,146,
-22,65,51,135,148,97,62,227,164,7,230,52,3,136,50,163,168,97,66,65,
-76,0,52,195,244,64,36,227,162,7,227,25,22,64,115,241,23,6,225,195,
-19,64,44,64,119,193,185,225,211,0,199,68,100,54,102,177,1,49,50,97,
-105,128,85,99,247,66,73,0,48,195,240,67,59,0,54,133,48,160,81,99,
-242,160,6,64,29,141,254,129,147,2,95,49,51,68,56,64,22,141,113,192,
-22,80,124,96,22,134,77,226,252,1,10,80,114,105,109,105,116,105,118,101,
-115,46,99,7,64,35,134,94,224,111,6,224,124,9,96,43,133,222,0,75,
-233,103,0,0,83,163,110,130,114,224,5,4,77,105,151,3,193,204,1,95,
-56,135,212,102,184,64,170,0,51,96,5,173,136,128,37,175,180,224,41,20,
-96,137,134,86,166,31,71,85,70,246,66,103,0,95,167,180,122,56,100,158,
-0,35,140,76,228,157,0,64,150,135,99,71,101,96,78,66,22,65,4,0,
-54,71,90,0,56,239,145,7,225,53,2,164,136,98,243,172,102,197,122,229,
-132,14,224,79,21,164,141,224,79,25,170,69,96,172,133,93,0,75,70,83,
-64,14,130,48,129,10,0,56,69,186,0,48,69,186,90,25,66,11,96,12,
-79,28,228,138,2,69,184,160,36,1,49,54,66,49,228,168,0,224,67,20,
-0,54,99,229,199,24,224,68,1,105,73,70,211,186,178,224,68,7,1,49,
-55,65,206,224,120,7,0,55,90,179,224,111,20,0,55,137,45,0,49,224,
-31,1,97,81,224,15,6,65,2,209,20,224,96,1,83,228,71,59,147,234,
-237,216,1,235,35,0,192,13,96,5,237,78,2,164,114,230,74,1,3,64,
-67,32,60,247,97,1,192,21,80,144,224,35,9,132,61,226,200,1,248,87,
-7,99,53,238,142,0,237,55,5,164,239,234,192,9,199,49,128,44,246,120,
-6,195,137,192,69,64,7,238,138,9,133,64,237,70,0,224,26,7,239,202,
-0,0,83,68,211,133,134,65,238,0,57,239,163,16,227,173,3,248,132,7,
-224,146,3,237,115,2,236,252,2,237,126,0,165,225,224,83,1,249,236,4,
-238,67,5,240,152,7,224,27,1,128,221,180,100,204,224,67,249,128,32,192,
-102,64,36,3,95,53,57,49,244,115,0,180,212,192,0,226,88,2,216,38,
-96,50,226,83,9,71,249,64,0,225,73,1,209,26,66,180,130,222,0,48,
-237,54,3,231,5,0,235,118,0,247,143,7,86,164,3,49,48,51,32,74,
-186,128,54,1,95,54,172,125,198,200,247,238,2,150,22,141,247,245,9,3,
-225,204,1,138,133,0,53,239,218,1,67,38,134,37,1,80,32,64,11,134,
-26,128,179,1,50,49,65,44,129,68,2,95,54,56,69,109,1,55,51,103,
-30,0,54,128,112,229,152,0,68,205,96,136,97,235,64,71,134,62,3,85,
-32,75,51,69,77,77,130,101,84,160,29,134,48,2,95,54,56,76,206,0,
-85,161,185,225,191,3,225,207,1,224,1,7,226,25,2,224,37,16,224,35,
-4,224,32,23,224,29,20,224,26,17,224,23,14,180,111,224,0,0,64,237,
-172,235,70,69,235,28,1,255,160,11,1,37,84,101,246,230,147,1,64,41,
-139,49,229,14,18,72,38,167,114,164,186,229,135,6,131,8,2,95,57,49,
-224,53,0,68,60,113,45,0,83,111,209,137,124,196,74,228,76,2,163,8,
-130,63,0,55,66,14,233,96,2,164,181,64,1,67,88,198,218,64,146,98,
-56,0,64,77,216,129,30,4,95,49,49,56,55,86,227,96,36,226,246,0,
-192,127,229,59,18,245,113,0,229,92,16,128,162,96,182,240,181,3,96,23,
-144,182,128,29,196,123,128,147,228,49,10,96,24,242,133,2,206,132,96,46,
-195,66,79,174,1,56,56,73,5,67,67,64,247,198,112,224,133,12,102,169,
-224,132,8,228,32,2,96,105,64,12,97,142,136,165,2,95,49,53,241,92,
-5,100,227,78,207,226,89,0,224,104,8,224,237,13,224,104,7,96,210,160,
-77,224,185,4,141,144,73,159,111,244,64,137,193,160,177,116,0,67,68,54,
-0,57,249,152,3,101,13,230,151,32,128,203,225,136,3,134,221,224,160,1,
-230,132,9,135,119,136,61,161,174,244,19,1,229,96,2,244,15,0,160,73,
-212,218,204,77,96,225,166,190,225,90,2,230,196,5,129,232,227,55,2,64,
-71,74,44,1,48,57,68,243,0,50,98,187,227,68,3,65,66,199,109,232,
-197,6,224,37,2,74,224,227,186,0,67,173,146,14,1,55,50,225,225,3,
-96,121,0,50,111,96,1,48,57,99,35,175,246,192,119,192,160,241,140,2,
-0,85,145,224,97,164,227,49,8,224,25,12,131,42,227,39,12,0,49,134,
-66,251,133,1,160,4,99,225,161,32,226,218,11,224,55,8,99,39,113,229,
-226,197,8,224,65,8,224,121,8,229,251,3,2,95,57,49,110,209,251,25,
-0,129,19,115,225,233,12,82,177,134,64,17,205,166,192,0,69,143,140,16,
-142,90,122,92,1,56,50,160,8,83,183,147,48,212,32,167,207,224,162,5,
-228,195,12,135,141,228,228,27,233,92,9,192,25,229,139,2,190,213,224,49,
-14,128,108,161,177,128,1,235,31,16,254,69,1,133,23,195,95,226,234,1,
-64,49,0,57,237,208,1,160,79,235,139,6,229,91,0,72,57,96,155,100,
-142,255,214,0,224,172,0,226,208,17,224,198,8,96,21,0,85,98,17,67,
-164,162,70,224,242,13,225,35,2,128,89,198,232,231,37,4,101,211,0,53,
-231,143,3,13,116,121,112,101,32,115,105,103,110,97,116,117,114,101,135,155,
-128,225,248,77,4,225,34,4,225,28,13,64,42,231,152,10,113,168,65,43,
-208,96,224,74,2,237,43,6,138,92,225,175,24,225,130,14,160,127,2,95,
-57,48,96,16,225,126,12,128,0,224,56,4,66,242,142,86,224,116,11,1,
-51,48,164,170,78,167,235,36,5,228,62,1,192,121,224,246,1,68,216,128,
-254,193,167,103,91,1,50,55,125,129,1,52,53,68,51,96,205,165,3,225,
-143,1,26,67,97,110,110,111,116,32,115,97,116,105,115,102,121,32,99,111,
-110,115,116,114,97,105,110,116,58,32,97,156,244,59,0,181,33,215,213,224,
-70,6,4,92,49,48,38,32,64,0,14,102,117,108,108,121,32,113,117,97,
-108,105,102,105,101,100,160,69,3,95,49,52,48,228,179,1,97,3,0,54,
-131,246,72,172,228,52,1,227,131,6,229,193,6,233,40,2,153,79,244,56,
-1,96,9,225,16,4,66,119,133,41,226,124,21,225,223,1,98,128,160,13,
-237,75,0,192,91,65,7,226,102,2,66,61,195,2,224,63,5,128,205,227,
-48,0,224,32,1,160,14,224,31,3,64,2,96,96,226,8,3,0,51,225,
-41,2,224,92,1,96,129,65,244,226,194,2,131,111,2,49,50,55,193,146,
-0,54,71,92,134,29,250,112,11,100,197,198,61,0,85,100,217,81,154,192,
-108,224,115,10,231,66,7,160,32,232,44,7,224,5,4,214,107,128,10,0,
-55,148,37,2,39,32,95,74,172,98,221,195,49,96,0,225,45,15,148,158,
-64,9,98,202,160,50,225,50,0,96,30,165,1,102,97,1,55,55,235,72,
-6,64,114,4,49,50,57,51,32,77,193,160,229,250,14,0,148,20,1,49,
-50,218,149,136,201,192,72,0,79,68,67,89,103,96,53,64,62,0,65,96,
-38,161,42,251,69,4,110,30,128,21,4,95,49,53,50,50,231,157,5,64,
-0,66,236,145,53,67,211,67,134,224,64,0,64,26,142,41,97,44,228,13,
-8,196,130,97,200,96,250,106,62,103,5,96,2,226,13,4,97,29,99,69,
-170,119,1,49,54,64,69,251,251,0,73,41,103,189,181,105,129,160,224,64,
-2,137,218,239,80,6,64,213,66,233,64,171,142,201,64,73,0,48,74,183,
-1,49,48,106,184,128,212,64,31,206,161,226,122,4,169,13,226,123,5,227,
-189,2,224,250,7,226,255,0,225,222,0,184,194,227,126,2,121,236,209,107,
-132,56,106,208,97,244,0,53,79,125,84,170,192,42,195,101,160,242,224,71,
-2,96,47,0,51,72,104,128,153,133,43,1,49,49,106,81,226,141,0,99,
-216,160,108,130,246,64,93,224,52,1,226,71,1,224,52,7,192,223,137,133,
-226,235,7,128,82,224,154,1,195,63,225,212,3,64,35,0,85,227,133,4,
-166,12,131,92,128,203,149,194,166,247,231,181,0,225,93,12,1,55,49,163,
-200,168,64,225,25,15,163,64,235,172,0,66,77,112,162,230,106,0,225,18,
-1,173,112,160,220,97,136,196,36,128,13,160,38,225,193,6,133,84,2,49,
-55,49,107,123,64,87,0,51,227,195,4,160,228,128,118,119,216,85,224,253,
-30,1,160,115,102,237,96,106,138,168,192,118,224,109,8,97,49,130,92,128,
-12,1,53,52,119,122,97,47,128,203,132,186,165,20,229,27,1,198,4,229,
-127,7,131,83,232,69,0,227,76,4,128,135,153,220,87,229,239,232,4,160,
-88,0,85,132,88,64,68,160,132,100,179,0,56,64,130,132,114,97,177,183,
-141,132,189,163,195,160,0,67,117,145,249,0,67,69,97,2,64,95,56,111,
-253,64,22,215,183,237,45,12,164,66,225,241,5,64,168,237,157,7,64,189,
-240,229,3,228,99,0,98,53,164,136,235,95,11,131,196,234,127,14,135,222,
-225,190,0,231,245,5,198,153,85,189,228,24,9,96,166,230,148,4,225,105,
-1,0,80,245,69,7,230,170,1,239,52,8,237,149,1,224,246,12,162,15,
-224,250,9,130,104,237,67,0,224,162,49,0,75,224,35,4,255,58,1,237,
-228,10,225,41,9,225,40,0,225,34,53,229,150,5,226,21,0,232,99,5,
-91,100,1,53,48,248,187,1,66,146,224,115,0,230,152,2,236,108,20,226,
-6,51,131,22,0,55,232,219,0,234,209,3,234,201,8,31,105,110,102,101,
-114,32,114,101,99,117,114,115,105,118,101,32,112,97,116,116,101,114,110,32,
-115,121,110,111,110,121,109,32,74,3,0,115,201,250,225,91,12,230,162,0,
-227,239,8,237,25,5,246,197,8,64,0,226,113,10,237,42,2,86,65,0,
-66,96,6,224,92,9,236,185,1,132,145,224,94,12,225,178,9,229,222,11,
-108,150,226,185,2,236,53,23,198,11,224,30,5,229,157,20,96,146,232,132,
-10,234,132,4,229,20,8,229,10,10,64,0,162,118,197,234,241,144,1,98,
-199,64,19,128,10,112,11,197,169,0,55,64,103,84,60,230,60,12,230,80,
-12,160,182,128,0,0,58,149,83,141,136,1,49,55,81,26,112,115,96,24,
-144,148,199,29,79,19,205,63,240,239,1,192,7,0,83,71,160,195,190,224,
-32,9,224,206,0,96,216,113,199,224,129,2,142,10,0,83,168,192,225,44,
-6,242,52,1,236,37,8,206,46,128,77,236,167,1,225,140,3,65,50,246,
-214,2,1,55,54,96,50,136,0,230,96,0,97,78,224,93,5,226,24,9,
-239,56,5,1,51,48,239,128,0,225,221,8,159,182,97,179,236,91,3,230,
-198,1,64,244,0,54,241,242,2,96,186,0,80,185,70,255,190,2,107,128,
-64,57,2,52,52,53,96,133,64,35,138,184,226,3,0,0,52,94,111,1,
-95,56,72,158,97,239,0,54,213,76,64,110,137,154,181,224,64,117,139,132,
-146,232,242,238,1,194,78,149,155,126,63,140,8,3,53,32,35,57,65,93,
-174,248,0,52,231,118,0,1,95,52,74,252,2,52,53,54,251,136,0,224,
-67,11,226,119,4,75,48,65,94,0,55,66,145,96,86,1,35,49,118,43,
-64,151,140,1,1,95,52,67,214,2,49,55,49,95,135,96,39,98,142,64,
-122,192,13,95,78,2,95,49,52,102,45,0,50,105,11,224,39,0,0,55,
-224,93,0,96,13,65,148,224,13,1,122,101,96,13,64,110,139,196,67,111,
-65,60,2,49,50,54,159,210,0,54,104,65,101,229,1,32,64,160,216,64,
-29,65,133,64,54,139,219,226,130,3,0,52,64,57,0,75,226,149,9,89,
-132,232,169,1,240,211,0,228,123,6,245,245,4,130,110,232,169,6,0,52,
-77,77,227,119,0,226,105,3,2,95,53,57,64,73,234,9,2,64,161,169,
-7,162,207,100,188,130,168,98,66,96,34,137,19,0,67,131,23,68,171,96,
-22,64,37,64,219,123,157,71,217,123,151,0,51,73,40,187,151,2,95,49,
-49,193,8,64,21,255,1,22,183,98,231,24,0,222,249,100,44,231,7,11,
-98,90,224,25,12,96,80,231,59,13,98,215,231,59,9,96,22,91,255,130,
-148,128,117,128,146,164,141,64,9,65,27,239,209,0,224,68,8,96,117,67,
-190,229,205,4,224,43,13,96,187,1,85,32,155,44,2,39,32,64,96,169,
-196,253,224,124,2,142,53,196,174,230,136,7,139,151,101,32,228,177,1,96,
-23,205,89,224,27,7,64,79,224,156,7,64,0,128,134,224,240,1,193,116,
-225,56,1,128,45,192,153,225,61,5,224,27,1,255,87,21,196,187,224,98,
-0,205,227,224,13,5,229,92,0,160,146,96,2,239,180,5,96,177,128,24,
-75,71,160,64,239,194,12,224,122,3,197,105,180,229,192,118,224,22,3,234,
-82,1,224,83,0,2,95,49,50,86,200,68,163,164,171,187,29,1,50,49,
-66,242,68,16,236,100,8,193,36,128,94,1,51,56,129,152,0,48,234,163,
-2,128,51,1,49,54,99,34,224,112,2,69,125,96,18,224,66,5,0,52,
-119,202,224,66,6,128,129,68,211,96,180,255,84,8,0,64,254,95,7,225,
-159,17,130,248,226,7,0,225,110,6,129,89,161,137,226,80,3,225,69,2,
-147,201,237,245,2,224,2,0,97,162,224,40,1,225,168,16,226,37,4,164,
-141,225,176,4,225,148,1,98,33,224,29,18,201,22,161,70,129,73,193,97,
-2,50,51,52,101,112,129,215,225,183,1,225,180,40,226,2,20,226,94,2,
-161,209,224,139,4,218,38,192,33,67,228,113,160,64,16,135,101,225,159,3,
-64,10,105,26,177,219,161,139,150,89,193,190,224,80,0,82,148,242,146,6,
-130,202,230,171,0,194,59,65,0,104,11,99,207,138,45,99,209,116,253,224,
-0,0,226,120,38,106,49,226,43,10,160,75,235,163,5,250,51,2,128,249,
-235,196,8,233,147,5,251,229,4,66,46,239,144,9,246,199,11,2,63,63,
-63,140,193,3,95,49,54,53,64,169,160,70,120,129,226,136,7,160,0,70,
-186,216,119,244,107,19,128,135,175,220,0,67,121,221,241,198,2,101,69,224,
-99,6,226,26,6,226,13,1,153,254,199,217,132,119,97,89,64,45,0,53,
-75,124,149,52,4,48,32,64,75,51,202,143,64,44,170,17,137,237,244,184,
-2,96,241,148,142,102,78,226,20,3,64,223,0,54,232,1,0,208,152,2,
-95,49,54,209,159,235,33,0,1,49,53,64,234,118,21,131,87,234,230,1,
-131,70,98,141,96,159,0,85,64,34,96,152,128,157,192,38,99,80,64,138,
-100,201,246,85,15,64,62,162,100,96,228,64,162,138,132,66,160,130,246,186,
-152,225,246,1,154,223,225,92,4,121,36,228,143,6,231,217,0,198,186,119,
-103,162,52,239,251,5,1,32,67,246,121,0,65,73,128,100,130,236,160,14,
-160,55,68,246,165,54,232,55,1,103,211,115,210,197,57,130,27,192,30,243,
-250,4,128,38,160,26,194,73,248,66,8,228,156,3,130,100,192,203,192,75,
-128,85,182,246,204,171,243,150,7,204,194,97,174,0,49,68,185,64,9,110,
-55,67,254,1,51,56,172,12,98,126,1,49,51,93,37,235,148,2,225,167,
-1,192,80,100,158,192,84,195,246,224,241,2,224,228,42,224,222,0,224,13,
-1,163,75,224,18,1,96,92,128,7,224,225,5,224,6,0,160,230,224,158,
-3,64,209,116,52,224,175,4,64,0,107,216,3,48,48,32,64,65,243,193,
-237,1,50,56,98,29,96,181,102,141,230,114,10,224,28,1,66,252,105,168,
-160,18,224,41,5,224,29,0,98,207,140,188,251,198,15,130,148,194,125,128,
-210,152,101,64,59,0,51,139,118,67,54,7,95,49,49,52,50,32,95,52,
-75,93,101,174,64,31,140,114,132,94,98,215,228,180,16,225,171,2,225,165,
-3,225,119,4,233,172,4,193,151,233,125,2,224,58,7,194,138,224,22,0,
-224,28,4,226,1,4,224,2,4,192,32,128,104,232,2,1,224,67,1,232,
-145,6,227,73,1,229,90,8,229,91,7,224,98,1,229,150,0,199,112,224,
-234,1,251,27,1,64,13,231,63,9,135,36,66,91,231,10,7,233,110,2,
-229,48,2,128,103,166,20,225,66,1,224,197,10,230,220,6,192,20,249,10,
-2,163,212,236,58,1,242,206,7,224,50,11,231,123,8,227,125,4,224,41,
-2,225,62,8,225,125,0,226,194,5,96,169,162,198,128,54,169,33,229,201,
-16,160,51,134,145,230,121,6,224,33,3,166,73,114,204,208,49,129,63,237,
-138,7,96,189,197,4,204,207,80,207,5,64,64,95,54,49,51,251,69,7,
-128,119,1,55,51,255,115,3,26,51,52,38,115,114,99,47,77,105,99,114,
-111,72,115,47,84,121,112,101,67,104,101,99,107,46,104,115,64,27,7,44,
-49,52,51,49,58,50,56,136,42,241,141,2,106,83,113,101,138,3,224,230,
-3,64,219,66,5,225,57,19,106,116,135,42,225,63,11,236,8,2,64,194,
-153,83,96,26,224,211,61,3,48,58,50,50,192,211,232,52,0,0,64,241,
-209,1,71,48,170,150,97,95,229,194,0,224,122,6,226,108,9,243,184,3,
-128,186,249,108,4,232,115,12,144,117,228,156,12,0,50,227,151,2,233,216,
-10,70,160,192,18,1,67,39,235,47,6,164,44,231,135,5,228,194,2,192,
-212,238,186,1,163,27,160,31,204,196,128,11,194,108,160,19,235,120,1,192,
-225,162,183,241,161,17,232,148,4,160,85,243,252,4,160,188,192,221,0,54,
-98,83,98,212,115,69,224,0,1,166,169,225,49,11,0,53,117,206,224,65,
-0,81,188,103,201,1,52,32,148,188,1,55,54,241,240,3,70,228,181,189,
-81,184,121,147,113,185,0,54,82,23,177,185,1,64,58,128,72,70,104,5,
-54,56,52,32,75,32,81,27,224,1,13,143,179,192,0,65,192,135,26,64,
-66,145,245,130,82,143,72,83,72,79,72,70,183,129,24,248,151,3,146,92,
-69,83,1,55,57,226,223,2,5,101,120,112,111,114,116,98,189,64,85,139,
-144,88,227,227,26,6,64,120,3,95,50,49,50,224,58,2,6,116,121,81,
-73,100,101,110,128,60,1,64,85,138,19,128,70,0,54,235,215,1,2,49,
-50,55,107,52,226,116,14,251,222,23,76,80,141,66,224,61,4,224,58,11,
-226,31,5,0,54,219,54,224,54,38,0,56,115,161,224,54,40,0,57,166,
-177,241,73,5,65,11,139,96,104,144,236,137,3,195,37,192,244,224,57,2,
-248,53,4,109,71,236,42,0,224,147,15,0,49,104,168,227,22,14,99,100,
-232,21,6,232,142,1,232,111,7,160,186,224,47,7,192,5,227,38,11,0,
-52,203,180,128,0,226,194,3,231,168,1,64,13,226,2,6,232,62,5,161,
-24,0,64,252,200,0,67,172,251,101,2,96,242,1,51,49,226,129,2,91,
-94,7,97,32,99,108,97,115,115,32,98,133,1,95,54,143,111,225,136,8,
-224,150,7,225,24,2,224,28,13,227,122,1,224,54,9,227,150,2,64,14,
-233,81,1,224,2,6,224,249,3,251,89,5,148,128,192,5,218,92,118,168,
-186,93,143,62,227,129,3,183,114,100,67,239,165,2,236,88,5,128,0,239,
-228,7,252,177,15,1,49,49,118,143,225,80,1,26,115,117,112,101,114,102,
-108,111,117,115,32,105,110,115,116,97,110,99,101,32,98,105,110,100,105,110,
-103,131,229,224,0,2,225,23,9,128,1,235,20,20,224,59,4,194,92,242,
-62,0,175,211,225,57,1,224,101,0,108,161,192,97,128,55,244,181,7,224,
-144,4,88,149,201,12,226,201,6,202,144,224,80,6,128,18,224,94,1,128,
-16,224,13,4,128,10,230,82,0,240,13,1,231,131,4,64,0,232,217,0,
-225,39,10,226,154,10,169,162,224,2,6,192,165,224,30,3,226,82,2,103,
-126,0,66,96,37,97,221,252,198,10,224,250,24,202,27,0,57,239,117,3,
-192,166,1,51,53,70,187,235,130,0,226,232,6,105,135,134,113,170,156,137,
-167,192,69,228,235,1,163,182,64,22,105,116,96,50,224,56,1,89,229,71,
-45,81,25,226,39,1,160,132,96,47,225,134,1,238,75,0,224,32,0,2,
-49,51,53,205,166,224,20,2,0,52,140,129,160,14,187,164,128,238,64,209,
-64,64,128,40,1,54,52,67,0,64,9,225,195,2,69,206,207,53,96,54,
-82,37,219,201,233,216,5,148,65,213,218,233,211,6,145,204,64,104,150,27,
-128,195,168,225,64,45,82,83,224,192,5,224,0,4,226,69,3,200,186,96,
-83,195,189,130,226,2,95,49,52,90,125,226,127,2,70,118,143,7,96,241,
-97,94,161,133,64,67,198,62,96,14,0,50,102,240,161,106,0,67,82,161,
-0,53,83,150,68,55,0,35,91,79,96,95,121,12,128,87,0,51,96,87,
-228,50,1,68,39,0,34,82,74,96,87,104,60,100,182,128,120,132,215,126,
-190,159,80,70,173,65,4,245,44,0,179,137,2,95,56,53,212,86,187,236,
-136,78,2,95,54,55,143,125,97,146,137,93,69,38,137,205,145,94,1,95,
-50,72,183,160,19,64,41,137,135,0,83,139,118,166,223,161,242,249,121,10,
-128,18,71,16,224,32,9,128,247,234,175,1,231,183,1,192,25,0,85,64,
-207,130,76,231,142,0,110,68,130,72,0,56,170,107,224,66,11,224,65,6,
-227,87,0,224,71,1,192,224,96,78,201,33,162,187,233,37,3,172,28,2,
-54,56,56,228,2,8,224,96,62,160,92,160,29,232,173,13,0,58,137,61,
-124,185,0,54,86,37,0,49,66,64,64,21,234,172,0,232,192,37,96,186,
-150,187,232,118,12,0,53,129,132,228,106,4,224,96,1,131,138,97,217,64,
-94,0,54,192,86,96,85,237,139,0,140,131,64,58,237,108,7,96,28,99,
-176,224,60,2,2,95,52,55,160,91,195,213,224,56,1,225,23,5,128,19,
-70,45,129,156,149,162,1,53,50,227,232,6,231,153,15,98,96,227,102,1,
-9,109,97,108,102,111,114,109,101,100,32,71,150,11,100,97,108,111,110,101,
-32,100,101,114,105,118,231,155,1,192,147,225,15,3,233,113,7,96,17,128,
-215,170,5,76,165,169,112,98,40,67,42,227,39,11,226,191,13,76,188,0,
-90,197,229,232,226,4,96,251,226,140,6,224,45,15,147,130,129,14,128,28,
-225,17,15,196,184,234,4,5,12,100,97,116,97,47,110,101,119,116,121,112,
-101,32,234,9,5,229,127,6,163,149,240,95,1,130,182,216,136,130,184,108,
-117,130,185,0,54,165,70,230,128,1,69,35,105,180,70,18,1,50,50,99,
-231,1,54,55,124,180,77,207,148,240,224,191,9,141,133,224,189,8,2,67,
-97,110,96,192,65,201,192,186,0,49,66,221,1,54,56,230,130,1,162,93,
-246,151,4,97,50,229,250,4,64,174,140,108,0,79,87,95,1,50,50,69,
-39,66,110,224,109,1,11,68,97,116,97,46,66,111,117,110,100,101,100,192,
-7,160,115,0,54,110,202,224,57,21,3,69,110,117,109,96,4,192,51,101,
-155,224,51,21,224,4,0,224,51,0,64,171,224,103,22,3,113,46,69,113,
-224,47,0,65,171,224,47,21,4,73,120,46,73,120,224,47,0,69,113,224,
-47,21,2,79,114,100,64,3,224,49,0,224,249,25,81,246,3,97,98,108,
-101,224,8,0,224,59,0,71,61,224,59,16,11,71,72,67,46,71,101,110,
-101,114,105,99,115,192,8,224,167,29,29,76,97,110,103,117,97,103,101,46,
-72,97,115,107,101,108,108,46,84,72,46,83,121,110,116,97,120,46,76,105,
-102,143,115,66,112,225,128,20,17,84,101,120,116,46,82,101,97,100,46,73,
-110,116,101,114,110,97,108,96,13,224,60,0,66,97,224,60,21,3,83,104,
-111,119,96,4,224,51,0,72,128,232,152,4,66,118,136,108,132,53,108,184,
-100,60,152,33,204,166,0,49,68,101,224,94,1,224,84,0,226,224,2,255,
-56,0,160,10,227,115,0,252,136,6,130,175,0,55,196,197,116,173,245,129,
-0,240,108,0,206,229,227,188,5,64,61,224,17,0,224,20,3,224,21,7,
-224,24,1,224,25,11,224,28,1,224,29,4,224,83,1,96,5,230,17,7,
-224,49,16,224,2,3,235,247,0,165,174,236,27,11,149,208,124,120,224,83,
-25,224,80,2,129,36,224,81,9,172,2,203,139,225,166,1,7,115,104,111,
-119,115,80,114,101,130,182,224,108,20,203,172,192,103,224,1,1,188,47,224,
-25,10,239,74,0,224,22,14,224,104,11,142,24,246,17,2,224,201,5,124,
-195,160,5,152,142,99,105,64,55,0,79,98,49,0,79,218,215,226,198,4,
-224,210,12,128,2,192,34,224,208,2,200,61,161,229,230,102,2,98,243,67,
-40,225,241,2,224,220,5,224,224,4,224,28,22,224,243,3,128,28,170,173,
-192,2,231,57,1,224,67,14,224,65,8,239,100,0,224,8,13,64,44,160,
-218,254,13,1,0,49,108,250,0,85,227,190,2,66,23,4,80,97,114,101,
-110,194,23,192,100,128,70,142,145,128,52,2,79,32,35,72,95,161,109,161,
-31,1,49,50,129,31,0,35,219,237,226,154,3,96,51,0,51,224,51,1,
-235,61,2,64,37,205,65,225,105,5,206,45,1,85,32,179,84,224,150,1,
-224,2,0,250,48,5,144,85,0,64,100,172,226,47,0,226,59,0,64,5,
-161,252,225,238,2,242,201,1,64,9,132,117,128,137,96,242,120,89,128,146,
-3,79,32,35,49,67,160,226,101,0,128,116,64,50,96,223,71,179,224,223,
-1,96,215,238,237,0,64,1,179,181,128,51,224,111,29,75,190,192,82,1,
-85,32,117,179,192,12,96,141,0,53,225,133,1,64,60,0,49,70,248,153,
-34,0,53,251,105,2,253,223,1,70,165,0,53,160,201,0,48,236,84,4,
-96,10,64,4,161,177,109,149,2,64,95,53,140,35,64,202,106,82,224,31,
-3,0,56,78,146,226,66,7,2,83,116,114,234,191,1,194,26,176,71,224,
-58,1,226,126,13,228,150,3,226,85,6,224,51,2,65,105,0,54,224,187,
-0,93,214,174,117,219,85,111,130,141,165,239,87,6,126,7,2,55,50,48,
-97,60,88,206,225,0,1,70,244,143,9,68,221,68,102,1,53,48,110,137,
-1,56,49,66,40,97,152,64,121,193,53,122,146,0,49,97,74,0,52,225,
-164,1,69,21,138,59,64,79,254,93,3,64,81,242,223,2,65,136,133,235,
-226,204,0,231,18,15,98,45,235,140,8,64,20,146,41,97,26,66,151,128,
-17,64,70,229,250,14,3,114,101,97,100,225,98,0,128,45,99,123,0,55,
-109,123,65,163,96,165,65,214,241,203,2,129,76,224,69,1,4,101,114,114,
-111,114,129,165,64,29,97,126,129,227,224,105,9,0,32,139,10,2,102,105,
-110,170,150,226,105,3,128,4,225,162,5,97,55,144,23,0,75,124,19,192,
-243,160,160,64,30,144,12,2,75,32,90,145,172,236,128,1,225,61,0,244,
-167,7,231,193,0,231,190,8,228,77,3,135,85,232,17,0,251,10,2,231,
-153,0,162,193,129,35,128,116,244,52,16,224,87,5,194,3,225,154,14,6,
-116,121,112,101,82,101,112,161,35,192,117,83,176,0,79,90,181,66,138,227,
-232,1,64,2,160,126,103,15,0,51,186,155,225,169,7,8,109,107,84,121,
-67,111,110,65,112,224,87,1,137,66,224,55,29,128,52,151,181,227,100,0,
-131,204,130,227,224,30,26,1,95,56,83,12,0,56,244,120,5,225,252,0,
-250,206,4,64,0,0,58,139,127,234,122,39,203,250,160,145,64,1,234,121,
-42,165,152,226,35,7,225,199,7,227,113,2,227,135,2,225,221,20,5,99,
-111,109,112,97,114,140,98,101,169,95,126,98,105,239,183,4,234,241,10,234,
-251,4,247,51,2,106,171,234,149,0,128,5,170,21,128,68,160,74,201,44,
-64,49,100,46,239,190,3,243,72,6,2,32,95,50,108,12,233,135,2,0,
-32,134,0,197,92,161,228,228,33,23,1,60,62,225,141,1,160,137,96,47,
-1,52,52,150,43,224,75,35,225,58,4,64,0,255,145,0,224,52,18,1,
-69,81,192,47,199,232,225,165,0,225,19,1,97,10,227,93,6,224,83,18,
-1,76,84,233,24,4,224,78,8,74,140,160,75,251,239,5,224,81,16,0,
-71,192,81,161,143,138,195,231,173,23,160,37,224,29,5,232,38,2,227,92,
-0,229,89,7,131,93,147,184,1,75,51,96,185,230,144,9,229,113,9,96,
-53,209,77,227,147,34,175,239,96,0,227,146,138,1,61,61,227,141,0,165,
-11,128,59,137,178,148,102,138,53,227,162,3,171,69,234,182,1,195,92,236,
-132,2,64,46,236,145,7,227,105,79,1,38,38,227,105,65,193,17,64,0,
-227,100,27,2,84,114,117,227,150,0,226,179,22,226,172,15,232,131,5,227,
-63,0,227,148,33,3,70,97,108,115,192,132,128,44,226,254,22,0,54,147,
-253,65,117,150,134,129,129,129,237,77,122,181,214,110,222,97,247,193,235,139,
-202,96,10,234,104,0,164,0,217,19,90,243,230,209,4,160,28,203,213,182,
-227,160,142,96,246,5,52,48,32,95,52,53,96,35,1,57,51,153,64,4,
-95,49,56,49,32,184,75,72,194,0,51,217,79,235,253,0,64,200,148,23,
-131,77,234,91,25,246,52,7,234,91,1,247,248,4,97,142,97,172,67,74,
-164,0,129,87,64,115,210,20,64,96,0,50,224,53,0,104,168,245,1,3,
-9,87,97,114,110,105,110,103,58,32,99,245,10,9,227,107,0,161,13,141,
-248,224,66,8,4,32,121,101,116,44,128,49,99,25,90,13,225,206,11,0,
-51,160,145,130,96,99,194,96,209,97,191,64,32,235,130,1,2,73,79,46,
-95,10,3,111,114,109,73,203,55,66,88,0,49,95,110,65,52,1,50,54,
-153,231,192,16,96,62,138,137,167,100,195,189,132,25,114,137,129,127,207,156,
-224,13,9,230,126,0,77,74,0,53,64,240,1,54,54,84,95,228,253,80,
-128,79,228,253,24,64,9,245,246,0,96,80,142,126,164,55,157,4,171,88,
-171,93,217,19,231,64,2,96,104,131,10,163,231,96,137,204,17,173,186,96,
-210,0,52,87,91,98,232,174,196,229,166,30,1,116,111,224,166,42,227,183,
-4,242,45,0,192,111,224,164,10,132,47,163,211,224,175,13,228,93,2,226,
-137,8,231,8,22,224,192,0,130,83,140,190,0,85,71,131,163,222,102,12,
-198,18,0,58,130,34,231,110,39,247,251,3,96,0,226,140,5,226,109,3,
-241,51,5,226,123,12,228,57,2,64,23,234,153,1,224,16,0,224,13,13,
-202,164,224,93,0,237,115,11,224,48,5,128,2,170,187,162,97,212,206,245,
-17,2,96,74,199,124,160,94,237,88,1,162,63,227,27,7,0,82,237,53,
-7,227,51,0,224,51,17,3,66,32,82,32,220,20,230,76,1,128,5,226,
-159,9,2,109,97,120,97,121,162,161,224,31,9,1,105,110,224,31,2,226,
-58,6,253,13,4,194,170,237,39,0,195,216,102,143,166,105,0,52,64,27,
-230,20,9,226,186,3,162,66,137,231,104,199,242,253,6,129,204,225,255,10,
-239,53,7,227,72,5,239,17,5,71,16,0,51,129,213,254,97,2,164,137,
-107,3,64,60,164,221,2,49,54,54,97,197,161,218,167,75,3,95,49,50,
-52,113,165,96,18,0,53,90,246,2,49,51,57,96,122,3,67,39,32,89,
-128,117,0,80,137,82,96,92,224,127,3,234,75,13,192,175,224,165,1,0,
-89,225,74,0,224,201,0,97,13,149,101,224,50,3,128,47,128,121,224,206,
-0,192,52,128,46,194,131,138,9,194,236,161,12,64,225,128,10,99,199,165,
-40,4,51,54,57,32,95,114,184,134,228,1,51,48,172,120,130,85,147,171,
-2,49,50,57,252,190,0,224,97,22,225,34,2,98,48,193,246,65,99,132,
-142,64,9,226,12,2,225,101,0,227,197,2,194,83,68,69,0,48,240,180,
-3,160,142,1,54,54,224,142,0,227,186,3,66,86,140,8,2,85,32,90,
-201,2,64,20,0,54,96,20,90,117,64,62,0,55,96,148,128,11,95,101,
-97,235,128,20,96,45,136,185,125,114,255,200,12,193,117,96,157,96,187,111,
-46,224,225,1,225,64,1,64,78,136,148,0,83,133,40,230,9,1,3,95,
-49,53,49,72,53,1,49,52,84,44,160,122,200,46,161,5,254,146,16,129,
-113,253,215,24,161,132,72,206,160,7,246,229,3,253,245,6,64,127,136,141,
-121,60,136,80,232,77,0,255,150,2,236,97,1,255,152,5,229,71,5,238,
-98,4,0,85,131,44,134,251,245,99,0,0,56,96,44,68,32,137,32,140,
-226,224,55,1,160,190,0,54,72,248,255,214,6,224,82,48,160,78,192,240,
-137,63,129,77,224,59,0,1,95,50,64,23,194,234,3,95,57,49,57,230,
-29,1,85,229,0,57,97,78,132,16,0,49,96,54,92,204,131,68,214,215,
-0,89,228,27,0,232,6,11,0,90,97,95,171,209,168,24,67,214,227,208,
-5,224,57,1,64,1,119,157,192,242,163,251,195,97,249,147,1,224,0,0,
-64,221,135,201,131,86,228,220,0,192,79,96,244,229,91,18,228,178,1,252,
-151,0,198,225,224,2,1,96,40,224,79,1,252,215,1,224,39,6,252,215,
-11,224,37,0,106,169,128,29,96,68,224,61,16,160,62,224,29,7,96,2,
-229,240,9,128,0,129,103,232,88,11,224,16,0,224,192,2,224,42,0,162,
-58,128,0,193,58,96,105,225,65,1,224,81,8,136,36,161,10,136,29,116,
-192,226,126,1,239,79,0,198,133,195,233,0,53,130,179,98,239,0,53,130,
-180,225,212,3,224,236,6,168,141,192,105,221,76,224,40,3,249,218,10,64,
-8,203,37,128,7,203,254,162,137,160,57,234,145,12,64,153,1,50,57,74,
-7,133,87,133,63,66,252,146,82,240,74,0,224,167,2,230,233,2,163,75,
-224,90,35,136,50,160,85,96,67,163,19,4,64,95,50,51,56,195,112,230,
-21,0,250,80,3,224,139,9,224,137,1,130,61,129,120,224,5,18,134,207,
-0,85,96,197,228,231,0,0,50,101,138,0,49,124,65,171,32,102,245,224,
-0,3,225,85,4,226,122,6,227,42,3,129,29,224,18,3,194,64,225,238,
-5,224,60,11,234,119,2,241,161,1,202,145,161,142,196,34,160,250,162,193,
-160,151,66,101,0,51,96,230,208,185,144,29,2,49,54,53,198,96,110,168,
-134,123,0,49,219,32,226,174,0,225,173,8,208,114,232,43,4,225,231,9,
-237,69,4,64,109,97,227,241,102,14,134,165,128,101,96,11,229,255,0,225,
-31,3,224,2,6,193,66,224,244,3,225,74,18,236,13,5,225,89,85,224,
-61,0,225,89,58,228,19,20,96,145,101,18,225,111,8,169,106,228,39,67,
-64,38,246,90,1,228,54,47,228,55,8,224,12,3,128,156,197,153,246,206,
-19,192,56,172,20,192,62,228,52,8,105,15,66,125,232,111,7,228,140,20,
-228,106,16,128,64,205,26,192,46,65,112,64,16,130,43,104,143,82,163,237,
-126,2,6,114,101,99,83,101,108,69,252,177,1,243,159,6,64,237,235,0,
-4,218,184,0,58,136,135,232,188,0,224,37,1,126,63,224,97,1,2,103,
-101,116,205,219,224,74,3,64,63,141,130,224,42,1,6,115,101,116,70,105,
-101,108,78,11,64,30,139,74,224,30,1,13,68,97,116,97,46,82,101,99,
-111,114,100,115,46,83,224,43,5,0,54,224,43,6,0,103,224,30,5,139,
-82,224,74,14,2,72,97,115,224,43,3,211,196,96,215,150,28,97,72,0,
-50,128,30,235,34,1,160,28,128,6,64,26,138,189,133,178,225,198,13,227,
-75,9,64,55,202,4,106,247,247,66,4,234,224,1,106,51,234,225,16,98,
-107,67,59,128,182,128,128,192,23,224,1,1,233,110,20,229,245,8,160,11,
-192,31,128,88,226,218,1,230,93,3,245,93,3,224,44,2,192,5,96,14,
-2,95,49,54,117,218,226,83,8,226,248,0,251,236,0,175,134,194,180,0,
-54,108,161,5,95,49,51,48,51,32,146,109,108,240,231,27,6,97,101,2,
-49,55,51,225,230,2,27,92,51,52,38,115,114,99,47,77,105,99,114,111,
-72,115,47,84,121,112,101,67,104,101,99,107,46,104,115,64,27,7,44,49,
-49,57,50,58,50,56,130,160,184,157,128,143,96,118,77,31,238,128,8,225,
-83,7,241,187,7,197,145,197,183,101,186,238,135,0,240,112,6,224,5,3,
-170,206,224,88,0,125,3,224,16,2,101,27,224,13,0,224,251,10,2,48,
-53,48,225,85,4,224,56,15,224,90,1,229,195,7,171,9,234,224,6,129,
-227,230,216,0,192,72,192,76,234,101,9,160,36,230,192,3,65,66,0,52,
-118,207,160,34,230,196,0,229,96,1,207,202,65,84,0,53,78,156,194,24,
-239,146,25,230,164,12,129,36,2,95,54,48,237,143,0,0,53,84,181,165,
-130,237,33,9,128,231,229,178,1,195,123,129,187,193,73,192,184,236,250,13,
-225,52,0,179,43,140,187,129,68,205,83,171,44,64,230,0,52,118,200,99,
-66,133,155,229,127,3,165,108,226,207,1,7,110,111,77,101,116,104,111,100,
-229,175,2,0,64,203,121,224,223,49,226,101,1,224,222,22,97,221,67,23,
-183,161,230,113,2,224,110,5,0,83,192,110,199,180,224,115,8,163,14,129,
-237,231,244,12,97,186,227,55,1,192,0,69,47,174,86,64,30,0,50,115,
-238,0,54,64,132,0,58,128,152,1,10,65,141,59,3,95,49,50,56,244,
-105,4,2,100,102,108,102,137,64,39,134,121,211,104,96,129,229,116,1,142,
-252,232,154,0,0,67,75,138,235,238,3,224,25,17,96,91,222,10,163,32,
-225,92,0,160,11,192,8,97,88,64,47,0,54,231,69,2,0,50,73,38,
-131,59,81,25,113,212,151,135,148,32,232,91,0,1,95,55,84,192,82,27,
-96,122,64,71,134,227,7,95,54,56,52,32,75,32,85,227,163,2,192,1,
-150,232,96,0,224,28,9,128,1,229,236,0,224,37,18,224,35,4,224,32,
-23,2,95,49,50,92,229,128,0,64,165,251,34,0,230,138,15,98,59,162,
-169,193,11,96,13,242,2,3,227,88,0,224,28,6,195,9,237,51,4,138,
-231,192,110,124,184,209,191,131,23,230,168,8,1,52,53,115,85,228,104,5,
-66,111,228,195,6,227,54,4,234,179,7,224,23,5,195,84,1,54,52,128,
-143,224,90,4,224,74,72,65,105,232,168,2,225,107,8,0,52,237,101,0,
-128,240,1,54,52,97,86,130,85,96,61,220,23,162,147,0,67,226,142,1,
-82,160,162,142,64,40,136,188,226,118,8,130,108,192,13,224,1,7,226,103,
-72,224,29,20,224,26,17,224,23,14,224,20,11,224,17,8,226,218,4,96,
-0,65,14,132,155,64,38,85,62,68,189,169,33,225,131,0,101,66,85,70,
-208,10,233,60,4,100,92,0,50,243,240,1,64,43,101,110,161,245,224,70,
-2,77,94,244,26,2,65,148,64,111,227,91,12,0,50,103,20,135,73,224,
-66,1,64,50,64,30,96,13,234,183,1,244,196,1,104,43,96,70,74,247,
-64,46,0,56,138,165,196,135,227,101,1,101,168,73,66,71,169,205,229,64,
-98,1,51,49,165,29,128,125,255,135,4,64,233,227,157,4,225,73,1,0,
-51,204,93,0,89,135,62,227,174,1,170,117,228,28,12,134,46,224,33,18,
-113,65,160,139,224,193,6,192,25,247,98,2,131,241,224,189,1,224,49,5,
-232,24,0,100,75,64,43,192,247,224,44,11,224,43,1,230,106,1,172,66,
-132,147,160,247,198,155,131,244,231,179,5,169,36,243,197,1,65,164,128,13,
-98,11,228,43,0,236,66,2,2,39,32,64,96,38,97,221,68,55,64,137,
-231,214,0,224,95,33,2,49,54,51,66,10,96,102,234,35,2,224,56,40,
-160,135,224,138,0,91,163,163,71,64,254,231,62,1,86,144,128,158,192,99,
-67,121,200,85,0,80,140,27,4,49,32,64,95,54,147,3,224,243,23,1,
-95,54,98,211,241,89,1,224,249,10,224,8,10,160,204,224,243,0,134,37,
-107,181,160,5,224,68,8,224,50,19,224,44,18,225,25,1,225,31,4,98,
-78,165,130,237,173,1,65,43,0,54,97,43,234,98,1,160,251,140,82,224,
-230,4,227,11,12,128,76,227,78,19,128,127,161,234,224,33,12,131,179,224,
-67,19,227,112,16,224,25,0,185,74,249,1,3,1,49,54,133,91,64,44,
-2,95,49,53,72,220,180,234,64,26,215,25,224,84,11,128,144,163,197,129,
-111,64,141,249,154,5,64,68,0,50,96,102,195,194,68,154,249,104,4,129,
-71,229,114,6,193,162,128,148,133,18,128,141,195,203,209,122,238,156,6,98,
-127,1,52,57,69,108,0,53,69,42,234,150,1,1,98,105,222,252,133,60,
-229,10,7,0,64,108,191,82,44,5,55,32,95,52,48,56,224,59,3,2,
-78,117,109,172,5,224,243,2,226,111,0,64,52,96,76,160,160,225,97,8,
-99,53,225,97,4,104,217,225,97,1,224,141,7,226,80,0,162,104,225,229,
-2,97,173,196,221,163,132,226,246,0,64,81,97,21,98,245,167,29,224,138,
-1,2,51,48,53,67,206,225,217,3,228,94,9,97,138,224,208,3,227,91,
-4,224,29,9,225,8,35,103,28,64,8,101,191,224,245,5,231,101,6,234,
-56,0,227,103,0,141,187,224,95,16,101,105,77,243,226,92,3,224,17,12,
-232,39,8,65,152,1,52,56,226,45,4,5,102,117,110,100,101,112,97,244,
-0,90,226,44,11,224,173,8,146,83,225,184,18,161,151,128,213,232,0,8,
-65,20,100,38,227,136,11,231,231,1,227,136,1,226,243,2,96,89,225,76,
-7,224,103,18,136,230,224,103,20,224,230,1,227,248,8,132,204,224,96,0,
-225,252,3,224,102,1,102,140,228,88,16,224,103,4,226,198,1,232,72,14,
-96,42,228,248,18,228,89,2,224,169,5,232,53,4,225,10,48,224,88,10,
-225,99,2,195,26,163,121,227,33,0,229,4,5,0,50,71,109,65,18,195,
-238,0,54,95,156,225,0,1,134,89,192,61,226,52,2,160,104,232,107,0,
-227,240,47,225,113,2,129,8,227,207,17,224,194,10,64,175,100,195,64,8,
-178,13,227,84,6,224,165,124,0,53,134,233,235,175,10,170,91,224,181,9,
-227,57,7,230,112,4,78,131,96,147,229,49,0,72,12,143,255,229,130,3,
-200,71,110,185,0,56,153,136,2,49,50,54,96,13,130,78,1,50,54,197,
-112,232,218,11,70,116,96,31,229,140,27,227,114,3,225,22,31,164,33,197,
-119,255,63,5,101,87,0,50,84,168,225,152,8,109,87,229,153,15,227,80,
-8,197,129,1,49,51,69,75,4,95,49,51,52,50,236,164,5,224,95,9,
-173,45,224,95,11,130,77,227,125,1,224,109,7,217,196,0,54,133,250,139,
-104,224,125,19,96,0,65,192,248,120,3,1,80,32,227,100,2,210,46,64,
-36,143,213,0,83,64,66,0,54,114,24,96,86,64,25,207,177,96,60,98,
-52,0,80,128,24,216,94,160,26,197,40,224,87,5,238,183,1,1,80,32,
-132,161,128,61,68,138,224,24,1,129,177,160,25,243,68,0,225,37,3,233,
-25,8,64,41,243,18,5,64,71,170,241,128,16,111,80,224,144,3,96,52,
-0,54,160,52,237,244,0,134,193,236,13,1,239,82,5,0,52,129,81,192,
-100,246,243,3,112,139,227,19,1,197,25,162,220,196,219,192,86,231,132,6,
-161,207,161,200,224,94,5,234,35,0,131,26,224,29,0,66,234,224,66,3,
-224,41,1,235,250,4,232,68,0,69,222,245,251,6,67,156,65,217,96,159,
-84,103,67,244,67,250,99,40,5,48,53,32,85,32,65,160,91,232,8,12,
-97,66,180,18,4,49,50,53,48,32,64,15,226,97,1,65,131,96,253,161,
-203,242,44,1,64,25,226,61,2,75,38,64,67,74,214,251,217,6,19,80,
-114,105,109,105,116,105,118,101,115,46,67,111,110,115,116,114,97,105,110,155,
-235,64,55,194,117,64,79,64,181,0,85,128,78,194,103,70,180,233,66,0,
-164,96,231,103,45,162,75,227,145,1,235,116,1,192,25,3,85,32,64,90,
-130,7,213,3,224,45,10,128,104,160,44,96,36,134,254,194,31,230,251,3,
-164,11,224,80,0,224,15,7,229,189,4,244,113,4,0,90,216,12,233,232,
-4,205,193,173,230,0,54,64,21,90,239,65,56,225,220,4,82,14,0,56,
-243,237,2,0,58,146,30,227,93,0,251,225,18,167,207,98,130,64,70,126,
-195,96,51,172,178,99,127,148,78,192,90,240,139,1,224,92,22,226,250,0,
-242,125,18,224,38,5,104,127,136,232,225,223,1,227,136,0,224,41,0,123,
-19,229,107,2,135,182,100,135,130,62,127,232,98,227,70,210,154,128,224,47,
-5,233,201,2,96,59,64,140,224,235,6,224,74,17,129,7,132,192,0,75,
-96,146,213,138,192,100,208,190,181,60,96,47,0,54,224,47,12,65,106,224,
-43,9,131,164,132,101,253,74,6,97,35,1,55,57,220,133,223,246,128,173,
-244,10,18,231,10,25,124,0,198,140,0,50,149,253,128,71,226,109,2,69,
-201,129,31,250,75,32,129,232,224,246,1,160,170,250,75,7,64,247,132,140,
-193,156,71,47,232,167,25,96,207,96,24,136,2,64,200,64,169,64,79,167,
-25,197,230,224,76,19,131,234,64,60,0,49,100,149,64,67,97,131,192,175,
-225,90,2,96,38,110,39,225,24,1,64,50,132,223,128,47,68,151,224,9,
-1,161,200,209,133,161,42,230,94,2,160,39,227,13,1,228,207,11,227,19,
-2,224,47,22,140,79,227,67,5,224,47,19,227,115,2,132,138,224,47,21,
-181,23,225,242,1,224,47,23,195,236,128,27,229,103,9,224,31,5,187,252,
-161,123,129,212,0,51,118,200,160,34,224,64,9,245,145,0,128,61,231,217,
-16,228,6,2,231,122,3,225,222,9,165,211,96,27,231,74,4,245,255,2,
-224,141,15,193,78,192,141,197,226,100,95,1,50,55,241,175,4,19,66,97,
-100,32,116,121,112,101,32,97,112,112,108,105,99,97,116,105,111,110,241,192,
-1,225,188,0,232,75,2,97,103,160,10,225,196,4,170,62,225,147,0,233,
-67,0,230,174,7,165,160,128,26,97,108,224,194,0,194,238,96,29,165,28,
-65,10,132,135,2,49,51,53,124,227,223,214,5,67,32,95,51,56,54,64,
-47,178,233,2,49,51,53,194,74,106,223,1,54,48,224,235,3,1,36,120,
-192,217,225,25,1,194,253,228,186,5,235,124,5,163,234,237,44,8,0,51,
-95,41,192,78,128,246,234,0,5,1,51,55,65,185,172,27,225,24,2,159,
-119,230,68,11,64,104,169,89,0,51,65,168,226,12,2,225,51,2,225,241,
-9,195,112,225,83,2,237,113,4,224,226,7,139,253,121,71,235,253,7,224,
-163,0,232,20,9,96,96,227,22,10,166,186,1,52,55,226,152,1,227,250,
-2,193,82,226,47,7,160,82,226,47,11,224,40,5,158,103,228,180,6,240,
-5,13,213,191,129,3,193,39,161,67,65,213,6,48,55,50,32,95,56,53,
-96,4,78,14,230,191,1,0,79,75,80,234,84,1,2,79,32,35,72,131,
-167,114,199,121,225,96,13,225,197,3,98,60,225,105,4,160,161,65,31,0,
-48,128,132,0,52,77,205,139,90,1,49,49,160,179,217,112,233,225,2,243,
-204,0,160,5,64,3,224,119,1,224,116,6,224,122,10,66,161,228,181,2,
-224,186,2,224,68,21,224,74,21,224,75,2,224,77,0,225,155,5,248,85,
-0,192,19,224,51,1,226,80,9,66,67,128,11,224,67,11,239,230,3,224,
-121,3,226,149,8,129,48,160,170,210,50,227,95,2,224,70,2,160,67,97,
-76,224,79,0,252,240,3,96,67,145,134,160,32,229,130,7,1,48,56,192,
-121,64,0,200,117,224,182,4,229,209,6,163,27,224,145,5,229,255,16,160,
-45,224,124,26,64,32,233,254,4,225,182,6,1,53,48,100,60,228,69,2,
-227,70,27,232,218,1,224,91,21,160,8,224,91,0,128,176,228,126,10,114,
-180,1,48,53,136,71,230,85,12,231,192,7,130,89,225,90,2,96,170,228,
-153,1,192,58,173,181,1,64,75,193,30,128,140,134,31,230,243,13,19,98,
-97,100,32,102,105,110,97,108,32,100,111,32,115,116,97,116,101,109,101,174,
-38,226,100,4,173,56,224,16,8,228,177,0,233,8,3,228,240,2,162,136,
-224,56,0,0,67,97,90,224,74,5,234,100,0,225,81,1,65,80,229,64,
-0,229,127,0,224,241,0,194,223,192,29,238,162,0,220,27,199,54,224,8,
-36,230,119,2,192,90,224,158,1,160,32,128,47,226,172,0,192,66,96,68,
-190,46,224,84,0,192,15,128,32,237,199,4,72,58,2,95,56,56,64,30,
-236,235,6,160,0,128,51,160,126,231,236,8,224,33,5,70,192,69,203,192,
-23,193,35,227,82,2,0,49,150,67,225,61,0,77,75,128,166,135,126,128,
-36,1,52,54,73,252,65,123,96,169,237,173,0,93,204,96,51,66,188,64,
-30,141,163,160,48,97,210,129,192,96,240,192,234,103,87,1,53,55,249,31,
-4,2,97,105,108,162,91,64,158,2,95,49,49,79,41,2,95,49,49,95,
-86,0,64,251,118,12,96,133,230,155,0,199,174,224,86,5,2,62,62,61,
-128,44,232,232,11,0,98,194,204,193,19,226,72,0,225,253,5,226,6,13,
-229,184,1,160,34,225,231,66,225,104,0,224,210,12,225,39,0,230,151,9,
-235,20,4,129,253,173,111,160,80,224,0,2,228,226,5,196,90,128,170,232,
-90,4,160,56,227,208,1,224,39,14,234,218,4,195,223,224,39,10,240,215,
-6,224,39,3,229,96,4,235,160,2,236,110,0,224,10,0,228,72,1,224,
-101,14,233,15,4,224,141,18,164,76,224,39,11,224,141,4,232,35,4,235,
-143,4,232,24,9,226,37,3,96,17,222,122,0,48,225,202,4,9,70,114,
-111,109,84,104,101,110,84,111,226,250,2,0,66,176,207,1,39,66,64,7,
-227,217,5,224,125,23,224,119,0,160,72,224,115,18,163,22,224,101,83,160,
-213,224,99,13,225,151,24,231,136,4,225,151,18,164,221,224,179,16,192,173,
-64,18,224,169,14,96,167,224,159,4,224,77,2,196,194,228,28,0,233,85,
-5,229,56,0,0,89,225,17,0,231,140,1,0,83,172,195,224,145,2,234,
-48,12,96,23,232,192,3,136,11,1,50,57,207,114,128,241,231,73,3,224,
-17,1,225,23,2,97,22,224,14,0,128,1,224,111,1,212,152,160,81,194,
-152,204,249,233,142,7,132,193,2,49,52,54,67,135,64,159,0,50,82,84,
-77,4,231,7,0,160,118,160,221,97,93,133,175,225,9,1,102,32,193,38,
-178,79,128,40,206,131,224,70,2,224,127,2,102,220,96,123,236,11,14,172,
-10,97,214,128,101,128,93,82,252,248,165,6,2,95,49,53,171,151,224,45,
-11,71,64,96,0,198,75,128,54,228,112,2,201,103,193,235,231,228,15,235,
-29,4,128,44,233,191,1,101,227,0,53,126,196,225,76,11,97,170,226,2,
-5,70,49,0,53,64,11,101,200,225,117,1,192,46,224,163,6,225,232,12,
-194,181,231,241,1,244,170,6,224,169,40,226,240,0,226,44,10,253,14,4,
-173,202,96,67,245,26,4,96,212,110,89,224,208,2,96,157,64,207,229,59,
-1,224,227,2,235,39,1,226,166,7,96,249,86,172,144,133,0,49,225,195,
-0,224,140,4,237,228,10,225,210,5,161,34,224,29,0,225,207,9,225,38,
-8,225,255,0,225,47,2,161,198,1,51,56,97,182,168,200,96,237,226,146,
-0,245,168,4,1,56,53,240,12,1,227,206,1,160,128,228,227,1,245,157,
-7,132,98,226,214,0,226,151,8,237,41,7,210,30,226,98,6,232,30,0,
-224,92,2,228,193,6,228,173,11,224,43,5,164,64,235,162,5,138,84,228,
-4,1,226,46,7,160,18,226,47,4,131,167,224,234,1,224,170,8,193,136,
-225,45,2,160,2,224,51,0,64,1,230,69,4,192,51,229,61,0,64,2,
-224,46,17,194,146,236,85,0,197,96,226,24,3,232,59,8,226,83,6,128,
-11,109,6,192,24,249,93,13,233,145,0,224,154,1,224,160,2,226,155,3,
-160,2,173,68,233,138,2,96,2,183,159,224,69,4,96,18,224,39,4,224,
-245,7,145,56,224,79,2,224,2,7,192,157,224,196,1,160,57,225,47,9,
-224,67,6,224,153,0,224,67,27,234,151,2,224,35,3,96,199,243,190,3,
-224,39,14,129,115,224,19,3,238,145,0,239,93,5,226,131,6,160,55,128,
-138,235,5,2,226,32,8,0,67,192,197,224,115,8,192,14,96,53,244,105,
-4,224,246,9,224,50,6,64,86,161,124,224,70,3,99,117,224,75,5,216,
-85,224,245,23,224,79,69,226,69,1,253,238,2,85,6,135,230,89,151,0,
-54,102,155,67,179,107,248,224,22,9,231,224,1,2,95,49,53,244,245,3,
-64,0,229,209,17,132,218,100,106,238,48,19,8,114,111,109,83,116,114,105,
-110,103,247,136,0,224,203,5,224,96,5,237,167,2,229,27,6,0,51,184,
-215,225,11,8,192,14,222,41,227,91,6,229,40,2,213,225,0,67,238,0,
-1,224,0,2,224,88,1,226,210,8,227,62,1,224,125,10,224,192,2,229,
-142,12,226,192,83,226,36,0,224,50,16,128,101,64,48,225,246,4,86,20,
-65,237,232,172,1,193,54,64,161,162,7,102,186,70,121,64,6,91,225,1,
-53,57,226,43,1,226,26,61,0,82,121,163,0,97,208,83,226,28,154,226,
-30,10,233,241,2,224,39,3,227,171,1,228,224,7,226,37,17,226,38,13,
-230,106,0,224,132,2,229,179,0,224,114,13,192,1,226,50,17,224,56,12,
-230,26,6,224,121,1,224,45,4,0,83,226,78,7,1,49,54,159,119,96,
-0,237,4,4,224,67,36,232,57,1,224,135,2,233,239,7,225,10,8,224,
-73,11,227,177,0,224,56,5,227,7,8,1,49,54,237,106,1,228,253,1,
-227,11,21,0,57,89,106,0,53,162,123,128,238,251,236,4,64,40,185,27,
-2,49,50,50,192,49,192,90,107,169,0,57,64,21,0,54,150,205,224,110,
-16,224,60,9,128,0,227,119,59,6,73,110,116,101,103,101,114,227,118,151,
-193,146,8,66,32,80,32,75,32,95,50,51,138,106,0,49,97,62,128,45,
-64,73,252,223,3,0,49,202,251,224,174,5,85,64,128,7,0,50,196,196,
-227,92,5,128,176,0,83,167,157,233,37,3,233,31,1,224,231,1,233,25,
-13,192,29,193,205,233,19,9,192,33,129,39,225,36,2,226,218,0,226,78,
-0,169,250,193,33,181,106,226,64,3,1,50,52,230,152,9,224,122,8,232,
-227,8,224,122,62,225,171,2,249,12,0,79,235,249,25,1,128,100,64,110,
-96,104,66,240,237,219,2,64,23,232,249,1,226,92,10,0,53,100,82,249,
-235,8,131,38,160,236,128,190,160,247,225,144,1,239,171,2,160,239,192,236,
-192,7,225,248,1,64,150,96,210,246,160,1,224,55,2,228,200,1,224,106,
-1,0,83,64,166,0,52,66,137,1,54,48,245,35,1,161,54,224,38,4,
-0,56,86,201,227,79,5,224,231,6,64,118,105,150,224,171,6,160,210,224,
-42,2,2,83,32,73,182,249,129,50,193,223,140,157,240,146,6,0,85,65,
-198,64,67,239,114,1,1,64,95,133,163,67,8,229,171,1,227,155,1,128,
-69,131,140,64,0,128,19,250,110,8,29,95,32,99,97,110,110,111,116,32,
-98,101,32,117,115,101,100,32,97,115,32,97,32,118,97,114,105,97,98,108,
-101,164,79,224,189,9,64,13,1,49,50,99,160,114,29,0,55,97,109,225,
-65,1,128,132,240,243,8,194,205,96,209,0,90,64,24,130,91,81,57,64,
-33,239,166,7,151,184,224,219,1,1,95,50,67,244,101,20,1,49,32,224,
-196,1,6,116,99,69,120,112,114,58,192,202,7,104,97,110,100,108,101,58,
-32,96,189,153,173,191,96,110,0,0,49,96,106,242,213,5,160,82,2,79,
-32,35,93,158,116,142,224,45,0,224,131,0,224,50,4,2,58,49,54,65,
-119,1,10,65,97,219,84,133,226,91,12,130,198,228,132,6,231,2,2,224,
-49,2,226,41,1,228,143,6,198,153,129,220,228,196,6,224,49,12,194,250,
-130,52,224,46,2,224,93,11,180,236,161,228,228,109,5,224,28,3,131,249,
-227,102,2,217,55,224,57,12,160,130,192,56,232,50,5,224,103,9,224,30,
-4,99,54,96,187,163,98,228,77,15,224,86,0,96,56,196,126,163,183,160,
-104,228,70,7,224,145,0,116,147,181,63,249,165,2,128,130,224,134,0,230,
-87,2,232,252,4,224,38,1,228,63,10,224,52,1,228,220,2,192,58,224,
-55,2,196,80,241,210,4,228,82,15,225,28,3,192,67,228,83,97,226,185,
-6,174,246,96,199,225,204,7,160,58,224,174,6,129,149,236,185,12,227,201,
-1,8,68,97,116,97,46,70,117,110,99,76,70,1,46,36,232,207,0,0,
-82,160,8,226,127,12,64,22,67,168,0,51,137,182,64,100,127,210,129,213,
-227,227,0,224,38,32,232,209,5,97,34,225,143,4,243,142,6,224,147,11,
-0,58,134,133,1,10,65,132,87,69,43,104,228,3,50,56,57,32,96,28,
-0,56,228,58,4,161,202,0,83,167,60,196,50,225,93,12,0,50,224,204,
-0,225,94,4,199,13,192,47,226,38,5,169,6,224,16,0,241,173,2,128,
-111,160,110,64,120,120,203,224,40,1,240,224,3,226,166,2,236,249,0,232,
-153,1,248,89,7,64,1,163,67,224,78,2,230,71,5,171,237,2,51,57,
-56,85,173,0,57,69,95,1,48,49,100,116,85,206,0,54,70,89,126,144,
-2,51,52,50,117,224,129,95,249,82,14,104,228,224,166,1,65,143,96,74,
-164,65,1,49,50,64,101,160,13,91,236,0,80,251,25,3,224,0,2,231,
-251,1,129,219,160,89,251,140,0,226,15,7,0,48,192,167,64,0,224,247,
-2,226,25,0,224,68,0,122,173,225,12,1,129,253,224,114,2,228,47,2,
-224,14,0,225,198,3,66,25,160,46,224,2,1,96,18,227,159,1,224,166,
-1,128,19,229,57,4,233,41,2,160,214,136,36,160,191,64,204,170,132,161,
-172,195,3,253,106,3,236,164,8,0,89,128,108,131,78,228,100,3,228,40,
-4,193,76,228,221,6,1,55,52,225,61,2,64,77,96,149,236,61,1,251,
-143,2,224,70,4,232,93,8,203,238,224,30,0,161,63,193,60,229,13,4,
-192,22,224,176,4,129,177,3,95,49,52,52,70,43,128,71,226,40,5,232,
-185,0,248,164,5,225,88,4,184,154,225,86,2,96,0,2,95,54,49,141,
-249,234,207,5,230,183,1,224,70,3,230,56,6,224,20,2,224,57,3,224,
-215,5,228,190,6,227,161,0,226,183,16,69,134,224,160,1,192,80,131,178,
-160,66,252,69,9,182,245,225,10,0,225,211,11,0,51,231,79,2,235,137,
-1,233,114,5,101,6,0,55,165,35,2,53,52,52,101,155,133,28,0,54,
-96,21,224,196,0,237,246,4,184,227,224,28,1,238,43,1,64,120,102,84,
-184,211,65,162,0,51,130,205,64,85,0,53,160,107,1,50,51,88,253,0,
-53,88,215,64,22,0,52,224,22,6,0,49,128,22,0,51,224,22,4,111,
-219,64,22,0,50,96,22,230,176,1,15,80,114,105,109,105,116,105,118,101,
-115,46,87,111,114,100,34,128,37,0,49,224,83,6,0,51,128,22,138,47,
-0,95,64,122,176,113,64,28,64,191,0,53,176,132,97,41,64,8,65,40,
-147,158,0,95,115,169,0,55,124,12,0,53,179,182,96,38,0,58,128,32,
-224,81,3,111,48,0,53,67,57,224,67,1,100,242,241,84,2,0,55,64,
-112,1,52,50,171,119,0,53,99,91,224,31,19,69,113,224,31,16,65,99,
-90,60,3,80,32,95,52,96,162,0,52,155,143,192,56,139,126,224,221,3,
-65,177,160,14,129,178,0,50,113,54,224,22,10,131,91,224,61,4,96,111,
-128,34,2,38,49,46,64,40,1,38,48,96,6,224,39,6,128,28,224,27,
-14,96,21,192,27,65,68,135,139,66,68,66,77,1,49,32,99,159,128,9,
-64,35,64,34,194,167,224,34,0,128,164,224,34,3,130,180,74,12,64,108,
-67,51,96,209,1,64,95,114,61,224,88,1,96,44,130,139,2,102,47,32,
-64,12,130,129,4,85,32,75,32,75,64,243,64,18,162,125,106,85,98,33,
-0,55,98,72,97,27,226,52,0,0,52,67,23,224,19,5,224,18,6,2,
-57,49,32,225,50,2,224,18,0,1,53,54,225,105,1,192,19,1,49,57,
-226,66,0,226,115,5,225,149,2,96,154,131,1,133,58,96,34,0,64,101,
-226,2,95,55,55,66,173,64,33,162,253,160,188,111,140,0,53,93,136,64,
-6,105,5,5,53,56,50,32,64,83,130,83,0,52,96,106,103,215,161,147,
-112,117,224,181,3,68,225,106,55,0,54,96,162,224,43,3,226,16,9,192,
-25,160,14,64,47,105,114,96,35,97,102,100,58,96,72,4,49,32,64,80,
-32,128,40,128,162,162,27,160,73,0,64,70,214,0,80,160,20,200,86,192,
-211,128,65,98,147,132,98,192,82,128,22,64,21,1,95,49,97,18,160,0,
-0,58,128,137,6,10,65,32,105,116,111,102,65,248,64,61,97,40,4,55,
-32,95,55,56,66,42,1,54,53,97,108,96,225,64,7,64,19,2,49,53,
-56,131,207,0,56,151,185,1,56,54,66,83,100,52,128,39,0,53,98,26,
-96,11,64,84,130,170,2,102,62,61,96,98,130,149,1,102,62,96,12,162,
-117,0,60,128,26,130,118,1,102,60,96,12,130,112,3,102,110,101,103,96,
-14,164,230,0,42,96,12,129,207,1,102,45,96,12,129,69,1,102,43,64,
-12,64,222,162,11,226,13,1,134,45,106,24,226,22,1,226,29,1,80,126,
-3,10,65,32,73,96,63,128,171,0,85,66,247,0,65,160,30,128,176,65,
-119,110,20,0,85,97,187,85,168,96,21,238,202,1,64,114,179,221,239,17,
-1,239,20,28,167,54,224,165,0,238,176,5,160,30,235,87,8,230,134,3,
-234,126,1,64,244,130,43,224,87,16,204,165,224,87,48,130,122,192,220,192,
-25,128,105,141,230,65,5,240,72,1,224,248,8,133,72,225,58,6,224,32,
-3,128,115,238,222,1,224,32,8,135,205,224,220,10,192,24,104,9,101,235,
-1,50,52,100,53,0,51,66,53,244,96,2,1,53,54,243,142,2,136,55,
-224,28,11,224,98,10,201,152,224,52,8,250,236,1,139,172,193,37,239,237,
-3,224,54,11,169,179,224,26,11,245,127,1,242,154,0,66,125,163,41,231,
-244,11,2,73,110,116,103,243,96,59,224,36,4,110,202,183,151,4,95,84,
-121,112,101,192,12,160,47,232,73,18,5,70,108,111,97,116,87,160,39,131,
-125,234,93,1,138,45,235,181,6,149,208,64,46,168,99,200,122,65,89,0,
-58,158,20,224,109,15,2,67,104,97,160,147,64,44,224,60,2,0,51,67,
-179,64,22,131,166,194,190,225,163,1,73,141,237,81,0,239,42,12,1,53,
-53,67,246,96,23,235,49,3,138,67,64,90,0,54,96,90,203,1,74,8,
-1,49,32,165,119,75,113,226,221,2,237,30,2,226,27,0,133,94,224,152,
-1,64,1,109,81,224,145,2,106,250,96,112,235,14,1,64,137,66,186,112,
-1,224,0,2,163,68,236,88,5,85,51,96,104,246,222,2,224,229,3,4,
-66,32,95,57,49,65,47,128,15,128,197,235,89,0,128,14,0,55,224,212,
-34,195,83,224,212,1,206,56,224,213,46,160,77,107,20,72,192,203,242,235,
-89,5,224,195,2,66,55,163,37,64,10,162,90,80,245,66,29,1,54,49,
-102,164,70,246,64,21,200,189,0,83,228,83,9,64,152,224,214,0,130,168,
-108,11,1,85,32,77,65,1,53,51,70,247,236,126,0,224,44,4,67,136,
-224,44,2,0,67,77,133,207,170,64,116,131,108,72,64,0,66,114,241,113,
-57,228,211,9,228,76,8,96,21,0,85,97,146,71,65,204,30,224,40,9,
-96,23,0,85,226,152,1,225,40,2,115,143,192,184,225,166,1,0,90,162,
-26,226,29,6,236,138,8,227,12,8,1,95,57,253,40,2,99,204,224,27,
-0,64,234,201,111,0,89,129,227,166,243,206,224,226,65,1,194,255,238,17,
-11,64,33,110,149,225,36,0,82,138,130,158,96,18,241,146,3,247,218,6,
-2,49,49,48,84,32,0,53,69,35,0,64,252,118,3,2,99,110,83,179,
-159,164,156,162,200,96,224,225,1,2,205,171,68,13,65,2,227,47,6,65,
-30,134,234,97,73,128,161,64,7,0,85,64,165,239,156,5,249,244,5,160,
-106,224,35,4,192,138,111,182,224,33,0,0,48,109,55,174,135,249,189,2,
-64,25,139,171,0,79,131,79,160,36,184,121,130,113,97,58,216,69,2,95,
-49,52,134,172,224,101,1,129,191,162,157,242,79,4,64,57,150,106,161,172,
-164,92,226,76,3,0,51,138,227,225,189,2,138,101,225,144,2,193,143,225,
-123,4,0,68,245,27,0,160,160,161,201,113,0,64,199,0,50,112,109,226,
-1,1,225,162,6,178,208,225,171,8,225,54,3,225,88,17,247,106,0,98,
-244,232,85,0,177,236,224,239,1,224,77,1,0,67,64,15,128,72,128,14,
-132,242,128,134,129,161,161,135,129,124,193,79,96,125,128,5,226,73,0,224,
-48,18,230,73,1,225,217,25,225,194,22,226,254,11,64,0,193,213,229,190,
-5,97,6,96,225,248,123,1,64,134,0,51,136,70,216,168,67,209,135,209,
-96,68,193,147,67,27,0,52,224,14,1,225,150,7,100,68,103,74,128,26,
-228,62,4,129,10,160,91,218,146,99,73,165,243,150,174,224,91,15,227,142,
-9,0,53,98,224,224,104,8,64,75,97,84,160,107,64,143,224,107,1,128,
-237,1,53,53,110,16,224,106,14,67,60,232,15,21,64,122,72,237,161,76,
-69,169,131,181,224,96,1,64,235,224,110,7,64,80,105,178,224,71,0,136,
-178,139,17,192,77,129,148,227,126,6,0,54,243,164,2,193,217,195,78,120,
-35,200,228,224,103,0,128,18,226,14,2,249,132,6,116,64,64,231,64,161,
-0,52,65,155,242,248,5,78,223,173,28,2,49,53,52,196,250,225,169,1,
-192,26,0,53,96,205,64,204,0,54,96,204,2,90,32,90,96,157,64,17,
-135,138,234,247,0,130,121,184,207,129,48,228,16,4,226,79,8,100,206,243,
-254,1,243,153,6,163,178,246,195,0,129,56,224,250,0,129,13,166,236,192,
-21,66,190,128,117,162,208,244,2,0,64,175,136,36,193,136,65,31,128,233,
-224,148,2,237,8,5,0,52,104,117,224,183,5,2,95,49,50,125,146,0,
-51,114,49,128,29,225,123,5,99,112,64,196,2,95,50,48,65,215,192,131,
-224,41,13,244,56,0,1,95,50,67,147,233,2,7,148,74,193,12,229,13,
-7,100,136,66,183,134,23,160,0,64,235,136,155,224,184,5,0,48,81,209,
-238,168,1,226,130,4,0,53,164,33,197,96,165,52,224,15,0,253,184,2,
-0,95,80,197,185,45,195,162,73,142,234,155,2,218,220,98,81,0,54,105,
-198,64,98,146,210,195,75,96,56,2,52,52,54,178,145,128,72,0,53,100,
-70,129,40,131,88,96,11,64,25,226,82,2,2,39,32,95,85,221,65,139,
-249,91,3,247,136,3,129,46,1,52,50,64,12,229,99,1,64,21,69,134,
-185,222,1,66,32,151,226,223,228,101,117,226,1,8,0,75,225,254,16,225,
-145,5,1,95,50,80,193,224,0,5,194,183,97,165,224,166,10,65,184,167,
-209,98,187,134,100,224,85,2,225,47,3,0,95,147,75,182,94,96,89,169,
-144,139,211,198,243,229,251,0,164,113,225,110,0,123,111,128,10,163,89,160,
-13,198,67,233,181,0,194,77,224,44,11,231,98,0,224,61,2,172,147,224,
-66,3,240,58,0,192,53,192,69,224,70,15,227,227,4,249,39,6,224,137,
-7,128,219,254,12,3,98,118,0,64,137,82,120,250,68,89,98,114,96,32,
-102,56,224,76,0,192,0,101,6,112,242,128,40,67,58,138,235,3,85,32,
-75,52,160,2,82,21,128,26,199,52,226,15,9,0,52,139,62,64,134,230,
-175,6,98,189,157,95,128,174,226,9,1,161,171,228,222,0,171,22,68,146,
-1,50,51,83,190,227,253,3,207,114,128,196,225,43,3,166,95,163,104,5,
-66,32,95,50,49,50,133,248,1,51,49,239,109,2,16,103,101,116,83,117,
-112,101,114,67,108,97,115,115,101,115,58,32,105,188,1,95,49,64,191,0,
-54,81,41,224,106,0,236,75,2,234,236,9,64,7,128,125,165,193,66,190,
-67,255,78,91,105,244,72,171,236,153,0,64,42,86,143,0,48,64,156,237,
-66,2,96,72,164,55,224,0,5,97,147,235,40,0,65,118,176,78,2,55,
-52,54,85,57,169,177,230,46,0,97,35,0,90,64,30,230,62,4,0,58,
-137,46,211,177,237,65,9,0,53,141,11,226,85,2,194,70,204,201,164,107,
-230,100,1,160,33,251,241,7,163,215,1,50,51,86,26,0,48,86,122,193,
-34,3,95,50,51,53,96,120,0,50,64,108,196,32,224,15,7,129,72,0,
-50,119,98,231,10,9,225,193,1,31,101,120,105,115,116,101,110,116,105,97,
-108,115,32,110,111,116,32,97,108,108,111,119,101,100,32,105,110,32,112,97,
-116,116,10,101,114,110,32,98,105,110,100,105,110,103,235,152,3,233,208,19,
-137,11,128,216,252,79,9,65,67,241,142,1,2,50,32,95,145,200,80,73,
-97,87,162,122,226,128,8,227,30,2,148,76,224,94,8,176,28,229,30,0,
-224,151,3,128,44,0,50,85,111,100,8,72,161,118,118,97,176,255,128,1,
-224,84,13,64,159,0,54,160,159,64,1,1,83,32,131,228,238,169,0,238,
-172,28,192,25,224,202,3,231,170,1,2,49,53,52,227,251,2,1,50,50,
-254,26,0,227,150,2,140,222,64,42,97,227,98,180,133,142,158,240,92,109,
-160,195,72,39,64,230,0,51,148,182,0,53,92,123,130,38,3,49,51,54,
-57,196,7,96,14,90,217,240,136,4,128,220,226,197,7,227,180,11,224,138,
-0,161,36,246,206,0,237,57,0,224,45,5,0,50,158,252,64,42,137,57,
-96,128,120,109,1,49,51,87,198,64,25,136,103,81,30,0,90,128,199,199,
-167,96,29,133,74,96,96,164,79,164,84,229,64,9,0,50,103,169,193,65,
-255,86,7,96,51,2,49,50,49,203,184,66,108,0,56,82,1,1,50,50,
-103,61,184,254,101,56,95,201,0,54,68,130,245,237,1,64,84,226,97,2,
-163,155,224,96,2,224,93,0,224,88,14,240,4,6,192,223,134,15,0,90,
-129,50,171,22,75,76,162,124,225,79,3,66,155,0,58,139,178,139,52,242,
-45,3,228,90,1,231,136,8,247,216,5,231,136,5,227,126,0,164,78,1,
-49,48,66,64,192,240,196,185,243,112,5,233,11,1,107,169,162,71,167,152,
-230,137,0,229,40,5,133,98,230,179,0,244,154,15,224,149,1,224,62,3,
-234,207,2,96,140,255,41,1,108,40,216,108,224,61,0,224,175,6,228,35,
-14,69,190,68,31,97,16,0,90,96,181,64,18,236,76,0,128,0,243,223,
-6,65,127,132,206,103,145,234,233,1,234,227,1,160,106,67,162,240,69,2,
-160,2,224,228,2,225,186,0,183,231,200,89,230,107,1,160,48,224,42,8,
-66,87,228,142,1,224,33,12,130,115,96,23,196,53,160,25,65,222,93,163,
-231,30,0,129,178,233,52,7,192,64,82,189,231,98,0,237,168,0,224,81,
-4,163,94,0,85,164,81,224,9,1,64,0,168,163,224,170,0,224,253,15,
-250,94,1,194,191,128,188,225,79,0,224,112,2,206,107,130,202,69,22,170,
-4,225,123,1,234,136,4,160,91,192,48,228,66,1,128,216,128,50,97,204,
-0,80,96,185,177,142,0,52,88,219,128,200,249,70,0,160,72,229,138,0,
-160,189,69,109,225,84,5,162,85,128,48,225,208,23,130,91,226,34,1,224,
-32,8,128,84,242,140,1,224,32,8,195,61,227,252,8,248,90,9,208,25,
-228,37,12,225,240,6,163,214,165,81,225,250,8,97,88,224,50,5,224,87,
-8,96,219,125,26,226,113,2,226,23,3,128,67,226,17,9,128,42,226,60,
-0,224,39,15,165,78,225,249,12,224,27,2,64,199,236,100,4,170,220,160,
-30,226,10,0,226,83,9,160,225,226,150,1,160,55,231,54,0,3,85,32,
-64,82,224,220,4,235,63,16,7,112,97,116,86,97,114,115,32,203,54,164,
-184,112,77,64,209,69,22,105,238,165,135,1,95,56,118,82,171,177,96,112,
-68,128,250,199,1,240,86,12,138,61,225,138,1,217,102,234,117,6,64,165,
-0,50,243,48,3,0,52,103,27,230,234,26,79,20,128,151,230,209,4,64,
-154,0,54,169,234,71,228,69,58,0,52,103,227,64,210,229,50,5,66,229,
-229,24,1,64,63,229,64,5,129,246,168,233,129,137,160,43,96,2,233,123,
-5,192,66,224,17,1,229,91,15,244,236,0,224,121,3,224,54,16,165,103,
-224,54,6,228,200,0,224,54,16,227,60,0,129,58,228,205,1,160,57,224,
-51,11,169,255,128,47,226,198,7,224,28,2,228,192,2,0,90,64,34,3,
-95,49,53,50,230,159,0,227,97,4,224,75,14,160,156,192,75,234,84,6,
-65,88,161,137,71,105,0,49,65,192,192,176,86,4,4,50,32,95,52,48,
-243,56,2,78,149,96,229,65,147,0,80,246,168,1,85,98,2,55,32,79,
-103,137,0,54,165,69,64,170,64,58,205,189,225,23,0,219,239,64,113,64,
-54,234,158,5,237,206,0,1,53,50,212,172,128,59,111,164,230,140,17,64,
-34,236,22,8,182,79,128,117,226,189,4,225,43,1,160,89,140,11,94,147,
-243,23,1,225,130,2,192,131,232,231,4,245,134,4,160,105,171,81,249,174,
-2,232,136,8,244,194,2,226,86,2,137,81,227,197,9,132,154,160,196,238,
-71,4,148,215,0,48,249,48,5,128,50,237,182,5,105,210,65,219,76,49,
-225,26,50,130,30,224,0,2,227,92,9,192,83,227,144,5,199,238,195,82,
-234,190,2,128,141,160,181,225,217,2,250,95,4,236,166,0,225,88,0,225,
-136,5,252,219,3,224,132,2,193,84,224,16,0,135,161,161,203,129,155,224,
-76,7,224,46,3,193,146,128,44,224,2,3,234,239,6,245,75,1,193,128,
-225,194,3,247,196,2,240,7,7,100,218,192,49,242,195,5,136,132,226,39,
-5,167,204,97,200,0,50,226,123,3,224,182,4,225,207,33,242,222,6,224,
-41,1,233,77,7,199,19,161,231,224,139,1,252,24,8,227,18,2,224,37,
-1,236,217,1,227,77,3,224,239,1,64,100,224,239,15,129,81,134,166,1,
-49,50,86,145,65,72,0,52,68,250,64,118,0,57,239,0,3,224,199,0,
-238,208,7,132,228,227,134,6,1,55,49,80,159,224,61,1,117,231,224,131,
-4,224,78,1,225,24,9,247,164,2,192,212,227,121,7,71,24,195,234,131,
-122,240,139,1,227,234,4,97,70,227,219,5,105,2,66,90,0,50,224,143,
-1,131,240,225,180,3,231,31,1,160,69,230,232,27,224,220,0,227,190,0,
-245,19,2,227,201,21,198,111,228,103,0,128,167,224,60,3,234,164,6,192,
-152,225,61,5,224,27,2,227,221,4,224,10,0,225,111,8,228,15,2,225,
-110,1,233,14,3,206,23,225,86,23,160,238,229,60,7,98,93,145,78,1,
-51,56,131,206,226,52,9,64,14,252,118,6,97,142,0,67,64,22,0,56,
-197,81,249,116,7,227,124,5,129,58,78,202,185,191,128,6,64,128,0,56,
-81,182,1,95,56,89,139,224,0,5,230,27,15,237,48,12,242,235,1,193,
-40,227,164,5,2,66,32,95,74,56,178,152,190,96,250,68,5,148,232,225,
-148,4,161,235,229,186,2,97,247,192,22,160,25,160,26,230,169,7,225,119,
-2,128,188,230,186,8,129,55,1,51,56,64,47,131,234,0,49,115,49,0,
-56,225,247,0,225,85,3,142,153,0,83,109,193,74,216,65,65,108,116,128,
-41,192,15,152,227,161,90,0,52,128,18,151,155,64,0,129,178,160,0,226,
-113,10,192,152,1,85,32,255,201,0,227,50,13,227,6,2,225,0,1,231,
-2,7,192,64,230,124,4,237,221,13,128,108,224,145,10,192,24,223,130,240,
-224,7,0,48,228,187,7,225,191,2,128,10,249,207,0,192,120,0,80,229,
-137,5,139,231,97,254,87,56,153,19,148,77,3,95,55,50,48,236,220,2,
-5,110,101,103,97,116,101,246,53,1,234,155,24,160,135,128,233,193,47,161,
-41,0,32,172,250,161,95,195,189,226,221,1,242,175,6,224,108,15,225,90,
-0,231,158,11,161,121,232,57,18,192,164,227,178,4,231,181,11,103,127,84,
-54,224,56,0,226,157,3,83,39,128,146,225,5,5,205,91,224,155,9,84,
-16,224,65,28,96,106,238,109,13,5,116,99,80,97,116,58,119,229,7,104,
-97,110,100,108,101,100,32,97,157,107,217,64,101,96,98,67,249,0,49,122,
-122,248,254,5,160,78,3,79,32,35,51,209,6,224,45,0,230,112,0,128,
-191,163,204,202,15,97,32,85,249,125,27,0,53,131,219,3,51,53,55,32,
-248,135,2,1,61,61,162,40,224,35,18,2,84,114,117,226,78,1,224,156,
-5,78,83,150,81,72,96,193,119,238,112,2,0,51,245,35,0,96,2,104,
-223,194,229,137,42,228,169,4,233,239,6,192,41,130,148,66,254,68,121,126,
-87,93,202,225,151,1,144,3,64,112,150,167,65,164,2,51,54,51,226,134,
-1,225,193,1,64,36,149,236,162,240,194,203,99,231,224,157,9,224,16,4,
-64,76,64,64,214,24,225,51,25,0,58,141,46,224,45,21,3,70,97,108,
-115,224,46,1,212,215,156,107,241,120,1,231,255,7,253,115,2,232,95,1,
-232,36,34,224,46,2,224,43,10,239,9,36,67,244,224,47,19,243,140,3,
-224,37,3,225,130,1,224,130,11,165,154,224,81,12,224,27,2,202,139,79,
-55,65,92,254,27,2,193,5,128,118,128,11,129,71,96,40,247,99,12,226,
-129,2,132,133,224,231,13,100,236,167,222,155,241,227,184,13,225,229,1,2,
-66,97,100,251,219,0,253,176,2,227,199,1,65,252,146,83,205,142,231,202,
-3,193,40,227,46,3,64,242,241,146,6,130,197,161,52,161,82,177,185,193,
-13,233,244,8,107,230,96,0,192,34,225,169,0,192,14,128,139,131,194,1,
-75,51,231,120,2,224,49,1,225,221,5,192,126,197,175,96,133,232,124,6,
-225,122,2,192,2,164,59,224,69,3,97,149,164,211,88,194,244,224,2,204,
-120,164,33,96,16,1,53,50,235,152,0,64,12,64,29,232,111,0,160,0,
-64,87,129,42,232,248,1,64,19,243,151,6,65,31,0,66,244,113,1,225,
-46,1,161,223,118,89,70,33,199,246,224,36,9,2,85,32,75,90,130,228,
-168,6,192,0,65,251,1,51,32,102,83,165,56,130,11,254,251,2,225,77,
-5,231,65,9,252,230,8,225,185,8,128,58,224,151,5,2,95,52,57,66,
-121,0,53,68,225,226,160,1,94,112,232,55,1,224,81,17,207,172,224,95,
-1,65,74,237,195,6,114,98,224,39,5,227,254,11,239,102,3,225,242,2,
-230,7,5,246,48,1,229,174,2,3,95,49,50,56,161,136,235,217,6,101,
-175,199,167,224,111,0,139,115,225,70,13,0,51,122,197,224,171,1,239,168,
-8,224,123,0,128,133,166,202,130,131,251,129,6,64,97,135,119,133,239,224,
-0,2,225,8,8,192,239,160,147,225,15,2,226,138,4,98,134,0,89,105,
-120,66,64,64,31,250,78,13,64,49,237,193,0,194,146,225,252,2,101,53,
-226,117,26,96,160,180,217,99,84,0,52,106,192,64,28,235,48,1,192,0,
-193,17,228,149,3,225,191,5,233,184,4,241,122,5,129,69,0,89,192,13,
-160,212,132,179,225,135,6,104,60,225,51,4,96,16,228,102,10,224,5,10,
-226,158,8,252,95,6,225,154,1,226,165,3,228,157,5,224,100,0,238,122,
-5,239,251,6,224,73,11,224,254,16,226,245,1,69,182,160,6,224,49,6,
-225,200,0,224,91,1,140,210,224,249,5,130,145,170,82,160,151,210,254,130,
-143,224,0,3,192,69,129,84,192,171,224,181,2,193,202,224,160,7,227,159,
-11,246,188,2,193,189,224,192,7,235,170,14,243,42,2,227,115,5,227,112,
-0,137,245,225,171,2,128,131,224,45,7,224,205,3,224,0,6,231,59,1,
-251,255,0,92,85,77,63,99,245,161,70,133,195,144,102,160,26,229,184,8,
-100,117,1,55,56,192,142,235,227,2,16,111,111,32,109,97,110,121,32,97,
-114,103,117,109,101,110,116,115,165,72,224,49,20,2,102,101,119,224,48,8,
-232,68,5,111,102,72,23,0,54,139,101,1,52,57,159,116,0,50,80,165,
-76,109,64,27,153,213,100,27,227,243,10,134,33,225,47,4,157,34,0,51,
-168,119,64,66,139,196,105,20,69,184,76,109,0,55,140,109,64,29,139,197,
-0,75,161,70,232,153,1,162,154,224,11,8,194,59,138,92,224,13,1,165,
-66,234,211,4,192,37,224,39,6,224,75,0,224,25,3,230,34,4,224,34,
-8,170,76,224,69,2,160,88,226,2,0,224,23,0,224,105,3,226,50,1,
-224,31,3,250,220,0,227,115,0,232,50,3,224,24,6,64,1,226,122,0,
-224,154,1,192,92,228,69,2,160,23,162,177,192,8,72,213,65,165,96,69,
-2,95,56,53,234,98,0,224,232,3,134,104,227,88,6,129,120,192,85,64,
-71,108,97,0,83,96,82,0,54,64,10,217,193,231,13,0,192,95,4,66,
-32,95,51,55,124,227,0,49,66,159,1,52,52,124,180,210,225,128,110,137,
-80,0,49,66,144,238,243,2,128,65,96,61,192,85,223,158,239,238,6,229,
-58,3,96,73,221,220,3,95,49,48,54,64,133,129,35,98,119,0,54,150,
-107,239,85,2,229,127,3,73,232,0,52,107,44,128,30,224,25,16,129,22,
-64,107,96,72,2,95,50,51,64,28,1,50,53,160,55,224,57,1,224,146,
-41,64,57,224,109,4,224,12,3,224,38,1,225,180,2,97,177,160,112,136,
-48,96,105,1,55,57,167,77,147,69,67,170,161,175,103,93,213,82,161,131,
-98,20,1,49,57,110,205,64,9,2,56,49,32,160,33,170,213,106,100,128,
-11,160,211,0,57,115,82,0,51,147,83,232,149,1,147,198,6,95,50,48,
-53,32,95,54,174,142,64,195,162,111,2,85,32,75,100,43,115,176,203,224,
-74,37,133,38,228,28,2,92,28,160,112,224,21,3,0,56,192,21,64,52,
-64,201,68,60,143,145,224,39,3,73,182,196,90,175,138,235,105,27,234,5,
-0,129,157,233,253,2,230,186,6,251,226,4,224,78,9,224,43,4,64,8,
-74,207,227,163,4,224,96,4,224,46,8,195,120,192,13,96,11,192,8,230,
-129,9,233,110,24,65,6,144,80,131,184,0,48,85,95,234,190,1,0,85,
-131,5,64,144,69,147,174,223,161,229,96,61,64,8,129,68,199,133,135,136,
-224,252,5,227,30,1,64,201,194,229,96,232,71,10,148,74,117,220,158,90,
-194,133,129,206,90,110,64,106,208,156,247,147,0,64,6,64,5,86,165,2,
-50,51,56,236,79,3,12,80,114,105,109,105,116,105,118,101,115,46,61,62,
-134,222,64,66,142,226,128,214,244,223,28,224,148,10,64,71,0,54,241,39,
-0,225,131,10,64,32,135,23,128,32,0,80,195,51,224,36,7,134,249,160,
-34,143,220,0,80,128,234,134,245,2,83,32,83,162,154,166,80,64,42,240,
-166,5,135,70,224,33,18,99,11,165,185,224,33,14,206,212,96,25,98,229,
-224,30,4,176,133,99,7,236,156,6,230,16,0,226,230,1,96,76,0,85,
-97,165,136,46,100,159,0,53,132,179,248,80,5,72,67,160,70,224,114,6,
-64,24,226,123,1,224,71,0,97,142,121,30,224,60,0,224,37,14,239,176,
-0,192,98,128,212,162,156,225,63,2,160,220,236,210,7,64,70,224,90,15,
-195,2,160,90,225,2,8,128,83,0,85,228,51,0,224,63,3,69,35,70,
-191,3,49,53,49,49,249,236,0,64,35,250,64,5,0,51,101,253,225,98,
-1,225,148,8,66,128,225,148,15,224,183,1,79,254,1,48,57,64,98,225,
-142,6,1,50,57,134,93,160,196,2,95,50,51,128,65,237,95,1,226,81,
-18,132,153,128,20,225,80,8,100,54,192,178,224,25,4,100,49,228,25,8,
-96,21,173,242,240,202,11,99,56,226,78,7,70,63,251,21,3,226,87,16,
-142,151,224,16,0,130,224,225,72,4,142,187,224,94,5,122,22,224,84,17,
-167,99,224,165,3,193,18,177,149,227,37,7,224,52,0,226,127,9,225,46,
-16,96,59,227,94,9,129,14,225,224,24,1,51,56,65,24,225,224,1,224,
-203,2,226,214,11,68,144,225,56,5,224,99,25,141,214,224,98,1,227,108,
-4,228,44,12,96,65,248,167,13,9,100,115,69,70,105,101,108,100,115,32,
-244,157,11,69,17,135,202,165,43,131,98,165,43,135,198,96,23,100,125,0,
-85,128,22,215,39,96,197,0,48,225,201,1,0,50,96,90,0,50,213,75,
-193,98,239,173,2,238,46,3,91,64,162,211,239,122,4,161,29,224,42,2,
-64,83,66,205,224,245,6,3,58,49,53,48,247,132,0,64,33,192,27,73,
-139,67,230,3,95,49,51,52,64,230,64,40,247,126,1,212,92,128,101,113,
-203,96,129,151,190,225,61,6,3,101,110,117,109,173,194,64,69,134,228,96,
-53,2,95,49,48,68,42,64,21,0,54,225,64,4,99,87,129,64,65,100,
-168,0,199,189,229,40,10,97,137,224,26,12,134,97,226,196,13,226,197,14,
-194,198,140,62,97,100,130,76,225,58,0,235,109,1,174,49,128,33,229,172,
-18,224,36,4,229,148,9,96,191,0,85,99,156,224,37,0,228,198,17,156,
-80,224,210,11,228,224,0,224,94,4,169,45,224,91,1,228,83,7,0,53,
-108,248,228,83,6,224,135,1,238,215,3,228,34,11,228,116,11,192,24,228,
-116,0,1,53,48,67,171,236,196,1,227,134,0,224,24,7,225,104,5,104,
-248,66,7,200,142,0,89,222,73,192,143,185,237,239,27,5,131,89,224,170,
-10,230,171,0,232,177,19,224,207,11,192,25,96,181,224,73,1,224,245,16,
-96,154,242,15,4,225,83,0,205,97,0,48,64,219,107,255,243,36,3,166,
-104,161,219,254,70,5,224,82,9,254,13,3,160,119,0,90,164,41,245,249,
-5,96,26,64,173,226,232,1,135,102,142,217,224,119,2,149,195,160,71,96,
-4,124,53,64,38,0,90,64,127,77,117,98,49,1,75,50,239,24,3,129,
-231,130,74,0,64,89,10,224,27,3,64,0,227,64,13,225,237,9,97,238,
-202,99,65,93,97,161,97,104,161,240,230,111,3,224,235,9,115,84,246,102,
-4,96,220,226,197,1,226,39,1,160,9,130,2,226,53,2,253,109,7,101,
-80,129,179,117,239,199,82,164,245,65,246,128,71,78,215,90,8,224,56,1,
-169,31,182,191,232,98,8,194,49,236,124,1,165,239,162,223,141,114,1,55,
-56,245,149,3,230,186,8,243,75,16,91,89,13,115,101,99,116,105,111,110,
-32,102,105,120,105,116,121,243,125,2,0,51,83,202,224,43,1,1,36,120,
-128,27,147,103,0,55,195,144,65,140,198,222,151,101,195,105,225,143,14,128,
-30,225,147,6,195,106,70,34,113,136,209,125,162,210,135,175,248,31,8,99,
-39,96,167,224,149,3,224,179,9,225,225,57,128,200,225,224,6,162,91,99,
-158,214,15,227,155,0,248,145,0,225,211,14,160,84,239,29,2,100,55,224,
-21,6,224,60,30,64,58,249,236,8,85,147,226,25,4,128,174,227,246,4,
-225,112,9,224,0,1,226,54,87,200,251,96,150,225,111,0,232,228,1,161,
-124,224,215,3,225,152,6,130,28,236,126,3,227,42,0,246,178,0,148,120,
-224,99,5,197,25,225,72,0,161,74,224,13,0,251,169,7,227,82,7,128,
-21,132,236,160,14,100,3,148,135,228,86,0,131,255,1,52,56,137,90,0,
-52,187,44,160,0,226,132,1,193,179,64,34,64,42,96,141,191,27,227,206,
-7,65,56,176,244,96,51,226,202,10,102,225,224,13,5,160,173,128,2,160,
-14,227,7,13,0,89,225,20,3,103,78,225,9,3,129,77,163,46,96,14,
-0,64,71,40,128,58,131,95,129,17,245,90,0,128,36,96,117,166,93,73,
-51,1,51,55,70,6,147,42,96,5,255,22,0,224,184,2,224,2,3,192,
-29,192,130,199,152,224,2,0,214,93,225,153,0,238,119,3,99,220,129,142,
-0,85,74,185,129,32,161,5,169,147,128,58,65,248,224,7,7,101,156,227,
-33,6,224,9,0,224,165,2,250,105,2,160,252,96,86,224,210,6,96,17,
-194,46,64,92,130,140,225,9,0,224,67,0,224,215,1,224,13,5,224,99,
-0,183,166,224,113,2,97,24,1,85,32,71,93,224,72,2,162,15,96,35,
-232,79,7,225,235,3,193,91,247,253,0,224,26,3,224,143,4,219,108,225,
-173,15,129,10,224,66,9,226,132,0,224,127,14,224,106,0,96,170,224,35,
-21,128,1,169,107,192,0,233,229,1,96,2,128,178,226,154,0,160,14,224,
-50,4,224,88,15,0,67,98,56,224,0,3,224,234,14,224,2,3,224,246,
-0,64,0,228,129,9,253,99,16,193,217,128,122,225,231,0,130,35,128,181,
-77,105,64,20,227,129,0,147,233,0,53,102,15,123,100,224,227,0,1,95,
-50,157,85,224,42,1,1,53,50,69,81,0,52,145,34,64,44,190,157,64,
-65,192,22,64,8,227,132,0,224,125,1,162,84,253,120,1,226,232,5,224,
-173,2,225,74,2,161,98,192,44,224,62,4,128,166,225,32,6,224,181,12,
-252,105,1,96,223,225,13,0,135,245,225,13,22,224,225,13,0,56,204,70,
-163,126,227,13,7,160,190,227,166,13,96,16,153,251,170,230,252,114,3,0,
-95,79,149,1,95,50,87,170,230,253,1,28,97,109,98,105,103,117,111,117,
-115,32,111,112,101,114,97,116,111,114,32,101,120,112,114,101,115,115,105,111,
-110,167,52,226,89,10,161,80,96,124,64,225,129,54,96,21,225,212,2,0,
-55,225,30,4,224,210,10,224,173,39,9,98,97,100,32,112,114,101,102,105,
-120,224,165,11,228,245,2,3,95,49,55,51,239,194,2,16,92,51,52,38,
-115,114,99,47,77,105,99,114,111,72,115,47,70,104,19,2,46,104,115,64,
-24,4,44,54,52,58,55,192,68,219,8,250,26,4,97,212,171,38,170,229,
-1,95,54,86,69,204,149,163,63,129,29,247,199,0,0,52,89,217,1,49,
-52,255,160,3,0,80,89,125,79,77,96,171,165,232,1,64,89,100,81,65,
-36,229,38,3,233,81,1,166,14,69,224,64,79,0,53,234,122,1,138,52,
-128,113,96,122,192,115,64,50,103,218,84,139,254,121,6,0,49,94,107,192,
-145,208,37,64,229,169,164,171,240,100,94,64,139,198,145,64,34,88,235,181,
-29,64,1,193,201,96,183,210,180,128,6,193,60,224,61,3,193,26,224,33,
-1,225,4,1,161,26,186,216,160,21,0,58,136,112,1,10,65,109,194,99,
-29,251,48,7,224,39,0,248,192,0,104,222,76,116,89,62,226,4,1,5,
-110,101,103,97,116,101,97,232,64,46,145,199,1,65,32,64,11,0,54,96,
-11,0,90,65,78,64,14,145,178,0,75,96,26,248,69,1,234,255,2,67,
-108,152,102,65,111,128,44,0,65,128,59,140,106,2,95,52,56,99,19,139,
-23,143,159,64,193,156,79,110,37,206,44,128,24,143,36,188,123,224,24,9,
-160,49,142,116,2,95,49,53,228,52,1,64,115,202,167,0,89,165,172,98,
-74,227,180,2,225,175,1,240,80,11,227,196,0,248,157,20,79,193,162,53,
-226,164,13,128,41,244,129,14,10,103,101,116,65,112,112,67,111,110,58,32,
-244,130,11,160,99,167,43,0,85,128,191,96,218,244,103,1,3,95,54,48,
-48,226,5,17,118,233,97,52,2,95,54,54,70,37,0,58,138,213,65,154,
-0,50,65,200,64,52,192,73,235,202,10,237,174,0,147,49,1,52,56,125,
-64,1,52,56,66,93,64,61,130,45,64,237,0,80,224,214,2,3,118,97,
-108,117,98,81,224,18,1,2,116,121,112,130,99,224,18,1,3,107,105,110,
-100,224,18,6,3,115,111,114,116,64,18,64,90,0,54,236,101,22,245,74,
-3,102,93,129,105,224,12,1,3,95,49,52,55,64,255,65,146,171,148,236,
-204,5,164,166,131,129,238,212,7,66,199,140,4,65,76,237,4,5,128,160,
-180,193,228,24,0,68,236,170,214,233,251,4,162,52,131,218,231,59,0,226,
-84,19,164,19,127,157,64,129,234,21,0,194,96,226,94,0,206,31,214,250,
-206,224,224,43,11,140,196,224,96,1,140,238,64,95,241,179,0,66,165,225,
-141,2,9,101,116,83,76,111,99,69,120,112,114,196,30,65,12,81,191,96,
-244,210,80,129,96,0,48,122,62,192,78,128,194,1,52,56,66,255,224,98,
-0,192,20,65,101,192,20,64,84,132,43,64,29,235,198,7,196,81,96,38,
-208,174,179,8,64,35,164,109,64,102,96,26,129,7,0,55,102,26,64,23,
-227,39,1,241,134,0,96,83,200,143,237,85,1,64,8,1,95,53,93,213,
-157,132,193,203,228,40,1,224,12,1,224,25,0,1,95,52,80,86,0,54,
-115,240,169,200,177,229,224,25,4,163,123,160,6,67,179,64,8,66,159,155,
-113,96,48,103,241,161,34,228,36,4,9,117,110,100,101,102,105,110,101,100,
-32,135,141,129,110,71,117,224,42,8,196,70,0,54,225,210,0,98,134,140,
-114,96,228,72,79,237,196,3,128,33,224,126,0,227,14,0,224,86,4,233,
-13,1,208,47,211,55,103,251,224,49,10,160,136,168,38,128,39,160,149,160,
-14,4,79,32,35,51,50,167,177,98,21,80,176,128,33,71,247,0,80,104,
-12,232,67,1,194,18,232,72,0,95,124,232,65,2,192,0,160,220,0,58,
-131,251,97,251,228,153,3,1,91,93,96,151,224,229,2,2,79,32,35,70,
-40,169,33,225,194,1,224,219,0,166,61,0,80,73,117,201,122,64,52,0,
-51,244,14,2,224,79,2,224,37,5,67,143,238,114,0,131,41,224,91,1,
-128,0,64,170,133,132,0,83,66,85,1,95,53,106,250,89,213,81,227,100,
-2,3,54,55,49,32,106,44,0,83,65,191,192,163,113,230,192,43,1,35,
-52,168,126,135,222,1,95,55,118,87,128,93,197,164,3,95,49,50,52,128,
-86,68,236,0,52,65,240,225,25,1,3,66,111,111,108,195,229,65,66,1,
-10,65,225,54,2,4,68,97,116,97,46,64,33,6,95,84,121,112,101,46,
-34,103,211,64,63,132,11,204,13,241,168,5,0,51,122,153,129,26,113,165,
-239,24,4,236,88,1,242,25,7,131,25,130,192,231,172,18,1,95,50,165,
-23,193,126,230,38,5,1,52,55,214,164,128,102,235,145,1,224,111,3,161,
-182,97,142,236,81,2,231,200,1,161,179,224,17,6,251,174,5,96,20,141,
-9,87,57,252,183,0,151,226,192,166,229,143,0,163,190,95,145,102,86,202,
-128,227,68,8,21,110,111,116,32,112,111,108,121,109,111,114,112,104,105,99,
-32,101,110,111,117,103,104,163,90,3,66,32,95,53,71,201,3,95,50,48,
-53,195,56,96,0,230,202,5,140,112,0,54,98,45,1,50,51,67,98,164,
-221,224,42,9,97,211,133,223,167,101,66,200,64,93,1,49,52,66,128,127,
-2,2,49,52,55,97,94,167,127,64,50,133,189,90,229,0,90,160,47,0,
-55,253,66,0,96,45,96,29,138,7,64,71,230,63,0,225,202,1,1,49,
-50,70,88,129,1,136,198,0,54,93,97,129,89,66,59,206,174,97,195,225,
-192,2,96,49,122,235,225,74,4,226,57,4,142,165,226,100,3,196,151,225,
-209,1,164,107,66,55,156,89,99,93,1,52,54,105,63,130,36,245,126,12,
-140,124,103,73,227,230,0,64,230,243,233,1,226,111,11,1,52,54,167,121,
-0,55,246,148,1,0,85,225,20,1,0,32,162,51,224,119,8,132,252,67,
-119,64,67,136,140,244,101,7,96,179,2,10,65,32,229,68,11,160,143,130,
-231,98,135,0,57,88,3,64,76,132,45,128,64,132,141,128,219,64,129,1,
-48,55,97,248,174,0,104,149,0,75,97,205,64,53,128,41,64,36,0,51,
-193,15,138,141,128,37,103,231,128,44,0,54,165,143,233,204,9,0,51,86,
-82,160,239,227,88,1,65,139,67,79,169,117,96,175,225,249,3,227,239,6,
-0,54,163,68,224,24,7,224,98,4,230,186,0,227,197,9,161,154,118,189,
-119,15,160,48,225,133,8,149,40,161,43,133,3,224,111,15,71,119,129,204,
-224,217,8,129,224,224,56,10,110,163,162,190,226,58,3,64,14,247,49,3,
-233,200,0,224,39,5,64,184,224,207,0,224,185,6,166,129,64,192,64,130,
-227,42,2,224,64,2,110,249,98,164,109,98,239,247,3,160,6,0,85,229,
-78,1,225,65,3,193,60,239,43,0,226,200,2,225,108,6,2,95,50,50,
-224,200,0,94,192,2,51,50,52,249,157,2,98,79,254,197,0,225,140,1,
-225,228,0,251,41,9,224,19,5,194,51,65,160,132,208,111,204,68,106,100,
-72,64,161,225,32,15,234,115,2,160,33,154,17,228,81,5,164,87,225,64,
-1,224,28,10,228,170,5,193,223,0,52,190,113,160,0,172,48,192,49,234,
-149,0,64,2,224,39,1,128,136,128,1,226,192,1,64,205,232,157,0,169,
-72,195,236,64,147,231,111,1,160,64,135,68,160,59,66,106,205,7,246,92,
-8,224,117,6,224,150,0,229,70,4,165,68,152,87,64,135,64,32,0,50,
-75,139,152,143,224,152,22,135,88,64,143,141,107,224,132,4,65,235,96,101,
-237,122,4,111,0,177,12,96,0,225,62,6,244,208,8,163,171,129,55,200,
-68,160,9,128,147,162,232,130,102,239,119,2,192,1,154,95,129,226,231,255,
-1,192,2,243,240,3,224,32,0,200,218,236,113,0,192,99,228,86,3,224,
-26,0,252,133,2,224,31,4,224,131,2,176,0,224,84,1,224,133,1,224,
-219,0,198,177,232,108,2,192,92,163,243,250,223,0,97,67,97,150,4,95,
-49,52,48,55,227,121,1,67,47,135,205,0,79,74,239,3,54,32,95,54,
-74,60,77,219,195,224,64,65,64,28,202,124,136,78,2,95,55,50,66,24,
-1,51,50,177,136,0,52,74,254,224,39,17,0,52,106,25,64,39,0,53,
-64,48,224,39,17,150,23,64,8,64,21,224,39,18,141,102,2,49,52,54,
-64,48,96,188,68,63,178,55,0,52,74,245,231,159,0,64,228,136,148,0,
-90,162,9,65,85,143,178,130,66,65,140,225,99,3,97,156,129,137,227,207,
-9,0,50,193,84,193,172,229,231,5,0,53,242,28,0,232,192,13,64,64,
-0,57,254,153,6,224,41,29,160,112,229,138,15,108,57,224,38,3,163,168,
-136,228,0,53,108,7,224,168,2,165,88,195,30,240,195,1,186,173,160,69,
-229,10,4,133,231,224,97,3,251,58,21,226,189,15,184,20,98,253,164,146,
-224,11,3,224,167,11,206,188,162,231,225,37,1,71,83,231,37,8,225,80,
-17,160,50,161,185,230,85,5,192,242,131,155,66,92,239,84,1,224,42,3,
-64,13,72,7,128,233,66,122,1,53,52,232,182,0,232,190,0,224,0,0,
-160,186,67,155,233,253,1,66,148,208,195,68,3,0,57,245,169,1,194,222,
-64,34,254,64,3,146,103,161,38,110,58,134,223,229,19,1,225,184,2,160,
-29,178,105,226,177,2,97,64,242,37,3,224,28,3,139,121,177,110,128,228,
-161,113,0,79,132,179,238,218,2,224,74,10,161,46,224,73,37,160,215,199,
-118,224,204,182,99,48,131,164,246,18,4,194,200,96,76,131,17,160,118,224,
-40,14,224,120,0,230,106,5,66,44,82,102,226,199,0,105,56,0,54,74,
-124,198,74,163,237,224,9,4,160,0,96,187,162,161,0,58,128,28,234,204,
-12,1,52,53,173,157,233,182,4,170,128,224,178,10,227,27,0,150,176,234,
-169,0,177,194,172,141,97,64,224,12,4,192,4,164,211,64,120,76,151,64,
-14,67,172,67,85,165,210,0,50,96,246,174,105,136,115,110,158,128,15,224,
-24,6,224,0,7,2,95,55,48,178,35,69,157,246,253,17,165,217,130,116,
-229,82,0,1,95,55,109,121,64,61,140,254,96,156,163,177,1,54,56,122,
-103,78,27,1,95,49,135,139,64,40,0,54,129,88,5,54,56,52,32,75,
-32,65,57,193,13,160,92,224,1,9,233,252,2,224,37,16,224,35,4,224,
-32,23,224,29,20,224,26,17,224,23,14,224,20,11,224,17,8,224,14,5,
-80,51,240,164,0,128,0,65,26,141,64,72,143,1,75,52,112,66,64,1,
-0,75,198,141,96,34,139,194,242,141,6,5,67,111,101,114,99,101,128,6,
-2,105,98,108,88,92,64,43,136,190,228,50,1,128,127,228,60,3,166,194,
-96,11,230,23,1,227,236,5,224,126,0,224,211,1,170,7,192,14,137,146,
-224,30,12,224,85,16,233,125,0,224,85,22,196,123,64,17,200,126,3,95,
-49,52,51,65,61,198,248,128,0,168,219,64,248,136,210,225,36,6,83,173,
-13,76,105,116,115,46,75,110,111,119,110,83,121,109,98,115,228,64,47,241,
-136,0,225,40,138,235,2,10,225,40,65,248,18,1,237,158,13,231,253,4,
-224,34,4,224,44,2,0,48,85,254,0,83,64,116,82,91,240,70,9,0,
-48,125,201,100,184,132,18,0,50,90,207,164,18,71,217,105,201,5,32,64,
-64,35,49,48,131,20,232,124,4,64,47,209,145,234,58,1,161,37,137,195,
-184,66,233,194,10,225,50,5,225,225,5,232,37,0,224,5,7,206,202,192,
-60,192,1,201,241,224,28,10,224,149,5,231,39,6,224,77,13,225,199,0,
-64,0,135,50,224,2,5,192,108,224,52,5,228,118,12,64,22,170,108,224,
-77,15,224,56,9,226,114,3,133,176,142,101,224,36,0,224,58,7,224,17,
-8,224,14,5,192,157,134,162,0,52,87,116,64,6,233,242,0,234,41,19,
-106,89,241,89,5,96,0,226,185,0,224,143,74,133,81,67,10,113,20,223,
-123,0,75,83,103,159,94,101,135,192,12,64,43,244,13,0,224,2,0,239,
-104,11,162,63,224,38,3,128,2,67,143,224,208,3,161,205,192,8,64,157,
-101,23,226,202,11,192,47,128,109,225,187,5,193,8,128,8,64,120,128,126,
-172,148,161,236,66,218,215,129,168,85,96,64,236,6,11,224,205,0,236,7,
-12,233,233,0,225,151,1,224,84,0,64,102,206,52,1,95,56,67,250,207,
-107,128,163,74,22,64,180,179,120,121,170,234,35,1,224,114,8,224,108,2,
-162,166,226,40,1,224,51,2,253,43,3,160,219,158,230,204,84,128,71,248,
-82,4,31,77,117,108,116,105,112,108,101,32,99,111,110,115,116,114,97,105,
-110,116,32,115,111,108,117,116,105,111,110,115,32,102,111,0,114,219,184,160,
-59,0,57,74,47,87,148,227,37,1,66,19,136,248,252,87,1,96,217,130,
-183,69,15,128,47,96,213,1,52,50,93,10,98,226,120,162,74,17,64,65,
-0,54,165,133,225,148,3,0,83,100,70,129,213,139,224,160,93,172,8,228,
-109,10,171,224,64,173,235,149,2,246,128,1,224,182,1,138,138,226,83,0,
-114,160,226,193,4,178,169,224,19,4,228,253,1,227,119,3,160,2,241,251,
-0,160,17,130,110,227,25,15,96,12,244,118,1,163,4,162,70,160,244,66,
-27,0,52,75,90,242,224,0,192,68,133,54,224,132,5,242,174,0,96,101,
-161,30,113,231,133,131,224,104,2,161,101,179,103,83,165,157,66,1,52,52,
-71,106,178,12,192,0,165,162,65,165,137,156,195,73,198,68,140,134,96,71,
-67,70,0,52,157,135,0,89,161,3,195,125,193,200,128,232,160,15,131,192,
-224,202,1,236,246,2,192,176,224,83,3,103,205,227,116,2,103,60,96,157,
-1,95,50,92,196,172,248,161,237,123,114,224,21,0,227,53,7,128,93,235,
-116,2,235,127,4,64,104,90,241,191,202,192,139,97,39,131,180,160,24,65,
-22,138,144,128,34,97,45,193,33,192,197,218,112,192,198,224,99,1,82,150,
-224,21,1,134,131,3,49,52,51,57,130,179,0,51,237,142,0,101,145,0,
-54,224,14,0,192,0,192,174,224,98,7,64,160,240,157,1,64,1,132,152,
-225,97,0,224,142,3,160,139,96,48,64,11,250,42,9,128,205,193,149,131,
-89,246,35,6,2,95,49,49,94,182,224,151,8,225,132,5,224,28,4,64,
-79,181,144,227,246,3,163,139,128,35,195,133,160,49,163,78,64,11,224,147,
-5,227,76,0,234,24,1,254,81,1,227,28,7,227,5,9,194,250,224,0,
-0,225,139,1,0,52,228,51,1,97,236,140,81,129,164,192,74,64,66,64,
-27,139,116,119,133,129,253,100,176,229,154,7,195,229,96,197,128,209,228,46,
-0,163,86,225,36,1,166,180,144,220,203,94,228,96,3,224,46,18,249,209,
-2,225,9,1,231,110,0,224,44,7,241,56,37,64,31,1,95,54,106,172,
-7,67,32,95,53,52,57,32,95,149,157,160,39,112,199,128,69,143,171,160,
-23,224,90,8,194,251,0,85,104,118,224,174,6,227,63,1,224,168,1,128,
-101,224,73,10,192,24,147,225,162,234,135,127,229,238,2,64,103,128,12,243,
-114,5,161,222,141,7,67,2,135,196,231,120,1,228,159,2,228,231,5,224,
-42,8,226,168,0,227,118,1,98,131,228,2,3,128,221,229,34,1,197,176,
-83,195,225,77,2,129,168,200,106,128,11,248,33,6,228,37,2,129,61,224,
-8,4,128,25,64,217,204,232,185,137,162,253,91,110,192,59,224,22,2,224,
-25,6,224,26,6,224,29,7,199,135,192,37,192,183,128,11,224,196,0,250,
-82,4,0,58,99,65,64,146,0,67,149,162,65,63,96,169,0,51,209,133,
-227,70,0,134,199,2,49,52,51,73,41,160,86,1,95,52,141,41,64,48,
-136,127,112,52,181,26,64,41,161,199,96,71,192,144,228,64,0,227,110,5,
-128,29,227,107,11,251,138,1,224,39,14,227,26,3,128,154,227,53,5,237,
-136,7,100,160,130,22,225,250,9,227,74,6,161,56,229,64,4,228,207,4,
-214,141,225,245,0,224,131,8,134,13,244,52,6,243,108,6,224,50,35,194,
-182,120,55,89,121,1,55,56,224,229,3,229,236,8,160,157,195,6,248,35,
-5,227,215,10,225,71,11,244,248,4,225,70,3,192,41,226,101,2,224,58,
-20,224,35,0,233,63,4,226,184,8,227,168,4,160,101,232,106,1,224,19,
-0,199,7,225,68,12,148,151,225,68,8,225,63,9,186,185,225,63,19,66,
-207,137,122,0,95,192,28,67,126,96,49,64,168,116,99,135,247,224,62,2,
-64,53,190,237,197,136,77,218,131,98,179,23,227,198,1,83,102,96,150,0,
-67,193,149,96,244,255,179,0,150,186,202,138,202,34,4,95,49,49,49,54,
-99,120,0,85,115,168,0,85,225,4,11,117,163,84,229,2,95,55,51,86,
-47,0,50,99,235,64,168,2,49,51,56,96,11,0,50,64,6,85,177,0,
-55,231,132,4,0,83,254,54,37,96,176,64,4,129,88,197,64,65,27,97,
-20,97,31,1,48,53,67,98,228,214,1,232,198,4,166,37,65,32,199,202,
-5,80,32,95,50,49,50,237,50,2,18,109,105,110,105,109,117,109,58,32,
-101,109,112,116,121,32,108,105,115,116,205,34,1,95,50,65,112,226,229,1,
-131,170,68,56,0,95,76,224,64,93,96,97,64,95,217,221,98,111,238,96,
-4,192,19,133,242,128,67,167,11,224,13,1,188,131,130,252,134,227,96,7,
-107,198,0,48,69,65,128,145,96,25,64,227,0,49,70,229,9,95,57,56,
-54,32,79,32,35,55,53,248,148,1,240,113,6,64,155,134,41,244,59,20,
-1,78,97,64,245,0,58,157,186,253,59,39,229,120,1,68,244,129,47,129,
-62,140,133,0,50,69,230,192,7,193,15,67,147,243,154,4,1,51,57,188,
-210,192,91,225,114,1,136,55,201,193,0,50,115,58,240,80,11,128,45,239,
-252,2,252,46,82,1,51,50,194,219,224,42,5,193,234,128,182,252,46,19,
-226,44,25,224,115,1,224,69,3,224,68,1,226,62,0,80,129,228,215,0,
-111,172,192,101,252,142,15,95,193,241,247,1,129,105,0,83,169,104,97,191,
-133,57,189,165,65,117,164,157,96,7,192,220,251,0,74,225,126,1,177,142,
-194,110,160,65,187,131,192,252,251,146,8,128,237,0,54,250,248,3,66,48,
-104,79,224,125,4,167,205,115,9,68,241,164,216,128,49,0,54,227,5,2,
-226,81,20,163,177,226,71,9,225,219,8,231,219,0,226,47,19,138,121,67,
-232,89,22,132,222,0,54,196,8,196,231,68,116,226,4,1,64,174,198,77,
-3,50,57,56,32,64,15,134,39,227,99,11,160,114,246,210,1,64,20,226,
-160,2,252,2,2,87,45,118,199,129,160,64,87,134,102,64,178,251,17,5,
-0,51,73,187,251,17,2,0,50,197,110,161,203,224,136,10,195,61,194,195,
-237,247,6,96,54,247,120,3,205,222,128,149,235,48,0,76,182,225,124,1,
-197,63,224,55,1,66,177,166,182,224,75,2,96,163,255,144,1,224,204,6,
-87,252,224,204,3,203,105,228,59,1,226,20,7,226,38,9,65,139,167,23,
-96,15,229,35,3,143,221,103,135,99,98,1,49,51,64,125,0,79,236,200,
-2,0,51,116,94,137,80,233,217,3,199,31,237,35,8,227,59,1,236,170,
-0,243,81,13,233,149,4,233,116,0,224,54,0,224,55,1,143,186,247,250,
-11,193,213,233,116,1,140,71,133,160,199,174,169,7,1,55,50,65,20,0,
-51,252,26,1,96,38,2,95,49,52,94,195,224,0,3,65,215,130,209,0,
-58,129,225,154,190,139,73,225,91,12,161,83,233,174,1,224,36,4,130,26,
-1,49,52,67,212,213,174,160,234,249,210,5,64,35,130,225,64,9,102,91,
-64,129,133,31,0,75,226,191,14,1,52,49,132,156,128,81,64,15,230,219,
-0,237,208,4,64,73,254,70,0,224,69,8,163,5,97,74,128,73,242,180,
-6,98,152,224,17,2,226,163,13,232,86,8,128,42,192,131,160,134,0,54,
-133,240,192,118,1,75,50,105,251,64,25,132,61,225,63,5,0,95,228,228,
-2,73,235,233,156,3,195,175,224,102,3,65,209,0,55,228,44,1,226,68,
-2,134,82,169,56,231,209,5,199,233,131,80,64,52,224,33,16,128,27,128,
-113,236,30,0,232,147,1,225,33,2,130,199,224,31,2,226,202,18,224,54,
-0,194,205,224,219,5,236,220,4,250,142,0,192,49,232,32,10,64,58,201,
-202,177,48,2,32,95,55,124,9,104,186,0,49,134,242,232,4,1,246,193,
-2,128,10,160,16,224,149,5,224,165,1,224,117,8,224,249,2,243,126,1,
-192,16,128,123,1,95,54,204,250,226,37,1,168,50,197,84,179,54,201,122,
-124,134,64,66,248,248,0,246,82,0,70,97,128,73,224,17,6,134,192,0,
-95,86,84,128,59,111,226,0,50,105,212,70,32,130,169,0,95,90,156,2,
-95,52,53,169,234,231,182,3,253,174,18,128,247,0,52,69,39,65,71,75,
-150,2,95,55,54,66,110,1,48,50,78,177,225,78,0,66,205,213,189,227,
-110,21,0,90,225,80,2,227,101,32,192,30,193,237,227,98,7,135,30,227,
-98,1,0,51,107,82,64,195,71,141,2,54,57,48,71,156,66,3,132,219,
-226,104,0,3,95,51,48,54,225,212,1,133,67,1,52,48,102,62,233,241,
-4,164,248,64,68,241,253,2,225,213,3,227,102,0,224,21,7,224,24,1,
-169,227,224,28,14,224,55,10,64,2,224,29,21,170,49,128,0,193,69,225,
-77,1,192,25,96,42,227,91,2,192,57,224,99,6,224,39,9,240,15,6,
-224,148,10,196,158,224,23,2,224,129,1,239,0,0,224,5,1,2,95,49,
-48,254,25,6,224,1,5,226,138,10,239,195,5,160,87,224,122,0,199,61,
-224,113,3,192,160,224,19,0,228,140,0,223,224,96,0,224,208,5,224,44,
-0,252,252,2,231,82,9,237,204,1,11,80,114,105,109,105,116,105,118,101,
-115,46,126,142,184,128,114,131,132,193,71,183,60,233,81,4,132,33,1,50,
-51,88,138,0,48,99,26,2,95,49,48,91,251,109,187,66,181,136,157,224,
-108,2,9,101,120,112,97,110,100,68,105,99,116,188,72,65,23,209,87,224,
-254,1,228,163,6,224,224,1,228,118,1,225,198,7,225,215,0,193,3,227,
-92,0,162,252,233,27,0,234,185,2,229,71,1,192,121,192,1,165,205,225,
-219,12,103,99,224,28,26,128,144,193,219,128,30,224,19,0,194,109,166,109,
-226,68,22,224,0,0,224,36,10,0,49,90,51,1,48,57,72,166,1,50,
-54,233,20,3,225,36,2,227,0,9,230,229,2,160,1,163,129,224,91,4,
-236,169,3,224,29,8,193,35,162,43,224,208,4,192,233,183,110,160,55,201,
-71,80,146,133,50,224,83,1,154,48,229,223,2,234,106,3,187,104,128,39,
-134,48,64,92,154,99,140,229,166,42,224,84,5,224,90,0,224,197,15,241,
-236,1,192,17,226,78,23,224,0,1,192,49,129,242,224,83,3,225,145,11,
-225,249,0,161,24,225,90,7,224,63,1,232,73,0,225,84,6,225,81,4,
-102,101,1,49,52,96,189,221,209,187,116,225,67,3,232,168,0,128,79,99,
-142,110,173,199,57,224,21,4,160,139,179,213,179,212,137,153,128,14,147,237,
-64,17,175,26,70,100,116,56,0,73,249,223,1,104,234,175,35,97,252,82,
-2,83,212,114,122,223,124,227,125,0,74,29,128,203,64,15,225,132,2,232,
-146,1,248,42,3,64,134,224,48,16,192,46,64,207,128,0,64,163,139,138,
-131,116,186,163,98,20,72,83,129,227,111,91,64,17,143,211,0,49,139,208,
-64,98,152,130,65,0,107,205,152,64,65,161,161,204,237,144,1,70,22,250,
-145,5,128,192,240,174,21,96,33,165,163,224,228,0,235,208,0,176,196,247,
-214,1,240,148,1,64,153,177,128,199,194,64,222,2,49,51,53,244,39,5,
-241,218,0,208,20,162,89,64,27,253,87,13,130,110,160,50,160,148,192,64,
-205,7,246,180,0,245,93,5,2,95,49,48,140,200,160,198,70,16,0,48,
-162,139,3,95,49,57,51,75,224,64,9,2,56,49,32,162,154,129,200,128,
-23,227,242,0,64,139,160,107,230,173,6,1,36,120,102,54,64,255,176,179,
-80,221,84,223,64,70,137,47,70,80,64,25,1,56,57,67,135,72,233,64,
-20,137,91,98,228,1,75,52,96,2,137,149,64,27,137,96,237,171,15,212,
-88,193,17,1,51,57,180,64,250,113,1,78,140,243,13,7,226,32,1,194,
-43,160,13,233,63,3,168,247,128,90,228,124,1,232,27,3,193,126,232,39,
-1,194,14,230,70,0,232,63,9,224,85,5,128,103,229,242,8,202,66,236,
-214,9,224,36,2,229,231,1,176,130,160,186,224,112,5,224,98,62,230,74,
-0,225,0,0,225,48,4,130,82,108,141,183,154,192,95,192,131,225,44,3,
-92,19,72,245,165,130,240,12,2,193,161,65,227,1,51,56,224,34,1,128,
-101,251,75,9,224,22,13,224,174,0,192,121,193,235,224,44,13,224,198,0,
-227,93,0,242,169,1,252,76,2,241,72,1,225,63,20,225,57,5,224,136,
-37,224,102,2,234,86,0,224,102,6,241,230,13,128,100,225,167,5,224,55,
-12,224,56,5,192,155,127,251,163,52,193,126,160,14,224,0,2,160,199,230,
-2,2,221,10,182,76,231,26,0,90,65,0,52,77,192,112,52,2,95,55,
-52,72,6,165,187,96,70,234,125,6,25,105,110,99,111,110,115,105,115,116,
-101,110,32,116,121,112,101,32,101,113,117,97,108,105,116,121,32,217,177,97,
-48,70,60,64,107,72,161,224,67,8,1,32,126,128,44,192,32,160,0,64,
-233,147,65,103,10,243,122,2,230,25,5,229,155,1,225,53,4,96,22,219,
-68,243,167,11,129,36,193,83,164,62,168,6,254,37,0,139,223,227,27,0,
-91,64,75,159,110,131,139,152,68,170,141,249,229,55,1,0,57,64,17,0,
-58,128,206,64,24,1,55,56,93,197,65,82,64,20,223,123,242,124,25,73,
-6,129,246,105,164,239,19,42,224,214,1,239,21,2,101,109,242,120,6,65,
-39,64,25,0,54,229,183,22,129,14,192,146,86,167,226,24,0,243,99,4,
-117,46,224,230,28,126,244,224,227,51,192,8,227,144,3,64,128,166,179,2,
-54,56,52,125,60,192,82,224,1,3,236,90,2,224,114,0,224,1,7,134,
-64,224,37,21,224,35,4,2,95,49,50,245,91,0,64,135,135,38,225,108,
-1,138,20,64,25,135,36,0,85,71,55,167,64,129,94,64,27,166,254,107,
-133,119,201,125,200,64,25,130,109,227,63,1,3,97,100,105,99,156,42,96,
-34,96,53,100,23,2,51,52,50,128,21,130,113,103,254,238,170,17,92,125,
-168,9,1,51,56,130,32,196,200,1,95,54,168,149,1,56,50,232,158,1,
-0,49,158,181,64,7,233,157,1,67,3,1,49,50,92,252,99,207,0,56,
-64,8,64,79,0,54,224,79,3,66,144,224,76,16,230,55,3,96,197,0,
-54,81,157,64,75,66,106,64,75,181,27,1,32,83,64,76,167,65,234,51,
-11,104,82,166,34,224,32,12,194,106,228,87,18,224,26,12,171,130,228,80,
-7,128,22,90,210,192,186,0,50,66,131,192,186,228,165,19,98,250,67,149,
-224,44,2,160,153,224,48,5,227,29,1,133,26,192,7,228,221,22,69,67,
-67,28,198,54,224,12,2,2,95,49,50,68,199,99,205,65,200,229,243,6,
-224,144,0,245,22,2,64,79,117,122,225,18,1,70,68,0,85,96,66,198,
-42,124,100,64,33,64,20,64,59,192,110,0,49,66,149,224,101,5,141,109,
-174,116,225,0,2,225,187,18,128,141,233,207,1,224,32,8,192,135,225,25,
-8,230,203,1,129,25,164,127,64,12,226,76,18,97,168,206,195,224,78,3,
-192,24,0,85,218,43,224,35,10,195,31,224,35,0,96,0,226,64,9,64,
-27,157,18,129,142,100,242,129,15,77,37,140,81,200,104,160,103,232,142,0,
-141,216,225,63,4,96,0,225,171,8,64,141,224,101,0,110,250,192,52,224,
-60,2,224,172,4,254,170,4,67,130,213,208,64,114,128,182,0,80,132,105,
-132,235,130,206,96,189,0,50,77,92,64,25,213,113,98,112,108,92,0,51,
-65,245,64,26,228,234,0,0,55,69,253,3,95,49,51,55,132,233,64,31,
-125,67,0,51,112,108,3,54,56,32,64,228,185,1,1,91,93,68,172,0,
-58,128,44,237,181,4,237,187,2,70,20,213,208,143,228,239,238,0,0,83,
-98,155,86,183,132,224,240,4,0,128,8,205,153,136,190,0,53,67,154,162,
-178,153,83,105,53,224,141,1,8,99,111,109,112,111,115,101,83,101,69,136,
-161,64,64,200,77,164,1,52,55,97,33,177,114,64,21,68,153,1,95,53,
-95,239,96,0,65,102,158,64,225,102,5,81,137,133,53,224,147,21,128,141,
-224,140,1,7,104,97,115,70,105,101,108,100,128,138,64,42,129,131,64,119,
-224,79,43,2,115,101,116,224,79,13,0,54,197,137,96,64,110,135,224,64,
-2,2,95,54,55,66,106,224,71,1,10,114,101,99,67,111,110,69,114,114,
-111,114,193,187,133,203,235,48,1,225,166,1,132,42,128,165,1,49,51,65,
-66,234,54,6,26,67,111,110,116,114,111,108,46,69,120,99,101,112,116,105,
-111,110,46,73,110,116,101,114,110,97,108,46,193,131,128,87,64,62,125,215,
-103,130,64,146,234,130,8,4,44,32,97,116,32,170,132,104,162,0,49,214,
-90,64,164,130,237,132,140,165,167,224,160,3,1,95,49,76,241,130,58,74,
-46,96,7,145,7,0,79,225,100,2,162,222,224,192,2,1,104,97,97,7,
-213,72,64,106,195,63,1,80,32,165,82,96,21,223,186,231,143,0,233,82,
-0,64,220,0,54,97,113,228,214,1,236,93,2,252,189,4,224,21,2,64,
-189,228,118,1,98,142,245,196,3,177,80,224,56,4,196,173,96,62,235,48,
-1,133,46,224,29,8,128,100,64,2,151,94,246,229,3,132,142,4,32,64,
-95,53,55,78,75,129,150,78,50,102,4,0,49,240,210,5,133,58,99,159,
-73,5,0,53,178,225,165,182,202,64,105,250,0,90,161,159,83,175,236,191,
-3,226,206,7,7,78,101,115,116,101,100,32,102,66,210,11,115,32,110,111,
-116,32,97,108,108,111,119,101,162,223,96,0,225,14,2,235,250,0,64,211,
-134,19,247,179,6,71,93,70,252,224,50,5,160,162,224,147,19,226,136,9,
-4,101,120,116,114,97,128,154,2,40,115,41,130,146,3,66,32,95,53,73,
-216,132,62,131,84,192,145,65,254,236,166,0,128,32,193,34,193,189,98,167,
-224,174,1,224,22,3,115,9,64,16,102,12,130,220,107,96,96,30,150,32,
-64,26,243,228,1,237,23,7,160,0,64,134,124,85,182,55,3,51,55,32,
-95,202,22,231,215,0,0,55,238,150,1,66,212,197,245,230,157,0,0,85,
-104,149,229,12,16,219,94,64,107,102,63,0,50,116,72,64,255,160,24,106,
-102,123,186,93,5,0,55,106,133,64,32,205,112,64,107,110,75,1,90,32,
-92,107,225,22,3,0,67,67,170,198,238,224,26,6,99,198,85,110,0,51,
-74,155,195,207,197,214,160,52,65,34,227,149,14,236,231,3,137,21,163,42,
-227,129,5,133,134,226,41,8,169,35,229,69,4,11,111,114,100,32,119,105,
-108,100,99,97,114,100,226,192,9,138,78,224,192,1,92,145,68,81,64,169,
-200,91,65,33,133,181,64,211,224,253,0,212,141,225,210,2,225,177,1,0,
-54,206,53,64,74,86,182,64,3,0,75,77,156,181,64,96,48,118,186,64,
-60,99,194,107,188,64,25,206,13,96,126,225,40,0,75,247,195,208,231,180,
-0,249,163,4,159,226,64,79,96,15,228,103,3,224,39,3,64,32,66,185,
-226,238,8,238,143,0,64,143,174,217,238,145,10,119,142,168,61,146,205,2,
-95,49,49,85,218,224,78,5,255,53,0,227,82,5,64,94,197,185,0,90,
-66,200,96,17,197,181,239,199,1,64,7,64,144,64,29,130,254,200,122,65,
-117,134,31,64,27,130,234,231,167,40,0,103,231,167,14,0,53,216,81,203,
-46,198,196,165,174,250,81,1,69,138,102,211,128,247,112,204,196,112,230,200,
-2,128,132,238,69,3,2,111,120,121,165,61,224,154,3,64,123,131,124,103,
-46,201,222,65,58,128,4,86,196,4,79,32,35,52,54,195,124,64,49,130,
-102,224,93,1,1,66,64,142,220,64,44,138,14,4,53,52,32,95,52,88,
-131,64,21,174,14,196,193,0,51,133,10,1,49,51,71,130,64,31,129,247,
-130,93,87,185,2,95,49,48,73,8,0,75,128,29,193,182,67,32,0,35,
-97,218,138,201,64,69,238,177,15,2,50,55,52,64,104,0,52,134,175,206,
-177,226,219,10,98,91,1,50,50,163,82,243,131,0,231,58,0,88,44,229,
-125,1,101,103,109,152,104,181,251,124,0,197,175,212,198,205,22,224,2,3,
-128,24,244,123,1,0,39,96,80,192,39,134,40,122,43,239,110,13,64,29,
-198,86,245,255,2,158,162,224,5,3,102,206,227,159,3,64,19,0,83,128,
-154,238,131,13,228,243,0,128,24,255,54,4,216,218,67,86,200,114,193,71,
-208,69,137,104,100,71,128,197,97,131,68,132,0,95,107,93,1,49,50,96,
-185,2,95,49,50,66,31,0,64,96,20,224,0,0,193,89,161,92,65,38,
-64,66,128,34,133,11,122,41,108,41,97,45,173,77,64,37,144,63,224,68,
-4,149,157,225,1,4,224,172,3,224,11,3,64,234,208,186,85,81,160,159,
-224,152,0,130,2,246,184,11,130,197,0,48,229,150,2,160,132,250,212,7,
-224,164,3,251,251,0,66,187,196,91,226,142,13,128,50,226,116,0,232,204,
-3,129,97,200,107,135,144,192,44,224,244,2,166,69,224,56,2,71,243,129,
-134,232,106,4,64,140,173,196,1,50,50,253,156,0,2,95,55,54,101,116,
-196,35,64,112,224,175,24,226,22,0,156,136,235,218,0,0,52,106,46,196,
-178,0,50,67,208,230,197,0,64,91,132,127,1,80,32,64,11,132,89,128,
-73,224,107,13,193,162,225,159,18,233,252,4,96,129,226,167,1,225,34,22,
-0,50,81,190,225,34,9,66,143,132,162,185,72,64,84,71,62,96,199,64,
-32,231,61,3,224,184,21,192,35,97,12,96,111,231,53,5,135,76,0,52,
-67,253,99,140,65,47,160,133,231,32,1,242,93,1,64,194,152,78,128,82,
-245,227,5,64,70,3,10,65,32,90,64,46,64,14,165,51,254,185,14,152,
-164,100,3,0,48,114,3,0,49,87,71,240,138,1,1,50,51,73,86,164,
-137,228,145,2,0,85,228,54,7,244,194,5,2,75,105,110,235,185,0,64,
-132,130,252,1,95,52,97,23,68,230,131,248,168,94,227,232,0,153,212,164,
-174,4,80,32,95,52,50,67,171,1,52,50,96,97,224,6,4,106,142,184,
-129,160,57,128,5,0,85,64,53,64,194,192,32,224,106,19,109,113,224,108,
-1,64,255,96,114,224,108,31,0,82,224,108,26,65,70,96,100,0,83,172,
-131,224,110,6,160,103,224,117,2,224,106,9,224,63,3,224,113,2,173,181,
-102,5,145,97,122,64,160,40,224,108,18,224,115,2,128,67,224,61,13,160,
-106,3,95,49,55,51,225,219,2,3,92,51,52,38,64,3,3,44,48,58,
-48,237,157,2,98,30,0,51,70,199,199,132,0,51,76,113,224,13,2,94,
-166,224,13,1,68,121,160,13,0,53,224,25,2,0,53,224,23,1,66,56,
-204,96,73,252,72,132,0,58,96,57,163,153,128,184,196,23,96,61,117,174,
-95,11,162,201,64,47,200,237,224,47,9,224,57,2,74,25,224,57,0,224,
-64,6,171,99,224,54,10,224,152,1,224,53,9,0,54,200,172,224,2,0,
-131,163,241,88,2,228,203,2,231,193,5,71,124,100,61,128,27,239,236,1,
-224,50,4,113,154,228,184,4,2,95,49,51,104,217,228,207,6,64,148,154,
-232,67,206,164,181,72,232,196,151,119,182,160,156,224,2,6,128,112,64,0,
-192,44,130,209,247,96,4,192,59,196,209,232,255,0,160,94,130,165,67,251,
-128,46,224,96,4,96,17,224,137,1,164,137,224,38,4,96,35,224,75,6,
-192,37,193,20,96,150,97,35,225,20,10,109,187,225,20,4,192,112,158,89,
-128,85,193,90,230,99,13,225,160,6,165,222,192,71,192,73,97,108,133,192,
-224,100,82,192,14,162,135,224,17,0,224,15,0,224,133,3,224,47,2,155,
-92,164,149,226,128,31,221,139,192,78,224,141,1,224,143,0,224,19,2,187,
-191,226,13,6,191,79,96,13,224,10,1,129,175,131,12,0,64,162,103,224,
-73,1,234,188,8,226,108,2,224,37,1,224,131,18,224,70,0,195,112,192,
-136,224,119,0,134,195,73,156,216,240,96,5,64,0,226,87,9,226,93,12,
-231,201,7,231,207,0,128,172,131,165,1,49,50,127,210,64,74,248,52,11,
-236,71,0,224,189,2,224,21,15,160,132,248,96,5,240,34,1,128,0,85,
-49,178,113,228,10,6,96,0,225,255,54,101,154,68,80,228,223,0,226,211,
-10,196,56,128,12,224,94,6,160,221,192,86,66,172,0,50,132,31,192,199,
-192,54,129,201,164,192,96,119,136,223,237,83,4,64,13,224,95,3,65,125,
-254,179,5,226,36,0,196,212,226,10,0,192,34,67,131,224,46,0,237,81,
-7,224,129,1,160,230,225,241,6,236,125,10,0,51,107,19,64,38,0,79,
-236,53,5,229,202,30,224,103,0,73,132,76,171,0,48,223,161,105,150,67,
-219,128,10,110,53,64,38,0,53,77,102,79,10,117,184,244,12,2,225,100,
-0,77,217,231,200,1,5,83,117,98,115,117,109,119,166,11,32,99,104,101,
-99,107,32,102,97,105,108,101,201,184,226,56,7,65,123,138,76,225,29,5,
-2,95,57,49,236,69,1,2,49,51,49,64,19,241,161,8,0,51,167,208,
-65,20,108,121,3,51,52,32,89,133,217,129,142,156,252,160,241,228,33,11,
-64,130,195,201,230,62,1,225,228,4,166,26,252,253,1,160,51,224,46,27,
-228,90,0,160,25,162,239,224,39,9,130,160,224,137,0,228,88,1,192,32,
-177,196,0,85,252,123,18,160,68,224,36,2,224,150,0,248,16,0,210,159,
-195,120,131,179,97,232,121,48,213,214,208,145,160,149,226,223,0,231,86,6,
-224,162,3,172,129,225,26,31,159,16,225,145,5,255,48,9,224,193,9,228,
-178,1,224,31,4,229,213,8,192,142,192,124,131,169,224,13,11,240,205,13,
-224,44,15,169,111,227,108,12,128,26,160,154,255,70,6,224,72,0,224,185,
-1,134,205,225,92,1,177,219,192,118,226,35,7,192,53,226,169,3,225,98,
-20,194,124,162,254,231,46,18,224,51,1,176,101,224,175,11,225,164,10,128,
-97,130,113,192,159,192,138,226,159,9,224,192,1,224,94,2,162,130,229,238,
-0,165,224,140,64,69,62,130,146,0,55,209,10,128,207,161,51,224,196,14,
-174,78,224,101,2,128,47,224,97,3,224,214,2,230,139,0,160,82,160,145,
-64,77,228,246,5,128,31,129,116,224,27,6,128,26,202,105,124,55,64,9,
-96,180,109,51,224,4,1,128,116,1,95,50,68,211,101,211,250,22,3,11,
-102,114,101,101,84,121,86,97,114,115,58,32,252,166,5,160,255,96,236,133,
-12,126,210,64,0,0,85,119,164,0,85,103,255,67,250,178,34,128,6,69,
-31,140,240,2,75,32,89,162,102,203,155,228,250,3,228,151,12,193,224,225,
-204,9,225,250,2,89,98,129,173,231,46,7,136,158,116,22,134,141,230,208,
-4,121,44,64,1,235,67,9,67,73,189,194,224,0,1,226,85,12,225,235,
-2,65,197,193,135,229,225,0,152,84,171,214,234,62,1,231,90,7,200,141,
-231,128,3,231,172,4,192,36,128,177,224,179,7,232,252,0,169,218,224,191,
-3,215,116,160,167,225,13,40,64,45,128,79,0,50,83,98,224,0,1,224,
-42,5,0,80,217,158,135,85,72,170,255,112,2,231,90,15,111,90,70,93,
-229,244,1,225,147,15,164,250,128,186,170,123,128,246,170,24,230,60,5,128,
-13,234,67,1,64,147,219,159,224,141,1,218,23,224,114,8,224,184,0,152,
-75,253,75,3,192,116,102,176,152,180,160,14,2,79,32,35,78,139,99,7,
-163,56,147,179,160,127,239,115,7,128,214,226,30,0,160,249,224,156,2,214,
-173,225,245,0,224,27,10,232,97,2,96,2,235,202,7,230,42,8,100,213,
-238,62,0,129,212,224,255,8,213,144,224,20,3,64,194,0,54,239,106,0,
-224,143,7,250,224,4,227,46,1,164,212,232,91,2,186,240,225,232,0,1,
-51,48,103,44,2,95,49,49,91,58,224,58,0,224,165,2,96,121,143,228,
-236,247,1,162,234,227,243,5,1,50,57,96,75,224,37,29,64,94,74,103,
-64,93,139,248,64,42,80,66,231,19,5,128,168,164,153,137,180,225,115,0,
-230,12,5,225,170,2,224,50,2,230,21,4,237,132,9,231,72,3,224,62,
-2,229,9,5,230,126,0,192,30,229,18,9,224,34,8,232,56,5,234,109,
-0,236,218,2,192,231,236,52,4,241,7,2,233,4,3,161,144,0,49,221,
-70,224,101,5,224,88,6,161,25,224,128,3,96,14,1,95,52,85,93,164,
-70,224,24,0,147,169,139,206,70,211,178,176,193,178,198,182,224,133,9,224,
-18,11,224,23,0,233,88,8,231,151,9,130,33,109,109,224,13,5,224,56,
-12,224,57,3,229,202,1,160,44,96,9,227,123,6,231,111,0,128,29,133,
-228,64,9,226,160,5,233,249,6,224,42,1,196,39,193,28,246,154,1,225,
-30,11,225,235,2,128,18,162,88,227,255,2,225,183,1,225,227,13,96,195,
-227,211,8,252,88,0,233,251,3,98,239,227,6,4,96,35,224,17,9,225,
-52,2,67,112,64,189,245,201,1,225,69,1,144,95,123,166,96,133,232,151,
-5,12,99,97,110,110,111,116,32,117,110,105,102,121,32,141,203,129,73,165,
-134,1,49,49,101,13,224,55,8,3,32,97,110,100,128,47,192,34,224,236,
-3,162,3,226,66,9,68,17,0,51,239,146,6,230,195,4,1,49,50,129,
-227,193,76,68,197,129,244,64,227,66,47,64,66,223,152,64,90,0,57,105,
-179,222,153,0,50,174,58,64,42,254,131,4,11,80,114,105,109,105,116,105,
-118,101,115,46,126,158,141,64,42,218,180,135,202,192,8,166,221,0,58,128,
-93,160,35,231,113,11,1,49,51,117,198,228,215,3,204,45,64,27,0,55,
-162,198,229,113,6,65,13,229,235,0,226,83,8,228,55,32,96,146,224,141,
-2,129,14,126,35,240,63,2,160,39,230,45,6,66,245,106,230,114,204,96,
-172,131,139,226,56,33,4,121,99,108,105,99,226,50,10,102,239,66,17,65,
-186,116,84,226,60,9,0,61,226,58,17,229,93,5,233,79,7,225,113,1,
-192,216,173,158,224,193,0,192,192,161,112,224,132,0,161,122,252,64,3,227,
-144,18,225,6,7,0,50,115,32,169,34,131,24,0,51,110,201,224,217,7,
-4,101,114,114,111,114,171,226,128,113,0,54,136,155,121,90,224,40,1,3,
-116,121,112,101,64,36,224,17,1,0,107,219,5,224,18,1,3,115,111,114,
-116,224,18,6,4,114,101,97,108,109,64,19,64,90,135,185,241,96,42,0,
-49,167,157,66,45,241,96,1,133,13,198,99,103,144,226,149,1,129,200,226,
-77,1,238,139,5,231,109,5,224,39,10,209,49,193,179,233,165,0,224,36,
-4,129,125,231,131,17,98,28,130,202,128,107,205,173,130,198,237,154,6,160,
-137,139,221,0,90,64,208,0,90,64,49,192,25,224,100,8,236,250,2,206,
-245,169,103,165,149,224,215,10,230,250,2,224,79,8,236,194,9,113,146,96,
-34,160,25,64,106,128,11,64,185,0,48,223,8,64,14,173,227,65,170,98,
-63,104,104,225,100,1,224,137,9,129,34,161,137,225,94,12,128,90,166,70,
-225,128,49,228,120,7,195,148,132,5,86,97,234,240,3,227,194,11,64,7,
-128,168,231,216,4,163,196,246,132,10,94,98,232,23,1,1,95,49,92,3,
-1,48,57,100,9,70,50,139,113,128,87,227,189,2,225,137,1,96,189,0,
-85,164,78,224,61,2,1,95,51,172,218,107,92,224,66,2,136,135,225,37,
-13,229,41,0,225,104,15,194,72,233,40,8,192,24,226,148,4,226,29,0,
-224,78,15,225,148,16,225,147,2,0,90,238,184,7,224,47,11,128,184,224,
-47,14,96,0,224,50,13,255,224,0,225,197,11,224,24,14,129,167,225,220,
-3,239,46,8,224,131,10,227,5,4,66,253,199,233,64,76,0,50,71,141,
-129,30,4,32,95,54,56,51,104,28,78,159,1,49,54,133,226,192,189,172,
-241,237,52,0,64,72,136,15,128,70,0,55,149,25,0,54,96,41,77,50,
-192,41,64,40,200,21,160,111,0,67,224,106,12,0,58,141,92,69,59,5,
-54,56,52,32,75,32,66,91,224,1,3,186,83,128,174,224,1,11,196,135,
-224,37,19,224,35,4,224,32,23,224,29,20,224,26,17,70,244,240,125,2,
-64,216,136,158,3,85,32,75,52,64,2,0,90,64,4,192,26,199,62,0,
-89,130,184,232,190,1,237,174,1,161,131,224,116,2,228,68,1,194,0,96,
-57,166,109,79,167,157,233,64,21,239,43,11,128,69,104,22,227,116,1,130,
-120,128,112,224,80,0,130,2,80,86,0,56,97,220,218,33,96,28,234,110,
-10,97,229,103,41,112,135,1,49,49,71,16,224,115,0,224,98,0,228,164,
-4,234,147,3,209,241,96,7,234,59,4,64,0,166,132,192,188,163,238,133,
-126,239,55,5,68,133,128,51,97,101,0,54,197,242,132,5,153,181,241,241,
-23,68,212,240,214,5,242,112,9,252,91,2,241,219,12,64,0,240,152,6,
-64,153,66,230,229,52,1,169,82,177,225,64,34,207,227,1,80,32,134,39,
-0,85,128,22,134,185,229,255,9,80,37,198,232,128,167,227,217,12,96,106,
-227,217,6,128,46,97,45,169,245,0,48,132,212,64,111,132,43,194,183,64,
-2,224,26,0,186,72,227,171,13,192,1,227,179,0,225,66,1,224,1,9,
-227,183,5,227,61,2,64,102,196,59,0,89,143,119,0,39,208,243,167,114,
-208,204,192,75,208,59,226,159,1,161,242,162,227,224,41,2,231,233,10,224,
-89,2,224,47,21,227,118,2,236,164,0,232,207,15,203,0,96,234,230,12,
-7,224,28,3,230,192,4,226,105,4,67,32,1,50,57,203,116,192,101,240,
-22,0,225,200,0,254,254,1,156,149,225,229,7,231,227,10,160,79,230,165,
-9,231,9,4,224,39,0,224,237,0,233,195,2,225,217,3,225,85,5,224,
-55,1,160,252,231,143,15,231,222,177,224,221,3,224,59,11,192,30,165,107,
-145,179,97,59,228,175,3,228,246,2,195,140,224,92,4,160,63,225,104,2,
-237,105,10,229,37,0,193,16,226,151,6,165,200,1,54,54,96,114,96,68,
-226,100,17,224,119,5,229,235,1,242,113,0,230,132,8,136,104,224,180,16,
-98,68,227,91,0,224,154,2,192,21,193,64,224,62,1,226,96,3,226,200,
-3,160,44,192,153,226,144,1,160,110,230,153,2,158,31,3,32,95,54,50,
-211,203,1,95,56,160,164,225,140,1,243,81,0,227,43,3,129,10,129,20,
-145,107,77,25,138,213,199,43,224,30,4,251,137,2,174,221,247,138,4,238,
-112,1,13,98,97,100,32,115,121,110,111,110,121,109,32,117,115,110,179,224,
-151,0,102,80,230,70,14,160,0,193,103,184,195,0,58,150,34,81,255,3,
-32,85,32,95,112,92,1,90,32,90,104,229,50,0,235,114,0,128,233,229,
-16,1,229,19,29,128,235,229,19,2,224,44,10,238,140,1,224,114,6,224,
-36,4,227,151,16,237,11,3,173,189,96,11,192,118,64,183,196,177,193,158,
-153,84,201,55,0,80,134,154,224,230,2,192,212,132,189,224,71,1,160,150,
-131,22,130,206,78,242,65,237,98,42,252,171,3,225,132,8,64,182,227,160,
-5,128,171,224,209,8,229,63,3,128,175,248,108,1,227,2,0,230,50,15,
-238,230,0,229,50,26,224,121,8,192,24,65,74,164,92,224,159,11,224,37,
-1,197,116,243,180,0,253,123,2,197,119,96,247,0,54,71,141,66,243,2,
-53,52,57,253,234,1,64,0,125,162,241,101,2,2,117,98,115,117,1,8,
-109,112,108,101,109,101,110,116,101,145,135,64,0,66,175,243,173,1,1,80,
-32,161,41,0,80,72,224,97,36,136,112,128,14,0,54,232,127,1,66,211,
-128,1,171,60,160,75,137,76,129,68,73,45,230,49,1,65,93,72,210,64,
-37,177,149,2,51,56,54,160,228,64,20,137,77,131,195,105,26,2,50,57,
-49,128,25,136,247,224,208,1,2,100,105,99,82,54,64,26,204,245,251,154,
-11,161,203,230,40,5,164,103,149,79,162,64,211,213,0,51,64,40,1,50,
-56,64,24,251,132,9,96,148,1,10,65,123,170,0,54,99,23,0,58,128,
-43,64,201,224,123,2,0,48,64,200,0,83,69,142,130,31,130,209,235,96,
-3,128,148,0,48,163,62,3,83,32,95,50,123,197,170,23,0,50,139,217,
-170,23,240,43,5,86,7,106,90,96,161,1,57,51,128,10,4,95,49,56,
-49,32,194,165,64,64,141,233,97,4,161,190,225,174,1,225,180,7,128,219,
-64,50,234,63,3,68,176,224,1,13,234,30,5,224,35,26,224,32,23,224,
-29,20,224,26,17,224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,
-192,8,96,5,238,56,6,160,0,65,44,0,54,129,44,77,8,3,95,55,
-50,48,248,109,8,6,45,104,97,112,112,101,110,99,100,64,47,131,20,144,
-100,227,242,4,0,95,156,184,2,85,32,67,182,181,224,32,14,229,126,0,
-229,50,0,224,41,4,134,127,189,3,64,29,132,37,128,33,77,222,0,50,
-94,92,94,45,245,202,3,1,61,62,182,163,224,22,5,248,71,2,160,33,
-224,91,5,2,95,49,54,67,20,85,237,225,23,7,163,214,1,52,56,98,
-251,102,239,116,194,96,132,96,7,95,235,80,128,1,95,49,101,225,224,6,
-5,224,33,0,64,13,128,39,224,33,21,160,26,224,40,3,224,33,13,224,
-40,3,4,64,95,49,53,54,99,103,64,20,64,182,132,120,0,75,98,6,
-247,50,17,98,19,0,83,136,194,1,66,32,101,98,193,16,247,33,4,22,
-97,115,115,101,114,116,84,67,77,111,100,101,58,32,101,120,112,101,99,116,
-101,100,61,248,71,14,96,97,102,212,137,8,69,206,4,55,54,32,64,79,
-96,18,0,49,160,8,0,54,224,8,0,0,50,248,248,1,248,118,9,4,
-44,32,103,111,116,128,105,192,90,201,94,193,162,133,74,2,75,51,32,64,
-12,174,52,4,49,49,56,32,75,183,192,88,85,224,81,2,5,84,67,69,
-120,112,114,160,81,224,25,6,0,84,183,225,224,26,10,0,75,215,234,224,
-26,9,0,83,215,242,64,27,0,50,133,112,129,191,1,50,52,224,12,0,
-64,156,133,109,130,189,0,50,97,148,131,16,5,50,55,55,32,95,54,65,
-17,181,167,105,221,175,110,233,227,3,225,30,8,15,77,117,108,116,105,112,
-108,121,32,100,101,102,105,110,101,100,184,197,1,95,54,129,36,0,95,97,
-16,64,123,0,55,165,213,2,55,52,50,65,39,73,255,211,49,65,155,2,
-95,53,55,101,252,0,55,133,52,64,131,0,54,65,206,232,251,0,194,139,
-132,89,138,8,128,17,192,19,233,7,2,224,2,1,194,102,235,88,0,99,
-102,129,204,193,198,4,95,49,48,51,50,128,125,0,54,192,149,226,178,15,
-226,207,15,137,61,128,134,224,31,11,169,26,128,32,230,188,6,64,31,71,
-31,201,194,128,5,224,33,3,97,38,66,223,162,80,97,49,1,49,50,84,
-133,96,7,64,93,96,20,224,100,20,0,53,192,100,135,173,224,165,0,224,
-183,19,160,83,129,65,0,66,115,9,224,185,12,224,113,13,64,178,227,160,
-0,224,140,10,238,111,9,67,143,64,134,0,50,103,143,64,0,65,150,178,
-78,2,52,53,48,227,82,0,99,191,163,189,96,7,100,142,233,164,7,2,
-99,99,32,227,30,3,64,39,96,215,135,237,97,70,161,75,0,54,80,57,
-160,23,2,49,50,55,224,131,1,64,7,99,82,224,13,0,104,81,96,13,
-64,155,133,160,238,62,5,107,84,96,85,128,197,209,115,187,29,226,141,0,
-64,71,0,50,64,215,97,102,64,47,64,8,224,7,7,64,101,133,79,3,
-85,32,75,50,72,103,0,65,64,46,64,22,132,122,244,167,3,224,121,5,
-224,108,5,2,48,52,48,224,108,16,64,77,132,187,224,77,31,2,50,54,
-57,224,77,20,132,108,73,41,83,85,97,226,0,58,96,52,224,100,2,224,
-97,6,96,88,0,52,75,122,224,87,6,64,56,132,49,164,25,160,49,75,
-178,96,138,100,161,203,244,224,53,3,235,110,0,0,51,137,160,64,19,0,
-54,163,229,104,144,1,52,48,99,250,71,128,193,97,201,203,64,22,129,222,
-1,75,50,65,115,64,15,166,216,0,50,171,191,66,126,102,232,64,224,64,
-15,129,67,73,237,234,19,2,64,24,248,34,15,1,50,53,248,34,4,99,
-24,244,118,19,244,112,1,224,25,7,192,1,234,78,101,233,210,5,64,192,
-225,168,1,1,49,50,75,214,206,98,4,51,55,32,95,56,129,215,0,73,
-71,123,99,198,0,51,86,140,1,50,53,69,92,0,79,129,29,1,53,51,
-173,168,130,24,0,51,132,40,96,34,64,6,64,63,103,174,64,4,64,110,
-171,102,234,57,10,233,118,2,228,3,0,64,49,129,255,224,39,12,167,101,
-64,37,205,118,224,200,23,67,22,0,79,64,178,224,207,2,66,84,101,206,
-2,79,32,64,96,22,64,16,64,6,66,159,96,189,224,52,11,140,143,224,
-52,2,133,138,224,52,21,137,161,224,52,2,151,102,224,52,21,98,150,224,
-52,3,108,242,224,52,2,128,27,160,52,0,52,64,234,224,45,3,161,138,
-64,175,225,138,0,130,40,225,191,14,97,80,131,74,0,80,71,254,64,35,
-105,38,1,50,53,101,91,64,120,224,12,7,96,140,64,43,131,98,64,30,
-0,48,96,59,251,149,2,1,52,55,128,42,101,212,68,55,0,49,80,219,
-242,137,2,225,218,2,0,45,171,121,64,66,227,140,0,100,61,104,218,142,
-189,0,58,96,70,226,80,0,64,14,130,206,111,83,64,14,162,110,225,74,
-0,0,53,128,52,226,83,18,96,120,64,35,130,81,224,35,12,1,78,97,
-175,125,65,137,224,36,15,5,83,121,109,98,111,108,160,39,129,65,224,39,
-12,8,67,111,110,115,116,114,97,105,110,192,83,161,65,227,34,21,234,96,
-0,64,49,129,99,224,39,12,170,163,64,37,129,70,97,57,161,121,0,58,
-129,240,103,173,1,48,55,224,64,2,5,98,117,105,108,116,105,109,191,77,
-91,64,3,64,43,202,6,109,138,176,202,0,51,129,98,200,54,0,48,71,
-139,129,162,0,49,138,182,82,202,64,5,140,68,224,21,12,64,70,129,146,
-109,58,134,108,0,90,69,118,224,9,0,172,54,1,50,54,209,232,64,60,
-167,227,96,7,128,92,140,216,96,85,64,84,238,119,0,68,23,242,207,5,
-0,83,208,158,180,11,73,149,74,166,1,48,52,235,75,0,137,12,238,142,
-5,232,179,5,5,103,101,116,73,100,101,97,185,127,68,87,148,224,142,1,
-0,85,157,57,64,136,219,63,1,95,55,200,193,129,81,177,242,107,227,135,
-33,0,55,71,4,1,95,55,124,126,1,95,54,64,20,64,39,223,36,230,
-143,8,0,51,251,67,2,64,40,251,6,10,70,131,230,20,9,230,26,8,
-230,125,90,224,26,17,224,23,14,224,20,11,224,17,8,224,14,5,224,11,
-2,240,191,11,65,35,231,220,16,0,50,231,220,5,75,45,231,220,13,167,
-214,224,16,1,224,1,5,225,85,170,225,43,8,64,255,243,62,0,0,51,
-243,59,15,64,37,233,180,0,106,237,224,34,6,64,32,0,54,192,32,106,
-91,96,2,192,26,242,24,12,236,108,6,99,68,129,125,236,244,10,0,49,
-152,237,140,208,65,178,236,162,0,142,84,64,216,144,252,0,48,72,9,195,
-217,160,127,195,151,226,12,0,97,28,254,162,0,1,50,50,102,221,254,162,
-6,1,95,55,74,222,64,29,203,39,64,97,234,143,1,225,43,14,96,40,
-165,220,226,82,1,188,65,224,1,11,226,70,170,224,17,8,224,14,5,224,
-11,2,192,8,244,100,12,65,41,246,216,1,224,1,13,225,29,5,225,68,
-245,244,137,8,65,82,164,227,0,48,87,162,71,174,198,140,66,230,236,245,
-2,226,173,15,96,42,241,248,1,96,70,103,71,64,108,64,75,64,31,201,
-95,2,48,56,55,73,111,91,237,139,134,2,32,95,57,78,161,96,161,171,
-137,0,48,144,125,96,17,1,49,48,103,163,177,60,1,54,49,67,96,67,
-91,67,133,74,221,1,55,48,103,219,0,57,131,97,96,106,249,88,1,149,
-220,154,136,250,133,11,149,117,224,25,6,100,38,224,25,12,146,90,246,123,
-7,147,146,157,43,168,241,231,74,1,150,134,161,137,102,12,239,109,3,65,
-145,242,28,1,160,119,242,229,6,207,82,252,4,5,108,189,187,205,196,109,
-113,201,96,32,65,120,129,36,228,202,2,64,12,133,2,128,74,2,95,49,
-48,65,65,97,130,1,49,48,97,88,133,27,1,49,48,68,237,1,95,57,
-145,211,97,146,128,11,128,0,224,162,3,255,10,1,226,121,0,133,75,0,
-52,122,14,128,16,128,143,224,194,0,224,108,3,97,226,0,57,87,13,192,
-98,160,182,97,219,224,117,3,160,96,150,15,128,38,96,108,0,89,232,179,
-0,189,72,224,116,0,224,50,1,129,39,96,50,96,222,229,222,2,64,13,
-122,38,226,207,0,96,48,241,81,0,250,58,13,255,138,0,99,41,235,123,
-6,1,36,102,137,228,64,123,0,89,224,151,0,202,151,64,139,73,188,67,
-119,160,206,224,58,2,0,120,246,145,3,251,81,0,227,11,1,224,151,22,
-192,101,250,249,1,150,48,246,218,0,245,121,2,254,117,0,226,162,0,130,
-86,193,58,226,224,0,160,133,129,76,67,81,226,205,3,128,10,65,132,253,
-171,2,225,240,0,226,232,0,161,131,231,90,9,224,0,3,227,86,4,140,
-24,99,85,70,252,131,195,226,119,0,0,79,64,63,161,208,98,236,162,140,
-0,64,65,112,0,67,130,209,77,30,250,72,12,118,95,68,212,224,29,6,
-131,200,160,29,125,92,236,67,1,237,94,16,1,73,79,183,162,192,0,158,
-191,96,19,98,217,2,95,57,56,67,64,1,56,54,224,63,2,9,73,79,
-46,112,101,114,102,111,114,109,224,62,1,98,74,225,148,0,99,22,162,182,
-225,70,4,112,24,67,97,126,211,78,234,69,61,208,183,65,97,225,92,2,
-224,222,4,132,3,161,81,131,138,64,228,0,48,149,113,184,7,196,185,0,
-67,97,108,1,95,49,115,199,96,38,73,227,226,169,2,0,103,224,246,5,
-228,11,1,64,67,237,67,8,194,153,101,83,237,78,4,105,48,97,51,225,
-220,5,196,45,132,202,160,12,144,137,0,48,144,29,0,48,216,185,67,10,
-248,206,4,240,186,1,229,171,7,229,170,7,93,188,105,87,96,11,160,13,
-224,133,1,128,9,64,130,229,73,5,225,210,0,2,79,32,35,85,195,160,
-109,209,47,128,0,224,96,3,133,222,229,27,8,227,79,2,65,118,162,208,
-64,2,225,243,1,224,125,8,64,0,229,242,7,98,173,123,102,163,235,196,
-110,216,93,0,95,123,187,91,24,66,223,96,168,225,8,1,133,227,0,53,
-207,140,0,49,74,208,243,23,0,0,55,166,101,96,0,245,197,2,99,46,
-130,181,64,0,71,120,242,9,2,69,225,142,175,0,67,166,188,1,67,39,
-92,19,5,95,53,50,55,32,95,81,235,128,58,231,155,8,90,49,0,95,
-85,85,69,5,73,218,128,146,128,16,1,50,49,128,16,79,26,64,100,139,
-35,166,138,225,175,0,128,116,193,97,230,236,4,160,21,226,80,1,100,47,
-0,39,98,152,96,139,230,210,1,128,61,157,143,130,73,192,51,225,175,2,
-230,253,1,224,29,5,230,219,1,1,57,54,228,1,12,2,115,101,113,219,
-218,230,229,0,224,78,1,192,13,194,3,135,237,128,192,128,88,108,195,97,
-153,195,171,64,5,164,179,97,94,96,242,132,20,230,58,5,97,184,64,42,
-64,17,102,37,198,61,128,86,231,254,20,230,235,16,230,233,1,64,144,199,
-125,164,76,200,172,230,248,42,96,19,0,56,248,62,3,130,120,97,255,139,
-249,0,90,161,207,136,199,97,36,129,226,166,14,225,222,139,96,61,2,49,
-50,48,74,232,128,75,117,151,133,244,66,249,169,12,160,22,128,41,225,140,
-4,228,225,0,225,121,104,97,122,140,54,97,101,201,208,226,60,9,226,44,
-6,247,170,0,64,204,239,232,4,239,6,16,69,228,180,52,100,39,104,190,
-229,77,3,65,217,136,121,132,232,65,207,65,11,154,153,64,55,192,158,199,
-92,138,111,193,107,129,92,68,237,103,72,224,119,0,140,175,65,89,139,225,
-0,85,100,113,64,40,250,230,2,225,94,0,96,104,0,80,134,150,236,89,
-0,234,156,35,64,11,0,83,201,54,194,28,227,239,1,64,111,2,95,49,
-48,92,24,151,129,196,235,134,165,96,123,128,33,65,125,160,33,230,142,1,
-167,229,96,193,141,29,2,83,32,83,128,194,237,28,12,100,54,224,25,12,
-109,152,224,25,12,129,99,64,197,231,223,4,181,46,97,152,64,134,64,193,
-245,58,3,99,68,224,20,7,96,71,180,234,236,46,1,64,62,71,233,227,
-5,3,70,68,235,102,30,3,79,32,35,49,64,14,166,252,226,239,7,235,
-93,26,96,0,197,151,232,84,1,96,248,74,75,160,24,192,130,0,54,153,
-41,142,160,224,7,6,64,0,203,108,242,206,4,206,66,169,16,225,102,9,
-225,251,0,224,131,4,128,130,226,56,3,128,61,79,112,65,51,2,56,53,
-50,90,220,71,217,201,34,160,49,64,33,251,4,2,224,157,0,192,235,224,
-129,8,65,208,224,129,9,96,21,160,79,72,64,230,39,15,2,95,51,56,
-101,50,196,37,224,40,14,224,143,10,139,173,73,238,225,87,2,160,166,131,
-62,224,169,7,97,152,224,195,12,195,163,96,25,226,175,4,163,141,97,131,
-64,107,0,54,233,244,0,106,96,1,49,49,168,70,129,240,138,207,101,116,
-198,131,163,203,224,109,8,224,32,19,244,153,2,225,85,5,192,24,176,85,
-229,87,0,116,128,225,134,11,96,106,97,134,228,221,0,102,75,1,95,49,
-123,237,96,0,227,163,8,140,241,65,82,244,190,5,226,94,7,64,33,206,
-73,128,95,129,8,171,130,192,58,226,179,37,224,139,0,196,142,224,37,10,
-96,252,145,204,193,110,236,32,0,165,79,237,197,4,229,69,0,235,94,0,
-224,52,22,161,78,224,52,6,224,10,0,224,52,13,233,53,0,224,41,2,
-192,229,139,152,107,121,238,70,17,9,68,97,116,97,46,76,105,115,116,95,
-91,124,2,46,43,43,237,83,0,128,83,230,77,3,227,203,1,224,0,6,
-164,110,131,81,228,101,10,0,85,233,190,4,5,49,49,48,51,32,67,93,
-255,98,213,64,15,143,152,162,215,70,33,139,198,69,127,231,41,1,78,199,
-227,173,9,96,192,4,82,97,116,105,111,128,193,2,95,109,107,96,13,1,
-110,97,92,206,64,0,128,196,159,37,0,48,97,48,224,17,4,64,151,64,
-114,0,51,168,15,0,65,135,101,139,215,72,30,96,14,137,230,70,178,102,
-68,90,234,108,38,0,52,122,211,4,54,49,32,95,52,102,24,101,181,160,
-10,2,49,57,56,69,241,0,48,76,244,160,5,0,50,237,168,0,65,54,
-140,105,96,66,165,229,7,50,49,52,55,52,56,51,54,94,11,128,168,224,
-247,20,11,73,110,116,101,103,101,114,46,95,105,110,116,65,196,1,84,111,
-160,17,224,250,2,101,90,205,96,170,42,233,222,1,64,165,226,121,0,224,
-108,28,161,102,1,105,110,224,109,11,227,241,7,198,195,64,0,65,70,169,
-178,129,70,131,157,2,95,52,54,225,3,5,99,61,195,105,103,70,97,95,
-64,70,227,138,0,0,85,225,116,3,64,0,0,89,169,127,148,74,66,238,
-0,52,71,104,225,143,4,224,92,0,229,174,0,234,154,2,224,170,1,98,
-2,97,158,0,66,81,189,129,175,67,68,5,57,52,32,95,52,55,65,153,
-65,53,129,161,198,203,0,58,129,71,98,35,68,141,224,107,0,128,150,99,
-147,64,2,163,160,160,250,237,42,1,224,226,7,224,255,0,224,229,2,99,
-223,104,144,137,246,83,98,128,26,65,69,72,56,96,12,224,156,0,2,95,
-51,50,70,46,0,57,101,117,224,254,3,64,172,138,212,128,21,1,51,50,
-122,36,64,22,138,115,143,43,134,92,224,194,5,64,184,132,205,64,8,1,
-95,49,77,193,225,169,0,175,51,106,35,96,54,0,79,228,15,0,202,248,
-105,252,232,90,0,206,92,177,97,170,76,64,85,0,54,233,36,1,0,57,
-129,17,64,157,0,54,192,157,0,83,79,200,246,142,2,229,93,0,96,13,
-229,43,13,196,141,128,47,165,46,224,13,0,192,63,224,64,3,241,4,0,
-224,67,0,183,226,224,55,2,192,71,193,20,129,44,224,88,4,97,42,231,
-125,0,192,178,225,93,3,193,7,210,188,107,212,175,28,231,248,10,160,32,
-81,88,72,234,156,9,161,127,115,40,0,55,67,226,1,56,53,74,185,233,
-106,1,225,143,9,226,150,1,178,239,96,88,0,80,97,155,96,42,65,135,
-160,130,236,59,1,0,95,64,81,64,102,105,5,235,228,4,64,0,142,221,
-160,247,135,84,181,240,181,164,99,123,114,98,236,107,0,224,51,1,226,95,
-0,131,0,230,117,0,225,120,5,232,199,5,68,78,225,112,0,193,199,225,
-86,14,65,139,129,143,224,16,1,217,237,96,142,132,151,160,93,128,156,192,
-200,3,95,50,51,56,231,70,0,1,49,48,253,204,3,224,164,4,224,17,
-3,231,44,0,142,12,96,29,226,158,0,165,42,1,52,57,84,99,3,95,
-49,55,51,229,114,2,3,92,51,52,38,64,3,3,44,48,58,48,101,95,
-161,101,96,223,224,45,25,132,194,96,0,70,2,234,223,4,0,109,229,175,
-0,96,126,0,56,82,237,109,155,128,17,67,162,0,83,91,128,225,66,7,
-180,6,160,247,160,62,155,27,128,56,96,68,212,94,66,31,136,8,224,126,
-6,0,112,245,182,2,123,77,64,41,97,29,67,226,219,57,132,33,251,52,
-14,131,150,227,217,4,245,83,4,66,228,130,155,224,39,4,133,29,182,126,
-226,248,1,129,143,174,190,70,7,163,111,213,201,161,121,64,157,232,151,0,
-96,152,96,105,1,49,51,223,137,219,112,197,187,177,192,248,52,3,194,81,
-227,122,2,238,100,7,230,157,0,164,73,99,71,64,58,97,8,165,114,250,
-59,1,122,139,243,34,5,96,13,140,170,101,90,172,199,227,204,2,229,87,
-3,149,4,169,194,0,52,69,120,185,177,225,183,7,210,78,129,37,0,50,
-77,60,0,48,168,41,228,1,1,65,36,0,51,167,228,71,91,103,120,65,
-71,64,24,201,83,132,191,110,228,132,67,64,7,64,115,64,36,137,105,99,
-211,195,205,194,2,193,55,133,219,97,20,100,47,194,168,96,45,202,120,131,
-112,128,5,225,78,1,161,115,229,131,4,152,91,235,229,1,234,245,2,98,
-248,133,141,1,56,56,240,214,1,161,4,94,101,197,128,168,35,128,199,161,
-8,136,237,73,116,1,50,56,133,171,225,81,5,0,118,178,140,96,72,98,
-245,165,41,164,209,164,230,224,178,0,253,137,4,228,212,0,133,51,160,185,
-64,15,231,129,0,131,40,160,2,229,226,1,133,119,128,21,64,43,104,65,
-224,35,0,128,30,65,209,230,60,0,212,3,1,80,32,97,0,245,213,0,
-177,236,230,0,0,225,167,0,229,61,2,229,145,1,128,13,237,93,8,205,
-205,192,191,231,150,3,161,179,64,113,0,52,244,49,3,0,68,74,143,13,
-66,111,111,108,46,111,116,104,101,114,119,105,115,101,228,84,0,212,224,224,
-248,0,245,107,4,65,131,129,27,245,87,0,225,52,1,164,50,96,5,65,
-149,137,35,64,31,99,66,1,80,32,91,177,0,90,65,229,0,53,128,181,
-98,5,73,191,245,0,19,250,207,1,255,46,0,192,0,130,69,67,8,0,
-53,73,177,64,115,211,244,138,70,196,211,122,32,96,4,161,251,196,56,183,
-127,64,47,216,204,229,179,1,167,97,226,64,1,194,241,107,37,102,205,215,
-167,1,49,53,176,117,224,220,0,96,246,128,221,132,131,66,28,161,233,224,
-144,5,224,37,0,163,154,226,196,0,97,247,199,238,192,151,225,4,0,100,
-245,96,8,232,164,2,65,15,170,236,64,107,203,139,64,22,128,53,65,35,
-0,54,229,133,2,163,208,232,76,2,96,144,107,166,224,28,1,190,29,128,
-1,213,8,224,16,0,233,251,4,192,1,169,214,224,19,2,126,109,224,16,
-15,197,219,232,84,2,228,42,0,128,21,138,230,224,163,2,78,217,229,236,
-7,194,180,224,176,4,169,56,226,211,3,226,220,4,224,42,2,228,32,0,
-68,110,104,174,195,95,224,60,3,248,69,2,194,18,128,33,224,191,1,161,
-58,128,24,196,133,235,110,2,227,229,1,229,127,1,220,10,220,16,96,27,
-64,42,67,194,76,173,249,234,4,224,100,1,192,198,224,71,8,167,0,96,
-70,100,51,250,49,9,1,95,49,84,227,226,186,0,206,126,65,255,227,148,
-13,241,92,2,195,159,161,201,225,186,6,129,173,224,0,0,129,89,224,198,
-1,224,43,0,0,54,237,99,0,224,159,4,245,193,8,234,193,0,2,95,
-49,54,96,32,238,32,0,224,53,2,103,123,245,236,4,167,160,224,222,0,
-226,220,0,64,183,249,31,8,224,116,7,229,93,1,73,170,0,50,129,151,
-129,10,163,189,196,156,224,20,2,162,215,64,0,67,110,201,146,163,215,74,
-124,131,176,225,187,1,128,9,128,72,226,249,1,64,60,169,49,64,169,78,
-99,69,74,65,44,128,186,136,2,0,56,201,252,67,249,177,246,2,49,49,
-55,103,92,0,49,128,202,64,203,96,33,136,66,250,113,13,225,189,4,166,
-229,64,0,64,62,0,48,128,62,177,198,99,95,128,203,100,10,194,207,195,
-120,195,8,98,139,164,88,229,86,0,226,30,5,229,58,0,160,171,64,101,
-135,247,64,234,1,51,52,169,136,64,254,74,233,105,174,0,67,69,75,228,
-131,0,161,208,104,61,0,55,72,100,1,52,52,120,23,133,19,0,58,129,
-9,72,71,75,85,0,80,96,97,64,38,64,17,106,55,1,55,54,64,46,
-130,83,64,7,126,152,96,82,155,29,64,86,113,10,0,49,110,22,201,141,
-65,124,225,153,3,224,191,1,64,38,112,27,76,99,64,15,129,195,104,199,
-255,165,3,0,49,72,101,64,31,129,182,67,233,226,29,1,129,140,70,51,
-0,80,160,235,240,84,0,228,127,6,64,72,130,240,192,33,227,170,1,224,
-27,0,230,215,3,192,20,129,165,135,3,0,85,162,234,160,149,224,28,8,
-198,230,169,24,224,29,6,96,20,224,29,16,102,143,224,29,1,100,64,130,
-60,131,189,228,18,1,145,134,131,200,227,136,6,134,234,161,208,226,197,1,
-164,86,103,147,232,48,5,229,201,2,236,80,3,192,7,236,22,2,107,7,
-225,50,0,123,84,230,60,4,230,166,0,225,68,2,64,56,234,54,4,224,
-56,1,224,19,3,224,62,2,161,22,111,184,230,36,3,160,108,192,28,64,
-16,115,210,198,120,130,253,232,248,0,128,41,227,164,0,225,252,1,128,0,
-238,215,10,20,115,114,99,47,77,105,99,114,111,72,115,47,73,110,116,77,
-97,112,46,104,115,110,236,3,55,51,58,49,238,76,2,97,90,131,225,163,
-123,140,99,69,155,205,3,0,54,75,171,64,39,131,163,236,139,5,64,20,
-74,212,64,154,0,58,128,43,201,255,0,55,128,175,228,56,0,167,146,97,
-55,161,168,81,55,109,110,232,206,0,128,40,234,127,0,235,28,0,160,248,
-69,175,193,151,193,234,193,89,235,75,0,0,80,244,131,2,227,3,4,160,
-144,134,23,0,55,64,37,137,42,192,7,167,121,192,60,97,121,192,92,64,
-131,96,130,167,59,228,196,0,160,12,0,54,170,141,68,23,132,9,1,53,
-56,96,46,132,91,64,30,128,22,1,54,49,68,32,64,22,193,40,96,42,
-160,224,68,146,70,188,64,34,228,83,0,69,6,132,129,64,30,96,54,165,
-118,194,112,136,236,224,237,3,164,24,225,46,1,243,71,2,99,133,96,119,
-141,134,224,47,5,131,202,193,118,245,112,2,160,25,96,237,167,153,194,154,
-192,73,230,224,0,226,235,5,233,38,10,160,24,236,253,1,232,212,2,227,
-97,3,128,134,224,133,1,231,173,15,224,75,59,227,85,2,224,75,23,167,
-189,224,75,17,232,186,0,129,36,128,2,229,165,0,182,9,131,240,162,237,
-225,189,3,214,42,224,32,2,224,124,0,228,62,4,96,41,224,40,6,224,
-41,8,224,11,0,160,48,224,47,7,98,204,64,176,64,7,145,80,66,107,
-232,90,0,97,174,111,52,225,139,27,224,40,26,129,104,244,238,0,225,69,
-23,128,175,131,59,96,12,224,6,1,195,54,224,30,7,224,31,1,187,206,
-224,34,2,224,35,14,192,37,224,30,8,224,38,1,170,82,137,102,225,49,
-3,65,46,134,161,1,75,50,99,222,197,83,64,1,171,41,224,10,6,225,
-144,1,0,32,201,25,64,56,201,8,234,106,2,64,28,0,58,128,118,3,
-10,65,32,73,64,95,68,48,3,10,65,32,80,96,11,232,182,0,177,172,
-128,157,97,67,0,51,65,205,0,75,64,180,65,155,64,44,0,54,224,44,
-8,132,9,103,128,2,50,49,50,240,50,7,166,62,0,33,134,52,0,73,
-96,234,68,248,162,25,133,197,171,158,194,193,192,132,228,57,0,160,31,204,
-120,228,32,9,228,27,11,224,19,3,225,54,1,228,16,33,224,63,0,163,
-116,227,254,32,128,56,166,88,227,229,28,225,66,1,224,11,5,224,12,17,
-227,113,7,65,85,133,219,109,17,0,50,205,32,73,4,64,27,202,47,237,
-60,3,192,27,130,120,0,90,73,99,64,14,194,122,0,90,105,5,64,17,
-188,66,132,47,243,208,3,234,61,3,64,5,128,25,245,54,0,151,139,169,
-188,64,121,0,51,231,51,1,251,110,1,232,53,5,102,0,192,99,107,127,
-226,240,1,247,239,9,128,21,0,49,125,187,149,67,0,64,213,147,237,161,
-2,129,211,109,211,231,156,0,64,53,135,19,88,11,130,141,245,184,0,171,
-110,96,11,136,134,64,39,131,51,225,6,0,133,65,159,45,166,182,246,85,
-5,96,221,128,141,94,119,120,240,160,133,237,77,3,128,80,253,21,0,85,
-220,97,46,1,51,49,94,202,0,49,64,14,96,178,73,45,65,219,232,53,
-0,65,97,124,131,238,133,11,162,140,64,183,210,223,105,71,193,55,138,122,
-230,163,1,192,176,226,231,0,151,251,129,147,224,40,26,181,204,227,155,2,
-224,40,15,231,250,4,233,129,1,224,33,2,175,107,0,85,237,177,2,194,
-102,252,22,7,184,181,101,87,0,52,227,128,1,224,20,1,178,240,235,73,
-0,224,111,11,98,30,224,52,4,235,58,3,224,120,6,161,17,224,158,3,
-225,29,25,160,132,224,39,24,158,225,236,136,1,128,41,224,38,8,201,118,
-204,93,224,156,0,233,143,1,195,94,251,212,1,224,40,4,132,229,128,243,
-105,147,158,227,1,95,56,89,111,96,5,85,157,97,80,64,8,244,44,0,
-160,93,224,79,8,160,184,192,113,129,218,195,21,2,51,56,54,160,89,226,
-237,1,1,49,52,249,244,0,221,100,131,192,131,32,224,103,15,161,72,224,
-225,3,242,93,0,254,131,13,161,202,224,41,4,226,121,0,104,66,237,59,
-1,146,10,197,148,128,195,96,174,0,56,101,108,160,10,132,212,142,171,236,
-201,1,89,229,64,6,227,158,1,128,0,128,70,230,71,9,163,95,161,135,
-226,102,9,225,160,1,238,67,1,161,68,193,34,226,131,4,109,69,167,165,
-90,82,99,242,0,80,143,5,133,199,64,154,168,84,160,23,72,26,64,24,
-204,21,97,65,69,168,66,227,128,178,161,194,1,49,48,108,160,131,218,248,
-179,5,64,141,205,128,65,0,144,161,65,222,231,227,2,80,243,231,113,22,
-228,153,1,231,98,24,99,166,0,55,90,4,134,36,80,252,244,168,8,0,
-35,219,119,232,149,5,10,116,117,112,108,101,67,111,110,115,116,114,174,200,
-85,41,64,75,224,35,1,1,40,41,218,38,64,205,225,51,1,132,116,161,
-52,187,53,225,156,0,161,196,65,43,88,198,194,193,225,53,0,242,233,1,
-224,52,0,228,2,1,137,192,224,40,0,160,226,3,49,49,51,55,98,85,
-124,240,147,198,195,24,98,140,1,49,48,64,18,2,95,49,49,96,10,226,
-184,2,182,1,240,4,0,239,33,0,251,17,8,0,120,224,234,0,135,230,
-65,237,102,211,198,188,225,30,9,16,67,111,110,116,114,111,108,46,69,120,
-99,101,112,116,105,111,110,73,229,8,101,114,110,97,108,46,112,97,116,64,
-9,8,77,97,116,99,104,70,97,105,108,129,98,103,38,214,39,0,51,178,
-249,106,85,128,178,0,58,128,225,194,178,64,179,130,178,64,43,193,100,161,
-50,64,65,75,100,176,93,0,51,65,18,64,41,134,229,176,93,207,197,100,
-219,0,75,140,146,228,32,1,189,3,213,24,90,98,72,22,227,73,0,193,
-65,167,206,148,65,224,46,8,255,239,4,2,49,51,50,103,210,143,74,224,
-106,1,225,211,2,231,16,5,242,71,1,192,5,128,74,230,34,1,224,55,
-0,230,49,1,96,0,128,66,224,1,1,228,79,4,199,134,96,0,226,155,
-9,224,140,5,224,77,9,224,75,5,162,79,128,38,224,76,2,248,113,2,
-216,53,253,222,3,231,200,6,96,23,69,120,125,14,224,116,4,192,83,231,
-213,7,224,34,2,154,19,161,3,129,21,224,84,0,96,66,96,111,128,17,
-225,59,1,225,106,2,243,155,6,231,50,8,235,239,2,224,115,5,224,165,
-3,138,145,1,95,50,77,15,1,95,56,249,224,0,224,31,0,227,190,2,
-225,34,3,96,171,221,250,131,140,202,158,128,0,99,198,241,88,1,237,202,
-1,233,71,6,225,186,3,228,45,0,193,112,225,206,0,192,77,64,80,115,
-26,250,1,15,242,202,5,128,212,223,102,160,9,234,137,11,0,54,234,137,
-16,96,140,169,63,196,207,171,105,192,100,0,52,235,251,2,192,171,226,158,
-5,64,27,129,81,231,34,10,243,179,10,233,193,16,224,129,14,0,53,224,
-129,5,225,62,1,231,119,9,226,179,0,97,75,226,125,0,224,83,5,199,
-143,160,84,244,5,16,224,80,4,163,4,135,172,1,95,55,166,163,135,79,
-230,237,12,165,185,248,157,3,68,243,230,148,2,96,252,134,148,64,227,224,
-25,2,96,64,160,25,199,227,231,252,7,65,253,236,30,1,193,58,245,86,
-5,226,166,0,225,9,17,98,81,225,9,24,64,111,199,81,134,101,96,5,
-102,29,3,95,57,56,54,230,152,2,2,115,101,113,167,159,64,52,206,148,
-224,164,1,226,10,1,0,85,231,1,8,227,186,0,151,72,224,13,9,132,
-35,228,61,0,128,193,224,66,2,186,70,226,44,0,192,65,160,119,3,39,
-32,85,32,247,54,22,6,68,101,115,117,103,97,114,215,55,5,52,49,49,
-58,49,48,247,57,2,227,209,3,129,85,227,201,3,64,0,240,229,4,224,
-2,6,224,71,1,230,47,3,229,34,1,192,83,230,53,1,224,195,1,224,
-201,6,192,10,111,144,224,85,11,229,63,8,224,96,4,224,102,8,224,103,
-6,224,55,5,230,165,11,224,50,14,96,98,230,27,4,224,52,26,224,195,
-3,224,31,11,253,102,2,225,95,12,249,142,13,224,23,1,205,115,233,190,
-3,194,64,224,8,10,96,242,224,11,2,169,175,195,25,128,68,228,147,8,
-225,154,1,131,114,230,81,4,192,66,128,11,226,178,2,69,214,131,81,2,
-49,50,48,196,85,128,82,229,107,5,231,183,4,138,158,198,70,146,99,250,
-56,0,230,209,4,224,242,3,172,252,228,24,2,77,4,64,77,105,112,199,
-99,187,180,158,44,228,68,3,225,214,11,64,41,141,210,0,90,209,254,216,
-103,224,144,2,197,57,64,9,200,26,228,125,1,229,113,1,192,209,2,95,
-53,49,176,77,173,169,224,103,2,128,137,224,136,5,180,242,224,38,5,66,
-53,2,95,55,56,177,10,224,98,1,224,1,7,226,178,8,232,91,0,224,
-48,14,226,174,2,224,26,7,226,169,1,226,158,7,192,33,226,179,9,226,
-154,26,226,133,27,226,48,13,130,42,128,35,224,122,3,128,86,226,16,1,
-196,50,96,21,129,112,64,43,130,30,128,24,226,31,2,160,62,162,34,192,
-122,226,37,9,233,113,5,175,198,128,36,105,12,225,223,1,98,48,0,57,
-176,143,96,0,226,49,0,96,54,226,37,1,226,30,0,3,95,54,32,85,
-226,11,5,112,12,130,10,64,47,182,255,224,0,2,225,148,9,228,78,3,
-224,168,0,224,11,15,228,23,39,128,86,228,177,6,64,56,0,48,230,246,
-4,196,213,227,177,10,226,60,9,3,95,57,49,57,224,61,4,226,62,8,
-160,100,224,103,5,132,130,109,195,1,48,57,219,181,230,206,6,193,204,192,
-1,224,169,10,226,191,5,97,124,161,58,106,159,71,240,141,226,235,47,0,
-194,100,169,230,192,230,103,253,129,224,128,65,66,15,170,181,72,23,0,48,
-225,185,1,128,140,232,43,5,64,17,64,49,64,41,240,93,2,0,66,122,
-229,0,49,107,37,66,155,2,95,50,56,230,126,0,194,162,100,247,0,49,
-75,11,142,83,0,49,93,176,80,185,1,49,49,79,47,64,91,101,1,0,
-90,101,17,105,79,96,167,96,17,192,93,224,83,0,225,182,1,163,75,66,
-173,226,172,0,224,186,13,153,170,0,50,161,133,226,207,5,0,83,161,186,
-231,114,3,226,227,4,164,239,98,217,0,85,90,119,228,251,0,224,39,5,
-131,11,192,38,224,37,2,160,152,192,227,129,122,160,227,0,90,111,13,1,
-83,32,82,28,161,218,229,244,4,129,148,96,60,235,38,3,233,224,0,192,
-59,192,249,228,50,3,226,89,3,196,56,192,19,193,155,224,111,13,224,59,
-5,165,125,225,122,2,238,216,9,106,190,224,55,0,96,93,194,99,230,153,
-3,228,126,19,160,0,74,197,241,97,0,169,51,97,101,227,111,0,160,203,
-224,216,5,234,27,9,233,187,4,195,52,129,73,161,152,192,224,234,253,13,
-224,61,0,206,152,228,86,3,174,89,160,232,101,180,128,97,160,101,187,239,
-0,48,199,181,0,75,66,138,96,4,96,13,160,128,66,148,153,92,66,155,
-160,242,64,76,194,146,66,169,0,55,213,116,1,49,49,65,158,64,6,172,
-240,110,105,96,7,0,55,128,68,146,5,192,186,3,85,32,95,55,243,8,
-0,253,19,4,230,23,0,224,21,20,224,236,0,239,90,5,166,71,224,60,
-6,160,49,195,241,64,250,105,92,64,27,163,168,192,99,128,48,64,22,164,
-43,224,90,0,179,247,64,28,227,229,0,98,66,96,29,117,78,96,90,87,
-7,0,67,180,208,64,14,96,229,131,31,161,167,194,42,129,71,229,210,5,
-195,10,224,118,0,226,56,6,224,25,1,229,225,4,241,79,7,134,167,224,
-17,1,226,69,5,232,153,0,230,27,0,224,132,1,232,101,1,143,203,98,
-160,106,144,3,54,32,95,54,119,66,128,74,128,135,208,133,192,249,192,0,
-130,83,130,74,248,13,0,128,23,161,248,0,75,79,38,233,142,1,66,34,
-254,196,1,128,209,167,72,162,193,192,5,203,35,224,208,0,86,108,187,174,
-96,17,128,207,251,194,2,160,78,161,74,228,205,0,134,129,160,87,66,169,
-81,67,134,170,160,6,136,178,162,220,134,32,1,50,52,129,164,97,67,133,
-51,224,14,5,2,95,54,50,163,20,160,0,252,37,1,233,61,1,228,40,
-2,225,233,0,196,137,224,255,1,98,96,64,115,241,164,4,64,0,113,215,
-246,0,2,0,110,142,149,224,22,7,1,116,116,214,24,67,141,126,60,0,
-80,129,253,64,130,153,171,64,121,0,52,89,15,164,253,124,230,67,215,129,
-235,189,71,225,186,13,64,88,144,173,72,29,108,62,207,220,111,93,160,58,
-194,79,132,152,194,127,224,7,1,193,21,160,59,81,68,128,57,161,205,112,
-203,0,79,198,101,161,50,226,255,1,193,56,230,120,2,99,172,226,11,1,
-244,75,2,229,81,15,229,83,0,68,228,230,161,5,224,48,11,225,164,3,
-229,95,0,130,160,143,72,128,44,233,201,0,131,143,228,62,6,227,120,4,
-196,201,160,79,130,172,224,28,6,160,104,96,97,131,85,64,47,237,92,2,
-192,94,226,75,0,128,23,240,231,10,12,108,105,98,47,68,97,116,97,47,
-76,105,115,116,208,225,4,53,51,54,58,53,240,224,2,224,0,5,225,160,
-21,101,3,225,166,0,228,240,3,208,92,128,219,240,112,0,224,219,26,233,
-79,2,128,208,64,44,154,185,226,14,0,224,39,12,64,15,224,142,3,160,
-0,66,175,243,67,1,66,36,227,125,0,224,2,1,225,74,2,128,1,105,
-133,200,162,224,23,2,192,189,224,26,0,235,185,5,229,89,2,224,52,0,
-228,130,1,224,74,7,226,66,4,197,190,230,51,1,160,52,224,41,1,167,
-203,96,82,224,23,0,224,17,6,96,8,128,43,251,142,1,133,172,251,102,
-0,245,45,0,224,93,2,96,36,233,132,1,224,89,1,224,8,0,92,75,
-193,103,3,95,57,57,54,243,253,12,1,61,61,162,74,218,58,68,202,198,
-64,163,99,233,152,2,128,1,166,153,224,16,16,64,113,68,108,1,52,55,
-189,185,1,49,48,75,173,109,122,253,250,1,253,93,1,224,1,1,132,146,
-245,178,6,225,208,8,160,110,224,22,7,239,229,0,224,45,28,224,22,0,
-193,189,228,172,1,224,14,0,224,51,3,179,123,193,115,172,151,189,179,225,
-103,14,2,79,32,35,70,101,162,221,225,98,12,64,90,226,57,1,226,117,
-3,226,79,4,99,79,160,50,192,0,160,138,167,105,231,220,0,67,64,0,
-51,251,228,1,140,79,96,21,150,17,2,35,53,32,64,12,149,233,0,80,
-134,37,91,105,128,3,70,1,2,90,32,90,166,120,232,11,21,139,102,2,
-95,52,56,64,171,159,229,98,207,0,90,129,94,128,192,64,20,66,147,160,
-20,232,164,6,237,14,2,64,96,236,243,1,128,65,194,217,1,85,32,224,
-29,2,224,71,10,224,59,4,96,31,160,129,103,214,224,28,0,224,109,2,
-224,36,1,233,54,7,65,74,0,53,238,93,1,0,58,128,7,136,244,226,
-40,2,66,191,64,27,203,51,229,119,8,229,74,0,134,129,64,79,97,62,
-96,210,229,10,5,230,29,1,64,81,233,98,0,119,29,96,39,66,218,161,
-99,229,154,1,228,69,0,128,230,224,70,1,128,135,224,86,2,192,148,160,
-154,64,100,0,54,224,182,3,128,90,197,39,237,55,3,197,34,250,0,4,
-128,23,161,15,252,131,3,0,85,174,75,231,255,2,238,138,19,224,37,10,
-132,232,96,36,195,160,97,58,0,48,136,252,98,79,137,112,161,56,0,49,
-170,209,64,211,136,230,2,95,55,52,239,151,10,96,38,239,171,11,224,19,
-7,224,39,11,142,112,224,239,11,2,95,55,52,127,30,0,48,131,25,67,
-65,192,18,235,106,0,224,57,7,64,184,111,225,2,50,49,50,229,138,2,
-12,103,101,116,83,76,111,99,32,69,85,86,97,114,199,224,64,39,0,83,
-163,65,224,88,5,99,164,192,125,159,228,170,4,192,117,224,195,5,66,222,
-224,137,7,67,9,224,195,2,96,69,192,182,96,161,224,202,7,224,223,12,
-225,46,7,118,9,224,19,7,67,74,224,126,7,132,154,192,81,0,55,202,
-196,224,145,1,192,98,224,56,6,67,115,224,183,6,224,60,2,224,161,11,
-225,12,6,178,111,224,84,5,65,193,224,122,8,224,78,12,224,37,2,228,
-52,0,224,239,6,225,2,11,64,238,224,19,7,225,149,10,109,17,64,119,
-224,121,12,225,45,8,224,62,8,66,212,224,182,11,0,85,114,106,226,72,
-3,161,240,131,152,224,86,7,225,51,7,64,23,224,106,6,65,211,225,11,
-2,133,126,225,189,9,226,97,15,225,13,8,64,64,224,18,6,225,168,10,
-129,167,226,252,8,213,34,227,130,27,64,22,179,242,243,249,0,226,34,7,
-226,175,10,225,88,16,226,35,18,225,80,2,100,163,138,218,228,163,13,64,
-255,224,134,6,64,78,224,134,6,132,62,226,30,22,224,20,23,224,237,31,
-224,56,6,227,14,22,225,223,7,64,240,0,51,224,240,3,225,181,7,98,
-172,160,40,136,157,225,25,0,228,243,29,248,47,1,64,66,136,211,96,66,
-136,199,224,62,5,224,13,13,226,63,4,64,69,168,214,128,69,103,18,65,
-43,110,118,225,135,7,224,25,13,182,148,231,33,6,100,116,227,192,12,231,
-4,7,96,63,229,127,3,228,225,4,224,49,11,96,139,225,94,7,224,49,
-3,224,141,8,131,2,226,25,11,224,91,7,99,214,224,183,11,95,190,230,
-193,4,2,72,97,115,102,192,17,68,101,102,58,32,117,110,105,109,112,108,
-101,109,101,110,116,101,100,134,206,0,58,129,102,226,14,9,192,83,64,32,
-201,79,96,34,113,94,1,95,52,102,217,137,172,64,47,160,41,137,39,225,
-237,0,0,75,224,78,8,224,15,9,224,196,8,64,71,0,54,128,71,152,
-87,0,51,130,13,168,92,93,224,0,95,78,143,192,19,64,47,168,102,4,
-54,32,95,56,51,73,84,0,56,89,158,64,24,238,182,1,97,24,137,39,
-121,32,225,35,1,11,105,109,112,111,115,115,105,98,108,101,58,32,129,21,
-130,58,153,71,160,49,0,49,128,132,102,92,97,9,189,117,186,168,224,86,
-0,4,79,32,35,51,50,241,115,1,96,56,96,40,239,79,0,64,150,163,
-129,224,223,4,131,221,204,204,249,197,1,64,29,0,50,66,16,189,251,224,
-107,4,77,145,128,89,138,219,224,53,4,129,151,224,44,1,1,53,56,160,
-44,224,31,4,64,0,225,80,0,64,132,64,160,131,249,0,80,76,150,90,
-27,115,3,227,119,17,98,168,234,127,15,89,55,193,219,226,201,8,96,57,
-185,130,227,125,17,100,146,161,27,224,226,1,122,222,240,171,5,238,168,4,
-64,187,132,56,66,139,172,93,93,153,1,48,48,233,232,7,7,99,111,110,
-65,114,105,116,121,169,227,83,204,1,52,57,237,19,5,128,132,129,199,0,
-58,155,255,131,20,0,48,76,50,84,247,64,6,103,47,130,61,0,56,250,
-176,2,172,88,0,57,64,150,1,95,50,121,35,162,86,224,35,1,1,95,
-52,67,93,128,92,131,113,102,17,69,114,140,86,80,128,237,23,1,247,36,
-0,87,151,65,9,108,252,121,127,108,170,224,153,3,225,181,1,64,17,100,
-245,96,126,224,186,4,98,12,237,33,0,252,180,3,156,6,188,141,64,31,
-224,185,6,249,23,5,112,69,64,137,0,54,130,228,225,31,7,225,27,6,
-225,24,0,1,95,50,104,174,224,91,5,216,80,64,79,131,228,96,47,1,
-56,57,76,140,0,80,140,219,64,27,167,195,96,25,0,83,76,142,192,132,
-195,105,96,81,0,49,237,226,0,64,64,212,53,96,153,0,56,129,147,192,
-9,225,178,0,224,40,13,0,90,224,40,2,2,95,50,51,224,93,0,96,
-114,167,53,66,210,1,48,57,124,244,160,71,142,0,128,23,129,194,67,133,
-128,56,0,95,190,145,96,11,1,50,48,224,80,4,167,67,0,51,161,121,
-128,147,208,141,224,187,1,150,39,0,95,128,71,66,17,64,59,131,0,2,
-73,32,58,128,54,129,64,82,211,99,109,160,60,64,28,130,114,128,40,165,
-198,78,235,145,62,1,49,48,208,208,81,45,64,34,161,220,241,87,3,82,
-90,99,137,64,31,165,145,224,31,4,0,57,224,31,2,197,152,0,89,98,
-16,214,65,65,100,66,234,65,51,0,56,98,20,64,5,3,95,49,48,55,
-162,92,132,96,224,5,1,224,21,10,225,189,0,129,179,96,78,132,158,192,
-103,96,39,131,18,224,42,4,180,145,192,16,208,89,232,4,5,224,33,3,
-242,224,0,224,16,16,224,67,8,233,28,0,224,50,17,252,137,1,97,226,
-160,65,224,168,2,252,171,0,224,17,0,97,34,164,171,225,12,0,187,95,
-192,38,111,165,227,192,2,0,48,148,200,180,182,64,42,66,66,2,95,56,
-57,70,107,228,91,1,96,37,165,96,252,237,0,160,125,228,45,0,160,167,
-96,29,224,182,2,224,17,11,134,33,224,136,1,128,154,96,16,224,39,6,
-225,223,1,225,10,19,128,80,64,168,230,205,0,224,71,9,225,10,0,224,
-118,5,116,30,135,211,224,207,1,244,73,1,0,79,99,93,3,55,55,32,
-79,96,95,199,61,224,99,5,130,74,160,93,160,147,182,192,193,103,67,158,
-224,132,1,226,218,13,204,242,160,226,88,249,0,67,160,40,224,109,0,64,
-61,194,196,160,87,128,21,128,74,224,79,2,225,197,5,128,92,224,78,1,
-193,205,224,21,5,96,51,96,195,133,116,67,236,251,22,4,0,104,246,151,
-1,96,42,224,40,16,1,118,115,249,12,1,226,109,0,155,219,160,14,0,
-56,135,88,97,44,64,62,233,103,0,1,56,53,64,139,65,2,248,135,10,
-226,218,2,224,75,1,98,251,0,56,198,135,134,125,224,26,3,162,22,130,
-98,68,121,134,17,128,33,1,80,32,143,219,161,185,0,32,83,151,128,37,
-133,196,192,35,64,34,0,80,132,248,133,140,129,128,69,106,244,169,2,158,
-238,128,51,96,182,130,81,194,7,231,118,0,92,110,128,228,233,174,10,64,
-0,1,95,52,72,125,2,52,53,54,200,251,64,120,133,201,3,66,32,95,
-51,69,124,64,7,64,81,65,228,66,95,0,58,96,142,101,115,2,49,48,
-54,101,178,0,54,66,184,0,80,96,9,0,57,64,40,0,57,86,46,107,
-61,1,56,49,150,132,1,64,64,160,32,1,55,48,224,32,9,129,82,96,
-199,224,66,0,102,52,64,106,168,160,155,51,86,131,129,200,0,55,148,19,
-0,79,70,235,160,45,64,64,224,56,2,134,90,74,88,96,54,225,99,1,
-98,169,129,99,65,178,181,110,224,82,22,64,44,134,73,128,81,225,219,1,
-0,80,87,84,224,81,1,167,147,225,26,76,128,33,224,225,0,206,241,103,
-196,136,26,3,54,56,32,64,235,127,3,64,38,206,210,224,38,6,227,70,
-1,1,91,93,190,133,96,163,1,10,65,227,97,2,4,68,97,116,97,46,
-92,129,6,95,84,121,112,101,46,34,96,227,64,61,226,216,0,117,169,224,
-10,6,194,222,96,44,129,135,97,39,171,167,96,22,129,146,64,139,0,52,
-65,80,0,54,201,115,72,104,72,9,96,36,169,108,97,73,0,49,65,24,
-255,62,5,0,102,191,85,66,167,153,9,106,59,224,38,14,96,81,193,183,
-0,67,106,161,67,82,0,50,85,147,1,95,50,128,10,225,23,4,1,40,
-41,128,56,65,157,64,138,66,132,203,26,2,49,50,57,76,84,136,171,64,
-28,101,41,64,197,66,76,67,175,102,206,250,241,1,96,168,64,32,129,244,
-1,95,54,65,190,64,145,162,48,73,41,1,55,54,134,97,151,249,1,95,
-50,88,173,1,95,56,100,207,192,14,99,6,1,52,55,64,23,67,180,128,
-85,100,242,64,75,205,64,68,3,227,70,0,64,24,130,3,247,24,95,196,
-132,64,170,0,56,205,36,208,72,128,154,64,0,224,60,7,145,35,77,197,
-215,80,0,75,205,137,132,135,132,195,3,50,48,53,32,243,185,0,224,78,
-2,242,216,8,246,246,19,1,49,48,68,248,224,60,0,128,118,224,74,0,
-238,1,0,0,54,96,196,96,22,224,105,3,246,244,53,224,91,5,224,90,
-4,224,254,3,224,61,7,182,249,225,31,3,224,165,12,1,52,57,177,18,
-192,19,225,142,0,0,52,137,185,238,187,4,225,58,13,247,36,19,192,172,
-225,205,6,128,25,160,186,247,18,73,201,49,224,237,4,208,139,225,166,13,
-225,105,20,224,102,8,66,246,66,186,67,191,225,154,13,224,77,2,1,56,
-56,73,1,224,38,1,161,119,64,13,225,84,0,247,67,31,0,83,78,92,
-233,142,0,112,254,235,192,1,64,81,186,109,226,178,6,225,114,0,192,158,
-224,32,9,247,98,50,225,57,4,160,86,104,191,225,16,14,226,126,4,64,
-13,241,98,0,224,93,5,65,29,177,133,227,228,1,224,53,1,197,41,246,
-163,32,224,130,15,225,251,21,224,57,16,226,204,5,160,44,0,58,128,23,
-101,64,224,53,5,143,79,130,245,64,37,135,24,247,219,52,226,231,58,224,
-30,37,248,13,32,192,50,225,247,21,194,254,226,143,10,65,33,136,13,226,
-95,13,227,72,6,98,110,64,51,0,54,224,51,18,140,80,160,99,64,44,
-169,209,1,32,80,225,170,14,224,253,3,224,107,5,64,61,136,112,247,249,
-77,226,80,0,195,235,247,243,8,227,21,1,224,36,10,96,60,128,72,118,
-45,64,0,247,217,14,224,249,17,224,88,11,183,227,227,47,11,227,149,7,
-96,26,244,246,2,97,56,225,155,16,96,165,64,8,195,30,235,27,0,1,
-53,57,73,243,64,32,1,10,65,255,12,9,247,38,1,202,151,86,144,209,
-196,64,103,0,80,193,40,236,247,0,64,121,128,43,0,52,131,170,0,75,
-167,4,72,39,96,3,64,196,64,30,131,163,101,116,0,90,239,68,0,2,
-95,50,51,71,32,0,53,173,58,224,17,0,233,238,4,0,64,107,87,128,
-116,224,31,13,135,81,224,61,8,0,54,129,131,2,55,49,56,224,229,2,
-171,117,224,45,30,202,139,224,36,20,1,45,62,239,14,1,97,135,97,20,
-64,244,195,118,133,107,64,228,64,21,0,54,96,21,3,104,101,97,100,96,
-63,64,18,131,62,115,156,64,204,236,227,1,98,61,140,227,0,52,225,244,
-3,247,58,4,171,10,94,109,134,203,224,32,14,0,64,114,139,211,9,64,
-97,224,41,4,70,249,192,41,96,29,82,184,96,37,147,102,161,173,2,49,
-48,52,249,93,3,160,253,224,22,7,10,80,114,105,109,105,116,105,118,101,
-115,46,193,31,224,91,4,139,181,0,64,210,180,192,0,64,231,207,154,0,
-85,130,42,225,121,8,160,38,130,198,99,191,1,75,52,138,152,64,22,130,
-179,138,194,86,181,0,56,234,195,0,236,155,2,4,115,117,112,101,114,160,
-183,239,155,3,3,58,49,48,51,130,200,150,242,236,152,4,1,36,67,64,
-49,64,34,130,204,66,235,0,66,64,163,225,118,2,1,95,55,99,33,3,
-95,49,48,51,164,82,64,47,130,7,4,98,115,43,43,46,65,226,64,26,
-132,239,0,39,130,244,1,49,48,85,137,0,54,76,72,64,172,76,145,88,
-162,1,50,55,248,12,9,75,134,181,220,113,10,109,255,116,82,64,76,0,
-80,64,142,0,90,96,83,1,55,52,77,146,141,42,0,55,251,128,1,225,
-11,8,20,100,117,112,108,105,99,97,116,101,32,100,101,102,105,110,105,116,
-105,111,110,32,129,26,0,54,77,70,192,0,249,81,7,6,104,101,99,107,
-68,117,112,196,43,66,26,144,190,173,82,0,95,96,195,2,49,51,56,89,
-144,96,194,239,99,5,133,76,109,169,130,62,77,103,64,72,130,255,64,194,
-172,126,0,48,145,67,183,21,64,15,0,50,68,52,177,21,64,54,224,47,
-3,164,171,1,83,32,71,10,186,114,64,16,245,32,5,79,52,224,7,1,
-195,16,228,231,2,128,57,96,73,117,142,242,171,2,100,136,101,0,160,88,
-198,99,224,64,0,96,8,224,61,0,70,211,192,14,192,115,224,13,11,247,
-39,2,150,50,224,48,19,180,159,227,199,0,64,2,128,153,128,108,160,46,
-214,159,84,111,232,208,0,165,188,192,113,192,43,182,41,197,156,64,74,210,
-197,233,148,0,192,62,192,18,181,217,3,95,49,55,51,226,28,2,15,92,
-51,52,38,115,114,99,47,77,105,99,114,111,72,115,47,80,202,2,46,104,
-115,64,22,4,44,51,51,58,53,229,47,2,224,0,5,225,130,21,114,37,
-225,136,0,129,140,128,171,136,25,128,173,160,14,160,189,224,236,1,160,178,
-64,231,85,104,244,124,4,224,39,10,64,15,244,163,10,66,113,196,160,66,
-138,114,27,79,148,64,24,212,59,224,196,10,128,167,130,51,166,252,224,103,
-1,128,10,207,93,98,141,0,85,254,121,1,1,95,53,110,233,128,123,132,
-222,103,71,245,42,1,226,57,2,129,42,1,75,32,183,203,194,48,247,195,
-5,160,47,64,5,0,67,224,50,8,224,51,0,192,7,162,14,128,9,128,
-2,161,108,192,83,248,8,4,161,70,224,23,8,224,17,17,193,173,226,227,
-1,162,140,224,123,0,224,119,4,224,61,8,224,64,2,224,65,2,97,14,
-224,46,14,160,93,131,15,248,16,0,65,15,194,58,96,23,105,173,228,195,
-2,249,221,1,225,67,3,224,2,5,230,207,0,224,137,3,221,153,239,250,
-1,128,132,194,11,163,185,224,5,15,70,138,150,198,225,35,5,137,253,128,
-87,226,48,0,227,207,1,225,108,14,100,155,227,88,0,226,8,0,227,69,
-3,224,44,1,129,67,227,83,0,224,83,0,160,98,102,196,227,32,0,227,
-124,2,224,72,14,225,129,5,224,31,4,129,193,128,87,100,255,164,138,158,
-125,132,128,98,161,128,4,192,33,196,206,64,62,228,237,0,65,22,116,153,
-109,16,131,131,230,15,2,224,57,9,228,213,0,176,247,224,42,1,195,251,
-225,118,1,128,221,96,248,101,110,64,162,224,18,1,64,14,0,85,93,86,
-224,170,1,224,175,0,251,95,1,224,243,0,224,8,0,226,172,18,224,28,
-1,224,29,41,224,189,8,117,132,195,45,227,0,0,160,138,225,225,3,224,
-51,0,194,68,227,42,0,64,35,149,46,235,24,2,192,218,160,29,107,158,
-0,53,232,192,0,120,243,237,100,0,160,156,64,175,3,64,95,50,57,132,
-221,225,44,6,121,231,215,119,168,236,176,184,128,67,1,95,52,153,250,96,
-160,128,80,66,217,129,215,193,81,225,35,5,229,5,5,128,219,226,192,3,
-225,4,0,226,189,91,226,172,3,240,13,0,129,56,74,235,248,180,13,133,
-136,132,78,224,41,21,4,64,95,53,53,57,164,183,129,60,96,4,227,15,
-13,0,90,233,45,3,129,11,226,233,31,0,75,160,112,226,234,13,225,49,
-15,224,13,4,101,50,226,137,0,161,205,237,153,3,96,75,160,215,64,151,
-138,53,96,9,2,52,53,51,206,149,66,18,74,232,226,144,6,64,138,224,
-162,0,160,8,225,36,1,225,2,0,165,63,194,95,0,89,161,245,161,222,
-199,183,96,150,131,64,64,39,128,229,132,76,135,70,160,63,164,77,103,213,
-197,151,64,24,106,131,224,116,1,64,237,69,220,107,165,107,218,132,55,0,
-64,153,82,131,95,108,134,2,79,32,35,77,61,128,156,225,164,0,64,5,
-2,58,49,48,79,6,108,80,236,135,7,192,95,67,97,237,59,2,64,80,
-174,99,1,95,55,104,92,64,36,136,196,64,43,144,46,1,50,53,76,172,
-64,22,172,188,96,14,139,231,249,252,2,64,20,235,179,0,0,66,134,172,
-0,50,229,131,2,2,95,57,56,64,215,5,56,54,32,79,32,35,75,196,
-192,195,197,109,64,64,0,51,224,116,0,0,49,96,101,137,98,130,127,231,
-148,0,64,48,142,52,170,158,96,25,226,39,6,237,42,0,230,135,1,227,
-165,1,129,154,224,13,10,196,56,163,200,231,60,0,98,142,226,81,6,227,
-198,8,201,123,227,21,0,173,195,229,29,8,64,155,65,131,254,195,0,169,
-154,128,2,99,6,65,2,0,48,129,61,236,163,6,0,39,198,210,193,55,
-160,0,96,76,160,54,65,58,202,132,140,132,224,237,5,231,158,10,228,129,
-0,163,242,74,89,225,0,7,229,229,9,228,189,2,160,149,255,151,4,234,
-99,5,204,76,224,68,5,232,44,0,171,4,233,123,3,0,67,80,108,73,
-117,128,43,193,55,195,86,255,211,3,128,220,64,70,224,24,1,228,75,0,
-192,255,193,31,227,94,0,160,169,2,95,50,56,110,135,225,37,0,237,183,
-0,64,1,191,229,224,30,2,96,242,224,32,1,201,10,224,190,3,97,89,
-231,37,0,124,61,224,208,13,180,24,129,106,224,59,45,224,56,11,97,173,
-240,58,2,228,101,1,205,195,65,179,93,171,208,11,2,79,32,35,71,130,
-96,235,241,14,5,103,181,0,57,69,100,0,54,217,25,128,0,196,119,140,
-141,69,17,0,80,141,86,64,24,129,13,188,54,160,172,224,180,0,229,24,
-1,224,18,0,83,29,101,16,0,58,128,17,224,81,25,64,44,226,19,8,
-64,183,226,95,2,224,31,0,224,94,4,228,248,1,200,43,65,230,229,144,
-0,226,77,0,230,160,1,131,220,162,153,224,190,2,162,241,64,84,165,49,
-65,83,65,75,0,53,128,180,64,25,0,54,224,205,2,64,135,123,125,118,
-112,97,219,224,10,4,192,30,64,55,215,78,1,95,50,82,24,229,39,1,
-75,232,96,191,0,90,64,149,96,4,132,31,223,247,64,40,190,215,0,57,
-69,107,64,59,158,241,91,228,110,57,102,191,67,229,225,89,2,159,197,128,
-43,224,7,0,96,8,96,176,128,64,238,221,2,228,82,1,225,46,1,128,
-74,143,167,135,195,0,83,229,58,5,64,103,0,57,65,193,163,132,2,95,
-57,57,96,249,228,74,2,2,49,48,48,66,18,97,89,128,79,224,132,0,
-1,64,90,160,62,128,231,194,121,164,91,1,95,57,69,111,247,150,0,101,
-142,1,95,57,73,19,164,202,64,96,1,67,32,128,38,251,143,2,128,35,
-233,126,1,2,57,55,55,128,39,0,57,98,154,160,136,128,101,245,52,0,
-224,70,0,224,40,1,129,69,96,158,165,15,99,61,2,49,48,48,98,88,
-128,234,0,58,128,222,230,216,3,64,74,165,211,0,48,65,12,202,161,224,
-107,9,192,33,64,7,178,250,64,91,129,210,224,245,11,192,179,96,66,215,
-33,226,221,2,130,252,224,248,1,131,1,196,204,165,254,233,251,0,99,126,
-66,36,1,57,55,99,207,97,40,99,50,64,247,66,110,66,247,195,67,170,
-246,0,48,225,8,3,136,94,64,187,66,160,96,51,1,49,48,67,73,64,
-21,0,54,160,21,232,42,2,0,54,196,147,64,31,168,117,3,49,48,48,
-48,224,37,2,242,113,1,1,67,39,146,83,64,43,168,140,225,21,31,224,
-241,1,192,22,228,11,1,192,199,217,249,224,182,0,66,192,64,107,163,110,
-232,226,4,0,51,224,183,2,249,123,0,224,183,14,0,83,224,183,2,231,
-184,1,231,84,0,128,112,96,29,209,248,224,213,10,230,158,1,160,207,64,
-30,225,183,9,96,214,134,90,192,18,118,171,1,57,57,129,166,224,197,4,
-65,229,166,253,64,33,3,56,32,64,58,98,234,226,188,2,163,225,128,131,
-130,71,232,69,0,227,93,3,224,160,7,224,153,0,226,87,10,229,234,1,
-226,107,9,194,98,226,158,2,224,75,15,0,56,230,25,0,224,255,6,195,
-77,128,78,0,55,96,213,131,69,228,3,6,162,212,226,143,3,0,54,225,
-17,1,0,73,96,56,130,202,225,174,2,171,16,97,179,226,22,8,0,48,
-194,22,96,198,96,30,1,55,53,224,25,3,0,58,97,136,224,55,7,0,
-55,226,78,0,100,67,229,253,6,0,90,182,43,0,58,101,83,128,59,75,
-114,0,57,74,12,100,143,224,79,8,166,158,64,30,229,68,0,163,12,152,
-80,97,91,129,96,226,110,2,226,51,6,97,146,224,36,17,225,107,2,224,
-36,17,225,220,2,224,73,24,64,6,224,73,24,64,6,224,36,16,110,51,
-224,73,23,106,14,224,184,23,160,36,0,56,68,4,224,36,24,165,213,229,
-238,6,1,57,56,64,245,139,35,226,195,0,226,189,4,225,105,0,96,41,
-96,8,228,61,8,1,75,52,215,73,224,29,12,0,51,224,29,20,0,50,
-224,29,19,2,67,39,66,224,30,9,66,171,0,50,228,22,3,224,55,9,
-0,66,164,207,224,54,7,194,116,224,24,7,66,130,224,24,12,0,54,224,
-49,5,129,224,96,6,0,58,96,6,227,63,3,164,170,0,58,97,56,229,
-36,8,132,166,239,181,8,143,186,67,188,156,230,230,24,1,189,14,129,118,
-224,32,5,237,10,1,0,50,79,8,1,95,50,128,10,143,159,227,89,0,
-168,51,224,122,11,192,101,128,76,247,121,5,96,4,192,111,206,86,224,147,
-19,128,35,0,80,96,71,224,44,3,179,125,80,21,96,148,232,195,1,197,
-158,108,16,224,198,0,160,181,224,35,21,3,79,32,35,53,225,172,1,167,
-50,128,154,224,38,7,0,49,224,38,0,240,0,6,226,185,11,224,35,18,
-226,191,0,224,35,18,226,197,0,160,0,242,129,1,224,55,0,66,24,197,
-170,1,80,32,97,67,0,85,96,20,0,54,96,20,93,48,82,255,101,18,
-66,168,229,98,1,239,131,5,139,99,96,81,194,125,224,172,7,0,58,99,
-239,224,29,10,96,166,0,58,100,50,226,185,2,194,253,0,58,100,45,224,
-54,9,136,213,0,58,100,186,224,54,2,201,25,0,58,100,241,224,24,3,
-166,162,0,58,100,229,224,24,2,198,68,0,58,101,109,224,24,3,204,172,
-100,109,96,249,236,173,1,108,152,236,173,13,0,64,98,129,130,113,226,157,
-4,192,32,96,31,226,24,3,97,59,64,110,237,16,3,1,57,55,65,174,
-1,95,57,64,159,96,94,128,16,77,12,128,9,0,58,101,47,5,10,65,
-32,79,32,58,96,37,127,119,0,58,96,28,242,241,1,192,1,157,26,165,
-80,160,2,96,18,2,95,57,55,108,67,2,58,57,55,233,101,3,64,1,
-128,32,224,68,0,207,210,224,11,0,192,8,153,215,0,58,96,72,190,111,
-77,156,1,64,95,65,131,67,3,71,157,245,128,2,2,58,57,54,243,149,
-2,241,13,2,224,107,1,224,178,2,224,19,20,99,108,0,39,85,162,232,
-188,0,224,47,4,95,116,1,56,51,85,21,111,86,0,54,129,161,64,0,
-225,9,2,240,184,5,99,234,128,53,0,57,66,53,224,53,3,160,110,224,
-2,0,128,38,0,54,67,26,224,38,2,160,72,224,85,1,0,67,64,158,
-139,58,1,95,57,66,162,160,128,243,10,0,240,148,5,96,0,1,58,57,
-64,49,225,143,0,96,248,192,86,65,112,0,58,96,72,66,175,8,54,56,
-52,32,75,32,85,32,90,192,193,224,42,3,96,5,1,95,54,93,152,224,
-87,0,0,54,160,55,2,32,95,53,67,232,181,93,85,67,64,29,130,135,
-0,85,171,250,176,89,0,54,182,86,96,14,227,133,1,2,32,61,32,100,
-100,145,27,0,57,161,1,0,58,96,75,64,98,2,49,49,56,64,50,224,
-27,0,64,115,2,56,51,56,71,201,0,54,98,222,1,49,50,68,188,96,
-27,0,58,96,6,227,2,0,3,95,56,52,57,130,192,1,95,56,69,54,
-202,178,1,56,52,106,130,128,62,128,6,128,237,224,38,10,65,98,0,56,
-69,154,96,29,0,48,64,21,0,56,100,92,231,170,0,128,101,64,6,96,
-24,89,135,229,159,0,224,91,0,96,29,2,64,95,56,111,155,0,58,96,
-23,5,10,65,32,114,110,102,98,207,2,58,57,54,195,56,1,95,57,67,
-207,227,255,0,224,2,3,98,99,226,154,2,2,95,50,52,161,146,226,136,
-15,224,33,0,224,29,3,224,26,5,192,22,224,19,2,160,254,96,12,1,
-95,57,97,93,129,251,160,12,68,117,2,57,51,51,65,96,96,24,224,12,
-1,105,95,71,24,192,0,224,49,3,0,53,130,189,224,19,5,162,200,160,
-19,89,82,160,24,243,78,0,96,26,130,17,132,27,193,35,135,77,70,116,
-203,88,224,182,14,224,66,0,207,254,225,78,23,224,39,2,225,78,58,96,
-175,97,25,0,53,97,25,192,255,129,38,224,169,13,224,51,7,1,64,58,
-96,8,102,90,1,50,53,99,89,225,182,40,84,101,225,126,14,0,58,97,
-156,224,93,3,224,74,28,0,58,96,64,224,54,20,129,199,224,12,4,64,
-54,0,54,224,54,3,242,46,0,5,67,32,60,32,64,35,127,198,224,19,
-6,87,118,224,19,8,224,39,11,108,89,165,128,192,19,136,146,192,199,128,
-131,224,172,32,224,78,9,64,23,224,78,0,161,197,225,144,32,146,108,225,
-130,2,0,51,227,1,6,226,247,0,239,49,0,160,118,96,81,224,138,6,
-68,243,224,138,1,227,55,3,225,195,13,224,125,3,224,105,0,225,10,34,
-225,110,7,122,220,224,19,7,110,38,224,168,6,69,249,224,146,13,226,86,
-4,224,188,0,224,16,6,224,78,6,118,121,224,247,5,198,156,224,204,25,
-128,46,164,139,225,103,9,187,2,224,111,5,65,55,224,148,7,225,54,34,
-224,58,0,220,152,225,52,8,225,71,11,65,51,224,19,7,226,4,10,118,
-188,64,140,226,127,27,224,159,11,225,124,8,225,166,31,224,137,8,67,164,
-225,22,25,225,170,20,0,51,70,1,229,12,3,161,176,71,138,160,0,225,
-176,6,112,112,224,136,5,66,129,225,115,1,195,161,224,231,8,224,95,3,
-226,226,16,65,93,224,18,6,226,33,10,130,32,224,207,10,128,188,229,121,
-4,225,104,20,226,170,10,135,91,64,24,226,64,3,224,130,8,69,13,225,
-82,13,107,48,192,95,148,140,224,41,26,128,185,250,149,1,227,39,7,227,
-229,10,225,254,28,232,61,9,225,123,1,227,84,44,234,151,1,70,89,211,
-252,230,89,11,64,58,224,18,6,130,61,224,18,4,228,191,10,99,139,226,
-48,5,80,149,224,177,16,224,33,3,192,183,193,73,224,70,13,224,132,7,
-230,199,10,230,198,4,224,131,6,224,82,12,224,22,14,231,51,8,225,2,
-9,66,244,226,94,12,192,80,128,75,227,83,1,183,193,224,16,1,161,147,
-225,71,7,229,71,4,139,233,224,84,1,234,55,0,0,58,98,166,193,198,
-125,172,65,92,209,10,0,52,102,78,238,12,2,73,255,0,58,96,79,192,
-51,1,95,57,77,13,128,134,0,58,96,6,224,77,16,2,55,55,56,192,
-82,0,64,110,102,3,95,53,54,54,66,157,0,52,118,168,0,52,163,20,
-224,109,1,192,110,208,83,128,110,226,155,0,0,58,97,234,226,131,16,129,
-90,224,18,4,120,100,225,40,5,64,72,66,89,229,211,83,227,86,15,224,
-42,32,228,17,31,224,55,5,224,96,25,229,240,6,229,168,15,0,58,101,
-218,234,125,20,228,107,3,224,85,1,224,68,2,224,113,4,175,253,0,58,
-101,101,226,47,0,95,41,225,17,28,224,202,17,203,45,64,125,226,24,16,
-67,82,231,238,11,224,19,7,226,45,10,104,179,225,0,12,233,94,45,232,
-81,35,229,201,4,129,111,193,185,224,101,5,192,47,237,226,0,230,91,1,
-224,186,13,232,9,14,226,0,1,233,49,12,232,147,45,226,0,4,192,251,
-128,254,239,47,44,224,169,3,225,40,25,224,53,4,226,174,3,96,254,224,
-11,3,224,46,9,224,180,0,233,4,13,225,177,18,239,172,4,224,129,4,
-192,105,161,7,226,3,25,225,211,0,198,100,192,24,225,190,4,225,185,17,
-237,201,10,231,0,23,0,52,198,61,226,245,31,229,98,15,228,52,14,224,
-185,12,224,47,12,227,253,10,224,226,10,97,58,224,129,5,195,102,224,191,
-21,227,43,5,224,47,13,227,131,31,231,144,14,227,233,63,0,52,226,240,
-4,227,173,5,224,101,65,129,16,160,87,224,107,12,64,0,0,58,99,25,
-241,48,6,227,209,55,160,138,224,116,11,225,186,4,225,16,0,0,52,227,
-203,2,160,216,85,45,228,26,2,224,26,3,96,109,224,39,11,224,211,1,
-217,64,96,213,186,225,210,44,1,85,32,116,119,224,14,1,0,65,96,60,
-0,58,64,134,225,9,10,161,12,242,221,54,225,42,10,0,52,106,13,193,
-16,236,251,4,225,30,5,229,226,3,224,19,5,225,3,3,129,239,160,37,
-128,207,233,233,2,231,159,14,227,66,9,224,122,6,224,31,3,128,12,0,
-58,96,100,234,65,6,96,203,0,58,96,6,232,105,25,229,240,5,173,171,
-0,58,99,188,245,219,4,148,177,96,38,64,31,1,51,57,224,206,24,228,
-147,16,224,31,10,138,158,80,225,224,177,20,229,36,11,0,58,98,225,225,
-2,6,97,193,0,58,96,6,224,165,5,227,54,33,227,211,4,203,230,224,
-135,4,224,200,11,225,214,35,246,199,44,245,129,5,239,103,3,227,119,0,
-0,58,116,48,225,17,7,161,183,131,86,247,179,4,222,129,224,134,2,227,
-158,6,227,159,8,64,73,226,208,2,225,172,13,239,153,3,89,77,128,54,
-226,175,9,96,27,0,58,96,6,227,241,6,225,170,29,238,180,5,225,33,
-5,160,13,0,58,96,141,224,119,6,96,27,0,58,96,6,224,25,7,64,
-81,0,58,96,6,0,10,92,93,0,67,160,117,130,166,85,156,227,27,10,
-225,70,10,129,52,247,25,2,117,235,96,67,0,54,96,67,2,85,32,58,
-96,67,96,10,0,73,89,84,64,39,186,253,250,116,6,7,84,109,111,100,
-117,108,101,32,158,222,0,66,71,17,154,165,123,236,0,48,92,119,0,48,
-183,136,160,59,1,79,32,106,95,255,203,0,78,71,96,49,0,64,124,129,
-1,95,57,117,160,224,37,4,64,129,129,216,3,85,32,75,52,97,237,0,
-58,96,38,122,160,155,247,0,55,252,30,2,1,58,57,86,230,65,62,2,
-55,57,50,64,204,196,55,2,66,32,89,129,19,65,17,64,5,0,80,71,
-191,0,95,74,219,1,95,49,164,102,225,49,3,96,8,64,41,0,95,98,
-54,216,206,224,20,3,97,255,64,194,64,193,1,95,49,92,218,128,177,85,
-190,1,10,65,67,223,67,14,96,93,160,99,160,6,96,238,160,62,64,65,
-0,57,117,141,227,127,4,230,91,9,157,247,130,116,224,38,0,92,130,192,
-122,224,130,0,224,8,0,0,58,96,88,96,138,1,95,49,129,84,190,253,
-1,58,57,86,119,65,39,252,27,2,181,163,156,192,225,237,6,225,236,4,
-162,249,252,147,20,14,40,46,46,46,41,32,119,104,101,114,101,92,49,48,
-38,156,159,0,57,109,102,128,163,99,15,96,114,0,58,96,6,64,140,252,
-151,1,77,163,0,58,96,46,130,218,0,56,71,128,125,34,2,83,32,83,
-190,175,64,2,167,95,234,39,4,136,97,225,67,1,255,254,4,64,24,3,
-85,32,64,90,64,124,138,255,224,41,11,128,166,160,41,224,43,3,97,165,
-1,95,56,94,20,128,20,3,95,56,52,56,164,149,64,176,131,46,238,153,
-81,253,80,1,64,8,160,16,96,131,225,122,1,6,100,101,102,97,117,108,
-116,129,171,253,90,3,224,34,1,1,58,58,128,29,3,64,95,57,48,139,
-23,0,85,192,93,224,76,8,14,114,105,118,105,110,103,32,105,110,115,116,
-97,110,99,101,160,86,192,55,238,249,14,163,105,130,165,191,55,226,223,2,
-0,39,164,151,96,197,194,79,224,219,27,6,112,97,116,116,101,114,110,224,
-132,0,99,123,64,34,2,79,32,35,94,0,222,54,1,56,57,133,105,96,
-78,1,56,52,64,70,64,152,68,155,4,32,95,56,55,49,254,132,0,92,
-19,160,52,96,28,68,20,67,62,196,21,2,95,57,48,167,30,129,37,224,
-171,3,225,126,28,224,124,0,161,137,96,103,127,36,96,7,127,93,2,95,
-56,54,96,37,224,70,3,0,44,163,108,98,244,225,110,1,96,0,239,181,
-33,64,91,0,55,160,107,224,170,9,225,211,15,64,55,128,230,64,59,232,
-25,6,225,179,9,224,92,13,4,99,108,97,115,115,224,89,0,99,63,161,
-176,64,7,183,68,239,114,14,130,60,166,35,224,112,14,0,56,96,7,228,
-117,5,4,105,110,102,105,120,96,115,101,123,0,50,71,144,0,50,71,55,
-102,85,0,56,161,234,224,23,6,67,117,130,2,224,24,2,162,19,224,106,
-0,3,95,49,49,55,69,204,164,192,225,187,35,193,247,129,89,225,75,12,
-224,231,19,225,88,8,19,102,111,114,101,105,103,110,32,105,109,112,111,114,
-116,32,99,99,97,108,108,226,109,9,66,231,224,184,2,72,77,0,49,247,
-65,0,228,22,32,240,104,53,160,237,230,205,10,1,95,56,160,139,224,29,
-3,224,26,5,226,116,44,129,19,166,166,0,32,64,1,150,162,0,57,103,
-18,2,95,57,48,64,171,164,12,224,58,6,13,123,45,35,32,83,79,85,
-82,67,69,32,35,45,125,161,8,1,64,80,193,79,224,44,5,8,113,117,
-97,108,105,102,105,101,100,192,39,193,229,226,47,0,65,138,0,75,129,135,
-226,163,5,2,32,97,115,130,30,1,95,54,131,93,224,101,2,228,95,1,
-65,3,192,75,0,80,64,72,224,64,2,5,104,105,100,105,110,103,160,121,
-96,44,228,77,14,2,79,32,35,71,55,194,220,132,72,248,196,0,96,0,
-230,89,36,2,116,121,112,196,43,226,63,22,0,56,69,140,64,0,242,50,
-19,224,114,9,224,192,26,195,77,226,186,24,224,102,14,3,95,56,55,50,
-161,206,230,51,14,242,120,35,3,32,95,56,57,229,219,0,224,84,10,225,
-95,48,230,218,17,231,121,16,242,136,9,227,53,9,224,128,22,2,110,101,
-119,224,131,29,102,94,64,7,135,28,103,240,0,83,64,85,120,209,227,169,
-27,3,100,97,116,97,224,103,4,224,77,0,64,57,72,48,192,7,224,210,
-53,224,103,8,224,207,10,226,122,11,227,111,2,0,124,160,63,131,64,128,
-250,224,253,3,128,0,0,58,106,15,5,10,65,32,83,32,85,64,66,66,
-34,74,60,224,150,14,169,87,128,90,96,128,227,196,33,226,169,1,96,118,
-141,15,229,108,1,229,75,3,97,46,225,66,23,1,95,56,109,61,231,166,
-0,163,99,0,80,132,137,66,217,164,59,196,226,0,57,72,114,224,28,4,
-192,125,165,189,227,122,14,227,37,0,227,184,13,228,82,0,224,243,4,224,
-231,0,141,218,224,100,0,96,5,192,46,0,49,78,39,161,35,224,18,0,
-0,53,160,18,0,58,96,175,129,35,162,161,163,70,96,195,224,69,1,77,
-28,160,68,163,102,0,58,96,149,110,110,0,80,226,228,0,0,85,233,205,
-0,98,161,96,4,229,184,3,224,28,0,225,213,0,1,57,48,64,255,232,
-14,8,224,203,2,225,26,10,3,40,46,46,41,229,80,0,64,31,0,58,
-101,189,205,41,97,123,226,38,13,0,58,96,111,5,10,65,32,65,32,58,
-102,243,64,51,1,52,56,224,253,0,206,16,174,14,96,15,64,9,128,21,
-77,158,0,53,231,52,0,0,58,96,6,226,215,21,97,109,224,125,0,226,
-197,29,230,6,22,225,44,4,224,66,0,193,209,224,100,1,225,84,9,128,
-255,141,137,224,179,6,224,101,3,97,224,1,95,56,95,39,225,120,7,1,
-61,62,161,118,64,72,131,212,64,169,1,80,32,101,247,1,64,80,97,137,
-195,117,161,246,64,127,160,208,140,64,167,33,128,158,0,54,132,41,0,58,
-100,130,65,140,67,194,0,58,96,130,128,13,111,133,3,51,32,64,58,99,
-219,130,230,0,89,97,22,0,83,128,5,0,39,112,1,128,97,67,106,234,
-55,0,176,155,96,95,175,21,96,17,80,27,233,112,1,2,66,32,83,114,
-22,64,0,224,68,1,224,61,0,137,157,224,46,3,239,11,0,196,238,134,
-111,0,67,109,186,66,67,128,5,101,237,160,81,239,144,2,107,193,128,10,
-209,86,224,80,0,166,190,128,102,0,85,128,62,224,132,1,192,11,96,74,
-160,208,196,208,160,96,160,58,128,35,1,95,53,176,84,145,22,240,17,2,
-0,66,66,231,228,252,6,128,90,225,26,5,131,164,234,139,14,197,63,96,
-58,160,14,98,45,98,149,165,135,0,75,198,7,224,174,44,224,159,6,96,
-156,224,153,5,224,126,13,224,118,0,225,242,0,226,7,0,192,255,129,125,
-193,147,115,111,0,52,65,137,139,20,0,49,116,114,99,151,160,144,160,24,
-96,117,64,13,4,55,57,32,95,55,131,32,0,48,194,10,96,10,193,63,
-128,94,235,103,1,0,50,69,115,234,171,2,1,91,93,195,73,224,43,0,
-224,100,4,224,87,2,173,244,3,95,56,53,50,99,151,209,113,148,28,131,
-167,100,59,0,56,64,46,79,172,75,62,2,95,56,53,253,190,2,192,4,
-96,155,66,90,161,57,96,242,211,161,161,92,195,15,160,198,129,45,161,50,
-233,85,2,96,118,197,248,234,22,5,96,182,224,26,13,96,53,129,241,224,
-26,7,96,174,99,95,224,22,4,141,49,230,143,3,225,69,1,2,42,42,
-42,203,118,0,53,146,196,134,132,226,37,5,245,241,4,167,134,130,54,96,
-11,224,83,6,231,119,0,228,21,0,224,144,6,139,170,99,3,239,106,11,
-0,95,137,85,239,23,6,119,162,224,148,2,165,17,232,101,6,238,91,0,
-96,179,225,34,9,98,215,192,26,224,149,5,98,21,224,252,0,160,101,160,
-10,135,115,64,10,230,117,2,241,224,2,101,139,128,119,248,105,0,96,97,
-96,96,232,11,17,224,26,8,66,191,232,156,3,225,140,24,137,113,227,195,
-7,225,76,1,0,45,198,112,193,140,226,86,13,85,180,224,26,15,100,137,
-225,51,13,97,110,96,163,193,142,66,16,232,123,11,75,22,233,119,4,160,
-217,224,253,4,224,33,7,236,135,7,68,156,162,201,170,210,0,54,71,15,
-65,124,224,73,6,94,95,233,179,0,231,192,1,160,170,164,209,234,195,19,
-226,222,7,234,8,5,232,136,30,1,95,56,88,65,160,133,234,57,6,96,
-0,133,86,225,112,7,98,74,225,112,12,118,213,225,58,1,233,36,2,232,
-191,2,226,53,12,224,227,17,226,53,11,241,174,11,163,177,241,24,9,0,
-102,196,65,0,55,224,27,8,226,125,0,192,0,64,126,229,18,17,226,132,
-18,96,133,224,26,13,227,211,17,151,91,225,13,2,225,15,1,224,16,2,
-0,56,134,15,227,87,2,182,68,0,79,163,186,224,243,17,227,142,6,224,
-48,17,2,116,104,101,182,90,200,12,224,43,17,2,101,108,115,175,39,227,
-46,9,224,194,3,229,1,5,226,229,1,194,84,225,10,5,96,50,226,24,
-20,226,10,1,160,74,235,71,1,0,55,112,137,148,2,238,107,4,0,111,
-96,168,236,108,21,0,46,160,37,163,54,2,54,57,32,112,247,96,112,217,
-123,1,95,56,104,12,160,0,229,187,12,104,153,228,19,8,64,170,75,136,
-0,56,134,189,228,85,1,129,229,229,208,36,238,24,2,229,208,2,160,70,
-226,183,19,98,64,231,147,12,227,202,17,227,201,3,225,102,3,160,7,225,
-67,6,1,108,101,180,122,225,65,19,230,252,0,226,87,13,0,105,226,129,
-0,160,120,228,19,5,64,124,162,155,162,9,224,70,13,1,99,97,226,158,
-0,224,25,6,0,111,195,21,224,164,18,0,56,244,36,1,225,201,6,65,
-255,135,227,96,86,75,3,170,133,192,21,197,244,229,231,2,64,34,197,231,
-0,57,97,53,245,81,9,228,132,8,248,0,0,131,41,129,221,228,85,7,
-192,201,129,155,230,251,10,225,191,0,128,33,4,64,95,51,56,54,138,27,
-129,79,0,57,123,114,65,76,64,9,2,95,56,57,226,80,3,64,34,74,
-69,239,229,1,0,85,189,208,224,32,0,64,89,192,114,96,128,225,47,1,
-128,3,194,109,139,248,234,189,0,193,63,162,118,2,95,56,57,119,165,110,
-208,0,50,216,132,226,21,3,2,115,116,36,129,32,202,181,129,105,160,69,
-161,229,128,24,235,24,4,128,13,224,209,3,192,58,224,13,2,100,74,97,
-33,1,39,32,163,84,235,47,2,65,217,95,122,128,9,129,200,1,85,32,
-140,125,128,15,0,58,78,192,174,181,226,172,1,1,50,51,100,169,1,55,
-51,111,8,2,56,57,54,110,222,144,152,79,152,0,79,161,76,96,81,79,
-156,239,59,1,64,43,96,86,0,54,175,125,1,80,32,110,55,0,85,96,
-66,222,22,96,22,96,201,79,146,97,193,160,23,152,254,100,172,128,138,96,
-204,225,207,1,192,249,166,85,162,62,230,33,3,96,141,99,97,193,33,195,
-192,205,236,230,33,1,103,84,230,6,0,0,58,118,18,254,6,11,64,131,
-254,25,10,106,127,229,44,5,233,83,7,128,251,97,29,106,152,97,129,113,
-131,96,18,98,197,3,66,32,95,52,118,219,0,53,160,33,96,36,130,46,
-224,98,6,249,177,16,96,45,64,104,250,52,10,224,22,14,247,45,13,229,
-121,8,228,71,12,160,80,160,75,104,187,128,226,98,56,96,28,2,52,49,
-51,64,215,227,115,0,224,36,2,64,19,128,36,1,56,57,194,227,247,20,
-12,224,49,0,130,4,224,12,2,160,99,224,94,0,224,43,6,236,221,7,
-65,219,145,247,3,95,49,49,56,101,132,0,54,83,53,0,50,68,235,0,
-57,106,134,1,55,55,98,237,1,49,50,94,99,96,150,0,95,83,26,160,
-11,0,58,96,6,192,63,2,95,49,51,96,188,138,191,0,56,66,99,160,
-43,64,17,0,58,96,6,9,10,65,32,102,115,104,111,119,32,58,96,32,
-181,232,163,183,103,204,98,144,233,215,20,0,58,101,208,226,145,11,129,153,
-224,18,4,101,16,225,69,5,206,10,163,51,97,13,230,150,5,181,244,134,
-150,246,1,4,236,106,6,81,49,96,166,231,201,6,145,74,224,192,6,1,
-46,46,230,194,0,177,105,160,134,160,132,224,112,81,224,105,9,224,92,21,
-224,179,20,225,97,7,66,8,239,109,7,237,51,0,64,110,224,97,30,224,
-163,14,68,179,232,30,0,225,0,5,245,164,2,228,214,0,64,7,237,28,
-19,233,242,3,105,195,69,90,192,218,0,58,105,210,197,116,128,135,161,41,
-233,188,31,0,58,64,81,166,59,192,245,232,59,3,249,166,0,224,17,0,
-205,224,0,58,96,111,3,10,65,32,80,67,28,133,252,3,95,56,56,50,
-182,220,0,58,101,221,166,61,136,115,129,118,71,153,1,95,56,71,136,2,
-95,56,51,65,140,102,90,0,58,64,57,128,46,149,120,232,122,11,178,75,
-1,50,52,69,103,183,60,128,30,168,95,64,12,129,236,64,2,224,59,4,
-227,98,5,224,25,1,224,27,5,229,154,16,6,75,51,32,95,50,49,50,
-226,8,2,8,115,101,112,49,32,65,98,111,118,201,233,224,37,17,4,66,
-101,115,105,100,224,38,0,224,124,1,227,232,12,1,95,56,153,232,224,37,
-0,213,164,128,168,99,246,231,68,3,145,175,129,5,96,189,231,81,1,64,
-88,0,67,64,34,71,213,193,47,64,51,65,119,199,161,128,0,129,93,225,
-56,2,224,97,0,230,94,8,128,28,224,144,1,224,142,1,224,205,4,225,
-157,2,160,195,224,79,0,116,82,147,219,161,189,128,69,169,3,64,11,3,
-95,49,52,48,180,253,192,113,224,71,15,144,62,224,71,10,97,1,1,95,
-56,149,49,136,223,224,84,0,245,71,0,96,58,224,201,1,224,198,8,134,
-218,192,123,128,122,1,95,56,113,102,225,102,40,224,195,4,136,226,115,82,
-99,54,192,141,1,95,55,64,208,0,58,99,33,195,15,161,157,224,159,5,
-96,182,0,64,152,58,225,143,2,225,192,21,200,155,128,26,198,70,248,29,
-0,224,30,5,225,109,0,222,16,226,96,0,224,66,18,193,87,224,66,2,
-129,39,75,134,0,56,103,235,64,13,1,95,56,103,170,193,197,75,123,128,
-22,100,19,252,40,0,114,189,68,147,229,205,0,129,54,0,52,185,177,226,
-206,13,132,95,65,68,220,121,227,231,6,64,42,227,250,49,7,111,110,101,
-76,105,110,101,114,227,254,25,224,41,0,228,2,6,227,249,20,74,91,161,
-30,64,0,233,225,12,227,106,8,136,151,131,86,224,60,0,224,20,0,73,
-39,224,81,0,233,165,12,0,75,228,120,1,64,137,148,209,65,66,64,53,
-108,50,65,228,165,151,217,99,225,244,6,164,140,224,63,1,0,58,97,239,
-98,197,237,243,0,109,16,1,95,56,162,229,75,186,64,93,98,180,64,80,
-250,195,6,128,169,230,9,5,96,191,96,200,195,127,224,19,0,128,17,241,
-239,0,169,148,238,253,0,128,212,173,59,229,55,1,162,59,204,169,2,95,
-56,55,167,27,64,164,192,189,233,114,5,148,29,199,231,160,17,96,108,225,
-252,1,1,32,124,240,143,1,231,235,37,160,170,0,58,96,136,190,254,224,
-218,3,232,96,2,108,115,224,119,5,1,60,45,233,4,5,160,6,97,124,
-241,53,52,0,58,96,162,96,143,2,95,56,54,64,126,99,131,0,58,113,
-23,253,87,0,96,146,225,211,0,97,247,255,166,7,1,54,56,66,124,225,
-166,0,224,143,3,3,119,104,101,114,195,39,224,146,26,96,148,171,212,2,
-57,49,51,64,125,131,242,229,94,1,132,31,0,58,64,73,224,187,5,136,
-166,64,139,169,66,186,148,162,112,231,107,6,228,224,7,210,234,163,20,231,
-154,7,224,46,7,2,95,56,52,131,104,64,12,64,5,0,58,96,133,225,
-220,19,96,254,0,53,226,55,9,247,183,1,129,11,180,139,192,31,0,54,
-233,179,0,225,249,3,224,72,34,234,242,14,0,58,119,169,65,104,3,54,
-32,95,55,99,40,74,140,0,53,82,135,2,50,51,52,97,88,77,171,165,
-152,169,243,64,54,208,49,0,80,209,191,102,212,97,113,125,113,0,67,79,
-199,128,137,240,7,1,182,96,177,9,64,92,238,244,1,0,58,64,198,129,
-229,225,43,2,227,129,9,5,102,111,114,97,108,108,227,133,5,216,117,131,
-254,225,11,8,0,58,123,39,134,51,228,148,0,132,239,193,226,225,218,6,
-64,165,136,27,132,166,98,96,96,26,225,81,1,129,221,251,148,4,236,204,
-6,246,20,10,248,97,1,0,56,65,211,128,156,175,0,88,115,0,58,96,
-22,96,170,0,75,254,3,0,0,54,96,100,2,95,55,49,139,173,248,242,
-1,0,58,96,148,225,190,27,112,239,225,190,1,65,52,102,0,0,73,229,
-4,3,225,4,0,105,126,75,226,114,104,102,114,192,35,1,95,56,73,111,
-96,85,64,13,128,116,96,113,64,95,128,7,64,96,178,189,3,32,80,32,
-75,102,250,129,53,224,9,3,224,11,1,0,58,125,132,239,136,0,1,95,
-55,70,219,96,7,157,39,2,56,53,53,73,226,105,227,0,54,164,37,0,
-58,115,141,5,10,65,32,75,32,89,99,230,65,48,232,218,4,137,253,3,
-67,32,95,53,141,22,137,109,166,91,0,83,255,94,3,244,32,2,194,177,
-1,80,32,137,179,64,143,255,221,4,98,85,169,208,97,199,2,50,57,56,
-64,33,1,53,50,212,110,160,34,128,0,0,58,64,187,195,41,168,124,64,
-20,211,88,243,133,3,95,160,192,20,64,71,128,20,130,28,237,202,13,1,
-52,48,237,202,7,68,144,162,243,66,52,165,27,64,144,197,215,64,68,162,
-95,97,205,66,43,161,84,0,58,97,143,160,51,117,92,103,243,0,58,96,
-36,224,74,4,133,102,67,164,229,102,93,137,76,64,12,133,102,64,133,160,
-121,97,46,236,47,2,0,32,116,187,64,35,129,120,227,26,5,110,102,227,
-26,0,74,99,228,217,7,66,102,102,247,0,49,70,247,64,21,227,40,18,
-121,125,227,40,21,67,186,227,40,1,64,127,96,109,132,170,0,58,96,8,
-224,201,3,217,207,224,201,4,204,54,225,56,0,239,77,1,225,60,1,161,
-61,225,63,9,224,24,0,224,168,1,192,19,97,83,192,85,96,71,129,101,
-225,103,0,130,44,2,65,32,58,96,56,97,23,0,51,69,106,84,79,1,
-58,56,84,48,128,19,3,54,32,35,49,93,50,70,14,88,144,72,84,4,
-95,49,56,49,32,140,126,224,20,7,192,253,64,70,176,110,0,51,129,210,
-108,35,2,95,56,51,65,167,0,56,65,154,2,95,56,51,67,248,0,75,
-96,111,129,210,0,85,87,60,0,58,96,23,162,201,64,13,195,61,133,140,
-226,139,1,202,216,70,125,252,182,4,138,150,110,79,0,48,237,251,5,1,
-95,56,127,226,172,184,166,6,2,95,49,48,68,4,151,72,0,95,238,202,
-2,0,58,96,173,194,37,64,87,236,113,10,192,138,2,95,56,50,107,184,
-160,89,226,84,0,229,123,5,224,47,3,0,51,99,245,192,47,0,58,96,
-9,137,138,227,68,0,238,34,2,129,215,237,24,8,240,110,3,224,39,15,
-164,181,238,114,0,240,5,15,130,162,226,65,3,64,8,206,79,224,7,5,
-224,190,7,224,54,4,224,145,0,227,252,2,192,13,133,192,163,109,69,197,
-101,130,1,56,50,224,124,0,224,89,6,160,165,225,220,0,1,95,56,69,
-206,161,62,129,194,135,198,160,15,224,51,0,224,219,5,241,175,7,192,171,
-161,17,226,76,1,241,165,0,224,88,7,224,104,11,225,119,1,160,226,237,
-250,5,224,94,0,160,32,224,145,4,208,122,240,172,1,130,166,128,224,241,
-115,2,224,118,7,224,50,7,133,210,160,130,229,174,0,227,37,3,160,217,
-228,63,7,224,225,9,128,88,0,95,111,225,160,0,164,138,224,193,11,241,
-110,13,1,50,56,241,115,0,224,188,10,132,134,0,58,96,16,209,49,128,
-86,130,17,165,3,225,85,15,193,52,227,93,8,192,24,0,85,199,56,224,
-33,8,96,129,239,46,3,86,108,97,104,0,54,71,96,67,234,233,125,0,
-64,255,99,247,0,95,79,19,0,58,97,145,69,15,0,52,72,18,176,237,
-0,50,102,95,65,110,2,95,49,53,226,194,0,0,58,96,6,227,198,3,
-192,193,242,17,6,227,114,3,225,209,5,228,79,3,225,66,2,128,14,64,
-0,227,200,1,225,221,12,160,39,225,0,0,189,54,73,16,97,4,195,90,
-128,54,227,231,20,224,67,5,97,221,102,237,246,11,1,228,1,3,64,252,
-0,54,133,236,130,124,225,193,1,79,240,246,13,8,98,239,132,22,224,210,
-0,246,8,86,0,97,82,4,3,78,101,115,116,242,14,25,224,42,1,246,
-18,58,225,178,13,228,108,1,129,250,97,47,193,238,99,211,224,24,18,64,
-0,225,54,24,128,92,229,250,25,129,144,226,18,7,197,170,246,0,19,224,
-151,7,246,12,7,224,82,2,132,223,131,235,224,74,0,78,58,72,24,132,
-195,130,47,134,41,193,48,225,54,2,225,55,0,233,10,10,160,151,224,138,
-2,224,205,4,131,3,224,150,0,101,56,224,170,1,246,98,1,230,187,0,
-225,42,15,162,238,224,92,4,128,1,228,246,2,225,179,16,192,52,182,77,
-96,0,108,116,0,58,96,36,249,84,6,227,64,22,192,153,243,135,9,224,
-23,1,225,200,1,225,237,12,229,72,14,224,167,0,129,179,3,64,95,55,
-57,225,212,2,229,91,27,96,125,225,76,0,192,72,1,95,49,73,220,165,
-59,71,252,3,51,56,32,95,111,128,128,67,225,70,2,193,33,96,16,0,
-54,96,253,0,52,76,175,101,169,225,55,1,65,56,138,47,128,240,230,68,
-34,192,48,224,28,4,206,82,224,224,5,96,21,232,63,5,225,57,14,97,
-54,128,198,152,47,225,57,4,225,58,26,253,2,0,137,25,77,237,235,101,
-7,130,171,163,149,70,129,0,58,96,107,107,177,3,50,49,32,58,100,84,
-172,124,1,80,32,133,59,0,80,98,98,206,58,1,67,39,98,101,194,217,
-98,168,228,36,0,76,156,226,212,0,135,176,128,39,201,36,226,90,25,227,
-69,11,224,39,4,229,207,4,253,245,6,114,67,111,159,225,125,2,229,157,
-6,0,98,69,152,0,103,213,15,229,118,4,160,84,164,114,192,135,197,119,
-160,198,111,9,98,72,105,48,226,240,1,160,169,228,245,2,195,2,228,216,
-6,195,163,224,227,17,228,41,0,164,195,232,0,11,229,253,1,224,124,8,
-103,199,65,162,96,14,233,253,11,228,112,0,226,65,5,128,138,225,3,0,
-192,193,225,223,0,250,114,26,225,55,0,193,194,224,46,13,193,12,192,28,
-225,200,50,0,49,225,201,11,224,88,0,226,133,3,225,208,4,227,190,0,
-132,249,65,5,97,118,225,213,2,229,165,0,72,209,160,70,225,187,5,224,
-220,13,200,215,229,101,0,230,19,17,164,145,224,109,4,160,79,252,247,3,
-195,252,78,177,102,128,228,27,0,252,226,2,224,68,8,225,231,2,226,138,
-14,229,121,4,0,64,111,69,104,211,64,6,64,4,0,58,110,246,111,143,
-68,59,0,73,68,10,64,47,145,14,2,55,32,58,96,95,210,162,64,247,
-114,162,0,49,138,201,103,155,0,58,96,195,228,83,1,96,241,100,83,71,
-184,128,37,87,209,67,50,224,37,1,98,78,128,37,132,159,129,113,129,164,
-64,138,0,58,99,132,234,49,1,226,112,8,1,95,56,116,225,130,238,224,
-246,2,128,38,64,47,3,32,64,95,52,85,75,64,38,65,245,129,249,128,
-227,196,238,231,64,1,224,42,0,101,68,128,142,230,50,2,128,80,96,109,
-226,11,4,195,166,131,61,230,50,36,199,172,230,50,11,192,86,230,50,0,
-96,236,98,26,224,235,1,226,27,2,252,13,15,150,6,128,110,160,10,227,
-103,7,3,102,105,116,115,214,162,180,49,64,41,130,20,0,53,162,20,67,
-121,85,122,0,50,230,34,1,96,240,225,151,1,233,145,0,225,167,0,193,
-185,239,65,1,230,63,10,227,67,2,234,170,22,229,45,7,224,35,4,199,
-98,64,36,228,86,2,103,103,224,238,5,10,100,105,115,112,108,97,121,32,
-108,97,121,203,184,192,141,195,68,231,152,5,192,29,65,79,174,7,225,178,
-0,229,186,13,238,254,9,3,95,49,51,49,78,75,65,88,224,67,0,211,
-121,196,13,0,66,64,5,96,41,232,210,9,160,240,99,226,141,87,160,172,
-228,45,15,225,101,7,234,17,7,225,97,10,225,187,1,225,94,61,0,50,
-225,95,7,133,102,225,23,3,224,210,36,225,118,70,65,207,101,15,64,9,
-97,1,96,5,99,254,0,58,116,31,183,133,2,48,32,95,105,176,3,67,
-32,95,51,119,35,0,51,101,181,84,248,0,49,128,26,1,95,49,90,201,
-65,64,224,44,0,1,95,54,93,245,128,209,1,95,56,160,39,2,64,95,
-51,96,40,64,153,224,18,0,0,49,91,89,64,0,2,58,56,48,188,75,
-97,166,163,80,128,87,144,46,107,32,75,23,88,35,129,13,4,66,32,95,
-54,56,94,15,118,109,0,49,90,246,64,83,153,0,96,124,65,159,225,14,
-2,225,170,1,17,114,101,99,117,114,115,105,118,101,32,109,111,100,117,108,
-101,58,32,129,176,160,180,97,148,1,95,54,97,126,224,59,8,13,44,32,
-105,109,112,111,114,116,32,99,104,97,105,110,160,57,4,66,32,95,53,56,
-251,156,0,128,57,128,0,1,95,55,75,221,3,58,56,48,54,134,18,4,
-54,56,52,32,75,184,145,97,199,192,173,237,28,3,0,54,235,207,0,97,
-27,205,4,0,66,97,100,0,54,126,70,6,54,54,53,32,95,50,56,167,
-68,194,179,98,23,131,86,224,42,0,161,1,64,48,96,168,0,54,93,6,
-1,95,55,129,47,194,251,164,169,188,180,68,173,128,68,2,55,52,50,64,
-4,98,142,1,55,52,122,154,103,118,225,84,10,0,77,97,74,9,32,110,
-111,116,32,102,111,117,110,100,193,84,96,147,161,83,2,49,49,55,65,2,
-177,107,224,64,6,15,92,49,48,38,115,101,97,114,99,104,32,112,97,116,
-104,61,96,62,64,132,96,59,98,57,122,119,0,53,192,4,189,80,1,95,
-54,94,137,224,79,13,6,112,97,99,107,97,103,101,224,80,2,224,71,18,
-225,19,0,96,0,129,159,228,71,3,161,177,225,91,3,193,88,2,95,51,
-55,224,59,0,98,69,112,5,197,223,99,6,161,140,224,31,1,65,94,0,
-57,183,140,169,4,226,125,0,166,94,1,95,52,123,95,161,66,230,254,6,
-128,5,103,219,2,95,50,57,65,155,127,45,224,173,3,226,47,2,122,87,
-224,157,6,166,189,214,121,2,95,54,55,64,64,96,56,227,59,16,193,81,
-3,100,111,101,115,97,236,6,99,111,110,116,97,105,110,163,74,225,244,1,
-192,201,228,140,1,244,79,0,227,33,4,224,169,8,226,217,3,224,201,1,
-68,54,225,66,0,131,255,0,66,237,151,0,131,184,99,60,0,80,108,25,
-131,63,64,131,236,161,6,128,0,65,78,1,54,54,67,176,2,54,55,50,
-96,48,97,189,2,58,56,48,137,171,224,238,1,2,46,116,120,77,80,0,
-58,96,33,104,25,2,95,56,48,66,202,96,5,0,58,96,105,105,234,1,
-48,48,64,108,124,97,111,207,96,5,0,58,96,37,163,188,65,109,105,248,
-90,60,224,100,4,161,83,72,140,0,58,97,196,165,10,226,57,5,164,157,
-2,50,51,50,64,18,64,176,64,32,0,50,90,40,1,95,54,90,158,81,
-12,0,55,170,69,130,233,98,155,64,51,73,223,225,200,6,7,76,111,97,
-100,105,110,103,32,193,208,198,179,228,59,4,226,223,0,0,54,118,255,226,
-206,9,132,38,224,147,2,65,90,126,32,126,110,67,84,112,221,0,54,228,
-54,1,226,90,16,0,80,160,137,29,99,111,109,112,105,108,101,32,118,101,
-114,115,105,111,110,32,109,105,115,109,97,116,99,104,58,32,102,105,108,101,
-131,198,170,17,196,25,229,162,6,160,211,128,42,228,126,1,128,139,224,44,
-7,160,110,0,114,96,45,192,169,96,0,96,163,1,54,56,64,174,2,95,
-55,57,150,152,0,58,99,179,220,162,64,252,0,54,70,133,0,55,97,37,
-166,133,224,24,3,1,54,56,224,24,2,127,140,160,47,126,92,128,22,161,
-217,1,55,57,65,165,1,55,57,67,53,2,95,55,57,230,233,0,65,95,
-0,52,133,142,64,156,1,95,55,66,165,2,95,55,57,134,241,0,54,96,
-67,229,39,0,2,95,55,57,128,29,227,239,0,228,91,3,103,29,67,52,
-1,95,55,123,220,0,58,96,214,156,89,0,51,105,228,0,58,96,24,128,
-17,0,52,136,30,0,58,96,76,224,36,0,64,110,0,58,96,101,3,10,
-65,32,90,69,31,0,58,96,139,192,32,72,90,0,58,96,190,188,177,64,
-71,64,140,0,58,96,218,242,150,0,224,5,1,65,43,66,198,225,8,0,
-99,154,0,55,127,169,160,6,224,25,6,129,34,96,6,224,26,7,129,173,
-96,6,224,26,0,0,55,65,113,0,56,115,66,0,55,71,167,192,6,0,
-58,97,114,128,166,0,50,160,184,64,24,109,33,169,144,0,66,241,228,1,
-64,1,233,202,1,67,207,164,120,141,75,129,99,0,55,100,109,101,0,65,
-182,3,95,55,54,55,95,18,0,50,149,195,229,110,0,242,241,9,96,62,
-137,192,141,124,224,43,27,133,197,129,74,147,29,137,34,192,249,231,191,16,
-231,189,7,16,117,108,116,105,112,108,101,32,105,110,115,116,97,110,99,101,
-115,232,218,3,0,55,65,89,224,62,2,224,0,5,1,95,55,72,221,96,
-8,1,55,54,65,104,188,184,65,76,170,76,128,200,0,90,64,198,192,9,
-2,95,55,56,64,44,197,210,0,58,96,54,77,105,1,32,89,97,92,129,
-116,128,217,235,148,6,96,50,224,25,12,150,85,235,172,6,132,136,174,116,
-97,54,160,133,224,37,22,244,109,1,160,0,224,49,6,97,85,224,48,3,
-0,90,192,232,224,38,23,128,89,0,55,68,26,224,0,2,237,229,18,235,
-225,1,224,90,4,99,6,246,250,1,226,62,0,97,252,128,17,224,49,19,
-160,32,104,225,210,63,192,49,128,28,150,156,242,60,1,225,64,19,99,173,
-225,63,9,171,178,160,0,0,58,65,245,65,230,156,56,131,17,240,63,14,
-224,25,12,98,127,129,38,224,25,6,104,252,192,25,237,31,5,99,51,224,
-184,16,96,30,224,185,10,134,193,224,244,2,129,86,225,83,8,100,80,225,
-133,7,128,44,225,82,0,161,72,224,88,5,162,6,0,55,195,47,224,164,
-19,100,188,224,163,20,225,21,13,99,153,225,21,12,96,117,224,111,16,64,
-29,225,19,27,224,58,10,64,114,224,170,22,224,59,16,227,132,14,224,59,
-3,227,249,14,224,231,3,224,25,4,96,75,225,1,12,168,193,224,138,14,
-227,183,8,128,138,0,49,105,9,224,197,21,64,51,224,58,10,5,55,55,
-56,32,95,52,84,120,225,7,24,102,197,224,65,10,0,56,234,202,1,226,
-234,13,224,210,20,227,253,3,224,85,2,224,146,2,224,58,16,227,35,14,
-229,29,2,64,31,95,245,132,214,0,58,96,6,163,232,2,95,55,56,75,
-30,128,193,96,66,128,17,106,40,160,17,0,58,96,219,224,48,1,104,203,
-1,56,50,72,93,64,32,75,48,3,47,61,32,58,96,18,64,12,0,61,
-96,12,180,206,244,69,0,114,197,108,198,128,6,0,58,64,103,64,34,2,
-73,32,58,96,16,136,126,64,99,64,225,165,38,163,217,229,4,14,229,6,
-1,96,194,224,7,2,103,71,0,53,111,79,0,55,67,160,0,58,96,6,
-160,195,1,75,50,212,122,161,23,99,231,0,58,96,6,202,63,242,3,1,
-144,244,64,80,0,51,69,33,64,7,112,216,0,55,81,77,3,64,64,95,
-53,72,169,64,61,0,54,160,61,125,20,160,159,81,145,167,153,212,123,102,
-71,233,253,2,163,18,203,56,145,38,101,213,0,58,96,98,236,164,6,104,
-197,221,122,194,99,147,66,0,83,194,113,72,26,79,207,96,226,0,54,103,
-245,160,6,0,64,160,124,160,81,108,181,0,52,96,7,73,13,72,48,134,
-19,200,57,0,58,73,161,64,110,105,135,138,134,73,193,202,64,138,133,73,
-238,202,100,64,14,129,216,128,151,224,148,26,0,67,170,35,97,240,233,156,
-4,171,242,160,141,0,58,96,37,65,196,64,166,1,95,56,64,107,64,33,
-96,122,0,58,96,192,241,201,3,129,129,106,22,241,184,0,0,58,107,222,
-224,37,7,64,35,128,45,97,30,241,230,1,0,58,108,61,224,254,0,66,
-106,0,58,108,171,235,134,0,224,2,0,224,49,1,129,48,130,54,138,138,
-97,2,232,61,5,2,95,55,52,99,160,128,14,218,19,162,212,211,177,115,
-179,64,8,194,59,246,183,6,226,82,0,224,49,2,98,69,96,53,207,232,
-2,79,32,35,78,186,148,109,244,34,9,96,218,158,158,64,0,241,85,1,
-174,111,244,104,11,98,109,143,228,130,75,234,207,33,0,70,78,64,242,139,
-7,241,249,3,177,244,224,100,0,99,36,244,196,1,1,55,52,98,41,169,
-146,224,253,7,65,79,195,85,236,6,2,132,82,143,146,2,64,95,55,128,
-98,210,26,96,33,175,60,245,18,3,78,150,165,181,176,230,223,228,64,14,
-115,181,97,133,97,244,254,196,1,192,141,3,95,55,53,52,224,247,2,7,
-109,104,115,99,112,112,46,104,216,216,64,42,204,39,226,0,8,224,138,0,
-96,173,65,72,128,162,225,5,0,128,186,161,123,224,184,1,0,55,131,93,
-224,171,1,128,156,229,139,0,225,207,3,0,49,90,254,2,95,55,53,65,
-78,142,202,0,50,80,2,128,28,101,255,102,66,134,95,247,81,5,5,114,
-101,109,111,118,101,97,201,5,102,97,105,108,101,100,128,211,0,58,96,126,
-11,10,65,32,94,117,110,108,105,110,107,32,58,96,93,161,23,225,25,2,
-1,50,50,236,225,4,6,72,83,67,80,80,72,83,208,231,128,44,224,46,
-4,225,220,5,115,162,0,66,193,55,225,44,2,161,15,224,201,4,0,50,
-113,120,161,199,145,111,226,147,8,7,82,117,110,32,99,112,112,104,205,90,
-226,142,12,1,95,55,70,79,224,160,1,160,108,143,219,0,54,82,101,0,
-50,137,16,2,56,32,64,224,90,1,96,86,192,217,224,219,2,224,128,5,
-7,32,45,45,115,116,114,105,112,128,126,192,201,180,12,243,174,0,214,204,
-162,129,5,51,49,32,95,55,53,170,44,224,39,0,3,67,39,32,79,224,
-226,0,224,146,12,1,45,73,177,168,0,32,116,157,224,25,2,10,115,114,
-99,47,114,117,110,116,105,109,101,128,34,100,51,65,54,1,48,53,192,114,
-84,46,196,77,228,97,2,224,19,0,68,179,66,89,224,239,1,224,54,0,
-212,101,166,233,150,120,225,7,6,0,79,225,43,1,66,80,66,251,3,10,
-65,32,79,224,35,2,8,45,68,95,95,77,72,83,95,95,64,41,0,75,
-70,3,65,3,168,61,226,223,10,67,167,132,204,226,225,19,128,169,243,1,
-16,8,99,97,108,108,67,111,109,109,97,68,178,130,243,161,171,225,122,2,
-162,54,149,208,224,66,8,0,44,226,91,18,96,234,0,54,131,59,5,115,
-121,115,116,101,109,67,59,199,252,227,184,3,114,78,64,217,159,50,117,47,
-129,238,128,20,122,62,1,95,55,137,253,225,17,3,1,95,50,74,75,228,
-49,8,117,206,229,233,7,146,204,110,30,129,11,227,97,0,164,240,64,29,
-103,234,0,53,135,11,64,64,2,53,49,55,69,99,97,87,139,138,0,35,
-119,35,87,3,96,162,135,14,115,105,236,58,1,226,161,2,130,27,137,51,
-1,55,51,225,57,2,8,92,51,52,38,108,105,98,47,83,97,25,5,47,
-73,79,46,104,115,64,19,5,44,50,57,54,58,56,129,134,0,90,129,39,
-86,100,96,110,97,18,2,48,53,32,128,131,160,19,96,0,0,67,128,36,
-224,118,6,0,58,96,208,158,79,0,65,96,217,133,209,7,94,116,109,112,
-110,97,109,101,65,143,232,229,0,104,10,3,75,52,32,90,160,1,104,24,
-225,199,0,133,3,64,127,0,56,64,131,68,29,1,32,89,134,144,135,234,
-153,197,64,1,64,234,238,158,0,233,202,3,236,60,0,155,98,236,223,1,
-1,35,49,197,12,96,36,96,46,96,10,203,33,66,249,224,45,1,216,92,
-96,33,247,148,1,224,42,11,103,27,192,0,108,95,224,129,15,95,121,122,
-219,188,17,224,74,8,1,49,49,130,126,64,112,224,33,14,87,106,224,33,
-21,0,49,100,217,224,67,20,144,114,64,33,146,194,98,96,224,36,7,96,
-138,241,89,1,224,0,3,225,132,8,131,30,225,133,26,193,44,225,132,71,
-68,23,224,159,1,238,72,6,224,133,9,138,116,236,86,1,3,95,55,51,
-57,160,28,68,104,228,94,1,132,24,132,51,66,241,230,160,4,132,151,125,
-33,1,53,49,143,67,1,95,51,76,102,0,58,105,108,107,112,0,52,116,
-18,0,55,96,19,203,114,101,124,64,19,171,128,67,106,96,10,0,73,96,
-24,174,101,2,55,52,51,64,27,132,40,77,236,88,141,116,78,100,91,133,
-114,231,76,4,116,214,230,26,7,220,181,64,89,201,108,0,83,68,112,0,
-55,90,72,96,242,230,237,12,233,113,0,170,238,169,185,1,95,54,72,23,
-0,58,107,133,238,167,3,127,232,70,204,164,50,128,6,0,58,64,100,128,
-115,109,117,135,253,0,85,69,25,129,99,192,18,1,66,39,96,21,243,198,
-1,96,85,192,29,194,113,238,181,7,96,213,64,116,132,55,251,113,1,117,
-181,130,107,96,55,222,43,96,164,109,58,230,123,0,97,190,0,56,135,101,
-192,81,174,242,1,50,53,69,220,73,138,0,58,96,53,224,101,34,105,47,
-224,101,22,129,245,127,79,0,58,96,70,205,28,64,28,176,57,1,50,57,
-67,102,1,55,51,121,71,104,206,0,73,108,128,0,53,70,179,1,95,55,
-96,78,1,58,55,65,54,247,243,5,64,24,64,63,2,49,49,56,139,47,
-96,138,70,201,64,13,64,35,1,95,49,206,36,1,49,50,73,16,96,92,
-2,95,49,50,78,67,96,11,0,58,96,6,64,68,3,51,48,32,75,72,
-203,70,160,0,53,226,91,3,25,67,111,110,116,114,111,108,46,69,120,99,
-101,112,116,105,111,110,46,73,110,116,101,114,110,97,108,66,58,224,39,1,
-3,83,111,109,101,224,35,0,98,85,185,62,64,215,119,77,131,138,2,64,
-95,55,66,132,0,95,64,104,64,241,0,51,141,93,0,95,67,184,236,100,
-1,112,63,1,58,55,66,185,167,230,65,214,98,17,108,178,142,52,2,95,
-55,50,79,152,130,40,0,58,96,87,239,142,5,64,30,3,10,65,32,99,
-91,136,1,32,58,96,63,98,208,97,191,231,213,9,0,50,98,121,235,58,
-9,130,38,236,252,0,1,58,55,68,137,99,166,78,218,0,58,96,55,239,
-245,5,64,56,97,248,0,50,93,201,73,87,2,58,55,50,178,3,225,50,
-0,97,72,4,97,99,116,105,118,74,82,0,58,96,38,96,52,4,49,57,
-32,95,52,69,193,0,58,64,63,128,178,104,203,1,95,55,78,98,2,95,
-55,49,96,27,68,143,130,175,0,55,70,16,1,116,111,96,86,64,24,129,
-8,68,80,64,24,126,1,0,58,96,58,128,46,124,29,251,214,2,0,49,
-142,241,160,236,114,141,138,166,1,58,55,78,216,225,83,5,64,25,240,36,
-5,0,90,163,197,101,100,100,178,128,58,129,3,131,214,112,60,192,8,69,
-230,0,58,96,41,241,25,2,71,23,98,39,138,142,64,146,0,54,64,225,
-236,236,2,1,54,51,67,152,98,185,169,11,207,174,0,54,99,241,238,225,
-0,225,188,1,237,189,5,128,90,254,123,14,99,208,229,89,6,222,111,9,
-115,97,118,101,100,32,99,97,99,104,158,115,234,169,8,192,150,105,255,136,
-4,238,108,2,160,159,1,58,55,66,242,191,39,167,186,167,78,175,173,0,
-54,69,75,160,15,3,95,50,50,57,255,71,2,194,3,197,39,228,163,1,
-167,67,64,21,135,21,134,241,1,95,54,158,57,222,247,185,13,231,199,0,
-249,46,0,255,56,0,228,226,3,0,67,177,41,230,45,10,209,153,128,64,
-233,177,1,113,30,64,8,242,51,1,171,61,255,151,7,148,30,192,36,163,
-143,255,160,1,224,40,0,176,108,232,20,1,161,204,159,181,236,170,0,0,
-49,101,137,224,0,2,1,95,53,180,88,64,88,244,113,1,224,141,8,68,
-123,64,7,64,10,147,116,117,133,192,57,96,156,224,114,5,238,127,3,196,
-37,225,162,0,96,198,224,45,2,239,98,8,96,213,239,106,16,9,105,110,
-118,97,108,105,100,97,116,101,130,105,173,70,130,107,0,54,86,53,160,0,
-192,203,225,49,5,67,212,1,95,55,137,211,167,93,226,66,4,96,157,111,
-140,181,118,96,220,0,54,81,158,64,55,234,3,3,1,95,55,132,125,66,
-200,167,217,65,232,68,0,233,119,0,105,118,161,38,116,72,225,162,0,149,
-167,98,25,159,246,96,0,222,131,2,95,55,48,69,180,0,54,100,110,0,
-58,96,104,100,78,143,73,1,95,55,96,60,148,213,0,58,96,42,100,20,
-125,94,99,44,106,82,224,105,4,141,120,192,135,254,128,4,97,169,81,21,
-160,32,200,203,97,11,224,61,3,100,159,97,108,65,27,0,58,96,126,100,
-156,108,240,64,40,96,13,172,207,0,58,96,214,103,188,1,51,52,223,117,
-128,12,129,85,117,132,104,22,64,90,0,79,239,255,2,64,34,0,58,97,
-109,229,27,0,66,160,246,236,0,179,156,128,225,160,169,64,162,1,95,54,
-119,75,130,100,227,225,0,1,56,56,69,16,0,51,217,37,96,10,193,12,
-225,152,0,203,4,192,95,160,2,193,239,244,73,1,128,33,247,6,1,162,
-228,225,232,0,96,8,1,95,54,66,223,147,253,130,120,0,57,188,10,128,
-155,96,181,66,88,0,57,160,34,192,125,68,46,224,44,1,0,58,119,78,
-170,170,134,135,0,54,89,124,230,135,0,103,241,77,10,226,42,1,134,33,
-97,48,224,178,0,134,200,0,85,161,6,226,6,1,160,117,232,48,2,137,
-30,67,235,111,216,224,200,3,1,95,52,102,30,225,64,6,160,70,225,52,
-10,225,77,0,225,43,8,72,225,225,43,25,128,73,128,159,238,76,0,0,
-64,104,59,207,49,224,34,4,192,110,118,130,224,38,10,248,72,3,1,49,
-51,66,19,134,147,248,73,4,91,24,163,65,160,45,129,163,103,219,109,7,
-0,75,141,3,96,9,113,44,64,33,228,42,0,67,120,68,117,192,52,128,
-34,224,61,9,96,53,197,70,225,252,16,202,21,74,250,0,54,192,226,168,
-28,193,134,0,90,225,120,6,226,199,0,227,33,1,160,2,97,27,194,246,
-102,135,224,80,4,225,91,6,128,38,98,163,128,167,160,16,160,168,128,28,
-241,208,0,224,182,2,96,47,224,182,73,226,64,0,164,164,224,180,12,192,
-36,97,129,161,148,224,181,18,192,14,130,253,227,165,2,128,199,133,117,128,
-65,100,127,224,178,0,168,146,229,72,0,150,81,229,116,2,250,169,0,198,
-241,1,55,57,78,105,226,112,8,134,245,224,89,2,247,197,2,225,23,6,
-192,114,224,227,1,234,47,1,224,11,0,160,9,160,133,128,207,128,19,229,
-7,17,225,61,0,225,44,1,224,200,0,137,120,0,82,142,216,229,83,25,
-242,202,2,225,222,5,225,39,1,64,15,137,186,227,132,8,0,66,75,209,
-129,38,2,95,54,56,112,131,128,24,224,78,17,227,210,18,224,77,18,165,
-119,225,188,3,162,171,250,202,3,129,13,198,31,224,13,19,224,156,1,226,
-194,1,224,35,1,128,17,128,243,81,6,224,164,16,0,57,104,101,224,242,
-0,96,167,65,87,2,95,54,57,193,85,226,27,1,224,176,10,224,177,65,
-162,112,96,158,224,177,39,145,29,245,47,1,225,111,1,0,58,98,143,236,
-238,2,224,195,17,169,44,128,1,231,38,0,192,8,0,58,96,94,224,72,
-33,224,234,1,224,86,1,226,57,0,224,5,1,80,73,245,230,1,163,117,
-241,117,0,233,201,0,233,210,1,225,57,0,224,167,5,160,58,129,7,121,
-221,227,106,0,96,16,224,15,0,192,224,224,168,0,224,119,34,192,35,225,
-39,19,128,26,228,225,5,160,24,129,69,137,178,228,81,1,227,5,16,225,
-143,2,224,124,3,224,79,0,224,103,17,0,58,98,188,224,101,34,226,154,
-3,225,181,2,225,46,6,160,67,224,24,3,192,152,225,150,76,224,98,10,
-225,129,60,0,51,97,27,3,35,50,32,58,99,76,153,11,228,233,2,224,
-110,3,165,255,160,13,132,81,160,5,135,36,224,225,1,224,51,1,235,214,
-0,71,241,171,32,231,51,4,231,65,7,224,108,3,192,188,169,180,101,247,
-230,209,8,68,215,230,222,6,134,214,228,24,0,79,85,0,58,96,248,99,
-179,177,11,65,90,112,229,96,148,193,5,69,169,227,217,0,228,202,21,225,
-228,3,227,217,0,64,8,223,86,96,174,168,138,80,191,2,75,50,32,128,
-153,0,75,113,79,64,32,132,144,2,95,52,56,160,243,105,194,0,39,64,
-7,113,58,75,90,149,141,213,148,128,24,64,11,181,188,224,24,11,160,49,
-149,220,2,95,49,53,235,80,0,0,58,96,6,242,26,12,224,195,6,1,
-95,54,245,35,1,107,244,151,36,64,54,128,10,87,36,76,18,129,45,1,
-95,54,86,137,64,60,251,109,2,67,38,144,209,0,58,110,249,213,9,2,
-95,49,51,239,45,0,2,95,54,56,96,228,84,240,128,17,0,58,96,6,
-179,171,2,95,54,55,64,196,0,58,96,37,161,151,122,152,0,54,76,105,
-2,95,54,55,105,101,66,18,143,37,204,136,112,36,115,84,66,94,96,171,
-64,42,96,17,129,31,0,75,214,253,0,58,112,87,224,197,17,97,144,65,
-210,96,202,1,58,54,67,247,97,212,2,95,51,54,87,104,111,21,96,122,
-98,129,0,58,113,57,91,122,9,109,100,53,66,70,73,76,69,32,58,96,
-25,228,131,2,64,172,84,36,1,54,54,98,160,105,43,128,75,0,55,65,
-116,0,58,113,213,128,145,79,112,75,213,249,103,4,188,154,64,144,1,95,
-50,103,4,216,16,96,64,225,59,7,64,25,244,213,3,0,58,96,24,98,
-5,0,54,64,13,64,122,131,249,252,224,28,109,202,252,226,9,2,109,104,
-115,220,226,7,70,105,108,101,80,97,116,104,220,232,5,49,49,56,58,49,
-52,178,153,195,72,229,92,1,130,115,1,95,51,155,84,97,204,190,144,80,
-109,0,50,172,0,207,171,96,247,0,58,64,185,160,232,0,51,252,200,0,
-224,1,5,234,11,0,160,0,0,58,97,110,161,134,120,252,179,249,153,89,
-201,143,164,182,246,123,4,85,98,1,95,51,85,157,196,163,239,246,2,113,
-161,96,26,226,255,8,64,14,115,170,164,18,82,109,104,161,64,140,130,71,
-194,117,96,246,192,115,226,130,8,128,63,0,58,114,156,227,6,10,158,169,
-227,6,10,64,217,246,27,0,130,91,64,25,239,162,12,67,25,97,9,192,
-224,133,204,175,144,127,78,250,132,5,225,203,1,129,50,230,149,5,230,58,
-2,140,85,64,107,107,189,239,112,2,160,73,196,37,64,187,101,15,68,31,
-64,113,113,183,0,90,145,190,1,90,32,160,58,212,73,224,28,6,106,42,
-224,28,15,109,17,224,28,15,139,188,224,29,15,1,50,55,68,155,224,29,
-0,1,95,53,96,44,100,188,0,53,83,186,96,10,0,58,96,6,224,187,
-1,97,150,0,53,81,49,170,189,64,22,96,161,90,200,192,16,96,149,224,
-16,3,128,137,224,17,3,128,125,160,17,128,122,96,80,128,122,131,224,64,
-6,224,122,1,113,143,0,53,107,32,0,53,117,202,0,53,100,107,0,53,
-115,210,0,53,89,69,96,70,96,82,128,70,96,10,0,58,96,6,8,10,
-65,32,98,115,62,61,32,58,96,41,128,13,64,12,131,57,2,98,115,60,
-96,26,0,54,192,13,64,12,130,146,4,98,115,99,109,112,64,14,196,234,
-200,11,232,77,1,66,179,89,223,1,95,49,109,15,232,46,8,96,143,64,
-165,0,52,154,98,0,52,89,142,209,249,0,58,65,77,128,229,0,56,193,
-154,225,191,0,130,161,200,217,166,241,98,177,0,58,96,6,160,54,161,99,
-128,45,135,28,129,134,86,161,160,17,0,58,96,71,224,48,1,65,47,0,
-54,94,71,0,58,96,32,96,233,0,47,65,4,190,91,2,98,115,61,96,
-13,249,207,0,64,81,64,10,85,139,81,126,0,75,170,42,0,58,99,165,
-101,117,1,52,49,227,223,4,0,83,67,222,166,93,222,118,118,54,0,51,
-166,140,100,32,243,187,0,228,38,1,71,165,65,73,105,93,64,39,96,13,
-196,121,224,53,28,67,84,192,53,2,95,50,51,192,118,64,137,213,62,64,
-18,122,140,231,30,12,100,153,1,95,49,96,37,132,27,65,75,96,67,0,
-95,91,36,160,10,91,100,224,89,0,161,200,0,51,170,180,96,167,202,221,
-224,220,15,224,118,6,184,213,96,182,96,101,129,236,191,91,97,134,255,26,
-2,224,85,8,103,31,224,77,2,0,58,121,213,160,57,190,202,115,46,0,
-52,230,88,25,0,58,122,168,97,216,88,87,118,157,160,5,118,74,224,11,
-0,87,46,122,101,128,43,0,53,64,4,99,166,224,5,7,0,58,96,43,
-238,96,2,234,92,6,0,58,64,60,160,69,0,51,64,176,129,170,0,75,
-74,192,72,219,234,192,2,234,164,21,0,58,105,229,252,241,4,3,46,109,
-104,115,120,218,92,239,123,49,136,26,231,15,15,134,55,231,74,6,130,112,
-251,225,0,186,36,166,179,138,213,101,247,1,95,54,104,206,96,136,253,69,
-1,224,105,2,0,54,93,92,160,105,224,132,3,1,95,54,93,208,225,219,
-7,248,248,1,233,46,6,0,49,164,73,225,241,1,254,62,4,1,95,54,
-64,31,1,95,54,92,43,0,54,158,170,224,109,7,236,120,1,224,213,7,
-226,70,3,64,200,64,113,234,31,4,94,225,0,58,96,65,66,95,14,79,
-46,100,101,115,101,114,105,97,108,105,122,101,32,58,96,29,74,45,20,97,
-100,100,95,108,122,55,55,95,100,101,99,111,109,112,114,101,115,115,111,114,
-64,31,194,9,0,83,107,75,171,175,242,59,0,1,95,50,187,103,243,150,
-1,225,17,3,129,138,202,117,224,207,0,0,50,65,109,224,53,4,224,216,
-5,69,224,65,47,0,51,222,42,64,192,130,114,0,83,160,215,161,13,225,
-34,2,64,42,169,59,255,152,2,74,219,130,26,104,164,227,116,5,191,149,
-6,94,117,110,103,101,116,98,64,237,130,189,192,100,228,184,5,1,95,51,
-106,208,65,223,235,16,1,101,245,2,95,54,49,142,0,251,198,0,224,102,
-0,1,95,51,65,121,103,213,65,146,70,68,1,95,54,120,74,226,243,1,
-7,104,71,101,116,67,104,97,114,170,161,0,58,96,203,101,194,0,35,157,
-148,0,58,96,49,239,29,0,228,77,2,0,51,90,101,201,70,86,96,2,
-51,54,54,64,188,0,55,253,150,3,9,111,112,101,110,66,105,110,97,114,
-121,75,25,128,101,229,149,7,1,95,51,91,102,229,175,0,98,245,105,114,
-0,51,159,231,64,131,131,34,106,242,228,152,8,228,148,4,0,58,127,150,
-68,32,102,218,136,141,0,49,79,25,0,48,64,204,0,49,226,139,0,18,
-112,101,114,102,111,114,109,73,79,32,94,119,97,110,116,95,103,109,112,96,
-32,243,40,3,192,162,1,95,50,153,148,164,77,224,24,3,0,50,253,35,
-3,4,77,72,83,67,67,222,134,227,147,0,175,195,240,53,3,226,148,5,
-76,236,85,215,65,105,1,95,50,112,166,156,110,2,51,48,50,253,129,4,
-3,99,108,117,100,161,68,128,0,226,226,1,224,2,0,224,86,40,3,99,
-98,105,116,255,59,0,192,184,247,91,3,96,13,64,250,96,190,224,96,2,
-2,64,95,54,253,64,0,193,25,128,1,120,228,224,22,7,241,209,5,224,
-1,5,225,80,0,229,38,0,126,11,237,130,6,225,110,9,11,69,88,84,
-82,65,67,67,70,76,65,71,83,224,195,4,236,213,4,140,178,128,190,224,
-5,24,192,54,227,205,7,96,166,127,63,99,67,255,62,0,100,79,255,54,
-16,8,69,120,101,99,117,116,101,58,32,255,45,2,0,49,69,109,0,49,
-137,116,193,16,229,116,5,131,16,64,23,165,232,224,136,1,131,59,224,135,
-4,137,196,95,14,64,58,111,88,64,143,67,68,224,141,6,13,99,111,109,
-109,97,110,100,32,102,97,105,108,101,100,160,148,192,130,226,237,7,229,61,
-1,224,245,15,128,54,96,248,128,10,224,109,5,1,67,32,69,207,7,105,
-108,97,116,105,111,110,32,192,0,128,115,160,215,142,217,96,59,4,54,49,
-48,32,35,238,76,3,65,41,74,20,96,117,0,49,214,251,64,0,224,98,
-1,0,109,226,185,5,160,0,227,22,10,192,2,1,95,54,69,31,103,28,
-226,93,2,224,80,1,2,36,73,78,224,81,5,227,12,4,224,2,6,224,
-77,3,224,66,2,2,79,85,84,129,237,0,54,230,68,0,193,184,224,2,
-9,98,232,224,35,1,128,1,224,190,1,239,251,1,224,29,1,128,1,225,
-108,6,15,32,45,119,32,45,87,97,108,108,32,45,79,51,32,45,73,224,
-197,2,231,52,2,225,7,1,224,87,1,224,86,20,11,47,115,114,99,47,
-114,117,110,116,105,109,101,226,46,1,224,169,8,224,78,14,96,22,2,79,
-32,35,73,107,221,127,128,33,231,127,4,96,60,3,66,32,95,53,77,29,
-132,163,224,133,5,224,206,4,224,97,2,224,95,12,224,30,6,225,230,12,
-8,45,68,95,95,77,72,83,95,95,224,87,1,224,85,30,66,139,192,235,
-224,48,19,229,68,5,224,226,0,1,54,49,75,251,224,152,7,64,59,0,
-57,192,59,192,97,224,184,12,0,39,225,132,0,1,95,54,167,30,226,238,
-1,192,153,224,149,2,225,201,13,5,47,101,118,97,108,45,160,73,224,213,
-5,224,57,10,1,46,99,160,116,165,4,225,174,6,85,24,136,238,225,199,
-9,192,87,224,134,2,2,42,46,99,160,120,226,188,2,10,36,73,78,32,
-45,108,109,32,45,111,32,227,62,0,224,0,19,1,95,54,75,136,103,238,
-0,54,200,26,0,50,236,176,10,232,33,10,64,0,0,58,96,62,232,81,
-2,232,84,0,224,42,1,0,58,97,95,210,47,64,248,75,238,76,208,193,
-113,197,237,160,45,137,192,0,85,237,57,13,237,59,10,68,28,232,106,0,
-126,230,194,79,148,103,128,106,197,43,179,118,217,149,224,19,3,132,72,224,
-63,0,128,11,1,95,53,139,206,64,37,116,78,64,73,227,169,3,0,58,
-68,187,64,128,170,185,128,23,164,148,0,52,96,124,128,59,229,121,0,0,
-95,86,138,0,64,98,229,138,26,71,168,240,151,0,151,190,215,188,78,100,
-185,213,64,69,64,207,183,155,66,212,176,176,176,174,102,185,0,58,96,6,
-237,7,9,0,49,65,133,1,95,54,96,192,64,141,199,8,235,9,8,102,
-146,2,95,54,48,107,107,167,6,0,58,103,73,78,32,1,32,58,96,18,
-3,10,65,32,90,72,157,0,58,96,39,75,128,0,115,117,184,64,30,171,
-229,236,71,6,1,95,53,92,242,98,247,233,244,13,233,241,0,163,117,234,
-26,18,232,166,4,193,236,224,48,18,2,79,78,70,227,9,0,230,54,4,
-96,20,130,10,128,175,122,109,162,31,224,8,13,1,95,53,94,3,2,95,
-53,57,162,85,231,33,5,232,97,2,66,11,231,240,2,98,25,255,225,0,
-0,50,76,135,97,105,232,241,2,99,238,2,66,32,79,225,20,3,12,111,
-117,108,100,32,110,111,116,32,102,105,110,100,96,196,3,67,39,32,79,192,
-128,224,42,3,3,105,110,32,102,172,27,230,34,1,229,92,4,232,251,0,
-226,246,4,90,43,132,143,2,53,57,57,224,79,2,6,100,101,102,97,117,
-108,116,167,129,1,48,48,224,26,2,0,99,164,121,96,22,229,108,0,231,
-128,1,192,114,234,192,0,232,70,8,234,21,24,225,46,15,234,33,17,11,
-70,111,117,110,100,32,116,97,114,103,101,116,234,38,9,2,53,57,51,100,
-119,234,50,1,234,62,8,160,0,224,188,1,225,51,6,225,53,7,64,32,
-220,103,128,192,144,58,130,69,97,77,128,77,225,61,14,100,21,0,52,75,
-158,1,54,48,99,210,2,53,52,57,249,51,9,224,55,9,192,164,225,125,
-1,224,73,41,3,102,108,97,103,233,242,3,133,136,161,194,224,78,40,2,
-111,110,102,230,105,4,231,150,7,224,42,1,3,117,110,105,120,135,47,234,
-152,2,0,95,111,148,96,0,0,58,109,9,115,218,0,57,86,250,123,22,
-114,18,68,165,98,216,2,95,51,57,83,174,128,153,1,52,48,84,54,96,
-11,0,58,96,6,212,111,120,213,114,34,197,54,184,152,224,12,2,65,223,
-184,134,148,115,64,109,180,115,128,10,116,115,96,10,0,58,96,6,212,115,
-248,232,0,224,66,1,116,67,64,117,64,42,166,16,181,149,0,58,97,86,
-243,140,18,98,42,244,47,1,224,2,0,85,252,97,21,99,236,231,66,7,
-211,40,64,72,121,31,228,215,0,174,106,249,49,1,197,224,97,195,96,24,
-98,220,147,65,0,52,157,229,96,102,250,222,1,237,74,6,0,51,96,43,
-229,54,1,128,118,1,95,50,134,155,224,44,7,102,230,185,207,96,44,133,
-99,1,95,53,122,186,169,103,228,0,2,195,212,227,210,6,2,67,97,110,
-68,250,3,112,97,114,115,235,52,1,167,89,228,60,44,173,99,244,109,2,
-200,28,242,118,10,224,85,32,228,146,16,2,82,101,97,196,145,0,115,101,
-156,9,46,32,80,111,115,115,105,98,108,101,192,22,164,169,100,106,238,210,
-0,228,152,3,0,89,97,237,66,248,193,231,64,151,80,3,138,109,168,145,
-160,0,228,176,5,224,231,9,220,62,224,163,1,160,135,0,46,227,196,0,
-0,58,103,168,182,247,245,33,0,1,51,55,82,5,98,223,134,170,67,89,
-64,128,0,52,72,14,115,52,243,57,0,0,51,94,191,1,95,53,158,86,
-67,183,0,83,165,23,114,221,120,202,124,73,224,43,0,225,56,8,9,65,
-109,98,105,103,117,111,117,115,58,193,29,0,53,79,75,172,210,229,212,2,
-234,11,1,0,58,98,91,120,248,1,49,56,134,121,198,117,79,107,0,51,
-131,4,225,191,0,0,35,162,244,133,72,64,25,241,203,3,0,84,97,20,
-162,113,224,34,3,236,156,5,162,35,122,144,68,42,225,184,2,0,35,74,
-20,96,185,224,57,11,224,46,2,230,152,24,160,73,96,0,3,95,49,50,
-49,192,246,3,95,49,50,52,192,11,0,58,96,6,116,246,106,130,83,158,
-0,90,129,4,132,115,97,1,138,81,168,241,202,244,64,189,130,219,84,28,
-68,129,170,2,224,247,7,89,155,224,247,0,224,46,0,68,162,176,196,162,
-198,115,38,64,213,192,15,74,119,128,15,0,58,96,6,164,232,96,94,97,
-214,242,42,0,0,79,98,110,236,254,2,105,105,89,27,226,176,2,4,58,
-92,49,48,38,231,65,1,96,53,226,64,8,2,32,32,102,72,14,227,93,
-1,1,50,56,110,9,66,63,1,52,55,186,173,137,73,224,59,10,5,101,
-120,112,101,99,116,241,216,0,237,137,0,1,53,57,102,214,131,113,201,100,
-0,58,98,232,159,135,1,53,57,100,196,76,49,0,58,64,44,229,179,8,
-204,246,208,74,195,191,197,18,161,117,0,53,99,36,164,128,232,126,0,0,
-58,96,94,97,229,236,215,0,77,17,3,95,53,56,56,135,191,97,57,96,
-83,140,93,128,53,64,187,224,136,6,82,212,224,241,1,16,102,111,108,100,
-114,49,58,32,101,109,112,116,121,32,108,105,115,226,250,3,157,122,105,200,
-130,75,116,127,224,10,2,98,74,160,105,134,166,0,85,140,196,245,167,1,
-2,95,50,56,64,197,227,144,1,160,168,243,197,9,96,243,225,143,5,211,
-94,224,83,0,236,174,9,224,26,13,247,211,8,224,90,8,2,108,105,110,
-198,88,163,203,224,152,3,147,52,224,52,8,4,44,32,99,111,108,128,53,
-224,40,4,239,137,4,6,101,110,100,45,111,102,45,203,145,224,26,3,5,
-110,111,32,108,111,99,115,204,198,211,224,28,17,0,58,99,4,120,73,129,
-241,225,231,1,64,7,65,233,99,212,163,73,64,47,0,54,225,237,1,245,
-131,0,64,4,101,17,108,59,0,52,77,180,130,191,167,164,173,11,129,213,
-152,162,174,98,115,148,226,77,0,224,46,30,200,81,143,83,237,64,1,224,
-39,8,130,219,232,41,3,224,39,12,131,176,224,205,4,171,102,96,13,224,
-82,4,166,253,153,227,192,130,66,162,251,209,4,0,35,161,179,67,108,79,
-25,85,254,79,56,0,35,244,105,0,224,109,28,224,69,0,192,108,197,90,
-224,108,12,128,228,224,77,5,103,22,133,153,69,177,131,239,1,95,53,145,
-150,165,96,193,73,1,95,53,124,198,98,2,96,173,4,66,32,95,55,57,
-162,227,64,184,73,83,229,197,0,96,0,3,95,53,49,55,252,203,7,226,
-174,0,193,121,128,186,225,121,1,0,53,70,63,96,28,177,38,160,28,99,
-202,0,53,132,177,225,30,29,136,117,193,30,224,109,12,134,76,224,157,0,
-1,95,53,90,120,0,35,102,94,224,160,15,224,50,14,167,40,192,142,68,
-149,0,67,97,54,224,43,9,175,189,72,193,119,248,153,50,1,49,32,129,
-254,143,186,104,225,225,56,5,113,204,224,19,6,166,76,224,76,11,96,100,
-1,95,53,71,1,224,32,13,97,206,64,33,225,145,0,249,108,0,97,77,
-161,114,1,49,52,81,133,133,136,225,108,18,219,91,0,83,225,47,0,229,
-172,2,169,205,66,67,128,251,192,105,134,130,73,201,66,58,160,69,233,226,
-1,163,22,232,131,1,224,134,23,65,55,229,79,0,222,109,96,4,130,76,
-229,162,3,1,95,49,77,229,66,190,161,15,160,101,128,172,115,122,128,85,
-238,76,12,229,189,3,64,79,98,232,121,196,161,155,132,134,65,76,99,60,
-128,208,65,220,0,52,74,180,121,219,0,51,96,7,0,53,127,157,64,7,
-224,235,1,98,56,243,179,0,64,36,69,116,224,36,0,96,90,128,42,160,
-48,1,95,53,231,170,1,225,38,26,228,166,29,165,120,225,172,7,64,134,
-0,51,97,54,98,147,74,92,0,51,197,210,225,187,8,228,210,3,128,150,
-131,76,96,9,162,39,220,86,200,152,194,48,171,255,135,5,105,201,97,223,
-228,168,8,160,91,232,193,0,136,215,130,83,96,76,129,9,227,82,8,108,
-36,2,95,53,52,161,169,226,117,24,228,162,1,64,95,224,21,8,0,52,
-64,49,225,122,24,131,143,229,180,23,224,38,0,0,83,76,184,225,161,17,
-128,38,117,184,5,32,83,32,95,53,53,230,78,3,97,229,2,95,53,53,
-64,173,207,180,97,12,224,67,9,175,209,224,37,37,0,90,132,83,224,37,
-14,111,226,227,100,7,226,164,2,96,155,0,54,225,101,0,131,160,232,0,
-13,96,229,193,40,65,19,224,29,4,101,4,130,42,0,79,230,161,1,0,
-56,162,55,233,61,3,16,85,110,114,101,99,111,103,110,105,122,101,100,32,
-105,110,112,117,243,172,6,170,8,146,215,225,83,13,96,175,192,171,129,195,
-132,109,142,98,64,210,66,85,142,99,96,53,228,54,4,19,73,108,108,101,
-103,97,108,32,67,104,97,114,32,108,105,116,101,114,97,108,169,136,225,85,
-18,102,60,225,85,18,237,164,3,133,136,224,189,19,226,17,6,225,197,42,
-224,111,9,225,157,2,227,128,9,227,88,14,97,53,133,59,227,202,0,167,
-114,178,67,132,28,204,167,97,103,65,121,228,126,4,236,198,2,192,105,232,
-164,14,64,119,152,254,224,0,2,128,130,0,55,64,73,225,213,0,130,129,
-64,3,196,251,64,5,101,147,128,216,1,53,50,176,66,224,113,0,128,109,
-229,44,1,224,48,7,141,246,224,48,11,64,0,65,171,3,95,53,56,50,
-115,177,241,48,1,225,32,4,160,184,225,32,5,225,18,2,110,99,225,18,
-5,225,17,42,192,48,1,95,53,203,70,192,69,198,136,160,29,161,196,225,
-220,15,0,58,96,21,144,20,133,16,210,55,151,151,228,208,3,5,67,32,
-61,61,32,64,136,176,140,42,202,65,112,79,64,202,96,102,101,242,111,144,
-65,37,0,58,96,146,108,108,0,80,136,237,90,18,96,37,244,237,2,225,
-60,5,198,132,230,138,0,194,98,195,202,224,16,2,235,76,14,162,238,224,
-39,4,206,162,224,20,1,64,1,134,211,224,115,5,129,186,153,250,224,123,
-2,247,192,1,234,232,5,203,179,230,120,1,106,4,224,153,1,131,54,0,
-85,227,63,1,64,10,225,208,3,192,43,96,169,193,119,130,106,226,19,27,
-64,252,179,228,224,172,1,233,203,0,123,158,131,67,192,218,194,152,194,153,
-130,151,130,67,0,50,83,219,224,82,3,160,83,162,162,224,50,1,99,25,
-129,20,224,151,0,224,163,15,227,208,6,224,138,2,228,65,14,164,60,128,
-140,160,153,227,35,7,224,84,0,0,58,97,41,162,79,170,66,136,73,192,
-237,227,241,0,235,181,1,0,50,83,232,145,169,251,35,3,0,108,147,212,
-224,18,3,3,119,104,101,114,111,162,224,20,3,1,100,111,224,17,7,0,
-111,117,28,237,86,0,161,25,105,18,194,157,128,110,224,50,1,0,105,185,
-20,69,228,73,43,93,48,64,55,227,109,0,100,131,157,206,77,177,230,2,
-7,115,57,192,32,243,187,0,160,127,225,79,0,136,36,164,226,135,135,96,
-9,0,52,99,137,146,130,236,207,0,130,189,224,14,2,64,55,224,14,1,
-108,103,233,160,6,160,82,0,58,98,210,161,133,2,80,32,35,104,14,0,
-80,64,99,69,86,120,236,225,149,3,141,123,85,239,242,105,5,2,105,109,
-112,183,0,8,58,32,102,105,114,115,116,32,99,71,133,8,105,115,32,97,
-32,100,105,103,105,178,120,64,100,67,206,225,226,0,228,43,8,170,188,227,
-238,3,228,45,23,224,42,5,228,48,1,228,49,4,228,51,1,224,22,2,
-228,28,0,64,90,109,139,128,0,128,23,228,86,1,96,24,163,66,102,18,
-160,69,143,66,150,253,227,118,4,221,32,160,96,252,91,5,196,165,225,4,
-0,160,13,96,33,194,249,128,95,224,107,3,247,102,3,227,177,3,64,188,
-224,11,0,232,0,4,160,133,224,239,2,224,163,1,228,188,3,139,5,119,
-180,240,134,0,77,32,2,53,54,54,80,195,1,52,55,85,174,1,52,51,
-130,167,3,95,53,55,49,123,1,3,95,53,55,52,224,30,8,128,13,192,
-14,136,219,224,70,11,168,235,226,250,2,96,128,224,199,0,224,224,25,96,
-0,225,147,1,160,47,224,178,15,86,30,155,87,64,90,163,229,224,227,19,
-224,48,2,96,43,224,245,21,0,49,100,241,186,65,224,244,30,96,86,212,
-201,160,14,169,212,96,111,66,233,130,147,79,195,226,238,2,192,0,226,63,
-13,160,64,226,154,9,194,15,226,12,5,226,161,5,226,10,11,225,40,32,
-226,25,78,226,20,2,224,247,0,182,240,64,175,221,47,227,180,1,244,111,
-19,231,111,3,151,109,194,21,228,143,0,230,219,2,239,71,2,129,108,241,
-156,10,163,247,224,49,0,228,206,5,228,118,0,128,67,160,73,239,127,10,
-242,250,14,155,152,228,156,1,192,68,64,54,221,185,224,242,0,0,83,100,
-34,162,85,1,52,54,166,127,144,37,161,201,227,83,12,236,130,7,176,87,
-126,181,224,10,1,222,180,98,156,229,43,1,225,55,25,128,230,225,55,7,
-206,173,225,55,128,193,42,225,41,19,129,26,225,24,29,224,185,2,107,137,
-224,183,41,226,156,1,224,190,63,96,93,224,190,29,0,64,126,148,226,38,
-19,229,137,0,224,24,7,163,187,1,95,53,92,212,227,206,1,160,213,0,
-58,110,17,152,249,250,174,6,15,114,111,109,74,117,115,116,58,32,78,111,
-116,104,105,110,103,104,52,0,73,104,140,153,44,251,115,10,165,5,225,19,
-0,129,1,235,7,0,1,58,53,68,200,122,187,0,65,96,72,237,58,2,
-75,15,1,55,50,73,46,1,54,54,64,86,223,134,129,66,239,119,4,142,
-179,211,63,97,43,65,135,195,113,151,206,64,118,91,201,96,7,0,49,247,
-174,2,224,8,0,133,75,96,48,64,17,224,48,16,224,42,37,64,29,0,
-85,96,140,235,61,8,108,226,0,95,70,60,224,164,24,130,146,93,200,224,
-115,24,225,230,3,106,165,106,75,225,32,2,160,18,132,138,224,195,27,224,
-41,33,224,237,2,97,156,128,117,2,95,53,55,149,241,224,192,29,160,26,
-224,42,29,66,53,207,14,225,246,43,0,58,96,155,239,56,2,196,28,0,
-32,107,105,64,31,141,8,235,15,1,193,74,0,83,128,231,96,91,0,50,
-64,132,224,115,19,224,176,0,225,200,28,192,45,227,178,4,241,97,2,3,
-95,53,54,55,228,85,1,227,11,2,3,95,53,54,57,192,150,230,113,0,
-1,53,55,154,158,229,31,6,224,174,28,64,21,225,252,23,225,254,5,224,
-130,73,0,58,72,187,132,38,1,75,51,100,39,141,21,133,181,65,169,225,
-146,11,227,87,23,225,145,58,221,238,224,136,1,225,164,3,224,140,3,70,
-77,96,7,0,56,112,117,224,245,27,224,150,49,64,118,226,174,1,224,146,
-6,97,160,0,56,224,61,5,225,62,0,136,40,164,221,226,94,5,130,97,
-229,136,0,68,201,129,102,224,41,2,82,158,224,243,2,94,240,224,102,1,
-224,207,42,168,235,224,129,123,224,59,0,160,105,231,101,5,231,43,6,31,
-68,97,116,97,46,73,110,116,101,103,114,97,108,46,94,58,32,110,101,103,
-97,116,105,118,101,32,101,120,112,111,110,101,0,110,143,113,0,58,99,41,
-134,240,232,128,1,226,41,19,128,166,193,17,112,60,0,50,168,174,224,215,
-11,192,46,224,203,4,224,45,30,98,75,0,58,98,42,131,121,0,50,96,
-44,1,58,53,68,121,244,223,0,199,170,90,2,231,163,10,224,215,1,139,
-159,224,11,3,231,164,45,231,248,22,81,23,225,221,19,160,67,231,234,36,
-164,78,224,47,30,224,43,38,225,50,121,93,110,225,51,163,234,11,21,164,
-36,231,43,5,234,12,135,140,43,233,133,38,224,59,12,0,53,78,72,224,
-60,35,0,90,198,176,224,67,1,0,49,94,14,224,67,25,234,129,39,236,
-129,0,224,111,9,224,179,28,224,111,45,0,58,108,46,204,141,128,122,231,
-8,13,230,37,1,89,90,160,76,224,116,26,173,146,231,113,8,199,65,234,
-34,3,137,2,232,143,1,224,101,53,225,184,38,206,59,224,211,50,231,116,
-8,226,174,24,192,116,224,41,34,96,105,161,144,173,28,66,228,155,3,188,
-62,199,202,128,52,224,15,10,0,53,79,141,224,84,0,0,58,99,243,139,
-181,236,136,2,98,19,249,39,0,233,175,48,128,193,64,0,231,75,35,132,
-185,0,39,145,128,135,184,168,175,227,199,15,224,103,1,224,33,24,0,58,
-96,255,135,168,0,52,136,161,0,58,96,49,248,60,1,96,111,120,60,95,
-168,4,10,65,32,95,54,103,190,0,73,157,124,193,41,247,200,5,66,97,
-70,148,0,80,224,24,7,249,25,1,0,95,89,133,1,54,51,232,254,2,
-4,92,57,50,38,110,104,225,96,27,2,48,53,32,157,231,0,53,92,145,
-0,48,80,102,125,237,0,50,153,191,0,56,220,246,0,95,116,111,112,57,
-64,137,144,37,121,39,189,9,1,50,57,84,138,2,53,53,56,163,102,196,
-208,160,4,252,244,0,96,98,161,217,101,244,192,35,96,86,3,53,53,57,
-32,182,12,251,66,3,97,199,241,64,3,0,48,96,0,128,32,97,166,224,
-205,0,0,89,243,21,0,161,59,130,193,131,46,129,208,162,192,66,204,225,
-78,4,193,206,103,125,225,111,10,0,51,169,164,128,65,97,2,192,19,241,
-242,8,248,78,2,135,8,3,95,49,51,49,138,13,0,52,65,68,64,16,
-86,28,64,44,126,39,121,72,0,50,66,58,86,62,158,119,192,93,0,85,
-226,165,0,128,7,1,95,53,97,34,130,90,186,208,117,146,113,216,2,90,
-32,90,97,110,1,51,50,251,62,5,83,36,161,123,98,49,0,79,129,219,
-0,90,96,160,129,208,224,88,1,96,90,141,201,138,94,0,52,131,190,0,
-58,65,161,229,194,0,129,106,79,138,248,80,0,99,191,2,32,95,50,131,
-66,151,42,64,53,138,170,68,120,65,229,119,244,98,58,0,58,66,121,98,
-241,2,50,51,52,179,226,155,218,0,58,96,38,227,35,1,97,81,99,35,
-0,53,132,63,173,217,225,218,1,137,55,192,13,224,30,3,0,89,96,30,
-224,17,3,218,154,224,17,2,192,69,224,21,3,69,87,245,91,0,224,103,
-0,224,104,1,226,90,0,224,26,0,224,61,1,226,119,0,97,32,226,11,
-2,224,33,6,187,183,249,147,3,96,2,160,23,224,42,4,224,21,0,192,
-147,67,90,192,64,192,95,128,40,224,186,2,247,142,26,132,76,224,38,1,
-160,84,224,174,0,191,218,131,190,160,0,224,109,76,152,137,228,237,10,216,
-200,192,100,129,85,224,103,0,229,32,16,193,66,96,30,192,198,99,207,128,
-167,131,200,96,43,224,12,0,149,181,224,23,0,224,0,1,224,110,50,166,
-115,224,84,5,132,161,224,49,0,128,92,135,204,140,16,160,113,213,150,129,
-114,96,20,2,95,53,53,64,193,96,100,1,95,50,100,54,160,75,161,68,
-2,95,53,56,159,4,103,168,0,67,165,163,224,110,0,226,182,4,128,101,
-226,76,2,193,187,229,57,2,224,36,0,229,60,11,192,209,226,167,0,224,
-53,27,230,167,0,224,53,36,165,168,224,106,38,249,54,5,225,193,13,197,
-225,225,185,11,161,171,225,219,4,1,95,53,183,159,97,212,225,91,2,224,
-32,2,64,60,128,32,224,237,0,224,93,12,240,166,6,13,98,97,100,32,
-115,116,114,105,110,103,32,103,97,112,103,176,228,34,5,101,196,0,39,69,
-197,96,73,2,56,32,64,224,60,1,18,117,110,116,101,114,109,105,110,97,
-116,101,100,32,67,104,97,114,47,83,128,74,6,108,105,116,101,114,97,108,
-96,78,171,160,225,69,1,64,15,225,170,24,224,46,30,161,12,224,92,31,
-161,156,227,6,2,0,39,227,62,12,97,175,184,160,225,142,64,107,249,138,
-156,64,9,129,23,210,180,128,5,135,90,2,58,53,53,137,200,233,10,0,
-224,250,12,64,49,64,115,199,83,99,166,64,7,64,24,0,58,96,14,199,
-177,225,243,5,3,66,97,100,32,73,159,6,32,101,115,99,97,112,101,129,
-244,130,220,225,54,13,128,194,224,33,18,131,240,224,32,19,218,10,224,99,
-16,0,48,135,200,224,133,19,101,153,224,33,20,100,156,224,33,20,224,135,
-23,78,7,224,66,21,0,50,225,12,23,0,49,97,252,102,140,230,151,16,
-128,202,64,22,128,34,116,204,64,8,168,153,107,38,78,45,0,35,124,97,
-66,157,192,17,255,36,0,133,128,129,253,3,66,32,95,51,75,69,108,140,
-201,240,66,78,0,54,64,120,2,52,54,32,128,71,130,31,228,162,1,96,
-114,82,3,155,250,64,204,64,75,133,157,238,207,6,100,206,133,182,98,236,
-228,219,0,192,26,224,23,2,3,95,53,52,57,75,215,224,168,2,100,66,
-96,10,100,74,170,21,96,143,97,80,107,187,131,115,224,162,1,224,101,3,
-96,98,224,94,10,224,82,8,224,81,22,227,48,7,96,29,189,2,253,25,
-1,64,17,0,56,224,16,0,160,33,65,143,224,16,0,231,214,4,131,239,
-192,81,231,223,0,224,20,11,100,132,224,21,9,66,254,224,21,8,66,140,
-224,20,8,126,121,224,63,8,100,145,160,21,0,58,100,3,203,61,129,51,
-161,197,198,151,167,127,225,201,2,160,17,239,12,2,224,25,0,229,83,1,
-128,10,98,249,160,26,108,114,98,178,161,142,112,229,141,92,128,0,136,106,
-96,70,98,176,236,188,0,96,43,194,171,129,85,195,92,226,217,1,130,215,
-224,218,3,140,137,0,79,126,158,67,82,110,62,228,221,1,2,78,85,76,
-100,209,97,169,224,37,16,2,83,79,72,128,37,65,184,224,37,17,1,84,
-88,128,37,65,157,224,37,16,0,69,192,37,64,161,224,37,17,1,79,84,
-128,37,64,237,224,37,17,1,78,81,128,37,65,76,224,37,16,2,65,67,
-75,128,37,68,15,224,37,16,1,66,69,161,9,66,49,224,37,17,0,83,
-128,36,65,101,224,36,16,0,72,160,187,66,209,224,36,16,1,76,70,161,
-82,225,121,20,0,86,160,74,99,50,224,37,16,0,70,192,75,225,121,20,
-1,67,82,160,37,225,121,20,1,83,79,160,37,225,121,20,1,83,73,160,
-37,225,121,20,2,68,76,69,160,38,225,122,20,2,68,67,49,160,38,225,
-123,20,2,68,67,50,160,38,225,125,20,2,68,67,51,160,38,225,127,20,
-2,68,67,52,128,38,99,69,224,38,16,1,78,65,162,60,0,50,226,251,
-21,1,89,78,160,38,226,252,22,0,66,160,38,225,131,20,1,67,65,192,
-77,226,254,21,0,77,160,37,225,132,20,1,83,85,192,115,225,132,20,2,
-69,83,67,160,38,225,132,20,0,70,163,0,64,21,224,37,17,0,71,192,
-37,225,130,20,0,82,160,37,0,51,225,129,20,0,85,192,37,225,128,21,
-0,80,160,37,225,127,20,0,68,195,228,0,49,96,229,171,109,224,0,20,
-0,58,103,32,255,60,4,224,9,1,101,121,0,53,72,13,199,108,113,68,
-72,188,2,64,95,53,113,249,2,64,95,49,104,77,74,197,1,95,49,85,
-101,64,83,0,52,145,176,116,156,0,58,96,40,241,190,3,74,202,136,130,
-230,108,1,198,92,224,67,2,177,163,1,52,55,169,41,1,95,53,81,224,
-3,95,53,52,51,72,163,0,51,103,182,0,52,102,109,0,52,96,11,0,
-56,201,20,0,95,83,209,128,10,0,58,96,6,7,10,65,32,117,62,61,
-32,58,96,40,96,12,64,11,139,87,1,117,60,64,11,139,31,3,105,99,
-109,112,64,13,135,48,116,164,233,168,2,89,212,105,167,224,20,4,65,182,
-224,20,7,117,132,224,20,8,67,19,224,20,7,0,49,99,41,224,21,9,
-65,3,224,106,8,137,253,224,20,5,83,26,1,64,67,243,117,5,0,35,
-111,152,2,95,49,51,104,93,171,177,224,7,53,1,58,53,64,232,189,230,
-180,229,72,2,251,91,6,172,246,3,67,32,61,61,233,64,1,136,46,0,
-85,64,12,64,8,0,90,214,92,194,101,232,134,0,136,93,243,214,2,239,
-43,1,105,223,226,243,12,2,99,97,115,172,181,233,209,6,0,51,141,141,
-141,76,130,81,130,233,158,165,170,168,106,179,139,184,200,246,168,222,139,174,
-2,67,32,60,181,45,232,189,0,224,230,7,224,28,0,128,228,182,89,235,
-61,3,192,246,224,34,1,242,111,1,160,68,139,29,224,67,7,225,1,2,
-226,47,3,192,0,153,18,139,242,1,53,51,99,148,108,179,177,225,224,104,
-93,0,58,97,105,142,161,7,53,51,55,32,64,90,32,85,65,97,225,63,
-3,64,116,224,18,6,150,128,224,18,4,130,202,224,18,4,98,131,106,50,
-192,191,170,220,64,104,1,64,85,66,138,253,165,2,192,15,224,68,6,67,
-13,98,93,224,18,1,224,61,2,224,60,1,208,157,224,61,5,111,90,224,
-18,5,131,179,224,80,4,197,3,224,80,10,224,41,6,68,27,224,41,1,
-194,157,65,70,133,38,3,95,52,48,55,64,30,91,46,151,171,64,49,67,
-76,0,58,96,245,101,73,0,80,139,250,0,85,96,20,0,54,228,174,12,
-0,54,228,132,11,0,49,103,114,228,154,8,160,227,224,63,5,224,41,11,
-100,82,228,110,7,64,10,228,111,46,1,58,53,69,199,183,112,96,214,132,
-52,131,156,119,123,64,35,133,170,68,112,248,114,4,98,222,130,152,251,7,
-0,0,53,64,133,219,248,120,145,246,65,2,2,95,50,57,70,37,96,15,
-0,58,96,41,152,32,0,53,73,154,121,206,96,195,0,58,64,54,97,139,
-64,227,218,7,64,77,0,48,92,2,174,32,96,39,133,21,71,26,2,51,
-56,54,173,95,213,44,76,220,0,52,91,116,65,50,108,221,160,13,143,162,
-0,53,217,121,204,234,252,28,1,0,58,64,105,160,88,144,90,65,114,237,
-75,0,129,36,0,67,186,120,72,12,241,211,4,17,33,33,58,32,105,110,
-100,101,120,32,116,111,111,32,108,97,114,103,197,33,164,15,227,236,1,77,
-64,224,78,0,146,250,240,50,1,255,178,1,244,41,7,64,97,7,110,101,
-103,97,116,105,118,101,128,106,96,96,1,58,53,66,15,132,10,224,48,5,
-15,105,110,105,116,58,32,101,109,112,116,121,32,108,105,115,116,96,46,225,
-207,4,251,150,7,165,197,105,136,128,90,131,30,97,218,1,58,53,72,224,
-232,83,3,66,147,67,99,200,63,128,20,134,73,64,99,208,242,165,188,229,
-197,0,232,237,2,97,17,200,207,160,115,0,54,134,49,92,116,104,112,209,
-26,128,14,241,163,1,72,142,146,249,65,65,64,27,210,197,224,35,6,96,
-157,224,35,0,0,55,130,237,0,58,111,47,160,104,224,44,2,97,24,224,
-44,0,90,130,64,42,131,12,160,183,134,185,160,241,226,125,3,70,119,1,
-95,53,107,214,129,246,96,23,129,86,82,66,75,201,254,141,4,198,220,151,
-194,245,3,6,128,55,96,37,0,85,191,153,245,51,0,96,52,128,31,128,
-86,129,124,184,10,97,204,96,74,252,171,4,231,149,1,70,104,251,113,1,
-99,31,123,113,64,73,96,23,128,230,178,123,132,123,1,51,56,221,178,227,
-157,0,224,203,3,193,195,128,153,97,114,247,178,1,64,102,229,121,0,245,
-134,1,245,135,2,97,11,231,22,0,224,5,0,155,210,224,15,3,66,112,
-228,170,0,134,33,128,2,154,39,225,162,0,177,114,168,95,160,152,192,1,
-104,140,128,0,192,45,249,140,0,160,54,104,164,224,53,3,160,202,224,74,
-8,128,146,229,218,4,129,182,128,93,137,87,183,203,128,148,96,90,160,75,
-224,126,3,103,115,64,222,225,181,3,255,19,8,224,91,0,230,228,0,96,
-74,224,51,28,96,199,165,226,225,42,11,225,176,0,224,46,1,224,1,3,
-210,181,128,125,225,56,11,129,53,160,47,242,184,2,197,4,225,65,134,129,
-66,224,62,0,225,68,42,66,195,98,204,168,94,64,4,227,22,2,227,43,
-13,160,180,230,179,47,0,58,100,98,203,85,228,190,20,103,132,224,38,10,
-229,54,13,133,207,229,58,23,230,102,6,8,100,105,103,105,116,84,111,73,
-110,134,96,64,218,247,2,11,160,16,183,12,64,86,249,153,0,224,49,27,
-96,176,224,49,23,0,54,160,255,65,33,236,119,2,224,210,19,0,57,161,
-166,0,49,72,101,1,55,51,224,215,2,12,92,51,52,38,108,105,98,47,
-68,97,116,97,47,91,92,2,46,104,115,64,19,4,44,49,48,55,58,146,
-93,161,160,183,247,226,57,0,248,4,18,98,215,224,209,2,64,170,82,84,
-230,240,4,2,53,48,52,236,26,6,163,17,1,58,53,82,167,231,130,3,
-71,204,218,165,199,212,163,51,227,42,4,107,205,0,64,192,41,192,17,229,
-55,0,102,48,233,211,2,233,204,0,96,115,231,246,2,248,147,0,64,4,
-0,85,134,178,70,114,224,87,0,198,209,229,175,0,250,101,6,128,85,166,
-167,64,92,0,54,135,89,235,8,27,235,50,13,235,114,11,80,91,224,20,
-9,129,248,239,203,6,173,19,224,83,5,64,166,224,20,8,224,125,11,112,
-240,235,176,14,224,20,6,224,125,11,76,70,224,20,9,131,155,224,251,6,
-225,16,11,110,15,224,146,8,224,167,12,224,83,11,236,152,13,64,10,224,
-253,10,224,211,11,1,56,55,177,10,224,22,6,0,54,225,85,12,1,56,
-53,224,196,12,1,56,53,161,215,236,224,5,1,56,55,67,5,241,81,69,
-224,7,119,1,58,53,86,220,131,235,240,170,4,198,14,225,2,5,98,50,
-67,44,159,55,67,107,87,142,102,137,1,58,53,87,77,100,225,169,20,186,
-22,128,90,192,72,241,195,17,4,83,79,85,82,67,151,75,163,182,234,80,
-1,134,14,68,220,2,50,48,53,74,73,64,127,5,66,32,95,52,53,51,
-64,13,102,139,237,213,2,228,96,0,224,159,2,155,21,128,193,0,58,96,
-192,170,111,73,207,136,179,237,24,0,96,8,164,39,77,28,231,52,15,242,
-244,2,0,80,100,94,124,118,2,95,53,48,245,220,5,15,110,99,108,111,
-115,101,100,32,123,45,32,99,111,109,109,101,166,152,138,103,233,220,1,133,
-62,167,206,193,66,254,39,6,241,145,0,132,210,242,170,0,225,175,13,100,
-96,229,126,0,129,12,235,211,0,97,82,235,142,4,232,80,0,224,147,37,
-192,101,224,146,28,148,213,224,147,23,238,126,11,234,14,5,64,60,233,169,
-12,130,222,224,46,32,148,31,233,66,0,224,231,2,224,84,4,232,253,0,
-224,175,5,192,156,192,24,1,95,53,160,126,224,16,2,224,192,0,166,99,
-0,58,96,24,110,196,238,232,0,65,83,1,95,50,133,40,96,177,113,255,
-160,95,225,163,10,0,58,96,86,96,67,193,102,128,49,67,52,225,59,0,
-131,65,64,196,105,173,224,71,4,104,189,69,20,148,185,0,58,96,184,102,
-247,103,78,234,14,3,224,154,0,160,99,224,73,5,64,59,65,11,237,189,
-1,64,107,141,189,67,7,232,72,3,232,66,6,120,199,224,28,15,133,199,
-224,18,4,129,91,0,58,99,227,232,159,9,1,95,53,68,44,0,58,100,
-13,239,69,9,233,100,10,0,58,96,48,224,42,9,234,138,6,110,204,0,
-58,96,98,233,191,13,224,47,5,137,69,101,94,233,191,32,1,49,49,233,
-191,47,192,109,233,203,1,64,170,228,220,1,1,80,32,130,225,129,142,178,
-207,5,51,55,56,32,95,51,88,159,224,10,3,2,52,48,52,66,59,89,
-99,0,52,73,220,1,95,52,82,203,224,6,0,1,53,48,102,47,0,48,
-130,119,1,95,48,64,54,0,48,96,43,0,54,160,54,0,64,66,140,245,
-164,8,6,52,57,55,32,95,52,57,76,81,96,36,225,15,1,2,101,111,
-102,128,244,122,54,2,50,51,49,160,137,214,184,0,58,96,114,147,155,0,
-52,69,220,96,112,140,161,1,51,55,64,75,131,213,3,95,51,56,49,234,
-71,5,99,203,131,236,2,95,51,56,103,174,0,51,96,210,0,51,129,47,
-0,67,69,168,175,230,0,58,64,155,64,101,2,80,32,58,64,101,131,85,
-82,94,64,185,160,126,96,110,68,23,96,67,0,54,67,23,183,50,96,97,
-105,241,96,12,0,79,98,10,74,193,109,119,0,51,138,85,64,75,130,149,
-2,95,49,51,193,111,0,49,64,209,0,56,68,35,0,52,65,41,225,138,
-4,106,193,129,120,65,65,0,52,96,141,130,172,3,95,52,57,49,64,4,
-90,255,96,33,0,58,96,31,224,91,14,0,80,96,37,98,53,1,52,49,
-193,96,1,95,52,70,196,106,167,1,95,52,104,235,0,58,96,79,96,93,
-1,56,50,161,169,225,168,1,3,118,97,108,117,116,60,225,224,7,98,140,
-251,249,8,96,78,187,61,129,33,1,52,56,65,118,1,95,52,98,48,225,
-232,1,161,179,0,58,64,209,64,45,242,159,1,192,200,225,37,3,136,11,
-129,254,1,52,56,164,30,65,249,130,22,96,71,245,47,0,128,114,2,95,
-52,56,76,134,224,113,10,64,63,227,249,0,224,108,16,128,103,0,58,96,
-69,163,80,226,121,0,134,37,123,7,161,252,212,81,242,14,0,154,202,229,
-160,0,2,51,56,48,133,90,162,178,98,31,173,32,146,136,128,34,64,112,
-188,246,1,51,57,97,141,0,51,195,60,2,95,52,49,225,158,9,4,92,
-57,50,38,110,225,158,10,64,90,170,173,129,158,199,26,64,96,162,142,226,
-116,3,226,31,6,129,18,194,60,96,17,64,74,0,58,98,156,130,42,2,
-51,32,58,96,31,226,56,15,2,107,101,121,224,151,10,100,22,226,54,0,
-0,50,226,55,4,67,172,248,8,0,161,107,233,102,3,227,128,0,195,112,
-192,2,241,231,1,128,107,231,243,0,228,29,53,227,226,35,66,56,162,83,
-225,166,1,106,165,64,198,3,95,52,56,48,64,19,121,214,65,3,248,228,
-0,0,85,194,21,251,158,4,161,185,128,31,0,90,231,8,4,160,110,131,
-52,165,229,96,132,69,229,64,102,64,23,251,126,8,65,52,224,18,6,173,
-43,224,18,3,98,35,250,172,7,64,252,66,66,225,217,1,3,84,82,97,
-119,166,177,224,24,5,2,69,79,70,203,194,64,24,99,204,0,49,224,31,
-2,3,123,45,35,32,96,32,103,48,0,49,226,45,3,3,32,35,45,125,
-253,196,0,224,151,7,135,99,224,150,4,65,209,224,149,6,2,73,110,100,
-203,93,224,27,8,3,66,114,97,99,254,36,0,240,78,0,225,17,6,174,
-84,224,18,3,142,34,224,121,4,65,108,64,93,74,237,232,163,6,239,169,
-0,224,23,7,142,82,194,89,224,151,1,6,125,32,108,97,121,111,117,160,
-180,225,40,2,224,23,4,227,194,0,71,76,68,177,1,52,55,164,57,224,
-25,4,224,20,0,225,213,7,224,195,9,64,143,224,57,1,1,49,53,164,
-27,224,18,2,115,231,192,23,193,206,77,130,4,54,51,32,79,32,112,105,
-131,37,100,209,97,204,227,58,3,64,0,0,58,98,250,102,155,69,91,2,
-52,49,54,82,28,0,52,90,215,2,95,52,55,168,187,0,50,70,207,96,
-185,0,95,80,0,160,11,0,58,96,6,96,58,0,48,64,218,68,47,3,
-95,52,54,53,64,31,134,77,0,54,72,120,128,11,1,49,56,224,11,3,
-97,9,128,35,0,55,105,41,0,57,224,53,0,0,73,67,33,64,9,188,
-73,69,189,186,115,67,70,244,73,6,21,73,110,116,101,103,101,114,58,32,
-100,105,118,105,115,105,111,110,32,98,121,32,48,233,169,0,96,54,72,7,
-134,182,242,252,1,0,55,65,247,0,55,242,133,1,224,17,9,128,64,96,
-61,224,7,0,132,155,248,66,1,236,184,3,65,0,97,46,243,74,0,107,
-242,0,54,96,93,1,52,55,164,41,64,1,95,208,243,111,1,133,24,160,
-12,79,134,68,156,74,69,227,0,0,230,186,2,153,198,76,250,128,88,164,
-150,68,234,193,224,179,141,96,56,64,73,165,184,224,0,0,0,58,97,113,
-176,80,147,202,1,95,52,106,174,0,50,69,92,0,58,96,49,252,210,2,
-98,148,212,58,224,19,0,66,165,96,8,116,10,226,83,3,231,104,4,247,
-233,2,97,43,250,145,2,160,238,128,69,215,128,6,49,52,50,32,95,51,
-52,140,181,240,97,4,64,28,77,40,224,28,0,96,241,75,127,1,51,51,
-168,105,75,126,128,12,1,95,49,134,150,64,218,65,19,112,123,158,252,65,
-219,0,58,97,95,154,180,224,211,1,96,7,129,20,128,181,104,60,224,7,
-3,125,220,124,124,0,52,100,68,161,196,105,193,0,54,135,252,96,6,193,
-150,96,26,70,93,64,21,64,59,77,163,1,95,52,100,104,233,39,0,96,
-49,96,28,195,199,96,58,66,5,179,150,1,95,52,115,27,97,90,162,116,
-143,55,0,83,154,234,252,55,1,103,127,128,33,97,112,98,75,68,221,1,
-95,52,115,117,192,117,135,38,65,125,225,229,0,96,17,64,87,231,182,2,
-1,95,52,151,189,192,95,160,163,169,32,128,12,98,99,128,185,2,95,52,
-55,97,107,140,29,224,197,16,64,39,192,57,64,66,225,16,3,227,134,2,
-110,118,132,178,96,69,173,113,237,100,2,71,70,101,55,103,167,135,247,3,
-95,52,55,50,226,139,0,224,77,3,224,13,5,0,58,99,144,255,1,11,
-2,108,97,115,255,1,9,129,44,103,229,0,90,64,239,128,175,0,58,96,
-8,100,255,224,89,0,1,79,32,69,182,64,127,0,58,97,13,227,72,0,
-132,232,0,75,98,124,199,254,108,194,65,255,168,36,68,24,177,17,227,56,
-2,122,51,130,43,117,251,1,95,52,118,170,66,218,64,14,0,58,100,9,
-3,10,65,32,89,160,45,253,85,1,164,167,160,73,64,93,96,70,137,204,
-131,186,228,148,0,68,222,224,10,7,64,133,245,99,2,98,66,147,104,99,
-102,253,202,11,133,105,251,74,31,64,60,0,58,101,54,255,41,1,128,50,
-2,52,32,64,129,29,0,54,224,27,12,97,71,64,198,134,125,0,56,102,
-179,86,111,134,185,64,106,0,50,96,34,202,250,70,192,130,108,131,131,66,
-139,2,95,52,52,107,74,64,215,64,230,96,234,0,54,74,22,128,67,131,
-228,1,95,52,173,134,192,13,65,252,102,164,64,111,225,253,8,0,49,193,
-253,64,39,224,29,2,0,52,224,29,6,175,164,230,118,7,0,58,96,102,
-98,29,71,229,226,191,2,0,58,96,167,112,223,101,64,231,17,1,230,186,
-10,230,249,1,231,66,11,224,48,20,97,192,226,57,5,180,50,229,217,5,
-130,62,132,230,230,242,3,130,98,66,236,226,169,0,99,233,72,54,133,139,
-237,76,0,160,60,231,78,0,244,152,0,224,114,0,228,139,0,230,71,2,
-255,182,1,224,115,19,224,113,5,224,111,3,224,49,17,0,53,135,191,224,
-0,2,0,58,98,40,238,88,0,104,183,82,86,195,144,0,52,73,128,64,
-99,118,245,96,231,0,56,205,63,1,52,52,81,81,1,53,54,236,71,0,
-215,28,224,155,6,0,58,96,119,98,165,1,53,48,64,67,244,74,5,245,
-107,9,0,73,113,128,3,95,52,53,49,195,98,2,52,53,50,224,10,1,
-0,52,65,226,99,111,134,164,3,95,52,53,53,224,18,6,0,58,96,150,
-232,3,0,65,106,225,132,1,191,130,102,22,1,95,49,90,47,200,137,230,
-101,2,101,147,0,53,65,55,192,41,0,50,232,179,4,151,250,0,50,232,
-142,2,224,60,20,65,1,224,59,17,0,58,64,193,160,174,97,187,224,64,
-22,96,63,233,10,1,0,58,65,19,129,196,168,199,252,212,1,130,18,167,
-242,0,82,224,22,4,208,206,64,63,131,233,70,6,98,143,167,117,128,1,
-90,154,160,41,226,188,0,142,235,224,242,3,1,32,64,65,215,193,89,97,
-210,96,49,100,73,64,236,253,162,5,241,75,1,128,76,135,213,96,66,66,
-16,114,91,229,78,4,0,58,96,241,239,152,0,192,1,105,117,224,153,1,
-224,20,5,224,17,8,224,14,5,224,11,2,192,8,166,50,64,109,228,166,
-0,2,52,32,75,144,117,0,52,132,159,168,28,105,38,92,67,0,58,99,
-19,192,222,128,216,0,58,96,25,157,196,136,121,87,176,1,55,32,130,159,
-99,47,225,165,2,168,112,129,18,192,92,248,131,13,197,69,64,33,225,81,
-3,64,64,0,85,240,100,1,192,18,1,66,39,224,21,3,160,104,224,29,
-0,128,39,225,221,1,96,228,226,137,0,160,42,126,209,238,76,2,103,37,
-136,145,235,22,0,192,97,233,168,0,162,74,128,90,1,95,49,114,83,169,
-139,136,237,103,46,141,126,197,4,234,236,2,234,237,5,128,151,130,226,224,
-67,0,98,100,64,144,0,52,95,139,64,76,135,140,69,245,0,58,100,241,
-225,170,1,135,23,0,49,96,24,177,33,70,51,163,27,104,248,230,32,4,
-139,254,230,217,2,233,106,7,96,144,168,253,167,187,0,64,229,232,0,243,
-125,1,132,106,128,102,187,218,97,27,128,24,129,123,224,86,2,197,122,252,
-177,1,96,89,196,189,64,196,94,157,96,55,73,27,192,155,65,44,161,40,
-180,10,138,153,147,109,224,46,3,192,102,203,43,230,222,1,224,184,11,224,
-134,15,108,37,64,121,224,137,8,192,90,224,134,27,224,181,2,225,11,5,
-192,73,129,11,97,122,248,195,16,175,30,96,7,3,114,110,97,108,216,207,
-1,53,52,184,206,0,58,97,253,102,124,0,51,79,254,70,147,0,58,96,
-119,162,228,97,152,128,240,240,158,0,98,190,252,101,4,66,244,234,25,14,
-160,55,204,93,227,136,4,135,150,128,5,235,137,8,19,105,109,112,111,115,
-115,105,98,108,101,58,32,120,115,32,62,61,32,121,115,96,179,116,144,224,
-243,41,3,57,48,58,54,242,188,0,237,245,2,64,149,226,112,0,227,151,
-3,166,79,227,150,2,135,12,227,210,4,195,107,1,52,51,118,205,167,211,
-228,95,0,224,80,11,237,155,2,224,80,2,97,202,96,69,65,149,64,24,
-229,204,0,143,166,66,1,227,244,0,225,108,8,128,119,164,51,196,81,196,
-57,224,55,1,64,124,224,14,3,228,84,1,239,51,0,0,58,96,132,164,
-29,145,49,227,134,2,234,49,10,96,29,160,190,105,4,229,8,7,64,82,
-0,54,196,158,1,95,50,66,185,235,208,1,131,58,163,67,129,134,155,186,
-2,64,95,50,149,250,133,127,160,120,197,224,91,201,130,182,83,106,162,182,
-188,0,228,71,5,129,61,229,163,9,161,172,229,165,8,226,6,15,96,188,
-64,110,161,177,230,54,1,99,170,108,86,202,224,226,94,46,224,91,0,226,
-94,10,224,95,3,226,94,32,224,80,1,161,159,99,106,0,58,96,24,226,
-94,6,130,58,226,57,0,100,113,230,113,2,224,11,3,0,58,96,71,1,
-10,65,67,226,0,58,96,147,97,137,75,28,0,50,102,75,0,50,106,228,
-145,41,0,50,99,23,93,48,176,138,0,53,100,103,107,34,0,53,75,33,
-96,10,0,58,96,6,230,192,6,192,251,96,78,151,108,165,45,128,6,0,
-58,96,80,224,52,27,224,59,2,0,58,96,139,224,52,20,224,98,2,160,
-59,0,58,96,198,224,52,27,224,112,2,0,58,97,1,103,3,134,252,226,
-149,3,143,39,224,19,0,115,0,166,54,2,95,52,50,108,144,212,181,165,
-50,0,52,126,230,230,93,1,97,136,64,123,135,101,96,86,79,6,0,50,
-78,100,78,197,128,47,198,103,96,65,141,142,237,6,1,163,118,230,216,1,
-71,247,145,191,111,9,0,51,112,98,128,17,192,118,0,58,96,7,3,10,
-65,32,75,144,192,64,84,64,13,2,50,32,58,96,114,96,25,111,160,64,
-137,154,120,72,134,98,1,0,49,123,173,66,37,205,84,0,50,129,49,96,
-31,0,58,96,31,193,49,231,124,0,224,174,0,96,48,164,28,232,220,2,
-192,13,0,49,74,65,131,220,96,167,64,82,160,127,225,32,2,97,169,217,
-187,64,15,64,9,219,122,2,95,49,53,224,86,0,0,58,96,6,105,13,
-2,95,52,49,118,220,0,49,105,61,0,49,193,214,3,83,32,95,51,66,
-24,101,99,75,147,65,168,67,110,64,166,92,234,96,7,108,137,172,154,165,
-172,131,99,1,95,51,66,191,0,58,96,85,237,140,0,202,118,129,148,205,
-144,194,61,0,95,74,216,163,210,224,117,39,199,143,233,134,6,199,211,103,
-157,141,241,171,134,133,213,96,37,129,121,3,48,53,32,35,75,0,128,21,
-140,153,2,66,32,95,80,204,224,131,24,224,73,10,160,144,224,95,13,130,
-154,97,246,224,107,42,160,75,237,29,1,65,191,97,202,101,46,66,25,64,
-114,138,217,163,33,110,196,0,51,225,4,7,171,131,235,240,1,64,132,175,
-151,66,199,122,228,192,22,2,95,49,51,232,194,3,2,32,37,32,168,113,
-224,45,5,167,134,67,31,122,43,192,15,130,99,141,77,64,6,253,103,11,
-163,178,67,181,131,168,225,63,0,179,185,225,58,1,161,61,224,32,0,237,
-214,1,64,24,237,216,0,253,129,55,98,136,64,65,224,21,1,253,115,0,
-190,10,0,58,93,110,64,206,0,85,78,44,105,240,0,58,94,205,64,18,
-3,80,32,58,52,67,16,99,169,0,48,80,170,68,197,87,235,1,52,48,
-231,241,1,110,122,0,95,67,121,0,58,125,181,128,45,253,170,4,0,58,
-96,47,161,51,174,173,0,58,64,35,128,19,0,80,163,119,0,85,96,21,
-0,54,224,123,0,71,58,154,107,173,155,0,95,91,189,127,102,67,56,64,
-218,71,123,206,5,226,44,1,95,250,0,64,127,251,129,224,65,67,0,51,
-66,143,98,112,0,48,226,112,0,65,137,1,95,51,105,175,96,84,193,206,
-225,121,8,134,14,225,117,17,0,79,226,90,2,118,161,66,92,161,132,226,
-37,2,201,183,65,133,64,141,194,8,186,57,192,20,194,7,224,135,1,102,
-184,99,50,2,95,51,56,226,168,2,1,51,57,120,66,128,232,68,131,0,
-48,224,248,1,0,58,96,6,195,89,70,198,2,95,52,48,104,4,0,48,
-105,93,105,240,66,231,1,51,57,70,0,128,233,0,58,96,65,226,14,0,
-128,17,130,13,0,85,66,29,162,32,64,71,192,89,132,163,65,154,160,74,
-132,254,99,199,0,95,69,64,160,21,193,167,129,157,0,58,96,186,208,167,
-64,14,231,251,3,130,156,1,90,32,226,204,1,0,58,97,104,181,126,64,
-13,130,38,131,219,97,55,1,95,51,86,127,0,58,97,150,247,196,0,96,
-19,241,123,2,241,63,21,0,58,66,11,224,253,0,68,178,0,58,96,172,
-66,210,71,115,66,110,193,204,131,199,161,157,128,12,0,79,128,71,227,102,
-3,1,95,49,64,55,98,122,0,95,94,24,194,188,73,178,128,10,0,50,
-75,241,96,10,0,58,96,6,118,123,160,18,226,58,8,97,26,96,237,130,
-35,162,143,2,49,32,64,88,99,0,80,165,123,197,146,253,34,1,83,22,
-226,108,1,124,25,243,71,3,226,167,2,0,56,192,108,177,1,85,22,229,
-189,2,213,40,101,160,96,47,198,187,128,52,96,204,64,18,97,4,66,95,
-224,220,1,164,73,117,171,98,197,0,58,96,109,247,56,1,243,149,2,229,
-60,22,225,199,0,251,94,6,137,171,0,54,166,33,224,51,4,64,15,244,
-233,5,220,218,224,47,8,227,145,3,170,52,198,174,64,200,64,186,164,183,
-239,24,6,5,102,111,108,100,108,49,250,164,8,64,71,69,30,64,249,128,
-57,244,77,0,247,170,3,96,91,0,54,193,36,68,148,0,56,114,108,67,
-152,173,92,98,85,75,222,1,49,48,192,0,1,32,58,96,38,229,92,6,
-96,184,96,72,230,165,3,128,246,226,67,4,162,192,245,128,2,99,110,128,
-75,129,135,225,46,1,194,48,130,66,192,0,0,95,66,204,67,26,64,118,
-131,45,0,80,64,149,130,204,0,73,64,10,129,250,64,10,64,135,244,157,
-0,96,50,0,55,129,78,0,82,110,6,100,166,0,51,113,103,91,209,96,
-185,0,54,226,221,21,126,127,226,199,2,96,83,129,104,0,90,66,165,0,
-58,96,65,97,31,0,90,115,49,0,58,96,95,174,243,0,48,69,5,130,
-7,0,51,91,174,1,95,51,70,201,100,194,192,26,1,95,51,72,123,2,
-95,49,49,160,15,64,64,198,66,1,95,51,92,37,97,31,224,47,3,65,
-93,241,163,1,206,221,86,7,0,64,73,39,117,26,176,24,129,252,224,60,
-0,96,241,101,149,64,116,161,163,224,122,1,227,151,0,0,51,77,43,64,
-0,68,1,70,169,160,122,91,87,64,140,224,18,0,64,216,114,4,0,51,
-125,28,224,75,0,200,34,0,58,96,104,76,26,101,239,0,58,96,38,133,
-89,128,103,96,19,129,203,4,94,103,101,116,98,65,196,163,202,7,50,52,
-52,32,79,32,95,51,69,251,0,79,64,14,157,72,64,84,189,60,131,148,
-224,221,0,65,94,0,53,96,160,78,215,2,51,54,54,65,64,2,55,32,
-64,227,66,1,7,111,112,101,110,70,105,108,101,99,56,225,115,4,189,76,
-72,44,109,9,0,58,96,57,233,136,2,97,94,200,5,188,52,0,51,89,
-127,157,1,64,152,100,149,253,133,0,65,76,125,113,130,68,99,228,96,6,
-224,142,1,1,58,32,210,152,0,58,64,173,226,53,11,134,226,98,53,108,
-195,128,26,172,198,225,138,4,129,157,224,34,2,172,109,1,58,51,189,48,
-241,10,3,0,51,71,65,65,127,98,75,171,30,0,50,81,92,224,33,6,
-0,50,109,86,224,54,8,110,98,1,95,51,157,34,0,51,93,17,225,79,
-2,74,159,0,58,96,141,96,117,1,95,50,87,244,1,95,51,93,25,0,
-58,96,43,65,236,4,102,108,117,115,104,65,238,189,48,64,128,226,227,1,
-64,6,161,221,224,224,0,241,93,3,239,140,3,117,122,0,83,128,118,64,
-3,224,135,4,113,192,65,169,104,64,90,16,226,14,2,23,104,67,108,111,
-115,101,58,32,72,97,110,100,108,101,32,97,108,114,101,97,100,121,32,99,
-64,21,0,100,129,154,227,0,6,91,63,97,150,96,209,0,53,140,36,227,
-4,1,187,102,97,23,130,244,104,38,189,219,100,91,68,118,119,77,1,95,
-51,92,99,96,46,189,225,65,42,68,204,106,212,96,29,65,40,96,141,65,
-40,64,109,100,220,68,187,2,95,51,49,71,13,1,53,53,237,223,0,0,
-58,96,156,10,10,65,32,116,111,70,117,110,80,116,114,64,50,129,249,66,
-213,194,214,251,19,0,226,214,5,161,84,224,9,6,135,133,90,166,162,203,
-226,226,2,160,6,0,58,97,90,233,4,2,201,6,231,98,0,233,21,21,
-64,64,169,4,1,51,53,70,111,186,207,1,95,50,75,130,90,91,0,58,
-64,23,128,18,0,57,71,21,0,51,109,47,0,51,180,22,1,53,53,160,
-38,64,144,70,43,160,11,0,55,65,30,96,11,0,58,96,6,104,249,1,
-49,56,141,252,192,154,135,251,237,227,2,106,109,160,5,98,125,111,11,129,
-20,64,174,103,150,197,195,192,31,109,226,1,95,51,68,159,67,153,231,179,
-3,227,225,0,160,43,96,30,224,36,16,193,27,133,180,98,106,92,18,67,
-121,0,50,114,109,0,50,128,10,0,56,165,8,224,84,28,128,174,232,125,
-5,224,183,5,173,217,224,106,20,238,230,12,0,40,128,98,224,134,9,0,
-79,143,131,198,5,224,130,0,96,115,73,181,161,188,1,50,52,192,11,0,
-58,96,6,193,164,0,75,101,61,64,78,0,85,236,6,1,5,67,32,60,
-32,64,35,65,209,224,18,6,79,227,224,19,8,143,171,224,19,5,64,232,
-248,205,0,160,19,64,124,0,85,224,212,2,0,105,88,62,3,114,117,112,
-116,196,1,224,28,3,14,114,101,115,111,117,114,99,101,32,118,97,110,105,
-115,104,192,34,224,35,4,5,116,105,109,101,111,117,169,155,224,110,8,67,
-68,224,45,3,20,117,110,115,117,112,112,111,114,116,101,100,32,111,112,101,
-114,97,116,105,111,110,224,120,9,12,104,97,114,100,119,97,114,101,32,102,
-97,117,108,192,91,224,243,8,108,44,224,19,6,69,169,224,132,7,68,203,
-224,243,5,14,97,112,112,114,111,112,114,105,97,116,101,32,116,121,112,135,
-32,224,35,6,12,118,97,108,105,100,32,97,114,103,117,109,101,110,192,131,
-224,34,3,3,102,97,105,108,225,18,0,224,115,7,68,165,224,44,3,13,
-112,114,111,116,111,99,111,108,32,101,114,114,111,114,224,111,9,5,115,121,
-115,116,101,109,224,29,3,224,240,9,225,247,10,225,246,10,225,245,10,225,
-244,7,21,117,110,115,97,116,105,115,102,105,101,100,32,99,111,110,115,116,
-114,97,105,110,116,154,118,224,40,5,2,115,101,114,224,147,4,224,210,4,
-13,101,114,109,105,115,115,105,111,110,32,100,101,110,105,225,10,15,226,2,
-7,6,105,108,108,101,103,97,108,225,254,19,7,101,110,100,32,111,102,32,
-102,200,186,225,10,9,225,230,10,225,229,7,226,188,0,5,101,120,104,97,
-117,115,226,224,21,2,98,117,115,112,102,225,201,10,224,86,6,10,100,111,
-101,115,32,110,111,116,32,101,120,236,146,0,224,31,3,199,85,96,30,161,
-82,128,0,196,11,154,186,132,11,117,128,96,6,196,11,2,95,49,51,77,
-210,101,93,78,32,70,45,199,130,234,189,3,100,49,233,93,3,135,213,0,
-45,96,113,1,95,49,111,31,212,100,224,110,0,114,164,96,6,228,122,4,
-228,234,8,1,48,120,128,184,71,14,1,51,48,102,133,87,34,1,95,51,
-95,127,73,38,164,225,192,210,154,185,128,99,64,11,0,58,96,6,96,99,
-0,48,96,136,107,132,95,117,1,95,51,95,148,2,95,49,56,73,94,96,
-77,1,95,49,110,195,192,11,103,6,128,11,0,57,102,235,96,11,0,51,
-85,69,0,58,96,12,8,10,65,32,117,114,101,109,32,58,96,73,64,13,
-3,113,117,111,116,64,14,167,87,2,49,48,56,128,177,104,163,119,218,65,
-44,0,56,128,125,67,152,0,58,96,144,241,205,0,65,96,174,194,103,5,
-65,111,75,14,136,106,236,122,4,224,22,1,102,86,74,116,253,164,26,4,
-95,84,121,112,101,221,160,1,54,48,190,148,192,67,255,251,2,70,176,0,
-79,64,127,244,118,2,224,34,5,224,26,3,224,23,2,211,91,253,25,4,
-0,58,96,237,65,18,3,52,49,32,95,72,208,0,95,107,51,0,51,125,
-196,0,51,85,252,154,234,0,73,97,1,235,45,0,252,211,2,98,254,96,
-9,0,95,76,202,0,58,96,47,141,172,93,94,107,41,81,230,247,122,2,
-0,58,64,88,64,35,2,42,32,58,96,105,96,128,216,178,1,95,51,147,
-38,103,59,0,51,120,147,0,51,88,233,1,95,51,75,141,123,53,129,178,
-123,53,128,10,0,58,96,6,65,233,1,62,61,64,83,130,90,1,117,62,
-64,11,162,16,0,60,96,24,162,15,0,60,64,11,130,12,3,117,99,109,
-112,64,13,129,238,248,202,50,162,239,152,202,67,19,162,62,65,52,240,243,
-0,133,246,67,52,124,8,92,75,78,156,158,137,160,9,2,54,32,35,106,
-90,217,29,224,46,12,2,54,32,35,182,165,0,58,96,113,98,214,3,51,
-57,32,58,96,41,249,68,8,234,191,1,128,23,113,140,169,210,249,84,2,
-75,81,249,84,46,177,178,214,59,158,202,165,145,224,96,1,249,181,56,88,
-168,224,100,1,128,224,160,216,192,215,224,102,5,249,42,33,224,144,45,242,
-147,6,18,78,117,109,101,114,105,99,46,115,104,111,119,73,110,116,65,116,
-66,97,77,80,7,110,101,103,97,116,105,118,101,232,45,7,129,32,128,2,
-139,90,171,138,224,231,3,119,100,224,196,30,97,234,64,23,87,216,224,23,
-1,224,84,62,69,64,250,200,4,224,254,30,233,212,3,2,98,97,115,199,
-179,128,149,85,45,161,8,226,174,0,194,164,0,83,79,44,157,190,237,138,
-0,141,141,224,49,6,194,105,160,83,192,11,226,117,8,224,70,4,250,21,
-4,224,61,0,211,136,225,73,13,242,255,2,224,10,2,224,55,2,225,95,
-3,0,51,94,248,141,41,128,65,99,190,225,81,19,0,58,100,124,131,191,
-98,227,130,146,160,34,96,82,0,53,224,204,0,0,58,96,95,248,44,0,
-0,52,128,36,0,58,96,34,110,63,2,48,32,75,86,65,101,90,232,9,
-3,0,83,106,75,4,46,73,79,46,69,201,186,224,28,1,6,73,79,69,
-120,99,101,112,233,120,0,192,106,133,72,64,122,0,90,72,97,165,202,72,
-106,110,138,94,115,0,51,123,201,0,50,71,218,224,79,1,4,115,116,100,
-101,114,96,99,0,58,113,39,84,154,1,79,46,128,21,68,175,206,222,96,
-64,94,247,146,225,224,64,4,0,105,96,138,0,58,113,158,224,63,0,3,
-105,110,32,58,96,48,102,63,78,201,201,14,151,29,105,17,224,9,1,128,
-30,87,35,64,114,104,142,77,209,191,57,64,15,94,242,145,209,0,58,96,
-6,96,150,1,52,51,64,101,129,148,0,75,96,11,129,115,163,180,243,107,
-2,90,233,64,100,242,151,4,146,253,194,213,244,120,4,91,218,96,36,0,
-51,91,155,64,6,133,209,130,144,123,114,159,162,102,14,128,212,98,56,1,
-95,51,108,197,1,95,51,109,232,97,134,191,58,71,162,72,217,122,30,97,
-135,224,6,2,119,20,189,255,1,75,52,64,201,129,187,239,96,0,242,110,
-1,92,89,227,88,0,241,239,3,113,100,109,87,98,196,224,55,6,0,50,
-81,95,224,192,1,242,168,0,165,162,1,95,50,81,145,160,176,226,9,0,
-12,112,101,114,102,111,114,109,73,79,32,94,38,99,145,219,64,31,130,22,
-2,102,112,102,129,230,129,248,6,102,112,110,101,119,32,58,96,159,82,11,
-7,97,100,100,95,70,73,76,69,64,18,178,30,64,18,3,117,116,102,56,
-64,18,212,177,1,95,51,117,197,104,241,188,241,0,67,64,31,246,152,0,
-245,53,4,153,143,65,40,160,223,128,11,129,90,240,6,1,0,79,82,68,
-0,52,169,107,224,23,7,0,57,201,131,224,24,5,91,85,224,23,8,226,
-233,1,1,119,43,165,25,1,95,51,221,77,244,162,1,130,169,1,95,50,
-98,160,225,94,3,194,32,226,117,8,0,58,98,146,116,92,85,232,64,241,
-129,241,64,238,0,50,157,80,92,110,1,58,51,188,134,75,231,0,50,91,
-235,128,8,0,55,135,214,128,12,0,56,128,29,137,144,92,145,64,139,126,
-212,64,63,219,74,106,29,72,144,1,95,50,92,113,0,58,96,41,89,66,
-3,52,54,32,58,96,18,249,145,3,67,41,136,198,98,215,238,167,0,254,
-101,1,0,58,64,120,129,175,237,222,0,72,166,169,78,137,77,224,70,0,
-120,194,64,183,101,155,201,83,215,251,106,198,0,58,96,30,2,10,65,32,
-88,228,154,17,186,16,229,206,2,185,255,96,222,100,4,1,57,52,64,189,
-165,86,2,50,57,51,64,13,181,206,98,44,106,178,64,61,1,95,50,92,
-193,64,58,129,105,2,35,52,55,64,43,129,94,64,97,130,86,227,51,3,
-91,149,0,66,227,100,1,246,211,7,226,3,17,246,12,4,1,95,50,71,
-188,246,237,9,224,78,8,96,156,184,96,99,110,2,100,105,114,64,162,129,
-167,0,94,66,40,128,17,188,45,65,27,71,162,230,215,2,0,80,97,44,
-158,206,161,191,164,224,169,142,65,167,1,95,50,91,127,244,31,1,250,54,
-1,1,58,50,187,211,122,150,125,247,96,43,97,91,1,56,53,64,122,129,
-119,12,94,71,69,84,84,73,77,69,77,73,76,76,73,64,22,222,107,90,
-205,96,2,85,249,94,208,192,87,129,147,101,128,3,48,32,64,75,88,141,
-96,245,1,58,50,187,161,228,175,3,0,95,70,210,228,229,1,193,145,64,
-218,0,53,205,196,162,28,165,236,247,122,1,164,252,246,161,3,170,65,157,
-199,123,230,160,61,228,91,5,244,115,2,224,78,1,224,71,5,229,57,3,
-96,187,219,230,233,109,6,3,104,101,97,100,252,254,8,0,75,66,184,188,
-13,6,65,46,119,114,105,116,101,65,58,129,222,71,189,225,60,0,188,19,
-128,99,252,41,1,104,73,224,2,0,192,30,225,177,0,0,51,224,30,2,
-226,80,0,188,1,176,48,0,85,233,96,0,224,2,40,171,4,224,0,6,
-134,80,224,1,23,240,165,9,5,70,108,97,103,115,123,241,98,3,224,0,
-3,161,156,224,2,40,96,164,224,110,11,7,118,101,114,98,111,115,101,61,
-128,112,150,77,0,49,71,125,216,146,224,0,7,224,211,25,224,102,1,86,
-66,198,109,224,0,9,224,203,44,224,200,16,4,114,117,110,73,116,224,198,
-4,0,50,79,220,224,198,14,224,195,62,224,194,41,224,191,16,5,109,104,
-115,100,105,114,225,135,5,1,50,53,75,5,230,53,0,224,0,8,224,195,
-59,224,194,38,224,191,16,4,112,97,116,104,115,224,190,10,224,195,1,224,
-196,13,224,193,56,224,192,35,224,189,16,4,111,117,116,112,117,226,62,5,
-225,125,22,224,181,53,224,180,32,224,177,16,6,108,111,97,100,105,110,103,
-226,241,28,224,169,50,224,168,29,224,165,16,4,115,112,101,101,100,224,163,
-27,224,160,47,224,159,26,224,156,16,86,211,3,67,97,99,104,228,253,5,
-224,160,13,224,157,44,224,156,23,224,153,16,103,2,224,154,30,224,151,41,
-224,150,20,224,147,16,6,117,115,101,84,105,99,107,227,227,5,224,145,11,
-224,142,38,224,141,17,224,138,16,4,100,111,67,80,80,224,135,23,224,132,
-35,224,131,14,224,128,16,5,99,112,112,65,114,103,228,238,35,224,139,32,
-224,138,11,224,135,17,224,133,37,224,130,29,224,129,8,224,126,17,5,111,
-109,112,114,101,115,226,18,21,224,114,26,224,113,5,224,110,16,6,98,117,
-105,108,100,80,107,228,243,7,224,240,16,224,119,23,224,118,2,224,115,16,
-74,163,224,114,33,224,111,20,192,110,224,107,16,6,112,107,103,80,97,116,
-104,225,207,29,224,104,17,96,103,224,100,16,6,105,110,115,116,97,108,108,
-224,211,9,225,181,1,224,88,14,224,77,11,4,116,97,114,103,101,231,55,
-36,224,0,14,192,110,64,61,225,49,0,155,137,1,50,55,141,139,91,137,
-128,11,0,58,96,6,218,234,107,193,97,15,77,68,224,158,4,6,78,111,
-116,104,105,110,103,128,158,241,252,1,2,50,55,51,142,14,1,55,52,248,
-228,0,210,31,224,229,11,4,74,117,115,116,32,160,68,110,214,76,246,160,
-49,65,22,64,166,0,64,98,22,192,15,88,241,128,15,0,58,96,6,236,
-199,2,118,26,0,58,64,122,64,21,79,41,128,117,77,133,0,35,123,201,
-0,64,117,150,160,16,128,101,0,58,96,178,236,174,1,224,233,8,2,70,
-97,108,182,163,224,24,6,2,84,114,117,214,187,193,78,115,136,161,78,143,
-249,64,6,146,117,0,49,91,64,97,18,2,95,50,55,82,124,1,50,55,
-141,151,0,85,110,184,224,1,15,238,208,0,224,0,0,0,58,96,62,82,
-255,224,138,0,8,118,55,46,48,92,49,48,38,34,64,86,0,54,181,4,
-1,50,54,64,135,92,130,2,58,50,54,212,192,1,54,54,66,11,0,48,
-178,152,96,6,0,52,96,5,79,33,128,105,0,58,96,51,128,45,79,127,
-0,54,130,17,0,85,64,10,193,112,65,234,1,54,51,98,197,0,54,160,
-56,1,95,50,80,241,126,73,108,230,128,73,129,139,130,27,88,96,3,64,
-95,50,54,92,25,64,61,128,25,241,175,0,130,68,176,25,242,21,10,228,
-84,1,208,61,224,47,2,160,110,178,185,2,50,51,52,65,112,240,146,0,
-0,58,96,123,150,88,65,168,92,90,1,58,50,65,140,246,108,0,1,50,
-53,91,84,246,173,9,1,111,117,111,73,0,58,96,51,246,109,0,4,111,
-117,116,32,58,96,50,160,221,246,108,0,245,8,35,149,191,213,7,0,58,
-64,135,192,79,88,213,0,80,64,164,64,28,179,164,98,250,1,53,51,147,
-135,91,160,96,15,66,31,0,58,96,98,64,157,64,149,129,115,6,65,46,
-97,108,108,111,99,64,16,162,224,1,51,50,64,12,129,34,153,81,240,116,
-2,1,95,50,68,88,67,186,1,52,57,67,131,66,168,0,58,65,45,128,
-145,3,95,50,50,57,224,207,0,64,33,0,58,96,47,210,243,1,50,52,
-113,222,1,95,50,65,109,124,145,64,61,64,39,81,185,5,112,117,116,98,
-32,58,96,27,151,69,2,52,32,79,64,6,0,53,66,121,150,139,98,66,
-0,58,96,70,86,144,0,50,99,205,0,58,96,26,64,15,112,93,0,58,
-96,49,96,142,0,83,249,235,0,0,90,160,7,128,9,160,10,243,83,5,
-152,157,230,37,1,224,248,5,176,106,2,50,51,50,216,11,114,206,64,237,
-132,51,241,103,6,13,66,97,100,32,72,97,110,100,108,101,32,109,111,100,
-196,1,65,21,241,0,0,69,217,100,129,113,219,0,90,160,4,147,10,241,
-253,2,100,139,0,50,100,135,161,68,0,50,243,180,2,192,75,161,188,1,
-55,56,65,65,129,188,3,102,112,50,112,64,13,162,211,1,52,56,64,193,
-189,100,224,5,0,149,36,191,169,211,4,179,1,224,6,12,224,42,2,117,
-215,148,52,224,42,29,160,28,224,49,10,224,42,15,224,49,10,224,42,22,
-224,49,3,185,159,129,161,0,58,96,6,227,136,2,128,77,2,95,50,51,
-99,250,0,51,244,186,1,2,95,50,51,117,50,85,62,64,25,195,191,70,
-152,1,50,51,103,12,68,197,64,26,197,2,68,73,1,50,51,67,106,96,
-128,0,58,96,38,3,10,65,32,82,161,81,0,58,96,28,245,26,2,131,
-255,214,74,64,157,0,51,244,136,5,224,72,0,197,1,0,85,245,65,1,
-0,73,128,48,129,230,166,215,96,17,129,234,244,141,2,0,58,98,214,245,
-146,19,69,222,64,79,162,226,180,103,128,148,148,134,0,64,87,36,98,101,
-0,50,198,51,2,50,55,32,119,23,88,138,165,244,188,131,0,85,160,24,
-128,254,66,116,1,95,50,103,141,129,137,64,151,64,30,129,12,5,115,101,
-113,117,97,108,64,60,128,251,245,101,1,0,50,252,122,3,5,77,72,83,
-68,73,82,99,66,121,77,226,255,5,1,58,50,64,7,135,154,128,19,230,
-111,2,0,58,96,45,165,25,195,83,215,83,1,95,50,91,2,249,48,21,
-251,80,5,1,95,50,72,122,98,95,160,169,217,54,64,177,129,27,1,49,
-57,64,208,129,117,13,112,101,101,107,67,65,83,116,114,105,110,103,32,58,
-64,26,96,35,1,57,54,103,73,0,58,96,102,227,155,0,133,247,64,133,
-0,49,70,69,64,133,130,107,183,11,97,64,96,159,0,58,96,6,6,10,
-65,32,116,111,73,110,70,98,188,95,6,94,103,101,116,101,110,118,64,16,
-184,119,225,80,0,248,66,6,246,176,3,250,23,4,0,50,91,224,96,97,
-226,142,0,228,216,5,3,116,97,105,108,246,64,8,0,65,96,204,194,169,
-1,95,50,65,245,131,179,0,50,66,95,0,58,64,66,64,27,70,120,187,
-165,2,95,50,57,96,92,91,131,1,95,50,124,60,3,95,49,53,53,224,
-56,0,1,49,54,69,91,160,11,0,55,64,183,166,108,187,214,105,136,2,
-95,49,51,71,148,160,61,0,51,226,52,3,0,101,94,165,0,58,138,53,
-169,108,96,38,0,58,96,6,102,232,254,234,15,6,67,111,110,116,114,111,
-108,254,232,11,96,18,3,67,97,108,108,96,87,166,142,188,70,102,109,230,
-108,3,64,7,133,206,71,167,166,65,67,163,138,112,0,50,91,105,103,221,
-168,157,137,27,0,50,92,109,64,0,131,149,0,58,64,160,64,94,119,102,
-64,14,129,235,251,16,13,131,191,251,10,2,188,175,2,83,32,85,225,200,
-7,9,109,100,53,67,111,109,98,105,110,101,161,206,134,163,64,143,68,150,
-74,85,93,5,1,50,32,68,51,1,95,56,65,37,96,176,91,4,0,80,
-120,5,103,35,68,84,228,57,1,196,208,233,111,2,160,235,72,245,96,48,
-104,204,124,170,104,173,0,48,187,112,0,95,88,110,1,95,49,91,105,192,
-0,0,58,97,33,66,215,9,109,100,53,65,114,114,97,121,32,58,96,57,
-130,101,194,219,0,55,192,154,1,95,49,91,248,99,208,231,187,4,231,79,
-3,2,95,50,48,77,35,224,46,2,163,120,251,21,1,90,73,227,20,6,
-92,171,160,145,226,200,1,188,192,128,210,121,239,0,67,252,107,11,161,248,
-130,2,168,118,225,52,0,192,25,168,145,252,175,1,1,52,54,204,6,2,
-49,57,51,129,34,3,95,49,56,49,100,55,128,0,229,174,3,133,213,192,
-69,232,60,1,64,61,127,150,224,44,2,96,95,188,187,252,238,7,252,207,
-2,232,98,4,224,43,10,194,116,229,10,2,96,16,0,58,65,96,226,175,
-0,204,153,0,58,96,135,99,182,0,48,68,224,126,48,192,81,129,245,0,
-35,64,61,0,95,108,243,97,152,93,9,3,49,54,32,58,96,28,128,57,
-65,232,91,148,0,95,92,103,1,95,49,91,186,2,95,49,56,192,79,64,
-11,64,33,192,11,68,30,160,11,0,57,76,115,192,23,68,144,96,12,138,
-224,97,21,137,16,137,19,66,47,160,2,225,58,6,97,170,128,50,161,237,
-165,177,134,42,125,148,0,85,124,157,64,15,157,92,93,55,64,0,96,17,
-0,50,128,33,131,60,224,33,7,192,139,0,95,76,133,224,38,16,224,71,
-25,2,64,64,83,71,132,142,232,192,84,224,194,0,67,161,0,83,162,121,
-96,60,73,21,224,76,16,128,22,99,169,66,135,224,40,16,130,155,192,128,
-97,40,2,66,32,95,92,32,224,167,19,129,43,97,160,0,52,97,148,239,
-169,11,96,27,224,21,1,96,49,0,58,96,140,224,42,2,160,20,201,17,
-239,20,4,0,58,96,113,160,44,64,13,194,159,224,37,6,190,188,225,253,
-0,65,41,80,5,66,170,0,49,75,83,0,58,66,83,195,242,131,183,1,
-95,49,94,96,70,254,66,123,224,27,11,96,114,190,156,253,41,0,128,174,
-190,155,4,114,101,109,32,58,98,204,130,229,0,56,69,210,99,23,100,0,
-98,90,104,242,66,185,64,54,128,250,99,171,131,7,161,122,0,58,96,39,
-96,26,101,2,164,142,109,169,64,73,113,173,164,95,78,48,167,253,100,234,
-69,20,1,55,51,230,30,2,27,92,51,52,38,108,105,98,47,68,97,116,
-97,47,73,110,116,101,103,101,114,95,84,121,112,101,46,104,115,64,27,4,
-44,52,53,58,49,241,216,0,70,132,100,28,70,50,75,6,1,52,51,228,
-170,1,160,30,102,226,64,28,97,86,0,55,67,182,64,19,239,184,0,99,
-126,98,148,0,67,99,95,167,55,100,223,64,237,80,111,160,83,173,164,96,
-69,128,13,0,79,64,213,0,79,243,131,4,128,29,224,21,3,1,95,49,
-94,116,65,49,104,74,97,80,161,73,94,172,0,95,81,10,0,49,66,180,
-193,78,168,106,1,54,54,97,96,0,95,81,138,0,58,96,32,7,10,65,
-32,97,110,100,32,58,96,55,128,66,81,60,192,33,130,10,0,80,64,31,
-129,249,0,75,64,10,129,238,0,65,64,10,208,240,105,42,0,49,64,53,
-64,156,98,99,178,104,0,73,64,38,208,168,105,42,0,49,79,148,1,95,
-49,79,167,169,42,192,56,73,42,224,68,0,97,201,128,191,178,58,97,224,
-111,121,131,112,1,95,49,64,171,64,31,204,27,0,85,132,27,1,95,49,
-65,99,135,166,0,80,227,186,1,160,47,224,15,8,1,64,58,64,121,64,
-65,127,227,64,14,195,31,65,195,116,26,106,206,113,210,100,67,81,122,224,
-68,0,200,3,160,21,160,154,141,149,139,87,96,146,98,35,82,94,64,96,
-166,11,3,51,55,32,58,96,19,3,10,65,32,90,64,190,0,58,96,39,
-161,105,178,79,65,66,178,64,140,150,96,104,203,111,239,118,6,224,14,5,
-192,184,231,109,0,171,127,128,202,0,58,96,6,160,72,203,178,106,70,103,
-108,192,42,130,100,210,63,64,42,64,190,1,95,49,82,16,0,58,96,43,
-6,10,65,32,47,61,32,58,96,17,132,122,64,38,99,1,143,151,206,13,
-1,75,50,174,238,131,79,162,255,0,85,224,20,1,99,238,237,188,5,178,
-72,78,87,64,147,70,166,129,81,64,9,96,176,160,77,96,175,192,17,0,
-58,96,6,228,200,4,228,210,3,128,59,239,143,2,0,58,96,60,100,185,
-1,53,52,64,202,129,134,66,251,178,98,181,50,160,141,234,130,3,9,110,
-111,32,109,97,116,99,104,32,97,213,222,96,32,128,174,0,49,64,81,130,
-235,75,189,128,11,0,58,96,6,235,189,29,8,120,99,101,112,116,105,111,
-110,46,68,189,2,114,110,97,107,179,224,39,1,2,80,97,116,64,22,0,
-77,64,128,2,70,97,105,235,209,3,99,105,129,2,0,83,199,234,1,95,
-49,118,112,165,46,138,34,163,88,248,31,4,164,122,148,85,1,51,49,244,
-252,4,171,212,98,138,179,51,161,28,78,131,162,72,79,100,0,35,80,141,
-65,153,119,10,1,48,32,128,15,99,44,168,108,65,38,105,149,0,57,213,
-88,224,39,2,161,71,224,235,1,6,39,92,57,50,38,39,39,165,174,193,
-92,166,93,224,99,0,98,40,139,222,224,17,3,133,135,234,156,3,224,168,
-1,0,64,160,35,133,186,64,156,161,22,97,198,128,158,130,99,247,212,8,
-64,146,70,72,160,148,64,0,0,58,96,147,226,123,0,176,175,232,186,6,
-166,216,1,95,49,81,98,160,108,97,102,71,253,129,102,171,210,97,132,225,
-163,0,118,109,0,95,148,116,114,67,210,65,0,90,64,28,99,12,166,138,
-224,163,5,224,160,0,230,73,2,138,11,139,114,116,43,225,22,7,96,0,
-5,79,32,80,32,35,55,246,41,3,64,79,0,97,96,79,96,27,0,56,
-224,27,7,0,98,224,27,1,79,49,224,28,5,0,102,224,28,2,0,48,
-224,28,7,0,110,224,28,2,0,51,224,28,7,110,196,128,28,0,57,224,
-27,7,143,192,128,56,0,49,224,28,7,0,118,224,56,2,224,143,8,64,
-3,227,52,1,193,193,181,205,69,134,181,201,102,7,66,38,2,95,49,51,
-89,81,109,116,64,18,80,128,164,115,181,209,3,95,49,52,49,64,56,0,
-54,227,27,1,143,226,225,189,0,96,70,100,15,96,17,0,58,96,6,154,
-137,71,132,237,54,0,240,217,0,85,25,75,81,140,187,128,19,121,216,160,
-80,132,85,181,139,64,67,226,230,2,249,139,1,192,64,150,241,226,96,8,
-64,69,105,143,236,139,0,160,40,226,52,3,224,10,1,96,58,107,27,237,
-86,1,96,250,129,28,131,216,69,241,224,74,4,0,58,96,102,237,89,9,
-181,238,1,111,114,72,143,181,237,71,99,224,33,2,131,85,4,99,104,114,
-32,58,96,120,128,33,0,52,103,181,1,64,58,64,231,64,18,79,240,192,
-213,69,228,129,154,180,227,225,197,6,99,223,225,197,0,134,92,0,58,99,
-146,4,10,65,32,117,60,70,212,180,241,198,164,0,58,96,61,162,26,180,
-213,96,107,0,58,100,44,131,245,0,89,77,135,99,233,133,70,142,140,0,
-58,96,146,139,29,0,53,64,47,231,82,2,0,49,84,120,1,95,49,84,
-137,0,58,99,123,199,83,180,155,0,61,96,11,241,66,0,96,37,128,165,
-252,188,2,68,2,83,156,135,30,101,186,116,169,128,15,130,115,130,110,180,
-185,96,23,105,142,78,250,0,58,96,35,170,73,124,156,110,197,64,26,96,
-43,199,205,194,123,109,1,160,10,231,211,0,199,175,224,32,0,237,189,0,
-229,0,0,246,56,1,97,34,224,65,4,224,64,5,66,207,98,115,104,10,
-130,61,245,9,1,196,174,160,169,140,163,180,192,178,102,96,28,161,50,73,
-152,0,58,97,31,182,72,218,118,97,59,205,133,128,36,218,155,114,56,64,
-100,117,104,84,185,81,57,1,95,49,117,113,64,40,129,131,81,217,213,30,
-96,27,170,61,0,66,154,199,0,49,116,141,138,74,64,209,160,26,97,121,
-113,166,90,221,96,78,161,127,128,39,1,95,49,69,61,77,224,224,31,0,
-129,138,2,110,101,119,213,142,2,76,101,110,64,114,129,19,224,212,5,129,
-8,75,167,180,107,129,134,2,115,101,113,103,6,86,182,128,43,1,64,58,
-109,129,168,238,180,6,193,136,128,1,113,220,225,159,3,224,20,3,224,17,
-8,224,14,5,224,11,2,192,8,110,147,96,209,244,21,1,238,197,5,180,
-30,0,79,64,144,182,4,0,56,72,97,0,95,78,246,0,64,192,7,1,
-95,57,68,94,115,207,1,95,57,69,77,160,10,76,72,128,10,1,49,48,
-72,35,192,11,97,187,83,122,0,58,96,18,123,174,3,111,107,101,87,132,
-116,179,147,0,94,86,238,192,18,194,108,173,168,82,20,1,64,95,81,215,
-0,58,64,89,160,186,111,13,175,209,178,54,192,49,80,11,160,48,178,58,
-65,3,87,58,99,149,123,4,116,44,0,58,178,44,183,11,178,45,6,116,
-111,80,116,114,32,58,177,230,239,120,5,176,102,131,8,136,78,72,81,97,
-100,67,166,1,64,95,99,83,131,105,0,95,99,74,0,95,110,189,105,185,
-240,142,5,176,164,176,142,200,173,0,95,67,192,65,177,128,61,1,67,32,
-96,63,0,95,110,173,1,64,58,240,166,0,229,129,0,176,160,82,215,115,
-1,72,25,0,58,176,167,5,113,117,111,116,32,58,176,156,226,49,1,226,
-53,2,226,92,72,240,230,3,164,122,244,83,1,0,95,80,169,163,147,224,
-20,0,163,152,245,68,6,244,66,3,0,58,177,31,64,37,65,11,123,117,
-177,23,6,94,102,114,101,101,32,58,177,15,135,128,224,91,5,85,228,150,
-34,211,167,245,225,4,191,35,81,25,250,26,4,177,84,236,192,1,64,165,
-133,69,96,244,0,39,78,210,224,48,0,151,112,160,97,245,89,1,165,67,
-193,62,224,118,3,2,64,95,56,97,255,64,34,133,84,0,55,65,193,65,
-32,243,12,0,102,11,177,179,111,39,99,170,0,58,64,56,226,153,0,96,
-16,130,3,75,127,0,83,106,234,190,14,128,168,76,31,80,107,65,121,130,
-80,224,104,7,128,103,242,219,3,167,254,176,175,68,181,0,58,176,174,96,
-199,172,99,66,164,213,218,226,169,7,176,200,248,57,6,8,117,110,100,101,
-102,105,110,101,100,73,253,0,58,176,225,243,78,7,176,237,2,95,52,49,
-163,172,105,136,105,191,73,122,233,175,12,65,128,233,171,2,157,232,81,90,
-0,50,224,37,3,233,140,2,64,37,96,19,96,10,0,95,81,58,0,58,
-241,91,1,79,251,0,95,113,84,177,83,0,85,97,203,77,107,113,235,146,
-76,0,80,96,7,97,114,225,113,0,0,95,80,76,64,120,78,237,113,76,
-96,0,0,58,209,144,0,52,195,167,80,105,224,13,1,70,243,225,43,6,
-179,57,14,58,32,117,110,115,117,112,112,111,114,116,101,100,32,119,69,35,
-3,115,105,122,101,107,62,86,229,77,72,96,168,194,4,130,175,237,116,3,
-242,254,1,194,159,215,198,81,117,129,11,65,81,0,50,192,12,161,78,0,
-57,128,231,98,30,177,240,0,105,92,35,177,186,0,115,74,20,177,183,73,
-43,177,97,4,115,104,108,32,58,177,96,2,43,32,58,177,92,2,45,32,
-58,241,91,1,241,90,0,230,129,5,177,99,130,234,100,221,241,44,0,2,
-55,32,95,78,246,0,95,114,200,79,200,0,95,80,34,0,95,80,50,116,
-144,1,95,53,235,112,0,1,53,57,160,9,0,58,177,63,131,243,98,252,
-132,0,96,37,0,55,131,181,69,151,177,79,224,29,1,224,49,1,224,39,
-5,232,179,0,195,138,64,29,6,10,65,32,62,61,32,58,176,203,2,62,
-32,58,176,199,74,201,176,199,2,60,32,58,176,124,5,105,99,109,112,32,
-58,176,36,106,133,76,245,0,95,78,188,0,58,175,215,74,130,174,204,65,
-85,173,21,2,80,32,58,173,20,196,77,164,136,194,97,224,20,11,224,17,
-8,224,14,5,224,11,2,192,8,229,200,0,173,86,236,48,5,173,93,4,
-110,101,103,32,58,173,61,2,42,32,58,173,1,2,45,32,58,172,101,2,
-43,32,58,172,89,224,148,68,0,58,236,161,1,103,146,64,17,225,225,0,
-73,188,68,153,66,26,76,75,64,12,198,44,1,64,58,172,185,115,252,172,
-178,2,73,32,58,172,159,64,54,66,76,76,117,0,58,172,135,64,29,128,
-224,64,9,168,183,7,109,97,108,108,111,99,32,58,172,130,13,73,79,46,
-112,101,114,102,111,114,109,73,79,32,58,172,137,224,179,2,0,58,172,122,
-2,85,32,58,172,118,224,219,14,0,58,172,124,64,19,0,95,109,15,0,
-95,76,118,0,58,172,135,104,47,70,44,0,58,172,140,6,114,97,105,115,
-101,32,58,172,140,7,65,46,114,101,97,100,32,58,172,95,13,73,79,46,
-103,101,116,65,114,103,82,101,102,32,58,172,93,0,95,70,120,67,63,64,
-231,107,3,64,235,172,101,6,73,79,46,62,62,32,58,171,228,0,95,105,
-222,128,33,2,95,49,50,199,149,81,8,64,65,89,113,192,9,0,50,71,
-104,64,9,0,58,172,1,186,50,109,239,173,18,86,218,107,185,0,58,172,
-22,128,35,96,32,115,27,192,32,0,95,150,88,161,168,85,164,128,253,224,
-47,7,107,164,96,155,142,56,129,18,117,176,161,45,162,174,0,58,172,20,
-118,30,0,58,171,230,130,59,100,91,171,216,233,120,0,69,202,224,11,2,
-96,197,101,13,0,58,171,234,96,59,172,209,128,165,0,51,97,196,108,95,
-130,110,74,0,129,62,74,150,96,36,179,121,0,95,104,133,73,155,96,21,
-2,75,32,58,225,220,1,1,64,58,194,136,0,58,162,125,9,79,46,114,
-101,116,117,114,110,32,58,225,212,0,0,62,68,100,128,196,2,80,32,58,
-128,187,227,74,47,0,58,227,157,3,226,142,9,240,8,1,130,118,64,200,
-1,95,50,111,254,224,0,255,224,0,255,224,0,255,224,0,255,224,0,255,
-224,0,255,224,0,255,224,0,255,224,0,18,1,32,125,
-};
-unsigned char *combexpr = data;
-int combexprlen = 105715;
+122,76,90,49,3,237,1,0,26,118,55,46,50,10,50,51,50,53,10,65,
+32,95,48,32,95,50,51,32,64,95,51,52,53,32,64,66,224,15,2,6,
+53,55,32,64,64,66,32,224,18,3,17,52,57,32,64,64,64,83,39,32,
+66,32,64,66,39,32,67,32,83,64,50,6,83,32,67,39,32,83,39,128,
+10,24,64,95,49,50,55,32,95,51,53,57,32,64,102,114,111,109,85,84,
+70,56,32,34,45,104,34,64,57,10,64,67,39,66,32,85,32,95,52,48,
+55,64,4,0,56,64,19,1,75,50,96,25,224,70,29,0,63,224,70,61,
+4,45,104,101,108,112,224,74,10,0,49,96,68,224,74,37,6,118,101,114,
+115,105,111,110,224,77,9,3,50,50,49,32,224,40,1,8,77,105,99,114,
+111,72,115,44,32,160,47,0,32,64,48,96,35,4,95,52,50,48,32,128,
+10,224,46,1,16,44,32,99,111,109,98,105,110,97,116,111,114,32,102,105,
+108,101,224,55,5,2,52,50,49,96,111,224,172,0,2,83,39,32,64,123,
+2,64,67,32,224,166,14,6,110,117,109,101,114,105,99,224,174,5,2,66,
+32,80,192,250,64,131,224,77,0,96,0,65,250,64,248,96,90,64,5,2,
+95,56,50,130,8,64,109,2,95,52,50,64,13,64,134,0,67,64,12,3,
+52,32,64,35,64,12,0,66,128,80,64,7,224,209,5,6,102,108,97,103,
+115,32,61,96,191,4,64,95,49,49,56,64,53,98,79,129,56,96,100,162,
+113,4,83,32,95,52,51,96,144,128,121,224,23,4,96,249,224,23,10,96,
+186,65,4,0,66,66,159,10,95,52,51,53,32,64,85,32,75,32,65,128,
+99,0,67,66,174,2,39,32,64,96,208,9,95,52,51,54,32,64,95,52,
+51,55,65,50,5,67,32,95,55,52,50,65,225,0,52,66,243,0,75,96,
+161,1,50,50,64,198,192,153,0,80,64,231,0,39,96,212,0,55,64,41,
+7,56,52,52,32,95,53,50,57,224,224,2,11,99,111,109,109,97,110,100,
+45,108,105,110,101,64,228,2,35,48,32,96,3,129,86,3,95,51,52,51,
+226,172,0,128,143,3,95,50,50,56,128,14,64,99,98,2,1,57,52,96,
+15,3,95,50,51,48,64,230,1,85,32,129,144,64,198,96,149,224,43,0,
+128,149,3,95,50,51,50,64,32,163,145,4,32,95,56,48,57,64,20,64,
+101,2,95,51,49,65,170,64,34,64,7,129,93,128,60,129,209,2,95,49,
+51,96,32,226,47,1,98,61,1,56,52,192,13,5,79,32,35,52,54,32,
+129,14,193,27,3,67,39,32,79,161,220,1,56,54,224,8,2,160,6,161,
+60,192,45,96,0,2,58,50,51,66,29,2,10,65,32,65,105,224,1,19,
+0,83,64,77,2,48,53,32,65,53,1,95,49,97,208,162,70,1,79,32,
+224,140,2,96,98,65,196,64,25,97,190,224,205,0,226,254,4,224,192,4,
+2,95,55,52,65,91,160,152,0,79,65,138,0,57,67,241,4,49,32,73,
+32,64,227,41,2,5,108,105,98,47,103,109,132,28,96,56,128,241,97,173,
+0,49,227,82,3,3,47,108,105,98,224,37,1,224,66,3,3,111,117,116,
+46,67,189,162,233,96,199,224,6,28,96,154,224,6,0,128,20,1,51,49,
+96,182,160,6,224,27,4,224,113,1,6,100,101,102,97,117,108,116,160,112,
+64,35,65,116,0,51,97,116,2,66,32,89,97,241,98,32,0,83,194,201,
+65,50,4,67,32,64,64,80,226,245,0,162,21,64,5,64,13,163,253,132,
+255,228,83,14,132,68,224,57,42,0,118,224,57,48,0,113,224,57,48,0,
+114,224,57,48,0,108,224,57,48,0,115,224,57,48,1,67,82,224,58,49,
+0,87,224,58,49,224,57,48,0,84,224,57,48,3,88,67,80,80,224,60,
+48,0,122,224,57,48,0,81,224,57,2,195,26,198,78,128,73,231,245,19,
+0,111,192,61,64,46,0,82,96,54,229,142,2,229,134,0,0,50,229,134,
+0,224,105,49,2,112,116,99,224,108,20,128,85,224,114,0,105,167,96,114,
+103,10,164,182,134,233,1,64,67,68,202,198,72,224,144,12,161,51,64,14,
+161,69,96,108,232,91,4,0,49,71,154,0,35,74,46,128,0,167,187,96,
+5,97,126,224,57,1,96,87,128,105,225,161,1,192,37,224,38,0,225,170,
+6,128,95,1,49,48,224,96,0,224,61,43,0,49,201,32,224,61,45,102,
+203,224,61,1,224,67,0,224,61,11,0,67,224,61,6,0,54,231,227,0,
+128,54,0,66,225,91,1,225,33,8,224,62,10,0,55,226,47,2,224,119,
+6,224,178,18,0,56,136,105,224,53,38,0,57,199,165,224,53,36,0,55,
+193,29,224,195,2,226,31,8,1,49,48,192,145,160,37,102,121,224,51,74,
+0,49,192,195,224,103,35,202,120,224,103,35,203,27,224,51,33,227,35,0,
+128,36,169,186,74,111,2,54,55,54,200,165,4,89,32,66,32,80,105,222,
+163,177,2,49,48,54,103,177,0,80,105,95,3,52,53,48,32,107,89,203,
+51,97,124,72,180,106,40,1,54,54,99,246,0,52,73,130,0,55,107,159,
+99,55,2,95,50,54,132,15,227,68,0,128,132,65,219,228,62,19,73,202,
+132,62,64,43,128,138,2,64,95,57,75,45,224,0,8,224,79,12,107,36,
+192,77,0,55,234,134,1,1,49,57,193,62,227,81,1,64,16,129,25,0,
+85,128,10,160,68,0,67,234,200,12,202,82,128,49,0,90,224,60,1,224,
+10,0,224,220,23,224,76,1,229,27,4,1,56,56,138,251,229,27,4,224,
+223,28,0,57,224,223,11,224,130,19,0,49,74,217,224,130,10,1,55,52,
+66,248,224,130,5,224,70,64,224,197,10,224,72,0,64,53,230,161,1,224,
+43,20,230,205,9,225,198,32,67,58,225,198,64,224,76,2,224,252,5,0,
+57,96,18,225,198,10,109,123,238,145,9,7,85,110,107,110,111,119,110,32,
+78,153,1,58,32,103,100,203,230,172,116,0,35,65,104,64,76,237,184,3,
+160,156,160,249,64,128,165,34,76,146,1,49,52,108,146,64,63,0,56,231,
+199,3,0,46,135,196,224,34,20,136,84,224,25,11,0,97,200,1,160,241,
+206,138,96,72,224,239,2,232,24,63,225,196,13,224,65,1,0,95,231,94,
+0,224,39,11,68,139,224,39,27,0,53,224,39,30,228,147,1,224,39,11,
+80,151,160,40,228,110,1,224,61,2,228,65,3,96,61,224,108,21,224,46,
+8,224,39,14,228,218,3,224,39,19,228,34,3,224,39,17,0,50,229,120,
+2,224,79,20,114,42,224,39,27,227,216,1,5,95,54,49,32,95,55,65,
+108,2,49,53,55,160,9,79,145,102,84,128,0,224,64,0,0,83,224,64,
+11,129,98,128,57,82,122,0,51,177,234,128,57,131,175,135,11,78,117,0,
+50,110,117,6,95,56,49,48,32,75,32,80,184,131,221,224,1,21,136,114,
+224,0,5,224,53,44,224,50,41,224,47,38,224,44,35,224,41,32,224,38,
+29,224,35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,20,11,224,
+17,8,224,14,5,224,11,2,192,8,96,5,100,245,232,172,3,224,0,5,
+66,88,0,49,226,88,5,0,90,224,147,4,224,1,15,226,34,10,226,88,
+255,224,37,23,224,35,4,224,32,23,224,29,20,224,26,17,224,23,14,224,
+20,11,224,17,8,224,14,5,224,11,2,192,8,96,5,226,86,19,66,85,
+0,48,226,85,5,224,101,1,104,142,225,247,25,64,1,226,46,10,224,55,
+26,224,53,10,224,50,41,224,47,38,224,44,35,224,41,32,224,38,29,224,
+35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,20,11,226,45,14,
+0,58,135,200,226,40,13,64,1,162,44,226,46,255,224,41,20,224,38,29,
+224,35,26,224,32,23,224,29,20,224,26,17,226,3,12,66,1,0,56,226,
+1,17,193,255,224,85,7,224,1,11,225,254,255,224,38,20,224,35,26,224,
+32,23,224,29,20,224,26,17,224,23,14,228,25,13,66,22,0,55,228,24,
+19,228,26,2,226,28,255,224,41,19,224,38,29,224,35,26,224,32,23,224,
+29,20,225,235,11,65,233,0,54,225,233,21,225,235,3,225,236,255,224,41,
+19,224,38,29,224,35,26,224,32,23,225,207,10,65,206,0,53,225,206,23,
+128,1,225,212,2,225,215,255,224,41,21,225,110,7,65,107,0,52,225,107,
+29,192,1,225,115,5,64,0,224,49,23,64,1,225,119,64,224,193,3,64,
+189,0,51,224,189,9,64,161,224,89,23,64,1,226,11,246,224,38,29,224,
+35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,20,11,224,17,8,
+224,14,5,224,11,2,238,115,17,66,76,243,32,6,224,106,3,224,1,13,
+227,12,9,226,121,48,224,153,2,64,138,241,82,6,224,69,11,224,124,3,
+224,31,11,224,1,7,224,117,11,224,53,44,224,50,41,224,47,38,224,44,
+35,224,41,32,224,38,29,224,35,26,226,67,9,65,176,240,173,16,224,1,
+7,226,51,6,224,40,17,224,1,1,225,185,205,225,71,6,0,58,155,181,
+227,128,33,227,124,8,224,46,21,128,1,225,74,114,224,239,4,64,237,238,
+181,18,224,1,7,224,235,7,224,43,19,192,1,226,53,161,226,9,5,65,
+26,237,185,22,224,1,11,229,139,10,224,88,2,64,84,0,54,128,84,6,
+50,55,48,32,95,57,51,90,78,3,57,51,53,32,96,26,170,112,2,50,
+51,49,64,4,0,51,64,4,95,184,4,64,95,50,51,53,224,12,0,14,
+67,32,83,32,95,49,50,55,32,95,53,49,32,64,35,157,208,224,18,4,
+89,123,224,18,6,126,153,224,18,5,155,6,224,18,4,224,94,10,64,183,
+0,67,127,233,224,18,0,127,241,93,49,252,128,1,19,116,111,69,110,117,
+109,58,32,111,117,116,32,111,102,32,114,97,110,103,101,156,146,128,220,64,
+194,64,64,161,12,125,42,3,95,49,48,57,95,87,64,8,0,53,64,121,
+4,64,95,49,56,54,128,26,97,23,3,64,85,32,83,221,58,2,67,32,
+60,160,178,224,18,6,160,159,224,18,3,64,159,1,85,32,96,6,64,7,
+129,121,224,35,6,64,111,1,85,32,96,6,64,7,64,88,96,36,224,91,
+4,129,71,224,55,4,65,71,1,85,32,96,6,64,7,154,229,1,85,32,
+97,133,189,155,1,54,54,225,183,1,128,252,158,9,128,5,157,129,5,49,
+52,50,32,95,54,64,52,91,73,224,47,0,224,13,6,1,67,39,66,164,
+3,95,50,54,55,224,81,3,97,33,224,26,13,161,105,0,55,224,20,2,
+2,50,55,56,224,12,0,66,98,235,103,28,226,196,4,224,34,13,224,1,
+5,230,26,205,224,41,32,224,38,29,231,177,8,65,143,236,57,10,161,127,
+224,84,15,224,1,3,225,119,255,224,38,20,224,35,26,224,32,23,224,29,
+20,224,26,17,224,23,14,224,20,11,224,17,8,224,14,5,236,49,16,66,
+67,140,48,0,83,100,18,0,66,229,190,0,5,51,53,57,32,64,75,64,
+51,0,66,64,27,1,95,48,68,7,127,160,0,56,196,148,1,39,32,95,
+150,128,9,224,31,0,2,64,67,39,64,119,8,95,55,57,50,32,64,95,
+56,56,69,163,9,66,32,95,52,52,56,32,95,57,50,133,111,3,95,55,
+57,53,68,126,0,49,91,30,96,97,0,67,96,75,1,66,32,102,24,64,
+174,0,49,230,30,2,11,67,97,110,110,111,116,32,102,105,110,100,32,134,
+22,3,64,66,32,85,64,46,133,14,0,56,100,244,128,155,165,7,0,50,
+64,96,64,0,224,10,1,68,198,0,48,135,40,140,151,64,109,0,54,160,
+182,224,227,7,1,52,52,101,107,3,32,95,52,50,64,92,101,168,224,33,
+4,4,50,50,57,56,32,192,235,224,128,0,64,232,71,246,126,110,7,49,
+32,64,79,32,35,53,56,161,70,96,29,224,112,2,128,41,224,234,6,0,
+32,192,224,5,89,32,66,32,80,32,64,56,128,99,3,67,39,32,89,96,
+12,0,32,64,15,0,64,64,28,96,145,126,219,70,96,128,174,0,49,72,
+31,96,0,3,67,39,32,79,96,94,6,57,57,32,95,49,51,48,225,111,
+1,160,141,128,37,129,153,0,64,161,154,0,64,161,177,65,36,140,11,96,
+112,98,69,128,6,160,15,64,112,64,136,1,95,54,66,38,2,95,52,52,
+65,230,192,6,113,142,64,225,0,49,98,3,128,21,0,58,96,137,98,105,
+2,32,95,49,83,28,129,188,225,115,2,104,101,130,77,225,81,0,160,37,
+225,134,1,200,75,1,51,53,64,46,2,95,51,53,160,37,226,57,12,22,
+103,101,116,68,105,114,101,99,116,111,114,121,67,111,110,116,101,110,116,115,
+58,32,99,130,79,3,111,112,101,110,193,110,129,94,2,83,39,32,65,91,
+64,5,225,233,4,97,83,96,136,129,113,98,121,0,83,232,214,0,224,138,
+5,226,150,0,224,65,3,104,187,224,24,8,1,51,53,97,116,129,225,96,
+217,225,190,0,226,90,8,1,95,52,64,223,97,85,105,222,225,111,1,104,
+250,0,52,96,97,97,101,139,145,9,94,99,95,100,95,110,97,109,101,32,
+64,19,138,138,7,94,114,101,97,100,100,105,114,96,18,0,54,96,18,0,
+75,224,145,5,0,55,64,145,225,128,4,194,168,0,66,130,210,225,91,1,
+64,91,0,58,129,63,64,167,64,185,66,97,104,219,224,66,30,6,118,101,
+114,115,105,111,110,224,69,1,0,52,87,3,3,95,50,50,56,128,205,224,
+69,29,13,99,111,109,112,105,108,101,114,58,32,109,104,115,45,96,74,2,
+95,56,57,100,89,224,64,29,6,100,101,112,101,110,100,115,224,134,1,0,
+55,64,134,64,38,3,54,56,32,85,99,112,160,51,0,64,128,231,192,66,
+4,79,32,35,52,53,163,222,128,187,97,140,1,50,49,130,186,98,86,225,
+195,2,96,126,224,118,1,15,101,120,112,111,115,101,100,45,109,111,100,117,
+108,101,115,58,162,138,165,79,227,1,3,0,85,99,160,64,209,226,19,4,
+224,79,6,4,111,116,104,101,114,224,77,7,192,60,138,106,228,127,1,1,
+95,54,196,128,74,111,228,131,11,64,24,129,213,1,56,50,162,102,128,0,
+66,60,140,106,128,170,0,66,224,151,7,226,188,0,227,181,2,74,181,1,
+54,53,202,181,0,52,64,38,138,245,229,8,14,15,66,117,105,108,100,105,
+110,103,32,112,97,99,107,97,103,101,128,147,170,186,69,1,163,171,230,123,
+7,67,158,66,64,68,149,1,55,54,224,20,0,133,51,67,180,196,98,132,
+197,227,232,1,2,95,52,51,192,229,96,29,128,48,0,39,224,5,8,224,
+230,3,192,131,224,232,30,192,234,128,10,224,239,5,3,87,114,105,116,224,
+238,9,101,211,98,120,226,181,9,2,32,116,111,161,168,0,55,139,212,160,
+0,224,219,0,96,195,128,108,224,183,6,161,160,0,39,96,2,64,184,64,
+250,224,70,0,160,46,1,50,50,227,67,0,166,1,100,189,0,67,97,122,
+104,42,77,216,65,126,3,50,50,57,49,97,6,0,56,67,13,0,85,102,
+181,3,64,85,32,65,96,156,0,52,135,227,224,21,5,109,180,68,41,163,
+100,136,74,164,62,227,255,0,3,95,50,49,49,193,147,96,146,225,170,6,
+192,196,225,127,29,225,128,22,6,67,111,109,112,114,101,115,68,143,3,32,
+116,105,109,193,129,129,74,225,131,0,101,126,77,18,133,209,69,178,4,55,
+52,32,95,55,135,60,225,156,2,1,109,115,194,176,168,132,101,23,163,23,
+1,49,50,69,102,64,87,0,54,101,246,6,51,54,56,32,95,55,55,142,
+188,163,109,64,51,129,172,97,33,129,91,131,124,141,132,1,66,32,232,35,
+1,225,145,1,168,10,248,64,1,128,7,230,91,4,141,159,65,175,0,51,
+65,110,0,55,105,163,64,88,140,77,0,83,196,241,1,54,52,97,153,2,
+95,49,52,68,249,103,190,198,242,104,80,2,64,35,52,128,82,166,136,131,
+14,0,80,227,155,1,98,129,224,50,4,101,47,161,8,168,71,99,148,103,
+227,66,17,2,95,52,51,96,83,128,130,66,20,200,91,0,49,97,30,64,
+150,130,51,1,95,54,99,222,64,14,1,54,54,106,78,1,54,56,65,0,
+231,150,0,224,163,3,0,73,64,9,64,237,224,174,2,161,4,104,55,226,
+14,8,195,135,103,65,104,45,9,102,32,116,104,101,32,102,111,114,109,96,
+20,0,45,198,188,131,131,98,21,4,49,50,54,32,95,107,80,64,0,65,
+81,139,91,195,130,64,1,235,177,30,224,11,2,192,8,73,241,160,86,183,
+88,0,50,65,153,3,95,50,49,53,106,215,99,175,224,109,0,0,95,96,
+144,73,246,0,56,97,7,162,189,0,55,65,42,96,246,70,9,1,55,55,
+64,26,68,99,1,49,49,69,131,2,49,57,51,107,64,64,77,66,21,162,
+102,163,5,200,249,65,100,229,38,5,204,11,195,146,1,67,32,138,71,241,
+231,6,15,112,107,103,80,97,116,104,32,105,115,32,101,109,112,116,121,230,
+163,0,130,166,129,243,96,6,0,79,66,55,0,79,235,57,0,192,27,128,
+135,96,105,134,123,231,41,5,228,17,13,64,12,0,52,70,232,0,49,131,
+168,177,118,228,15,22,6,73,110,115,116,97,108,108,229,147,9,64,99,168,
+12,229,144,6,0,105,234,78,0,64,81,230,28,0,233,92,5,196,82,70,
+133,224,13,1,229,180,0,224,208,4,4,95,50,50,55,54,68,113,160,177,
+64,86,224,226,0,128,50,224,253,10,64,53,64,212,203,219,96,0,231,4,
+3,64,54,232,8,0,225,91,2,161,123,135,83,231,204,19,161,81,146,199,
+231,192,14,4,99,114,101,97,116,231,182,1,224,84,6,97,66,224,219,1,
+69,242,131,246,2,32,95,56,66,205,192,150,128,193,64,176,110,50,110,87,
+76,174,133,36,1,95,57,200,153,169,30,236,207,8,134,158,134,157,0,55,
+69,179,202,162,233,193,10,224,101,3,234,136,4,238,168,1,64,0,0,75,
+131,222,98,218,1,95,52,148,140,67,46,139,118,70,231,2,90,32,75,99,
+69,64,21,182,3,105,100,0,55,67,17,1,50,50,79,63,64,26,0,54,
+224,26,0,0,54,66,150,64,25,0,52,128,25,137,93,193,226,0,80,109,
+226,0,32,133,25,68,200,225,100,1,1,46,47,129,95,135,86,167,99,64,
+72,0,51,128,72,179,174,1,50,50,97,120,83,204,96,22,133,231,97,2,
+0,56,66,199,74,11,103,142,64,28,240,14,0,163,211,2,95,53,53,129,
+221,0,56,132,101,64,49,128,61,64,54,101,73,166,201,1,95,54,135,157,
+205,239,64,48,64,126,64,64,224,125,1,65,5,64,21,229,163,1,1,95,
+52,65,131,64,26,129,67,162,112,194,160,80,47,69,196,1,95,52,149,222,
+224,30,15,0,56,133,213,224,30,6,1,95,52,71,47,168,197,226,213,2,
+1,95,51,98,72,176,49,96,125,129,171,168,213,96,212,224,99,2,110,178,
+105,141,0,55,72,82,0,53,89,230,79,75,237,142,0,65,153,166,81,235,
+100,0,162,227,134,120,162,4,0,53,96,223,228,65,2,3,95,52,48,57,
+66,113,1,49,32,64,66,66,145,0,55,228,248,1,71,227,129,136,229,15,
+1,129,155,238,135,0,150,96,231,100,4,141,62,129,9,228,176,2,229,82,
+3,131,240,168,21,0,85,71,228,128,52,238,75,4,0,55,130,163,71,136,
+160,22,64,193,130,165,66,179,198,31,160,135,0,66,64,134,136,102,64,17,
+224,54,2,224,140,0,160,87,130,152,2,94,109,107,174,141,65,83,166,186,
+233,229,7,230,102,3,235,233,1,229,93,9,0,56,215,44,169,178,228,223,
+1,67,191,0,56,64,44,114,51,0,90,228,229,13,71,70,144,182,239,98,
+3,1,64,67,134,109,128,0,64,27,0,85,160,35,128,9,160,10,224,183,
+11,229,233,2,205,33,131,209,161,14,160,167,230,10,2,224,21,8,224,24,
+1,192,239,165,248,160,80,172,145,224,96,3,231,13,31,235,19,28,16,116,
+111,112,32,108,101,118,101,108,32,100,101,102,110,115,58,32,96,0,236,154,
+0,229,91,3,1,51,54,153,50,235,32,5,164,145,96,22,231,44,6,7,
+40,117,110,112,114,117,110,101,179,210,224,76,3,224,64,2,0,95,68,109,
+99,19,0,49,232,12,2,225,18,24,237,170,9,65,11,0,67,91,49,120,
+220,130,200,101,187,227,173,1,151,62,161,13,164,69,131,165,239,244,4,224,
+195,2,0,61,160,187,96,24,0,50,224,160,8,225,202,5,130,252,224,180,
+1,173,125,75,2,64,62,129,178,226,79,2,226,158,4,103,178,0,55,96,
+139,64,4,228,115,6,224,55,4,226,137,12,224,119,5,233,183,4,226,49,
+68,9,102,105,110,97,108,32,112,97,115,115,130,43,226,49,3,163,151,97,
+82,128,59,226,53,0,128,14,237,89,18,230,243,2,237,89,4,163,239,161,
+255,129,5,205,1,130,161,238,245,16,224,225,1,64,146,134,5,169,94,228,
+60,1,235,71,3,104,173,1,48,55,160,147,172,131,89,123,64,27,71,254,
+128,65,78,218,161,158,1,95,52,118,123,64,233,6,48,51,32,95,56,54,
+53,230,241,0,229,242,3,231,207,2,0,104,192,220,175,24,177,157,72,30,
+0,56,69,35,128,172,244,36,0,161,239,129,142,226,111,1,161,99,192,30,
+225,87,3,96,19,160,34,84,186,69,24,97,226,76,13,64,172,2,35,49,
+48,85,250,225,130,20,6,32,108,105,110,101,115,47,225,136,2,236,11,4,
+229,134,3,100,237,194,255,160,123,100,211,128,155,109,173,1,50,50,77,219,
+225,5,2,3,99,111,109,98,192,91,165,6,224,53,4,126,81,224,53,9,
+234,107,1,225,195,3,3,95,56,56,48,226,161,2,3,109,104,115,99,224,
+42,7,229,201,0,230,24,11,79,159,72,42,224,46,1,226,86,4,232,65,
+0,224,168,0,227,80,7,1,95,55,86,217,225,208,0,162,61,0,50,144,
+218,1,95,56,138,248,96,44,234,252,3,224,11,0,209,151,239,84,1,193,
+223,2,95,50,50,69,22,64,7,0,54,167,188,130,57,192,128,3,95,51,
+54,52,130,227,70,221,66,68,237,143,5,31,84,104,101,32,45,114,32,102,
+108,97,103,32,99,117,114,114,101,110,116,108,121,32,111,110,108,121,32,119,
+111,114,107,115,4,32,119,105,116,104,85,85,161,46,64,104,161,9,209,222,
+1,50,50,68,149,64,117,104,162,2,95,49,49,72,241,0,56,110,87,112,
+179,225,121,2,2,97,105,110,227,186,3,71,246,138,108,85,99,144,192,128,
+228,255,53,0,78,74,97,249,64,121,0,57,167,189,0,83,96,106,0,39,
+96,113,128,16,161,25,1,95,56,113,40,160,123,1,55,49,64,11,97,155,
+98,14,228,168,5,10,68,117,112,108,105,99,97,116,101,32,105,77,232,1,
+110,99,237,222,3,197,248,140,165,111,67,200,213,230,2,7,1,97,116,128,
+55,118,53,78,101,224,119,3,224,0,1,66,233,72,72,224,91,0,1,95,
+52,195,162,225,207,0,227,167,4,160,38,2,79,32,35,68,123,102,88,81,
+234,71,80,147,65,224,131,2,0,125,225,85,1,64,31,1,85,32,172,162,
+228,17,2,90,59,224,13,1,238,120,2,174,123,160,250,224,17,2,192,20,
+227,202,2,224,48,8,224,51,10,224,57,3,227,188,3,224,29,17,224,65,
+3,135,35,195,103,195,236,224,45,11,128,41,224,37,8,230,192,0,236,191,
+1,161,209,65,102,2,49,50,50,138,237,97,119,106,157,76,154,109,125,3,
+51,50,52,32,134,226,1,95,55,116,59,161,130,0,50,148,209,1,75,52,
+161,119,224,159,6,68,101,2,49,50,51,97,190,0,50,210,96,224,31,2,
+100,90,224,234,8,225,5,2,192,40,194,196,129,41,64,133,198,82,224,34,
+3,224,62,0,99,227,128,120,224,34,3,64,18,132,121,128,15,96,101,132,
+215,124,48,2,32,95,56,77,14,1,95,49,147,28,160,0,96,41,212,66,
+163,121,228,201,0,192,100,100,202,105,44,160,17,77,18,132,187,160,123,225,
+10,10,225,4,2,192,162,224,166,5,192,157,160,221,234,200,1,160,185,193,
+22,132,93,0,56,230,165,1,96,61,96,147,96,209,102,230,64,211,214,134,
+227,64,1,71,131,143,24,231,8,4,128,0,226,48,0,0,67,97,231,0,
+50,175,186,235,248,6,3,64,66,32,82,64,214,0,54,222,86,173,247,128,
+238,233,133,5,236,32,1,180,171,228,48,4,1,65,32,227,172,0,224,122,
+1,143,62,226,112,1,161,21,96,21,228,139,4,0,49,64,207,254,81,0,
+228,57,12,228,23,2,2,64,94,42,231,69,0,143,160,160,65,1,54,52,
+234,171,5,163,127,138,103,160,9,131,32,231,217,3,1,95,49,145,58,96,
+238,100,98,160,133,193,60,65,59,192,86,2,80,32,90,241,7,0,132,182,
+192,25,65,31,0,85,96,42,128,233,3,85,32,75,51,64,2,160,11,224,
+53,0,86,167,224,11,1,229,227,0,0,55,81,216,98,155,229,236,13,229,
+162,8,1,78,111,76,189,3,105,110,105,116,87,218,4,102,111,117,110,100,
+85,197,187,237,197,217,227,111,0,70,149,181,94,182,104,246,83,10,65,64,
+246,83,3,5,95,52,53,48,32,35,66,27,64,62,176,246,0,54,169,246,
+0,54,96,61,0,54,248,147,0,228,115,6,130,201,140,232,170,100,4,55,
+50,32,95,55,146,122,192,68,0,49,98,229,202,117,169,146,0,58,135,21,
+145,141,0,51,106,37,1,50,49,178,94,71,168,125,223,137,100,129,216,97,
+56,119,206,74,53,81,242,64,7,82,87,248,75,10,196,8,130,206,197,117,
+133,85,65,150,130,246,109,86,248,91,0,195,10,224,94,36,162,116,165,19,
+224,108,0,96,176,143,181,162,5,224,107,4,96,106,227,122,0,103,127,0,
+51,128,224,227,47,0,1,54,56,231,248,9,10,35,105,110,99,108,117,100,
+101,32,92,34,98,0,219,96,2,79,32,35,86,251,238,175,1,64,103,235,
+167,15,7,109,104,115,102,102,105,46,104,131,94,96,123,4,56,32,95,51,
+53,73,210,225,73,24,150,236,224,245,6,224,13,0,100,117,192,36,224,46,
+2,224,10,6,164,158,225,125,5,129,15,129,19,225,25,0,225,17,0,130,
+59,0,50,122,123,228,78,1,224,212,1,31,115,116,97,116,105,99,32,115,
+116,114,117,99,116,32,102,102,105,95,101,110,116,114,121,32,116,97,98,108,
+101,91,93,32,2,61,32,123,64,239,228,122,6,236,165,1,70,12,194,154,
+224,87,3,4,123,32,48,44,48,136,164,224,22,3,1,125,59,224,17,7,
+224,121,8,1,42,120,64,11,96,127,1,32,61,128,135,96,52,228,187,3,
+234,210,6,24,85,110,105,109,112,108,101,109,101,110,116,101,100,32,70,70,
+73,32,102,101,97,116,117,114,101,225,170,0,1,50,50,69,64,227,154,3,
+99,144,129,188,64,29,192,7,166,38,225,207,1,65,108,65,196,232,207,1,
+225,152,1,133,53,160,5,193,241,0,83,99,122,0,83,66,60,64,63,72,
+64,229,55,0,96,3,96,12,168,52,198,51,136,49,224,85,0,99,116,76,
+240,4,61,61,32,64,35,250,183,1,224,42,0,227,45,2,243,124,3,117,
+186,2,50,50,54,226,26,0,226,17,0,68,28,148,234,141,85,192,100,199,
+136,116,254,0,83,96,15,166,9,100,66,232,23,0,212,107,97,49,225,121,
+1,5,100,121,110,97,109,105,173,89,64,73,0,85,65,107,100,242,224,226,
+3,224,73,26,6,119,114,97,112,112,101,114,224,73,7,69,32,192,73,225,
+24,1,224,65,2,227,173,15,130,216,235,36,1,129,9,0,95,124,53,193,
+205,192,232,186,219,193,210,138,146,72,121,69,191,239,187,22,224,97,0,194,
+40,104,158,3,50,50,54,50,123,90,225,4,0,0,85,182,72,96,23,0,
+51,176,122,224,135,13,226,106,11,245,240,4,224,248,10,68,201,200,34,224,
+88,1,196,125,224,96,0,194,162,224,87,3,225,83,4,150,75,142,124,228,
+161,0,233,162,1,98,229,225,138,4,0,66,72,5,64,215,175,55,246,108,
+0,225,255,3,225,185,36,3,118,97,108,117,163,185,224,105,13,97,59,1,
+67,39,64,106,1,95,55,81,23,192,245,224,141,7,224,17,4,169,196,192,
+142,226,234,1,104,203,133,131,226,105,1,64,38,232,109,15,232,110,9,1,
+98,97,104,94,9,101,105,103,110,32,105,109,112,111,114,174,32,254,33,11,
+99,138,0,54,167,167,0,65,135,182,151,85,105,46,64,14,151,40,1,75,
+50,87,36,64,201,254,77,2,223,198,224,13,9,231,71,1,254,54,0,64,
+62,143,108,224,105,0,136,229,224,105,0,136,181,229,143,3,5,71,69,84,
+82,65,87,229,165,7,11,71,69,84,84,73,77,69,77,73,76,76,73,224,
+27,7,2,97,99,111,112,43,224,19,4,6,100,100,95,70,73,76,69,224,
+23,11,3,117,116,102,56,224,23,8,0,115,144,38,224,19,4,1,116,97,
+224,19,12,0,50,224,20,7,4,99,97,108,108,111,99,234,224,21,4,3,
+108,111,115,101,114,81,224,21,4,224,171,9,2,101,120,112,224,18,7,4,
+102,108,117,115,104,224,59,8,3,102,111,112,101,224,145,8,2,102,114,101,
+98,172,224,19,3,2,103,101,116,224,60,8,5,103,101,116,101,110,118,224,
+21,7,7,105,115,119,105,110,100,111,119,224,148,8,2,108,111,103,224,18,
+7,0,109,224,230,12,6,109,100,53,65,114,114,97,127,86,224,23,6,0,
+66,225,129,11,7,109,100,53,83,116,114,105,110,224,94,9,3,101,109,99,
+112,224,70,9,4,101,109,109,111,118,224,225,8,1,112,117,224,225,9,225,
+194,10,3,115,113,114,116,224,19,8,4,121,115,116,101,109,224,21,7,225,
+235,10,5,116,109,112,110,97,109,224,122,8,1,117,110,225,94,11,5,117,
+110,108,105,110,107,224,21,7,3,114,101,97,100,224,42,8,3,119,114,105,
+116,226,24,9,5,112,101,101,107,80,116,102,127,224,22,4,2,111,107,101,
+224,22,14,3,87,111,114,100,224,69,11,224,23,11,66,247,13,108,122,55,
+55,95,99,111,109,112,114,101,115,115,111,224,82,8,224,34,0,1,100,101,
+224,36,21,2,114,108,101,224,70,22,64,33,224,69,23,2,98,119,116,224,
+69,22,64,33,224,69,19,64,235,4,95,117,105,110,116,227,205,8,65,29,
+224,25,14,192,51,1,49,54,224,52,16,224,26,10,192,53,0,51,227,251,
+8,224,53,0,224,26,10,192,53,1,54,52,224,53,16,224,26,10,64,53,
+224,212,16,224,211,16,224,210,17,224,209,17,224,208,17,224,207,17,224,206,
+17,224,205,17,3,117,115,104,111,227,135,9,129,3,224,26,13,64,53,224,
+52,17,224,51,17,65,82,225,107,16,224,207,15,224,205,15,224,97,13,1,
+108,111,228,186,9,128,98,224,25,12,64,51,224,50,16,224,49,16,1,117,
+108,224,102,18,224,103,17,224,104,17,224,51,16,1,102,108,224,255,13,224,
+23,10,5,115,105,122,101,111,102,225,25,11,160,25,224,100,11,192,26,224,
+27,11,70,206,1,100,105,227,215,8,103,56,224,23,10,69,76,224,46,11,
+2,95,100,95,229,167,11,1,99,104,224,44,10,127,251,224,20,7,4,103,
+101,116,99,119,229,50,8,6,103,101,116,95,98,117,102,224,180,11,3,98,
+95,114,100,224,27,17,1,119,114,224,27,11,6,110,101,119,95,109,112,122,
+224,144,8,4,112,122,95,97,98,231,126,8,96,22,0,100,224,147,8,96,
+22,0,110,224,22,12,1,99,109,232,69,8,64,22,64,197,224,47,12,64,
+24,1,115,105,224,25,15,0,117,224,25,12,82,207,1,95,115,224,56,16,
+224,30,0,224,61,14,229,194,9,64,22,2,109,117,108,224,22,14,1,95,
+50,233,26,10,64,27,1,110,101,232,61,9,8,112,122,95,112,111,112,99,
+111,117,226,158,9,64,27,1,115,117,231,113,8,64,22,5,102,100,105,118,
+95,113,224,104,16,0,116,96,30,224,182,12,4,116,115,116,98,105,224,106,
+12,0,120,224,231,9,5,119,97,110,116,95,103,129,161,240,71,3,224,0,
+94,0,58,144,96,244,94,2,1,95,52,82,119,179,249,1,54,57,76,35,
+80,143,237,28,1,240,140,1,76,62,84,11,96,32,0,54,87,155,1,57,
+55,77,158,240,173,1,64,94,147,248,2,85,32,90,114,36,0,90,176,27,
+141,247,86,197,2,50,50,53,79,74,143,4,0,55,116,101,96,5,96,60,
+144,24,224,56,9,80,129,77,239,236,239,8,4,123,32,92,34,38,65,76,
+88,92,246,169,3,224,34,1,2,92,34,44,92,68,67,69,1,114,95,96,
+42,211,116,224,35,1,1,125,44,96,24,96,0,109,112,224,101,9,224,100,
+29,224,95,24,192,255,224,202,13,224,100,62,225,89,4,65,87,0,54,252,
+232,4,225,77,1,156,190,225,105,1,246,232,0,206,149,149,3,96,8,151,
+0,1,50,50,94,78,224,152,6,225,90,1,113,87,96,154,3,52,55,32,
+64,154,209,152,76,96,172,64,121,96,222,0,52,116,11,0,52,79,28,224,
+17,5,66,140,122,96,238,241,7,2,49,50,53,64,45,224,116,1,206,230,
+16,38,32,109,117,115,116,32,98,101,32,80,116,114,47,70,117,110,171,37,
+78,123,239,217,15,2,40,72,115,128,40,0,41,193,50,224,43,7,176,58,
+64,5,96,186,240,214,7,65,199,154,195,210,184,225,26,1,129,224,128,244,
+65,6,160,43,129,13,226,205,1,146,134,65,143,97,149,129,136,97,113,179,
+9,158,130,160,87,97,40,242,187,0,81,129,0,50,129,17,160,100,96,74,
+129,101,226,57,9,0,59,98,55,64,15,7,95,85,110,105,116,40,115,44,
+144,22,249,195,12,2,79,32,35,87,163,224,234,0,178,71,250,5,4,0,
+52,222,22,224,65,0,87,107,0,49,255,112,3,192,98,2,32,95,53,68,
+87,2,50,50,53,100,104,7,53,55,48,32,95,50,55,54,225,15,0,224,
+110,6,184,138,89,139,195,37,65,60,191,241,68,133,0,54,88,92,96,10,
+228,62,2,66,229,144,188,227,191,10,64,252,1,116,111,162,161,225,173,0,
+118,63,1,50,52,250,251,1,224,49,2,225,33,35,64,122,145,40,67,96,
+129,222,117,46,153,111,121,163,0,85,249,195,0,0,55,229,51,0,145,134,
+64,61,145,89,4,95,49,51,55,54,224,131,3,98,156,64,31,145,58,121,
+141,64,127,1,95,57,90,44,64,24,145,68,227,65,5,69,179,183,136,64,
+34,186,14,224,91,6,12,80,114,105,109,105,116,105,118,101,115,46,73,79,
+160,102,64,57,97,63,0,85,98,151,224,201,3,125,112,180,43,192,31,243,
+211,0,224,243,9,212,85,64,29,0,85,226,207,1,194,233,225,8,4,160,
+43,244,161,1,128,139,134,70,146,80,225,205,10,98,202,163,187,96,93,68,
+159,225,211,5,229,200,11,225,214,0,226,5,5,253,153,3,224,51,8,226,
+199,1,96,44,227,29,7,64,172,182,207,129,19,217,119,163,172,2,67,32,
+60,161,64,131,225,247,79,3,166,8,97,79,0,90,64,4,0,85,164,6,
+224,36,3,165,67,85,182,192,89,226,76,9,101,73,160,32,64,57,224,30,
+7,97,99,224,211,1,229,37,3,226,20,2,192,18,128,0,224,115,2,100,
+175,2,95,54,55,84,62,136,20,130,136,1,50,50,94,236,247,220,0,253,
+24,12,165,184,225,87,8,17,78,111,116,32,97,32,118,97,108,105,100,32,
+67,32,116,121,112,101,221,20,1,49,53,100,42,97,90,0,54,130,190,132,
+118,229,208,17,226,207,2,4,70,108,111,97,116,116,55,245,216,16,224,34,
+2,0,64,224,85,30,0,73,138,77,224,82,16,192,31,224,79,31,209,155,
+224,80,16,224,32,0,224,81,20,3,68,97,116,97,96,75,96,4,112,17,
+224,81,20,128,33,224,82,20,132,118,224,69,16,70,63,224,68,25,0,83,
+115,91,8,46,73,79,46,72,97,110,100,108,151,69,225,22,16,194,119,231,
+93,2,1,54,56,67,61,0,80,168,106,225,200,16,136,3,8,46,67,46,
+84,121,112,101,115,46,128,70,64,35,235,116,3,3,67,67,104,97,235,137,
+8,1,67,83,224,21,12,0,85,224,43,13,240,104,11,1,67,85,224,22,
+13,162,10,224,42,5,224,20,11,0,76,239,10,10,1,67,85,224,21,12,
+5,80,116,114,100,105,102,238,75,8,3,67,83,105,122,238,239,8,1,67,
+83,224,21,12,0,76,224,110,14,224,22,12,1,84,105,143,71,236,163,10,
+67,149,135,105,230,84,18,228,96,1,64,46,135,29,224,46,18,224,43,2,
+248,101,1,228,47,6,3,118,111,105,100,234,254,1,232,149,9,224,41,1,
+8,40,105,110,116,32,115,41,32,123,229,185,5,224,32,1,0,59,158,15,
+160,204,135,93,233,146,0,3,95,50,50,50,91,104,2,50,50,50,228,183,
+0,64,9,191,148,2,35,49,50,70,168,68,250,101,153,64,65,135,134,3,
+95,50,50,51,103,130,1,51,57,103,122,64,31,3,10,65,32,94,245,114,
+10,89,79,64,37,192,233,1,51,55,69,84,96,10,73,29,0,51,128,126,
+186,94,102,74,192,23,198,185,101,106,0,50,224,19,1,3,32,95,51,54,
+192,34,101,171,91,220,0,52,127,25,0,50,69,162,2,95,50,57,137,53,
+224,58,6,64,31,137,1,128,232,105,169,72,178,1,95,51,101,182,185,211,
+224,26,1,64,155,126,178,95,106,4,95,51,50,52,32,169,199,224,153,2,
+224,156,5,64,99,110,100,235,41,0,192,168,1,95,57,96,160,105,33,224,
+30,18,128,69,188,34,225,9,2,160,152,0,51,64,191,122,103,224,65,0,
+224,222,1,0,56,103,212,224,22,8,2,50,50,51,106,59,1,49,49,224,
+165,0,224,0,1,65,156,136,127,0,94,153,187,97,174,135,228,141,67,2,
+39,32,95,106,204,3,50,50,51,53,98,25,97,11,0,55,64,141,158,241,
+64,48,0,54,96,48,4,112,97,99,107,67,152,232,2,76,101,110,96,73,
+131,61,0,94,178,87,96,18,163,33,6,56,57,32,75,32,95,57,126,107,
+160,7,2,95,57,51,225,4,0,2,95,57,53,224,11,1,1,49,48,65,
+8,224,12,0,64,218,128,12,160,157,98,175,65,173,125,67,160,163,189,28,
+129,14,2,49,48,52,192,30,0,95,64,148,96,181,170,139,224,137,18,98,
+254,160,137,96,11,192,137,160,12,128,137,64,12,224,137,1,1,50,50,126,
+188,224,138,3,157,218,233,135,0,0,51,73,136,160,139,64,5,64,139,131,
+153,0,94,84,135,1,80,116,131,52,131,106,0,94,84,178,192,18,131,102,
+174,161,107,174,0,50,128,102,227,37,7,141,109,2,95,49,48,105,119,0,
+58,98,210,131,130,64,51,0,55,126,21,76,152,236,81,0,64,71,68,26,
+128,163,97,44,67,167,109,136,98,0,224,189,0,0,32,162,105,64,217,128,
+58,130,46,0,94,155,192,64,167,66,25,96,186,1,117,116,128,15,162,6,
+244,43,3,96,23,130,11,4,66,32,95,55,49,132,118,136,252,228,190,1,
+30,115,116,97,116,105,99,32,117,110,115,105,103,110,101,100,32,99,104,97,
+114,32,100,97,116,97,91,93,32,61,32,123,229,183,0,64,165,229,33,0,
+73,150,0,50,96,13,99,243,2,50,32,35,68,229,65,19,224,90,3,1,
+125,59,101,24,224,20,5,224,104,5,10,42,99,111,109,98,101,120,112,114,
+32,61,96,116,128,49,159,5,229,138,8,69,137,192,47,5,108,101,110,32,
+61,32,192,45,224,153,0,235,124,2,141,251,2,79,32,35,74,99,239,129,
+2,161,82,198,26,0,89,64,55,75,6,3,85,32,95,49,110,251,129,237,
+94,132,224,7,1,229,39,1,69,182,206,80,191,135,206,76,1,53,56,65,
+208,160,95,173,102,2,55,51,57,240,177,1,224,160,6,133,69,76,3,0,
+52,160,161,64,56,130,148,64,97,1,75,52,160,2,2,90,32,90,64,6,
+228,81,1,65,109,64,93,1,57,50,127,77,0,49,130,122,0,67,75,48,
+0,53,71,26,65,140,64,23,211,63,1,75,51,128,63,64,19,130,75,64,
+248,2,66,32,80,96,199,205,127,133,108,0,67,105,41,225,4,11,225,12,
+0,161,5,96,0,159,172,64,218,0,56,99,117,0,55,97,4,64,104,0,
+54,192,124,0,50,102,193,0,49,130,162,96,15,160,211,224,1,5,224,225,
+1,192,230,77,205,161,11,224,46,9,224,56,16,192,60,129,225,76,192,0,
+80,140,113,226,82,0,2,64,95,56,96,191,135,131,134,49,163,125,67,177,
+2,50,50,49,196,112,224,14,1,163,56,1,35,54,193,171,66,79,0,50,
+77,22,64,12,237,174,1,0,83,109,84,237,174,3,99,197,237,110,0,224,
+25,3,174,89,0,83,200,45,173,222,65,189,0,85,128,140,160,161,165,104,
+224,195,5,2,50,50,48,109,61,224,196,2,64,0,102,82,237,243,3,96,
+101,102,106,224,62,27,2,85,32,83,128,144,1,95,49,66,75,0,54,141,
+123,0,49,174,96,128,61,97,14,1,49,56,167,55,160,17,98,220,0,50,
+85,201,1,49,50,85,217,2,49,50,52,227,187,2,192,9,169,42,128,44,
+169,8,0,55,69,26,64,69,101,74,128,0,225,73,12,193,6,224,223,5,
+96,21,66,35,161,139,224,34,10,242,5,0,224,34,0,225,78,9,1,49,
+48,135,205,225,15,3,66,70,227,200,2,64,41,0,48,130,204,131,165,97,
+42,1,32,95,118,228,101,205,3,95,52,57,50,73,213,175,253,160,31,73,
+58,97,72,2,35,50,48,80,140,0,64,224,23,8,2,54,53,53,104,121,
+64,22,224,24,4,4,49,49,49,52,49,98,142,3,95,51,52,51,229,71,
+3,2,116,102,56,76,94,5,58,32,98,97,100,32,204,104,226,78,3,0,
+83,197,69,64,147,96,238,1,56,48,137,105,164,191,0,35,170,117,131,219,
+229,116,0,224,46,11,68,226,1,35,49,103,10,169,26,224,44,31,224,41,
+32,131,84,101,43,69,35,0,51,96,21,160,168,67,116,224,27,22,224,26,
+4,160,20,97,13,225,8,28,139,30,224,216,82,224,187,47,224,184,22,178,
+232,224,139,38,224,111,12,203,212,0,67,64,74,64,39,66,230,134,103,204,
+173,107,120,96,201,99,49,67,18,119,207,135,24,76,185,162,187,131,12,107,
+203,70,44,0,54,102,148,96,18,117,88,227,0,4,160,24,99,113,64,22,
+224,75,3,114,120,134,206,128,124,224,28,15,0,57,224,28,19,68,137,128,
+136,224,49,3,164,241,224,137,9,131,189,64,214,224,71,8,64,24,224,48,
+10,99,170,227,186,2,224,235,4,227,178,1,1,92,92,142,110,73,16,192,
+148,225,184,8,2,49,55,52,161,185,129,144,227,30,5,128,59,96,237,225,
+243,18,224,71,18,161,237,160,77,224,155,3,0,63,175,10,193,254,192,107,
+103,10,224,20,1,224,129,29,160,115,133,70,160,56,228,192,6,4,113,117,
+111,116,101,140,203,196,185,224,72,1,69,118,162,159,160,74,122,119,64,0,
+89,60,233,47,2,70,196,7,10,65,32,80,32,35,52,32,182,166,0,48,
+136,246,237,163,2,2,95,52,48,109,79,234,77,3,17,87,101,108,99,111,
+109,101,32,116,111,32,105,110,116,101,114,97,99,80,62,17,32,77,105,99,
+114,111,72,115,44,32,118,101,114,115,105,111,110,32,64,156,3,95,52,49,
+54,82,50,169,223,224,89,4,70,242,131,14,73,198,96,105,224,100,1,8,
+85,115,105,110,103,32,71,77,80,230,247,0,239,126,3,1,95,56,77,41,
+174,3,238,137,5,0,55,67,51,1,50,50,77,84,134,207,72,180,110,20,
+0,49,87,175,103,127,96,141,0,75,71,73,128,58,181,56,74,6,82,225,
+1,50,50,72,228,1,95,51,73,8,78,156,135,93,65,31,138,2,6,95,
+56,49,48,32,75,32,72,105,128,1,137,202,192,13,224,1,19,0,67,128,
+105,224,0,4,224,53,44,224,50,41,224,47,38,224,44,35,224,41,32,224,
+38,29,224,35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,20,11,
+224,17,8,66,54,101,162,224,0,6,66,55,0,54,163,87,224,1,27,226,
+34,11,226,91,255,224,41,19,224,38,29,224,35,26,224,32,23,224,29,20,
+224,26,17,224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,192,8,
+110,120,224,0,6,66,120,182,34,69,116,0,55,90,13,2,95,50,49,70,
+3,69,51,128,15,1,55,55,71,246,177,160,96,18,69,164,0,55,82,106,
+112,184,0,49,90,4,1,95,56,75,124,1,95,56,103,157,0,64,224,77,
+2,64,39,229,184,6,88,2,7,32,39,58,113,117,105,116,39,70,34,64,
+8,13,44,32,39,58,104,101,108,112,39,32,102,111,114,32,64,9,133,213,
+224,73,2,1,51,54,71,117,1,54,57,96,162,71,254,230,244,6,2,84,
+104,101,230,109,4,0,115,120,218,25,32,99,117,114,114,101,110,116,108,121,
+32,111,110,108,121,32,119,111,114,107,115,32,119,105,116,104,86,163,160,100,
+1,50,50,83,128,193,17,179,227,225,0,0,0,56,83,41,84,225,85,78,
+224,227,0,148,255,224,33,2,2,50,49,53,137,228,230,115,0,129,44,97,
+129,129,47,166,109,160,33,2,50,49,54,72,244,96,30,72,217,244,226,1,
+2,95,50,49,65,116,232,67,2,4,46,109,104,115,105,96,173,224,19,1,
+1,62,32,128,190,0,80,102,143,2,51,32,64,113,104,160,203,205,167,65,
+252,233,105,2,0,35,224,163,0,225,206,2,70,240,156,37,129,6,224,190,
+4,64,21,1,50,32,64,100,225,202,10,1,66,121,154,49,225,66,3,161,
+69,240,34,1,2,95,54,54,65,173,64,223,129,46,167,47,108,17,96,179,
+226,46,20,11,85,110,114,101,99,111,103,110,105,122,101,100,82,163,2,109,
+97,110,187,112,224,82,9,194,238,81,114,96,10,71,119,144,126,112,34,120,
+60,64,25,0,85,64,107,81,70,113,102,0,90,97,143,226,223,9,73,54,
+71,209,243,46,8,8,65,109,98,105,103,117,111,117,115,192,144,189,18,116,
+12,112,216,83,198,0,54,105,175,224,169,15,64,0,64,118,0,55,65,42,
+64,8,64,55,0,56,66,228,139,19,160,62,65,89,213,7,65,136,1,10,
+65,125,96,233,236,3,155,232,1,95,56,130,67,160,102,175,102,224,43,5,
+2,99,108,101,142,204,64,44,227,242,3,2,55,53,32,64,18,169,1,227,
+118,3,2,56,48,56,129,29,72,247,0,56,85,242,168,246,233,11,0,0,
+49,85,158,201,11,169,59,1,95,55,150,193,224,248,12,224,147,5,4,114,
+101,108,111,97,97,209,64,129,227,83,5,100,85,227,106,9,163,130,227,105,
+19,1,95,56,237,81,0,225,215,4,64,206,224,186,0,224,206,3,224,244,
+4,165,3,225,181,14,224,191,5,4,100,101,108,101,116,99,6,224,108,8,
+97,87,64,8,0,54,182,36,193,231,64,166,65,246,128,26,1,52,53,112,
+132,225,251,2,65,253,129,137,224,132,11,224,127,5,2,116,121,112,224,125,
+10,3,95,50,49,57,122,2,224,61,22,1,107,105,131,77,224,61,9,65,
+26,224,61,23,3,109,97,105,110,224,61,13,66,18,224,61,23,197,230,0,
+75,228,1,12,66,248,97,11,225,134,11,172,247,163,22,146,49,224,88,1,
+0,67,131,148,3,115,58,94,42,102,102,0,32,96,0,96,9,172,131,2,
+94,42,58,130,119,64,24,160,9,5,109,111,100,117,108,101,64,26,99,38,
+96,51,128,9,13,97,108,108,32,100,101,102,105,110,105,116,105,111,110,64,
+33,129,244,3,32,100,32,32,192,9,224,30,0,7,40,115,41,32,100,94,
+42,58,65,151,1,32,101,64,68,4,115,104,111,119,32,96,14,6,111,102,
+32,101,94,42,58,65,116,0,32,96,149,96,26,96,14,6,111,102,32,116,
+94,42,58,65,81,9,32,97,114,103,115,32,114,117,110,32,96,13,102,172,
+7,97,114,103,117,109,101,110,116,64,124,65,55,128,210,10,116,104,105,115,
+32,116,101,120,116,94,42,119,233,128,0,8,101,118,97,108,117,97,116,101,
+32,64,19,1,101,115,77,106,5,94,42,100,101,102,110,160,31,11,97,100,
+100,32,116,111,112,32,108,101,118,101,224,216,3,2,94,42,34,141,228,240,
+154,0,134,24,228,254,8,0,95,64,146,0,65,64,164,100,245,102,204,247,
+132,3,1,49,50,70,207,64,4,0,51,68,178,98,206,70,3,230,188,2,
+96,218,133,198,0,58,130,46,128,113,227,232,7,101,162,227,232,13,1,50,
+49,87,21,134,225,153,48,160,168,80,2,0,48,174,198,66,139,133,133,0,
+80,228,28,0,64,57,67,140,0,75,228,87,13,229,253,10,1,49,53,72,
+228,113,220,88,95,2,95,56,52,78,66,0,49,111,170,226,136,1,99,51,
+222,42,0,52,253,74,0,217,7,2,80,32,79,64,109,240,2,1,230,169,
+4,198,173,224,13,1,0,85,224,13,2,96,25,244,123,0,103,217,0,64,
+91,68,102,215,135,223,1,55,55,132,48,135,241,248,68,0,128,18,64,172,
+102,151,0,49,101,29,96,172,221,40,88,52,65,14,64,19,0,54,225,249,
+0,225,240,4,98,188,198,225,64,26,192,252,224,41,8,250,57,0,161,147,
+225,139,3,128,98,138,112,224,49,1,74,14,0,95,102,194,64,29,251,84,
+0,226,8,74,161,32,226,8,63,124,76,130,8,246,250,1,160,228,219,2,
+226,8,46,225,250,64,129,249,64,215,225,249,3,136,70,105,155,1,56,48,
+71,249,123,156,151,192,113,231,96,43,250,222,0,67,194,64,19,132,22,0,
+80,91,27,67,4,96,5,0,58,135,240,75,48,226,8,5,133,77,98,12,
+130,49,1,56,52,185,241,224,36,2,0,40,224,37,13,224,32,1,16,41,
+32,119,104,101,114,101,94,42,105,109,112,111,114,116,32,83,107,212,12,46,
+73,79,46,80,114,105,110,116,79,114,82,117,132,219,25,97,117,108,116,32,
+78,117,109,32,40,73,110,116,101,103,101,114,44,32,68,111,117,98,108,101,
+41,224,30,1,1,73,115,147,19,1,32,40,128,7,224,26,2,0,83,69,
+135,3,40,40,41,41,101,3,161,197,71,129,226,140,18,161,144,1,32,83,
+98,1,89,157,120,129,64,12,66,84,178,141,231,18,0,66,163,65,251,226,
+124,7,1,64,90,130,195,72,42,0,95,129,199,129,185,0,90,66,104,156,
+53,96,84,64,97,0,50,115,8,1,50,49,94,254,227,13,54,0,56,136,
+104,224,144,9,64,27,130,66,104,183,192,26,133,200,224,86,2,227,226,16,
+70,51,97,55,224,157,4,227,77,2,2,56,53,52,64,4,64,236,3,83,
+32,95,51,76,235,236,254,3,224,42,0,0,80,96,205,171,30,243,217,1,
+224,61,1,224,32,0,243,170,9,128,70,0,51,93,26,134,200,0,53,96,
+79,131,176,226,143,5,2,79,32,35,64,11,64,192,65,90,180,137,128,202,
+0,54,163,7,108,57,99,191,0,83,125,196,148,109,1,55,50,128,94,78,
+137,229,11,9,19,116,114,97,110,115,108,97,116,101,58,32,110,111,116,32,
+102,111,117,110,100,98,234,221,36,161,78,0,55,105,234,254,236,0,97,197,
+1,49,54,102,182,228,52,3,97,96,228,44,3,100,3,130,3,163,244,159,
+77,79,234,128,243,0,52,255,79,0,192,0,181,219,97,14,223,164,128,67,
+0,83,128,110,98,210,194,91,189,60,64,14,96,86,196,128,193,89,129,108,
+100,32,196,182,131,21,64,76,64,17,252,99,4,135,135,130,209,224,32,12,
+133,69,164,235,224,32,11,129,154,160,245,252,133,3,192,24,0,85,64,155,
+99,56,128,165,253,54,18,5,100,121,110,115,121,109,163,237,253,52,0,69,
+80,229,204,1,224,103,8,96,26,0,85,225,251,31,65,247,6,32,112,114,
+105,109,111,112,161,247,233,30,1,201,25,67,70,1,54,55,64,16,0,53,
+109,56,1,50,49,94,17,128,0,174,176,254,213,5,126,190,97,125,1,95,
+52,141,127,0,56,160,73,128,255,96,250,64,21,207,143,161,202,225,79,11,
+128,105,129,79,162,211,224,28,1,96,85,225,1,8,96,21,0,85,193,255,
+224,116,5,1,49,51,141,152,224,32,5,225,36,24,69,219,5,115,115,105,
+98,108,101,175,70,161,38,0,49,142,248,130,175,177,149,106,88,65,121,175,
+98,225,183,0,138,113,100,171,155,108,96,53,135,135,3,95,52,49,48,128,
+43,131,243,160,57,1,50,51,68,83,68,173,3,64,95,50,51,66,39,1,
+52,52,160,179,64,59,239,108,1,3,79,32,35,54,164,32,67,121,160,18,
+68,40,64,18,0,79,224,18,2,0,53,128,18,128,22,236,235,3,1,67,
+39,64,217,112,125,192,81,168,0,65,152,192,18,160,62,68,8,224,62,5,
+0,83,96,62,99,139,160,43,69,190,64,43,67,236,192,125,101,8,131,148,
+192,37,160,18,67,77,192,18,160,100,67,172,192,18,160,201,0,89,224,119,
+8,0,66,96,119,0,66,224,119,2,72,5,64,43,72,150,192,62,0,50,
+128,18,0,82,224,62,8,1,75,50,64,62,100,31,224,24,6,0,51,96,
+24,66,162,224,24,6,0,52,96,24,73,50,225,64,7,0,66,129,65,225,
+129,2,66,84,64,120,0,43,224,18,2,160,221,0,45,224,18,2,160,158,
+0,42,224,83,8,91,39,64,84,64,7,224,28,8,1,114,101,100,28,2,
+114,101,109,224,26,8,0,117,192,56,96,8,224,30,9,160,58,64,7,224,
+28,8,1,110,101,123,147,2,110,101,103,224,26,8,178,216,2,97,110,100,
+224,26,8,0,111,113,181,1,111,114,224,24,8,0,120,128,25,0,120,224,
+26,10,2,105,110,118,64,26,2,105,110,118,224,26,8,2,115,104,108,64,
+26,2,115,104,108,224,26,10,96,80,1,115,104,224,80,9,0,97,160,27,
+64,7,224,55,9,2,117,98,116,85,122,96,60,160,11,224,36,8,6,112,
+111,112,99,111,117,110,96,36,192,11,224,36,8,2,99,108,122,64,31,2,
+99,108,122,224,26,9,0,116,128,26,0,116,224,26,9,1,61,61,64,25,
+68,162,224,24,6,0,47,96,24,0,47,192,24,67,102,162,194,0,60,224,
+43,8,0,60,96,43,0,60,224,43,3,162,60,0,62,224,43,8,0,62,
+96,43,0,62,224,112,9,1,117,60,64,24,0,117,224,93,9,0,117,128,
+94,0,117,224,95,0,224,26,2,0,62,96,25,224,101,9,0,117,128,102,
+0,117,224,103,10,1,111,114,98,46,1,111,114,226,46,9,0,99,129,168,
+0,99,225,167,10,1,102,43,64,25,0,102,195,50,224,24,2,0,45,96,
+24,195,56,224,24,2,107,18,0,102,227,62,9,1,102,47,96,24,0,47,
+224,24,9,129,140,0,102,225,141,10,0,102,129,142,0,102,225,143,0,224,
+26,2,97,55,0,102,225,55,9,0,102,129,55,0,102,225,55,10,0,102,
+97,55,0,102,225,55,9,0,102,129,55,0,102,225,55,10,0,102,163,130,
+64,7,224,28,9,81,145,96,29,113,154,224,30,8,1,114,101,148,171,96,
+8,224,30,8,3,105,116,111,102,64,29,64,7,224,28,8,2,115,101,113,
+64,27,2,115,101,113,224,26,11,1,117,97,131,146,96,9,224,32,8,224,
+31,0,224,30,13,2,115,99,109,115,73,64,7,224,148,9,160,28,64,7,
+224,28,8,0,117,160,28,64,7,224,28,8,1,114,110,96,205,1,114,110,
+224,204,9,3,73,79,46,62,129,98,128,9,224,32,13,224,31,0,224,30,
+11,4,114,101,116,117,114,114,3,224,12,0,224,38,11,0,112,77,232,160,
+37,96,11,224,36,11,7,115,101,114,105,97,108,105,122,117,9,224,15,3,
+224,44,11,1,100,101,224,46,7,224,17,2,224,93,12,1,116,100,146,172,
+192,11,224,36,14,1,111,117,192,168,128,12,224,38,14,1,101,114,99,157,
+224,12,0,224,38,11,7,103,101,116,65,114,103,82,101,97,128,224,15,3,
+225,34,12,7,101,114,102,111,114,109,73,79,193,38,192,15,224,89,12,0,
+99,192,82,0,99,225,240,9,2,97,105,115,97,19,96,8,224,30,8,4,
+99,97,116,99,104,64,30,96,8,224,30,8,235,81,1,128,9,224,32,8,
+4,110,101,119,67,65,143,123,1,76,101,97,80,224,17,5,224,48,8,4,
+112,97,99,107,67,128,30,64,45,224,14,2,224,42,19,160,91,224,17,5,
+224,48,8,2,116,111,73,130,87,96,8,224,30,10,1,80,116,97,166,96,
+8,224,30,10,1,68,98,99,144,96,8,224,30,10,2,70,117,110,224,64,
+0,128,11,224,36,8,5,65,46,97,108,108,111,97,142,160,10,224,34,10,
+3,99,111,112,121,128,33,64,9,224,32,10,0,115,162,198,128,9,224,32,
+10,196,178,128,9,224,32,10,2,119,114,105,152,192,160,10,224,34,10,133,
+208,64,7,224,28,8,2,98,115,43,102,82,64,7,224,28,12,0,46,192,
+29,0,46,224,30,10,128,88,64,7,224,28,10,134,43,64,7,224,28,10,
+102,45,1,98,115,230,46,9,1,98,115,134,47,64,7,224,28,10,100,148,
+1,98,115,228,146,9,1,98,115,132,208,64,7,224,28,10,165,40,96,8,
+224,30,10,66,109,128,31,64,9,224,32,10,1,117,110,224,34,1,128,11,
+224,36,10,6,114,101,112,108,105,99,97,129,142,224,14,2,224,42,10,4,
+108,101,110,103,116,99,141,192,11,224,36,10,3,115,117,98,115,130,133,192,
+11,224,36,10,4,105,110,100,101,120,128,35,96,10,224,34,8,192,9,64,
+35,224,21,0,224,36,7,1,116,111,192,34,128,9,224,32,8,3,104,101,
+97,100,192,34,192,11,224,69,9,2,97,105,108,224,71,0,160,11,224,143,
+9,0,112,136,196,0,112,232,197,10,1,112,50,97,166,64,7,224,28,10,
+1,110,101,135,220,64,8,224,30,10,0,102,133,230,96,8,224,90,11,1,
+98,115,160,91,1,98,115,225,71,10,1,50,102,162,33,1,50,102,64,123,
+74,54,224,0,113,78,193,149,196,249,158,0,183,2,146,254,146,232,239,144,
+6,1,32,61,80,174,0,110,149,87,111,139,224,44,0,0,55,243,232,11,
+150,17,224,63,1,2,95,105,116,102,132,0,58,128,93,248,74,1,215,35,
+248,47,37,64,70,149,131,224,98,4,160,96,148,101,3,95,49,57,52,80,
+44,1,57,57,79,204,1,48,53,81,34,1,95,50,124,40,64,36,0,54,
+192,133,125,248,0,66,85,172,190,181,0,55,85,73,189,251,144,190,181,215,
+64,54,147,29,6,95,56,49,48,32,75,32,83,66,147,119,145,146,126,63,
+0,51,242,37,0,64,47,176,157,128,139,2,50,49,48,97,90,224,132,0,
+144,133,211,82,78,192,151,218,64,80,113,97,81,59,0,57,206,186,64,4,
+64,53,144,127,211,238,147,218,224,59,1,120,22,128,10,64,213,0,85,80,
+189,129,97,0,67,116,160,3,67,39,32,79,152,169,161,86,85,192,192,94,
+79,190,2,90,32,83,179,136,1,85,32,96,14,0,67,64,48,161,220,2,
+95,50,49,81,36,222,141,128,0,192,109,126,187,4,95,49,49,53,55,160,
+33,0,35,129,56,224,34,0,116,145,2,51,50,50,65,112,3,95,54,53,
+57,192,72,4,66,32,95,52,52,65,26,2,54,50,51,115,67,1,49,52,
+66,150,0,55,89,92,88,185,88,203,128,41,117,144,192,0,244,139,0,182,
+120,160,101,145,199,0,55,90,199,244,250,0,162,95,96,191,114,138,226,252,
+3,128,17,99,6,224,214,0,65,104,131,38,0,79,226,100,3,83,180,3,
+105,116,105,118,101,135,224,25,3,1,99,97,137,32,224,19,4,2,108,97,
+115,100,24,224,20,3,3,100,97,116,97,224,19,8,152,109,224,22,9,2,
+114,105,118,168,226,224,23,4,0,111,224,17,7,1,101,108,224,125,9,4,
+102,111,114,97,108,104,138,224,21,6,2,101,105,103,100,205,224,22,3,0,
+105,106,79,224,17,4,121,88,224,21,8,224,57,9,2,110,102,105,102,36,
+224,20,8,224,123,8,96,21,102,116,224,21,5,4,115,116,97,110,99,224,
+191,8,1,108,101,224,125,8,154,21,224,21,7,5,110,101,119,116,121,112,
+224,22,8,141,113,224,17,3,4,112,97,116,116,101,140,89,224,22,3,1,
+116,104,138,23,224,19,4,224,80,10,122,113,64,20,229,192,18,66,54,132,
+252,68,28,0,90,67,243,100,121,64,24,66,102,215,90,66,145,0,80,195,
+154,151,188,0,39,85,48,192,17,114,207,99,48,0,83,87,205,245,173,6,
+151,217,1,53,49,92,119,153,174,160,79,1,51,49,126,121,228,81,3,224,
+55,1,99,71,68,218,64,35,0,95,123,237,117,83,192,131,96,114,248,51,
+1,164,86,252,55,2,64,195,218,250,128,150,155,2,121,126,3,67,32,95,
+52,84,186,1,95,52,64,35,227,242,4,192,34,64,240,185,140,160,117,249,
+191,4,0,52,93,228,153,63,153,250,70,167,249,255,2,1,95,54,121,15,
+96,0,193,49,69,192,0,50,250,0,0,81,148,225,59,3,224,91,0,165,
+76,119,53,187,54,85,83,64,6,64,220,65,208,97,212,150,179,161,58,224,
+93,5,96,85,2,95,56,53,91,237,0,55,134,29,250,155,4,129,30,134,
+123,96,103,64,92,0,50,65,15,100,217,128,239,129,124,64,40,0,54,161,
+71,164,178,192,102,3,95,52,56,51,94,85,229,55,5,225,102,1,64,84,
+164,163,64,10,65,201,64,77,217,180,98,91,185,40,229,29,0,102,77,252,
+150,0,254,48,1,192,24,224,25,11,153,103,96,0,224,71,0,224,29,3,
+224,61,2,224,33,2,224,42,3,224,69,6,224,37,11,224,2,4,224,40,
+1,224,113,17,224,23,0,224,44,2,186,55,224,2,21,224,48,4,225,31,
+8,128,34,224,5,2,64,2,224,49,31,224,17,6,224,53,3,225,189,0,
+224,1,9,224,94,5,225,27,23,224,2,3,224,56,5,224,57,4,225,9,
+24,225,6,5,225,249,16,224,61,15,224,125,9,224,65,42,224,68,11,225,
+40,2,224,55,12,224,2,7,224,64,9,224,134,6,101,49,224,86,3,224,
+145,22,224,86,15,225,184,9,224,1,7,0,83,232,158,3,0,35,101,125,
+224,0,7,224,195,13,224,2,17,225,103,12,224,138,40,219,251,224,0,4,
+224,108,13,224,2,21,224,138,57,233,178,2,224,0,1,225,177,3,192,108,
+161,182,224,96,6,224,177,19,224,89,8,224,143,13,224,1,1,224,153,5,
+253,81,0,224,0,2,226,209,12,224,2,19,224,131,54,221,13,224,0,3,
+224,116,25,192,2,227,82,15,224,131,37,231,87,0,224,65,30,224,114,11,
+224,47,19,225,119,8,72,137,224,0,7,224,223,19,224,2,9,224,126,52,
+231,179,0,224,63,15,224,115,28,224,106,13,128,1,224,112,6,237,46,3,
+128,0,224,97,13,192,2,226,228,19,224,118,34,228,143,9,224,115,31,224,
+118,52,227,240,9,227,75,14,195,240,224,92,8,224,41,7,224,80,5,224,
+130,11,128,1,229,3,6,227,223,8,227,220,11,228,117,28,224,129,5,224,
+124,13,225,7,8,224,126,7,230,156,1,96,44,225,19,7,225,13,16,227,
+228,9,224,122,9,224,124,7,142,211,192,0,224,202,3,231,31,10,136,183,
+224,14,15,224,154,1,224,110,3,192,142,224,19,3,225,126,6,227,228,1,
+224,73,3,64,38,1,64,67,64,134,3,95,49,51,51,143,225,1,52,50,
+64,12,64,179,112,143,140,77,224,18,0,228,46,4,224,127,1,64,65,235,
+159,1,64,0,193,70,128,106,145,241,75,28,96,99,235,84,0,224,69,3,
+235,90,12,234,83,8,224,253,7,1,67,32,64,80,1,56,52,160,233,2,
+64,35,57,225,234,0,224,88,21,160,152,224,83,0,192,43,231,48,6,198,
+19,192,46,64,14,224,40,12,160,210,224,37,0,224,34,10,241,6,0,241,
+75,6,0,35,173,167,192,0,0,73,192,13,173,218,64,5,233,77,2,96,
+126,65,82,224,220,5,97,116,64,16,1,64,80,225,59,1,226,228,8,130,
+62,160,236,98,93,224,248,1,224,25,2,77,125,172,217,161,1,225,208,3,
+224,74,10,226,203,11,65,10,192,139,224,18,2,226,44,5,2,95,51,54,
+224,192,1,226,55,19,242,38,0,109,198,224,85,5,179,108,224,16,20,77,
+143,224,16,4,143,167,1,50,50,240,88,2,31,92,34,109,104,115,47,83,
+121,115,116,101,109,47,67,111,110,115,111,108,101,47,83,105,109,112,108,101,
+82,101,97,100,108,13,105,110,101,46,104,115,92,34,44,49,55,57,58,53,
+80,129,224,136,6,163,85,225,117,1,224,233,17,224,138,5,238,121,18,224,
+41,9,226,206,10,225,227,0,228,89,0,64,5,225,144,8,227,45,8,192,
+62,130,181,192,65,128,8,130,204,66,70,227,220,5,226,150,1,224,2,0,
+239,252,11,224,120,3,224,67,4,64,45,64,35,116,250,0,52,84,156,235,
+34,1,225,255,2,96,128,160,5,64,136,224,132,3,245,115,2,5,32,95,
+56,48,32,95,86,15,64,123,195,253,163,10,96,31,148,147,245,60,3,224,
+42,3,64,41,64,230,226,96,12,224,0,1,224,199,0,145,108,224,238,10,
+161,98,97,64,224,171,2,97,177,128,36,99,86,224,163,3,196,44,209,5,
+210,115,160,54,64,219,224,243,1,128,43,128,5,224,48,5,224,55,1,100,
+58,164,63,224,6,3,225,133,10,241,164,2,192,87,129,251,193,111,227,123,
+18,224,168,2,128,44,225,162,9,224,235,5,224,181,11,224,174,5,224,127,
+0,166,226,160,175,162,143,224,147,1,128,107,134,175,1,95,52,118,214,160,
+6,225,130,1,231,38,0,128,15,247,136,5,225,3,12,226,170,2,227,135,
+1,3,50,49,54,49,151,149,224,234,1,228,193,10,98,137,96,252,194,135,
+96,246,236,210,0,229,68,2,2,64,64,85,244,26,0,225,58,1,224,241,
+2,161,75,227,81,5,1,85,32,237,30,1,227,31,8,226,63,3,231,93,
+6,224,95,12,225,12,2,226,204,9,224,105,2,224,32,2,227,223,15,225,
+51,31,97,195,243,198,9,211,226,225,55,15,224,220,8,224,22,2,225,196,
+4,96,115,228,151,1,224,171,9,226,139,5,228,126,8,167,125,164,50,130,
+116,64,179,225,148,2,101,14,192,35,134,213,129,246,100,95,148,94,244,88,
+3,128,43,160,72,128,2,167,9,225,223,0,97,18,103,102,160,120,227,135,
+3,160,83,225,207,1,224,93,7,245,64,0,131,22,192,5,64,166,99,38,
+64,185,227,213,14,97,134,224,95,7,64,97,160,8,200,126,224,169,0,224,
+180,7,130,123,136,33,224,228,6,166,113,160,118,224,117,1,224,169,7,211,
+159,227,245,2,227,180,4,161,18,196,56,195,117,128,219,128,81,197,220,192,
+200,229,221,0,215,80,96,199,155,79,128,33,224,135,6,225,43,1,192,80,
+162,114,192,83,227,77,4,193,21,160,155,230,142,7,228,88,14,225,211,3,
+229,82,3,165,72,166,142,230,87,19,130,128,224,13,3,65,120,129,31,227,
+57,6,230,90,2,91,199,79,91,194,227,1,95,52,93,82,3,52,49,49,
+32,64,199,232,240,1,4,94,40,32,94,40,200,199,157,99,161,61,251,167,
+0,165,242,128,135,0,82,224,10,1,224,178,10,195,136,228,166,7,230,71,
+0,228,157,3,192,20,128,200,228,63,5,175,165,224,26,5,233,22,4,97,
+178,70,7,247,248,0,134,41,67,101,107,120,167,244,249,203,3,64,23,249,
+216,1,101,10,96,4,161,164,162,194,64,210,102,93,65,67,0,53,67,216,
+166,94,98,26,107,181,1,51,53,135,5,1,53,56,96,24,226,123,1,231,
+192,3,98,48,64,207,130,34,120,29,158,132,0,85,133,134,225,97,7,64,
+32,0,51,248,62,0,66,142,0,80,152,161,158,102,3,95,51,57,55,160,
+255,64,20,157,18,234,10,2,64,147,226,131,4,68,70,1,52,50,64,13,
+136,254,109,199,106,48,0,35,64,4,3,95,51,52,51,234,250,2,12,103,
+101,116,82,97,119,32,102,97,105,108,101,100,130,17,225,94,3,1,95,52,
+130,22,64,122,155,86,8,94,71,69,84,82,65,87,32,58,128,122,155,104,
+2,50,32,65,153,8,0,53,154,158,1,95,54,219,120,3,95,55,56,57,
+96,185,0,53,153,153,96,25,94,30,0,54,162,192,0,51,159,138,64,43,
+127,168,1,49,49,96,90,153,80,226,108,0,224,208,1,3,95,50,49,51,
+136,156,226,38,4,224,246,10,101,228,96,242,2,52,48,55,129,116,224,247,
+1,1,83,97,93,216,6,32,99,97,99,104,101,32,64,247,2,95,49,49,
+95,87,5,50,54,32,95,51,48,64,243,1,95,55,64,178,194,179,1,53,
+51,67,114,96,16,64,158,129,209,64,131,64,143,90,95,1,50,49,66,52,
+64,27,129,204,1,95,50,95,67,64,22,160,224,161,206,5,49,48,53,56,
+32,85,228,254,2,98,74,229,15,4,161,133,128,1,64,215,123,141,64,0,
+192,33,204,102,224,30,5,227,125,2,224,23,3,129,41,251,213,0,131,142,
+128,202,224,10,2,70,8,0,53,78,154,1,48,57,97,188,0,52,166,206,
+224,22,0,1,53,57,99,198,0,54,125,54,192,13,161,145,91,148,161,42,
+128,46,1,50,49,202,49,192,41,135,202,65,8,162,194,225,8,8,225,14,
+1,225,16,8,225,22,1,225,24,1,225,28,8,230,86,17,224,44,11,224,
+40,7,192,37,225,39,1,225,111,11,199,72,0,66,225,93,2,225,116,1,
+193,96,130,154,157,67,193,62,129,0,225,30,1,129,15,225,93,7,224,157,
+0,225,152,2,225,164,10,193,94,225,157,15,102,107,224,100,0,225,134,2,
+68,75,224,44,12,2,49,48,57,240,141,1,65,165,131,237,225,165,7,226,
+120,1,224,255,39,66,85,1,49,48,254,243,0,224,21,4,198,191,224,22,
+4,2,50,49,52,166,51,224,22,7,160,168,0,58,129,5,224,165,7,224,
+139,48,225,21,5,64,29,64,108,229,216,0,224,39,14,160,13,65,142,224,
+13,5,128,0,64,164,165,19,96,164,0,67,160,139,70,38,64,27,165,21,
+227,12,9,226,148,4,227,226,5,225,135,52,128,161,0,55,131,176,224,21,
+6,161,17,225,40,2,225,34,20,194,56,160,53,225,34,51,0,54,225,6,
+4,224,71,7,128,96,64,39,134,22,128,39,0,80,225,239,33,226,245,27,
+224,116,7,163,59,160,22,2,50,49,52,103,208,224,83,37,64,178,134,42,
+128,178,224,99,4,0,50,85,116,160,36,166,51,192,36,114,49,128,30,64,
+29,134,58,145,217,64,23,0,48,98,63,64,25,133,75,224,255,2,128,97,
+96,27,131,193,161,16,210,130,3,67,32,95,55,65,109,1,95,56,201,223,
+232,60,5,136,111,85,241,170,14,69,53,192,60,2,95,55,53,102,210,137,
+24,239,17,10,64,27,64,252,2,95,52,56,134,62,0,58,135,29,199,43,
+2,51,55,54,138,156,1,49,51,67,87,64,29,131,28,11,73,79,46,115,
+101,114,105,97,108,105,122,101,71,255,64,30,72,108,18,97,100,100,95,108,
+122,55,55,95,99,111,109,112,114,101,115,115,111,114,96,30,130,47,3,85,
+32,75,52,64,2,0,90,224,1,4,0,75,249,116,3,64,44,162,52,75,
+52,66,247,6,95,56,48,50,32,95,56,96,196,160,221,96,23,104,90,0,
+49,85,71,3,66,32,95,55,86,80,64,16,64,217,0,75,137,17,96,37,
+172,16,64,87,129,217,136,2,68,45,0,56,65,219,0,56,73,2,96,30,
+201,212,104,126,0,64,232,127,6,13,42,42,42,32,69,120,99,101,112,116,
+105,111,110,58,104,129,96,52,129,234,168,216,160,174,1,52,48,64,14,3,
+54,32,95,56,164,141,129,207,224,204,3,133,19,193,233,224,230,4,131,104,
+98,6,239,209,0,128,239,224,230,0,1,56,53,65,225,1,50,49,64,72,
+1,54,32,236,39,2,2,46,104,115,244,237,0,132,122,225,45,1,128,109,
+96,64,128,10,2,56,53,52,192,254,129,227,1,50,56,96,189,128,179,97,
+85,225,69,0,74,88,64,23,68,242,64,60,203,150,162,173,224,163,4,64,
+255,1,64,95,131,83,224,31,8,65,123,160,39,224,92,4,245,69,2,161,
+89,195,42,3,95,56,48,56,98,132,0,56,77,27,2,50,49,50,73,189,
+0,51,156,145,64,39,166,248,4,56,49,48,32,75,107,179,145,60,1,95,
+56,98,178,96,35,64,50,138,157,225,20,1,174,18,64,80,0,54,64,201,
+1,83,32,66,41,192,61,224,7,3,77,200,172,128,64,14,243,63,5,64,
+19,4,67,32,95,57,51,68,115,173,93,121,124,194,71,172,62,225,163,1,
+13,99,111,109,98,105,110,97,116,111,114,115,58,94,42,97,174,3,95,49,
+49,48,172,126,237,41,2,193,9,65,150,4,10,65,32,80,32,94,249,132,
+71,64,97,224,208,14,129,229,101,13,128,30,226,1,2,97,229,0,49,66,
+220,1,49,57,67,13,241,138,5,193,192,0,89,165,160,226,152,5,0,50,
+75,111,192,96,69,61,227,96,5,193,48,192,81,196,105,192,121,130,7,107,
+240,0,55,102,75,235,241,4,226,218,0,225,53,19,2,112,105,108,76,2,
+14,117,115,101,100,32,98,111,111,116,32,109,111,100,117,108,140,13,64,164,
+194,66,225,166,1,224,249,18,246,98,2,226,163,11,64,153,129,139,160,64,
+96,163,0,85,98,242,241,106,4,145,109,226,17,7,237,1,4,224,233,8,
+224,225,13,17,116,111,116,97,108,32,105,109,112,111,114,116,32,116,105,109,
+101,32,64,0,96,220,64,96,110,131,65,38,3,51,54,32,35,146,106,77,
+0,0,50,99,150,228,2,2,0,109,228,1,1,129,149,239,125,4,251,168,
+2,128,140,65,203,64,7,143,147,1,95,56,67,42,128,102,103,41,77,215,
+97,15,135,93,209,93,66,130,0,54,131,119,206,31,1,56,48,97,50,68,
+245,101,92,110,71,96,40,133,206,226,87,18,196,241,136,28,224,158,1,64,
+45,1,83,32,239,215,2,226,83,5,70,159,71,120,225,180,1,137,115,226,
+154,6,1,83,39,192,121,1,80,32,97,244,98,29,146,182,129,31,117,107,
+243,33,1,96,24,97,215,129,238,1,95,49,79,12,2,95,55,55,98,255,
+128,237,0,50,167,111,96,150,104,1,161,25,0,64,129,57,1,50,49,195,
+195,65,1,208,79,0,75,70,235,79,121,96,21,134,111,0,85,231,3,2,
+64,21,134,80,128,138,229,188,13,162,96,0,55,106,241,0,56,97,102,66,
+84,4,52,56,32,95,57,97,167,65,39,1,55,57,72,219,0,55,66,29,
+64,140,162,195,193,231,65,58,72,195,226,132,8,17,67,97,110,110,111,116,
+32,102,105,110,100,32,112,97,99,107,97,103,227,95,7,163,5,225,141,7,
+230,155,0,200,73,1,95,57,99,67,128,212,133,203,230,167,2,3,112,107,
+103,34,132,201,165,190,226,70,0,102,29,1,95,57,65,7,0,58,130,27,
+143,156,1,49,52,72,72,68,131,169,64,226,73,3,0,55,171,110,187,79,
+226,221,2,128,11,2,95,56,48,98,192,128,13,246,40,0,161,101,228,167,
+29,96,97,231,175,9,155,218,225,14,10,0,56,78,28,225,96,8,0,91,
+64,10,129,82,227,213,3,0,52,68,148,224,16,0,195,81,65,113,4,79,
+32,79,32,35,75,71,66,187,132,180,4,79,32,35,57,51,251,36,1,96,
+107,225,204,11,132,75,69,51,229,34,7,226,94,20,4,32,95,56,56,56,
+232,85,3,200,84,247,32,1,230,89,8,1,95,57,65,183,216,42,99,199,
+96,82,227,174,4,224,98,0,242,38,10,225,102,5,166,213,229,84,27,213,
+5,229,84,13,0,32,149,53,225,89,1,242,53,7,65,76,75,149,193,76,
+96,71,224,12,0,230,0,4,64,129,72,11,230,226,2,205,214,224,231,182,
+246,217,1,234,113,9,105,125,1,95,57,218,42,135,72,84,202,199,72,160,
+79,2,50,49,49,204,101,225,254,12,227,89,26,227,49,13,226,197,1,115,
+252,0,100,226,204,7,234,73,4,134,57,0,67,102,203,0,57,73,56,1,
+64,95,133,188,69,13,3,51,50,52,32,135,132,64,0,68,77,233,70,0,
+232,174,41,224,172,23,104,161,224,170,5,227,117,37,3,46,104,115,45,64,
+68,131,123,97,161,229,185,19,233,17,3,101,194,3,111,117,110,100,172,168,
+229,188,2,202,206,225,239,22,2,50,49,49,175,79,225,240,2,0,48,171,
+81,129,59,0,54,165,137,0,83,171,153,1,49,49,72,1,203,153,65,65,
+135,22,133,187,128,51,136,10,103,8,64,37,64,18,205,148,192,1,229,212,
+2,1,57,49,69,24,240,120,0,128,31,224,184,3,225,73,0,230,125,0,
+0,57,109,255,96,0,224,40,2,227,169,1,157,140,189,146,225,241,30,98,
+229,234,160,7,225,125,6,6,112,97,114,115,105,110,103,161,111,192,0,168,
+202,97,246,148,221,224,148,1,104,96,250,230,5,224,143,7,204,87,128,18,
+1,95,57,111,170,235,41,24,64,138,1,101,100,236,90,2,112,161,211,132,
+224,152,6,192,2,128,157,233,123,7,96,13,224,161,0,251,142,1,233,138,
+8,162,217,225,61,2,228,251,1,217,164,1,49,48,80,193,2,95,56,54,
+98,138,3,95,49,56,52,64,62,239,7,1,98,214,128,10,224,208,5,194,
+212,7,97,109,101,32,100,111,101,115,98,222,12,97,103,114,101,101,32,119,
+105,116,104,32,102,105,160,29,193,125,161,203,133,8,130,250,160,14,0,79,
+158,243,154,4,231,14,1,225,20,14,221,38,224,25,10,193,211,226,173,17,
+64,0,225,237,4,224,2,3,230,59,4,228,15,6,65,175,1,55,54,67,
+132,1,49,48,151,167,97,60,81,201,227,164,1,71,255,172,209,224,0,2,
+227,69,1,224,1,1,157,255,224,31,17,106,252,224,31,18,64,1,224,229,
+21,224,56,18,233,46,8,1,49,48,89,87,224,0,5,130,60,226,140,9,
+224,70,2,184,75,224,88,3,224,41,3,224,128,9,224,29,5,225,193,14,
+225,202,1,225,3,22,226,203,0,229,41,9,129,155,0,51,95,103,0,75,
+231,79,1,224,0,0,226,1,16,226,10,4,227,248,22,1,49,48,90,191,
+227,249,25,9,116,121,112,101,32,99,104,101,99,107,227,255,1,232,17,2,
+1,48,53,119,70,113,223,224,52,1,0,45,64,0,160,44,224,187,8,225,
+54,20,225,94,2,226,57,49,224,97,20,64,2,235,210,0,229,237,4,242,
+59,2,245,224,36,224,0,4,224,180,15,64,1,227,54,3,224,43,23,224,
+228,24,224,230,19,225,69,1,224,88,9,225,1,3,187,104,224,80,10,248,
+121,4,224,83,3,224,74,9,224,2,4,224,80,4,224,31,10,224,94,3,
+224,79,8,192,85,226,4,2,224,30,9,128,118,224,103,3,224,102,16,224,
+36,0,229,51,17,128,41,128,103,109,190,224,8,12,231,219,14,227,82,8,
+0,57,208,232,227,82,20,6,100,101,115,117,103,97,114,231,79,3,131,70,
+243,176,0,224,0,4,196,40,232,112,13,224,5,9,225,0,1,228,5,6,
+64,0,102,198,225,1,4,234,144,17,64,0,225,117,1,138,156,224,19,6,
+234,168,15,2,100,111,110,175,227,224,116,9,231,68,5,224,79,2,224,77,
+6,0,44,224,64,0,128,30,236,135,6,178,164,192,29,231,223,7,0,115,
+172,189,64,31,231,187,4,224,60,4,224,57,10,1,32,43,160,119,224,53,
+16,224,50,16,224,161,12,237,35,6,224,0,6,128,100,227,19,0,96,203,
+254,95,0,224,8,27,225,225,5,234,22,1,96,26,233,59,17,2,95,55,
+54,133,254,64,179,96,17,82,113,233,62,1,3,95,56,52,53,224,225,2,
+10,73,110,116,101,114,97,99,116,105,118,101,225,85,0,1,95,52,71,118,
+226,50,8,96,120,140,127,128,131,67,3,225,104,11,3,108,111,97,100,205,
+121,233,94,18,225,102,2,174,143,160,38,225,88,16,228,100,3,225,44,6,
+235,51,0,128,14,225,61,6,1,64,67,196,15,138,152,228,25,0,199,152,
+224,13,0,0,49,179,156,227,108,0,129,75,112,199,242,115,3,83,186,1,
+50,53,64,97,160,165,250,67,8,224,137,1,240,23,6,192,194,64,27,224,
+94,3,72,19,115,238,128,37,64,153,142,138,151,242,174,151,192,0,160,187,
+192,20,224,46,4,64,0,65,245,0,55,65,245,192,17,224,16,7,224,32,
+8,0,83,96,253,0,57,64,152,0,89,244,255,0,212,252,193,15,180,188,
+64,192,79,53,1,49,49,138,116,64,0,214,0,96,10,0,51,169,185,2,
+85,32,75,201,194,224,247,4,229,199,2,224,23,2,196,231,160,120,112,54,
+161,109,1,49,51,144,243,121,121,110,15,160,0,224,171,11,249,142,1,170,
+178,224,10,4,224,201,4,65,121,192,0,224,248,11,202,111,161,4,7,32,
+67,32,61,61,32,64,35,228,101,1,143,33,245,214,5,225,203,4,193,2,
+64,204,172,205,1,57,52,137,92,175,60,161,33,78,224,222,42,0,57,85,
+160,0,53,67,229,0,53,66,102,1,49,57,97,103,1,95,50,97,160,64,
+51,160,14,1,49,49,148,249,150,8,72,91,0,53,79,36,2,95,54,48,
+64,97,128,53,155,134,224,186,0,128,58,1,53,49,64,91,0,49,73,0,
+128,37,227,142,1,2,101,111,102,131,187,64,197,6,95,51,54,51,32,95,
+53,64,118,247,207,2,64,118,224,111,4,2,49,57,57,114,132,99,76,119,
+107,192,53,96,247,124,124,228,119,3,3,77,97,105,110,96,100,0,79,64,
+128,0,55,124,254,224,31,3,0,109,192,31,164,6,64,115,219,187,96,184,
+128,116,0,53,237,250,9,135,120,224,152,2,75,111,170,17,96,18,64,158,
+225,89,9,129,113,1,49,57,92,230,5,49,57,53,53,32,35,92,152,96,
+63,74,42,96,37,3,95,49,57,56,80,163,160,31,182,186,160,13,135,67,
+224,250,5,3,67,39,32,79,128,47,0,56,196,207,131,183,224,194,15,3,
+119,104,101,114,229,136,1,138,44,225,96,10,194,208,224,107,3,193,104,225,
+163,0,64,21,82,175,81,115,64,239,1,64,67,224,9,30,224,49,21,224,
+79,33,0,67,160,9,2,95,50,48,78,161,67,195,160,172,110,182,0,53,
+114,1,78,156,3,95,49,54,54,67,3,225,126,1,233,85,4,2,97,116,
+97,129,212,2,50,48,56,99,119,3,95,50,48,57,193,124,224,82,1,224,
+92,10,1,49,55,193,175,224,86,9,5,110,101,119,116,121,112,162,46,2,
+50,48,55,195,163,226,0,1,105,22,224,87,13,0,54,65,119,0,49,77,
+28,128,5,96,65,96,7,4,49,57,54,53,32,64,169,66,47,0,54,100,
+23,1,50,55,65,196,96,28,244,93,5,129,172,69,44,0,48,94,146,65,
+13,193,191,224,227,14,224,217,3,162,62,224,217,9,224,214,28,1,50,48,
+99,11,96,28,224,85,1,0,57,123,141,224,85,12,138,3,160,87,1,49,
+48,199,88,104,101,226,239,2,224,13,2,176,158,224,176,0,69,180,67,136,
+96,94,224,9,2,64,39,192,113,224,119,9,5,102,111,114,101,105,103,132,
+12,224,147,18,103,227,194,112,224,38,6,4,99,99,97,108,108,128,37,224,
+26,8,2,97,112,105,224,63,0,67,100,105,228,224,35,5,4,117,110,115,
+97,102,195,149,224,37,1,1,50,48,133,206,99,155,64,219,224,191,0,78,
+65,225,96,4,226,164,11,225,212,13,132,101,225,6,10,3,99,108,97,115,
+153,89,65,213,102,255,193,222,228,205,12,225,239,1,190,158,1,53,50,230,
+17,0,97,122,225,166,12,71,13,97,69,151,179,96,214,225,159,1,1,50,
+48,108,199,224,32,8,224,123,4,96,124,229,30,2,228,162,1,163,42,96,
+184,1,52,51,100,204,162,238,225,13,14,67,81,225,13,13,6,105,110,115,
+116,97,110,99,226,230,0,129,106,224,87,1,216,127,226,143,19,104,248,226,
+123,3,228,116,4,4,101,102,97,117,108,162,90,225,243,1,229,142,0,131,
+238,205,135,230,87,0,3,49,57,54,52,225,138,5,128,131,75,127,1,51,
+53,103,13,125,101,224,104,1,1,40,41,194,152,0,49,192,71,161,18,0,
+57,65,56,2,54,48,49,192,74,160,230,225,94,5,225,60,15,0,50,110,
+114,224,219,13,228,31,4,97,129,224,39,0,98,185,1,49,57,110,238,96,
+23,192,80,0,85,97,86,98,72,224,83,12,5,112,97,116,116,101,114,163,
+165,0,50,74,173,225,216,18,0,54,93,168,231,113,7,224,77,16,226,184,
+2,161,118,226,97,6,128,182,228,211,3,227,103,23,0,56,141,203,225,248,
+13,4,114,105,118,105,110,94,112,227,89,13,227,173,3,129,45,224,69,10,
+1,118,105,230,178,0,105,110,101,206,130,148,227,16,2,141,90,224,65,13,
+226,225,13,130,100,66,98,129,229,82,179,82,187,0,54,89,108,96,78,195,
+100,98,140,129,96,224,5,3,226,8,14,224,24,6,1,114,111,169,71,226,
+34,1,231,216,12,224,54,6,5,110,111,109,105,110,97,229,105,14,6,112,
+104,97,110,116,111,109,165,70,224,113,8,11,101,112,114,101,115,101,110,116,
+97,116,105,111,224,67,0,228,90,6,72,212,159,210,227,136,4,104,148,0,
+73,99,141,108,70,67,113,225,184,8,233,121,11,199,12,233,107,7,2,50,
+48,50,108,200,64,21,227,226,27,66,240,140,249,233,150,11,143,1,76,68,
+0,32,140,110,96,34,0,49,98,14,140,138,0,79,160,89,0,50,91,38,
+142,101,108,31,0,50,104,188,0,52,165,53,239,15,2,224,202,8,1,55,
+50,225,75,2,1,60,45,161,61,224,213,15,175,147,235,16,3,100,223,224,
+213,5,229,26,15,234,163,2,128,56,99,152,236,253,1,225,3,13,238,243,
+5,111,78,73,11,0,50,67,206,207,82,96,0,65,228,157,105,80,39,0,
+48,64,69,163,245,1,50,48,68,55,0,64,109,199,137,85,186,17,64,50,
+0,54,188,44,0,83,65,105,83,222,2,67,32,60,187,142,224,18,6,65,
+77,224,18,6,136,187,237,35,2,140,183,126,198,1,85,32,237,63,6,131,
+101,160,27,2,95,54,56,73,238,193,255,128,235,238,39,6,224,44,17,224,
+42,4,133,92,160,42,0,75,88,254,77,101,128,39,224,174,5,126,2,237,
+210,4,224,58,3,161,221,146,13,160,108,224,116,2,109,212,224,90,0,65,
+58,157,103,129,182,2,80,32,35,157,146,225,170,4,64,37,253,122,1,2,
+80,32,35,97,235,0,80,110,122,70,103,67,145,229,42,19,139,228,0,48,
+125,110,65,211,160,234,230,26,22,229,248,3,2,49,57,57,119,157,229,248,
+2,229,247,8,64,140,175,7,224,140,9,0,50,87,230,233,118,16,132,204,
+230,143,16,232,13,3,160,138,224,126,13,143,22,97,174,232,123,5,164,150,
+232,140,5,224,139,9,112,78,75,134,97,41,225,82,10,229,250,0,159,95,
+70,86,239,54,3,5,83,79,85,82,67,69,165,128,233,121,3,1,57,51,
+166,63,130,74,101,38,165,197,233,37,6,234,12,5,64,121,170,4,224,177,
+13,179,26,192,38,99,233,64,21,160,91,224,132,4,98,160,229,212,7,235,
+121,7,225,125,9,0,97,170,247,1,49,57,165,173,82,169,96,47,233,223,
+17,138,200,230,168,1,225,55,1,66,249,224,97,7,2,104,105,100,199,242,
+224,178,13,169,141,240,12,4,0,50,120,21,226,146,4,128,42,224,107,21,
+8,113,117,97,108,105,102,105,101,100,161,165,230,224,7,144,229,239,91,32,
+225,146,10,225,224,1,92,170,250,19,0,114,233,217,100,96,65,229,67,2,
+70,143,169,59,2,50,48,57,67,222,178,180,0,50,91,42,96,31,104,7,
+225,8,0,180,54,234,124,13,96,51,224,50,0,225,79,3,166,203,224,45,
+6,137,71,78,209,224,26,14,226,21,10,234,35,4,160,106,224,144,24,224,
+71,10,233,4,3,128,129,224,176,10,225,165,6,97,249,5,10,65,32,90,
+32,90,115,255,64,17,136,152,67,38,212,123,64,7,133,61,96,126,96,47,
+96,21,192,50,0,54,198,230,2,49,56,56,80,35,64,171,66,220,1,53,
+51,128,166,64,108,100,17,135,178,230,157,11,128,31,0,90,161,203,140,98,
+96,0,64,95,133,216,2,95,53,49,71,233,229,12,5,77,184,64,34,197,
+213,225,27,13,235,12,4,108,237,233,87,9,228,61,15,1,95,51,116,228,
+1,55,56,96,146,235,55,47,229,177,16,64,16,235,83,1,225,234,2,1,
+54,56,107,17,241,105,5,164,104,239,41,12,237,102,27,228,239,3,149,232,
+241,247,1,160,168,65,77,135,10,227,177,23,235,190,2,193,9,225,3,3,
+4,115,116,111,99,107,235,38,0,224,44,3,164,110,235,114,4,242,197,2,
+224,47,7,105,152,229,75,7,1,110,121,240,73,1,226,235,6,1,50,48,
+121,220,226,235,8,135,83,2,75,52,32,64,12,134,225,1,75,51,87,36,
+64,15,132,174,1,75,50,118,228,0,58,128,164,64,16,64,34,96,15,235,
+176,13,135,34,66,217,193,33,66,94,96,16,230,151,5,193,119,67,73,226,
+51,1,242,198,0,238,28,5,115,67,240,245,3,96,226,1,50,48,84,5,
+102,31,224,237,1,134,184,240,146,1,226,211,4,64,183,131,177,0,85,250,
+78,3,236,56,0,235,14,17,245,175,7,0,48,72,90,167,61,224,124,2,
+172,171,0,80,114,252,66,178,96,165,249,188,1,0,39,73,101,130,204,64,
+129,4,95,49,52,50,48,130,123,2,49,54,55,123,33,82,123,236,17,1,
+64,176,0,54,162,124,0,66,71,23,64,112,248,187,0,224,2,1,70,16,
+128,169,224,1,1,134,46,7,95,49,53,52,55,32,95,56,254,81,1,224,
+36,4,64,1,68,182,128,0,224,82,3,224,2,7,224,36,0,166,121,254,
+218,22,192,152,219,191,234,119,0,128,195,128,29,232,126,0,147,102,235,250,
+2,220,95,245,100,2,117,67,245,73,2,217,195,224,2,0,224,104,2,161,
+1,128,16,96,74,254,205,1,128,149,128,39,64,33,3,95,49,55,49,71,
+253,0,53,83,164,97,102,101,204,160,9,236,34,9,0,51,143,178,165,192,
+0,83,64,79,157,89,94,68,68,65,224,32,0,238,14,0,64,66,137,78,
+109,251,224,0,5,224,175,1,129,200,224,79,0,98,31,124,31,119,30,174,
+64,252,44,3,225,255,1,226,5,3,225,182,9,251,152,0,67,121,86,227,
+128,38,193,22,3,83,32,95,52,66,119,154,8,64,172,65,74,193,129,1,
+52,52,92,128,97,150,128,14,98,213,253,50,4,224,153,7,96,56,0,52,
+104,96,64,114,99,8,96,59,65,201,64,6,170,48,224,172,6,226,212,1,
+224,72,1,224,204,4,224,25,1,206,236,96,21,254,55,0,224,224,31,219,
+221,224,207,0,251,233,3,224,219,5,224,134,1,158,196,4,64,95,53,54,
+57,129,33,130,38,66,82,65,215,0,53,181,127,96,9,128,18,0,54,129,
+204,0,56,70,108,2,95,56,55,70,138,0,50,107,78,0,79,68,199,227,
+232,0,96,149,226,26,5,161,60,160,140,64,154,100,40,128,36,93,157,234,
+150,0,98,197,64,100,96,180,99,229,224,106,4,193,25,255,154,6,15,66,
+97,100,32,71,65,68,84,32,114,101,115,117,108,116,32,230,108,2,160,47,
+0,49,69,162,3,50,48,56,51,98,187,2,95,49,50,128,197,116,1,0,
+95,64,189,64,28,224,134,2,161,156,130,232,128,0,68,189,168,171,0,49,
+92,145,0,50,78,46,160,53,133,128,96,149,0,79,155,147,129,12,162,117,
+97,107,128,131,128,114,101,80,224,194,4,1,58,58,96,176,225,153,0,128,
+45,128,167,65,97,91,185,229,73,0,65,14,224,123,0,64,151,201,32,0,
+89,103,195,132,18,96,245,0,57,73,118,163,220,161,10,0,52,68,132,239,
+90,0,222,54,228,234,1,0,95,65,184,100,172,0,50,74,4,223,25,160,
+61,4,54,32,95,51,48,128,229,0,52,224,145,1,224,69,2,224,63,8,
+126,168,195,70,224,62,12,224,44,3,222,143,128,0,1,95,49,127,79,96,
+239,128,233,175,199,246,226,6,230,250,6,110,242,242,85,5,119,196,96,130,
+224,58,3,238,52,0,224,23,3,234,137,9,143,116,1,50,48,105,170,242,
+199,6,1,45,62,200,165,192,73,224,99,5,133,62,224,27,1,242,116,7,
+224,25,1,196,221,224,11,0,192,8,255,253,3,65,3,240,62,16,246,80,
+12,224,9,11,234,39,0,225,183,2,132,121,196,112,96,168,0,52,164,244,
+0,66,83,252,0,67,64,4,161,177,193,80,193,67,161,27,96,7,132,117,
+160,15,224,135,30,160,117,224,86,11,170,191,70,206,96,252,137,218,0,83,
+234,169,2,224,68,0,0,52,76,171,233,126,4,194,62,145,52,224,40,0,
+2,55,51,57,115,47,67,47,64,232,0,80,130,163,161,3,96,250,133,61,
+227,255,3,235,126,4,224,195,10,137,250,242,18,38,206,214,235,197,4,160,
+186,198,128,64,141,224,227,2,97,146,141,47,96,65,140,185,235,14,6,65,
+46,100,169,224,167,13,2,50,48,55,64,108,172,23,0,58,128,69,224,47,
+29,0,52,128,47,171,48,226,131,9,1,50,48,69,182,172,177,162,14,64,
+48,138,169,190,121,1,49,57,64,79,64,12,0,57,128,78,0,54,227,214,
+9,189,125,192,18,1,64,80,64,78,112,171,172,205,227,75,8,97,171,64,
+77,206,82,242,153,19,208,245,2,53,32,35,105,176,241,81,10,64,74,133,
+89,237,146,12,226,83,4,237,113,10,101,162,83,235,64,12,208,167,108,37,
+224,106,4,96,47,64,106,237,151,7,65,247,225,142,16,101,190,226,6,2,
+190,234,227,102,21,130,224,114,117,227,211,8,192,67,161,155,224,15,1,226,
+89,6,77,23,225,249,26,160,69,64,48,131,177,224,48,12,65,254,64,48,
+162,132,162,180,1,53,57,227,63,0,229,103,1,4,85,73,100,101,110,116,
+220,246,233,11,138,165,99,211,173,158,171,144,138,209,1,54,50,64,104,0,
+52,84,94,234,208,10,136,211,88,188,1,50,32,192,30,130,73,64,159,245,
+169,41,0,50,65,35,64,33,136,93,239,245,1,1,48,52,64,41,2,50,
+48,52,238,31,5,160,107,163,82,131,33,153,7,64,6,0,49,97,27,64,
+75,239,181,6,229,1,10,246,194,11,229,112,15,246,195,50,224,83,14,123,
+232,229,27,15,240,101,22,156,28,64,118,233,21,3,4,105,110,102,105,120,
+219,102,224,45,3,0,57,131,107,224,45,10,0,114,240,101,10,1,49,54,
+73,62,224,46,12,128,45,225,219,4,241,129,12,226,147,12,3,100,105,103,
+105,226,146,11,97,126,194,146,0,75,109,153,112,74,184,238,81,245,66,242,
+241,255,13,65,28,160,32,224,33,8,168,50,160,91,194,190,224,36,0,160,
+0,228,94,4,224,64,12,240,147,8,89,94,225,243,4,227,247,8,66,238,
+249,90,1,197,111,64,24,165,109,155,5,226,62,0,130,196,100,254,0,54,
+238,82,5,131,103,138,129,64,63,133,98,240,6,0,229,241,1,130,195,101,
+9,236,227,1,65,76,236,249,1,239,46,0,233,48,1,168,210,102,12,237,
+137,1,192,30,228,26,0,192,14,112,47,160,74,96,56,224,16,0,149,27,
+224,67,2,182,157,233,53,4,253,42,0,230,136,3,165,101,233,49,3,107,
+70,203,75,224,8,0,224,91,0,111,237,160,159,225,2,5,160,21,0,66,
+133,234,226,168,6,224,29,2,232,246,3,245,96,0,224,169,2,0,39,131,
+160,64,120,140,149,232,235,2,100,47,247,106,5,137,14,240,178,3,240,173,
+3,160,115,224,243,3,206,160,198,93,167,14,238,126,9,65,242,166,234,225,
+71,2,224,242,2,64,166,139,173,236,182,0,232,24,3,229,60,9,64,230,
+241,52,2,160,50,255,15,1,224,18,0,255,21,10,121,128,64,132,192,221,
+224,218,22,94,255,195,105,64,201,135,13,99,253,152,178,128,138,241,145,0,
+180,37,142,82,81,15,224,17,0,129,133,229,45,1,229,46,5,231,220,4,
+100,11,224,50,11,234,26,3,241,226,2,154,87,175,226,133,192,144,69,224,
+83,9,225,13,5,247,38,7,232,66,40,128,218,192,8,65,32,252,108,0,
+229,253,0,224,9,49,235,245,2,226,16,0,132,112,247,245,18,192,185,103,
+152,128,49,245,159,2,96,24,193,13,225,247,5,240,196,2,233,138,13,0,
+83,98,18,160,38,64,34,0,54,67,120,224,54,0,73,3,201,166,188,57,
+1,50,48,195,154,69,27,135,83,231,63,3,128,95,253,226,5,69,146,102,
+11,247,254,5,104,30,236,56,11,70,234,161,245,224,89,0,3,54,32,95,
+57,79,58,0,95,154,60,224,98,10,215,84,230,20,3,224,98,16,88,66,
+160,98,232,255,13,64,106,224,192,9,2,50,48,53,193,24,224,126,1,1,
+50,48,95,155,160,109,224,195,19,3,49,50,56,48,198,54,224,92,4,114,
+124,227,38,3,224,52,9,107,206,224,52,4,233,34,0,224,51,10,1,54,
+53,152,240,225,134,13,225,35,16,161,218,224,194,5,231,70,8,205,152,224,
+93,8,174,171,225,229,2,227,2,2,230,19,3,226,140,13,204,126,159,247,
+227,233,1,1,49,57,125,40,227,33,30,0,53,97,140,248,193,9,193,186,
+227,33,6,2,50,48,53,253,42,0,249,211,2,161,63,241,39,4,1,46,
+46,233,106,11,193,44,226,94,4,241,237,0,65,81,121,166,0,65,104,105,
+64,86,252,159,8,64,128,136,126,1,53,53,89,251,64,167,128,15,237,128,
+4,84,99,64,29,238,26,17,160,243,1,55,50,114,157,0,53,164,212,227,
+158,4,0,49,102,209,0,48,148,138,160,8,64,84,136,193,228,207,33,228,
+197,0,2,50,48,51,161,71,0,52,131,25,1,50,48,189,202,1,50,48,
+117,201,96,101,129,41,1,50,48,105,67,226,79,6,64,130,239,57,4,224,
+217,10,226,34,1,74,47,64,72,131,67,225,177,0,106,78,64,47,253,86,
+4,0,111,245,66,0,250,48,9,0,50,180,197,117,172,231,104,0,231,98,
+13,82,72,96,186,118,181,167,98,231,96,4,67,114,130,1,64,209,206,96,
+235,113,11,4,81,117,97,108,68,96,152,238,5,19,96,151,105,202,237,237,
+3,254,241,3,64,7,97,135,254,145,1,224,249,8,238,10,0,168,59,201,
+58,183,2,2,52,49,53,98,41,250,226,4,192,195,230,245,7,139,252,192,
+240,227,193,15,181,249,254,115,11,1,105,102,128,147,195,136,131,185,64,41,
+224,9,3,64,8,102,104,228,145,3,224,74,7,3,116,104,101,110,163,139,
+192,77,224,76,49,2,101,108,115,183,106,224,154,1,227,51,4,110,242,224,
+237,13,81,20,224,237,21,194,110,0,52,101,19,245,119,15,226,75,2,253,
+42,13,65,145,133,119,108,188,162,37,64,22,64,157,101,142,224,160,13,163,
+22,224,160,9,1,108,101,109,247,224,161,1,79,189,161,30,224,206,10,129,
+111,193,33,64,119,207,236,224,119,13,226,6,16,1,99,97,161,110,231,76,
+3,224,39,10,0,111,225,64,7,102,20,64,120,165,46,227,209,2,65,216,
+185,248,229,247,2,98,238,254,239,1,234,201,0,140,178,226,204,2,234,149,
+0,230,70,2,117,137,138,235,135,220,135,102,160,96,231,242,0,226,202,3,
+224,61,1,1,50,48,71,104,224,255,23,224,217,5,255,27,10,67,152,225,
+98,14,147,67,136,112,140,80,128,146,96,54,134,33,231,113,4,64,36,147,
+144,236,135,3,116,223,129,247,228,209,10,98,221,128,81,166,30,231,128,12,
+225,117,3,255,176,14,128,234,244,53,14,0,52,244,53,0,225,168,7,109,
+190,97,127,96,173,104,142,236,47,4,0,39,75,185,91,12,96,75,100,195,
+99,243,67,252,227,204,2,227,72,6,65,8,99,72,225,88,15,226,68,3,
+1,49,50,97,62,233,50,6,177,232,231,247,1,224,120,10,64,105,165,68,
+110,76,5,52,57,52,32,64,89,247,171,0,221,214,221,82,183,175,64,41,
+0,50,77,159,239,122,3,161,133,169,120,225,193,2,0,51,157,200,231,58,
+1,249,248,8,128,35,225,223,11,1,53,54,91,69,130,67,96,95,71,200,
+224,95,7,154,153,224,95,20,133,85,96,95,224,39,18,201,196,238,157,12,
+198,203,0,83,155,247,135,102,65,9,212,66,0,51,96,164,145,52,160,184,
+108,169,193,26,64,227,232,191,14,0,83,237,163,40,232,231,12,234,165,3,
+75,173,1,95,49,140,136,224,25,12,141,52,64,184,237,33,53,66,71,226,
+103,5,192,13,236,93,10,141,30,237,23,15,1,50,48,112,193,192,19,236,
+254,20,2,50,48,51,229,190,4,236,254,3,97,136,252,78,0,76,149,224,
+146,9,224,82,13,237,81,15,86,210,224,82,2,64,97,224,82,7,227,244,
+3,194,13,135,230,70,133,229,246,6,96,87,229,185,1,194,120,225,57,18,
+67,218,1,50,56,64,181,161,35,163,244,228,214,12,8,95,112,114,105,109,
+105,116,105,118,230,197,0,170,19,226,9,4,0,56,73,63,224,150,4,207,
+167,121,248,228,147,8,67,104,234,50,16,5,115,116,114,105,110,103,234,50,
+10,97,217,245,165,1,169,225,163,18,0,54,232,46,2,66,133,136,46,65,
+59,247,163,3,65,193,68,186,1,56,52,211,55,2,95,56,52,138,22,204,
+64,96,54,223,159,128,79,96,102,149,60,65,215,236,143,13,172,185,226,14,
+11,138,127,135,184,235,198,2,255,84,2,193,174,235,84,0,64,168,224,129,
+2,97,198,160,129,185,158,228,183,2,67,56,230,80,10,224,16,33,242,228,
+0,226,92,7,171,139,224,108,7,104,84,107,36,181,170,64,167,224,85,0,
+224,23,40,244,87,4,232,88,1,197,60,164,122,179,212,166,57,160,6,226,
+250,4,224,184,6,231,19,1,233,4,0,224,91,1,66,155,166,215,96,53,
+238,251,11,224,64,10,193,187,128,64,239,54,18,230,131,10,224,204,2,243,
+139,9,233,16,7,239,235,10,1,50,50,233,102,4,231,174,35,233,178,9,
+0,50,128,187,224,252,31,224,249,2,64,60,133,212,224,248,16,224,246,3,
+192,243,224,235,3,233,251,8,68,137,195,190,66,18,131,189,64,102,227,4,
+1,101,196,131,3,64,188,237,174,5,230,186,2,235,161,11,0,54,173,23,
+133,116,219,169,133,41,241,42,2,244,51,18,0,55,74,111,130,160,0,54,
+185,197,108,110,229,56,15,236,112,15,237,166,5,224,55,9,236,122,6,97,
+45,224,200,4,176,17,99,3,229,86,6,65,249,241,44,15,225,171,4,1,
+60,45,192,155,145,61,1,56,53,64,86,97,156,64,70,0,54,128,70,3,
+50,48,50,52,81,161,65,46,241,161,3,124,136,1,50,48,67,116,64,29,
+255,113,18,226,93,0,241,161,23,66,217,130,89,0,50,128,84,241,37,7,
+140,145,233,156,23,140,181,132,102,248,79,3,129,183,248,76,10,153,189,0,
+49,124,109,144,237,64,131,171,122,234,66,21,96,166,133,165,0,85,233,204,
+1,2,67,32,60,166,169,0,83,224,18,5,96,225,230,206,4,96,17,181,
+31,102,207,192,121,224,39,6,145,251,160,38,0,90,224,38,3,81,47,219,
+162,64,141,166,25,251,203,0,0,56,81,81,224,75,4,132,72,117,93,64,
+114,1,85,32,224,165,6,122,87,253,25,8,224,48,1,160,135,224,162,13,
+224,37,10,225,40,0,171,204,226,153,12,132,213,233,200,8,133,229,0,57,
+148,207,224,19,2,64,79,66,130,228,25,1,97,227,132,25,69,146,160,24,
+96,26,129,171,64,12,70,118,89,6,64,36,131,39,96,32,66,128,164,110,
+64,10,218,229,238,76,2,99,194,236,25,6,99,193,226,237,13,95,121,255,
+119,1,226,69,8,3,83,32,95,51,73,198,2,95,49,52,161,198,64,121,
+163,97,226,238,2,1,48,49,224,113,5,2,50,48,49,65,139,224,79,8,
+236,70,6,66,203,0,57,225,128,0,140,66,64,96,163,164,245,100,0,133,
+1,72,217,64,29,163,109,3,50,48,49,49,67,240,64,22,224,142,6,73,
+199,227,125,23,137,235,227,55,23,64,95,250,99,29,236,141,117,161,231,231,
+70,2,192,13,194,219,235,83,5,140,144,96,8,179,140,151,223,210,223,236,
+170,17,98,42,192,19,140,170,229,217,7,65,90,95,115,97,51,132,181,102,
+149,0,52,83,15,190,157,3,95,57,56,53,97,206,64,228,235,93,16,6,
+108,105,116,101,114,97,108,139,94,227,253,11,224,18,5,200,172,228,65,5,
+245,183,1,101,87,64,126,143,245,76,87,97,103,198,187,224,35,19,184,137,
+71,188,229,41,4,224,90,19,1,49,50,129,249,228,128,11,224,149,22,2,
+49,50,55,192,113,97,83,66,30,228,5,0,228,4,0,64,149,192,21,65,
+15,160,21,0,54,226,177,8,248,19,2,75,248,247,158,3,76,82,225,113,
+1,180,248,210,178,224,41,18,0,61,224,41,1,97,102,226,4,6,67,180,
+231,222,28,192,71,231,222,0,123,32,199,222,64,91,224,70,28,192,184,232,
+37,2,172,174,96,70,237,9,16,1,49,57,72,235,229,210,18,92,110,226,
+240,0,197,210,65,68,225,98,5,238,242,9,232,99,12,233,61,3,4,102,
+111,114,97,108,98,220,224,182,2,0,55,64,241,170,121,244,226,2,0,48,
+100,174,232,159,1,248,23,1,228,190,2,163,191,225,138,8,167,106,224,144,
+10,196,19,68,1,0,52,139,177,68,154,2,95,49,49,153,50,70,34,189,
+57,64,101,234,174,12,160,55,224,40,0,230,89,2,2,49,57,57,146,9,
+64,133,167,85,100,66,0,58,128,25,225,217,28,1,58,58,225,34,7,78,
+154,129,217,128,103,99,2,249,4,5,235,19,4,0,83,97,159,174,60,67,
+187,174,75,239,178,7,129,241,232,227,1,136,36,198,154,100,184,2,95,49,
+52,233,141,0,0,66,70,95,230,89,6,235,153,5,224,134,2,71,205,128,
+176,170,247,229,210,4,162,107,69,80,64,34,0,54,225,26,17,64,34,193,
+141,0,57,66,226,96,48,240,57,4,2,49,57,55,165,230,155,25,2,49,
+57,54,64,139,64,39,195,77,229,108,11,4,76,73,100,101,110,108,7,250,
+253,19,225,72,1,0,67,65,72,79,25,97,83,1,95,49,80,109,3,66,
+32,95,54,121,147,0,52,114,58,251,156,0,2,49,57,55,135,94,251,49,
+2,164,245,144,112,129,95,251,20,0,128,173,131,180,96,41,0,57,126,177,
+133,122,163,104,133,47,231,7,2,239,93,4,255,50,1,250,106,13,237,214,
+7,151,6,102,182,66,28,72,163,227,216,1,163,214,72,135,0,53,171,9,
+145,206,64,29,67,127,160,23,160,191,64,76,131,115,255,23,13,91,229,203,
+239,160,148,159,159,64,171,233,202,0,224,37,12,147,227,232,177,3,224,40,
+12,140,91,224,77,6,233,15,0,1,54,48,225,254,0,204,85,236,127,1,
+65,246,0,66,99,54,65,95,96,14,98,5,96,121,5,66,32,85,32,64,
+90,162,4,220,224,0,49,79,16,1,35,54,135,215,160,127,163,56,96,16,
+0,56,64,35,1,57,56,161,118,224,187,5,97,43,207,79,1,95,56,64,
+73,76,39,1,57,56,65,224,0,58,128,53,255,164,0,128,22,128,42,0,
+53,68,79,98,17,4,95,53,48,50,32,99,161,1,95,53,103,166,64,39,
+131,100,246,86,63,0,57,70,146,227,177,1,229,196,3,4,109,111,100,117,
+108,250,53,0,107,255,64,9,229,40,11,0,57,65,21,201,244,227,195,0,
+0,55,218,98,224,51,26,229,234,8,96,55,224,45,2,0,55,234,112,3,
+224,26,12,224,194,10,5,112,97,116,116,101,114,175,202,234,147,0,224,144,
+22,224,71,10,2,116,121,112,225,8,0,170,242,224,176,24,74,5,224,77,
+13,5,100,101,102,97,117,108,240,151,0,128,149,230,218,5,1,49,57,78,
+78,3,10,65,32,90,96,1,0,85,64,33,64,20,232,122,18,0,56,134,
+171,129,122,73,105,96,48,232,100,18,0,56,132,56,0,56,76,124,128,49,
+229,64,16,136,130,229,60,19,138,173,0,83,244,83,1,99,63,0,51,68,
+145,232,201,8,192,35,195,101,96,37,232,216,5,229,46,0,142,65,196,148,
+64,152,131,127,224,23,15,128,245,173,56,198,52,105,7,230,52,10,65,1,
+230,52,17,0,81,230,53,28,192,202,230,40,40,224,194,22,236,105,3,4,
+67,32,95,54,50,99,81,68,59,224,162,1,178,164,224,36,21,4,100,101,
+114,105,118,183,201,224,42,22,4,99,108,97,115,115,128,39,209,142,225,163,
+4,224,42,2,248,144,6,224,38,15,254,119,0,64,224,104,126,224,89,24,
+3,100,97,116,97,224,83,20,227,62,3,224,87,2,224,217,20,234,144,2,
+224,128,25,0,111,224,126,20,1,101,108,224,210,40,5,102,111,114,101,105,
+103,161,172,224,44,23,1,105,102,224,126,20,4,105,109,112,111,114,224,252,
+0,224,254,30,3,110,101,119,116,196,194,226,82,23,3,102,105,120,114,224,
+169,30,64,43,224,172,21,224,77,1,225,45,33,6,105,110,115,116,97,110,
+99,160,173,224,45,23,213,224,224,31,15,230,197,2,225,46,32,2,116,104,
+101,225,172,30,0,111,225,172,21,230,127,3,225,0,33,225,170,0,224,32,
+15,3,119,104,101,114,224,210,0,0,58,132,88,68,199,0,52,192,43,64,
+210,0,55,204,26,224,5,3,160,24,160,137,172,6,160,6,224,45,25,224,
+52,3,224,45,18,224,84,3,160,52,224,45,25,224,98,4,0,53,110,177,
+156,24,0,53,83,71,128,11,64,234,137,38,3,115,99,109,112,77,106,64,
+66,167,37,2,66,32,90,73,97,161,17,0,54,137,37,0,39,235,70,7,
+233,23,21,240,16,0,1,49,57,87,79,64,119,249,91,12,64,24,106,213,
+70,76,106,107,232,244,1,136,30,242,177,2,231,217,7,73,22,230,117,16,
+5,83,121,109,79,112,101,99,50,242,23,8,158,128,230,136,2,110,150,231,
+129,2,220,85,98,52,138,187,70,145,107,9,231,109,0,128,23,0,49,121,
+117,236,180,1,134,134,1,67,32,140,179,0,79,75,144,239,136,1,224,31,
+11,64,88,192,30,224,150,6,237,85,37,103,29,96,96,0,54,73,199,135,
+53,98,250,1,49,53,226,251,0,64,29,105,100,237,102,33,97,106,238,21,
+19,231,223,36,109,155,224,160,1,231,196,29,66,35,173,230,0,56,76,42,
+98,91,86,122,1,53,51,138,21,64,105,108,120,76,170,224,129,7,175,163,
+236,152,4,225,71,0,228,26,5,128,251,239,212,0,160,125,169,5,233,251,
+11,0,54,137,251,162,178,194,152,248,184,4,242,62,0,73,45,64,29,176,
+229,0,54,226,73,5,1,64,35,76,65,67,185,116,246,128,46,225,115,17,
+226,223,200,233,255,11,226,210,45,226,75,18,97,87,132,249,0,79,242,63,
+8,224,17,3,0,60,124,81,224,17,3,132,179,224,17,3,139,133,224,17,
+3,148,168,0,79,242,130,5,128,14,235,146,0,128,14,244,193,0,225,26,
+1,64,154,133,133,230,216,0,171,0,0,54,94,56,64,30,0,54,165,140,
+239,169,2,70,5,64,47,252,29,4,65,18,252,27,8,239,86,4,64,77,
+133,62,222,16,0,53,75,236,240,172,6,79,50,64,41,131,253,244,192,1,
+64,84,248,108,5,229,168,0,70,118,64,50,195,177,0,90,65,192,96,6,
+224,7,0,114,231,64,35,227,87,18,0,53,178,195,0,48,128,248,163,80,
+240,158,0,1,49,57,65,93,99,202,250,48,1,102,123,189,1,206,63,66,
+44,125,146,4,54,56,32,95,56,248,250,0,96,232,245,140,6,224,205,3,
+242,38,6,249,48,13,157,106,192,104,0,85,226,7,2,1,91,93,102,223,
+224,88,4,153,29,160,11,151,56,197,114,242,103,8,64,246,224,239,4,241,
+142,3,250,142,5,77,37,68,81,2,67,32,79,195,103,0,58,129,29,225,
+126,1,192,4,199,212,66,123,144,250,146,198,97,51,64,73,135,189,64,141,
+160,189,131,251,239,161,7,64,66,216,86,1,83,39,82,10,65,68,244,209,
+10,154,51,97,79,224,106,20,131,251,226,195,3,96,125,163,213,240,32,8,
+64,127,0,54,160,127,230,17,5,81,234,230,18,4,1,95,53,117,13,67,
+125,5,95,53,50,57,32,75,132,118,100,122,230,50,13,150,162,230,50,4,
+229,165,3,96,0,64,128,168,124,224,179,0,64,19,231,37,19,0,85,231,
+38,39,99,245,231,37,35,67,51,164,30,0,66,68,17,98,181,96,47,2,
+52,49,53,248,18,5,100,66,0,50,93,176,226,55,6,131,146,231,104,75,
+231,102,4,231,101,10,0,53,248,130,0,1,55,32,115,223,0,51,64,41,
+0,80,99,166,0,57,64,79,225,53,6,138,224,123,2,0,85,147,219,160,
+71,131,59,0,75,65,234,0,58,128,59,135,139,1,52,55,74,232,67,242,
+191,80,148,32,100,69,96,170,97,21,64,97,84,37,203,108,224,25,4,132,
+104,192,30,99,83,192,25,0,66,96,53,105,70,0,53,157,168,183,254,123,
+36,224,19,0,160,15,64,136,180,127,128,99,128,102,192,113,160,13,64,180,
+82,252,1,51,52,64,51,0,73,128,207,0,54,160,222,224,156,2,160,11,
+163,92,1,95,52,88,240,96,60,159,97,1,95,52,88,80,64,15,98,68,
+1,95,52,122,163,64,75,130,195,88,200,227,198,0,98,20,3,66,32,95,
+55,132,119,104,210,128,201,64,25,231,50,2,1,94,42,139,195,224,27,10,
+11,32,32,102,111,117,110,100,58,32,32,32,32,128,36,129,37,224,92,0,
+98,212,66,227,96,16,133,156,99,168,231,77,4,2,69,79,70,64,61,167,
+33,160,62,72,113,0,48,162,177,224,120,10,8,101,120,112,101,99,116,101,
+100,58,128,120,96,200,69,255,0,55,68,147,201,227,226,43,0,65,16,194,
+12,2,49,57,51,66,75,129,74,65,44,129,226,96,25,0,52,65,215,96,
+75,104,219,102,29,0,57,189,166,96,4,65,110,197,26,65,117,216,36,158,
+220,243,206,0,199,5,69,136,243,232,6,233,191,7,64,22,247,96,13,224,
+65,0,162,127,110,10,233,179,6,198,95,224,69,12,196,251,224,69,5,138,
+22,96,22,163,177,224,91,6,97,61,225,107,1,240,15,5,159,178,192,114,
+133,247,70,154,148,49,130,69,3,64,83,32,83,67,169,67,172,64,100,0,
+66,227,88,2,224,159,3,195,61,0,85,234,56,0,65,85,196,153,0,89,
+155,175,224,176,0,224,13,1,104,87,164,253,1,85,32,99,53,224,174,1,
+7,108,97,121,111,117,116,76,83,160,176,128,240,225,125,6,64,144,192,25,
+224,2,0,128,47,64,37,128,1,225,169,4,128,170,224,132,0,96,199,160,
+43,224,59,0,224,56,12,66,195,224,88,2,98,117,225,3,3,224,31,6,
+103,185,135,66,192,99,129,63,64,7,64,247,226,192,0,69,58,215,70,167,
+249,129,99,0,80,97,201,106,134,217,123,226,245,1,160,0,224,140,14,192,
+229,224,139,2,65,37,64,91,225,57,0,66,49,96,239,196,194,225,9,1,
+228,209,2,193,240,192,202,224,24,2,225,36,0,100,135,93,143,162,119,70,
+24,224,127,1,192,91,96,11,241,16,1,3,32,95,52,54,80,162,224,42,
+1,224,245,1,72,20,64,246,130,135,224,252,13,96,121,224,44,10,132,49,
+64,73,228,32,0,228,28,0,64,0,64,21,97,30,227,43,1,128,28,198,
+192,96,0,224,213,0,96,7,130,114,195,107,226,21,3,128,141,193,100,226,
+128,1,104,16,129,103,64,5,102,132,163,57,161,123,97,47,64,125,1,54,
+53,161,6,163,230,192,122,225,8,11,229,219,1,228,252,0,132,238,232,23,
+5,224,230,3,129,165,132,201,161,235,193,140,161,201,225,164,0,96,185,225,
+22,1,224,152,0,128,226,224,151,24,160,106,225,164,0,129,209,193,94,64,
+81,170,91,224,158,3,224,88,43,128,172,192,88,234,207,1,64,94,226,59,
+13,96,46,64,30,1,95,55,227,167,0,160,214,97,218,227,63,7,187,190,
+225,60,0,99,65,228,197,2,99,43,224,29,0,131,15,192,13,239,165,5,
+189,221,224,31,0,225,94,1,229,253,11,129,50,132,30,224,240,1,64,97,
+226,165,1,2,48,54,32,162,41,64,0,227,188,3,98,96,229,35,1,192,
+23,227,150,3,0,95,111,134,83,135,3,95,51,50,52,224,72,2,160,59,
+224,122,7,227,57,2,0,67,131,110,4,32,95,54,51,53,230,86,3,133,
+167,7,32,101,114,114,111,114,32,125,205,70,0,51,126,31,0,52,84,128,
+68,220,228,226,1,128,0,224,232,13,227,169,5,160,146,96,38,64,23,162,
+252,228,4,1,164,147,226,3,2,160,239,102,87,225,216,3,97,191,224,16,
+3,96,89,128,22,225,184,0,131,33,224,13,9,225,71,1,64,159,0,56,
+76,151,104,70,161,59,224,166,3,109,38,231,64,3,229,176,8,161,69,76,
+45,65,70,128,40,225,76,1,5,115,121,110,116,97,120,129,76,225,74,25,
+71,101,139,132,64,125,139,96,0,85,138,116,171,83,0,50,75,65,68,214,
+170,53,0,65,136,241,67,123,3,10,65,32,73,96,29,138,214,148,175,203,
+60,224,12,2,228,51,4,199,194,162,198,192,39,225,40,0,225,101,0,96,
+8,74,219,2,49,57,51,129,208,224,70,3,234,73,0,96,22,165,51,226,
+202,3,64,36,65,157,97,92,68,216,129,72,201,204,2,49,57,51,115,191,
+109,106,183,71,141,113,237,120,0,229,14,2,199,122,226,37,6,163,235,229,
+194,5,224,7,3,162,4,226,102,1,226,13,0,165,195,64,178,64,60,224,
+88,4,226,90,2,224,57,6,129,32,160,45,98,45,230,54,0,224,38,13,
+130,44,101,26,161,245,105,181,137,186,173,65,128,226,205,78,164,32,0,64,
+66,7,65,235,64,7,206,64,68,6,79,4,238,13,11,131,235,238,13,2,
+174,18,184,92,138,114,164,71,0,55,120,145,224,0,2,129,153,225,148,6,
+66,140,64,12,66,228,78,253,1,95,49,172,229,193,160,3,95,56,52,53,
+233,238,2,5,80,114,101,108,117,100,170,158,66,150,0,54,142,6,224,37,
+5,8,77,104,115,46,66,117,105,108,116,158,0,64,39,141,18,0,75,98,
+202,236,29,1,129,73,64,75,224,11,2,192,8,210,207,84,180,195,60,65,
+1,131,59,65,5,160,69,160,44,64,20,195,103,128,1,132,57,226,177,7,
+194,29,233,57,0,64,12,134,50,102,48,160,36,192,153,130,220,227,20,3,
+99,56,160,37,2,95,49,51,80,31,97,94,4,48,53,32,95,56,164,82,
+133,37,131,60,236,44,2,64,50,202,193,172,28,235,14,2,227,169,0,233,
+199,1,128,76,224,25,10,97,29,228,251,3,224,174,3,64,201,160,17,128,
+6,224,60,0,128,32,64,154,150,2,1,55,49,68,183,0,50,70,111,226,
+54,2,1,95,54,70,124,64,92,2,95,52,49,150,51,110,76,1,49,57,
+111,111,1,95,56,208,99,192,32,194,191,224,15,1,130,215,128,159,3,95,
+49,54,57,151,60,64,130,1,95,55,111,171,128,146,0,95,67,6,129,108,
+1,95,51,64,98,194,183,1,67,39,76,146,64,25,0,80,128,91,160,252,
+227,224,1,171,32,141,101,132,42,64,18,64,44,131,128,160,162,161,12,163,
+114,128,143,129,166,135,178,0,56,88,87,67,87,85,143,96,0,163,167,161,
+5,3,66,32,95,56,66,88,64,197,202,122,77,114,96,202,152,168,81,198,
+64,31,112,248,2,95,49,53,80,1,64,7,120,122,68,35,103,28,96,96,
+64,6,184,19,128,138,1,50,56,233,46,3,65,102,132,85,106,143,177,233,
+65,175,116,51,160,164,192,68,65,144,235,198,4,192,84,129,111,224,20,4,
+0,89,225,74,0,197,105,194,56,161,25,194,81,64,0,96,24,234,129,2,
+224,36,0,128,53,232,133,0,100,53,0,55,226,246,1,224,100,11,192,9,
+96,10,246,176,3,192,153,199,196,226,228,0,192,107,226,233,1,1,95,55,
+233,161,0,224,0,2,194,148,80,52,132,42,135,80,111,14,73,227,192,128,
+224,117,7,224,7,3,224,205,2,64,18,134,86,131,244,227,119,2,224,2,
+7,224,140,0,128,15,227,176,1,224,36,12,224,37,20,224,40,4,224,41,
+34,235,147,0,0,39,131,240,228,194,2,97,87,199,231,195,44,132,182,225,
+118,1,141,44,100,170,128,92,167,46,224,5,3,231,58,1,192,148,235,83,
+4,99,189,161,227,164,86,236,206,0,66,181,2,52,52,48,227,209,1,131,
+133,242,154,1,196,51,3,95,55,51,57,64,12,0,50,130,253,192,22,192,
+228,224,88,3,224,85,9,192,50,164,143,66,144,236,190,0,229,12,1,224,
+2,17,226,244,3,225,25,2,161,53,225,113,5,224,28,19,225,176,3,230,
+72,0,161,24,229,250,4,224,20,0,224,8,2,2,95,49,49,180,199,196,
+230,236,193,4,224,198,3,64,15,226,31,3,0,89,160,32,224,102,0,225,
+251,7,171,101,160,42,192,19,197,173,96,130,160,173,226,106,7,192,92,160,
+62,192,196,98,27,224,5,3,193,66,224,57,3,162,48,224,25,10,160,2,
+224,25,17,226,168,1,225,113,3,192,164,64,19,226,246,1,225,39,5,133,
+233,69,98,233,0,6,160,68,231,182,2,130,139,238,234,0,224,224,7,66,
+111,165,164,64,39,134,176,64,53,202,116,228,56,0,64,126,156,84,71,241,
+230,193,7,224,28,16,2,95,49,57,226,167,3,134,172,64,3,234,34,1,
+130,30,225,241,3,232,163,10,128,210,160,247,224,128,7,224,215,0,224,236,
+3,224,218,0,198,231,224,249,2,200,48,226,93,11,226,193,1,228,1,2,
+226,92,255,226,92,45,226,90,1,96,0,226,2,14,225,67,3,64,13,226,
+8,29,159,201,224,166,3,96,27,193,5,231,205,4,128,156,192,150,74,20,
+64,148,244,241,3,64,0,96,150,64,107,227,3,14,75,166,224,121,9,224,
+138,11,237,138,3,96,59,174,100,227,108,19,128,215,160,187,79,221,125,109,
+124,198,226,241,4,230,205,2,160,3,234,69,5,225,79,2,224,90,1,232,
+142,3,98,150,225,178,3,240,166,1,226,249,3,200,181,229,238,1,161,8,
+98,124,227,145,17,64,84,243,98,3,128,0,225,105,4,128,179,64,40,0,
+80,138,3,239,120,4,232,148,3,204,136,233,105,1,193,42,224,98,1,226,
+85,6,233,160,1,224,89,8,163,82,64,251,64,66,65,62,135,86,224,80,
+4,224,75,16,225,207,1,161,172,203,143,235,139,1,224,72,4,203,100,2,
+52,48,57,76,52,0,49,124,108,238,67,1,2,110,111,116,90,117,4,111,
+114,116,101,100,217,13,128,0,0,58,137,240,109,231,0,82,64,108,110,250,
+66,71,0,56,65,107,138,138,0,95,75,213,2,95,56,55,107,210,97,116,
+219,36,251,111,6,0,32,145,192,0,56,193,47,64,93,191,199,225,22,4,
+225,116,3,132,96,229,37,0,228,143,4,226,218,5,164,66,224,26,0,224,
+69,0,225,205,1,64,0,224,71,3,224,25,5,227,234,1,229,23,0,193,
+179,224,46,0,226,148,0,224,11,1,84,222,168,83,229,158,28,162,188,228,
+238,0,98,0,144,116,204,242,194,247,243,142,5,163,48,128,16,96,142,229,
+200,2,165,188,192,156,227,62,4,228,129,2,96,56,172,77,1,49,55,227,
+26,6,230,139,5,225,85,0,230,132,7,224,38,50,225,92,5,64,38,228,
+53,21,225,39,14,99,42,192,108,244,202,0,164,39,224,21,14,165,147,161,
+11,129,246,65,186,133,137,245,142,7,225,74,1,225,181,25,250,232,6,225,
+182,5,224,146,2,237,125,1,224,13,11,245,122,14,161,42,230,71,2,98,
+148,224,185,1,224,0,3,230,55,0,224,183,29,224,182,18,224,171,88,224,
+170,37,225,97,19,224,170,93,96,142,226,209,4,224,84,0,227,232,1,224,
+19,3,232,232,3,128,1,224,219,14,239,108,1,224,60,1,192,183,224,19,
+5,233,201,2,224,23,0,228,7,14,224,137,4,132,13,224,75,5,231,24,
+2,224,20,1,96,254,233,37,0,229,94,2,224,180,0,179,160,198,119,129,
+16,232,156,1,187,39,1,50,56,228,249,0,159,153,4,95,49,51,57,48,
+72,247,0,48,113,91,230,145,1,196,132,102,54,1,49,53,149,28,113,226,
+224,0,4,210,15,3,95,49,49,56,101,36,128,118,193,146,128,8,160,5,
+239,71,4,192,184,169,182,160,191,137,129,146,56,177,213,224,137,0,196,9,
+225,236,0,102,30,230,47,1,192,173,192,123,224,238,3,192,68,210,59,0,
+90,70,26,128,176,96,240,84,193,128,117,114,83,70,255,152,107,224,108,1,
+198,142,128,11,160,118,160,17,96,196,100,200,153,49,243,143,2,2,95,55,
+56,70,129,231,153,18,231,142,8,15,117,110,100,101,102,105,110,101,100,32,
+109,111,100,117,108,101,231,158,7,111,233,97,192,0,79,225,141,0,192,244,
+199,104,226,34,4,231,188,6,128,2,162,143,224,21,6,160,81,226,80,1,
+96,69,163,123,1,95,57,96,203,160,109,112,178,231,132,0,201,252,104,221,
+245,68,2,2,49,57,50,184,229,225,49,0,96,61,65,28,202,232,99,84,
+96,208,236,88,7,224,148,1,171,96,99,4,160,135,244,183,1,137,90,1,
+90,32,254,88,3,130,200,64,12,226,56,4,171,228,246,165,0,213,6,224,
+78,4,96,202,248,201,0,224,133,37,1,64,75,224,57,0,192,63,66,78,
+0,54,218,229,99,227,83,201,224,93,0,194,35,96,39,152,35,248,75,6,
+1,46,46,184,66,65,75,247,240,8,65,154,160,20,237,23,5,132,59,1,
+95,51,128,157,224,11,2,129,220,128,12,138,192,65,45,197,26,170,76,133,
+148,64,20,192,65,128,0,224,48,16,224,40,7,131,119,73,128,64,164,152,
+170,226,143,1,226,15,1,226,65,1,224,9,4,224,29,1,224,9,4,233,
+248,1,234,2,2,228,65,3,107,181,75,116,65,153,2,51,53,55,167,80,
+98,197,1,48,55,130,206,118,26,98,192,1,95,54,215,209,1,95,56,85,
+57,96,0,66,153,1,51,54,66,35,0,57,122,39,1,49,48,245,221,1,
+141,231,0,55,66,0,147,179,97,3,250,125,3,133,91,128,21,224,23,10,
+140,85,246,36,13,167,8,228,194,1,169,19,132,88,226,221,2,161,93,233,
+27,8,224,148,6,224,128,0,96,15,225,216,6,224,7,9,235,33,27,224,
+166,2,96,16,231,176,1,239,82,3,161,181,229,228,1,238,66,1,133,139,
+193,79,66,253,182,214,224,223,8,224,0,3,65,133,128,38,2,95,56,57,
+101,202,1,56,57,64,252,160,119,225,173,15,195,177,225,176,36,225,24,5,
+239,75,4,97,35,130,106,0,80,225,196,13,224,84,1,129,79,193,6,129,
+1,192,39,227,168,7,64,195,2,52,53,50,100,156,147,20,226,3,30,160,
+228,224,85,24,1,56,57,101,134,226,89,50,68,182,69,241,165,173,224,239,
+9,228,53,6,193,250,193,75,226,54,1,224,13,5,199,62,96,153,160,43,
+236,156,2,236,159,1,226,72,5,160,34,224,61,0,126,165,227,85,15,236,
+116,0,226,241,7,160,132,224,10,2,225,175,1,133,99,225,49,6,70,226,
+173,30,166,19,233,69,9,193,73,66,233,225,70,3,251,68,0,0,56,126,
+95,160,119,163,92,224,157,13,241,137,17,192,54,193,57,227,124,1,225,52,
+0,193,41,133,19,64,52,224,93,2,0,83,160,53,124,174,226,121,3,0,
+85,96,43,235,225,4,0,95,96,198,0,85,101,244,192,216,227,194,1,64,
+0,226,151,12,224,166,26,160,146,64,169,228,23,7,224,80,6,228,40,2,
+224,0,2,64,180,97,98,229,213,5,89,63,105,38,133,2,227,167,16,225,
+218,6,124,161,224,213,2,224,104,4,1,51,48,138,33,81,166,100,126,103,
+253,201,236,128,5,64,64,100,167,163,64,224,6,5,224,14,0,100,173,102,
+120,3,49,57,32,64,128,9,0,50,66,64,166,130,2,95,55,54,64,7,
+71,54,159,204,3,85,32,75,52,96,191,64,18,155,223,64,183,1,54,32,
+160,75,100,249,2,56,50,55,167,12,132,4,129,214,65,25,1,51,54,102,
+247,193,233,103,25,1,57,49,92,54,0,52,169,157,64,188,137,146,228,51,
+0,98,216,224,57,26,160,212,98,27,204,61,98,230,0,58,128,222,104,154,
+128,72,64,17,146,87,122,178,98,130,77,220,96,117,96,11,138,149,128,13,
+227,98,1,227,230,2,133,205,67,109,128,150,1,49,50,97,150,225,129,0,
+96,31,0,50,240,74,0,163,162,96,87,65,63,64,160,228,220,1,160,85,
+65,211,0,57,70,151,233,39,1,224,17,2,192,46,128,165,129,111,1,49,
+51,190,176,77,27,97,8,160,249,64,99,94,206,0,49,102,115,98,174,189,
+160,0,56,64,249,64,93,226,140,1,131,147,130,125,98,134,0,52,65,219,
+68,37,95,59,172,23,2,79,32,35,70,232,99,10,76,180,2,32,95,50,
+102,248,64,13,0,53,118,111,96,11,5,50,54,54,32,95,50,76,228,0,
+95,150,106,66,132,3,51,50,52,32,240,77,0,96,103,67,206,224,43,2,
+81,176,65,208,97,202,65,157,140,245,64,130,128,230,100,213,0,56,159,210,
+0,55,64,119,64,36,0,54,158,96,65,114,137,134,161,172,230,129,0,161,
+135,182,210,164,202,0,83,97,139,64,251,65,26,0,54,234,222,2,1,45,
+62,148,220,129,173,96,31,0,56,71,174,1,49,57,97,145,196,5,160,68,
+128,71,164,54,224,74,7,0,61,160,74,225,252,2,64,36,1,57,49,66,
+188,160,72,228,120,3,160,76,160,162,192,79,3,79,32,35,49,69,201,192,
+121,226,140,5,192,41,1,53,53,247,177,2,226,66,3,228,187,1,79,183,
+108,205,66,40,96,8,64,6,137,34,160,93,225,24,5,0,55,97,138,225,
+8,1,96,15,64,191,65,232,224,48,11,160,174,1,56,53,71,223,128,32,
+225,70,20,224,199,1,224,240,6,1,56,54,88,76,225,34,3,225,61,11,
+193,17,225,18,1,98,222,224,16,3,98,18,238,93,22,65,51,135,94,97,
+62,227,114,7,229,253,3,135,252,163,118,142,25,0,67,66,90,164,125,64,
+36,227,112,7,226,232,23,101,19,240,248,6,225,197,19,64,45,64,121,193,
+187,225,213,0,199,15,65,221,99,187,64,131,142,246,96,86,99,200,66,76,
+76,119,96,74,67,62,141,226,3,35,49,53,32,64,13,141,209,192,96,99,
+209,160,6,64,29,141,218,129,164,4,95,49,54,54,53,128,22,141,76,224,
+52,6,224,65,9,96,43,134,65,0,75,233,7,0,0,83,163,68,130,72,
+224,5,4,77,9,150,234,193,162,0,95,110,185,69,209,79,152,3,49,51,
+55,48,96,5,66,15,224,37,0,175,85,224,41,20,96,137,134,184,197,195,
+111,248,2,95,57,56,65,39,0,52,114,88,154,39,100,116,1,35,52,128,
+76,196,115,64,150,135,7,71,9,96,78,77,179,65,4,72,51,1,57,52,
+239,50,7,10,80,114,105,109,105,116,105,118,101,115,46,164,94,98,201,69,
+106,2,95,54,49,165,31,229,41,15,224,79,21,164,99,224,79,25,224,251,
+2,66,0,97,133,0,75,128,206,0,54,161,10,164,131,2,95,56,50,70,
+182,71,53,65,5,65,58,96,12,82,143,160,149,253,147,2,66,169,224,34,
+0,66,108,0,55,72,248,229,103,2,224,78,17,0,55,115,173,229,76,1,
+224,74,8,0,56,71,167,227,149,1,224,76,6,102,178,4,67,32,95,57,
+51,65,227,160,96,0,49,82,216,131,37,1,56,54,108,32,242,208,6,10,
+101,120,112,97,110,100,101,100,58,94,42,146,201,1,49,48,236,94,0,134,
+55,64,84,66,128,218,195,224,190,2,1,49,56,115,37,224,171,12,73,130,
+166,107,224,164,3,104,110,224,41,1,65,166,98,94,0,49,68,36,160,35,
+135,77,224,15,4,97,152,131,156,100,144,225,133,3,1,53,52,66,152,116,
+35,224,179,2,96,147,235,97,1,192,13,96,5,237,141,2,164,231,161,79,
+144,154,0,60,247,231,1,192,21,80,207,224,35,9,138,140,227,103,1,248,
+221,7,99,212,238,205,0,237,118,5,165,100,234,254,9,199,166,128,44,246,
+241,6,196,40,192,69,64,7,238,201,9,130,31,237,133,0,224,26,7,240,
+9,0,0,83,69,70,133,251,72,73,0,49,239,226,16,228,76,3,249,10,
+7,224,146,3,237,178,2,237,58,2,237,189,0,166,86,224,83,1,250,114,
+4,238,130,5,240,215,7,224,27,1,162,253,137,151,239,66,0,227,59,0,
+192,102,64,36,1,95,55,73,148,180,179,181,20,192,0,226,98,2,248,172,
+0,128,1,226,93,10,86,121,96,0,203,15,238,191,0,131,25,96,54,2,
+49,57,48,100,86,247,22,0,132,14,135,132,167,128,129,212,137,153,247,245,
+9,107,52,1,52,50,236,181,0,108,180,0,56,68,160,86,150,235,212,0,
+248,110,1,109,72,142,78,245,98,3,225,229,1,138,225,0,54,135,125,64,
+0,67,72,134,215,0,80,70,227,64,73,195,84,2,49,51,53,141,107,120,
+212,0,56,94,247,1,49,57,74,95,1,95,51,104,227,226,75,1,101,133,
+248,7,1,64,71,134,246,3,85,32,75,51,70,5,77,217,102,12,160,29,
+134,232,3,95,56,49,48,109,253,193,105,225,216,1,225,125,1,224,1,7,
+226,50,2,224,37,16,224,35,4,224,32,23,224,29,20,224,26,17,224,23,
+14,180,199,224,0,0,64,237,135,76,102,253,105,26,107,170,0,52,65,79,
+78,160,66,109,229,128,1,1,37,84,139,21,199,78,98,201,231,138,0,230,
+44,16,1,56,55,217,210,141,164,164,163,248,91,5,229,146,3,233,204,2,
+1,48,53,229,92,1,130,59,65,240,64,150,133,176,226,221,1,227,235,1,
+193,255,102,73,72,23,234,6,2,164,230,64,1,64,28,216,32,64,165,64,
+41,131,53,204,138,171,220,98,110,1,50,54,87,95,129,61,227,43,3,64,
+30,128,144,160,145,160,221,160,57,229,132,4,234,53,0,229,168,19,128,189,
+96,209,241,63,3,96,23,145,64,128,29,196,199,129,41,225,244,2,196,125,
+96,24,243,16,2,207,19,96,46,129,29,0,49,106,187,1,51,52,111,136,
+120,105,0,56,154,205,192,0,128,81,224,136,4,103,2,210,143,128,31,101,
+24,128,88,228,112,5,198,178,64,18,148,182,80,1,137,164,1,49,54,192,
+106,101,62,64,140,224,122,0,224,116,8,224,252,13,225,164,3,224,225,0,
+160,77,224,200,4,142,96,74,153,2,52,51,54,136,89,65,188,100,59,146,
+13,0,67,68,120,65,226,250,51,0,97,210,102,177,64,94,182,200,128,105,
+161,110,230,253,14,225,229,0,225,26,0,128,10,166,110,224,180,3,230,243,
+9,135,230,232,197,0,192,36,226,143,3,254,6,1,129,36,129,85,181,136,
+205,49,128,246,99,89,77,45,161,109,231,50,5,227,101,0,227,122,1,99,
+50,64,13,0,50,78,99,0,52,130,116,227,132,3,70,190,235,181,2,79,
+225,227,246,0,64,27,227,123,1,131,36,227,213,2,227,206,7,224,61,9,
+0,56,146,181,0,49,151,146,160,33,70,207,64,34,96,27,170,19,192,154,
+96,0,225,26,1,64,112,124,9,226,35,0,206,71,128,17,227,140,10,128,
+20,98,10,227,133,9,227,130,12,1,49,51,96,255,252,108,1,160,4,100,
+87,225,90,1,227,53,11,160,58,226,193,2,201,25,64,43,146,219,227,24,
+3,224,129,8,224,128,8,230,144,3,75,14,125,73,252,8,0,129,115,116,
+206,233,187,82,178,120,64,17,206,200,192,0,70,34,141,94,133,236,110,224,
+78,117,221,221,0,49,194,98,149,13,166,35,224,162,5,225,189,12,128,223,
+229,71,27,192,178,230,31,7,230,9,4,191,196,224,49,14,128,108,161,241,
+128,1,235,213,17,161,22,133,120,195,157,236,111,4,0,53,68,131,161,100,
+129,64,236,64,4,160,62,2,95,49,55,81,118,158,24,141,152,224,161,0,
+226,179,12,98,208,224,187,8,96,21,0,85,98,6,79,250,0,50,239,73,
+0,224,231,10,225,24,2,128,89,197,200,224,191,3,106,10,69,194,232,23,
+1,13,116,121,112,101,32,115,105,103,110,97,116,117,114,101,136,35,128,218,
+249,48,4,231,240,21,130,20,0,55,79,161,213,66,225,73,1,237,202,6,
+123,185,224,153,6,225,135,7,225,91,11,132,34,1,49,48,112,212,225,88,
+9,96,0,224,49,4,66,192,244,203,0,224,106,8,0,52,95,50,64,85,
+79,195,235,161,5,228,20,1,64,133,224,238,5,64,56,97,133,225,128,0,
+103,140,0,52,158,61,1,55,49,88,188,97,182,239,1,8,26,67,97,110,
+110,111,116,32,115,97,116,105,115,102,121,32,99,111,110,115,116,114,97,105,
+110,116,58,32,97,117,245,45,0,149,225,2,49,50,52,64,71,224,70,8,
+2,94,42,32,64,0,14,102,117,108,108,121,32,113,117,97,108,105,102,105,
+101,100,160,67,79,125,166,194,64,0,65,1,0,54,97,1,195,155,82,182,
+156,6,249,106,5,0,73,138,18,206,249,0,95,64,70,170,79,64,126,64,
+87,0,50,64,153,0,52,70,91,234,68,3,210,186,225,65,3,64,23,139,
+238,105,92,229,227,2,227,198,5,230,32,6,233,233,2,154,127,245,159,1,
+96,9,225,133,4,66,197,128,188,226,202,21,194,75,162,206,160,13,238,61,
+0,192,91,65,124,227,231,4,0,56,120,94,224,61,1,192,63,167,151,192,
+211,224,32,1,160,14,224,31,3,97,117,99,1,226,125,2,104,196,160,0,
+224,92,1,96,129,66,105,240,195,5,130,90,66,230,64,9,1,55,55,89,
+225,97,176,251,160,11,101,8,193,208,0,85,101,28,83,43,192,108,224,115,
+10,231,161,7,160,32,225,176,1,191,217,224,5,3,215,210,128,156,1,56,
+57,64,11,103,187,73,141,135,3,131,162,128,0,225,46,15,150,6,64,9,
+131,64,160,51,225,52,0,96,31,228,66,1,1,49,50,88,113,236,11,4,
+100,13,0,53,81,1,116,17,96,21,174,133,64,79,117,123,1,49,52,249,
+230,1,151,47,128,73,0,79,117,36,0,48,160,76,64,63,0,65,96,38,
+161,45,252,120,4,110,250,128,21,2,95,49,54,131,225,252,29,5,66,239,
+142,150,68,75,64,113,224,64,0,64,26,142,147,97,47,228,240,18,242,60,
+2,140,194,133,197,226,16,4,97,30,165,133,107,17,3,49,55,55,50,253,
+46,2,77,174,96,239,214,210,129,164,229,19,2,138,97,253,187,6,64,214,
+64,226,64,172,188,88,103,86,68,133,0,49,97,224,128,213,0,58,139,152,
+111,126,226,126,4,168,7,226,127,5,227,193,2,224,251,7,227,3,0,225,
+224,0,128,208,230,86,6,0,89,133,93,102,95,64,4,107,87,97,246,0,
+54,118,49,2,49,52,56,225,61,0,230,242,17,119,210,225,182,1,133,164,
+1,49,50,194,24,128,157,237,5,4,132,109,1,49,52,224,206,1,226,72,
+2,224,52,7,192,223,137,205,226,238,7,128,82,224,154,1,195,67,245,79,
+7,0,85,227,137,4,166,133,99,96,0,56,117,101,165,118,103,98,128,147,
+234,144,0,224,131,2,225,99,3,0,56,104,128,161,28,224,132,5,235,217,
+6,97,33,236,56,0,64,58,121,88,230,233,0,225,24,1,109,168,228,218,
+3,228,46,1,128,13,160,38,225,199,6,133,94,1,49,56,65,173,97,88,
+81,254,227,99,3,160,234,96,118,106,102,0,51,82,18,0,52,217,223,160,
+115,103,108,96,106,171,118,226,53,13,160,76,211,25,64,12,1,53,50,64,
+79,129,47,128,203,132,196,165,30,229,37,1,232,229,2,225,162,5,96,81,
+189,188,227,82,6,128,135,155,77,2,95,49,54,94,238,224,219,1,160,88,
+0,85,132,95,2,95,49,56,131,239,130,148,84,82,160,25,96,27,0,56,
+160,239,132,197,0,56,229,147,2,99,155,76,23,131,155,79,237,0,56,112,
+183,64,22,200,227,237,145,13,225,35,9,161,32,193,240,205,142,101,133,237,
+226,2,228,107,0,98,54,164,144,235,173,11,237,140,26,225,191,0,232,0,
+5,198,164,86,186,228,31,9,96,167,230,159,4,225,106,1,0,80,239,15,
+11,224,99,6,192,151,237,235,1,224,247,12,162,16,224,251,10,130,106,237,
+146,0,224,163,49,0,75,224,35,4,133,76,64,0,142,46,230,79,5,224,
+198,8,225,41,0,225,35,53,229,158,5,226,23,0,232,111,5,74,30,0,
+54,90,192,160,38,66,69,224,32,0,230,161,2,236,198,20,226,7,51,131,
+24,0,48,66,254,229,173,2,139,82,235,74,8,31,105,110,102,101,114,32,
+114,101,99,117,114,115,105,118,101,32,112,97,116,116,101,114,110,32,115,121,
+110,111,110,121,109,32,74,15,0,115,202,6,225,91,12,173,96,128,215,225,
+11,4,237,115,5,247,195,9,226,114,13,237,132,2,87,38,0,66,96,6,
+224,92,9,205,44,229,201,5,224,100,12,225,184,9,229,230,11,141,25,241,
+159,4,236,189,21,198,20,224,30,5,229,166,20,96,147,232,148,10,234,151,
+4,229,29,8,229,19,10,64,0,162,125,197,243,209,251,96,62,101,23,160,
+10,98,228,195,161,5,52,51,56,32,95,53,128,222,230,69,9,230,89,12,
+160,182,128,0,69,44,0,54,172,151,136,77,224,170,6,242,16,1,235,182,
+8,174,52,95,184,196,236,136,38,225,10,2,252,115,5,0,95,77,4,64,
+50,102,54,229,231,0,96,204,224,93,5,225,150,9,239,50,5,0,52,134,
+52,225,91,12,1,52,49,230,218,0,235,236,3,230,77,1,64,244,141,214,
+236,235,2,89,238,70,100,103,108,0,50,98,131,107,14,64,57,2,53,54,
+57,96,133,64,35,170,70,225,130,0,0,50,64,166,1,95,56,225,130,0,
+1,52,48,181,117,64,11,64,41,246,9,0,64,118,174,27,225,69,2,0,
+54,82,63,0,75,225,88,9,0,54,149,212,166,243,239,156,0,226,188,7,
+244,203,4,129,50,230,244,6,0,53,64,69,165,95,225,45,5,2,95,55,
+49,114,179,232,84,1,64,162,0,51,175,29,129,147,130,254,130,213,65,6,
+96,34,139,217,0,67,129,219,64,195,128,22,186,105,0,49,90,203,0,67,
+218,197,1,52,49,71,154,154,197,79,62,65,183,64,44,139,85,236,0,18,
+166,112,229,97,1,222,64,199,109,229,80,8,96,54,224,25,12,98,111,229,
+132,13,230,33,1,229,132,4,96,22,91,45,129,230,128,117,128,146,130,147,
+96,9,2,95,49,56,67,200,128,0,224,68,8,162,229,0,75,238,167,5,
+224,43,13,96,187,2,85,32,83,192,157,96,169,64,1,253,213,1,161,15,
+68,252,211,112,226,13,7,137,226,64,21,255,233,5,169,168,162,63,224,27,
+3,101,119,224,156,6,64,0,128,134,224,240,1,193,116,225,56,1,128,45,
+192,153,225,61,5,224,27,1,254,158,21,195,127,224,98,0,249,238,1,224,
+13,3,228,32,0,222,2,230,62,8,254,30,2,105,145,160,64,238,20,12,
+224,122,3,196,45,179,160,192,118,224,22,3,232,155,1,224,83,0,2,95,
+49,51,74,98,67,104,67,157,218,4,66,186,65,89,253,251,0,234,175,3,
+193,36,128,94,0,53,172,79,238,116,3,128,51,1,49,56,133,29,224,112,
+1,2,95,49,50,99,53,224,66,6,0,54,164,24,224,66,4,128,129,227,
+240,0,254,130,8,0,64,253,141,7,225,159,17,130,248,226,7,0,225,110,
+6,129,89,161,137,226,80,3,225,69,2,146,30,245,38,5,225,162,2,224,
+40,1,225,168,16,226,37,4,164,141,225,176,4,225,148,1,182,100,224,29,
+16,199,88,161,70,129,73,193,97,2,51,54,53,145,35,97,215,225,183,1,
+225,180,40,226,2,20,226,94,2,161,209,224,139,4,216,190,192,33,138,204,
+251,176,18,184,203,176,44,161,139,155,56,193,190,224,80,0,80,229,240,227,
+6,130,202,0,56,70,175,64,140,194,59,103,167,97,63,67,207,136,111,99,
+209,115,82,224,0,0,226,120,38,222,81,226,43,7,192,75,192,19,175,231,
+248,203,0,128,249,234,7,8,232,87,5,236,209,2,237,219,15,245,28,11,
+2,63,63,63,139,10,65,191,64,198,160,70,0,67,226,136,11,160,0,0,
+58,159,254,242,189,24,128,135,174,38,0,67,120,128,162,227,64,144,101,69,
+224,99,6,226,26,6,226,13,1,152,161,128,230,97,153,0,66,161,89,96,
+215,93,248,96,33,71,156,1,75,51,201,83,64,44,168,213,168,177,243,11,
+2,139,204,107,198,102,79,226,21,3,64,224,175,85,82,207,96,179,77,3,
+0,55,71,234,160,85,178,13,0,54,91,224,116,105,241,87,6,163,71,98,
+142,96,160,0,85,64,34,96,153,128,158,192,38,99,81,64,138,100,202,244,
+169,16,64,63,99,187,160,230,64,163,143,226,66,162,129,90,70,69,225,116,
+1,226,251,0,163,49,166,152,164,1,96,124,238,34,5,96,35,212,171,65,
+40,131,18,130,204,160,14,192,58,68,215,165,23,232,24,1,103,180,113,254,
+197,26,129,252,192,30,242,38,4,128,38,160,26,192,181,246,120,8,228,125,
+3,130,69,192,206,192,75,128,85,181,41,203,80,241,194,7,203,103,97,142,
+0,50,66,159,64,9,0,54,162,90,0,51,65,116,106,176,98,95,2,49,
+52,52,98,80,236,47,0,225,134,1,192,80,100,127,192,84,195,215,224,241,
+2,224,228,42,224,222,0,224,13,1,163,44,224,18,1,96,92,128,7,224,
+225,5,224,6,0,160,230,224,158,3,101,247,64,242,224,175,4,186,90,4,
+55,50,53,32,64,65,243,225,237,0,0,49,98,31,96,180,102,109,230,82,
+10,224,28,1,66,140,101,107,160,18,224,41,5,224,29,0,98,173,0,54,
+171,26,66,217,6,95,49,50,56,49,32,95,108,93,101,83,64,32,250,102,
+0,228,81,9,154,190,129,6,228,216,9,1,53,56,64,36,160,18,1,67,
+39,230,47,6,161,153,226,166,5,233,111,2,193,182,233,186,1,213,65,128,
+31,250,35,5,193,135,160,19,230,120,1,198,117,228,0,0,234,124,3,236,
+162,4,94,44,233,136,5,64,196,237,193,2,160,189,192,222,128,42,132,187,
+230,50,3,225,201,0,225,50,11,0,54,141,112,192,65,112,14,167,228,110,
+129,155,238,96,0,65,123,141,148,100,182,143,44,172,186,0,56,69,33,172,
+186,96,40,0,51,129,197,70,44,1,75,32,76,28,224,1,13,138,180,192,
+0,64,85,131,64,64,66,141,58,132,165,138,73,0,53,138,65,0,56,104,
+45,133,8,253,52,3,104,75,64,5,1,50,56,252,242,2,5,101,120,112,
+111,114,116,102,189,64,85,141,121,82,45,251,5,11,2,51,52,51,224,58,
+2,6,116,121,81,73,100,101,110,128,60,1,64,85,117,51,160,70,237,147,
+11,0,50,111,72,64,214,3,83,32,95,51,64,105,64,19,181,30,67,207,
+71,14,197,208,74,35,110,167,2,95,52,48,133,57,0,49,160,16,128,97,
+69,188,122,19,72,80,157,22,70,30,157,141,226,222,12,155,234,224,29,15,
+245,177,24,3,95,49,56,48,176,70,224,45,9,226,154,6,0,56,128,66,
+132,27,240,109,3,240,193,3,1,49,56,80,27,97,186,232,126,3,224,92,
+25,0,54,160,182,224,41,26,132,54,97,28,134,229,126,51,232,16,3,195,
+172,224,83,0,224,241,1,241,254,4,104,206,231,176,0,224,176,15,2,49,
+53,51,129,172,227,156,11,186,6,229,150,1,197,218,229,220,5,160,2,192,
+24,224,43,2,192,5,227,168,11,1,53,52,236,153,1,192,112,98,106,231,
+200,6,225,250,4,192,94,135,133,161,17,0,64,246,145,0,113,192,245,46,
+1,64,235,88,217,227,0,1,85,39,7,97,32,99,108,97,115,115,32,99,
+4,1,95,56,171,51,228,136,5,224,147,6,225,14,2,224,25,10,227,243,
+0,224,48,7,228,12,1,236,200,5,224,2,4,224,237,3,251,8,6,64,
+219,224,5,0,212,18,73,37,212,19,0,85,98,26,241,13,14,133,144,240,
+101,4,213,91,235,51,1,64,79,148,225,64,125,64,97,69,3,0,54,74,
+21,168,24,192,192,224,76,4,177,209,224,76,8,224,68,21,225,101,4,100,
+123,246,226,15,2,49,50,52,68,90,225,184,1,26,115,117,112,101,114,102,
+108,111,117,115,32,105,110,115,116,97,110,99,101,32,98,105,110,100,105,110,
+103,246,210,3,64,0,64,133,129,13,161,89,129,151,219,144,225,112,0,225,
+175,0,187,184,128,1,109,23,240,93,5,225,208,1,83,81,163,33,227,22,
+6,159,192,224,69,1,224,95,0,195,25,224,9,0,0,67,235,153,4,0,
+64,251,20,0,224,105,5,224,115,3,226,152,8,232,166,6,224,2,6,160,
+138,128,79,192,160,238,240,0,225,6,30,128,68,128,11,139,203,246,181,7,
+232,249,0,140,29,239,99,1,128,28,225,29,4,225,32,1,224,82,0,160,
+60,0,48,134,78,225,100,5,2,52,57,53,244,182,0,96,26,227,60,4,
+65,133,77,178,101,239,140,45,0,49,236,219,0,160,216,165,45,220,217,100,
+8,70,109,66,159,224,57,2,71,238,0,52,108,134,1,55,54,160,135,224,
+138,0,128,48,192,13,254,220,2,177,44,132,217,234,75,0,224,166,1,64,
+191,65,9,192,205,0,54,151,37,192,14,161,247,129,3,71,219,66,232,128,
+26,1,56,48,197,160,237,150,2,74,196,225,88,1,64,40,227,91,7,133,
+102,0,89,224,114,0,169,255,193,106,225,229,2,209,209,130,13,249,167,6,
+192,48,233,247,2,191,159,129,193,240,94,0,160,73,0,66,75,64,230,10,
+2,204,173,104,44,76,73,86,94,130,181,224,179,8,0,89,224,166,0,192,
+160,224,154,14,134,35,192,148,160,140,64,234,130,98,128,115,96,166,96,139,
+224,135,2,160,174,0,67,128,24,224,0,2,193,159,160,0,250,92,3,253,
+69,5,106,121,0,54,128,129,196,150,0,53,97,43,79,148,252,169,5,71,
+176,0,54,239,58,0,130,85,162,125,64,68,183,155,128,14,0,52,71,121,
+194,146,97,46,80,161,96,136,0,35,139,240,64,50,248,175,0,64,129,74,
+122,3,54,32,95,57,73,68,64,28,0,51,137,63,184,82,1,49,48,127,
+209,72,18,64,21,138,170,229,59,1,69,48,0,34,128,26,170,130,1,32,
+83,65,115,179,196,161,87,245,225,10,128,20,64,200,224,28,5,236,148,1,
+236,62,4,96,22,188,182,233,208,18,68,41,65,15,104,217,230,87,6,96,
+67,2,95,53,49,69,128,0,54,75,4,224,197,1,69,237,165,234,98,12,
+229,2,2,232,209,3,69,89,199,209,1,56,53,247,160,0,128,54,224,179,
+9,160,231,224,79,18,175,48,128,86,202,107,192,209,234,111,3,96,65,65,
+156,64,247,105,158,251,122,5,224,103,64,192,99,135,126,128,36,234,6,13,
+65,242,140,31,227,216,2,195,229,224,126,4,224,112,1,224,31,0,224,117,
+6,129,80,3,56,32,95,51,129,232,96,92,204,53,98,33,225,240,2,0,
+83,101,30,133,105,1,53,52,255,65,0,67,81,106,112,0,75,239,163,0,
+136,194,99,179,0,83,142,93,64,77,116,220,160,7,132,95,0,83,173,51,
+224,77,2,1,95,53,153,12,192,217,224,56,3,225,17,5,128,19,135,125,
+100,41,1,95,54,199,199,160,0,232,134,15,99,239,226,132,1,9,109,97,
+108,102,111,114,109,101,100,32,72,131,11,100,97,108,111,110,101,32,100,101,
+114,105,118,232,136,2,128,127,225,107,6,238,171,12,0,48,224,132,1,161,
+67,166,230,227,66,10,131,133,170,17,139,135,138,247,162,85,64,26,227,197,
+11,226,243,13,78,193,201,177,225,40,3,165,204,64,46,104,165,140,102,226,
+200,6,224,60,15,224,56,3,226,156,1,224,85,0,225,96,17,235,168,13,
+12,100,97,116,97,47,110,101,119,116,121,112,101,32,235,173,5,64,0,225,
+89,1,171,152,160,187,230,20,3,233,0,0,96,33,232,143,1,224,173,0,
+99,4,0,53,102,172,0,57,224,177,0,163,162,151,55,151,249,96,0,0,
+58,132,81,227,78,0,224,123,4,97,148,224,96,0,237,40,0,166,216,198,
+222,192,11,192,82,224,20,0,224,64,0,224,55,20,83,234,224,56,6,130,
+20,225,15,2,128,22,180,144,224,40,5,224,94,1,233,130,0,0,66,192,
+30,65,179,0,51,163,100,5,49,53,55,32,95,51,101,61,4,66,32,95,
+55,57,117,23,230,242,3,0,79,225,170,2,4,68,97,116,97,46,224,4,
+0,65,167,224,29,8,7,84,121,112,101,97,98,108,101,224,8,0,224,37,
+7,11,71,72,67,46,71,101,110,101,114,105,99,115,192,8,224,35,7,29,
+76,97,110,103,117,97,103,101,46,72,97,115,107,101,108,108,46,84,72,46,
+83,121,110,116,97,120,46,76,105,102,112,211,224,46,3,17,84,101,120,116,
+46,82,101,97,100,46,73,110,116,101,114,110,97,108,96,13,224,38,12,3,
+83,104,111,119,96,4,64,29,232,3,4,228,56,0,96,5,2,95,49,56,
+72,216,234,224,7,224,17,1,233,3,0,224,48,1,82,86,141,15,69,138,
+153,72,229,67,0,224,93,14,225,157,3,65,160,226,99,3,224,115,58,160,
+36,107,51,224,106,7,105,128,224,108,7,160,20,224,110,36,195,79,71,238,
+64,213,67,60,145,239,200,32,239,219,11,96,79,0,50,98,111,107,255,230,
+217,6,108,71,153,62,224,35,1,129,176,64,95,145,50,196,5,101,72,224,
+183,8,225,65,5,224,27,25,224,2,4,195,156,224,25,7,128,22,197,126,
+205,108,227,179,4,195,158,163,151,224,14,2,225,4,4,193,6,192,141,128,
+8,64,20,224,118,2,240,47,0,1,49,54,108,50,66,57,131,172,120,204,
+99,204,230,253,3,91,77,241,27,6,227,1,1,2,66,97,100,230,194,8,
+239,169,4,224,150,1,225,15,9,192,2,224,195,6,128,49,224,194,5,224,
+5,27,228,223,1,234,157,6,164,163,224,67,23,224,137,6,129,35,0,56,
+116,133,236,6,3,198,41,225,74,2,239,24,30,239,36,4,224,244,5,225,
+156,98,96,0,192,133,224,141,0,249,94,7,227,221,7,226,232,0,167,26,
+0,95,175,186,207,37,250,53,0,64,0,230,149,6,102,22,239,225,1,224,
+119,4,82,152,242,149,0,96,8,94,55,123,205,186,81,170,212,239,210,1,
+160,68,193,135,224,150,6,103,228,92,72,160,110,227,73,2,248,109,2,102,
+147,0,48,101,48,160,228,0,85,240,53,0,226,160,0,112,118,224,44,4,
+192,227,224,95,2,100,195,165,36,225,67,3,162,34,64,2,244,193,21,233,
+184,2,160,166,228,215,7,194,201,135,173,180,176,64,182,225,247,4,244,175,
+49,193,140,239,186,0,240,168,1,224,10,17,212,161,225,229,3,230,88,10,
+193,3,227,227,6,192,67,236,71,21,129,179,236,72,5,192,55,128,172,224,
+95,0,225,39,1,224,21,9,232,229,0,228,136,12,224,25,17,132,54,224,
+144,3,192,1,129,212,243,92,10,128,30,229,201,11,0,83,243,231,2,227,
+87,3,243,29,10,225,244,2,236,222,0,96,17,162,85,68,20,2,32,95,
+53,100,31,0,56,224,5,1,224,88,2,151,249,197,6,164,85,254,205,9,
+1,85,32,117,68,129,134,252,132,2,112,92,111,140,112,113,0,48,66,182,
+156,129,0,49,242,78,2,128,0,160,60,118,84,64,46,0,51,217,182,250,
+62,6,14,109,107,77,101,116,104,111,100,58,32,97,114,105,116,121,228,143,
+2,225,121,12,128,2,244,142,4,225,91,0,163,46,96,2,244,5,2,224,
+74,40,224,1,1,3,95,49,50,49,100,114,228,99,3,96,55,226,199,0,
+229,235,4,225,103,0,230,69,9,2,95,49,52,81,41,97,57,92,78,225,
+1,1,4,99,111,101,114,99,106,189,224,134,7,68,66,226,222,2,129,145,
+224,33,2,64,31,137,16,224,17,3,128,246,192,15,129,129,128,63,225,134,
+1,130,47,101,161,174,182,240,87,7,225,194,0,105,127,160,11,148,103,98,
+226,244,76,13,96,64,128,69,191,33,166,0,0,83,147,146,98,121,238,56,
+3,130,115,162,114,64,100,67,191,194,221,224,42,5,129,9,192,35,128,208,
+97,14,225,117,2,224,47,9,224,48,2,110,94,96,4,78,77,66,203,70,
+76,230,62,4,64,0,88,40,1,50,32,78,114,128,224,64,15,114,66,206,
+88,130,208,97,23,80,122,226,102,0,129,35,238,248,4,194,97,170,92,129,
+25,176,115,229,161,3,129,200,193,189,144,199,192,141,0,54,244,22,4,238,
+227,5,161,100,96,57,102,56,64,253,162,155,69,135,132,226,197,111,64,121,
+224,19,2,96,18,64,14,3,80,32,64,83,64,4,193,81,233,38,6,128,
+39,6,64,66,32,82,32,64,75,98,77,148,223,224,51,4,239,189,0,225,
+107,2,224,47,0,128,0,128,11,160,17,228,6,6,175,146,2,68,101,114,
+163,8,75,122,0,54,252,173,1,227,116,1,226,58,6,0,80,227,158,0,
+66,105,137,144,64,59,148,224,190,190,149,62,0,49,99,135,2,56,52,51,
+98,135,167,159,65,140,4,56,48,32,95,55,65,62,64,30,65,213,1,57,
+56,242,16,0,130,71,128,240,2,95,55,57,66,255,64,94,149,37,224,154,
+4,224,152,6,2,85,32,75,84,113,195,143,64,52,0,51,149,204,85,157,
+1,49,52,77,57,64,86,64,182,227,200,0,64,37,149,79,66,164,0,35,
+70,1,82,191,64,22,211,115,105,12,105,252,211,221,0,52,64,199,160,19,
+64,41,255,118,0,224,41,8,0,50,85,36,224,41,1,64,7,243,106,1,
+134,80,128,4,70,74,157,195,141,104,228,98,2,135,24,224,11,2,192,8,
+225,123,0,73,159,159,130,1,95,54,68,38,239,244,19,64,104,0,54,96,
+224,64,111,5,10,65,32,79,32,80,239,233,7,6,66,111,117,110,100,101,
+100,192,7,66,32,64,151,64,84,224,45,10,3,69,110,117,109,96,4,160,
+39,114,52,224,39,10,240,93,4,64,39,65,218,224,79,11,3,113,46,69,
+113,192,35,65,11,224,35,10,6,70,117,110,99,116,111,114,192,7,192,45,
+224,161,14,4,73,120,46,73,120,224,35,22,2,79,114,100,64,3,160,37,
+0,52,65,43,224,37,10,241,3,12,64,47,66,179,224,47,5,241,13,15,
+224,131,13,241,23,26,64,102,225,90,9,0,84,241,33,17,64,48,67,11,
+224,48,10,241,43,4,64,39,67,140,230,140,5,66,33,132,15,132,154,100,
+211,237,190,3,128,11,0,83,101,175,0,55,137,6,144,53,162,162,130,225,
+226,177,0,234,191,9,133,35,238,122,11,176,62,168,51,246,62,0,224,12,
+0,165,94,111,200,224,13,1,234,247,4,224,20,7,224,21,7,234,139,14,
+236,163,0,192,28,224,29,4,224,83,1,170,88,253,215,14,224,49,7,224,
+2,3,232,255,2,234,40,2,224,2,8,166,192,224,83,26,233,80,6,224,
+81,11,201,157,221,42,226,13,1,7,115,104,111,119,115,80,114,101,98,154,
+224,109,21,221,75,192,104,224,1,1,138,228,224,25,11,140,154,224,22,17,
+224,104,11,178,187,237,143,2,224,202,4,240,41,7,106,49,130,33,82,86,
+97,15,137,3,226,207,4,224,210,12,128,2,192,34,224,208,2,235,237,1,
+208,71,64,22,71,105,103,124,67,49,235,127,2,224,220,5,224,224,4,224,
+28,22,224,243,3,128,28,245,227,1,96,2,240,240,1,224,67,14,224,65,
+8,241,2,0,224,8,13,64,44,160,218,97,67,130,29,2,56,48,52,65,
+53,226,23,5,4,80,97,114,101,110,194,23,192,100,128,70,140,252,128,52,
+2,79,32,35,75,104,161,109,161,31,0,50,106,196,71,204,228,18,3,162,
+155,96,51,70,38,193,161,169,47,169,71,253,244,0,225,105,4,223,204,2,
+85,32,35,152,207,224,150,1,224,2,0,241,241,4,128,239,64,71,192,235,
+64,8,236,37,4,161,252,225,238,2,193,70,128,75,132,118,128,137,235,191,
+1,128,146,3,79,32,35,49,75,219,226,101,0,128,116,64,50,96,223,64,
+35,224,223,1,96,215,163,64,128,13,111,55,228,215,1,224,111,27,65,83,
+192,82,1,85,32,229,108,0,64,12,96,141,0,53,225,133,1,65,159,108,
+122,139,118,0,54,105,109,192,44,138,194,127,25,91,199,96,59,0,48,236,
+140,4,96,10,64,4,161,177,104,219,3,64,95,55,49,96,70,2,66,32,
+95,105,77,192,192,164,97,64,127,226,67,7,2,83,116,114,242,244,1,194,
+27,164,216,224,59,2,226,127,12,228,151,3,226,86,6,224,51,2,65,106,
+0,54,224,188,0,3,95,49,50,56,70,243,137,140,173,63,174,1,235,204,
+8,175,76,70,253,65,3,0,49,226,145,2,128,75,105,139,71,8,138,220,
+68,233,68,114,0,54,82,89,1,95,52,95,239,177,236,64,132,193,65,0,
+67,161,183,64,19,225,176,1,69,33,137,143,64,79,138,205,199,82,225,250,
+1,66,160,231,78,7,234,18,0,130,55,64,128,0,56,74,232,134,117,65,
+195,129,219,227,7,0,231,78,15,96,110,237,49,16,64,128,166,116,128,17,
+101,92,230,54,14,3,114,101,97,100,225,157,0,128,46,64,61,239,188,2,
+128,61,66,18,238,199,0,239,138,10,2,101,114,114,137,189,130,142,97,187,
+130,32,224,107,9,0,32,124,78,3,101,102,105,110,138,146,64,0,226,167,
+0,128,4,225,222,5,136,195,140,3,2,75,32,75,83,237,224,249,0,204,
+195,64,33,139,255,0,75,133,85,109,124,168,218,225,140,18,173,244,221,64,
+244,86,8,0,51,142,29,65,27,132,125,232,43,8,228,185,3,135,194,232,
+126,0,240,115,2,232,6,0,163,44,161,83,197,39,98,222,65,57,240,30,
+2,224,92,4,181,58,167,42,225,205,14,6,116,121,112,101,82,101,112,161,
+84,192,120,1,52,57,67,22,79,112,228,27,1,160,87,160,128,96,83,241,
+101,15,8,109,107,84,121,67,111,110,65,112,224,87,1,137,178,224,55,29,
+128,52,145,67,227,210,0,132,58,131,70,224,30,26,6,95,57,56,51,32,
+95,57,83,164,242,81,1,226,45,0,130,44,1,56,55,231,200,1,66,12,
+141,245,128,228,195,159,234,242,100,64,43,226,47,10,225,209,7,227,174,2,
+227,196,2,225,231,21,5,99,111,109,112,97,114,178,249,70,34,0,55,76,
+137,129,149,160,153,235,107,14,235,117,4,249,62,2,96,234,235,15,0,128,
+5,245,93,0,167,239,64,22,201,165,64,49,100,108,242,252,3,240,253,5,
+0,83,184,122,247,144,4,134,121,229,212,0,176,58,228,95,25,1,60,62,
+234,215,1,160,140,96,48,2,53,54,57,224,78,43,225,64,4,64,0,199,
+75,224,53,20,1,69,81,192,48,200,104,225,173,0,225,26,1,97,17,227,
+110,6,224,84,19,1,76,84,233,153,4,224,79,8,75,13,160,76,225,109,
+3,224,82,19,0,71,192,82,161,152,180,73,232,47,22,160,37,224,29,5,
+232,168,2,227,111,0,229,157,8,231,98,5,145,68,1,75,52,96,195,230,
+224,9,229,187,13,66,191,227,174,208,1,61,61,227,169,0,64,38,104,84,
+99,182,106,71,230,168,2,0,67,227,190,3,171,218,235,75,0,227,120,0,
+237,25,2,64,46,237,38,7,227,133,82,1,38,38,227,133,68,193,23,64,
+0,227,128,28,2,84,114,117,227,179,0,226,205,22,226,198,15,232,227,5,
+227,90,0,227,176,34,3,70,97,108,115,192,133,128,45,227,25,30,83,3,
+116,197,0,66,87,178,87,180,162,183,97,254,78,32,2,95,49,53,85,2,
+111,132,98,8,193,252,140,112,96,10,235,13,1,164,38,100,35,130,114,231,
+9,5,244,187,1,99,107,92,22,0,50,199,81,64,50,6,50,54,54,32,
+95,50,55,126,11,1,53,55,149,200,4,95,51,50,52,32,184,0,72,252,
+0,48,181,215,64,4,128,0,64,200,148,112,152,118,234,200,27,64,137,227,
+117,11,227,108,5,129,154,65,113,99,94,164,29,161,183,64,118,0,54,213,
+158,2,49,56,51,72,10,128,54,253,166,8,11,87,97,114,110,105,110,103,
+58,32,99,97,110,138,106,4,114,105,118,101,32,97,178,227,127,0,129,15,
+184,160,224,66,8,4,32,121,101,116,44,128,49,99,45,225,91,0,225,218,
+2,64,145,204,78,130,109,64,25,64,9,0,49,129,194,64,32,204,31,12,
+66,32,73,79,46,112,101,114,102,111,114,109,73,203,165,65,182,2,50,32,
+95,122,88,7,95,51,57,57,32,95,52,55,172,207,0,49,160,22,96,68,
+0,51,229,27,57,115,97,129,174,229,20,0,224,31,3,132,216,4,64,95,
+54,56,53,96,202,160,65,229,55,3,239,147,5,225,207,12,232,114,12,132,
+205,224,13,2,211,147,164,168,224,2,2,229,124,7,224,130,1,224,2,6,
+243,42,0,128,110,243,40,2,243,110,3,192,218,235,140,7,241,71,0,197,
+212,129,192,188,247,128,189,66,178,164,214,249,166,4,172,40,65,64,160,234,
+199,247,96,149,163,155,164,131,102,43,205,11,0,54,224,211,1,3,95,53,
+55,48,163,122,239,252,1,129,59,160,168,128,165,224,5,0,230,100,26,1,
+116,111,215,186,96,194,230,104,4,224,207,29,97,90,230,110,6,225,110,1,
+224,204,10,132,242,196,141,224,216,12,229,110,14,96,57,238,89,65,128,251,
+12,58,32,111,117,116,32,111,102,32,114,97,110,103,230,39,0,164,63,97,
+231,231,2,2,170,223,194,34,225,86,16,6,101,110,117,109,70,114,111,225,
+88,1,161,14,235,37,0,233,246,3,198,60,135,21,237,25,16,192,83,1,
+84,111,160,164,224,255,3,242,147,1,237,173,1,192,195,227,5,13,224,215,
+3,131,67,224,203,22,1,84,104,244,14,1,224,83,14,236,7,0,130,61,
+224,17,7,247,86,0,196,14,195,100,236,31,20,96,22,193,55,164,87,224,
+110,0,194,122,162,240,224,78,0,98,195,224,126,1,241,98,0,128,233,225,
+98,15,0,62,200,90,129,90,106,119,231,53,0,224,17,7,192,151,160,183,
+102,193,163,172,192,176,224,27,9,124,165,0,90,80,33,0,56,243,146,0,
+225,199,8,224,144,1,1,120,49,225,235,15,224,35,2,0,50,232,86,3,
+193,53,64,7,4,67,32,95,53,56,68,87,224,114,6,226,92,19,2,104,
+101,110,194,96,224,106,9,64,9,228,47,1,232,183,22,221,87,132,24,137,
+224,71,158,65,123,64,31,143,106,3,85,32,75,51,113,48,0,48,170,114,
+202,120,64,34,140,20,129,72,235,222,57,198,192,226,76,0,230,158,32,226,
+189,3,230,172,1,224,16,0,224,13,13,128,173,224,93,2,230,170,13,224,
+48,3,128,2,198,166,128,51,198,165,230,162,2,193,10,130,215,128,92,230,
+147,0,94,76,230,147,2,224,81,1,0,82,241,198,7,160,23,224,52,20,
+4,66,32,82,32,64,130,69,226,95,3,96,5,226,31,9,2,109,97,120,
+126,52,226,63,15,2,109,105,110,224,31,2,226,63,6,119,19,138,225,97,
+139,244,78,3,128,243,64,20,106,234,129,1,1,95,50,64,11,234,111,9,
+230,91,4,128,104,226,149,0,0,50,174,49,133,191,0,90,116,230,165,202,
+2,52,48,56,211,67,224,152,7,233,233,8,0,67,234,35,9,167,0,1,
+53,53,64,159,128,171,228,47,7,96,128,203,206,129,100,162,205,120,137,192,
+138,231,90,2,232,162,0,226,154,3,64,205,131,113,194,89,2,95,51,54,
+67,68,0,50,201,128,194,57,3,95,49,55,54,199,80,197,26,0,56,97,
+64,161,79,204,36,68,28,160,22,106,185,0,55,65,15,128,40,3,67,39,
+32,89,128,146,0,80,142,60,96,92,233,23,2,239,54,14,96,2,224,37,
+2,0,66,64,70,194,188,229,182,4,154,228,224,50,3,128,47,128,121,224,
+206,0,192,52,128,46,195,3,142,243,195,108,96,190,1,52,53,95,39,128,
+10,100,75,130,45,7,49,52,52,48,32,95,55,55,141,19,64,14,111,70,
+230,105,0,153,42,1,49,52,244,42,0,193,53,224,97,15,225,34,2,97,
+237,193,229,65,99,133,105,64,9,226,137,2,225,101,0,160,13,228,9,1,
+66,24,141,30,0,80,129,145,0,95,139,76,185,190,160,14,160,20,96,45,
+0,54,96,45,0,83,96,151,109,138,1,52,55,194,189,99,72,193,47,108,
+89,99,190,115,238,224,155,1,224,250,1,64,78,140,146,0,83,149,160,233,
+226,1,3,95,49,54,54,141,233,0,57,64,241,128,43,140,157,0,85,229,
+49,6,246,250,7,129,195,241,22,7,161,202,195,199,96,157,246,187,3,161,
+132,1,56,49,190,107,64,111,0,51,166,72,241,133,5,74,19,0,50,160,
+56,1,95,49,77,61,69,33,238,225,1,241,179,6,64,122,128,21,224,180,
+11,0,53,89,226,128,181,165,90,193,244,129,95,3,64,95,55,56,207,75,
+91,185,194,235,224,7,17,128,55,128,43,225,79,1,199,145,0,64,132,229,
+225,29,4,98,217,104,31,194,33,192,0,163,169,228,161,19,228,159,6,68,
+156,7,97,32,99,108,97,115,115,32,100,157,1,95,56,162,158,80,11,79,
+178,100,171,0,52,224,79,0,82,11,177,74,97,89,99,3,192,237,225,182,
+0,243,7,7,98,126,228,197,1,210,138,150,79,64,5,64,4,78,212,192,
+3,226,22,1,111,70,69,12,1,95,49,129,90,228,238,1,66,117,80,89,
+160,233,66,17,0,85,223,9,66,56,224,26,0,227,68,6,224,92,0,229,
+13,5,64,162,161,123,1,49,56,106,23,79,65,0,49,97,2,97,10,66,
+228,162,110,64,0,66,114,232,187,3,2,80,32,35,188,237,97,5,2,32,
+64,64,64,139,64,37,200,193,98,91,5,32,67,32,61,61,32,190,241,224,
+150,2,96,246,67,44,129,69,160,69,168,45,224,9,0,66,242,156,163,128,
+90,136,249,128,128,96,211,227,103,16,228,167,0,229,118,0,235,29,3,128,
+2,229,134,4,192,123,239,74,9,224,55,3,224,27,0,134,55,128,104,224,
+143,1,129,8,224,46,16,192,28,233,45,5,224,107,9,192,82,240,78,4,
+160,16,246,8,6,230,7,1,98,88,67,236,195,254,224,71,1,3,95,49,
+50,48,97,22,224,101,1,237,114,3,131,3,224,132,0,104,225,224,161,0,
+147,74,228,141,3,136,79,69,34,224,23,6,250,78,1,224,121,0,128,70,
+239,135,1,224,187,5,98,148,227,57,1,99,86,128,228,132,182,224,201,1,
+128,197,136,50,251,215,8,96,0,192,190,231,40,4,243,43,8,162,20,226,
+112,3,65,2,232,38,4,192,70,160,32,224,29,5,224,28,3,224,25,4,
+160,43,227,192,0,98,187,67,32,3,95,49,48,53,247,165,2,1,53,51,
+224,187,3,224,15,6,224,43,4,131,65,228,21,4,99,99,224,67,7,193,
+29,229,52,4,64,125,67,196,231,189,7,64,23,220,8,1,49,49,107,58,
+238,240,0,3,95,49,52,49,71,11,70,53,160,84,1,51,54,82,194,1,
+51,56,164,248,66,96,134,162,230,145,7,160,47,245,91,1,198,15,64,195,
+100,165,224,102,19,135,79,224,96,10,245,160,0,232,129,4,162,159,180,124,
+232,24,2,3,64,64,64,89,233,146,0,201,143,163,123,162,25,228,145,0,
+231,143,1,224,170,1,137,89,225,227,2,233,137,1,227,133,2,168,212,0,
+67,197,125,192,146,231,181,7,0,58,132,189,101,12,78,105,130,190,64,21,
+138,237,162,67,0,53,128,250,108,110,1,56,48,104,140,79,246,2,95,51,
+49,138,206,192,142,2,95,56,57,107,216,167,149,64,71,137,28,5,95,56,
+49,48,32,75,168,122,224,1,5,180,155,64,0,224,28,9,128,1,228,115,
+0,224,37,18,224,35,4,224,32,23,64,210,225,170,0,64,165,0,54,160,
+237,130,29,97,111,193,144,64,59,65,69,249,192,2,1,95,51,65,207,138,
+144,128,253,224,25,14,96,91,214,52,224,134,3,224,11,2,192,8,97,169,
+64,47,137,165,2,83,32,73,128,131,164,111,69,202,2,67,32,60,70,167,
+64,40,224,157,1,230,191,1,128,77,247,98,4,242,165,3,100,185,236,159,
+5,227,184,4,98,218,180,67,241,198,2,98,198,2,49,56,49,113,120,241,
+221,6,224,82,46,160,78,193,32,0,51,226,106,2,232,93,1,0,52,130,
+91,198,2,228,117,2,128,64,136,7,140,241,0,50,72,117,112,76,129,122,
+136,30,227,105,11,233,211,3,142,68,185,139,181,24,67,93,227,92,1,64,
+24,224,57,1,64,1,67,136,224,243,0,229,157,1,99,109,227,107,5,224,
+222,0,136,146,133,40,163,163,224,79,1,96,245,232,34,22,128,2,231,156,
+0,232,52,6,110,129,226,243,4,232,14,1,232,39,13,224,83,1,224,89,
+1,232,124,0,161,201,224,23,1,224,61,8,160,62,224,29,7,96,2,238,
+209,9,128,0,129,103,241,185,11,224,16,0,224,192,2,224,42,0,162,59,
+128,0,193,58,96,105,225,65,1,224,81,8,145,133,161,10,65,156,0,54,
+68,226,226,127,3,229,231,2,143,102,199,69,102,68,64,55,3,95,49,56,
+48,153,222,225,212,3,224,236,6,245,143,0,128,105,101,117,145,138,224,41,
+1,166,110,226,61,13,192,7,201,68,162,138,160,57,247,146,12,64,100,0,
+53,74,169,232,106,0,134,91,215,105,241,232,0,224,172,3,234,69,2,233,
+81,0,224,91,33,209,6,160,87,96,69,163,23,0,64,228,239,6,167,17,
+131,124,128,0,224,141,8,224,139,1,130,65,129,124,224,5,18,143,180,235,
+172,6,135,128,135,160,212,137,237,127,7,225,88,4,226,126,6,227,46,3,
+129,31,224,18,3,194,68,225,242,5,224,60,11,243,220,2,226,85,0,128,
+2,194,91,162,93,224,250,1,162,197,160,151,66,105,249,18,6,157,219,0,
+49,237,248,1,249,8,0,185,9,160,131,143,142,225,176,9,232,145,14,225,
+236,9,248,55,4,64,112,96,44,249,195,19,192,104,96,12,230,9,0,225,
+36,3,224,2,6,193,71,224,249,3,225,79,18,245,119,5,225,94,86,130,
+180,225,94,63,228,31,20,96,148,135,29,225,116,8,206,61,224,55,0,228,
+51,57,64,38,225,184,0,228,66,49,228,67,8,224,12,3,128,157,212,156,
+96,119,224,116,3,232,43,5,192,53,193,11,129,118,228,62,6,64,152,2,
+52,57,55,229,171,5,228,152,26,228,118,16,128,66,205,244,224,47,0,72,
+61,96,162,98,51,107,207,73,164,246,238,2,6,114,101,99,83,101,108,69,
+252,138,1,145,181,1,56,55,144,78,242,252,9,0,55,64,182,167,239,144,
+92,128,181,224,37,1,3,95,56,52,53,241,231,2,2,103,101,116,215,75,
+224,74,3,64,63,144,65,224,42,1,6,115,101,116,70,105,101,108,87,123,
+0,58,130,46,224,30,4,13,68,97,116,97,46,82,101,99,111,114,100,115,
+46,83,224,43,5,139,196,224,117,4,224,30,3,139,155,224,74,14,2,72,
+97,115,224,43,3,0,54,234,197,2,65,73,186,20,2,56,48,52,128,31,
+234,229,1,192,29,160,7,64,28,212,120,225,204,18,227,85,10,64,57,202,
+27,107,14,175,121,234,247,7,97,131,97,109,234,248,11,98,115,243,206,2,
+227,72,1,247,11,4,96,152,233,136,19,224,38,1,224,106,5,160,28,195,
+225,164,156,214,83,248,46,6,128,5,137,178,233,64,3,117,226,224,101,3,
+99,245,224,13,0,230,250,4,129,91,2,49,56,57,239,96,8,224,56,11,
+224,90,1,224,112,3,224,248,4,137,249,227,235,2,97,101,193,60,227,243,
+15,232,253,4,165,45,233,105,8,254,172,3,239,84,5,160,56,207,87,234,
+117,1,246,97,22,229,125,15,224,190,3,202,1,160,240,229,30,0,165,43,
+161,252,233,173,0,97,91,224,56,0,194,163,0,50,68,19,101,141,64,142,
+244,121,6,128,184,174,42,181,128,245,125,0,196,106,2,95,49,49,122,83,
+64,15,0,54,113,104,97,21,0,67,133,49,100,115,228,87,3,164,68,246,
+11,3,5,77,101,116,104,111,100,228,135,2,64,89,224,180,1,1,95,54,
+65,31,165,62,240,85,32,250,129,1,131,21,162,129,236,195,9,96,173,67,
+226,174,89,64,73,1,95,55,99,219,224,125,49,101,105,224,126,28,96,0,
+224,87,3,0,83,192,87,198,248,224,92,8,163,172,130,90,231,56,12,96,
+195,249,241,1,96,0,244,21,5,100,118,173,179,65,194,1,54,55,135,166,
+0,48,132,202,133,221,108,152,90,70,0,56,253,37,3,2,100,102,108,101,
+213,64,39,214,7,228,83,16,96,205,161,36,160,160,239,230,9,244,107,0,
+224,28,6,106,234,228,23,6,64,19,246,190,7,207,163,206,194,163,14,163,
+121,69,151,244,171,12,225,157,1,232,118,7,224,23,5,193,187,1,55,57,
+148,78,244,245,10,224,74,66,3,58,49,55,57,134,253,96,191,225,88,8,
+0,54,65,116,228,89,2,167,148,146,148,96,61,210,212,178,210,73,133,114,
+205,1,55,57,242,205,2,64,40,242,181,14,64,168,192,95,224,1,9,239,
+32,0,96,0,224,35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,
+20,11,224,17,8,243,25,4,96,0,65,14,0,54,231,220,2,0,52,119,
+167,169,247,225,131,0,64,57,2,55,54,57,227,152,0,247,69,5,64,15,
+247,70,3,75,214,101,25,160,43,224,70,2,99,158,241,235,2,65,156,64,
+7,96,124,227,75,9,0,54,196,205,130,217,96,7,252,64,8,97,225,144,
+149,128,74,125,102,128,206,247,13,3,1,51,57,194,110,97,17,224,196,5,
+64,108,166,169,224,162,6,232,157,1,199,40,228,239,3,96,82,241,21,6,
+163,149,131,192,171,89,232,62,2,128,123,225,20,18,224,193,16,0,52,90,
+127,192,0,225,220,1,241,148,8,160,223,97,244,131,121,128,189,123,212,64,
+36,229,136,6,224,105,6,65,79,0,52,128,245,192,242,228,134,1,100,221,
+71,21,71,16,129,158,128,66,224,212,5,64,172,132,178,88,43,192,37,66,
+109,202,74,0,89,220,141,230,82,5,159,214,229,45,7,133,250,224,33,18,
+159,241,225,164,2,240,75,5,225,84,0,128,28,136,172,224,184,1,224,49,
+5,230,196,0,97,198,64,201,133,173,224,44,13,224,43,1,234,189,1,203,
+36,133,165,160,248,139,38,64,185,69,25,231,64,5,175,28,233,77,1,65,
+165,128,13,130,27,96,35,160,55,194,132,65,208,64,39,162,93,70,29,225,
+218,2,224,96,34,2,55,57,50,224,103,0,234,73,2,224,57,41,226,231,
+1,128,140,2,64,95,57,173,196,97,1,203,238,149,136,128,160,192,100,66,
+172,199,252,0,80,141,183,68,9,1,55,53,97,167,224,245,23,0,95,119,
+136,160,188,232,64,7,160,193,224,8,10,160,205,224,244,0,142,195,99,46,
+160,5,224,68,8,224,50,19,224,44,18,225,25,1,225,31,4,98,82,134,
+170,185,108,64,0,65,43,214,87,96,30,195,39,97,152,0,64,227,44,2,
+181,216,96,113,227,16,5,179,179,225,14,2,227,89,13,225,242,4,224,33,
+12,147,120,226,250,11,192,25,228,174,0,212,127,248,35,3,70,13,127,205,
+64,210,228,41,0,247,241,5,128,216,229,22,6,193,51,155,146,105,167,1,
+55,55,98,77,227,96,0,239,244,0,255,236,7,66,18,1,53,49,69,222,
+0,54,70,138,233,196,1,2,98,105,110,78,243,228,195,0,237,233,6,75,
+167,0,50,92,113,4,52,57,57,32,95,112,235,224,59,1,2,78,117,109,
+171,167,228,79,7,64,251,253,140,6,229,81,7,146,121,64,161,69,18,99,
+53,130,185,192,212,233,221,3,128,0,226,95,2,225,188,0,129,97,193,154,
+233,17,1,164,26,131,162,162,136,130,133,64,96,206,125,226,133,5,225,168,
+4,0,85,97,168,229,170,0,228,3,8,129,181,230,103,4,224,159,3,224,
+29,8,225,26,34,102,146,96,8,132,51,225,7,4,231,28,12,97,234,195,
+12,98,113,224,96,17,101,16,110,15,226,113,3,224,18,13,232,93,9,66,
+65,0,51,226,65,4,5,102,117,110,100,101,112,98,8,93,83,226,64,8,
+224,176,9,136,63,227,137,0,163,201,230,221,7,192,216,231,247,10,1,55,
+56,99,58,233,78,9,226,78,4,119,33,199,149,231,119,3,227,186,1,227,
+34,2,177,225,225,106,5,224,129,16,111,250,224,129,49,225,27,1,228,68,
+8,212,28,160,122,226,52,3,224,128,1,97,3,156,48,224,111,16,128,0,
+193,101,133,50,228,205,9,132,131,232,72,18,199,251,224,168,8,232,20,4,
+225,35,18,224,161,21,224,88,10,229,69,2,195,81,163,179,227,88,0,229,
+79,5,0,51,68,210,65,17,208,126,1,55,56,242,199,0,160,218,197,201,
+226,103,5,160,104,228,45,4,228,42,12,228,41,4,228,38,8,224,205,1,
+225,175,3,227,134,7,224,189,11,64,170,181,164,0,55,123,141,235,110,9,
+72,83,199,96,224,171,118,1,54,54,175,136,224,161,8,128,187,224,188,22,
+227,95,7,3,95,51,52,54,114,161,71,222,144,104,106,248,130,75,167,3,
+227,97,9,128,156,224,132,7,192,21,241,6,8,96,42,224,62,0,2,95,
+49,52,195,132,128,26,130,30,237,64,8,66,174,182,201,134,150,66,195,113,
+252,230,21,3,192,95,162,253,224,68,1,229,209,6,115,59,236,2,0,224,
+58,4,160,177,224,16,3,143,118,232,3,1,230,119,0,197,144,64,16,192,
+230,206,128,133,247,165,253,238,140,3,129,199,64,121,193,221,6,67,32,95,
+52,54,32,95,122,79,0,35,97,157,96,242,1,52,48,89,22,112,130,147,
+167,2,49,50,53,66,43,229,233,1,11,66,97,100,32,100,101,114,105,118,
+105,110,103,231,248,1,224,168,0,231,26,4,192,163,226,103,4,234,72,6,
+224,171,8,225,196,4,162,197,213,32,97,97,245,19,15,0,67,82,162,225,
+91,0,234,92,0,96,250,239,153,6,143,54,202,67,160,5,64,4,70,147,
+192,3,242,89,9,128,127,226,190,3,0,67,255,44,0,128,238,238,193,5,
+64,44,226,68,7,226,58,0,95,123,149,32,224,103,9,138,33,2,52,32,
+95,121,223,117,134,224,6,0,224,222,3,224,111,3,0,83,161,110,224,211,
+20,226,147,5,65,68,1,55,56,96,9,154,72,133,53,246,126,1,231,9,
+6,224,252,8,64,47,219,203,67,192,148,1,2,80,32,58,128,23,3,10,
+65,32,90,160,1,130,224,64,23,210,144,133,217,169,155,96,2,64,79,0,
+52,75,63,64,8,1,50,55,96,13,135,52,0,51,115,33,64,0,236,145,
+11,74,152,100,208,233,159,27,228,241,3,224,29,8,224,20,0,228,241,5,
+96,92,233,138,1,240,89,5,151,97,129,28,225,90,1,0,52,147,136,228,
+161,7,231,41,16,233,144,0,0,53,162,212,65,135,231,196,3,224,96,9,
+235,245,1,224,96,9,131,62,163,132,232,59,11,160,129,0,54,138,10,130,
+196,224,126,19,96,0,65,190,148,38,129,93,1,80,32,231,62,2,67,233,
+165,200,70,206,3,10,65,32,83,64,66,86,119,160,86,64,25,251,51,1,
+1,80,32,135,228,0,80,128,24,240,8,1,96,26,201,1,224,87,5,239,
+43,1,64,122,98,178,160,62,142,25,225,13,7,237,37,8,64,42,252,172,
+1,192,72,162,26,128,16,229,85,0,192,120,96,52,214,219,241,149,0,138,
+182,239,170,1,244,23,5,0,54,134,96,192,100,130,253,128,11,101,217,236,
+149,7,226,194,0,197,18,192,86,230,151,6,199,23,129,176,224,94,5,230,
+40,7,192,29,231,58,8,229,172,9,79,151,236,60,0,88,27,65,50,253,
+255,3,64,19,97,110,0,67,83,88,0,53,133,127,103,10,0,85,154,9,
+64,0,235,249,12,65,61,72,147,86,91,3,49,51,56,55,68,27,64,55,
+225,199,2,96,45,129,199,64,120,96,41,122,76,0,56,254,63,4,19,80,
+114,105,109,105,116,105,118,101,115,46,67,111,110,115,116,114,97,105,110,158,
+81,64,56,0,54,224,82,4,226,89,2,64,183,161,186,237,31,2,164,43,
+235,14,45,238,98,0,193,69,239,99,1,192,25,3,85,32,64,90,129,236,
+167,201,234,228,22,160,37,138,165,194,4,234,162,3,163,216,224,80,0,224,
+15,7,230,174,10,224,34,1,237,195,9,64,211,2,95,51,52,68,17,105,
+12,225,185,5,2,67,32,95,101,168,100,245,1,55,51,248,149,2,65,80,
+227,170,3,233,85,3,254,63,6,171,116,98,101,64,70,0,50,132,134,99,
+163,144,160,99,99,152,247,192,91,227,225,1,224,93,22,226,222,0,247,35,
+19,236,251,4,232,126,10,227,180,5,237,154,0,224,90,1,64,172,183,3,
+226,18,1,131,157,227,57,2,229,100,2,65,181,96,237,105,100,98,99,93,
+97,183,104,158,34,230,130,6,255,26,0,132,17,64,60,133,201,225,28,4,
+224,75,14,161,54,132,254,0,75,96,177,218,98,192,102,212,110,186,20,96,
+47,133,3,224,47,7,1,66,32,224,43,11,132,250,132,120,233,172,6,65,
+30,3,52,48,57,32,222,168,132,35,233,11,12,231,7,39,0,55,75,46,
+198,136,0,51,157,113,160,72,236,90,3,0,54,87,58,253,140,35,129,77,
+224,247,1,160,171,253,139,7,0,58,153,218,70,197,162,64,71,43,232,161,
+25,96,207,69,28,154,51,66,10,93,77,96,79,132,245,225,232,0,224,76,
+19,137,84,64,60,135,55,64,67,101,23,2,55,54,53,69,65,64,22,181,
+9,132,163,224,9,1,161,166,213,19,161,7,230,79,2,160,39,226,230,1,
+228,219,11,226,236,2,224,47,22,195,143,224,47,0,165,53,224,47,15,202,
+47,160,89,224,47,23,184,169,225,207,1,224,47,23,237,151,5,229,115,9,
+224,31,5,174,42,129,62,103,250,70,234,162,109,224,64,13,160,144,192,61,
+231,202,16,227,230,5,234,147,1,231,140,4,161,226,224,27,0,206,30,249,
+140,2,224,136,15,249,172,1,194,203,133,233,100,54,77,200,237,181,6,15,
+116,121,112,101,32,97,112,112,108,105,99,97,116,105,111,110,103,58,96,0,
+225,183,0,232,55,2,247,66,15,0,49,189,42,225,142,0,238,133,2,230,
+181,5,225,68,2,161,103,224,194,0,128,56,184,118,144,183,97,5,132,96,
+1,49,52,75,60,0,67,68,236,100,228,5,67,32,95,53,54,55,64,47,
+246,225,0,1,53,48,232,203,0,106,100,0,50,224,236,3,1,36,120,192,
+218,225,26,1,194,249,237,160,9,235,82,2,152,109,228,171,7,64,95,225,
+106,2,128,248,230,57,6,119,85,1,53,49,130,91,225,26,1,108,26,226,
+10,5,224,237,2,137,73,1,49,53,129,200,226,9,0,225,53,2,225,243,
+9,230,253,5,97,85,237,69,4,224,155,7,128,227,254,192,0,225,1,6,
+243,150,17,244,168,3,227,121,3,98,33,160,125,171,43,224,13,0,128,30,
+64,57,162,35,192,24,128,1,200,167,234,168,3,160,85,255,155,9,182,204,
+224,49,12,224,131,5,69,247,96,36,225,115,0,128,83,234,243,6,227,227,
+12,84,159,98,166,0,75,99,116,128,5,225,230,0,133,246,224,70,1,145,
+33,0,50,70,238,241,27,3,0,79,74,194,0,53,231,144,1,225,236,5,
+225,242,5,197,167,64,73,1,50,49,100,73,195,54,71,218,96,97,117,50,
+226,253,1,231,249,2,65,20,2,95,49,48,161,160,1,52,57,121,147,97,
+107,96,41,233,87,0,192,0,227,215,0,227,204,16,160,240,227,204,11,224,
+40,5,169,79,228,38,1,129,162,160,7,224,42,4,222,90,229,30,0,160,
+128,128,49,228,98,0,199,156,165,129,128,1,160,31,225,39,2,225,181,2,
+225,243,3,226,29,2,224,42,4,224,123,0,224,36,5,225,147,2,224,181,
+1,160,29,225,155,0,226,4,3,194,10,192,56,160,36,67,76,0,50,72,
+128,2,57,56,51,64,4,74,108,210,126,97,163,0,80,100,163,172,187,2,
+79,32,35,72,158,162,24,233,176,0,160,159,227,188,6,226,52,6,227,167,
+7,129,98,162,176,64,134,0,54,95,128,226,136,4,0,64,242,62,0,131,
+82,194,242,244,22,3,64,26,160,33,235,22,32,0,48,227,206,8,142,112,
+224,68,20,224,74,21,224,75,2,224,77,0,226,92,5,244,32,4,227,241,
+5,227,220,9,65,132,130,118,224,67,11,194,69,228,55,7,228,33,8,129,
+48,128,170,192,80,226,58,5,224,70,0,160,67,97,76,224,79,0,244,198,
+5,2,95,49,52,117,242,192,32,237,98,5,70,116,192,121,64,0,195,14,
+224,182,4,232,42,6,0,54,70,252,232,88,32,160,45,224,124,26,64,32,
+236,53,4,225,182,6,1,54,53,106,20,230,161,2,228,7,27,128,96,224,
+91,25,160,8,224,91,0,128,176,230,218,10,0,80,109,15,180,112,228,219,
+0,232,179,3,234,25,7,130,89,225,90,2,96,170,164,82,229,22,2,176,
+26,195,245,192,140,136,125,233,81,13,19,98,97,100,32,102,105,110,97,108,
+32,100,111,32,115,116,97,116,101,109,101,176,142,226,100,4,166,245,224,16,
+8,231,84,3,192,138,229,177,3,228,203,9,163,185,224,74,2,230,163,10,
+65,80,238,251,0,229,25,4,224,2,0,224,29,3,241,7,0,169,139,97,
+5,224,8,40,230,224,3,160,90,224,158,1,160,32,128,47,226,172,0,192,
+66,96,68,169,214,227,131,1,224,16,0,128,34,240,48,5,74,155,112,186,
+160,15,239,35,1,160,0,128,52,160,129,234,77,8,224,33,5,109,123,162,
+170,96,79,161,38,227,85,2,163,42,225,64,0,71,137,128,168,136,121,128,
+161,0,54,102,247,65,126,100,55,231,186,0,0,80,106,238,0,79,64,182,
+70,27,0,53,118,53,224,48,0,97,213,129,195,128,242,224,236,0,110,29,
+78,7,255,100,2,2,97,105,108,162,96,64,160,2,95,49,50,85,16,78,
+59,101,85,226,155,2,2,105,110,100,160,40,64,135,230,162,0,102,73,224,
+86,8,2,62,62,61,128,44,235,74,11,0,98,194,209,193,21,226,77,0,
+226,2,5,226,11,13,229,189,1,160,34,225,236,69,225,109,0,224,213,12,
+225,42,0,230,159,9,224,161,0,226,2,1,180,230,160,80,224,0,2,228,
+234,5,196,98,128,171,233,35,4,242,246,6,224,39,16,237,64,4,195,231,
+224,39,10,173,63,224,79,0,237,104,15,236,155,2,238,207,0,224,10,0,
+228,80,1,224,101,14,233,216,4,224,141,18,161,22,224,39,11,224,141,4,
+161,5,224,130,2,225,128,11,226,40,9,96,17,177,21,0,54,83,228,225,
+202,1,9,70,114,111,109,84,104,101,110,84,111,226,253,2,0,66,203,49,
+0,66,64,7,227,222,5,224,125,23,224,119,0,160,72,224,115,18,163,25,
+224,101,83,160,213,224,99,13,225,151,24,164,186,225,151,24,236,218,2,224,
+179,12,192,173,64,18,224,169,14,96,167,224,159,4,224,77,2,196,199,228,
+31,0,233,93,5,229,61,0,0,89,224,44,3,192,127,64,53,147,249,224,
+147,1,234,58,12,96,23,232,202,3,136,21,1,52,52,242,85,11,231,86,
+4,224,21,1,96,18,128,185,231,86,13,224,124,5,183,32,160,0,226,204,
+17,96,77,96,97,224,249,7,160,25,107,188,128,196,189,251,90,156,231,172,
+0,160,143,160,95,97,130,85,230,224,66,5,101,101,229,71,0,97,175,96,
+40,233,204,1,162,108,172,81,236,69,17,0,55,64,177,236,69,20,98,9,
+128,115,128,107,64,104,237,22,0,224,101,2,98,60,174,33,224,52,10,1,
+55,48,192,227,198,136,128,234,237,248,4,137,169,194,37,232,38,14,235,95,
+5,128,44,234,1,1,96,135,0,54,90,107,225,97,12,97,213,226,58,5,
+86,239,71,66,149,129,0,50,212,249,224,46,0,226,218,1,134,137,96,112,
+173,71,64,242,230,181,2,226,49,14,195,13,232,78,1,247,65,6,224,199,
+40,227,72,0,226,101,4,199,72,242,182,2,240,220,0,224,246,5,192,243,
+110,188,160,235,224,83,75,128,65,129,65,229,231,1,225,85,5,231,87,0,
+162,151,116,117,65,88,167,155,227,195,1,168,11,96,144,87,42,108,52,1,
+95,56,224,5,1,224,196,18,130,232,1,55,49,87,97,128,22,241,246,0,
+224,198,5,1,95,57,94,158,64,0,236,119,1,227,207,7,99,51,111,246,
+192,74,206,211,194,7,226,201,5,161,251,224,29,0,226,198,9,225,255,8,
+226,246,0,226,8,2,162,189,0,53,118,124,64,82,73,252,99,185,160,69,
+224,201,15,160,205,164,247,160,129,230,21,1,225,149,1,64,182,229,150,4,
+195,211,227,147,8,238,103,7,129,219,128,160,226,42,4,169,84,224,96,2,
+196,200,229,225,18,224,43,5,164,98,236,224,5,95,140,229,21,3,225,243,
+7,160,18,226,185,5,67,226,0,55,182,147,224,171,12,193,142,225,50,2,
+160,2,224,51,0,64,1,231,124,4,165,13,193,97,128,2,224,46,17,197,
+7,230,158,1,230,142,8,224,46,3,225,61,3,193,21,192,13,110,69,192,
+24,253,2,13,192,156,228,132,0,224,160,4,226,161,3,160,2,167,44,224,
+158,4,199,152,224,47,6,96,18,224,39,4,224,245,7,133,41,224,79,2,
+224,2,7,192,157,224,196,1,160,57,225,47,9,224,67,6,224,153,0,224,
+67,27,227,7,2,224,35,3,96,199,247,89,3,224,39,14,129,115,64,19,
+240,139,5,226,195,12,192,44,128,128,236,50,2,225,120,4,224,132,2,224,
+193,0,224,114,11,224,239,2,228,66,4,226,52,0,224,53,2,224,242,4,
+226,201,0,224,49,3,224,236,4,224,33,8,224,117,0,224,16,1,245,138,
+0,224,70,3,228,30,1,224,75,0,231,53,1,224,59,1,225,55,3,224,
+79,77,225,81,1,104,213,130,109,1,95,49,87,26,103,204,3,55,32,95,
+55,183,226,0,55,132,134,224,22,8,231,239,2,64,13,240,66,4,225,24,
+17,128,117,153,56,224,78,5,239,99,1,161,240,64,239,160,89,64,6,173,
+207,230,94,20,133,218,101,9,64,8,240,9,16,8,114,111,109,83,116,114,
+105,110,103,251,196,0,224,174,5,224,97,5,239,128,2,229,187,6,1,52,
+55,128,9,224,238,16,146,173,225,111,0,194,122,229,200,2,217,75,64,166,
+207,217,224,0,1,224,88,1,227,113,8,227,221,1,224,125,10,224,192,2,
+227,106,19,227,105,12,224,209,4,227,99,0,224,100,10,128,1,227,29,8,
+226,23,0,224,50,16,226,4,14,1,56,52,89,145,0,55,235,211,1,226,
+10,11,104,140,0,50,90,68,2,49,55,51,64,209,0,55,243,176,1,226,
+27,63,0,82,125,224,0,97,210,45,226,29,144,224,89,2,226,32,10,231,
+145,2,224,39,3,229,146,114,224,17,1,226,52,17,224,56,12,230,187,6,
+224,121,1,224,45,4,0,83,228,85,9,242,142,2,230,246,0,224,67,40,
+228,218,1,230,83,15,225,10,11,224,73,11,228,227,0,224,56,5,229,14,
+10,0,53,228,238,0,229,92,1,227,13,21,0,53,75,160,1,55,52,192,
+172,136,144,226,89,0,128,49,0,49,128,49,1,50,54,104,233,64,49,0,
+55,130,83,64,127,1,51,56,133,105,80,185,224,110,18,224,60,9,128,0,
+227,121,60,6,73,110,116,101,103,101,114,227,120,152,193,148,7,80,32,75,
+32,95,51,54,51,96,126,4,48,32,64,95,51,222,149,2,95,49,56,64,
+20,70,182,1,95,49,111,247,3,95,49,52,50,138,84,227,63,5,128,146,
+0,83,167,223,226,98,0,160,2,224,184,5,232,170,6,224,151,0,192,29,
+193,176,233,151,9,225,9,5,225,6,2,226,189,0,226,49,0,170,126,193,
+3,183,40,226,35,3,0,51,172,67,224,122,20,233,37,8,224,122,62,228,
+215,2,250,207,0,81,115,250,220,1,192,100,96,112,192,109,66,217,245,235,
+2,64,27,233,65,1,226,68,10,0,54,115,20,205,159,225,153,0,131,15,
+160,242,192,95,96,66,234,65,8,224,132,10,192,7,225,254,1,64,96,112,
+161,248,100,1,224,55,2,228,177,1,224,106,1,0,83,77,124,1,55,57,
+67,237,0,54,246,126,1,161,60,224,38,4,0,57,178,111,232,13,4,238,
+54,6,0,54,145,107,224,171,6,160,210,224,42,2,2,83,32,73,184,189,
+129,50,193,229,131,27,242,25,6,0,85,65,204,64,67,0,95,112,53,105,
+187,1,95,55,96,42,2,95,49,52,144,159,192,235,227,9,2,195,116,64,
+0,128,19,252,55,8,29,95,32,99,97,110,110,111,116,32,98,101,32,117,
+115,101,100,32,97,115,32,97,32,118,97,114,105,97,98,108,101,164,55,224,
+189,9,110,208,0,52,101,40,115,172,0,56,126,158,225,65,1,128,132,242,
+92,8,194,211,96,209,0,90,65,119,130,97,82,162,64,56,240,54,6,217,
+122,224,220,1,3,95,51,52,51,100,245,91,5,224,197,1,6,116,99,69,
+120,112,114,58,192,203,7,104,97,110,100,108,101,58,32,96,190,64,132,123,
+51,96,92,100,68,0,52,96,93,244,101,4,160,82,4,79,32,35,51,50,
+182,80,224,45,0,230,243,0,224,50,4,8,58,49,55,54,53,32,64,10,
+65,97,220,86,71,226,92,12,130,199,228,139,6,230,236,2,224,49,2,226,
+42,1,228,150,6,239,58,6,228,204,30,230,241,0,225,117,1,192,33,240,
+67,19,193,113,128,27,228,133,8,224,31,6,226,225,0,226,115,1,0,55,
+239,234,0,224,64,12,160,150,192,60,231,231,4,224,109,9,224,108,9,99,
+8,163,122,228,101,15,192,85,128,56,196,150,163,207,160,104,228,94,7,224,
+144,0,118,50,182,243,118,211,224,130,3,224,134,0,230,117,2,232,253,4,
+224,38,1,228,87,10,224,52,1,228,244,2,192,58,224,55,2,196,104,228,
+105,2,228,108,19,224,58,0,230,17,3,160,91,228,114,89,225,80,2,226,
+218,3,175,96,96,209,225,214,7,166,237,224,180,2,192,38,233,188,10,76,
+198,227,234,1,8,68,97,116,97,46,70,117,110,99,76,82,1,46,36,232,
+217,0,0,82,192,8,160,141,226,140,8,64,25,67,205,0,50,137,197,64,
+104,89,171,163,223,248,110,1,224,38,31,225,157,1,227,93,1,225,157,5,
+244,65,2,227,40,21,68,74,0,52,100,74,100,132,69,13,72,251,1,49,
+52,65,117,64,28,0,51,228,103,0,132,105,230,129,6,150,146,226,213,0,
+228,93,7,227,80,4,243,197,30,192,56,226,81,8,169,86,224,112,3,162,
+203,250,122,1,250,194,12,224,57,1,192,59,245,80,0,237,49,3,232,238,
+1,200,123,224,74,9,163,128,228,11,1,237,114,7,245,130,13,195,252,140,
+73,0,52,65,10,134,98,2,95,49,49,204,216,227,212,0,224,63,6,66,
+20,0,54,73,42,2,95,49,52,118,204,2,95,49,53,131,124,251,144,4,
+224,144,1,105,118,225,240,0,103,46,0,53,65,238,128,13,94,43,0,80,
+220,184,64,141,1,55,54,249,238,4,192,77,161,97,98,48,225,243,5,96,
+95,251,234,1,226,121,5,0,55,76,83,64,0,225,51,8,128,12,228,115,
+0,161,24,192,2,98,91,225,109,7,162,114,96,0,228,243,5,129,208,224,
+39,1,224,20,2,224,68,5,252,214,1,224,114,8,224,138,0,199,30,197,
+25,231,38,4,251,120,1,128,36,225,157,4,64,26,224,73,2,224,87,0,
+97,155,138,246,1,52,51,203,184,229,81,4,226,52,3,253,57,4,237,110,
+7,109,103,247,191,2,4,66,32,95,56,57,90,98,1,49,54,165,61,253,
+243,1,227,67,8,224,92,6,224,98,10,224,94,7,64,176,250,186,2,96,
+206,226,218,1,192,2,161,105,225,104,2,227,120,6,225,170,0,233,133,5,
+205,28,225,201,7,160,52,230,22,5,192,22,230,30,4,129,112,3,95,49,
+53,56,68,225,128,71,226,210,4,233,225,2,225,168,4,224,59,0,193,172,
+128,113,225,169,0,96,0,163,68,2,95,53,54,70,122,174,45,0,67,169,
+197,128,0,2,95,54,49,143,46,236,27,5,64,1,197,148,192,75,225,46,
+5,225,26,5,225,70,3,225,72,4,225,7,4,225,137,13,255,99,0,194,
+176,226,164,2,239,63,14,224,97,0,131,140,160,231,255,68,9,184,226,225,
+69,0,160,28,227,226,4,0,52,230,135,2,236,236,1,255,58,6,70,59,
+0,50,102,59,2,75,32,89,96,121,67,202,128,131,104,13,226,92,11,226,
+11,12,161,3,199,164,136,221,0,52,111,156,96,240,232,60,5,71,49,227,
+16,0,192,240,131,71,233,86,6,224,225,29,160,224,64,206,0,49,135,39,
+2,49,53,50,73,89,91,38,64,21,0,48,167,32,161,82,251,162,14,224,
+31,3,240,78,1,64,93,0,57,128,223,98,139,101,142,0,48,114,3,76,
+11,129,70,78,234,96,119,1,51,55,70,47,0,55,65,16,64,22,0,56,
+224,22,6,0,51,128,22,0,55,224,22,5,82,2,64,22,0,54,96,22,
+232,204,1,15,80,114,105,109,105,116,105,118,101,115,46,87,111,114,100,34,
+128,37,140,85,224,83,1,160,60,168,33,1,54,57,106,82,82,152,85,178,
+67,216,1,55,52,114,171,102,95,64,20,0,52,96,33,97,62,0,95,96,
+66,65,7,245,223,1,96,38,64,81,136,86,224,81,0,103,15,1,55,52,
+101,48,192,67,102,178,243,123,2,5,57,48,52,32,95,53,73,29,96,105,
+0,53,65,88,224,31,19,65,128,224,31,16,67,196,8,54,57,51,32,80,
+32,95,53,57,64,162,0,53,224,194,0,96,56,109,187,224,221,4,114,248,
+147,152,137,142,0,48,80,197,224,22,11,131,16,224,61,4,96,111,128,34,
+2,38,49,46,64,185,1,38,48,96,6,224,39,6,128,28,224,27,14,96,
+21,192,27,65,68,131,95,9,95,49,49,48,32,95,51,50,52,32,100,145,
+128,9,64,35,64,34,194,179,224,34,0,64,24,224,34,5,130,192,67,84,
+64,108,67,148,96,209,3,64,95,54,57,64,5,224,88,0,64,44,67,88,
+66,70,1,47,32,64,12,130,129,4,85,32,75,32,75,65,33,64,18,162,
+125,0,52,96,238,66,33,0,56,97,248,142,200,226,52,1,224,19,8,0,
+52,224,38,5,88,62,225,50,1,224,18,1,0,57,224,38,9,1,50,49,
+225,125,1,226,115,4,225,149,2,96,154,0,54,163,168,65,177,96,34,0,
+64,106,23,2,95,57,48,69,229,64,33,162,253,160,188,103,99,0,55,71,
+12,64,6,0,53,128,6,3,54,32,64,83,130,83,0,52,96,106,111,207,
+161,147,114,185,224,181,3,68,195,108,83,0,54,128,245,224,43,2,226,16,
+9,192,25,160,14,64,28,131,209,64,35,97,102,200,13,96,140,1,80,32,
+128,40,128,162,162,27,160,73,0,64,69,112,0,80,160,20,196,122,192,211,
+96,8,67,5,0,95,174,26,192,82,128,22,64,21,2,95,50,48,236,186,
+1,96,130,131,174,3,105,116,111,102,97,248,162,120,66,155,0,57,100,174,
+0,55,142,108,144,221,2,49,55,51,66,56,2,49,55,51,131,207,0,51,
+153,226,0,52,64,173,0,53,68,251,160,39,0,53,224,51,1,64,84,130,
+170,2,102,62,61,96,98,130,149,1,102,62,64,12,64,64,64,12,0,60,
+96,26,64,85,96,13,96,12,130,112,3,102,110,101,103,96,14,129,228,1,
+102,42,96,12,129,207,1,102,45,96,12,129,69,1,102,43,96,12,236,213,
+3,194,13,230,142,0,226,22,3,226,29,1,69,144,3,10,65,32,73,96,
+63,128,171,0,85,66,247,0,65,160,30,198,7,1,80,32,112,58,0,85,
+97,187,0,50,128,185,96,21,68,45,160,21,229,186,7,0,50,128,22,128,
+203,241,41,3,135,45,103,22,241,122,1,241,68,20,200,201,167,69,224,210,
+0,241,2,5,160,30,238,25,0,212,208,230,189,3,236,93,1,184,111,224,
+87,19,212,241,224,87,48,130,167,192,220,192,25,204,47,205,195,225,25,6,
+224,248,3,135,70,241,16,1,224,32,8,138,83,224,32,18,208,208,224,220,
+8,192,24,136,47,249,95,2,184,4,224,27,0,102,52,1,51,56,100,50,
+0,53,71,144,224,44,3,238,85,1,224,73,10,224,28,0,224,159,18,129,
+42,224,32,18,128,141,224,192,10,192,24,224,192,9,200,231,224,27,11,202,
+124,224,27,11,249,70,1,245,73,0,66,193,0,54,131,100,232,101,11,2,
+73,110,116,136,100,64,59,224,36,4,113,87,186,46,4,95,84,121,112,101,
+192,12,160,47,163,185,224,84,11,5,70,108,111,97,116,87,160,39,131,212,
+224,87,6,9,66,121,116,101,83,116,114,105,110,103,96,85,3,114,110,97,
+108,224,19,2,160,57,131,218,138,9,65,89,139,200,140,24,2,95,56,55,
+133,143,152,191,64,46,199,84,163,190,65,187,64,22,164,178,224,167,11,2,
+67,104,97,160,205,64,44,164,122,67,37,225,172,1,1,95,49,70,221,235,
+20,5,239,90,6,1,48,55,192,141,128,29,234,249,3,139,184,64,96,132,
+92,202,110,141,43,135,28,1,53,54,128,169,0,49,132,104,154,241,107,72,
+139,161,139,42,66,80,226,127,18,131,254,235,160,2,101,203,187,44,96,29,
+244,202,1,235,114,6,96,26,128,57,3,95,49,50,48,68,11,160,55,179,
+127,163,235,137,175,105,135,1,95,56,224,94,2,187,125,130,117,203,150,84,
+15,224,204,5,135,41,224,159,11,0,85,132,70,224,192,6,137,18,219,237,
+224,162,0,244,11,6,1,49,55,128,131,160,40,224,139,2,128,134,235,58,
+5,0,53,66,36,64,22,130,188,238,27,1,65,230,1,51,32,167,161,78,
+177,228,218,5,97,250,160,128,96,156,132,23,226,46,1,64,1,113,20,226,
+39,2,110,15,98,0,174,20,130,29,97,119,116,67,224,0,3,207,119,100,
+172,239,156,2,89,159,128,108,128,137,206,91,242,144,7,160,91,240,50,2,
+210,163,76,201,128,8,0,53,224,224,34,132,73,224,224,3,210,13,224,225,
+47,238,222,0,109,83,3,95,49,54,53,181,12,237,153,4,224,193,2,65,
+219,137,56,96,10,170,203,0,49,172,163,72,126,64,22,161,208,132,43,2,
+85,32,83,227,28,5,66,20,226,85,4,130,176,98,165,1,85,32,80,142,
+2,54,56,57,227,190,0,160,163,224,44,0,109,47,224,44,1,0,67,80,
+210,176,206,96,116,132,113,74,119,0,66,119,71,0,83,65,1,230,254,9,
+229,248,8,96,21,0,85,97,147,66,149,1,50,55,162,179,224,40,8,102,
+7,0,85,226,165,1,238,195,4,1,51,54,228,119,4,129,167,0,90,131,
+71,226,31,7,206,194,128,48,238,199,0,228,175,8,2,95,49,48,123,119,
+192,0,224,28,3,64,241,201,78,240,55,5,145,48,128,117,226,197,0,130,
+82,160,100,128,1,230,249,1,198,196,135,55,208,108,228,222,5,208,78,192,
+102,252,111,20,1,49,50,107,249,109,28,0,64,252,206,2,4,102,99,110,
+83,34,225,219,0,198,76,128,154,192,150,244,59,5,171,152,110,104,69,12,
+227,91,12,64,27,137,180,164,154,193,253,0,85,64,183,242,226,3,64,60,
+254,152,3,160,114,224,35,4,224,152,0,83,50,224,33,0,1,50,49,75,
+253,177,200,245,235,2,64,25,152,140,0,79,131,127,160,36,221,29,130,161,
+97,80,220,233,2,95,49,54,153,160,224,102,1,161,233,162,206,194,213,161,
+1,64,1,106,45,225,211,3,164,156,226,131,3,0,53,76,3,224,51,2,
+128,116,225,83,6,66,123,97,169,225,149,4,0,68,193,149,228,24,4,194,
+10,245,235,1,100,43,1,53,54,170,201,225,191,3,96,110,243,98,14,244,
+74,0,225,106,21,195,88,97,186,80,149,161,55,128,124,224,249,1,224,77,
+1,0,67,64,15,224,179,0,203,4,183,123,129,179,161,153,161,142,193,96,
+99,112,128,5,224,240,2,224,49,17,230,153,1,225,237,26,225,214,23,227,
+35,11,64,0,193,231,230,4,5,97,10,96,229,195,145,64,25,83,20,96,
+190,215,157,0,58,147,20,233,54,2,194,39,64,70,67,33,187,50,225,176,
+4,230,182,7,97,223,73,67,227,104,0,227,102,4,97,30,160,108,137,66,
+224,108,2,195,17,128,67,70,25,226,33,10,231,39,24,64,126,99,28,224,
+126,8,104,107,102,120,160,129,206,10,231,21,3,64,51,0,55,110,142,224,
+123,23,67,133,64,231,224,103,8,234,37,0,64,135,74,37,161,128,70,34,
+131,255,224,104,1,69,17,224,118,5,130,137,65,249,137,209,64,71,136,246,
+66,192,134,77,64,77,128,174,227,192,6,234,188,2,226,13,0,195,195,180,
+250,139,0,224,103,0,128,18,128,209,160,153,224,83,3,109,108,64,231,160,
+86,64,167,0,54,100,131,246,137,4,118,106,143,210,1,49,54,169,179,64,
+113,129,199,192,146,160,32,1,55,48,96,51,64,216,137,184,2,90,32,90,
+96,169,64,17,208,52,0,89,228,57,0,163,148,98,194,104,134,247,14,1,
+160,216,228,102,9,225,172,8,129,203,96,58,224,188,8,228,239,2,101,37,
+226,9,0,160,90,225,53,3,224,114,0,162,23,67,61,64,9,96,13,246,
+248,3,64,203,172,241,160,188,65,71,64,111,0,67,224,153,3,239,179,5,
+0,54,98,157,224,188,5,3,95,49,51,53,83,202,0,52,174,70,225,247,
+9,99,204,0,53,82,13,1,50,54,77,74,81,37,224,41,17,247,23,0,
+1,95,52,96,142,233,164,7,0,48,224,61,2,229,110,9,100,232,66,224,
+249,173,3,96,236,137,61,224,185,5,0,50,104,152,132,142,230,108,7,1,
+54,57,103,113,229,193,0,165,149,224,15,0,113,126,160,132,77,76,65,1,
+236,254,1,106,48,229,86,1,236,215,2,4,67,32,95,55,56,140,76,86,
+248,64,7,195,116,96,56,2,50,50,50,181,106,160,72,98,141,129,41,0,
+54,125,250,96,11,3,66,32,95,54,90,128,224,244,0,1,95,51,101,110,
+0,51,130,51,128,163,251,119,4,129,46,1,53,54,64,123,128,30,69,193,
+64,21,69,229,190,129,100,174,79,156,197,240,133,212,226,4,8,0,75,226,
+1,16,225,147,5,0,95,254,156,2,192,0,226,162,0,65,167,224,168,10,
+73,137,116,52,130,110,166,198,224,85,2,225,49,3,0,95,78,235,0,95,
+141,158,160,89,163,154,140,120,199,86,229,64,0,164,156,225,112,0,73,37,
+227,95,10,131,218,235,30,4,194,79,224,44,11,231,197,0,224,61,2,238,
+100,0,224,66,1,203,247,224,53,0,192,69,224,70,15,227,230,4,202,206,
+241,119,0,224,67,5,128,219,228,100,5,130,181,230,181,0,239,82,0,96,
+32,239,151,4,224,0,0,155,150,227,208,1,67,60,139,136,3,85,32,75,
+52,160,2,84,240,64,26,98,194,227,87,8,130,15,0,53,87,75,161,165,
+230,231,5,98,191,139,210,128,174,226,9,1,161,171,230,21,0,171,157,68,
+149,0,51,68,61,161,233,128,86,209,162,128,196,225,43,3,166,138,163,106,
+0,66,67,29,150,246,68,22,234,25,1,16,103,101,116,83,117,112,101,114,
+67,108,97,115,115,101,115,58,32,106,38,82,205,88,180,200,184,193,98,172,
+239,235,97,9,64,7,128,125,64,121,171,4,68,1,79,0,65,101,1,53,
+52,242,67,0,160,217,89,106,112,253,237,230,2,96,72,164,57,224,0,5,
+97,147,230,87,0,65,118,182,61,2,56,55,50,88,20,170,20,230,55,0,
+97,103,0,90,64,30,230,71,4,64,56,246,95,2,237,229,10,100,96,162,
+59,98,85,194,70,130,149,161,149,98,79,232,122,6,255,226,6,163,215,1,
+52,50,128,22,135,95,97,34,67,222,96,120,0,52,123,20,164,32,224,15,
+7,97,72,2,49,52,48,243,123,1,224,203,3,225,193,1,30,101,120,105,
+115,116,101,110,116,105,97,108,115,32,110,111,116,32,97,108,108,111,119,101,
+100,32,105,110,32,112,97,116,83,236,4,32,98,105,110,100,147,231,160,0,
+224,189,1,96,144,231,136,2,103,75,232,78,1,226,190,11,225,73,0,0,
+54,129,130,2,49,51,54,78,233,80,24,112,244,190,8,98,128,226,134,8,
+227,36,2,128,232,224,94,8,176,199,229,36,0,224,157,3,161,62,105,135,
+138,253,224,187,5,98,106,70,211,175,114,64,13,135,67,0,53,161,85,224,
+110,13,64,185,136,234,90,215,194,231,162,236,227,216,9,0,51,94,141,224,
+163,0,242,66,6,160,98,0,51,94,108,96,11,0,67,67,74,81,61,0,
+51,94,173,1,95,51,139,56,131,208,4,53,32,95,56,57,73,128,191,0,
+160,84,224,213,2,162,51,224,96,2,224,93,0,224,88,14,239,17,6,193,
+173,137,184,0,90,131,173,137,205,0,54,74,9,171,97,227,202,3,65,19,
+64,29,177,112,241,105,5,226,242,1,230,32,8,197,221,128,30,230,32,5,
+226,16,0,162,230,1,49,49,126,57,231,191,1,129,236,114,167,234,143,0,
+231,165,0,106,87,164,37,166,48,229,33,0,227,192,5,0,54,224,57,2,
+168,213,243,223,12,224,149,0,224,62,4,233,106,2,96,141,233,140,0,65,
+19,249,179,1,224,62,0,224,176,6,226,182,14,68,87,140,137,152,67,148,
+41,0,56,229,18,1,96,0,243,28,6,65,128,209,255,0,89,237,217,0,
+230,39,1,231,208,1,68,249,239,65,2,160,2,224,229,2,225,187,0,182,
+194,199,63,229,4,1,160,48,224,42,8,170,67,178,101,224,33,12,234,245,
+1,0,83,161,115,192,25,147,200,0,75,241,85,1,129,179,231,205,7,192,
+64,81,203,229,251,0,236,87,0,224,81,4,105,8,96,41,98,10,224,9,
+1,64,0,167,60,224,170,0,224,253,15,224,139,1,243,13,3,225,79,2,
+224,112,2,129,138,64,23,66,117,70,100,168,157,225,123,1,233,33,4,160,
+91,192,48,228,67,1,128,216,128,50,97,204,0,80,96,185,176,137,0,53,
+67,11,128,200,250,73,0,160,72,102,216,224,189,2,66,128,225,84,5,162,
+85,128,48,225,208,23,132,102,226,34,1,224,32,8,136,93,241,136,1,224,
+32,8,195,62,227,253,8,247,164,9,206,221,228,38,12,225,240,6,163,215,
+165,82,225,250,8,170,239,224,50,3,224,87,8,181,231,0,75,67,238,226,
+113,0,226,23,3,128,67,226,17,9,128,42,226,60,0,224,39,15,176,153,
+225,249,12,224,27,2,64,199,234,253,4,169,117,160,30,226,10,0,226,83,
+9,160,225,226,150,1,160,55,138,145,128,28,0,82,224,220,4,233,216,16,
+7,112,97,116,86,97,114,115,32,169,207,0,50,64,36,102,116,160,209,112,
+55,72,135,165,136,1,95,57,112,21,170,74,96,112,0,58,100,143,198,31,
+234,224,13,228,245,0,227,72,0,176,249,231,17,6,2,95,51,54,229,102,
+3,1,53,54,132,130,101,9,230,235,19,64,42,64,144,230,210,6,64,154,
+170,0,2,49,53,50,64,64,0,54,64,196,64,22,201,222,229,50,0,66,
+229,229,24,1,64,63,229,64,5,129,246,130,111,133,70,239,16,1,204,75,
+162,13,227,86,0,224,17,2,229,91,15,160,68,224,121,5,224,54,16,239,
+171,1,224,54,3,228,200,0,224,54,16,167,241,230,119,1,241,105,1,239,
+159,2,224,51,5,166,194,128,47,226,198,7,224,28,2,228,192,2,0,90,
+64,34,2,95,49,54,91,213,170,141,227,97,3,224,75,14,160,156,192,75,
+228,201,0,225,106,1,161,137,66,139,1,50,55,96,46,128,176,84,252,3,
+52,32,95,53,177,41,96,48,77,46,96,229,65,147,0,80,245,162,1,84,
+51,2,54,32,79,105,249,0,48,165,69,64,170,64,158,204,86,225,23,0,
+219,45,96,113,69,75,250,100,4,236,103,0,0,54,205,100,232,100,0,230,
+140,20,64,34,234,169,8,120,167,192,206,226,189,4,225,43,1,160,89,138,
+132,95,92,232,13,1,225,54,1,164,150,244,229,14,99,209,65,79,129,89,
+233,200,1,232,218,7,244,123,14,228,169,1,232,178,6,83,136,224,47,4,
+128,49,227,235,3,224,149,5,237,0,4,130,46,251,235,3,225,8,8,252,
+176,2,224,213,5,233,103,0,226,30,1,224,241,4,96,21,76,166,233,64,
+1,2,95,49,51,169,97,239,107,8,224,102,0,225,170,0,224,236,8,128,
+78,101,6,1,49,52,206,1,225,191,43,130,195,192,0,227,254,9,192,80,
+228,50,5,195,72,195,244,235,97,2,128,138,160,178,226,123,2,225,83,2,
+161,150,224,88,0,238,212,10,252,186,2,224,132,2,160,56,224,16,1,136,
+67,162,241,139,144,224,76,7,224,46,3,128,61,192,44,224,2,3,224,126,
+6,226,213,1,193,125,230,42,3,247,42,2,239,66,7,101,124,192,49,241,
+254,5,137,38,226,93,5,168,110,97,197,117,104,235,92,2,224,182,1,225,
+204,33,237,146,0,192,64,228,226,8,161,186,199,181,161,231,224,139,1,251,
+192,8,227,131,2,224,37,1,227,179,1,192,15,224,239,5,64,100,224,239,
+15,129,81,135,72,1,49,53,94,48,65,72,0,50,85,137,64,118,116,70,
+197,70,224,199,0,241,192,7,163,81,227,254,4,2,53,49,50,79,212,224,
+61,1,117,36,255,189,5,224,78,0,225,24,9,167,6,224,212,3,227,118,
+7,228,160,7,1,54,56,196,112,131,133,207,188,175,189,224,119,2,225,177,
+3,239,125,7,96,28,64,66,0,54,64,21,192,51,100,142,100,33,192,0,
+231,221,1,160,69,231,166,27,255,71,5,192,64,160,45,227,229,21,198,80,
+228,128,0,128,167,224,60,3,235,98,6,192,152,225,89,5,224,27,2,227,
+249,4,224,10,0,225,139,8,227,33,8,64,1,229,109,10,225,86,24,160,
+238,229,218,7,112,143,0,56,98,112,0,53,167,243,226,80,9,101,98,252,
+7,3,193,143,117,131,1,53,48,197,108,248,207,7,227,154,5,129,60,79,
+138,185,27,128,6,64,130,2,57,56,51,74,197,64,135,224,0,5,196,166,
+228,118,6,237,240,13,195,207,225,42,1,249,22,8,0,56,74,249,161,57,
+180,46,225,130,3,161,217,229,196,2,97,229,192,22,160,25,160,26,231,53,
+7,225,101,2,128,168,231,70,8,129,35,0,53,121,105,131,244,1,50,56,
+64,138,64,4,128,31,225,65,3,66,61,100,153,0,80,101,199,97,45,109,
+32,128,41,192,15,152,40,161,70,0,53,128,18,150,224,64,0,161,159,160,
+0,226,96,10,217,245,1,85,32,255,113,0,230,252,5,226,237,2,224,250,
+2,161,93,231,8,2,224,100,4,230,86,0,192,59,224,47,8,128,107,224,
+144,10,192,24,103,239,226,137,7,3,95,49,54,52,228,197,8,192,143,130,
+44,192,13,199,16,64,1,227,171,0,143,187,229,163,6,64,75,180,115,200,
+58,126,205,0,55,249,154,1,106,212,1,57,32,245,186,2,5,110,101,103,
+97,116,101,245,149,1,235,98,19,224,158,2,225,83,1,192,146,119,77,141,
+192,161,120,195,197,226,227,1,243,118,6,224,107,15,193,119,231,194,12,161,
+150,232,93,18,192,164,227,184,4,231,217,11,103,163,234,144,4,226,183,3,
+73,181,128,146,236,103,5,206,33,224,155,9,84,215,224,65,28,96,106,239,
+51,13,5,116,99,80,97,116,58,119,68,7,104,97,110,100,108,101,100,32,
+97,156,68,2,111,136,96,98,116,18,79,57,254,165,6,160,78,2,79,32,
+35,66,6,172,134,160,45,245,220,4,103,174,100,87,170,48,133,27,72,214,
+108,160,77,131,226,45,10,1,61,61,162,41,236,158,1,224,128,5,78,253,
+0,54,207,20,0,48,193,148,239,26,2,151,155,170,34,131,23,92,103,100,
+80,128,40,101,83,1,49,50,135,40,133,175,96,57,151,27,3,85,32,75,
+51,128,15,0,51,246,24,0,96,2,105,49,195,36,137,124,228,241,4,234,
+65,6,192,41,130,194,65,159,70,60,109,176,93,87,225,197,1,144,247,64,
+112,150,167,234,221,0,193,33,93,31,195,103,0,49,223,46,1,52,49,194,
+102,96,41,216,47,102,158,66,251,64,79,150,217,66,34,1,53,48,87,131,
+163,4,226,63,1,64,36,149,125,163,110,195,73,100,127,224,237,9,224,16,
+4,64,201,0,58,101,183,64,64,225,212,19,2,84,114,117,132,0,64,46,
+144,209,224,46,19,3,70,97,108,115,224,47,1,208,234,156,74,229,103,1,
+232,135,7,253,82,2,232,231,1,232,172,34,224,46,2,224,43,10,240,79,
+36,66,187,234,26,2,224,47,8,252,219,0,133,136,224,37,0,225,132,1,
+224,130,11,226,87,3,224,81,7,224,27,2,203,47,79,45,104,118,215,204,
+225,5,1,229,255,3,129,71,64,40,248,170,13,230,83,5,219,197,224,231,
+8,101,108,168,100,155,208,228,56,13,225,229,1,2,66,97,100,251,186,0,
+253,143,2,228,71,1,65,252,0,54,97,252,206,50,129,26,161,252,224,13,
+4,224,2,0,64,56,225,254,4,128,18,128,233,161,82,178,255,193,13,234,
+124,8,108,138,96,0,192,34,225,169,0,192,14,128,139,132,20,68,46,232,
+17,0,224,49,1,225,221,5,192,126,198,47,96,133,233,22,6,225,122,2,
+192,2,164,215,224,69,3,97,149,165,83,90,9,128,60,192,23,109,28,164,
+115,96,16,0,54,240,224,1,64,12,64,167,233,9,0,160,0,64,87,129,
+42,233,146,1,64,19,244,221,6,65,31,0,66,245,183,1,225,46,1,97,
+175,96,238,0,90,123,121,200,144,224,36,9,101,91,228,250,8,192,0,65,
+251,1,50,32,102,211,165,212,130,11,254,218,2,225,77,5,231,193,9,240,
+154,0,225,133,8,224,16,1,99,28,224,151,4,0,95,110,6,1,49,54,
+69,161,226,160,1,94,79,232,182,1,224,81,17,233,63,3,128,95,65,74,
+227,56,5,0,52,233,135,0,224,39,1,227,254,11,240,10,3,225,242,2,
+230,89,5,242,204,2,229,176,1,70,17,161,136,236,95,6,101,177,200,39,
+224,111,0,139,249,225,70,13,0,53,184,123,192,167,240,76,8,224,123,0,
+128,133,167,28,130,131,252,200,6,64,97,167,247,165,241,224,0,2,225,10,
+8,192,241,160,149,225,17,2,226,140,4,98,136,0,89,105,250,66,66,64,
+31,251,150,13,64,49,229,109,0,194,148,225,254,2,161,158,226,119,24,96,
+160,182,33,99,86,3,55,52,32,95,132,251,235,208,2,160,0,193,19,228,
+151,3,225,193,5,234,58,4,242,32,5,129,71,0,89,192,13,160,212,132,
+181,225,137,6,179,243,225,51,2,96,16,228,104,10,224,5,10,226,160,8,
+245,7,2,224,85,1,128,1,226,167,1,228,159,5,224,100,0,239,4,5,
+240,133,6,224,73,11,224,254,16,226,247,1,69,184,160,6,224,49,6,225,
+200,0,224,91,1,141,117,224,249,5,130,147,250,149,0,224,10,3,98,138,
+230,185,1,96,0,192,70,129,85,192,172,224,182,2,193,203,224,161,7,227,
+162,11,248,5,2,193,190,224,193,7,236,45,14,243,209,2,227,118,5,227,
+115,0,138,74,225,172,2,128,131,224,45,7,224,205,3,224,0,6,231,62,
+1,253,72,0,80,108,3,54,32,95,54,96,83,161,71,133,198,107,51,0,
+53,160,26,229,187,8,100,120,0,48,224,180,0,236,102,2,16,111,111,32,
+109,97,110,121,32,97,114,103,117,109,101,110,116,115,165,75,224,49,20,2,
+102,101,119,224,48,8,232,71,5,112,3,72,26,139,231,2,95,53,49,70,
+81,96,145,140,240,64,27,139,201,100,28,227,244,10,134,139,225,47,4,190,
+107,163,238,64,66,139,252,105,23,74,233,76,240,0,55,140,240,64,29,139,
+169,0,75,161,70,232,156,1,162,155,224,11,8,194,59,138,95,224,13,1,
+165,69,234,214,4,192,37,224,39,6,224,75,0,224,25,3,230,37,4,224,
+34,8,170,79,224,69,2,160,88,226,2,0,224,23,0,224,105,3,226,50,
+1,224,31,3,252,37,0,227,116,0,232,53,3,224,24,6,64,1,226,122,
+0,224,154,1,192,92,228,70,2,160,23,162,177,192,8,72,216,72,170,147,
+6,0,57,93,6,192,98,224,77,3,70,107,227,88,6,129,120,192,85,64,
+71,0,51,69,180,0,83,96,82,0,52,64,10,219,10,231,16,0,192,95,
+82,43,0,57,79,75,2,50,54,56,109,53,144,233,128,97,0,79,201,79,
+0,54,66,111,239,114,2,128,61,96,57,192,81,137,94,240,109,8,229,55,
+3,96,73,66,122,128,237,0,50,109,188,129,31,109,234,107,181,241,27,6,
+224,71,1,71,236,0,57,66,154,196,110,224,25,15,129,18,64,107,142,236,
+0,51,67,201,186,69,224,57,4,224,146,41,64,57,224,109,4,224,12,3,
+224,38,1,225,176,2,97,173,160,112,136,47,96,105,1,56,48,167,74,147,
+222,67,166,161,171,103,90,213,217,161,131,98,16,1,49,53,82,114,72,82,
+3,51,50,52,32,160,33,170,212,106,99,128,11,160,211,0,56,115,235,0,
+51,147,236,232,148,2,116,95,97,236,111,64,104,156,2,95,49,52,192,185,
+2,85,32,75,202,180,0,50,180,77,64,228,1,54,54,105,28,228,25,3,
+78,163,160,113,224,21,3,0,56,192,21,74,90,64,163,68,57,143,147,224,
+39,3,80,119,196,87,175,140,235,105,27,234,5,0,129,158,233,253,2,230,
+183,6,241,10,0,167,26,224,78,6,224,43,4,64,8,74,207,227,160,4,
+224,96,4,224,46,8,195,117,192,13,96,11,192,8,230,126,9,233,108,24,
+0,58,129,97,97,36,67,181,0,49,80,161,234,190,1,0,85,131,6,66,
+197,113,80,142,223,161,230,128,61,144,97,234,16,0,134,224,225,75,7,211,
+144,128,201,194,230,98,232,244,206,0,150,118,159,160,194,134,162,3,146,108,
+65,193,176,204,184,27,64,6,64,5,66,80,0,51,98,161,2,49,54,54,
+104,105,64,46,0,54,96,46,230,242,1,13,80,114,105,109,105,116,105,118,
+101,115,46,61,62,34,128,82,134,215,128,230,245,121,11,0,85,224,164,26,
+64,71,135,3,225,147,14,64,32,134,225,128,32,0,80,195,68,224,36,7,
+134,232,160,34,139,189,0,80,128,167,130,200,2,83,32,83,162,170,166,93,
+64,42,240,182,5,137,103,224,33,18,201,159,134,108,224,33,12,135,151,129,
+249,0,83,98,245,224,30,4,98,25,163,23,236,172,6,230,29,0,226,246,
+1,96,76,0,85,97,181,112,112,0,50,124,63,1,54,53,129,77,249,190,
+2,65,187,225,246,0,233,210,0,160,115,161,139,162,140,224,72,0,97,143,
+129,174,192,60,224,37,14,239,193,0,233,199,1,128,255,225,64,7,160,221,
+236,225,7,64,54,224,90,15,131,81,224,90,0,225,3,8,128,83,0,85,
+228,68,0,224,63,3,69,53,101,9,2,54,53,57,250,131,0,96,35,250,
+217,5,1,53,48,187,165,160,96,225,150,8,0,49,178,44,225,150,11,227,
+198,2,96,22,64,168,225,144,6,0,52,98,23,224,197,0,1,95,51,103,
+121,128,42,128,0,226,83,18,132,171,128,20,225,81,8,100,41,192,178,224,
+25,4,96,209,228,43,8,96,21,174,2,240,220,11,96,145,226,80,7,0,
+54,251,173,6,226,89,17,142,168,224,16,0,130,227,225,73,4,142,204,224,
+95,5,0,57,123,149,224,85,17,167,120,224,167,3,193,20,177,169,227,41,
+7,224,52,0,226,130,9,225,48,16,103,22,227,98,9,129,16,225,226,25,
+123,114,225,226,1,224,204,3,226,218,11,68,149,225,58,5,224,100,26,141,
+233,224,100,2,227,113,3,228,50,12,96,66,249,61,13,9,100,115,69,70,
+105,101,108,100,115,32,244,179,11,69,23,135,194,165,49,131,103,133,49,67,
+77,96,25,69,73,67,83,0,85,128,22,215,16,96,198,238,69,0,3,95,
+49,51,53,102,74,69,167,64,0,193,100,239,193,2,238,65,3,67,174,154,
+243,72,219,238,140,1,161,30,224,42,2,64,83,135,51,224,245,4,64,138,
+230,206,0,1,51,54,224,65,1,64,61,0,57,66,200,1,49,52,107,39,
+64,40,0,54,224,179,0,212,114,128,11,145,224,96,130,151,213,225,62,6,
+3,101,110,117,109,173,214,64,70,134,235,193,43,97,149,161,43,134,189,72,
+1,199,190,229,24,10,102,89,224,26,12,134,82,226,177,13,226,178,14,194,
+179,140,60,97,79,133,160,227,94,2,203,111,174,47,128,33,229,156,18,224,
+36,4,229,132,9,96,191,0,85,99,137,224,37,0,228,181,17,98,74,224,
+210,12,228,207,0,224,94,4,96,21,100,89,160,91,228,161,8,100,152,228,
+65,7,224,136,1,238,214,3,228,16,11,228,98,11,192,24,228,98,0,1,
+54,53,66,121,236,199,1,227,114,0,224,24,7,225,105,5,104,234,66,8,
+200,165,0,89,222,229,192,143,185,239,239,26,5,131,69,224,170,10,230,155,
+0,232,163,19,224,207,11,192,25,96,181,224,73,1,224,245,16,96,154,242,
+14,4,225,83,0,205,100,94,162,249,154,9,166,88,161,220,254,200,5,224,
+82,10,254,143,2,160,119,0,90,164,21,245,251,5,159,165,246,242,4,65,
+114,255,198,4,128,119,149,197,160,71,96,4,239,3,0,0,90,64,127,77,
+120,98,50,0,75,65,184,239,27,0,129,231,130,75,0,64,89,12,224,27,
+3,64,0,227,65,13,225,237,9,97,238,189,2,65,219,208,162,247,19,0,
+230,93,4,224,235,9,97,92,246,104,6,96,222,226,199,1,226,41,1,160,
+9,130,4,226,55,2,253,195,7,101,62,97,181,1,52,57,255,199,3,100,
+226,148,78,128,71,78,220,90,12,224,56,1,169,17,182,193,232,84,8,194,
+51,236,128,1,165,221,162,225,141,118,0,57,88,153,243,234,0,230,168,8,
+243,76,16,91,93,13,115,101,99,116,105,111,110,32,102,105,120,105,116,121,
+243,126,2,2,53,48,50,248,232,3,1,36,120,128,27,147,104,0,56,106,
+60,161,142,139,228,215,103,195,107,225,145,14,128,30,225,149,6,195,108,70,
+15,0,55,64,210,209,126,195,14,135,158,134,60,225,187,4,96,29,96,170,
+224,152,3,224,182,9,225,228,57,128,203,225,227,6,162,96,99,163,214,19,
+227,160,0,161,212,225,214,16,160,84,239,36,2,100,60,224,21,6,224,60,
+30,64,58,249,243,8,85,151,226,28,4,128,174,227,251,4,225,115,9,224,
+0,1,226,57,87,233,6,1,232,213,12,73,12,64,0,224,215,3,225,152,
+6,194,31,236,116,2,96,228,65,23,246,183,0,148,125,224,100,5,197,31,
+225,73,0,161,75,224,13,0,251,177,7,227,86,7,128,21,132,242,160,14,
+100,7,146,123,228,91,1,100,4,1,49,54,122,97,64,7,237,15,1,199,
+143,193,172,96,8,66,96,64,42,96,142,191,36,227,211,7,0,58,98,132,
+104,251,96,51,226,204,10,102,232,224,13,5,160,174,128,2,160,14,227,9,
+13,0,89,225,21,3,103,85,225,10,3,129,78,241,55,0,64,5,71,47,
+128,58,131,97,129,18,245,96,0,128,36,96,117,166,100,73,59,1,52,57,
+65,34,147,51,96,5,255,31,0,224,184,2,224,2,3,192,29,192,130,199,
+159,224,2,0,214,99,225,154,0,238,110,3,99,222,129,142,0,85,81,22,
+129,32,161,5,169,155,128,58,65,249,224,7,7,101,161,227,35,6,224,9,
+0,224,165,2,250,112,2,160,252,96,86,224,210,6,96,17,194,47,64,92,
+65,225,182,22,161,4,225,107,0,226,189,2,224,229,3,160,99,183,172,224,
+113,2,97,24,1,85,32,71,100,224,72,2,162,15,96,35,232,86,7,225,
+235,3,193,91,248,3,0,224,26,3,224,143,4,219,115,225,173,15,129,10,
+224,66,9,226,132,0,224,127,14,224,106,0,96,170,224,35,21,128,1,169,
+114,192,0,233,236,1,96,2,128,178,226,154,0,160,14,224,50,4,224,88,
+15,0,67,98,56,224,0,3,224,234,14,224,2,3,224,246,0,64,0,228,
+130,9,253,106,16,193,217,128,122,225,231,0,130,35,128,181,2,95,49,51,
+97,212,227,129,0,147,226,71,128,0,64,155,106,224,227,0,85,138,224,42,
+6,116,116,1,54,52,102,8,64,44,190,164,64,65,192,22,64,8,232,54,
+0,224,125,1,162,84,253,127,1,226,232,5,224,173,2,225,74,2,161,98,
+192,44,224,62,4,128,166,225,32,6,224,181,12,252,111,1,96,223,225,13,
+0,96,186,225,13,23,224,225,13,91,162,224,220,2,227,13,8,160,190,227,
+166,13,96,16,154,1,170,237,252,120,3,8,95,52,48,57,32,95,52,49,
+49,105,9,231,2,1,28,97,109,98,105,103,117,111,117,115,32,111,112,101,
+114,97,116,111,114,32,101,120,112,114,101,115,115,105,111,110,167,57,226,92,
+10,161,83,96,127,64,228,129,57,96,21,224,244,1,88,229,225,33,2,224,
+213,10,224,176,42,9,98,97,100,32,112,114,101,102,105,120,224,168,11,228,
+251,2,3,95,51,50,50,239,186,2,14,92,34,115,114,99,47,77,105,99,
+114,111,72,115,47,70,104,25,9,46,104,115,92,34,44,54,53,58,55,192,
+64,219,20,250,38,4,97,214,171,45,170,236,1,95,55,71,45,204,158,163,
+65,129,28,247,210,1,0,52,76,104,0,54,81,135,192,0,0,80,89,136,
+79,87,96,167,165,234,1,64,89,100,83,64,230,229,40,3,233,85,1,177,
+23,69,226,64,79,185,111,64,45,138,56,128,113,96,122,192,115,202,147,1,
+54,52,85,10,254,129,5,1,49,54,238,181,2,208,47,64,229,169,168,171,
+247,100,96,64,139,198,147,64,34,0,80,192,180,130,138,193,200,96,183,242,
+170,1,128,7,193,62,224,63,3,225,28,0,224,34,1,225,7,1,161,29,
+186,231,160,21,72,81,146,98,77,206,99,34,0,35,152,189,64,197,184,189,
+104,211,106,18,81,180,225,244,1,5,110,101,103,97,116,101,97,220,64,48,
+0,54,96,48,1,65,32,64,11,145,187,0,90,65,66,64,14,145,176,0,
+75,96,26,207,179,193,19,132,27,171,71,64,32,223,62,0,65,128,59,140,
+101,2,95,52,56,99,6,139,15,143,156,64,178,156,79,110,34,206,41,128,
+24,64,11,252,123,0,224,24,9,160,49,142,113,1,95,51,74,235,164,42,
+64,115,202,159,0,89,165,162,98,62,227,167,2,225,163,1,240,77,11,227,
+183,0,248,140,20,79,190,162,41,226,152,13,128,41,244,106,14,10,103,101,
+116,65,112,112,67,111,110,58,32,244,107,11,160,99,167,33,0,85,128,191,
+64,218,67,88,211,156,2,55,50,53,225,246,1,253,54,7,202,174,3,67,
+32,95,55,211,217,74,203,65,154,0,50,65,200,64,52,192,73,235,194,9,
+127,160,193,50,101,125,123,1,1,54,51,66,152,64,61,0,54,138,199,123,
+236,224,214,1,3,118,97,108,117,98,81,224,18,1,2,116,121,112,130,99,
+224,18,1,3,107,105,110,100,224,18,6,3,115,111,114,116,64,18,64,90,
+244,56,1,245,51,25,102,83,129,105,224,12,1,2,95,49,54,184,236,109,
+38,75,138,236,196,5,164,154,131,115,238,207,7,66,199,139,250,85,23,236,
+252,5,128,160,180,191,228,12,0,68,224,170,204,233,241,4,162,52,128,59,
+231,49,0,226,84,19,128,145,159,157,64,129,234,84,0,194,96,226,94,0,
+247,238,4,90,150,197,72,224,43,10,206,67,224,96,0,140,229,65,38,194,
+38,98,166,225,142,2,9,101,116,83,76,111,99,69,120,112,114,196,31,65,
+13,81,189,96,245,210,78,129,97,0,50,197,211,96,78,128,98,0,54,119,
+173,224,98,0,192,20,131,207,128,20,64,84,252,130,1,235,189,7,196,82,
+96,38,208,170,179,6,64,35,164,110,64,102,96,26,129,8,0,56,104,136,
+0,58,128,97,160,89,241,130,0,96,83,200,134,237,76,1,64,8,3,95,
+54,55,54,221,116,193,204,228,41,1,224,12,1,224,25,0,3,95,53,50,
+50,67,130,129,64,96,19,177,225,224,25,4,163,124,160,6,67,180,64,8,
+65,1,199,227,199,229,128,10,228,37,5,9,117,110,100,101,102,105,110,101,
+100,32,135,130,97,110,103,106,224,42,8,196,71,0,56,233,18,0,98,135,
+140,105,96,228,72,67,237,187,3,128,33,224,126,0,192,13,224,86,5,233,
+1,1,168,4,165,28,167,240,224,49,10,160,136,168,27,128,39,160,149,160,
+14,2,79,32,35,65,247,103,166,98,21,73,232,128,33,71,236,0,80,104,
+1,232,56,1,194,18,232,61,0,95,124,234,237,4,128,0,160,220,65,251,
+217,117,228,154,3,1,91,93,96,151,224,229,2,4,79,32,35,57,49,238,
+24,0,225,194,1,224,219,0,166,62,1,80,32,233,110,5,64,55,0,51,
+244,13,2,224,82,2,224,40,8,232,143,1,163,154,224,97,3,128,0,64,
+176,133,139,0,83,66,91,3,95,54,53,57,68,230,5,48,32,64,95,55,
+57,75,2,1,52,57,144,75,64,13,106,44,0,83,65,203,192,175,71,216,
+107,41,64,49,0,35,71,197,97,85,0,56,64,121,1,95,56,126,135,128,
+99,0,54,195,191,203,184,241,84,5,1,52,55,66,21,128,203,113,81,238,
+195,4,236,3,1,241,198,7,98,205,0,49,131,55,231,97,18,1,95,52,
+145,180,225,47,0,229,219,5,1,54,50,230,248,1,129,38,103,129,224,111,
+6,96,53,1,49,52,191,92,226,233,0,231,125,1,161,97,224,17,6,251,
+76,5,96,20,64,254,1,51,54,70,79,156,86,192,158,229,59,0,134,58,
+127,36,234,32,4,226,239,8,21,110,111,116,32,112,111,108,121,109,111,114,
+112,104,105,99,32,101,110,111,117,103,104,163,5,67,240,74,161,2,95,50,
+54,83,141,236,174,1,230,118,5,107,51,1,48,51,97,204,0,51,64,41,
+196,136,224,42,9,97,202,135,33,167,17,1,54,32,128,93,1,49,54,122,
+230,64,15,1,49,54,92,131,231,43,0,64,50,134,179,90,143,0,90,160,
+47,0,56,191,108,64,29,133,219,106,93,64,14,133,149,66,89,0,51,88,
+162,130,218,1,49,54,90,248,224,248,1,3,66,111,111,108,198,28,66,206,
+1,10,65,225,21,2,4,68,97,116,97,46,64,33,6,95,84,121,112,101,
+46,34,128,87,253,62,4,106,226,156,17,0,49,133,172,135,64,226,50,1,
+2,49,52,49,66,21,65,137,0,53,64,59,2,95,49,55,124,220,226,165,
+22,221,65,226,222,4,0,53,226,126,0,194,92,194,95,226,27,3,130,189,
+226,25,4,64,134,65,61,203,135,64,66,163,68,64,5,224,101,2,96,167,
+73,160,226,49,5,227,23,4,143,46,227,66,3,232,25,1,226,177,1,164,
+255,64,182,0,54,128,117,227,104,0,229,170,0,246,14,14,173,8,103,225,
+228,120,0,97,163,67,163,168,182,128,229,227,200,5,128,83,1,54,49,205,
+6,99,210,0,85,102,237,97,147,0,32,163,34,224,123,8,143,171,65,169,
+64,53,129,101,244,247,8,64,183,2,10,65,32,229,223,11,160,141,131,206,
+131,119,0,48,105,122,1,49,54,187,160,128,65,0,54,192,190,0,79,101,
+66,3,49,50,49,53,220,99,64,42,66,41,0,75,130,77,131,30,160,151,
+0,50,193,20,75,42,96,45,64,126,128,10,64,44,131,24,234,105,11,0,
+52,127,200,128,240,226,36,1,65,147,67,109,174,38,96,176,226,3,3,228,
+215,6,64,127,225,94,0,224,98,15,231,86,0,226,145,9,129,110,64,114,
+107,203,230,56,0,225,134,8,149,187,161,43,131,207,224,111,15,72,19,129,
+205,224,217,8,137,192,224,56,9,0,53,124,215,195,31,226,57,2,129,186,
+247,198,2,234,102,0,224,40,5,64,123,225,10,3,235,118,6,64,255,64,
+193,76,198,132,150,128,90,224,64,1,111,139,98,161,96,150,240,137,3,160,
+6,0,85,230,55,1,225,66,3,193,61,239,189,0,226,202,2,225,109,6,
+2,95,51,54,224,112,0,95,92,1,52,54,72,153,192,144,96,234,255,97,
+0,225,141,1,225,229,0,251,194,9,224,19,5,194,52,65,161,197,98,172,
+9,100,83,64,161,225,32,15,235,16,2,160,33,154,167,228,92,5,164,98,
+225,64,1,224,28,10,228,181,5,225,224,0,0,54,224,180,3,204,206,192,
+49,235,50,0,64,2,224,39,1,128,136,128,1,226,193,1,64,205,233,58,
+0,169,229,195,238,64,147,229,178,1,160,64,136,45,160,59,165,110,164,243,
+246,240,6,224,117,6,224,150,0,228,203,4,96,137,64,74,129,10,129,229,
+0,52,77,181,153,35,224,152,22,136,65,64,143,142,9,224,132,4,65,235,
+134,21,238,24,3,111,158,177,155,96,0,225,62,6,245,100,8,163,172,129,
+55,201,45,160,9,128,147,162,232,155,153,235,211,4,128,1,154,244,129,226,
+232,232,1,192,2,244,129,3,224,32,0,201,195,237,14,0,192,99,228,87,
+3,224,26,0,96,115,218,16,234,176,3,224,131,1,176,158,224,84,1,224,
+133,1,224,219,0,128,192,160,203,224,92,5,163,243,251,116,1,97,68,97,
+151,3,95,49,53,52,252,190,0,131,48,136,97,0,79,75,141,0,54,73,
+74,102,33,1,50,48,163,225,108,16,64,28,203,14,137,65,2,95,56,52,
+102,36,137,7,64,39,65,175,224,39,16,0,53,81,63,96,39,108,74,224,
+39,17,141,49,64,8,64,21,224,39,18,142,4,1,49,54,76,22,160,205,
+96,194,68,70,178,220,1,53,57,64,116,199,171,64,234,137,38,227,115,1,
+64,26,129,113,250,55,5,130,89,161,163,225,249,2,160,43,96,17,226,105,
+2,128,1,227,250,10,67,26,128,0,224,38,1,230,25,6,0,54,112,146,
+96,0,232,252,2,236,31,8,233,115,13,230,221,0,224,51,35,224,139,0,
+229,212,14,0,54,66,1,224,145,0,227,112,3,164,160,224,63,1,169,59,
+195,69,64,10,65,191,228,212,3,225,86,3,225,102,1,225,15,2,164,37,
+229,85,6,134,82,224,41,6,131,0,251,5,0,64,19,229,66,4,224,106,
+0,227,52,13,185,31,117,176,165,9,224,11,3,224,191,1,207,199,128,60,
+225,70,3,105,67,231,147,7,234,180,13,2,95,49,52,192,51,128,1,230,
+195,6,192,253,130,71,64,122,204,153,224,42,5,64,13,0,57,137,107,0,
+67,105,107,1,57,56,233,158,0,248,49,2,192,0,160,186,84,246,0,57,
+105,135,0,48,209,175,67,173,64,71,206,194,163,68,64,34,138,192,225,237,
+3,229,247,4,229,12,3,108,62,131,89,64,18,0,79,64,80,254,4,0,
+225,193,4,225,141,0,64,1,133,85,224,71,13,65,5,0,79,97,152,254,
+77,1,0,90,76,43,0,51,96,131,228,169,0,65,155,244,30,0,64,166,
+230,211,0,111,223,135,237,226,179,2,225,124,1,160,29,180,21,163,112,226,
+30,0,243,209,3,224,28,3,64,179,243,25,0,129,132,160,225,64,173,0,
+80,240,127,4,224,74,10,168,220,224,73,37,160,215,200,132,224,204,182,99,
+219,132,104,247,190,4,1,95,51,108,85,131,62,131,168,160,118,224,40,14,
+224,120,0,195,213,160,48,2,95,49,51,84,17,99,57,128,15,79,227,81,
+245,199,88,228,158,1,228,168,2,128,0,96,187,163,65,66,94,0,54,235,
+219,14,1,54,48,64,253,88,113,234,196,3,171,142,224,178,9,227,187,1,
+152,92,235,183,0,179,109,165,165,97,64,224,12,4,192,4,193,124,64,121,
+99,168,2,51,53,48,135,155,114,187,105,112,112,141,128,15,224,24,6,224,
+0,6,1,95,56,99,196,64,223,215,254,131,64,64,93,132,95,97,56,230,
+188,17,128,32,65,91,198,25,166,56,2,95,56,57,96,137,2,49,52,49,
+83,88,168,137,96,106,237,251,0,2,49,51,53,155,35,0,56,71,168,3,
+49,54,48,50,89,71,143,11,64,40,173,79,5,56,49,48,32,75,32,65,
+84,193,40,224,118,0,224,1,7,235,37,2,224,37,16,224,35,4,224,32,
+23,224,29,20,224,26,17,224,23,14,224,20,11,224,17,8,224,14,5,65,
+36,229,197,6,65,26,215,193,0,89,165,77,97,184,108,204,232,137,1,167,
+59,192,79,138,55,231,217,2,96,13,230,159,2,227,212,5,161,176,224,62,
+0,133,164,224,173,1,171,10,224,65,3,224,68,9,206,84,224,55,9,195,
+171,64,62,96,233,166,27,132,215,164,25,199,149,233,228,3,176,172,155,120,
+96,17,102,189,93,144,230,35,3,224,0,3,138,240,1,52,52,152,53,128,
+8,65,68,138,220,74,252,1,75,52,115,162,64,1,0,75,227,39,0,64,
+34,138,20,243,97,6,5,67,111,101,114,99,101,128,6,2,105,98,108,91,
+104,0,58,135,48,231,40,1,161,134,168,211,128,250,206,59,96,11,225,119,
+15,234,21,10,225,106,0,128,1,193,200,224,30,10,224,85,16,234,71,0,
+224,85,22,231,132,2,65,127,104,127,75,161,69,27,216,192,128,0,167,160,
+64,248,136,33,225,36,6,84,129,13,76,105,116,115,46,75,110,111,119,110,
+83,121,109,98,116,184,64,47,183,119,225,40,140,194,246,225,40,76,0,54,
+163,181,64,1,241,237,11,169,228,192,105,224,34,2,224,44,2,0,50,89,
+198,0,83,163,58,242,181,10,0,50,138,200,67,37,133,87,0,52,71,234,
+165,87,101,108,158,177,2,64,35,49,102,187,230,149,4,101,177,238,24,1,
+225,40,0,161,37,134,28,187,77,241,97,1,199,136,224,185,0,129,50,225,
+225,5,233,133,0,224,5,7,209,56,192,60,192,1,235,252,1,224,28,8,
+224,149,5,228,109,8,224,77,11,225,199,0,64,0,164,108,224,2,4,192,
+108,224,52,5,229,187,12,64,22,236,105,0,224,77,13,224,56,9,226,114,
+3,102,245,156,157,224,36,1,224,58,7,224,17,8,224,14,5,192,157,133,
+15,0,53,91,28,64,6,227,22,2,236,41,17,108,89,243,199,5,96,0,
+226,185,0,224,143,74,101,81,99,10,115,130,86,24,72,21,0,75,66,192,
+159,114,101,135,192,12,64,43,255,242,1,192,2,241,214,11,162,63,224,38,
+3,128,2,67,143,237,55,1,192,159,224,168,0,64,157,162,242,226,202,9,
+192,47,128,109,225,187,5,193,8,128,8,64,120,128,126,166,202,161,236,66,
+218,0,95,250,224,0,239,138,1,238,6,11,224,205,0,238,7,12,235,73,
+0,225,151,1,224,84,0,64,102,68,124,129,117,0,48,99,234,209,218,128,
+165,75,120,64,182,181,232,96,72,231,36,1,224,116,8,224,110,2,162,168,
+226,42,1,224,51,2,138,175,128,7,160,221,3,95,49,52,48,242,62,1,
+96,71,251,180,5,31,77,117,108,116,105,112,108,101,32,99,111,110,115,116,
+114,97,105,110,116,32,115,111,108,117,116,105,111,110,115,32,102,111,0,114,
+222,197,128,131,1,53,53,138,65,0,53,239,131,0,130,21,138,22,255,100,
+1,96,217,130,185,69,17,128,47,101,9,4,56,49,32,95,53,156,105,0,
+56,64,220,75,115,64,65,201,61,225,150,3,0,83,100,72,129,215,141,66,
+160,93,173,106,228,111,10,173,66,64,173,236,247,2,248,241,1,230,6,1,
+139,236,226,85,0,117,16,226,195,4,181,25,224,19,4,228,255,1,227,121,
+3,160,2,160,26,227,24,3,227,27,18,96,12,246,230,1,163,6,162,72,
+160,244,66,27,0,48,76,188,245,80,0,192,68,201,250,227,91,5,173,47,
+96,101,161,30,66,41,97,104,224,104,4,161,101,181,215,0,39,157,8,64,
+110,0,56,152,63,233,177,4,165,164,65,165,137,158,195,75,198,70,141,232,
+96,71,67,72,1,53,56,98,109,139,7,227,127,1,193,200,128,232,160,15,
+131,194,224,202,1,231,190,0,141,103,64,1,224,83,3,96,162,224,205,1,
+97,42,128,157,144,126,174,90,161,237,110,2,224,21,0,227,53,7,128,93,
+236,187,2,236,198,4,64,104,96,58,138,161,192,139,97,39,128,134,160,24,
+65,22,253,206,1,161,153,193,33,192,197,209,161,192,198,224,99,1,104,101,
+224,21,0,134,133,3,49,53,56,53,98,179,64,235,226,185,1,238,255,3,
+192,0,192,174,224,98,7,64,7,244,63,5,132,154,225,97,0,224,142,3,
+192,139,64,48,64,11,252,156,9,128,205,193,149,131,89,248,147,6,70,36,
+244,136,0,224,151,2,225,132,5,224,28,4,64,79,181,150,227,246,3,163,
+139,128,35,195,133,160,49,163,78,64,11,224,147,5,227,76,0,234,26,1,
+215,230,227,28,9,227,5,9,194,250,224,0,0,225,139,2,232,18,1,65,
+236,65,247,79,2,97,164,192,74,64,66,64,27,139,118,121,245,129,253,100,
+176,229,154,7,195,229,96,197,128,209,228,46,0,163,86,225,36,1,166,182,
+146,62,197,117,228,96,3,224,46,18,229,165,0,193,252,192,121,160,46,224,
+44,5,242,154,37,64,31,1,95,55,96,23,8,67,32,95,54,55,54,32,
+95,53,235,169,0,210,41,128,69,144,113,160,23,224,90,8,199,220,0,85,
+104,120,224,174,6,227,63,1,224,168,1,195,255,224,73,8,192,24,149,227,
+162,234,167,129,229,239,2,64,104,128,12,149,117,252,216,1,97,195,255,160,
+1,135,199,231,121,1,228,160,2,228,232,5,224,42,8,226,169,0,227,119,
+1,98,132,228,3,3,128,222,229,35,1,197,177,85,38,225,78,2,129,169,
+200,109,128,11,250,146,5,228,38,3,129,62,224,8,4,128,25,64,217,0,
+54,226,157,1,128,147,98,254,125,223,160,59,224,22,2,224,25,6,224,26,
+6,224,29,7,199,136,192,37,192,183,128,11,224,196,0,243,208,4,64,146,
+202,122,151,166,82,228,128,170,210,144,227,72,0,134,201,2,49,53,56,193,
+139,66,87,0,53,159,73,64,48,136,129,112,56,68,133,64,18,136,82,65,
+157,96,71,192,145,228,66,0,227,112,5,128,29,227,109,11,252,189,0,245,
+212,27,128,154,227,55,5,237,140,7,100,162,130,23,225,251,9,227,76,6,
+161,57,229,66,4,228,209,4,216,145,225,246,0,224,131,8,105,178,245,152,
+7,169,25,212,208,224,50,35,194,183,116,148,82,5,0,57,155,192,160,47,
+229,238,8,160,157,242,93,7,225,72,10,235,98,4,224,144,4,224,96,3,
+225,70,4,192,41,226,102,2,224,58,20,224,35,0,233,65,4,226,185,8,
+227,169,4,160,101,232,108,1,224,19,0,199,9,225,68,12,103,135,225,68,
+9,225,63,9,189,42,225,63,19,66,207,137,124,1,95,49,160,28,1,85,
+32,160,49,77,83,80,84,167,249,224,62,2,64,53,136,155,229,138,0,86,
+120,0,56,99,99,0,55,179,28,227,200,1,83,107,96,151,0,67,193,150,
+96,245,2,83,32,95,205,51,64,232,202,141,202,37,4,95,49,50,53,53,
+99,121,0,85,115,173,0,85,225,5,10,150,108,86,47,2,95,56,54,110,
+80,64,135,76,138,86,184,106,122,0,52,169,186,0,55,158,82,192,0,0,
+83,104,12,65,61,168,9,129,138,231,52,5,196,101,238,12,1,76,106,0,
+55,229,66,1,65,34,3,55,32,95,54,96,140,73,195,1,95,54,158,225,
+130,2,228,153,3,166,39,65,32,199,205,5,80,32,95,51,52,51,237,53,
+2,18,109,105,110,105,109,117,109,58,32,101,109,112,116,121,32,108,105,115,
+116,205,37,2,95,51,54,77,239,0,54,104,77,64,68,134,78,130,115,238,
+74,5,192,19,133,217,131,212,166,243,224,13,1,99,220,194,226,166,203,128,
+8,0,54,65,53,0,49,64,95,160,226,96,27,96,249,69,13,8,95,49,
+49,50,52,32,79,32,35,64,232,203,207,240,95,6,64,159,0,54,96,159,
+244,41,20,1,78,97,64,222,64,44,133,174,162,37,97,57,140,3,132,191,
+206,244,163,84,128,187,229,98,1,68,222,183,18,64,174,0,52,101,239,1,
+53,55,64,253,192,7,193,19,67,125,243,136,6,168,26,192,91,99,141,224,
+9,0,97,246,103,10,0,55,106,131,240,62,11,128,45,253,40,3,97,52,
+254,29,77,1,52,54,228,111,1,254,29,45,226,49,25,224,115,1,224,69,
+3,224,68,1,226,67,0,80,110,228,194,0,111,153,192,101,254,125,4,201,
+7,65,232,241,230,4,129,106,0,83,169,85,97,192,133,36,191,139,65,118,
+172,116,96,7,192,220,252,79,74,225,126,1,177,125,194,111,160,65,188,210,
+192,252,252,225,8,128,237,252,71,3,98,49,104,58,224,125,4,135,184,146,
+248,68,219,251,47,0,64,49,136,89,131,6,226,82,21,163,183,226,72,9,
+225,220,8,231,199,0,226,48,19,138,102,0,66,129,240,196,201,228,13,0,
+196,211,68,194,226,6,1,64,176,198,58,3,52,53,50,32,64,15,134,20,
+227,102,10,67,148,64,95,246,195,1,64,20,95,216,162,162,253,83,2,4,
+95,49,53,54,53,235,61,1,3,58,49,53,54,134,82,64,179,252,71,5,
+0,52,65,71,252,71,1,0,53,79,69,229,21,0,227,239,12,0,52,199,
+122,194,197,237,230,6,96,54,247,105,3,242,242,1,64,149,235,30,0,76,
+165,225,125,1,161,142,224,55,2,64,46,69,250,227,207,6,64,163,197,185,
+224,204,7,1,53,52,224,204,6,0,54,160,40,190,55,226,18,5,67,36,
+98,170,229,8,3,143,174,103,85,99,70,128,95,251,42,1,64,100,163,89,
+132,72,64,102,133,124,234,181,0,226,118,3,180,107,1,53,53,71,86,180,
+107,129,35,224,140,5,143,217,229,29,3,161,215,128,153,201,159,0,64,193,
+108,238,183,3,224,7,3,241,44,4,233,135,0,199,137,237,144,6,224,38,
+7,231,191,0,192,52,243,199,10,160,57,160,47,233,173,1,224,63,5,224,
+64,3,144,57,252,233,29,96,67,172,203,134,57,200,48,169,138,1,49,53,
+238,203,1,198,113,226,109,4,102,107,65,181,224,0,9,162,99,1,49,56,
+64,45,104,212,236,247,5,160,194,224,80,5,65,232,128,175,64,9,226,89,
+0,133,134,0,75,227,36,15,0,54,128,164,128,81,64,15,238,35,13,64,
+73,132,228,227,106,18,226,190,0,243,8,8,98,253,225,125,4,227,8,11,
+232,194,8,128,42,192,131,160,134,133,57,97,61,64,118,1,75,50,106,76,
+64,25,132,162,227,59,7,229,75,2,74,61,233,238,3,196,21,224,103,3,
+64,86,246,239,1,231,203,3,134,186,134,198,224,170,1,162,206,128,13,129,
+233,64,52,224,33,16,128,27,128,113,236,113,0,232,252,1,226,160,64,224,
+219,4,237,47,4,250,229,0,192,49,232,136,10,64,58,202,55,177,133,2,
+32,95,57,124,89,130,183,232,39,5,247,22,4,128,10,160,16,224,149,5,
+224,165,1,224,117,8,224,249,2,243,211,1,192,16,128,123,1,95,55,162,
+224,226,38,2,168,154,243,253,2,234,238,0,161,42,207,36,138,90,246,167,
+0,70,199,128,73,224,17,6,135,39,0,95,70,137,128,59,149,243,201,25,
+0,51,135,32,0,95,71,1,1,95,50,126,25,64,237,224,253,0,64,123,
+234,124,11,108,154,128,247,1,53,53,82,202,0,67,139,232,3,95,56,57,
+51,67,199,111,4,201,241,98,206,214,18,227,111,21,0,90,225,80,2,227,
+102,32,192,30,193,237,227,99,6,64,159,227,99,4,0,51,107,187,64,195,
+71,243,2,56,49,53,72,2,66,3,167,129,235,109,17,192,154,1,53,53,
+171,85,1,53,53,65,64,64,62,0,54,195,174,162,158,128,9,207,219,160,
+10,160,13,227,123,0,202,60,224,228,3,192,13,241,101,9,131,236,99,234,
+162,82,195,254,192,23,224,71,1,245,4,5,230,197,2,226,183,4,230,160,
+8,227,129,0,226,220,4,163,132,199,177,160,186,224,112,5,224,98,62,230,
+135,2,160,217,225,48,4,64,32,2,95,49,51,65,125,174,151,192,95,192,
+131,225,44,3,92,220,0,54,94,196,131,216,242,84,0,225,161,1,65,226,
+66,182,192,34,164,27,242,73,8,224,22,13,224,174,0,192,121,193,235,224,
+44,13,224,198,0,233,186,10,243,74,2,232,12,3,225,63,18,225,57,5,
+224,136,37,224,102,2,232,112,22,224,99,2,128,94,64,5,225,167,5,224,
+55,12,224,56,5,192,155,118,251,131,51,225,126,0,160,14,224,0,2,160,
+199,163,208,128,59,148,8,173,95,229,32,1,2,32,95,56,75,242,134,223,
+2,95,56,55,101,132,131,156,96,70,253,221,6,1,105,110,93,214,19,105,
+115,116,101,110,32,116,121,112,101,32,101,113,117,97,108,105,116,121,32,208,
+174,101,65,0,50,139,204,125,219,224,67,8,1,32,126,128,44,192,32,160,
+0,64,233,141,144,1,83,32,66,154,194,129,195,182,211,209,224,251,0,225,
+53,5,96,22,252,103,0,225,246,16,193,83,164,62,96,103,143,233,0,54,
+85,35,137,173,227,27,0,1,64,64,77,12,102,9,78,209,66,6,68,170,
+139,55,64,26,0,57,76,160,2,95,49,48,68,235,64,25,214,101,233,20,
+25,234,248,1,229,170,47,224,194,1,229,172,4,137,151,233,16,3,65,19,
+64,25,137,42,2,95,49,51,64,233,1,49,52,73,193,64,22,169,39,160,
+50,96,207,239,247,2,64,33,198,122,0,89,199,251,224,2,0,133,37,224,
+21,7,224,24,1,229,169,4,224,28,8,224,55,10,64,2,224,29,21,229,
+241,0,64,0,193,47,225,55,1,192,25,96,42,232,240,2,192,57,224,99,
+6,224,39,9,233,133,0,224,57,4,224,148,3,229,194,2,192,23,224,129,
+1,162,172,96,8,160,5,3,95,49,50,48,232,214,0,224,178,8,226,44,
+13,227,210,4,229,119,3,192,126,230,39,11,165,151,224,24,4,234,43,3,
+3,32,64,95,55,252,124,1,228,83,2,224,8,0,128,54,239,16,15,160,
+79,0,95,78,127,64,21,100,51,163,23,228,81,2,1,49,50,66,180,129,
+28,101,53,3,95,55,50,54,110,37,0,50,78,131,2,95,56,48,134,43,
+64,15,108,211,164,111,226,199,1,225,25,0,234,20,5,226,4,3,201,231,
+225,162,7,225,179,0,193,198,227,32,0,162,214,233,155,0,192,100,192,1,
+199,65,225,162,11,108,192,224,28,26,128,123,193,158,128,30,224,19,0,231,
+247,5,224,75,13,239,131,4,224,36,16,238,10,1,1,95,52,228,26,0,
+64,0,225,15,2,226,199,9,226,50,8,97,232,224,97,6,242,109,5,224,
+30,8,232,102,8,224,89,2,192,234,221,32,194,67,176,62,118,92,248,131,
+1,192,28,95,228,235,62,2,231,55,3,139,138,128,10,171,143,96,94,64,
+50,178,171,171,137,224,84,5,192,90,224,199,16,239,63,1,192,17,226,60,
+23,224,0,1,192,49,129,245,224,83,3,225,148,11,225,252,0,225,26,0,
+225,93,6,224,64,1,237,169,0,225,87,6,225,84,5,102,27,2,49,53,
+52,64,191,1,95,56,160,69,225,69,9,234,36,1,145,201,103,146,124,204,
+224,152,0,224,21,2,173,173,185,136,167,69,142,250,128,14,153,160,89,90,
+180,227,70,39,242,59,0,191,181,227,250,12,131,243,121,211,203,242,166,86,
+64,92,112,139,253,80,7,97,8,225,53,1,193,139,232,8,7,128,179,64,
+23,134,82,224,31,6,173,97,64,231,232,3,0,251,21,3,241,185,6,233,
+127,4,246,37,8,96,33,96,90,241,122,3,231,204,0,182,60,234,34,2,
+246,13,1,64,7,172,216,199,62,65,50,1,49,52,154,150,227,177,0,247,
+83,0,213,140,229,161,1,225,27,2,186,179,224,182,0,224,50,0,160,150,
+224,13,0,131,114,136,220,161,142,250,193,3,2,95,49,49,233,124,2,99,
+106,0,54,162,59,87,116,1,32,95,85,249,4,95,51,50,52,32,162,74,
+64,62,1,55,52,128,23,225,124,0,64,139,192,107,3,95,56,52,53,233,
+229,2,1,36,120,105,228,65,0,0,54,97,0,98,102,1,75,52,96,2,
+131,29,64,27,137,74,242,143,16,118,61,224,213,1,1,53,52,96,57,224,
+240,2,129,112,64,73,233,122,31,126,114,192,80,239,34,51,236,16,3,64,
+128,137,120,3,95,56,49,48,124,185,192,82,224,1,3,230,41,2,224,114,
+0,224,1,7,232,154,1,224,37,17,224,35,4,64,197,197,3,64,135,243,
+17,7,131,222,64,25,137,233,0,85,65,127,161,136,131,248,64,27,189,213,
+108,34,106,3,125,69,3,58,49,53,51,131,233,225,217,1,3,97,100,105,
+99,187,190,64,34,125,241,0,73,162,218,141,7,195,74,140,107,91,210,91,
+156,0,52,132,18,131,25,242,44,0,65,40,96,171,100,89,224,222,2,130,
+223,65,98,227,114,3,68,140,224,48,16,160,46,100,213,225,15,0,64,38,
+240,151,17,0,51,131,4,233,97,0,227,162,3,232,251,8,67,134,233,249,
+5,192,126,238,112,1,175,226,160,154,228,145,4,205,121,224,32,16,173,155,
+134,133,228,208,8,135,83,193,102,225,100,1,236,249,0,230,240,2,236,191,
+0,98,244,161,230,224,58,8,165,7,0,75,64,231,224,58,9,162,233,224,
+236,0,224,174,8,193,24,224,87,8,192,24,156,252,162,21,225,78,4,224,
+159,2,133,96,197,196,228,171,0,138,168,224,151,8,99,67,116,178,69,142,
+3,95,49,52,48,71,111,110,183,0,56,92,99,1,64,64,226,168,1,14,
+98,97,100,32,115,121,110,111,110,121,109,32,117,115,101,142,161,96,0,156,
+158,128,8,225,227,4,143,80,147,212,66,59,0,54,229,187,0,133,132,160,
+158,194,34,225,34,0,148,80,0,85,250,213,0,236,248,8,172,242,130,47,
+97,73,203,193,226,53,3,224,2,0,224,45,8,225,119,4,236,28,0,134,
+32,236,22,1,160,197,224,51,10,162,90,64,29,224,46,0,231,89,15,130,
+81,225,254,2,226,110,9,225,184,3,97,144,3,95,49,53,49,246,125,6,
+240,186,0,194,1,74,110,128,5,0,95,122,168,226,146,2,68,31,97,144,
+224,119,16,192,244,224,119,4,224,48,5,225,62,0,162,176,225,65,18,224,
+169,5,227,146,18,195,145,240,78,8,232,31,5,230,86,0,64,12,225,195,
+1,224,78,8,128,196,224,222,10,192,24,0,85,219,177,227,86,21,254,127,
+5,224,197,0,224,47,11,192,30,242,73,2,116,7,242,217,1,224,69,4,
+224,42,0,192,44,192,193,97,81,96,16,174,75,227,164,0,184,4,193,255,
+224,69,5,192,49,242,232,0,230,31,8,227,140,0,224,169,6,129,225,195,
+65,232,234,1,160,136,227,91,7,129,196,192,38,160,28,161,49,249,182,3,
+128,129,148,181,152,64,235,70,0,224,66,4,65,179,233,245,1,0,52,81,
+4,193,150,236,140,0,204,139,128,61,225,4,1,160,81,236,162,12,64,67,
+235,39,26,235,141,7,0,75,135,112,137,47,0,85,71,188,0,90,224,1,
+0,0,75,233,201,0,64,34,137,8,137,150,233,148,6,13,80,114,105,109,
+105,116,105,118,101,115,46,84,121,112,133,17,64,50,136,186,129,237,195,172,
+4,32,95,51,52,55,229,28,1,3,95,49,53,50,96,198,69,31,146,237,
+95,130,103,89,147,176,164,84,225,169,0,225,230,6,128,83,231,129,2,237,
+46,1,1,49,53,128,6,135,147,0,51,156,173,193,238,229,162,5,101,250,
+67,79,129,153,64,58,66,59,96,40,65,109,136,192,126,180,0,53,112,159,
+129,110,1,52,52,90,47,110,125,128,14,0,56,65,119,255,30,1,198,144,
+98,124,129,84,238,62,8,64,241,137,65,161,91,139,66,64,22,211,32,0,
+83,227,245,0,254,223,3,228,220,0,0,58,128,173,97,192,96,98,98,31,
+0,54,107,82,128,29,137,79,106,234,160,196,75,91,64,25,136,197,226,200,
+0,96,231,0,49,66,67,171,214,0,49,142,115,3,95,49,51,57,163,147,
+229,90,0,1,55,54,139,213,101,186,64,75,0,54,169,181,102,131,228,173,
+18,128,72,224,32,18,165,148,232,210,25,224,33,19,203,129,228,191,8,224,
+25,0,0,85,232,194,17,128,95,0,85,224,60,0,161,107,192,237,224,51,
+12,214,43,98,9,182,170,224,45,5,232,239,13,132,164,230,11,10,192,24,
+198,11,192,7,224,40,8,246,131,5,66,47,74,176,195,119,224,12,2,4,
+95,49,51,56,52,105,53,1,49,53,112,236,247,153,5,224,176,0,253,103,
+2,104,125,224,199,0,167,228,225,112,12,225,145,23,235,18,8,199,33,160,
+31,100,6,96,194,128,22,64,118,64,51,192,186,0,50,68,253,224,177,5,
+133,16,165,15,225,108,1,231,87,148,226,107,9,64,28,66,106,128,230,102,
+18,192,205,80,195,143,155,204,14,198,131,218,62,140,204,224,253,3,128,0,
+101,40,227,84,4,113,115,192,101,113,245,192,53,224,61,2,224,174,4,134,
+79,109,93,121,201,230,77,8,67,245,134,58,98,82,70,165,66,98,0,53,
+132,91,166,49,68,210,96,19,64,102,0,50,128,26,166,25,70,72,85,186,
+1,49,53,67,47,64,24,184,76,77,107,86,223,1,55,32,235,120,2,1,
+91,93,70,89,64,37,216,91,131,153,192,111,174,107,235,75,0,235,81,4,
+96,44,224,251,2,64,27,160,10,0,83,98,109,95,38,67,25,64,174,211,
+19,160,9,128,8,0,54,96,79,81,97,68,9,162,135,92,199,236,33,8,
+8,99,111,109,112,111,115,101,83,101,78,207,161,86,65,30,78,160,0,53,
+150,214,166,87,64,21,108,144,0,54,136,51,176,252,70,54,136,191,187,66,
+2,58,49,53,68,127,133,170,224,149,23,128,143,224,142,1,7,104,97,115,
+70,105,101,108,100,128,140,4,95,49,53,48,48,97,48,64,121,224,81,45,
+2,115,101,116,224,81,13,178,148,163,190,69,17,224,64,3,1,95,55,114,
+156,224,71,1,10,114,101,99,67,111,110,69,114,114,111,114,161,218,1,49,
+54,230,144,3,162,232,161,175,132,4,0,51,164,191,70,151,252,2,6,26,
+67,111,110,116,114,111,108,46,69,120,99,101,112,116,105,111,110,46,73,110,
+116,101,114,110,97,108,46,193,136,128,88,64,62,101,7,0,67,180,172,252,
+78,9,4,44,32,97,116,32,188,80,136,83,178,52,96,165,130,244,133,13,
+165,237,224,160,3,71,59,144,70,1,95,57,160,176,0,57,69,120,147,143,
+225,102,1,193,101,224,194,2,1,104,97,97,10,216,80,64,108,210,130,1,
+80,32,103,58,0,85,129,106,131,66,234,132,0,247,226,3,65,144,0,55,
+194,58,132,214,234,254,2,172,226,224,21,8,64,191,228,148,1,64,190,232,
+171,2,0,95,212,186,224,56,4,196,203,96,62,235,85,2,139,59,224,29,
+7,128,100,64,2,139,51,239,186,3,132,172,89,211,1,48,51,67,131,235,
+74,4,244,58,7,129,136,67,169,102,18,200,233,165,213,211,142,107,0,0,
+90,161,161,0,48,254,141,6,226,209,7,7,78,101,115,116,101,100,32,102,
+66,213,11,115,32,110,111,116,32,97,108,108,111,119,101,162,226,96,0,241,
+8,13,198,50,240,136,4,96,22,0,32,71,58,224,50,5,160,162,224,147,
+19,226,138,9,4,101,120,116,114,97,128,154,2,40,115,41,130,148,3,66,
+32,95,55,67,43,132,69,131,87,192,145,234,151,4,234,12,5,193,189,64,
+36,234,135,4,224,22,1,118,114,64,16,102,42,131,199,180,232,249,58,0,
+64,26,247,160,1,254,229,7,160,0,66,133,224,129,1,1,49,51,85,230,
+0,52,179,24,231,179,0,0,49,235,7,0,98,212,212,100,230,187,0,0,
+85,104,189,229,19,16,171,56,1,53,54,74,170,100,39,64,21,203,55,64,
+71,108,68,75,21,224,242,5,235,165,4,224,26,6,99,164,84,92,1,53,
+48,164,108,99,173,197,186,160,53,64,255,227,114,14,226,131,1,200,206,163,
+7,227,94,5,165,102,226,6,7,167,92,229,37,4,11,111,114,100,32,119,
+105,108,100,99,97,114,100,226,157,9,138,115,224,193,1,84,82,200,55,231,
+240,0,0,54,107,147,160,212,224,254,0,160,219,225,176,4,225,143,1,0,
+48,134,115,67,73,153,172,64,3,1,75,51,64,181,184,134,64,48,107,244,
+64,60,108,15,108,22,64,25,245,32,1,237,160,5,0,52,128,252,232,201,
+0,225,72,5,164,10,96,140,98,43,228,69,3,224,39,3,64,32,135,165,
+226,204,6,247,187,0,64,143,184,5,245,162,9,0,52,139,174,136,39,144,
+135,3,95,49,50,57,161,240,224,78,1,2,95,49,52,147,183,227,48,5,
+64,94,200,249,0,90,66,166,96,17,197,169,237,168,5,64,144,64,29,197,
+177,168,98,184,221,141,235,0,48,130,249,231,139,42,0,103,231,139,14,0,
+48,131,27,0,83,161,98,119,44,150,193,64,151,69,95,253,78,0,109,236,
+70,167,96,117,102,186,228,82,0,230,172,19,4,80,114,111,120,121,165,32,
+224,156,3,64,125,195,131,97,77,68,29,98,226,64,66,98,98,192,248,96,
+81,120,223,240,81,4,1,66,64,136,15,96,45,111,26,4,52,57,54,32,
+95,111,18,64,21,218,252,164,161,1,52,57,138,150,1,52,57,100,1,64,
+43,128,31,64,2,91,1,2,95,49,50,69,45,112,237,96,36,160,155,2,
+80,32,35,106,200,0,80,128,24,129,191,239,13,13,0,52,69,222,0,52,
+97,37,239,13,1,226,221,9,208,108,173,65,130,228,231,26,3,85,239,229,
+93,1,101,71,109,160,104,151,0,52,93,0,224,88,1,203,244,237,121,1,
+224,2,3,128,24,242,135,4,96,2,165,58,65,121,81,130,239,202,15,64,
+205,199,211,247,79,1,245,77,1,224,5,0,102,174,227,161,3,64,19,0,
+83,128,154,238,139,13,228,246,0,128,24,128,127,166,143,220,33,67,88,252,
+242,2,130,41,0,52,99,210,169,74,100,73,96,21,75,225,64,72,0,80,
+64,69,97,101,160,75,0,51,67,176,0,64,96,20,224,0,0,193,89,161,
+92,65,38,64,66,129,88,133,14,115,125,180,173,237,75,1,177,226,224,68,
+7,148,98,225,1,4,224,172,3,224,11,3,64,234,177,22,64,179,192,159,
+224,152,0,130,2,244,115,0,215,233,135,76,1,49,52,71,122,230,152,3,
+64,42,254,30,7,224,164,3,248,22,0,66,187,196,93,226,142,13,129,232,
+226,116,0,232,172,3,96,190,0,57,64,45,71,147,135,112,192,44,224,244,
+2,166,72,224,56,2,64,87,161,210,226,28,2,96,140,173,198,1,51,54,
+224,138,1,1,56,57,102,55,0,57,135,186,96,112,224,175,24,194,22,128,
+103,235,188,0,1,52,56,196,79,130,228,64,83,230,200,1,64,92,228,125,
+1,224,96,15,193,151,225,148,18,251,169,5,64,118,96,133,225,23,28,130,
+79,225,23,7,66,132,132,151,182,249,64,84,98,208,96,188,64,33,211,170,
+224,185,25,192,35,129,32,162,30,231,45,2,154,200,104,179,118,81,97,121,
+128,134,133,62,159,30,210,91,76,163,129,65,128,82,255,7,4,96,70,3,
+10,65,32,90,64,46,64,14,173,0,253,161,14,96,105,131,249,1,49,56,
+144,20,69,15,240,228,2,136,9,100,127,228,135,2,0,85,228,44,7,0,
+56,230,21,4,2,75,105,110,235,143,0,64,132,176,96,118,79,100,220,131,
+238,168,86,227,222,0,96,9,66,57,164,66,0,53,95,83,0,95,127,218,
+224,6,6,106,100,64,3,100,223,192,76,0,83,123,130,1,53,52,67,225,
+192,32,224,106,19,109,71,224,108,1,80,224,96,114,224,108,31,0,82,224,
+108,26,65,70,96,100,0,83,172,89,224,110,6,160,103,224,117,2,224,106,
+9,224,63,3,224,113,2,173,139,151,12,192,147,224,40,0,224,108,18,224,
+115,2,128,67,224,61,13,160,106,3,95,51,50,50,225,219,2,31,92,34,
+115,114,99,47,77,105,99,114,111,72,115,47,84,67,77,111,110,97,100,46,
+104,115,92,34,44,50,51,55,58,50,0,51,237,136,2,132,249,0,57,231,
+143,2,1,52,56,67,40,224,13,1,67,120,224,13,1,231,185,2,0,53,
+121,57,160,11,224,65,1,66,77,197,64,74,9,1,53,55,130,230,172,143,
+132,35,231,197,1,96,61,99,183,108,191,130,222,64,47,178,152,224,47,10,
+224,57,2,72,27,224,57,0,224,64,6,242,195,1,224,54,7,224,152,1,
+224,53,8,0,55,242,26,0,224,2,0,131,184,241,70,2,228,225,2,231,
+204,5,84,113,98,31,128,27,239,215,1,224,50,4,71,0,229,14,4,64,
+55,229,253,11,65,153,129,60,67,193,164,202,72,243,196,172,254,161,0,232,
+203,4,133,17,96,112,64,0,192,44,130,230,249,240,5,160,59,196,230,233,
+10,0,160,94,130,186,68,16,128,46,224,96,4,96,17,224,137,1,164,158,
+224,38,4,96,35,224,75,6,192,37,193,20,96,150,97,35,225,20,10,241,
+57,6,224,112,2,156,186,128,85,252,81,1,230,121,11,225,160,6,0,55,
+224,71,5,192,73,96,26,201,67,224,100,80,192,14,162,135,224,17,0,224,
+15,0,224,133,3,224,47,2,159,72,164,170,226,128,31,64,115,224,104,1,
+224,141,3,224,143,0,224,19,2,191,171,226,13,6,98,68,128,32,226,24,
+2,129,175,131,12,0,64,162,103,224,73,1,234,199,8,226,108,2,224,37,
+1,224,131,18,224,70,0,195,112,192,136,224,119,0,134,216,0,53,99,185,
+68,40,254,32,1,226,87,10,226,93,12,231,222,7,231,228,0,98,115,242,
+87,0,126,68,64,74,248,61,11,236,82,0,224,189,2,224,21,15,160,132,
+248,105,6,240,48,1,128,0,254,172,2,252,220,8,226,0,57,101,155,68,
+81,228,224,0,226,212,10,196,57,128,12,224,94,6,160,222,192,86,66,173,
+120,115,0,52,243,19,8,129,202,164,193,96,119,0,54,136,97,254,244,11,
+12,99,97,110,110,111,116,45,104,97,112,112,101,110,102,156,64,48,246,24,
+0,237,144,1,64,13,224,144,3,64,95,211,99,192,1,162,86,197,6,226,
+60,0,192,34,67,181,224,46,0,237,142,7,224,178,1,161,23,226,35,6,
+236,186,11,0,55,65,177,64,38,0,79,236,114,5,229,252,30,224,103,0,
+75,227,74,150,0,50,159,21,96,93,141,215,64,27,85,204,74,124,75,191,
+0,95,244,30,2,225,137,0,0,53,240,79,4,5,83,117,98,115,117,109,
+119,185,11,32,99,104,101,99,107,32,102,97,105,108,101,201,243,226,93,7,
+65,111,138,2,225,17,5,3,95,49,48,53,224,41,0,77,47,131,15,241,
+213,6,95,171,96,66,135,247,2,75,32,89,97,120,65,49,134,162,252,169,
+0,134,95,64,218,166,16,254,131,4,225,112,1,228,59,7,97,214,84,120,
+161,41,226,3,6,244,41,0,64,60,238,96,8,116,65,129,172,230,74,7,
+71,219,184,182,224,0,1,225,249,3,224,136,0,225,173,2,188,233,0,67,
+232,14,0,197,10,230,221,0,229,69,1,226,47,7,195,147,226,85,3,226,
+129,4,192,36,128,177,224,179,7,228,2,0,164,225,224,191,3,242,133,0,
+160,168,225,14,40,164,150,68,133,76,214,224,0,1,224,42,5,0,80,98,
+244,128,31,65,244,137,216,64,80,232,155,1,108,205,229,141,11,228,91,2,
+230,31,8,163,45,194,32,232,82,1,160,174,224,197,0,240,239,1,225,37,
+0,224,27,10,227,125,0,162,107,230,1,7,227,156,8,68,25,232,117,1,
+129,3,225,39,8,207,210,225,151,6,226,160,31,228,27,0,65,57,180,86,
+163,28,227,118,16,84,227,1,52,54,84,181,1,49,52,161,120,225,192,13,
+65,52,96,159,129,245,166,190,130,50,166,90,184,44,160,71,160,13,230,134,
+1,64,149,207,240,225,83,4,118,104,224,115,8,224,186,0,158,123,249,122,
+3,160,117,98,155,181,1,160,14,2,79,32,35,86,6,97,9,156,16,0,
+50,249,115,0,0,58,128,232,239,182,20,182,110,227,168,1,170,105,228,100,
+0,64,42,118,126,225,38,0,1,52,53,182,119,0,51,69,69,224,58,0,
+225,239,2,96,121,245,32,0,2,54,54,32,64,15,247,118,1,66,217,230,
+81,1,129,98,97,111,132,197,134,96,226,111,0,226,114,0,199,122,192,204,
+224,50,2,132,248,228,120,1,227,41,6,171,67,224,172,1,224,60,10,227,
+237,1,192,30,228,181,8,224,34,9,135,30,160,77,167,25,232,12,5,192,
+231,231,53,4,227,173,2,225,125,4,161,66,226,129,1,224,101,3,235,58,
+8,225,61,0,225,62,2,85,170,0,54,188,157,224,24,3,142,241,102,219,
+0,54,252,189,1,226,124,0,132,95,224,133,11,224,18,11,224,23,0,234,
+156,8,224,51,2,160,182,133,8,104,110,224,13,5,224,56,12,224,57,3,
+235,60,3,228,87,1,228,119,6,192,184,160,58,134,16,64,9,226,192,0,
+224,103,5,129,23,224,42,1,197,35,193,28,241,226,1,225,30,11,225,235,
+2,128,18,162,88,228,251,2,225,183,1,225,227,13,96,195,227,133,8,247,
+150,0,167,214,226,239,1,227,6,4,96,35,224,17,9,225,52,2,65,165,
+241,161,4,227,9,2,139,146,72,217,129,73,253,204,5,138,54,6,32,117,
+110,105,102,121,32,136,216,228,117,4,1,49,50,113,64,224,55,8,3,32,
+97,110,100,128,47,192,34,224,236,3,162,3,226,66,9,68,17,0,54,234,
+147,6,229,180,5,0,52,129,227,193,76,64,16,128,93,64,70,69,21,64,
+66,217,49,64,19,153,15,133,60,1,49,52,116,142,64,34,137,137,250,28,
+3,10,105,109,105,116,105,118,101,115,46,126,34,112,16,64,42,250,19,0,
+135,246,224,9,0,197,207,64,38,231,155,1,230,101,12,0,52,89,201,235,
+44,6,134,224,64,142,0,48,162,201,229,38,7,246,110,1,226,86,10,228,
+58,32,235,204,7,133,167,0,55,235,67,6,160,39,229,226,6,66,248,107,
+8,110,2,96,200,139,16,226,59,33,4,121,99,108,105,99,226,53,10,110,
+92,116,213,220,173,226,63,9,0,61,226,61,17,229,96,5,233,125,7,225,
+113,1,192,216,0,67,129,112,224,193,0,192,192,161,112,224,132,0,161,122,
+247,140,3,227,147,18,225,6,8,126,140,128,141,163,27,1,52,53,114,113,
+224,217,6,5,101,114,114,111,114,58,161,22,64,113,65,63,126,182,2,67,
+32,80,224,40,2,3,116,121,112,101,64,36,224,17,1,0,107,214,80,224,
+18,1,3,115,111,114,116,224,18,6,4,114,101,97,108,109,188,143,64,128,
+236,112,46,0,53,162,223,66,46,153,28,0,53,140,115,235,147,5,226,150,
+3,129,201,226,78,1,167,67,234,122,1,224,39,21,202,163,193,180,234,165,
+0,224,36,4,129,170,231,135,17,98,29,130,203,128,107,205,208,130,199,250,
+156,1,230,221,3,140,13,0,90,64,208,0,90,64,49,192,25,224,100,8,
+237,42,2,0,75,226,8,1,224,175,1,224,215,11,231,50,3,224,79,7,
+224,27,2,172,242,64,29,128,34,160,25,64,106,128,11,73,201,0,57,218,
+74,97,164,148,186,65,170,164,239,0,51,64,11,68,239,0,48,118,45,0,
+49,66,223,0,51,125,72,96,40,133,24,0,75,113,106,228,88,0,228,153,
+0,164,84,163,85,236,58,7,200,49,140,54,148,175,99,35,235,186,9,225,
+82,1,231,174,3,237,34,5,67,118,234,208,0,2,49,50,53,163,229,64,
+45,141,231,237,105,1,225,161,6,130,123,235,254,6,192,63,160,232,175,104,
+193,136,0,95,108,176,236,5,24,107,182,236,246,4,237,191,9,242,178,2,
+235,239,12,64,0,224,53,3,64,141,134,73,4,83,32,85,32,95,100,155,
+1,90,32,76,198,0,89,249,35,3,129,143,97,127,229,231,3,231,202,3,
+226,86,6,192,109,226,127,0,224,46,21,235,209,0,133,137,224,47,2,224,
+44,10,225,243,1,168,84,227,138,49,162,187,96,11,160,238,227,42,0,160,
+92,160,135,224,13,0,232,194,0,225,6,0,224,53,2,224,175,2,140,138,
+0,39,241,194,0,97,189,241,186,9,96,59,226,217,3,226,230,4,127,187,
+129,209,193,75,64,30,129,37,98,59,2,49,52,49,70,225,3,95,53,54,
+57,148,119,0,90,64,49,222,214,226,19,4,224,35,1,194,171,166,122,244,
+133,4,128,121,66,49,0,48,160,172,64,11,194,118,96,145,144,111,104,225,
+192,10,178,4,242,254,11,230,134,3,96,171,97,10,160,211,224,57,0,130,
+167,0,56,146,250,96,57,0,89,131,152,149,116,226,130,3,128,161,247,20,
+1,193,21,161,19,129,190,107,175,100,109,2,49,49,53,235,33,1,162,98,
+197,102,96,0,227,34,9,229,11,11,226,53,2,96,180,242,51,0,230,15,
+18,128,114,224,77,10,192,24,192,76,0,52,65,23,224,17,1,94,63,94,
+22,128,154,192,147,226,109,1,225,5,1,226,243,5,192,68,227,63,1,224,
+35,8,243,104,16,230,60,10,227,60,11,224,37,1,229,61,1,65,206,144,
+224,128,175,64,15,193,29,128,69,98,204,165,30,227,245,2,128,199,224,75,
+6,133,90,231,0,9,97,183,0,55,96,28,5,67,32,95,54,55,54,227,
+75,4,96,125,0,51,73,142,233,174,8,3,115,117,98,115,108,37,8,109,
+112,108,101,109,101,110,116,101,235,253,0,80,124,1,49,50,157,211,96,0,
+69,16,203,51,179,63,67,35,64,22,234,245,1,1,80,32,129,7,0,80,
+134,224,201,147,1,80,32,97,215,159,213,65,209,232,153,1,98,150,129,188,
+64,78,228,73,5,129,201,128,16,176,73,245,47,3,225,203,0,192,41,225,
+209,6,162,58,228,143,1,227,36,2,226,41,16,165,111,228,243,7,224,40,
+9,234,173,6,225,195,8,114,23,229,76,6,193,179,160,10,217,1,160,167,
+224,43,3,224,223,1,224,226,20,230,30,0,224,227,22,224,153,5,230,38,
+0,224,143,4,64,141,160,43,174,173,64,13,65,9,171,25,228,13,8,224,
+93,2,228,19,12,224,242,25,225,89,1,224,64,5,193,186,128,30,160,65,
+224,13,12,224,58,8,165,39,224,44,13,173,195,194,102,197,28,96,194,201,
+4,96,155,195,233,160,0,225,142,4,193,145,224,98,0,228,73,12,231,26,
+3,193,151,224,49,0,232,32,28,224,26,1,226,132,2,225,201,4,163,228,
+128,25,161,101,231,110,4,224,19,5,228,221,30,224,179,0,229,192,1,224,
+236,17,228,206,0,231,239,0,224,53,27,225,93,0,192,29,229,79,14,225,
+199,8,225,21,0,129,186,129,194,64,53,132,36,231,45,7,225,7,4,227,
+32,1,192,56,225,25,3,128,36,227,244,1,160,105,64,146,250,90,5,128,
+31,130,5,224,27,6,196,8,151,161,200,221,236,184,2,224,4,1,128,116,
+229,152,14,9,102,114,101,101,84,121,86,97,114,115,174,113,229,144,7,97,
+50,134,88,69,71,96,19,2,85,32,65,101,100,100,65,0,75,102,108,151,
+175,172,111,72,76,2,10,65,32,96,32,64,14,142,33,157,190,253,196,1,
+128,246,128,180,118,190,0,53,166,124,2,54,32,35,118,140,246,152,7,7,
+64,95,53,55,48,32,95,50,92,198,162,13,224,67,11,233,0,4,2,95,
+50,54,119,186,64,24,96,85,1,35,49,110,206,64,150,0,54,134,30,75,
+134,3,95,50,51,51,192,38,4,64,95,50,51,53,224,12,2,0,57,76,
+133,1,50,56,183,251,1,50,32,121,123,64,27,64,6,108,85,64,8,0,
+52,224,23,11,2,50,55,55,224,72,2,0,55,132,212,64,12,64,126,253,
+91,0,98,33,227,126,1,227,251,5,194,208,143,137,245,163,0,242,254,1,
+64,8,135,243,64,7,66,142,161,152,193,188,96,85,74,39,1,54,55,161,
+60,224,64,2,64,50,0,50,224,50,0,137,8,145,129,0,50,90,84,129,
+233,128,0,224,114,90,88,119,224,114,3,224,43,6,224,15,7,65,69,141,
+200,1,95,50,98,25,2,57,52,32,101,149,128,9,5,49,49,49,52,49,
+49,173,99,65,145,109,99,132,52,180,57,224,196,13,196,66,130,60,160,191,
+64,206,64,123,195,18,224,13,1,224,192,17,128,81,64,125,136,208,1,95,
+56,88,211,64,44,212,126,0,51,98,86,71,193,64,24,249,246,0,0,53,
+82,120,99,180,5,54,32,64,95,57,48,160,196,64,45,224,57,0,114,154,
+160,57,0,51,131,113,196,175,78,71,135,60,64,171,199,110,192,7,142,103,
+250,197,2,224,32,5,254,233,0,103,144,0,51,148,115,96,0,64,104,177,
+237,132,36,0,50,138,105,83,30,186,159,64,34,0,54,233,140,1,104,228,
+137,141,64,36,96,22,243,142,8,178,95,250,103,12,79,63,230,223,1,96,
+39,196,250,1,95,54,90,229,101,76,0,90,149,233,200,110,196,22,224,101,
+4,96,7,133,116,248,13,4,246,35,1,65,86,242,226,3,237,147,0,0,
+85,111,142,224,28,14,96,219,130,133,132,139,113,98,161,104,209,103,66,42,
+209,103,237,146,3,197,179,180,127,128,237,64,80,130,173,7,95,56,49,48,
+32,75,32,85,230,218,0,224,1,5,141,125,160,0,224,34,13,233,0,2,
+96,0,64,158,161,208,64,102,130,150,129,60,132,224,67,8,64,25,130,163,
+230,40,1,2,100,105,99,84,72,64,26,245,0,1,252,158,9,160,134,241,
+22,5,97,142,65,118,102,84,64,13,245,231,0,64,7,64,59,117,8,252,
+136,9,64,148,1,10,65,124,174,0,54,101,212,64,19,188,34,224,123,2,
+99,138,0,83,82,146,135,250,130,100,225,229,3,128,148,69,229,98,66,2,
+32,95,51,93,249,0,64,193,159,119,179,193,159,254,87,5,115,44,2,32,
+95,55,101,195,142,199,96,44,0,50,68,97,192,47,0,52,215,237,65,4,
+166,250,81,196,224,1,3,0,75,236,226,1,128,42,0,54,225,227,5,66,
+99,225,194,27,224,35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,
+20,11,224,17,8,224,14,5,224,11,2,192,8,96,5,226,158,2,224,0,
+2,65,44,132,61,3,95,57,49,50,180,224,64,20,131,118,0,85,65,90,
+160,2,96,59,64,26,131,64,0,67,144,176,231,79,1,64,109,234,85,5,
+136,211,239,174,18,164,85,228,130,3,224,33,7,208,152,234,91,9,240,178,
+4,249,108,5,216,136,132,172,0,80,64,252,226,118,2,229,39,15,228,193,
+10,184,184,227,115,5,96,0,0,85,224,145,0,64,98,1,95,49,72,227,
+102,234,233,57,1,229,199,0,96,70,114,199,244,242,3,64,65,224,40,10,
+114,220,192,146,64,0,224,11,2,225,4,8,129,98,68,196,115,9,224,72,
+2,70,222,64,57,192,198,224,78,0,235,217,1,225,176,9,225,175,23,204,
+103,237,175,8,192,24,139,127,179,128,128,12,226,32,18,225,219,16,225,218,
+2,83,240,225,124,5,238,170,11,224,47,19,96,0,224,50,13,225,130,0,
+226,12,11,224,24,14,129,178,224,98,2,247,46,3,224,132,17,248,64,4,
+67,69,252,187,1,1,80,32,161,199,145,113,65,178,3,10,65,32,80,72,
+207,66,12,251,17,0,71,244,225,104,1,65,193,177,188,66,91,231,35,20,
+248,139,3,225,10,0,2,95,49,51,72,138,64,30,96,125,64,72,165,255,
+231,27,13,231,19,0,224,22,5,224,1,1,229,76,127,228,234,6,64,216,
+134,59,129,31,0,52,145,15,73,254,2,49,50,57,225,2,2,64,40,0,
+54,228,247,4,230,90,0,64,26,133,39,130,51,226,71,4,1,95,51,121,
+145,0,85,214,126,224,32,15,196,172,96,38,129,196,224,41,3,99,248,160,
+41,227,75,2,128,33,68,153,0,49,74,222,4,95,49,49,55,57,232,61,
+2,1,61,62,206,92,224,22,4,255,84,2,160,33,224,91,5,2,95,49,
+57,98,230,177,49,225,43,3,171,247,1,52,56,103,243,97,44,111,37,96,
+132,96,7,77,143,75,253,89,133,99,26,224,6,3,224,33,0,105,153,140,
+37,224,33,20,160,26,224,40,3,224,33,13,224,40,3,3,64,95,51,48,
+109,244,98,213,64,182,134,150,0,75,98,11,254,60,17,98,39,0,83,64,
+208,96,39,111,186,128,10,239,189,5,22,97,115,115,101,114,116,84,67,77,
+111,100,101,58,32,101,120,112,101,99,116,101,100,61,255,81,13,133,120,101,
+112,0,49,134,2,171,231,0,79,96,18,0,49,128,8,2,51,57,56,192,
+8,0,57,248,71,2,224,122,8,4,44,32,103,111,116,128,105,160,90,160,
+85,225,162,1,132,60,1,75,51,68,35,64,94,108,55,3,49,57,32,75,
+190,202,2,95,51,48,224,81,3,5,84,67,69,120,112,114,128,81,224,25,
+7,0,84,190,235,224,26,10,0,75,222,244,224,26,9,0,83,222,252,64,
+163,0,50,111,224,96,163,92,78,224,12,0,64,156,132,192,122,41,0,50,
+135,88,166,223,0,48,73,238,0,56,67,166,135,189,127,197,165,31,0,95,
+124,153,0,56,76,132,225,30,9,15,77,117,108,116,105,112,108,121,32,100,
+101,102,105,110,101,100,209,93,0,56,145,162,0,95,108,50,64,123,0,48,
+182,164,1,56,54,110,27,0,48,205,200,64,106,67,252,68,35,64,23,132,
+27,64,131,112,234,249,153,0,194,139,132,94,141,218,128,17,228,124,1,249,
+165,0,224,2,1,194,102,200,27,64,16,96,20,194,185,163,173,0,49,128,
+125,0,54,192,149,226,178,15,226,207,15,133,205,128,134,224,31,11,242,101,
+2,235,180,8,64,31,141,100,179,43,232,250,8,101,42,79,194,162,80,0,
+55,111,19,1,51,57,160,61,81,185,0,64,96,20,224,100,20,0,57,192,
+100,140,165,231,77,1,224,183,18,172,41,129,65,0,66,112,75,224,185,12,
+224,214,14,115,195,163,160,224,140,10,232,29,9,64,25,114,75,0,48,204,
+69,65,150,171,20,64,40,228,139,0,67,191,163,189,98,193,133,176,1,52,
+51,249,141,4,2,99,99,32,227,30,3,210,241,96,92,129,69,129,74,1,
+52,48,109,158,128,23,2,49,52,48,99,67,128,13,178,219,192,12,100,1,
+96,12,64,152,133,157,242,49,1,218,149,170,124,201,154,96,255,3,49,52,
+48,50,241,101,0,177,85,160,6,64,74,133,49,77,80,70,237,98,108,64,
+22,132,92,242,82,1,224,94,2,96,85,244,42,1,224,77,4,132,134,1,
+75,50,81,163,64,15,131,249,1,75,50,148,170,97,53,101,159,64,104,64,
+15,212,201,237,194,4,64,24,231,171,3,0,54,114,236,136,198,1,51,57,
+238,74,2,64,40,0,54,163,223,239,201,14,239,195,1,224,25,7,192,1,
+232,176,101,232,150,5,64,192,244,167,0,3,95,49,51,55,72,136,153,157,
+2,51,55,52,93,34,98,201,0,73,70,50,98,125,92,18,1,49,51,103,
+181,0,79,129,29,1,57,48,134,126,113,48,128,33,130,206,135,52,72,218,
+134,102,147,42,99,180,102,41,64,48,117,209,232,47,12,226,188,0,64,50,
+130,35,224,39,12,166,30,64,37,202,204,224,202,23,66,158,0,79,64,180,
+224,209,2,132,68,0,67,96,24,128,22,132,106,119,141,96,190,224,52,11,
+122,92,224,52,3,113,99,224,52,21,0,56,173,158,224,52,0,64,16,224,
+52,24,100,41,224,52,3,132,173,224,52,1,128,27,160,52,0,56,65,116,
+224,45,3,129,139,86,227,225,139,1,130,42,225,193,15,97,81,236,4,1,
+96,36,97,182,1,51,56,129,82,132,134,224,12,4,96,141,0,58,128,103,
+160,43,0,55,64,59,65,121,195,76,0,56,87,109,96,6,64,5,129,70,
+116,94,96,164,128,62,227,123,0,128,251,113,153,114,91,64,28,0,54,226,
+62,2,64,15,165,35,108,255,64,15,194,94,193,57,131,232,65,17,226,66,
+15,0,45,74,154,64,35,130,64,224,35,12,1,78,97,147,29,97,120,224,
+36,15,5,83,121,109,98,111,108,160,39,129,47,224,39,12,8,67,111,110,
+115,116,114,97,105,110,160,83,66,54,227,18,26,233,9,0,64,50,129,82,
+224,39,12,169,76,64,37,181,205,65,60,161,104,64,21,161,66,1,53,50,
+235,171,3,6,98,117,105,108,116,105,110,64,96,76,4,64,3,64,43,213,
+213,108,51,141,234,67,78,64,20,166,223,0,57,64,180,218,33,1,51,54,
+101,36,69,156,1,49,51,88,97,132,114,224,21,9,64,70,181,4,75,227,
+133,230,0,90,69,104,224,9,0,176,152,0,50,73,163,98,90,64,60,167,
+70,96,7,96,92,139,129,128,85,64,84,129,196,77,6,240,86,8,0,83,
+168,98,255,87,3,73,79,2,49,56,55,201,244,135,181,237,55,6,231,92,
+4,5,103,101,116,73,100,101,97,186,182,58,224,142,3,1,85,32,123,147,
+64,136,248,5,0,0,57,70,204,215,202,65,4,129,60,187,112,72,33,109,
+255,0,56,96,143,1,95,55,90,1,0,58,97,50,160,63,230,129,7,87,
+177,230,129,2,71,25,230,129,7,215,241,224,1,11,239,32,127,224,23,14,
+224,20,11,224,17,8,224,14,5,224,11,2,244,96,11,65,35,231,206,16,
+65,130,225,76,3,0,54,225,76,9,128,1,167,200,224,16,1,224,1,5,
+225,85,170,225,43,8,64,255,208,95,1,75,51,246,220,15,64,37,245,152,
+0,0,50,144,160,224,34,4,64,32,233,213,5,96,2,192,26,227,160,0,
+227,104,3,138,205,235,21,0,99,68,129,125,235,157,10,0,53,243,179,2,
+2,95,51,54,235,208,2,140,253,65,214,141,224,0,49,70,4,195,217,160,
+127,195,151,242,167,14,1,51,53,70,204,242,167,8,0,56,126,38,2,49,
+51,53,103,243,64,71,131,199,97,3,248,8,17,0,58,128,49,226,82,5,
+180,152,224,1,11,226,70,170,224,17,8,224,14,5,224,11,2,192,8,227,
+164,11,97,41,200,39,224,1,15,225,29,5,225,68,245,243,50,7,97,82,
+164,227,0,50,91,87,71,174,198,140,66,230,236,231,2,226,173,15,96,42,
+199,241,160,70,103,71,64,108,64,75,64,31,201,96,0,50,137,128,0,53,
+131,234,99,65,1,49,49,80,238,96,162,171,122,0,49,143,10,96,17,1,
+49,49,113,75,175,230,0,55,94,236,156,44,2,49,51,53,67,222,0,56,
+64,110,0,64,88,158,131,223,64,92,246,160,1,148,135,151,197,248,17,11,
+148,32,224,25,6,175,135,224,25,10,146,204,245,38,7,178,22,188,233,104,
+243,231,76,1,149,49,161,139,102,14,238,231,3,65,147,240,199,1,160,119,
+241,144,6,206,206,128,7,96,54,128,148,190,38,228,111,1,112,116,96,32,
+65,122,129,37,228,204,2,64,12,131,65,128,74,2,95,49,49,65,42,161,
+132,65,77,165,29,1,49,49,69,138,2,95,49,49,146,241,161,148,143,165,
+96,0,224,164,3,159,121,64,0,226,125,0,133,79,0,53,72,140,128,229,
+0,39,128,145,224,196,0,224,110,3,161,229,88,85,224,100,0,160,186,64,
+157,224,120,5,160,99,148,191,128,39,96,111,0,89,232,186,0,0,80,187,
+238,192,119,224,50,0,161,44,96,50,96,227,229,229,2,64,13,243,194,0,
+160,103,3,95,50,54,54,176,44,253,225,13,0,95,141,95,130,227,76,107,
+235,129,3,1,36,102,137,234,64,122,0,89,224,150,0,192,237,64,138,73,
+194,0,52,137,202,244,37,5,1,36,120,245,64,2,254,248,1,195,16,224,
+150,23,242,65,0,254,159,0,96,167,224,173,0,244,39,3,97,42,97,41,
+194,165,130,89,193,56,226,227,0,186,37,129,74,67,84,226,208,3,128,10,
+65,130,250,225,2,225,241,0,226,235,0,161,129,231,95,9,224,0,3,227,
+89,4,188,87,139,113,195,198,226,120,0,0,79,64,63,161,206,98,239,162,
+141,0,64,65,111,93,227,65,65,0,48,220,173,235,157,5,149,13,68,217,
+224,29,6,131,39,160,29,0,67,236,72,5,225,225,5,237,59,2,1,73,
+79,182,80,192,0,97,35,130,135,130,218,64,5,83,38,2,49,50,52,224,
+66,2,9,73,79,46,112,101,114,102,111,114,109,224,65,1,98,76,225,151,
+0,131,26,104,85,227,228,2,96,217,64,199,67,102,0,55,91,194,3,66,
+32,95,55,66,41,208,176,98,61,141,72,64,0,224,226,4,179,182,129,85,
+131,143,96,232,82,246,160,23,193,218,100,160,137,27,1,52,50,128,38,0,
+49,75,21,226,172,2,0,103,224,250,5,228,16,1,64,67,237,76,8,194,
+157,101,90,237,87,4,96,227,97,55,225,224,5,196,50,132,209,229,4,1,
+64,146,137,92,67,68,128,16,121,114,247,128,2,240,179,1,229,178,7,229,
+177,7,0,90,201,96,96,11,160,13,224,133,1,128,9,64,130,229,80,7,
+225,213,0,2,79,32,35,78,154,160,111,209,42,128,0,224,98,3,133,231,
+229,34,8,227,85,2,65,120,162,214,64,2,225,245,1,224,127,8,64,0,
+229,251,7,65,163,1,51,52,103,19,209,255,98,49,101,49,65,0,3,95,
+52,51,54,185,204,0,50,160,175,225,10,1,133,235,0,54,132,55,2,49,
+51,53,75,37,68,105,96,22,0,56,229,136,3,245,75,2,99,52,130,184,
+64,0,71,129,242,3,2,0,53,238,186,0,0,67,166,197,1,67,39,90,
+199,1,95,49,81,206,102,6,96,58,231,164,8,88,229,0,95,171,146,0,
+50,96,7,97,237,176,50,0,52,98,231,118,145,0,58,128,240,160,100,135,
+71,230,161,1,193,86,230,123,3,131,25,64,19,226,82,1,100,53,0,39,
+98,154,223,249,224,61,4,156,67,130,75,192,51,225,175,2,231,4,1,224,
+29,5,230,226,2,0,51,76,135,228,7,11,2,115,101,113,250,145,0,230,
+237,0,224,82,1,192,13,194,7,103,250,160,196,128,92,66,75,118,236,227,
+177,0,64,5,164,189,97,98,96,246,131,19,230,67,4,97,187,64,41,84,
+237,97,246,198,70,232,10,28,230,245,16,230,243,1,198,92,193,42,160,87,
+231,2,46,101,156,0,51,247,201,3,130,125,98,4,140,9,0,90,161,212,
+136,213,97,37,129,231,166,25,225,227,143,128,65,1,51,52,71,36,128,79,
+117,155,166,0,67,3,163,207,192,23,96,42,225,146,5,228,238,0,225,127,
+104,97,128,140,76,97,107,201,226,226,68,10,226,51,6,247,177,0,64,206,
+239,255,4,236,113,19,64,183,180,78,100,54,104,211,229,92,3,65,227,136,
+142,132,247,65,217,65,15,154,45,64,55,192,162,199,110,170,133,225,114,0,
+129,99,64,185,103,91,224,121,0,140,203,65,95,139,251,0,85,132,130,0,
+51,96,22,203,173,225,100,0,96,106,0,80,134,169,193,192,0,83,234,177,
+35,64,11,0,83,201,77,194,36,229,218,1,64,111,2,95,49,50,93,160,
+183,141,196,253,134,185,96,124,128,34,97,132,160,34,230,161,1,167,250,96,
+195,187,64,1,32,83,128,196,229,147,8,71,169,96,62,224,25,12,112,229,
+224,25,12,145,24,64,199,231,244,4,181,76,97,156,64,134,96,195,245,88,
+2,131,82,104,151,245,110,4,133,3,82,119,236,73,1,64,63,71,255,227,
+15,4,70,89,235,128,30,5,79,32,35,49,50,48,231,17,0,226,249,7,
+235,119,25,96,0,197,167,232,106,1,96,249,74,101,160,24,214,160,93,14,
+193,201,224,7,7,64,0,203,134,242,237,4,206,95,169,38,225,103,9,225,
+253,0,224,131,4,128,130,226,59,3,128,61,79,143,65,51,2,57,56,51,
+90,235,68,187,136,9,96,0,64,49,64,33,64,232,187,19,224,157,0,192,
+235,224,129,8,96,62,224,129,8,96,21,128,79,65,175,230,54,16,2,95,
+53,54,94,64,238,13,2,224,42,14,224,145,10,139,201,74,6,225,89,2,
+160,168,131,67,224,171,7,235,87,0,224,25,8,208,28,96,25,226,178,4,
+109,9,161,133,64,107,0,53,234,12,0,106,120,1,49,50,80,218,192,142,
+170,231,101,127,198,148,163,208,224,109,8,224,32,19,139,211,132,205,225,87,
+4,192,24,176,116,229,98,2,165,46,224,49,8,96,23,161,137,196,228,102,
+89,1,95,50,94,215,128,0,227,168,8,64,211,88,244,1,51,52,131,128,
+226,98,15,65,17,98,167,131,67,140,185,192,24,172,143,226,184,41,224,140,
+0,196,148,224,37,10,96,255,145,238,193,113,236,59,0,165,87,237,228,4,
+229,77,0,235,119,0,224,52,22,160,214,224,52,6,224,10,0,224,52,13,
+162,130,224,41,4,192,229,139,177,107,146,238,101,17,9,68,97,116,97,46,
+76,105,115,116,95,91,160,2,46,43,43,237,110,0,128,83,230,85,3,227,
+208,1,224,0,6,196,115,163,86,228,107,9,122,207,233,212,1,5,49,50,
+52,50,32,67,94,21,98,218,64,15,142,52,162,220,70,41,139,225,138,138,
+231,53,1,110,233,227,181,9,96,197,4,82,97,116,105,111,128,198,2,95,
+109,107,96,13,1,110,97,92,248,64,0,131,76,127,9,0,48,93,173,224,
+17,6,68,63,64,117,140,75,70,159,159,175,70,209,69,140,0,53,114,42,
+1,54,49,72,152,127,131,96,20,191,142,1,51,55,69,220,0,48,76,244,
+160,5,204,248,129,29,140,105,96,66,165,209,7,50,49,52,55,52,56,51,
+54,165,12,224,219,25,11,73,110,116,101,103,101,114,46,95,105,110,116,65,
+173,1,84,111,160,17,224,222,2,101,72,237,98,0,195,127,233,215,0,64,
+168,163,128,224,111,32,161,77,1,105,110,224,112,12,227,223,6,230,181,0,
+64,0,0,58,129,91,73,65,129,76,131,138,2,95,52,54,225,9,5,98,
+19,195,86,103,55,97,101,64,70,227,119,0,0,85,225,122,3,64,0,0,
+89,169,118,148,89,108,131,72,89,225,149,3,224,92,1,229,158,0,234,149,
+2,224,170,1,2,85,32,65,96,36,99,156,74,25,161,177,0,50,71,159,
+1,53,57,162,200,78,209,97,66,129,176,64,220,140,11,3,83,32,85,32,
+224,107,2,128,150,99,128,64,2,163,141,160,250,237,44,1,224,226,7,224,
+255,0,224,229,2,99,204,104,130,137,235,83,110,128,26,65,69,224,12,0,
+224,156,0,3,95,49,57,55,64,138,142,182,224,254,2,64,172,191,113,96,
+21,2,51,50,55,77,201,64,22,0,54,195,99,128,174,246,31,0,234,226,
+0,128,194,96,128,99,158,0,55,247,72,0,2,49,49,57,151,23,106,24,
+96,54,0,79,227,251,0,202,239,110,50,241,115,1,240,102,2,128,95,74,
+64,4,95,49,50,56,53,233,21,0,0,51,164,36,64,157,139,128,134,178,
+98,66,234,186,1,165,74,96,13,229,24,13,203,205,128,47,165,27,224,13,
+0,192,63,224,64,3,241,10,0,224,67,0,228,233,1,192,55,192,71,193,
+20,129,44,224,88,4,97,42,231,109,0,192,178,225,93,3,193,7,210,196,
+107,201,65,90,231,232,13,128,32,113,94,72,220,143,132,161,127,98,85,0,
+49,72,142,1,57,56,74,171,233,92,1,225,143,9,226,150,1,178,247,96,
+88,0,80,97,155,96,42,65,135,160,130,236,48,1,0,95,64,111,113,243,
+72,245,235,215,4,64,0,142,222,160,247,135,65,181,252,181,176,99,123,114,
+104,236,96,0,224,51,1,226,95,0,131,0,198,98,0,49,132,176,192,130,
+232,183,5,68,78,225,112,0,193,199,225,86,14,65,139,129,143,224,16,1,
+217,253,96,142,132,151,160,93,128,156,192,200,1,95,51,69,70,167,51,1,
+49,49,125,146,224,164,11,224,17,3,226,47,0,142,3,96,29,226,158,0,
+165,42,85,63,0,80,67,138,0,50,229,115,2,7,92,34,92,34,44,48,
+58,48,101,92,161,97,96,219,224,41,21,132,186,96,0,66,7,0,57,234,
+199,3,0,109,229,168,0,102,232,4,50,54,32,95,55,102,230,128,17,67,
+154,0,83,91,137,225,58,7,180,4,160,239,160,62,155,35,96,11,0,52,
+108,112,212,92,66,23,64,15,224,126,8,0,112,232,71,0,83,68,0,51,
+128,41,97,49,67,218,206,225,132,25,251,59,14,131,142,227,209,4,245,83,
+4,66,220,129,103,224,39,4,128,142,182,126,226,240,1,129,135,174,170,245,
+201,10,161,117,64,157,0,51,228,120,2,160,105,0,50,98,7,65,0,219,
+119,197,179,177,185,248,56,3,194,73,227,114,2,238,78,7,230,149,0,164,
+65,99,63,64,58,97,8,165,106,206,142,186,141,243,28,6,96,14,140,147,
+143,255,128,30,227,197,2,229,80,3,149,3,169,168,141,148,117,190,225,184,
+8,210,69,129,38,143,244,1,51,51,136,36,227,251,1,65,38,143,203,119,
+179,0,57,64,79,97,115,64,24,137,186,76,3,66,38,110,208,132,61,66,
+135,70,53,64,36,181,181,236,193,3,194,4,193,57,133,213,97,22,100,41,
+194,170,96,45,202,94,131,106,128,5,225,80,1,161,117,229,125,4,152,93,
+129,14,64,21,96,225,138,162,98,250,152,135,80,50,240,196,0,161,6,71,
+84,197,123,136,30,160,200,129,9,64,10,71,94,0,54,86,251,110,27,225,
+83,6,0,118,210,129,64,72,98,248,165,36,164,204,164,225,224,179,0,253,
+147,4,228,207,0,133,46,160,186,64,15,231,124,0,131,43,160,2,229,221,
+1,133,114,128,21,64,43,65,35,224,35,1,128,30,65,210,230,55,0,211,
+250,0,80,73,41,68,49,213,211,177,220,229,252,0,225,169,0,229,57,2,
+229,141,1,128,13,237,70,8,203,254,192,192,231,146,3,161,181,100,106,225,
+58,3,0,68,74,140,13,66,111,111,108,46,111,116,104,101,114,119,105,115,
+101,228,88,0,212,217,224,249,0,245,104,4,75,15,129,28,245,84,0,225,
+53,1,175,16,96,5,65,150,137,31,64,31,99,69,1,80,32,91,185,0,
+90,99,77,129,230,101,186,1,57,48,149,225,244,247,15,250,211,1,255,57,
+0,192,0,130,70,80,232,0,53,172,106,66,96,96,115,106,66,228,215,0,
+122,36,96,4,161,252,164,60,215,125,64,47,216,206,229,183,1,167,93,226,
+65,1,194,243,107,33,102,201,215,165,1,50,57,165,92,224,220,0,96,246,
+128,221,132,135,66,29,161,233,224,144,5,224,37,0,163,156,226,197,0,97,
+247,199,234,192,151,225,4,0,100,249,96,8,232,160,2,65,15,96,146,139,
+116,203,135,64,22,129,157,65,35,234,2,3,163,210,232,72,2,97,84,90,
+62,194,3,180,246,226,97,0,212,249,224,16,0,233,247,4,192,1,169,210,
+224,19,2,126,117,224,16,15,197,223,232,80,1,193,235,192,21,138,226,224,
+163,2,138,72,229,240,5,194,180,224,176,4,169,52,226,211,3,226,220,4,
+224,42,2,228,33,0,68,111,70,89,164,217,224,60,5,248,66,2,194,18,
+128,33,224,191,1,161,58,128,24,196,134,235,106,2,227,229,1,229,129,1,
+220,12,220,18,96,27,64,42,67,194,76,169,249,233,4,224,100,1,192,198,
+224,71,8,167,4,96,70,100,51,250,48,9,0,95,102,101,194,186,66,197,
+225,255,0,227,148,13,241,69,2,195,159,161,201,225,186,6,129,173,224,0,
+0,129,89,224,198,1,224,43,0,237,95,1,224,159,4,245,175,8,234,6,
+0,1,95,51,132,105,238,28,0,224,53,2,103,126,245,218,4,167,163,224,
+222,0,226,220,0,64,183,249,22,8,224,116,7,229,93,1,69,67,0,49,
+129,151,129,10,163,189,196,156,224,20,2,162,215,64,0,67,110,137,150,105,
+216,0,80,103,202,79,224,230,175,3,70,24,131,194,225,205,1,128,9,128,
+90,227,11,1,64,60,215,236,4,95,49,51,48,55,97,174,0,52,93,71,
+129,182,64,184,1,49,51,87,16,128,44,241,239,2,1,51,49,145,87,152,
+79,2,51,49,57,128,139,136,49,250,122,13,225,207,4,166,248,64,0,64,
+62,142,236,64,69,128,96,224,203,0,100,28,194,225,195,138,195,26,98,157,
+164,106,229,104,0,226,48,5,229,76,0,160,171,64,101,199,224,100,243,246,
+49,0,1,48,50,173,193,1,64,67,69,93,228,149,0,161,226,101,221,96,
+181,229,33,0,64,75,207,181,67,221,1,56,57,91,242,1,51,48,138,221,
+2,51,48,53,128,110,0,54,137,69,97,53,0,48,114,203,98,114,233,139,
+0,65,102,225,131,3,224,169,2,161,236,3,49,51,49,50,95,70,64,22,
+168,196,146,64,223,163,72,98,64,31,201,238,132,223,128,97,129,118,70,47,
+0,80,160,213,240,76,0,228,123,6,64,72,130,162,192,33,227,166,1,224,
+27,0,230,211,3,192,20,129,143,134,255,0,85,162,230,160,149,224,28,8,
+166,226,160,28,224,29,7,99,150,224,29,16,111,108,224,29,1,100,60,130,
+38,131,185,228,14,1,145,126,161,30,227,132,5,208,117,97,48,130,209,99,
+59,132,82,103,143,232,44,5,229,197,2,236,80,3,192,7,236,22,2,107,
+5,225,50,0,123,63,230,56,4,230,162,0,225,68,2,64,56,234,51,4,
+224,56,1,224,19,3,224,62,2,161,22,111,176,230,32,3,160,108,192,28,
+64,16,115,202,198,116,130,231,232,244,0,128,41,227,142,0,225,252,1,128,
+0,238,211,8,27,115,114,99,47,77,105,99,114,111,72,115,47,73,110,116,
+77,97,112,46,104,115,92,34,44,55,51,58,49,238,72,2,97,86,132,6,
+131,21,64,129,98,212,0,48,143,166,0,54,98,170,67,8,236,128,8,64,
+20,75,216,64,145,64,35,195,168,80,226,109,35,132,0,129,13,231,148,0,
+193,159,81,38,227,159,4,160,40,234,114,0,235,15,0,128,239,1,50,57,
+136,241,231,167,4,193,80,235,62,0,0,80,244,114,2,226,250,4,253,215,
+0,64,73,0,54,64,37,137,29,192,7,167,108,192,60,97,112,192,92,64,
+131,97,114,92,0,228,165,3,128,12,0,51,225,1,0,164,94,0,49,92,
+133,228,82,1,64,30,132,23,1,48,48,68,23,64,22,193,40,96,42,161,
+208,68,137,70,175,64,34,228,74,0,68,231,133,110,64,30,96,54,165,87,
+194,103,136,223,224,237,3,164,15,225,46,1,243,54,2,99,124,96,119,218,
+136,224,47,3,131,193,193,118,245,95,2,160,25,96,237,237,32,2,128,193,
+218,132,229,246,0,226,226,3,233,25,10,160,24,236,240,1,232,199,2,227,
+88,3,128,134,224,133,1,231,160,15,224,75,59,232,54,2,224,75,23,167,
+158,224,75,17,232,173,0,129,36,128,2,229,156,0,161,89,117,236,137,160,
+160,36,236,122,1,224,32,7,224,124,0,228,53,4,96,41,224,40,6,224,
+41,8,224,11,0,160,48,224,47,7,96,64,64,252,64,7,128,184,66,107,
+168,104,161,174,111,40,225,139,27,224,40,26,206,65,225,69,30,128,175,131,
+59,98,125,224,6,1,194,200,224,30,7,224,31,1,219,170,224,34,1,224,
+35,14,192,37,224,30,8,224,38,1,170,69,112,183,225,49,4,65,46,134,
+152,0,75,103,246,64,47,163,222,235,28,0,224,10,6,225,144,1,0,32,
+200,250,0,58,128,127,96,56,234,93,2,64,28,64,26,133,91,1,73,32,
+64,11,132,101,0,80,96,11,0,54,96,11,131,83,128,5,64,149,137,229,
+65,64,0,75,74,187,64,172,64,44,132,119,224,44,3,128,247,105,1,2,
+51,52,51,250,178,10,70,55,0,33,134,47,0,73,64,234,100,248,162,25,
+133,197,171,145,194,193,224,132,0,249,153,0,128,31,204,107,228,32,9,228,
+27,11,231,40,7,129,54,228,16,33,224,63,0,163,116,227,254,32,128,56,
+166,88,227,229,28,225,66,1,224,11,5,224,12,17,227,113,7,65,85,133,
+219,123,37,0,50,205,19,72,251,64,27,244,21,1,237,47,1,192,27,130,
+120,0,90,73,90,64,14,194,122,0,90,104,252,0,58,144,143,97,243,162,
+109,129,22,72,245,234,52,3,64,5,128,25,245,45,0,151,122,169,179,2,
+95,49,50,68,17,231,43,0,251,93,0,168,50,136,39,134,0,192,99,108,
+243,226,240,1,247,222,9,128,21,0,50,126,58,149,57,64,118,149,92,237,
+149,2,129,212,109,199,231,157,0,64,54,107,141,119,251,130,142,245,175,0,
+171,102,96,11,136,135,64,39,131,52,225,7,0,198,188,127,8,166,184,246,
+78,5,96,223,160,143,3,67,32,95,54,128,189,128,135,237,49,3,128,82,
+253,7,0,1,56,52,190,50,1,50,49,94,194,0,49,77,99,96,180,1,
+95,49,92,255,135,238,128,0,2,95,50,54,76,26,238,122,11,162,142,64,
+184,0,54,161,210,105,73,193,57,138,115,230,165,1,192,176,226,233,0,151,
+244,129,149,224,40,26,179,215,227,157,2,224,40,15,162,245,198,130,201,131,
+224,33,2,248,78,1,237,148,0,194,104,252,7,7,184,174,98,96,0,56,
+195,188,224,20,3,0,55,195,62,203,37,224,111,10,96,55,224,52,4,201,
+155,224,120,10,161,17,224,158,3,225,29,25,160,79,224,39,24,161,218,246,
+105,2,204,94,224,38,4,212,255,204,86,224,156,0,192,24,249,10,1,251,
+197,1,224,40,4,129,42,128,243,105,149,203,186,1,49,48,117,17,96,6,
+85,149,131,76,1,49,50,78,248,224,0,0,64,88,224,82,8,235,131,2,
+64,116,129,221,195,24,1,53,54,74,207,96,91,226,240,1,2,50,56,50,
+217,241,221,89,131,198,131,35,224,104,15,161,76,224,229,3,242,86,0,254,
+120,13,139,247,224,41,5,226,125,0,104,72,237,56,1,146,3,197,154,128,
+196,96,174,1,57,56,64,161,160,10,64,131,206,168,236,207,0,0,50,64,
+33,64,6,235,218,0,160,0,128,70,230,77,9,163,99,161,139,226,106,9,
+225,164,1,238,64,1,193,69,193,35,226,136,4,100,35,153,205,127,193,99,
+247,0,80,143,3,165,206,219,230,224,23,0,72,33,64,24,204,28,97,66,
+69,175,211,103,225,196,0,1,49,50,173,3,64,170,248,174,5,64,141,205,
+135,65,1,112,159,97,223,231,234,2,80,241,199,11,130,129,228,141,1,224,
+25,2,96,246,99,137,2,56,52,52,129,94,0,50,83,6,69,236,244,128,
+5,0,35,64,31,110,187,232,122,4,10,116,117,112,108,101,67,111,110,115,
+116,114,174,168,85,1,64,43,224,35,1,1,40,41,185,255,96,171,225,17,
+1,132,87,161,18,187,15,225,123,0,198,227,88,199,130,238,96,19,225,19,
+0,242,175,1,224,52,0,227,229,1,137,165,224,40,0,160,226,0,49,165,
+189,156,204,147,140,194,247,98,107,2,49,50,51,99,144,99,36,157,173,128,
+58,181,217,239,224,0,239,6,0,250,234,8,0,120,192,234,0,55,243,111,
+0,166,183,230,160,0,225,32,9,16,67,111,110,116,114,111,108,46,69,120,
+99,101,112,116,105,111,110,73,204,8,101,114,110,97,108,46,112,97,116,64,
+9,8,77,97,116,99,104,70,97,105,108,129,100,135,12,0,51,128,84,1,
+50,55,114,216,70,176,1,49,50,155,207,96,128,207,225,1,80,32,99,148,
+130,147,64,43,193,103,161,53,2,95,49,50,71,252,221,63,97,242,64,41,
+0,54,96,41,176,69,207,173,100,193,0,75,133,232,228,2,1,188,224,212,
+225,90,61,71,253,227,42,0,193,68,167,180,0,50,157,158,224,46,7,255,
+206,5,1,55,49,103,183,143,50,224,106,1,225,214,2,230,246,5,242,38,
+1,192,5,128,74,230,8,1,224,55,0,230,23,1,96,0,128,66,224,1,
+1,231,67,5,202,108,64,0,226,158,9,224,140,5,224,77,9,224,75,5,
+164,234,128,38,224,76,2,248,76,2,216,16,253,187,3,231,174,6,96,23,
+69,90,124,234,224,116,4,192,83,231,187,7,224,34,2,153,238,161,3,129,
+21,224,84,0,96,66,96,111,128,17,231,68,12,243,122,6,231,24,8,235,
+215,2,224,115,5,224,165,3,138,121,7,95,52,53,50,32,64,95,57,174,
+203,192,33,219,207,225,111,3,249,39,2,221,214,131,143,234,134,0,128,0,
+99,202,241,65,1,237,179,1,233,46,6,225,187,3,228,49,0,193,113,225,
+207,0,192,77,64,80,115,3,249,221,15,242,179,5,0,55,64,213,255,68,
+1,192,10,234,113,11,0,54,234,113,16,96,142,169,40,196,213,171,83,192,
+102,0,51,235,230,2,192,173,226,161,5,64,27,129,84,231,7,10,243,158,
+10,233,170,16,224,129,14,0,52,224,129,5,225,64,1,231,92,9,226,182,
+0,97,77,226,128,0,224,83,5,231,116,0,160,85,243,241,16,224,81,4,
+163,8,135,145,1,95,56,132,94,96,52,87,169,235,173,10,165,192,248,110,
+2,100,247,230,155,2,96,66,134,155,64,228,224,25,2,96,64,160,25,199,
+200,231,225,7,66,0,236,8,1,193,59,245,66,5,226,169,0,225,10,19,
+244,252,1,225,9,17,64,111,199,88,166,108,128,6,134,36,64,5,0,52,
+230,163,2,2,115,101,113,167,170,64,56,250,85,1,192,168,226,15,1,0,
+85,231,12,8,227,194,0,151,47,224,13,9,132,43,228,69,0,128,197,224,
+66,2,185,205,227,177,0,192,65,160,119,2,39,32,85,79,52,247,29,17,
+6,68,101,115,117,103,97,114,151,30,5,52,49,49,58,49,48,247,32,2,
+227,212,3,129,85,227,204,3,64,0,240,209,4,224,2,6,224,71,1,230,
+51,3,229,38,1,192,83,230,57,1,224,191,1,224,197,6,192,10,111,124,
+224,85,11,229,67,8,224,96,4,224,102,8,224,103,6,224,55,5,230,169,
+11,224,50,14,96,98,230,31,4,224,52,26,224,195,3,224,31,11,253,69,
+2,225,95,12,249,113,13,224,23,1,205,93,233,197,3,194,60,224,8,10,
+96,242,224,11,2,169,182,195,25,128,68,228,148,8,225,154,1,131,114,230,
+85,4,192,66,128,11,226,174,2,101,217,163,81,0,51,169,91,192,83,229,
+109,5,231,188,4,138,166,198,74,146,80,250,28,0,230,214,4,224,243,3,
+172,227,228,25,2,76,235,120,218,64,187,199,104,187,152,157,250,228,69,3,
+225,215,11,64,41,141,185,0,90,209,235,216,84,224,144,2,236,204,1,194,
+177,64,77,196,126,229,114,1,192,209,2,95,54,52,96,168,96,15,64,164,
+224,103,2,128,137,224,136,5,180,223,224,38,5,66,54,1,95,57,93,87,
+224,0,3,129,9,224,1,3,226,179,8,231,237,2,224,48,12,226,175,2,
+224,26,7,226,170,1,226,159,7,192,33,226,180,9,226,155,26,226,134,27,
+226,48,13,130,42,128,35,224,122,3,128,86,226,16,1,196,51,96,21,129,
+112,64,43,130,30,128,24,226,31,2,160,62,162,34,192,122,226,37,9,229,
+133,5,175,173,128,36,255,250,0,128,110,115,253,0,51,226,49,12,96,54,
+226,37,1,226,30,0,3,95,54,32,85,226,11,5,111,243,130,10,64,47,
+182,236,224,0,2,225,148,9,228,79,3,224,168,0,224,11,15,228,24,39,
+128,86,228,178,6,64,56,0,48,230,243,4,196,214,227,177,10,226,60,9,
+3,95,49,48,53,231,50,5,226,63,8,160,101,224,104,5,132,132,109,201,
+1,50,51,219,163,230,208,6,193,205,192,1,224,170,10,226,192,5,97,125,
+161,59,143,219,87,26,141,232,235,53,0,194,102,169,234,192,232,135,252,97,
+226,128,66,66,17,170,185,96,164,132,46,224,145,1,232,42,5,64,17,64,
+49,78,147,160,104,162,132,82,128,120,132,66,157,1,95,52,78,56,128,0,
+194,164,100,249,2,49,50,53,149,163,1,49,50,73,191,112,178,2,49,50,
+53,164,118,101,3,0,90,101,19,105,82,96,167,96,17,192,93,224,83,0,
+225,184,1,163,77,66,175,226,174,0,224,186,13,153,20,131,123,226,209,7,
+0,83,161,187,231,117,3,226,229,4,164,241,98,219,0,85,90,102,228,253,
+0,224,39,5,131,13,192,38,224,37,2,160,152,192,227,129,122,160,227,0,
+90,111,20,1,83,32,82,4,161,219,229,246,4,129,106,96,60,235,41,3,
+233,223,0,192,59,192,249,228,52,3,226,90,3,196,58,192,19,193,155,224,
+111,13,224,59,5,165,127,225,122,2,238,223,9,106,193,224,55,0,96,93,
+194,99,230,155,3,228,128,19,160,0,0,58,144,190,145,107,169,54,97,101,
+227,112,0,160,203,224,216,5,234,30,9,233,190,4,195,53,129,73,182,216,
+192,224,234,252,13,224,61,0,206,159,228,88,3,174,95,160,232,101,182,128,
+97,160,101,187,222,0,49,117,23,3,64,64,64,75,66,11,96,4,96,13,
+160,128,66,148,153,74,66,155,160,242,64,76,194,146,85,254,0,55,213,93,
+2,49,50,53,125,36,0,50,128,84,64,8,121,108,0,49,88,202,96,68,
+146,12,192,186,2,85,32,95,82,30,192,217,253,2,2,230,25,0,224,21,
+20,224,236,0,239,96,5,166,73,224,60,6,160,49,195,241,64,250,96,228,
+64,27,163,168,192,99,128,48,82,45,164,43,224,90,0,180,1,64,28,227,
+229,0,98,66,96,29,117,54,96,90,80,101,91,174,84,218,64,14,96,70,
+131,31,161,167,194,42,129,71,229,212,5,195,10,224,118,0,226,56,6,224,
+25,1,229,226,4,241,86,7,134,169,224,17,1,226,69,5,232,155,0,230,
+28,0,224,132,1,232,103,1,143,207,98,160,97,217,78,217,116,205,128,74,
+128,135,208,139,192,249,192,0,130,83,130,74,247,246,0,128,23,161,248,1,
+75,51,192,9,96,0,66,34,0,54,244,47,3,96,85,128,11,128,109,192,
+5,235,38,0,224,209,0,86,102,187,156,96,17,128,208,251,176,2,160,79,
+161,75,228,206,0,134,130,160,88,66,170,0,50,96,53,102,172,192,7,136,
+183,162,223,134,35,1,54,51,129,167,97,70,133,54,224,14,5,2,95,54,
+50,163,23,160,0,252,20,1,233,66,1,228,43,2,225,236,0,196,140,225,
+2,1,98,99,64,115,248,123,7,0,64,113,222,246,13,2,0,110,142,155,
+224,22,7,1,116,116,214,37,67,144,126,46,0,80,130,0,64,130,153,151,
+100,247,85,226,165,0,65,205,0,56,87,145,129,238,189,56,225,189,13,64,
+88,255,249,0,64,60,239,222,1,79,95,208,128,194,82,132,155,194,130,224,
+7,1,193,21,160,59,81,74,128,57,161,207,112,209,0,79,198,104,161,50,
+227,2,1,193,56,230,123,2,99,175,226,13,1,244,85,2,229,84,15,229,
+86,0,68,231,230,164,5,224,48,11,225,164,3,229,98,0,130,163,143,78,
+128,44,233,206,0,131,146,228,65,6,227,123,4,196,204,160,79,130,174,224,
+28,6,160,104,96,97,131,88,64,47,237,97,2,192,94,226,75,0,128,23,
+240,233,8,12,108,105,98,47,68,97,116,97,47,76,105,115,116,144,227,4,
+53,51,54,58,53,240,226,2,224,0,5,225,156,21,101,2,225,162,0,228,
+239,3,208,94,128,215,240,114,0,224,215,26,233,78,2,128,204,64,44,154,
+160,226,10,0,224,39,12,64,15,224,142,3,160,0,66,171,0,51,243,69,
+0,66,32,227,121,0,224,2,1,225,70,2,128,1,105,132,200,161,224,23,
+2,192,189,224,26,0,235,186,5,229,88,2,224,52,0,228,128,1,224,74,
+7,226,62,4,197,189,230,50,1,160,52,224,41,1,167,202,96,82,224,23,
+0,224,17,6,96,8,128,43,251,134,1,133,171,251,111,0,245,48,0,224,
+93,2,96,36,233,131,1,224,89,1,224,8,0,92,50,107,86,98,103,2,
+49,51,52,243,254,14,1,61,61,162,77,96,38,68,97,68,202,224,113,0,
+131,99,233,155,2,128,1,166,156,224,16,16,64,117,126,124,74,164,133,53,
+0,55,83,201,123,105,68,208,125,230,253,72,1,224,1,1,132,146,245,184,
+6,225,212,8,160,110,224,22,7,239,234,0,224,45,28,224,22,0,193,193,
+228,172,1,224,14,0,224,51,3,179,129,193,119,172,154,189,158,225,107,17,
+2,79,32,35,70,104,162,228,225,102,13,64,94,226,65,1,226,125,3,226,
+87,4,99,87,160,50,192,0,160,142,199,112,231,228,0,67,73,214,118,1,
+80,32,103,35,155,243,64,117,1,10,65,92,5,64,12,149,240,0,80,134,
+42,91,120,128,3,70,6,2,90,32,90,166,125,232,19,20,71,117,5,10,
+65,32,95,52,56,64,172,159,214,98,216,0,90,129,99,128,193,64,20,66,
+156,160,20,232,172,6,237,22,2,64,96,236,251,1,128,65,194,226,1,85,
+32,224,29,2,224,71,10,224,59,4,96,31,160,129,103,219,224,28,0,224,
+109,2,224,36,1,233,62,7,69,143,0,48,125,2,110,101,64,232,139,100,
+226,45,5,66,196,64,27,203,59,229,128,8,229,83,0,134,134,64,79,99,
+213,96,210,229,19,5,230,34,1,64,81,0,54,192,109,119,36,96,39,66,
+223,161,99,229,163,1,228,78,0,128,230,224,70,1,128,135,224,86,2,192,
+148,160,154,64,100,216,229,96,182,128,90,197,48,237,63,3,197,43,250,12,
+4,128,23,161,15,252,146,3,0,85,174,83,232,4,2,238,146,19,224,37,
+10,202,40,0,85,66,48,129,141,97,58,0,52,75,185,162,79,137,117,95,
+58,105,251,138,200,64,211,136,235,3,95,56,55,50,239,159,9,0,49,64,
+46,239,179,11,224,19,7,224,39,11,139,70,224,239,11,2,95,56,55,112,
+50,91,206,101,47,67,57,128,18,160,152,224,57,9,159,133,3,75,32,95,
+53,177,122,64,12,0,83,163,38,224,61,5,131,137,160,98,0,54,96,5,
+227,130,1,96,90,224,168,5,66,218,224,110,7,64,72,224,168,2,96,69,
+192,155,96,134,224,175,7,224,196,12,225,19,7,0,49,64,135,224,19,7,
+114,36,224,126,6,132,127,192,81,0,56,91,68,128,100,224,98,7,224,56,
+6,0,49,145,163,224,183,3,224,60,2,224,161,11,225,12,6,0,49,65,
+103,224,84,7,65,201,224,122,8,224,78,12,224,37,2,229,173,0,224,239,
+6,225,2,11,64,238,224,19,7,225,149,10,0,49,129,149,225,223,3,225,
+127,10,224,240,0,224,62,8,146,45,224,60,9,0,85,114,87,226,72,3,
+161,240,130,105,224,86,7,225,51,7,65,115,224,106,6,65,211,225,11,2,
+133,99,225,189,9,226,97,15,225,13,8,64,23,224,18,6,225,168,10,129,
+167,226,252,8,212,107,227,103,27,64,227,179,223,243,230,0,226,34,7,226,
+175,10,225,88,16,226,35,18,225,80,2,100,136,0,51,228,136,18,64,59,
+224,134,6,104,66,224,134,5,132,35,226,30,22,224,20,23,224,237,31,224,
+56,6,227,14,22,225,223,7,64,240,136,111,160,240,225,181,8,103,76,226,
+135,4,160,54,136,144,96,54,0,67,104,119,224,118,5,224,13,13,226,10,
+4,64,69,136,201,160,69,219,34,243,14,4,225,82,0,224,25,13,96,74,
+230,209,8,100,63,227,139,12,230,180,7,184,254,229,74,1,228,172,4,224,
+49,11,96,139,225,41,7,224,49,3,224,141,8,130,205,225,228,11,224,91,
+7,96,24,224,183,11,72,216,1,52,51,236,2,2,25,72,97,115,76,111,
+99,32,69,68,101,102,58,32,117,110,105,109,112,108,101,109,101,110,116,101,
+100,140,26,0,58,129,102,104,39,97,94,246,141,2,96,92,160,35,137,30,
+225,253,6,192,119,64,32,201,35,192,68,0,80,198,251,224,74,8,0,54,
+226,17,5,0,75,224,78,8,224,15,9,224,232,8,64,71,136,222,7,95,
+49,49,57,32,95,50,57,74,0,232,48,0,0,52,139,131,0,53,224,19,
+0,64,47,168,58,3,54,32,95,57,86,69,2,95,49,48,64,159,64,25,
+131,203,105,172,65,61,136,252,120,253,225,72,1,11,105,109,112,111,115,115,
+105,98,108,101,58,32,129,58,130,95,153,36,169,233,0,49,131,6,96,234,
+97,10,0,49,157,84,186,135,224,86,0,2,79,32,35,74,162,209,77,96,
+56,96,40,239,45,0,64,150,163,113,224,224,4,134,20,204,166,249,162,0,
+128,120,4,54,32,95,51,48,235,33,0,224,107,1,64,250,208,18,224,23,
+0,160,53,1,50,57,176,74,192,44,75,9,96,44,224,31,4,64,0,225,
+81,0,64,132,64,160,131,219,0,80,76,107,89,248,114,221,227,156,17,97,
+186,234,84,15,89,20,200,247,226,238,8,96,57,185,95,233,28,0,234,87,
+13,161,27,250,187,6,240,137,5,238,130,4,0,58,128,34,243,153,8,0,
+55,64,235,227,75,5,7,99,111,110,65,114,105,116,121,175,84,5,67,32,
+95,54,55,54,236,232,5,128,132,129,199,64,89,131,54,0,66,251,187,2,
+64,6,65,162,162,61,0,56,64,211,186,141,130,67,1,50,51,66,129,1,
+95,52,101,70,162,86,224,35,1,1,95,50,149,122,64,92,131,114,102,1,
+144,188,129,85,236,236,3,247,1,0,64,8,65,9,140,209,89,92,108,127,
+224,153,3,225,181,1,117,207,227,7,0,224,186,4,96,76,236,246,0,252,
+146,3,155,227,220,107,64,32,224,186,6,248,245,5,112,32,64,138,163,198,
+225,32,7,225,28,6,225,25,0,1,95,51,99,208,224,91,5,216,46,64,
+79,131,230,96,47,0,50,124,41,4,95,56,32,64,80,140,181,64,31,167,
+184,96,29,0,83,76,104,192,136,195,110,96,85,0,48,162,6,128,68,212,
+20,96,157,108,42,128,26,141,122,224,40,20,0,90,224,40,2,2,95,51,
+54,99,197,97,34,64,114,167,28,96,230,81,63,224,71,0,189,78,224,224,
+1,0,49,125,19,183,26,0,57,224,11,1,0,50,129,55,192,80,131,133,
+0,73,67,145,64,70,64,92,0,51,96,143,225,169,3,69,2,225,152,4,
+0,95,96,80,113,192,64,56,226,180,0,0,54,66,225,186,71,64,194,64,
+28,130,116,128,97,130,69,110,194,209,26,0,50,108,139,64,7,0,52,128,
+47,229,165,0,241,51,3,64,84,99,142,64,33,165,151,224,33,6,0,57,
+224,33,2,197,159,0,89,98,22,214,34,64,214,66,241,97,53,0,48,64,
+104,128,6,2,95,49,50,107,162,132,35,131,28,160,5,224,21,10,225,193,
+0,129,183,96,80,132,167,192,105,96,39,131,27,224,42,4,180,120,192,16,
+208,55,232,50,5,224,33,3,242,195,0,224,16,16,224,67,8,233,74,0,
+224,50,17,252,111,1,64,210,197,21,224,168,2,252,145,0,224,17,0,97,
+34,129,250,225,12,1,187,69,192,38,69,13,224,13,1,64,48,104,116,97,
+47,128,42,145,8,0,48,70,117,228,101,1,128,38,165,106,252,212,0,160,
+126,228,55,0,160,168,96,29,224,183,2,224,17,11,134,43,224,137,1,128,
+155,96,16,224,39,6,225,224,1,225,11,19,128,80,64,168,233,51,0,224,
+71,9,225,11,0,224,118,5,151,214,101,159,128,25,199,135,180,46,0,79,
+99,246,3,49,54,32,79,96,96,0,55,246,253,3,224,163,1,96,2,160,
+94,160,148,182,169,193,105,151,67,192,133,226,222,15,204,239,160,229,88,224,
+127,79,112,124,224,64,3,194,201,160,90,128,21,192,76,224,82,2,225,204,
+6,128,96,224,82,2,193,213,224,22,6,128,54,96,204,133,135,64,78,0,
+57,251,4,3,0,104,167,49,128,201,122,164,224,41,14,1,118,115,160,42,
+226,121,2,1,49,57,171,188,96,14,1,57,56,97,126,97,54,68,102,231,
+37,0,1,57,56,110,99,248,122,13,226,230,2,224,75,1,99,7,105,189,
+130,215,102,34,224,26,2,162,33,130,109,68,135,213,114,64,1,1,80,32,
+143,224,161,195,0,32,83,129,128,37,133,212,192,35,64,34,0,80,133,10,
+133,156,129,135,105,175,244,147,1,158,224,128,51,96,182,130,91,162,17,185,
+124,70,202,114,132,98,136,233,195,9,64,0,8,95,53,55,48,32,95,50,
+55,54,201,16,0,58,97,98,160,120,2,53,54,55,97,124,0,51,75,132,
+65,232,64,77,64,33,171,222,2,49,50,48,98,13,0,48,66,194,67,221,
+2,50,48,56,164,133,192,15,0,57,174,82,96,165,160,32,244,115,1,66,
+243,200,88,1,49,50,77,94,129,166,81,31,130,119,245,60,0,64,64,224,
+56,2,0,54,96,56,106,75,64,54,225,65,1,98,90,129,65,65,144,181,
+54,224,82,22,64,44,134,53,128,81,225,185,1,0,80,87,28,224,81,1,
+167,129,224,248,43,108,67,224,191,0,206,161,1,52,53,129,154,64,33,2,
+55,32,64,235,80,3,0,58,128,52,224,38,11,227,2,1,1,91,93,99,
+1,64,43,129,148,224,26,1,4,68,97,116,97,46,92,46,6,95,84,121,
+112,101,46,34,96,193,64,61,226,148,0,117,79,224,10,6,194,154,96,44,
+129,101,97,5,171,120,96,22,199,164,2,50,48,51,65,46,88,240,96,38,
+104,199,71,216,96,37,169,57,132,34,77,141,254,234,5,0,102,131,186,98,
+100,184,177,138,14,224,40,14,96,83,193,152,0,67,106,117,67,17,0,51,
+74,167,224,45,1,1,40,41,96,45,3,80,32,95,51,65,254,66,89,202,
+226,106,106,108,220,0,64,128,28,100,96,0,57,130,23,2,95,56,48,187,
+99,250,147,1,96,158,64,32,135,87,1,95,55,67,55,64,133,162,5,75,
+204,1,48,51,134,31,69,229,68,166,80,247,1,95,57,64,84,224,14,0,
+100,148,0,56,67,65,1,57,56,171,250,164,165,64,75,205,8,64,18,227,
+27,0,0,58,128,31,1,10,65,246,181,96,196,55,64,170,0,55,204,236,
+208,53,128,154,64,0,246,184,16,102,132,128,11,135,182,0,95,133,183,132,
+118,3,50,54,56,32,243,113,0,224,78,2,242,144,8,246,174,19,2,49,
+49,56,69,6,192,60,128,118,224,74,0,237,201,0,128,196,96,22,224,105,
+3,246,172,53,224,91,3,185,159,224,135,5,128,254,224,61,7,182,177,225,
+31,3,224,165,12,1,56,56,176,219,192,19,225,142,0,0,53,66,56,128,
+35,253,6,7,246,220,34,192,172,225,205,6,128,25,135,255,246,202,74,200,
+238,224,237,4,208,83,225,166,13,225,105,20,224,102,8,66,246,66,186,67,
+191,225,154,13,224,77,2,0,51,116,116,224,38,1,161,119,64,45,201,161,
+246,251,32,0,83,78,31,233,73,0,112,198,235,127,1,64,81,225,119,0,
+226,178,4,225,114,0,192,158,224,32,9,247,26,50,225,88,4,160,86,100,
+198,225,16,14,226,126,4,64,13,241,42,0,224,93,5,68,72,177,77,227,
+228,1,224,53,1,172,24,226,143,9,246,91,15,224,130,15,225,251,21,224,
+57,16,226,204,3,221,51,101,64,135,15,224,53,7,143,18,130,245,64,37,
+135,15,247,147,52,226,231,56,224,30,39,247,197,32,192,50,225,247,21,194,
+254,226,143,10,65,33,0,54,225,71,11,160,38,210,44,226,110,3,64,51,
+136,33,224,51,13,96,110,192,99,64,44,169,166,1,32,80,225,170,14,224,
+253,3,224,107,5,64,61,0,51,160,61,247,230,75,226,80,0,195,235,247,
+224,8,227,21,1,224,36,10,96,120,96,72,204,55,224,109,10,131,94,224,
+249,17,224,88,11,97,66,227,47,13,227,149,7,96,19,244,190,2,97,56,
+225,155,16,228,192,0,195,30,202,240,64,139,64,15,136,174,0,75,244,235,
+7,246,238,1,170,142,64,115,137,170,236,168,0,161,40,236,170,0,64,121,
+160,43,131,170,0,75,167,4,72,39,96,3,161,226,0,56,131,163,101,116,
+0,90,239,1,0,1,95,49,86,80,1,95,57,103,32,148,94,96,17,233,
+238,4,0,64,107,78,237,255,0,224,31,10,106,15,116,62,224,29,4,1,
+55,55,69,13,1,95,56,224,229,4,171,108,224,45,30,170,138,224,36,21,
+1,45,62,238,193,1,97,135,98,51,64,244,0,54,161,166,133,107,64,165,
+64,21,131,88,138,254,0,49,78,219,3,104,101,97,100,96,74,249,203,8,
+0,68,75,255,4,84,101,120,116,46,64,35,4,58,32,101,109,112,182,140,
+64,72,237,27,3,2,55,32,95,126,209,1,95,49,65,13,70,197,64,33,
+131,88,83,186,1,49,56,237,16,4,98,251,109,16,0,49,75,43,226,76,
+0,247,90,4,171,98,94,125,135,35,224,32,14,218,64,147,32,64,97,224,
+41,4,99,9,160,41,96,29,82,207,96,37,147,125,162,5,2,49,49,55,
+240,24,3,161,85,224,22,7,10,80,114,105,109,105,116,105,118,101,115,46,
+193,119,224,91,4,140,13,0,64,66,133,225,147,0,161,46,207,140,0,85,
+130,130,225,209,8,128,38,84,134,130,200,110,209,0,49,175,63,250,26,5,
+5,36,115,117,112,101,114,192,160,239,143,2,64,64,131,9,150,250,237,232,
+4,1,36,67,64,49,64,34,131,13,67,44,0,66,64,140,225,95,2,1,
+95,56,121,107,64,246,169,212,64,47,130,72,4,98,115,43,43,46,65,203,
+64,26,133,48,0,39,163,53,5,49,55,51,32,95,55,67,101,64,172,76,
+210,64,127,1,56,52,248,21,9,75,199,181,227,112,254,110,55,116,82,64,
+76,0,80,64,142,0,90,96,83,0,56,64,40,132,114,251,138,3,225,11,
+8,20,100,117,112,108,105,99,97,116,101,32,100,101,102,105,110,105,116,105,
+111,110,32,129,26,0,56,231,204,0,97,166,249,90,5,6,104,101,99,107,
+68,117,112,194,205,64,92,246,131,0,64,192,1,95,54,96,195,3,54,53,
+32,95,120,65,2,95,49,53,65,175,83,21,2,51,50,52,177,103,141,234,
+162,39,0,50,98,207,0,55,130,244,64,194,140,191,1,49,49,64,196,0,
+95,145,220,128,15,66,111,0,53,143,199,96,54,224,47,3,164,236,1,83,
+32,71,75,186,123,64,16,66,175,245,32,1,79,108,224,7,1,194,249,229,
+40,2,128,57,96,73,117,142,242,159,2,180,149,195,44,241,239,0,224,64,
+1,96,8,224,61,0,71,20,192,14,192,115,224,13,11,247,41,2,150,50,
+224,48,19,180,157,227,176,0,64,2,128,153,128,108,160,46,214,159,84,107,
+233,17,0,165,253,192,113,192,43,182,41,197,221,64,74,178,185,233,213,1,
+192,62,192,18,181,216,3,95,51,50,50,226,28,2,13,92,34,115,114,99,
+47,77,105,99,114,111,72,115,47,81,0,9,46,104,115,92,34,44,51,51,
+58,53,229,108,2,224,0,5,225,126,21,114,55,225,132,0,129,136,128,167,
+136,86,128,169,160,14,160,185,224,232,1,243,145,0,96,65,244,108,5,224,
+39,10,64,15,244,147,10,66,109,212,43,68,29,114,79,79,189,64,24,196,
+158,224,196,10,128,167,130,47,199,57,224,103,0,128,10,207,154,98,137,0,
+85,254,126,1,1,95,54,95,200,128,123,64,111,199,132,245,26,1,226,53,
+2,129,42,1,75,32,183,198,194,44,192,7,161,214,128,9,128,2,161,56,
+160,13,160,81,225,18,5,224,23,8,224,17,17,193,121,226,171,1,162,84,
+224,123,0,224,119,4,224,61,8,224,64,2,224,65,2,96,218,224,46,14,
+160,93,130,215,247,214,0,65,17,194,6,96,23,105,182,228,139,2,249,165,
+1,225,63,0,224,60,3,96,2,230,128,0,224,137,3,221,106,97,95,160,
+121,64,132,193,215,163,129,224,5,15,66,52,224,58,0,225,35,2,138,6,
+128,87,225,252,0,227,151,1,225,108,14,100,99,227,36,0,160,196,160,136,
+225,216,8,129,67,227,31,0,224,83,0,160,98,102,140,226,236,0,227,72,
+2,224,72,14,225,129,5,224,31,4,129,193,128,87,100,199,164,82,152,129,
+132,72,98,160,128,4,192,33,196,150,64,62,228,181,0,129,22,114,146,229,
+206,1,229,216,2,224,58,9,196,158,84,239,224,42,5,195,200,225,119,1,
+128,222,96,249,101,55,64,163,224,18,1,64,14,109,143,106,165,224,177,6,
+251,40,1,224,245,0,224,8,0,226,174,18,224,28,1,224,29,41,224,190,
+8,117,131,195,47,227,2,0,160,138,225,227,3,224,51,0,194,70,227,44,
+0,64,35,149,57,235,35,2,172,242,130,179,181,226,1,48,57,224,25,1,
+0,95,121,87,128,116,160,156,64,175,3,64,95,52,53,163,87,225,44,5,
+121,165,215,121,168,182,176,195,128,67,1,95,53,76,170,96,112,177,211,98,
+219,129,216,193,81,225,35,5,252,146,5,128,219,226,194,3,225,4,0,226,
+191,91,226,174,3,240,24,0,235,212,1,100,109,133,121,132,63,224,24,4,
+2,64,95,54,85,238,100,151,129,26,96,4,226,238,13,0,90,232,213,3,
+128,233,226,200,31,0,75,183,67,226,200,13,225,15,15,224,13,4,101,18,
+226,103,0,161,171,237,130,3,98,31,165,92,64,151,137,221,96,9,2,54,
+50,51,206,126,65,240,1,54,57,226,110,8,64,138,224,162,0,160,8,160,
+7,226,61,3,165,31,194,61,0,89,161,211,161,188,199,99,96,150,131,30,
+64,39,128,229,132,43,135,37,160,63,132,44,135,129,197,119,64,24,106,43,
+224,116,1,64,237,69,188,67,40,139,130,164,22,106,185,96,9,236,48,0,
+4,79,32,35,54,52,232,55,2,64,8,71,189,204,87,236,43,7,192,91,
+112,61,236,200,1,64,74,173,240,2,95,56,52,64,191,64,36,0,53,104,
+108,64,43,144,19,1,54,52,76,80,64,22,172,96,96,14,139,139,249,215,
+3,64,21,0,51,203,40,0,66,134,137,0,49,229,96,3,64,5,65,161,
+6,49,50,52,32,79,32,35,67,144,192,193,197,76,64,67,139,108,64,61,
+0,48,96,105,137,14,130,127,231,116,0,64,48,243,189,0,134,253,98,146,
+225,242,4,236,210,0,230,103,1,227,131,1,129,154,224,13,10,196,22,163,
+166,231,28,0,98,142,226,81,6,227,164,8,201,39,227,21,0,173,107,228,
+251,8,64,155,65,142,254,95,0,73,62,231,18,0,99,6,64,34,0,57,
+129,64,236,75,6,109,207,101,33,193,56,160,0,96,77,160,55,65,59,202,
+49,140,45,224,238,5,231,127,10,228,96,0,163,243,74,6,225,1,7,229,
+196,9,228,156,2,192,150,255,53,4,233,1,4,193,175,225,73,6,232,14,
+0,170,178,233,93,3,3,67,32,95,51,67,15,160,43,193,57,163,88,192,
+255,96,107,128,221,64,70,224,24,1,228,77,0,193,0,193,32,227,96,1,
+160,170,1,95,52,92,213,225,39,2,237,98,0,64,1,191,132,228,186,3,
+109,160,224,32,0,200,237,224,191,3,97,91,196,203,163,134,110,164,224,203,
+1,231,11,4,224,53,39,224,50,13,239,217,5,228,92,0,239,107,1,99,
+240,0,53,97,177,79,170,2,79,32,35,80,157,96,223,240,173,5,93,186,
+4,55,48,32,95,50,80,96,234,211,3,164,114,65,71,181,152,0,80,140,
+249,100,218,138,109,156,22,160,172,224,180,0,229,15,1,224,18,0,82,253,
+191,52,96,17,254,187,0,157,91,77,252,68,219,64,29,132,178,224,111,22,
+100,231,226,38,7,127,203,225,68,5,96,31,224,124,4,0,54,227,48,4,
+193,248,229,165,0,226,96,0,230,181,1,131,241,162,172,224,220,2,163,4,
+64,84,191,73,65,113,65,105,0,53,128,180,64,25,215,20,149,18,1,95,
+49,122,236,118,110,0,51,96,247,224,10,3,192,30,64,55,133,103,99,24,
+64,214,229,60,0,65,45,96,191,0,90,64,149,96,4,132,52,191,236,96,
+40,255,175,0,78,87,3,95,49,49,52,132,44,73,89,109,251,102,213,67,
+250,225,90,2,255,186,0,64,44,224,7,0,96,8,65,77,0,75,96,65,
+64,19,206,160,228,104,1,225,48,1,128,75,143,106,135,218,0,83,229,81,
+5,128,104,227,154,3,64,8,99,198,228,99,4,97,141,97,94,128,82,224,
+135,0,0,64,124,249,64,65,96,237,64,19,149,72,227,248,0,81,226,247,
+155,0,101,170,64,20,65,97,164,62,119,129,160,40,251,150,2,160,37,233,
+123,2,0,49,88,65,96,42,0,51,98,28,160,143,128,107,244,230,0,224,
+74,1,224,42,2,193,82,161,75,234,235,0,64,198,98,58,160,246,64,194,
+183,22,97,43,174,27,96,174,64,43,65,25,202,166,224,113,10,192,34,64,
+7,183,234,64,94,129,228,225,1,12,192,187,128,68,96,150,235,235,1,192,
+185,231,132,3,185,22,196,244,166,40,234,38,0,64,230,75,250,64,41,64,
+249,161,53,99,74,97,14,0,52,96,5,186,155,162,22,97,225,225,18,3,
+0,52,129,9,163,70,192,53,72,198,64,22,168,137,232,92,5,72,218,100,
+206,64,33,131,45,64,56,105,85,224,39,0,242,77,1,1,67,39,146,51,
+64,45,179,236,225,33,33,224,252,1,224,23,0,129,21,224,207,2,0,51,
+98,146,161,217,128,190,66,223,64,111,249,124,0,233,28,4,0,51,224,191,
+2,131,152,224,191,19,0,83,224,191,1,64,105,229,63,1,194,92,128,118,
+96,31,131,19,224,223,13,230,218,1,160,216,102,126,225,203,9,96,223,168,
+136,192,19,66,114,64,102,129,185,224,207,6,87,51,167,62,96,36,0,54,
+128,139,226,220,5,196,16,128,139,130,100,232,139,0,227,134,4,224,169,7,
+224,162,0,226,116,11,228,195,0,226,137,12,226,127,0,226,191,2,224,79,
+16,0,50,230,81,0,225,13,7,193,1,192,224,139,69,64,231,196,128,228,
+53,2,226,4,0,226,178,4,0,54,225,34,1,0,73,128,61,130,241,225,
+200,3,160,7,64,28,226,247,12,88,194,194,55,64,158,128,33,1,49,51,
+224,27,3,64,26,235,100,0,225,164,4,226,116,2,68,126,230,73,6,0,
+90,182,52,64,29,226,146,0,171,215,135,157,68,208,224,86,10,166,240,96,
+33,229,145,0,96,151,1,50,32,184,97,97,120,129,125,226,153,2,226,92,
+8,97,178,224,38,18,225,137,3,224,38,18,226,0,3,224,77,26,64,7,
+224,77,26,64,7,224,38,18,169,4,224,77,23,166,19,224,194,23,198,58,
+110,23,224,38,25,166,41,230,67,9,0,50,65,3,139,158,226,244,0,226,
+238,5,192,140,192,44,128,9,228,131,9,1,75,52,215,119,224,31,14,0,
+51,224,31,22,0,50,224,31,21,2,67,39,66,224,32,11,66,216,0,50,
+228,92,4,224,59,10,0,66,165,31,224,58,9,194,155,224,26,9,95,5,
+224,26,14,79,12,224,26,3,162,1,96,7,66,228,132,214,65,56,131,120,
+164,252,64,26,132,16,229,125,5,132,247,240,76,8,144,81,67,253,157,14,
+230,122,1,189,54,138,147,224,32,5,237,160,1,0,51,75,155,227,126,3,
+98,40,224,110,12,192,89,128,64,247,227,5,96,4,192,99,206,225,224,135,
+19,128,35,0,80,96,71,224,44,3,128,149,100,58,96,147,233,45,1,238,
+110,0,224,186,4,160,180,224,35,21,2,79,32,35,74,183,224,223,0,101,
+196,128,154,224,38,7,0,49,224,38,0,65,170,240,142,5,226,197,11,224,
+38,21,226,204,0,224,38,21,226,211,0,160,0,243,21,1,224,58,1,98,
+23,197,234,1,80,32,97,78,0,85,128,21,133,227,93,111,83,150,165,66,
+133,214,235,222,4,192,7,203,230,64,85,226,129,0,224,181,7,64,31,232,
+116,0,224,31,5,96,174,64,31,229,223,0,130,193,195,11,0,58,132,82,
+224,58,10,137,65,64,31,133,225,224,58,0,201,137,64,26,227,23,6,198,
+241,64,26,131,23,224,26,0,198,138,64,26,233,247,0,160,26,237,63,1,
+68,151,97,10,237,65,1,104,126,237,65,13,0,64,98,159,130,143,226,187,
+4,192,32,96,31,226,54,3,129,76,0,49,129,112,237,165,3,69,117,64,
+7,237,174,0,128,18,173,164,169,217,69,98,3,10,65,32,79,82,197,64,
+41,127,207,64,11,129,92,179,166,192,1,157,115,165,132,160,2,96,18,3,
+95,49,49,48,108,219,3,58,49,49,48,233,220,3,162,235,128,217,224,14,
+3,224,11,2,192,8,154,106,64,65,169,254,94,203,0,56,79,131,72,21,
+67,44,79,89,159,54,96,201,64,42,207,107,132,25,209,192,224,109,1,224,
+182,2,224,19,20,99,150,0,39,86,87,0,55,132,42,224,47,6,80,141,
+87,253,0,57,72,116,1,95,51,65,111,160,0,225,13,2,241,106,5,100,
+20,128,53,3,49,49,48,52,224,54,5,160,111,224,2,0,128,39,0,56,
+65,131,224,38,2,160,73,224,86,1,4,67,32,95,56,57,137,195,64,84,
+204,167,0,39,243,193,2,241,84,4,96,0,65,39,0,54,225,148,2,96,
+251,192,88,65,117,64,32,208,0,7,49,48,32,75,32,85,32,90,192,197,
+224,43,3,96,5,1,95,55,242,14,0,96,56,169,227,3,54,32,95,55,
+64,183,214,23,0,48,66,174,64,31,130,153,0,85,172,128,177,0,0,56,
+190,136,96,14,227,161,1,2,32,61,32,100,140,145,224,2,49,49,48,147,
+30,64,70,228,45,0,0,57,81,249,100,198,96,29,64,120,0,57,158,131,
+1,49,48,130,243,0,50,112,111,96,29,64,57,130,214,131,26,1,95,57,
+66,75,96,136,0,57,71,146,203,39,0,57,65,48,224,65,1,128,7,128,
+248,224,40,10,65,111,0,57,87,212,96,29,0,49,64,21,0,57,100,130,
+231,228,0,128,103,0,64,192,24,78,210,229,216,1,224,92,0,96,30,3,
+64,95,49,48,69,47,96,171,131,118,3,80,32,35,51,106,117,3,58,49,
+48,57,196,203,2,48,53,56,192,196,1,49,48,83,105,1,49,48,71,227,
+192,152,1,51,55,114,88,160,25,0,57,178,63,224,14,4,224,42,13,96,
+68,224,42,8,224,15,1,97,130,64,136,210,244,128,138,228,169,1,224,2,
+3,99,1,227,56,2,128,107,128,123,227,38,13,224,33,0,224,29,3,224,
+26,5,192,22,224,19,2,224,201,27,0,53,67,120,2,48,54,54,129,49,
+64,28,224,14,3,114,87,0,48,254,135,1,224,56,8,83,3,224,22,11,
+173,65,225,32,1,82,167,192,28,224,78,0,128,30,161,57,216,195,0,89,
+160,195,129,64,232,124,1,64,4,0,80,118,200,164,136,224,217,13,224,84,
+1,225,119,4,225,61,4,224,2,1,96,134,225,137,1,68,139,225,140,0,
+224,63,2,225,110,1,66,213,225,140,4,215,106,224,23,1,128,156,224,16,
+1,68,111,160,146,224,171,1,129,3,224,187,7,224,188,1,224,52,2,161,
+31,0,54,226,226,2,68,40,225,238,44,0,57,133,52,225,174,14,64,102,
+199,164,192,102,224,83,32,64,60,206,202,224,60,18,129,253,224,14,6,96,
+60,133,3,192,60,243,176,0,5,67,32,60,32,64,35,108,185,224,19,6,
+141,12,224,19,6,224,39,11,109,169,65,50,224,19,2,137,156,224,211,1,
+131,209,224,180,36,224,84,9,65,24,224,84,3,128,39,225,173,34,181,140,
+225,157,4,0,55,183,173,224,126,9,244,197,1,160,127,101,131,224,147,6,
+65,157,224,147,2,227,131,5,225,225,15,224,135,5,224,112,0,225,30,38,
+225,136,7,111,89,224,19,7,64,106,224,179,7,64,241,226,124,30,224,200,
+0,224,18,8,224,84,6,111,183,225,8,8,195,120,224,217,29,161,144,196,
+32,225,128,8,144,136,224,119,6,66,125,224,158,9,225,74,38,224,64,2,
+84,82,128,0,225,74,6,225,93,11,65,73,224,19,7,226,37,10,105,76,
+226,167,33,224,165,13,225,148,10,225,194,35,224,147,8,64,126,225,38,29,
+225,197,22,0,55,73,9,230,31,5,225,204,0,0,56,226,172,0,225,204,
+7,66,47,224,146,6,66,171,225,137,3,133,55,226,123,10,227,112,16,225,
+141,8,65,120,224,18,6,226,68,10,130,67,224,220,12,160,198,130,147,225,
+130,31,226,215,12,199,246,64,28,226,103,4,224,142,8,64,247,225,220,15,
+96,53,224,104,1,163,43,224,45,29,163,95,213,127,227,95,9,228,43,10,
+226,36,32,232,234,12,225,151,1,227,145,50,194,126,166,200,203,133,230,200,
+12,64,42,224,18,6,130,104,224,18,4,229,20,10,99,202,228,191,9,225,
+95,21,224,36,4,224,21,0,83,44,224,195,7,224,78,5,224,143,7,231,
+65,10,231,64,6,224,142,7,224,88,15,224,25,17,231,182,8,225,22,9,
+66,45,226,138,12,225,138,1,128,77,227,164,3,77,36,0,48,83,186,224,
+127,7,81,12,128,235,225,104,5,227,228,6,128,57,224,99,3,226,51,0,
+65,237,209,129,65,237,64,28,0,48,224,90,0,64,29,209,127,108,152,202,
+18,210,211,0,53,123,29,239,172,2,74,221,0,58,128,114,236,69,3,161,
+218,96,127,117,214,66,197,1,64,83,83,221,124,172,179,233,64,172,127,141,
+1,48,56,203,85,0,56,140,143,2,85,32,65,109,39,64,23,96,14,125,
+231,96,45,224,187,3,226,225,2,64,29,234,10,5,228,183,10,225,157,6,
+118,233,225,75,5,137,16,230,86,93,227,168,17,224,46,36,228,114,31,224,
+57,7,228,132,35,230,116,1,230,40,18,65,130,235,80,26,228,214,5,224,
+95,2,224,76,3,224,127,7,163,115,64,98,0,51,239,58,4,0,80,225,
+44,34,224,227,22,128,99,64,98,229,16,20,109,228,225,115,6,64,79,224,
+19,7,226,93,10,105,110,232,100,37,226,140,33,0,55,224,212,5,237,177,
+7,226,47,2,233,73,51,230,142,6,167,0,164,152,224,109,8,224,156,1,
+104,209,231,46,7,232,254,42,226,110,1,234,58,12,233,146,49,226,104,5,
+193,17,129,20,240,186,46,224,177,4,225,65,30,224,61,7,227,39,5,97,
+19,224,13,5,224,53,12,224,198,0,234,16,13,225,217,21,241,68,5,224,
+143,7,231,138,1,226,152,32,225,251,2,199,60,224,117,1,225,229,6,225,
+223,17,239,40,10,231,229,25,181,247,227,115,37,230,20,15,225,226,16,224,
+196,15,229,201,38,232,80,13,224,138,4,195,172,224,204,25,227,107,6,225,
+244,23,227,206,28,232,122,14,228,59,70,85,62,226,210,10,192,39,224,111,
+72,160,23,169,112,224,118,15,64,0,70,27,233,62,3,228,191,15,228,89,
+11,224,140,0,140,172,225,244,1,64,84,233,117,3,228,121,65,160,234,224,
+21,6,192,121,225,38,1,226,189,6,1,55,56,228,114,4,192,183,150,212,
+228,205,2,224,30,5,245,137,6,224,45,4,224,233,1,65,101,234,41,3,
+138,8,234,43,0,105,232,119,68,192,15,0,65,96,64,64,57,219,222,225,
+35,5,161,38,245,19,0,193,41,246,121,58,158,43,225,38,1,226,150,6,
+225,54,8,230,181,3,224,22,8,225,23,5,161,159,68,191,225,26,1,220,
+164,232,216,20,227,229,12,224,138,7,224,36,6,128,14,64,98,0,54,224,
+98,4,128,90,171,195,64,237,233,186,29,230,208,7,175,119,64,67,221,22,
+128,69,247,0,0,128,42,128,34,233,190,5,65,139,121,122,0,83,224,5,
+0,64,4,64,52,192,3,224,103,0,128,119,192,174,233,163,3,225,45,16,
+229,158,19,224,36,13,192,94,227,230,26,230,61,13,64,60,227,206,3,64,
+40,0,48,96,5,66,63,0,58,128,7,224,185,6,227,212,35,227,112,7,
+195,97,224,150,6,224,222,14,226,83,40,249,167,47,248,48,8,241,171,5,
+228,24,0,65,16,227,217,3,226,149,6,72,140,250,159,8,0,83,224,146,
+9,228,65,7,228,66,9,96,77,0,54,225,213,26,241,225,5,0,54,135,
+64,64,60,227,32,3,224,166,7,236,247,7,225,209,36,132,176,225,58,17,
+226,88,0,64,155,226,88,10,64,31,64,29,227,18,3,224,29,1,64,93,
+64,29,130,209,0,75,224,186,8,130,172,250,199,8,64,11,131,189,160,187,
+224,209,7,161,95,224,8,2,64,78,0,53,130,221,1,85,32,64,11,207,
+204,156,244,64,36,190,174,254,33,6,7,84,109,111,100,117,108,101,32,126,
+38,0,64,154,214,126,82,127,160,80,34,1,56,50,101,125,224,59,0,1,
+79,32,107,239,129,235,133,234,128,49,1,64,67,91,126,64,146,66,143,224,
+38,4,96,131,130,1,3,85,32,75,52,98,23,64,18,129,215,1,80,32,
+73,111,160,169,129,206,95,151,127,192,98,180,159,192,64,29,161,133,2,57,
+49,56,96,229,129,118,64,154,0,89,251,255,1,64,5,0,80,68,205,0,
+95,127,253,1,49,52,129,33,226,186,3,96,8,64,41,0,95,103,167,96,
+26,224,20,6,97,121,0,39,128,67,64,212,166,48,64,117,129,206,0,80,
+190,59,64,94,160,100,160,6,97,7,160,63,96,66,1,48,53,96,102,226,
+155,3,231,62,9,220,119,225,240,4,0,80,224,124,2,224,132,0,224,8,
+0,64,140,222,225,1,95,49,64,169,4,75,32,95,49,51,162,148,0,52,
+196,237,255,226,1,1,48,52,152,217,0,90,226,10,11,226,9,4,163,52,
+97,216,130,8,66,17,224,48,5,12,40,46,46,46,41,32,119,104,101,114,
+101,94,42,96,54,64,97,220,136,3,95,49,50,53,224,114,0,64,142,164,
+107,3,54,32,95,57,167,139,95,198,64,25,228,105,0,0,57,71,10,3,
+95,50,54,56,79,249,65,69,139,148,0,83,163,20,235,162,4,128,103,225,
+73,1,95,203,1,61,61,224,24,2,3,85,32,64,90,96,128,165,78,224,
+42,10,128,25,160,42,224,44,4,97,173,4,95,49,48,48,48,128,169,64,
+151,2,57,55,57,164,226,96,181,0,54,162,207,240,164,79,0,57,73,119,
+64,133,96,8,160,16,96,132,225,130,1,6,100,101,102,97,117,108,116,129,
+179,1,95,57,107,50,224,34,6,1,58,58,128,29,64,198,0,51,132,239,
+3,85,32,75,50,192,97,224,80,8,14,114,105,118,105,110,103,32,105,110,
+115,116,97,110,99,101,160,90,224,59,0,240,197,15,223,124,162,207,0,90,
+64,44,226,240,2,0,39,164,192,96,203,194,93,224,225,27,6,112,97,116,
+116,101,114,110,224,134,1,65,75,96,35,2,79,32,35,69,89,161,145,64,
+26,139,116,117,59,0,52,96,72,65,99,0,66,98,114,3,49,48,48,51,
+128,90,2,79,32,35,69,41,160,54,96,29,127,65,117,14,130,189,64,75,
+248,209,2,225,145,5,225,136,27,224,126,1,161,147,96,104,2,57,56,50,
+128,62,86,8,96,7,67,11,224,70,4,0,44,163,126,99,3,225,116,3,
+64,0,241,117,33,102,75,1,48,51,224,172,15,225,219,16,64,57,96,233,
+128,61,232,130,6,225,187,9,224,94,13,4,99,108,97,115,115,224,91,1,
+103,198,193,185,96,8,195,99,241,33,13,130,71,166,89,224,115,14,0,57,
+96,7,228,142,5,4,105,110,102,105,120,96,118,101,152,0,52,70,63,2,
+52,49,49,103,72,102,141,0,56,161,245,224,26,9,67,140,130,16,224,27,
+5,162,36,224,115,0,3,95,49,49,56,69,75,164,227,225,203,35,194,7,
+129,102,225,87,12,224,240,19,225,100,8,19,102,111,114,101,105,103,110,32,
+105,109,112,111,114,116,32,99,99,97,108,108,226,125,9,160,148,160,184,6,
+49,50,54,32,95,51,48,202,0,228,48,33,242,18,53,238,50,18,0,57,
+179,46,224,29,3,224,26,5,226,129,44,129,20,166,201,76,235,185,69,2,
+49,48,51,64,165,64,7,103,175,132,33,224,60,6,13,123,45,35,32,83,
+79,85,82,67,69,32,35,45,125,161,11,1,64,80,193,82,224,44,5,8,
+113,117,97,108,105,102,105,101,100,192,39,193,232,226,50,0,65,141,0,75,
+129,138,226,175,5,2,32,97,115,130,33,1,95,55,194,80,224,101,0,228,
+114,1,65,5,192,75,0,80,64,72,224,64,2,5,104,105,100,105,110,103,
+160,121,96,44,228,96,14,3,79,32,35,52,226,226,1,196,91,218,231,128,
+0,230,119,36,2,116,121,112,196,61,226,67,22,1,57,57,165,73,243,217,
+19,224,114,9,224,193,26,195,81,226,190,25,224,103,14,68,229,193,209,230,
+76,15,244,25,35,65,84,0,50,229,243,0,224,86,10,225,99,48,230,246,
+21,163,163,244,32,25,227,62,9,224,130,22,2,110,101,119,224,133,31,124,
+159,96,8,141,182,104,17,0,83,64,88,123,37,227,181,27,3,100,97,116,
+97,224,106,5,224,79,1,64,59,72,83,192,7,224,215,53,224,105,9,224,
+212,10,226,134,11,227,124,2,1,92,124,160,65,163,78,129,0,225,3,4,
+128,0,74,43,174,192,104,136,73,229,224,52,0,172,216,64,48,138,76,230,
+5,37,201,174,228,234,3,0,80,64,36,228,169,9,4,115,116,111,99,107,
+195,179,225,229,18,224,27,5,2,97,110,121,231,206,2,0,75,160,90,64,
+0,64,144,228,111,34,96,250,67,84,1,95,56,227,90,0,224,176,9,165,
+142,224,6,2,224,247,13,1,118,105,225,191,2,130,255,65,69,142,30,230,
+111,1,230,78,3,97,81,226,55,23,2,95,57,57,68,152,232,182,1,164,
+100,0,80,96,33,64,230,225,185,0,197,229,2,49,48,52,192,253,192,30,
+192,128,166,195,228,124,13,228,36,1,228,187,13,96,96,225,77,9,128,0,
+64,236,142,252,224,102,0,96,5,192,47,2,49,50,51,225,126,0,224,18,
+0,0,53,160,18,64,60,142,195,73,109,131,158,193,71,97,213,224,71,1,
+75,6,160,70,193,104,64,61,142,116,65,185,195,228,0,85,234,234,0,99,
+159,96,4,230,194,3,224,28,0,226,52,0,2,49,48,51,65,6,233,28,
+8,224,208,3,225,33,9,3,40,46,46,41,230,90,0,64,31,0,58,134,
+200,206,89,97,131,226,135,13,64,41,142,131,0,65,80,60,72,1,64,53,
+0,52,117,12,97,4,0,80,175,69,175,67,96,15,64,9,128,21,73,89,
+0,48,97,251,104,68,64,66,0,54,96,66,2,83,32,85,195,23,78,69,
+226,177,3,97,119,224,129,0,227,42,29,231,21,22,225,49,4,224,66,0,
+193,219,224,100,1,225,89,9,161,3,132,139,224,180,6,224,102,3,129,233,
+2,95,57,56,99,10,225,127,5,1,61,62,161,125,96,74,214,116,80,168,
+103,6,1,64,80,129,145,195,136,128,199,64,142,194,13,141,104,168,52,128,
+162,0,57,243,232,0,65,108,147,71,1,51,48,97,163,246,11,0,0,50,
+83,175,64,30,64,21,162,126,0,39,81,245,246,192,1,118,207,241,64,0,
+160,12,167,19,160,15,113,234,128,2,0,67,120,254,234,139,2,2,66,32,
+83,147,115,98,131,192,68,224,61,0,138,184,224,46,3,240,69,0,235,35,
+0,151,84,110,234,66,78,128,5,102,252,160,81,240,203,2,108,230,128,10,
+210,153,224,80,0,161,178,128,102,0,85,128,62,224,132,1,192,11,96,74,
+160,208,196,232,160,96,160,58,128,35,1,95,54,80,170,96,20,64,64,241,
+76,2,0,66,66,242,229,20,6,128,90,225,26,5,131,179,235,166,14,197,
+87,96,58,160,14,98,52,164,52,128,204,0,75,199,29,224,175,44,224,160,
+6,96,157,224,154,5,224,127,13,224,118,0,225,243,0,226,8,0,193,0,
+129,126,193,148,73,195,66,188,236,48,0,96,190,99,161,160,144,160,24,84,
+4,99,155,3,56,48,32,95,122,174,0,95,68,179,130,11,96,10,193,64,
+128,94,236,131,1,0,51,80,125,235,197,2,1,91,93,195,81,224,43,0,
+224,100,4,224,87,2,175,26,1,95,57,89,247,2,95,57,56,200,101,149,
+120,131,175,64,126,0,52,102,188,1,66,32,140,88,2,95,57,56,97,162,
+128,41,192,4,96,155,66,91,161,57,96,242,212,229,161,92,195,16,160,198,
+129,45,161,50,234,104,2,96,134,198,8,235,44,5,96,182,224,26,13,96,
+53,129,241,224,26,7,96,133,99,96,224,22,4,142,77,2,95,57,56,129,
+219,96,190,226,5,5,248,158,4,167,124,130,22,96,11,231,109,8,199,110,
+227,247,0,224,113,6,140,164,98,229,240,113,11,0,95,136,132,240,21,6,
+121,8,224,149,2,164,248,232,95,7,228,53,0,96,181,225,4,9,224,208,
+0,64,26,224,150,5,101,105,224,254,0,160,102,128,10,101,106,160,10,230,
+97,1,242,240,2,101,115,128,119,249,209,0,96,97,96,96,231,255,17,224,
+26,8,80,76,232,147,3,225,142,24,137,108,227,165,7,225,77,1,0,45,
+198,90,193,141,226,56,13,0,49,97,102,224,26,13,98,24,225,51,13,169,
+174,0,85,232,150,5,232,108,11,76,5,233,110,4,160,217,224,253,4,224,
+33,7,237,124,7,64,223,130,57,65,10,97,142,67,138,65,124,224,73,6,
+68,236,201,169,231,172,2,160,170,100,176,225,49,0,229,8,4,225,81,5,
+226,224,1,233,254,5,232,116,30,2,95,57,57,162,22,224,67,1,232,83,
+1,160,121,225,112,9,100,113,225,112,12,0,49,163,196,161,58,233,16,2,
+232,171,2,226,53,12,224,227,17,226,53,11,242,173,12,163,179,242,23,9,
+0,102,236,53,0,83,230,226,127,14,192,0,64,128,228,246,17,226,134,18,
+97,197,224,26,13,227,213,17,119,71,225,15,3,225,17,1,224,16,1,142,
+61,227,90,5,183,90,0,79,237,44,16,192,245,227,145,6,224,48,17,2,
+116,104,101,183,112,199,242,224,43,17,2,101,108,115,174,57,227,49,9,225,
+213,5,225,207,1,226,232,3,194,87,225,11,5,97,200,226,27,20,226,13,
+0,192,74,235,54,0,2,49,48,48,79,97,83,119,224,171,6,1,100,111,
+96,169,236,97,21,0,46,160,37,131,58,3,49,48,48,49,124,158,128,114,
+239,186,2,231,43,0,229,193,15,99,79,228,25,8,150,228,65,200,131,111,
+228,92,1,168,170,229,215,35,238,22,2,229,215,2,160,70,226,188,19,215,
+220,224,25,9,227,209,17,227,208,3,225,106,4,192,8,225,72,6,1,108,
+101,181,129,225,70,21,160,246,226,95,15,0,105,226,137,0,160,124,228,30,
+4,128,128,162,164,162,18,224,71,13,1,99,97,226,167,0,224,25,6,0,
+111,195,30,224,167,20,134,91,96,0,225,209,6,72,200,135,242,96,88,68,
+92,135,161,224,22,1,65,200,96,7,229,246,1,94,216,165,127,116,53,0,
+95,241,179,11,228,146,8,249,24,0,202,199,131,30,228,99,5,192,205,129,
+164,231,11,10,225,200,0,128,33,4,64,95,53,54,55,138,13,161,84,104,
+248,106,134,96,10,64,6,226,237,2,96,37,74,58,239,234,1,66,209,253,
+249,0,192,92,192,117,96,131,225,52,1,128,3,194,121,139,237,234,178,0,
+193,68,162,130,64,121,65,126,114,56,249,154,4,226,33,3,2,115,116,36,
+129,39,202,174,129,113,160,73,236,14,1,235,17,7,247,120,2,225,74,0,
+195,136,192,13,99,120,129,40,1,39,32,163,100,235,40,2,65,225,0,65,
+96,11,64,9,129,208,125,94,101,15,64,15,0,58,110,188,174,176,226,185,
+1,1,51,54,120,129,0,56,72,72,96,230,0,55,110,219,0,50,144,161,
+79,157,0,79,161,83,96,84,79,161,239,61,0,128,45,128,90,223,59,1,
+80,32,110,54,0,85,128,69,0,54,239,152,3,96,193,143,152,65,205,160,
+24,154,27,99,238,96,14,128,218,225,218,1,161,0,230,113,0,162,77,230,
+61,3,96,146,99,116,193,41,227,213,0,236,154,0,230,62,0,135,115,230,
+36,0,64,140,244,244,0,228,130,9,255,84,10,106,161,229,72,5,233,117,
+7,129,1,97,37,106,186,97,140,113,145,96,18,112,104,4,66,32,95,53,
+56,65,69,1,54,54,220,135,1,64,85,172,232,224,98,6,250,209,16,96,
+45,64,104,251,85,10,224,22,14,248,71,13,229,148,8,228,91,12,128,80,
+192,75,189,222,64,226,98,66,96,28,5,53,51,53,32,95,53,68,84,192,
+133,224,36,0,130,177,96,146,0,48,140,85,228,195,9,66,34,224,50,2,
+65,24,224,12,4,160,100,224,95,0,224,43,6,237,1,7,97,221,0,51,
+177,187,1,49,57,64,107,0,95,98,184,1,50,49,96,133,138,171,101,186,
+0,95,74,171,192,153,0,95,74,116,192,12,64,67,210,15,1,49,57,64,
+94,128,40,96,60,1,49,48,75,209,224,47,0,64,19,64,47,146,47,4,
+102,115,104,111,119,82,63,64,35,182,16,163,219,115,221,130,158,234,4,21,
+0,58,133,242,226,159,11,129,167,224,18,4,64,79,225,82,6,206,59,195,
+69,100,49,234,219,5,142,160,166,187,160,12,224,25,1,232,166,1,183,56,
+231,244,10,177,95,224,196,6,1,46,46,235,19,2,233,30,0,224,136,3,
+224,116,83,224,108,10,224,95,22,224,185,21,225,107,7,96,178,230,209,9,
+162,146,64,113,224,100,31,224,168,15,68,209,232,79,0,225,8,6,245,206,
+2,228,245,0,96,7,253,106,19,234,43,3,137,252,158,140,160,225,66,107,
+133,247,224,141,3,128,139,233,248,32,64,68,134,12,234,223,3,232,112,2,
+250,217,0,224,17,0,206,36,64,58,0,54,213,105,1,49,52,183,5,64,
+21,198,46,0,80,168,159,129,120,71,194,64,41,114,133,0,54,65,124,102,
+123,64,48,214,17,149,153,232,168,11,178,107,1,51,55,247,104,2,128,30,
+168,141,64,12,129,240,64,2,224,59,4,227,112,5,224,25,1,224,27,5,
+229,182,16,6,75,51,32,95,51,52,51,226,10,2,8,115,101,112,49,32,
+65,98,111,118,202,27,224,37,17,4,66,101,115,105,100,224,38,0,224,124,
+1,227,246,12,1,95,57,154,31,224,37,0,213,197,128,168,100,3,231,100,
+2,1,57,53,134,172,128,79,64,189,231,112,1,64,88,0,67,64,34,101,
+64,161,47,64,51,65,120,0,95,167,193,128,0,129,93,225,56,2,224,97,
+0,230,122,8,128,28,224,144,1,224,142,1,224,205,4,170,199,224,195,2,
+224,79,0,116,114,79,203,225,189,0,128,69,169,42,64,11,3,95,49,55,
+52,181,29,192,113,224,71,15,134,57,224,71,10,97,1,66,108,96,181,104,
+113,224,85,1,245,104,0,96,59,224,202,1,224,199,8,128,38,192,124,128,
+123,2,95,57,52,106,21,225,103,39,224,196,4,137,2,0,53,166,79,149,
+10,96,0,1,95,55,64,210,67,18,135,7,99,18,161,160,224,161,5,96,
+184,0,64,152,94,225,146,2,225,195,21,161,152,225,179,1,98,82,248,65,
+0,224,30,5,225,112,0,223,65,226,99,0,224,66,18,226,191,12,160,135,
+64,234,64,31,64,14,64,11,65,94,193,202,1,54,48,198,222,100,25,252,
+96,0,115,0,64,6,193,178,161,58,71,192,97,109,226,211,12,164,102,97,
+72,136,12,231,142,8,65,115,228,1,49,7,111,110,101,76,105,110,101,114,
+228,5,25,224,41,0,228,9,6,228,0,20,74,126,193,33,64,0,234,5,
+12,227,114,8,136,176,131,94,224,61,1,224,21,0,76,194,224,83,1,233,
+202,12,95,169,164,130,64,140,0,53,230,105,2,137,35,0,83,65,173,197,
+162,217,142,225,252,6,164,151,224,64,1,64,62,137,82,238,45,3,0,48,
+64,36,64,7,70,135,0,58,139,230,64,97,98,192,118,89,224,94,0,98,
+229,128,174,230,24,5,96,196,96,205,195,141,224,19,0,128,17,210,57,207,
+217,239,59,0,250,96,4,185,239,160,48,170,198,103,32,64,159,205,52,64,
+168,192,195,233,145,5,148,109,199,250,160,17,232,62,6,2,32,92,124,240,
+215,0,231,254,39,192,175,64,132,167,172,1,32,80,234,157,0,232,119,7,
+74,166,224,124,6,1,60,45,233,32,6,192,7,129,137,241,132,54,64,150,
+0,54,160,150,2,95,57,57,112,204,189,116,75,172,253,154,3,64,155,225,
+228,0,98,11,255,246,6,3,49,48,48,48,66,147,225,184,0,224,150,3,
+3,119,104,101,114,195,65,224,153,28,128,155,133,74,4,95,49,48,52,53,
+96,131,132,17,229,131,1,132,64,64,25,130,228,224,197,1,168,208,64,146,
+169,102,186,220,162,137,231,147,6,229,5,7,211,73,163,49,231,194,7,224,
+46,7,2,95,57,55,64,183,101,52,96,5,0,58,96,134,225,238,19,98,
+68,0,55,226,76,9,248,29,1,151,166,180,238,192,31,0,54,233,213,0,
+226,9,3,224,73,35,235,29,14,1,58,57,88,16,65,109,3,54,32,95,
+56,107,1,64,75,0,57,64,8,2,51,54,53,97,90,0,55,231,42,1,
+170,30,64,54,240,145,1,178,19,102,250,97,114,125,186,0,67,80,14,128,
+137,240,79,1,182,196,177,89,64,92,231,218,1,0,58,64,198,129,232,227,
+152,20,5,102,111,114,97,108,108,227,155,5,160,235,111,249,225,53,1,225,
+11,0,1,58,57,91,143,134,85,228,174,0,133,13,193,227,225,219,6,64,
+165,136,67,132,192,98,98,98,164,225,81,1,129,222,0,56,101,220,236,251,
+12,246,119,11,248,200,1,0,57,75,152,128,156,131,100,65,217,2,49,32,
+58,96,23,96,171,0,75,254,77,0,0,55,104,102,3,95,56,52,51,107,
+209,249,90,1,0,58,96,149,225,191,27,102,71,225,191,2,198,31,0,73,
+229,28,3,225,5,0,100,202,108,14,166,223,224,35,1,2,95,57,55,108,
+110,140,188,160,116,96,113,96,212,129,28,0,58,96,8,163,9,0,75,71,
+29,161,54,224,9,3,224,11,1,0,58,125,237,239,195,0,2,95,56,52,
+133,112,64,240,96,114,4,56,55,32,95,56,96,139,1,95,55,66,38,128,
+51,130,186,2,75,32,89,99,232,65,48,233,1,4,138,38,98,101,207,150,
+161,251,119,45,255,168,2,160,56,0,80,65,105,161,206,193,122,116,148,98,
+74,169,236,97,188,2,52,53,49,96,33,0,56,77,70,99,143,128,34,128,
+0,0,58,64,175,128,253,192,102,128,70,2,56,54,53,178,227,224,22,5,
+0,53,98,185,1,95,54,84,66,234,150,0,165,148,96,188,211,252,136,223,
+64,20,237,179,1,244,17,0,1,57,56,205,151,1,80,32,184,129,64,20,
+130,78,238,46,13,72,60,238,46,5,65,121,163,52,66,218,165,94,64,249,
+224,143,0,130,58,247,12,4,161,148,0,58,97,207,160,51,117,241,104,82,
+0,58,96,36,224,74,4,101,169,99,229,229,168,93,64,158,229,168,3,64,
+133,160,121,97,46,129,188,128,60,117,70,64,35,129,120,227,90,5,0,55,
+79,14,227,90,0,0,50,229,26,10,70,216,64,54,64,250,0,58,96,21,
+227,104,18,98,81,227,104,21,167,48,163,104,64,127,96,109,196,61,64,8,
+224,201,3,237,99,2,224,201,1,129,201,205,137,65,42,193,101,225,60,2,
+161,61,225,63,9,224,24,0,224,168,1,192,19,97,83,192,85,96,71,129,
+101,225,103,0,130,44,0,65,65,9,130,26,2,95,57,54,65,71,73,173,
+2,58,57,54,130,23,6,95,57,54,55,32,35,49,71,183,1,80,32,75,
+27,104,37,0,58,96,36,5,10,65,32,80,32,58,64,32,130,65,76,152,
+1,57,54,144,148,136,12,74,0,0,75,96,77,129,176,0,85,87,171,0,
+58,96,23,162,167,64,13,195,27,133,171,226,105,1,203,21,70,156,253,57,
+4,138,207,78,151,1,57,51,238,66,5,2,95,57,53,133,77,108,251,166,
+37,2,95,49,48,68,78,87,218,68,32,0,48,239,18,0,0,58,96,173,
+194,3,64,87,236,178,10,192,138,2,95,57,53,120,186,160,89,226,50,0,
+229,153,5,224,47,3,72,27,224,47,1,0,58,96,9,137,178,227,34,0,
+238,103,2,129,181,237,89,8,240,182,3,224,39,15,164,223,238,183,0,240,
+77,15,165,36,226,31,2,64,8,206,148,224,7,5,224,190,7,224,54,4,
+224,145,0,227,218,2,192,13,133,222,163,75,69,227,101,78,0,57,101,94,
+96,29,224,89,6,160,165,225,220,0,1,95,57,69,247,161,62,129,194,134,
+42,160,15,224,51,0,224,219,5,241,247,7,192,171,161,17,226,76,1,241,
+237,0,224,88,7,224,104,11,225,119,1,160,226,238,58,5,224,94,0,160,
+32,224,145,4,242,82,1,208,243,130,166,128,224,142,92,224,118,12,224,50,
+7,133,176,160,130,229,140,0,227,37,3,160,217,228,29,7,224,225,9,128,
+88,144,36,160,0,164,104,224,193,11,224,53,5,225,61,0,87,180,145,186,
+224,188,10,132,100,0,58,96,16,209,118,128,86,130,17,164,225,225,85,15,
+193,52,227,93,8,192,24,0,85,199,22,224,33,8,165,166,239,108,1,103,
+205,65,104,0,55,71,62,70,11,233,155,0,64,255,99,247,0,95,70,255,
+0,58,97,145,68,237,1,52,56,97,68,64,143,2,95,52,53,65,226,65,
+110,2,95,51,48,74,196,98,194,0,58,96,6,227,198,3,192,193,192,207,
+227,114,10,225,209,5,228,79,3,225,66,2,128,14,64,0,227,200,1,225,
+221,12,163,238,225,0,0,157,169,115,56,97,4,195,90,128,54,227,231,20,
+224,67,5,97,221,104,27,246,84,1,228,1,3,64,252,246,226,0,128,50,
+193,193,246,85,12,98,239,132,22,224,210,0,228,235,22,160,25,224,27,5,
+242,78,34,0,97,82,69,3,78,101,115,116,242,79,25,224,42,1,246,90,
+58,225,178,13,228,108,1,129,250,97,47,193,238,161,198,224,24,16,64,0,
+225,54,24,161,155,224,126,1,224,39,1,228,140,10,226,18,7,197,170,228,
+140,2,205,87,225,189,2,224,151,5,246,84,7,224,82,2,132,223,131,235,
+224,74,0,78,89,72,24,171,133,96,116,134,41,193,48,225,54,2,225,55,
+0,232,232,10,160,151,224,138,2,224,205,4,131,3,224,150,0,101,56,246,
+169,11,230,187,0,225,42,15,160,40,224,92,4,128,1,228,246,2,225,179,
+16,192,52,182,148,96,0,108,158,0,58,96,36,249,156,6,227,64,22,192,
+153,225,79,0,243,192,0,224,23,1,225,200,1,225,237,12,229,72,14,224,
+167,0,129,179,2,64,95,56,233,22,1,229,91,29,96,125,225,76,0,192,
+72,1,95,49,95,247,165,59,71,252,3,54,53,32,95,102,109,128,67,225,
+70,2,193,33,96,16,0,55,96,253,0,50,91,220,101,169,225,55,1,65,
+56,138,47,128,240,230,68,34,192,48,224,28,4,96,227,224,224,8,96,21,
+232,63,5,225,57,14,97,54,128,198,152,118,225,57,4,225,58,26,253,78,
+0,137,25,74,176,165,105,99,132,70,112,0,58,96,90,140,170,2,50,32,
+58,100,67,172,73,1,80,32,133,42,0,80,98,81,206,7,1,67,39,98,
+84,194,200,98,151,228,19,0,76,105,226,195,0,135,159,128,39,201,19,226,
+73,25,227,52,11,224,39,4,229,190,4,254,48,6,64,213,65,19,225,108,
+4,229,140,6,0,98,69,135,0,103,213,44,229,101,4,160,84,164,97,192,
+135,197,102,160,198,110,214,96,172,105,31,226,223,1,160,169,228,228,2,194,
+241,251,28,7,163,146,224,227,17,228,24,0,164,178,231,239,11,234,211,1,
+224,124,8,103,222,65,162,99,110,233,236,11,228,95,0,226,48,5,128,138,
+225,3,0,192,193,225,223,0,97,187,224,37,0,225,190,11,225,55,1,193,
+194,224,46,13,196,177,192,28,225,200,50,0,49,225,201,11,224,88,0,226,
+133,3,225,208,4,227,173,0,132,232,64,61,97,82,225,213,2,229,148,0,
+72,192,160,70,225,187,5,224,220,13,225,113,1,230,2,24,164,128,224,109,
+4,160,79,225,203,2,227,235,0,78,160,64,8,228,10,1,253,24,2,224,
+68,8,225,231,2,226,138,14,229,104,4,0,64,111,52,104,194,64,6,64,
+4,0,58,110,229,111,126,68,57,0,73,100,10,207,195,3,52,56,32,58,
+96,95,210,111,64,137,114,111,0,52,182,80,71,138,0,58,96,195,228,83,
+1,96,241,100,83,71,167,128,37,0,52,64,37,210,205,96,37,98,78,128,
+37,132,159,129,113,129,164,64,138,0,58,99,132,234,32,1,226,112,8,1,
+95,57,82,198,128,13,224,246,3,1,95,54,84,72,172,150,96,208,64,82,
+208,86,167,28,1,52,54,230,75,3,128,123,230,14,2,134,146,96,90,225,
+248,4,195,147,131,42,230,14,36,199,136,230,14,11,192,86,230,14,0,96,
+217,98,7,255,33,12,252,39,15,150,0,128,110,220,83,227,84,6,3,102,
+105,116,115,250,119,0,147,235,64,108,130,1,0,53,162,1,67,102,85,116,
+0,50,230,15,1,96,240,225,132,1,233,109,0,225,148,0,193,166,239,29,
+1,230,44,10,227,48,2,230,38,15,225,37,3,229,26,2,224,35,4,235,
+7,2,228,67,3,64,22,224,238,6,10,100,105,115,112,108,97,121,32,108,
+97,121,203,148,192,141,195,49,231,116,5,192,29,65,79,173,227,225,178,0,
+229,167,13,129,103,192,55,97,191,2,50,50,49,78,39,93,96,224,67,0,
+211,51,195,250,0,66,64,5,96,41,232,174,9,160,240,64,157,96,32,224,
+172,0,228,26,15,225,101,7,233,237,7,225,97,10,225,187,1,225,94,61,
+0,50,225,95,7,133,83,225,23,3,224,210,36,225,118,70,65,207,100,252,
+64,9,97,1,96,5,99,254,0,58,115,251,229,4,5,0,51,132,225,128,
+164,224,131,3,96,7,128,16,128,143,1,95,49,99,173,1,95,51,122,158,
+0,51,105,200,224,11,1,2,95,57,51,130,91,74,193,0,49,96,92,64,
+0,3,95,57,51,54,96,102,133,58,96,147,1,75,52,224,2,1,128,170,
+96,154,0,54,192,154,0,54,192,154,182,123,112,97,0,66,137,157,228,140,
+8,97,195,228,166,17,129,250,225,82,6,178,26,0,85,85,223,225,249,4,
+64,24,164,192,228,90,3,224,43,12,97,197,224,43,10,224,114,13,171,182,
+224,70,9,97,70,224,114,30,98,152,224,114,11,224,115,0,225,0,4,96,
+30,224,141,12,98,23,224,97,11,64,24,224,141,31,98,12,224,141,11,224,
+44,11,107,173,224,186,12,178,41,98,79,0,58,96,6,185,224,3,48,32,
+95,50,64,241,102,197,86,71,0,52,87,65,88,95,1,49,49,128,26,2,
+95,51,49,64,53,66,155,192,44,1,95,56,95,71,130,205,2,95,56,50,
+192,21,0,52,90,77,77,54,192,58,2,64,95,49,157,2,96,116,231,128,
+0,0,83,98,101,167,21,210,174,83,17,98,232,0,55,89,226,131,22,99,
+203,83,213,0,51,78,124,1,51,49,98,134,190,10,131,164,68,64,227,175,
+2,228,75,1,17,114,101,99,117,114,115,105,118,101,32,109,111,100,117,108,
+101,58,32,132,81,160,180,100,53,1,95,56,96,73,224,59,8,13,44,32,
+105,109,112,111,114,116,32,99,104,97,105,110,160,57,4,66,32,95,55,49,
+82,131,126,56,128,57,161,91,0,56,83,165,1,58,57,65,119,67,73,4,
+56,49,48,32,75,186,236,195,228,227,237,3,101,162,0,55,214,119,129,27,
+212,148,0,66,97,100,0,55,88,248,6,95,55,57,49,32,95,52,152,72,
+237,156,1,98,100,130,132,224,42,0,161,1,64,48,128,168,65,117,1,95,
+56,93,33,64,0,128,57,167,74,191,80,71,78,200,168,193,130,1,95,56,
+96,218,157,52,0,56,90,74,0,56,154,161,96,49,225,38,8,0,77,97,
+88,9,32,110,111,116,32,102,111,117,110,100,193,98,161,186,225,101,0,1,
+49,49,97,48,244,113,1,224,71,6,13,94,42,115,101,97,114,99,104,32,
+112,97,116,104,61,128,67,128,178,165,220,65,51,96,69,125,203,225,240,14,
+8,94,42,112,97,99,107,97,103,101,224,70,3,224,57,3,225,14,0,98,
+67,1,50,54,88,0,4,54,32,95,51,48,162,161,160,228,230,246,3,161,
+191,225,105,3,193,102,1,95,52,125,128,96,0,96,237,114,144,135,38,0,
+39,131,20,161,154,224,31,1,82,109,71,153,235,160,2,225,37,0,197,254,
+1,50,50,64,142,128,116,233,173,7,128,5,101,243,2,95,52,52,67,207,
+0,50,200,105,192,171,226,61,2,81,176,224,157,7,169,108,217,4,2,95,
+56,48,64,64,96,56,227,73,16,193,86,3,100,111,101,115,97,236,6,99,
+111,110,116,97,105,110,163,88,161,244,97,105,193,174,199,59,246,218,0,227,
+47,4,224,169,8,226,231,3,224,201,1,68,68,225,66,0,162,82,240,51,
+0,130,96,99,74,0,80,71,22,155,67,103,22,239,61,6,128,0,65,78,
+2,55,57,53,96,109,0,56,96,48,96,110,1,58,57,93,34,1,10,65,
+224,238,2,2,46,116,120,79,236,0,58,96,33,103,42,2,95,57,50,123,
+96,64,5,0,58,96,105,108,134,98,65,76,172,1,95,55,75,251,128,5,
+0,58,96,37,163,202,65,109,108,148,1,50,54,224,100,6,161,83,75,59,
+0,58,97,196,165,24,226,57,5,163,69,1,52,50,64,18,92,247,101,132,
+104,32,1,95,55,92,157,69,180,105,234,129,37,194,155,64,51,67,110,225,
+200,6,7,76,111,97,100,105,110,103,32,193,208,201,98,228,73,4,226,223,
+0,0,55,116,178,226,206,9,132,121,224,147,2,98,169,4,56,52,32,95,
+51,155,31,1,56,57,65,13,1,52,50,228,151,1,226,90,16,0,80,160,
+137,29,99,111,109,112,105,108,101,32,118,101,114,115,105,111,110,32,109,105,
+115,109,97,116,99,104,58,32,102,105,108,101,163,203,102,14,98,97,229,176,
+10,160,211,128,42,64,145,165,224,96,139,224,44,7,160,110,0,114,96,45,
+192,169,96,0,96,163,1,56,48,100,47,0,57,102,193,66,35,65,98,223,
+11,97,13,70,147,0,56,97,37,166,147,224,24,4,71,118,192,24,70,215,
+192,47,69,147,160,22,161,217,0,57,102,80,1,57,49,69,26,1,95,57,
+100,166,163,250,2,51,54,53,128,81,68,101,1,95,56,66,139,2,95,57,
+49,98,179,1,95,55,100,200,229,30,0,1,95,57,64,192,1,95,57,139,
+7,228,91,6,135,43,67,52,1,95,57,100,89,0,58,96,214,138,36,0,
+51,108,147,0,58,96,24,128,17,0,52,138,205,0,58,96,76,224,36,0,
+64,178,0,58,96,101,3,10,65,32,90,69,31,0,58,96,139,192,32,74,
+94,0,58,96,190,191,60,64,71,64,140,0,58,96,218,245,33,0,224,5,
+1,67,141,123,153,200,67,99,154,1,56,57,106,26,128,6,224,25,6,97,
+34,128,6,224,26,7,133,221,96,6,224,26,1,72,53,104,183,2,95,57,
+49,101,65,128,6,0,58,97,114,203,35,160,184,163,127,204,63,0,66,244,
+128,1,64,1,236,121,1,67,207,164,120,143,250,129,99,1,57,48,131,56,
+87,37,1,54,53,64,124,0,51,67,49,0,55,152,78,229,110,0,239,163,
+4,195,176,204,111,144,43,224,43,27,133,197,129,74,149,168,137,48,192,249,
+231,194,14,231,189,9,16,117,108,116,105,112,108,101,32,105,110,115,116,97,
+110,99,101,115,232,232,3,98,117,232,1,3,224,0,4,1,95,56,72,176,
+108,120,1,48,50,65,104,131,41,97,76,170,90,128,200,0,90,64,198,192,
+9,3,95,57,49,50,192,155,128,43,130,137,2,75,32,89,97,92,129,116,
+236,101,12,96,131,224,25,12,135,1,129,50,235,96,1,236,54,2,139,40,
+160,133,224,37,22,246,248,1,160,0,224,49,6,236,70,2,128,48,0,90,
+192,232,224,38,23,128,89,0,57,235,145,2,64,0,240,148,18,128,40,130,
+107,224,90,2,104,6,209,252,226,62,2,97,252,128,17,224,49,19,160,32,
+104,225,212,219,192,49,128,28,153,39,244,216,1,225,64,19,98,100,225,63,
+9,171,192,160,0,0,58,65,245,65,230,238,97,21,206,71,224,25,9,96,
+76,237,122,12,101,14,237,122,12,79,180,224,184,18,96,30,224,185,10,134,
+193,224,244,2,129,86,225,83,8,102,231,225,133,7,128,44,225,82,0,161,
+72,224,88,5,162,6,0,48,195,47,224,164,19,100,214,224,163,20,225,21,
+13,105,104,225,21,12,191,214,224,111,14,101,97,225,19,26,224,58,10,239,
+209,2,224,170,15,224,59,16,227,132,14,224,59,3,227,249,14,224,231,3,
+224,25,4,199,146,240,32,19,227,183,28,128,138,0,49,74,35,224,197,22,
+129,234,224,58,8,5,57,48,52,32,95,53,152,41,224,65,22,64,35,224,
+65,11,130,202,193,6,226,234,10,224,210,20,227,253,3,224,85,2,224,146,
+2,224,58,16,227,35,14,229,29,2,240,86,0,100,214,0,58,96,6,163,
+232,2,95,57,48,109,96,97,3,136,182,128,17,74,40,160,17,0,58,96,
+219,224,48,1,107,100,73,123,0,58,96,32,75,48,3,47,61,32,58,96,
+18,64,12,0,61,96,12,136,80,200,228,96,184,1,95,57,108,198,128,6,
+0,58,64,103,64,34,0,73,64,45,216,37,118,116,99,150,88,108,64,229,
+132,240,163,225,229,12,14,229,14,1,96,202,224,7,2,160,250,64,196,0,
+48,189,17,1,52,56,72,82,177,117,161,24,99,232,0,58,96,6,202,64,
+244,179,1,145,3,71,111,0,53,81,121,107,40,106,15,81,92,73,231,106,
+23,0,58,71,98,128,61,96,198,160,152,81,160,249,237,3,205,221,233,254,
+2,163,19,171,57,177,53,101,214,0,58,96,98,236,165,7,72,198,193,44,
+194,100,149,242,0,83,194,114,64,171,217,14,1,95,56,69,216,192,6,0,
+64,160,124,160,81,64,204,1,54,53,96,7,73,14,74,194,128,172,200,58,
+0,58,73,162,64,110,148,172,64,232,105,194,202,65,64,83,0,58,105,239,
+202,101,64,14,129,217,128,151,224,148,26,0,67,170,36,97,233,233,157,4,
+175,188,160,141,0,58,96,37,113,187,66,177,66,130,96,33,96,122,0,58,
+96,192,241,216,3,129,129,106,23,1,95,55,177,199,0,58,107,223,224,37,
+7,64,35,128,45,97,30,224,45,0,64,46,235,97,0,117,171,96,18,129,
+128,139,135,224,2,0,166,43,0,58,112,191,128,253,161,235,129,245,247,149,
+6,2,95,56,54,198,1,128,2,124,176,162,205,211,192,113,72,173,188,160,
+69,175,90,224,55,23,98,75,96,59,207,239,2,79,32,35,64,14,183,35,
+226,140,1,192,80,192,14,227,84,2,224,78,11,208,51,0,49,67,86,160,
+76,130,230,244,135,5,164,176,227,175,2,3,95,51,52,55,192,80,122,97,
+0,95,140,70,67,84,77,223,209,168,97,106,1,95,55,163,191,224,70,6,
+224,68,3,241,219,2,161,88,245,38,15,194,241,161,61,164,98,235,131,32,
+0,70,78,244,243,63,7,147,47,242,155,6,224,168,23,196,90,225,92,2,
+1,95,56,145,5,163,147,97,133,225,121,2,129,228,236,210,2,133,22,216,
+127,1,56,55,98,69,245,202,1,83,64,168,64,245,225,3,160,14,117,230,
+129,239,66,169,131,200,225,235,3,3,95,56,56,48,224,249,2,6,109,104,
+115,105,110,46,104,220,60,64,41,217,120,96,171,246,85,8,64,27,241,33,
+2,193,237,1,95,56,158,143,224,106,21,2,111,117,116,224,107,9,164,224,
+226,232,5,224,91,1,64,70,64,120,192,144,225,86,0,161,115,97,53,64,
+60,224,170,2,1,56,56,97,52,194,6,224,23,6,225,52,2,192,0,0,
+58,97,83,247,138,9,0,49,78,147,2,95,56,56,65,192,64,26,113,110,
+148,38,167,67,103,134,135,163,251,68,5,5,114,101,109,111,118,101,98,89,
+5,102,97,105,108,101,100,128,246,0,58,96,131,11,10,65,32,94,117,110,
+108,105,110,107,32,58,96,93,161,165,225,60,2,2,51,53,54,238,37,3,
+6,72,83,67,80,80,72,83,210,43,128,44,224,46,4,163,79,252,135,1,
+96,2,225,171,9,167,126,224,201,3,146,188,168,193,146,179,227,35,8,7,
+82,117,110,32,99,112,112,104,206,158,227,30,12,2,95,56,56,160,10,194,
+65,96,108,145,31,2,55,50,53,64,92,6,57,32,95,52,49,49,32,71,
+0,224,93,1,96,89,192,220,224,222,2,224,131,5,7,32,45,45,115,116,
+114,105,112,128,129,225,252,3,242,106,0,130,129,120,33,128,10,64,21,2,
+95,56,56,163,35,224,39,0,3,67,39,32,79,224,229,0,224,149,15,1,
+45,73,178,242,0,32,117,231,224,25,2,10,115,114,99,47,114,117,110,116,
+105,109,101,128,34,101,41,64,78,1,54,56,192,117,85,120,197,144,229,164,
+2,224,19,0,69,252,95,147,224,242,1,224,54,0,213,175,133,151,129,62,
+225,10,7,0,79,225,46,1,98,86,135,39,0,79,224,35,2,8,45,68,
+95,95,77,72,83,95,95,64,41,0,75,71,76,65,6,134,186,226,229,11,
+129,62,244,86,0,226,231,14,128,169,244,75,16,8,99,97,108,108,67,111,
+109,109,97,69,72,130,249,161,174,225,125,2,130,60,0,50,146,70,244,70,
+10,226,97,17,96,234,135,225,6,94,115,121,115,116,101,109,67,65,201,69,
+227,190,3,117,163,64,217,72,199,131,190,0,54,97,241,160,20,125,140,1,
+95,56,134,135,225,17,3,1,95,51,85,114,228,60,9,64,40,230,131,7,
+69,97,1,95,56,111,104,96,46,228,90,1,165,132,64,29,90,149,69,11,
+193,122,0,54,111,129,129,87,140,212,0,35,74,112,120,77,0,57,169,243,
+141,77,171,186,109,132,226,164,5,130,30,103,152,2,51,50,50,225,60,2,
+6,92,34,108,105,98,47,83,97,26,13,47,73,79,46,104,115,92,34,44,
+51,48,48,58,56,129,133,0,90,129,38,87,173,96,109,97,17,2,48,54,
+32,128,130,160,19,96,0,0,67,64,36,148,63,96,195,82,34,115,171,0,
+58,96,240,65,129,8,116,109,112,110,97,109,101,32,58,97,70,233,70,2,
+3,75,52,32,90,224,1,0,105,86,225,189,0,70,208,97,172,0,95,97,
+222,85,51,2,54,32,89,135,4,134,8,65,58,131,255,72,118,239,222,0,
+235,9,3,192,13,97,36,238,31,3,1,35,49,197,217,96,36,96,46,96,
+10,204,89,65,120,224,45,1,0,52,184,160,96,33,248,212,1,224,42,11,
+191,241,128,0,109,159,224,129,15,141,86,96,123,224,117,13,190,17,96,112,
+224,33,14,116,203,224,33,20,108,149,224,67,21,145,178,64,33,148,2,98,
+86,224,36,7,140,228,242,153,0,224,0,3,225,132,8,131,20,225,133,26,
+193,44,225,132,71,0,49,251,105,0,64,0,239,136,6,224,133,9,192,181,
+163,81,74,140,227,115,0,255,151,4,132,14,132,41,66,243,230,153,4,132,
+141,126,111,1,54,53,128,82,1,95,52,76,169,0,58,105,218,108,108,0,
+55,117,82,109,29,74,100,173,62,64,13,133,114,76,191,0,55,215,223,0,
+73,96,24,175,165,2,56,54,57,64,27,132,30,2,73,32,58,64,15,99,
+107,135,1,133,104,231,72,5,151,80,229,52,5,253,245,0,0,58,74,246,
+96,89,0,54,71,8,72,28,227,95,14,68,59,232,179,4,72,146,1,116,
+58,89,246,0,115,90,160,10,92,92,101,110,100,123,99,111,100,101,125,160,
+91,128,134,241,233,3,228,160,16,228,145,2,224,70,12,207,8,165,55,1,
+48,54,129,123,0,85,226,108,1,226,126,2,239,97,1,237,117,1,160,30,
+192,135,6,54,56,53,32,95,54,51,235,135,0,225,244,1,224,37,3,224,
+173,27,4,98,101,103,105,110,224,175,4,176,34,224,76,6,98,213,171,190,
+96,5,106,192,160,150,98,139,224,13,2,227,40,23,224,41,2,160,57,224,
+16,0,216,250,224,75,3,227,199,8,182,45,160,250,225,94,2,224,56,1,
+227,81,13,0,54,195,247,128,55,3,66,39,32,85,226,22,22,13,98,108,
+97,110,107,32,98,101,102,111,114,101,32,62,234,145,3,71,99,96,119,134,
+81,161,199,65,210,227,106,1,225,224,5,96,40,230,217,11,224,54,6,227,
+159,4,0,65,104,64,109,30,0,54,71,128,66,242,221,237,0,83,71,89,
+2,56,54,53,160,222,225,229,15,236,134,0,174,205,173,57,1,95,55,72,
+146,0,58,111,186,242,221,3,65,80,68,58,199,31,128,6,0,58,64,103,
+128,118,113,170,129,65,224,183,2,192,18,129,84,224,246,2,96,85,192,29,
+193,159,242,227,7,131,203,220,243,72,118,159,167,0,56,89,235,0,56,113,
+102,131,60,126,40,128,10,0,56,97,206,233,103,1,100,180,0,56,225,138,
+0,96,81,132,144,3,95,51,57,56,65,121,0,54,96,199,210,218,224,101,
+29,108,33,224,101,22,196,221,0,53,68,221,64,70,209,81,1,64,58,64,
+19,96,28,1,50,57,67,221,0,56,73,110,2,95,56,53,66,175,0,73,
+65,218,65,138,0,85,64,23,115,119,0,56,81,171,252,41,4,96,24,64,
+63,2,49,49,57,142,68,98,120,64,138,64,13,64,35,1,95,51,135,30,
+65,76,82,103,96,92,0,95,70,61,160,11,0,58,96,6,97,7,82,38,
+3,95,51,51,56,64,10,226,246,3,25,67,111,110,116,114,111,108,46,69,
+120,99,101,112,116,105,111,110,46,73,110,116,101,114,110,97,108,66,58,224,
+39,1,3,83,111,109,101,224,35,0,98,85,169,52,64,215,123,131,132,139,
+64,227,69,141,67,122,98,154,125,95,69,157,234,54,1,1,95,52,107,19,
+2,58,56,53,193,247,130,123,107,126,101,121,68,72,96,74,0,50,97,120,
+160,105,198,100,243,195,0,64,30,3,10,65,32,99,95,190,1,32,58,96,
+63,98,208,97,191,234,193,9,137,245,132,164,239,216,5,66,38,239,253,0,
+0,58,111,230,102,156,84,25,0,58,96,55,244,42,5,77,39,97,248,0,
+52,65,107,74,84,1,58,56,69,190,86,57,225,50,0,97,72,4,97,99,
+116,105,118,77,62,0,58,96,38,128,52,76,106,67,184,0,58,64,63,128,
+178,107,183,1,95,56,81,15,1,95,56,71,13,0,58,64,38,129,29,1,
+95,56,87,65,1,116,111,96,86,64,24,129,8,71,70,64,24,3,10,65,
+32,80,64,10,204,31,1,95,56,73,19,107,88,0,56,68,24,1,56,51,
+64,253,0,51,157,55,150,195,0,56,77,159,96,200,226,179,0,193,83,64,
+25,244,89,5,0,90,163,197,104,90,0,51,163,181,0,58,96,85,239,209,
+0,230,171,0,64,8,71,122,0,58,96,41,128,90,96,205,0,51,128,253,
+103,158,1,95,52,97,216,0,55,64,253,239,222,2,1,55,53,71,204,99,
+16,243,141,6,0,55,67,207,239,246,0,225,188,2,240,175,5,109,13,97,
+66,0,55,68,82,239,244,0,99,223,99,208,232,79,6,3,76,111,97,100,
+69,237,11,115,97,118,101,100,32,99,97,99,104,101,32,66,220,237,149,8,
+192,150,108,235,199,127,224,159,7,1,58,56,70,232,129,206,203,22,170,68,
+131,28,1,95,55,149,46,134,68,1,51,54,196,135,201,189,116,75,165,39,
+228,163,0,0,55,73,67,161,93,138,11,135,26,1,95,55,85,194,96,131,
+96,40,189,67,130,253,167,168,224,73,4,228,226,4,0,67,181,9,230,45,
+10,199,239,128,64,236,167,1,125,200,64,8,246,104,1,174,41,128,94,192,
+91,1,95,56,139,110,192,36,163,143,65,179,224,40,6,211,109,225,33,2,
+97,204,0,55,74,29,239,150,1,0,51,250,150,2,96,0,1,95,54,148,
+109,96,96,248,166,1,224,141,7,69,221,64,7,0,54,64,10,142,222,121,
+187,192,57,96,156,224,114,5,193,64,64,253,196,37,225,162,0,96,198,224,
+45,2,242,84,8,96,213,242,92,16,9,105,110,118,97,108,105,100,97,116,
+101,130,105,176,50,130,107,0,56,102,109,224,155,1,224,124,5,195,212,1,
+95,56,133,12,200,255,226,66,3,96,157,114,126,170,73,96,220,0,55,104,
+59,2,95,56,50,255,38,3,1,95,56,71,132,0,58,98,200,167,217,65,
+232,68,0,236,109,0,105,201,161,38,105,154,225,162,0,137,116,98,25,2,
+95,56,50,193,54,137,190,64,168,71,32,1,95,55,88,64,64,98,167,136,
+0,54,146,53,1,95,56,140,150,121,10,0,58,96,42,100,20,64,128,131,
+44,106,25,224,105,4,144,100,192,135,196,3,200,93,74,111,122,120,130,106,
+232,117,1,224,61,4,100,159,97,108,65,27,0,58,96,126,100,156,111,233,
+64,147,96,13,175,198,0,58,96,214,103,55,1,54,53,155,190,131,176,100,
+175,73,123,74,90,104,22,64,90,0,79,242,235,2,72,4,0,58,97,109,
+229,27,0,66,160,236,75,0,183,6,128,225,160,169,64,162,1,95,56,81,
+176,162,100,195,225,2,56,49,51,69,16,0,57,221,91,96,10,193,12,225,
+152,0,205,250,192,95,160,2,193,239,247,173,1,172,89,128,126,226,228,1,
+225,232,0,96,8,1,95,54,66,117,151,125,129,207,0,50,168,240,128,155,
+96,181,65,2,116,125,224,125,2,68,46,224,44,1,0,58,123,131,170,173,
+166,135,74,48,230,135,0,103,241,78,232,226,42,0,66,218,202,103,224,178,
+0,134,200,0,85,161,6,226,6,1,160,117,200,48,139,236,0,55,114,163,
+225,39,6,160,45,225,27,10,225,52,0,225,18,8,72,200,225,18,25,128,
+73,128,134,241,41,0,0,64,104,34,210,15,224,34,4,192,110,75,227,224,
+38,11,252,100,3,1,49,54,77,233,131,43,252,101,4,95,53,163,40,160,
+45,129,138,103,194,154,120,140,64,96,9,115,255,65,150,97,116,65,42,67,
+95,100,92,160,52,128,34,224,61,9,96,53,197,158,225,227,16,201,252,0,
+80,154,235,225,149,1,68,28,161,134,0,90,225,120,6,226,174,0,227,8,
+1,160,2,97,27,194,221,102,110,224,80,4,225,91,6,128,38,99,141,217,
+180,130,160,227,89,1,224,56,0,224,182,6,132,247,224,182,70,226,64,0,
+164,139,224,180,12,192,36,101,222,161,148,224,181,18,192,14,96,5,96,234,
+160,196,128,199,133,92,128,65,100,102,224,178,0,168,121,229,47,0,153,42,
+229,91,2,254,197,0,198,216,0,56,70,74,68,131,226,112,5,134,220,224,
+89,2,250,193,2,225,23,6,192,114,224,227,1,234,22,1,224,11,0,160,
+9,160,133,128,207,128,19,228,238,17,225,61,0,225,44,1,224,200,0,137,
+95,0,82,214,203,224,75,23,245,168,2,225,222,5,225,39,1,64,15,137,
+161,227,132,8,103,219,129,38,1,95,56,143,83,128,24,224,78,17,227,210,
+18,224,77,18,165,94,225,188,3,162,171,254,86,5,128,1,199,123,224,13,
+17,224,156,1,226,194,1,224,35,1,128,17,128,243,1,52,54,224,164,19,
+64,120,224,242,1,96,11,136,95,0,49,193,170,226,27,1,224,176,10,224,
+177,65,162,112,96,158,224,177,38,0,50,128,43,135,189,224,21,0,97,111,
+0,58,98,143,236,213,2,224,195,17,169,19,128,1,231,13,0,192,8,0,
+58,96,94,224,72,33,224,234,1,224,86,1,226,57,0,224,5,1,71,7,
+234,39,0,195,117,241,92,0,233,176,0,233,185,1,225,57,0,224,167,5,
+160,58,129,26,78,120,227,106,1,96,16,224,15,0,192,224,224,168,0,224,
+119,34,192,35,225,39,19,128,26,228,225,4,192,24,129,69,137,153,228,81,
+1,227,5,16,225,143,2,224,124,3,224,79,0,224,103,17,0,58,98,188,
+224,101,34,226,154,3,225,181,2,225,46,6,160,67,224,24,3,192,152,225,
+150,76,224,98,10,225,129,59,67,223,7,10,65,32,35,50,32,58,56,67,
+76,0,10,123,222,228,233,2,224,110,3,165,255,160,13,132,81,160,5,135,
+36,224,225,1,224,51,1,235,189,0,71,241,171,7,231,51,4,231,65,7,
+224,108,3,192,188,169,180,101,247,230,209,8,102,105,230,222,5,134,214,228,
+24,0,79,60,0,58,96,248,99,179,176,242,65,90,144,204,64,148,225,5,
+0,205,53,225,127,3,224,13,13,225,228,3,227,217,0,64,8,167,222,0,
+58,96,174,168,138,80,166,2,75,50,32,128,153,0,75,113,54,64,32,132,
+144,241,143,9,224,81,6,1,95,55,84,66,192,85,204,222,0,58,64,54,
+128,10,121,143,91,181,146,36,0,55,86,77,64,60,253,206,2,66,180,144,
+70,0,58,110,110,212,126,2,95,50,57,84,95,110,162,1,95,56,150,251,
+116,101,96,17,0,58,96,6,179,32,1,95,55,115,240,0,58,96,37,161,
+37,125,3,0,55,76,15,2,95,56,48,233,5,0,142,154,235,253,0,79,
+153,114,201,65,236,128,171,129,103,219,153,0,75,214,114,0,58,111,204,224,
+197,17,110,186,65,96,96,202,0,58,112,5,97,98,1,95,52,64,107,78,
+138,0,51,78,249,1,95,56,124,127,0,58,112,174,93,232,9,109,100,53,
+66,70,73,76,69,32,58,96,25,228,17,2,64,214,0,50,113,114,172,188,
+64,16,108,187,116,56,0,58,113,74,128,145,78,229,75,99,248,128,4,190,
+251,64,144,1,95,52,156,9,183,133,96,64,225,59,6,96,25,244,74,3,
+0,58,96,24,65,141,2,55,57,52,64,13,129,43,207,171,255,65,4,107,
+189,173,51,255,52,7,3,109,104,115,47,191,52,7,70,105,108,101,80,97,
+116,104,159,58,5,49,49,56,58,49,52,177,254,194,198,228,218,1,130,99,
+1,95,52,85,175,161,188,151,19,152,216,85,152,64,209,175,16,96,231,0,
+58,64,169,160,216,0,51,255,38,2,224,1,5,233,139,0,192,0,0,58,
+97,97,161,121,120,100,179,97,152,193,201,16,164,55,245,227,4,66,9,1,
+95,52,92,22,196,36,239,94,2,114,238,99,234,226,242,8,64,14,96,26,
+163,147,64,75,85,223,96,140,248,50,0,98,104,96,249,192,115,226,117,8,
+128,63,0,58,114,4,226,249,9,0,55,93,24,226,249,11,115,198,245,131,
+0,64,36,0,58,96,25,239,10,12,92,205,97,9,192,224,133,77,238,254,
+3,249,236,5,225,206,1,129,50,230,22,5,229,187,2,139,214,64,107,64,
+79,238,241,3,160,73,164,24,96,187,66,138,0,52,192,113,113,31,0,90,
+145,38,1,90,32,160,58,198,66,224,28,6,73,171,224,28,16,76,146,224,
+28,16,107,61,224,29,17,0,52,224,117,4,1,95,53,65,119,96,191,2,
+95,53,57,192,10,0,58,96,6,224,187,1,129,150,96,30,64,56,3,95,
+55,55,51,192,161,163,162,64,16,128,149,224,16,2,160,137,224,17,3,128,
+125,128,17,128,122,96,80,128,122,131,211,64,6,224,122,1,103,220,0,56,
+117,222,0,56,118,175,0,56,100,94,0,56,118,76,85,21,160,70,102,176,
+128,70,64,10,0,58,96,6,8,10,65,32,98,115,62,61,32,58,96,41,
+128,13,64,12,131,57,2,98,115,60,96,26,130,186,2,98,115,60,64,12,
+130,146,4,98,115,99,109,112,64,14,196,221,96,2,227,234,0,141,74,155,
+153,1,95,50,226,102,1,231,175,3,96,143,64,31,0,53,100,198,1,95,
+53,88,165,96,7,84,81,65,77,128,229,69,4,225,161,5,130,161,201,17,
+2,95,51,48,64,224,98,177,0,58,96,6,160,54,161,81,128,45,97,207,
+160,17,86,9,160,17,0,58,96,71,224,48,1,65,47,0,55,71,220,0,
+58,96,32,96,233,0,47,65,4,64,19,96,13,0,61,96,13,129,45,0,
+73,64,10,129,43,84,243,80,255,69,123,130,33,67,165,101,104,1,54,55,
+227,223,4,0,83,67,222,134,80,119,144,103,26,182,8,99,233,100,32,243,
+35,0,228,38,1,84,19,65,41,104,222,96,39,182,130,224,53,33,0,90,
+224,53,2,2,95,51,54,78,216,118,127,0,58,117,249,64,137,66,126,68,
+249,231,17,14,100,153,1,95,49,106,205,108,252,0,49,65,93,96,67,0,
+95,71,222,160,10,0,50,73,34,160,89,64,6,117,0,132,199,128,167,202,
+94,224,220,15,224,118,6,184,61,96,182,96,101,129,236,64,6,161,134,190,
+209,224,85,13,103,18,224,77,2,0,58,121,61,192,57,129,217,114,175,0,
+52,230,91,28,0,58,122,19,97,219,67,91,118,8,160,5,117,181,224,11,
+0,91,243,121,208,130,7,97,229,99,169,224,5,7,0,58,96,43,237,228,
+2,233,224,6,0,58,64,60,160,113,0,57,64,179,188,86,2,50,32,58,
+107,200,234,68,2,234,40,21,0,58,105,219,252,92,4,3,46,109,104,115,
+120,69,92,90,122,156,136,16,231,18,15,102,58,231,77,7,130,115,251,76,
+0,185,143,166,182,125,190,133,250,1,95,55,93,229,128,136,129,130,225,174,
+3,71,91,72,222,160,105,224,132,3,1,95,55,93,74,225,222,7,248,99,
+1,233,36,6,0,49,146,221,225,244,2,253,169,4,1,95,55,71,151,2,
+95,55,53,65,146,92,65,160,32,224,109,2,91,245,171,252,224,213,6,226,
+73,3,96,200,212,186,170,21,0,55,72,197,0,58,96,65,66,98,12,79,
+46,100,101,115,101,114,105,97,108,105,122,101,65,175,130,15,21,94,97,100,
+100,95,108,122,55,55,95,100,101,99,111,109,112,114,101,115,115,111,114,64,
+31,194,9,0,83,107,65,171,165,241,191,0,1,95,51,231,254,1,0,66,
+147,26,225,17,3,129,138,202,107,224,207,0,0,51,66,95,224,53,4,224,
+216,5,133,13,65,120,194,235,0,58,65,28,98,10,160,215,161,13,225,34,
+1,104,218,169,62,255,3,2,74,209,94,231,1,95,50,159,10,227,119,4,
+191,15,8,94,117,110,103,101,116,98,32,58,96,41,224,100,2,228,187,5,
+1,95,52,72,209,225,229,0,235,10,1,127,223,0,95,99,80,0,53,205,
+129,98,6,118,248,224,35,2,95,145,67,58,5,35,50,48,57,53,49,108,
+50,3,35,53,53,50,107,29,228,97,3,1,95,52,168,227,98,73,0,51,
+107,145,0,51,96,37,227,40,1,17,104,71,101,116,67,104,97,114,58,32,
+115,117,114,114,111,103,97,116,67,50,224,52,6,0,55,123,49,224,52,9,
+160,41,0,58,97,53,102,47,1,35,52,140,157,96,49,239,11,0,228,186,
+2,0,52,67,170,201,179,86,78,1,52,56,75,35,72,121,224,95,1,9,
+111,112,101,110,66,105,110,97,114,121,75,135,128,101,230,2,7,1,95,52,
+245,158,3,73,148,129,230,1,95,52,158,68,64,131,0,54,96,131,107,98,
+229,5,10,229,1,5,0,58,127,110,102,183,71,74,65,104,1,95,55,71,
+181,78,119,1,58,55,71,199,130,248,18,112,101,114,102,111,114,109,73,79,
+32,94,119,97,110,116,95,103,109,112,96,32,205,116,226,80,3,2,95,52,
+51,240,145,5,224,24,0,2,51,53,54,228,174,2,4,77,72,83,67,67,
+222,94,226,26,1,99,6,240,38,4,227,1,5,83,202,0,52,65,237,126,
+45,104,106,156,70,0,52,224,93,4,5,105,110,99,108,117,100,193,215,96,
+0,227,79,1,224,2,0,224,86,40,3,99,98,105,116,255,19,0,192,184,
+247,76,3,96,13,64,250,96,190,224,96,2,2,64,95,55,100,209,128,137,
+224,1,3,120,213,224,22,7,241,194,5,224,1,5,225,80,0,229,147,0,
+125,227,0,52,91,81,2,52,49,49,100,109,109,243,225,113,9,11,69,88,
+84,82,65,67,67,70,76,65,71,83,224,198,4,237,72,4,141,37,128,193,
+224,5,24,192,54,228,61,7,96,169,127,26,110,3,255,25,0,190,153,255,
+17,14,8,69,120,101,99,117,116,101,58,32,255,8,2,1,49,50,79,159,
+79,179,225,19,1,229,228,5,79,187,227,46,0,230,192,4,164,136,224,135,
+4,138,55,0,51,106,172,0,55,94,141,96,143,0,51,66,205,224,141,6,
+13,99,111,109,109,97,110,100,32,102,97,105,108,101,100,160,148,192,130,226,
+240,7,229,173,1,224,245,15,128,54,96,248,128,10,224,109,5,1,67,32,
+70,63,7,105,108,97,116,105,111,110,32,192,0,128,115,160,215,143,79,96,
+59,4,55,51,54,32,35,99,246,96,14,97,41,0,50,80,38,128,227,0,
+55,64,227,170,33,224,98,1,0,109,226,188,5,160,0,227,25,10,192,2,
+2,95,55,51,199,140,226,96,5,224,83,1,2,36,73,78,224,84,5,227,
+18,4,224,2,6,224,80,3,224,66,2,2,79,85,84,129,240,1,55,51,
+210,178,193,187,224,2,9,98,238,224,35,1,128,1,224,193,1,240,116,1,
+224,29,1,128,1,225,111,6,15,32,45,119,32,45,87,97,108,108,32,45,
+79,51,32,45,73,224,197,2,231,167,2,225,10,1,224,87,1,224,86,20,
+11,47,115,114,99,47,114,117,110,116,105,109,101,226,49,1,224,169,8,224,
+78,14,96,22,2,79,32,35,146,223,224,59,3,231,242,4,96,60,65,77,
+118,20,100,169,224,133,5,224,206,4,224,97,2,224,95,12,224,30,6,225,
+233,15,8,45,68,95,95,77,72,83,95,95,224,90,1,224,88,30,0,67,
+224,238,2,224,48,19,229,77,5,224,229,1,1,51,57,224,155,13,64,62,
+210,225,66,246,96,48,224,190,15,0,39,225,141,0,2,95,55,52,165,139,
+225,142,8,224,155,2,225,210,13,5,47,101,118,97,108,45,160,73,224,219,
+5,224,57,10,1,46,99,160,116,165,16,225,183,5,1,52,51,131,175,192,
+126,225,208,4,192,87,224,134,2,2,42,46,99,160,120,226,197,2,10,36,
+73,78,32,45,108,109,32,45,111,32,227,71,0,224,0,19,2,95,55,52,
+96,173,2,58,55,52,138,161,114,102,237,45,9,232,51,13,64,0,0,58,
+96,65,232,102,2,232,105,2,224,45,2,0,58,97,101,210,180,64,254,76,
+112,105,87,230,102,1,226,23,0,0,58,65,228,160,84,237,190,13,237,192,
+11,68,46,232,130,0,126,239,194,94,116,238,160,109,197,64,179,254,217,158,
+224,19,3,132,90,224,63,0,128,11,1,95,54,153,93,64,37,116,217,64,
+73,227,187,3,0,58,68,205,64,128,171,62,128,23,229,172,0,145,47,64,
+59,229,142,0,1,95,56,64,33,98,244,138,53,1,51,54,137,130,113,31,
+118,168,0,64,109,151,0,49,150,223,96,40,128,69,64,207,96,14,235,23,
+2,241,54,0,102,206,0,58,96,6,237,140,9,0,49,88,172,2,95,55,
+51,134,60,235,45,1,246,149,3,96,78,102,167,1,95,55,128,101,167,27,
+0,58,103,94,78,165,1,32,58,96,18,3,10,65,32,90,72,181,0,58,
+96,39,76,5,0,115,118,65,64,30,172,106,236,204,6,1,95,55,130,221,
+234,12,16,234,9,0,163,126,234,50,18,232,187,4,193,236,224,48,18,2,
+79,78,70,227,18,0,230,72,4,96,20,130,10,128,175,122,118,162,31,224,
+8,13,1,95,55,78,142,1,95,55,128,213,237,133,4,100,175,232,118,0,
+66,11,232,5,2,76,202,84,34,158,147,0,52,64,34,97,105,233,6,2,
+99,247,2,66,32,79,225,20,3,12,111,117,108,100,32,110,111,116,32,102,
+105,110,100,96,196,3,67,39,32,79,192,128,224,42,3,3,105,110,32,102,
+172,54,230,52,1,225,31,3,238,234,3,226,246,2,0,39,238,14,0,2,
+55,50,52,224,79,2,6,100,101,102,97,117,108,116,167,147,1,50,53,233,
+19,3,164,130,96,22,229,120,0,231,146,1,192,114,234,216,0,232,91,8,
+234,42,24,225,46,15,234,54,17,11,70,111,117,110,100,32,116,97,114,103,
+101,116,234,59,9,2,55,50,54,100,122,64,11,138,71,234,83,8,160,0,
+224,188,1,225,51,6,225,53,7,64,32,220,112,128,192,144,191,130,69,97,
+77,128,77,225,61,14,100,21,0,53,64,242,1,55,50,115,105,1,54,55,
+64,144,68,110,230,190,15,192,58,192,167,225,128,1,224,76,44,3,102,108,
+97,103,234,13,3,133,145,161,200,224,81,43,2,111,110,102,230,123,4,231,
+174,10,224,45,1,3,117,110,105,120,135,68,234,185,2,0,95,85,70,128,
+0,0,58,109,45,69,23,0,53,65,134,1,55,50,81,230,114,163,68,177,
+98,228,1,95,53,64,95,160,159,1,53,50,69,96,96,11,0,58,96,6,
+213,3,118,185,114,179,165,66,217,44,224,12,2,249,239,0,213,7,64,109,
+181,7,128,10,117,7,96,10,0,58,96,6,213,7,249,124,0,224,66,1,
+116,215,64,117,64,42,134,28,102,153,127,2,66,28,98,89,0,57,85,195,
+245,35,3,0,52,114,244,124,205,190,186,166,152,0,95,208,226,68,122,84,
+220,129,172,96,24,3,95,51,48,49,73,66,78,175,163,247,224,41,1,86,
+197,193,138,0,49,98,199,125,162,96,151,0,54,134,37,182,193,0,58,97,
+244,244,181,19,66,206,250,144,0,103,239,160,2,160,99,0,58,100,145,231,
+234,6,244,82,0,64,73,122,76,229,124,0,175,39,250,94,1,198,133,98,
+98,224,225,0,180,107,0,53,167,4,64,102,189,185,99,114,238,4,4,0,
+52,121,14,229,219,1,128,118,1,95,52,148,21,224,44,7,81,227,165,246,
+128,44,134,8,2,95,55,50,133,151,164,148,228,165,0,196,121,228,119,6,
+2,67,97,110,69,159,3,112,97,114,115,235,235,1,167,254,228,225,44,174,
+29,245,151,1,232,193,0,243,160,10,224,85,32,229,55,16,2,82,101,97,
+197,54,0,115,102,65,9,46,32,80,111,115,115,105,98,108,101,192,22,165,
+78,206,98,101,56,229,61,4,0,89,97,237,66,9,193,231,64,151,80,192,
+97,128,201,54,160,0,229,85,5,224,231,9,221,107,224,163,1,160,135,0,
+46,228,96,0,0,58,104,77,184,36,246,75,0,2,52,57,56,64,249,110,
+62,103,79,67,242,64,128,0,53,68,14,116,90,148,95,65,12,164,109,98,
+107,1,95,52,84,31,0,58,97,249,184,63,97,88,1,55,49,167,201,99,
+136,0,79,96,104,235,166,2,90,97,0,54,121,59,224,170,1,2,58,94,
+42,229,222,1,96,51,225,113,8,2,32,32,102,70,171,225,85,1,0,52,
+73,93,141,193,0,53,94,233,128,62,224,59,14,5,101,120,112,101,99,116,
+240,138,0,236,47,0,0,55,65,154,195,59,227,148,1,64,224,190,172,0,
+49,101,7,68,144,0,58,64,44,227,171,7,235,150,0,206,249,193,183,195,
+10,128,27,2,95,55,48,163,13,127,229,231,62,0,0,58,96,95,117,255,
+235,117,0,75,176,3,95,55,49,53,134,87,97,56,96,84,138,251,160,53,
+0,54,228,53,9,1,52,51,224,242,2,16,102,111,108,100,114,49,58,32,
+101,109,112,116,121,32,108,105,115,136,147,224,169,0,0,83,68,233,160,14,
+179,53,224,10,2,101,68,160,105,218,29,107,98,244,93,1,1,95,52,75,
+128,232,164,0,224,168,0,242,120,9,96,255,225,144,5,210,17,224,83,0,
+235,76,9,224,26,13,246,242,6,224,90,10,2,108,105,110,196,81,163,232,
+224,152,2,177,231,224,52,8,4,44,32,99,111,108,128,53,224,40,4,238,
+48,4,6,101,110,100,45,111,102,45,202,47,224,26,3,5,110,111,32,108,
+111,99,114,127,196,204,224,28,17,0,58,99,3,119,2,129,241,225,231,1,
+173,45,0,35,84,156,66,156,98,214,0,58,96,7,193,237,244,54,0,64,
+4,0,85,99,92,74,217,0,53,71,93,130,192,165,157,171,169,129,213,151,
+91,173,0,114,68,226,77,0,224,46,30,96,146,162,215,230,39,0,224,39,
+11,131,138,230,34,3,224,39,12,131,114,224,205,4,231,231,0,0,83,224,
+82,6,164,246,152,223,192,130,66,162,250,244,4,0,35,127,70,97,221,0,
+54,79,103,3,67,32,95,54,66,163,0,35,227,109,0,224,109,28,224,69,
+0,192,108,200,84,224,108,12,128,228,224,77,5,1,67,39,156,33,0,49,
+136,171,131,239,1,95,54,88,98,1,64,64,232,96,1,96,52,1,95,54,
+99,243,98,2,96,173,71,60,73,52,66,227,64,184,64,15,0,49,232,192,
+1,111,92,110,242,224,140,2,224,141,0,160,228,171,96,225,121,3,0,54,
+90,103,96,28,175,196,160,28,99,202,0,54,105,255,225,30,30,148,103,193,
+30,224,109,12,103,80,224,157,1,1,95,54,65,0,1,35,49,104,34,224,
+50,37,169,215,192,142,68,149,106,15,224,43,10,123,108,154,138,65,249,93,
+93,4,95,51,50,52,32,129,254,72,2,0,49,162,21,225,56,4,123,195,
+224,19,6,169,74,224,76,11,96,100,2,95,54,53,200,92,224,32,8,69,
+153,96,33,245,143,0,248,31,0,97,77,161,114,1,50,57,64,100,133,136,
+225,108,18,177,57,1,32,83,225,47,0,229,172,2,167,198,66,67,227,77,
+5,134,131,71,194,0,57,87,67,128,69,231,219,1,163,22,236,51,0,224,
+134,24,113,35,197,79,221,144,221,149,234,132,2,69,162,160,86,128,155,114,
+7,128,68,236,208,15,229,175,3,64,201,130,218,88,105,161,141,132,120,65,
+62,118,194,128,194,65,206,104,159,120,128,0,52,96,7,0,54,73,190,64,
+67,0,54,224,134,4,242,67,2,96,36,0,51,224,36,2,96,90,128,42,
+160,48,2,95,54,54,227,74,1,225,24,25,228,152,29,165,106,225,158,7,
+96,134,66,56,135,247,85,147,0,51,197,196,225,173,8,228,196,3,128,150,
+131,62,96,9,162,25,218,254,200,139,229,171,0,133,224,96,122,64,98,2,
+95,54,54,64,112,228,154,8,160,91,232,180,0,136,202,130,69,96,76,129,
+9,227,68,8,140,109,0,54,159,151,226,103,26,228,148,1,64,95,224,21,
+8,0,55,170,63,195,48,96,21,225,78,3,109,30,197,150,65,3,224,29,
+4,180,121,64,170,0,79,229,90,1,0,53,96,254,231,246,5,16,85,110,
+114,101,99,111,103,110,105,122,101,100,32,105,110,112,117,241,3,5,200,193,
+144,43,97,227,3,83,32,95,54,69,142,224,220,5,192,171,130,5,131,38,
+102,4,65,21,0,56,64,68,0,75,96,73,96,53,0,53,235,163,3,7,
+73,108,108,101,103,97,108,32,95,33,7,32,108,105,116,101,114,97,108,168,
+65,206,8,0,90,132,98,224,225,7,174,37,109,234,2,95,49,53,79,125,
+127,179,100,131,225,113,0,0,95,132,142,226,200,1,162,56,230,211,13,129,
+88,97,81,64,187,226,206,16,128,38,225,17,14,99,18,2,95,54,56,64,
+7,192,195,98,57,224,67,9,160,195,224,37,37,225,15,10,224,37,2,225,
+15,12,205,53,161,19,1,54,56,197,224,225,212,19,224,194,6,224,118,42,
+225,134,9,226,180,2,227,94,9,227,54,14,98,76,133,25,227,168,0,167,
+66,131,170,163,252,204,120,98,126,66,144,228,92,4,236,151,2,192,105,232,
+116,14,107,102,65,14,224,0,3,96,130,1,55,48,207,252,229,19,2,64,
+3,196,217,64,5,101,113,128,216,1,54,53,101,74,224,113,2,128,109,229,
+10,1,224,48,6,0,55,224,162,8,224,48,0,64,0,65,171,3,95,55,
+48,57,113,123,238,249,1,225,32,3,0,55,112,5,225,32,7,225,18,1,
+0,55,78,231,225,18,6,225,17,42,192,48,1,95,54,154,136,224,180,1,
+64,37,224,29,2,168,4,225,220,15,0,58,96,21,109,254,101,200,197,194,
+64,7,77,158,227,129,3,5,67,32,61,61,32,64,136,128,139,250,202,17,
+104,219,64,202,96,102,71,107,143,95,65,37,0,58,96,146,108,60,0,80,
+136,189,120,128,64,37,242,183,2,225,60,5,198,98,230,104,0,194,98,196,
+63,224,16,2,235,28,14,225,180,0,224,39,2,206,114,224,20,1,64,1,
+134,177,224,115,5,129,186,152,104,224,123,2,246,46,1,234,184,5,203,131,
+230,86,1,192,21,160,153,131,54,0,85,227,63,1,0,85,224,236,2,64,
+0,192,43,96,169,193,119,130,106,226,19,27,64,252,218,228,224,172,0,233,
+155,0,202,8,161,204,160,166,143,96,162,153,130,151,130,67,0,52,128,189,
+242,0,2,128,81,162,162,224,50,0,131,25,129,20,224,151,0,224,163,15,
+227,208,6,224,138,2,228,65,14,164,60,128,140,160,153,227,35,7,224,84,
+0,0,58,97,41,162,79,170,18,136,39,192,237,227,241,0,235,133,1,0,
+51,81,185,145,122,249,145,3,1,108,101,112,169,224,18,3,3,119,104,101,
+114,111,114,224,20,3,1,100,111,224,17,7,0,111,114,229,237,38,0,161,
+25,104,240,194,157,128,110,224,50,1,0,105,183,121,77,174,73,164,91,158,
+64,55,227,109,0,65,82,188,60,77,129,230,2,7,0,49,120,174,252,93,
+0,172,173,160,127,225,79,0,134,213,165,19,215,170,129,96,0,58,97,248,
+155,249,129,25,130,189,224,14,2,66,226,224,14,1,108,55,233,126,6,136,
+241,64,75,215,54,99,236,103,165,0,80,96,99,0,54,147,246,97,242,193,
+149,141,75,0,80,70,172,242,57,4,2,105,109,112,180,201,8,58,32,102,
+105,114,115,116,32,99,72,156,8,105,115,32,97,32,100,105,103,105,178,72,
+64,100,67,206,225,226,0,228,43,8,170,154,227,238,3,228,45,23,224,42,
+5,228,48,1,228,49,4,228,51,1,224,22,2,228,28,0,95,253,109,91,
+128,0,128,23,228,86,1,96,24,163,66,102,18,160,69,143,18,65,13,0,
+52,209,250,192,90,128,131,160,96,164,37,186,201,196,165,225,4,0,160,13,
+96,33,194,249,128,95,224,107,3,106,26,149,62,227,177,4,64,188,224,11,
+0,232,0,4,160,133,224,239,2,224,163,1,228,188,3,137,182,117,169,196,
+29,7,95,52,48,32,95,54,57,51,80,147,1,53,57,66,67,0,53,180,
+127,2,95,54,57,77,109,0,80,68,126,0,49,224,30,8,128,13,192,14,
+136,219,224,70,11,168,235,178,30,192,148,224,199,1,224,224,25,96,0,98,
+156,244,94,1,192,5,170,181,64,53,104,32,4,50,32,95,53,55,229,81,
+3,161,12,96,36,0,52,224,36,10,96,140,224,232,21,0,51,154,171,151,
+253,224,231,30,128,86,180,140,192,242,135,252,181,237,194,134,66,144,89,125,
+160,0,225,138,13,192,0,226,72,13,160,86,226,163,9,194,24,226,21,5,
+226,170,5,226,19,11,226,21,20,225,63,3,226,34,78,226,29,2,224,247,
+0,182,201,64,175,219,1,227,189,1,244,72,19,128,70,128,59,119,70,192,
+61,232,83,1,230,228,2,239,46,2,239,213,15,243,76,0,192,49,228,215,
+5,228,127,0,128,67,160,73,239,102,10,242,211,14,0,48,135,145,228,165,
+0,192,68,251,183,0,232,254,1,96,240,0,80,96,81,66,107,1,53,55,
+65,246,124,76,225,29,1,227,92,13,236,139,7,162,102,70,196,167,33,64,
+10,220,234,98,178,161,52,225,55,28,227,156,0,225,55,4,205,103,225,55,
+128,193,42,225,41,19,129,26,225,24,29,224,185,2,107,146,224,183,41,226,
+156,1,224,190,63,96,93,224,190,29,0,64,124,102,226,38,19,229,146,0,
+224,24,7,163,187,4,95,54,53,52,32,227,206,2,160,213,0,58,110,26,
+152,210,250,135,6,15,114,111,109,74,117,115,116,58,32,78,111,116,104,105,
+110,103,104,61,127,59,64,152,251,77,13,165,5,225,19,0,129,1,235,16,
+0,0,58,123,76,122,148,0,65,96,72,237,67,2,75,24,64,146,100,135,
+102,21,146,205,129,66,206,24,160,2,96,77,231,62,2,118,135,162,151,129,
+132,99,121,65,157,195,135,151,189,82,73,91,24,96,7,0,54,247,157,2,
+247,166,1,200,140,102,147,224,15,9,64,73,157,250,224,73,14,192,36,99,
+140,235,73,7,102,240,0,95,73,55,224,145,24,130,149,0,53,126,196,224,
+114,22,225,233,3,73,161,245,121,0,160,112,128,131,160,23,76,218,98,45,
+224,8,0,224,211,37,254,128,0,65,107,229,232,1,70,126,160,94,96,180,
+224,9,3,224,95,26,0,58,70,166,130,85,225,183,43,0,58,96,124,239,
+24,2,195,243,114,8,2,64,64,58,98,91,139,174,228,187,1,162,171,204,
+225,225,167,8,2,49,52,50,224,130,21,224,190,0,225,171,28,192,45,227,
+152,4,241,80,1,64,8,1,95,54,82,83,230,40,0,233,40,3,65,174,
+138,120,64,84,65,185,224,107,27,160,68,224,62,4,128,223,230,160,1,72,
+147,192,114,224,59,1,224,247,28,0,58,72,102,131,209,2,75,51,32,64,
+14,223,21,227,172,5,242,54,2,0,83,194,69,227,8,26,225,95,58,98,
+6,0,89,228,64,12,225,122,5,224,151,3,70,12,128,90,120,161,224,160,
+26,224,161,51,160,154,167,188,224,154,13,97,167,0,53,224,116,6,98,178,
+194,186,69,36,164,164,199,233,101,30,229,75,0,141,69,96,34,82,96,226,
+231,3,78,127,224,89,1,224,202,42,162,174,225,101,1,224,120,9,138,186,
+226,104,0,96,130,224,129,75,224,59,0,160,105,231,31,5,230,229,6,31,
+68,97,116,97,46,73,110,116,101,103,114,97,108,46,92,94,58,32,110,101,
+103,97,116,105,118,101,32,101,120,112,111,110,1,101,110,175,53,160,76,0,
+58,99,67,134,179,133,1,226,45,23,128,175,193,26,96,15,84,79,224,224,
+15,192,46,224,212,4,224,45,30,97,251,0,58,98,38,131,145,0,50,96,
+44,0,58,100,83,244,171,0,199,109,80,149,231,102,28,160,13,231,87,0,
+224,11,3,231,105,52,166,61,66,186,175,225,102,75,174,51,231,136,8,102,
+118,231,154,55,224,241,142,92,234,224,242,79,224,243,20,64,37,195,176,169,
+64,103,215,224,168,1,224,240,52,233,76,64,107,71,136,192,230,253,26,224,
+59,20,1,57,48,224,60,37,0,90,134,24,233,64,0,96,43,233,150,27,
+233,193,40,235,196,0,224,111,7,224,68,29,224,111,46,0,58,107,113,203,
+208,230,139,1,64,28,231,183,14,0,49,95,107,160,76,224,116,26,172,213,
+230,245,5,233,117,3,233,132,2,136,153,232,30,1,224,101,53,225,184,38,
+205,126,224,211,47,203,114,228,80,0,131,71,67,66,235,118,36,192,135,227,
+169,0,96,37,242,96,1,235,117,0,235,214,1,107,110,153,26,224,9,1,
+64,82,0,54,81,208,192,82,192,7,1,58,54,67,206,171,15,235,208,14,
+98,14,128,22,160,118,226,14,16,231,0,29,230,198,35,161,76,144,190,135,
+51,168,51,138,201,192,242,160,9,224,81,15,0,58,96,253,135,13,0,52,
+231,194,0,140,42,1,95,54,103,11,0,73,137,14,97,104,246,225,8,111,
+223,1,64,83,68,245,248,64,6,243,20,0,1,95,54,71,75,0,53,232,
+84,2,2,92,92,110,104,52,64,25,1,50,54,83,134,126,168,0,53,89,
+125,69,230,125,4,2,52,48,57,64,55,0,49,64,127,184,251,1,95,54,
+239,74,0,64,138,143,54,65,225,64,68,64,218,1,52,53,124,35,1,56,
+54,163,52,196,158,160,4,220,14,128,101,161,172,101,175,192,35,96,86,1,
+54,56,83,237,64,190,250,92,4,97,154,240,81,3,0,48,96,0,128,32,
+129,121,192,208,0,89,242,38,0,161,60,96,108,226,170,1,210,71,141,79,
+225,79,4,128,78,230,105,0,225,112,8,121,144,224,65,0,97,2,192,19,
+241,3,8,247,104,2,130,181,2,95,50,50,90,162,65,49,89,223,64,63,
+1,55,52,128,44,125,65,85,209,1,49,50,81,6,64,13,157,145,192,93,
+0,85,226,120,0,128,7,2,95,54,56,182,136,2,58,54,56,174,59,84,
+163,144,233,2,90,32,90,97,110,1,54,52,250,88,5,82,53,161,123,98,
+50,0,79,157,236,0,90,96,160,129,208,224,88,1,96,90,237,62,0,0,
+50,66,161,99,157,0,58,65,161,229,144,0,129,106,78,196,232,60,6,1,
+95,51,154,146,136,180,64,53,0,54,239,65,0,65,229,122,225,98,58,0,
+58,66,124,98,242,2,51,54,53,178,243,154,244,0,58,96,38,250,122,1,
+96,80,90,122,1,54,56,198,19,96,23,97,35,128,23,132,55,228,49,0,
+193,242,164,251,232,82,3,160,2,77,124,224,17,5,217,204,224,17,2,192,
+69,224,21,3,244,196,2,197,88,224,104,4,226,114,0,224,26,0,224,61,
+1,226,143,0,97,56,226,35,2,224,33,6,186,233,225,90,0,192,2,160,
+23,224,42,4,224,21,0,192,147,67,114,192,64,224,19,2,160,187,228,73,
+11,224,84,1,169,111,224,87,3,224,84,8,229,242,0,225,99,1,128,1,
+195,89,163,233,227,112,2,224,121,11,212,71,160,36,161,18,224,172,28,224,
+30,1,191,144,94,62,0,35,118,46,195,157,96,43,224,12,0,157,86,224,
+23,0,224,0,1,224,73,13,149,97,224,47,5,132,80,225,37,4,130,11,
+96,177,70,163,128,186,254,245,3,160,39,1,95,54,108,58,96,99,255,2,
+0,224,34,0,69,74,159,10,223,131,165,82,224,110,0,226,77,4,193,108,
+225,142,2,226,88,3,225,145,13,225,68,11,226,62,0,224,53,27,230,87,
+0,224,53,36,192,233,224,106,37,247,246,5,226,10,13,197,144,225,184,11,
+161,171,225,218,4,2,95,54,51,69,32,161,211,225,91,2,224,32,2,123,
+181,96,32,224,237,0,224,93,12,239,172,6,13,98,97,100,32,115,116,114,
+105,110,103,32,103,97,112,143,151,227,185,4,101,115,0,39,69,116,96,73,
+2,53,32,64,224,60,1,18,117,110,116,101,114,109,105,110,97,116,101,100,
+32,67,104,97,114,47,83,128,74,6,108,105,116,101,114,97,108,96,78,171,
+29,225,69,1,64,15,225,170,24,224,46,30,161,12,224,92,31,161,156,227,
+6,2,106,69,225,38,9,105,238,137,98,225,142,64,107,118,202,50,209,106,
+209,186,128,5,135,9,1,58,54,72,67,152,64,136,185,224,250,12,64,49,
+64,115,231,2,0,167,99,0,55,120,132,96,14,199,96,225,243,5,12,66,
+97,100,32,92,92,32,101,115,99,97,112,101,129,242,130,218,225,52,13,171,
+10,224,33,17,157,127,224,32,19,103,156,224,99,19,88,181,224,133,22,101,
+113,224,33,20,164,185,224,33,18,224,135,23,97,182,224,66,20,0,50,225,
+12,23,104,2,66,131,117,174,64,29,252,26,8,134,60,101,2,128,34,115,
+208,64,8,168,70,74,52,6,49,51,57,32,64,35,54,64,42,0,67,92,
+236,160,17,253,226,0,133,126,129,251,126,206,211,1,201,157,90,142,0,56,
+75,181,2,57,56,32,128,71,137,129,194,142,101,132,100,212,186,184,64,204,
+64,75,133,155,238,74,6,100,204,133,180,98,234,228,217,0,192,26,224,23,
+2,7,95,54,55,54,32,95,51,53,131,26,164,75,0,79,162,173,100,72,
+169,194,98,173,184,205,227,113,0,224,162,1,224,101,3,144,228,224,94,9,
+224,82,8,224,81,22,227,46,7,96,48,0,56,131,165,251,215,1,64,17,
+0,56,224,16,0,160,33,68,29,192,16,211,77,163,226,65,242,224,81,0,
+231,183,0,224,20,11,100,130,224,21,9,135,64,224,21,6,100,67,224,20,
+7,100,121,224,63,8,64,14,192,21,0,58,100,1,202,234,129,51,161,197,
+198,149,234,45,11,96,17,238,140,2,224,25,0,229,81,1,128,10,98,249,
+160,26,64,128,98,178,1,54,53,131,58,112,96,141,9,128,0,136,104,96,
+70,98,176,236,105,0,96,43,224,12,0,97,85,0,53,101,159,226,217,3,
+130,215,224,218,3,139,219,2,79,32,80,228,208,2,2,78,85,76,68,198,
+97,157,224,25,5,2,83,79,72,96,25,65,160,224,25,6,1,84,88,96,
+25,64,94,224,25,5,0,69,160,25,64,140,224,25,6,1,79,84,96,25,
+67,76,224,25,6,1,78,81,96,25,64,203,224,25,5,2,65,67,75,96,
+25,66,136,224,25,5,1,66,69,128,181,65,209,224,25,6,0,83,96,24,
+65,81,224,24,5,0,72,128,127,66,89,224,24,5,1,76,70,128,230,225,
+1,9,0,86,128,50,98,162,224,25,5,0,70,160,51,225,1,9,1,67,
+82,128,25,225,1,9,1,83,79,128,25,225,1,9,1,83,73,128,25,225,
+1,9,2,68,76,69,128,26,225,2,9,2,68,67,49,128,26,225,3,9,
+2,68,67,50,128,26,225,5,9,2,68,67,51,128,26,225,7,9,2,68,
+67,52,96,26,101,166,224,26,5,1,78,65,129,136,78,206,224,187,7,1,
+89,78,128,26,226,12,11,0,66,128,26,225,11,9,1,67,65,160,53,226,
+14,10,0,77,128,25,225,12,9,1,83,85,160,79,225,12,9,2,69,83,
+67,128,26,225,12,9,0,70,130,16,111,98,224,25,5,0,71,160,25,225,
+10,9,0,82,128,25,70,113,224,25,6,0,85,160,25,225,8,10,0,80,
+128,25,225,7,9,0,68,162,172,70,198,233,211,0,224,0,20,0,58,101,
+136,238,214,1,230,33,1,196,10,0,54,119,160,197,212,105,48,64,93,1,
+95,54,132,18,1,95,51,98,102,73,43,1,95,49,139,248,0,58,69,250,
+64,83,114,153,0,58,96,40,239,211,3,1,80,32,160,52,196,246,224,95,
+0,64,92,224,67,0,143,158,114,66,231,150,2,119,63,224,20,8,65,36,
+224,20,7,82,255,224,20,9,66,33,224,20,7,0,49,98,55,224,21,9,
+64,224,224,106,8,135,235,224,20,5,102,229,0,67,241,16,5,0,35,126,
+115,1,95,49,97,166,144,115,224,7,55,2,58,54,55,144,155,242,128,2,
+69,240,184,216,230,19,1,106,226,3,67,32,61,61,231,46,1,134,28,0,
+85,64,12,64,8,0,90,249,11,8,198,116,134,75,241,113,2,237,23,1,
+103,205,226,109,1,2,99,97,115,170,152,231,179,5,145,156,171,44,129,203,
+181,114,96,1,168,138,104,149,137,154,198,216,166,192,137,144,2,67,32,60,
+178,188,230,159,0,224,218,7,224,28,0,128,216,179,232,233,31,3,192,234,
+224,34,1,240,41,1,160,68,134,216,224,67,7,224,245,2,226,35,3,192,
+0,106,5,169,212,0,54,82,104,2,95,54,55,65,104,175,193,224,104,93,
+0,58,97,105,140,129,7,54,54,57,32,64,90,32,85,156,226,225,63,1,
+64,116,224,18,6,65,53,236,171,0,128,18,130,190,224,18,4,102,164,104,
+20,192,191,168,190,64,104,1,64,85,117,188,250,239,1,192,15,224,68,6,
+144,106,171,97,128,18,68,152,160,45,224,60,1,206,125,224,61,5,109,58,
+224,18,5,131,167,224,80,4,196,125,224,80,10,224,41,6,66,150,224,41,
+1,194,157,65,70,183,22,2,53,50,57,64,30,88,165,149,58,64,49,67,
+64,0,58,96,245,100,195,0,80,137,220,0,85,96,20,136,230,228,13,7,
+120,228,228,77,9,228,56,11,142,30,224,63,7,224,41,11,73,191,228,98,
+8,0,49,102,160,228,99,44,2,58,54,54,213,106,133,147,164,40,131,156,
+116,242,64,35,0,54,160,35,246,1,6,98,222,130,152,248,126,0,0,54,
+155,26,143,59,118,32,243,165,1,4,64,95,52,53,49,192,15,0,58,96,
+41,181,175,0,52,98,211,82,142,64,195,0,58,64,54,97,139,0,54,153,
+49,173,36,1,54,54,118,188,119,156,64,81,2,58,54,54,133,9,70,148,
+0,53,64,201,100,201,211,12,74,190,0,53,140,97,170,191,160,13,107,10,
+0,57,68,202,103,165,202,204,249,126,1,0,58,64,105,160,88,142,60,65,
+114,235,45,0,129,36,0,67,184,7,70,200,239,179,4,17,33,33,58,32,
+105,110,100,101,120,32,116,111,111,32,108,97,114,103,197,32,164,15,227,236,
+1,0,53,194,91,64,78,144,218,238,20,1,253,15,1,242,9,7,64,97,
+7,110,101,103,97,116,105,118,101,128,106,96,96,1,58,54,66,116,132,10,
+224,48,5,15,105,110,105,116,58,32,101,109,112,116,121,32,108,105,115,116,
+96,46,225,207,4,249,37,7,165,197,204,29,0,58,96,9,231,191,3,66,
+133,67,85,199,171,128,20,134,47,80,198,135,219,64,22,225,145,0,96,8,
+232,89,2,97,3,200,59,128,101,70,91,155,150,1,95,49,71,207,238,238,
+0,128,14,239,119,11,112,210,239,119,5,176,163,239,165,12,135,206,224,45,
+3,101,74,96,124,131,201,224,54,11,66,160,224,54,6,0,53,64,73,2,
+58,54,53,233,57,4,134,201,161,15,226,141,3,70,135,2,95,54,53,96,
+233,98,6,96,23,129,102,82,208,64,77,251,255,4,198,236,149,178,242,243,
+6,175,45,64,37,0,85,190,179,243,35,0,96,52,128,31,128,86,129,154,
+181,250,97,220,96,74,250,74,4,231,165,1,1,53,54,228,16,0,1,80,
+32,150,234,120,248,64,73,96,23,128,230,176,109,132,139,0,54,91,219,102,
+24,251,68,6,128,203,193,225,128,153,98,46,245,162,1,64,102,229,137,0,
+243,118,1,243,119,2,97,11,231,38,0,224,5,0,153,89,224,15,3,66,
+142,228,186,0,134,49,128,2,151,241,225,162,0,248,210,1,224,95,0,224,
+1,1,104,156,128,0,192,45,247,124,0,160,54,104,180,224,53,3,160,202,
+224,74,8,128,146,229,234,4,207,65,233,91,1,181,187,242,94,1,218,209,
+224,126,3,103,131,126,159,225,181,2,252,178,8,224,91,0,230,244,0,96,
+74,224,51,28,96,199,165,242,225,42,11,225,176,0,224,46,1,224,1,3,
+208,167,128,125,225,56,11,129,53,160,47,240,170,2,197,20,225,65,134,129,
+66,224,62,0,225,68,42,66,195,98,204,168,110,64,4,227,22,2,227,43,
+13,160,180,230,195,47,0,58,100,98,203,101,228,200,0,3,49,51,54,32,
+228,195,0,64,12,1,64,35,68,183,105,108,224,38,7,197,79,128,38,197,
+74,133,237,224,39,3,197,73,128,39,133,68,230,118,6,8,100,105,103,105,
+116,84,111,73,110,134,112,64,218,244,244,9,224,16,0,180,254,134,250,161,
+13,224,49,27,96,176,224,49,21,96,39,96,255,65,33,237,62,1,1,95,
+54,65,61,96,9,0,49,78,83,65,84,1,49,49,65,84,0,50,224,198,
+2,10,92,34,108,105,98,47,68,97,116,97,47,89,57,9,46,104,115,92,
+34,44,49,57,49,58,113,17,97,124,98,1,106,207,95,134,86,53,64,135,
+226,48,0,245,237,18,98,206,224,200,2,96,161,136,125,3,95,54,49,57,
+70,26,106,123,64,98,115,77,0,67,69,151,64,54,144,179,138,40,160,22,
+103,80,145,27,224,23,4,74,118,107,135,224,21,4,64,241,98,118,179,89,
+128,42,224,19,255,224,19,195,0,51,98,90,224,81,58,0,51,224,241,150,
+224,159,151,224,19,255,224,19,37,115,217,160,21,0,49,224,81,50,69,5,
+96,19,0,52,182,116,224,81,45,0,52,183,135,224,61,20,109,217,0,52,
+183,229,224,83,16,226,175,0,0,49,121,148,224,83,7,1,52,48,229,220,
+3,224,21,1,150,145,224,189,25,224,127,4,224,63,1,184,19,224,43,6,
+183,82,224,43,7,224,151,11,225,83,13,224,63,12,183,61,224,107,7,224,
+85,22,226,35,40,0,52,72,133,225,19,29,224,41,3,228,47,20,224,83,
+28,129,231,112,210,224,187,49,225,99,31,224,19,2,220,243,186,225,224,247,
+26,224,39,70,224,19,142,230,1,171,224,179,0,225,123,51,0,49,120,213,
+224,61,7,147,238,224,83,47,224,19,255,224,19,88,122,59,224,201,178,228,
+141,0,3,50,49,53,57,64,8,160,23,226,113,20,0,51,189,116,224,41,
+6,2,49,53,56,227,7,2,227,207,20,1,51,56,225,55,2,226,243,1,
+229,79,12,1,49,52,224,65,2,227,9,92,65,8,224,41,28,229,223,11,
+84,117,128,19,189,226,96,21,77,222,96,21,93,92,224,82,3,64,35,0,
+35,125,164,224,83,7,0,49,231,107,3,64,42,102,177,152,52,160,21,65,
+99,127,242,238,76,5,65,212,64,59,238,52,5,224,88,1,224,65,2,224,
+173,1,225,79,82,224,19,130,80,242,129,4,0,49,226,129,2,226,171,20,
+1,49,51,224,20,1,226,126,11,64,60,97,197,228,12,4,97,154,145,18,
+117,97,192,64,64,128,0,51,97,201,225,156,3,0,56,239,209,255,224,19,
+67,75,67,225,24,255,224,19,255,224,19,9,86,156,192,20,233,103,131,241,
+17,255,224,19,255,224,19,255,224,19,159,67,191,0,51,120,225,0,57,233,
+242,3,0,57,119,233,128,24,2,49,52,53,233,227,3,126,176,96,70,224,
+24,6,232,180,1,224,23,5,1,55,50,64,100,0,55,159,12,1,55,55,
+224,26,3,104,80,168,126,224,125,2,1,50,48,228,226,11,64,145,107,100,
+2,35,54,48,104,179,160,23,0,52,120,172,224,23,9,0,51,96,119,225,
+224,247,224,19,255,224,19,255,224,19,255,224,19,255,224,19,175,237,54,1,
+3,49,53,50,50,242,223,182,224,19,255,224,19,255,224,19,243,99,216,138,
+120,245,191,3,74,93,138,41,224,21,7,224,43,13,224,65,31,244,242,0,
+224,21,3,224,151,0,224,20,45,75,33,224,127,8,85,103,224,171,36,224,
+21,13,149,94,224,129,6,128,20,0,52,64,49,224,151,8,224,20,2,94,
+88,75,241,64,21,249,183,2,245,114,1,224,43,7,224,108,18,0,57,247,
+26,3,64,65,224,43,17,0,50,75,136,224,152,9,224,20,2,224,108,1,
+1,50,53,224,65,12,0,53,224,174,2,224,218,12,1,50,57,248,35,0,
+3,49,53,48,51,224,91,2,246,80,2,1,55,54,225,77,3,224,23,1,
+0,53,224,160,3,226,16,0,0,53,236,146,2,0,52,97,122,98,61,247,
+47,3,0,51,76,122,226,192,7,0,56,85,179,0,35,120,124,1,35,53,
+226,216,3,1,56,54,64,69,97,165,0,35,237,109,3,64,11,227,26,18,
+2,49,52,56,224,182,11,1,55,54,77,163,224,22,8,3,50,49,52,53,
+224,205,2,237,2,61,1,49,53,246,52,3,224,107,3,0,57,224,131,13,
+0,53,225,105,12,64,23,224,155,2,224,115,11,224,175,11,65,78,130,6,
+1,49,54,231,233,255,224,19,255,224,19,255,224,19,211,251,253,31,229,140,
+11,3,51,49,48,53,252,255,11,225,107,255,224,19,168,251,45,255,224,19,
+7,1,49,51,232,69,21,224,19,101,227,114,255,224,19,255,224,19,83,0,
+49,253,15,40,2,55,48,54,234,135,3,253,79,91,230,155,11,224,39,0,
+1,56,52,235,95,4,235,179,31,227,100,200,2,56,52,54,238,239,4,224,
+23,2,122,138,224,23,10,236,15,3,224,23,3,0,48,224,23,14,239,187,
+12,2,56,52,53,224,119,14,236,175,4,224,23,3,0,50,238,144,2,238,
+73,1,0,56,238,51,3,226,86,91,224,19,60,0,57,225,115,14,239,161,
+4,192,23,3,55,48,55,54,237,243,12,224,108,30,2,56,52,54,238,206,
+12,224,43,2,226,215,11,230,220,60,2,56,53,49,225,183,3,79,162,224,
+44,9,1,50,51,113,103,143,191,1,54,52,224,170,2,0,50,79,186,124,
+255,0,64,124,185,224,24,0,0,55,64,48,80,11,224,23,6,0,57,64,
+121,82,207,2,64,35,55,252,245,2,144,237,64,89,224,22,5,64,69,66,
+63,224,21,4,80,214,110,252,224,42,4,1,55,55,64,67,0,53,96,90,
+0,49,253,81,3,1,50,48,64,48,96,229,224,188,4,1,50,56,112,101,
+0,51,224,24,9,1,49,57,105,83,224,25,9,3,51,49,52,50,65,138,
+113,76,1,35,54,64,100,2,75,32,64,224,0,255,224,0,255,224,0,136,
+1,58,54,67,22,27,10,65,32,83,39,32,95,49,52,49,32,64,95,54,
+50,54,32,64,67,32,95,49,50,55,32,95,49,51,99,53,100,244,3,58,
+54,52,57,96,43,13,66,32,89,32,64,66,32,66,32,83,32,85,32,80,
+64,55,2,55,32,64,128,5,64,0,1,67,39,64,27,1,67,39,64,83,
+0,66,64,18,64,16,2,67,32,64,192,41,192,17,96,32,1,80,32,128,
+13,7,95,49,48,54,32,64,85,32,99,52,2,85,32,65,163,59,3,58,
+54,52,56,224,115,1,128,80,64,119,3,64,66,32,85,96,165,0,55,68,
+31,224,87,0,64,85,96,124,3,32,64,67,39,64,97,0,64,224,198,2,
+132,92,2,64,64,64,128,52,96,92,0,55,96,92,2,67,32,83,224,239,
+3,131,216,224,20,7,68,159,224,20,8,0,54,68,8,224,20,7,0,52,
+68,3,224,20,8,65,66,224,20,7,0,53,68,39,224,83,8,64,166,224,
+20,8,224,125,11,85,104,224,20,8,100,129,224,20,8,224,125,11,77,4,
+224,20,9,65,73,224,251,8,225,16,11,0,51,224,188,11,0,52,224,167,
+12,224,83,11,0,49,69,47,224,21,10,224,148,11,104,88,224,20,7,1,
+56,55,106,7,224,22,8,0,54,225,85,12,1,56,53,224,196,12,1,56,
+53,225,215,12,2,56,55,48,64,45,99,21,65,80,3,66,32,95,52,86,
+158,2,95,49,52,65,157,227,45,2,65,236,1,95,54,97,221,3,64,64,
+95,49,75,95,224,7,183,1,58,54,66,88,68,20,97,21,64,241,2,95,
+54,52,129,61,1,95,54,65,14,31,102,114,111,109,85,84,70,56,32,34,
+33,92,34,35,37,38,39,40,41,42,44,45,46,47,58,59,63,64,91,92,
+92,93,3,95,123,125,34,64,79,0,58,97,24,99,97,6,95,50,57,48,
+32,64,83,67,243,1,83,39,67,186,0,60,199,215,224,19,7,162,0,224,
+19,4,98,64,100,70,3,67,32,61,61,192,17,1,95,49,120,95,1,85,
+32,192,191,224,10,3,0,67,164,97,192,66,65,161,224,30,1,224,40,2,
+224,128,8,130,16,224,61,5,66,128,224,61,12,224,149,5,64,19,224,149,
+9,65,7,0,52,225,81,9,128,103,225,81,7,10,36,43,60,61,62,92,
+94,96,92,124,126,193,67,0,51,225,67,19,72,144,225,47,7,104,210,224,
+153,4,96,17,225,47,20,0,83,224,241,6,67,91,224,30,1,224,230,5,
+67,96,224,230,13,0,50,198,77,101,163,67,86,133,149,101,152,230,86,5,
+132,148,0,64,65,9,101,152,97,10,216,190,1,58,54,67,94,97,49,160,
+150,101,213,0,66,160,90,192,72,0,51,68,2,225,59,1,5,83,79,85,
+82,67,69,97,54,160,118,134,87,1,64,95,140,227,64,20,7,95,50,54,
+56,32,95,54,50,64,188,0,66,64,8,0,51,64,119,64,129,3,95,52,
+53,49,64,11,66,148,224,242,0,224,147,2,96,75,160,181,0,58,96,180,
+102,152,102,154,68,18,192,159,70,119,96,8,166,125,91,143,107,58,96,37,
+70,193,64,5,0,80,102,163,0,79,96,203,0,54,64,84,224,198,1,18,
+85,110,99,108,111,115,101,100,32,123,45,32,99,111,109,109,101,110,116,96,
+211,138,81,129,233,71,89,135,131,128,7,225,37,0,0,83,230,244,6,123,
+174,96,249,193,143,192,47,225,146,10,164,199,167,195,128,251,96,159,107,229,
+161,165,4,56,48,32,95,55,107,192,161,247,224,147,39,192,101,224,146,28,
+0,49,108,92,224,147,23,2,49,55,52,224,148,14,64,85,192,97,130,62,
+232,22,14,224,46,30,130,71,160,187,224,231,4,224,84,4,129,117,224,175,
+8,192,156,192,24,0,95,143,172,224,16,4,67,93,96,0,168,168,0,58,
+96,24,7,10,65,32,85,32,66,32,90,66,54,129,100,1,95,51,126,152,
+128,177,1,95,53,79,221,128,95,225,163,10,0,58,96,86,96,67,193,102,
+128,49,67,35,0,52,192,44,131,48,67,87,109,38,224,71,4,125,137,64,
+21,96,4,64,80,201,60,105,147,192,85,224,154,4,160,99,224,73,5,96,
+59,0,54,227,60,0,142,175,2,64,64,80,70,120,67,7,229,38,6,100,
+101,229,38,9,10,32,94,41,94,42,94,43,94,44,94,45,165,38,67,183,
+234,157,3,74,111,96,60,170,22,96,20,135,182,225,170,3,160,144,165,99,
+65,0,64,26,0,54,109,226,133,112,1,95,50,69,129,0,58,96,137,5,
+10,65,32,95,52,56,128,244,196,229,230,61,5,96,226,224,26,12,100,114,
+224,26,14,97,2,224,26,13,97,110,196,94,229,163,4,129,91,107,10,65,
+214,229,238,3,64,25,229,161,10,224,44,13,229,206,14,224,117,15,98,176,
+224,72,12,231,148,13,224,44,14,101,151,224,117,11,225,7,14,101,150,224,
+145,13,97,115,224,100,12,64,25,224,145,32,64,97,225,7,34,99,226,224,
+72,12,64,25,224,117,32,64,37,225,7,13,226,97,14,194,16,225,35,10,
+98,207,224,173,13,96,86,224,128,12,131,16,224,173,30,103,40,225,35,32,
+104,69,224,72,12,96,25,224,117,31,232,112,15,224,118,2,225,34,5,195,
+78,224,145,10,226,189,16,234,82,14,224,44,14,226,189,16,224,45,12,226,
+134,15,225,200,15,96,164,225,253,13,96,58,224,26,13,98,144,224,245,13,
+99,60,224,154,12,226,244,15,224,44,12,226,216,15,224,117,14,64,39,224,
+72,13,226,244,15,224,44,12,226,160,15,225,7,14,98,115,224,144,13,99,
+31,224,99,12,226,215,15,224,44,11,226,186,15,224,116,13,99,174,224,70,
+11,226,212,15,224,43,11,226,155,15,225,3,15,194,10,224,25,9,198,159,
+224,168,9,99,52,224,124,11,226,235,15,224,43,11,226,233,16,224,114,12,
+226,150,16,226,149,35,226,148,16,228,28,14,225,0,16,226,174,16,226,173,
+36,228,24,35,229,77,16,73,59,1,51,48,76,168,104,136,0,58,96,6,
+233,25,6,102,175,243,184,6,0,95,153,228,0,58,108,209,224,47,7,98,
+68,0,54,71,238,0,58,96,38,211,247,72,252,1,95,53,105,16,74,67,
+0,54,106,10,0,32,224,17,1,1,64,35,73,6,64,52,138,67,238,137,
+15,238,116,8,224,221,12,225,0,26,0,58,96,171,160,190,75,221,139,59,
+0,55,160,192,98,99,0,54,67,178,0,58,96,244,224,146,2,225,138,25,
+0,58,96,63,224,197,22,227,76,9,224,18,6,113,13,226,176,25,224,10,
+13,240,92,7,224,51,4,225,6,5,234,211,10,148,235,64,124,98,216,77,
+116,0,82,224,22,4,174,243,96,63,138,214,98,5,97,48,226,15,1,64,
+39,1,49,49,75,234,1,50,32,235,86,1,25,92,34,108,105,98,47,68,
+97,116,97,47,67,104,97,114,46,104,115,92,34,44,49,57,54,58,49,143,
+85,1,95,54,136,72,0,73,64,4,79,76,83,85,75,53,235,222,0,107,
+66,237,141,0,3,95,50,57,56,75,65,4,57,56,32,35,57,96,161,128,
+11,98,99,96,161,171,84,2,54,49,57,79,140,129,211,130,235,185,90,64,
+54,0,35,186,97,65,137,217,235,0,52,162,62,3,35,49,52,56,252,73,
+2,75,171,137,84,224,46,4,121,157,122,48,224,21,3,64,90,96,67,0,
+50,113,141,192,43,224,89,0,224,19,255,224,19,206,0,52,226,33,4,224,
+81,50,66,115,224,241,147,224,159,151,224,19,255,224,19,27,225,203,51,212,
+137,2,35,53,57,71,215,224,21,7,0,51,103,231,224,103,38,224,39,11,
+229,155,1,224,19,1,71,194,224,59,17,121,157,224,61,18,224,163,1,112,
+56,224,21,7,2,56,53,49,101,243,224,87,7,0,50,123,77,225,57,58,
+224,59,11,0,53,225,13,50,225,73,51,224,59,1,109,71,160,21,225,95,
+11,225,53,1,224,121,21,224,39,71,224,19,131,224,179,0,1,49,53,72,
+128,224,181,158,224,19,11,226,31,11,225,145,31,226,131,31,224,19,255,224,
+19,87,225,143,171,78,28,224,19,7,66,147,64,14,2,35,50,49,155,69,
+224,23,2,224,43,7,229,47,11,224,163,71,227,15,0,3,50,49,53,54,
+230,41,11,64,23,224,167,2,224,23,4,230,131,2,224,23,0,0,52,116,
+169,224,21,9,224,135,6,97,3,0,52,124,101,225,1,7,2,52,48,51,
+224,179,10,1,52,48,76,210,224,87,7,1,56,52,153,255,160,23,226,37,
+0,224,89,4,224,45,4,224,203,2,224,91,1,115,168,224,45,10,237,40,
+3,224,23,2,225,17,13,2,56,52,54,116,230,224,93,9,229,71,2,225,
+17,1,110,24,224,67,22,225,109,2,237,180,4,224,47,4,224,139,2,225,
+67,1,224,93,3,224,137,0,2,50,49,52,78,94,224,139,10,225,91,2,
+224,67,2,224,183,2,0,56,224,67,2,0,53,225,247,2,224,45,1,125,
+232,224,113,7,64,159,226,37,12,224,45,3,225,181,0,65,89,224,45,24,
+224,21,0,0,49,124,10,224,21,2,130,83,81,157,224,135,8,154,198,160,
+21,231,249,0,0,52,224,65,4,225,224,3,233,28,3,224,23,3,225,156,
+4,0,54,239,14,0,1,49,54,226,132,3,228,171,31,224,39,11,64,19,
+111,140,233,137,4,0,52,228,74,0,112,37,224,152,2,96,43,0,55,224,
+242,2,64,64,96,165,239,184,4,66,130,128,64,0,54,226,118,6,124,162,
+224,42,3,228,181,1,225,255,3,225,95,0,158,95,160,21,228,181,1,121,
+195,225,48,7,0,49,227,87,3,224,237,0,0,57,224,42,12,0,48,227,
+36,11,120,8,225,65,18,224,19,211,225,4,1,126,27,225,26,9,228,225,
+11,227,108,12,0,50,117,19,224,106,8,0,57,224,21,2,230,126,11,230,
+146,12,64,20,96,78,226,51,4,83,199,129,172,224,151,6,227,33,1,225,
+80,121,224,19,191,69,240,225,24,255,224,19,255,224,19,0,239,179,51,224,
+19,71,228,128,1,228,18,2,225,104,191,224,19,255,224,19,255,224,19,223,
+0,53,70,125,107,55,1,35,57,233,157,3,0,57,74,45,0,35,122,22,
+2,35,54,48,235,39,3,0,52,78,199,224,23,10,0,55,72,65,127,0,
+233,231,5,0,49,250,170,2,1,50,53,234,23,13,1,50,53,238,14,12,
+3,49,50,52,56,234,180,13,2,52,56,51,224,215,11,2,50,52,56,224,
+71,14,233,116,13,1,50,51,235,63,7,96,23,2,55,48,53,124,202,225,
+75,19,126,43,160,45,0,54,236,230,3,224,237,0,0,55,126,48,224,92,
+0,233,59,0,2,55,48,55,236,95,3,0,49,65,45,225,231,88,224,19,
+255,224,19,255,224,19,255,224,19,255,224,19,255,224,19,71,250,150,1,244,
+54,3,250,172,11,225,65,255,224,19,255,224,19,255,224,19,139,74,41,107,
+51,246,64,5,234,255,0,224,21,7,224,43,13,224,65,31,246,151,2,224,
+150,11,224,20,44,74,189,224,127,13,64,230,2,35,49,52,234,161,2,64,
+64,0,51,96,21,0,55,235,21,2,118,153,64,21,1,50,48,64,93,224,
+43,2,128,21,0,53,224,130,6,128,21,0,50,235,41,2,224,43,2,224,
+87,6,225,47,35,224,197,19,224,21,2,241,73,1,235,123,4,224,21,0,
+0,52,250,99,4,235,146,1,224,45,3,251,237,0,224,110,25,224,64,1,
+245,194,3,237,9,1,224,86,2,1,51,52,225,224,0,0,53,247,140,3,
+97,96,98,13,245,240,4,244,46,11,0,56,120,164,119,202,1,35,53,226,
+167,3,1,56,56,89,233,64,96,237,223,5,248,129,1,224,45,2,224,157,
+0,3,50,49,53,56,246,142,11,64,23,0,51,224,138,2,227,45,30,224,
+19,11,246,73,11,255,224,12,225,161,1,224,120,61,224,19,255,224,19,255,
+224,19,255,224,19,119,228,144,11,224,39,11,241,44,11,101,152,146,196,2,
+49,52,53,252,231,3,241,165,1,224,24,6,235,129,1,224,48,6,2,48,
+57,57,235,157,255,224,19,188,251,93,255,224,19,7,1,49,51,226,230,131,
+233,24,1,225,65,161,224,19,255,224,19,167,234,82,32,253,124,91,230,206,
+11,248,15,31,224,199,0,70,177,224,180,99,225,165,92,224,160,151,225,165,
+31,225,144,11,228,238,11,229,142,52,237,78,11,0,56,90,219,160,21,0,
+56,238,89,3,95,191,1,35,55,77,224,3,35,55,55,55,232,253,3,3,
+50,49,52,53,64,74,142,73,91,208,192,25,1,49,50,64,65,105,79,160,
+59,192,24,0,55,64,184,0,51,96,48,224,23,4,0,57,123,174,96,126,
+0,55,251,196,3,64,191,111,20,224,22,5,64,69,66,198,224,21,4,78,
+188,64,209,224,42,5,1,55,57,64,163,92,185,91,194,224,25,4,64,69,
+0,50,96,49,224,188,3,1,50,56,105,211,111,70,224,24,5,1,49,57,
+104,32,224,25,9,3,51,49,52,50,96,51,64,19,1,35,54,64,100,2,
+75,32,64,224,0,255,224,0,255,224,0,152,1,58,54,66,223,12,10,65,
+32,67,39,32,83,32,64,67,39,32,67,128,5,18,39,32,89,32,64,64,
+83,39,32,66,32,64,66,39,32,66,39,32,80,66,222,1,66,32,128,1,
+0,67,64,23,64,0,128,43,1,67,39,64,14,160,26,96,11,224,41,1,
+96,82,224,42,3,192,2,128,21,224,98,3,64,2,64,134,5,95,52,54,
+32,95,54,67,191,160,33,224,101,3,224,131,2,128,85,0,66,64,55,128,
+33,9,64,66,32,83,39,32,64,95,53,55,192,63,7,67,32,95,56,48,
+32,95,55,68,127,96,14,160,64,2,95,52,57,84,83,64,61,224,32,1,
+1,95,54,115,119,128,0,224,55,4,101,38,2,64,95,50,82,246,3,58,
+54,49,57,97,51,9,83,39,32,95,49,56,50,32,95,54,115,217,0,67,
+64,8,64,120,96,13,100,151,0,66,64,13,160,69,5,67,32,95,49,53,
+57,224,30,4,64,74,0,56,96,74,3,85,32,75,52,224,2,1,2,90,
+32,90,64,6,160,136,0,58,64,85,64,36,5,95,49,54,48,32,95,83,
+191,1,95,51,69,187,1,95,54,72,170,1,95,54,69,50,1,95,54,78,
+228,3,95,49,54,56,192,97,3,95,49,55,49,224,109,0,0,48,64,27,
+3,55,50,32,80,160,17,160,216,2,95,49,55,224,145,0,2,95,49,56,
+224,47,0,3,95,49,56,51,224,11,2,0,54,224,55,7,129,190,65,171,
+1,67,32,225,172,1,129,36,224,27,4,1,49,52,65,30,64,23,1,95,
+55,96,241,1,95,54,133,219,129,79,1,49,56,69,56,128,19,224,83,51,
+111,218,224,82,5,0,55,64,241,0,56,224,221,2,1,57,48,224,11,0,
+0,54,85,54,6,75,32,95,49,57,50,32,160,67,0,75,160,8,64,21,
+65,85,65,117,0,54,97,117,9,112,111,112,99,111,117,110,116,32,58,96,
+54,5,10,65,32,115,104,108,64,12,0,52,96,12,2,105,110,118,64,12,
+0,51,96,12,2,120,111,114,64,12,0,50,96,12,128,11,0,49,226,42,
+1,70,43,98,154,0,49,112,118,70,165,66,21,224,17,0,70,173,66,148,
+1,58,54,71,22,1,10,65,98,229,144,250,2,64,64,80,66,120,86,130,
+66,8,5,52,57,57,32,95,53,64,13,224,10,3,5,53,50,54,32,95,
+53,70,171,3,95,54,48,53,96,5,97,37,224,6,0,0,55,96,67,130,
+113,0,95,98,74,0,52,96,37,192,54,1,64,85,99,99,5,67,32,67,
+32,61,61,199,157,3,95,53,49,50,64,42,64,102,96,36,13,102,114,111,
+109,85,84,70,56,32,34,101,111,102,34,98,165,7,85,32,75,32,95,51,
+54,51,160,137,0,73,162,186,0,58,96,114,96,200,1,95,53,64,132,132,
+101,1,95,53,66,208,2,66,32,90,228,112,0,64,30,64,249,1,95,53,
+64,48,128,57,129,125,1,95,49,192,84,2,95,49,56,64,9,64,177,1,
+53,51,66,241,224,249,3,0,57,64,5,128,231,64,7,0,52,96,232,129,
+173,3,95,54,48,49,225,22,1,65,130,96,39,0,58,96,37,224,97,14,
+0,80,96,83,68,11,2,95,53,51,224,30,0,4,53,57,53,32,35,67,
+120,64,66,129,168,64,79,64,67,1,53,57,193,67,225,29,1,4,118,97,
+108,117,101,65,31,225,85,7,64,64,0,51,99,6,97,55,66,133,193,46,
+130,57,0,67,66,47,132,206,128,5,1,95,53,66,24,1,95,53,105,119,
+129,232,64,67,225,112,0,1,95,49,119,194,0,58,64,234,128,143,0,49,
+65,222,1,50,53,193,179,3,95,53,51,52,224,160,8,2,92,92,110,224,
+158,10,96,245,0,49,65,97,160,158,99,14,160,159,130,151,225,122,4,225,
+31,6,73,214,225,60,1,96,17,73,34,0,58,97,162,129,42,2,55,32,
+58,96,31,225,56,15,2,107,101,121,224,151,10,98,139,225,54,0,0,50,
+225,55,3,64,82,195,47,194,106,230,89,3,226,116,1,230,133,7,134,197,
+198,182,230,29,0,96,68,64,182,134,94,64,24,1,83,39,99,196,0,53,
+66,85,64,76,69,12,0,53,134,46,2,67,32,79,68,78,96,139,226,208,
+16,64,232,196,9,225,140,1,97,219,65,32,2,95,53,57,64,19,3,50,
+57,32,75,128,235,132,206,3,64,66,32,85,130,6,225,9,2,96,129,129,
+161,128,31,2,90,32,95,74,231,2,95,49,51,128,52,96,110,130,253,164,
+66,98,55,68,66,64,102,64,23,2,85,32,83,64,138,71,45,2,67,32,
+60,171,91,224,18,6,68,119,98,138,224,18,1,100,17,0,67,65,59,224,
+19,2,132,57,1,75,32,225,193,1,3,84,82,97,119,132,25,224,24,6,
+2,69,79,70,160,23,96,24,5,66,32,95,50,50,49,224,31,2,3,123,
+45,35,32,96,32,0,67,128,25,226,21,2,3,32,35,45,125,192,59,224,
+151,8,133,74,224,150,4,65,154,224,149,6,5,73,110,100,101,110,116,224,
+152,12,4,84,66,114,97,99,99,173,128,27,0,65,128,9,225,17,6,66,
+18,224,121,6,66,143,224,121,6,65,108,64,93,0,67,166,175,225,154,1,
+0,35,102,182,224,23,11,104,140,226,71,0,224,151,1,6,125,32,108,97,
+121,111,117,160,180,225,40,2,224,23,4,227,170,0,68,192,0,51,67,245,
+195,27,224,25,4,224,20,0,225,213,7,224,195,9,227,254,2,3,56,32,
+95,51,98,204,224,76,4,0,49,70,108,224,23,0,193,206,73,88,7,49,
+53,32,79,32,35,52,54,195,19,105,99,97,204,227,40,3,64,0,0,58,
+98,250,101,131,134,94,0,56,72,104,0,53,93,237,1,95,53,100,72,3,
+64,95,49,50,68,95,96,185,1,95,49,100,208,96,11,0,58,96,6,96,
+58,0,48,64,218,1,55,56,103,91,64,69,164,129,73,190,160,11,0,50,
+101,13,192,11,70,13,196,165,73,23,0,50,96,123,96,17,0,73,99,33,
+133,67,68,53,70,200,102,167,131,70,3,95,51,52,51,226,51,2,21,73,
+110,116,101,103,101,114,58,32,100,105,118,105,115,105,111,110,32,98,121,32,
+48,161,145,160,54,70,227,100,134,96,79,0,85,64,68,0,49,69,60,127,
+20,165,182,224,17,9,128,64,96,61,224,7,0,132,137,164,135,70,31,64,
+39,132,172,4,83,32,95,53,56,133,165,164,175,68,216,2,95,53,56,132,
+130,105,17,160,42,0,85,64,10,192,36,235,183,2,235,255,0,1,95,53,
+94,18,227,0,0,192,36,107,100,160,5,160,88,164,150,76,23,193,224,66,
+4,161,219,69,2,126,36,224,0,3,0,58,97,113,133,5,0,83,140,82,
+1,95,50,102,218,0,52,79,174,0,58,96,49,140,141,105,239,98,148,0,
+89,161,61,224,19,0,66,165,96,8,64,63,226,83,4,224,173,2,236,147,
+5,64,31,103,83,224,28,0,64,238,128,69,71,98,100,111,72,231,1,51,
+56,69,8,160,220,66,92,171,217,2,49,48,55,224,28,2,96,241,66,96,
+112,81,64,31,0,52,224,12,0,1,95,50,195,20,2,95,53,53,102,67,
+1,95,52,95,78,161,219,0,58,97,95,98,95,135,230,167,229,230,98,0,
+128,181,64,11,106,241,192,7,68,49,1,53,52,130,229,108,26,129,196,104,
+169,127,116,160,6,193,150,96,26,70,93,64,21,64,59,0,54,105,57,96,
+162,162,13,160,49,96,28,228,25,0,141,78,128,46,138,157,128,26,132,29,
+65,72,136,155,0,83,142,33,128,162,231,103,0,128,33,97,112,98,75,108,
+172,1,53,55,128,152,226,105,0,161,125,225,229,0,136,236,97,214,231,155,
+0,2,95,53,56,96,230,192,95,160,163,128,220,160,12,98,99,141,39,2,
+95,53,56,102,227,138,122,224,197,16,64,39,192,18,64,66,225,16,3,227,
+134,2,64,139,164,178,96,8,140,158,3,95,49,55,52,206,41,67,110,146,
+122,101,209,0,39,66,133,1,95,53,66,31,162,139,224,77,3,224,13,5,
+0,58,99,144,1,10,65,228,80,9,14,108,97,115,116,58,32,101,109,112,
+116,121,32,108,105,115,133,220,129,44,103,229,0,90,64,239,128,175,0,58,
+96,8,100,255,224,89,0,0,79,115,252,64,127,0,58,97,13,227,72,0,
+132,232,0,75,98,124,199,254,0,65,96,13,133,126,196,24,207,105,227,56,
+1,239,244,0,2,95,53,53,137,209,0,54,170,130,96,14,0,58,100,9,
+3,10,65,32,89,160,45,169,160,162,184,129,230,192,93,96,70,137,180,131,
+186,228,148,0,68,222,224,10,7,64,133,72,241,167,38,139,118,0,49,109,
+43,65,178,4,95,51,50,52,32,169,35,192,116,133,105,239,241,3,128,48,
+64,10,128,47,202,201,64,0,64,60,0,58,101,54,161,39,130,187,1,95,
+50,73,212,129,29,241,26,0,224,27,4,97,71,84,202,134,125,0,57,102,
+179,84,128,134,185,64,106,0,53,96,34,170,226,0,52,70,112,130,108,163,
+131,128,11,142,13,99,157,128,1,1,95,54,77,104,128,67,131,228,1,95,
+53,128,198,224,13,0,65,252,102,164,64,111,225,253,8,0,49,193,253,64,
+39,224,29,0,2,51,50,51,224,29,6,173,24,230,118,7,0,58,96,102,
+144,141,227,13,4,64,25,130,41,0,83,134,203,231,17,1,230,186,10,230,
+249,1,231,66,11,224,48,20,97,192,226,57,5,73,44,229,217,8,130,62,
+132,230,230,242,3,162,98,101,109,162,169,99,233,76,99,133,139,79,234,100,
+10,160,60,231,78,0,166,14,224,114,2,228,139,0,242,219,3,162,184,224,
+115,21,224,113,5,224,111,3,224,49,17,144,134,224,0,3,0,58,98,40,
+163,158,1,95,53,81,217,1,53,53,99,253,160,16,65,72,68,163,3,95,
+50,54,56,66,62,100,167,141,39,5,53,55,48,32,95,50,118,238,172,18,
+71,162,0,54,102,62,224,155,3,0,58,96,119,242,128,0,141,169,0,55,
+208,125,167,121,64,180,0,85,81,119,193,174,166,97,0,39,224,21,3,165,
+153,224,29,0,195,239,103,64,160,207,0,54,131,52,132,40,228,249,4,5,
+102,111,108,100,108,49,228,251,8,64,173,98,152,64,185,224,146,3,0,83,
+226,1,4,96,91,131,16,231,228,1,0,85,66,78,235,104,2,100,65,133,
+173,232,50,0,192,189,230,196,0,102,154,199,247,1,95,50,206,3,230,207,
+0,0,54,128,22,161,171,166,169,232,8,1,232,9,5,128,151,0,54,228,
+68,0,208,238,128,144,0,53,113,242,131,157,64,83,100,142,66,13,96,45,
+198,227,132,39,0,58,100,57,99,127,0,73,194,240,134,20,227,60,4,137,
+26,227,245,2,230,134,7,96,144,131,201,104,247,144,93,163,4,135,185,233,
+96,0,193,92,233,121,10,231,43,5,68,247,128,238,200,174,128,89,67,68,
+128,15,1,95,53,76,13,130,181,0,53,76,78,128,155,99,154,129,74,103,
+182,162,84,176,113,224,46,1,224,102,0,160,44,227,250,3,224,184,11,224,
+134,15,105,65,64,169,224,137,8,192,90,224,134,27,224,181,2,225,11,3,
+224,73,0,161,11,97,218,0,50,226,226,2,10,92,34,108,105,98,47,68,
+97,116,97,47,172,56,96,7,13,114,110,97,108,46,104,115,92,34,44,53,
+52,58,49,98,245,0,58,97,249,113,29,117,240,67,171,0,58,96,115,162,
+224,97,148,128,236,237,182,0,98,186,96,23,162,95,98,240,163,253,225,236,
+0,64,41,227,206,4,132,156,128,5,227,149,8,19,105,109,112,111,115,115,
+105,98,108,101,58,32,120,115,32,62,61,32,121,115,96,161,81,126,224,221,
+38,3,57,48,58,54,239,190,0,234,247,2,64,145,226,86,0,227,125,3,
+172,130,227,124,3,0,48,236,97,0,228,118,0,163,81,1,53,53,114,128,
+164,213,196,131,224,80,12,234,157,2,224,80,2,97,176,96,69,97,127,245,
+127,1,98,76,139,74,105,254,156,67,104,141,132,7,196,37,196,13,224,37,
+1,64,106,224,14,3,228,40,1,236,35,0,0,58,96,114,163,241,142,33,
+231,33,21,166,55,96,172,0,55,228,220,11,64,82,133,44,64,140,0,51,
+68,80,232,192,1,131,14,163,23,129,116,150,150,3,64,95,52,51,96,162,
+133,175,160,120,200,22,0,53,168,108,1,53,53,79,127,130,142,66,230,226,
+142,2,163,123,129,43,229,119,9,161,154,229,121,8,225,244,15,96,188,64,
+110,161,159,230,102,1,67,126,0,53,105,70,199,208,226,76,45,224,91,1,
+226,76,10,224,95,3,226,76,31,224,80,2,161,159,106,148,0,58,96,24,
+226,76,6,130,58,226,57,0,100,69,230,69,2,224,11,3,0,58,96,71,
+1,10,65,74,236,0,58,96,147,106,83,70,64,0,52,102,31,64,187,206,
+25,78,103,1,95,53,79,74,205,122,104,52,138,81,80,229,96,10,0,58,
+96,6,230,148,6,192,251,96,78,148,92,165,1,128,6,0,58,96,80,224,
+52,27,224,59,2,0,58,96,139,224,52,20,224,98,2,160,59,0,58,96,
+198,224,52,27,224,112,2,0,58,97,1,102,215,134,208,226,149,3,140,23,
+224,19,0,111,240,166,10,2,95,53,52,105,128,209,165,165,28,1,53,52,
+143,99,198,49,97,136,64,123,135,57,96,86,75,246,2,52,51,32,101,12,
+160,47,198,59,96,65,187,41,194,63,195,118,234,215,2,0,73,217,42,107,
+249,0,51,142,202,96,17,192,118,0,58,96,7,3,10,65,32,75,141,176,
+64,84,64,13,2,50,32,58,96,114,96,25,108,144,64,137,98,25,65,241,
+0,52,98,1,0,52,97,129,66,37,202,68,0,52,162,10,64,31,0,58,
+96,31,193,49,231,80,0,224,174,0,96,48,164,28,232,176,2,192,13,2,
+51,48,57,195,220,128,167,216,26,74,138,225,32,0,97,169,214,171,64,15,
+121,185,184,82,1,95,51,115,186,96,86,0,58,96,6,104,225,1,95,53,
+68,138,2,95,53,51,100,123,0,51,193,214,0,83,65,33,175,145,77,214,
+105,226,67,110,74,217,91,153,96,7,227,154,2,205,243,206,36,0,56,98,
+38,64,85,242,128,0,202,166,129,148,128,19,228,80,1,92,133,195,210,224,
+117,39,201,111,100,53,160,2,64,18,228,172,6,96,116,160,5,69,49,1,
+54,53,220,247,162,117,132,53,171,72,0,35,162,171,97,166,66,197,126,114,
+224,40,12,235,245,0,224,62,13,194,145,224,70,6,160,38,233,102,0,224,
+236,24,65,80,0,54,162,95,0,89,106,130,192,215,117,210,96,127,138,165,
+163,25,65,85,1,50,55,224,236,7,165,219,235,188,1,95,56,179,120,76,
+225,119,204,192,22,2,95,51,48,248,50,3,2,32,37,32,168,87,224,45,
+5,64,0,118,61,96,6,64,249,0,58,87,26,195,11,73,213,137,208,250,
+39,25,162,41,230,12,2,97,203,224,70,0,172,37,96,28,250,41,38,154,
+39,250,38,2,0,51,239,130,0,0,51,67,230,96,18,131,218,2,80,32,
+58,124,248,103,137,3,50,55,32,80,112,120,0,50,99,66,109,244,134,198,
+117,84,64,116,0,58,122,97,128,45,250,86,4,0,58,96,47,161,7,64,
+201,122,24,0,50,237,156,1,131,51,0,85,96,21,131,126,64,123,65,182,
+151,23,173,43,253,57,1,253,156,3,205,241,225,240,1,92,140,252,188,0,
+81,158,126,79,133,48,0,58,124,203,226,63,8,103,81,119,169,96,94,128,
+14,97,40,66,85,225,252,1,110,47,97,254,225,209,2,195,93,165,98,110,
+213,231,251,2,160,98,65,116,0,49,163,138,98,117,251,178,1,226,109,1,
+129,219,192,18,160,50,96,8,66,104,64,6,64,198,0,58,96,219,100,188,
+147,66,64,24,96,173,98,126,137,136,113,238,0,50,233,213,1,0,58,96,
+59,225,234,0,128,17,129,233,124,223,161,252,64,71,192,89,195,89,224,74,
+0,132,150,0,56,128,21,0,53,224,21,0,193,131,129,121,0,58,96,171,
+207,227,64,14,193,253,1,95,53,97,193,97,138,225,63,4,226,215,51,0,
+58,97,162,244,123,2,67,79,1,90,32,224,34,1,0,58,96,52,178,102,
+64,13,194,87,67,219,69,225,64,51,115,65,64,98,244,172,1,64,19,114,
+182,162,21,224,177,2,229,96,1,224,173,0,161,170,224,25,3,227,205,1,
+139,154,128,33,226,0,39,225,20,0,0,95,77,155,97,59,0,95,117,26,
+255,142,1,64,172,129,219,67,55,65,174,224,197,2,231,142,1,195,126,193,
+113,228,84,0,163,147,96,71,225,186,0,0,51,101,115,0,58,97,210,65,
+6,67,68,67,112,193,4,228,79,11,225,34,40,96,25,227,31,4,224,20,
+1,97,35,128,110,103,206,225,39,27,1,95,49,72,56,164,34,74,128,128,
+10,0,50,65,58,161,41,64,6,244,89,1,229,140,2,230,190,2,182,23,
+225,196,2,160,177,64,34,248,127,6,96,186,1,52,54,166,90,224,51,4,
+64,15,224,45,2,128,21,145,180,224,47,7,134,133,99,201,130,239,115,105,
+160,0,0,58,96,230,101,89,0,48,77,17,114,44,99,213,205,49,65,126,
+75,179,1,49,48,192,0,1,32,58,96,38,229,117,7,64,92,64,72,0,
+51,230,146,3,224,174,1,128,164,225,170,0,225,124,4,129,96,97,84,132,
+132,64,6,3,10,65,32,90,71,113,0,58,96,31,226,104,0,247,86,1,
+162,90,0,58,96,71,3,10,65,32,73,64,152,130,100,96,10,130,93,148,
+14,64,39,0,52,78,111,227,205,0,1,82,32,120,133,1,52,57,133,227,
+2,95,52,57,64,238,1,52,57,211,158,0,90,114,148,0,58,96,22,224,
+138,0,96,45,174,144,84,150,142,9,1,95,52,91,8,1,95,52,83,218,
+64,72,68,154,1,52,57,199,160,0,89,100,111,67,148,0,52,92,19,162,
+130,224,62,0,1,95,52,88,209,248,177,0,233,198,0,206,117,76,171,0,
+64,72,212,119,252,215,247,193,77,96,41,69,57,224,42,0,0,67,69,161,
+72,58,4,50,48,57,53,49,97,79,3,35,53,53,50,128,230,131,1,224,
+123,3,129,139,104,228,160,20,101,129,98,7,0,52,255,101,2,64,86,64,
+210,1,95,51,96,73,230,183,1,22,104,71,101,116,67,111,110,116,101,110,
+116,115,58,32,115,117,114,114,111,103,97,116,101,168,200,69,102,71,36,160,
+110,76,23,64,174,224,18,0,65,60,88,128,1,95,52,95,63,75,79,128,
+24,238,124,0,0,58,97,78,76,28,102,89,0,58,96,39,99,100,143,89,
+0,49,78,71,0,95,73,13,4,35,49,49,49,52,173,79,241,252,5,30,
+68,97,116,97,46,67,104,97,114,46,99,104,114,58,32,105,110,118,97,108,
+105,100,32,99,111,100,101,112,111,105,110,213,160,0,50,161,184,196,214,0,
+95,96,238,75,106,97,38,9,10,65,32,94,103,101,116,98,32,58,97,177,
+98,234,3,55,51,32,79,67,114,0,53,88,150,1,95,51,65,161,134,24,
+97,234,213,196,225,112,1,66,36,74,50,143,58,2,52,56,54,66,59,0,
+55,232,6,3,6,111,112,101,110,70,105,108,129,63,225,148,2,0,58,98,
+99,101,135,66,3,89,57,96,57,234,3,1,0,51,97,65,200,172,185,135,
+2,51,57,52,218,201,64,152,64,3,250,216,1,115,240,65,226,67,76,164,
+22,96,6,224,142,1,1,58,32,210,233,0,58,64,173,226,251,11,64,208,
+162,251,109,38,128,26,173,41,225,236,4,129,255,224,34,2,141,60,64,90,
+131,44,241,109,3,0,52,87,98,2,64,95,52,120,77,0,83,136,53,1,
+95,49,75,208,224,33,7,254,216,0,224,54,4,161,110,135,133,0,52,158,
+80,224,122,0,78,153,0,58,96,141,96,117,1,95,51,114,202,1,52,56,
+97,236,188,74,5,94,102,108,117,115,104,65,238,64,22,129,203,227,57,2,
+90,96,161,221,224,224,0,207,147,239,235,3,117,173,0,83,128,114,64,3,
+224,131,4,224,13,6,227,46,7,64,149,64,157,91,190,1,95,52,91,40,
+138,118,163,50,64,22,96,199,130,157,135,87,0,58,96,22,207,12,0,90,
+132,201,96,51,134,207,0,58,96,60,128,246,0,52,75,143,107,71,96,29,
+64,244,4,99,108,111,115,101,64,244,187,150,0,85,165,38,79,214,2,52,
+55,53,238,14,0,0,58,96,156,10,10,65,32,116,111,70,117,110,80,116,
+114,64,50,129,197,73,12,0,90,68,133,100,61,0,58,97,41,111,79,1,
+48,52,64,67,0,50,67,85,64,19,226,101,1,5,115,116,100,101,114,114,
+66,105,0,58,97,184,69,193,1,79,46,128,21,64,87,172,42,160,64,97,
+12,67,114,224,64,4,1,105,110,160,63,166,1,96,63,1,105,110,64,62,
+239,207,1,131,40,65,0,136,247,97,89,224,9,1,128,30,72,252,135,34,
+176,31,112,106,100,34,111,230,130,98,0,58,96,6,129,118,0,58,98,254,
+239,139,0,227,238,3,84,193,64,86,227,26,3,221,228,230,10,7,64,124,
+83,14,96,36,0,52,117,193,1,95,52,167,203,163,228,76,156,108,131,131,
+184,233,2,3,0,52,89,88,64,6,209,229,99,153,177,229,0,80,164,165,
+129,121,224,6,2,74,157,96,50,64,201,0,52,64,201,198,183,230,43,8,
+143,88,102,157,226,166,5,98,27,76,21,166,152,224,55,6,135,230,192,192,
+228,209,0,201,230,0,52,180,58,64,135,130,41,14,73,79,46,112,101,114,
+102,111,114,109,73,79,32,94,38,162,146,64,31,130,27,2,102,112,102,97,
+216,184,91,4,102,112,110,101,119,64,14,165,164,7,97,100,100,95,70,73,
+76,69,64,18,129,250,96,18,5,117,116,102,56,32,58,97,86,168,4,225,
+169,3,98,4,0,49,75,152,160,191,128,11,161,58,82,33,2,52,49,49,
+126,2,94,127,65,192,101,232,224,26,10,0,57,198,189,224,27,8,72,74,
+224,26,11,226,199,1,1,119,43,165,110,1,95,52,81,161,67,236,229,17,
+1,130,135,1,95,51,117,205,225,74,3,194,12,226,97,8,0,58,98,126,
+100,203,70,87,64,253,162,18,3,39,32,95,52,117,104,0,52,85,211,1,
+58,52,183,3,76,183,0,52,117,122,64,8,1,53,48,102,107,160,12,0,
+49,128,29,64,132,1,95,52,150,17,128,43,96,103,204,209,119,40,79,148,
+1,95,52,119,93,96,41,74,63,1,52,54,64,126,207,255,243,78,3,0,
+58,96,83,201,43,195,44,150,200,98,218,115,131,139,200,207,146,0,58,64,
+143,130,220,160,27,84,224,0,55,209,133,141,251,224,70,0,69,5,96,206,
+102,38,88,198,66,247,233,76,0,135,77,181,223,0,89,253,147,0,130,8,
+96,50,160,117,171,19,96,245,100,81,3,52,55,32,58,97,71,128,13,64,
+226,213,90,66,79,158,211,64,61,1,95,52,114,177,0,58,64,35,129,14,
+96,57,198,246,194,121,227,54,3,84,237,225,254,16,231,87,6,85,50,231,
+87,9,231,140,7,96,127,129,142,133,231,1,100,105,69,94,181,111,0,94,
+66,34,160,17,237,217,1,1,89,32,236,104,4,121,18,176,2,249,210,1,
+131,244,96,149,65,138,1,95,52,83,180,129,127,118,153,193,63,64,127,239,
+192,2,110,5,96,43,97,62,0,51,67,158,181,59,12,94,71,69,84,84,
+73,77,69,77,73,76,76,73,64,22,129,99,139,204,96,2,70,150,0,90,
+112,6,128,0,1,58,52,181,15,194,92,86,204,128,247,0,58,122,17,160,
+208,193,97,0,95,112,239,228,206,0,193,119,73,8,74,76,133,117,130,2,
+165,213,231,230,1,164,229,231,65,3,129,146,171,55,82,249,233,138,1,228,
+100,3,244,21,2,224,78,1,224,71,5,229,34,3,96,187,130,36,252,210,
+8,5,104,101,97,100,58,32,114,54,3,32,108,105,115,138,197,107,34,179,
+120,6,65,46,119,114,105,116,101,65,61,241,140,0,225,63,1,64,2,198,
+215,1,58,52,179,141,145,174,225,98,1,225,94,0,1,58,52,179,129,145,
+226,224,68,2,192,30,161,197,68,255,2,75,32,85,165,95,224,2,43,193,
+208,224,0,3,224,68,40,224,2,3,224,80,11,224,81,53,224,84,15,224,
+85,56,96,2,118,47,224,0,12,135,67,224,1,31,246,96,9,5,70,108,
+97,103,115,123,254,187,0,224,0,10,162,178,224,2,52,96,192,224,126,11,
+7,118,101,114,98,111,115,101,61,173,111,86,225,1,95,50,71,20,248,99,
+0,224,0,10,224,231,25,224,1,1,192,114,2,79,32,35,68,231,238,68,
+0,224,0,9,224,231,56,224,228,16,4,114,117,110,73,116,224,226,4,0,
+52,228,80,2,224,0,11,224,215,25,192,1,224,223,32,224,222,50,100,234,
+66,129,224,112,3,224,222,1,5,109,104,115,100,105,114,160,223,144,23,152,
+169,224,223,16,224,212,23,192,1,224,220,31,224,219,44,64,213,219,34,224,
+221,18,4,112,97,116,104,115,224,220,34,224,209,21,192,1,224,217,30,224,
+216,48,224,208,18,4,111,117,116,112,117,194,142,224,209,26,224,202,23,64,
+1,224,206,29,224,205,45,227,85,15,6,108,111,97,100,105,110,103,227,87,
+32,224,197,62,224,196,41,224,193,16,4,115,112,101,101,100,224,191,31,224,
+188,59,224,187,38,224,184,16,7,114,101,97,100,67,97,99,104,229,183,5,
+224,188,17,224,185,56,224,184,35,224,181,16,104,250,224,182,34,224,179,53,
+224,178,32,224,175,16,6,117,115,101,84,105,99,107,196,124,224,173,21,224,
+170,50,224,169,29,224,166,16,4,100,111,67,80,80,224,163,27,224,160,47,
+224,159,20,229,197,30,5,99,112,112,65,114,103,229,199,27,224,163,44,224,
+162,17,224,159,31,224,157,29,224,154,41,225,60,21,225,211,15,6,99,111,
+109,112,114,101,115,226,122,25,224,142,38,224,141,8,225,30,2,125,254,225,
+36,20,6,98,117,105,108,100,80,107,197,242,225,39,16,224,146,35,224,145,
+5,251,27,3,224,140,22,77,95,224,139,25,224,134,29,224,132,2,238,13,
+2,232,147,18,5,107,103,80,97,116,104,224,123,20,224,117,23,224,115,3,
+226,6,15,6,105,110,115,116,97,108,108,224,230,1,226,8,11,224,102,20,
+96,101,236,193,0,224,205,13,4,116,97,114,103,101,232,144,18,224,92,14,
+224,74,11,3,100,117,109,112,108,209,224,175,4,1,49,50,81,109,0,50,
+64,129,233,182,16,224,0,11,192,115,0,49,64,239,128,116,128,75,0,51,
+188,166,96,12,224,17,3,3,64,95,52,50,85,142,224,18,3,96,39,0,
+51,64,128,158,40,1,50,53,192,11,0,58,96,6,210,229,120,38,81,43,
+115,199,188,22,79,226,224,225,4,6,78,111,116,104,105,110,103,161,44,245,
+90,0,1,52,50,90,67,82,220,0,50,210,240,177,241,225,115,13,4,74,
+117,115,116,32,225,113,0,161,111,160,49,160,176,160,171,96,166,145,106,120,
+180,96,79,80,212,0,35,81,165,64,61,92,199,128,16,217,187,64,140,239,
+249,3,121,169,147,145,3,60,32,64,35,64,91,224,18,6,64,103,225,0,
+0,128,18,65,174,0,85,224,183,7,3,68,97,108,108,160,182,224,27,9,
+8,99,111,109,98,105,110,97,116,111,120,55,128,218,224,82,4,80,154,224,
+54,9,6,116,111,112,108,101,118,101,224,87,17,5,100,101,115,117,103,97,
+224,84,0,244,124,1,128,85,64,245,224,104,6,65,249,224,104,10,7,121,
+112,101,99,104,101,99,107,224,105,18,2,114,105,118,221,40,224,31,10,3,
+112,97,114,115,224,30,0,226,88,1,147,81,130,88,64,11,0,58,96,6,
+225,129,1,226,69,8,2,70,97,108,160,71,224,24,6,2,84,114,117,192,
+95,192,92,65,154,192,92,162,14,216,15,3,95,49,54,53,162,110,1,95,
+52,66,50,1,58,52,83,66,250,35,0,224,1,17,243,164,1,224,0,0,
+0,58,96,65,96,87,0,85,244,82,1,155,150,0,50,183,214,224,167,0,
+6,118,55,46,50,94,42,34,96,113,146,133,2,95,52,49,67,229,67,56,
+2,58,52,50,212,64,1,49,56,67,192,0,48,93,139,2,35,49,50,96,
+6,0,54,128,12,228,163,0,0,58,96,51,128,45,85,129,0,49,212,87,
+0,58,64,15,128,10,67,97,1,49,53,100,127,0,54,160,56,2,95,50,
+54,67,233,89,125,112,176,128,73,129,118,131,146,0,49,149,136,87,119,0,
+58,64,61,128,25,246,129,0,131,187,181,8,246,231,10,229,160,1,213,44,
+224,47,2,160,110,187,70,0,51,65,134,182,89,150,142,64,123,64,25,64,
+20,2,95,52,48,87,214,253,197,5,9,94,42,79,112,116,105,111,110,115,
+58,97,70,248,126,16,2,45,104,32,224,0,7,14,80,114,105,110,116,32,
+117,115,97,103,101,94,42,45,63,224,31,22,4,45,104,101,108,112,224,31,
+10,7,116,104,105,115,32,109,101,115,192,38,6,118,101,114,115,105,111,110,
+224,38,9,1,101,32,160,26,64,37,6,110,117,109,101,114,105,99,224,45,
+1,224,37,8,10,32,110,117,109,98,101,114,94,42,45,118,224,116,3,96,
+0,6,73,110,99,114,101,97,115,96,43,31,98,111,115,105,116,121,32,40,
+102,108,97,103,32,99,97,110,32,98,101,32,114,101,112,101,97,116,101,100,
+41,94,42,45,0,113,224,61,8,1,68,101,224,61,33,0,108,224,61,8,
+27,83,104,111,119,32,101,118,101,114,121,32,116,105,109,101,32,97,32,109,
+111,100,117,108,101,32,105,115,32,78,202,5,101,100,94,42,45,115,224,54,
+13,73,142,2,105,108,97,65,175,0,32,110,52,14,32,105,110,32,108,105,
+110,101,115,47,115,94,42,45,114,224,53,8,16,82,117,110,32,100,105,114,
+101,99,116,108,121,94,42,45,67,82,224,32,8,2,101,97,100,224,86,4,
+0,99,77,23,64,42,0,87,224,42,7,0,87,118,49,224,43,12,224,42,
+7,128,86,3,97,110,100,32,150,102,224,52,11,3,88,67,80,80,224,52,
+6,8,117,110,32,99,112,112,104,115,32,64,222,9,111,117,114,99,101,32,
+102,105,108,101,64,218,3,68,120,120,120,224,45,5,4,80,97,115,115,32,
+128,23,1,116,111,128,55,3,94,42,45,73,224,39,14,96,23,224,39,2,
+0,84,224,36,5,23,32,32,32,71,101,110,101,114,97,116,101,32,100,121,
+110,97,109,105,99,32,102,117,110,99,96,177,98,193,9,32,115,116,97,116,
+105,115,116,105,99,64,62,0,122,224,62,8,0,67,171,41,64,235,166,124,
+6,32,99,111,100,101,32,103,160,87,97,171,66,159,1,46,99,96,213,7,
+94,42,45,105,80,65,84,72,224,69,4,3,65,100,100,32,96,20,1,116,
+111,194,22,6,115,101,97,114,99,104,32,82,126,3,94,42,45,111,124,189,
+224,0,3,0,79,113,198,64,48,64,26,1,94,42,224,28,4,128,0,1,
+73,102,96,27,4,32,101,110,100,115,64,133,0,46,64,163,6,32,112,114,
+111,100,117,99,66,128,224,178,2,128,153,224,67,28,224,64,2,0,67,224,
+55,17,7,79,116,104,101,114,119,105,115,194,4,0,101,97,3,224,113,1,
+5,115,32,116,111,103,101,64,36,4,32,119,105,116,104,96,29,2,114,117,
+110,99,26,5,115,121,115,116,101,109,64,218,224,106,1,15,114,101,103,117,
+108,97,114,32,101,120,101,99,117,116,97,98,97,72,0,97,224,118,8,9,
+67,108,101,97,114,32,112,97,99,107,97,187,225,67,4,0,97,225,118,20,
+224,51,13,3,76,80,75,71,224,50,4,8,32,76,105,115,116,32,97,108,
+108,161,167,3,115,32,111,102,224,59,0,6,80,75,71,94,42,45,80,224,
+51,8,0,66,76,184,224,37,6,0,81,64,7,5,32,91,68,73,82,93,
+160,37,0,73,139,109,224,39,6,5,116,84,65,82,71,69,226,183,3,6,
+83,101,108,101,99,116,32,139,54,225,124,12,7,68,105,115,116,114,105,98,
+117,66,125,128,38,21,115,58,32,100,101,102,97,117,108,116,44,32,101,109,
+115,99,114,105,112,116,101,110,224,60,12,0,84,128,48,196,213,4,100,101,
+102,105,110,162,197,128,25,4,46,99,111,110,102,66,147,9,112,116,99,32,
+79,80,84,73,79,78,160,58,166,82,3,32,102,111,114,97,208,0,67,193,
+252,69,142,0,100,75,156,4,45,80,65,83,83,192,105,7,68,101,98,117,
+103,44,32,112,101,194,9,65,83,84,32,97,102,116,101,114,32,64,34,224,
+153,12,16,80,111,115,115,105,98,108,101,32,112,97,115,115,101,115,58,32,
+105,14,1,44,32,137,53,1,44,32,233,95,0,64,18,105,178,1,44,32,
+201,220,0,44,226,123,2,0,44,65,191,134,246,103,69,136,92,0,75,70,
+254,0,48,102,254,0,58,71,7,232,4,0,136,75,0,85,64,25,0,58,
+71,37,232,137,5,0,85,68,37,14,58,32,109,104,115,32,91,45,104,92,
+124,63,93,32,91,134,244,96,8,166,149,96,11,230,188,6,64,19,0,118,
+64,4,0,113,64,4,0,108,64,4,0,115,64,4,0,114,64,4,6,67,
+91,82,92,124,87,93,64,10,69,49,64,7,3,68,68,69,70,64,7,0,
+73,66,178,64,8,0,84,64,4,0,122,64,4,100,81,64,8,100,39,64,
+8,1,97,91,96,18,64,10,0,76,96,10,4,92,124,80,75,71,96,15,
+66,159,64,7,226,129,2,64,14,162,104,96,69,225,217,1,64,14,225,185,
+1,16,93,32,91,77,79,68,85,76,69,78,65,77,69,46,46,92,124,96,
+110,105,134,72,99,104,139,0,57,72,71,72,164,2,58,52,48,172,7,2,
+52,48,52,64,4,7,53,32,64,95,51,55,52,32,232,94,2,4,115,116,
+100,111,117,124,167,0,58,96,51,5,10,65,32,73,79,46,128,21,1,32,
+58,96,50,169,79,4,66,32,95,51,55,77,53,236,244,1,255,24,1,141,
+106,160,38,253,44,2,93,144,64,30,128,13,0,58,64,135,192,79,91,174,
+0,80,96,164,137,42,78,163,0,52,96,44,0,48,106,29,77,134,64,176,
+1,52,48,64,12,0,58,96,98,64,157,64,149,130,28,6,65,46,97,108,
+108,111,99,64,16,130,34,0,83,155,171,253,197,1,3,95,51,57,56,138,
+202,122,210,66,73,1,64,58,65,32,128,132,2,95,51,54,224,194,0,96,
+33,0,58,96,47,96,140,113,25,0,67,74,19,0,83,96,84,127,239,0,
+53,140,106,2,95,51,54,77,174,4,50,48,57,53,49,64,209,5,64,35,
+53,53,50,57,234,34,1,1,51,55,94,114,1,51,55,138,70,79,79,1,
+51,57,97,123,96,35,225,124,1,17,104,80,117,116,67,104,97,114,58,32,
+115,117,114,114,111,103,97,116,171,251,1,95,50,64,135,0,58,96,147,126,
+103,107,59,66,255,96,66,225,145,2,0,57,254,196,1,97,81,224,9,5,
+110,203,1,51,57,65,86,1,49,57,65,162,75,57,1,95,51,74,182,192,
+6,0,58,96,154,224,81,0,193,153,240,192,2,128,14,224,11,2,225,189,
+2,65,212,96,95,130,121,2,50,32,58,96,145,106,249,0,56,64,17,0,
+49,96,179,129,186,2,95,50,57,109,9,0,55,75,13,1,51,57,108,181,
+2,51,48,55,160,38,64,144,192,50,64,11,0,57,192,11,0,58,96,6,
+205,76,108,156,192,154,0,90,96,129,97,246,242,54,3,178,60,253,183,0,
+129,20,64,174,139,223,64,20,253,215,2,144,164,2,51,56,56,128,144,235,
+165,3,0,58,239,163,0,128,43,96,30,224,36,16,193,27,131,29,0,54,
+66,121,0,83,162,57,2,51,53,57,140,183,224,72,28,128,162,192,185,242,
+143,3,192,171,99,136,224,94,10,240,107,11,1,32,40,128,86,224,122,9,
+77,79,237,136,1,224,118,1,206,124,161,164,110,124,128,11,0,58,96,6,
+238,217,1,66,95,64,78,240,99,8,64,160,224,18,6,98,111,224,19,7,
+97,139,224,19,6,67,55,239,208,6,78,20,1,64,85,224,212,2,10,105,
+110,116,101,114,114,117,112,116,101,100,128,221,224,28,3,1,114,101,170,198,
+5,118,97,110,105,115,104,192,34,224,35,4,72,233,164,250,240,168,9,78,
+45,224,45,4,7,117,110,115,117,112,112,111,114,71,209,1,111,112,74,88,
+2,105,111,110,224,120,9,8,104,97,114,100,119,97,114,101,32,103,234,194,
+22,224,243,7,132,69,224,19,5,67,157,224,132,7,67,219,224,243,5,7,
+97,112,112,114,111,112,114,105,75,47,71,109,224,129,9,14,105,110,118,97,
+108,105,100,32,97,114,103,117,109,101,110,192,131,224,34,3,3,102,97,105,
+108,225,18,0,224,115,7,65,228,224,44,3,11,112,114,111,116,111,99,111,
+108,32,101,114,114,209,215,224,31,3,170,43,224,29,2,224,240,9,225,247,
+10,225,246,10,225,245,10,225,244,7,2,117,110,115,76,12,2,102,105,101,
+77,60,8,110,115,116,114,97,105,110,116,115,224,149,9,3,117,115,101,114,
+224,147,4,224,210,4,4,101,114,109,105,115,110,171,3,100,101,110,105,225,
+10,15,226,2,7,6,105,108,108,101,103,97,108,225,254,19,2,101,110,100,
+74,142,75,148,225,251,14,225,230,10,225,229,7,226,188,0,5,101,120,104,
+97,117,115,226,224,21,3,98,117,115,121,225,201,14,224,86,6,12,100,111,
+101,115,32,110,111,116,32,101,120,105,115,162,22,224,31,3,1,97,108,92,
+85,0,121,128,30,161,82,128,0,164,11,100,115,164,11,96,11,0,58,96,
+6,196,11,2,95,50,57,96,37,65,179,200,43,70,249,1,56,48,181,81,
+167,105,0,66,145,20,224,120,1,6,72,97,110,100,108,101,45,96,113,145,
+207,1,51,56,145,207,224,110,1,64,84,0,58,96,6,228,122,4,228,234,
+8,1,48,120,128,184,64,128,1,56,51,102,109,0,56,70,253,1,51,56,
+100,217,1,95,51,103,193,224,210,1,64,103,192,99,64,11,0,58,96,6,
+96,99,0,48,96,136,71,182,0,50,73,70,1,95,50,145,196,1,49,48,
+64,22,101,138,0,50,64,211,224,11,0,96,79,160,11,70,187,160,11,72,
+31,0,58,96,12,128,85,103,2,0,49,136,32,64,154,96,170,83,208,128,
+42,64,43,135,143,2,95,52,55,70,170,114,83,64,181,3,95,49,53,50,
+96,5,0,51,96,5,103,211,0,53,64,55,0,53,96,168,103,210,0,53,
+96,120,160,70,135,149,102,35,3,51,56,49,32,101,254,2,49,53,55,65,
+141,1,85,32,166,43,0,50,68,232,96,7,0,54,69,195,0,65,129,118,
+4,95,51,50,52,32,133,154,64,12,1,56,50,96,194,135,215,0,83,73,
+15,3,32,95,52,54,246,230,0,64,5,64,66,104,102,4,56,48,32,95,
+55,64,149,2,49,55,52,160,9,72,203,1,35,54,67,77,128,43,129,158,
+224,46,6,96,36,0,52,65,230,96,187,136,48,131,57,219,189,232,212,1,
+128,23,1,67,39,192,24,64,8,201,173,0,95,64,225,128,223,224,241,41,
+128,12,128,115,73,248,64,65,163,190,224,96,1,84,129,224,96,46,128,254,
+0,85,64,5,128,192,169,171,192,13,96,225,64,210,224,222,8,96,20,232,
+182,0,64,40,106,150,64,27,128,33,224,152,5,67,121,66,58,224,162,47,
+3,95,51,52,51,227,86,2,0,78,141,56,23,46,115,104,111,119,73,110,
+116,65,116,66,97,115,101,58,32,110,101,103,97,116,105,118,101,230,108,7,
+96,207,224,2,3,137,134,192,206,64,5,234,81,2,160,168,161,219,89,12,
+67,111,224,46,33,0,50,103,59,160,48,224,227,22,224,237,3,224,225,27,
+231,246,3,1,98,97,247,250,0,128,139,0,89,161,185,226,163,3,194,153,
+67,116,0,55,162,79,193,180,225,235,1,224,49,2,194,94,160,83,192,11,
+226,106,8,224,70,4,74,18,192,49,74,237,160,124,193,40,128,60,97,70,
+224,249,1,97,88,129,135,224,10,2,224,55,2,162,246,124,143,0,49,109,
+55,107,51,128,65,99,165,224,92,2,97,116,224,92,1,99,180,171,165,1,
+51,55,76,6,69,246,96,13,64,12,70,11,96,12,0,48,79,229,1,51,
+51,68,177,0,48,225,126,3,0,83,104,69,4,46,73,79,46,69,199,180,
+224,28,1,5,73,79,69,120,99,101,112,218,97,127,97,15,0,58,108,70,
+7,10,65,32,94,112,117,116,98,64,99,165,184,4,51,55,51,32,79,64,
+6,0,52,88,103,1,95,51,64,184,192,49,0,54,96,34,1,75,50,64,
+2,64,15,133,105,2,75,32,75,89,58,96,49,109,8,0,83,225,157,0,
+76,96,129,102,108,106,162,131,0,39,238,250,2,1,51,54,130,125,216,45,
+96,29,238,129,1,129,176,3,95,51,54,52,65,51,96,17,64,13,65,0,
+0,54,107,195,226,135,6,3,66,97,100,32,135,16,82,223,232,69,0,97,
+84,161,103,0,55,175,47,132,164,0,90,160,4,130,121,224,151,0,188,22,
+1,51,55,67,207,174,148,102,68,239,155,1,96,75,173,153,1,55,57,65,
+65,129,192,3,102,112,50,112,64,13,217,194,0,56,130,207,96,97,224,5,
+0,70,87,104,106,64,1,70,209,74,212,2,95,49,51,64,165,224,6,12,
+224,42,2,64,15,128,48,224,42,30,160,28,224,49,10,224,42,15,224,49,
+10,224,42,22,224,49,3,77,28,225,161,0,0,58,96,6,218,84,1,51,
+54,168,50,112,45,0,54,130,130,168,137,0,54,135,241,64,20,0,58,96,
+39,98,142,1,54,53,90,81,225,29,0,0,58,96,38,160,78,68,65,132,
+226,78,156,131,214,0,58,64,49,128,32,0,82,137,65,251,134,0,66,69,
+64,25,68,18,123,192,0,58,96,27,98,12,0,95,72,67,69,189,0,58,
+98,145,1,10,65,120,6,0,58,112,169,224,109,2,227,228,2,0,80,133,
+108,0,49,128,92,238,107,5,128,138,90,250,102,15,98,252,0,58,81,45,
+194,18,2,95,51,53,111,197,97,39,78,124,1,64,58,96,6,10,10,65,
+32,115,101,113,117,97,108,32,58,96,33,97,2,72,201,66,116,1,95,51,
+96,57,1,52,57,226,136,4,3,95,51,53,54,227,1,2,5,77,72,83,
+68,73,82,98,248,1,58,51,70,184,178,27,194,217,96,179,113,77,0,53,
+98,219,136,143,175,5,97,196,0,51,73,34,101,1,92,32,0,48,240,252,
+0,1,95,51,73,47,97,229,192,143,110,146,64,103,129,147,210,131,0,51,
+73,94,178,127,0,51,64,188,125,213,64,39,129,154,86,33,6,67,83,116,
+114,105,110,103,64,231,176,255,1,57,55,103,62,0,58,96,127,227,58,0,
+98,54,96,158,105,204,202,131,224,6,0,129,65,64,159,0,58,96,6,7,
+10,65,32,116,111,73,110,116,64,88,129,187,6,94,103,101,116,101,110,118,
+64,16,239,123,0,128,192,253,15,2,0,58,97,86,114,44,0,58,65,102,
+129,244,1,95,51,64,31,65,196,0,58,65,133,96,227,64,31,128,238,193,
+83,0,95,94,52,225,99,6,194,78,97,71,193,171,2,95,51,52,161,48,
+0,52,129,8,75,96,228,191,4,12,116,97,105,108,58,32,101,109,112,116,
+121,32,108,204,103,0,65,96,126,197,93,146,25,67,17,64,79,99,18,0,
+52,129,48,0,73,64,154,242,43,5,0,51,66,43,1,51,52,242,43,2,
+160,56,108,39,192,11,74,246,96,11,0,58,96,6,129,34,236,146,0,128,
+61,236,116,5,110,27,177,111,172,0,96,38,0,58,96,6,230,171,20,6,
+67,111,110,116,114,111,108,230,169,11,96,18,3,67,97,108,108,230,167,3,
+64,194,107,56,163,91,198,83,64,7,168,47,233,216,0,1,95,51,64,197,
+132,105,0,51,66,115,104,241,135,172,158,240,1,51,51,169,28,131,180,0,
+58,64,160,64,94,0,85,166,211,64,30,96,109,0,85,225,154,7,4,109,
+100,53,67,111,87,130,0,101,161,160,205,42,69,20,67,227,0,90,96,118,
+0,50,107,95,1,95,56,99,59,67,47,0,89,100,43,137,86,1,67,39,
+100,69,228,42,1,196,183,255,22,2,160,189,140,219,136,244,2,95,51,51,
+64,73,99,94,171,241,1,64,95,72,47,2,95,51,50,103,5,198,143,64,
+243,66,241,9,109,100,53,65,114,114,97,121,32,58,96,57,130,55,194,173,
+0,55,192,154,2,95,51,51,100,158,102,139,231,116,2,231,8,3,3,95,
+51,51,50,224,46,5,163,146,224,46,0,0,95,109,249,226,230,5,0,51,
+167,34,0,58,96,199,162,154,64,20,132,36,150,23,139,126,0,67,108,114,
+173,12,128,142,233,235,0,128,106,225,52,3,192,25,233,238,1,135,70,237,
+80,1,107,173,141,20,235,144,2,229,159,6,170,64,160,69,231,245,1,64,
+186,136,101,224,44,1,96,95,0,66,133,236,205,148,144,30,234,9,4,232,
+27,4,224,43,10,1,95,49,68,64,229,61,3,128,16,0,58,65,96,226,
+129,0,0,90,134,152,64,21,195,136,99,181,0,50,70,45,193,251,129,245,
+113,221,0,95,72,116,0,58,97,152,1,10,65,110,115,0,58,96,28,128,
+57,66,239,69,122,0,95,84,116,1,95,51,71,116,175,129,64,79,207,129,
+192,11,67,235,192,11,68,17,128,11,65,68,1,64,58,96,12,5,10,65,
+32,114,101,109,64,97,239,228,0,100,101,96,147,97,124,239,140,0,96,53,
+64,54,130,144,102,116,128,131,174,39,0,58,96,39,96,26,98,126,162,10,
+69,132,97,178,241,247,2,0,95,70,93,165,75,98,102,96,180,0,50,227,
+154,2,31,92,34,108,105,98,47,68,97,116,97,47,73,110,116,101,103,101,
+114,95,84,121,112,101,46,104,115,92,34,44,51,57,58,0,49,236,119,0,
+69,19,97,163,64,169,64,168,1,52,51,226,34,1,96,30,0,50,89,12,
+70,94,130,15,0,49,90,14,96,19,193,192,242,39,0,107,203,175,75,204,
+141,109,96,0,56,160,174,234,213,0,96,69,128,13,0,79,64,209,0,79,
+246,51,0,131,251,64,29,224,21,3,1,95,50,121,180,1,95,50,121,248,
+0,58,97,76,89,176,65,122,131,68,198,6,0,50,128,172,75,26,0,58,
+65,19,195,107,64,16,230,6,2,81,26,1,95,51,100,142,166,6,160,56,
+102,6,192,11,97,244,133,197,64,6,128,102,82,81,110,24,108,198,0,51,
+118,92,0,58,64,43,128,31,184,77,1,95,51,112,238,99,172,0,80,128,
+47,64,203,160,47,224,15,8,64,65,229,119,0,108,60,64,23,186,56,132,
+142,136,145,149,235,101,216,109,48,160,68,103,100,224,21,1,160,154,169,14,
+104,148,97,86,74,167,0,51,118,139,0,58,96,159,102,151,2,55,32,58,
+96,19,108,185,0,58,96,45,161,52,64,64,253,41,0,96,90,200,133,236,
+43,6,224,14,5,192,170,228,105,0,200,149,96,188,0,58,96,6,201,246,
+2,50,56,49,64,93,160,50,1,48,57,200,213,65,236,192,26,1,56,52,
+224,26,6,0,58,96,91,97,110,0,89,236,169,0,113,236,101,30,172,75,
+204,69,0,75,69,175,139,178,206,160,130,133,0,85,224,23,2,197,89,234,
+175,5,133,13,0,49,133,189,139,164,224,8,4,64,214,64,142,190,68,229,
+168,3,192,9,128,44,236,58,4,0,58,96,54,136,19,68,159,189,85,73,
+104,189,50,244,145,0,185,14,227,217,1,11,110,111,32,109,97,116,99,104,
+32,97,116,32,131,196,153,47,96,104,68,176,130,211,136,129,96,11,0,58,
+96,6,232,129,29,207,22,0,46,68,53,2,114,110,97,104,119,224,39,1,
+2,80,97,116,64,22,0,77,64,128,2,70,97,105,232,149,4,189,137,141,
+206,132,191,1,95,49,113,73,164,164,135,20,163,64,2,95,49,50,117,107,
+129,125,99,244,73,79,137,85,234,133,2,64,0,72,152,98,128,189,216,161,
+28,250,172,1,0,49,69,237,0,35,73,22,66,229,0,54,64,16,1,49,
+32,128,15,99,20,154,163,100,177,224,24,1,161,56,224,220,1,4,39,92,
+92,39,39,165,23,193,75,128,190,224,82,1,102,138,136,191,224,17,3,211,
+202,229,161,1,224,151,1,0,64,160,35,168,37,224,139,0,98,138,246,112,
+9,3,92,92,92,34,242,245,0,97,87,202,191,1,50,49,66,31,131,58,
+230,12,0,100,24,66,158,1,95,49,74,103,224,14,1,0,50,67,235,64,
+136,67,60,160,136,108,180,97,18,64,39,97,111,162,168,173,201,242,70,2,
+156,220,161,150,1,79,32,96,59,129,144,160,200,96,62,193,205,0,50,94,
+88,190,101,143,24,207,22,0,90,64,28,97,112,64,61,224,231,3,0,38,
+192,230,131,101,178,52,206,80,195,75,178,153,113,8,225,89,7,224,60,1,
+104,116,192,223,128,77,160,223,96,224,112,87,135,82,195,206,225,163,6,141,
+183,224,180,1,127,100,226,92,2,113,45,239,212,6,224,210,18,2,64,64,
+79,95,100,1,48,32,224,30,2,2,78,85,76,96,30,96,25,0,49,224,
+25,3,2,83,79,72,224,25,1,0,50,224,25,4,1,84,88,224,25,1,
+0,51,224,25,3,0,69,224,25,3,0,52,224,25,4,1,79,84,224,25,
+1,0,53,224,25,4,1,78,81,224,25,1,0,54,224,25,3,2,65,67,
+75,224,25,1,0,55,110,7,65,209,97,240,96,19,0,56,128,19,0,56,
+224,19,3,0,57,96,19,0,49,70,71,224,20,1,69,152,96,21,0,48,
+224,21,4,0,49,160,21,224,64,4,68,29,64,21,66,226,224,21,2,142,
+135,0,49,65,146,224,108,2,128,43,226,134,0,128,42,224,248,4,1,83,
+79,225,95,2,224,248,4,1,83,73,224,25,2,224,248,4,2,68,76,69,
+224,26,2,0,55,224,26,4,0,67,137,37,128,26,0,56,224,26,5,0,
+50,224,26,2,0,57,224,26,5,0,51,225,203,2,226,0,4,2,68,67,
+52,224,26,2,226,1,4,1,78,65,225,127,2,72,181,224,187,2,1,89,
+78,224,26,2,226,3,6,0,66,224,26,2,225,11,4,1,67,65,224,53,
+3,226,5,5,0,77,224,25,2,225,12,4,1,83,85,224,79,3,225,12,
+4,2,69,83,67,224,26,2,225,12,4,1,70,83,224,25,2,225,11,4,
+0,71,224,25,2,67,69,224,25,1,0,82,224,25,3,225,9,4,0,85,
+224,25,2,103,57,225,63,2,0,69,131,64,198,23,224,0,21,110,206,140,
+140,0,58,101,112,153,255,165,30,77,18,0,49,70,8,154,35,173,115,96,
+17,1,64,35,82,36,1,64,58,100,182,101,121,3,56,57,32,58,100,218,
+240,7,5,228,244,0,69,211,103,112,128,17,0,58,96,6,250,218,11,139,
+178,2,95,50,57,108,31,0,49,173,14,137,155,68,192,81,4,64,80,103,
+182,96,87,96,69,254,215,2,3,95,49,54,53,205,215,192,64,187,5,229,
+151,6,96,69,109,142,205,46,251,46,0,235,89,2,224,10,1,96,50,146,
+165,251,106,2,1,56,57,219,69,185,24,224,74,6,0,58,96,102,5,10,
+65,32,99,104,114,65,36,136,4,79,248,192,138,157,130,96,41,135,190,65,
+21,134,173,2,95,50,57,64,32,225,149,11,101,104,225,149,5,72,49,128,
+113,135,17,64,144,77,198,255,16,7,64,37,224,19,7,129,227,172,166,160,
+19,64,84,234,1,1,234,11,2,224,40,7,65,211,224,40,12,224,102,8,
+70,68,224,61,7,65,203,224,102,13,107,217,3,67,32,61,61,64,38,112,
+38,134,88,224,97,3,0,58,97,34,106,233,72,239,97,42,82,145,226,86,
+8,65,233,1,52,50,239,242,0,1,52,52,65,126,136,232,65,137,0,51,
+79,209,89,53,128,13,80,170,158,171,0,50,81,151,192,41,2,64,95,50,
+114,36,97,247,64,123,131,54,4,111,114,100,32,58,96,18,9,10,65,32,
+98,115,105,110,100,101,120,64,16,163,17,2,50,51,49,96,156,231,49,0,
+117,71,2,95,50,54,67,40,89,182,96,157,93,153,0,49,66,210,176,144,
+96,11,253,38,4,242,94,6,19,87,111,114,100,56,46,115,117,99,99,58,
+32,111,118,101,114,102,108,111,119,99,255,245,162,4,192,108,0,55,96,210,
+192,108,98,193,224,109,42,3,112,114,101,100,91,164,0,100,224,110,3,105,
+254,126,93,111,3,64,14,87,37,1,95,50,107,94,66,134,1,54,54,225,
+79,1,224,245,2,66,28,143,16,131,137,65,159,0,49,79,187,200,149,2,
+95,50,54,86,12,160,57,224,194,2,224,31,12,224,89,2,237,28,1,160,
+123,96,84,224,20,2,96,54,163,47,64,62,225,167,6,79,145,192,80,98,
+105,193,160,90,209,209,159,225,32,9,225,141,19,128,82,128,195,192,82,129,
+134,224,83,22,225,115,13,112,139,65,102,65,95,0,56,97,110,224,174,2,
+225,89,7,119,135,193,51,0,56,65,170,224,137,3,224,25,1,100,211,224,
+71,2,64,19,0,51,192,72,131,203,67,186,224,83,1,128,77,160,58,65,
+75,0,54,198,72,140,232,171,244,160,133,128,155,196,0,106,195,120,243,179,
+18,235,107,1,202,220,96,66,171,144,253,192,0,238,198,0,1,95,49,88,
+9,66,113,96,6,128,28,192,76,203,49,65,122,134,69,241,71,5,0,32,
+160,53,160,252,140,162,224,165,0,224,42,1,211,117,96,225,224,218,17,140,
+231,224,218,67,97,44,224,218,70,133,128,224,218,9,238,155,0,178,160,71,
+176,64,44,128,179,224,125,5,160,192,96,202,160,180,162,222,64,91,148,247,
+64,150,164,72,211,5,192,9,0,58,98,81,99,111,1,55,48,108,2,0,
+95,160,7,64,26,134,186,79,133,128,42,210,149,0,55,101,29,181,157,128,
+9,0,50,98,128,0,58,99,241,195,190,2,95,50,51,72,120,101,200,2,
+95,50,51,72,114,96,11,239,11,1,89,226,166,16,224,18,4,109,235,224,
+18,5,130,7,224,18,4,114,70,224,18,5,129,82,224,18,4,132,246,224,
+18,4,65,57,224,18,6,65,21,224,18,6,135,134,224,18,4,224,189,10,
+104,90,224,19,7,224,191,10,112,92,224,19,7,224,193,10,109,219,224,19,
+7,224,195,10,115,176,224,19,7,224,197,10,104,206,224,19,7,224,199,10,
+116,57,224,19,7,225,135,11,224,199,10,187,53,224,19,5,224,199,10,104,
+94,224,19,7,224,199,10,104,196,224,19,7,169,21,224,19,4,98,89,251,
+130,6,18,111,69,110,117,109,58,32,111,117,116,32,111,102,32,114,97,110,
+103,101,165,165,136,46,64,7,99,3,1,95,50,90,60,96,7,104,80,1,
+95,50,123,3,64,7,133,254,0,50,91,141,96,7,147,81,0,50,155,254,
+1,95,50,106,249,64,7,160,79,184,26,0,50,138,123,1,95,50,87,6,
+64,7,103,237,64,7,160,79,164,69,0,50,125,161,64,7,160,79,189,152,
+0,50,135,109,1,95,50,107,210,64,7,160,79,126,97,70,11,160,79,0,
+54,160,79,94,234,96,7,160,79,132,104,1,95,50,100,135,0,85,241,119,
+1,137,220,98,69,234,4,7,64,65,234,147,53,128,7,96,8,96,174,234,
+145,14,128,7,96,8,96,229,234,143,35,128,7,96,8,165,74,224,38,6,
+64,255,64,29,97,7,64,8,170,144,224,99,7,99,12,224,119,7,130,248,
+224,80,5,138,217,128,7,96,8,168,232,224,38,5,99,71,0,85,143,84,
+128,8,129,1,66,187,224,39,4,130,227,224,59,5,161,22,151,81,64,8,
+129,22,64,9,166,70,224,169,7,64,41,224,208,7,108,146,224,19,6,131,
+141,224,109,5,65,55,64,90,97,63,64,8,97,42,224,38,8,65,55,64,
+29,97,63,64,8,170,127,224,98,6,132,63,224,58,5,65,33,64,49,97,
+41,0,85,113,112,224,96,9,65,31,0,85,113,160,96,7,166,139,224,94,
+7,64,155,224,18,6,132,57,224,75,4,65,47,0,85,114,26,96,7,129,
+52,224,35,6,160,246,192,245,128,244,225,158,8,226,0,10,161,255,193,6,
+193,154,130,6,135,214,138,204,198,221,99,52,0,39,233,232,1,104,116,236,
+229,3,140,199,96,46,224,12,5,235,61,4,160,78,136,73,224,25,11,196,
+195,0,55,224,19,2,94,18,128,11,0,58,96,6,137,24,84,152,0,39,
+88,57,77,68,138,240,180,136,137,53,148,173,96,11,184,71,192,105,197,38,
+64,254,224,6,5,0,58,64,107,224,95,5,224,92,6,224,79,6,97,34,
+224,79,10,0,58,64,192,235,232,7,69,55,170,241,93,24,97,101,75,232,
+253,135,3,229,237,5,2,73,110,116,235,230,19,128,80,107,92,224,80,0,
+253,217,8,224,81,9,235,228,12,1,73,32,64,2,65,247,0,55,235,224,
+1,128,85,225,247,3,188,240,225,187,0,0,55,235,223,1,128,44,224,25,
+1,235,223,1,160,25,128,90,224,77,1,130,145,224,82,0,128,76,160,57,
+65,65,0,54,235,3,17,134,98,235,2,66,166,163,135,10,235,1,16,135,
+49,64,10,235,1,4,128,53,235,1,7,96,163,235,0,10,64,222,224,215,
+16,96,134,224,215,67,135,59,224,215,68,132,172,224,215,9,235,216,10,64,
+43,235,215,33,136,88,203,215,64,148,235,215,16,66,73,157,160,96,13,217,
+151,75,186,195,82,78,177,1,95,50,83,113,203,243,132,240,96,83,224,28,
+15,0,58,98,172,156,0,64,77,128,100,0,65,64,100,0,54,222,85,160,
+205,88,160,128,150,252,171,0,192,222,64,45,132,72,6,85,32,75,50,32,
+75,52,126,4,64,21,132,21,192,21,97,64,0,58,68,70,128,114,64,136,
+91,93,101,32,128,17,0,49,192,17,129,93,152,148,128,17,129,2,152,140,
+128,17,129,6,152,132,128,17,192,204,70,63,128,17,128,211,152,116,96,17,
+73,126,128,17,0,55,192,17,128,187,152,106,128,17,221,21,70,247,128,17,
+224,179,0,71,18,128,18,224,180,1,192,181,74,2,160,18,192,182,66,145,
+160,18,192,183,74,56,160,18,192,184,74,83,160,18,192,185,74,110,160,18,
+192,186,66,48,160,18,192,187,74,164,160,18,192,188,65,164,160,18,192,189,
+74,218,128,18,72,250,128,18,224,189,0,73,22,128,18,225,115,1,192,189,
+67,18,160,18,192,189,66,167,160,18,192,189,75,97,160,18,192,189,75,124,
+160,18,192,189,75,151,160,18,192,189,75,178,160,18,192,189,75,205,160,18,
+192,189,71,36,183,65,83,73,102,154,156,191,1,50,51,165,253,165,252,198,
+141,81,193,180,184,0,64,102,34,64,19,128,221,224,69,9,230,150,10,224,
+71,0,227,118,0,0,51,66,191,96,18,128,254,67,17,224,1,1,67,217,
+96,0,224,20,11,224,17,8,224,14,5,224,11,2,192,8,93,0,131,86,
+88,160,195,64,0,90,128,130,64,21,207,150,77,59,0,50,65,58,0,58,
+117,70,15,10,65,32,34,94,95,94,44,94,41,94,66,94,57,94,59,96,
+5,18,53,94,54,94,57,94,58,94,57,94,52,94,57,94,57,94,73,94,
+38,96,7,0,66,96,19,30,57,94,89,94,32,94,53,94,57,94,54,94,
+60,94,51,94,60,94,89,94,33,94,53,94,58,94,54,94,58,124,32,96,
+75,22,57,94,67,94,59,94,61,94,57,94,60,94,61,94,50,94,55,94,
+58,94,45,94,61,96,13,8,58,94,40,94,40,94,60,94,33,96,75,31,
+60,94,40,94,50,94,56,94,66,94,40,94,57,94,86,94,32,94,58,94,
+70,94,32,94,87,94,33,94,58,94,71,94,2,33,94,32,224,3,102,224,
+33,59,224,3,53,224,9,1,0,66,224,15,6,64,5,0,66,96,5,2,
+33,94,67,224,19,6,224,43,3,224,79,13,224,69,9,224,15,1,2,33,
+94,50,160,67,0,67,96,9,0,34,96,25,224,5,3,224,3,21,224,33,
+25,192,37,192,77,224,129,3,224,3,99,0,70,96,5,128,11,64,5,128,
+23,193,77,224,3,2,1,124,68,97,21,28,90,94,33,94,81,94,49,94,
+67,94,60,94,75,94,49,94,77,94,60,94,68,94,49,94,70,94,60,94,
+49,96,3,6,80,94,60,124,111,94,35,224,57,0,64,21,64,7,4,48,
+94,48,94,49,97,83,8,57,94,32,94,67,94,48,94,60,96,25,67,73,
+2,32,94,48,160,3,64,41,0,80,96,11,3,72,94,32,124,193,29,225,
+211,3,224,3,35,64,179,64,9,0,58,160,15,96,75,5,124,50,94,32,
+124,47,224,75,40,224,3,13,8,61,94,68,94,35,94,37,94,37,224,73,
+56,224,3,37,224,29,19,224,67,31,224,3,145,1,48,124,65,79,130,49,
+4,69,94,57,124,40,98,53,0,52,96,17,18,61,94,61,94,59,94,48,
+124,44,94,35,94,52,94,35,94,57,94,35,224,5,4,6,71,94,48,94,
+90,94,50,98,97,67,189,69,87,6,74,94,48,94,69,94,45,229,179,0,
+0,59,96,5,64,73,0,74,96,53,64,25,14,57,94,95,94,50,94,49,
+94,73,94,50,94,84,94,35,101,231,10,67,94,57,94,50,94,50,94,35,
+124,98,96,73,4,50,94,70,94,35,101,187,6,69,94,35,94,49,94,49,
+96,117,4,61,94,67,94,35,96,39,64,51,2,66,94,50,96,89,8,50,
+94,77,94,57,94,48,94,45,64,63,1,94,93,99,59,0,35,64,193,3,
+124,88,94,50,96,119,64,33,0,48,64,51,5,124,32,94,50,94,72,160,
+81,0,61,96,139,0,49,96,235,6,35,94,59,94,59,94,85,96,205,64,
+29,128,35,0,66,96,5,66,119,64,35,0,78,96,101,64,83,64,23,64,
+17,64,15,16,74,94,50,94,68,94,48,94,87,94,50,94,60,94,69,94,
+50,96,137,0,45,96,19,3,72,94,35,124,70,103,2,49,94,87,96,205,
+6,95,94,35,94,36,124,53,96,167,0,36,96,151,8,66,94,36,94,71,
+94,35,94,67,96,15,2,36,94,36,160,249,65,27,129,103,199,7,2,49,
+94,78,160,55,4,36,94,48,94,71,96,103,0,48,97,11,64,7,64,185,
+2,48,94,70,96,5,64,85,129,145,128,217,128,101,64,215,64,15,128,63,
+128,7,64,27,65,197,64,29,192,75,65,85,64,121,64,35,64,121,64,21,
+65,27,2,69,94,40,98,15,65,157,128,29,64,37,64,75,64,243,224,63,
+1,224,139,7,224,5,7,64,55,64,101,64,125,64,247,128,71,64,23,65,
+85,64,185,2,35,94,70,224,191,0,65,13,128,135,64,37,128,155,65,17,
+224,125,1,0,72,224,181,0,224,121,11,0,68,225,5,6,129,203,192,59,
+129,3,129,71,0,78,160,51,224,251,3,66,191,64,127,0,50,98,133,64,
+55,225,125,27,224,119,7,129,217,225,127,13,64,93,128,141,225,129,17,66,
+225,65,125,128,245,64,33,65,113,65,41,128,245,65,41,64,13,193,101,128,
+9,192,17,192,39,64,7,0,75,161,169,128,123,64,5,128,29,64,145,129,
+145,128,213,0,69,96,35,163,51,105,35,0,69,97,251,69,131,64,131,128,
+43,129,5,128,131,0,86,96,5,0,79,225,109,4,130,213,129,215,64,165,
+224,237,1,192,53,128,173,225,119,9,64,39,2,57,94,70,98,113,194,243,
+0,57,224,111,10,67,37,225,107,9,0,68,96,117,193,171,128,235,128,123,
+64,11,64,219,226,143,1,224,117,3,128,17,2,36,94,75,225,147,0,0,
+36,226,93,3,99,201,64,23,227,79,3,225,59,3,68,141,65,93,64,45,
+0,36,96,189,225,201,7,0,72,96,209,132,35,192,159,0,81,161,155,68,
+63,194,205,128,207,66,79,131,15,128,85,65,173,130,133,66,129,128,201,128,
+183,128,217,0,57,64,185,1,124,47,96,115,64,201,68,71,64,57,67,187,
+68,131,68,103,235,85,0,0,124,64,123,226,49,1,129,67,128,131,193,89,
+128,69,69,9,128,143,128,35,69,47,64,89,224,123,1,66,127,0,95,96,
+55,2,66,94,61,101,37,75,129,64,11,64,251,66,57,64,41,0,73,96,
+251,69,195,128,3,75,237,64,3,64,185,97,217,0,124,64,103,64,175,0,
+77,97,27,67,169,134,107,64,119,69,197,64,33,128,251,64,63,64,87,134,
+163,0,68,107,247,64,115,96,213,1,124,42,97,127,129,161,65,37,133,107,
+129,111,129,191,64,143,2,69,94,57,97,23,192,21,131,69,193,221,129,63,
+65,113,134,17,0,76,226,135,0,128,211,129,239,0,36,163,31,64,13,2,
+61,94,61,167,75,73,13,137,101,64,139,71,79,137,141,1,66,124,129,221,
+197,153,196,47,224,17,0,98,97,224,13,1,70,171,224,45,18,102,15,2,
+48,124,56,224,51,4,195,87,64,201,4,72,94,57,94,83,98,133,131,153,
+0,73,98,123,2,48,124,85,167,241,0,69,170,43,4,52,94,68,124,107,
+98,189,10,57,94,80,94,50,94,41,94,89,94,50,97,155,3,66,94,48,
+124,70,223,71,39,2,66,94,39,97,167,67,71,130,179,65,15,4,72,94,
+48,94,82,162,229,66,129,0,57,96,17,64,31,64,17,67,73,65,57,195,
+181,160,19,1,124,51,224,49,0,66,73,66,203,129,91,65,229,135,147,142,
+21,64,37,195,59,130,237,68,137,64,185,72,163,72,51,64,133,0,45,168,
+67,64,219,0,34,66,233,1,124,52,160,167,66,57,3,35,94,35,124,75,
+79,65,175,3,68,94,48,124,65,243,69,73,0,94,160,151,199,123,132,213,
+229,29,1,65,227,128,29,66,101,65,67,199,139,72,97,195,15,4,74,94,
+48,124,43,162,183,65,53,195,147,97,117,0,124,74,181,68,169,226,125,1,
+64,55,66,167,64,161,128,245,131,75,130,163,131,11,128,123,0,73,160,45,
+224,219,0,224,7,0,0,70,97,33,65,3,64,31,67,45,5,37,94,79,
+94,35,124,131,139,72,97,0,46,162,173,67,67,197,17,192,93,64,187,192,
+201,64,73,66,21,67,227,0,72,169,15,128,171,64,227,195,65,195,61,131,
+29,99,61,96,243,128,91,198,13,128,31,128,99,64,135,0,57,99,207,65,
+219,64,209,192,69,65,71,67,175,131,55,130,23,193,83,2,69,94,49,162,
+65,138,155,65,173,0,42,162,171,76,149,0,71,102,3,129,179,2,57,94,
+76,225,61,0,66,251,65,51,196,177,128,105,129,237,8,43,94,33,124,62,
+94,49,94,76,77,31,0,124,76,147,4,36,94,49,124,63,237,53,2,224,
+3,255,224,3,17,193,143,224,3,181,64,197,2,71,94,32,228,245,0,0,
+69,162,89,81,235,64,23,192,7,224,31,11,207,51,192,3,192,43,0,77,
+160,43,128,15,0,34,224,7,8,79,21,0,48,241,53,0,0,34,114,125,
+2,66,94,60,102,13,224,23,3,64,19,0,67,160,75,192,21,66,231,0,
+60,96,73,0,68,111,145,0,60,163,7,224,81,7,64,23,8,74,94,41,
+94,68,94,45,94,69,179,57,6,55,94,56,94,53,94,55,224,7,0,67,
+57,2,42,94,43,96,35,0,41,102,23,64,25,69,63,2,51,94,51,99,
+245,0,58,101,239,0,74,179,127,4,51,94,73,94,57,160,83,68,119,2,
+45,94,40,173,39,74,135,77,219,64,45,77,193,224,13,1,69,233,69,183,
+70,183,0,59,107,77,67,161,2,67,94,37,99,245,4,37,94,75,94,35,
+96,21,71,177,80,149,64,5,64,11,242,89,1,128,7,192,23,0,58,96,
+247,71,229,64,15,192,3,64,245,64,51,145,55,67,249,64,49,64,17,65,
+227,71,121,80,129,65,75,64,65,128,25,8,61,94,79,94,40,124,34,94,
+39,160,51,0,39,104,137,137,171,64,47,0,68,96,43,0,58,96,147,128,
+51,192,5,0,70,96,5,0,94,160,31,192,25,128,17,2,66,94,75,116,
+41,0,61,232,201,0,0,83,160,39,64,53,4,53,94,54,124,80,96,15,
+8,93,94,61,94,88,94,58,124,39,103,125,1,58,124,64,49,0,85,97,
+179,10,61,94,84,94,48,124,59,94,40,124,77,96,19,4,40,94,65,124,
+54,96,51,69,139,10,58,124,53,94,61,94,71,94,58,124,110,96,19,2,
+65,124,119,224,107,2,224,3,11,4,93,94,40,124,43,105,15,129,145,0,
+94,160,7,224,3,7,0,79,64,77,5,92,95,94,61,94,65,225,189,0,
+224,3,30,1,124,62,224,47,2,0,95,160,11,6,66,94,65,94,58,124,
+47,96,207,129,37,64,231,76,183,66,49,64,103,6,48,124,104,94,61,124,
+47,242,13,2,193,243,227,163,3,243,11,1,64,5,67,135,79,165,243,175,
+111,224,3,73,0,33,162,205,128,13,70,197,64,7,74,43,67,137,86,135,
+2,57,124,37,163,223,64,21,100,15,1,124,55,168,203,71,27,77,145,0,
+35,104,81,73,101,138,17,224,5,33,80,125,196,29,64,3,67,247,64,7,
+128,5,68,21,132,61,64,5,128,23,196,73,226,7,5,71,191,67,251,64,
+41,137,133,64,49,2,53,94,76,177,233,215,203,224,3,3,1,52,124,64,
+205,0,89,98,11,2,88,94,61,106,25,6,65,124,85,94,61,94,89,106,
+157,0,61,184,9,6,61,94,49,94,50,94,39,226,123,11,96,91,224,87,
+8,96,5,64,27,2,72,94,39,232,175,0,0,52,117,41,128,139,0,39,
+96,81,128,153,74,251,137,187,72,33,69,59,66,97,3,50,94,52,124,73,
+187,74,77,64,13,136,119,75,91,137,233,132,43,79,127,0,61,82,185,1,
+124,37,96,109,64,23,2,79,94,50,100,11,138,153,67,233,0,71,100,91,
+2,78,94,40,98,247,2,73,94,40,99,7,64,15,2,66,124,63,78,205,
+2,124,51,124,64,47,0,50,128,13,5,94,65,124,35,124,125,176,65,4,
+49,94,72,124,118,141,243,100,7,4,72,94,48,124,39,233,23,2,68,113,
+64,37,65,39,64,121,73,55,72,239,0,83,102,147,226,155,53,224,3,19,
+73,87,69,193,73,181,66,65,0,49,224,73,48,179,199,171,131,0,39,173,
+75,137,213,4,86,94,60,94,72,118,195,150,197,224,3,13,246,153,41,224,
+3,69,79,69,224,17,3,224,35,13,224,195,3,88,213,64,9,224,185,35,
+70,249,192,5,224,3,19,248,61,3,64,5,66,217,128,7,128,3,224,47,
+5,0,84,104,63,129,189,66,71,2,49,94,33,100,25,211,87,139,71,68,
+93,235,243,1,71,19,139,181,147,255,146,5,77,105,77,195,67,251,148,63,
+1,36,124,67,57,0,79,160,55,64,19,204,99,76,177,0,81,171,159,66,
+185,149,221,64,105,64,29,0,91,108,35,132,151,64,121,78,1,142,9,64,
+65,0,92,242,191,0,236,213,3,236,151,5,76,125,68,121,69,33,64,81,
+71,213,64,77,141,251,85,201,131,41,112,189,111,97,144,17,192,225,128,7,
+67,207,129,5,77,33,64,23,65,75,64,55,141,85,131,113,77,117,144,229,
+173,189,96,245,144,51,140,123,64,75,174,117,160,25,0,87,177,103,131,195,
+79,77,224,121,1,64,17,129,137,64,19,78,149,146,27,224,7,5,229,235,
+6,112,83,74,47,64,219,194,109,6,67,94,48,124,79,94,33,110,255,128,
+211,224,5,1,0,57,96,9,192,207,65,143,2,50,124,87,101,143,0,50,
+101,135,65,119,64,63,64,15,65,61,2,46,94,70,100,147,2,46,94,46,
+192,7,1,94,71,160,9,2,47,124,49,96,9,4,47,94,66,124,109,128,
+163,1,124,105,101,19,64,157,0,33,96,79,74,245,70,191,129,227,2,50,
+94,58,176,3,146,63,128,3,224,5,0,112,121,4,80,94,60,94,79,65,
+129,3,124,106,94,50,101,217,4,79,94,61,124,63,160,95,87,47,71,1,
+69,125,148,195,94,47,69,125,83,213,222,55,64,215,64,17,134,149,74,215,
+230,67,11,224,3,3,65,125,64,7,144,71,139,7,129,235,134,85,192,3,
+139,31,0,52,105,43,66,91,152,211,138,61,64,161,0,65,161,157,87,247,
+66,69,254,207,58,160,59,192,165,65,69,2,49,124,44,162,43,80,185,131,
+145,226,43,9,140,35,128,31,87,181,0,58,126,251,64,9,65,63,0,67,
+169,159,66,105,0,66,121,93,137,163,65,83,144,191,145,205,193,161,114,97,
+112,99,0,50,66,47,1,124,122,184,235,64,221,66,49,0,44,178,93,4,
+72,94,61,124,52,103,127,1,40,94,74,245,95,105,65,161,76,3,145,59,
+2,61,124,46,96,47,68,77,4,65,94,65,94,48,195,219,98,117,76,23,
+4,35,94,90,94,40,97,85,90,29,64,73,66,247,0,83,104,13,67,147,
+0,39,103,151,0,37,96,129,67,99,0,48,177,135,144,103,64,55,64,37,
+67,247,2,39,124,41,103,57,6,32,124,39,94,33,124,77,160,195,210,33,
+73,117,64,187,0,35,101,63,135,97,0,71,164,207,132,117,0,74,109,125,
+0,78,96,5,0,70,253,45,0,75,177,67,51,0,78,96,5,66,235,141,
+135,64,195,64,59,66,249,2,66,124,54,163,175,71,207,65,101,64,147,68,
+1,71,195,2,48,124,41,109,69,3,72,94,49,124,64,191,193,175,67,5,
+81,79,129,117,65,45,128,23,150,227,69,97,0,40,96,11,65,173,86,85,
+65,255,69,97,4,72,94,40,124,47,225,177,4,64,85,2,68,94,40,96,
+125,141,169,64,63,65,215,64,25,2,57,124,63,170,79,65,45,65,163,64,
+51,2,79,94,40,99,101,77,227,132,199,137,29,138,151,134,21,211,191,65,
+179,130,97,147,23,69,55,0,40,99,155,74,61,64,7,64,33,64,89,197,
+187,73,7,129,5,0,61,101,235,64,89,131,57,64,55,116,45,99,223,64,
+169,64,15,201,159,64,243,64,215,64,133,64,11,84,81,154,21,118,229,65,
+7,3,124,79,94,48,85,81,3,124,54,94,48,94,105,1,94,76,96,7,
+70,211,102,173,162,23,134,141,243,67,3,64,209,69,183,85,7,146,143,92,
+223,2,49,94,85,111,181,0,48,109,195,0,65,64,93,1,94,94,65,27,
+1,124,41,96,147,64,185,157,23,129,53,97,19,64,123,96,99,64,237,74,
+3,129,153,64,197,70,201,66,197,75,45,77,239,64,193,129,79,75,229,2,
+48,94,84,96,209,0,40,105,189,203,209,134,83,84,27,0,78,164,219,65,
+43,85,195,64,183,230,97,1,128,45,135,21,68,21,216,143,198,205,68,51,
+0,45,97,43,134,85,68,151,156,185,219,77,65,11,2,66,94,35,97,35,
+148,37,71,133,193,31,70,149,64,75,131,25,70,83,128,83,128,119,102,189,
+120,103,64,119,84,59,135,147,136,15,64,135,134,113,138,159,64,53,133,89,
+64,199,67,97,65,9,221,71,244,53,1,64,5,202,15,160,233,107,41,246,
+247,7,132,147,69,17,101,243,168,21,64,73,64,193,66,47,192,223,199,101,
+251,175,33,129,91,128,141,154,187,251,175,1,153,233,64,47,64,91,85,91,
+128,53,192,31,84,137,194,77,64,229,154,155,192,119,132,185,64,9,64,71,
+156,77,192,95,64,217,64,5,225,5,1,136,57,65,113,136,203,66,83,64,
+155,2,92,94,48,98,29,192,237,64,49,129,63,131,167,213,89,192,57,137,
+217,0,93,186,21,192,121,192,221,129,31,128,243,129,167,195,41,0,65,66,
+161,97,89,194,89,64,169,224,51,5,0,86,97,235,98,143,102,27,192,97,
+245,237,1,128,39,137,243,129,17,129,151,73,173,0,82,173,99,128,37,64,
+47,192,153,161,215,224,45,0,0,83,106,37,2,48,94,90,161,75,224,49,
+1,130,241,65,111,67,37,64,47,134,119,77,235,65,219,2,65,124,56,165,
+89,226,167,1,99,29,1,124,99,102,101,4,32,94,95,94,33,96,55,68,
+197,68,85,226,39,1,132,131,226,31,1,91,25,87,149,226,15,1,193,9,
+66,1,137,211,64,121,67,31,87,31,64,185,160,77,0,124,67,5,225,71,
+3,133,3,192,235,64,59,0,90,96,103,2,73,94,35,173,239,64,89,196,
+187,65,197,65,151,234,183,1,67,183,2,45,94,50,183,1,225,99,1,65,
+253,69,3,74,241,131,231,4,57,94,65,124,53,186,73,144,61,193,85,122,
+137,0,124,128,185,152,129,225,127,1,130,69,128,43,0,82,230,69,0,0,
+57,248,247,0,0,85,162,189,64,55,226,17,2,0,124,234,167,1,137,217,
+66,241,64,85,64,63,198,85,131,39,139,103,224,141,1,135,9,129,105,71,
+253,221,193,128,103,194,75,228,189,1,0,66,64,213,250,119,2,139,73,222,
+93,64,211,106,113,121,247,64,29,66,35,64,133,224,75,1,66,131,101,83,
+0,124,77,21,136,129,2,84,94,40,115,207,2,67,94,59,104,197,0,76,
+167,125,10,89,94,50,124,101,94,48,124,110,94,39,184,189,66,205,1,65,
+124,66,253,1,84,124,90,207,0,96,163,173,64,49,0,72,99,9,0,79,
+122,149,64,215,69,201,65,77,0,95,98,193,100,53,5,124,70,94,50,124,
+53,66,157,97,83,85,25,197,9,64,147,0,77,98,61,0,68,123,217,64,
+211,154,169,133,153,154,61,197,3,129,61,250,143,1,157,223,131,139,65,103,
+221,25,76,43,67,21,193,213,103,63,166,131,64,145,65,73,0,67,104,75,
+2,66,94,49,98,131,147,121,129,35,0,65,96,143,195,47,0,86,105,165,
+2,57,124,100,188,27,136,7,71,9,66,17,135,13,0,76,121,99,77,145,
+64,119,79,243,65,49,65,125,66,131,4,50,124,47,124,117,97,117,98,3,
+81,147,0,124,64,141,65,255,64,65,4,50,124,69,124,102,96,73,158,107,
+64,5,64,73,73,95,70,139,65,171,0,50,69,11,168,149,64,13,64,87,
+65,143,154,123,74,207,0,82,105,221,76,79,64,225,66,15,138,169,194,69,
+128,57,158,163,65,37,3,45,94,94,124,68,103,2,65,124,111,190,177,64,
+245,4,67,124,51,94,61,97,227,65,207,64,49,0,86,142,45,4,124,115,
+94,61,124,75,85,2,65,124,117,129,89,212,241,0,124,79,33,197,153,75,
+5,68,55,2,71,94,45,101,25,137,195,0,35,114,43,3,67,94,35,124,
+75,157,86,5,0,65,107,39,4,35,94,61,124,121,167,41,68,143,160,7,
+1,124,86,178,113,0,88,86,35,96,191,76,59,76,47,64,7,138,139,0,
+81,160,13,64,21,234,179,1,190,135,224,13,0,152,89,88,187,152,111,234,
+203,1,74,221,224,63,1,64,37,128,43,128,45,203,9,224,29,7,80,163,
+64,93,137,191,192,33,224,157,3,224,7,23,0,91,176,183,10,88,94,32,
+94,58,94,88,94,33,94,58,117,251,224,15,55,177,15,1,124,49,67,55,
+86,237,1,124,54,101,119,1,61,124,66,143,67,231,1,35,94,87,119,129,
+147,67,41,66,87,67,67,72,99,2,35,94,72,106,1,0,73,113,43,0,
+83,117,187,68,167,2,33,94,65,100,49,133,51,0,80,162,19,221,195,64,
+5,172,157,4,124,61,94,49,124,65,15,2,35,124,111,108,249,202,227,73,
+215,153,75,195,209,75,27,84,29,131,201,2,35,94,80,254,83,0,132,15,
+66,191,2,59,94,67,96,143,68,67,0,49,224,25,0,85,65,192,53,68,
+247,228,35,1,2,67,124,95,229,141,0,137,55,237,209,3,1,65,124,136,
+239,108,67,64,147,67,127,3,124,33,94,32,93,33,96,163,64,99,228,115,
+4,1,94,70,96,151,0,58,114,5,75,215,0,59,74,221,99,25,78,5,
+148,227,1,65,124,77,217,128,111,135,175,128,117,195,165,195,119,192,145,134,
+213,64,5,129,7,224,3,1,131,217,224,61,7,224,3,9,224,31,1,128,
+83,224,241,3,224,101,1,128,117,0,80,238,189,0,64,13,129,1,0,80,
+85,145,171,243,0,66,68,69,121,65,68,57,0,99,182,165,0,78,175,35,
+128,7,96,5,1,124,36,165,75,0,76,96,243,4,32,94,61,124,55,108,
+251,102,51,192,65,121,197,144,183,0,61,100,159,87,253,0,65,118,239,2,
+65,124,122,98,115,4,60,94,69,124,87,160,45,70,113,66,33,175,49,1,
+124,118,160,135,86,95,65,35,0,75,160,39,65,105,224,13,0,1,124,55,
+118,115,64,225,147,149,90,101,64,15,68,95,64,181,224,53,1,0,61,107,
+77,1,66,124,90,165,64,215,66,251,64,33,207,161,64,65,66,183,64,81,
+64,181,192,247,90,167,136,49,128,23,2,65,94,82,97,3,0,91,165,37,
+0,72,161,193,4,66,124,77,124,93,96,9,66,121,2,50,124,32,97,19,
+193,223,0,65,101,91,161,201,2,124,44,92,96,35,166,13,0,58,80,27,
+229,215,0,2,68,124,107,96,7,0,83,114,161,0,68,135,33,1,124,97,
+96,41,0,38,104,99,129,197,64,97,96,111,5,124,43,124,56,124,80,108,
+229,74,233,2,95,94,45,96,93,69,199,4,35,94,67,124,124,109,171,0,
+47,68,3,1,124,123,96,9,64,131,224,15,2,31,34,32,58,50,50,56,
+32,64,10,65,32,95,54,32,95,49,52,54,32,64,95,54,32,89,32,66,
+32,66,32,83,32,85,64,18,5,55,32,64,64,64,64,64,16,1,90,32,
+224,7,1,12,83,39,32,83,32,64,66,32,67,39,32,83,39,64,8,14,
+83,32,64,95,49,50,55,32,95,53,49,32,64,35,49,160,52,0,67,64,
+23,224,38,0,9,66,32,64,64,67,32,67,32,95,52,64,108,12,53,54,
+32,64,64,95,49,53,55,32,95,49,57,64,120,5,51,50,52,32,35,49,
+64,143,96,0,64,53,64,110,10,95,49,48,54,32,64,67,32,95,56,48,
+160,41,224,53,19,3,85,32,35,48,224,64,0,31,66,32,80,32,95,51,
+50,50,32,102,114,111,109,85,84,70,56,32,34,92,34,108,105,98,47,68,
+97,116,97,47,67,104,21,97,114,47,85,110,105,99,111,100,101,46,104,115,
+92,34,44,50,48,50,58,56,34,128,62,64,225,96,228,96,71,128,13,64,
+133,224,187,28,128,185,2,64,67,39,64,249,7,95,49,55,52,32,95,55,
+53,64,27,160,210,64,202,96,16,64,80,192,11,192,63,3,95,49,57,56,
+64,184,4,50,50,48,32,64,160,55,224,28,0,129,76,64,70,96,151,2,
+95,50,50,65,107,96,8,0,52,225,37,0,160,78,128,140,225,17,2,64,
+71,64,11,2,95,50,50,64,192,3,58,50,50,55,129,252,2,50,50,53,
+66,10,0,54,96,13,7,98,115,117,110,112,97,99,107,64,17,0,53,96,
+17,64,110,4,95,50,50,50,32,64,57,1,51,32,64,56,0,52,96,24,
+2,66,32,89,65,247,65,160,0,58,96,25,64,44,65,41,0,67,129,44,
+65,32,0,54,64,113,96,118,97,142,130,81,129,220,128,57,128,189,0,50,
+96,48,225,42,1,192,190,0,64,128,49,0,58,96,33,96,139,64,115,64,
+61,0,80,128,6,160,68,64,33,0,49,128,205,5,49,48,56,32,95,50,
+64,21,3,95,49,57,53,64,10,64,114,192,11,65,70,3,95,50,49,48,
+161,96,64,11,0,49,224,11,2,0,51,224,11,2,0,57,224,11,0,0,
+54,64,57,0,52,64,255,0,48,64,156,0,58,96,22,1,10,65,162,213,
+98,254,129,236,66,48,128,255,64,2,64,151,162,72,226,78,0,66,4,225,
+192,1,192,37,64,16,128,52,64,77,96,5,99,79,97,28,1,49,52,64,
+7,2,85,32,65,161,44,1,49,53,64,137,0,49,96,246,64,59,64,18,
+99,167,64,136,1,95,54,65,57,224,19,1,8,64,64,83,32,73,32,64,
+75,50,226,127,1,224,125,0,1,83,39,65,69,194,84,99,208,129,131,66,
+54,0,75,192,172,98,232,96,128,64,18,224,128,7,162,251,192,139,96,71,
+130,135,96,16,224,54,15,0,64,128,206,97,103,0,56,65,223,1,49,57,
+97,81,64,45,2,75,52,32,128,174,0,58,96,27,224,21,2,160,20,130,
+182,2,85,32,90,96,1,0,75,64,175,96,23,0,54,224,44,0,64,13,
+130,188,224,37,9,130,187,225,148,0,97,1,1,95,49,66,36,3,95,50,
+49,50,96,58,130,202,0,85,64,134,192,57,0,58,96,27,130,129,161,181,
+6,95,50,48,57,32,64,65,96,49,130,123,224,27,7,128,136,130,43,96,
+77,224,196,1,64,30,8,10,65,32,117,114,101,109,32,58,98,150,64,13,
+3,113,117,111,116,64,14,163,152,2,49,48,57,99,52,100,100,164,118,0,
+54,68,211,65,73,226,148,6,64,83,129,0,0,73,64,65,128,253,0,83,
+99,141,65,145,226,93,0,163,155,2,54,56,32,131,150,98,175,130,196,224,
+22,4,133,124,67,28,229,66,16,10,73,110,116,101,103,101,114,95,84,121,
+112,165,66,3,53,52,58,49,165,65,128,63,0,57,67,68,0,48,96,80,
+66,118,0,79,64,123,0,79,97,24,160,36,224,34,3,224,26,3,224,23,
+2,198,134,2,95,50,48,66,103,2,95,50,48,100,132,64,251,100,112,2,
+95,49,54,68,155,1,54,52,64,47,0,50,166,127,0,58,96,37,102,218,
+0,54,98,159,1,95,55,97,219,64,32,128,53,1,54,57,224,20,1,129,
+190,0,75,65,56,129,173,2,80,32,58,64,128,162,41,99,47,131,7,162,
+183,96,184,96,14,129,207,69,180,225,229,3,96,36,0,58,96,34,64,131,
+1,52,49,64,47,3,53,32,95,54,65,170,160,10,66,87,128,10,2,49,
+55,51,96,11,0,55,64,11,102,227,0,73,97,179,96,220,71,86,1,49,
+53,100,135,230,114,7,131,100,230,137,9,224,22,13,128,45,96,185,66,54,
+96,115,0,58,96,31,101,203,192,24,64,19,130,61,96,243,0,56,133,153,
+1,53,57,64,30,64,50,2,35,50,53,101,4,96,44,98,165,0,54,71,
+154,68,119,161,137,2,49,54,51,96,5,96,101,97,192,1,54,56,192,61,
+2,95,49,55,97,11,96,73,96,27,1,55,50,130,227,96,51,0,55,132,
+84,1,49,55,224,110,0,2,95,49,56,224,48,0,3,95,49,56,51,224,
+11,2,0,54,224,56,8,196,199,98,203,71,171,230,126,1,224,27,5,2,
+49,52,50,160,28,1,95,55,97,46,66,38,192,41,2,95,49,56,102,50,
+64,18,224,81,51,0,57,224,81,9,66,115,1,49,56,224,220,2,0,57,
+104,214,160,11,0,49,66,254,4,95,49,57,50,32,160,67,0,75,160,8,
+64,21,0,51,69,19,0,58,96,43,6,10,65,32,90,32,85,32,64,13,
+130,206,7,112,111,112,99,111,117,110,116,66,181,228,138,2,0,66,96,109,
+0,56,67,28,0,49,167,88,0,58,64,113,129,182,3,56,56,32,58,64,
+139,226,183,3,133,44,224,1,9,165,62,224,0,2,0,58,96,88,64,72,
+2,51,52,51,228,31,2,18,97,114,105,116,104,109,101,116,105,99,32,111,
+118,101,114,102,108,111,119,68,17,0,58,97,1,131,78,165,35,0,83,228,
+148,5,192,5,2,95,49,56,102,240,3,95,49,56,53,227,96,0,230,188,
+0,71,106,130,142,134,250,1,49,55,137,24,230,168,0,131,160,226,241,3,
+128,66,0,58,66,47,128,234,224,228,15,224,1,3,224,240,9,64,0,0,
+58,96,147,96,68,69,247,96,169,192,211,129,108,98,255,64,147,0,58,66,
+171,161,90,0,51,224,108,42,0,58,96,75,224,92,4,64,244,132,141,1,
+95,49,71,96,160,252,0,58,67,33,160,105,225,193,17,224,103,14,0,58,
+96,73,224,102,4,0,55,71,10,160,195,0,55,226,30,0,0,52,224,92,
+15,224,84,7,0,58,96,58,231,63,1,224,1,21,225,103,12,0,58,96,
+131,197,56,69,51,101,45,133,39,165,38,99,240,229,38,7,104,252,97,246,
+101,4,138,238,64,52,0,58,96,47,103,17,136,225,98,68,64,232,226,40,
+1,0,58,64,88,160,184,231,247,1,96,45,5,10,65,32,42,32,58,96,
+126,129,42,1,95,49,68,28,130,89,226,122,12,99,190,0,58,68,220,160,
+49,236,78,3,228,75,10,137,247,98,221,102,209,70,32,224,29,2,1,95,
+49,100,77,234,60,0,1,95,49,101,88,227,214,0,64,106,226,4,0,136,
+103,224,2,2,225,85,0,232,138,0,224,30,4,225,133,3,0,58,96,104,
+224,178,62,229,147,0,128,178,0,54,65,111,224,178,3,72,109,195,33,224,
+141,2,226,23,6,0,58,96,56,224,183,7,226,66,14,0,58,96,117,226,
+178,0,134,227,66,65,7,10,65,32,120,111,114,32,58,102,150,2,10,65,
+32,128,11,129,208,2,97,110,100,64,12,129,171,2,95,52,56,137,7,3,
+95,49,52,57,66,57,66,84,167,33,224,1,31,107,212,224,0,10,224,57,
+25,192,1,224,65,14,224,56,25,128,1,224,62,13,224,55,25,64,1,224,
+59,12,224,54,25,224,56,13,224,53,44,224,50,41,224,47,38,224,44,35,
+224,41,32,224,38,29,224,35,26,224,32,23,224,29,20,224,26,17,224,23,
+14,224,20,11,224,17,8,224,14,5,224,11,2,192,8,109,70,224,0,9,
+0,58,74,28,229,83,1,224,1,23,227,202,4,224,68,2,70,249,140,217,
+106,144,228,11,1,171,103,69,125,99,186,203,43,1,95,49,67,197,0,49,
+82,142,224,11,0,73,63,192,11,137,112,128,11,139,135,128,11,107,158,0,
+53,96,10,109,109,106,246,96,10,0,58,96,6,5,10,65,32,117,62,61,
+64,134,132,82,1,117,62,64,11,132,81,1,117,60,96,24,132,82,1,117,
+60,64,11,132,81,3,117,99,109,112,64,13,176,160,96,105,196,100,192,121,
+68,106,64,99,129,45,0,47,64,73,64,18,160,244,0,52,128,244,0,75,
+64,10,206,27,1,52,53,64,13,128,147,1,98,115,145,178,64,20,160,29,
+0,51,64,13,128,152,7,98,115,108,101,110,103,116,104,64,17,232,147,0,
+101,30,143,102,74,186,64,21,0,82,141,240,64,16,170,68,145,195,1,49,
+51,106,201,112,144,2,58,49,52,170,63,97,107,0,51,97,107,0,51,103,
+156,0,51,71,167,1,49,51,110,171,0,51,104,67,0,51,69,69,97,77,
+96,65,129,77,96,10,0,58,96,6,225,77,0,64,40,193,77,64,58,225,
+77,0,64,77,193,77,64,95,3,10,65,32,105,129,77,64,115,96,201,139,
+25,2,58,49,51,128,218,65,35,64,16,143,63,0,54,64,13,225,119,3,
+83,71,2,95,49,50,101,216,64,188,193,108,64,17,3,10,65,32,61,96,
+11,226,98,1,1,64,58,96,245,210,236,111,71,209,159,80,178,0,90,64,
+82,171,226,83,1,64,6,139,102,179,78,113,200,97,30,82,193,0,58,96,
+29,96,22,71,52,192,73,3,48,54,32,35,75,183,147,76,0,35,108,14,
+227,116,2,224,32,2,143,175,116,92,177,196,0,89,243,79,0,115,19,224,
+65,4,224,64,5,66,13,64,0,96,58,163,88,179,201,139,145,128,163,128,
+244,129,76,105,88,85,210,0,48,96,20,129,86,104,97,64,14,232,112,0,
+99,134,0,58,97,8,167,40,164,18,0,58,97,36,194,112,96,36,177,210,
+0,66,80,87,137,134,114,23,80,214,130,70,146,32,1,58,49,177,230,11,
+94,109,100,53,83,116,114,105,110,103,32,58,96,27,180,145,2,66,32,95,
+128,46,64,213,97,74,64,15,213,98,116,173,141,115,168,107,178,15,73,172,
+128,55,0,51,73,176,1,90,32,224,31,0,129,9,4,110,101,119,67,65,
+128,111,2,76,101,110,64,114,129,9,224,212,5,129,8,0,65,64,30,129,
+4,129,148,2,115,101,113,142,15,96,8,101,19,1,58,49,177,255,80,81,
+177,244,193,150,128,1,229,136,78,0,58,85,7,193,122,229,91,2,0,58,
+114,234,3,10,65,32,79,64,144,129,79,6,95,56,57,32,75,32,95,98,
+97,192,7,1,95,57,79,106,114,90,0,95,112,163,128,10,1,49,48,78,
+176,192,11,0,50,224,11,2,107,154,81,148,0,58,96,18,65,186,6,112,
+111,107,101,87,111,114,73,92,177,173,4,94,112,101,101,107,192,18,162,99,
+65,177,75,66,145,221,81,117,0,58,64,89,160,187,241,78,3,177,167,192,
+49,152,13,160,48,226,123,1,0,95,81,117,67,87,68,214,0,95,81,152,
+1,64,58,177,203,2,116,111,73,79,36,177,172,6,116,111,80,116,114,32,
+58,177,164,243,160,5,177,22,131,24,245,210,0,129,102,67,182,1,64,95,
+113,43,182,201,99,90,0,95,144,131,3,73,32,64,58,177,64,229,102,5,
+177,47,237,104,0,79,187,65,179,128,61,1,67,32,96,63,0,95,76,249,
+64,44,229,168,0,202,197,175,234,0,95,80,49,75,235,0,35,77,160,175,
+237,148,55,175,217,226,51,1,226,55,2,226,94,72,176,56,203,221,64,31,
+0,95,87,85,100,121,0,95,79,38,163,149,224,20,0,163,154,1,56,50,
+160,16,163,159,119,127,132,175,0,58,176,82,64,37,114,182,64,226,176,55,
+6,94,102,114,101,101,32,58,175,196,140,157,224,91,5,0,95,78,119,0,
+95,79,11,140,115,96,33,224,109,0,97,171,64,31,135,238,224,116,0,0,
+58,175,209,128,50,64,226,64,165,133,85,96,244,0,39,86,195,224,48,0,
+0,73,160,255,224,247,3,193,209,225,62,1,224,118,3,1,64,95,80,8,
+128,162,247,28,0,248,229,6,101,95,176,76,205,13,64,154,226,4,0,0,
+50,133,61,176,18,91,162,0,83,118,185,123,143,129,88,64,240,1,32,95,
+79,176,65,121,98,80,224,104,8,128,103,197,183,228,21,1,0,58,176,4,
+68,183,0,58,175,243,96,199,103,172,130,164,192,75,226,169,7,175,237,242,
+6,6,8,117,110,100,101,102,105,110,101,100,113,252,175,206,247,140,7,175,
+147,111,229,99,172,72,158,99,14,0,95,72,200,0,83,238,118,11,65,128,
+238,68,2,143,254,85,206,211,126,143,244,192,33,128,249,240,18,1,0,95,
+79,206,0,58,175,232,2,66,32,95,116,170,112,33,175,231,0,85,97,203,
+124,186,80,116,142,204,0,80,96,7,97,114,225,113,0,112,151,64,120,97,
+11,99,226,128,212,129,180,2,95,54,55,163,167,73,81,176,7,0,89,162,
+99,252,82,3,247,114,1,194,83,0,67,103,224,150,161,128,191,65,5,214,
+217,161,2,1,55,48,128,155,97,210,175,251,4,105,110,118,32,58,175,228,
+4,115,104,114,32,58,175,203,72,213,175,107,0,97,128,23,129,143,4,115,
+104,108,32,58,175,47,2,43,32,58,175,38,2,45,32,58,175,35,2,73,
+32,58,175,33,230,68,7,175,43,130,171,100,158,175,37,106,22,74,233,0,
+95,74,252,0,95,75,13,0,95,75,31,0,95,75,48,0,95,75,66,106,
+16,149,40,74,15,96,9,0,58,172,37,131,180,98,189,131,193,96,37,0,
+55,131,118,69,88,172,8,224,29,1,224,49,1,224,39,5,230,251,0,195,
+75,172,34,74,110,171,200,2,62,32,58,171,197,74,106,171,196,2,60,32,
+58,171,193,138,103,171,194,106,60,75,144,0,95,75,161,0,58,171,202,74,
+57,171,177,65,98,171,176,2,80,32,58,171,175,196,14,164,73,194,34,224,
+20,11,224,17,8,224,14,5,224,11,2,192,8,229,137,0,172,17,250,174,
+5,172,24,4,110,101,103,32,58,172,20,2,42,32,58,172,16,2,45,32,
+58,172,8,2,43,32,58,171,252,224,148,68,0,58,172,64,199,83,64,17,
+225,225,0,73,127,68,90,66,26,75,223,64,12,66,28,69,237,1,64,58,
+172,23,4,95,51,55,32,58,172,22,2,73,32,58,172,20,64,54,66,76,
+76,10,0,58,172,27,64,29,128,224,64,9,168,102,7,109,97,108,108,111,
+99,32,58,172,20,13,73,79,46,112,101,114,102,111,114,109,73,79,32,58,
+172,30,224,179,2,0,58,172,35,2,85,32,58,172,20,224,219,14,0,58,
+172,39,64,19,0,95,127,70,0,95,109,21,236,50,2,103,237,0,58,172,
+53,6,114,97,105,115,101,32,58,172,12,7,65,46,114,101,97,100,32,58,
+172,4,13,73,79,46,103,101,116,65,114,103,82,101,102,32,58,171,138,0,
+95,70,104,67,63,123,218,99,67,64,95,224,199,0,1,62,62,95,153,128,
+42,105,126,128,33,1,95,49,231,86,0,1,49,55,128,65,88,81,192,9,
+0,50,71,41,64,9,0,58,171,181,186,213,73,119,64,52,119,110,64,69,
+108,188,254,222,4,96,32,116,227,192,32,0,95,150,117,161,168,0,55,88,
+69,224,47,12,107,103,96,155,143,64,129,18,78,207,129,14,70,14,130,28,
+253,172,0,119,85,231,7,0,0,50,211,192,128,253,233,57,0,69,139,224,
+11,2,96,197,101,26,0,58,171,153,96,59,140,148,164,150,0,51,97,196,
+108,34,130,110,73,193,129,62,74,61,96,36,64,180,101,204,128,226,0,58,
+128,224,2,75,32,58,225,220,1,1,64,58,194,136,0,58,162,125,9,79,
+46,114,101,116,117,114,110,32,58,225,212,0,0,62,68,100,128,196,2,80,
+32,58,128,187,227,74,47,0,58,227,157,3,226,142,9,237,130,1,130,118,
+64,200,1,95,50,86,129,131,193,224,0,255,224,0,255,224,0,255,224,0,
+255,224,0,255,224,0,255,224,0,255,224,0,255,224,0,198,1,32,125,
+};
+unsigned char *combexpr = data;
+int combexprlen = 126219;
 #include "mhsffi.h"
 static struct ffi_entry table[] = {
 { 0,0 }
diff --git a/ghc/MHSPrelude.hs b/ghc/MHSPrelude.hs
--- a/ghc/MHSPrelude.hs
+++ b/ghc/MHSPrelude.hs
@@ -1,13 +1,25 @@
-module MHSPrelude(module Prelude, module MHSPrelude, Type) where
+{-# OPTIONS_GHC -Wno-orphans #-}
+{-# LANGUAGE CPP #-}
+module MHSPrelude(module Prelude, module Control.DeepSeq, module Control.Arrow, module MHSPrelude, Type) where
 import Prelude
+import Control.Arrow(first, second)
+import Control.DeepSeq
+import Control.Exception
 import Data.Maybe
 import Data.List
 import Data.Text(Text, append, pack)
-import Control.Exception
 import GHC.Types
 import System.Environment
 import System.IO
 
+------- Text --------
+
+-- base-4.19.2.0 seems to lack this???
+#if 0
+instance NFData Text where
+  rnf t = seq t ()
+#endif
+
 ------- List --------
 
 takeWhileEnd :: forall a . (a -> Bool) -> [a] -> [a]
@@ -48,16 +60,11 @@
 _isWindows :: Bool
 _isWindows = False
 
--- This cannot be implemented with GHC.
-rnfNoErr :: forall a . a -> ()
-rnfNoErr _ = ()
-
--- This cannot be implemented with GHC.
-rnfErr :: forall a . a -> ()
-rnfErr _ = ()
-
 appendDot :: Text -> Text -> Text
 appendDot x y = x `append` pack "." `append` y
 
 wantGMP :: Bool
 wantGMP = False
+
+compiledWithMhs :: Bool
+compiledWithMhs = False
diff --git a/ghc/MicroHs/Instances.hs b/ghc/MicroHs/Instances.hs
deleted file mode 100644
--- a/ghc/MicroHs/Instances.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-{-# OPTIONS_GHC -Wno-orphans #-}
-{-# LANGUAGE CPP #-}
-module MicroHs.Instances(compiledWithGHC) where
-import Control.DeepSeq
-import MicroHs.CompileCache
-import MicroHs.Ident
-import MicroHs.Exp
-import MicroHs.Expr
-
-instance NFData Cache where rnf _ = ()
-
-instance NFData Exp where rnf (Var i) = rnf i; rnf (App f a) = rnf f `seq` rnf a; rnf (Lam i e) = rnf i `seq` rnf e; rnf (Lit l) = rnf l
-
-instance NFData Lit where rnf (LInt i) = rnf i; rnf (LInteger i) = rnf i; rnf (LDouble d) = rnf d; rnf (LRat r) = rnf r; rnf (LChar c) = rnf c; rnf (LStr s) = rnf s; rnf (LPrim s) = rnf s; rnf (LExn s) = rnf s; rnf (LForImp s _) = rnf s; rnf (LTick s) = rnf s; rnf (LUStr s) = rnf s
-
-instance NFData SLoc where rnf (SLoc f l c) = rnf f `seq` rnf l `seq` rnf c
-
-instance NFData Ident where rnf i = rnf (slocIdent i)
-
-compiledWithGHC :: Bool
-compiledWithGHC = True
diff --git a/ghc/PrimTable.hs b/ghc/PrimTable.hs
--- a/ghc/PrimTable.hs
+++ b/ghc/PrimTable.hs
@@ -11,7 +11,9 @@
 import Foreign.C.String
 import Foreign.C.Types
 import Foreign.Marshal.Alloc
+import Data.Array.IO
 import Foreign.Ptr
+import GHC.ForeignPtr
 --import System.Environment
 import System.IO.Unsafe
 --import Debug.Trace
@@ -19,6 +21,8 @@
 
 type AnyType = Any
 
+type IOArr a = IOArray Int a
+
 _primitive :: String -> Any
 --_primitive s | trace ("_primitive " ++ show s) False = undefined
 _primitive "dynsym" = unsafeCoerce dynsym
@@ -27,8 +31,8 @@
 primOps :: [(String, Any)]
 primOps =
   [ comb "S" (\ f g x -> f x (g x))
-  , comb "K" (\ x _y -> x)
-  , comb "I" (\ x -> x)
+  , comb "K" const
+  , comb "I" id
   , comb "B" (\ f g x -> f (g x))
   , comb "C" (\ f g x -> f x g)
   , comb "S'" (\ k f g x -> k (f x) (g x))
@@ -38,6 +42,7 @@
   , comb "U" (\ x y -> y x)
   , comb "Y" (\ f -> let r = f r in r)
   , comb "Z" (\ f g _x -> f g)
+  , comb "J" (\ x _y z -> z x)
   , comb "P" (\ x y f -> f x y)
   , comb "R" (\ x y f -> y f x)
   , comb "O" (\ x y _g f -> f x y)
@@ -76,6 +81,7 @@
   , cmpw "u>"  (>)
   , cmpw "u>=" (>=)
   , comb "icmp" (\ x y -> fromOrdering (compare (x::Int) y))
+  , comb "ucmp" (\ x y -> fromOrdering (compare (x::Word) y))
 
   , comb "scmp" (\ x y -> fromOrdering (compare (toString x) (toString y)))
   , comb "sequal" (\ x y -> fromBool (toString x == toString y))
@@ -85,7 +91,14 @@
   , comb "pcast" castPtr
   , comb "p+" plusPtr
   , comb "p-" minusPtr
+  , comb "fp2p" unsafeForeignPtrToPtr
 
+  , comb "A.alloc" newIOArray
+  , comb "A.size" sizeIOArray
+  , comb "A.read" readIOArray
+  , comb "A.write" writeIOArray
+--  , comb "A.==" eqIOArray
+
   , farith "f+" (+)
   , farith "f-" (-)
   , farith "f*" (*)
@@ -175,8 +188,19 @@
     rnf :: a -> ()
     rnf x = seq x ()
 
+    newIOArray :: Int -> a -> IO (IOArr a)
+    newIOArray i arr = newArray (0, i-1) arr
+    sizeIOArray :: IOArr a -> IO Int
+    sizeIOArray arr = pred . snd <$> getBounds arr
+    readIOArray :: IOArr a -> Int -> IO a
+    readIOArray arr i = readArray arr i
+    writeIOArray :: IOArr a -> Int -> a -> IO ()
+    writeIOArray arr i a = writeArray arr i a
+--    eqIOArray :: IOArr a -> IOArr a -> IO Bool
+
+
 fromBool :: Bool -> Any
-fromBool False = unsafeCoerce $ \ x _y -> x
+fromBool False = unsafeCoerce const
 fromBool True  = unsafeCoerce $ \ _x y -> y
 
 fromOrdering :: Ordering -> (Any -> Any -> Any -> Any)
@@ -191,11 +215,11 @@
 fromString = fromList . map (unsafeCoerce . ord)
 
 fromList :: [Any] -> Any
-fromList [] = unsafeCoerce $ \ nil _cons -> nil
+fromList [] = unsafeCoerce const
 fromList (x:xs) = unsafeCoerce $ \ _nil cons -> cons (unsafeCoerce x) (fromList xs)
 
 toList :: Any -> [Int]
-toList a = (unsafeCoerce a) [] (\ i is -> i : toList is)
+toList a = unsafeCoerce a [] (\ i is -> i : toList is)
 
 toString :: Any -> String
 toString = map chr . toList
@@ -242,7 +266,7 @@
     fio f = return . f
 
     fio2 :: (Double -> Double -> Double) -> (Double -> Double -> IO Double)
-    fio2 f = \ x y -> return (f x y)
+    fio2 f x y = return (f x y)
 
     add_FILE :: Handle -> IO Handle
     add_FILE h = return h
diff --git a/ghc/System/IO/MD5.hs b/ghc/System/IO/MD5.hs
--- a/ghc/System/IO/MD5.hs
+++ b/ghc/System/IO/MD5.hs
@@ -1,10 +1,14 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module System.IO.MD5(MD5CheckSum, md5File, md5Handle) where
+import Control.DeepSeq
 import System.IO
 
 newtype MD5CheckSum = MD5 [Word]  -- actually returns 16 bytes
   deriving (Eq, Show)
+
+instance NFData MD5CheckSum where
+  rnf (MD5 ws) = rnf ws
 
 md5File :: FilePath -> IO (Maybe MD5CheckSum)
 md5File _ = return (Just $ MD5 [])          -- dummy MD5
diff --git a/hugs/MHSPrelude.hs b/hugs/MHSPrelude.hs
--- a/hugs/MHSPrelude.hs
+++ b/hugs/MHSPrelude.hs
@@ -4,6 +4,7 @@
   module Prelude,
   module MHSPrelude,
 --  module Control.Monad.Fail,
+  module Control.Arrow,
   module Data.Monoid,
   module Data.Semigroup,
   (<$>), Applicative(..), (*>),
@@ -11,18 +12,22 @@
 import Hugs.Prelude()
 import Prelude hiding(fail)
 import qualified Prelude
+import Control.Arrow(first, second)
 import Control.Applicative
 import Control.Exception(Exception, try)
 --import Control.Monad.Fail
 import Data.List
 import Data.Maybe
 import Data.Monoid
+import Data.Ratio
 import Data.Semigroup
 import Data.Text(Text, append, pack)
+import Data.Word
 import Data.Version
 import Debug.Trace
 import System.IO
 import System.Environment
+import System.IO.MD5
 
 ------- List --------
 
@@ -66,8 +71,7 @@
 void = fmap (const ())
 
 asum :: Alternative f => [f a] -> f a
-asum [] = empty
-asum (a:as) = a <|> asum as
+asum = foldr (<|>) empty
 
 
 ------- List --------
@@ -107,7 +111,7 @@
 
 openFileM :: FilePath -> IOMode -> IO (Maybe Handle)
 openFileM path m = do
-  r <- (try $ openFile path m)
+  r <- try $ openFile path m
   case r of
     Left _ -> return Nothing
     Right h -> return (Just h)
@@ -152,21 +156,70 @@
 usingMhs = False
 
 _wordSize :: Int
-_wordSize = 64
+_wordSize = 32         -- Hugs has 32 bit Int
 
 _isWindows :: Bool
 _isWindows = False
 
--- This cannot be implemented with Hugs.
-rnfNoErr :: forall a . a -> ()
-rnfNoErr _ = ()
-
--- This cannot be implemented with Hugs.
-rnfErr :: forall a . a -> ()
-rnfErr _ = ()
-
 appendDot :: Text -> Text -> Text
 appendDot x y = x `append` pack "." `append` y
 
 wantGMP :: Bool
 wantGMP = False
+
+compiledWithMhs :: Bool
+compiledWithMhs = False
+
+-------- Control.DeepSeq ------
+
+-- NFData class and instances for primitive types.
+
+class NFData a where
+  rnf :: a -> ()
+  rnf a = seq a ()
+
+infixr 0 `deepseq`
+deepseq :: NFData a => a -> b -> b
+deepseq a b = rnf a `seq` b
+
+infixr 0 $!!
+($!!) :: (NFData a) => (a -> b) -> a -> b
+f $!! x = x `deepseq` f x
+
+force :: (NFData a) => a -> a
+force x = x `deepseq` x
+
+instance NFData Int
+instance NFData Word
+instance NFData Float
+instance NFData Double
+instance NFData Char
+instance NFData Bool
+instance NFData Ordering
+instance NFData ()
+instance NFData Text
+
+instance NFData Integer where
+  rnf x = (x == 0) `seq` ()
+
+instance Integral a => NFData (Ratio a) where
+  rnf x = (x == 0) `seq` ()
+
+instance NFData a => NFData (Maybe a) where
+  rnf Nothing = ()
+  rnf (Just a) = rnf a
+
+instance NFData a => NFData [a] where
+  rnf [] = ()
+  rnf (x:xs) = rnf x `seq` rnf xs
+
+instance (NFData a, NFData b) => NFData (Either a b) where
+  rnf (Left a) = rnf a
+  rnf (Right b) = rnf b
+
+instance (NFData a, NFData b) => NFData (a, b) where
+  rnf (a, b) = rnf a `seq` rnf b
+
+instance NFData (a -> b)
+instance NFData Version
+instance NFData MD5CheckSum
diff --git a/hugs/MicroHs/Instances.hs b/hugs/MicroHs/Instances.hs
deleted file mode 100644
--- a/hugs/MicroHs/Instances.hs
+++ /dev/null
@@ -1,5 +0,0 @@
-module MicroHs.Instances(compiledWithGHC) where
-
--- TODO: rename to compiledWithMicroHs
-compiledWithGHC :: Bool
-compiledWithGHC = True
diff --git a/hugs/PrimTable.hs b/hugs/PrimTable.hs
--- a/hugs/PrimTable.hs
+++ b/hugs/PrimTable.hs
@@ -26,8 +26,8 @@
 primOps :: [(String, Any)]
 primOps =
   [ comb "S" (\ f g x -> f x (g x))
-  , comb "K" (\ x _y -> x)
-  , comb "I" (\ x -> x)
+  , comb "K" const
+  , comb "I" id
   , comb "B" (\ f g x -> f (g x))
   , comb "C" (\ f g x -> f x g)
   , comb "S'" (\ k f g x -> k (f x) (g x))
@@ -37,6 +37,7 @@
   , comb "U" (\ x y -> y x)
   , comb "Y" (\ f -> let r = f r in r)
   , comb "Z" (\ f g _x -> f g)
+  , comb "J" (\ x _y z -> z x)
   , comb "P" (\ x y f -> f x y)
   , comb "R" (\ x y f -> y f x)
   , comb "O" (\ x y _g f -> f x y)
@@ -156,11 +157,11 @@
     ioret = return
     -- Can't implement this
     ioprint :: Handle -> a -> IO ()
-    ioprint h _ = hPutStrLn h "ghc does not support cprint"
+    ioprint h _ = hPutStrLn h "hugs does not support cprint"
     ioserialize :: Handle -> a -> IO ()
-    ioserialize h _ = hPutStrLn h "ghc does not support serialize"
+    ioserialize h _ = hPutStrLn h "hugs does not support serialize"
     iodeserialize :: Handle -> IO a
-    iodeserialize _ = error "ghc does not support deserialize"
+    iodeserialize _ = error "hugs does not support deserialize"
 
 {-
     iogetargs :: IO Any
@@ -168,14 +169,14 @@
       args <- getArgs
       return $ fromList $ map fromString args
 -}
-    iogetargref = error "ghc: no IO.getArgRef"
+    iogetargref = error "hugs: no IO.getArgRef"
 
     -- Can't implement this
     rnf :: a -> ()
     rnf x = seq x ()
 
 fromBool :: Bool -> Any
-fromBool False = unsafeCoerce $ \ x _y -> x
+fromBool False = unsafeCoerce const
 fromBool True  = unsafeCoerce $ \ _x y -> y
 
 fromOrdering :: Ordering -> (Any -> Any -> Any -> Any)
@@ -190,11 +191,11 @@
 fromString = fromList . map (unsafeCoerce . ord)
 
 fromList :: [Any] -> Any
-fromList [] = unsafeCoerce $ \ nil _cons -> nil
+fromList [] = unsafeCoerce const
 fromList (x:xs) = unsafeCoerce $ \ _nil cons -> cons (unsafeCoerce x) (fromList xs)
 
 toList :: Any -> [Int]
-toList a = (unsafeCoerce a) [] (\ i is -> i : toList is)
+toList a = unsafeCoerce a [] (\ i is -> i : toList is)
 
 toString :: Any -> String
 toString = map chr . toList
@@ -204,7 +205,7 @@
   let s = toString acfun
   in
 --      trace ("dynsym: " ++ show s) $
-      fromMaybe (error $ "ghc: unimplemented FFI: " ++ s) $ lookup s cops
+      fromMaybe (error $ "hugs: unimplemented FFI: " ++ s) $ lookup s cops
 
 popCount :: Int -> Int
 popCount = undefined
@@ -250,7 +251,7 @@
     fio f = return . f
 
     fio2 :: (Double -> Double -> Double) -> (Double -> Double -> IO Double)
-    fio2 f = \ x y -> return (f x y)
+    fio2 f x y = return (f x y)
 
     add_FILE :: Handle -> IO Handle
     add_FILE h = return h
diff --git a/hugs/System/IO/Serialize.hs b/hugs/System/IO/Serialize.hs
--- a/hugs/System/IO/Serialize.hs
+++ b/hugs/System/IO/Serialize.hs
@@ -13,21 +13,21 @@
 
 {-
 hSerialize   :: forall a . Handle -> a -> IO ()
-hSerialize = errghc
+hSerialize = errhugs
 hDeserialize :: forall a . Handle -> IO a
-hDeserialize = errghc
+hDeserialize = errhugs
 writeSerialized :: forall a . FilePath -> a -> IO ()
-writeSerialized = errghc
+writeSerialized = errhugs
 -}
 
 writeSerializedCompressed :: FilePath -> a -> IO ()
-writeSerializedCompressed = errghc
+writeSerializedCompressed = errhugs
 
 writeSerialized :: FilePath -> a -> IO ()
-writeSerialized = errghc
+writeSerialized = errhugs
 
 readSerialized ::  FilePath -> IO a
-readSerialized = errghc
+readSerialized = errhugs
 
-errghc :: a
-errghc = error "System.IO.Serialize: serialization not available with hugs"
+errhugs :: a
+errhugs = error "System.IO.Serialize: serialization not available with hugs"
diff --git a/lib/AllOfLib.hs b/lib/AllOfLib.hs
--- a/lib/AllOfLib.hs
+++ b/lib/AllOfLib.hs
@@ -5,6 +5,7 @@
 import Control.Applicative
 import Control.Category
 import Control.DeepSeq
+import Control.DeepSeq.Class
 import Control.Error
 import Control.Exception
 import Control.Exception.Internal
@@ -25,6 +26,7 @@
 import Data.ByteString.Lazy.Char8
 import Data.Char
 import Data.Char_Type
+import Data.Char.Unicode
 import Data.Coerce
 import Data.Complex
 import Data.Constraint
@@ -79,6 +81,7 @@
 import Data.STRef
 import Data.String
 import Data.Text
+import Data.Text.Encoding
 import Data.Text.IO
 import Data.Text.Lazy
 import Data.Text.Lazy.IO
@@ -124,6 +127,7 @@
 import System.IO.MD5
 import System.IO.PrintOrRun
 import System.IO.Serialize
+import System.IO.StringHandle
 import System.IO.TimeMilli
 import System.Info
 import System.Process
diff --git a/lib/Control/Applicative.hs b/lib/Control/Applicative.hs
--- a/lib/Control/Applicative.hs
+++ b/lib/Control/Applicative.hs
@@ -6,7 +6,7 @@
   guard, asum, optional,
   module Data.Functor.Const_Type,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives  -- for fixity
 import Data.Bool_Type
 import Data.Functor
@@ -29,7 +29,7 @@
   liftA2 f a b = f <$> a <*> b
 
 liftA :: forall f a b . Applicative f => (a -> b) -> f a -> f b
-liftA f a = pure f <*> a
+liftA f a = f <$> a
 
 liftA3 :: forall f a b c d . Applicative f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d
 liftA3 f a b c = f <$> a <*> b <*> c
diff --git a/lib/Control/Arrow.hs b/lib/Control/Arrow.hs
--- a/lib/Control/Arrow.hs
+++ b/lib/Control/Arrow.hs
@@ -1,8 +1,199 @@
-module Control.Arrow(module Control.Arrow) where
-import Prelude()              -- do not import Prelude
+{-# LANGUAGE Safe #-}
 
-first :: forall a b c . (a -> c) -> (a, b) -> (c, b)
-first f (a, b) = (f a, b)
+-- |
+--
+-- Module      :  Control.Arrow
+-- Copyright   :  (c) Ross Paterson 2002
+-- License     :  BSD-style (see the LICENSE file in the distribution)
+module Control.Arrow
+    (-- *  Arrows
+     Arrow(..),
+     Kleisli(..),
+     -- **  Derived combinators
+     returnA,
+     (^>>),
+     (>>^),
+     (>>>),
+     (<<<),
+     -- **  Right-to-left variants
+     (<<^),
+     (^<<),
+     -- *  Monoid operations
+     ArrowZero(..),
+     ArrowPlus(..),
+     -- *  Conditionals
+     ArrowChoice(..),
+     -- *  Arrow application
+     ArrowApply(..),
+     ArrowMonad(..),
+     leftApp,
+     -- *  Feedback
+     ArrowLoop(..)
+     ) where
+import Prelude hiding ((.), id)
+import Control.Applicative
+import Control.Category
+import Control.Monad
+import Control.Monad.Fix
 
-second :: forall a b c . (b -> c) -> (a, b) -> (a, c)
-second f (a, b) = (a, f b)
+infixr 5 <+>
+infixr 3 ***
+infixr 3 &&&
+infixr 2 +++
+infixr 2 |||
+infixr 1 ^>>, >>^
+infixr 1 ^<<, <<^
+
+class Category a => Arrow a where
+    arr :: (b -> c) -> a b c
+    first :: a b c -> a (b,d) (c,d)
+    first = (*** id)
+    second :: a b c -> a (d,b) (d,c)
+    second = (id ***)
+    (***) :: a b c -> a b' c' -> a (b,b') (c,c')
+    f *** g = first f >>> arr swap >>> first g >>> arr swap
+      where
+        swap :: forall x y . (x, y) -> (y, x)
+        swap ~(x,y) = (y,x)
+    (&&&) :: a b c -> a b c' -> a b (c,c')
+    f &&& g = arr (\b -> (b,b)) >>> f *** g
+
+instance Arrow (->) where
+    arr f = f
+    (***) f g ~(x,y) = (f x, g y)
+
+newtype Kleisli m a b = Kleisli { runKleisli :: a -> m b }
+
+{-
+deriving instance Generic (Kleisli m a b)
+
+deriving instance Generic1 (Kleisli m a)
+
+deriving instance Functor m => Functor (Kleisli m a)
+-}
+instance Functor m => Functor (Kleisli m a) where
+  fmap f k = Kleisli (fmap f . runKleisli k)
+
+instance Applicative m => Applicative (Kleisli m a) where
+  pure = Kleisli . const . pure
+  Kleisli f <*> Kleisli g = Kleisli $ \x -> f x <*> g x
+  Kleisli f *> Kleisli g = Kleisli $ \x -> f x *> g x
+  Kleisli f <* Kleisli g = Kleisli $ \x -> f x <* g x
+
+instance Alternative m => Alternative (Kleisli m a) where
+  empty = Kleisli $ const empty
+  Kleisli f <|> Kleisli g = Kleisli $ \x -> f x <|> g x
+
+instance Monad m => Monad (Kleisli m a) where
+  Kleisli f >>= k = Kleisli $ \x -> f x >>= \a -> runKleisli (k a) x
+
+instance MonadPlus m => MonadPlus (Kleisli m a) where
+  mzero = Kleisli $ const mzero
+  Kleisli f `mplus` Kleisli g = Kleisli $ \x -> f x `mplus` g x
+
+instance Monad m => Category (Kleisli m) where
+    id = Kleisli return
+    Kleisli f . Kleisli g = Kleisli (g >=> f)
+
+instance Monad m => Arrow (Kleisli m) where
+    arr f = Kleisli (return . f)
+    first (Kleisli f) = Kleisli (\ ~(b,d) -> f b >>= \c -> return (c,d))
+    second (Kleisli f) = Kleisli (\ ~(d,b) -> f b >>= \c -> return (d,c))
+
+returnA :: Arrow a => a b b
+returnA = id
+
+(^>>) :: Arrow a => (b -> c) -> a c d -> a b d
+f ^>> a = arr f >>> a
+
+(>>^) :: Arrow a => a b c -> (c -> d) -> a b d
+a >>^ f = a >>> arr f
+
+(<<^) :: Arrow a => a c d -> (b -> c) -> a b d
+a <<^ f = a <<< arr f
+
+(^<<) :: Arrow a => (c -> d) -> a b c -> a b d
+f ^<< a = arr f <<< a
+
+class Arrow a => ArrowZero a where
+    zeroArrow :: a b c
+
+instance MonadPlus m => ArrowZero (Kleisli m) where
+    zeroArrow = Kleisli (const mzero)
+
+class ArrowZero a => ArrowPlus a where
+    (<+>) :: a b c -> a b c -> a b c
+
+instance MonadPlus m => ArrowPlus (Kleisli m) where
+    Kleisli f <+> Kleisli g = Kleisli (\x -> f x `mplus` g x)
+
+class Arrow a => ArrowChoice a where
+    left :: a b c -> a (Either b d) (Either c d)
+    left = (+++ id)
+    right :: a b c -> a (Either d b) (Either d c)
+    right = (id +++)
+    (+++) :: a b c -> a b' c' -> a (Either b b') (Either c c')
+    f +++ g = left f >>> arr mirror >>> left g >>> arr mirror
+      where
+        mirror :: Either x y -> Either y x
+        mirror (Left x) = Right x
+        mirror (Right y) = Left y
+    (|||) :: a b d -> a c d -> a (Either b c) d
+    f ||| g = f +++ g >>> arr untag
+      where
+        untag (Left x) = x
+        untag (Right y) = y
+
+instance ArrowChoice (->) where
+    left f = f +++ id
+    right f = id +++ f
+    f +++ g = (Left . f) ||| (Right . g)
+    (|||) = either
+
+instance Monad m => ArrowChoice (Kleisli m) where
+    left f = f +++ arr id
+    right f = arr id +++ f
+    f +++ g = (f >>> arr Left) ||| (g >>> arr Right)
+    Kleisli f ||| Kleisli g = Kleisli (either f g)
+
+class Arrow a => ArrowApply a where
+    app :: a (a b c, b) c
+
+instance ArrowApply (->) where
+    app (f,x) = f x
+
+instance Monad m => ArrowApply (Kleisli m) where
+    app = Kleisli (\(Kleisli f, x) -> f x)
+
+newtype ArrowMonad a b = ArrowMonad (a () b)
+
+instance Arrow a => Functor (ArrowMonad a) where
+    fmap f (ArrowMonad m) = ArrowMonad $ m >>> arr f
+
+instance Arrow a => Applicative (ArrowMonad a) where
+   pure x = ArrowMonad (arr (const x))
+   ArrowMonad f <*> ArrowMonad x = ArrowMonad (f &&& x >>> arr (uncurry id))
+
+instance ArrowApply a => Monad (ArrowMonad a) where
+    ArrowMonad m >>= f = ArrowMonad $
+        m >>> arr (\x -> let ArrowMonad h = f x in (h, ())) >>> app
+
+instance ArrowPlus a => Alternative (ArrowMonad a) where
+   empty = ArrowMonad zeroArrow
+   ArrowMonad x <|> ArrowMonad y = ArrowMonad (x <+> y)
+
+instance (ArrowApply a, ArrowPlus a) => MonadPlus (ArrowMonad a)
+
+leftApp :: ArrowApply a => a b c -> a (Either b d) (Either c d)
+leftApp f = arr ((\b -> (arr (\() -> b) >>> f >>> arr Left, ())) |||
+             (\d -> (arr (\() -> d) >>> arr Right, ()))) >>> app
+
+class Arrow a => ArrowLoop a where
+    loop :: a (b,d) (c,d) -> a b c
+
+instance ArrowLoop (->) where
+    loop f b = let (c,d) = f (b,d) in c
+
+instance MonadFix m => ArrowLoop (Kleisli m) where
+    loop (Kleisli f) = Kleisli (fmap fst . mfix . f')
+      where f' x y = f (x, snd y)
diff --git a/lib/Control/Category.hs b/lib/Control/Category.hs
--- a/lib/Control/Category.hs
+++ b/lib/Control/Category.hs
@@ -1,5 +1,5 @@
 module Control.Category(module Control.Category) where
-import Prelude()
+import qualified Prelude()
 import Primitives
 import qualified Data.Function as F
 
diff --git a/lib/Control/DeepSeq.hs b/lib/Control/DeepSeq.hs
--- a/lib/Control/DeepSeq.hs
+++ b/lib/Control/DeepSeq.hs
@@ -5,12 +5,12 @@
   ($!!),
   (<$!!>),
   rwhnf,
-  rnfNoErr,
-  rnfErr,
+  rnf1,
+  rnf2,
 ) where
-import Prelude()
-import Primitives(primRnfErr, primRnfNoErr)
+import qualified Prelude()
 import Control.Applicative
+import Control.DeepSeq.Class
 import Control.Monad
 import Data.Bool
 import Data.Char
@@ -32,46 +32,15 @@
 import Data.Tuple
 import Data.Word
 
-rnfNoErr :: forall a . a -> ()
-rnfNoErr = primRnfNoErr
-
-rnfErr :: forall a . a -> ()
-rnfErr = primRnfErr
-
-infixr 0 $!!
-
-infixr 0 `deepseq`
-
-deepseq :: NFData a => a -> b -> b
-deepseq a b = rnf a `seq` b
-
-($!!) :: (NFData a) => (a -> b) -> a -> b
-f $!! x = x `deepseq` f x
-
-force :: (NFData a) => a -> a
-force x = x `deepseq` x
+infixl 4 <$!!>
 
 (<$!!>) :: (Monad m, NFData b) => (a -> b) -> m a -> m b
 f <$!!> m = m >>= \x -> pure $!! f x
 
-infixl 4 <$!!>
-
 rwhnf :: a -> ()
-rwhnf = (`seq` ())
-
-class NFData a where
-  rnf :: a -> ()
-  rnf = primRnfErr
+rwhnf a = a `seq` ()
 
-instance NFData Int
-instance NFData Word
-instance NFData Integer
 instance NFData Float
-instance NFData Double
-instance NFData Char
-instance NFData Bool
-instance NFData Ordering
-instance NFData ()
 instance NFData Int8
 instance NFData Int16
 instance NFData Int32
@@ -84,22 +53,13 @@
 instance NFData (Proxy a) where rnf Proxy = ()
 instance NFData1 Proxy where liftRnf _ Proxy = ()
 
-instance NFData a => NFData (Ratio a) where
-  rnf x = rnf (numerator x, denominator x)
-
-instance NFData a => NFData (Maybe a) where
-  rnf = rnf1
 instance NFData1 Maybe where
   liftRnf _ Nothing = ()
   liftRnf rnfa (Just a) = rnfa a
 
-instance NFData a => NFData [a] where
-  rnf = rnf1
 instance NFData1 [] where
   liftRnf rnfa = foldr (\ x r -> rnfa x `seq` r) ()
 
-instance (NFData a, NFData b) => NFData (Either a b) where
-  rnf = rnf2
 instance NFData2 Either where
   liftRnf2 rnfa _ (Left  a) = rnfa a
   liftRnf2 _ rnfb (Right b) = rnfb b
@@ -170,7 +130,7 @@
   liftRnf r = liftRnf (liftRnf r) . getCompose
 
 -- | Note: in @deepseq-1.5.0.0@ this instance's superclasses were changed.
--- 
+--
 -- @since 1.4.3.0
 instance (NFData (f (g a))) => NFData (Compose f g a) where
   rnf (Compose fga) = rnf fga
@@ -181,7 +141,7 @@
   liftRnf rnf0 (Functor.InR r) = liftRnf rnf0 r
 
 -- | Note: in @deepseq-1.5.0.0@ this instance's superclasses were changed.
--- 
+--
 -- @since 1.4.3.0
 instance (NFData (f a), NFData (g a)) => NFData (Functor.Sum f g a) where
   rnf (Functor.InL fa) = rnf fa
@@ -192,7 +152,7 @@
   liftRnf rnf0 (Functor.Pair f g) = liftRnf rnf0 f `seq` liftRnf rnf0 g
 
 -- | Note: in @deepseq-1.5.0.0@ this instance's superclasses were changed.
--- 
+--
 -- @since 1.4.3.0
 instance (NFData (f a), NFData (g a)) => NFData (Functor.Product f g a) where
   rnf (Functor.Pair fa ga) = rnf fa `seq` rnf ga
@@ -517,24 +477,16 @@
 instance NFData a => NFData (Solo a) where
   rnf (MkSolo a) = rnf a
 
-instance (NFData a, NFData b) => NFData (a, b) where rnf (a, b) = rnf a `seq` rnf b
-
-instance
-  (NFData a1, NFData a2, NFData a3) =>
-  NFData (a1, a2, a3)
-  where
+instance (NFData a1, NFData a2, NFData a3) =>
+         NFData (a1, a2, a3) where
   rnf (a1, a2, a3) = rnf a1 `seq` rnf a2 `seq` rnf a3
 
-instance
-  (NFData a1, NFData a2, NFData a3, NFData a4) =>
-  NFData (a1, a2, a3, a4)
-  where
+instance (NFData a1, NFData a2, NFData a3, NFData a4) =>
+         NFData (a1, a2, a3, a4) where
   rnf (a1, a2, a3, a4) = rnf a1 `seq` rnf a2 `seq` rnf a3 `seq` rnf a4
 
-instance
-  (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) =>
-  NFData (a1, a2, a3, a4, a5)
-  where
+instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) =>
+         NFData (a1, a2, a3, a4, a5) where
   rnf (a1, a2, a3, a4, a5) = rnf a1 `seq` rnf a2 `seq` rnf a3 `seq` rnf a4 `seq` rnf a5
 
 ----------------------------------------------------------------------------
@@ -552,5 +504,3 @@
 
 rnf2 :: (NFData2 p, NFData a, NFData b) => p a b -> ()
 rnf2 = liftRnf2 rnf rnf
-
-
diff --git a/lib/Control/DeepSeq/Class.hs b/lib/Control/DeepSeq/Class.hs
new file mode 100644
--- /dev/null
+++ b/lib/Control/DeepSeq/Class.hs
@@ -0,0 +1,68 @@
+-- Copyright 2025 Lennart Augustsson
+-- See LICENSE file for full license.
+module Control.DeepSeq.Class(module Control.DeepSeq.Class) where
+import qualified Prelude()
+import Primitives(primSeq)
+import Data.Bool
+import Data.Char
+import Data.Eq
+import Data.Double
+import Data.Either
+import Data.Function
+import Data.Int
+import Data.Integer
+import Data.Integral
+import Data.List_Type
+import Data.Maybe_Type
+import Data.Ord
+import Data.Ratio
+import Data.Tuple
+import Data.Word
+import Mhs.Builtin
+
+-- NFData class and instances for primitive types.
+
+class NFData a where
+  rnf :: a -> ()
+  rnf a = seq a ()
+
+infixr 0 `deepseq`
+deepseq :: NFData a => a -> b -> b
+deepseq a b = rnf a `seq` b
+
+infixr 0 $!!
+($!!) :: (NFData a) => (a -> b) -> a -> b
+f $!! x = x `deepseq` f x
+
+force :: (NFData a) => a -> a
+force x = x `deepseq` x
+
+instance NFData Int
+instance NFData Word
+instance NFData Double
+instance NFData Char
+instance NFData Bool
+instance NFData Ordering
+instance NFData ()
+
+instance NFData Integer where
+  rnf x = (x == 0) `seq` ()
+
+instance NFData a => NFData (Ratio a) where
+  rnf x = rnf (numerator x, denominator x)
+
+instance NFData a => NFData (Maybe a) where
+  rnf Nothing = ()
+  rnf (Just a) = rnf a
+
+instance NFData a => NFData [a] where
+  rnf [] = ()
+  rnf (x:xs) = rnf x `seq` rnf xs
+
+instance (NFData a, NFData b) => NFData (Either a b) where
+  rnf (Left a) = rnf a
+  rnf (Right b) = rnf b
+
+instance (NFData a, NFData b) => NFData (a, b) where
+  rnf (a, b) = rnf a `seq` rnf b
+
diff --git a/lib/Control/Error.hs b/lib/Control/Error.hs
--- a/lib/Control/Error.hs
+++ b/lib/Control/Error.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Control.Error(error, errorWithoutStackTrace, undefined, ErrorCall(..)) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Data.Char_Type
 import Data.List_Type
 import Control.Exception.Internal
@@ -24,4 +24,4 @@
 
 -- GHC compatibility
 errorWithoutStackTrace :: forall a . String -> a
-errorWithoutStackTrace s = throw (ErrorCall s)
+errorWithoutStackTrace = error
diff --git a/lib/Control/Error.hs-boot b/lib/Control/Error.hs-boot
--- a/lib/Control/Error.hs-boot
+++ b/lib/Control/Error.hs-boot
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Control.Error(module Control.Error) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Data.Char_Type
 
 error :: forall a . String -> a
diff --git a/lib/Control/Exception.hs b/lib/Control/Exception.hs
--- a/lib/Control/Exception.hs
+++ b/lib/Control/Exception.hs
@@ -22,22 +22,11 @@
   --
   ArithException(..),
   ) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Control.Exception.Internal
 import {-# SOURCE #-} Data.Typeable
 import System.IO.Unsafe
 
-instance Show SomeException where
-  showsPrec p (SomeException e) = showsPrec p e
-
--- NOTE: The runtime system knows about this instance.
--- It uses displayException to show an uncaught exception.
--- Any changes here must be reflected in eval.c
-instance Exception SomeException where
-  toException se = se
-  fromException = Just
-  displayException (SomeException e) = displayException e
-
 -- This is the function called by the runtime.
 -- It compiles to
 --    (U (U (K2 A)))
@@ -57,9 +46,7 @@
 catchesHandler :: [Handler a] -> SomeException -> IO a
 catchesHandler handlers e = foldr tryHandler (throw e) handlers
     where tryHandler (Handler handler) res
-              = case fromException e of
-                Just e' -> handler e'
-                Nothing -> res
+              = maybe res handler (fromException e)
 
 --------------------------
 
@@ -83,7 +70,7 @@
 mapException :: (Exception e1, Exception e2) => (e1 -> e2) -> a -> a
 mapException f v =
   unsafePerformIO (catch (evaluate v)
-                         (\x -> throwIO (f x)))
+                         (throwIO . f))
 
 -- Evaluate a when executed, not when evaluated
 evaluate :: a -> IO a
@@ -92,16 +79,7 @@
 try :: forall a e . Exception e => IO a -> IO (Either e a)
 try ioa = catch (fmap Right ioa) (return . Left)
 
--- Throw an exception when executed, not when evaluated
-throwIO :: forall a e . Exception e => e -> IO a
-throwIO e = bad >> bad   -- we never reacj the second 'bad'
-  where bad = throw e
-
-onException :: IO a -> IO b -> IO a
-onException io what =
-  io `catch` \ e -> do _ <- what
-                       throwIO (e :: SomeException)
-
+{-
 bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
 bracket before after thing =
   mask $ \ restore -> do
@@ -109,6 +87,7 @@
     r <- restore (thing a) `onException` after a
     _ <- after a
     return r
+-}
 
 finally :: IO a -> IO b -> IO a
 finally a sequel =
@@ -125,10 +104,6 @@
   mask $ \ restore -> do
     a <- before
     restore (thing a) `onException` after a
-
--- XXX we don't have masks yet
-mask :: ((forall a. IO a -> IO a) -> IO b) -> IO b
-mask io = io id
 
 -------------------
 
diff --git a/lib/Control/Exception/Internal.hs b/lib/Control/Exception/Internal.hs
--- a/lib/Control/Exception/Internal.hs
+++ b/lib/Control/Exception/Internal.hs
@@ -2,13 +2,15 @@
 -- See LICENSE file for full license.
 module Control.Exception.Internal(
   throw, catch,
+  mask,
+  onException, throwIO, bracket,
   Exception(..),
   SomeException(..),
   PatternMatchFail, NoMethodError, RecSelError, RecConError(..),
   patternMatchFail, noMethodError, recSelError, recConError,
   ) where
-import Prelude()
-import Primitives(IO)
+import qualified Prelude()
+import Primitives(IO, primThen, primBind, primReturn)
 import Data.Char_Type
 import Data.List_Type
 import Data.Maybe_Type
@@ -34,6 +36,28 @@
                        Just e' -> handler e'
                        Nothing -> primRaise e
 
+-- Throw an exception when executed, not when evaluated
+throwIO :: forall a e . Exception e => e -> IO a
+throwIO e = bad `primThen` bad   -- we never reach the second 'bad'
+  where bad = throw e
+
+onException :: IO a -> IO b -> IO a
+onException io what =
+  io `catch` \ e -> what `primThen` throwIO (e :: SomeException)
+
+bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
+bracket before after thing =
+  mask (\ restore ->
+    before `primBind` (\ a ->
+    (restore (thing a) `onException` after a) `primBind` (\ r ->
+    after a `primThen`
+    primReturn r
+    )))
+
+-- XXX we don't have masks yet
+mask :: ((forall a. IO a -> IO a) -> IO b) -> IO b
+mask io = io (\ x -> x)
+
 ------------------
 
 data SomeException = forall e . Exception e => SomeException e
@@ -50,6 +74,17 @@
     toException = SomeException
     fromException (SomeException e) = cast e
     displayException = show
+
+instance Show SomeException where
+  showsPrec p (SomeException e) = showsPrec p e
+
+-- NOTE: The runtime system knows about this instance.
+-- It uses displayException to show an uncaught exception.
+-- Any changes here must be reflected in eval.c
+instance Exception SomeException where
+  toException se = se
+  fromException = Just
+  displayException (SomeException e) = displayException e
 
 ------------------
 
diff --git a/lib/Control/Monad.hs b/lib/Control/Monad.hs
--- a/lib/Control/Monad.hs
+++ b/lib/Control/Monad.hs
@@ -36,7 +36,7 @@
   liftM5,
   ap,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives  -- for fixity
 import Control.Applicative
 import Control.Error
@@ -55,7 +55,7 @@
 class (Applicative m) => Monad m where
   (>>=)  :: forall a b . m a -> (a -> m b) -> m b
   (>>)   :: forall a b . m a -> m b -> m b
-  ma >> mb = ma >>= \ _ -> mb
+  ma >> mb = ma >>= const mb
 
   -- Maybe remove this
   return :: forall a . a -> m a
@@ -135,7 +135,7 @@
 foldM = foldlM
 
 foldM_ :: forall m a b . (Monad m) => (b -> a -> m b) -> b -> [a] -> m ()
-foldM_ f a xs  = foldlM f a xs >> return ()
+foldM_ f a xs  = void (foldlM f a xs)
 
 foldlM :: forall m a b . (Monad m) => (b -> a -> m b) -> b -> [a] -> m b
 foldlM _ z [] = pure z
@@ -155,7 +155,7 @@
   where
     loop cnt =
       if cnt <= (0::Int) then pure ()
-      else f *> (loop (cnt `primIntSub` 1))
+      else f *> loop (cnt `primIntSub` 1)
 
 -----
 
@@ -168,7 +168,7 @@
 -----
 
 liftM :: forall m r a1 . (Monad m) => (a1 -> r) -> m a1 -> m r
-liftM f m1 = do { x1 <- m1; return (f x1) }
+liftM f m1 = f <$> m1
 liftM2 :: forall m r a1 a2 . (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
 liftM2 f m1 m2 = do { x1 <- m1; x2 <- m2; return (f x1 x2) }
 liftM3 :: forall m r a1 a2 a3 . (Monad m) => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
@@ -228,8 +228,7 @@
   mplus = (++)
 
 msum :: forall m a . (MonadPlus m) => [m a] -> m a
-msum [] = mzero
-msum (ma:mas) = ma `mplus` msum mas
+msum = foldr mplus mzero
 
 mfilter :: forall m a . (MonadPlus m) => (a -> Bool) -> m a -> m a
 mfilter p ma = do
diff --git a/lib/Control/Monad/Fail.hs b/lib/Control/Monad/Fail.hs
--- a/lib/Control/Monad/Fail.hs
+++ b/lib/Control/Monad/Fail.hs
@@ -1,5 +1,5 @@
 module Control.Monad.Fail(MonadFail(..)) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Applicative
 import Control.Error
diff --git a/lib/Control/Monad/Fix.hs b/lib/Control/Monad/Fix.hs
--- a/lib/Control/Monad/Fix.hs
+++ b/lib/Control/Monad/Fix.hs
@@ -4,12 +4,13 @@
   ) where
 import Control.Monad
 import Data.Function(fix)
+import Data.Functor.Identity
 import Data.List.NonEmpty(NonEmpty(..))
 import Data.Monoid.Internal
 import Data.Tuple
 
 class (Monad m) => MonadFix m where
-        mfix :: (a -> m a) -> m a
+  mfix :: (a -> m a) -> m a
 
 {-
 instance MonadFix Solo where
@@ -37,14 +38,17 @@
 --    mfix = fixIO
 
 instance MonadFix ((->) r) where
-    mfix f = \ r -> let a = f a r in a
+  mfix f r = let a = f a r in a
 
-{-
+instance MonadFix Identity where
+  mfix f = let a = f (runIdentity a) in a
+
 instance MonadFix (Either e) where
     mfix f = let a = f (unRight a) in a
              where unRight (Right x) = x
                    unRight (Left  _) = error "mfix Either: Left"
 
+{-
 instance MonadFix (ST s) where
         mfix = fixST
 
diff --git a/lib/Control/Monad/IO/Class.hs b/lib/Control/Monad/IO/Class.hs
--- a/lib/Control/Monad/IO/Class.hs
+++ b/lib/Control/Monad/IO/Class.hs
@@ -1,5 +1,5 @@
 module Control.Monad.IO.Class (MonadIO(..)) where
-import Prelude()
+import qualified Prelude()
 import Data.Char
 import Control.Applicative
 import Control.Monad
diff --git a/lib/Control/Monad/ST.hs b/lib/Control/Monad/ST.hs
--- a/lib/Control/Monad/ST.hs
+++ b/lib/Control/Monad/ST.hs
@@ -2,7 +2,7 @@
   ST,
   runST,
   ) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Primitives(primPerformIO)
 import Control.Monad.ST_Type
 
diff --git a/lib/Control/Monad/ST_Type.hs b/lib/Control/Monad/ST_Type.hs
--- a/lib/Control/Monad/ST_Type.hs
+++ b/lib/Control/Monad/ST_Type.hs
@@ -2,7 +2,7 @@
 module Control.Monad.ST_Type(
   ST(..), unST,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives(IO)
 import {-# SOURCE #-} Data.Typeable
 
diff --git a/lib/Control/Monad/Zip.hs b/lib/Control/Monad/Zip.hs
--- a/lib/Control/Monad/Zip.hs
+++ b/lib/Control/Monad/Zip.hs
@@ -1,6 +1,3 @@
-{-# LANGUAGE Safe #-}
-{-# LANGUAGE TypeOperators #-}
-
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Control.Monad.Zip
@@ -43,10 +40,10 @@
     mzip = mzipWith (,)
 
     mzipWith :: (a -> b -> c) -> m a -> m b -> m c
-    mzipWith f ma mb = liftM (uncurry f) (mzip ma mb)
+    mzipWith f ma mb = fmap (uncurry f) (mzip ma mb)
 
     munzip :: m (a,b) -> (m a, m b)
-    munzip mab = (liftM fst mab, liftM snd mab)
+    munzip mab = (fmap fst mab, fmap snd mab)
     -- munzip is a member of the class because sometimes
     -- you can implement it more efficiently than the
     -- above default code.  See #4370 comment by giorgidze
diff --git a/lib/Data/Array.hs b/lib/Data/Array.hs
--- a/lib/Data/Array.hs
+++ b/lib/Data/Array.hs
@@ -13,7 +13,7 @@
     accum,
     ixmap,
   ) where
-import Prelude()
+import qualified Prelude()
 import Primitives(primPerformIO, primArrCopy, primArrEQ)
 import Control.Error
 import Control.Monad
@@ -29,6 +29,7 @@
 import Data.List
 import Data.Num
 import Data.Ord
+import Data.Tuple
 import System.IO
 import Text.Show
 
@@ -65,7 +66,7 @@
 listArray  :: (Ix a) => (a,a) -> [b] -> Array a b
 listArray b es =
   let n = safeRangeSize b
-  in  if length es > n then error "listArray: list too long" else unsafeArray' b n (zip [0..] es)  
+  in  if length es > n then error "listArray: list too long" else unsafeArray' b n (zip [0..] es)
 
 accumArray :: (Ix a) => (b -> c -> b) -> b -> (a,a) -> [(a,c)] -> Array a b
 accumArray f z b = accum f (array b [(i, z) | i <- range b])
@@ -113,7 +114,7 @@
 unsafeArray' :: (i,i) -> Int -> [(Int, e)] -> Array i e
 unsafeArray' b n ies = primPerformIO $ do
   a <- newIOArray n arrEleBottom
-  mapM_ (\ (i, e) -> writeIOArray a i e) ies
+  mapM_ (uncurry (writeIOArray a)) ies
   return $ Array b n a
 
 arrEleBottom :: a
diff --git a/lib/Data/Bits.hs b/lib/Data/Bits.hs
--- a/lib/Data/Bits.hs
+++ b/lib/Data/Bits.hs
@@ -1,5 +1,5 @@
 module Data.Bits(module Data.Bits) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Error
 import Data.Bool
@@ -36,6 +36,7 @@
   popCount          :: a -> Int
   bitSizeMaybe      :: a -> Maybe Int
   bitSize           :: a -> Int
+  isSigned          :: a -> Bool
 
   x `shift`   i | i<0       = x `shiftR` (- i)
                 | i>0       = x `shiftL` i
@@ -129,6 +130,7 @@
   testBit = testBitDefault
   popCount = primIntPopcount
   zeroBits = 0
+  isSigned _ = True
 
 instance FiniteBits Int where
   finiteBitSize _ = _wordSize
diff --git a/lib/Data/Bool.hs b/lib/Data/Bool.hs
--- a/lib/Data/Bool.hs
+++ b/lib/Data/Bool.hs
@@ -4,7 +4,7 @@
   module Data.Bool,
   module Data.Bool_Type
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Bool_Type
 import Data.Bounded
diff --git a/lib/Data/Bool_Type.hs b/lib/Data/Bool_Type.hs
--- a/lib/Data/Bool_Type.hs
+++ b/lib/Data/Bool_Type.hs
@@ -1,5 +1,5 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Bool_Type(module Data.Bool_Type) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 data Bool = False | True
diff --git a/lib/Data/Bounded.hs b/lib/Data/Bounded.hs
--- a/lib/Data/Bounded.hs
+++ b/lib/Data/Bounded.hs
@@ -1,5 +1,5 @@
 module Data.Bounded(module Data.Bounded) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 
 class Bounded a where
diff --git a/lib/Data/ByteString.hs b/lib/Data/ByteString.hs
--- a/lib/Data/ByteString.hs
+++ b/lib/Data/ByteString.hs
@@ -130,7 +130,7 @@
   useAsCStringLen,
 
   -- * I\/O with 'ByteString's
-  
+
   -- ** Standard input and output
   getLine,
   getContents,
@@ -152,27 +152,30 @@
   hPutNonBlocking,
   hPutStr,
   ) where
-import Prelude(Bool(..), Int, Char, Ordering, FilePath, IO, Maybe(..), [](..), String,
-               Eq(..), Ord(..), Show(..), Num(..), Monad(..), Functor(..),
-               (.), ($), Enum(..), (||), (&&), not, otherwise, (!!), fst, snd)
-import qualified Prelude as P
+import qualified Prelude()
+import MiniPrelude as P hiding(null, length)
 import qualified Data.List as P
-import Data.List.NonEmpty(NonEmpty, fromList)
+import Control.Exception (evaluate)
+import Data.List.NonEmpty (NonEmpty, fromList)
 import Data.Bits
+import Data.Function (($!))
 import Data.Monoid.Internal
 import Data.Semigroup
 import Data.String
-import Data.Word(Word8)
-import Foreign.C.String(CString, CStringLen)
-import System.IO(Handle, IOMode(..), stdin, stdout)
+import Data.Word (Word8)
+import Foreign.C.String (CString, CStringLen)
+import Foreign.C.Types (CChar)
+import Foreign.Ptr (Ptr)
+import System.IO (Handle, IOMode(..), hClose, openFile, stdin, stdout)
 import qualified System.IO as P
+import System.IO.Internal (BFILE, withHandleRd, withHandleWr)
 import Foreign.ForeignPtr
 import Data.ByteString.Internal
 
-type StrictByteString = ByteString
+foreign import ccall "readb" c_readb :: CString -> Int -> Ptr BFILE -> IO Int
+foreign import ccall "writeb" c_writeb :: CString -> Int -> Ptr BFILE -> IO Int
 
-primBS2FPtr   :: ByteString -> ForeignPtr Char
-primBS2FPtr   = _primitive "I"  -- same representation
+type StrictByteString = ByteString
 
 bsUnimp :: String -> a
 bsUnimp s = P.error $ "Data.ByteString." P.++ s P.++ " unimplemented"
@@ -201,7 +204,9 @@
 snoc bs c = append bs (pack [c])
 
 head :: ByteString -> Word8
-head = P.head . unpack
+head bs
+  | null bs = bsError "head: empty"
+  | otherwise = primBSindex bs 0
 
 tail :: ByteString -> ByteString
 tail bs | sz == 0 = bsError "tail: empty"
@@ -213,7 +218,9 @@
           | otherwise = Just (head bs, tail bs)
 
 last :: ByteString -> Word8
-last = P.last . unpack
+last bs
+  | null bs = bsError "last: empty"
+  | otherwise = primBSindex bs (length bs - 1)
 
 init :: ByteString -> ByteString
 init bs | sz == 0 = bsError "init: empty"
@@ -315,7 +322,7 @@
 scanr1 f = pack . P.scanr1 f . unpack
 
 replicate :: Int -> Word8 -> ByteString
-replicate w = pack . P.replicate w
+replicate = primBSreplicate
 
 unfoldr :: (a -> Maybe (Word8, a)) -> a -> ByteString
 unfoldr f = pack . P.unfoldr f
@@ -340,7 +347,7 @@
   | otherwise = substr bs (l - n) n
   where l = length bs
 
-drop  :: Int -> ByteString -> ByteString
+drop :: Int -> ByteString -> ByteString
 drop n bs
   | n <= 0    = bs
   | n >= l    = empty
@@ -397,10 +404,15 @@
 intercalate s = pack . P.intercalate (unpack s) . P.map unpack
 
 index :: ByteString -> Int -> Word8
-index bs n = unpack bs !! n
+index bs i
+  | i < 0          = bsError "index: negative index"
+  | i >= length bs = bsError "index: index too large"
+  | otherwise      = primBSindex bs i
 
 indexMaybe :: ByteString -> Int -> Maybe Word8
-indexMaybe bs n = unpack bs P.!? n
+indexMaybe bs i
+  | i < 0 || i >= length bs = Nothing
+  | otherwise               = Just (primBSindex bs i)
 
 (!?) :: ByteString -> Int -> Maybe Word8
 (!?) = indexMaybe
@@ -462,12 +474,18 @@
 isValidUtf8 = validUtf8 . unpack
   where
     validUtf8 :: [Word8] -> Bool
-    validUtf8 []                                                                                  = True
-    validUtf8 (x1                : xs) | mask x1 0x80 0x00                                        = validUtf8 xs
-    validUtf8 (x1 : x2           : xs) | mask x1 0xe0 0xc0 && mask80 x2                           = validUtf8 xs
-    validUtf8 (x1 : x2 : x3      : xs) | mask x1 0xf0 0xe0 && mask80 x2 && mask80 x3              = validUtf8 xs
-    validUtf8 (x1 : x2 : x3 : x4 : xs) | mask x1 0xf8 0xf0 && mask80 x2 && mask80 x3 && mask80 x4 = validUtf8 xs
-    validUtf8 _                                                                                   = False
+    validUtf8 []
+      = True
+    validUtf8 (x1                : xs) | mask x1 0x80 0x00
+      = validUtf8 xs
+    validUtf8 (x1 : x2           : xs) | mask x1 0xe0 0xc0 && mask80 x2
+      = x1 > 0xc1 && validUtf8 xs
+    validUtf8 (x1 : x2 : x3      : xs) | mask x1 0xf0 0xe0 && mask80 x2 && mask80 x3
+      = if x1 == 0xe0 then x2 > 0x9f && validUtf8 xs else if x1 == 0xed then x2 < 0xa0 && validUtf8 xs else validUtf8 xs
+    validUtf8 (x1 : x2 : x3 : x4 : xs) | mask x1 0xf8 0xf0 && mask80 x2 && mask80 x3 && mask80 x4
+      = if x1 == 0xf0 then x2 > 0x8f && validUtf8 xs else if x1 < 0xf4 then validUtf8 xs else x1 == 0xf4 && x2 <= 0x8f && validUtf8 xs
+    validUtf8 _
+      = False
     mask :: Word8 -> Word8 -> Word8 -> Bool
     mask x m b = x .&. m == b
     mask80 :: Word8 -> Bool
@@ -476,7 +494,12 @@
 breakSubstring :: ByteString -- ^ String to search for
                -> ByteString -- ^ String to search in
                -> (ByteString,ByteString) -- ^ Head and tail of string broken at substring
-breakSubstring pat = bsUnimp "breakSubstring"
+breakSubstring pat str
+  | length pat > length str = (str, empty)
+  | otherwise =
+    case P.findIndex (P.isPrefixOf (unpack pat)) (P.tails (unpack str)) of
+      Nothing -> (str, empty)
+      Just i -> splitAt i str
 
 zip :: ByteString -> ByteString -> [(Word8,Word8)]
 zip ps qs = P.zip (unpack ps) (unpack qs)
@@ -511,13 +534,13 @@
 
 useAsCStringLen :: ByteString -> (CStringLen -> IO a) -> IO a
 useAsCStringLen bs act =
-  withForeignPtr (primBS2FPtr bs) $ \ p -> act (p, length bs)
+  withForeignPtr (primBS2FPtr bs) $ \p -> act (p, length bs)
 
 packCString :: CString -> IO ByteString
-packCString cstr = bsUnimp "packCString"
+packCString = primPackCString
 
 packCStringLen :: CStringLen -> IO ByteString
-packCStringLen = bsUnimp "packCStringLen"
+packCStringLen (cstr, len) = primPackCStringLen cstr len
 
 copy :: ByteString -> ByteString
 copy = append empty
@@ -529,7 +552,11 @@
 hGetLine = fmap fromString . P.hGetLine
 
 hPut :: Handle -> ByteString -> IO ()
-hPut h = P.hPutStr h . toString
+hPut h bs =
+  withHandleWr h $ \bfile ->
+    useAsCStringLen bs $ \(cstr, len) ->
+      void (c_writeb cstr len bfile)
+      -- XXX: flush if not BlockBuffering
 
 hPutNonBlocking :: Handle -> ByteString -> IO ByteString
 hPutNonBlocking = bsUnimp "hPutNonBlocking"
@@ -541,7 +568,11 @@
 putStr = hPut stdout
 
 hGet :: Handle -> Int -> IO ByteString
-hGet h i = bsUnimp "hGet"
+hGet h i =
+  withHandleRd h $ \bfile -> do
+    fp <- mallocForeignPtrBytes i
+    bytesRead <- withForeignPtr fp $ \buf -> c_readb buf i bfile
+    return $! primFPtr2BS fp bytesRead
 
 hGetNonBlocking :: Handle -> Int -> IO ByteString
 hGetNonBlocking h i = bsUnimp "hGetNonBlocking"
@@ -550,7 +581,20 @@
 hGetSome h i = bsUnimp "hGetSome"
 
 hGetContents :: Handle -> IO ByteString
-hGetContents = fmap fromString . P.hGetContents
+hGetContents h =
+  withHandleRd h $ \bfile -> do
+    let
+      readChunks chunkSize chunks = do
+        fp <- mallocForeignPtrBytes chunkSize
+        bytesRead <- withForeignPtr fp $ \buf -> c_readb buf chunkSize bfile
+        if bytesRead < chunkSize then
+          -- EOF
+          evaluate $ chunks `append` primFPtr2BS fp bytesRead
+        else
+          readChunks (chunkSize * 2) (chunks `append` primFPtr2BS fp bytesRead)
+    bs <- readChunks 1024 empty
+    hClose h
+    return bs
 
 getContents :: IO ByteString
 getContents = hGetContents stdin
@@ -559,10 +603,18 @@
 interact transformer = getContents >>= putStr . transformer
 
 readFile :: FilePath -> IO ByteString
-readFile = fmap fromString . P.readFile
+readFile f = do
+  h <- openFile f ReadMode
+  hGetContents h
 
 writeFile :: FilePath -> ByteString -> IO ()
-writeFile f = P.writeFile f . toString
+writeFile f bs = do
+  h <- openFile f WriteMode
+  hPut h bs
+  hClose h
 
 appendFile :: FilePath -> ByteString -> IO ()
-appendFile f = P.appendFile f . toString
+appendFile f bs = do
+  h <- openFile f AppendMode
+  hPut h bs
+  hClose h
diff --git a/lib/Data/ByteString/Internal.hs b/lib/Data/ByteString/Internal.hs
--- a/lib/Data/ByteString/Internal.hs
+++ b/lib/Data/ByteString/Internal.hs
@@ -1,13 +1,27 @@
 module Data.ByteString.Internal(module Data.ByteString.Internal) where
-import Prelude(); import MiniPrelude hiding(length)
-import Data.Word(Word8)
+import qualified Prelude()
+import Primitives
+import Control.DeepSeq.Class
+import Control.Error
+import Data.Bool
+import Data.Enum
+import Data.Eq
+import Data.Function
+import Data.Int
+import Data.List (map)
+import Data.List_Type
+import Data.Monoid.Internal
+import Data.Num
+import Data.Ord
+import Data.String
+import Data.Word (Word8)
+import Foreign.C.Types (CChar)
+import Text.Show
 
 data ByteString  -- primitive type
 
 primBSappend  :: ByteString -> ByteString -> ByteString
 primBSappend  = _primitive "bs++"
-primBSappend3 :: ByteString -> ByteString -> ByteString -> ByteString
-primBSappend3 = _primitive "bs+++"
 primBSEQ      :: ByteString -> ByteString -> Bool
 primBSEQ      = _primitive "bs=="
 primBSNE      :: ByteString -> ByteString -> Bool
@@ -30,9 +44,28 @@
 primBSlength  = _primitive "bslength"
 primBSsubstr  :: ByteString -> Int -> Int -> ByteString
 primBSsubstr  = _primitive "bssubstr"
+primBSindex   :: ByteString -> Int -> Word8
+primBSindex   = _primitive "bsindex"
+primBSreplicate :: Int -> Word8 -> ByteString
+primBSreplicate = _primitive "bsreplicate"
 
+primPackCString :: Ptr CChar -> IO ByteString
+primPackCString = _primitive "packCString"
+primPackCStringLen :: Ptr CChar -> Int -> IO ByteString
+primPackCStringLen = _primitive "packCStringLen"
+
+primBS2FPtr :: ByteString -> ForeignPtr CChar
+primBS2FPtr = _primitive "bs2fp"
+
+-- Warning: This function modifies the `ForeignPtr`,
+-- avoid using the `ForeignPtr` after calling `primFPtr2BS`.
+primFPtr2BS :: ForeignPtr CChar -> Int -> ByteString
+primFPtr2BS = _primitive "fp2bs"
+
 -----------------------------------------
 
+instance NFData ByteString
+
 instance Eq ByteString where
   (==) = primBSEQ
   (/=) = primBSNE
@@ -73,8 +106,8 @@
 
 substr :: ByteString -> Int -> Int -> ByteString
 substr bs offs len
-  | offs < 0 || offs > sz     = bsError "substr bad offset"
-  | len < 0  || len > sz-offs = bsError "substr bad length"
+  | offs < 0 || offs > sz     = bsError "substr: bad offset"
+  | len < 0  || len > sz-offs = bsError "substr: bad length"
   | otherwise = primBSsubstr bs offs len
   where sz = length bs
 
diff --git a/lib/Data/Char.hs b/lib/Data/Char.hs
--- a/lib/Data/Char.hs
+++ b/lib/Data/Char.hs
@@ -1,21 +1,44 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Char(
-  module Data.Char,
-  module Data.Char_Type       -- exports Char and String
+  Char, String,
+  chr, ord,
+  isLower, isUpper,
+  isAsciiLower, isAsciiUpper,
+  isAlpha, isLetter, isAlphaNum,
+  isDigit, isOctDigit, isHexDigit,
+  isNumber,
+  isSymbol, isPunctuation,
+  isSpace,
+  isControl,
+  U.isMark,
+  isSeparator,
+  isAscii, isLatin1,
+  isPrint,
+  U.GeneralCategory(..),
+  U.generalCategory,
+  digitToInt,
+  intToDigit,
+  toLower, toUpper, toTitle,
+  showLitChar,
+  -- lexLitChar, readLitChar,
+  -- XXX For now, don't import Text.Read, it's a bloated beast.
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Error
 import Data.Bool
 import Data.Bounded
 import Data.Char_Type
+import {-# SOURCE #-} qualified Data.Char.Unicode as U
 import Data.Eq
 import Data.Function
 import Data.Int
 import Data.List_Type
 import Data.Num
 import Data.Ord
+--import {-# SOURCE #-} Text.Read.Internal (lexLitChar, readLitChar)
+-- XXX For now, don't import Text.Read, it's a bloated beast.
 import Text.Show
 
 instance Eq Char where
@@ -40,96 +63,177 @@
   x >  y  =  case primStringCompare x y of { GT -> True; _ -> False }
   x >= y  =  case primStringCompare x y of { LT -> False; _ -> True }
 
-
 instance Bounded Char where
-  minBound = chr 0
-  maxBound = chr 0x10ffff
+  minBound = primChr 0
+  maxBound = primChr 0x10ffff
 
 chr :: Int -> Char
-chr = primChr
+chr i
+  | primIntToWord i `primWordLE` 0x10ffff = primChr i
+  | otherwise = error "Data.Char.chr: invalid codepoint"
 
 ord :: Char -> Int
 ord = primOrd
 
 isLower :: Char -> Bool
-isLower c = (primCharLE 'a' c) && (primCharLE c 'z')
+isLower c =
+  if primCharLE c '\177' then
+     isAsciiLower c
+  else
+     U.isLower c
 
 isAsciiLower :: Char -> Bool
-isAsciiLower = isLower
+isAsciiLower c = 'a' <= c && c <= 'z'
 
 isUpper :: Char -> Bool
-isUpper c = (primCharLE 'A' c) && (primCharLE c 'Z')
+isUpper c =
+  if isAscii c then
+    isAsciiUpper c
+  else
+    U.isUpper c
 
 isAsciiUpper :: Char -> Bool
-isAsciiUpper = isUpper
+isAsciiUpper c = 'A' <= c && c <= 'Z'
 
 isAlpha :: Char -> Bool
-isAlpha c = isLower c || isUpper c
+isAlpha c =
+  if isAscii c then
+    isLower c || isUpper c
+  else
+    U.isAlpha c
 
+isLetter :: Char -> Bool
+isLetter = isAlpha
+
 isDigit :: Char -> Bool
-isDigit c = (primCharLE '0' c) && (primCharLE c '9')
+isDigit c = '0' <= c && c <= '9'
 
 isOctDigit :: Char -> Bool
-isOctDigit c = (primCharLE '0' c) && (primCharLE c '7')
+isOctDigit c = '0' <= c && c <= '7'
 
 isHexDigit :: Char -> Bool
-isHexDigit c = isDigit c || (primCharLE 'a' c && primCharLE c 'f') || (primCharLE 'A' c && primCharLE c 'F') 
+isHexDigit c = isDigit c || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')
 
 isAlphaNum :: Char -> Bool
-isAlphaNum c = isAlpha c || isDigit c
+isAlphaNum c =
+  if isAscii c then
+    isAlpha c || isDigit c
+  else
+    U.isAlphaNum c
 
+isNumber :: Char -> Bool
+isNumber c =
+  if isAscii c then
+    isDigit c
+  else
+    U.isNumber c
+
+isSymbol :: Char -> Bool
+isSymbol c =
+ if isAscii c then
+   c `xelem` "$+<=>^`|~"
+ else
+   U.isSymbol c
+
+isPunctuation :: Char -> Bool
+isPunctuation c =
+  if isAscii c then
+    c `xelem` "!\"#%&'()*,-./:;?@[\\]_{}"
+  else
+    U.isPunctuation c
+
+-- Don't want to import Data.List
+xelem :: Char -> [Char] -> Bool
+xelem _ [] = False
+xelem d (c:cs) = d == c || xelem d cs
+
 isPrint :: Char -> Bool
-isPrint c = primCharLE ' ' c && primCharLE c '~'
+isPrint c =
+  if isAscii c then
+    ' ' <= c && c <= '~'
+  else
+    U.isPrint c
 
 isSpace :: Char -> Bool
-isSpace c = c == ' ' || c == '\t' || c == '\n'
-
-isAscii :: Char -> Bool
-isAscii c = c <= '\127'
+isSpace c =
+  if isAscii c then
+    c `xelem` " \t\n\v\f\r"
+  else
+    U.isSpace c
 
 isControl :: Char -> Bool
 isControl c = c <= '\31' || c == '\127'
 
-isLetter :: Char -> Bool
-isLetter = isAlpha
+isSeparator :: Char -> Bool
+isSeparator c =
+  if isAscii c then
+    c == ' '
+  else
+    U.isSeparator c
 
+isAscii :: Char -> Bool
+isAscii c = c <= '\127'
+
+isLatin1 :: Char -> Bool
+isLatin1 c = c <= '\255'
+
 digitToInt :: Char -> Int
-digitToInt c | (primCharLE '0' c) && (primCharLE c '9') = ord c - ord '0'
-             | (primCharLE 'a' c) && (primCharLE c 'f') = ord c - (ord 'a' - 10)
-             | (primCharLE 'A' c) && (primCharLE c 'F') = ord c - (ord 'A' - 10)
-             | otherwise                                = error "digitToInt"
+digitToInt c | primCharLE '0' c && primCharLE c '9' = ord c - ord '0'
+             | primCharLE 'a' c && primCharLE c 'f' = ord c - (ord 'a' - 10)
+             | primCharLE 'A' c && primCharLE c 'F' = ord c - (ord 'A' - 10)
+             | otherwise                            = error "digitToInt"
 
 intToDigit :: Int -> Char
-intToDigit i | i < 10 = chr (ord '0' + i)
-             | otherwise = chr (ord 'A' - 10 + i)
+intToDigit i | i < 10 = primChr (ord '0' + i)
+             | otherwise = primChr (ord 'A' - 10 + i)
 
 toLower :: Char -> Char
-toLower c | primCharLE 'A' c && primCharLE c 'Z' = chr (ord c - ord 'A' + ord 'a')
-          | True = c
+toLower c | isAsciiUpper c = primChr (ord c - ord 'A' + ord 'a')
+          | isAscii c = c
+          | True = U.toLower c
 
 toUpper :: Char -> Char
-toUpper c | primCharLE 'a' c && primCharLE c 'a' = chr (ord c - ord 'a' + ord 'A')
-          | True = c
+toUpper c | isAsciiLower c = primChr (ord c - ord 'a' + ord 'A')
+          | isAscii c = c
+          | True = U.toUpper c
 
+toTitle :: Char -> Char
+toTitle c | isAsciiLower c = primChr (ord c - ord 'a' + ord 'A')
+          | isAscii c = c
+          | True = U.toTitle c
+
 instance Show Char where
   showsPrec _ '\'' = showString "'\\''"
-  showsPrec _ c = showChar '\'' . showString (encodeChar c "") . showChar '\''
+  showsPrec _ c = showChar '\'' . showLitChar c . showChar '\''
   showList    s = showChar '"'  . f s
     where f [] = showChar '"'
           f (c:cs) =
             if c == '"' then showString "\\\"" . f cs
-            else showString (encodeChar c cs) . f cs
+            else showLitChar c . f cs
 
--- XXX should not export this
-encodeChar :: Char -> String -> String
-encodeChar c rest =
+showLitChar :: Char -> ShowS
+showLitChar c s | isAscii c && isPrint c && c /= '\\' = c : s
+showLitChar c rest =
   let
-    needProtect =
+    needDigitProtect =
       case rest of
         [] -> False
         c : _ -> isDigit c
-    spec = [('\a',"\\a"::String), ('\b', "\\b"::String), ('\f', "\\f"::String), ('\n', "\\n"::String),
-            ('\r', "\\r"::String), ('\t', "\\t"::String), ('\v', "\\v"::String), ('\\', "\\\\"::String)]
-    look [] = if isPrint c then [c] else ("\\"::String) ++ show (ord c) ++ if needProtect then "\\&"::String else []
-    look ((d,s):xs) = if d == c then s else look xs
-  in look spec
+    needHProtect =
+      case rest of
+        'H' : _ -> True
+        _ -> False
+    spec :: [(Char, String)]
+    spec = [('\NUL', "NUL"), ('\SOH', "SOH"), ('\STX', "STX"),
+            ('\ETX', "ETX"), ('\EOT', "EOT"), ('\ENQ', "ENQ"), ('\ACK', "ACK"),
+            ('\a', "a"), ('\b', "b"), ('\t', "t"), ('\n', "n"),
+            ('\v', "v"), ('\f', "f"), ('\r', "r"), ('\\', "\\"),
+            ('\SO', "SO"), ('\SI', "SI"), ('\DLE', "DLE"), ('\DC1', "DC1"), ('\DC2', "DC2"),
+            ('\DC3', "DC3"), ('\DC4', "DC4"), ('\NAK', "NAK"), ('\SYN', "SYN"),
+            ('\ETB', "ETB"), ('\CAN', "CAN"), ('\EM', "EM"), ('\SUB', "SUB"),
+            ('\ESC', "ESC"), ('\FS', "FS"), ('\GS', "GS"), ('\RS', "RS"), ('\US', "US"),
+            ('\DEL', "DEL")
+           ]
+    look [] = ("\\"::String) ++ show (ord c) ++ if needDigitProtect then "\\&"::String else ""
+    look ((d,s):xs) = if d == c then '\\':s ++ (if c == '\SO' && needHProtect then "\\&"::String else "") else look xs
+  in look spec ++ rest
diff --git a/lib/Data/Char/Unicode.hs b/lib/Data/Char/Unicode.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/Char/Unicode.hs
@@ -0,0 +1,238 @@
+module Data.Char.Unicode (
+        GeneralCategory (..), generalCategory,
+        unicodeVersion,
+        isControl,
+        isPrint, isSpace, isUpper,
+        isLower, isAlpha, isDigit,
+        isAlphaNum, isNumber,
+        isMark, isSeparator,
+        isPunctuation, isSymbol,
+        toTitle, toUpper, toLower,
+    ) where
+import qualified Prelude(); import MiniPrelude
+import Primitives(primOrd, primUnsafeCoerce)
+import Data.Bits
+import Data.Bounded
+import qualified Data.ByteString.Internal as BS
+import Data.ByteString.Internal(ByteString)
+import Data.Version
+import Data.Word(Word8)
+
+data GeneralCategory
+  = UppercaseLetter       -- Lu: Letter, Uppercase
+  | LowercaseLetter       -- Ll: Letter, Lowercase
+  | TitlecaseLetter       -- Lt: Letter, Titlecase
+  | ModifierLetter        -- Lm: Letter, Modifier
+  | OtherLetter           -- Lo: Letter, Other
+  | NonSpacingMark        -- Mn: Mark, Non-Spacing
+  | SpacingCombiningMark  -- Mc: Mark, Spacing Combining
+  | EnclosingMark         -- Me: Mark, Enclosing
+  | DecimalNumber         -- Nd: Number, Decimal
+  | LetterNumber          -- Nl: Number, Letter
+  | OtherNumber           -- No: Number, Other
+  | ConnectorPunctuation  -- Pc: Punctuation, Connector
+  | DashPunctuation       -- Pd: Punctuation, Dash
+  | OpenPunctuation       -- Ps: Punctuation, Open
+  | ClosePunctuation      -- Pe: Punctuation, Close
+  | InitialQuote          -- Pi: Punctuation, Initial quote
+  | FinalQuote            -- Pf: Punctuation, Final quote
+  | OtherPunctuation      -- Po: Punctuation, Other
+  | MathSymbol            -- Sm: Symbol, Math
+  | CurrencySymbol        -- Sc: Symbol, Currency
+  | ModifierSymbol        -- Sk: Symbol, Modifier
+  | OtherSymbol           -- So: Symbol, Other
+  | Space                 -- Zs: Separator, Space
+  | LineSeparator         -- Zl: Separator, Line
+  | ParagraphSeparator    -- Zp: Separator, Paragraph
+  | Control               -- Cc: Other, Control
+  | Format                -- Cf: Other, Format
+  | Surrogate             -- Cs: Other, Surrogate
+  | PrivateUse            -- Co: Other, Private Use
+  | NotAssigned           -- Cn: Other, Not Assigned
+  deriving (Show, Eq, Ord, Enum, Bounded)
+
+isControl :: Char -> Bool
+isControl c =
+  case generalCategory c of
+    Control -> True
+    _       -> False
+
+isPrint :: Char -> Bool
+isPrint c =
+  case generalCategory c of
+    LineSeparator      -> False
+    ParagraphSeparator -> False
+    Control            -> False
+    Format             -> False
+    Surrogate          -> False
+    PrivateUse         -> False
+    NotAssigned        -> False
+    _                  -> True
+
+isSpace :: Char -> Bool
+isSpace c =
+  generalCategory c == Space
+
+isUpper :: Char -> Bool
+isUpper c =
+  case generalCategory c of
+    UppercaseLetter -> True
+    TitlecaseLetter -> True
+    _               -> False
+
+isLower :: Char -> Bool
+isLower c =
+  case generalCategory c of
+    LowercaseLetter -> True
+    _               -> False
+
+isAlpha :: Char -> Bool
+isAlpha c =
+  case generalCategory c of
+    UppercaseLetter -> True
+    LowercaseLetter -> True
+    TitlecaseLetter -> True
+    ModifierLetter  -> True
+    OtherLetter     -> True
+    _               -> False
+
+isAlphaNum :: Char -> Bool
+isAlphaNum c =
+  case generalCategory c of
+    UppercaseLetter -> True
+    LowercaseLetter -> True
+    TitlecaseLetter -> True
+    ModifierLetter  -> True
+    OtherLetter     -> True
+    DecimalNumber   -> True
+    LetterNumber    -> True
+    OtherNumber     -> True
+    _               -> False
+
+isNumber :: Char -> Bool
+isNumber c =
+  case generalCategory c of
+    DecimalNumber -> True
+    LetterNumber  -> True
+    OtherNumber   -> True
+    _             -> False
+
+isMark :: Char -> Bool
+isMark c =
+  case generalCategory c of
+    NonSpacingMark       -> True
+    SpacingCombiningMark -> True
+    EnclosingMark        -> True
+    _                    -> False
+
+isSeparator :: Char -> Bool
+isSeparator c =
+  case generalCategory c of
+    Space              -> True
+    LineSeparator      -> True
+    ParagraphSeparator -> True
+    _                  -> False
+
+isPunctuation :: Char -> Bool
+isPunctuation c =
+  case generalCategory c of
+    ConnectorPunctuation    -> True
+    DashPunctuation         -> True
+    OpenPunctuation         -> True
+    ClosePunctuation        -> True
+    InitialQuote            -> True
+    FinalQuote              -> True
+    OtherPunctuation        -> True
+    _                       -> False
+
+isSymbol :: Char -> Bool
+isSymbol c =
+  case generalCategory c of
+    MathSymbol              -> True
+    CurrencySymbol          -> True
+    ModifierSymbol          -> True
+    OtherSymbol             -> True
+    _                       -> False
+
+toTitle :: Char -> Char
+toTitle c = convLU tcTable c
+
+toUpper :: Char -> Char
+toUpper c = convLU ucTable c
+
+toLower :: Char -> Char
+toLower c = convLU lcTable c
+
+-- XXX We could build a search tree and use binary search.
+-- The table is delta coded.  The first Int is the distance from
+-- previous table entry.  The second is the length of the span-1.
+-- The third is the offset to add doing the conversion.
+convLU :: [(Int, Int, Int)] -> Char -> Char
+convLU t c = conv 0 t
+  where i = primOrd c
+        conv _ [] = c
+        conv o ((dl, dh, zd):lhds) | i < l = c
+                                   | i <= h = chr (i + d)
+                                   | otherwise = conv l lhds
+                                   where l = o + dl
+                                         h = l + dh
+                                         d = zigZagDecode zd
+
+-- Do
+--   (x >> 1) ^ -(x & 1)
+-- This puts the sign bit back.
+-- Due to the range we know the incoming x is never negative.
+zigZagDecode :: Int -> Int
+zigZagDecode x = (x `unsafeShiftR` 1) `xor` (-(x .&. 1))
+
+--
+-- Same as in src/runtime/bfile.c.
+-- Run Length Encoding for ASCII
+-- Format
+-- c                -  c         one ASCII character
+-- 0x80+n c         -  n+1       repetitions of ASCII character c, n > 1
+-- 0x80+n 0x80+m c  -  n*128+m+1 repetitions of ASCII character c
+-- ... for longer run lengths
+-- Non-ASCII (i.e., >= 128) has a very poor encoding:
+-- 0x81 c-0x80
+decompressRLE :: BS.ByteString -> BS.ByteString
+decompressRLE = BS.pack . de 0 . BS.unpack
+  where
+    de :: Int -> [Word8] -> [Word8]
+    de _ [] = []
+    de 1 (x:xs) | x < 0x80  = x + 0x80 : de 0 xs
+    de n (x:xs) | x < 0x80  = replicate (n + 1) x ++ de 0 xs
+                | otherwise = de ((n * 128) + fromIntegral x - 0x80) xs
+
+-- XXX Instead of having a totally decompressed (large!) bytestring,
+-- we could build a search tree from the RLE encoding.
+generalCategory :: Char -> GeneralCategory
+generalCategory c =
+  let i = primOrd c
+  in  if i < 0 || i >= BS.length bytestringGCTable then
+        NotAssigned
+      else
+        toEnum (fromEnum (BS.primBSindex bytestringGCTable i))
+
+bytestringGCTable :: BS.ByteString
+bytestringGCTable = decompressRLE compressedGCTable
+
+-- These tables are generated by unicode/UniParse.hs
+-- This is for Unicode 16.0.0
+unicodeVersion :: Version
+unicodeVersion = makeVersion [16,0,0]
+compressedGCTable :: ByteString
+compressedGCTable =
+  "\159\12\9\130\25\27\130\25\21\22\25\26\25\20\25\25\137\6\25\25\130\26\25\25\153\0\21\25\22\28\19\28\153\1\21\26\22\26\160\12\9\25\131\27\29\25\28\29\18\23\26\13\29\28\29\26\8\8\28\1\25\25\28\8\18\24\130\8\25\150\0\26\134\0\151\1\26\135\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\0\1\0\1\0\130\1\0\0\1\0\1\0\0\1\130\0\1\1\131\0\1\0\0\1\130\0\130\1\0\0\1\0\0\1\0\1\0\1\0\0\1\0\1\1\0\1\0\0\1\130\0\1\0\1\0\0\1\1\18\0\130\1\131\18\0\2\1\0\2\1\0\2\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\2\1\0\1\130\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\134\1\0\0\1\0\0\1\1\0\1\131\0\1\0\1\0\1\0\1\0\196\1\18\154\1\145\17\131\28\139\17\141\28\132\17\134\28\17\28\17\144\28\239\3\0\1\0\1\17\28\0\1\16\16\17\130\1\25\0\131\16\28\28\0\25\130\0\16\0\16\0\0\1\144\0\16\136\0\162\1\0\1\1\130\0\130\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\132\1\0\1\26\0\1\0\0\1\1\178\0\175\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\29\132\3\5\5\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\16\165\0\16\16\17\133\25\168\1\25\20\16\16\29\29\27\16\172\3\20\3\25\3\3\25\3\3\25\3\135\16\154\18\131\16\131\18\25\25\138\16\133\13\130\26\25\25\27\25\25\29\29\138\3\25\13\130\25\159\18\17\137\18\148\3\137\6\131\25\18\18\3\226\18\25\18\134\3\13\29\133\3\17\17\3\3\29\131\3\18\18\137\6\130\18\29\29\18\141\25\16\13\18\3\157\18\154\3\16\16\216\18\138\3\18\141\16\137\6\160\18\136\3\17\17\29\130\25\17\16\16\3\27\27\149\18\131\3\17\136\3\17\130\3\17\132\3\16\16\142\25\16\152\18\130\3\16\16\25\16\138\18\132\16\151\18\28\133\18\16\13\13\132\16\136\3\168\18\17\151\3\13\159\3\4\181\18\3\4\3\18\130\4\135\3\131\4\3\4\4\18\134\3\137\18\3\3\25\25\137\6\25\17\142\18\3\4\4\16\135\18\16\16\18\18\16\16\149\18\16\134\18\16\18\130\16\131\18\16\16\3\18\130\4\131\3\16\16\4\4\16\16\4\4\3\18\135\16\4\131\16\18\18\16\130\18\3\3\16\16\137\6\18\18\27\27\133\8\29\27\18\25\3\16\16\3\3\4\16\133\18\131\16\18\18\16\16\149\18\16\134\18\16\18\18\16\18\18\16\18\18\16\16\3\16\130\4\3\3\131\16\3\3\16\16\130\3\130\16\3\134\16\131\18\16\18\134\16\137\6\3\3\130\18\3\25\137\16\3\3\4\16\136\18\16\130\18\16\149\18\16\134\18\16\18\18\16\132\18\16\16\3\18\130\4\132\3\16\3\3\4\16\4\4\3\16\16\18\142\16\18\18\3\3\16\16\137\6\25\27\134\16\18\133\3\16\3\4\4\16\135\18\16\16\18\18\16\16\149\18\16\134\18\16\18\18\16\132\18\16\16\3\18\4\3\4\131\3\16\16\4\4\16\16\4\4\3\134\16\3\3\4\131\16\18\18\16\130\18\3\3\16\16\137\6\29\18\133\8\137\16\3\18\16\133\18\130\16\130\18\16\131\18\130\16\18\18\16\18\16\18\18\130\16\18\18\130\16\130\18\130\16\139\18\131\16\4\4\3\4\4\130\16\130\4\16\130\4\3\16\16\18\133\16\4\141\16\137\6\130\8\133\29\27\29\132\16\3\130\4\3\135\18\16\130\18\16\150\18\16\143\18\16\16\3\18\130\3\131\4\16\130\3\16\131\3\134\16\3\3\16\130\18\16\16\18\16\16\18\18\3\3\16\16\137\6\134\16\25\134\8\29\18\3\4\4\25\135\18\16\130\18\16\150\18\16\137\18\16\132\18\16\16\3\18\4\3\132\4\16\3\4\4\16\4\4\3\3\134\16\4\4\133\16\18\18\16\18\18\3\3\16\16\137\6\16\18\18\4\139\16\3\3\4\4\136\18\16\130\18\16\168\18\3\3\18\130\4\131\3\16\130\4\16\130\4\3\18\29\131\16\130\18\4\134\8\130\18\3\3\16\16\137\6\136\8\29\133\18\16\3\4\4\16\145\18\130\16\151\18\16\136\18\16\18\16\16\134\18\130\16\3\131\16\130\4\130\3\16\3\16\135\4\133\16\137\6\16\16\4\4\25\139\16\175\18\3\18\18\134\3\131\16\27\133\18\17\135\3\25\137\6\25\25\164\16\18\18\16\18\16\132\18\16\151\18\16\18\16\137\18\3\18\18\136\3\18\16\16\132\18\16\17\16\134\3\16\137\6\16\16\131\18\159\16\18\130\29\142\25\29\25\130\29\3\3\133\29\137\6\137\8\29\3\29\3\29\3\21\22\21\22\4\4\135\18\16\163\18\131\16\141\3\4\132\3\25\3\3\132\18\138\3\16\163\3\16\135\29\3\133\29\16\29\29\132\25\131\29\25\25\164\16\170\18\4\4\131\3\4\133\3\4\3\3\4\4\3\3\18\137\6\133\25\133\18\4\4\3\3\131\18\130\3\18\130\4\18\18\134\4\130\18\131\3\140\18\3\4\4\3\3\133\4\3\18\4\137\6\130\4\3\29\29\165\0\16\0\132\16\0\16\16\170\1\25\17\130\1\130\200\18\16\131\18\16\16\134\18\16\18\16\131\18\16\16\168\18\16\131\18\16\16\160\18\16\131\18\16\16\134\18\16\18\16\131\18\16\16\142\18\16\184\18\16\131\18\16\16\194\18\16\16\130\3\136\25\147\8\130\16\143\18\137\29\133\16\213\0\16\16\133\1\16\16\20\132\235\18\29\25\144\18\9\153\18\21\22\130\16\202\18\130\25\130\7\135\18\134\16\145\18\130\3\4\136\16\146\18\3\3\4\25\25\136\16\145\18\3\3\139\16\140\18\16\130\18\16\3\3\139\16\179\18\3\3\4\134\3\135\4\3\4\4\138\3\130\25\17\130\25\27\18\3\16\16\137\6\133\16\137\8\133\16\133\25\20\131\25\130\3\13\3\137\6\133\16\162\18\17\180\18\134\16\132\18\3\3\161\18\3\18\132\16\197\18\137\16\158\18\16\130\3\131\4\3\3\130\4\131\16\4\4\3\133\4\130\3\131\16\29\130\16\25\25\137\6\157\18\16\16\132\18\138\16\171\18\131\16\153\18\133\16\137\6\8\130\16\161\29\150\18\3\3\4\4\3\16\16\25\25\180\18\4\3\4\134\3\16\3\4\3\4\4\135\3\133\4\137\3\16\16\3\137\6\133\16\137\6\133\16\134\25\17\133\25\16\16\141\3\5\143\3\176\16\131\3\4\174\18\3\4\132\3\4\3\132\4\3\4\4\135\18\16\25\25\137\6\134\25\137\29\136\3\136\29\130\25\3\3\4\157\18\4\131\3\4\4\3\3\4\130\3\18\18\137\6\171\18\3\4\3\3\130\4\3\4\130\3\4\4\135\16\131\25\163\18\135\4\135\3\4\4\3\3\130\16\132\25\137\6\130\16\130\18\137\6\157\18\133\17\25\25\136\1\0\1\132\16\170\0\16\16\130\0\135\25\135\16\130\3\25\140\3\4\134\3\131\18\3\133\18\3\18\18\4\3\3\18\132\16\171\1\190\17\140\1\17\161\1\164\17\191\3\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\136\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\136\1\135\0\133\1\16\16\133\0\16\16\135\1\135\0\135\1\135\0\133\1\16\16\133\0\16\16\135\1\16\0\16\0\16\0\16\0\135\1\135\0\141\1\16\16\135\1\135\2\135\1\135\2\135\1\135\2\132\1\16\1\1\131\0\2\28\1\130\28\130\1\16\1\1\131\0\2\130\28\131\1\16\16\1\1\131\0\16\130\28\135\1\132\0\130\28\16\16\130\1\16\1\1\131\0\2\28\28\16\138\9\132\13\133\20\25\25\23\24\21\23\23\24\21\23\135\25\10\11\132\13\9\136\25\23\24\131\25\19\19\130\25\26\21\22\138\25\26\25\19\137\25\9\132\13\16\137\13\8\17\16\16\133\8\130\26\21\22\17\137\8\130\26\21\22\16\140\17\130\16\160\27\142\16\140\3\131\5\3\130\5\139\3\142\16\29\29\0\131\29\0\29\29\1\130\0\1\1\130\0\1\29\0\29\29\26\132\0\133\29\0\29\0\29\0\29\131\0\29\1\131\0\1\131\18\1\29\29\1\1\0\0\132\26\0\131\1\29\26\29\29\1\29\143\8\162\7\0\1\131\7\8\29\29\131\16\132\26\132\29\26\26\131\29\26\29\29\26\29\29\26\134\29\26\158\29\26\26\29\29\26\29\26\158\29\130\139\26\135\29\21\22\21\22\147\29\26\26\134\29\21\22\208\29\26\157\29\152\26\167\29\133\26\199\29\149\16\138\29\148\16\187\8\205\29\149\8\129\182\29\26\136\29\26\181\29\135\26\238\29\26\129\247\29\21\22\21\22\21\22\21\22\21\22\21\22\21\22\157\8\171\29\132\26\21\22\158\26\21\22\21\22\21\22\21\22\21\22\143\26\129\255\29\129\130\26\21\22\21\22\21\22\21\22\21\22\21\22\21\22\21\22\21\22\21\22\21\22\190\26\21\22\21\22\159\26\21\22\130\129\26\175\29\148\26\29\29\133\26\166\29\16\16\159\29\16\232\29\175\0\175\1\0\1\130\0\1\1\0\1\0\1\0\1\131\0\1\0\1\1\0\133\1\17\17\130\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\133\29\0\1\0\1\130\3\0\1\132\16\131\25\8\25\25\165\1\16\1\132\16\1\16\16\183\18\134\16\17\25\141\16\3\150\18\136\16\134\18\16\134\18\16\134\18\16\134\18\16\134\18\16\134\18\16\134\18\16\134\18\16\159\3\25\25\23\24\23\24\130\25\23\24\25\23\24\136\25\20\25\25\20\25\23\24\25\25\23\24\21\22\21\22\21\22\21\22\132\25\17\137\25\20\20\131\25\20\25\21\140\25\29\29\130\25\21\22\21\22\21\22\21\22\20\161\16\153\29\16\216\29\139\16\129\213\29\153\16\143\29\9\130\25\29\17\18\7\21\22\21\22\21\22\21\22\21\22\29\29\21\22\21\22\21\22\21\22\20\21\22\22\29\136\7\131\3\4\4\20\132\17\29\29\130\7\17\18\25\29\29\16\213\18\16\16\3\3\28\28\17\17\18\20\217\18\25\130\17\18\132\16\170\18\16\221\18\16\29\29\131\8\137\29\159\18\165\29\136\16\29\143\18\158\29\16\137\8\157\29\135\8\29\142\8\159\29\137\8\166\29\142\8\130\191\29\18\179\189\16\18\191\29\18\129\163\253\16\149\18\17\136\246\18\130\16\182\29\136\16\167\18\133\17\25\25\130\139\18\17\130\25\143\18\137\6\18\18\147\16\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\18\3\130\5\25\137\3\25\17\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\17\17\3\3\197\18\137\7\3\3\133\25\135\16\150\28\136\17\28\28\0\1\0\1\0\1\0\1\0\1\0\1\0\130\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\17\135\1\0\1\0\1\0\0\1\0\1\0\1\0\1\0\1\17\28\28\0\1\0\1\18\0\1\0\130\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\132\0\1\132\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\131\0\1\0\1\0\0\1\16\16\0\1\16\1\16\1\0\1\0\1\0\1\0\148\16\130\17\0\1\18\17\17\1\134\18\3\130\18\3\131\18\3\150\18\4\4\3\3\4\131\29\3\130\16\133\8\29\29\27\29\133\16\179\18\131\25\135\16\4\4\177\18\143\4\3\3\135\16\25\25\137\6\133\16\145\3\133\18\130\25\18\25\18\18\3\137\6\155\18\135\3\25\25\150\18\138\3\4\4\138\16\25\156\18\130\16\130\3\4\174\18\3\4\4\131\3\4\4\3\3\130\4\140\25\16\17\137\6\131\16\25\25\132\18\3\17\136\18\137\6\132\18\16\168\18\133\3\4\4\3\3\4\4\3\3\136\16\130\18\3\135\18\3\4\16\16\137\6\16\16\131\25\143\18\17\133\18\130\29\18\4\3\4\177\18\3\18\130\3\18\18\3\3\132\18\3\3\18\3\18\151\16\18\18\17\25\25\138\18\4\3\3\4\4\25\25\18\17\17\4\3\137\16\133\18\16\16\133\18\16\16\133\18\136\16\134\18\16\134\18\16\170\1\28\131\17\136\1\17\28\28\131\16\207\1\162\18\4\4\3\4\4\3\4\4\25\4\3\16\16\137\6\133\16\18\215\161\16\18\139\16\150\18\131\16\176\18\131\16\14\134\253\16\14\14\253\16\14\14\135\253\16\14\15\177\253\16\15\130\237\18\16\16\233\18\165\16\134\1\139\16\132\1\132\16\18\3\137\18\26\140\18\16\132\18\16\18\16\18\18\16\18\18\16\235\18\144\28\143\16\130\234\18\22\21\143\29\191\18\16\16\181\18\134\16\29\159\16\139\18\27\130\29\143\3\134\25\21\22\25\133\16\143\3\25\20\20\19\19\21\22\21\22\21\22\21\22\21\22\21\22\21\22\21\22\25\25\21\22\131\25\130\19\130\25\16\131\25\20\21\22\21\22\21\22\130\25\26\20\130\26\16\25\27\25\25\131\16\132\18\16\129\134\18\16\16\13\16\130\25\27\130\25\21\22\25\26\25\20\25\25\137\6\25\25\130\26\25\25\153\0\21\25\22\28\19\28\153\1\21\26\22\26\21\22\25\21\22\25\25\137\18\17\172\18\17\17\158\18\130\16\133\18\16\16\133\18\16\16\133\18\16\16\130\18\130\16\27\27\26\28\29\27\27\16\29\131\26\29\29\137\16\130\13\29\29\16\16\139\18\16\153\18\16\146\18\16\18\18\16\142\18\16\16\141\18\161\16\250\18\132\16\130\25\131\16\172\8\130\16\136\29\180\7\131\8\144\29\8\8\130\29\16\140\29\130\16\29\174\16\172\29\3\129\129\16\156\18\130\16\176\18\142\16\3\154\8\131\16\159\18\131\8\136\16\147\18\7\135\18\7\132\16\165\18\132\3\132\16\157\18\16\25\163\18\131\16\135\18\25\132\7\169\16\167\0\167\1\205\18\16\16\137\6\133\16\163\0\131\16\163\1\131\16\167\18\135\16\179\18\138\16\25\138\0\16\142\0\16\134\0\16\0\0\16\138\1\16\142\1\16\134\1\16\1\1\130\16\179\18\139\16\130\182\18\136\16\149\18\137\16\135\18\151\16\133\17\16\169\17\16\136\17\196\16\133\18\16\16\18\16\171\18\16\18\18\130\16\18\16\16\150\18\16\25\135\8\150\18\29\29\134\8\158\18\135\16\136\8\175\16\146\18\16\18\18\132\16\132\8\149\18\133\8\130\16\25\153\18\132\16\25\191\16\183\18\131\16\8\8\18\18\143\8\16\16\173\8\18\130\3\16\3\3\132\16\131\3\131\18\16\130\18\16\156\18\16\16\130\3\131\16\3\136\8\134\16\136\25\134\16\156\18\8\8\25\156\18\130\8\159\16\135\18\29\155\18\3\3\131\16\132\8\134\25\136\16\181\18\130\16\134\25\149\18\16\16\135\8\146\18\132\16\135\8\145\18\134\16\131\25\139\16\134\8\207\16\200\18\182\16\178\0\140\16\178\1\134\16\133\8\163\18\131\3\135\16\137\6\133\16\137\6\131\18\17\18\149\0\130\16\132\3\20\17\149\1\135\16\26\26\129\207\16\158\8\16\169\18\16\3\3\20\16\16\18\18\143\16\130\18\182\16\131\3\156\18\137\8\18\135\16\149\18\138\3\131\8\132\25\149\16\145\18\131\3\131\25\165\16\148\18\134\8\147\16\150\18\136\16\4\3\4\180\18\142\3\134\25\131\16\147\8\137\6\3\18\18\3\3\18\136\16\130\3\4\172\18\130\4\131\3\4\4\3\3\25\25\13\131\25\3\137\16\13\16\16\152\18\134\16\137\6\133\16\130\3\163\18\132\3\4\135\3\16\137\6\131\25\18\4\4\18\135\16\162\18\3\25\25\18\136\16\3\3\4\175\18\130\4\136\3\4\4\131\18\131\25\131\3\25\4\3\137\6\18\25\18\130\25\16\147\8\138\16\145\18\16\152\18\130\4\130\3\4\4\3\4\3\3\133\25\3\18\18\3\189\16\134\18\16\18\16\131\18\16\142\18\16\137\18\25\133\16\174\18\3\130\4\135\3\132\16\137\6\133\16\3\3\4\4\16\135\18\16\16\18\18\16\16\149\18\16\134\18\16\18\18\16\132\18\16\3\3\18\4\4\3\131\4\16\16\4\4\16\16\130\4\16\16\18\133\16\4\132\16\132\18\4\4\16\16\134\3\130\16\132\3\138\16\137\18\16\18\16\16\18\16\165\18\16\18\130\4\133\3\16\4\16\16\4\16\131\4\16\4\4\3\4\3\18\3\18\25\25\16\25\25\135\16\3\3\156\16\180\18\130\4\135\3\4\4\130\3\4\3\131\18\132\25\137\6\25\25\16\25\3\130\18\157\16\175\18\130\4\133\3\4\3\131\4\3\3\4\3\3\18\18\25\18\135\16\137\6\129\165\16\174\18\130\4\131\3\16\16\131\4\3\3\4\3\3\150\25\131\18\3\3\161\16\175\18\130\4\135\3\4\4\3\4\3\3\130\25\18\138\16\137\6\133\16\140\25\146\16\170\18\3\4\3\4\4\133\3\4\3\18\25\133\16\137\6\133\16\147\6\155\16\154\18\16\16\3\4\3\4\4\131\3\4\132\3\131\16\137\6\8\8\130\25\29\134\18\129\184\16\171\18\130\4\136\3\4\3\3\25\227\16\159\0\159\1\137\6\136\8\139\16\135\18\16\16\18\16\16\135\18\16\18\18\16\151\18\133\4\16\4\4\16\16\3\3\4\3\18\4\18\4\3\130\25\136\16\137\6\197\16\135\18\16\16\166\18\130\4\131\3\16\16\3\3\131\4\3\18\25\18\4\154\16\18\137\3\167\18\133\3\4\18\131\3\135\25\3\135\16\18\133\3\4\4\130\3\173\18\140\3\4\3\3\130\25\18\132\25\140\16\200\18\134\16\137\25\129\181\16\160\18\25\141\16\137\6\133\16\136\18\16\164\18\4\134\3\16\133\3\4\3\18\132\25\137\16\137\6\146\8\130\16\25\25\157\18\16\16\149\3\16\4\134\3\4\3\3\4\3\3\200\16\134\18\16\18\18\16\165\18\133\3\130\16\3\16\3\3\16\134\3\18\3\135\16\137\6\133\16\133\18\16\18\18\16\159\18\132\4\16\3\3\16\4\4\3\4\3\18\134\16\137\6\130\181\16\146\18\3\3\4\4\25\25\134\16\3\3\18\4\140\18\16\161\18\4\4\132\3\130\16\4\4\3\4\3\140\25\137\6\3\212\16\18\142\16\148\8\135\29\131\27\144\29\140\16\25\135\153\18\229\16\238\7\16\132\25\138\16\129\195\18\148\203\16\224\18\25\25\140\16\136\175\18\143\13\3\133\18\142\3\137\16\159\154\18\132\16\132\198\18\181\184\16\157\18\139\3\130\4\130\3\137\6\141\197\16\132\184\18\134\16\158\18\16\137\6\131\16\25\25\206\18\16\137\6\133\16\157\18\16\16\132\3\25\137\16\175\18\134\3\132\25\131\29\131\17\25\29\137\16\137\6\16\134\8\16\148\18\132\16\146\18\131\175\16\130\17\167\18\17\17\130\25\137\6\129\197\16\159\0\159\1\150\8\131\25\228\16\202\18\131\16\3\18\182\4\134\16\131\3\140\17\191\16\17\17\25\17\3\138\16\4\4\141\16\18\175\245\16\18\135\16\137\213\18\168\16\18\18\134\16\18\197\230\16\131\17\16\134\17\16\17\17\16\130\162\18\142\16\18\156\16\130\18\16\16\18\141\16\131\18\135\16\131\139\18\146\131\16\234\18\132\16\140\18\130\16\136\18\134\16\137\18\16\16\29\3\3\25\131\13\158\219\16\129\239\29\137\6\133\16\131\179\29\203\16\173\3\16\16\150\3\136\16\243\29\187\16\129\245\29\137\16\166\29\16\16\187\29\4\4\130\3\130\29\133\4\135\13\135\3\29\29\134\3\157\29\131\3\188\29\148\16\193\29\130\3\29\249\16\147\8\139\16\147\8\139\16\214\29\136\16\152\8\129\134\16\153\0\153\1\153\0\134\1\16\145\1\153\0\153\1\0\16\0\0\16\16\0\16\16\0\0\16\16\131\0\16\135\0\131\1\16\1\16\134\1\16\138\1\153\0\153\1\0\0\16\131\0\16\16\135\0\16\134\0\16\153\1\0\0\16\131\0\16\132\0\16\0\130\16\134\0\16\153\1\153\0\153\1\153\0\153\1\153\0\153\1\153\0\153\1\153\0\153\1\153\0\155\1\16\16\152\0\26\152\1\26\133\1\152\0\26\152\1\26\133\1\152\0\26\152\1\26\133\1\152\0\26\152\1\26\133\1\152\0\26\152\1\26\133\1\0\1\16\16\177\6\131\255\29\182\3\131\29\177\3\135\29\3\141\29\3\29\29\132\25\142\16\132\3\16\142\3\136\207\16\137\1\18\147\1\133\16\133\1\129\212\16\134\3\16\144\3\16\16\134\3\16\3\3\16\132\3\132\16\189\17\160\16\3\239\16\172\18\130\16\134\3\134\17\16\16\137\6\131\16\18\29\130\191\16\157\18\3\144\16\171\18\131\3\137\6\132\16\27\131\207\16\154\18\17\131\3\137\6\129\213\16\157\18\3\3\18\137\6\131\16\25\131\223\16\134\18\16\131\18\16\18\18\16\142\18\16\129\196\18\16\16\136\8\134\3\168\16\161\0\161\1\134\3\17\131\16\137\6\131\16\25\25\134\144\16\186\8\29\130\8\27\131\8\203\16\172\8\29\142\8\129\193\16\131\18\16\154\18\16\18\18\16\18\16\16\18\16\137\18\16\131\18\16\18\16\18\133\16\18\131\16\18\16\18\16\18\16\130\18\16\18\18\16\18\16\16\18\16\18\16\18\16\18\16\18\16\18\18\16\18\16\16\131\18\16\134\18\16\131\18\16\131\18\16\18\16\137\18\16\144\18\132\16\130\18\16\132\18\16\144\18\179\16\26\26\130\141\16\171\29\131\16\227\29\139\16\142\29\16\16\142\29\16\142\29\16\164\29\137\16\140\8\129\160\29\183\16\156\29\140\16\171\29\131\16\136\29\134\16\29\29\141\16\133\29\129\153\16\129\250\29\132\28\133\215\29\131\16\144\29\130\16\140\29\130\16\246\29\131\16\222\29\133\16\139\29\131\16\29\142\16\139\29\131\16\183\29\135\16\137\29\133\16\167\29\135\16\157\29\16\16\139\29\131\16\29\29\189\16\130\211\29\139\16\141\29\16\16\140\29\130\16\137\29\132\16\183\29\134\16\142\29\16\16\138\29\133\16\136\29\134\16\129\146\29\16\219\29\137\6\136\133\16\18\130\205\221\16\18\159\16\18\160\183\16\18\133\16\18\129\219\16\18\16\16\18\172\255\16\18\141\16\18\186\174\16\18\142\16\18\132\235\16\18\147\161\16\132\157\18\139\225\16\18\166\200\16\18\132\16\18\160\221\16\18\171\184\208\16\13\157\16\223\13\255\16\129\239\3\131\252\143\16\15\131\255\251\16\15\16\16\15\131\255\251\16\15"
+
+tcTable :: [(Int, Int, Int)]
+tcTable =
+  [(97,25,63),(84,0,1486),(43,22,63),(24,6,63),(7,0,242),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,463),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(1,0,599),(1,0,390),(3,0,1),(2,0,1),(3,0,1),(4,0,1),(6,0,1),(3,0,194),(4,0,1),(1,0,326),(1,0,85122),(3,0,260),(3,0,1),(2,0,1),(2,0,1),(3,0,1),(5,0,1),(3,0,1),(4,0,1),(2,0,1),(3,0,1),(4,0,1),(2,0,112),(5,0,2),(1,0,0),(1,0,1),(1,0,2),(1,0,0),(1,0,1),(1,0,2),(1,0,0),(1,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,157),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,2),(1,0,0),(1,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(9,0,1),(3,1,21630),(3,0,1),(5,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,21566),(1,0,21560),(1,0,21564),(1,0,419),(1,0,411),(2,1,409),(3,0,403),(2,0,405),(1,0,84638),(4,0,409),(1,0,84630),(2,0,413),(1,0,84686),(1,0,84560),(1,0,84616),(2,0,417),(1,0,421),(1,0,84616),(1,0,21486),(1,0,84610),(3,0,421),(2,0,21498),(1,0,425),(3,0,427),(8,0,21454),(3,0,435),(2,0,84614),(1,0,435),(4,0,84564),(1,0,435),(1,0,137),(1,1,433),(2,0,141),(6,0,437),(11,0,84522),(1,0,84516),(167,0,168),(44,0,1),(2,0,1),(4,0,1),(4,2,260),(49,0,75),(1,2,73),(4,16,63),(17,0,61),(1,8,63),(9,0,127),(1,1,125),(3,0,123),(1,0,113),(4,0,93),(1,0,107),(1,0,15),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,171),(1,0,159),(1,0,14),(1,0,231),(2,0,191),(3,0,1),(3,0,1),(53,31,63),(32,15,159),(17,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(10,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,29),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(50,37,95),(2927,42,0),(45,2,0),(763,5,15),(2184,0,12507),(1,0,12505),(1,0,12487),(1,1,12483),(2,0,12485),(1,0,12471),(1,0,12361),(1,0,70532),(2,0,1),(239,0,70664),(4,0,7628),(17,0,70768),(115,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(6,0,117),(6,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,7,16),(16,5,16),(16,7,16),(16,7,16),(16,5,16),(17,0,16),(2,0,16),(2,0,16),(2,0,16),(9,7,16),(16,1,148),(2,3,172),(4,1,200),(2,1,256),(2,1,224),(2,1,252),(4,7,16),(16,7,16),(16,7,16),(16,1,16),(3,0,18),(11,0,14409),(5,0,18),(13,1,16),(16,1,16),(5,0,14),(14,0,18),(347,0,55),(34,15,31),(20,0,1),(844,25,51),(1888,47,95),(49,0,1),(4,0,21589),(1,0,21583),(2,0,1),(2,0,1),(2,0,1),(7,0,1),(3,0,1),(11,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(9,0,1),(2,0,1),(5,0,1),(13,37,14527),(39,0,14527),(6,0,14527),(30996,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(20,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(136,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(11,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(5,0,1),(5,0,1),(2,0,1),(1,0,96),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(12,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(5,0,1),(2,0,1),(3,0,1),(4,0,1),(6,0,1),(2,0,1),(2,0,1),(27,0,1),(861,0,1855),(29,79,77727),(21457,25,63),(1255,39,79),(176,35,79),(191,10,77),(12,14,77),(16,6,77),(8,1,77),(1797,50,127),(176,21,63),(2896,31,63),(21920,31,63),(31426,33,67)]
+
+ucTable :: [(Int, Int, Int)]
+ucTable =
+  [(97,25,63),(84,0,1486),(43,22,63),(24,6,63),(7,0,242),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,463),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(1,0,599),(1,0,390),(3,0,1),(2,0,1),(3,0,1),(4,0,1),(6,0,1),(3,0,194),(4,0,1),(1,0,326),(1,0,85122),(3,0,260),(3,0,1),(2,0,1),(2,0,1),(3,0,1),(5,0,1),(3,0,1),(4,0,1),(2,0,1),(3,0,1),(4,0,1),(2,0,112),(6,0,1),(1,0,3),(2,0,1),(1,0,3),(2,0,1),(1,0,3),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,157),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(1,0,3),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(9,0,1),(3,1,21630),(3,0,1),(5,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,21566),(1,0,21560),(1,0,21564),(1,0,419),(1,0,411),(2,1,409),(3,0,403),(2,0,405),(1,0,84638),(4,0,409),(1,0,84630),(2,0,413),(1,0,84686),(1,0,84560),(1,0,84616),(2,0,417),(1,0,421),(1,0,84616),(1,0,21486),(1,0,84610),(3,0,421),(2,0,21498),(1,0,425),(3,0,427),(8,0,21454),(3,0,435),(2,0,84614),(1,0,435),(4,0,84564),(1,0,435),(1,0,137),(1,1,433),(2,0,141),(6,0,437),(11,0,84522),(1,0,84516),(167,0,168),(44,0,1),(2,0,1),(4,0,1),(4,2,260),(49,0,75),(1,2,73),(4,16,63),(17,0,61),(1,8,63),(9,0,127),(1,1,125),(3,0,123),(1,0,113),(4,0,93),(1,0,107),(1,0,15),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,171),(1,0,159),(1,0,14),(1,0,231),(2,0,191),(3,0,1),(3,0,1),(53,31,63),(32,15,159),(17,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(10,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,29),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(50,37,95),(2927,42,6016),(45,2,6016),(763,5,15),(2184,0,12507),(1,0,12505),(1,0,12487),(1,1,12483),(2,0,12485),(1,0,12471),(1,0,12361),(1,0,70532),(2,0,1),(239,0,70664),(4,0,7628),(17,0,70768),(115,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(6,0,117),(6,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,7,16),(16,5,16),(16,7,16),(16,7,16),(16,5,16),(17,0,16),(2,0,16),(2,0,16),(2,0,16),(9,7,16),(16,1,148),(2,3,172),(4,1,200),(2,1,256),(2,1,224),(2,1,252),(4,7,16),(16,7,16),(16,7,16),(16,1,16),(3,0,18),(11,0,14409),(5,0,18),(13,1,16),(16,1,16),(5,0,14),(14,0,18),(347,0,55),(34,15,31),(20,0,1),(844,25,51),(1888,47,95),(49,0,1),(4,0,21589),(1,0,21583),(2,0,1),(2,0,1),(2,0,1),(7,0,1),(3,0,1),(11,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(9,0,1),(2,0,1),(5,0,1),(13,37,14527),(39,0,14527),(6,0,14527),(30996,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(20,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(136,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(11,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(5,0,1),(5,0,1),(2,0,1),(1,0,96),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(12,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(5,0,1),(2,0,1),(3,0,1),(4,0,1),(6,0,1),(2,0,1),(2,0,1),(27,0,1),(861,0,1855),(29,79,77727),(21457,25,63),(1255,39,79),(176,35,79),(191,10,77),(12,14,77),(16,6,77),(8,1,77),(1797,50,127),(176,21,63),(2896,31,63),(21920,31,63),(31426,33,67)]
+
+lcTable :: [(Int, Int, Int)]
+lcTable =
+  [(65,25,64),(127,22,64),(24,6,64),(40,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,397),(2,0,2),(2,0,2),(2,0,2),(3,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,241),(1,0,2),(2,0,2),(2,0,2),(4,0,420),(1,0,2),(2,0,2),(2,0,412),(1,0,2),(2,1,410),(2,0,2),(3,0,158),(1,0,404),(1,0,406),(1,0,2),(2,0,410),(1,0,414),(2,0,422),(1,0,418),(1,0,2),(4,0,422),(1,0,426),(2,0,428),(1,0,2),(2,0,2),(2,0,2),(2,0,436),(1,0,2),(2,0,436),(3,0,2),(2,0,436),(1,0,2),(2,1,434),(2,0,2),(2,0,2),(2,0,438),(1,0,2),(4,0,2),(8,0,4),(1,0,2),(2,0,4),(1,0,2),(2,0,4),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,0,4),(1,0,2),(2,0,2),(2,0,193),(1,0,111),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,259),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(8,0,21590),(1,0,2),(2,0,325),(1,0,21584),(3,0,2),(2,0,389),(1,0,138),(1,0,142),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(290,0,2),(2,0,2),(4,0,2),(9,0,232),(7,0,76),(2,2,74),(4,0,128),(2,1,126),(3,16,64),(18,8,64),(44,0,16),(9,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(6,0,119),(3,0,2),(2,0,13),(1,0,2),(3,2,259),(3,15,160),(16,31,64),(80,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(10,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,30),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,37,96),(2927,37,14528),(39,0,14528),(6,0,14528),(723,79,77728),(80,5,16),(2201,0,2),(7,42,6015),(45,2,6015),(323,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(10,0,15229),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(10,7,15),(16,5,15),(16,7,15),(16,7,15),(16,5,15),(17,0,15),(2,0,15),(2,0,15),(2,0,15),(9,7,15),(32,7,15),(16,7,15),(16,7,15),(16,1,15),(2,1,147),(2,0,17),(12,3,171),(4,0,17),(12,1,15),(2,1,199),(14,1,15),(2,1,223),(2,0,13),(12,1,255),(2,1,251),(2,0,17),(298,0,15033),(4,0,16765),(1,0,16523),(7,0,56),(46,15,32),(35,0,2),(819,25,52),(1866,47,96),(96,0,2),(2,0,21485),(1,0,7627),(1,0,21453),(3,0,2),(2,0,2),(2,0,2),(2,0,21559),(1,0,21497),(1,0,21565),(1,0,21563),(2,0,2),(3,0,2),(9,1,21629),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(9,0,2),(2,0,2),(5,0,2),(31054,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(20,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(136,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(4,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(11,0,2),(2,0,2),(2,0,70663),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(5,0,2),(2,0,84559),(3,0,2),(2,0,2),(4,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,84615),(1,0,84637),(1,0,84629),(1,0,84609),(1,0,84615),(2,0,84515),(1,0,84563),(1,0,84521),(1,0,1856),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,95),(1,0,84613),(1,0,70767),(1,0,2),(2,0,2),(2,0,84685),(1,0,2),(4,0,2),(6,0,2),(2,0,2),(2,0,2),(2,0,85121),(25,0,2),(22316,25,64),(1247,39,80),(176,35,80),(192,10,78),(12,14,78),(16,6,78),(8,1,78),(1772,50,128),(208,21,64),(2896,31,64),(21920,31,64),(31424,33,68)]
diff --git a/lib/Data/Char/Unicode.hs-boot b/lib/Data/Char/Unicode.hs-boot
new file mode 100644
--- /dev/null
+++ b/lib/Data/Char/Unicode.hs-boot
@@ -0,0 +1,23 @@
+module Data.Char.Unicode where
+import qualified Prelude()
+import Data.Bool_Type
+import Data.Char_Type
+
+data GeneralCategory
+
+isControl :: Char -> Bool
+isPrint :: Char -> Bool
+isSpace :: Char -> Bool
+isUpper :: Char -> Bool
+isLower :: Char -> Bool
+isAlpha :: Char -> Bool
+isAlphaNum :: Char -> Bool
+isNumber :: Char -> Bool
+isMark :: Char -> Bool
+isSeparator :: Char -> Bool
+isPunctuation :: Char -> Bool
+isSymbol :: Char -> Bool
+toTitle :: Char -> Char
+toUpper :: Char -> Char
+toLower :: Char -> Char
+generalCategory :: Char -> GeneralCategory
diff --git a/lib/Data/Char_Type.hs b/lib/Data/Char_Type.hs
--- a/lib/Data/Char_Type.hs
+++ b/lib/Data/Char_Type.hs
@@ -1,5 +1,5 @@
 module Data.Char_Type(Char, String) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.List_Type
 
diff --git a/lib/Data/Coerce.hs b/lib/Data/Coerce.hs
--- a/lib/Data/Coerce.hs
+++ b/lib/Data/Coerce.hs
@@ -1,5 +1,5 @@
 module Data.Coerce(Coercible, coerce) where
-import Prelude()
+import qualified Prelude()
 import Primitives
 
 type Coercible :: forall k . k -> k -> Constraint
diff --git a/lib/Data/Complex.hs b/lib/Data/Complex.hs
--- a/lib/Data/Complex.hs
+++ b/lib/Data/Complex.hs
@@ -97,8 +97,8 @@
                             u'    = sqrt ((magnitude z + abs x) / 2)
 
     sin (x:+y)     =  sin x * cosh y :+ cos x * sinh y
-    cos (x:+y)     =  cos x * cosh y :+ (- (sin x) * sinh y)
-    tan (x:+y)     =  (sinx*coshy:+cosx*sinhy)/(cosx*coshy:+(- sinx*sinhy))
+    cos (x:+y)     =  cos x * cosh y :+ (- (sin x * sinh y))
+    tan (x:+y)     =  (sinx*coshy :+ cosx*sinhy)/(cosx*coshy :+ (- (sinx*sinhy)))
                       where sinx  = sin x
                             cosx  = cos x
                             sinhy = sinh y
@@ -122,8 +122,8 @@
 
     asinh z        =  log (z + sqrt (1+z*z))
 
-    acosh z        =  log (z + (sqrt $ z+1) * (sqrt $ z - 1))
-    atanh z        =  0.5 * log ((1.0+z) / (1.0-z))
+    acosh z        =  log (z + sqrt (z + 1) * sqrt (z - 1))
+    atanh z        =  0.5 * log ((1 + z) / (1 - z))
 
     log1p x@(a :+ b)
       | abs a < 0.5 && abs b < 0.5
@@ -134,5 +134,5 @@
       | a*a + b*b < 1
       , u <- expm1 a
       , v <- sin (b/2)
-      , w <- -2*v*v = (u*w + u + w) :+ (u+1)*sin b
+      , w <- -(2*v*v) = (u*w + u + w) :+ (u+1)*sin b
       | otherwise = exp x - 1
diff --git a/lib/Data/Constraint.hs b/lib/Data/Constraint.hs
--- a/lib/Data/Constraint.hs
+++ b/lib/Data/Constraint.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Constraint(module Data.Constraint) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives  -- for (->)
 import Text.Show
 
diff --git a/lib/Data/Double.hs b/lib/Data/Double.hs
--- a/lib/Data/Double.hs
+++ b/lib/Data/Double.hs
@@ -1,5 +1,5 @@
 module Data.Double(Double) where
-import Prelude()
+import qualified Prelude()
 import Primitives
 import Data.Bool
 import Data.Eq
diff --git a/lib/Data/Dynamic.hs b/lib/Data/Dynamic.hs
--- a/lib/Data/Dynamic.hs
+++ b/lib/Data/Dynamic.hs
@@ -28,8 +28,8 @@
 dynApp f a = fromMaybe (error "Dynamic.dynApp") $ dynApply f a
 
 dynApply :: Dynamic -> Dynamic -> Maybe Dynamic
-dynApply (D ftr f) (D atr a) = fmap g $ funResultTy ftr atr
-  where g rtr = D rtr ((unsafeCoerce f) a)
+dynApply (D ftr f) (D atr a) = g <$> funResultTy ftr atr
+  where g rtr = D rtr (unsafeCoerce f a)
 
 dynTypeRep :: Dynamic -> TypeRep
 dynTypeRep (D tr _) = tr
diff --git a/lib/Data/Either.hs b/lib/Data/Either.hs
--- a/lib/Data/Either.hs
+++ b/lib/Data/Either.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Either(module Data.Either) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Applicative
 import Control.Monad
diff --git a/lib/Data/Enum.hs b/lib/Data/Enum.hs
--- a/lib/Data/Enum.hs
+++ b/lib/Data/Enum.hs
@@ -1,5 +1,13 @@
-module Data.Enum(module Data.Enum) where
-import Prelude()              -- do not import Prelude
+module Data.Enum (
+  Enum(..),
+  boundedEnumFrom,
+  boundedEnumFromThen,
+  numericEnumFrom,
+  numericEnumFromThen,
+  numericEnumFromTo,
+  numericEnumFromThenTo,
+) where
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Error
 import Data.Bool
@@ -23,7 +31,7 @@
   enumFromThenTo :: a -> a -> a -> [a]
 
   succ                   = toEnum . (+ 1) . fromEnum
-  pred                   = toEnum . (subtract 1) . fromEnum
+  pred                   = toEnum . subtract 1 . fromEnum
   enumFrom x             = map toEnum [fromEnum x ..]
   enumFromThen x y       = map toEnum [fromEnum x, fromEnum y ..]
   enumFromTo x y         = map toEnum [fromEnum x .. fromEnum y]
@@ -54,41 +62,79 @@
 
 numericEnumFromThenTo :: (Num a, Ord a) => a -> a -> a -> [a]
 numericEnumFromThenTo l m h =
-    if m > l then
-      takeWhile (<= h) (numericEnumFromThen l m)
-    else
-      takeWhile (>= h) (numericEnumFromThen l m)
+  if m > l then
+    takeWhile (<= h) (numericEnumFromThen l m)
+  else
+    takeWhile (>= h) (numericEnumFromThen l m)
 
+eftInt :: Int -> Int -> [Int]
+eftInt x y = if x `primIntGT` y then [] else go x
+  where
+    go n = n : if n `primIntEQ` y then [] else go (n `primIntAdd` 1)
+
+efttIntUp :: Int -> Int -> Int -> [Int]
+-- x2 >= x1
+efttIntUp x1 x2 y
+  | y `primIntLT` x2 = if y `primIntLT` x1 then [] else [x1]
+  | otherwise =
+    let
+      delta = x2 `primIntSub` x1
+      y' = y `primIntSub` delta
+      go x = if x `primIntGT` y' then [x] else x : go (x `primIntAdd` delta)
+    in x1 : go x2
+
+efttIntDown :: Int -> Int -> Int -> [Int]
+-- x2 <= x1
+efttIntDown x1 x2 y
+  | y `primIntGT` x2 = if y `primIntGT` x1 then [] else [x1]
+  | otherwise =
+    let
+      delta = x2 `primIntSub` x1
+      y' = y `primIntSub` delta
+      go x = if x `primIntLT` y' then [x] else x : go (x `primIntAdd` delta)
+    in x1 : go x2
+
 -- This instance is difficult to put in Data.Int,
 -- so it gets to live here.
 instance Enum Int where
-  succ x = x + 1
-  pred x = x - 1
+  succ x = if x `primIntEQ` maxBound then error "Int.succ: overflow" else x + 1
+  pred x = if x `primIntEQ` minBound then error "Int.pred: underflow" else x - 1
   toEnum x = x
   fromEnum x = x
-  enumFrom = numericEnumFrom
-  enumFromThen = numericEnumFromThen
-  enumFromTo = numericEnumFromTo
-  enumFromThenTo = numericEnumFromThenTo
+  enumFrom n = eftInt n maxBound
+  enumFromThen x1 x2
+    | x2 `primIntGE` x1 = efttIntUp x1 x2 maxBound
+    | otherwise         = efttIntDown x1 x2 minBound
+  enumFromTo = eftInt
+  enumFromThenTo x1 x2 y
+    | x2 `primIntGE` x1 = efttIntUp x1 x2 y
+    | otherwise         = efttIntDown x1 x2 y
 
 -- Likewise for Bool
 instance Enum Bool where
   fromEnum False = 0
   fromEnum True  = 1
-  toEnum i = if primIntEQ i (0::Int) then False else
-             if primIntEQ i (1::Int) then True  else
-             error "Enum.Bool.toEnum: bad arg"
+  toEnum i
+    | i `primIntEQ` 0 = False
+    | i `primIntEQ` 1 = True
+    | otherwise       = error "Enum.Bool.toEnum: bad arg"
+  enumFrom = boundedEnumFrom
+  enumFromThen = boundedEnumFromThen
 
 instance Enum Char where
   fromEnum = primOrd
   toEnum   = primChr
-
+  enumFrom = boundedEnumFrom
+  enumFromThen = boundedEnumFromThen
 
 instance Enum Ordering where
-  fromEnum LT = (0::Int)
-  fromEnum EQ = (1::Int)
-  fromEnum GT = (2::Int)
-  toEnum i =      if i `primIntEQ` 0 then LT
-             else if i `primIntEQ` 1 then EQ
-             else if i `primIntEQ` 2 then GT
-             else error "Ord.toEnum: out of range"
+  fromEnum LT = 0
+  fromEnum EQ = 1
+  fromEnum GT = 2
+  toEnum i
+    | i `primIntEQ` 0 = LT
+    | i `primIntEQ` 1 = EQ
+    | i `primIntEQ` 2 = GT
+    | otherwise       = error "Ord.toEnum: out of range"
+  enumFrom = boundedEnumFrom
+  enumFromThen = boundedEnumFromThen
diff --git a/lib/Data/Eq.hs b/lib/Data/Eq.hs
--- a/lib/Data/Eq.hs
+++ b/lib/Data/Eq.hs
@@ -1,7 +1,7 @@
 module Data.Eq(
   module Data.Eq
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Bool_Type
 
@@ -11,4 +11,3 @@
   (==) :: a -> a -> Bool
   (/=) :: a -> a -> Bool
   x /= y = if x == y then False else True
-
diff --git a/lib/Data/Fixed.hs b/lib/Data/Fixed.hs
--- a/lib/Data/Fixed.hs
+++ b/lib/Data/Fixed.hs
@@ -32,12 +32,13 @@
     mod',
     divMod'
 ) where
-import Prelude()
+import qualified Prelude()
 import MiniPrelude
 import Data.TypeLits (KnownNat, natVal)
 import Text.Read.Internal
 import Text.ParserCombinators.ReadPrec
 import Text.Read.Lex
+import Data.Coerce
 import Data.Double
 import Data.Floating
 import Data.Fractional
@@ -49,14 +50,14 @@
 default () -- avoid any defaulting shenanigans
 
 div' :: (Real a,Integral b) => a -> a -> b
-div' n d = floor ((toRational n) / (toRational d))
+div' n d = floor (toRational n / toRational d)
 
 divMod' :: (Real a,Integral b) => a -> a -> (b,a)
-divMod' n d = (f,n - (fromIntegral f) * d) where
+divMod' n d = (f,n - fromIntegral f * d) where
     f = div' n d
 
 mod' :: (Real a) => a -> a -> a
-mod' n d = n - (fromInteger f) * d where
+mod' n d = n - fromInteger f * d where
     f = div' n d
 
 type Fixed :: forall k . k -> Type
@@ -98,10 +99,10 @@
     pred (MkFixed a) = MkFixed (pred a)
     toEnum = MkFixed . toEnum
     fromEnum (MkFixed a) = fromEnum a
-    enumFrom (MkFixed a) = fmap MkFixed (enumFrom a)
-    enumFromThen (MkFixed a) (MkFixed b) = fmap MkFixed (enumFromThen a b)
-    enumFromTo (MkFixed a) (MkFixed b) = fmap MkFixed (enumFromTo a b)
-    enumFromThenTo (MkFixed a) (MkFixed b) (MkFixed c) = fmap MkFixed (enumFromThenTo a b c)
+    enumFrom (MkFixed a) = coerce (enumFrom a)
+    enumFromThen (MkFixed a) (MkFixed b) = coerce (enumFromThen a b)
+    enumFromTo (MkFixed a) (MkFixed b) = coerce (enumFromTo a b)
+    enumFromThenTo (MkFixed a) (MkFixed b) (MkFixed c) = coerce (enumFromThenTo a b c)
 
 instance (HasResolution a) => Num (Fixed a) where
     (MkFixed a) + (MkFixed b) = MkFixed (a + b)
@@ -113,16 +114,16 @@
     fromInteger i = withResolution (\res -> MkFixed (i * res))
 
 instance (HasResolution a) => Real (Fixed a) where
-    toRational fa@(MkFixed a) = (toRational a) / (toRational (resolution fa))
+    toRational fa@(MkFixed a) = toRational a / toRational (resolution fa)
 
 instance (HasResolution a) => Fractional (Fixed a) where
-    fa@(MkFixed a) / (MkFixed b) = MkFixed (div (a * (resolution fa)) b)
+    fa@(MkFixed a) / (MkFixed b) = MkFixed (div (a * resolution fa) b)
     recip fa@(MkFixed a) = MkFixed (div (res * res) a) where
         res = resolution fa
-    fromRational r = withResolution (\res -> MkFixed (floor (r * (toRational res))))
+    fromRational r = withResolution (\res -> MkFixed (floor (r * toRational res)))
 
 instance (HasResolution a) => RealFrac (Fixed a) where
-    properFraction a = (i,a - (fromIntegral i)) where
+    properFraction a = (i,a - fromIntegral i) where
         i = truncate a
     truncate f = truncate (toRational f)
     round f = round (toRational f)
@@ -145,8 +146,8 @@
 withDot s = '.':s
 
 showFixed :: (HasResolution a) => Bool -> Fixed a -> String
-showFixed chopTrailingZeros fa@(MkFixed a) | a < 0 = "-" ++ (showFixed chopTrailingZeros (asTypeOf (MkFixed (negate a)) fa))
-showFixed chopTrailingZeros fa@(MkFixed a) = (show i) ++ (withDot (showIntegerZeros chopTrailingZeros digits fracNum)) where
+showFixed chopTrailingZeros fa@(MkFixed a) | a < 0 = "-" ++ showFixed chopTrailingZeros (asTypeOf (MkFixed (negate a)) fa)
+showFixed chopTrailingZeros fa@(MkFixed a) = show i ++ withDot (showIntegerZeros chopTrailingZeros digits fracNum) where
     res = resolution fa
     (i,d) = divMod a res
     -- enough digits to be unambiguous
diff --git a/lib/Data/Float.hs b/lib/Data/Float.hs
--- a/lib/Data/Float.hs
+++ b/lib/Data/Float.hs
@@ -1,5 +1,5 @@
 module Data.Float(Float) where
-import Prelude()
+import qualified Prelude()
 import Primitives
 import Data.Bool
 import Data.Eq
diff --git a/lib/Data/FloatW.hs b/lib/Data/FloatW.hs
--- a/lib/Data/FloatW.hs
+++ b/lib/Data/FloatW.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.FloatW(FloatW) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Error
 import Data.Bits
@@ -61,7 +61,7 @@
   (<=) = primFloatWLE
   (>)  = primFloatWGT
   (>=) = primFloatWGE
-  
+
 -- For now, cheat and call C
 instance Show FloatW where
   show = primFloatWShow -- should be Numeric.FormatFloat.showFloat, but that drags in a lot of stuff
diff --git a/lib/Data/Floating.hs b/lib/Data/Floating.hs
--- a/lib/Data/Floating.hs
+++ b/lib/Data/Floating.hs
@@ -1,5 +1,5 @@
 module Data.Floating(module Data.Floating) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Fractional
 import Data.Num
diff --git a/lib/Data/Foldable.hs b/lib/Data/Foldable.hs
--- a/lib/Data/Foldable.hs
+++ b/lib/Data/Foldable.hs
@@ -41,7 +41,7 @@
     notElem,
     find
     ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Applicative(Applicative(..), Alternative(..))
 import Control.Error
@@ -80,16 +80,16 @@
     foldr f z t = appEndo (foldMap (Endo . f) t) z
 
     foldr' :: forall a b . (a -> b -> b) -> b -> t a -> b
-    foldr' f z0 = \ xs ->
-        foldl (\ k x -> {-oneShot-} (\ z -> z `seq` k (f x z)))
+    foldr' f z0 xs =
+        foldl (\ k x z -> z `seq` k (f x z))
               id xs z0
 
     foldl :: forall a b . (b -> a -> b) -> b -> t a -> b
     foldl f z t = appEndo (getDual (foldMap (Dual . Endo . flip f) t)) z
 
     foldl' :: forall a b . (b -> a -> b) -> b -> t a -> b
-    foldl' f z0 = \ xs ->
-        foldr (\ x k -> {-oneShot-} (\ z -> z `seq` k (f z x)))
+    foldl' f z0 xs =
+        foldr (\ x k z -> z `seq` k (f z x))
               id xs z0
 
     foldr1 :: forall a . (a -> a -> a) -> t a -> a
@@ -162,7 +162,7 @@
     product = List.product
     sum     = List.sum
     toList  = id
-  
+
 instance Foldable (Either a) where
     foldMap _ (Left _) = mempty
     foldMap f (Right y) = f y
@@ -409,7 +409,7 @@
 msum = asum
 
 concat :: forall (t :: Type -> Type) a . Foldable t => t [a] -> [a]
-concat xs = foldr (\x y -> foldr (:) y x) [] xs
+concat xs = foldr (flip (foldr (:))) [] xs
 
 concatMap :: forall (t :: Type -> Type) a b . Foldable t => (a -> [b]) -> t a -> [b]
 concatMap f xs = foldr (\x b -> foldr (:) b (f x)) [] xs
diff --git a/lib/Data/Foldable/Internal.hs b/lib/Data/Foldable/Internal.hs
--- a/lib/Data/Foldable/Internal.hs
+++ b/lib/Data/Foldable/Internal.hs
@@ -1,5 +1,5 @@
 module Data.Foldable.Internal(module Data.Foldable.Internal) where
-import Prelude()
+import qualified Prelude()
 import Control.Applicative
 import Control.Monad
 import Data.Bool
diff --git a/lib/Data/Fractional.hs b/lib/Data/Fractional.hs
--- a/lib/Data/Fractional.hs
+++ b/lib/Data/Fractional.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Fractional(module Data.Fractional) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Integral
 import Data.Num
diff --git a/lib/Data/Function.hs b/lib/Data/Function.hs
--- a/lib/Data/Function.hs
+++ b/lib/Data/Function.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Function(module Data.Function) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Bool_Type
 --import Data.Tuple
diff --git a/lib/Data/Functor.hs b/lib/Data/Functor.hs
--- a/lib/Data/Functor.hs
+++ b/lib/Data/Functor.hs
@@ -6,9 +6,11 @@
   unzip,
   void,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives  -- for fixity
 import Data.Function
+
+infixl 4 <$
 
 class Functor f where
   fmap :: forall a b . (a -> b) -> f a -> f b
diff --git a/lib/Data/Functor/Classes.hs b/lib/Data/Functor/Classes.hs
--- a/lib/Data/Functor/Classes.hs
+++ b/lib/Data/Functor/Classes.hs
@@ -22,6 +22,7 @@
 
 import Control.Applicative (Alternative((<|>)), Const(Const))
 import Data.Functor.Identity (Identity(Identity))
+import Data.Functor (($>))
 import Data.Proxy (Proxy(Proxy))
 import Data.List.NonEmpty (NonEmpty(..))
 --import Data.Ord (Down(Down))
@@ -165,7 +166,7 @@
 
 instance Read1 Maybe where
     liftReadPrec rp _ =
-        parens (expectP (Ident "Nothing") *> pure Nothing)
+        parens (expectP (Ident "Nothing") $> Nothing)
         <|>
         readData (readUnaryWith rp "Just" Just)
 
@@ -288,7 +289,7 @@
 
 instance Show a => Show2 ((,,) a) where
     liftShowsPrec2 sp1 _ sp2 _ _ (x1,y1,y2)
-        = showChar '(' . showsPrec 0 x1
+        = showChar '(' . shows x1
         . showChar ',' . sp1 0 y1
         . showChar ',' . sp2 0 y2
         . showChar ')'
@@ -336,8 +337,8 @@
 
 instance (Show a, Show b) => Show2 ((,,,) a b) where
     liftShowsPrec2 sp1 _ sp2 _ _ (x1,x2,y1,y2)
-        = showChar '(' . showsPrec 0 x1
-        . showChar ',' . showsPrec 0 x2
+        = showChar '(' . shows x1
+        . showChar ',' . shows x2
         . showChar ',' . sp1 0 y1
         . showChar ',' . sp2 0 y2
         . showChar ')'
diff --git a/lib/Data/Functor/Compose.hs b/lib/Data/Functor/Compose.hs
--- a/lib/Data/Functor/Compose.hs
+++ b/lib/Data/Functor/Compose.hs
@@ -1,12 +1,3 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE GADTs #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE PolyKinds #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE Trustworthy #-}
-{-# LANGUAGE StandaloneDeriving #-}
-
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Functor.Compose
diff --git a/lib/Data/Functor/Const.hs b/lib/Data/Functor/Const.hs
--- a/lib/Data/Functor/Const.hs
+++ b/lib/Data/Functor/Const.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Functor.Const(Const(..), getConst) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Applicative
 import Control.Monad
diff --git a/lib/Data/Functor/Const_Type.hs b/lib/Data/Functor/Const_Type.hs
--- a/lib/Data/Functor/Const_Type.hs
+++ b/lib/Data/Functor/Const_Type.hs
@@ -1,9 +1,10 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Functor.Const_Type(Const(..), getConst) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Bool
+import Data.Coerce
 import Data.Eq
 import Data.Function
 import Data.Functor
diff --git a/lib/Data/Functor/Contravariant.hs b/lib/Data/Functor/Contravariant.hs
--- a/lib/Data/Functor/Contravariant.hs
+++ b/lib/Data/Functor/Contravariant.hs
@@ -1,11 +1,3 @@
-{-# LANGUAGE DerivingVia #-}
-{-# LANGUAGE EmptyCase #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE InstanceSigs #-}
-{-# LANGUAGE StandaloneDeriving #-}
-{-# LANGUAGE Trustworthy #-}
-{-# LANGUAGE TypeOperators #-}
-
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Functor.Contravariant
@@ -51,8 +43,10 @@
 
 import Control.Applicative
 import Control.Category
+import Control.Monad
 import Data.Function (on)
 
+import Data.Functor
 import Data.Functor.Product
 import Data.Functor.Sum
 import Data.Functor.Compose
@@ -118,7 +112,7 @@
 -- 'contramap' f ≡ 'phantom'
 -- @
 phantom :: (Functor f, Contravariant f) => f a -> f b
-phantom x = () <$ x $< ()
+phantom x = void x $< ()
 
 infixl 4 >$, $<, >$<, >$$<
 
diff --git a/lib/Data/Functor/Identity.hs b/lib/Data/Functor/Identity.hs
--- a/lib/Data/Functor/Identity.hs
+++ b/lib/Data/Functor/Identity.hs
@@ -1,11 +1,12 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Functor.Identity(Identity(..)) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Applicative
 import Control.Monad
 import Data.Bool
+import Data.Coerce
 import Data.Eq
 import Data.Function
 import Data.Functor
diff --git a/lib/Data/Functor/Product.hs b/lib/Data/Functor/Product.hs
--- a/lib/Data/Functor/Product.hs
+++ b/lib/Data/Functor/Product.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE PolyKinds #-}
-{-# LANGUAGE Safe #-}
-{-# LANGUAGE StandaloneDeriving #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Functor.Product
diff --git a/lib/Data/Functor/Sum.hs b/lib/Data/Functor/Sum.hs
--- a/lib/Data/Functor/Sum.hs
+++ b/lib/Data/Functor/Sum.hs
@@ -1,8 +1,3 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE PolyKinds #-}
-{-# LANGUAGE Safe #-}
-{-# LANGUAGE StandaloneDeriving #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Functor.Sum
diff --git a/lib/Data/Generics.hs b/lib/Data/Generics.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/Generics.hs
@@ -0,0 +1,32 @@
+module Data.Generics(
+  ) where
+
+type V1 :: forall (k::Kind) . k -> Type
+data V1 p
+
+type U1 :: forall (k::Kind) . k -> Type
+data U1 p = U1
+
+newtype Par1 p = Par1 p
+
+type Rec1 :: forall (k::Kind) . (k -> Type) -> k -> Type
+newtype Rec1 f p = Rec1 (f p)
+
+type K1 :: forall (k::Kind) . Type -> Type -> k -> Type
+newtype K1 i c p = K1 c
+
+newtype M1 :: forall k . Type -> Type{-Meta-} -> (k -> Type) -> k -> Type
+newtype M1 i c f p = M1 (f p)
+
+infixr 5 :+:
+type (:+:) :: forall k . (k -> Type) -> (k -> Type) -> k -> Type
+data (:+:) f g p = L1 (f p) | R1 (g p)
+
+infixr 6 :*:
+type (:*:) :: forall k . (k -> Type) -> (k -> Type) -> k -> Type
+data (:*:) f g p = f p :*: g p
+
+infixr 7 :.:
+type (:.:) :: forall k1 k2 . (k2 -> Type) -> (k1 -> k2) -> k1 -> Type
+newtype (:.:) f g p = Comp1 (f (g p))
+
diff --git a/lib/Data/IOArray.hs b/lib/Data/IOArray.hs
--- a/lib/Data/IOArray.hs
+++ b/lib/Data/IOArray.hs
@@ -1,5 +1,5 @@
 module Data.IOArray(module Data.IOArray, IOArray) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 
 -- data IOArray
diff --git a/lib/Data/IORef.hs b/lib/Data/IORef.hs
--- a/lib/Data/IORef.hs
+++ b/lib/Data/IORef.hs
@@ -5,7 +5,7 @@
   writeIORef,
   modifyIORef,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Eq
 import {-# SOURCE #-} Data.Typeable
diff --git a/lib/Data/Int.hs b/lib/Data/Int.hs
--- a/lib/Data/Int.hs
+++ b/lib/Data/Int.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Int(Int, Int8, Int16, Int32, Int64) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Bool_Type
 import Data.Bounded
diff --git a/lib/Data/Int/Instances.hs b/lib/Data/Int/Instances.hs
--- a/lib/Data/Int/Instances.hs
+++ b/lib/Data/Int/Instances.hs
@@ -1,10 +1,11 @@
 module Data.Int.Instances() where
-import Prelude()
+import qualified Prelude()
 import Primitives
 import Control.Error
 import Data.Bits
-import Data.Bool_Type
+import Data.Bool
 import Data.Bounded
+import Data.Coerce
 import Data.Enum
 import Data.Eq
 import Data.Function
@@ -54,8 +55,8 @@
   toInteger = _intToInteger . unI8
 
 instance Bounded Int8 where
-  minBound = I8 0x80
-  maxBound = I8 0x7f
+  minBound = i8 0x80
+  maxBound = i8 0x7f
 
 instance Real Int8 where
   toRational = _integerToRational . _intToInteger . unI8
@@ -69,14 +70,16 @@
 -}
 
 instance Enum Int8 where
-  succ x = x + 1
-  pred x = x - 1
+  succ x = if x == maxBound then error "Int8.succ: overflow" else x + 1
+  pred x = if x == minBound then error "Int8.pred: underflow" else x - 1
   toEnum = i8
   fromEnum = unI8
-  enumFrom = numericEnumFrom
-  enumFromThen = numericEnumFromThen
-  enumFromTo = numericEnumFromTo
-  enumFromThenTo = numericEnumFromThenTo
+  enumFrom n = enumFromTo n maxBound
+  enumFromThen n m
+    | m >= n = enumFromThenTo n m maxBound
+    | otherwise = enumFromThenTo n m minBound
+  enumFromTo = coerce (enumFromTo @Int)
+  enumFromThenTo = coerce (enumFromThenTo @Int)
 
 instance Eq Int8 where
   (==) = cmp8 primIntEQ
@@ -110,6 +113,7 @@
   testBit = testBitDefault
   popCount (I8 x) = primIntPopcount (x .&. 0xff)
   zeroBits = 0
+  isSigned _ = True
 
 instance FiniteBits Int8 where
   finiteBitSize _ = 8
@@ -150,8 +154,8 @@
   toInteger = _intToInteger . unI16
 
 instance Bounded Int16 where
-  minBound = I16 0x8000
-  maxBound = I16 0x7fff
+  minBound = i16 0x8000
+  maxBound = i16 0x7fff
 
 instance Real Int16 where
   toRational = _integerToRational . _intToInteger . unI16
@@ -165,14 +169,16 @@
 -}
 
 instance Enum Int16 where
-  succ x = x + 1
-  pred x = x - 1
+  succ x = if x == maxBound then error "Int16.succ: overflow" else x + 1
+  pred x = if x == minBound then error "Int16.pred: underflow" else x - 1
   toEnum = i16
   fromEnum = unI16
-  enumFrom = numericEnumFrom
-  enumFromThen = numericEnumFromThen
-  enumFromTo = numericEnumFromTo
-  enumFromThenTo = numericEnumFromThenTo
+  enumFrom n = enumFromTo n maxBound
+  enumFromThen n m
+    | m >= n = enumFromThenTo n m maxBound
+    | otherwise = enumFromThenTo n m minBound
+  enumFromTo = coerce (enumFromTo @Int)
+  enumFromThenTo = coerce (enumFromThenTo @Int)
 
 instance Eq Int16 where
   (==) = cmp16 primIntEQ
@@ -206,6 +212,7 @@
   testBit = testBitDefault
   popCount (I16 x) = primIntPopcount (x .&. 0xffff)
   zeroBits = 0
+  isSigned _ = True
 
 instance FiniteBits Int16 where
   finiteBitSize _ = 16
@@ -246,8 +253,8 @@
   toInteger = _intToInteger . unI32
 
 instance Bounded Int32 where
-  minBound = I32 0x80000000
-  maxBound = I32 0x7fffffff
+  minBound = i32 0x80000000
+  maxBound = i32 0x7fffffff
 
 instance Real Int32 where
   toRational = _integerToRational . _intToInteger . unI32
@@ -261,14 +268,16 @@
 -}
 
 instance Enum Int32 where
-  succ x = x + 1
-  pred x = x - 1
+  succ x = if x == maxBound then error "Int32.succ: overflow" else x + 1
+  pred x = if x == minBound then error "Int32.pred: underflow" else x - 1
   toEnum = i32
   fromEnum = unI32
-  enumFrom = numericEnumFrom
-  enumFromThen = numericEnumFromThen
-  enumFromTo = numericEnumFromTo
-  enumFromThenTo = numericEnumFromThenTo
+  enumFrom n = enumFromTo n maxBound
+  enumFromThen n m
+    | m >= n = enumFromThenTo n m maxBound
+    | otherwise = enumFromThenTo n m minBound
+  enumFromTo = coerce (enumFromTo @Int)
+  enumFromThenTo = coerce (enumFromThenTo @Int)
 
 instance Eq Int32 where
   (==) = cmp32 primIntEQ
@@ -302,6 +311,7 @@
   testBit = testBitDefault
   popCount (I32 x) = primIntPopcount (x .&. 0xffffffff)
   zeroBits = 0
+  isSigned _ = True
 
 instance FiniteBits Int32 where
   finiteBitSize _ = 32
@@ -341,8 +351,8 @@
   toInteger = _intToInteger . unI64
 
 instance Bounded Int64 where
-  minBound = I64 0x8000000000000000
-  maxBound = I64 0x7fffffffffffffff
+  minBound = i64 0x8000000000000000
+  maxBound = i64 0x7fffffffffffffff
 
 instance Real Int64 where
   toRational = _integerToRational . _intToInteger . unI64
@@ -356,14 +366,16 @@
 -}
 
 instance Enum Int64 where
-  succ x = x + 1
-  pred x = x - 1
+  succ x = if x == maxBound then error "Int64.succ: overflow" else x + 1
+  pred x = if x == minBound then error "Int64.pred: underflow" else x - 1
   toEnum = i64
   fromEnum = unI64
-  enumFrom = numericEnumFrom
-  enumFromThen = numericEnumFromThen
-  enumFromTo = numericEnumFromTo
-  enumFromThenTo = numericEnumFromThenTo
+  enumFrom n = enumFromTo n maxBound
+  enumFromThen n m
+    | m >= n = enumFromThenTo n m maxBound
+    | otherwise = enumFromThenTo n m minBound
+  enumFromTo = coerce (enumFromTo @Int)
+  enumFromThenTo = coerce (enumFromThenTo @Int)
 
 instance Eq Int64 where
   (==) = cmp64 primIntEQ
@@ -397,6 +409,7 @@
   testBit = testBitDefault
   popCount (I64 x) = primIntPopcount x
   zeroBits = 0
+  isSigned _ = True
 
 instance FiniteBits Int64 where
   finiteBitSize _ = 64
diff --git a/lib/Data/Int/IntN.hs b/lib/Data/Int/IntN.hs
--- a/lib/Data/Int/IntN.hs
+++ b/lib/Data/Int/IntN.hs
@@ -1,7 +1,7 @@
 -- Copyright 2024 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Int.IntN(module Data.Int.IntN) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 
 -- Just the types for sized Int.
diff --git a/lib/Data/Integer.hs b/lib/Data/Integer.hs
--- a/lib/Data/Integer.hs
+++ b/lib/Data/Integer.hs
@@ -5,7 +5,7 @@
   _integerToIntList,
   _intListToInteger,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Data.Bits
 import Data.Bool
 import Data.Enum
@@ -96,6 +96,7 @@
   zeroBits = zeroI
   bitSizeMaybe _ = Nothing
   popCount = popCountI
+  isSigned _ = True
 
 -----------------
 
diff --git a/lib/Data/Integer/Internal.hs b/lib/Data/Integer/Internal.hs
--- a/lib/Data/Integer/Internal.hs
+++ b/lib/Data/Integer/Internal.hs
@@ -14,7 +14,7 @@
   _integerToInt,
   _wordToInteger,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 --import Primitives
 import Control.Error
 import Data.Bits
@@ -509,4 +509,3 @@
   mapM_ qc [prop_div, prop_muldiv]
 
 -}
-
diff --git a/lib/Data/Integer_Type.hs b/lib/Data/Integer_Type.hs
--- a/lib/Data/Integer_Type.hs
+++ b/lib/Data/Integer_Type.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Integer_Type(module Data.Integer_Type) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import {-# SOURCE #-} Control.Error
 import Data.Bool_Type
@@ -25,13 +25,7 @@
 maxD = 1 `primWordShl` shiftD
 
 shiftD :: Int
-shiftD =
-  if _wordSize `primIntEQ` 64 then
-    (32 :: Int) -- this is used so multiplication of two digits doesn't overflow a 64 bit Word
-  else if _wordSize `primIntEQ` 32 then
-    (16 :: Int) -- this is used so multiplication of two digits doesn't overflow a 32 bit Word
-  else
-    error "Integer: unsupported word size"
+shiftD = _wordSize `primIntShr` 1 -- this is used so multiplication of two digits doesn't overflow a Word
 
 quotMaxD :: Digit -> Digit
 quotMaxD d = d `primWordShr` shiftD
diff --git a/lib/Data/Integral.hs b/lib/Data/Integral.hs
--- a/lib/Data/Integral.hs
+++ b/lib/Data/Integral.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Integral(module Data.Integral) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Error
 import Data.Bool
@@ -42,7 +42,7 @@
   if x == 0 || y == 0 then
     0
   else
-    abs ((x `quot` (gcd x y)) * y)
+    abs ((x `quot` gcd x y) * y)
 
 even :: forall a . (Integral a) => a -> Bool
 even n = n `rem` 2 == 0
diff --git a/lib/Data/Ix.hs b/lib/Data/Ix.hs
--- a/lib/Data/Ix.hs
+++ b/lib/Data/Ix.hs
@@ -1,5 +1,5 @@
 module Data.Ix(Ix(..)) where
-import Prelude()
+import qualified Prelude()
 import Control.Error
 import Data.Bool
 import Data.Char
@@ -88,8 +88,8 @@
 
   unsafeIndex ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
     unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (
-    unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * (
-    unsafeIndex (l1,u1) i1))
+    unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * 
+                             unsafeIndex (l1,u1) i1)
 
   inRange ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
     inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
@@ -105,8 +105,8 @@
   unsafeIndex ((l1,l2,l3,l4),(u1,u2,u3,u4)) (i1,i2,i3,i4) =
     unsafeIndex (l4,u4) i4 + unsafeRangeSize (l4,u4) * (
     unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (
-    unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * (
-    unsafeIndex (l1,u1) i1)))
+    unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) *
+                             unsafeIndex (l1,u1) i1))
 
   inRange ((l1,l2,l3,l4),(u1,u2,u3,u4)) (i1,i2,i3,i4) =
     inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
diff --git a/lib/Data/Kind.hs b/lib/Data/Kind.hs
--- a/lib/Data/Kind.hs
+++ b/lib/Data/Kind.hs
@@ -1,3 +1,3 @@
 module Data.Kind(Type, Constraint) where
-import Prelude()
+import qualified Prelude()
 import Primitives
diff --git a/lib/Data/List.hs b/lib/Data/List.hs
--- a/lib/Data/List.hs
+++ b/lib/Data/List.hs
@@ -27,7 +27,7 @@
   sortBy, insertBy, maximumBy, minimumBy,
   genericLength, genericTake, genericDrop, genericSplitAt, genericIndex, genericReplicate,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Applicative
 import Control.Error
@@ -66,8 +66,8 @@
 
 instance Applicative [] where
   pure a = [a]
-  fs <*> xs = concatMap (\f -> map f xs) fs
-  xs *> ys = concatMap (\_ -> ys) xs
+  fs <*> xs = concatMap (`map` xs) fs
+  xs *> ys = concatMap (const ys) xs
   liftA2 f xs ys = concatMap (\x -> map (f x) ys) xs
 
 instance Show a => Show [a] where
@@ -147,17 +147,17 @@
 
 minimum :: forall a . Ord a => [a] -> a
 minimum [] = error "minimum: empty list"
-minimum (x:ys) = foldr (\ y m -> if y < m then y else m) x ys
+minimum (x:ys) = foldr min x ys
 
 maximum :: forall a . Ord a => [a] -> a
 maximum [] = error "maximum: empty list"
-maximum (x:ys) = foldr (\ y m -> if y > m then y else m) x ys
+maximum (x:ys) = foldr max x ys
 
 sum :: forall a . Num a => [a] -> a
-sum = foldr (+) 0
+sum = foldl' (+) 0
 
 product :: forall a . Num a => [a] -> a
-product = foldr (*) 1
+product = foldl' (*) 1
 
 and :: [Bool] -> Bool
 and = foldr (&&) True
@@ -200,22 +200,22 @@
   in rec (0::Int)
 
 zip :: forall a b . [a] -> [b] -> [(a, b)]
-zip = zipWith (\ x y -> (x, y))
+zip = zipWith (,)
 
 zip3 :: forall a b c . [a] -> [b] -> [c] -> [(a, b, c)]
-zip3 = zipWith3 (\ x y z -> (x, y, z))
+zip3 = zipWith3 (,,)
 
 zip4 :: forall a b c d . [a] -> [b] -> [c] -> [d] -> [(a, b, c, d)]
-zip4 = zipWith4 (\ x y z w -> (x, y, z, w))
+zip4 = zipWith4 (,,,)
 
 zip5 :: forall a b c d e . [a] -> [b] -> [c] -> [d] -> [e] -> [(a, b, c, d, e)]
-zip5 = zipWith5 (\ x y z w u -> (x, y, z, w, u))
+zip5 = zipWith5 (,,,,)
 
 zip6 :: forall a b c d e f . [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [(a, b, c, d, e, f)]
-zip6 = zipWith6 (\ x y z w u v -> (x, y, z, w, u, v))
+zip6 = zipWith6 (,,,,,)
 
 zip7 :: forall a b c d e f g . [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g] -> [(a, b, c, d, e, f, g)]
-zip7 = zipWith7 (\ x y z w u v t -> (x, y, z, w, u, v, t))
+zip7 = zipWith7 (,,,,,,)
 
 zipWith :: forall a b r . (a -> b -> r) -> [a] -> [b] -> [r]
 zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys
@@ -318,7 +318,7 @@
 isPrefixOf _  _ = False
 
 isSuffixOf :: forall a . Eq a => [a] -> [a] -> Bool
-isSuffixOf n h = isPrefixOf (reverse n) (reverse h)
+isSuffixOf n h = reverse n `isPrefixOf` reverse h
 
 isInfixOf :: forall a . Eq a => [a] -> [a] -> Bool
 isInfixOf cs ds = any (isPrefixOf cs) (tails ds)
@@ -415,7 +415,7 @@
 elem a = any (a ==)
 
 notElem :: forall a . (Eq a) => a -> [a] -> Bool
-notElem a as = not (elem a as)
+notElem a as = not (a `elem` as)
 
 find :: forall a . (a -> Bool) -> [a] -> Maybe a
 find p [] = Nothing
@@ -458,7 +458,7 @@
 
 nubBy :: forall a . (a -> a -> Bool) -> [a] -> [a]
 nubBy _ [] = []
-nubBy eq (x:xs) = x : nubBy eq (filter (\ y -> not (eq x y)) xs)
+nubBy eq (x:xs) = x : nubBy eq (filter (not . eq x) xs)
 
 replicate :: forall a . Int -> a -> [a]
 replicate n x = take n (repeat x)
diff --git a/lib/Data/List/NonEmpty.hs b/lib/Data/List/NonEmpty.hs
--- a/lib/Data/List/NonEmpty.hs
+++ b/lib/Data/List/NonEmpty.hs
@@ -98,7 +98,7 @@
    , nonEmpty    -- :: [a] -> Maybe (NonEmpty a)
    , xor         -- :: NonEmpty Bool -> Bool
    ) where
-import Prelude()
+import qualified Prelude()
 
 import Control.Applicative
 import Control.Error
@@ -151,7 +151,7 @@
   ~(a :| as) >>= f = b :| (bs ++ bs')
     where b :| bs = f a
           bs' = as >>= toList . f
-          
+
 --instance Foldable NonEmpty -- Defined in Data.Foldable
 --instance Traversable NonEmpty -- Defined in Data.Traversable
 --instance Read a => Read (NonEmpty a) -- Defined in GHC.Read
@@ -163,7 +163,7 @@
   foldr f z = foldr f z . toList
 instance Traversable NonEmpty where
   traverse f = fmap fromList . traverse f . toList
-  
+
 ----- End MHS replacement
 
 infixr 5 <|
@@ -620,7 +620,7 @@
 -- user-supplied equality predicate instead of the overloaded '=='
 -- function.
 nubBy :: (a -> a -> Bool) -> NonEmpty a -> NonEmpty a
-nubBy eq (a :| as) = a :| List.nubBy eq (List.filter (\b -> not (eq a b)) as)
+nubBy eq (a :| as) = a :| List.nubBy eq (List.filter (not . eq a) as)
 
 -- | 'transpose' for 'NonEmpty', behaves the same as 'GHC.Internal.Data.List.transpose'
 -- The rows/columns need not be the same length, in which case
diff --git a/lib/Data/List/NonEmpty_Type.hs b/lib/Data/List/NonEmpty_Type.hs
--- a/lib/Data/List/NonEmpty_Type.hs
+++ b/lib/Data/List/NonEmpty_Type.hs
@@ -1,5 +1,5 @@
 module Data.List.NonEmpty_Type(module Data.List.NonEmpty_Type) where
-import Prelude()
+import qualified Prelude()
 
 infixr 5 :|
 
diff --git a/lib/Data/List_Type.hs b/lib/Data/List_Type.hs
--- a/lib/Data/List_Type.hs
+++ b/lib/Data/List_Type.hs
@@ -1,5 +1,5 @@
 module Data.List_Type(module Data.List_Type) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 
 infixr 5 :
diff --git a/lib/Data/MArray.hs b/lib/Data/MArray.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/MArray.hs
@@ -0,0 +1,38 @@
+module Data.Array (
+    module Data.Ix,
+    Array,
+    array,
+    listArray,
+    accumArray,
+    (!),
+    bounds,
+    indices,
+    elems,
+    assocs,
+    (//),
+    accum,
+    ixmap,
+  ) where
+
+import Data.Ix
+
+    -- Array instances:
+    --
+    --   Ix a => Functor (Array a)
+    --   (Ix a, Eq b)  => Eq   (Array a b)
+    --   (Ix a, Ord b) => Ord  (Array a b)
+    --   (Ix a, Show a, Show b) => Show (Array a b)
+    --   (Ix a, Read a, Read b) => Read (Array a b)
+    --
+
+    array,          -- :: (Ix a) => (a,a) -> [(a,b)] -> Array a b
+    listArray,      -- :: (Ix a) => (a,a) -> [b] -> Array a b
+    accumArray,     -- :: (Ix a) => (b -> c -> b) -> b -> (a,a) -> [(a,c)] -> Array a b
+    (!),            -- :: (Ix a) => Array a b -> a -> b
+    bounds,         -- :: (Ix a) => Array a b -> (a,a)
+    indices,        -- :: (Ix a) => Array a b -> [a]
+    elems,          -- :: (Ix a) => Array a b -> [b]
+    assocs,         -- :: (Ix a) => Array a b -> [(a,b)]
+    (//),           -- :: (Ix a) => Array a b -> [(a,b)] -> Array a b
+    accum,          -- :: (Ix a) => (b -> c -> b) -> Array a b -> [(a,c)] -> Array a b
+    ixmap,          -- :: (Ix a, Ix b) => (a,a) -> (a -> b) -> Array b c -> Array a b
diff --git a/lib/Data/Maybe.hs b/lib/Data/Maybe.hs
--- a/lib/Data/Maybe.hs
+++ b/lib/Data/Maybe.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Maybe(module Data.Maybe, module Data.Maybe_Type) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Applicative
 import Control.Error
diff --git a/lib/Data/Maybe_Type.hs b/lib/Data/Maybe_Type.hs
--- a/lib/Data/Maybe_Type.hs
+++ b/lib/Data/Maybe_Type.hs
@@ -1,6 +1,6 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Maybe_Type(module Data.Maybe_Type) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 
 data Maybe a = Nothing | Just a
diff --git a/lib/Data/Monoid.hs b/lib/Data/Monoid.hs
--- a/lib/Data/Monoid.hs
+++ b/lib/Data/Monoid.hs
@@ -11,7 +11,7 @@
   First(..),
   Last(..),
   ) where
-import Prelude()
+import qualified Prelude()
 import Data.Maybe_Type
 import Data.Monoid.Internal
 import Data.Records
diff --git a/lib/Data/Monoid/Internal.hs b/lib/Data/Monoid/Internal.hs
--- a/lib/Data/Monoid/Internal.hs
+++ b/lib/Data/Monoid/Internal.hs
@@ -1,10 +1,11 @@
 module Data.Monoid.Internal(module Data.Monoid.Internal) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Applicative
 import Control.Error
 import Data.Bool
 import Data.Bounded
+import Data.Coerce
 import Data.Eq
 import Data.Function
 import Data.Functor
@@ -214,11 +215,11 @@
     | otherwise = f x0 y0
     where
       f x y
-        | y `rem` 2 == 0 = f (x <> x) (y `quot` 2)
+        | even y = f (x <> x) (y `quot` 2)
         | y == 1 = x
         | otherwise = g (x <> x) (y `quot` 2) x
       g x y z
-        | y `rem` 2 == 0 = g (x <> x) (y `quot` 2) z
+        | even y = g (x <> x) (y `quot` 2) z
         | y == 1 = x <> z
         | otherwise = g (x <> x) (y `quot` 2) (x <> z)
 
diff --git a/lib/Data/Num.hs b/lib/Data/Num.hs
--- a/lib/Data/Num.hs
+++ b/lib/Data/Num.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Num(module Data.Num) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Integer_Type
 
diff --git a/lib/Data/Ord.hs b/lib/Data/Ord.hs
--- a/lib/Data/Ord.hs
+++ b/lib/Data/Ord.hs
@@ -2,7 +2,7 @@
   module Data.Ord,
   module Data.Ordering_Type,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Bool_Type
 import Data.Bounded
diff --git a/lib/Data/Ordering_Type.hs b/lib/Data/Ordering_Type.hs
--- a/lib/Data/Ordering_Type.hs
+++ b/lib/Data/Ordering_Type.hs
@@ -1,3 +1,3 @@
 module Data.Ordering_Type(Ordering(..)) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 data Ordering = LT | EQ | GT
diff --git a/lib/Data/Orphans.hs b/lib/Data/Orphans.hs
--- a/lib/Data/Orphans.hs
+++ b/lib/Data/Orphans.hs
@@ -1,7 +1,7 @@
 -- Instance declarations that can't be put where
 -- due to import cycles.
 module Data.Orphans where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 
 instance (Show a) => Show (Down a) where
   showsPrec d (Down x) = showParen (d > 10) $
diff --git a/lib/Data/Proxy.hs b/lib/Data/Proxy.hs
--- a/lib/Data/Proxy.hs
+++ b/lib/Data/Proxy.hs
@@ -1,5 +1,5 @@
 module Data.Proxy(module Data.Proxy) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Bool_Type
 import Data.Eq
diff --git a/lib/Data/Ratio.hs b/lib/Data/Ratio.hs
--- a/lib/Data/Ratio.hs
+++ b/lib/Data/Ratio.hs
@@ -7,7 +7,7 @@
   rationalNaN,
   rationalMinusZero,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Data.Bool
 import Data.Enum
 import Data.Eq
@@ -39,7 +39,7 @@
 --  (x + y) * z + 0*z == x*z + y*z
 -- When z is a normal rational number the is clearly the same
 -- as the usual distributive law.
--- 
+--
 -- NOTE. Experimentally, we extend this with:
 --  x/0 ==  1/0 when x > 0
 --  x/0 == -1/0 when x < 0
diff --git a/lib/Data/Ratio_Type.hs b/lib/Data/Ratio_Type.hs
--- a/lib/Data/Ratio_Type.hs
+++ b/lib/Data/Ratio_Type.hs
@@ -1,5 +1,5 @@
 module Data.Ratio_Type(module Data.Ratio_Type) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Integer_Type
 
diff --git a/lib/Data/Real.hs b/lib/Data/Real.hs
--- a/lib/Data/Real.hs
+++ b/lib/Data/Real.hs
@@ -1,5 +1,5 @@
 module Data.Real(module Data.Real) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Num
 import Data.Ord
diff --git a/lib/Data/RealFloat.hs b/lib/Data/RealFloat.hs
--- a/lib/Data/RealFloat.hs
+++ b/lib/Data/RealFloat.hs
@@ -1,7 +1,7 @@
 module Data.RealFloat(
   RealFloat(..),
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Bool
 import Data.Eq
diff --git a/lib/Data/RealFrac.hs b/lib/Data/RealFrac.hs
--- a/lib/Data/RealFrac.hs
+++ b/lib/Data/RealFrac.hs
@@ -1,5 +1,5 @@
 module Data.RealFrac(module Data.RealFrac) where
-import Prelude()
+import qualified Prelude()
 import Primitives
 import Data.Ord
 import Data.Fractional
@@ -15,7 +15,7 @@
   floor          :: (Integral b) => a -> b
 
   truncate x     =  m  where (m,_) = properFraction x
-  
+
   round x        =  let (n,r) = properFraction x
                         m     = if r < 0 then n - 1 else n + 1
                         s     = signum (abs r - 0.5)
diff --git a/lib/Data/Records.hs b/lib/Data/Records.hs
--- a/lib/Data/Records.hs
+++ b/lib/Data/Records.hs
@@ -5,7 +5,7 @@
   hasField,
   composeSet,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Function
 import Data.Proxy
diff --git a/lib/Data/STRef.hs b/lib/Data/STRef.hs
--- a/lib/Data/STRef.hs
+++ b/lib/Data/STRef.hs
@@ -2,7 +2,7 @@
   STRef,
   newSTRef, readSTRef, writeSTRef, modifySTRef,
   ) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Control.Monad.ST_Type
 import Data.IORef
 import {-# SOURCE #-} Data.Typeable
diff --git a/lib/Data/Semigroup.hs b/lib/Data/Semigroup.hs
--- a/lib/Data/Semigroup.hs
+++ b/lib/Data/Semigroup.hs
@@ -15,9 +15,10 @@
   stimesIdempotent, stimesIdempotentMonoid, stimesMonoid,
   diff, cycle1,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Data.Bool
 import Data.Bounded
+import Data.Coerce
 import Data.Eq
 import Data.Function
 import Data.List.NonEmpty_Type
diff --git a/lib/Data/String.hs b/lib/Data/String.hs
--- a/lib/Data/String.hs
+++ b/lib/Data/String.hs
@@ -4,7 +4,7 @@
   lines, unlines,
   words, unwords,
   ) where
-import Prelude()
+import qualified Prelude()
 import Data.Bool
 import Data.Char
 import Data.Eq
@@ -14,5 +14,5 @@
 class IsString a where
   fromString :: String -> a
 
-instance IsString String where
+instance (a ~ Char) => IsString [a] where
   fromString s = s
diff --git a/lib/Data/Text.hs b/lib/Data/Text.hs
--- a/lib/Data/Text.hs
+++ b/lib/Data/Text.hs
@@ -2,16 +2,29 @@
   Text,
   pack, unpack,
   empty,
+  singleton,
   append,
   null,
+  length,
   head,
   tail,
+  cons,
+  snoc,
   uncons,
+  replicate,
+  splitOn,
+  dropWhileEnd,
+  words,
+  foldr,
+  concat,
   ) where
-import Prelude(); import MiniPrelude hiding(head, tail, null)
+import qualified Prelude(); import MiniPrelude hiding(head, tail, null, length, words)
+import Control.DeepSeq.Class
+import qualified Data.List as L
 import Data.Monoid.Internal
 import Data.String
 import qualified Data.ByteString.Internal as BS
+import Unsafe.Coerce(unsafeCoerce)
 
 newtype Text = T BS.ByteString
 
@@ -40,9 +53,15 @@
 instance Monoid Text where
   mempty = empty
 
+instance NFData Text where
+  rnf (T bs) = seq bs ()
+
 empty :: Text
 empty = pack []
 
+singleton :: Char -> Text
+singleton c = pack [c]
+
 pack :: String -> Text
 pack s = T (_primitive "toUTF8" s)
 
@@ -55,12 +74,51 @@
 null :: Text -> Bool
 null (T bs) = BS.null bs
 
+length :: Text -> Int
+length = L.length . unpack
+
 head :: Text -> Char
-head (T t) = _primitive "headUTF8" t
+head (T t)
+  | BS.null t = error "Data.Text.head: empty"
+  | otherwise = _primitive "headUTF8" t
 
+cons :: Char -> Text -> Text
+cons c t = singleton c `append` t
+
+snoc :: Text -> Char -> Text
+snoc t c = t `append` singleton c
+
 tail :: Text -> Text
-tail (T t) = _primitive "tailUTF8" t
+tail (T t)
+  | BS.null t = error "Data.Text.tail: empty"
+  | otherwise = _primitive "tailUTF8" t
 
 uncons :: Text -> Maybe (Char, Text)
 uncons t | null t    = Nothing
          | otherwise = Just (head t, tail t)
+
+replicate :: Int -> Text -> Text
+replicate = stimes
+
+splitOn :: Text -> Text -> [Text]
+splitOn s t = map pack $ splitOnList (unpack s) (unpack t)
+
+dropWhileEnd :: (Char -> Bool) -> Text -> Text
+dropWhileEnd p = pack . L.dropWhileEnd p . unpack
+
+splitOnList :: Eq a => [a] -> [a] -> [[a]]
+splitOnList [] = error "splitOn: empty"
+splitOnList sep = loop []
+  where
+    loop r  [] = [reverse r]
+    loop r  s@(c:cs) | Just t <- L.stripPrefix sep s = reverse r : loop [] t
+                     | otherwise = loop (c:r) cs
+
+words :: Text -> [Text]
+words = map pack . L.words . unpack
+
+foldr :: (Char -> a -> a) -> a -> Text -> a
+foldr f z = L.foldr f z . unpack
+
+concat :: [Text] -> Text
+concat = L.foldr append empty
diff --git a/lib/Data/Text/Encoding.hs b/lib/Data/Text/Encoding.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/Text/Encoding.hs
@@ -0,0 +1,148 @@
+module Data.Text.Encoding (
+    -- XXX: add more
+    decodeLatin1,
+    decodeASCIIPrefix,
+
+    decodeASCII,
+    decodeUtf8,
+    decodeUtf16LE,
+    decodeUtf16BE,
+    decodeUtf32LE,
+    decodeUtf32BE,
+
+    encodeUtf8,
+    encodeUtf16LE,
+    encodeUtf16BE,
+    encodeUtf32LE,
+    encodeUtf32BE,
+) where
+
+import Data.Bits
+import Data.ByteString (ByteString, isValidUtf8)
+import Data.ByteString qualified as BS
+import Data.Char
+import Data.Text
+import Data.Word (Word8)
+import Unsafe.Coerce (unsafeCoerce)
+
+intToWord8 :: Int -> Word8
+intToWord8 i = unsafeCoerce (i .&. 0xFF) -- Safety: Int and Word8 have the same representation and `i .&. 0xFF` ensures that the value is in the Word8 range
+
+word8ToInt :: Word8 -> Int
+word8ToInt w = unsafeCoerce w -- Safety: Int and Word8 have the same representation and a Word8 is in the Int range
+
+isValidASCII :: ByteString -> Bool
+isValidASCII = BS.all (< 0x80)
+
+decodeLatin1 :: ByteString -> Text
+decodeLatin1 = pack . unsafeCoerce BS.unpack -- Safety: Char and Word8 have the same representation & a Latin-1 byte is the correct Unicode code point
+
+decodeASCIIPrefix :: ByteString -> (Text, ByteString)
+decodeASCIIPrefix bs = let (a, b) = BS.span (< 0x80) bs in (unsafeCoerce a, b) -- Safety: the ByteString is valid ASCII, which is also valid UTF-8 and Text uses UTF-8 encoding
+
+decodeASCII :: ByteString -> Text
+decodeASCII bs
+    | isValidASCII bs = unsafeCoerce bs -- Safety: the ByteString is valid ASCII, which is also valid UTF-8 and Text uses UTF-8 encoding
+    | otherwise = error "Data.Text.Encoding.decodeASCII: invalid"
+
+decodeUtf8 :: ByteString -> Text
+decodeUtf8 bs
+    | isValidUtf8 bs = unsafeCoerce bs -- Safety: the ByteString is valid UTF-8 and Text uses UTF-8 encoding
+    | otherwise = error "Data.Text.Encoding.decodeUtf8: invalid"
+
+decodeUtf16LE :: ByteString -> Text
+decodeUtf16LE bs
+    | BS.length bs .&. 0x1 /= 0 = error "Data.Text.Encoding.decodeUtf16LE: invalid size"
+    | otherwise = pack (decode $ BS.unpack bs)
+  where
+    decode [] = []
+    decode (x1 : x2 : xs) | x2 <= 0xD7 || x2 >= 0xE0 = chr (word8ToInt x1 .|. (word8ToInt x2 `shiftL` 8)) : decode xs
+    decode (x1 : x2 : x3 : x4 : xs) | x2 .&. 0xFC == 0xD8 && x4 .&. 0xFC == 0xDC =
+      let w1 = word8ToInt x1 .|. (word8ToInt x2 `shiftL` 8)
+          w2 = word8ToInt x3 .|. (word8ToInt x4 `shiftL` 8)
+      in chr (((w2 .&. 0x3FF) .|. ((w1 .&. 0x3FF) `shiftL` 10)) + 0x10000) : decode xs
+    decode _ = error "Data.Text.Encoding.decodeUtf16LE: invalid"
+
+decodeUtf16BE :: ByteString -> Text
+decodeUtf16BE bs
+    | BS.length bs .&. 0x1 /= 0 = error "Data.Text.Encoding.decodeUtf16BE: invalid size"
+    | otherwise = pack (decode $ BS.unpack bs)
+  where
+    decode [] = []
+    decode (x1 : x2 : xs) | x1 <= 0xD7 || x1 >= 0xE0 = chr ((word8ToInt x1 `shiftL` 8) .|. word8ToInt x2) : decode xs
+    decode (x1 : x2 : x3 : x4 : xs) | x1 .&. 0xFC == 0xD8 && x3 .&. 0xFC == 0xDC =
+      let w1 = (word8ToInt x1 `shiftL` 8) .|. word8ToInt x2
+          w2 = (word8ToInt x3 `shiftL` 8) .|. word8ToInt x4
+      in chr (((w2 .&. 0x3FF) .|. ((w1 .&. 0x3FF) `shiftL` 10)) + 0x10000) : decode xs
+    decode _ = error "Data.Text.Encoding.decodeUtf16BE: invalid"
+
+decodeUtf32LE :: ByteString -> Text
+decodeUtf32LE bs
+    | BS.length bs .&. 0x3 /= 0 = error "Data.Text.Encoding.decodeUtf32LE: invalid size"
+    | otherwise = pack (decode $ BS.unpack bs)
+  where
+    decode [] = []
+    decode (x1 : x2 : x3 : x4 : xs) | x2 <= 0xD7 || x2 >= 0xE0 = chr (word8ToInt x1 .|. (word8ToInt x2 `shiftL` 8) .|. (word8ToInt x3 `shiftL` 16) .|. (word8ToInt x4 `shiftL` 24)) : decode xs
+    decode _ = error "Data.Text.Encoding.decodeUtf32LE: impossible" -- length is not a multiple of 4
+
+decodeUtf32BE :: ByteString -> Text
+decodeUtf32BE bs
+    | BS.length bs .&. 0x3 /= 0 = error "Data.Text.Encoding.decodeUtf32BE: invalid size"
+    | otherwise = pack (decode $ BS.unpack bs)
+  where
+    decode [] = []
+    decode (x1 : x2 : x3 : x4 : xs) | x3 <= 0xD7 || x3 >= 0xE0 = chr ((word8ToInt x1 `shiftL` 24) .|. (word8ToInt x2 `shiftL` 16) .|. (word8ToInt x3 `shiftL` 8) .|. word8ToInt x4) : decode xs
+    decode _ = error "Data.Text.Encoding.decodeUtf32BE: impossible" -- length is not a multiple of 4
+
+encodeUtf8 :: Text -> ByteString
+encodeUtf8 = unsafeCoerce -- Safety: Text uses UTF-8 encoding
+
+encodeUtf16LE :: Text -> ByteString
+encodeUtf16LE = BS.pack . concatMap f . unpack
+  where
+    f c =
+        let w = ord c
+        in if c <= '\xFFFF'
+            then [intToWord8 w, intToWord8 (w `shiftR` 8)]
+            else
+                let u = w - 0x10000
+                    w1 = 0xD800 + u `shiftR` 10
+                    w2 = 0xDC00 + u .&. 0x3FF
+                in [intToWord8 w1, intToWord8 (w1 `shiftR` 8), intToWord8 w2, intToWord8 (w2 `shiftR` 8)]
+
+encodeUtf16BE :: Text -> ByteString
+encodeUtf16BE = BS.pack . concatMap f . unpack
+  where
+    f c =
+        let w = ord c
+        in if c <= '\xFFFF'
+            then [intToWord8 (w `shiftR` 8), intToWord8 w]
+            else
+                let u = w - 0x10000
+                    w1 = 0xD800 + u `shiftR` 10
+                    w2 = 0xDC00 + u .&. 0x3FF
+                in [intToWord8 (w1 `shiftR` 8), intToWord8 w1, intToWord8 (w2 `shiftR` 8), intToWord8 w2]
+
+encodeUtf32LE :: Text -> ByteString
+encodeUtf32LE = BS.pack . concatMap f . unpack
+  where
+    f c =
+        let w = ord c
+        in
+            [ intToWord8 w
+            , intToWord8 (w `shiftR` 8)
+            , intToWord8 (w `shiftR` 16)
+            , intToWord8 (w `shiftR` 24)
+            ]
+
+encodeUtf32BE :: Text -> ByteString
+encodeUtf32BE = BS.pack . concatMap f . unpack
+  where
+    f c =
+        let w = ord c
+        in
+            [ intToWord8 (w `shiftR` 24)
+            , intToWord8 (w `shiftR` 16)
+            , intToWord8 (w `shiftR` 8)
+            , intToWord8 w
+            ]
diff --git a/lib/Data/Text/IO.hs b/lib/Data/Text/IO.hs
--- a/lib/Data/Text/IO.hs
+++ b/lib/Data/Text/IO.hs
@@ -1,10 +1,78 @@
-module Data.Text.IO(readFile, writeFile) where
+module Data.Text.IO (
+  -- * File-at-a-time operations
+  readFile,
+  writeFile,
+  appendFile,
+  -- * Operations on handles
+  hGetContents,
+  hGetChunk,
+  hGetLine,
+  hPutStr,
+  hPutStrLn,
+  -- * Special cases for standard input and output
+  interact,
+  getContents,
+  getLine,
+  putStr,
+  putStrLn,
+) where
+
 import Prelude hiding (readFile, writeFile)
 import qualified Prelude as P
+import Control.Exception (evaluate)
+import qualified Data.ByteString as BS
 import Data.Text
+import Data.Text.Encoding
+import System.IO (Handle, IOMode(..), hClose, openFile, stdin, stdout)
+import qualified System.IO as IO
 
 readFile :: FilePath -> IO Text
-readFile fn = pack <$> P.readFile fn
+readFile f = do
+  h <- openFile f ReadMode
+  hGetContents h
 
 writeFile :: FilePath -> Text -> IO ()
-writeFile fn t = P.writeFile fn (unpack t)
+writeFile f bs = do
+  h <- openFile f WriteMode
+  hPutStr h bs
+  hClose h
+
+appendFile :: FilePath -> Text -> IO ()
+appendFile f bs = do
+  h <- openFile f AppendMode
+  hPutStr h bs
+  hClose h
+
+hGetContents :: Handle -> IO Text
+hGetContents h = do
+  bs <- BS.hGetContents h
+  evaluate (decodeUtf8 bs)
+
+hGetChunk :: Handle -> IO Text
+hGetChunk = hGetContents -- XXX: read chunk from buffer
+
+hGetLine :: Handle -> IO Text
+hGetLine h = do
+  bs <- BS.hGetLine h
+  evaluate (decodeUtf8 bs)
+
+hPutStr :: Handle -> Text -> IO ()
+hPutStr h t = BS.hPutStr h (encodeUtf8 t)
+
+hPutStrLn :: Handle -> Text -> IO ()
+hPutStrLn h t = hPutStr h t >> hPutStr h (pack "\n")
+
+interact :: (Text -> Text) -> IO ()
+interact f = getContents >>= putStr . f
+
+getContents :: IO Text
+getContents = hGetContents stdin
+
+getLine :: IO Text
+getLine = hGetLine stdin
+
+putStr :: Text -> IO ()
+putStr = hPutStr stdout
+
+putStrLn :: Text -> IO ()
+putStrLn = hPutStrLn stdout
diff --git a/lib/Data/Text/Lazy.hs b/lib/Data/Text/Lazy.hs
--- a/lib/Data/Text/Lazy.hs
+++ b/lib/Data/Text/Lazy.hs
@@ -1,67 +1,82 @@
--- XXX Use coerce of Data.Text
 module Data.Text.Lazy(
   Text,
+  toStrict, toLazy,
   pack, unpack,
   empty,
+  singleton,
   append,
   null,
+  length,
   head,
   tail,
+  cons,
+  snoc,
   uncons,
+  replicate,
+  splitOn,
+  dropWhileEnd,
   ) where
-import Prelude(); import MiniPrelude hiding(head)
-import Data.Monoid.Internal
+import qualified Prelude(); import MiniPrelude hiding(head)
+import Control.DeepSeq.Class
+import Data.Coerce
+import Data.Monoid
 import Data.String
-import qualified Data.ByteString.Internal as BS
-
-newtype Text = T BS.ByteString
-
-instance Eq Text where
-  (==) = cmp (==)
-  (/=) = cmp (/=)
-
-instance Ord Text where
-  (<)  = cmp (<)
-  (<=) = cmp (<=)
-  (>)  = cmp (>)
-  (>=) = cmp (>=)
-
-cmp :: (BS.ByteString -> BS.ByteString -> Bool) -> (Text -> Text -> Bool)
-cmp op (T x) (T y) = op x y
-
-instance Show Text where
-  showsPrec p = showsPrec p . unpack
+import qualified Data.Text as T
 
-instance IsString Text where
-  fromString = pack
+newtype Text = L T.Text
+  deriving newtype (Eq, Ord, Show, IsString, {-Semigroup,-} Monoid, NFData)
 
+-- Bug in newtype deriving
 instance Semigroup Text where
   (<>) = append
 
-instance Monoid Text where
-  mempty = empty
+toStrict :: Text -> T.Text
+toStrict (L t) = t
 
+toLazy :: T.Text -> Text
+toLazy = L
+
 empty :: Text
-empty = pack []
+empty = coerce T.empty
 
+singleton :: Char -> Text
+singleton = coerce T.singleton
+
 pack :: String -> Text
-pack s = T (_primitive "toUTF8" s)
+pack = coerce T.pack
 
 unpack :: Text -> String
-unpack (T t) = _primitive "fromUTF8" t
+unpack = coerce T.unpack
 
 append :: Text -> Text -> Text
-append (T x) (T y) = T (BS.append x y)
+append = coerce T.append
 
 null :: Text -> Bool
-null (T bs) = BS.null bs
+null = coerce T.null
 
+length :: Text -> Int
+length = coerce T.length
+
 head :: Text -> Char
-head (T t) = _primitive "headUTF8" t
+head = coerce T.head
 
 tail :: Text -> Text
-tail (T t) = _primitive "tailUTF8" t
+tail = coerce T.tail
 
+cons :: Char -> Text -> Text
+cons = coerce T.cons
+
+snoc :: Text -> Char -> Text
+snoc = coerce T.snoc
+
 uncons :: Text -> Maybe (Char, Text)
-uncons t | null t    = Nothing
-         | otherwise = Just (head t, tail t)
+uncons = coerce T.uncons
+
+replicate :: Int -> Text -> Text
+replicate n = undefined -- coerce (T.replicate n)
+
+splitOn :: Text -> Text -> [Text]
+splitOn = coerce T.splitOn
+
+dropWhileEnd :: (Char -> Bool) -> Text -> Text
+dropWhileEnd = coerce T.dropWhileEnd
diff --git a/lib/Data/Text/Lazy/Builder.hs b/lib/Data/Text/Lazy/Builder.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/Text/Lazy/Builder.hs
@@ -0,0 +1,42 @@
+-- Fake a builder
+module Data.Text.Lazy.Builder
+   ( Builder
+   , LazyTextBuilder
+   , toLazyText
+   , toLazyTextWith
+   , singleton
+   , fromText
+   , fromLazyText
+   , fromString
+   , flush
+   ) where
+import qualified Data.Text as S
+import qualified Data.Text.Lazy as L
+import Data.String
+
+newtype Builder = B L.Text
+  deriving newtype (Eq, Ord, {-Semigroup,-} Monoid, Show, IsString)
+
+-- bug in newtype deriving
+instance Semigroup Builder where
+  B x <> B y = B (x <> y)
+
+type LazyTextBuilder = Builder
+
+toLazyText :: Builder -> L.Text
+toLazyText (B t) = t
+
+toLazyTextWith :: Int -> Builder -> L.Text
+toLazyTextWith _ (B t) = t
+
+singleton :: Char -> Builder
+singleton c = B (L.singleton c)
+
+fromText :: S.Text -> Builder
+fromText = fromLazyText . L.toLazy
+
+fromLazyText :: L.Text -> Builder
+fromLazyText t = B t
+
+flush :: Builder
+flush = B L.empty
diff --git a/lib/Data/Text/Lazy/IO.hs b/lib/Data/Text/Lazy/IO.hs
--- a/lib/Data/Text/Lazy/IO.hs
+++ b/lib/Data/Text/Lazy/IO.hs
@@ -1,10 +1,14 @@
-module Data.Text.Lazy.IO(readFile, writeFile) where
+module Data.Text.Lazy.IO(readFile, writeFile, hPutStr) where
 import Prelude hiding (readFile, writeFile)
 import qualified Prelude as P
 import Data.Text.Lazy
+import qualified System.IO as IO
 
 readFile :: FilePath -> IO Text
 readFile fn = pack <$> P.readFile fn
 
 writeFile :: FilePath -> Text -> IO ()
 writeFile fn t = P.writeFile fn (unpack t)
+
+hPutStr :: IO.Handle -> Text -> IO ()
+hPutStr h t = IO.hPutStr h (unpack t)
diff --git a/lib/Data/Traversable.hs b/lib/Data/Traversable.hs
--- a/lib/Data/Traversable.hs
+++ b/lib/Data/Traversable.hs
@@ -27,7 +27,7 @@
     fmapDefault,
     foldMapDefault,
     ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Applicative
 import Control.Error
diff --git a/lib/Data/Tuple.hs b/lib/Data/Tuple.hs
--- a/lib/Data/Tuple.hs
+++ b/lib/Data/Tuple.hs
@@ -3,7 +3,7 @@
 module Data.Tuple(
   module Data.Tuple,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Data.Bool
 import Data.Bounded
 import Data.Eq
@@ -84,18 +84,18 @@
   showsPrec p (MkSolo a) = showParen (p > 10) (showString "MkSolo " . showsPrec 11 a)
 
 instance (Show a, Show b) => Show (a, b) where
-  showsPrec _ (a, b) = showParen True (showsPrec 0 a . showString "," . showsPrec 0 b)
+  showsPrec _ (a, b) = showParen True (shows a . showString "," . shows b)
 
 instance (Show a, Show b, Show c) => Show (a, b, c) where
-  showsPrec _ (a, b, c) = showParen True (showsPrec 0 a . showString "," . showsPrec 0 b . showString "," . showsPrec 0 c)
+  showsPrec _ (a, b, c) = showParen True (shows a . showString "," . shows b . showString "," . shows c)
 
 instance (Show a, Show b, Show c, Show d) => Show (a, b, c, d) where
-  showsPrec _ (a, b, c, d) = showParen True (showsPrec 0 a . showString "," . showsPrec 0 b . showString "," . showsPrec 0 c .
-                                             showString "," . showsPrec 0 d)
+  showsPrec _ (a, b, c, d) = showParen True (shows a . showString "," . shows b . showString "," . shows c .
+                                             showString "," . shows d)
 
 instance (Show a, Show b, Show c, Show d, Show e) => Show (a, b, c, d, e) where
-  showsPrec _ (a, b, c, d, e) = showParen True (showsPrec 0 a . showString "," . showsPrec 0 b . showString "," . showsPrec 0 c .
-                                                showString "," . showsPrec 0 d . showString "," . showsPrec 0 e)
+  showsPrec _ (a, b, c, d, e) = showParen True (shows a . showString "," . shows b . showString "," . shows c .
+                                                showString "," . shows d . showString "," . shows e)
 
 -----------------------------------
 
diff --git a/lib/Data/Type/Equality.hs b/lib/Data/Type/Equality.hs
--- a/lib/Data/Type/Equality.hs
+++ b/lib/Data/Type/Equality.hs
@@ -1,5 +1,5 @@
 module Data.Type.Equality(module Data.Type.Equality) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 
 type (:~:) :: forall k . k -> k -> Type
 data a :~: b = (a ~ b) => Refl
diff --git a/lib/Data/TypeLits.hs b/lib/Data/TypeLits.hs
--- a/lib/Data/TypeLits.hs
+++ b/lib/Data/TypeLits.hs
@@ -4,7 +4,7 @@
   KnownNat(..),
   KnownSymbol(..),
   ) where
-import Prelude()
+import qualified Prelude()
 import Primitives
 import Data.Char_Type
 import Data.Integer
diff --git a/lib/Data/Typeable.hs b/lib/Data/Typeable.hs
--- a/lib/Data/Typeable.hs
+++ b/lib/Data/Typeable.hs
@@ -17,7 +17,7 @@
   typeRepTyCon,
   typeRepArgs,
   ) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Primitives
 import Data.Double
 import Data.Integer
@@ -50,8 +50,8 @@
 instance Show TypeRep where
   showsPrec p (TypeRep _ c []) = showsPrec 11 c
   showsPrec p (TypeRep _ c [a,b]) | c == funTc = showParen (p > 5) $ showsPrec 6 a . showString " -> " . showsPrec 5 b
-  showsPrec p (TypeRep _ c [a]) | tyConName c == "[]" = showString "[" . showsPrec 0 a . showString "]"
-  showsPrec p (TypeRep _ c ts) | head (tyConName c) == ',' = showParen True $ comma (map (showsPrec 0) ts)
+  showsPrec p (TypeRep _ c [a]) | tyConName c == "[]" = showString "[" . shows a . showString "]"
+  showsPrec p (TypeRep _ c ts) | head (tyConName c) == ',' = showParen True $ comma (map shows ts)
                                | otherwise = showParen (p > 11) $ showsPrec 11 c . foldr (\ t s -> showChar ' ' . showsPrec 12 t . s) id ts
     where comma [] = undefined
           comma [s] = s
diff --git a/lib/Data/Typeable.hs-boot b/lib/Data/Typeable.hs-boot
--- a/lib/Data/Typeable.hs-boot
+++ b/lib/Data/Typeable.hs-boot
@@ -1,5 +1,5 @@
 module Data.Typeable where
-import Prelude()
+import qualified Prelude()
 import Data.Char_Type
 import Data.Maybe_Type
 
diff --git a/lib/Data/Version.hs b/lib/Data/Version.hs
--- a/lib/Data/Version.hs
+++ b/lib/Data/Version.hs
@@ -3,11 +3,15 @@
   showVersion,
   makeVersion
   ) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
+import Control.DeepSeq.Class
 import Data.List(intercalate)
 
 data Version = Version { versionBranch :: [Int] }
   deriving (Show, Eq, Ord)
+
+instance NFData Version where
+  rnf (Version x) = rnf x
 
 showVersion :: Version -> String
 showVersion (Version b) = intercalate "." (map show b)
diff --git a/lib/Data/Void.hs b/lib/Data/Void.hs
--- a/lib/Data/Void.hs
+++ b/lib/Data/Void.hs
@@ -1,5 +1,5 @@
 module Data.Void(module Data.Void) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 
 data Void
 
diff --git a/lib/Data/Word.hs b/lib/Data/Word.hs
--- a/lib/Data/Word.hs
+++ b/lib/Data/Word.hs
@@ -1,13 +1,14 @@
 -- Copyright 2023,2024 Lennart Augustsson
 -- See LICENSE file for full license.
 module Data.Word(Word, Word8, Word16, Word32, Word64) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Error
 import Data.Bits
-import Data.Bool_Type
+import Data.Bool
 import Data.Bounded
 import Data.Char
+import Data.Coerce
 import Data.Enum
 import Data.Eq
 import Data.Function
@@ -53,15 +54,48 @@
 
 --------------------------------
 
+eftWord :: Word -> Word -> [Word]
+eftWord x y
+  | x `primWordGT` y = []
+  | otherwise = go x
+  where
+    go n = n : if n `primWordEQ` y then [] else go (n `primWordAdd` 1)
+
+efttWordUp :: Word -> Word -> Word -> [Word]
+-- x2 >= x1
+efttWordUp x1 x2 y
+  | y `primWordLT` x2 = if y `primWordLT` x1 then [] else [x1]
+  | otherwise =
+    let
+      delta = x2 `primWordSub` x1
+      y' = y `primWordSub` delta
+      go x = if x `primWordGT` y' then [x] else x : go (x `primWordAdd` delta)
+    in x1 : go x2
+
+efttWordDown :: Word -> Word -> Word -> [Word]
+-- x2 <= x1
+efttWordDown x1 x2 y
+  | y `primWordGT` x2 = if y `primWordGT` x1 then [] else [x1]
+  | otherwise =
+    let
+      delta = x2 `primWordSub` x1
+      y' = y `primWordSub` delta
+      go x = if x `primWordLT` y' then [x] else x : go (x `primWordAdd` delta)
+    in x1 : go x2
+
 instance Enum Word where
-  succ x = x + 1
-  pred x = x - 1
+  succ x = if x `primWordEQ` maxBound then error "Word.succ: overflow" else x + 1
+  pred x = if x `primWordEQ` minBound then error "Word.pred: underflow" else x - 1
   toEnum = primIntToWord
   fromEnum = primWordToInt
-  enumFrom = numericEnumFrom
-  enumFromThen = numericEnumFromThen
-  enumFromTo = numericEnumFromTo
-  enumFromThenTo = numericEnumFromThenTo
+  enumFrom n = eftWord n maxBound
+  enumFromThen x1 x2
+    | x2 `primWordGE` x1 = efttWordUp x1 x2 maxBound
+    | otherwise          = efttWordDown x1 x2 minBound
+  enumFromTo = eftWord
+  enumFromThenTo x1 x2 y
+    | x2 `primWordGE` x1 = efttWordUp x1 x2 y
+    | otherwise          = efttWordDown x1 x2 y
 
 --------------------------------
 
@@ -86,12 +120,12 @@
   x `shiftL` i
     | i < 0 = _overflowError
     | i >= _wordSize = 0
-    | True = x `primWordShl` i
+    | otherwise = x `primWordShl` i
   unsafeShiftL = primWordShl
   x `shiftR` i
     | i < 0 = _overflowError
     | i >= _wordSize = 0
-    | True = x `primWordShr` i
+    | otherwise = x `primWordShr` i
   unsafeShiftR = primWordShr
   bitSizeMaybe _ = Just _wordSize
   bitSize _ = _wordSize
@@ -99,6 +133,7 @@
   testBit = testBitDefault
   popCount = primWordPopcount
   zeroBits = 0
+  isSigned _ = False
 
 instance FiniteBits Word where
   finiteBitSize _ = _wordSize
@@ -141,8 +176,8 @@
   toInteger = _wordToInteger . unW8
 
 instance Bounded Word8 where
-  minBound = W8 0
-  maxBound = W8 0xff
+  minBound = w8 0
+  maxBound = w8 0xff
 
 instance Real Word8 where
   toRational = _integerToRational . _wordToInteger . unW8
@@ -156,14 +191,16 @@
 -}
 
 instance Enum Word8 where
-  succ x = x + 1
-  pred x = x - 1
+  succ x = if x == maxBound then error "Word8.succ: overflow" else x + 1
+  pred x = if x == minBound then error "Word8.pred: underflow" else x - 1
   toEnum = w8 . primIntToWord
   fromEnum = primWordToInt . unW8
-  enumFrom = numericEnumFrom
-  enumFromThen = numericEnumFromThen
-  enumFromTo = numericEnumFromTo
-  enumFromThenTo = numericEnumFromThenTo
+  enumFrom n = enumFromTo n maxBound
+  enumFromThen n m
+    | m >= n = enumFromThenTo n m maxBound
+    | otherwise = enumFromThenTo n m minBound
+  enumFromTo = coerce (enumFromTo @Word)
+  enumFromThenTo = coerce (enumFromThenTo @Word)
 
 instance Eq Word8 where
   (==) = cmp8 primWordEQ
@@ -184,12 +221,12 @@
   x `shiftL` i
     | i < 0 = _overflowError
     | i >= 8 = 0
-    | True = x `unsafeShiftL` i
+    | otherwise = x `unsafeShiftL` i
   unsafeShiftL = bini8 primWordShl
   x `shiftR` i
     | i < 0 = _overflowError
     | i >= 8 = 0
-    | True = x `unsafeShiftR` i
+    | otherwise = x `unsafeShiftR` i
   unsafeShiftR = bini8 primWordShr
   bitSizeMaybe _ = Just 8
   bitSize _ = 8
@@ -197,6 +234,7 @@
   testBit = testBitDefault
   popCount = primWordPopcount . unW8
   zeroBits = 0
+  isSigned _ = False
 
 instance FiniteBits Word8 where
   finiteBitSize _ = 8
@@ -239,8 +277,8 @@
   toInteger = _wordToInteger . unW16
 
 instance Bounded Word16 where
-  minBound = W16 0
-  maxBound = W16 0xffff
+  minBound = w16 0
+  maxBound = w16 0xffff
 
 instance Real Word16 where
   toRational = _integerToRational . _wordToInteger . unW16
@@ -254,13 +292,16 @@
 -}
 
 instance Enum Word16 where
-  succ x = x + 1
-  pred x = x - 1
+  succ x = if x == maxBound then error "Word16.succ: overflow" else x + 1
+  pred x = if x == minBound then error "Word16.pred: underflow" else x - 1
   toEnum = w16 . primIntToWord
-  enumFrom = numericEnumFrom
-  enumFromThen = numericEnumFromThen
-  enumFromTo = numericEnumFromTo
-  enumFromThenTo = numericEnumFromThenTo
+  fromEnum = primWordToInt . unW16
+  enumFrom n = enumFromTo n maxBound
+  enumFromThen n m
+    | m >= n = enumFromThenTo n m maxBound
+    | otherwise = enumFromThenTo n m minBound
+  enumFromTo = coerce (enumFromTo @Word)
+  enumFromThenTo = coerce (enumFromThenTo @Word)
 
 instance Eq Word16 where
   (==) = cmp16 primWordEQ
@@ -281,12 +322,12 @@
   x `shiftL` i
     | i < 0 = _overflowError
     | i >= 16 = 0
-    | True = x `unsafeShiftL` i
+    | otherwise = x `unsafeShiftL` i
   unsafeShiftL = bini16 primWordShl
   x `shiftR` i
     | i < 0 = _overflowError
     | i >= 16 = 0
-    | True = x `unsafeShiftR` i
+    | otherwise = x `unsafeShiftR` i
   unsafeShiftR = bini16 primWordShr
   bitSizeMaybe _ = Just 16
   bitSize _ = 16
@@ -294,6 +335,7 @@
   testBit = testBitDefault
   popCount = primWordPopcount . unW16
   zeroBits = 0
+  isSigned _ = False
 
 instance FiniteBits Word16 where
   finiteBitSize _ = 16
@@ -336,8 +378,8 @@
   toInteger = _wordToInteger . unW32
 
 instance Bounded Word32 where
-  minBound = W32 0
-  maxBound = W32 0xffffffff
+  minBound = w32 0
+  maxBound = w32 0xffffffff
 
 instance Real Word32 where
   toRational = _integerToRational . _wordToInteger . unW32
@@ -351,14 +393,16 @@
 -}
 
 instance Enum Word32 where
-  succ x = x + 1
-  pred x = x - 1
+  succ x = if x == maxBound then error "Word32.succ: overflow" else x + 1
+  pred x = if x == minBound then error "Word32.pred: underflow" else x - 1
   toEnum = w32 . primIntToWord
   fromEnum = primWordToInt . unW32
-  enumFrom = numericEnumFrom
-  enumFromThen = numericEnumFromThen
-  enumFromTo = numericEnumFromTo
-  enumFromThenTo = numericEnumFromThenTo
+  enumFrom n = enumFromTo n maxBound
+  enumFromThen n m
+    | m >= n = enumFromThenTo n m maxBound
+    | otherwise = enumFromThenTo n m minBound
+  enumFromTo = coerce (enumFromTo @Word)
+  enumFromThenTo = coerce (enumFromThenTo @Word)
 
 instance Eq Word32 where
   (==) = cmp32 primWordEQ
@@ -379,12 +423,12 @@
   x `shiftL` i
     | i < 0 = _overflowError
     | i >= 32 = 0
-    | True = x `unsafeShiftL` i
+    | otherwise = x `unsafeShiftL` i
   unsafeShiftL = bini32 primWordShl
   x `shiftR` i
     | i < 0 = _overflowError
     | i >= 32 = 0
-    | True = x `unsafeShiftR` i
+    | otherwise = x `unsafeShiftR` i
   unsafeShiftR = bini32 primWordShr
   bitSizeMaybe _ = Just 32
   bitSize _ = 32
@@ -392,6 +436,7 @@
   testBit = testBitDefault
   popCount = primWordPopcount . unW32
   zeroBits = 0
+  isSigned _ = False
 
 instance FiniteBits Word32 where
   finiteBitSize _ = 32
@@ -434,8 +479,8 @@
   toInteger = _wordToInteger . unW64
 
 instance Bounded Word64 where
-  minBound = W64 0
-  maxBound = W64 0xffffffffffffffff
+  minBound = w64 0
+  maxBound = w64 0xffffffffffffffff
 
 instance Real Word64 where
   toRational = _integerToRational . _wordToInteger . unW64
@@ -449,14 +494,16 @@
 -}
 
 instance Enum Word64 where
-  succ x = x + 1
-  pred x = x - 1
+  succ x = if x == maxBound then error "Word64.succ: overflow" else x + 1
+  pred x = if x == minBound then error "Word64.pred: underflow" else x - 1
   toEnum = w64 . primIntToWord
   fromEnum = primWordToInt . unW64
-  enumFrom = numericEnumFrom
-  enumFromThen = numericEnumFromThen
-  enumFromTo = numericEnumFromTo
-  enumFromThenTo = numericEnumFromThenTo
+  enumFrom n = enumFromTo n maxBound
+  enumFromThen n m
+    | m >= n = enumFromThenTo n m maxBound
+    | otherwise = enumFromThenTo n m minBound
+  enumFromTo = coerce (enumFromTo @Word)
+  enumFromThenTo = coerce (enumFromThenTo @Word)
 
 instance Eq Word64 where
   (==) = cmp64 primWordEQ
@@ -477,12 +524,12 @@
   x `shiftL` i
     | i < 0 = _overflowError
     | i >= 64 = 0
-    | True = x `unsafeShiftL` i
+    | otherwise = x `unsafeShiftL` i
   unsafeShiftL = bini64 primWordShl
   x `shiftR` i
     | i < 0 = _overflowError
     | i >= 64 = 0
-    | True = x `unsafeShiftR` i
+    | otherwise = x `unsafeShiftR` i
   unsafeShiftR = bini64 primWordShr
   bitSizeMaybe _ = Just 64
   bitSize _ = 64
@@ -490,6 +537,7 @@
   testBit = testBitDefault
   popCount = primWordPopcount . unW64
   zeroBits = 0
+  isSigned _ = False
 
 instance FiniteBits Word64 where
   finiteBitSize _ = 64
diff --git a/lib/Debug/Trace.hs b/lib/Debug/Trace.hs
--- a/lib/Debug/Trace.hs
+++ b/lib/Debug/Trace.hs
@@ -1,11 +1,12 @@
 module Debug.Trace(module Debug.Trace) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
+import System.IO(hPutStrLn, stderr)
 import Primitives
 
 trace :: forall a . String -> a -> a
 trace msg a = _primitive "IO.performIO" (
   do
-    putStrLn msg
+    hPutStrLn stderr msg
     return a
   )
 
diff --git a/lib/Foreign/C/Error.hs b/lib/Foreign/C/Error.hs
--- a/lib/Foreign/C/Error.hs
+++ b/lib/Foreign/C/Error.hs
@@ -81,7 +81,7 @@
   throwErrnoPathIfMinus1,
   throwErrnoPathIfMinus1_,
 ) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 
 import Foreign.Ptr
 import Foreign.Marshal.Alloc
@@ -364,7 +364,7 @@
 
 
 foreign import ccall "string.h strerror_r"
-    c_strerror_r :: Int -> Ptr Char -> CSize -> IO Int
+    c_strerror_r :: Int -> CString -> CSize -> IO Int
 
 errnoToString :: Errno -> IO String
 errnoToString (Errno errno) =
diff --git a/lib/Foreign/C/String.hs b/lib/Foreign/C/String.hs
--- a/lib/Foreign/C/String.hs
+++ b/lib/Foreign/C/String.hs
@@ -7,12 +7,17 @@
   peekCString, peekCStringLen,
   withCString, withCStringLen,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
+import Data.ByteString.Internal
 import Data.Char_Type
+import Data.Coerce (coerce)
+import Foreign.C.Types (CChar)
 import Foreign.Marshal.Alloc
 
-type CChar = Char
+primNewCAStringLen :: [Char] -> IO (Ptr CChar, Int)
+primNewCAStringLen = _primitive "newCAStringLen"
+
 type CString = Ptr CChar
 type CStringLen = (Ptr CChar, Int)
 
@@ -37,10 +42,10 @@
   primReturn a
 
 peekCAString :: CString -> IO String
-peekCAString = primPeekCAString
+peekCAString cstr = primPackCString cstr `primBind` \bs -> primReturn (primUnsafeCoerce unpack bs)
 
 peekCAStringLen :: CStringLen -> IO String
-peekCAStringLen (p, i) = primPeekCAStringLen p i
+peekCAStringLen (cstr, len) = primPackCStringLen cstr len `primBind` \bs -> primReturn (primUnsafeCoerce unpack bs)
 
 ------------------------------------------------------
 -- XXX:  No encoding!
diff --git a/lib/Foreign/C/Types.hs b/lib/Foreign/C/Types.hs
--- a/lib/Foreign/C/Types.hs
+++ b/lib/Foreign/C/Types.hs
@@ -12,9 +12,10 @@
  CTime(..),
  intToCSize, cSizeToInt,
  ) where
-import Prelude()
+import qualified Prelude()
 import Primitives
 import Data.Bool
+import Data.Coerce
 import Data.Eq
 import Data.Int
 import Data.Integral
diff --git a/lib/Foreign/ForeignPtr.hs b/lib/Foreign/ForeignPtr.hs
--- a/lib/Foreign/ForeignPtr.hs
+++ b/lib/Foreign/ForeignPtr.hs
@@ -1,4 +1,4 @@
-module Foreign.ForeignPtr ( 
+module Foreign.ForeignPtr (
   ForeignPtr,
   FinalizerPtr,
   newForeignPtr,
@@ -14,7 +14,7 @@
   mallocForeignPtrArray,
   mallocForeignPtrArray0,
   ) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Primitives
 import Foreign.Ptr
 import Foreign.Storable
diff --git a/lib/Foreign/Marshal.hs b/lib/Foreign/Marshal.hs
--- a/lib/Foreign/Marshal.hs
+++ b/lib/Foreign/Marshal.hs
@@ -2,12 +2,16 @@
   module Foreign.Marshal.Alloc,
   module Foreign.Marshal.Array,
   module Foreign.Marshal.Error,
---  module Foreign.Marshal.Pool,
-  module Foreign.Marshal.Utils
+  module Foreign.Marshal.Utils,
+  unsafeLocalState,
   ) where
 
+import Primitives (primPerformIO)
+
 import Foreign.Marshal.Alloc
 import Foreign.Marshal.Array
 import Foreign.Marshal.Error
---import Foreign.Marshal.Pool
 import Foreign.Marshal.Utils
+
+unsafeLocalState :: IO a -> a
+unsafeLocalState = primPerformIO
diff --git a/lib/Foreign/Marshal/Alloc.hs b/lib/Foreign/Marshal/Alloc.hs
--- a/lib/Foreign/Marshal/Alloc.hs
+++ b/lib/Foreign/Marshal/Alloc.hs
@@ -3,7 +3,7 @@
   free,
   mallocBytes, callocBytes, allocaBytes,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Error(undefined)
 import Foreign.C.Types
diff --git a/lib/Foreign/Marshal/Array.hs b/lib/Foreign/Marshal/Array.hs
--- a/lib/Foreign/Marshal/Array.hs
+++ b/lib/Foreign/Marshal/Array.hs
@@ -1,5 +1,5 @@
 module Foreign.Marshal.Array(module Foreign.Marshal.Array) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Foreign.Ptr
 import Foreign.Storable
 import Foreign.Marshal.Alloc
diff --git a/lib/Foreign/Marshal/Error.hs b/lib/Foreign/Marshal/Error.hs
--- a/lib/Foreign/Marshal/Error.hs
+++ b/lib/Foreign/Marshal/Error.hs
@@ -4,8 +4,9 @@
   throwIfNeg,
   throwIfNeg_,
   throwIfNull,
+  void,
 ) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Data.Functor(void)
 import Foreign.Ptr
 import System.IO.Error(ioError, userError)
diff --git a/lib/Foreign/Marshal/Utils.hs b/lib/Foreign/Marshal/Utils.hs
--- a/lib/Foreign/Marshal/Utils.hs
+++ b/lib/Foreign/Marshal/Utils.hs
@@ -1,5 +1,5 @@
 module Foreign.Marshal.Utils(module Foreign.Marshal.Utils) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Foreign.Marshal.Alloc
 import Foreign.C.Types
 import Foreign.Ptr
diff --git a/lib/Foreign/Ptr.hs b/lib/Foreign/Ptr.hs
--- a/lib/Foreign/Ptr.hs
+++ b/lib/Foreign/Ptr.hs
@@ -3,7 +3,7 @@
   Ptr,
   FunPtr,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Word
 import Data.Eq
diff --git a/lib/Foreign/Storable.hs b/lib/Foreign/Storable.hs
--- a/lib/Foreign/Storable.hs
+++ b/lib/Foreign/Storable.hs
@@ -1,5 +1,5 @@
 module Foreign.Storable(Storable(..)) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Error(undefined)
 import Foreign.C.Types
@@ -44,6 +44,12 @@
   alignment _ = wordSizeInBytes
   peek p      = c_peekWord (castPtr p) `primBind` \ w -> primReturn (primWordToInt w)
   poke p w    = c_pokeWord (castPtr p) (primIntToWord w)
+
+instance Storable Char where
+  sizeOf    _ = 4
+  alignment _ = 4
+  peek p      = c_peek_int32 (castPtr p) `primBind` \ i -> primReturn (primChr (primUnsafeCoerce i))
+  poke p c    = c_poke_int32 (castPtr p) (primUnsafeCoerce (primOrd c))
 
 foreign import ccall "peekPtr" c_peekPtr :: Ptr (Ptr ()) -> IO (Ptr ())
 foreign import ccall "pokePtr" c_pokePtr :: Ptr (Ptr ()) -> Ptr () -> IO ()
diff --git a/lib/GHC/Stack.hs b/lib/GHC/Stack.hs
--- a/lib/GHC/Stack.hs
+++ b/lib/GHC/Stack.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module GHC.Stack(HasCallStack(..)) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 -- So we can import GHC.Stack.
 -- Sadly, this does not give us stack traces. :(
 
diff --git a/lib/GHC/Types.hs b/lib/GHC/Types.hs
--- a/lib/GHC/Types.hs
+++ b/lib/GHC/Types.hs
@@ -1,4 +1,4 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module GHC.Types() where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
diff --git a/lib/Interactive.hs b/lib/Interactive.hs
new file mode 100644
--- /dev/null
+++ b/lib/Interactive.hs
@@ -0,0 +1,6 @@
+module Interactive(module Interactive) where
+import Prelude
+import System.IO.PrintOrRun
+default Num (Integer, Double)
+default IsString (String)
+default Show (())
diff --git a/lib/Mhs/Builtin.hs b/lib/Mhs/Builtin.hs
--- a/lib/Mhs/Builtin.hs
+++ b/lib/Mhs/Builtin.hs
@@ -1,6 +1,10 @@
+-- Copyright 2023 Lennart Augustsson
+-- See LICENSE file for full license.
 module Mhs.Builtin(
   module Control.Monad,
   module Data.Bool,
+  module Data.Char,
+  module Data.Coerce,
   module Data.Enum,
   module Data.Eq,
   module Data.Fractional,
@@ -13,17 +17,26 @@
   module Data.String,
   module Text.Show,
   ) where
-import Prelude()
+--
+-- These are the identifiers that can be generated by the compiler,
+-- so the always have to be in scope.
+-- In the compiler this module is treated specially, it is imported
+-- qualified with the name B@, this ways these names are always available
+-- qualified, but under a name that cannot be used accidentally.
+-- If the Prelude is not imported, then neither is this module.
+import qualified Prelude()
 import Control.Error(error)
 import Control.Monad(Monad(..))
 import Control.Monad.Fail(MonadFail(..))
 import Data.Bool((&&), Bool(..))
+import Data.Char(Char)
+import Data.Coerce(Coercible, coerce)
 import Data.Enum(Enum(enumFrom, enumFromThen, enumFromTo, enumFromThenTo))
 import Data.Eq(Eq(..))
 import Data.Fractional(Fractional(fromRational))
 import Data.Function((.))
 import Data.Ord(Ord(..), Ordering(..))
-import Data.Num(Num(fromInteger))
+import Data.Num(Num(fromInteger, negate))
 import Data.Proxy(Proxy(..))
 import Data.Semigroup(Semigroup(..))
 import Data.String(IsString(..))
diff --git a/lib/MiniPrelude.hs b/lib/MiniPrelude.hs
--- a/lib/MiniPrelude.hs
+++ b/lib/MiniPrelude.hs
@@ -23,7 +23,7 @@
   module Text.Show,
   usingMhs, _wordSize, _isWindows,
   ) where
-import Prelude()
+import qualified Prelude()
 import Control.Applicative(Applicative(..))
 import Control.Error
 import Control.Monad
diff --git a/lib/Numeric.hs b/lib/Numeric.hs
--- a/lib/Numeric.hs
+++ b/lib/Numeric.hs
@@ -1,6 +1,6 @@
 module Numeric(
   module Numeric.Show,
-    
+
   readSigned,
   readInt,
   readBin,
@@ -9,6 +9,6 @@
   readHex,
   readIntegral,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Numeric.Read
 import Numeric.Show
diff --git a/lib/Numeric/FormatFloat.hs b/lib/Numeric/FormatFloat.hs
--- a/lib/Numeric/FormatFloat.hs
+++ b/lib/Numeric/FormatFloat.hs
@@ -63,7 +63,7 @@
        Just dec ->
         let dec' = max dec 1 in
         case is of
-         [0] -> '0' :'.' : take dec' (repeat '0') ++ "e0"
+         [0] -> '0' :'.' : replicate dec' '0' ++ "e0"
          _ ->
           let
            (ei,is') = roundTo base (dec'+1) is
@@ -150,7 +150,7 @@
   -- will have an impossibly low exponent.  Adjust for this.
   (f, e) =
    let n = minExp - e0 in
-   if n > 0 then (f0 `quot` (expt b n), e0+n) else (f0, e0)
+   if n > 0 then (f0 `quot` expt b n, e0+n) else (f0, e0)
   (r, s, mUp, mDn) =
    if e >= 0 then
     let be = expt b e in
diff --git a/lib/Numeric/Natural.hs b/lib/Numeric/Natural.hs
--- a/lib/Numeric/Natural.hs
+++ b/lib/Numeric/Natural.hs
@@ -2,7 +2,9 @@
   ( Natural
   , minusNaturalMaybe
   ) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
+import Data.Bits
+import Data.Coerce
 import Data.Integer
 import Data.Real
 import Control.Exception
@@ -16,6 +18,7 @@
 instance Num Natural where
   N x + N y = N (x + y)
   N x - N y | y > x = throw Underflow
+            | otherwise = N (x - y)
   N x * N y = N (x * y)
   abs x = x
   signum x = if x > 0 then 1 else 0
@@ -23,8 +26,16 @@
                 | otherwise = N x
 
 instance Enum Natural where
+  succ n = n + 1
+  pred n = n - 1
   toEnum   = fromInteger . toInteger
   fromEnum = fromInteger . toInteger
+  enumFrom = coerce (enumFrom @Integer)
+  enumFromThen x1 x2
+    | x2 >= x1 = coerce (enumFromThen @Integer) x1 x2
+    | otherwise = enumFromThenTo x1 x2 0
+  enumFromTo = coerce (enumFromTo @Integer)
+  enumFromThenTo = coerce (enumFromThenTo @Integer)
 
 instance Integral Natural where
   toInteger (N i) = i
@@ -36,3 +47,27 @@
 minusNaturalMaybe :: Natural -> Natural -> Maybe Natural
 minusNaturalMaybe x y | x < y = Nothing
                       | otherwise = Just (x - y)
+
+instance Bits Natural where
+  (.&.) = coerce ((.&.) @Integer)
+  (.|.) = coerce ((.|.) @Integer)
+  xor = coerce (xor @Integer)
+  complement _ = error "Bits.complement: Natural complement undefined"
+  shift = coerce (shift @Integer)
+  rotate = coerce (rotate @Integer)
+  zeroBits = coerce (zeroBits @Integer)
+  bit = coerce (bit @Integer)
+  setBit = coerce (setBit @Integer)
+  clearBit = coerce (clearBit @Integer)
+  complementBit = coerce (complementBit @Integer)
+  testBit = coerce (testBit @Integer)
+  shiftL = coerce (shiftL @Integer)
+  unsafeShiftL = coerce (unsafeShiftL @Integer)
+  shiftR = coerce (shiftR @Integer)
+  unsafeShiftR = coerce (unsafeShiftR @Integer)
+  rotateL = coerce (rotateL @Integer)
+  rotateR = coerce (rotateR @Integer)
+  popCount = coerce (popCount @Integer)
+  bitSizeMaybe = coerce (bitSizeMaybe @Integer)
+  bitSize = coerce (bitSize @Integer)
+  isSigned _ = False
diff --git a/lib/Numeric/Read.hs b/lib/Numeric/Read.hs
--- a/lib/Numeric/Read.hs
+++ b/lib/Numeric/Read.hs
@@ -9,7 +9,7 @@
   readIntegral,
   readBoundedEnum,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Bool
 import Data.Bounded
@@ -28,11 +28,11 @@
 
 type ReadS a = String -> [(a, String)]
 
-readParen :: forall a . Bool -> ReadS a -> ReadS a  
-readParen b g =  if b then mandatory else optional  
-  where optional r  = g r ++ mandatory r  
-        mandatory r = [(x,u) | ("(",s) <- lex r,  
-                               (x,t)   <- optional s,  
+readParen :: forall a . Bool -> ReadS a -> ReadS a
+readParen b g =  if b then mandatory else optional
+  where optional r  = g r ++ mandatory r
+        mandatory r = [(x,u) | ("(",s) <- lex r,
+                               (x,t)   <- optional s,
                                (")",u) <- lex t ]
 
 --------------------------------------------------------
@@ -41,7 +41,7 @@
 readInt base isDig valDig cs@(c:_) | isDig c = loop 0 cs
   where loop r (c:cs) | isDig c = loop (r * base + fromIntegral (valDig c)) cs
         loop r ds = [(r, ds)]
-readInt _ _ _ _ = []  
+readInt _ _ _ _ = []
 
 readBin :: forall a . (Num a) => ReadS a
 readBin = readInt 2 isBinDigit digitToInt
diff --git a/lib/Numeric/Show.hs b/lib/Numeric/Show.hs
--- a/lib/Numeric/Show.hs
+++ b/lib/Numeric/Show.hs
@@ -7,7 +7,7 @@
   showOct,
   showIntegral,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Error
 import Data.Bool
diff --git a/lib/Prelude.hs b/lib/Prelude.hs
--- a/lib/Prelude.hs
+++ b/lib/Prelude.hs
@@ -1,4 +1,4 @@
--- Copyright 2023 Lennart Augustsson
+-- Copyright 2023, 2024, 2025 Lennart Augustsson
 -- See LICENSE file for full license.
 module Prelude(
   module Control.Applicative,
@@ -41,7 +41,7 @@
   default IsString,
   usingMhs, _wordSize, _isWindows,
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Control.Applicative(Applicative(..))
 import Control.Error(error, undefined)
 import Control.Monad(Monad(..), mapM, mapM_, sequence, sequence_, (=<<))
@@ -79,7 +79,7 @@
 import Data.RealFloat(RealFloat(..))
 import Data.RealFrac(RealFrac(..))
 import Data.Records  -- XXX redo this somehow
-import Data.Semigroup(Semigroup(..))
+import Data.Semigroup(Semigroup((<>)))
 import Data.String(IsString(..), lines, unlines, words, unwords)
 import Data.Tuple(fst, snd, curry, uncurry)
 import Data.Word(Word)
diff --git a/lib/Primitives.hs b/lib/Primitives.hs
--- a/lib/Primitives.hs
+++ b/lib/Primitives.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module Primitives(module Primitives) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Data.Bool_Type
 --import Data.List_Type
 import Data.Ordering_Type
@@ -19,7 +19,8 @@
 
 -- Classes
 -- Type equality as a constraint.
--- class a ~ b | a -> b, b -> a
+type (~) :: forall k . k -> k -> Constraint
+class a ~ b | a -> b, b -> a
 -- class KnownNat in Data.TypeLits
 -- class KnownSymbol in Data.TypeLits
 
@@ -228,15 +229,6 @@
 primRnfNoErr     :: forall a . a -> ()
 primRnfNoErr      = _primitive "rnf" (1::Int)
 
-primNewCAStringLen :: [Char] -> IO (Ptr Char, Int)
-primNewCAStringLen = _primitive "newCAStringLen"
-
-primPeekCAString :: Ptr Char -> IO [Char]
-primPeekCAString = _primitive "peekCAString"
-
-primPeekCAStringLen :: Ptr Char -> Int -> IO [Char]
-primPeekCAStringLen = _primitive "peekCAStringLen"
-
 primWordToPtr :: forall a . Word -> Ptr a
 primWordToPtr = _primitive "toPtr"
 
@@ -304,4 +296,3 @@
 
 primAddFinalizer :: FunPtr (Ptr a -> IO ()) -> ForeignPtr a -> IO ()
 primAddFinalizer = _primitive "fpfin"
-
diff --git a/lib/System/Cmd.hs b/lib/System/Cmd.hs
--- a/lib/System/Cmd.hs
+++ b/lib/System/Cmd.hs
@@ -1,5 +1,5 @@
 module System.Cmd(system) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Foreign.C.String
 import System.Exit
 
diff --git a/lib/System/Compress.hs b/lib/System/Compress.hs
--- a/lib/System/Compress.hs
+++ b/lib/System/Compress.hs
@@ -1,7 +1,13 @@
-module System.Compress(compress, decompress) where
-import Prelude(); import MiniPrelude
+module System.Compress(
+  compress, decompress,
+  compressRLE, decompressRLE,
+  compressBWT, decompressBWT,
+  compressBWTRLE, decompressBWTRLE,
+  ) where
+import qualified Prelude(); import MiniPrelude
+import Primitives(primForeignPtrToPtr)
+import qualified Data.ByteString.Internal as BS
 import Data.Function
-import Foreign.Ptr
 import Foreign.C.String
 import Foreign.C.Types
 import Foreign.Marshal.Alloc
@@ -15,7 +21,7 @@
 type PBFILE = Ptr BFILE
 type Transducer = PBFILE -> IO PBFILE
 foreign import ccall "openb_wr_buf"          c_openb_wr_buf          :: IO PBFILE
-foreign import ccall "openb_rd_buf"          c_openb_rd_buf          :: Ptr Char -> Int -> IO PBFILE
+foreign import ccall "openb_rd_buf"          c_openb_rd_buf          :: CString -> Int -> IO PBFILE
 foreign import ccall "add_lz77_compressor"   c_add_lz77_compressor   :: Transducer
 foreign import ccall "add_lz77_decompressor" c_add_lz77_decompressor :: Transducer
 foreign import ccall "add_rle_compressor"    c_add_rle_compressor    :: Transducer
@@ -24,7 +30,7 @@
 foreign import ccall "add_bwt_decompressor"  c_add_bwt_decompressor  :: Transducer
 foreign import ccall "putb"                  c_putb                  :: Int -> PBFILE -> IO ()
 foreign import ccall "getb"                  c_getb                  :: PBFILE -> IO Int
-foreign import ccall "get_buf"               c_get_buf               :: PBFILE -> Ptr (Ptr Char) -> Ptr Int -> IO ()
+foreign import ccall "get_buf"               c_get_buf               :: PBFILE -> Ptr CString -> Ptr Int -> IO ()
 foreign import ccall "closeb"                c_close                 :: PBFILE -> IO ()
 foreign import ccall "flushb"                c_flush                 :: PBFILE -> IO ()
 
@@ -52,7 +58,7 @@
   h <- mkHandle "withGetTransducer" cbf HRead
   cs <- hGetContents h                         -- get contents
   seq (length cs) (return ())                  -- force it all so ptr is no longer in use
-  hClose h
+  hClose h  -- XXX why?
   return cs
 
 compress :: [Char] -> [Char]
diff --git a/lib/System/Compress/ByteString.hs b/lib/System/Compress/ByteString.hs
new file mode 100644
--- /dev/null
+++ b/lib/System/Compress/ByteString.hs
@@ -0,0 +1,52 @@
+module System.Compress.ByteString(
+  decompressLZ,
+  decompressRLE,
+  decompressLZRLE,
+  ) where
+import qualified Prelude(); import MiniPrelude
+import Primitives(primForeignPtrToPtr)
+import qualified Data.ByteString as BS
+import Data.Function
+import Foreign.C.String
+import Foreign.C.Types
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Foreign.Storable
+import System.IO
+import System.IO.Internal
+import System.IO.Unsafe
+
+type PBFILE = Ptr BFILE
+type Transducer = PBFILE -> IO PBFILE
+foreign import ccall "openb_wr_buf"          c_openb_wr_buf          :: IO PBFILE
+foreign import ccall "openb_rd_buf"          c_openb_rd_buf          :: CString -> Int -> IO PBFILE
+foreign import ccall "add_lz77_compressor"   c_add_lz77_compressor   :: Transducer
+foreign import ccall "add_lz77_decompressor" c_add_lz77_decompressor :: Transducer
+foreign import ccall "add_rle_compressor"    c_add_rle_compressor    :: Transducer
+foreign import ccall "add_rle_decompressor"  c_add_rle_decompressor  :: Transducer
+foreign import ccall "add_bwt_compressor"    c_add_bwt_compressor    :: Transducer
+foreign import ccall "add_bwt_decompressor"  c_add_bwt_decompressor  :: Transducer
+foreign import ccall "putb"                  c_putb                  :: Int -> PBFILE -> IO ()
+foreign import ccall "getb"                  c_getb                  :: PBFILE -> IO Int
+foreign import ccall "get_buf"               c_get_buf               :: PBFILE -> Ptr CString -> Ptr Int -> IO ()
+foreign import ccall "closeb"                c_close                 :: PBFILE -> IO ()
+foreign import ccall "flushb"                c_flush                 :: PBFILE -> IO ()
+
+withGetTransducerBS :: Transducer -> BS.ByteString -> BS.ByteString
+withGetTransducerBS trans bs = unsafePerformIO $ do
+  BS.useAsCStringLen bs $ \ (ptr, len) -> do
+  bf <- c_openb_rd_buf ptr len                 -- open it for reading
+  cbf <- trans bf                              -- and add transducer (e.g., decompressor)
+  h <- mkHandle "withGetTransducer" cbf HRead
+  seq bs (return ())
+  BS.hGetContents h
+
+decompressLZ :: BS.ByteString -> BS.ByteString
+decompressLZ = withGetTransducerBS c_add_lz77_decompressor
+
+decompressRLE :: BS.ByteString -> BS.ByteString
+decompressRLE = withGetTransducerBS c_add_rle_decompressor
+
+decompressLZRLE :: BS.ByteString -> BS.ByteString
+decompressLZRLE = withGetTransducerBS (c_add_rle_decompressor <=< c_add_lz77_decompressor)
diff --git a/lib/System/Console/GetOpt.hs b/lib/System/Console/GetOpt.hs
--- a/lib/System/Console/GetOpt.hs
+++ b/lib/System/Console/GetOpt.hs
@@ -63,6 +63,7 @@
 ) where
 
 import Data.List ( isPrefixOf, find )
+import Data.Maybe
 
 -- |What to do with options following non-options
 data ArgOrder a
@@ -210,11 +211,11 @@
 longOpt ls rs optDescr = long ads arg rs
    where (opt,arg) = break (=='=') ls
          getWith p = [ o | o@(Option _ xs _ _) <- optDescr
-                         , find (p opt) xs /= Nothing ]
+                         , isJust (find (p opt) xs) ]
          exact     = getWith (==)
          options   = if null exact then getWith isPrefixOf else exact
          ads       = [ ad | Option _ _ ad _ <- options ]
-         optStr    = ("--"++opt)
+         optStr    = "--" ++ opt
 
          long (_:_:_)      _        rest     = (errAmbig options optStr,rest)
          long [NoArg  a  ] []       rest     = (Opt a,rest)
diff --git a/lib/System/Directory.hs b/lib/System/Directory.hs
--- a/lib/System/Directory.hs
+++ b/lib/System/Directory.hs
@@ -12,7 +12,7 @@
   copyFile,
   getHomeDirectory,
   ) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Control.Exception(bracket)
 import Control.Monad(when)
 import Foreign.C.String
@@ -49,7 +49,6 @@
 doesDirectoryExist :: FilePath -> IO Bool
 doesDirectoryExist fn = withCAString fn $ \ cfn -> do
   dp <- c_opendir cfn
-  return False
   if dp == nullPtr then
     return False
    else do
diff --git a/lib/System/Environment.hs b/lib/System/Environment.hs
--- a/lib/System/Environment.hs
+++ b/lib/System/Environment.hs
@@ -7,7 +7,7 @@
   lookupEnv,
   getEnv,
   ) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Primitives
 import Foreign.C.String
 import Foreign.Ptr
diff --git a/lib/System/Exit.hs b/lib/System/Exit.hs
--- a/lib/System/Exit.hs
+++ b/lib/System/Exit.hs
@@ -5,7 +5,7 @@
   exitSuccess,
   die,
   ) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Control.Exception
 import Data.Typeable
 import System.IO
diff --git a/lib/System/IO.hs b/lib/System/IO.hs
--- a/lib/System/IO.hs
+++ b/lib/System/IO.hs
@@ -31,10 +31,11 @@
   IOException(..),
 
   ) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Control.Applicative
 import Control.Error
+import Control.Exception.Internal(bracket)
 import Control.Monad
 import Control.Monad.Fail
 import Data.Bool
@@ -103,7 +104,7 @@
 hCloseReal h = do
   m <- getHandleState h
   case m of
-    HClosed -> ioErrH h OtherError "hClose: Handle already closed"
+    HClosed -> return ()
     HSemiClosed -> return ()
     _ -> do
       killHandle h
@@ -118,7 +119,9 @@
   c <- c_getb p
   if c == (-1::Int) then
     ioErrH h EOF "hGetChar"
-   else
+  else if c `primIntAnd` 0x1ff800 == 0xd800 then
+    ioErrH h InvalidArgument "hGetChar: surrogate"
+  else
     return (chr c)
 
 hLookAhead :: Handle -> IO Char
@@ -128,7 +131,10 @@
   return c
 
 hPutChar :: Handle -> Char -> IO ()
-hPutChar h c = withHandleWr h $ c_putb (ord c)
+hPutChar h c
+  | i `primIntAnd` 0x1ff800 == 0xd800 = ioErrH h InvalidArgument "hPutChar: surrogate"
+  | otherwise = withHandleWr h $ c_putb i
+  where i = ord c
 
 openFILEM :: FilePath -> IOMode -> IO (Maybe (Ptr FILE))
 openFILEM p m = do
@@ -226,9 +232,7 @@
 readFile :: FilePath -> IO String
 readFile p = do
   h <- openFile p ReadMode
-  cs <- hGetContents h
-  --hClose h  can't close with lazy hGetContents
-  return cs
+  hGetContents h  --  can't close with lazy hGetContents
 
 -- Lazy hGetContents
 hGetContents :: Handle -> IO String
@@ -238,10 +242,12 @@
     hClose h                           -- EOF, so close the handle
     setHandleState h HSemiClosed       -- but still allow a regular close
     return ""
-   else do
+  else if c `primIntAnd` 0x1ff800 == 0xd800 then
+    ioErrH h InvalidArgument "hGetContents: surrogate"
+  else do
     cs <- unsafeInterleaveIO (hGetContents h)
     return (chr c : cs)
-  
+
 getContents :: IO String
 getContents = hGetContents stdin
 
@@ -281,18 +287,16 @@
 
 --------
 
--- XXX needs bracket
 withFile :: forall r . FilePath -> IOMode -> (Handle -> IO r) -> IO r
-withFile fn md io = do
-  h <- openFile fn md
-  r <- io h
-  hClose h
-  return r
+withFile fn md io = bracket (openFile fn md) hClose io
 
+withBinaryFile :: forall r . FilePath -> IOMode -> (Handle -> IO r) -> IO r
+withBinaryFile fn md io = bracket (openBinaryFile fn md) hClose io
+
 --------
 
 splitTmp :: String -> (String, String)
-splitTmp tmpl = 
+splitTmp tmpl =
   case span (/= '.') (reverse tmpl) of
     (rsuf, "") -> (tmpl, "")
     (rsuf, _:rpre) -> (reverse rpre, '.':reverse rsuf)
diff --git a/lib/System/IO/Error.hs b/lib/System/IO/Error.hs
--- a/lib/System/IO/Error.hs
+++ b/lib/System/IO/Error.hs
@@ -68,7 +68,7 @@
 
     modifyIOError,
   ) where
-import Prelude()
+import qualified Prelude()
 import Primitives(IO)
 import Control.Exception.Internal
 import Control.Monad
@@ -77,6 +77,7 @@
 import Data.Either
 import Data.Eq
 import Data.Function
+import Data.Functor
 import Data.Int
 import Data.List
 import Data.Maybe
@@ -186,8 +187,7 @@
 -----------
 
 tryIOError     :: IO a -> IO (Either IOError a)
-tryIOError f   =  catch (do r <- f
-                            return (Right r))
+tryIOError f   =  catch (Right <$> f)
                         (return . Left)
 
 mkIOError :: IOErrorType -> String -> Maybe Handle -> Maybe FilePath -> IOError
@@ -321,7 +321,7 @@
 ioeSetFileName    ioe filename = ioe{ ioe_filename = Just filename }
 
 modifyIOError :: (IOError -> IOError) -> IO a -> IO a
-modifyIOError f io = catch io (\e -> ioError (f e))
+modifyIOError f io = catch io (ioError . f)
 
 annotateIOError :: IOError
               -> String
diff --git a/lib/System/IO/Internal.hs b/lib/System/IO/Internal.hs
--- a/lib/System/IO/Internal.hs
+++ b/lib/System/IO/Internal.hs
@@ -8,7 +8,7 @@
   getHandleState, setHandleState,
   killHandle,
   addTransducer) where
-import Prelude()
+import qualified Prelude()
 import Primitives
 import Control.Applicative
 import Control.Error
@@ -65,7 +65,7 @@
 withHandleM :: [HandleState] -> Handle -> (Ptr BFILE -> IO a) -> IO a
 withHandleM ms h@(Handle _ st _) io = do
   m <- readIORef st
-  when (m `notElem` ms) (error "Bad Handle mode")
+  unless (m `elem` ms) (error "Bad Handle mode")
   withHandle h io
 
 withHandleRd :: Handle -> (Ptr BFILE -> IO a) -> IO a
diff --git a/lib/System/IO/MD5.hs b/lib/System/IO/MD5.hs
--- a/lib/System/IO/MD5.hs
+++ b/lib/System/IO/MD5.hs
@@ -1,8 +1,10 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module System.IO.MD5(MD5CheckSum, md5File, md5Handle, md5String, md5Combine) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Primitives(primPerformIO)
+import Control.DeepSeq.Class
+import Data.Coerce
 import Data.Word
 import Foreign.C.String
 import Foreign.Marshal.Alloc
@@ -16,16 +18,14 @@
 foreign import ccall "md5Array"  c_md5Array  :: Ptr Word  -> Ptr Word -> Int -> IO ()
 
 newtype MD5CheckSum = MD5 [Word]  -- either 2*64 bits or 4*32 bits
-
-instance Eq MD5CheckSum where
-  MD5 a == MD5 b  =  a == b
-
-instance Ord MD5CheckSum where
-  MD5 a <= MD5 b  =  a <= b
+  deriving (Eq, Ord)
 
 instance Show MD5CheckSum where
   show (MD5 ws) = "MD5" ++ show ws
 
+instance NFData MD5CheckSum where
+  rnf (MD5 ws) = rnf ws
+
 md5Len :: Int
 md5Len = 16   -- The MD5 checksum is 16 bytes
 
@@ -60,5 +60,5 @@
 md5Combine [] = error "md5Combine: empty"
 md5Combine [m] = m
 md5Combine ms = primPerformIO $
-  withArrray [ w | MD5 ws <- ms, w <- ws ] $ \ a -> 
+  withArrray [ w | MD5 ws <- ms, w <- ws ] $ \ a ->
     chksum $ \ w -> c_md5Array a w (length ms * md5Len)
diff --git a/lib/System/IO/PrintOrRun.hs b/lib/System/IO/PrintOrRun.hs
--- a/lib/System/IO/PrintOrRun.hs
+++ b/lib/System/IO/PrintOrRun.hs
@@ -1,8 +1,10 @@
 -- Copyright 2023,2024 Lennart Augustsson
 -- See LICENSE file for full license.
-module System.IO.PrintOrRun(PrintOrRun(..)) where
-import Prelude()              -- do not import Prelude
+module System.IO.PrintOrRun(PrintOrRun(..), _withArgs) where
+import qualified Prelude()              -- do not import Prelude
 import Primitives
+import Data.Char(String)
+import System.Environment
 import System.IO
 import Text.Show
 
@@ -14,4 +16,7 @@
   printOrRun a = a
 
 instance forall a . Show a => PrintOrRun a where
-  printOrRun a = putStrLn (show a)
+  printOrRun = print
+
+_withArgs :: [String] -> IO () -> IO ()
+_withArgs = withArgs
diff --git a/lib/System/IO/Serialize.hs b/lib/System/IO/Serialize.hs
--- a/lib/System/IO/Serialize.hs
+++ b/lib/System/IO/Serialize.hs
@@ -5,7 +5,7 @@
   writeSerialized, writeSerializedCompressed,
   readSerialized,
   ) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Primitives(Ptr)
 import System.IO
 import System.IO.Internal
diff --git a/lib/System/IO/StringHandle.hs b/lib/System/IO/StringHandle.hs
new file mode 100644
--- /dev/null
+++ b/lib/System/IO/StringHandle.hs
@@ -0,0 +1,40 @@
+module System.IO.StringHandle(handleWriteToString, stringToHandle) where
+import Prelude; import MiniPrelude
+import Foreign.C.String
+import Foreign.C.Types
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Foreign.Storable
+import System.IO
+import System.IO.Internal
+
+foreign import ccall "openb_wr_buf"          c_openb_wr_buf          :: IO (Ptr BFILE)
+foreign import ccall "openb_rd_buf"          c_openb_rd_buf          :: CString -> Int -> IO (Ptr BFILE)
+foreign import ccall "get_buf"               c_get_buf               :: Ptr BFILE -> Ptr CString -> Ptr Int -> IO ()
+
+-- Turn all writes to a Handle into a String.
+-- Do not close the Handle in the action
+handleWriteToString :: (Handle -> IO ()) -> IO String
+handleWriteToString act = do
+  bf <- c_openb_wr_buf                         -- create a buffer
+  h <- mkHandle "handleToString" bf HWrite
+  act h
+  hFlush h
+  with nullPtr $ \ bufp ->
+    with 0 $ \ lenp -> do
+      c_get_buf bf bufp lenp                   -- get buffer and length
+      buf <- peek bufp
+      len <- peek lenp
+      res <- peekCAStringLen (buf, len)        -- encode as a string
+      free buf                                 -- free owned memory
+      hClose h                                 -- close
+      return res
+
+-- Make a Handle that will read from a String.
+-- Caller should close the Handle.
+stringToHandle :: String -> IO Handle
+stringToHandle file = do
+  (ptr, len) <- newCAStringLen file            -- make memory buffer
+  bf <- c_openb_rd_buf ptr len                 -- open it for reading
+  mkHandle "stringToHandle" bf HRead           -- and make a handle
diff --git a/lib/System/IO/TimeMilli.hs b/lib/System/IO/TimeMilli.hs
--- a/lib/System/IO/TimeMilli.hs
+++ b/lib/System/IO/TimeMilli.hs
@@ -1,5 +1,5 @@
 module System.IO.TimeMilli(getTimeMilli) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 
 foreign import ccall "GETTIMEMILLI" c_getTimeMilli :: IO Int
 
diff --git a/lib/System/IO/Unsafe.hs b/lib/System/IO/Unsafe.hs
--- a/lib/System/IO/Unsafe.hs
+++ b/lib/System/IO/Unsafe.hs
@@ -1,5 +1,5 @@
 module System.IO.Unsafe(unsafePerformIO, unsafeInterleaveIO) where
-import Prelude()
+import qualified Prelude()
 import Primitives
 
 unsafePerformIO :: IO a -> a
diff --git a/lib/System/IO_Handle.hs b/lib/System/IO_Handle.hs
--- a/lib/System/IO_Handle.hs
+++ b/lib/System/IO_Handle.hs
@@ -1,5 +1,5 @@
 module System.IO_Handle(BFILE, Handle(..), HandleState(..)) where
-import Prelude()
+import qualified Prelude()
 import Primitives
 import Data.Bool
 import Data.Eq
diff --git a/lib/System/Info.hs b/lib/System/Info.hs
--- a/lib/System/Info.hs
+++ b/lib/System/Info.hs
@@ -32,5 +32,5 @@
   res <- readFile fn
   removeFile fn
   when (rc /= ExitSuccess) $
-    error $ "System.Into: uname failed"
+    error "System.Into: uname failed"
   return $ map toLower $ filter (not . isSpace) res
diff --git a/lib/System/Process.hs b/lib/System/Process.hs
--- a/lib/System/Process.hs
+++ b/lib/System/Process.hs
@@ -1,5 +1,5 @@
 module System.Process(callCommand) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Control.Monad(when)
 import Foreign.C.String
 
diff --git a/lib/Text/ParserCombinators/ReadP.hs b/lib/Text/ParserCombinators/ReadP.hs
--- a/lib/Text/ParserCombinators/ReadP.hs
+++ b/lib/Text/ParserCombinators/ReadP.hs
@@ -1,9 +1,3 @@
-{-# LANGUAGE Trustworthy #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE MagicHash #-}
-{-# LANGUAGE DeriveFunctor #-}
-
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  GHC.Internal.Text.ParserCombinators.ReadP
@@ -71,7 +65,7 @@
   -- $properties
   )
  where
-import Prelude()
+import qualified Prelude()
 import Primitives
 import Control.Applicative hiding (optional, many)
 import Control.Error
@@ -133,11 +127,11 @@
 
 -- | @since base-2.01
 instance Monad P where
-  (Get f)         >>= k = Get (\c -> f c >>= k)
-  (Look f)        >>= k = Look (\s -> f s >>= k)
+  (Get f)         >>= k = Get (f >=> k)
+  (Look f)        >>= k = Look (f >=> k)
   Fail            >>= _ = Fail
   (Result x p)    >>= k = k x <|> (p >>= k)
-  (Final (r:|rs)) >>= k = final [ys' | (x,s) <- (r:rs), ys' <- run (k x) s]
+  (Final (r:|rs)) >>= k = final [ys' | (x,s) <- r:rs, ys' <- run (k x) s]
 
 -- | @since base-4.9.0.0
 instance MonadFail P where
@@ -198,7 +192,7 @@
 
 -- | @since base-4.9.0.0
 instance MonadFail ReadP where
-  fail _    = R (\_ -> Fail)
+  fail _    = R (const Fail)
 
 -- | @since base-4.6.0.0
 instance Alternative ReadP where
@@ -219,7 +213,7 @@
 run (Get f)         (c:s) = run (f c) s
 run (Look f)        s     = run (f s) s
 run (Result x p)    s     = (x,s) : run p s
-run (Final (r:|rs)) _     = (r:rs)
+run (Final (r:|rs)) _     = r:rs
 run _               _     = []
 
 -- ---------------------------------------------------------------------------
@@ -237,7 +231,7 @@
 
 pfail :: ReadP a
 -- ^ Always fails.
-pfail = R (\_ -> Fail)
+pfail = R (const Fail)
 
 (+++) :: ReadP a -> ReadP a -> ReadP a
 -- ^ Symmetric choice.
@@ -273,7 +267,7 @@
   gath :: (String -> String) -> P (String -> P b) -> P b
   gath l (Get f)      = Get (\c -> gath (l.(c:)) (f c))
   gath _ Fail         = Fail
-  gath l (Look f)     = Look (\s -> gath l (f s))
+  gath l (Look f)     = Look (gath l . f)
   gath l (Result k p) = k (l []) <|> gath l p
   gath _ (Final _)    = errorWithoutStackTrace "do not use readS_to_P in gather!"
 
@@ -292,8 +286,7 @@
 eof :: ReadP ()
 -- ^ Succeeds iff we are at the end of input
 eof = do { s <- look
-         ; if null s then return ()
-                     else pfail }
+         ; unless (null s) pfail }
 
 string :: String -> ReadP String
 -- ^ Parses and returns the specified string.
@@ -341,7 +334,7 @@
 count :: Int -> ReadP a -> ReadP [a]
 -- ^ @count n p@ parses @n@ occurrences of @p@ in sequence. A list of
 --   results is returned.
-count n p = sequence (replicate n p)
+count n p = replicateM n p
 
 between :: ReadP open -> ReadP close -> ReadP a -> ReadP a
 -- ^ @between open close p@ parses @open@, followed by @p@ and finally
@@ -358,7 +351,7 @@
 
 optional :: ReadP a -> ReadP ()
 -- ^ @optional p@ optionally parses @p@ and always returns @()@.
-optional p = (p >> return ()) +++ return ()
+optional p = void p +++ return ()
 
 many :: ReadP a -> ReadP [a]
 -- ^ Parses zero or more occurrences of the given parser.
@@ -370,7 +363,7 @@
 
 skipMany :: ReadP a -> ReadP ()
 -- ^ Like 'many', but discards the result.
-skipMany p = many p >> return ()
+skipMany p = void (many p)
 
 skipMany1 :: ReadP a -> ReadP ()
 -- ^ Like 'many1', but discards the result.
@@ -431,7 +424,7 @@
 -- ^ @manyTill p end@ parses zero or more occurrences of @p@, until @end@
 --   succeeds. Returns a list of values returned by @p@.
 manyTill p end = scan
-  where scan = (end >> return []) <++ (liftM2 (:) p scan)
+  where scan = (end >> return []) <++ liftM2 (:) p scan
 
 -- ---------------------------------------------------------------------------
 -- Converting between ReadP and Read
@@ -449,4 +442,3 @@
 --   parser, and therefore a possible inefficiency.
 readS_to_P r =
   R (\k -> Look (\s -> final [bs'' | (a,s') <- r s, bs'' <- run (k a) s']))
-
diff --git a/lib/Text/ParserCombinators/ReadPrec.hs b/lib/Text/ParserCombinators/ReadPrec.hs
--- a/lib/Text/ParserCombinators/ReadPrec.hs
+++ b/lib/Text/ParserCombinators/ReadPrec.hs
@@ -45,11 +45,12 @@
   readS_to_Prec,
   )
  where
-import Prelude()
+import qualified Prelude()
 import Control.Applicative
 import Control.Monad
 import Control.Monad.Fail
 import Data.Char
+import Data.Function
 import Data.Int
 import Data.Num
 import Data.List
@@ -67,7 +68,7 @@
 -- Functor, Monad, MonadPlus
 
 instance Functor ReadPrec where
-  fmap h (P f) = P (\n -> fmap h (f n))
+  fmap h (P f) = P (fmap h . f)
 
 instance Applicative ReadPrec where
     pure x  = P (\_ -> pure x)
@@ -97,7 +98,7 @@
 
 lift :: ReadP a -> ReadPrec a
 -- ^ Lift a precedence-insensitive 'ReadP' to a 'ReadPrec'.
-lift m = P (\_ -> m)
+lift m = P (const m)
 
 step :: ReadPrec a -> ReadPrec a
 -- ^ Increases the precedence context by one.
@@ -160,4 +161,4 @@
 readPrec_to_S (P f) n = readP_to_S (f n)
 
 readS_to_Prec :: (Int -> ReadS a) -> ReadPrec a
-readS_to_Prec f = P (\n -> readS_to_P (f n))
+readS_to_Prec f = P (readS_to_P . f)
diff --git a/lib/Text/Printf.hs b/lib/Text/Printf.hs
--- a/lib/Text/Printf.hs
+++ b/lib/Text/Printf.hs
@@ -95,6 +95,7 @@
 import Data.Char
 import Data.Int
 import Data.List (stripPrefix)
+import Data.Maybe
 import Data.Word
 import Numeric.Show
 import Numeric.FormatFloat(showEFloat, showFFloat, showGFloat, showFFloatAlt, showGFloatAlt)
@@ -301,12 +302,12 @@
 
 -- | @since 2.01
 instance (PrintfArg a, PrintfType r) => PrintfType (a -> r) where
-    spr fmts args = \ a -> spr fmts
+    spr fmts args a = spr fmts
                              ((parseFormat a, formatArg a) : args)
 
 -- | @since 2.01
 instance (PrintfArg a, HPrintfType r) => HPrintfType (a -> r) where
-    hspr hdl fmts args = \ a -> hspr hdl fmts
+    hspr hdl fmts args a = hspr hdl fmts
                                   ((parseFormat a, formatArg a) : args)
 
 -- | Typeclass of 'printf'-formattable values. The 'formatArg' method
@@ -395,11 +396,9 @@
 instance PrintfArg Float where
     formatArg = formatRealFloat
 
-{- Double=Float
 -- | @since 2.01
 instance PrintfArg Double where
     formatArg = formatRealFloat
--}
 
 -- | This class, with only the one instance, is used as
 -- a workaround for the fact that 'String', as a concrete
@@ -495,9 +494,7 @@
   where
     matchPrefix (p, _) m@(Just (FormatParse p0 _ _))
       | length p0 >= length p = m
-      | otherwise = case getFormat p of
-          Nothing -> m
-          Just fp -> Just fp
+      | otherwise = maybe m Just (getFormat p)
     matchPrefix (p, _) Nothing =
       getFormat p
     getFormat p =
@@ -598,7 +595,7 @@
     'u' -> (adjust ufmt (fmtu 10 Nothing prec m x) ++)
     'c' | x >= fromIntegral (ord (minBound :: Char)) &&
           x <= fromIntegral (ord (maxBound :: Char)) &&
-          fmtPrecision ufmt == Nothing &&
+          isNothing (fmtPrecision ufmt) &&
           fmtModifiers ufmt == "" ->
             formatString [chr $ fromIntegral x] (ufmt { fmtChar = 's' })
     'c' -> perror "illegal char conversion"
@@ -731,9 +728,9 @@
   where
     fmtu' :: Maybe Int -> Maybe Integer -> Integer -> Maybe String
     fmtu' prec (Just m) i | i < 0 =
-      fmtu' prec Nothing (-2 * m + i)
+      fmtu' prec Nothing (- (2 * m) + i)
     fmtu' (Just prec) _ i | i >= 0 =
-      fmap (integral_prec (Just prec)) $ fmtu' Nothing Nothing i
+      integral_prec (Just prec) <$> fmtu' Nothing Nothing i
     fmtu' Nothing _ i | i >= 0 =
       Just $ showIntAtBase b intToDigit i ""
     fmtu' _ _ _ = Nothing
diff --git a/lib/Text/Read.hs b/lib/Text/Read.hs
--- a/lib/Text/Read.hs
+++ b/lib/Text/Read.hs
@@ -38,7 +38,7 @@
      readEither,
      readMaybe
      ) where
-import Prelude()
+import qualified Prelude()
 import Control.Error
 import Control.Monad
 import Data.Bool
diff --git a/lib/Text/Read/Internal.hs b/lib/Text/Read/Internal.hs
--- a/lib/Text/Read/Internal.hs
+++ b/lib/Text/Read/Internal.hs
@@ -41,7 +41,7 @@
   , readParen
   )
  where
-import Prelude()
+import qualified Prelude()
 
 import Control.Applicative
 import Control.Error
@@ -225,7 +225,7 @@
   readsPrec    = readPrec_to_S readPrec
   readList     = readPrec_to_S (list readPrec) 0
   readPrec     = readS_to_Prec readsPrec
-  readListPrec = readS_to_Prec (\_ -> readList)
+  readListPrec = readS_to_Prec (const readList)
 
 readListDefault :: Read a => ReadS [a]
 -- ^ A possible replacement definition for the 'readList' method (GHC only).
@@ -339,7 +339,7 @@
 list readx =
   parens
   ( do expectP (L.Punc "[")
-       (listRest False +++ listNext)
+       listRest False +++ listNext
   )
  where
   listRest started =
@@ -539,7 +539,7 @@
            x <- step readPrec
            return (Right x))
     )
-    
+
   readListPrec = readListPrecDefault
   readList     = readListDefault
 
@@ -636,7 +636,7 @@
 -- | @since base-4.8.0.0
 instance Read Natural where
   readsPrec d = map (\(n, s) -> (fromInteger n, s))
-                  . filter ((>= 0) . (\(x,_)->x)) . readsPrec d
+                  . filter ((>= 0) . fst) . readsPrec d
   readListPrec = readListPrecDefault
   readList     = readListDefault
 
@@ -796,4 +796,3 @@
                           ; return (a,b,c,d,e,f,g,h,i,j) })
   readListPrec = readListPrecDefault
   readList     = readListDefault
-
diff --git a/lib/Text/Read/Internal.hs-boot b/lib/Text/Read/Internal.hs-boot
--- a/lib/Text/Read/Internal.hs-boot
+++ b/lib/Text/Read/Internal.hs-boot
@@ -1,5 +1,7 @@
 module Text.Read.Internal where
-import Prelude()
+import qualified Prelude()
 import Data.Char_Type
 
 lex :: String -> [(String, String)]
+lexLitChar :: String -> [(String, String)]
+readLitChar :: String -> [(Char, String)]
diff --git a/lib/Text/Read/Lex.hs b/lib/Text/Read/Lex.hs
--- a/lib/Text/Read/Lex.hs
+++ b/lib/Text/Read/Lex.hs
@@ -35,7 +35,7 @@
   , isSymbolChar
   )
  where
-import Prelude()
+import qualified Prelude()
 import Control.Error
 import Control.Monad
 import Data.Char
@@ -176,7 +176,7 @@
 expect :: Lexeme -> ReadP ()
 expect lexeme = do { skipSpaces
                    ; thing <- lexToken
-                   ; if thing == lexeme then return () else pfail }
+                   ; unless (thing == lexeme) pfail }
 
 hsLex :: ReadP String
 -- ^ Haskell lexer: returns the lexed string, rather than the lexeme
@@ -556,13 +556,13 @@
   | otherwise            = Nothing
 
 valDig 8 c
-  | '0' <= c && c <= '7' = Just (ord c - ord '0')
-  | otherwise            = Nothing
+  | isOctDigit c = Just (ord c - ord '0')
+  | otherwise    = Nothing
 
 valDig 10 c = valDecDig c
 
 valDig 16 c
-  | '0' <= c && c <= '9' = Just (ord c - ord '0')
+  | isDigit c            = Just (ord c - ord '0')
   | 'a' <= c && c <= 'f' = Just (ord c - ord 'a' + 10)
   | 'A' <= c && c <= 'F' = Just (ord c - ord 'A' + 10)
   | otherwise            = Nothing
@@ -571,8 +571,8 @@
 
 valDecDig :: Char -> Maybe Int
 valDecDig c
-  | '0' <= c && c <= '9' = Just (ord c - ord '0')
-  | otherwise            = Nothing
+  | isDigit c = Just (ord c - ord '0')
+  | otherwise = Nothing
 
 -- ----------------------------------------------------------------------
 -- other numeric lexing functions
@@ -587,8 +587,8 @@
 readIntP' :: (Eq a, Num a) => a -> ReadP a
 readIntP' base = readIntP base isDigit valDigit
  where
-  isDigit  c = maybe False (const True) (valDig base c)
-  valDigit c = maybe 0     id           (valDig base c)
+  isDigit  c = isJust (valDig base c)
+  valDigit c = fromMaybe 0 (valDig base c)
 {-# SPECIALISE readIntP' :: Integer -> ReadP Integer #-}
 
 readBinP, readOctP, readDecP, readHexP :: (Eq a, Num a) => ReadP a
diff --git a/lib/Text/Show.hs b/lib/Text/Show.hs
--- a/lib/Text/Show.hs
+++ b/lib/Text/Show.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023,2024 Lennart Augustsson
 -- See LICENSE file for full license.
 module Text.Show(module Text.Show) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 import Data.Bool_Type
 import Data.Char_Type
@@ -15,7 +15,7 @@
   showList  :: [a] -> ShowS
 
   showsPrec _ x s = show x ++ s
-  show x          = showsPrec 0 x ""
+  show x          = shows x ""
   showList        = showListWith shows
 
 shows :: forall a . Show a => a -> ShowS
diff --git a/lib/Unsafe/Coerce.hs b/lib/Unsafe/Coerce.hs
--- a/lib/Unsafe/Coerce.hs
+++ b/lib/Unsafe/Coerce.hs
@@ -1,5 +1,5 @@
 module Unsafe.Coerce(module Unsafe.Coerce, AnyType) where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
 import Primitives
 
 unsafeCoerce :: forall a b . a -> b
diff --git a/lib/dist-mcabal/autogen/Paths_libs.hs b/lib/dist-mcabal/autogen/Paths_libs.hs
--- a/lib/dist-mcabal/autogen/Paths_libs.hs
+++ b/lib/dist-mcabal/autogen/Paths_libs.hs
@@ -1,4 +1,4 @@
 module Paths_libs where
 import Data.Version
-version :: Version; version = makeVersion [0,11,4,0]
-getDataDir :: IO FilePath; getDataDir = return "/Users/augustss/.mcabal/mhs-0.11.4.0/packages/base-0.11.4.0/data"
+version :: Version; version = makeVersion [0,12,5,4]
+getDataDir :: IO FilePath; getDataDir = return "/Users/augustss/.mcabal/mhs-0.12.5.4/packages/base-0.12.5.4/data"
diff --git a/lib/gmp/Data/Integer/Internal.hs b/lib/gmp/Data/Integer/Internal.hs
--- a/lib/gmp/Data/Integer/Internal.hs
+++ b/lib/gmp/Data/Integer/Internal.hs
@@ -14,7 +14,7 @@
   _integerToInt,
   _wordToInteger,
   ) where
-import Prelude()
+import qualified Prelude()
 import Primitives
 import Mhs.Builtin
 import Data.Bool
@@ -28,7 +28,7 @@
 
 -- We cannot import Foreign.ForeignPtr; it is circular.
 withForeignPtr :: ForeignPtr a -> (Ptr a -> IO b) -> IO b
-withForeignPtr fp io = 
+withForeignPtr fp io =
   io (primForeignPtrToPtr fp) `primBind` \ b ->
   primSeq fp (primReturn b)
 
@@ -45,7 +45,7 @@
 foreign import capi "mpz_ior"         mpz_ior         :: Ptr MPZ -> Ptr MPZ -> Ptr MPZ ->            IO ()
 foreign import capi "mpz_xor"         mpz_xor         :: Ptr MPZ -> Ptr MPZ -> Ptr MPZ ->            IO ()
 foreign import capi "mpz_mul_2exp"    mpz_mul_2exp    :: Ptr MPZ -> Ptr MPZ -> Int ->                IO ()
-foreign import capi "mpz_tdiv_q_2exp" mpz_tdiv_q_2exp :: Ptr MPZ -> Ptr MPZ -> Int ->                IO ()
+foreign import capi "mpz_fdiv_q_2exp" mpz_fdiv_q_2exp :: Ptr MPZ -> Ptr MPZ -> Int ->                IO ()
 foreign import capi "mpz_popcount"    mpz_popcount    :: Ptr MPZ ->                                  IO Int
 foreign import capi "mpz_tstbit"      mpz_tstbit      :: Ptr MPZ -> Int ->                           IO Int
 
@@ -107,7 +107,7 @@
 isZero = eqI zeroI
 
 cmpop :: (Int -> a) -> Integer -> Integer -> a
-cmpop f (I x) (I y) = unsafePerformIO $ 
+cmpop f (I x) (I y) = unsafePerformIO $
   withForeignPtr x $ \ px ->
     withForeignPtr y $ \ py -> do
       s <- mpz_cmp px py
@@ -155,10 +155,10 @@
 shiftLI x i = unop (\ pz px -> mpz_mul_2exp pz px i) x
 
 shiftRI :: Integer -> Int -> Integer
-shiftRI x i = unop (\ pz px -> mpz_tdiv_q_2exp pz px i) x
+shiftRI x i = unop (\ pz px -> mpz_fdiv_q_2exp pz px i) x
 
 popCountI :: Integer -> Int
-popCountI (I x) = unsafePerformIO $ withForeignPtr x $ mpz_popcount
+popCountI (I x) = unsafePerformIO $ withForeignPtr x mpz_popcount
 
 ---------------------------------
 {-
diff --git a/lib/gmp/Data/Integer_Type.hs b/lib/gmp/Data/Integer_Type.hs
--- a/lib/gmp/Data/Integer_Type.hs
+++ b/lib/gmp/Data/Integer_Type.hs
@@ -4,7 +4,7 @@
   _intToInteger, _wordToInteger, _integerToInt, _integerToWord,
   _integerToFloatW,
   ) where
-import Prelude()
+import qualified Prelude()
 import Primitives
 --import Foreign.ForeignPtr
 --import Mhs.Builtin
@@ -12,7 +12,7 @@
 
 -- We cannot import Foreign.ForeignPtr; it is circular.
 withForeignPtr :: ForeignPtr a -> (Ptr a -> IO b) -> IO b
-withForeignPtr fp io = 
+withForeignPtr fp io =
   io (primForeignPtrToPtr fp) `primBind` \ b ->
   primSeq fp (primReturn b)
 
@@ -30,13 +30,13 @@
 foreign import capi "mpz_get_d"       mpz_get_d       :: Ptr MPZ -> IO FloatW
 
 newMPZ :: IO (ForeignPtr MPZ)
-newMPZ = 
+newMPZ =
   new_mpz `primBind` \ x ->
   primReturn (primUnsafeCoerce x)
 
 _intToInteger :: Int -> Integer
 _intToInteger i = primPerformIO (
-  newMPZ `primBind` \ x -> 
+  newMPZ `primBind` \ x ->
   withForeignPtr x ( \ p -> mpz_init_set_si p i) `primThen`
   primReturn (I x)
   )
diff --git a/mhs/MHSPrelude.hs b/mhs/MHSPrelude.hs
--- a/mhs/MHSPrelude.hs
+++ b/mhs/MHSPrelude.hs
@@ -1,5 +1,6 @@
 module MHSPrelude(
   module Control.Applicative,
+  module Control.DeepSeq.Class,
   module Control.Error,
   module Control.Monad,
   module Control.Monad.Fail,
@@ -28,14 +29,17 @@
   module Data.Tuple,
   module System.IO,
   module Text.Show,
+  first, second,
   usingMhs, _wordSize, _isWindows,
-  rnfNoErr, rnfErr, NFData, appendDot,
+  appendDot,
   wantGMP,
+  compiledWithMhs,
   ) where
-import Prelude()
+import qualified Prelude()
 --import Primitives(primRnfNoErr, primRnfErr)
 import Control.Applicative(Applicative(..))
 import Control.Error(error, undefined)
+import Control.DeepSeq.Class
 import Control.Monad(Monad(..), mapM, mapM_, sequence, sequence_, (=<<))
 import Control.Monad.Fail(MonadFail(..))
 import Data.Bool(Bool(..), (&&), (||), not, otherwise)
@@ -82,15 +86,6 @@
 
 -------
 
--- Define these here to avoid dragging in Control.DeepSeq
-rnfNoErr :: forall a . a -> ()
-rnfNoErr = _primitive "rnf" (1::Int)
-
-rnfErr :: forall a . a -> ()
-rnfErr = _primitive "rnf" (0::Int)
-
-class NFData a
-
 appendDot :: Text -> Text -> Text
 appendDot x y =
   _primitive "bs++." x y
@@ -101,3 +96,15 @@
 
 wantGMP :: Bool
 wantGMP = want_gmp /= 0
+
+compiledWithMhs :: Bool
+compiledWithMhs = True
+
+instance NFData (a -> b) where
+  rnf f = seq f ()
+
+first :: forall a b c . (a -> c) -> (a, b) -> (c, b)
+first f (a, b) = (f a, b)
+
+second :: forall a b c . (b -> c) -> (a, b) -> (a, c)
+second f (a, b) = (a, f b)
diff --git a/mhs/PrimTable.hs b/mhs/PrimTable.hs
--- a/mhs/PrimTable.hs
+++ b/mhs/PrimTable.hs
@@ -1,4 +1,4 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module PrimTable() where
-import Prelude()              -- do not import Prelude
+import qualified Prelude()              -- do not import Prelude
diff --git a/mhs/System/Console/SimpleReadline.hs b/mhs/System/Console/SimpleReadline.hs
--- a/mhs/System/Console/SimpleReadline.hs
+++ b/mhs/System/Console/SimpleReadline.hs
@@ -8,7 +8,7 @@
   getInputLineHist,
   getInputLineHistComp,
   ) where
-import Prelude(); import MiniPrelude
+import qualified Prelude(); import MiniPrelude
 import Control.Monad
 import Data.Char
 import System.IO
@@ -20,7 +20,7 @@
 -- Return Nothing if the input is ^D, otherwise the typed string.
 getInputLine :: String -> IO (Maybe String)
 getInputLine prompt = do
-  (_, r) <- loop (\ _ -> return []) ([],[]) "" ""
+  (_, r) <- loop (\ _ -> return []) emptyHist "" ""
   return r
 
 getInputLineHist :: FilePath -> String -> IO (Maybe String)
@@ -42,7 +42,7 @@
         let h = lines file
         seq (length h) (return h)   -- force file to be read
   putStr prompt
-  (hist', r) <- loop comp (reverse hist, []) "" ""
+  (hist', r) <- loop comp (fromLines hist) "" ""
 --  putStrLn $ "done: " ++ hfn ++ "\n" ++ unlines hist'
   writeFile hfn $ unlines hist'
   return r   -- XXX no type error
@@ -54,8 +54,21 @@
     error "getRaw failed"
   return (chr i)
 
-type Hist = ([String], [String])
+-- The history.
+-- before: the inputs before the current input
+-- after: the inputs after the current input, including the current input (if non-empty)
+-- original: the original input before using the history, if the history was already used
+data Hist = Hist {- before -} [String] {- after -} [String] {- original -} (Maybe String)
 
+emptyHist :: Hist
+emptyHist = Hist [] [] Nothing
+
+fromLines :: [String] -> Hist
+fromLines hist = Hist (reverse hist) [] Nothing
+
+toLines :: Hist -> [String]
+toLines (Hist before after _) = reverse before ++ after
+
 loop :: CompleteFn -> Hist -> String -> String -> IO ([String], Maybe String)
 loop comp hist before after = do
   hFlush stdout
@@ -117,7 +130,7 @@
       putChar '\n'
       hFlush stdout
       let
-        o = reverse (fst hist) ++ snd hist
+        o = toLines hist
         l =
           case ms of
             Nothing -> []
@@ -137,12 +150,16 @@
 
     next =
       case hist of
-        (_, []) -> noop
-        (p, l:n) -> setLine (l:p, n) l
+        Hist _ [] Nothing -> noop
+        Hist p [] (Just orig) -> setLine (Hist p [] Nothing) orig
+        Hist _ [_] Nothing -> noop
+        Hist p [l] (Just orig) -> setLine (Hist (l:p) [] Nothing) orig
+        Hist p (c:l:n) orig -> setLine (Hist (c:p) (l:n) orig) l
     previous =
       case hist of
-        ([], _) -> noop
-        (l:p, n) -> setLine (p, l:n) l
+        Hist [] _ _ -> noop
+        Hist (l:p) [] Nothing -> setLine (Hist p [l] (Just cur)) l
+        Hist (l:p) n orig -> setLine (Hist p (l:n) orig) l
     setLine h s = do
       eraseLine
       putStr s
@@ -206,5 +223,5 @@
               'D' -> backward
               _   -> noop
         _ -> if i >= ' ' && i < '\DEL' then add i else noop
-  
+
   exec cmd
diff --git a/mhs/System/FilePath.hs b/mhs/System/FilePath.hs
--- a/mhs/System/FilePath.hs
+++ b/mhs/System/FilePath.hs
@@ -10,7 +10,7 @@
     takeDirectory,
     (</>),
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Data.List
 
 infixr 7 <.>
diff --git a/paths/Paths_MicroHs.hs b/paths/Paths_MicroHs.hs
--- a/paths/Paths_MicroHs.hs
+++ b/paths/Paths_MicroHs.hs
@@ -3,11 +3,11 @@
   version,
   getDataDir,
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Data.Version
 
 getDataDir :: IO FilePath
 getDataDir = return "."
 
 version :: Version
-version = makeVersion [0,11,4,0]
+version = makeVersion [0,12,6,1]
diff --git a/src/MicroHs/Abstract.hs b/src/MicroHs/Abstract.hs
--- a/src/MicroHs/Abstract.hs
+++ b/src/MicroHs/Abstract.hs
@@ -2,7 +2,7 @@
   compileOpt,
   -- reduce,
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import MicroHs.Ident
 import MicroHs.Exp
 import MicroHs.Expr(Lit(..))
@@ -58,8 +58,8 @@
 isC :: Exp -> Bool
 isC = isPrim "C"
 
-isCC :: Exp -> Bool
-isCC = isPrim "C'"
+isC' :: Exp -> Bool
+isC' = isPrim "C'"
 
 isY :: Exp -> Bool
 isY = isPrim "Y"
@@ -70,24 +70,32 @@
 isZ :: Exp -> Bool
 isZ = isPrim "Z"
 
+{-
+isU :: Exp -> Bool
+isU = isPrim "U"
+-}
+
 isK2 :: Exp -> Bool
 isK2 = isPrim "K2"
 
 isK3 :: Exp -> Bool
 isK3 = isPrim "K3"
 
-cId :: Exp
-cId = Lit (LPrim "I")
+cI :: Exp
+cI = Lit (LPrim "I")
 
-cConst :: Exp
-cConst = Lit (LPrim "K")
+cK :: Exp
+cK = Lit (LPrim "K")
 
-cSpread :: Exp
-cSpread = Lit (LPrim "S")
+cS :: Exp
+cS = Lit (LPrim "S")
 
 cP :: Exp
 cP = Lit (LPrim "P")
 
+cC :: Exp
+cC = Lit (LPrim "C")
+
 --------------------
 
 compileOpt :: Exp -> Exp
@@ -103,19 +111,19 @@
 abstract :: Ident -> Exp -> Exp
 abstract x ae =
   case ae of
-    Var y  -> if x == y then cId else cK (Var y)
-    App f a -> cS (abstract x f) (abstract x a)
+    Var y  -> if x == y then cI else aK (Var y)
+    App f a -> aS (abstract x f) (abstract x a)
     Lam y e -> abstract x $ abstract y e
-    Lit _ -> cK ae
+    Lit _ -> aK ae
 
-cK :: Exp -> Exp
-cK e  = App cConst e
+aK :: Exp -> Exp
+aK e  = App cK e
 
-cS :: Exp -> Exp -> Exp
-cS a1 a2 =
- if isK a1 then cId else
+aS :: Exp -> Exp -> Exp
+aS a1 a2 =
+ if isK a1 then cI else
   let
-    r = cS2 a1 a2
+    r = aS2 a1 a2
   in
     case getApp a1 of
       NotApp -> r
@@ -124,30 +132,30 @@
           case getApp a2 of
             IsApp k2 e2 ->
               if isK k2 then
-                cK (App e1 e2)
+                aK (App e1 e2)
               else
-                cB e1 a2
+                aB e1 a2
             NotApp ->
               if isI a2 then
                 e1
               else
-                cB e1 a2
+                aB e1 a2
         else
           r
-cS2 :: Exp -> Exp -> Exp
-cS2 a1 a2 =
+aS2 :: Exp -> Exp -> Exp
+aS2 a1 a2 =
   case getApp a2 of
-    NotApp -> cS3 a1 a2
+    NotApp -> aS3 a1 a2
     IsApp k2 e2 ->
       if isK k2 then
-        cC a1 e2
+        aC a1 e2
       else
-        cS3 a1 a2
+        aS3 a1 a2
 
-cS3 :: Exp -> Exp -> Exp
-cS3 a1 a2 =
+aS3 :: Exp -> Exp -> Exp
+aS3 a1 a2 =
   let
-    r = app2 cSpread a1 a2
+    r = app2 cS a1 a2
   in
     case getApp a1 of
       NotApp -> r
@@ -156,25 +164,25 @@
           NotApp -> r
           IsApp b1 e1 ->
             if isB b1 then
-              cSS e1 e2 a2
+              aS' e1 e2 a2
             else
               r
 
 {-
---cS e1 e2 | trace ("S (" ++ toString e1 ++ ") (" ++ toString e2 ++ ")") False = undefined
-cS CK              _           = CI                -- S K e           = I
-cS (App CK e1)     (App CK e2) = cK (App e1 e2)    -- S (K e1) (K e2) = K (e1 e2)
-cS (App CK e1)     CI          = e1                -- S (K e1) I      = e1
-cS (App CK e1)     e2          = cB e1 e2          -- S (K e1) e2     = B e1 e2
-cS e1              (App CK e2) = cC e1 e2          -- S e1     (K e2) = C e1 e2
-cS (App (App CB e1) e2) e3     = cSS e1 e2 e3      -- S (B e1 e2) e3  = S' e1 e2 e3
-cS e1 e2                       = App2 CS e1 e2
+--aS e1 e2 | trace ("S (" ++ toString e1 ++ ") (" ++ toString e2 ++ ")") False = undefined
+aS CK              _           = CI                -- S K e           = I
+aS (App CK e1)     (App CK e2) = aK (App e1 e2)    -- S (K e1) (K e2) = K (e1 e2)
+aS (App CK e1)     CI          = e1                -- S (K e1) I      = e1
+aS (App CK e1)     e2          = cB e1 e2          -- S (K e1) e2     = B e1 e2
+aS e1              (App CK e2) = aC e1 e2          -- S e1     (K e2) = C e1 e2
+aS (App (App CB e1) e2) e3     = aS' e1 e2 e3      -- S (B e1 e2) e3  = S' e1 e2 e3
+aS e1 e2                       = App2 CS e1 e2
 -}
 
-cC :: Exp -> Exp -> Exp
-cC a1 e3 =
+aC :: Exp -> Exp -> Exp
+aC a1 e3 =
   let
-    r = cC2 a1 e3
+    r = aC2 a1 e3
   in
     case getApp a1 of
       NotApp -> r
@@ -183,7 +191,7 @@
           NotApp -> r
           IsApp bc e1 ->
             if isB bc then
-              cCC e1 e2 e3
+              aC' e1 e2 e3
             else if isC bc && isI e1 then
               app2 cP e2 e3
 --            else if isC bc && isC e1 then
@@ -191,21 +199,21 @@
             else
               r
 
-cC2 :: Exp -> Exp -> Exp
-cC2 a1 a2 = app2 cFlip a1 a2
+aC2 :: Exp -> Exp -> Exp
+aC2 a1 a2 = app2 cC a1 a2
 
 {-
-cC (App (App CB e1) e2) e3          = cCC e1 e2 e3      -- C (B e1 e2) e3  = C' e1 e2 e3
-cC (Var op)             e2 | Just op' <- lookup op flipOps = App (Var op') e2 -- C op e = flip-op e
-cC (App (App CC CI) e2) e3          = app2 CP e2 e3
-cC (App (App CC CC) e2) e3          = app2 CR e2 e3
-cC e1                   e2          = app2 CC e1 e2
+aC (App (App CB e1) e2) e3          = aC' e1 e2 e3      -- C (B e1 e2) e3  = C' e1 e2 e3
+aC (Var op)             e2 | Just op' <- lookup op flipOps = App (Var op') e2 -- C op e = flip-op e
+aC (App (App C' CI) e2) e3          = app2 CP e2 e3
+aC (App (App C' C') e2) e3          = app2 CR e2 e3
+aC e1                   e2          = app2 C' e1 e2
 -}
 
-cB :: Exp -> Exp -> Exp
-cB a1 a2 =
+aB :: Exp -> Exp -> Exp
+aB a1 a2 =
   let
-    r = cB2 a1 a2
+    r = aB2 a1 a2
   in
     case getApp a1 of
       NotApp -> r
@@ -215,10 +223,10 @@
         else
           r
 
-cB2 :: Exp -> Exp -> Exp
-cB2 a1 a2 =
+aB2 :: Exp -> Exp -> Exp
+aB2 a1 a2 =
   let
-    r = cB3 a1 a2
+    r = aB3 a1 a2
   in
     case getApp a2 of
       IsApp x1 x2 ->
@@ -235,26 +243,26 @@
               r
       NotApp -> r
 
-cB3 :: Exp -> Exp -> Exp
-cB3 a1 a2 =
+aB3 :: Exp -> Exp -> Exp
+aB3 a1 a2 =
   if isI a1 then
     a2
   else
     app2 (Lit (LPrim "B")) a1 a2
 
 {-
-cB (App CB CK) CP             = CO -- Cons
-cB CY          (App (App CB CK) e) = e  -- B Y (B K e) = e
-cB CC          (App CC CI)    = CP -- Pair
-cB CI          e              = e  -- B I e = e
-cB e1          e2             = app2 CB e1 e2
+aB (App CB CK) CP             = CO -- Cons
+aB CY          (App (App CB CK) e) = e  -- B Y (B K e) = e
+aB C'          (App C' CI)    = CP -- Pair
+aB CI          e              = e  -- B I e = e
+aB e1          e2             = app2 CB e1 e2
 -}
 
-cSS :: Exp -> Exp -> Exp -> Exp
-cSS e1 e2 e3 = app3 (Lit (LPrim "S'")) e1 e2 e3
+aS' :: Exp -> Exp -> Exp -> Exp
+aS' e1 e2 e3 = app3 (Lit (LPrim "S'")) e1 e2 e3
 
-cCC :: Exp -> Exp -> Exp -> Exp
-cCC e1 e2 e3 = app3 (Lit (LPrim "C'")) e1 e2 e3
+aC' :: Exp -> Exp -> Exp -> Exp
+aC' e1 e2 e3 = app3 (Lit (LPrim "C'")) e1 e2 e3
 
 improveT :: Exp -> Exp
 improveT ae =
@@ -279,10 +287,15 @@
           Lit (LPrim "B'")
         else if isC ff && isC aa then
           Lit (LPrim "R")
-        else if isCC ff && isB aa then
+        else if isC' ff && isB aa then
           Lit (LPrim "C'B")
         else if isZ ff && isK aa then
           Lit (LPrim "K2")
+{-
+-- Using J is a very minor improvement
+        else if False && isZ ff && isU aa then
+          Lit (LPrim "J")
+-}
         else if isZ ff && isK2 aa then
           Lit (LPrim "K3")
         else if isZ ff && isK3 aa then
@@ -308,7 +321,7 @@
                   def
               NotApp -> def
 -}
-            
+
 
 kApp :: Exp -> Exp -> Exp
 kApp (Lit (LPrim "K")) (App (Lit (LPrim ('K':s))) x)
diff --git a/src/MicroHs/Builtin.hs b/src/MicroHs/Builtin.hs
--- a/src/MicroHs/Builtin.hs
+++ b/src/MicroHs/Builtin.hs
@@ -1,9 +1,10 @@
 module MicroHs.Builtin(
   builtinMdl,
+  builtinMdlQ,
   mkBuiltin,
   mkBuiltinQ,
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import MicroHs.Ident
 
 -- The compiler needs a number of identifiers from libraries.
@@ -11,15 +12,15 @@
 --  'import Mhs.Builtin qualified as B@"
 -- The name 'B@' is not a valid identifier, so these name
 -- cannot be used accidentally in user code.
-builtinMdl :: String
-builtinMdl = "B@"
-builtinMdlQ :: String
-builtinMdlQ = "Mhs.Builtin"
+builtinMdl :: Ident
+builtinMdl = mkIdent "B@"
+builtinMdlQ :: Ident
+builtinMdlQ = mkIdent "Mhs.Builtin"
 
 -- Identifier for a builtin that will be renamed.
 mkBuiltin :: SLoc -> String -> Ident
-mkBuiltin loc name = mkIdentSLoc loc ((builtinMdl ++ ".") ++ name)
+mkBuiltin loc name = qualIdent builtinMdl (mkIdentSLoc loc name)
 
 -- Identifier for a builtin that is alread renamed.
 mkBuiltinQ :: SLoc -> String -> Ident
-mkBuiltinQ loc name = mkIdentSLoc loc ((builtinMdlQ ++ ".") ++ name)
+mkBuiltinQ loc name = qualIdent builtinMdlQ (mkIdentSLoc loc name)
diff --git a/src/MicroHs/Compile.hs b/src/MicroHs/Compile.hs
--- a/src/MicroHs/Compile.hs
+++ b/src/MicroHs/Compile.hs
@@ -13,7 +13,7 @@
   getMhsDir,
   openFilePath,
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Data.Char
 import Data.List
 import Data.Maybe
@@ -36,13 +36,11 @@
 import MicroHs.Ident
 import qualified MicroHs.IdentMap as M
 import MicroHs.List
-import MicroHs.MRnf
 import MicroHs.Package
 import MicroHs.Parse
 import MicroHs.StateIO
 import MicroHs.SymTab
 import MicroHs.TypeCheck
-import MicroHs.Instances() -- for ghc
 import Paths_MicroHs(version, getDataDir)
 
 mhsVersion :: String
@@ -62,7 +60,7 @@
 compileCacheTop :: Flags -> IdentModule -> Cache -> IO ((IdentModule, [(Ident, Exp)]), Symbols, Cache)
 compileCacheTop flags mn ch = do
   res@((_, ds), _, _) <- compile flags mn ch
-  when (verbosityGT flags 4) $
+  dumpIf flags Dcombinator $
     putStrLn $ "combinators:\n" ++ showLDefs ds
   return res
 
@@ -86,9 +84,6 @@
   when (writeCache flags) $ do
     when (verbosityGT flags 0) $
       putStrLn $ "Saving cache " ++ show mhsCacheName
-    -- This causes all kinds of chaos, probably because there
-    -- will be equality tests of unevaluated thunks.
-    -- () <- seq (rnfNoErr cash) (return ())
     saveCache mhsCacheName cash
 
 compile :: Flags -> IdentModule -> Cache -> IO ((IdentModule, [LDef]), Symbols, Cache)
@@ -129,7 +124,7 @@
             ms <- gets getWorking
             putStrLnInd $ "[from " ++ head (map showIdent ms ++ ["-"]) ++ "]"
             putStrInd $ "importing " ++ showIdent mn
-          mres <- liftIO (readModulePath flags ".hs" mn)
+          mres <- liftIO (readModulePath flags "hs" mn)
           case mres of
             Nothing -> do
               (fn, res) <- findPkgModule flags mn
@@ -183,10 +178,10 @@
   when (verbosityGT flags 4) $
     liftIO $ putStrLn $ "parsing: " ++ pathfn
   let pmdl = parseDie pTop pathfn file
-  when (verbosityGT flags 4) $
+  dumpIf flags Dparse $
     liftIO $ putStrLn $ "parsed:\n" ++ show pmdl
   let mdl@(EModule mnn _ defs) = addPreludeImport pmdl
-  
+
   -- liftIO $ putStrLn $ showEModule mdl
   -- liftIO $ putStrLn $ showEDefs defs
   -- TODO: skip test when mn is a file name
@@ -196,26 +191,22 @@
     specs = [ s | Import s <- defs ]
     imported = [ (boot, m) | ImportSpec boot _ m _ _ <- specs ]
   t2 <- liftIO getTimeMilli
-  (impMdls, _, tImps) <- fmap unzip3 $ mapM (uncurry $ compileModuleCached flags) imported
+  (impMdls, _, tImps) <- unzip3 <$> mapM (uncurry $ compileModuleCached flags) imported
 
   t3 <- liftIO getTimeMilli
   glob <- gets getCacheTables
   let
-    (tmdl, glob', syms) = typeCheck glob impt (zip specs impMdls) mdl
+    (tmdl, glob', syms) = typeCheck flags glob impt (zip specs impMdls) mdl
   modify $ setCacheTables glob'
-  when (verbosityGT flags 3) $
+  dumpIf flags Dtypecheck $
     liftIO $ putStrLn $ "type checked:\n" ++ showTModule showEDefs tmdl ++ "-----\n"
-  () <- when False $ do               -- Always forcing is slower.  Maybe add a flag?
-          mrnf tmdl `seq` return ()
   let
     dmdl = desugar flags tmdl
-  () <- return $ rnfErr $ tBindingsOf dmdl
-  t4 <- liftIO getTimeMilli
 
+  t4 <- liftIO getTimeMilli
   let
     cmdl = setBindings dmdl [ (i, compileOpt e) | (i, e) <- tBindingsOf dmdl ]
-  () <- return $ rnfErr $ tBindingsOf cmdl  -- This makes execution slower, but speeds up GC
---  () <- return $ rnfErr syms same for this, but worse total time
+  () <- return $ rnf cmdl  -- This makes execution slower, but speeds up GC
   t5 <- liftIO getTimeMilli
 
   let tParse = t2 - t1
@@ -224,8 +215,8 @@
       tThis = tParse + tTCDesug + tAbstract
       tImp = sum tImps
 
-  when (verbosityGT flags 4) $
-    (liftIO $ putStrLn $ "desugared:\n" ++ showTModule showLDefs dmdl)
+  dumpIf flags Ddesugar $
+    liftIO $ putStrLn $ "desugared:\n" ++ showTModule showLDefs dmdl
   when (verbosityGT flags 0) $
     putStrLnInd $ "importing done " ++ showIdent mn ++ ", " ++ show tThis ++
             "ms (" ++ show tParse ++ " + " ++ show tTCDesug ++ " + " ++ show tAbstract ++ ")"
@@ -246,14 +237,12 @@
         isImportPrelude (Import (ImportSpec _ _ i _ _)) = i == idPrelude
         isImportPrelude _ = False
         idPrelude = mkIdent "Prelude"
-        idBuiltin = mkIdent "Mhs.Builtin"
-        idB = mkIdent builtinMdl
-        iblt = Import $ ImportSpec ImpNormal True idBuiltin (Just idB) Nothing
+        iblt = Import $ ImportSpec ImpNormal True builtinMdlQ (Just builtinMdl) Nothing
         ps' =
           case ps of
             [] -> [Import $ ImportSpec ImpNormal False idPrelude Nothing Nothing,      -- no Prelude imports, so add 'import Prelude'
-                   iblt]                                                               -- and 'import Mhs.Builtin as @B'
-            [Import (ImportSpec ImpNormal False _ Nothing (Just (False, [])))] -> []   -- exactly 'import Prelude()', so import nothing
+                   iblt]                                                               -- and 'import Mhs.Builtin as B@'
+            [Import (ImportSpec ImpNormal True _ Nothing (Just (False, [])))] -> []    -- exactly 'import qualified Prelude()', so import nothing
             _ -> iblt : ps                                                             -- keep the given Prelude imports, add Builtin
 
 -------------------------------------------
@@ -313,26 +302,30 @@
       mh <- openFileM fn ReadMode
       case mh of
         Nothing -> errorMessage (getSLoc mn) $ "File not found: " ++ show fn
-        Just h  -> readRest fn h
+        Just h  -> readRest fn =<< hGetContents h
     _ -> do
       mh <- findModulePath flags suf mn
       case mh of
         Nothing -> do
           mhc <- findModulePath flags (suf ++ "c") mn  -- look for hsc file
           case mhc of
-            Nothing -> return Nothing
+            Nothing -> do
+              mhl <- findModulePath flags ("l" ++ suf) mn  -- look for lhs file
+              case mhl of
+                Nothing -> do
+                  return Nothing
+                Just (fn, h) -> readRest fn . unlit =<< hGetContents h
             Just (_fn, _h) -> undefined  -- hsc2hs no implemented yet
-        Just (fn, h) -> readRest fn h
-  where readRest :: FilePath -> Handle -> IO (Maybe (FilePath, String))
-        readRest fn h = do
+        Just (fn, h) -> readRest fn =<< hGetContents h
+  where readRest :: FilePath -> String -> IO (Maybe (FilePath, String))
+        readRest fn file = do
           hasCPP <- hasLangCPP fn
-          file <-
+          file' <-
             if hasCPP || doCPP flags then do
-              hClose h
-              runCPPTmp flags fn
+              runCPPString flags file
             else
-              hGetContents h
-          return (Just (fn, file))
+              return file
+          return (Just (fn, file'))
 
 -- Check if the file contains {-# LANGUAGE ... CPP ... #-}
 -- XXX This is pretty hacky and not really correct.
@@ -369,13 +362,17 @@
         Nothing -> openFilePath dirs fileName -- If opening failed, try the next directory
         Just hdl -> return (Just (path, hdl))
 
-runCPPTmp :: Flags -> FilePath -> IO String
-runCPPTmp flags infile = do
-  (fn, h) <- openTmpFile "mhscpp.hs"
-  runCPP flags infile fn
-  file <- hGetContents h
-  removeFile fn
-  return file
+runCPPString :: Flags -> String -> IO String
+runCPPString flags ifile = do
+  (fni, hi) <- openTmpFile "mhsin.hs"
+  hClose hi
+  writeFile fni ifile
+  (fno, ho) <- openTmpFile "mhsout.hs"
+  runCPP flags fni fno
+  ofile <- hGetContents ho
+  removeFile fni
+  removeFile fno
+  return ofile
 
 mhsDefines :: [String]
 mhsDefines =
@@ -460,8 +457,20 @@
       loadPkg flags pfn
 
 getMhsDir :: IO FilePath
-getMhsDir = do
-  md <- lookupEnv "MHSDIR"
-  case md of
-    Just d -> return d
-    Nothing -> getDataDir
+getMhsDir = maybe getDataDir return =<< lookupEnv "MHSDIR"
+
+-- Deal with literate Haskell
+unlit :: String -> String
+unlit = unlines . un True . lines
+  where
+    un _ [] = []
+    un _ (l:ls) | all isSpace l = un True ls
+    un _ ("\\begin{code}":ls) = "" : code ls
+    un spc (l@('#':'!':_) : ls) = l : un spc ls
+    un spc (('>':l):ls) | spc = (' ':l) : un True ls
+                        | otherwise = error "unlit: missing blank before >"
+    un _ (_:ls) = un False ls
+    -- We allow non-blank to follow directly after >
+    code ("\\end{code}":ls) = "" : un False ls
+    code (l : ls) = l : code ls
+    code [] = error "unlit: missing \\end{code}"
diff --git a/src/MicroHs/CompileCache.hs b/src/MicroHs/CompileCache.hs
--- a/src/MicroHs/CompileCache.hs
+++ b/src/MicroHs/CompileCache.hs
@@ -7,12 +7,11 @@
   getCacheTables, setCacheTables,
   saveCache, loadCached,
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import MicroHs.Desugar(LDef)
 import MicroHs.Expr(IdentModule)
 import MicroHs.Ident(showIdent)
 import qualified MicroHs.IdentMap as M
-import MicroHs.MRnf
 import MicroHs.Package
 import MicroHs.TypeCheck(TModule, tModuleName, GlobTables, emptyGlobTables, mergeGlobTables)
 import System.IO
@@ -30,9 +29,9 @@
     (TModule [LDef])                    -- the cached module
 --  deriving (Show)
 
-instance MRnf CacheEntry where
-  mrnf (CompMdl a b c) = mrnf a `seq` mrnf b `seq` mrnf c
-  mrnf (PkgMdl a) = mrnf a
+instance NFData CacheEntry where
+  rnf (CompMdl a b c) = rnf a `seq` rnf b `seq` rnf c
+  rnf (PkgMdl a) = rnf a
 
 tModuleOf :: CacheEntry -> TModule [LDef]
 tModuleOf (CompMdl t _ _) = t
@@ -51,11 +50,11 @@
   }
 --  deriving (Show)
 
-instance MRnf Cache where
-  mrnf (Cache a b c d e) = mrnf a `seq` mrnf b `seq` mrnf c `seq` mrnf d `seq` mrnf e
+instance NFData Cache where
+  rnf (Cache a b c d e) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e
 
 forceCache :: Cache -> Cache
-forceCache c = mrnf c `seq` c
+forceCache c = force c
 
 getCacheTables :: Cache -> GlobTables
 getCacheTables = tables
@@ -82,7 +81,7 @@
 addWorking :: IdentModule -> Cache -> Cache
 addWorking mn c =
   let ws = working c
-  in  if elem mn ws then
+  in  if mn `elem` ws then
         error $ "recursive module: " ++ showIdent mn ++ ", import chain: " ++ unwords (map showIdent ws)
       else
         c{ working = mn : ws }
@@ -99,7 +98,7 @@
 cachedModuleNames = M.keys . cache
 
 cachedNonPkgModuleNames :: Cache -> [IdentModule]
-cachedNonPkgModuleNames c = [ i | (i, CompMdl _ _ _) <- M.toList (cache c) ]
+cachedNonPkgModuleNames c = [ i | (i, CompMdl{}) <- M.toList (cache c) ]
 
 lookupCache :: IdentModule -> Cache -> Maybe (TModule [LDef])
 lookupCache mn c = tModuleOf <$> M.lookup mn (cache c)
diff --git a/src/MicroHs/Deriving.hs b/src/MicroHs/Deriving.hs
--- a/src/MicroHs/Deriving.hs
+++ b/src/MicroHs/Deriving.hs
@@ -1,11 +1,14 @@
-module MicroHs.Deriving(expandField, deriveHdr, deriveNoHdr, mkGetName) where
-import Prelude(); import MHSPrelude
+module MicroHs.Deriving(deriveStrat, expandField, mkGetName, etaReduce) where
+import qualified Prelude(); import MHSPrelude
 import Data.Char
 import Data.Function
 import Data.List
 import MicroHs.Builtin
 import MicroHs.Expr
 import MicroHs.Ident
+import qualified MicroHs.IdentMap as M
+import MicroHs.List
+import MicroHs.Names
 import MicroHs.TCMonad
 import Debug.Trace
 
@@ -18,39 +21,52 @@
 --   constructor names in the derived type unqualified
 --   all other names should be qualified with B@
 
-type DeriverT = LHS -> [Constr] -> EConstraint -> T [EDef]
+deriveStrat :: Maybe EConstraint -> Bool -> LHS -> [Constr] -> DerStrategy -> (Int, EConstraint) -> T [EDef]
+deriveStrat mctx newt lhs cs strat (narg, cls) =  -- narg is the number of arguments that need eta reducing
+--  trace ("deriveStrat " ++ show (mctx, newt, lhs, cs, strat, narg, cls)) $
+  case strat of
+    DerNone | newt && useNewt cls -> newtypeDer  mctx narg lhs (cs!!0) cls Nothing
+            | otherwise           -> deriveNoHdr mctx narg lhs cs cls
+    DerStock                      -> deriveNoHdr mctx narg lhs cs cls
+    DerNewtype | newt             -> newtypeDer  mctx narg lhs (cs!!0) cls Nothing
+    DerAnyClass                   -> anyclassDer mctx narg lhs cls
+    DerVia via | newt             -> newtypeDer  mctx narg lhs (cs!!0) cls (Just via)
+    _                             -> cannotDerive lhs cls
+  where useNewt d = unIdent (getAppCon d) `notElem`
+          ["Data.Data.Data", "Data.Typeable.Typeable", "GHC.Generics.Generic",
+           "Language.Haskell.TH.Syntax.Lift", "Text.Read.Internal.Read", "Text.Show.Show"]
+
+type DeriverT = Int -> LHS -> [Constr] -> EConstraint -> T [EDef]   -- Bool indicates a newtype
 type Deriver = Maybe EConstraint -> DeriverT
 
 derivers :: [(String, Deriver)]
 derivers =
-  [("Data.Bounded.Bounded",   derBounded)
-  ,("Data.Enum.Enum",         derEnum)
-  ,("Data.Data.Data",         derData)
-  ,("Data.Eq.Eq",             derEq)
-  ,("Data.Ix.Ix",             derNotYet)
-  ,("Data.Ord.Ord",           derOrd)
-  ,("Data.Typeable.Typeable", derTypeable)
-  ,("GHC.Generics.Generic",   derNotYet)
+  [("Data.Bounded.Bounded",            derBounded)
+  ,("Data.Enum.Enum",                  derEnum)
+  ,("Data.Data.Data",                  derData)
+  ,("Data.Eq.Eq",                      derEq)
+  ,("Data.Functor.Functor",            derNotYet) -- derFunctor)
+  ,("Data.Ix.Ix",                      derNotYet)
+  ,("Data.Ord.Ord",                    derOrd)
+  ,("Data.Typeable.Typeable",          derTypeable)
+  ,("GHC.Generics.Generic",            derNotYet)
   ,("Language.Haskell.TH.Syntax.Lift", derLift)
-  ,("Text.Read.Internal.Read",derRead)
-  ,("Text.Show.Show",         derShow)
+  ,("Text.Read.Internal.Read",         derRead)
+  ,("Text.Show.Show",                  derShow)
   ]
 
-deriveHdr :: DeriverT
-deriveHdr = deriveNoHdr' Nothing
-
-deriveNoHdr :: EConstraint -> DeriverT
-deriveNoHdr ctx = deriveNoHdr' (Just ctx)
+deriveNoHdr :: Maybe EConstraint -> DeriverT
+deriveNoHdr mctx narg lhs cs d = do
+--  traceM ("deriveNoHdr " ++ show d)
+  case getDeriver d of
+    Just f -> f mctx narg lhs cs d
+    _      -> cannotDerive lhs d
 
-deriveNoHdr' :: Maybe EConstraint -> DeriverT
-deriveNoHdr' mctx lhs cs d = do
-  let c = getAppCon d
-  case lookup (unIdent c) derivers of
-    Nothing -> tcError (getSLoc c) $ "Cannot derive " ++ show c
-    Just f  -> f mctx lhs cs d
+getDeriver :: EConstraint -> Maybe Deriver
+getDeriver d = lookup (unIdent $ getAppCon d) derivers
 
 derNotYet :: Deriver
-derNotYet _ _ _ d = do
+derNotYet _ _ _ _ d = do
   notYet d
   return []
 
@@ -60,7 +76,7 @@
 
 -- We will never have Template Haskell, but we pretend we can derive Lift for it.
 derLift :: Deriver
-derLift _ _ _ _ = return []
+derLift _ _ _ _ _ = return []
 
 --------------------------------------------
 
@@ -95,12 +111,12 @@
                                    (ELit loc (LStr ufld))
                                    (eApps (EVar qtycon) (map (EVar . idKindIdent) iks))
                                    fldty
-      conEqnGet (Constr _ _ c (Left ts))   = eEqn [eApps (EVar c) (map (const eDummy) ts)] $ undef
+      conEqnGet (Constr _ _ c (Left ts))   = eEqn [eApps (EVar c) (map (const eDummy) ts)] undef
       conEqnGet (Constr _ _ c (Right fts)) = eEqn [conApp] $ if fld `elem` fs then rhs else undef
         where fs = map fst fts
               conApp = eApps (EVar c) (map EVar fs)
               rhs = eFld
-      conEqnSet (Constr _ _ c (Left ts))   = eEqn [eDummy, eApps (EVar c) (map (const eDummy) ts)] $ undef
+      conEqnSet (Constr _ _ c (Left ts))   = eEqn [eDummy, eApps (EVar c) (map (const eDummy) ts)] undef
       conEqnSet (Constr _ _ c (Right fts)) = eEqn [eDummy, conApp] $ if fld `elem` fs then rhs else undef
         where fs = map fst fts
               conApp = eApps (EVar c) (map EVar fs)
@@ -108,7 +124,7 @@
       getName = mkGetName tycon fld
 
       -- XXX A hack, we can't handle forall yet.
-      validType (EForall _ _ _) = False
+      validType EForall{} = False
       validType _ = True
 
   pure $ [ Sign [getName] $ eForall iks $ lhsToType (qtycon, iks) `tArrow` fldty
@@ -118,25 +134,13 @@
          , Instance hdrSet [Fcn isetField $ map conEqnSet cs]
          ]
 
-nameHasField :: String
-nameHasField = "Data.Records.HasField"
-
-nameSetField :: String
-nameSetField = "Data.Records.SetField"
-
-namegetField :: String
-namegetField = "getField"
-
-namesetField :: String
-namesetField = "setField"
-
 mkGetName :: Ident -> Ident -> Ident
 mkGetName tycon fld = qualIdent (mkIdent "get") $ qualIdent tycon fld
 
 --------------------------------------------
 
 derTypeable :: Deriver
-derTypeable _ (i, _) _ etyp = do
+derTypeable _ 0 (i, _) _ etyp = do
   mn <- gets moduleName
   let
     loc = getSLoc i
@@ -149,10 +153,11 @@
     eqns = eEqns [eDummy] $ eAppI2 imkTyConApp (eAppI2 imkTyCon mdl nam) (EListish (LList []))
     inst = Instance hdr [Fcn itypeRep eqns]
   return [inst]
+derTypeable _ _ lhs _ e = cannotDerive lhs e
 
 --------------------------------------------
 
-getFieldTys :: (Either [SType] [ConstrField]) -> [EType]
+getFieldTys :: Either [SType] [ConstrField] -> [EType]
 getFieldTys (Left ts) = map snd ts
 getFieldTys (Right ts) = map (snd . snd) ts
 
@@ -166,14 +171,18 @@
 -- The default strategy basically extracts all subtypes with variables.
 mkHdr :: Maybe EConstraint -> LHS -> [Constr] -> EConstraint -> T EConstraint
 mkHdr (Just ctx) _ _ _ = return ctx
-mkHdr _ (t, iks) cs cls = do
-  mn <- gets moduleName
+mkHdr _ lhs@(_, iks) cs cls = do
+  ty <- mkLhsTy lhs
   let ctys :: [EType]  -- All top level types used by the constructors.
       ctys = nubBy eqEType [ tt | Constr evs _ _ flds <- cs, ft <- getFieldTys flds, tt <- decomp ft,
                             not $ null $ freeTyVars [tt] \\ map idKindIdent evs, not (eqEType ty tt) ]
-      ty = tApps (qualIdent mn t) $ map tVarK iks
   pure $ eForall iks $ addConstraints (map (tApp cls) ctys) $ tApp cls ty
 
+mkLhsTy :: LHS -> T EType
+mkLhsTy (t, iks) = do
+  mn <- gets moduleName
+  return $ tApps (qualIdent mn t) $ map tVarK iks
+
 mkPat :: Constr -> String -> (EPat, [Expr])
 mkPat (Constr _ _ c flds) s =
   let n = either length length flds
@@ -181,13 +190,13 @@
       vs = map (EVar . mkIdentSLoc loc . (s ++) . show) [1..n]
   in  (tApps c vs, vs)
 
-cannotDerive :: String -> Ident -> EConstraint -> T [EDef]
-cannotDerive cls ty e = tcError (getSLoc e) $ "Cannot derive " ++ cls ++ " " ++ show ty
+cannotDerive :: LHS -> EConstraint -> T [EDef]
+cannotDerive (c, _) e = tcError (getSLoc e) $ "Cannot derive " ++ showEType (EApp e (EVar c))
 
 --------------------------------------------
 
 derEq :: Deriver
-derEq mctx lhs cs@(_:_) eeq = do
+derEq mctx 0 lhs cs@(_:_) eeq = do
   hdr <- mkHdr mctx lhs cs eeq
   let loc = getSLoc eeq
       mkEqn c =
@@ -203,20 +212,20 @@
       inst = Instance hdr [Fcn iEq eqns]
 --  traceM $ showEDefs [inst]
   return [inst]
-derEq _ (c, _) _ e = cannotDerive "Eq" c e
+derEq _ _ lhs _ e = cannotDerive lhs e
 
 --------------------------------------------
 
 derOrd :: Deriver
-derOrd mctx lhs cs@(_:_) eord = do
+derOrd mctx 0 lhs cs@(_:_) eord = do
   hdr <- mkHdr mctx lhs cs eord
   let loc = getSLoc eord
       mkEqn c =
         let (xp, xs) = mkPat c "x"
             (yp, ys) = mkPat c "y"
         in  [eEqn [xp, yp] $ if null xs then eEQ else foldr1 eComb $ zipWith eCompare xs ys
-            ,eEqn [xp, eDummy] $ eLT
-            ,eEqn [eDummy, yp] $ eGT]
+            ,eEqn [xp, eDummy] eLT
+            ,eEqn [eDummy, yp] eGT]
       eqns = concatMap mkEqn cs
       iCompare = mkIdentSLoc loc "compare"
       eCompare = EApp . EApp (EVar $ mkBuiltin loc "compare")
@@ -227,12 +236,12 @@
       inst = Instance hdr [Fcn iCompare eqns]
 --  traceM $ showEDefs [inst]
   return [inst]
-derOrd _ (c, _) _ e = cannotDerive "Ord" c e
+derOrd _ _ lhs _ e = cannotDerive lhs e
 
 --------------------------------------------
 
 derBounded :: Deriver
-derBounded mctx lhs cs@(c0:_) ebnd = do
+derBounded mctx 0 lhs cs@(c0:_) ebnd = do
   hdr <- mkHdr mctx lhs cs ebnd
   let loc = getSLoc ebnd
       mkEqn bnd (Constr _ _ c flds) =
@@ -246,12 +255,12 @@
       inst = Instance hdr [Fcn iMinBound [minEqn], Fcn iMaxBound [maxEqn]]
   -- traceM $ showEDefs [inst]
   return [inst]
-derBounded _ (c, _) _ e = cannotDerive "Bounded" c e
+derBounded _ _ lhs _ e = cannotDerive lhs e
 
 --------------------------------------------
 
 derEnum :: Deriver
-derEnum mctx lhs cs@(_:_) enm | all isNullary cs = do
+derEnum mctx 0 lhs cs@(c0:_) enm | all isNullary cs = do
   hdr <- mkHdr mctx lhs cs enm
   let loc = getSLoc enm
 
@@ -259,15 +268,30 @@
         eEqn [EVar c] $ ELit loc (LInt i)
       mkTo (Constr _ _ c _) i =
         eEqn [ELit loc (LInt i)] $ EVar c
+      eFirstCon = case c0 of Constr _ _ c _ -> tCon c
+      eLastCon = case last cs of Constr _ _ c _ -> tCon c
 
       iFromEnum = mkIdentSLoc loc "fromEnum"
       iToEnum = mkIdentSLoc loc "toEnum"
+      iEnumFrom = mkIdentSLoc loc "enumFrom"
+      iEnumFromThen = mkIdentSLoc loc "enumFromThen"
+      iEnumFromTo = mkBuiltin loc "enumFromTo"
+      iEnumFromThenTo = mkBuiltin loc "enumFromThenTo"
       fromEqns = zipWith mkFrom cs [0..]
-      toEqns   = zipWith mkTo   cs [0..]
-      inst = Instance hdr [Fcn iFromEnum fromEqns, Fcn iToEnum toEqns]
-  --traceM $ showEDefs [inst]
+      toEqns   = zipWith mkTo   cs [0..] ++ [eEqn [eDummy] $ EApp (EVar $ mkBuiltin loc "error") (ELit loc (LStr "toEnum: out of range"))]
+      enumFromEqn =
+        -- enumFrom x = enumFromTo x (last cs)
+        let x = EVar (mkIdentSLoc loc "x")
+        in eEqn [x] (eAppI2 iEnumFromTo x eLastCon)
+      enumFromThenEqn =
+        -- enumFromThen x1 x2 = if fromEnum x2 >= fromEnum x1 then enumFromThenTo x1 x2 (last cs) else enumFromThenTo x1 x2 (head cs)
+        let
+          x1 = EVar (mkIdentSLoc loc "x1")
+          x2 = EVar (mkIdentSLoc loc "x2")
+        in eEqn [x1, x2] (EIf (eAppI2 (mkBuiltin loc ">=") (EApp (EVar iFromEnum) x2) (EApp (EVar iFromEnum) x1)) (eAppI3 iEnumFromThenTo x1 x2 eLastCon) (eAppI3 iEnumFromThenTo x1 x2 eFirstCon))
+      inst = Instance hdr [Fcn iFromEnum fromEqns, Fcn iToEnum toEqns, Fcn iEnumFrom [enumFromEqn], Fcn iEnumFromThen [enumFromThenEqn]]
   return [inst]
-derEnum _ (c, _) _ e = cannotDerive "Enum" c e
+derEnum _ _ lhs _ e = cannotDerive lhs e
 
 isNullary :: Constr -> Bool
 isNullary (Constr _ _ _ flds) = either null null flds
@@ -275,7 +299,7 @@
 --------------------------------------------
 
 derShow :: Deriver
-derShow mctx lhs cs@(_:_) eshow = do
+derShow mctx 0 lhs cs@(_:_) eshow = do
   hdr <- mkHdr mctx lhs cs eshow
   let loc = getSLoc eshow
       mkEqn c@(Constr _ _ nm flds) =
@@ -301,7 +325,7 @@
 
       showRHSR nm fxs =
         eShowString (unIdentPar nm ++ "{") `ejoin`
-        (eShowL "," $ map fld fxs) `ejoin`
+        eShowL "," (map fld fxs) `ejoin`
         eShowString "}"
           where fld (f, x) = eShowString (unIdentPar f ++ "=") `ejoin` eShowsPrec 0 x
 
@@ -309,7 +333,7 @@
       inst = Instance hdr [Fcn iShowsPrec eqns]
 --  traceM $ showEDefs [inst]
   return [inst]
-derShow _ (c, _) _ e = cannotDerive "Show" c e
+derShow _ _ lhs _ e = cannotDerive lhs e
 
 unIdentPar :: Ident -> String
 unIdentPar i =
@@ -320,7 +344,7 @@
 
 -- Deriving for the fake Data class.
 derData :: Deriver
-derData mctx lhs cs edata = do
+derData mctx _ lhs cs edata = do
   notYet edata
   hdr <- mkHdr mctx lhs cs edata
   let
@@ -330,7 +354,7 @@
 --------------------------------------------
 
 derRead :: Deriver
-derRead mctx lhs cs eread = do
+derRead mctx 0 lhs cs eread = do
   notYet eread
   hdr <- mkHdr mctx lhs cs eread
   let
@@ -339,6 +363,104 @@
     err = eEqn [] $ EApp (EVar $ mkBuiltin loc "error") (ELit loc (LStr "readPrec not defined"))
     inst = Instance hdr [Fcn iReadPrec [err]]
   return [inst]
+derRead _ _ lhs _ e = cannotDerive lhs e
 
 --------------------------------------------
 
+newtypeDer :: Maybe EConstraint -> Int -> LHS -> Constr -> EConstraint -> Maybe EConstraint -> T [EDef]
+newtypeDer mctx narg (tycon, iks) c acls mvia = do
+  let loc = getSLoc cls
+      (clsIks, cls) = unForall acls
+      oldty' =                           -- the underlying type, full
+        case c of
+          Constr [] [] _ (Left [(False, t)]) -> t
+          Constr [] [] _ (Right [(_, (_, t))]) -> t
+          _ -> error "newtypeDer"
+--  traceM ("newtypeDer " ++ show (mctx, narg, tycon, iks, c, acls, mvia, oldty'))
+  viaty <-
+    case mvia of
+      Just via -> return via
+      Nothing  ->
+        case etaReduce (takeEnd narg iks) oldty' of  -- the underlying type, eta reduced
+          ([], rt) -> return rt
+          _ -> tcError loc "Bad deriving"
+  hdr <-
+    case mctx of
+      Nothing -> do
+        let iks' = dropEnd narg iks
+        newty <- mkLhsTy (tycon, iks')         -- the newtype, eta reduced
+        -- XXX repeats what we might have done above
+        oldty <- case etaReduce (takeEnd narg iks) oldty' of  -- the underlying type, eta reduced
+                   ([], rt) -> return rt
+                   _ -> tcError loc "Bad deriving"
+        let ctxOld = tApp cls viaty
+            coOldNew = mkCoercible loc oldty newty
+            coOldVia =
+              case mvia of  -- the via type is also eta reduced
+                Just via -> [mkCoercible loc via newty]
+                Nothing  -> []
+            ctx = filter (not . null . freeTyVars . (:[])) (ctxOld : coOldNew : coOldVia)
+        pure (eForall (clsIks ++ iks') $ addConstraints ctx $ tApp cls newty)
+      Just hdr -> pure hdr
+--  traceM ("newtypeDer: " ++ show (hdr, newty, viaty))
+  ----
+  let qiCls = getAppCon cls
+      clsQual = qualOf qiCls
+  ct <- gets classTable
+  (ClassInfo _ _ _ mits _) <-
+    case M.lookup qiCls ct of
+      Nothing -> tcError loc $ "not a class " ++ showIdent qiCls
+      Just x -> return x
+
+  -- hdr looks like forall vs . ctx => C t1 ... tn
+  let (_, newtys) = getApp $ dropContext $ dropForall hdr
+      mkMethod (mi, amty) = do
+        let (tvs, mty) =
+              case amty of
+                EForall _ xs (EApp (EApp _implies _Ca) t) -> (map idKindIdent xs, t)
+                _ -> impossibleShow amty
+            qvar t = EQVar t kType
+            nty =
+              if length tvs /= length newtys then error "mkMethod: arity" else
+              case subst (zip tvs newtys) mty of
+                EForall _ vks t -> EForall True (map (\ (IdKind i _) -> IdKind i (EVar dummyIdent)) vks) $ qvar t
+                t -> qvar t
+
+            vty = qvar $ dropContext $ dropForall $ subst (zip tvs (init newtys ++ [viaty])) mty
+            msign = Sign [mi] nty
+            qmi = EQVar (EVar $ qualIdent clsQual mi) amty   -- Use a qualified name for the method
+            body = Fcn mi [eEqn [] $ eAppI2 (mkBuiltin loc "coerce") (ETypeArg vty) qmi]
+        return [msign, body]
+  body <- concat <$> mapM mkMethod mits
+
+--  traceM $ "newtypeDer: " ++ show (Instance hdr body)
+  return [Instance hdr body]
+
+dropForall :: EType -> EType
+dropForall (EForall _ _ t) = dropForall t
+dropForall t = t
+
+dropContext :: EType -> EType
+dropContext t =
+  case getImplies t of
+    Just (_, t') -> dropContext t'
+    _ -> t
+
+{-
+freshForall :: EType -> EType
+freshForall (EForall _ iks t) = EForall True (map (\ (IdKind i _) -> IdKind i (EVar dummyIdent)) iks) $ freshForall t
+freshForall t = t
+-}
+
+-- Eta reduce as many of the variables as possible.
+-- E.g. etaReduce [a,b] (T a b) = ([], T)
+--      etaReduce [a,b] (T Int b) = ([a], T Int)
+etaReduce :: [IdKind] -> EType -> ([IdKind], EType)
+etaReduce ais = eta (reverse ais)
+  where eta (IdKind i _ : is) (EApp t (EVar i')) | i == i' && i `notElem` freeTyVars [t] = eta is t
+        eta is t = (reverse is, t)
+
+anyclassDer :: Maybe EConstraint -> Int -> LHS -> EConstraint -> T [EDef]
+anyclassDer mctx _ lhs cls = do
+  hdr <- mkHdr mctx lhs [] cls
+  return [Instance hdr []]
diff --git a/src/MicroHs/Desugar.hs b/src/MicroHs/Desugar.hs
--- a/src/MicroHs/Desugar.hs
+++ b/src/MicroHs/Desugar.hs
@@ -6,7 +6,7 @@
   LDef, showLDefs,
   encodeInteger,
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Data.Char
 import Data.Function
 import Data.Integer(_integerToIntList)
@@ -279,7 +279,7 @@
     EVar _ -> apat
     ECon _ -> apat
     EApp f a -> EApp (dsPat f) (dsPat a)
-    EListish (LList ps) -> dsPat $ foldr (\ x xs -> EApp (EApp consCon x) xs) nilCon ps
+    EListish (LList ps) -> dsPat $ foldr (EApp . EApp consCon) nilCon ps
     ETuple ps -> dsPat $ foldl EApp (tupleCon (getSLoc apat) (length ps)) ps
     EAt i p -> EAt i (dsPat p)
     ELit loc (LStr cs) | length cs < 2 -> dsPat (EListish (LList (map (ELit loc . LChar) cs)))
@@ -412,7 +412,7 @@
 dsMatrix dflt []         aarms =
   -- We can have several arms if there are guards.
   -- Combine them in order.
-  return $ foldr (\ (_, rhs) -> rhs) dflt aarms
+  return $ foldr snd dflt aarms
 dsMatrix dflt iis@(i:is) aarms@(aarm : aarms') =
   case leftMost aarm of
     EVar _ -> do
@@ -561,7 +561,7 @@
 -- thus avoiding the extra argument passing.
 -- This gives a small speedup with overloading.
 lazier :: LDef -> LDef
-lazier def@(fcn, l@(Lam _ (Lam _ _))) =
+lazier def@(fcn, l@(Lam _ _)) =
   let fcn' = addIdentSuffix fcn "@"
       vfcn' = Var fcn'
       args :: Exp -> (Exp, [Ident])
@@ -596,7 +596,7 @@
       repl vs (App f a) = app vs $ App (repl [] f) (repl [] a)
       repl [] (Var v) = Var v
       repl vs (Var v)
-        | v == fcn && take arity vs == drops = app (drop arity vs) $ vfcn'
+        | v == fcn && take arity vs == drops = app (drop arity vs) vfcn'
       repl vs e = app vs e
   in  if arity > 0
       then (fcn, lams drops $ letRecE fcn' (lams keeps (repl [] body)) vfcn')
diff --git a/src/MicroHs/EncodeData.hs b/src/MicroHs/EncodeData.hs
--- a/src/MicroHs/EncodeData.hs
+++ b/src/MicroHs/EncodeData.hs
@@ -6,7 +6,7 @@
   encIf,
   encList,
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Data.List
 import MicroHs.Exp
 import MicroHs.Expr(Con(..), Lit(..), impossible)
@@ -76,7 +76,7 @@
     strict (False:ys) (_:is) e = strict ys is e
     strict (True:ys)  (x:is) e = app2 (Lit (LPrim "seq")) (Var x) (strict ys is e)
     strict _ _ e = e
-  in lams xs $ strict ss xs $ lams fs $ apps (Var f) (map Var xs)  
+  in lams xs $ strict ss xs $ lams fs $ apps (Var f) (map Var xs)
 
 encIfScott :: Exp -> Exp -> Exp -> Exp
 encIfScott c t e = app2 c e t
@@ -118,7 +118,7 @@
 tuple es = Lam f $ apps (Var f) es
   where f = -- newIdent "$t" es --
             mkIdent "$t"
-  
+
 encCaseNo :: Exp -> [(SPat, Exp)] -> Exp -> Exp
 encCaseNo var pes dflt =
   App var (Lam n $ Lam t $ caseTree (Var n) (Var t) 0 (numConstr pes) pes' dflt)
@@ -168,4 +168,3 @@
 numConstr :: [(SPat, Exp)] -> Int
 numConstr ((SPat (ConData cs _ _) _, _):_) = length cs
 numConstr _ = undefined
-
diff --git a/src/MicroHs/Exp.hs b/src/MicroHs/Exp.hs
--- a/src/MicroHs/Exp.hs
+++ b/src/MicroHs/Exp.hs
@@ -5,17 +5,16 @@
   Exp(..),
   PrimOp,
   substExp,
-  app2, app3, cFlip,
+  app2, app3,
   allVarsExp, freeVars,
   lams, apps,
   ) where
-import Prelude(); import MHSPrelude hiding((<>))
+import qualified Prelude(); import MHSPrelude hiding((<>))
 import Data.Char
 import Data.List
 import MicroHs.Ident
 import MicroHs.Expr(Lit(..), showLit)
 import MicroHs.List
-import MicroHs.MRnf
 import Text.PrettyPrint.HughesPJLite
 import Debug.Trace
 
@@ -28,11 +27,11 @@
   | Lit Lit
   deriving (Eq)
 
-instance MRnf Exp where
-  mrnf (Var a) = mrnf a
-  mrnf (App a b) = mrnf a `seq` mrnf b
-  mrnf (Lam a b) = mrnf a `seq` mrnf b
-  mrnf (Lit a) = mrnf a
+instance NFData Exp where
+  rnf (Var a) = rnf a
+  rnf (App a b) = rnf a `seq` rnf b
+  rnf (Lam a b) = rnf a `seq` rnf b
+  rnf (Lit a) = rnf a
 
 app2 :: Exp -> Exp -> Exp -> Exp
 app2 f a1 a2 = App (App f a1) a2
@@ -40,12 +39,6 @@
 app3 :: Exp -> Exp -> Exp -> Exp -> Exp
 app3 f a1 a2 a3 = App (app2 f a1 a2) a3
 
-cFlip :: Exp
-cFlip = Lit (LPrim "C")
-
---cR :: Exp
---cR = Lit (LPrim "R")
-
 instance Show Exp where
   show = render . ppExp
 
@@ -65,13 +58,13 @@
     App f a -> App (substExp si se f) (substExp si se a)
     Lam i e -> if si == i then
                  ae
-               else if elem i (freeVars se) then
+               else if i `elem` freeVars se then
                  let
                    fe = allVarsExp e
                    ase = allVarsExp se
                    j = head [ v | n <- enumFrom (0::Int),
                               let { v = mkIdent ("a" ++ show n) },
-                              not (elem v ase), not (elem v fe), v /= si ]
+                              v `notElem` ase, v `notElem` fe, v /= si ]
                  in
                    --trace ("substExp " ++ show [si, i, j]) $
                    Lam j (substExp si se (substExp i (Var j) e))
diff --git a/src/MicroHs/ExpPrint.hs b/src/MicroHs/ExpPrint.hs
--- a/src/MicroHs/ExpPrint.hs
+++ b/src/MicroHs/ExpPrint.hs
@@ -1,5 +1,5 @@
 module MicroHs.ExpPrint(toStringCMdl, toStringP, encodeString, combVersion) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Data.Char(ord, chr)
 import qualified MicroHs.IdentMap as M
 import Data.Maybe
@@ -7,14 +7,18 @@
 import MicroHs.EncodeData(encList)
 import MicroHs.Exp
 import MicroHs.Expr(Lit(..), showLit, errorMessage, HasLoc(..))
-import MicroHs.Ident(Ident, showIdent, mkIdent)
+import MicroHs.Ident(Ident, showIdent, mkIdent, showSLoc)
+import MicroHs.List(groupSort)
 import MicroHs.State
+import MicroHs.TypeCheck(isInstId)
 
 -- Version number of combinator file.
 -- Must match version in eval.c.
 combVersion :: String
-combVersion = "v7.0\n"
+combVersion = "v7.2\n"
 
+-- Rename (to a numbers) top level definitions and remove unused ones.
+-- Also check for duplicated instances.
 toStringCMdl :: (Ident, [LDef]) -> (Int, String)
 toStringCMdl (mainName, ds) =
   let
@@ -49,8 +53,18 @@
     def :: (String -> String) -> (Int, Exp) -> (String -> String)
     def r (i, e) =
       ("A " ++) . toStringP (substv e) . ((":" ++ show i ++  " @\n") ++) . r . ("@" ++)
-  in (ndefs, combVersion ++ show ndefs ++ "\n" ++ res " }")
+  in
+    case dupInstances ds of
+      (n1 : n2 : _) : _ -> errorMessage (getSLoc n1) $ "Duplicate instance " ++ unmangleInst (showIdent n1) ++ " at " ++ showSLoc (getSLoc n2)
+      _ -> (ndefs, combVersion ++ show ndefs ++ "\n" ++ res " }")
 
+dupInstances :: [LDef] -> [[Ident]]
+dupInstances = filter ((> 1) . length) . groupSort . filter isInstId . map fst
+
+-- XXX not nice
+unmangleInst :: String -> String
+unmangleInst = map (\ c -> if c == '@' then ' ' else c) . drop 5
+
 -- Avoid quadratic concatenation by using difference lists,
 -- turning concatenation into function composition.
 toStringP :: Exp -> (String -> String)
@@ -60,28 +74,45 @@
     Lit (LStr s) ->
       -- Encode very short string directly as combinators.
       if length s > 1 then
-        toStringP (App (Lit (LPrim "fromUTF8")) (Lit (LUStr (utf8encode s))))
+        toStringP (App (Lit (LPrim "fromUTF8")) (Lit (LBStr (utf8encode s))))
       else
         toStringP (encodeString s)
-    Lit (LUStr s) ->
-      (quoteString s ++) . (' ' :)
+    Lit (LBStr s) -> (quoteString s ++) . (' ' :)
     Lit (LInteger _) -> undefined
     Lit (LRat _) -> undefined
     Lit (LTick s) -> ('!':) . (quoteString s ++) . (' ' :)
-    Lit l   -> (showLit l ++) . (' ' :)
+    Lit l -> (showLit l ++) . (' ' :)
     Lam _x _e -> undefined -- (("(\\" ++ showIdent x ++ " ") ++) . toStringP e . (")" ++)
     --App f a -> ("(" ++) . toStringP f . (" " ++) . toStringP a . (")" ++)
     App f a -> toStringP f . toStringP a . ("@" ++)
 
+-- Strings are encoded in a slightly unusal way.
+-- It ensure that (most) printable ASCII only take
+-- up 1 byte, and outside this range, only 2 bytes.
+-- The input should be in the range 0x00-0xff.
+-- '\x00'..'\x1f'  "^\x20".."^\x3f"
+-- '\x20'..'\x7e'  '\x20'..'\x7e', except '^','\\','|','"'
+-- '"'             "\\\""
+-- '^'             "\^"
+-- '|'             "\|"
+-- '\\'            "\\\\"
+-- '\x7f'          "\?"
+-- '\x80'..'\x9f'  "^\x40".."^\x5f"
+-- '\xa0'..'\xfe'  "|\x20".."|\x7e"
+-- '\xff'          "\_'
 quoteString :: String -> String
 quoteString s =
   let
-    achar c =
-      if c == '"' || c == '\\' || c < ' ' || c > '~' then
-        '\\' : show (ord c) ++ ['&']
-      else
-        [c]
-  in '"' : concatMap achar s ++ ['"']
+    achar c
+      | c < '\0' || c > '\xff' = error "quoteString"
+      | c < '\x20'             = ['^', chr (ord c + 0x20)]
+      | c == '"' || c == '^' || c == '|' || c == '\\' = ['\\', c]
+      | c < '\x7f'             = [c]
+      | c == '\x7f'            = "\\?"
+      | c < '\xa0'             = ['^', chr (ord c - 0x80 + 0x40)]
+      | c < '\xff'             = ['|', chr (ord c - 0x80)]
+      | otherwise              = "\\_"
+  in  '"' : concatMap (\c -> achar (chr (ord c `rem` 256))) s ++ ['"']
 
 encodeString :: String -> Exp
 encodeString = encList . map (Lit . LInt . ord)
diff --git a/src/MicroHs/Expr.hs b/src/MicroHs/Expr.hs
--- a/src/MicroHs/Expr.hs
+++ b/src/MicroHs/Expr.hs
@@ -6,6 +6,7 @@
   ImportItem(..),
   ImpType(..),
   EDef(..), showEDefs,
+  Deriving(..), DerStrategy(..),
   Expr(..), eLam, eLamWithSLoc, eEqn, eEqns, showExpr, eqExpr,
   Listish(..),
   Lit(..), showLit,
@@ -30,9 +31,9 @@
   Con(..), conIdent, conArity, conFields,
   tupleConstr, getTupleConstr,
   mkTupleSel,
-  eApp2, eAppI2, eApp3, eApps,
+  eAppI, eApp2, eAppI2, eApp3, eAppI3, eApps,
   lhsToType,
-  subst,
+  subst, allBinders,
   allVarsExpr, allVarsBind, allVarsEqns, allVarsPat,
   setSLocExpr,
   errorMessage,
@@ -45,16 +46,15 @@
   getArrow, getArrows,
   showExprRaw,
   mkEStr, mkExn,
-  getAppM,
+  getAppM, getApp,
   TyVar, freeTyVars,
   getImplies,
   ) where
-import Prelude(); import MHSPrelude hiding ((<>))
-import Control.Arrow(first)
+import qualified Prelude(); import MHSPrelude hiding ((<>))
 import Data.List
 import Data.Maybe
+import MicroHs.Builtin
 import MicroHs.Ident
-import MicroHs.MRnf
 import Text.PrettyPrint.HughesPJLite
 import GHC.Stack
 
@@ -73,8 +73,8 @@
 --DEBUG  deriving (Show)
 
 data EDef
-  = Data LHS [Constr] Deriving
-  | Newtype LHS Constr Deriving
+  = Data LHS [Constr] [Deriving]
+  | Newtype LHS Constr [Deriving]
   | Type LHS EType
   | Fcn Ident [Eqn]
   | PatBind EPat Expr
@@ -87,38 +87,38 @@
   | Instance EConstraint [EBind]
   | Default (Maybe Ident) [EType]
   | Pattern LHS EPat (Maybe [Eqn])
-  | Deriving EConstraint
+  | StandDeriving DerStrategy Int EConstraint
   | DfltSign Ident EType                      -- only in class declarations
 --DEBUG  deriving (Show)
 
-instance MRnf EDef where
-  mrnf (Data a b c) = mrnf a `seq` mrnf b `seq` mrnf c
-  mrnf (Newtype a b c) = mrnf a `seq` mrnf b `seq` mrnf c
-  mrnf (Type a b) = mrnf a `seq` mrnf b
-  mrnf (Fcn a b) = mrnf a `seq` mrnf b
-  mrnf (PatBind a b) = mrnf a `seq` mrnf b
-  mrnf (Sign a b) = mrnf a `seq` mrnf b
-  mrnf (KindSign a b) = mrnf a `seq` mrnf b
-  mrnf (Import a) = mrnf a
-  mrnf (ForImp a b c) = mrnf a `seq` mrnf b `seq` mrnf c
-  mrnf (Infix a b) = mrnf a `seq` mrnf b
-  mrnf (Class a b c d) = mrnf a `seq` mrnf b `seq` mrnf c `seq` mrnf d
-  mrnf (Instance a b) = mrnf a `seq` mrnf b
-  mrnf (Default a b) = mrnf a `seq` mrnf b
-  mrnf (Pattern a b c) = mrnf a `seq` mrnf b `seq` mrnf c
-  mrnf (Deriving a) = mrnf a
-  mrnf (DfltSign a b) = mrnf a `seq` mrnf b
+instance NFData EDef where
+  rnf (Data a b c) = rnf a `seq` rnf b `seq` rnf c
+  rnf (Newtype a b c) = rnf a `seq` rnf b `seq` rnf c
+  rnf (Type a b) = rnf a `seq` rnf b
+  rnf (Fcn a b) = rnf a `seq` rnf b
+  rnf (PatBind a b) = rnf a `seq` rnf b
+  rnf (Sign a b) = rnf a `seq` rnf b
+  rnf (KindSign a b) = rnf a `seq` rnf b
+  rnf (Import a) = rnf a
+  rnf (ForImp a b c) = rnf a `seq` rnf b `seq` rnf c
+  rnf (Infix a b) = rnf a `seq` rnf b
+  rnf (Class a b c d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d
+  rnf (Instance a b) = rnf a `seq` rnf b
+  rnf (Default a b) = rnf a `seq` rnf b
+  rnf (Pattern a b c) = rnf a `seq` rnf b `seq` rnf c
+  rnf (StandDeriving a b c) = rnf a `seq` rnf b `seq` rnf c
+  rnf (DfltSign a b) = rnf a `seq` rnf b
 
 data ImpType = ImpNormal | ImpBoot
   deriving (Eq)
 
-instance MRnf ImpType
+instance NFData ImpType where rnf x = x `seq` ()
 
 data ImportSpec = ImportSpec ImpType Bool Ident (Maybe Ident) (Maybe (Bool, [ImportItem]))  -- first Bool indicates 'qualified', second 'hiding'
 --DEBUG  deriving (Show)
 
-instance MRnf ImportSpec where
-  mrnf (ImportSpec a b c d e) = mrnf a `seq` mrnf b `seq` mrnf c `seq` mrnf d `seq` mrnf e
+instance NFData ImportSpec where
+  rnf (ImportSpec a b c d e) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e
 
 data ImportItem
   = ImpTypeSome Ident [Ident]
@@ -126,13 +126,28 @@
   | ImpValue Ident
 --DEBUG  deriving (Show)
 
-instance MRnf ImportItem where
-  mrnf (ImpTypeSome a b) = mrnf a `seq` mrnf b
-  mrnf (ImpTypeAll a) = mrnf a
-  mrnf (ImpValue a) = mrnf a
+instance NFData ImportItem where
+  rnf (ImpTypeSome a b) = rnf a `seq` rnf b
+  rnf (ImpTypeAll a) = rnf a
+  rnf (ImpValue a) = rnf a
 
-type Deriving = [EConstraint]
+data Deriving = Deriving DerStrategy [(Int, EConstraint)] -- The Int is added by the type checker, it indicates how many arguments to keep
+--DEBUG  deriving (Show)
 
+instance NFData Deriving where
+  rnf (Deriving a b) = rnf a `seq` rnf b
+
+data DerStrategy
+  = DerNone
+  | DerStock
+  | DerNewtype
+  | DerAnyClass
+  | DerVia EConstraint
+
+instance NFData DerStrategy where
+  rnf (DerVia a) = rnf a
+  rnf _ = ()
+
 data Expr
   = EVar Ident
   | EApp Expr Expr
@@ -168,35 +183,35 @@
   | ECon Con
 --DEBUG  deriving (Show)
 
-instance MRnf Expr where
-  mrnf (EVar a) = mrnf a
-  mrnf (EApp a b) = mrnf a `seq` mrnf b
-  mrnf (EOper a b) = mrnf a `seq` mrnf b
-  mrnf (ELam a b) = mrnf a `seq` mrnf b
-  mrnf (ELit a b) = mrnf a `seq` mrnf b
-  mrnf (ECase a b) = mrnf a `seq` mrnf b
-  mrnf (ELet a b) = mrnf a `seq` mrnf b
-  mrnf (ETuple a) = mrnf a
-  mrnf (EParen a) = mrnf a
-  mrnf (EListish a) = mrnf a
-  mrnf (EDo a b) = mrnf a `seq` mrnf b
-  mrnf (ESectL a b) = mrnf a `seq` mrnf b
-  mrnf (ESectR a b) = mrnf a `seq` mrnf b
-  mrnf (EIf a b c) = mrnf a `seq` mrnf b `seq` mrnf c
-  mrnf (EMultiIf a) = mrnf a
-  mrnf (ESign a b) = mrnf a `seq` mrnf b
-  mrnf (ENegApp a) = mrnf a
-  mrnf (EUpdate a b) = mrnf a `seq` mrnf b
-  mrnf (ESelect a) = mrnf a
-  mrnf (ETypeArg a) = mrnf a
-  mrnf (EAt a b) = mrnf a `seq` mrnf b
-  mrnf (EViewPat a b) = mrnf a `seq` mrnf b
-  mrnf (ELazy a b) = mrnf a `seq` mrnf b
-  mrnf (EOr a) = mrnf a
-  mrnf (EForall a b c) = mrnf a `seq` mrnf b `seq` mrnf c
-  mrnf (EUVar a) = mrnf a
-  mrnf (EQVar a b) = mrnf a `seq` mrnf b
-  mrnf (ECon a) = mrnf a
+instance NFData Expr where
+  rnf (EVar a) = rnf a
+  rnf (EApp a b) = rnf a `seq` rnf b
+  rnf (EOper a b) = rnf a `seq` rnf b
+  rnf (ELam a b) = rnf a `seq` rnf b
+  rnf (ELit a b) = rnf a `seq` rnf b
+  rnf (ECase a b) = rnf a `seq` rnf b
+  rnf (ELet a b) = rnf a `seq` rnf b
+  rnf (ETuple a) = rnf a
+  rnf (EParen a) = rnf a
+  rnf (EListish a) = rnf a
+  rnf (EDo a b) = rnf a `seq` rnf b
+  rnf (ESectL a b) = rnf a `seq` rnf b
+  rnf (ESectR a b) = rnf a `seq` rnf b
+  rnf (EIf a b c) = rnf a `seq` rnf b `seq` rnf c
+  rnf (EMultiIf a) = rnf a
+  rnf (ESign a b) = rnf a `seq` rnf b
+  rnf (ENegApp a) = rnf a
+  rnf (EUpdate a b) = rnf a `seq` rnf b
+  rnf (ESelect a) = rnf a
+  rnf (ETypeArg a) = rnf a
+  rnf (EAt a b) = rnf a `seq` rnf b
+  rnf (EViewPat a b) = rnf a `seq` rnf b
+  rnf (ELazy a b) = rnf a `seq` rnf b
+  rnf (EOr a) = rnf a
+  rnf (EForall a b c) = rnf a `seq` rnf b `seq` rnf c
+  rnf (EUVar a) = rnf a
+  rnf (EQVar a b) = rnf a `seq` rnf b
+  rnf (ECon a) = rnf a
 
 
 data EField
@@ -205,10 +220,10 @@
   | EFieldWild              -- ..
 --DEBUG  deriving (Show)
 
-instance MRnf EField where
-  mrnf (EField a b) = mrnf a `seq` mrnf b
-  mrnf (EFieldPun a) = mrnf a
-  mrnf EFieldWild = ()
+instance NFData EField where
+  rnf (EField a b) = rnf a `seq` rnf b
+  rnf (EFieldPun a) = rnf a
+  rnf EFieldWild = ()
 
 unEField :: EField -> ([Ident], Expr)
 unEField (EField is e) = (is, e)
@@ -236,10 +251,10 @@
   | ConSyn Ident Int (Expr, EType)
 --DEBUG  deriving(Show)
 
-instance MRnf Con where
-  mrnf (ConData a b c) = mrnf a `seq` mrnf b `seq` mrnf c
-  mrnf (ConNew a b) = mrnf a `seq` mrnf b
-  mrnf (ConSyn a b c) = mrnf a `seq` mrnf b `seq` mrnf c
+instance NFData Con where
+  rnf (ConData a b c) = rnf a `seq` rnf b `seq` rnf c
+  rnf (ConNew a b) = rnf a `seq` rnf b
+  rnf (ConSyn a b c) = rnf a `seq` rnf b `seq` rnf c
 
 data Listish
   = LList [Expr]
@@ -250,13 +265,13 @@
   | LFromThenTo Expr Expr Expr
 --DEBUG  deriving(Show)
 
-instance MRnf Listish where
-  mrnf (LList a) = mrnf a
-  mrnf (LCompr a b) = mrnf a `seq` mrnf b
-  mrnf (LFrom a) = mrnf a
-  mrnf (LFromTo a b) = mrnf a `seq` mrnf b
-  mrnf (LFromThen a b) = mrnf a `seq` mrnf b
-  mrnf (LFromThenTo a b c) = mrnf a `seq` mrnf b `seq` mrnf c
+instance NFData Listish where
+  rnf (LList a) = rnf a
+  rnf (LCompr a b) = rnf a `seq` rnf b
+  rnf (LFrom a) = rnf a
+  rnf (LFromTo a b) = rnf a `seq` rnf b
+  rnf (LFromThen a b) = rnf a `seq` rnf b
+  rnf (LFromThenTo a b c) = rnf a `seq` rnf b `seq` rnf c
 
 conIdent :: HasCallStack =>
             Con -> Ident
@@ -272,7 +287,7 @@
 conFields :: Con -> [FieldName]
 conFields (ConData _ _ fs) = fs
 conFields (ConNew _ fs) = fs
-conFields (ConSyn _ _ _) = []
+conFields ConSyn{} = []
 
 instance Eq Con where
   (==) (ConData _ i _)   (ConData _ j _)   = i == j
@@ -287,7 +302,7 @@
   | LRat Rational
   | LChar Char
   | LStr String
-  | LUStr String            -- UTF-8 encoded string
+  | LBStr String            -- bytestring
   | LPrim String
   | LExn String             -- exception to raise
   | LForImp String CType
@@ -295,35 +310,37 @@
 --DEBUG  deriving (Show)
   deriving (Eq)
 
-instance MRnf Lit where
-  mrnf (LInt a) = mrnf a
-  mrnf (LInteger a) = mrnf a
-  mrnf (LDouble a) = mrnf a
-  mrnf (LRat a) = mrnf a
-  mrnf (LChar a) = mrnf a
-  mrnf (LStr a) = mrnf a
-  mrnf (LUStr a) = mrnf a
-  mrnf (LPrim a) = mrnf a
-  mrnf (LExn a) = mrnf a
-  mrnf (LForImp a b) = mrnf a `seq` mrnf b
-  mrnf (LTick a) = mrnf a
+instance NFData Lit where
+  rnf (LInt a) = rnf a
+  rnf (LInteger a) = rnf a
+  rnf (LDouble a) = rnf a
+  rnf (LRat a) = rnf a
+  rnf (LChar a) = rnf a
+  rnf (LStr a) = rnf a
+  rnf (LBStr a) = rnf a
+  rnf (LPrim a) = rnf a
+  rnf (LExn a) = rnf a
+  rnf (LForImp a b) = rnf a `seq` rnf b
+  rnf (LTick a) = rnf a
 
 -- A type of a C FFI function
 newtype CType = CType EType
+
 instance Eq CType where
   _ == _  =  True    -- Just ignore the CType
-instance MRnf CType where
-  mrnf (CType t) = mrnf t
 
+instance NFData CType where
+  rnf (CType t) = rnf t
+
 type ECaseArm = (EPat, EAlts)
 
 data EStmt = SBind EPat Expr | SThen Expr | SLet [EBind]
 --DEBUG  deriving (Show)
 
-instance MRnf EStmt where
-  mrnf (SBind a b) = mrnf a `seq` mrnf b
-  mrnf (SThen a) = mrnf a
-  mrnf (SLet a) = mrnf a
+instance NFData EStmt where
+  rnf (SBind a b) = rnf a `seq` rnf b
+  rnf (SThen a) = rnf a
+  rnf (SLet a) = rnf a
 
 type EBind = EDef   -- subset with Fcn, PatBind, Sign, and DfltSign
 
@@ -331,14 +348,14 @@
 data Eqn = Eqn [EPat] EAlts
 --DEBUG  deriving (Show)
 
-instance MRnf Eqn where
-  mrnf (Eqn a b) = mrnf a `seq` mrnf b
+instance NFData Eqn where
+  rnf (Eqn a b) = rnf a `seq` rnf b
 
 data EAlts = EAlts [EAlt] [EBind]
 --DEBUG  deriving (Show)
 
-instance MRnf EAlts where
-  mrnf (EAlts a b) = mrnf a `seq` mrnf b
+instance NFData EAlts where
+  rnf (EAlts a b) = rnf a `seq` rnf b
 
 type EAlt = ([EStmt], Expr)
 
@@ -387,8 +404,8 @@
   (Either [SType] [ConstrField])  -- types or named fields
   deriving(Show)
 
-instance MRnf Constr where
-  mrnf (Constr a b c d) = mrnf a `seq` mrnf b `seq` mrnf c `seq` mrnf d
+instance NFData Constr where
+  rnf (Constr a b c d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d
 
 type ConstrField = (Ident, SType)              -- record label and type
 type SType = (Bool, EType)                     -- the Bool indicates strict
@@ -406,8 +423,8 @@
 instance Show IdKind where
   show (IdKind i k) = "(" ++ show i ++ "::" ++ show k ++ ")"
 
-instance MRnf IdKind where
-  mrnf (IdKind a b) = mrnf a `seq` mrnf b
+instance NFData IdKind where
+  rnf (IdKind a b) = rnf a `seq` rnf b
 
 idKindIdent :: IdKind -> Ident
 idKindIdent (IdKind i _) = i
@@ -442,6 +459,9 @@
 mkTupleSel i n = eLam [ETuple [ EVar $ if k == i then x else dummyIdent | k <- [0 .. n - 1] ]] (EVar x)
   where x = mkIdent "$x"
 
+eAppI :: Ident -> Expr -> Expr
+eAppI i a = EApp (EVar i) a
+
 eApp2 :: Expr -> Expr -> Expr -> Expr
 eApp2 a b c = EApp (EApp a b) c
 
@@ -451,6 +471,9 @@
 eApp3 :: Expr -> Expr -> Expr -> Expr -> Expr
 eApp3 a b c d = EApp (eApp2 a b c) d
 
+eAppI3 :: Ident -> Expr -> Expr -> Expr -> Expr
+eAppI3 a b c d = EApp (eAppI2 a b c) d
+
 eApps :: Expr -> [Expr] -> Expr
 eApps = foldl EApp
 
@@ -501,7 +524,7 @@
   getSLoc (EViewPat e _) = getSLoc e
   getSLoc (ELazy _ e) = getSLoc e
   getSLoc (EOr es) = getSLoc es
-  getSLoc (EUVar _) = error "getSLoc EUVar"
+  getSLoc (EUVar _) = noSLoc -- error "getSLoc EUVar"
   getSLoc (EQVar e _) = getSLoc e
   getSLoc (ECon c) = getSLoc c
   getSLoc (EForall _ [] e) = getSLoc e
@@ -539,9 +562,8 @@
 instance HasLoc EAlts where
   getSLoc (EAlts as _) = getSLoc as
 
-instance HasLoc EAlt where
-  getSLoc ([], e) = getSLoc e
-  getSLoc (ss, _) = getSLoc ss
+instance HasLoc a => HasLoc (a, b) where
+  getSLoc (a, _) = getSLoc a
 
 ---------------------------------
 
@@ -551,7 +573,7 @@
 
 type Fixity = (Assoc, Int)
 
-instance MRnf Assoc
+instance NFData Assoc where rnf x = x `seq` ()
 
 ---------------------------------
 
@@ -566,12 +588,29 @@
         EApp f a -> EApp (sub f) (sub a)
         ESign e t -> ESign (sub e) t
         EUVar _ -> ae
-        EForall b iks t -> EForall b iks $ subst [ x | x@(i, _) <- s, not (elem i is) ] t
+        EForall b iks t | null (vs `intersect` is) -> EForall b iks $ subst s' t
+                        | otherwise ->
+                          -- We need to alpha convert to avoid accidental capture
+                          let used = freeTyVars [t]
+                              new = allBinders \\ (is ++ vs ++ used)
+                              iks'  = zipWith (\ (IdKind _ k) n -> IdKind n k) iks new
+                              alpha = zipWith (\ (IdKind i _) n -> (i, EVar n)) iks new
+                          in  subst s' $ EForall b iks' $ subst alpha t
           where is = map idKindIdent iks
+                s' = [ x | x@(i, _) <- s, i `notElem` is ]
+                vs = freeTyVars (map snd s')    -- these are free in s'
+
         ELit _ _ -> ae
-        _ -> error "subst unimplemented"
+        ETuple ts -> ETuple (map sub ts)
+        EOper t1 its -> EOper (sub t1) (map (second sub) its)
+        EParen t -> EParen (sub t)
+        _ -> error $ "subst unimplemented " ++  show ae
   in sub
 
+allBinders :: [Ident] -- a,b,...,z,a1,a2,...
+allBinders = [ mkIdent [x] | x <- ['a' .. 'z'] ] ++
+             [ mkIdent ('a' : show i) | i <- [1::Int ..]]
+
 ---------------------------------
 
 -- XXX needs more?
@@ -751,9 +790,9 @@
 ppEDef :: EDef -> Doc
 ppEDef def =
   case def of
-    Data lhs [] ds -> text "data" <+> ppLHS lhs <+> ppDeriving ds
-    Data lhs cs ds -> text "data" <+> ppLHS lhs <+> text "=" <+> hsep (punctuate (text " |") (map ppConstr cs)) <+> ppDeriving ds
-    Newtype lhs c ds -> text "newtype" <+> ppLHS lhs <+> text "=" <+> ppConstr c <+> ppDeriving ds
+    Data lhs [] ds -> text "data" <+> ppLHS lhs <+> ppDerivings ds
+    Data lhs cs ds -> text "data" <+> ppLHS lhs <+> text "=" <+> hsep (punctuate (text " |") (map ppConstr cs)) <+> ppDerivings ds
+    Newtype lhs c ds -> text "newtype" <+> ppLHS lhs <+> text "=" <+> ppConstr c <+> ppDerivings ds
     Type lhs t -> text "type" <+> ppLHS lhs <+> text "=" <+> ppEType t
     Fcn i eqns -> ppEqns (ppIdent i) (text "=") eqns
     PatBind p e -> ppEPat p <+> text "=" <+> ppExpr e
@@ -770,14 +809,27 @@
       where f AssocLeft = "l"; f AssocRight = "r"; f AssocNone = ""
     Class sup lhs fds bs -> ppWhere (text "class" <+> ppCtx sup <+> ppLHS lhs <+> ppFunDeps fds) bs
     Instance ct bs -> ppWhere (text "instance" <+> ppEType ct) bs
-    Default mc ts -> text "default" <+> (maybe empty ppIdent mc) <+> parens (hsep (punctuate (text ", ") (map ppEType ts)))
+    Default mc ts -> text "default" <+> maybe empty ppIdent mc <+> parens (hsep (punctuate (text ", ") (map ppEType ts)))
     Pattern lhs@(i,_) p meqns -> text "pattern" <+> ppLHS lhs <+> text "=" <+> ppExpr p <+> maybe empty (ppWhere (text ";") . (:[]) . Fcn i) meqns
-    Deriving ct -> text "deriving instance" <+> ppEType ct
+    StandDeriving _s _narg ct -> text "deriving instance" <+> ppEType ct
     DfltSign i t -> text "default" <+> ppIdent i <+> text "::" <+> ppEType t
 
+ppDerivings :: [Deriving] -> Doc
+ppDerivings = sep . map ppDeriving
+
 ppDeriving :: Deriving -> Doc
-ppDeriving [] = empty
-ppDeriving ds = text "deriving" <+> parens (hsep $ punctuate (text ",") (map ppExpr ds))
+ppDeriving (Deriving s ds) = text "deriving" <+>
+  case s of
+    DerNone -> empty
+    DerStock -> text "stock"
+    DerNewtype -> text "newtype"
+    DerAnyClass -> text "anyclass"
+    DerVia _ -> empty
+  <+> parens (hsep $ punctuate (text ",") (map (ppExpr . snd) ds))
+  <+>
+  case s of
+    DerVia t -> text "via" <+> ppEType t
+    _ -> empty
 
 ppCtx :: [EConstraint] -> Doc
 ppCtx [] = empty
@@ -872,8 +924,8 @@
         ELazy False p -> text "!" <> ppE p
         EOr ps -> parens $ hsep (punctuate (text ";") (map ppE ps))
         EUVar i -> text ("_a" ++ show i)
-        EQVar e t -> parens $ ppE e <> text "::" <> ppE t
-        ECon c -> text "***" <> ppCon c
+        EQVar e t -> parens $ ppE e <> text ":::" <> ppE t
+        ECon c -> {-text "***" <>-} ppCon c
         EForall _ iks e -> parens $ ppForall iks <+> ppEType e
 
     ppApp :: [Expr] -> Expr -> Doc
@@ -927,7 +979,7 @@
     LRat r     -> '%' : show r
     LChar c    -> show c
     LStr s     -> show s
-    LUStr s    -> show s
+    LBStr s    -> show s
     LPrim s    -> s
     LExn s     -> s
     LForImp s _-> '^' : last (words s)  -- XXX needs improvement
@@ -999,13 +1051,13 @@
 getArrow _ = Nothing
 
 getArrows :: EType -> ([EType], EType)
-getArrows at = 
+getArrows at =
   case getArrow at of
     Nothing -> ([], at)
     Just (t, r) -> first (t:) (getArrows r)
 
 mkEStr :: SLoc -> String -> Expr
-mkEStr loc str = ESign (ELit loc (LStr str)) $ EListish $ LList [EVar $ mkIdentSLoc loc "Char"]
+mkEStr loc str = ESign (ELit loc (LStr str)) $ EListish $ LList [EVar $ mkBuiltin loc "Char"]
 
 -- Make a call to generate an exception with location info
 mkExn :: SLoc -> String -> String -> Expr
@@ -1018,8 +1070,12 @@
 getAppM = loop []
   where loop as (EVar i) = Just (i, as)
         loop as (EApp f a) = loop (a:as) f
+        loop as (EParen e) = loop as e
         loop _ _ = Nothing
 
+getApp :: HasCallStack => EType -> (Ident, [EType])
+getApp t = fromMaybe (impossibleShow t) $ getAppM t
+
 type TyVar = Ident
 
 freeTyVars :: [EType] -> [TyVar]
@@ -1031,8 +1087,8 @@
        -> [TyVar] -- Accumulates result
        -> [TyVar]
     go bound (EVar tv) acc
-      | elem tv bound = acc
-      | elem tv acc = acc
+      | tv `elem` bound = acc
+      | tv `elem` acc = acc
       | isConIdent tv = acc
       | otherwise = tv : acc
     go bound (EForall _ tvs ty) acc = go (map idKindIdent tvs ++ bound) ty acc
@@ -1045,6 +1101,7 @@
     go bound (EListish (LList [e])) acc = go bound e acc
     go bound (ETuple es) acc = goList bound es acc
     go bound (EParen e) acc = go bound e acc
+    go bound (EQVar e _) acc = go bound e acc
     go _ x _ = error ("freeTyVars: " ++ show x) --  impossibleShow x
     goList bound es acc = foldr (go bound) acc es
 
diff --git a/src/MicroHs/FFI.hs b/src/MicroHs/FFI.hs
--- a/src/MicroHs/FFI.hs
+++ b/src/MicroHs/FFI.hs
@@ -1,12 +1,13 @@
 module MicroHs.FFI(makeFFI) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Data.Function
 import Data.List
 import MicroHs.Desugar(LDef)
 import MicroHs.Exp
 import MicroHs.Expr
-import MicroHs.Ident
 import MicroHs.Flags
+import MicroHs.Ident
+import MicroHs.Names
 
 makeFFI :: Flags -> [LDef] -> String
 makeFFI _ ds =
@@ -53,8 +54,8 @@
     ["wrapper"] -> ImpWrapper
     "static" : r -> rest r
     r            -> rest r
- where rest (inc : r) | isSuffixOf ".h" inc = rest' (ImpStatic i (Just inc)) r
-       rest r                               = rest' (ImpStatic i Nothing)    r
+ where rest (inc : r) | ".h" `isSuffixOf` inc = rest' (ImpStatic i (Just inc)) r
+       rest r                                 = rest' (ImpStatic i Nothing)    r
        rest' c ("&"     : r) = rest'' (c Ptr) r
        rest' c ['&'     : r] = rest'' (c Ptr) [r]
        rest' c ("value" : r) = rest'' (c Value) [unwords r]
@@ -69,33 +70,21 @@
 mkEntry (ImpStatic i _ Value _) = "{ \"" ++ f ++ "\", mhs_" ++ f ++ "}," where f = unIdent' i
 mkEntry _ = undefined
 
-iIO :: Ident
-iIO = mkIdent "Primitives.IO"
-
-iUnit :: Ident
-iUnit = mkIdent "()"
-
-iPtr :: Ident
-iPtr = mkIdent "Primitives.Ptr"
-
-iFunPtr :: Ident
-iFunPtr = mkIdent "Primitives.FunPtr"
-
 mkMhsFun :: String -> String -> String
 mkMhsFun fn body = "void mhs_" ++ fn ++ "(int s) { " ++ body ++ "; }"
 
 checkIO :: EType -> EType
 checkIO iot =
-  case getApp iIO iot of
+  case dropApp identIO iot of
     Nothing -> iot -- errorMessage (getSLoc iot) $ "foreign return type must be IO: " ++ showEType iot
     Just t  -> t
 
-getApp :: Ident -> EType -> Maybe EType
-getApp i (EApp (EVar i') t) | i == i' = Just t
-getApp _ _ = Nothing
+dropApp :: Ident -> EType -> Maybe EType
+dropApp i (EApp (EVar i') t) | i == i' = Just t
+dropApp _ _ = Nothing
 
 isUnit :: EType -> Bool
-isUnit (EVar unit) = unit == iUnit
+isUnit (EVar unit) = unit == identUnit
 isUnit _ = False
 
 mkRet :: EType -> Int -> String -> String
@@ -108,12 +97,12 @@
 mkHdr (ImpStatic _ _ Ptr fn, iot) =
   let r = checkIO iot
       (s, _) =
-        case getApp iPtr r of
+        case dropApp identPtr r of
           Just t  -> ("", t)
           Nothing ->
-            case getApp iFunPtr r of
+            case dropApp identFunPtr r of
               Just t  -> ("(HsFunPtr)", t)
-              Nothing -> errorMessage (getSLoc r) $ "foreign & must be Ptr/FunPtr"
+              Nothing -> errorMessage (getSLoc r) "foreign & must be Ptr/FunPtr"
       body = mkRet r 0 (s ++ "&" ++ fn)
   in  mkMhsFun ("addr_" ++ fn) body
 mkHdr (ImpStatic _ _ Func fn, t) =
@@ -137,8 +126,8 @@
 unIdent' = unIdent . unQualIdent
 
 cTypeName :: EType -> String
-cTypeName (EApp (EVar ptr) _t) | ptr == iPtr = "Ptr"
-                               | ptr == iFunPtr = "FunPtr"
+cTypeName (EApp (EVar ptr) _t) | ptr == identPtr = "Ptr"
+                               | ptr == identFunPtr = "FunPtr"
 cTypeName (EVar i) | Just c <- lookup (unIdent i) cTypes = c
 cTypeName t = errorMessage (getSLoc t) $ "Not a valid C type: " ++ showEType t
 
@@ -174,8 +163,9 @@
 runtimeFFI = [
   "GETRAW", "GETTIMEMILLI", "acos", "add_FILE", "add_utf8", "asin", "atan", "atan2", "calloc", "closeb",
   "cos", "exp", "flushb", "fopen", "free", "getb", "getenv", "iswindows", "log", "malloc",
-  "md5Array", "md5BFILE", "md5String", "memcpy", "memmove", 
+  "md5Array", "md5BFILE", "md5String", "memcpy", "memmove",
   "putb", "sin", "sqrt", "system", "tan", "tmpname", "ungetb", "unlink",
+  "readb", "writeb",
   "peekPtr", "pokePtr", "pokeWord", "peekWord",
   "add_lz77_compressor", "add_lz77_decompressor",
   "add_rle_compressor", "add_rle_decompressor",
@@ -190,9 +180,9 @@
   "sizeof_int", "sizeof_long", "sizeof_llong",
   "opendir", "closedir", "readdir", "c_d_name", "chdir", "mkdir", "getcwd",
   "get_buf", "openb_rd_buf", "openb_wr_buf",
-  "new_mpz", "mpz_abs", "mpz_add", "mpz_and", "mpz_cmp", "mpz_get_d", 
-  "mpz_get_si", "mpz_get_ui", "mpz_init_set_si", "mpz_init_set_ui", "mpz_ior", 
-  "mpz_mul", "mpz_mul_2exp", "mpz_neg", "mpz_popcount", "mpz_sub", "mpz_tdiv_q_2exp", 
+  "new_mpz", "mpz_abs", "mpz_add", "mpz_and", "mpz_cmp", "mpz_get_d",
+  "mpz_get_si", "mpz_get_ui", "mpz_init_set_si", "mpz_init_set_ui", "mpz_ior",
+  "mpz_mul", "mpz_mul_2exp", "mpz_neg", "mpz_popcount", "mpz_sub", "mpz_fdiv_q_2exp",
   "mpz_tdiv_qr", "mpz_tstbit", "mpz_xor",
   "want_gmp"
   ]
diff --git a/src/MicroHs/Fixity.hs b/src/MicroHs/Fixity.hs
--- a/src/MicroHs/Fixity.hs
+++ b/src/MicroHs/Fixity.hs
@@ -1,5 +1,6 @@
 module MicroHs.Fixity(resolveFixity) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
+import MicroHs.Builtin
 import MicroHs.Expr
 import MicroHs.Ident
 
@@ -40,7 +41,7 @@
 --  deriving (Show)
 
 eNeg :: SLoc -> Expr
-eNeg loc = EVar (mkIdentSLoc loc "negate")
+eNeg loc = EVar (mkBuiltin loc "negate")
 
 negFixity :: Fixity
 negFixity = (AssocLeft, 6)
@@ -63,9 +64,9 @@
 
       resolve [e] []             [] = Right e
       resolve _   []             [] = undefined
-      resolve es  []             (ox@(Rator _    _    _) : is) = resolve          es  [ox] is
-      resolve es     (oy:os)     []                            = resolve (oper oy es)  os  []
-      resolve es aos             (    Rand e             : is) = resolve       (e:es) aos  is
+      resolve es  []             (ox@Rator{} : is) = resolve          es  [ox] is
+      resolve es     (oy:os)     []                = resolve (oper oy es)  os  []
+      resolve es aos             (   Rand e  : is) = resolve       (e:es) aos  is
       resolve es aos@(oy:os) ais@(ox@(Rator FixIn func _) : is)
         | prec ox == prec oy && (assoc ox /= assoc oy || assoc ox == AssocNone) =
           Left (getSLoc func, "ambiguous operator expression")
diff --git a/src/MicroHs/Flags.hs b/src/MicroHs/Flags.hs
--- a/src/MicroHs/Flags.hs
+++ b/src/MicroHs/Flags.hs
@@ -1,5 +1,8 @@
-module MicroHs.Flags(Flags(..), verbosityGT, defaultFlags, wantGMP) where
-import Prelude(); import MHSPrelude
+module MicroHs.Flags(
+  Flags(..), verbosityGT, defaultFlags,
+  DumpFlag(..), dumpIf,
+  wantGMP) where
+import qualified Prelude(); import MHSPrelude
 
 data Flags = Flags {
   verbose    :: Int,        -- verbosity level
@@ -20,7 +23,8 @@
   listPkg    :: Maybe FilePath, -- list package contents
   pkgPath    :: [FilePath], -- package search path
   installPkg :: Bool,       -- install a package
-  target     :: String      -- Compile target defined in target.conf
+  target     :: String,     -- Compile target defined in target.conf
+  dumpFlags  :: [DumpFlag]  -- For debugging
   }
   deriving (Show)
 
@@ -47,8 +51,17 @@
   listPkg    = Nothing,
   pkgPath    = [],
   installPkg = False,
-  target     = "default"
+  target     = "default",
+  dumpFlags  = []
   }
   -- This is a hack so that the in-place mhs picks up GMP.
   where gmp | dir == "." && wantGMP = ["lib/gmp"]
             | otherwise             = []
+
+data DumpFlag = Dparse | Dderive | Dtypecheck | Ddesugar | Dtoplevel | Dcombinator | Dall
+  deriving (Eq, Show, Enum, Bounded)
+
+dumpIf :: Monad m => Flags -> DumpFlag -> m () -> m ()
+dumpIf flags df act | df `elem` dfs || Dall `elem` dfs = act
+                    | otherwise = return ()
+  where dfs = dumpFlags flags
diff --git a/src/MicroHs/Graph.hs b/src/MicroHs/Graph.hs
--- a/src/MicroHs/Graph.hs
+++ b/src/MicroHs/Graph.hs
@@ -12,7 +12,7 @@
   stronglyConnComp,
   SCC(..)
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Data.List
 import Data.Maybe
 import qualified MicroHs.IntSet as IS
@@ -61,7 +61,7 @@
   where
     (graph, vertex_fn) = graphFromEdges le edges0
     forest             = scc graph
-    mentions_itself v = elem v (graph IM.! v)
+    mentions_itself v = v `elem` (graph IM.! v)
     decode (Node v []) | mentions_itself v = CyclicSCC [vertex_fn v]
                        | otherwise         = AcyclicSCC (vertex_fn v)
     decode other = CyclicSCC (dec other [])
@@ -80,7 +80,7 @@
 
 buildG :: [Vertex] -> [Edge] -> Graph
 buildG vs es =
-  let mt = IM.fromList (zip vs (repeat []))
+  let mt = IM.fromList (map (\ x -> (x, [])) vs)
   in  foldr (\ (v, w) -> IM.insertWith (++) v [w]) mt es
 
 transposeG  :: Graph -> Graph
@@ -95,7 +95,7 @@
         -> [(node, key, [key])]
         -> (Graph, Vertex -> (node, key, [key]))
 graphFromEdges le edges0
-  = (graph, \v -> vertex_map IM.! v)
+  = (graph, (vertex_map IM.!))
   where
     lek (_,k1,_) (_,k2,_) = le k1 k2
 
@@ -147,7 +147,7 @@
 postorder (Node a ts) = postorderF ts . (a :)
 
 postorderF :: forall a . [Tree a] -> [a] -> [a]
-postorderF ts = foldr (.) id $ map postorder ts
+postorderF = foldr ((.) . postorder) id
 
 postOrd :: Graph -> [Vertex]
 postOrd g = postorderF (dff g) []
diff --git a/src/MicroHs/Ident.hs b/src/MicroHs/Ident.hs
--- a/src/MicroHs/Ident.hs
+++ b/src/MicroHs/Ident.hs
@@ -17,13 +17,13 @@
   addIdentSuffix,
   SLoc(..), noSLoc,
   showSLoc, slocFile,
+  isUpperX,
   ) where
-import Prelude(); import MHSPrelude hiding(head)
+import qualified Prelude(); import MHSPrelude hiding(head)
 import Data.Char
 import Text.PrettyPrint.HughesPJLite
 import GHC.Stack
 import MicroHs.List(dropEnd)
-import MicroHs.MRnf
 
 import Data.Text(Text, pack, unpack, append, head)
 
@@ -53,8 +53,8 @@
 instance Show SLoc where
   show (SLoc f l c) = show f ++ "," ++ show l ++ ":" ++ show c
 
-instance MRnf SLoc where
-  mrnf (SLoc a b c) = mrnf a `seq` mrnf b `seq` mrnf c
+instance NFData SLoc where
+  rnf (SLoc a b c) = rnf a `seq` rnf b `seq` rnf c
 
 data Ident = Ident SLoc Text
   --deriving (Show)
@@ -72,8 +72,8 @@
 instance Show Ident where
   show = showIdent
 
-instance MRnf Ident where
-  mrnf (Ident a b) = mrnf a `seq` mrnf b
+instance NFData Ident where
+  rnf (Ident a b) = rnf a `seq` rnf b
 
 slocIdent :: Ident -> SLoc
 slocIdent (Ident l _) = l
@@ -115,7 +115,7 @@
                 String -> String
 unQualString [] = ""
 unQualString s@(c:_) =
-  if isUpper c then
+  if isUpperX c then
     case dropWhile (/= '.') s of
       "" -> s
       '.':r -> unQualString r
@@ -136,7 +136,7 @@
 isConIdent :: Ident -> Bool
 isConIdent i@(Ident _ t) =
   let c = headIdent i
-  in  isUpper c || c == ':' || c == ',' || t == pack "[]"  || t == pack "()" || t == pack "->"
+  in  isUpperX c || c == ':' || c == ',' || t == pack "[]"  || t == pack "()" || t == pack "->"
 
 isOperChar :: Char -> Bool
 isOperChar '@' = True
@@ -164,7 +164,7 @@
 isOperChar '\x2192' = True  -- ->
 isOperChar '\x2190' = True  -- <-
 isOperChar '\x2200' = True  -- forall
-isOperChar _ = False
+isOperChar c = not (isAscii c) && (isSymbol c || isPunctuation c)   -- Unicode operator symbols
 
 isIdentChar :: Char -> Bool
 isIdentChar c = isLower_ c || isUpper c || isDigit c || c == '\''
@@ -188,3 +188,8 @@
 
 slocFile :: SLoc -> FilePath
 slocFile (SLoc f _ _) = f
+
+isUpperX :: Char -> Bool
+isUpperX '\8658' = False
+isUpperX '\8594' = False
+isUpperX c = isUpper c
diff --git a/src/MicroHs/IdentMap.hs b/src/MicroHs/IdentMap.hs
--- a/src/MicroHs/IdentMap.hs
+++ b/src/MicroHs/IdentMap.hs
@@ -17,9 +17,8 @@
   merge, mergeWith,
   mapM,
   ) where
-import Prelude(); import MHSPrelude hiding(lookup, mapM, null)
+import qualified Prelude(); import MHSPrelude hiding(lookup, mapM, null)
 import MicroHs.Ident
-import MicroHs.MRnf
 
 data Map a
   = Nil           -- empty tree
@@ -37,10 +36,10 @@
   show m = show (toList m)
 -}
 
-instance MRnf a => MRnf (Map a) where
-  mrnf Nil = ()
-  mrnf (One a b) = mrnf a `seq` mrnf b
-  mrnf (Node a b c d e) = mrnf a `seq` mrnf b `seq` mrnf c `seq` mrnf d `seq` mrnf e
+instance NFData a => NFData (Map a) where
+  rnf Nil = ()
+  rnf (One a b) = rnf a `seq` rnf b
+  rnf (Node a b c d e) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e
 
 empty :: forall a . Map a
 empty = Nil
@@ -124,8 +123,8 @@
 delete k = del
   where
     del Nil = Nil
-    del t@(One a _) | (k `compare` a) == EQ = Nil
-                    | otherwise        = t
+    del t@(One a _) | k == a    = Nil
+                    | otherwise = t
     del (Node left _ key val right) =
       case k `compare` key of
         LT -> balance (del left) key val right
diff --git a/src/MicroHs/Instances.hs b/src/MicroHs/Instances.hs
deleted file mode 100644
--- a/src/MicroHs/Instances.hs
+++ /dev/null
@@ -1,17 +0,0 @@
--- Copyright 2023 Lennart Augustsson
--- See LICENSE file for full license.
-module MicroHs.Instances(compiledWithGHC) where
--- For GHC compatibility
-import Prelude(); import MHSPrelude
-import MicroHs.CompileCache
-import MicroHs.Ident
-import MicroHs.Exp
-import MicroHs.Expr
-
-compiledWithGHC :: Bool
-compiledWithGHC = False
-
-instance NFData Cache
-instance NFData Exp
-instance NFData Lit
-instance NFData Ident
diff --git a/src/MicroHs/IntMap.hs b/src/MicroHs/IntMap.hs
--- a/src/MicroHs/IntMap.hs
+++ b/src/MicroHs/IntMap.hs
@@ -4,7 +4,7 @@
   IntMap,
   empty, lookup, insert, fromList, toList, insertWith, (!), keys
   ) where
-import Prelude(); import MHSPrelude hiding(lookup)
+import qualified Prelude(); import MHSPrelude hiding(lookup)
 
 data IntMap a
   = Empty
diff --git a/src/MicroHs/IntSet.hs b/src/MicroHs/IntSet.hs
--- a/src/MicroHs/IntSet.hs
+++ b/src/MicroHs/IntSet.hs
@@ -4,7 +4,7 @@
   IntSet,
   empty, member, insert, fromList, toList
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import qualified MicroHs.IntMap as M
 
 newtype IntSet = I (M.IntMap ())
@@ -22,8 +22,7 @@
 insert k (I m) = I (M.insert k () m)
 
 fromList :: [Int] -> IntSet
-fromList is = I (M.fromList (zip is (repeat ())))
+fromList is = I $ M.fromList (map (\ x -> (x, ())) is)
 
 toList :: IntSet -> [Int]
 toList (I m) = map fst (M.toList m)
-
diff --git a/src/MicroHs/Interactive.hs b/src/MicroHs/Interactive.hs
--- a/src/MicroHs/Interactive.hs
+++ b/src/MicroHs/Interactive.hs
@@ -1,5 +1,5 @@
-module MicroHs.Interactive(module MicroHs.Interactive) where
-import Prelude(); import MHSPrelude
+module MicroHs.Interactive(mainInteractive) where
+import qualified Prelude(); import MHSPrelude
 import Data.List
 import Data.Maybe
 import Data.Version
@@ -18,7 +18,6 @@
 import MicroHs.TypeCheck(ValueExport(..), TypeExport(..), TModule(..), Symbols)
 import Unsafe.Coerce
 import System.Console.SimpleReadline
-import MicroHs.Instances(compiledWithGHC)
 import Paths_MicroHs(version)
 
 data IState = IState {
@@ -44,7 +43,7 @@
 
 preamble :: String
 preamble = "module " ++ interactiveName ++ "(module " ++ interactiveName ++
-           ") where\nimport Prelude\nimport System.IO.PrintOrRun\ndefault Num (Integer, Double)\ndefault IsString (String)\ndefault Show (())\n"
+           ") where\nimport System.IO.PrintOrRun\ndefault Num (Integer, Double)\ndefault IsString (String)\ndefault Show (())\n"
 
 start :: I ()
 start = do
@@ -52,8 +51,9 @@
   is <- get
   liftIO $ maybeSaveCache (isFlags is) (isCache is)
   liftIO $ putStrLn "Type ':quit' to quit, ':help' for help"
-  when compiledWithGHC $
-    liftIO $ putStrLn "WARNING: Compiled with GHC, so limited functionality."
+  unless compiledWithMhs $ do
+    --liftIO $ putStrLn "WARNING: Not compiled with mhs, so limited functionality."
+    error "The interactive system currently only works with mhs"
   repl
 
 repl :: I ()
@@ -116,6 +116,10 @@
       showKind line
       return True
     )
+  , ("main", \ line -> do
+      runMain line
+      return True
+    )
   , ("help", \ _ -> do
       liftIO $ putStrLn helpText
       return True
@@ -138,7 +142,8 @@
   \:clear     clear all definitions\n\
   \:delete d  delete definition(s) d\n\
   \:type e    show type of e\n\
-  \:kind t    show type of t\n\
+  \:kind t    show kind of t\n\
+  \:main args run main with arguments\n\
   \:help      this text\n\
   \expr       evaluate expression\n\
   \defn       add top level definition\n\
@@ -265,6 +270,9 @@
     Left  e ->
       liftIO $ err e
 
+runMain :: String -> I ()
+runMain line = oneline $ "_withArgs " ++ show (words line) ++ " main"
+
 getCModule :: Cache -> TModule [LDef]
 getCModule cash =
   case lookupCache interactiveId cash of
@@ -292,7 +300,7 @@
       allSyms = map unIdent $ stKeysGlbU tys ++ stKeysGlbU vals ++ mdls
       allStrs = allSyms ++ keywords
       real = notElem '$'
-  in  case filter real $ catMaybes $ map (stripPrefix pre) allStrs of
+  in  case filter real $ mapMaybe (stripPrefix pre) allStrs of
         []  -> []
         [s] -> [s ++ " "]
         ss  ->
diff --git a/src/MicroHs/Lex.hs b/src/MicroHs/Lex.hs
--- a/src/MicroHs/Lex.hs
+++ b/src/MicroHs/Lex.hs
@@ -5,7 +5,7 @@
   popLayout, lex,
   readInt,
   ) where
-import Prelude(); import MHSPrelude hiding(lex)
+import qualified Prelude(); import MHSPrelude hiding(lex)
 import Data.Char
 import Data.List
 import Data.Maybe (fromJust)
@@ -97,7 +97,7 @@
   case span (/= '\n') cs of
     (line, rs) ->        -- rs will contain the '\n', so subtract 1 below
       let ws = words line
-          file = tail $ init $ ws!!1   -- strip the initial and final '"' 
+          file = tail $ init $ ws!!1   -- strip the initial and final '"'
           loc' = SLoc file (readInt (ws!!0) - 1) 1
       in  lex loc' rs
 lex loc ('!':' ':cs) =  -- ! followed by a space is always an operator
@@ -120,7 +120,7 @@
   where isSQuote ('\'':_) = Just 1
         isSQuote _ = Nothing
         tchar [c] = TChar loc c
-        tchar _   = TError loc $ "Illegal Char literal"
+        tchar _   = TError loc "Illegal Char literal"
 
 lex loc (d:_) = [TError loc $ "Unrecognized input: " ++ show d]
 lex loc [] = [TEnd loc]
@@ -207,7 +207,7 @@
 
 -- | Takes a list of tokens and produces a list of tokens. If the first token in
 -- the input list is a TIndent, the input is returned unaltered. Otherwise, a
--- TIndent is prepended to the input list        
+-- TIndent is prepended to the input list
 tIndent :: [Token] -> [Token]
 tIndent ts@(TIndent _ : _) = ts
 tIndent ts = TIndent (tokensLoc ts) : ts
@@ -228,7 +228,7 @@
 --        foo xs = trace (show ("foo", loc, take 20 acs, xs)) xs
 
         remGap l rs ('\\':cs) = loop   (addCol l 1)       rs  cs
-        remGap l rs ('\n':cs) = remGap (incrLine l) ('\n':rs) cs 
+        remGap l rs ('\n':cs) = remGap (incrLine l) ('\n':rs) cs
         remGap l rs ('\t':cs) = remGap (tabCol   l) ('\t':rs) cs
         remGap l rs ('\r':cs) = remGap           l        rs  cs
         remGap l rs (' ' :cs) = remGap (addCol l 1)       rs  cs
@@ -251,7 +251,7 @@
 decodeEsc ('x':cs) = conv 16 0 cs
 decodeEsc ('o':cs) = conv 8 0 cs
 decodeEsc ('^':c:cs) | '@' <= c && c <= '_' = chr (ord c - ord '@') : decodeEscs cs
-decodeEsc (cs@(c:_)) | isDigit c = conv 10 0 cs
+decodeEsc cs@(c:_) | isDigit c = conv 10 0 cs
 decodeEsc (c1:c2:c3:cs) | Just c <- lookup [c1,c2,c3] ctlCodes = c : decodeEscs cs
 decodeEsc (c1:c2:cs) | Just c <- lookup [c1,c2] ctlCodes = c : decodeEscs cs
 decodeEsc (c  :cs) = c : decodeEscs cs
@@ -263,11 +263,11 @@
   [("NUL", '\NUL'), ("SOH", '\SOH'), ("STX", '\STX'), ("ETX", '\ETX'),
    ("EOT", '\EOT'), ("ENQ", '\ENQ'), ("ACK", '\ACK'), ("BEL", '\BEL'),
    ("BS",  '\BS'),  ("HT",  '\HT'),  ("LF",  '\LF'),  ("VT", '\VT'),
-   ("FF",  '\FF'),  ("CR",  '\CR'),  ("SO",  '\SO'),  ("SI", '\SI'), 
+   ("FF",  '\FF'),  ("CR",  '\CR'),  ("SO",  '\SO'),  ("SI", '\SI'),
    ("DLE", '\DLE'), ("DC1", '\DC1'), ("DC2", '\DC2'), ("DC3", '\DC3'),
    ("DC4", '\DC4'), ("NAK", '\NAK'), ("SYN", '\SYN'), ("ETB", '\ETB'),
    ("CAN", '\CAN'), ("EM",  '\EM'),  ("SUB", '\SUB'), ("ESC", '\ESC'),
-   ("FS",  '\FS'),  ("GS",  '\GS'),  ("RS",  '\RS'),  ("US",  '\US'), 
+   ("FS",  '\FS'),  ("GS",  '\GS'),  ("RS",  '\RS'),  ("US",  '\US'),
    ("SP",  '\SP'),  ("DEL", '\DEL')]
 
 conv :: Int -> Int -> String -> String
@@ -414,8 +414,8 @@
 
 layoutLS ::                [Token] ->    [Int] -> Cmd      -> (Token,                    LexState)
 layoutLS                        ts           ms  Raw        = (TRaw ts,                  LS $ layoutLS  ts     ms )
-layoutLS                        ts          mms  Pop        =                                                    
-                                                   case (mms, ts) of                                              
+layoutLS                        ts          mms  Pop        =
+                                                   case (mms, ts) of
                                                      (m:ms,_:_) | m/=0 -> (TEnd (tokensLoc ts),  LS $ layoutLS  ts     ms )
                                                      _ ->     (TError l "syntax error",  LS $ layoutLS  []     [] ) where l = tokensLoc ts
 -- The rest are the Next commands
diff --git a/src/MicroHs/List.hs b/src/MicroHs/List.hs
--- a/src/MicroHs/List.hs
+++ b/src/MicroHs/List.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module MicroHs.List where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Data.List
 
 -- Various useful list functions.
@@ -102,3 +102,6 @@
 
 dropEnd :: Int -> [a] -> [a]
 dropEnd n = reverse . drop n . reverse
+
+takeEnd :: Int -> [a] -> [a]
+takeEnd n = reverse . take n . reverse
diff --git a/src/MicroHs/MRnf.hs b/src/MicroHs/MRnf.hs
deleted file mode 100644
--- a/src/MicroHs/MRnf.hs
+++ /dev/null
@@ -1,34 +0,0 @@
-module MicroHs.MRnf where
-import Prelude(); import MHSPrelude
-import Data.Text
-import Data.Version
-import System.IO.MD5(MD5CheckSum)
-
-class MRnf a where
-  mrnf :: a -> ()
-  mrnf a = seq a ()
-
-instance MRnf Int
-instance MRnf Char
-instance (MRnf a, MRnf b) => MRnf (a, b) where
-  mrnf (a, b) = mrnf a `seq` mrnf b
-instance (MRnf a, MRnf b) => MRnf (Either a b) where
-  mrnf (Left a) = mrnf a
-  mrnf (Right a) = mrnf a
-instance MRnf a => MRnf [a] where
-  mrnf [] = ()
-  mrnf (x:xs) = mrnf x `seq` mrnf xs
-instance MRnf a => MRnf (Maybe a) where
-  mrnf Nothing = ()
-  mrnf (Just x) = mrnf x
-instance MRnf Text
-instance MRnf Version where
-  mrnf v = mrnf (versionBranch v)
-instance MRnf Rational where
-  mrnf x = (x == 0) `seq` ()
-instance MRnf Double
-instance MRnf Integer where
-  mrnf x = (x == 0) `seq` ()
-instance MRnf Bool
-instance MRnf (a -> b)
-instance MRnf MD5CheckSum  -- Not quite NF, but close
diff --git a/src/MicroHs/Main.hs b/src/MicroHs/Main.hs
--- a/src/MicroHs/Main.hs
+++ b/src/MicroHs/Main.hs
@@ -2,7 +2,7 @@
 -- See LICENSE file for full license.
 {-# OPTIONS_GHC -Wno-unused-do-bind -Wno-unused-imports #-}
 module MicroHs.Main(main) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Data.Char
 import Data.List
 import Data.Version
@@ -30,7 +30,6 @@
 import System.IO
 import System.IO.Serialize
 import System.IO.TimeMilli
-import MicroHs.Instances() -- for GHC
 import MicroHs.TargetConfig
 import Paths_MicroHs(getDataDir)
 
@@ -40,32 +39,75 @@
   dir <- getMhsDir
   dataDir <- getDataDir
   case args of
-   ["--version"] -> putStrLn $ "MicroHs, version " ++ mhsVersion ++ ", combinator file version " ++ combVersion
-   ["--numeric-version"] -> putStrLn mhsVersion
-   _ -> do
-    let dflags = (defaultFlags dir){ pkgPath = pkgPaths }
-        (flags, mdls, rargs) = decodeArgs dflags [] args
-        pkgPaths | dir == dataDir && dir /= "." = [takeDirectory $ takeDirectory $ takeDirectory dataDir]   -- This is a bit ugly
-                 | otherwise                    = []                        -- No package search path
-    when (verbosityGT flags 1) $
-      putStrLn $ "flags = " ++ show flags
-    case listPkg flags of
-      Just p -> mainListPkg flags p
-      Nothing ->
-        case buildPkg flags of
-          Just p -> mainBuildPkg flags p mdls
-          Nothing ->
-            if installPkg flags then mainInstallPackage flags mdls else
-            withArgs rargs $ do
-              case mdls of
-                []  | null (cArgs flags) -> mainInteractive flags
-                    | otherwise -> mainCompileC flags [] ""
-                [s] -> mainCompile flags (mkIdentSLoc (SLoc "command-line" 0 0) s)
-                _   -> error usage
+    ["-h"] -> putStrLn usage
+    ["-?"] -> putStrLn usage
+    ["--help"] -> putStrLn longUsage
+    ["--version"] -> putStrLn $ "MicroHs, version " ++ mhsVersion ++ ", combinator file version " ++ combVersion
+    ["--numeric-version"] -> putStrLn mhsVersion
+    _ -> do
+      let dflags = (defaultFlags dir){ pkgPath = pkgPaths }
+          (flags, mdls, rargs) = decodeArgs dflags [] args
+          pkgPaths | dir == dataDir && dir /= "." = [takeDirectory $ takeDirectory $ takeDirectory dataDir]   -- This is a bit ugly
+                   | otherwise                    = []                        -- No package search path
+      when (verbosityGT flags 1) $
+        putStrLn $ "flags = " ++ show flags
+      case listPkg flags of
+        Just p -> mainListPkg flags p
+        Nothing ->
+          case buildPkg flags of
+            Just p -> mainBuildPkg flags p mdls
+            Nothing ->
+              if installPkg flags then mainInstallPackage flags mdls else
+              withArgs rargs $ do
+                case mdls of
+                  []  | null (cArgs flags) -> mainInteractive flags
+                      | otherwise -> mainCompileC flags [] ""
+                  [s] -> mainCompile flags (mkIdentSLoc (SLoc "command-line" 0 0) s)
+                  _   -> error usage
 
 usage :: String
-usage = "Usage: mhs [--version] [--numeric-version] [-v] [-q] [-l] [-s] [-r] [-C[R|W]] [-XCPP] [-DDEF] [-IPATH] [-T] [-z] [-iPATH] [-oFILE] [-a[PATH]] [-L[PATH|PKG]] [-PPKG] [-Q PKG [DIR]] [-tTARGET] [-optc OPTION] [MODULENAME..|FILE]"
+usage = "Usage: mhs [-h|?] [--help] [--version] [--numeric-version] [-v] [-q] [-l] [-s] [-r] [-C[R|W]] [-XCPP] [-DDEF] [-IPATH] [-T] [-z] [-iPATH] [-oFILE] [-a[PATH]] [-L[PATH|PKG]] [-PPKG] [-Q PKG [DIR]] [-tTARGET] [-optc OPTION] [-ddump-PASS] [MODULENAME..|FILE]"
 
+longUsage :: String
+longUsage = usage ++ "\nOptions:\n" ++ details
+  where
+    details = "\
+      \-h                 Print usage\n\
+      \-?                 Print usage\n\
+      \--help             Print this message\n\
+      \--version          Print the version\n\
+      \--numeric-version  Print the version number\n\
+      \-v                 Increase verbosity (flag can be repeated)\n\
+      \-q                 Decrease verbosity (flag can be repeated)\n\
+      \-l                 Show every time a module is loaded\n\
+      \-s                 Show compilation speed in lines/s\n\
+      \-r                 Run directly\n\
+      \-CR                Read compilation cache\n\
+      \-CW                Write compilation cache\n\
+      \-C                 Read and write compilation cache\n\
+      \-XCPP              Run cpphs on source files\n\
+      \-Dxxx              Pass -Dxxx to cpphs\n\
+      \-Ixxx              Pass -Ixxx to cpphs\n\
+      \-T                 Generate dynamic function usage statistics\n\
+      \-z                 Compress combinator code generated in the .c file\n\
+      \-iPATH             Add PATH to module search path\n\
+      \-oFILE             Output to FILE\n\
+      \                   If FILE ends in .comb produce a combinator file\n\
+      \                   If FILE ends in .c produce a C file\n\
+      \                   Otherwise compile the combinators together with the runtime system to produce a regular executable\n\
+      \-a                 Clear package search path\n\
+      \-aPATH             Add PATH to package search path\n\
+      \-LPKG              List all modules of package PKG\n\
+      \-PPKG              Build package PKG\n\
+      \-Q PKG [DIR]       Install package PKG\n\
+      \-tTARGET           Select target\n\
+      \                   Distributed targets: default, emscripten\n\
+      \                   Targets can be defined in targets.conf\n\
+      \-optc OPTION       Options for the C compiler\n\
+      \-ddump-PASS        Debug, print AST after PASS\n\
+      \                   Possible passes: parse, derive, typecheck, desugar, toplevel, combinator, all\n\
+      \"
+
 decodeArgs :: Flags -> [String] -> [String] -> (Flags, [String], [String])
 decodeArgs f mdls [] = (f, mdls, [])
 decodeArgs f mdls (arg:args) =
@@ -78,7 +120,7 @@
     "-s"        -> decodeArgs f{speed = True} mdls args
     "-CR"       -> decodeArgs f{readCache = True} mdls args
     "-CW"       -> decodeArgs f{writeCache = True} mdls args
-    "-C"        -> decodeArgs f{readCache=True, writeCache = True} mdls args
+    "-C"        -> decodeArgs f{readCache = True, writeCache = True} mdls args
     "-T"        -> decodeArgs f{useTicks = True} mdls args
     "-XCPP"     -> decodeArgs f{doCPP = True} mdls args
     "-z"        -> decodeArgs f{compress = True} mdls args
@@ -97,18 +139,21 @@
     '-':'a':[]  -> decodeArgs f{pkgPath = []} mdls args
     '-':'a':s   -> decodeArgs f{pkgPath = pkgPath f ++ [s]} mdls args
     '-':'L':s   -> decodeArgs f{listPkg = Just s} mdls args
+    '-':'d':'d':'u':'m':'p':'-':r | Just d <- lookup r dumpFlagTable ->
+                   decodeArgs f{dumpFlags = d : dumpFlags f} mdls args
     '-':_       -> error $ "Unknown flag: " ++ arg ++ "\n" ++ usage
     _ | arg `hasTheExtension` ".c" || arg `hasTheExtension` ".o" || arg `hasTheExtension` ".a"
                 -> decodeArgs f{cArgs = cArgs f ++ [arg]} mdls args
       | otherwise
                 -> decodeArgs f (mdls ++ [arg]) args
-
+  where
+    dumpFlagTable = [(drop 1 $ show d, d) | d <- [minBound..maxBound]]
 
 readTargets :: Flags -> FilePath -> IO [Target]
 readTargets flags dir = do
   let tgFilePath = dir </> "targets.conf"
   exists <- doesFileExist tgFilePath
-  if not exists 
+  if not exists
      then return []
      else do
        tgFile <- readFile tgFilePath
@@ -120,7 +165,7 @@
            return []
          Right tgs -> do
            when (verbose flags > 0) $
-             putStrLn $ "Read targets file. Possible targets: " ++ show 
+             putStrLn $ "Read targets file. Possible targets: " ++ show
                [tg | Target tg _ <- tgs]
            return tgs
 
@@ -174,7 +219,7 @@
   writeSerializedCompressed (output flags) (forcePackage pkg)
   t2 <- getTimeMilli
   when (verbose flags > 0) $
-    putStrLn $ "Compression time " ++ show (t2 - t1) ++ " ms"  
+    putStrLn $ "Compression time " ++ show (t2 - t1) ++ " ms"
 
 splitNameVer :: String -> (String, Version)
 splitNameVer s =
@@ -229,9 +274,11 @@
     numDefs = length allDefs
   when (verbosityGT flags 0) $
     putStrLn $ "top level defns:      " ++ padLeft 6 (show numOutDefs) ++ " (unpruned " ++ show numDefs ++ ")"
-  when (verbosityGT flags 2) $
+  dumpIf flags Dtoplevel $
     mapM_ (\ (i, e) -> putStrLn $ showIdent i ++ " = " ++ toStringP e "") allDefs
   if runIt flags then do
+    unless compiledWithMhs $ do
+      error "The -r flag currently only works with mhs"
     let
       prg = translateAndRun cmdl
 --    putStrLn "Run:"
@@ -324,8 +371,8 @@
   mapM_ mk (pkgExported pkg)
 mainInstallPackage flags [pkgfn] =
   case pkgPath flags of
-    [] -> error $ "pkgPath is empty"
-    first:_ -> mainInstallPackage flags [pkgfn, first]
+    [] -> error "pkgPath is empty"
+    frst:_ -> mainInstallPackage flags [pkgfn, frst]
 mainInstallPackage _ _ = error usage
 
 mainListPackages :: Flags -> IO ()
@@ -348,4 +395,4 @@
 convertToInclude inc pkg = dropExtension pkg </> inc
 
 hasTheExtension :: FilePath -> String -> Bool
-hasTheExtension f e = isSuffixOf e f
+hasTheExtension f e = e `isSuffixOf` f
diff --git a/src/MicroHs/MakeCArray.hs b/src/MicroHs/MakeCArray.hs
--- a/src/MicroHs/MakeCArray.hs
+++ b/src/MicroHs/MakeCArray.hs
@@ -1,7 +1,7 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
 module MicroHs.MakeCArray(makeCArray) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Data.Char
 import MicroHs.Flags
 import qualified System.Compress as C
diff --git a/src/MicroHs/Names.hs b/src/MicroHs/Names.hs
new file mode 100644
--- /dev/null
+++ b/src/MicroHs/Names.hs
@@ -0,0 +1,136 @@
+-- Copyright 2025 Lennart Augustsson
+-- See LICENSE file for full license.
+module MicroHs.Names where
+import qualified Prelude(); import MHSPrelude
+import MicroHs.Ident
+
+-- Identifiers known by the compiler.
+
+builtinLoc :: SLoc
+builtinLoc = SLoc "builtin" 0 0
+
+mkIdentB :: String -> Ident
+mkIdentB = mkIdentSLoc builtinLoc
+
+boolPrefix :: String
+boolPrefix = "Data.Bool_Type."
+
+listPrefix :: String
+listPrefix = "Data.List_Type."
+
+nameList :: String
+nameList = listPrefix ++ "[]"
+identList :: Ident
+identList = mkIdentB nameList
+
+nameInt :: String
+nameInt = "Primitives.Int"
+identInt :: Ident
+identInt = mkIdentB nameInt
+
+nameWord :: String
+nameWord = "Primitives.Word"
+identWord :: Ident
+identWord = mkIdentB nameWord
+
+nameFloatW :: String
+nameFloatW = "Primitives.FloatW"
+identFloatW :: Ident
+identFloatW = mkIdentB nameFloatW
+
+nameChar :: String
+nameChar = "Primitives.Char"
+identChar :: Ident
+identChar = mkIdentB nameChar
+
+nameInteger :: String
+nameInteger = "Data.Integer_Type.Integer"
+identInteger :: Ident
+identInteger = mkIdentB nameInteger
+
+nameTypeEq :: String
+nameTypeEq = "Primitives.~"
+identTypeEq :: Ident
+identTypeEq = mkIdentB nameTypeEq
+
+nameImplies :: String
+nameImplies = "Primitives.=>"
+identImplies :: Ident
+identImplies = mkIdentB nameImplies
+
+nameArrow :: String
+nameArrow = "Primitives.->"
+identArrow :: Ident
+identArrow = mkIdentB nameArrow
+
+nameSymbol :: String
+nameSymbol = "Primitives.Symbol"
+
+nameNat :: String
+nameNat = "Primitives.Nat"
+
+nameType :: String
+nameType = "Primitives.Type"
+
+nameKind :: String
+nameKind = "Primitives.Kind"
+
+nameConstraint :: String
+nameConstraint = "Primitives.Constraint"
+
+nameKnownNat :: String
+nameKnownNat = "Data.TypeLits.KnownNat"
+
+nameKnownSymbol :: String
+nameKnownSymbol = "Data.TypeLits.KnownSymbol"
+
+nameCoercible :: String
+nameCoercible = "Data.Coerce.Coercible"
+
+nameHasField :: String
+nameHasField = "Data.Records.HasField"
+
+nameSetField :: String
+nameSetField = "Data.Records.SetField"
+
+namegetField :: String
+namegetField = "getField"
+
+namesetField :: String
+namesetField = "setField"
+
+nameByteString :: String
+nameByteString = "Data.ByteString.Internal.ByteString"
+identByteString :: Ident
+identByteString = mkIdentB nameByteString
+
+identIO :: Ident
+identIO = mkIdentB "Primitives.IO"
+
+identUnit :: Ident
+identUnit = mkIdentB "()"
+
+identPtr :: Ident
+identPtr = mkIdentB "Primitives.Ptr"
+
+identFunPtr :: Ident
+identFunPtr = mkIdentB "Primitives.FunPtr"
+
+-----
+
+instPrefix :: String
+instPrefix = "inst"
+
+uniqIdentSep :: String
+uniqIdentSep = "$"
+
+-- Needed dictionaries
+dictPrefix :: String
+dictPrefix = "dict"
+
+dictPrefixDollar :: String
+dictPrefixDollar = dictPrefix ++ uniqIdentSep
+
+-- Dictionary argument names
+adictPrefix :: String
+adictPrefix = "adict"
diff --git a/src/MicroHs/Package.hs b/src/MicroHs/Package.hs
--- a/src/MicroHs/Package.hs
+++ b/src/MicroHs/Package.hs
@@ -3,11 +3,10 @@
   Package(..),
   forcePackage,
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Data.Version
 import MicroHs.Desugar(LDef)
 import MicroHs.Ident(Ident)
-import MicroHs.MRnf
 import MicroHs.TypeCheck(TModule, GlobTables)
 
 --
@@ -23,7 +22,7 @@
 --   Foo/Bar.txt
 --   Foo/Baz.txt
 -- The files Foo/Bar.txt and Foo/Baz.txt will contain simply "foo.pkg".
--- 
+--
 
 type IdentPackage = Ident
 
@@ -38,10 +37,9 @@
   }
   -- deriving (Show)
 
-instance MRnf Package where
-  mrnf (Package a b c d e f g) = mrnf a `seq` mrnf b `seq` mrnf c `seq` mrnf d `seq` mrnf e `seq` mrnf f `seq` mrnf g
+instance NFData Package where
+  rnf (Package a b c d e f g) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e `seq` rnf f `seq` rnf g
 
 -- Fully evaluate a package
 forcePackage :: Package -> Package
-forcePackage p = mrnf p `seq` p
-
+forcePackage p = force p
diff --git a/src/MicroHs/Parse.hs b/src/MicroHs/Parse.hs
--- a/src/MicroHs/Parse.hs
+++ b/src/MicroHs/Parse.hs
@@ -2,24 +2,29 @@
 -- See LICENSE file for full license.
 {-# OPTIONS_GHC -Wno-incomplete-uni-patterns -Wno-unused-do-bind #-}
 module MicroHs.Parse(P, pTop, pTopModule, parseDie, parse, pExprTop, keywords, dotDotIdent) where
-import Prelude(); import MHSPrelude hiding ((*>))
-import Control.Applicative hiding ((*>))
+import qualified Prelude(); import MHSPrelude hiding ((*>), (<*))
+import Control.Applicative hiding ((*>), (<*))
 import Control.Monad
 import Control.Monad.Fail
 import Data.Char
 import Data.List
 import Text.ParserComb as P
 import MicroHs.Lex
+import MicroHs.List
 import MicroHs.Expr hiding (getSLoc)
 import qualified MicroHs.Expr as E
 import MicroHs.Ident
 --import Debug.Trace
 
 -- Hugs can't define the efficient *>
-infixl 4 *>
+infixl 4 *>, <*
 (*>) :: Prsr s t a -> Prsr s t b -> Prsr s t b
 (*>) = (>>)
 
+-- Slightly faster than the <* from Applicative
+(<*) :: Prsr s t a -> Prsr s t b -> Prsr s t a
+(<*) = (<<)
+
 type P a = Prsr LexState Token a
 
 parseDie :: forall a . (Show a) =>
@@ -35,9 +40,8 @@
   let { ts = lexTopLS fn file } in
   case runPrsr p ts of
     Left lf -> Left $ formatFailed lf
-    Right [a] -> Right a
-    Right as -> Left $ "Ambiguous:"
-                       ++ unlines (map show as)
+    Right a -> Right a
+
 guardM :: P a -> (a -> Bool) -> P a
 guardM ma p = do a <- ma; guard (p a); pure a
 
@@ -51,10 +55,10 @@
   t <- nextToken
   case t of
     TEnd _ -> pure ()
-    _      -> Control.Monad.Fail.fail "expected eof"
+    _      -> Control.Monad.Fail.fail "eof"
 
 pTop :: P EModule
-pTop = (pModule <|< pModuleEmpty) <* eof
+pTop = (pModule <|> pModuleEmpty) <* eof
 
 pTopModule :: P EModule
 pTopModule = pModule <* eof
@@ -66,8 +70,8 @@
 pModule = do
   pKeyword "module"
   mn <- pUQIdentA
-  exps <- (pSpec '(' *> esepEndBy pExportItem (pSpec ',') <* pSpec ')')
-      <|< pure [ExpModule mn]
+  exps <- (pSpec '(' *> sepEndBy pExportItem (pSpec ',') <* pSpec ')')
+      <|> pure [ExpModule mn]
   pKeyword "where"
   defs <- pBlock pDef
   pure $ EModule mn exps defs
@@ -98,11 +102,11 @@
 pUIdent :: P Ident
 pUIdent =
       pUIdentA
-  <|< pUIdentSpecial
+  <|> pUIdentSpecial
 
 -- Upper case, unqualified, identifier or symbol
 pUIdentSym :: P Ident
-pUIdentSym = pUIdent <|< pParens pUSymOper
+pUIdentSym = pUIdent <|> pParens pUSymOper
 
 -- Special "identifiers": [] (,) ...
 pUIdentSpecial :: P Ident
@@ -110,8 +114,8 @@
   loc <- getSLoc
   let
     mk = mkIdentSLoc loc
-  (mk . map (const ',') <$> (pSpec '(' *> esome (pSpec ',') <* pSpec ')'))
-    <|< (mk "[]" <$ (pSpec '[' *> pSpec ']'))  -- Allow [] as a constructor name
+  (mk . map (const ',') <$> (pSpec '(' *> some (pSpec ',') <* pSpec ')'))
+    <|> (mk "[]" <$ (pSpec '[' *> pSpec ']'))  -- Allow [] as a constructor name
 
 -- Upper case, possibly qualified, alphanumeric identifier
 pUQIdentA :: P Ident
@@ -125,13 +129,13 @@
 pUQIdent :: P Ident
 pUQIdent =
       pUQIdentA
-  <|< pUIdentSpecial
+  <|> pUIdentSpecial
 
 -- Lower case, unqualified identifier
 pLIdent :: P Ident
 pLIdent = do
   let
-    is (TIdent loc [] s) | isLower_ (head s) && not (elem s keywords) = Just (mkIdentSLoc loc s)
+    is (TIdent loc [] s) | isLower_ (head s) && not (isKeyword s) = Just (mkIdentSLoc loc s)
     is _ = Nothing
   satisfyM "LIdent" is
 
@@ -139,42 +143,71 @@
 pLQIdent :: P Ident
 pLQIdent = do
   let
-    is (TIdent loc qs s) | isLower_ (head s) && not (elem s keywords) = Just (qualName loc qs s)
+    is (TIdent loc qs s) | isLower_ (head s) && not (isKeyword s) = Just (qualName loc qs s)
     is _ = Nothing
   satisfyM "LQIdent" is
 
 -- Type names can be any operator
 pTypeIdentSym :: P Ident
-pTypeIdentSym = pUIdent <|< pParens pSymOper
+pTypeIdentSym = pUIdent <|> pParens pSymOper
 
+-- A binary search for keywords saves about 1% compared to linear search.
+{-
+isKeyword s = elem s keywords
+-}
+isKeyword :: String -> Bool
+isKeyword s =
+  case compare s "in" of
+    EQ -> True
+    LT -> case compare s "deriving" of
+            EQ -> True
+            LT -> case compare s "class" of
+                    EQ -> True
+                    LT -> s == "_primitive" || s == "case"
+                    GT -> s == "data" || s == "default"
+            GT -> case compare s "forall" of
+                    EQ -> True
+                    LT -> s == "do" || s == "else"
+                    GT -> s == "foreign" || s == "if" || s == "import"
+    GT -> case compare s "newtype" of
+            EQ -> True
+            LT -> case compare s "infixr" of
+                    EQ -> True
+                    LT -> s == "infix" || s == "infixr"
+                    GT -> s == "instance" || s == "let" || s == "module"
+            GT -> case compare s "then" of
+                    EQ -> True
+                    LT -> s == "of" || s == "pattern"
+                    GT -> s == "type" || s == "where"
+
 keywords :: [String]
 keywords =
-  ["case", "class", "data", "default", "deriving", "do", "else", "forall", "foreign", "if",
+  ["_primitive", "case", "class", "data", "default", "deriving", "do", "else", "forall", "foreign", "if",
    "import", "in", "infix", "infixl", "infixr", "instance",
-   "let", "module", "newtype", "of", "pattern", "_primitive", "then", "type", "where"]
+   "let", "module", "newtype", "of", "pattern", "then", "type", "where"]
 
 pSpec :: Char -> P ()
-pSpec c = () <$ satisfy (showToken $ TSpec (SLoc "" 0 0) c) is
+pSpec c = void (satisfy (showToken $ TSpec (SLoc "" 0 0) c) is)
   where
     is (TSpec _ d) = c == d
     is _ = False
 
 pSymbol :: String -> P ()
-pSymbol sym = () <$ satisfy sym is
+pSymbol sym = void (satisfy sym is)
   where
     is (TIdent _ [] s) = s == sym
     is _ = False
 
 pOper :: P Ident
-pOper = pQSymOper <|< (pSpec '`' *> pQIdent <* pSpec '`')
+pOper = pQSymOper <|> (pSpec '`' *> pQIdent <* pSpec '`')
 
 pUOper :: P Ident
-pUOper = pUQSymOper <|< (pSpec '`' *> pUQIdent <* pSpec '`')
+pUOper = pUQSymOper <|> (pSpec '`' *> pUQIdent <* pSpec '`')
 
 pQSymOper :: P Ident
 pQSymOper = do
   let
-    is (TIdent loc qs s) | not (isAlpha_ (head s)) && not (elem s reservedOps) = Just (qualName loc qs s)
+    is (TIdent loc qs s) | not (isAlpha_ (head s)) && s `notElem` reservedOps = Just (qualName loc qs s)
     is (TSpec  loc '!') = Just (mkIdentSLoc loc "!")
     is (TSpec  loc '~') = Just (mkIdentSLoc loc "~")
     is _ = Nothing
@@ -183,8 +216,9 @@
 pSymOper :: P Ident
 pSymOper = do
   let
-    is (TIdent loc [] s) | not (isAlpha_ (head s)) && not (elem s reservedOps) = Just (mkIdentSLoc loc s)
+    is (TIdent loc [] s) | not (isAlpha_ (head s)) && s `notElem` reservedOps = Just (mkIdentSLoc loc s)
     is (TSpec  loc '!') = Just (mkIdentSLoc loc "!")
+    is (TSpec  loc '~') = Just (mkIdentSLoc loc "~")
     is _ = Nothing
   satisfyM "SymOper" is
 
@@ -202,7 +236,7 @@
 
 -- Allow -> as well
 pLQSymOperArr :: P Ident
-pLQSymOperArr = pLQSymOper <|< pQArrow
+pLQSymOperArr = pLQSymOper <|> pQArrow
 
 -- Parse ->, possibly qualified
 pQArrow :: P Ident
@@ -217,17 +251,17 @@
 pLSymOper = guardM pSymOper (not . isUOper)
 
 reservedOps :: [String]
-reservedOps = ["::", "<-", "..", "->",
-               "\x2237", "\x2192"] -- :: and ->
+reservedOps = ["::", "<-", "..", "->", "=>",
+               "\x2237", "\x2192", "\x21d2"] -- ::, -> and =>
 
 pUQIdentSym :: P Ident
-pUQIdentSym = pUQIdent <|< pParens pUQSymOper
+pUQIdentSym = pUQIdent <|> pParens pUQSymOper
 
 pLQIdentSym :: P Ident
-pLQIdentSym = pLQIdent <|< pParens pLQSymOperArr
+pLQIdentSym = pLQIdent <|> pParens pLQSymOperArr
 
 pLIdentSym :: P Ident
-pLIdentSym = pLIdent <|< pParens pLSymOper
+pLIdentSym = pLIdent <|> pParens pLSymOper
 
 pParens :: forall a . P a -> P a
 pParens p = pSpec '(' *> p <* pSpec ')'
@@ -259,21 +293,21 @@
 pExportItem :: P ExportItem
 pExportItem =
       ExpModule   <$> (pKeyword "module" *> pUQIdent)
-  <|< ExpTypeSome <$> pUQIdentSym <*> pParens pConList
-  <|< ExpTypeSome <$> pUQIdentSym <*> pure []
-  <|< ExpValue    <$> pLQIdentSym
-  <|< ExpValue    <$> (pKeyword "pattern" *> pUQIdentSym)
-  <|< ExpTypeSome <$> (pKeyword "type" *> pLQIdentSym) <*> pure []
-  <|< ExpDefault  <$> (pKeyword "default" *> pUQIdentSym)
+  <|> ExpTypeSome <$> pUQIdentSym <*> pParens pConList
+  <|> ExpTypeSome <$> pUQIdentSym <*> pure []
+  <|> ExpValue    <$> pLQIdentSym
+  <|> ExpValue    <$> (pKeyword "pattern" *> pUQIdentSym)
+  <|> ExpTypeSome <$> (pKeyword "type" *> pLQIdentSym) <*> pure []
+  <|> ExpDefault  <$> (pKeyword "default" *> pUQIdentSym)
 
 pKeyword :: String -> P ()
-pKeyword kw = () <$ satisfy kw is
+pKeyword kw = void (satisfy kw is)
   where
     is (TIdent _ [] s) = kw == s
     is _ = False
 
 pPragma :: String -> P ()
-pPragma kw = () <$ satisfy kw is
+pPragma kw = void (satisfy kw is)
   where
     is (TPragma _ s) = kw == s
     is _ = False
@@ -285,7 +319,7 @@
     as <- p
     pSpec '}'
     pure as
- <|<
+ <|>
   do
     pSpec '<'          -- synthetic '{' (i.e., layout)
     as <- p
@@ -302,30 +336,30 @@
 
 pBlock :: forall a . P a -> P [a]
 pBlock p = pBraces body
-  where body = esepBy p (esome (pSpec ';')) <* eoptional (pSpec ';')
+  where body = sepBy p (some (pSpec ';')) <* optional (pSpec ';')
 
 
 pDef :: P EDef
 pDef =
       pBind        -- Fcn, Sign, PatBind, Infix
-  <|< uncurry Data <$> (pKeyword "data"     *> pData) <*> pDeriving
-  <|< Newtype      <$> (pKeyword "newtype"  *> pLHS) <*> (pSpec '=' *> (Constr [] [] <$> pUIdentSym <*> pField)) <*> pDeriving
-  <|< Type         <$> (pKeyword "type"     *> pLHS) <*> (pSpec '=' *> pType)
-  <|< Import       <$> (pKeyword "import"   *> pImportSpec)
-  <|< ForImp       <$> (pKeyword "foreign"  *> pKeyword "import" *> (pKeyword "ccall" <|> pKeyword "capi")
-                        *> eoptional (pKeyword "unsafe") *> eoptional pString) <*> pLIdent <*> (dcolon *> pType)
-  <|< Class        <$> (pKeyword "class"    *> pContext) <*> pLHS <*> pFunDeps     <*> pWhere pClsBind
-  <|< Instance     <$> (pKeyword "instance" *> pType) <*> pWhere pInstBind
-  <|< Default      <$> (pKeyword "default"  *> eoptional clsSym) <*> pParens (esepBy pType (pSpec ','))
-  <|< KindSign     <$> (pKeyword "type"     *> pTypeIdentSym) <*> (dcolon *> pKind)
-  <|< mkPattern    <$> (pKeyword "pattern"  *> pPatSyn)
-  <|< Sign         <$> (pKeyword "pattern"  *> (esepBy1 pUIdentSym (pSpec ',')) <* dcolon) <*> pType
-  <|< Deriving     <$> (pKeyword "deriving" *> pKeyword "instance" *> pType)
-  <|< noop         <$  (pKeyword "type"     <* pKeyword "role" <* pTypeIdentSym <*
+  <|> uncurry Data <$> (pKeyword "data"     *> pData) <*> pDerivings
+  <|> Newtype      <$> (pKeyword "newtype"  *> pLHS) <*> (pSpec '=' *> (Constr [] [] <$> pUIdentSym <*> pField)) <*> pDerivings
+  <|> Type         <$> (pKeyword "type"     *> pLHS) <*> (pSpec '=' *> pType)
+  <|> Import       <$> (pKeyword "import"   *> pImportSpec)
+  <|> ForImp       <$> (pKeyword "foreign"  *> pKeyword "import" *> (pKeyword "ccall" <|> pKeyword "capi")
+                        *> optional (pKeyword "unsafe") *> optional pString) <*> pLIdent <*> (dcolon *> pType)
+  <|> Class        <$> (pKeyword "class"    *> pContext) <*> pLHS <*> pFunDeps     <*> pWhere pClsBind
+  <|> Instance     <$> (pKeyword "instance" *> pType) <*> pWhere pInstBind
+  <|> Default      <$> (pKeyword "default"  *> optional clsSym) <*> pParens (sepBy pType (pSpec ','))
+  <|> KindSign     <$> (pKeyword "type"     *> pTypeIdentSym) <*> (dcolon *> pKind)
+  <|> mkPattern    <$> (pKeyword "pattern"  *> pPatSyn)
+  <|> Sign         <$> (pKeyword "pattern"  *> sepBy1 pUIdentSym (pSpec ',') <* dcolon) <*> pType
+  <|> StandDeriving<$> (pKeyword "deriving" *> pStrat) <*> pure 0 <*> (pKeyword "instance" *> pType)
+  <|> noop         <$  (pKeyword "type"     <* pKeyword "role" <* pTypeIdentSym <*
                                                (pKeyword "nominal" <|> pKeyword "phantom" <|> pKeyword "representational"))
   where
-    pFunDeps = (pSpec '|' *> esepBy1 pFunDep (pSpec ',')) <|< pure []
-    pFunDep = (,) <$> esome pLIdent <*> (pSRArrow *> esome pLIdent)
+    pFunDeps = (pSpec '|' *> sepBy1 pFunDep (pSpec ',')) <|> pure []
+    pFunDep = (,) <$> some pLIdent <*> (pSRArrow *> some pLIdent)
     pField = guardM pFields ((== 1) . either length length)
 
     clsSym = do s <- pUIdentSym; guard (unIdent s /= "()"); return s
@@ -333,6 +367,9 @@
     mkPattern (lhs, pat, meqn) = Pattern lhs pat meqn
     noop = Infix (AssocLeft, 0) []        -- harmless definition
 
+    pStrat = (DerVia <$> (pKeyword "via" *> pAType)) <|> pSimpleStrat
+
+
 pPatSyn :: P (LHS, EPat, Maybe [Eqn])
 pPatSyn = do
   lhs@(i, vs) <- pLHS
@@ -349,7 +386,7 @@
    )
 
 dcolon :: P ()
-dcolon = pSymbol "::" <|< pSymbol "\x2237"
+dcolon = pSymbol "::" <|> pSymbol "\x2237"
 
 -- Is a pattern also an expression?
 isExp :: Expr -> Bool
@@ -363,10 +400,10 @@
 pData :: P (LHS, [Constr])
 pData = do
   lhs <- pLHS
-  let pConstrs = pSpec '=' *> esepBy1 pConstr (pSpec '|')
+  let pConstrs = pSpec '=' *> sepBy1 pConstr (pSpec '|')
   ((,) lhs <$> pConstrs)
-   <|< pGADT lhs
-   <|< pure (lhs, [])
+   <|> pGADT lhs
+   <|> pure (lhs, [])
 
 pGADT :: LHS -> P (LHS, [Constr])
 pGADT (n, vks) = do
@@ -382,52 +419,68 @@
   dcolon
   es <- pForall
   ctx <- pContext
-  args <- emany (pSTypeApp <* pSymbol "->")
+  args <- many (pSTypeApp <* pSymbol "->")
   res <- pType
   pure (cn, es, ctx, args, res)
 
 dsGADT :: LHS -> (Ident, [IdKind], [EConstraint], [SType], EType) -> Constr
 dsGADT (tnm, vks) (cnm, es, ctx, stys, rty) =
   case getAppM rty of
-    Just (tnm', ts) | tnm == tnm' && length vks == length ts -> Constr es' ctx' cnm (Left stys)
-      where es' = if null es then map (\ i -> IdKind i (EVar dummyIdent)) (freeTyVars (rty : map snd stys)) else es
+    Just (tnm', ts) | tnm == tnm' && length vks == length ts ->
+        -- Check if we can use a regular constructor
+        case zipWithM mtch vks ts of
+          -- Result type is just type variables, so use it as is
+          Just sub | not (anySame (map fst sub))
+            -> Constr es'' ctx  cnm (Left stys')
+                        where stys' = map (second $ subst sub) stys
+                              es'' = if null es then kind (freeTyVars (map snd stys) \\ map fst sub) else es
+          _ -> Constr es'  ctx' cnm (Left stys)
+      where es' = if null es then kind (freeTyVars (rty : map snd stys)) else es
             ctx' = zipWith (\ (IdKind i _) t -> eq (EVar i) t) vks ts ++ ctx
             eq t1 t2 = EApp (EApp (EVar (mkIdentSLoc (E.getSLoc t1) "~")) t1) t2
+            mtch (IdKind i _) (EVar i') | not (isConIdent i') = Just (i', EVar i)
+            mtch _ _ = Nothing
+            kind = map (\ i -> IdKind i (EVar dummyIdent))
     _ -> errorMessage (E.getSLoc rty) $ "Bad GADT result type" ++ show (rty, tnm, vks)
 
-pDeriving :: P [EConstraint]
-pDeriving = pKeyword "deriving" *> pDer <|< pure []
-  where pDer =     pParens (esepBy pType (pSpec ','))
-               <|< ((:[]) <$> pType)
+pDerivings :: P [Deriving]
+pDerivings = many pDeriving
 
+pDeriving :: P Deriving
+pDeriving = pKeyword "deriving" *> (    (flip Deriving <$> pDer <*> pVia)
+                                    <|> (Deriving <$> pSimpleStrat <*> pDer) )
+  where pDer = map ((,) 0) <$>
+                   (    pParens (sepBy pType (pSpec ','))
+                    <|> ((:[]) <$> pAType) )
+        pVia = DerVia <$> (pKeyword "via" *> pAType)
+
+pSimpleStrat :: P DerStrategy
+pSimpleStrat = (DerStock <$ pKeyword "stock") <|> (DerNewtype <$ pKeyword "newtype")
+           <|> (DerAnyClass <$ pKeyword "anyclass") <|> pure DerNone
+
 -- List has 0 or 1 elements
 pContext :: P [EConstraint]
-pContext = (pCtx <* pDRArrow) <|< pure []
+pContext = (pCtx <* pDRArrow) <|> pure []
   where
-    pCtx =     ((:[]) <$> pTypeApp)
-           <|> (eq <$> pTypeArg <*> pTilde <*> pTypeArg)   -- A hack to allow   a~b => ...
-    eq t1 i t2 = [eAppI2 i t1 t2]
-    pTilde = do i <- pQSymOper; guard (i == mkIdent "~"); return i
+    pCtx = (:[]) <$> pOperators pOper pTypeArg
 
 pDRArrow :: P ()
-pDRArrow = pSymbol "=>" <|< pSymbol "\x21d2"
+pDRArrow = pSymbol "=>" <|> pSymbol "\x21d2"
 
 pSRArrow :: P ()
-pSRArrow = pSymbol "->" <|< pSymbol "\x2192"
+pSRArrow = pSymbol "->" <|> pSymbol "\x2192"
 
 pSLArrow :: P ()
-pSLArrow = pSymbol "<-" <|< pSymbol "\x2190"
+pSLArrow = pSymbol "<-" <|> pSymbol "\x2190"
 
 pConstr :: P Constr
-pConstr = (Constr <$> pForall <*> pContext <*> pUIdentSym <*> pFields)
-      <|> ((\ vs ct t1 c t2 -> Constr vs ct c (Left [t1, t2])) <$>        -- <|> needed
-            pForall <*> pContext <*> pSTypeApp <*> pUSymOper <*> pSTypeApp)
+pConstr = ((\ vs ct t1 c t2 -> Constr vs ct c (Left [t1, t2])) <$> pForall <*> pContext <*> pSTypeApp <*> pUSymOper <*> pSTypeApp)
+      <|> (Constr <$> pForall <*> pContext <*> pUIdentSym <*> pFields)
 
 
 pFields :: P (Either [SType] [(Ident, SType)])
-pFields = Left  <$> emany pSAType
-      -- The <|> is needed because 'emany' can be empty.
-      <|> Right <$> (pSpec '{' *> (concatMap flat <$> esepBy ((,) <$> (esepBy1 pLIdentSym (pSpec ',') <* dcolon) <*> pSType) (pSpec ',') <* pSpec '}'))
+pFields = Right <$> (pSpec '{' *> (concatMap flat <$> sepBy ((,) <$> (sepBy1 pLIdentSym (pSpec ',') <* dcolon) <*> pSType) (pSpec ',') <* pSpec '}'))
+      <|> Left  <$> many pSAType
   where flat (is, t) = [ (i, t) | i <- is ]
 
 -- XXX This is a mess.
@@ -441,36 +494,36 @@
   t <- if s then pAType else pTypeApp
   pure (s, t)
 pStrict :: P Bool
-pStrict = (True <$ pSpec '!') <|< pure False
+pStrict = (True <$ pSpec '!') <|> pure False
 
 pLHS :: P LHS
-pLHS = (,) <$> pTypeIdentSym <*> emany pIdKind
-    <|< (\ a c b -> (c, [a,b])) <$> pIdKind <*> pSymOper <*> pIdKind
+pLHS = (,) <$> pTypeIdentSym <*> many pIdKind
+    <|> (\ a c b -> (c, [a,b])) <$> pIdKind <*> pSymOper <*> pIdKind
 
 pImportSpec :: P ImportSpec
 pImportSpec =
   let
-    pSource = (ImpBoot <$ pPragma "SOURCE") <|< pure ImpNormal
+    pSource = (ImpBoot <$ pPragma "SOURCE") <|> pure ImpNormal
     pQual = True <$ pKeyword "qualified"
     -- the 'qualified' can occur before or after the module name
     pQId =      ((,) <$> pQual <*> pUQIdentA)
-            <|< ((\ a b -> (b,a)) <$> pUQIdentA <*> (pQual <|< pure False))
+            <|> ((\ a b -> (b,a)) <$> pUQIdentA <*> (pQual <|> pure False))
     imp a (b, c) = ImportSpec a b c
-  in  imp <$> pSource <*> pQId <*> eoptional (pKeyword "as" *> pUQIdent) <*>
-              eoptional ((,) <$> ((True <$ pKeyword "hiding") <|< pure False) <*> pParens (esepEndBy pImportItem (pSpec ',')))
+  in  imp <$> pSource <*> pQId <*> optional (pKeyword "as" *> pUQIdent) <*>
+              optional ((,) <$> ((True <$ pKeyword "hiding") <|> pure False) <*> pParens (sepEndBy pImportItem (pSpec ',')))
 
 pImportItem :: P ImportItem
 pImportItem =
       impType     <$> pUQIdentSym <*> pParens pConList
-  <|< ImpTypeSome <$> pUQIdentSym <*> pure []
-  <|< ImpValue    <$> pLQIdentSym
-  <|< ImpValue    <$> (pKeyword "pattern" *> pUQIdentSym)
-  <|< ImpTypeSome <$> (pKeyword "type" *> pLQIdentSym) <*> pure []
+  <|> ImpTypeSome <$> pUQIdentSym <*> pure []
+  <|> ImpValue    <$> pLQIdentSym
+  <|> ImpValue    <$> (pKeyword "pattern" *> pUQIdentSym)
+  <|> ImpTypeSome <$> (pKeyword "type" *> pLQIdentSym) <*> pure []
   where impType i [d] | d == dotDotIdent = ImpTypeAll  i
         impType i is                     = ImpTypeSome i is
 
 pConList :: P [Ident]
-pConList = esepBy (pDotDot <|< pQIdent <|< pUIdentSpecial <|< pParens pSymOper) (pSpec ',')
+pConList = sepBy (pDotDot <|> pQIdent <|> pUIdentSpecial <|> pParens pSymOper) (pSpec ',')
   where pDotDot = dotDotIdent <$ pSymbol ".."
 
 dotDotIdent :: Ident
@@ -482,7 +535,7 @@
 pIdKind :: P IdKind
 pIdKind =
       ((\ i -> IdKind i (EVar dummyIdent)) <$> pLIdentSym)          -- dummyIdent indicates that we have no kind info
-  <|< pParens (IdKind <$> pLIdentSym <*> (dcolon *> pKind))
+  <|> pParens (IdKind <$> pLIdentSym <*> (dcolon *> pKind))
 
 pKind :: P EKind
 pKind = pType
@@ -498,14 +551,14 @@
   pure $ if null vs then t else EForall True vs t
 
 pForall :: P [IdKind]
-pForall = (forallKW *> esome pIdKind <* pSymbol ".") <|< pure []
-  where forallKW = pKeyword "forall" <|< pSymbol "\x2200"
+pForall = (forallKW *> some pIdKind <* pSymbol ".") <|> pure []
+  where forallKW = pKeyword "forall" <|> pSymbol "\x2200"
 
 pTypeOp :: P EType
 pTypeOp = pOperators pTypeOper pTypeArg
 
 pTypeOper :: P Ident
-pTypeOper = pOper <|< (mkIdent "->" <$ pSRArrow) <|< (mkIdent "=>" <$ pDRArrow)
+pTypeOper = pOper <|> (mkIdent "->" <$ pSRArrow) <|> (mkIdent "=>" <$ pDRArrow)
 
 pTypeArg :: P EType
 pTypeArg = pTypeApp
@@ -513,16 +566,16 @@
 pTypeApp :: P EType
 pTypeApp = do
   f <- pAType
-  as <- emany pAType
+  as <- many pAType
   pure $ foldl EApp f as
 
 pAType :: P Expr
 pAType =
       (EVar <$> pLQIdentSym)
-  <|< (EVar <$> pUQIdentSym)
-  <|< pLit
-  <|< (eTuple <$> (pSpec '(' *> esepBy pType (pSpec ',') <* pSpec ')'))
-  <|< (EListish . LList . (:[]) <$> (pSpec '[' *> pType <* pSpec ']'))  -- Unlike expressions, only allow a single element.
+  <|> (EVar <$> pUQIdentSym)
+  <|> pLit
+  <|> (eTuple <$> (pSpec '(' *> sepBy pType (pSpec ',') <* pSpec ')'))
+  <|> (EListish . LList . (:[]) <$> (pSpec '[' *> pType <* pSpec ']'))  -- Unlike expressions, only allow a single element.
 
 -------------
 -- Patterns
@@ -536,16 +589,16 @@
 pAPat =
       (do
          i <- pLIdentSym
-         (EAt i <$> (pSpec '@' *> pAPat)) <|< pure (EVar i)
+         (EAt i <$> (pSpec '@' *> pAPat)) <|> pure (EVar i)
       )
-  <|< (evar <$> pUQIdentSym <*> optional pUpdate)
-  <|< pLit
-  <|< (eTuple <$> (pSpec '(' *> esepBy pPat (pSpec ',') <* pSpec ')'))
-  <|< (EListish . LList <$> (pSpec '[' *> esepBy1 pPat (pSpec ',') <* pSpec ']'))
-  <|< (EViewPat <$> (pSpec '(' *> pExpr) <*> (pSRArrow *> pPat <* pSpec ')'))
-  <|< (ELazy True  <$> (pSpec '~' *> pAPat))
-  <|< (ELazy False <$> (pSpec '!' *> pAPat))
-  <|< (EOr <$> (pSpec '(' *> esepBy1 pPat (pSpec ';') <* pSpec ')'))  -- if there is a single pattern it will be matched by the tuple case
+  <|> (evar <$> pUQIdentSym <*> optional pUpdate)
+  <|> pLit
+  <|> (eTuple <$> (pSpec '(' *> sepBy pPat (pSpec ',') <* pSpec ')'))
+  <|> (EListish . LList <$> (pSpec '[' *> sepBy1 pPat (pSpec ',') <* pSpec ']'))
+  <|> (EViewPat <$> (pSpec '(' *> pExpr) <*> (pSRArrow *> pPat <* pSpec ')'))
+  <|> (ELazy True  <$> (pSpec '~' *> pAPat))
+  <|> (ELazy False <$> (pSpec '!' *> pAPat))
+  <|> (EOr <$> (pSpec '(' *> sepBy1 pPat (pSpec ';') <* pSpec ')'))  -- if there is a single pattern it will be matched by the tuple case
   where evar v Nothing = EVar v
         evar v (Just upd) = EUpdate (EVar v) upd
 
@@ -558,12 +611,12 @@
 pPatOp = pOperators pUOper pPatArg
 
 pPatArg :: P EPat
-pPatArg = (pSymbol "-" *> (ENegApp <$> pNumLit)) <|< pPatApp
+pPatArg = (pSymbol "-" *> (ENegApp <$> pNumLit)) <|> pPatApp
 
 pPatApp :: P EPat
 pPatApp = do
   f <- pAPat
-  as <- emany pAPat
+  as <- many pAPat
   guard (null as || isPConApp f)
   pure $ foldl EApp f as
 
@@ -591,7 +644,7 @@
       -- don't collect equations when of the form 'i = e'
       pure (name, [eqn])
     _ -> do
-      neqns <- emany (pSpec ';' *> pEqn ident oper (\ n l -> n == name && l == length ps))
+      neqns <- many (pSpec ';' *> pEqn ident oper (\ n l -> n == name && l == length ps))
       pure (name, eqn : map snd neqns)
 
 pEqn :: P Ident -> P Ident -> (Ident -> Int -> Bool) -> P (Ident, Eqn)
@@ -603,11 +656,11 @@
 
 pEqnLHS :: P Ident -> P Ident -> P (Ident, [EPat])
 pEqnLHS ident oper =
-  ((,) <$> ident <*> emany pAPat)
-  <|>   -- XXX this <|> causes a slowdown, but is necessary
   pOpLHS
-  <|<
-  ((\ (i, ps1) ps2 -> (i, ps1 ++ ps2)) <$> pParens pOpLHS <*> emany pAPat)
+  <|>
+  ((,) <$> ident <*> many pAPat)
+  <|>
+  ((\ (i, ps1) ps2 -> (i, ps1 ++ ps2)) <$> pParens pOpLHS <*> many pAPat)
   where
     pOpLHS = (\ p1 i p2 -> (i, [p1,p2])) <$> pPatApp <*> oper <*> pPatApp
 
@@ -616,19 +669,19 @@
   alts <- pAltsL sep
   bs <- pWhere pBind
   pure (EAlts alts bs)
-  
+
 pAltsL :: P () -> P [EAlt]
 pAltsL sep =
-      esome (pAlt sep)
-  <|< ((\ e -> [([], e)]) <$> (sep *> pExpr))
+      some (pAlt sep)
+  <|> ((\ e -> [([], e)]) <$> (sep *> pExpr))
 
 pAlt :: P () -> P EAlt
-pAlt sep = (,) <$> (pSpec '|' *> esepBy1 pStmt (pSpec ',')) <*> (sep *> pExpr)
+pAlt sep = (,) <$> (pSpec '|' *> sepBy1 pStmt (pSpec ',')) <*> (sep *> pExpr)
 
 pWhere :: P EBind -> P [EBind]
 pWhere pb =
       (pKeyword "where" *> pBlock pb)
-  <|< pure []
+  <|> pure []
 
 -------------
 -- Statements
@@ -636,8 +689,10 @@
 pStmt :: P EStmt
 pStmt =
       (SBind <$> (pPat <* pSLArrow) <*> pExpr)
-  <|< (SLet  <$> (pKeyword "let" *> pBlock pBind))
-  <|< (SThen <$> pExpr)
+  <|> (sLet  <$> (pKeyword "let" *> pBlock pBind)) <*> optional (pKeyword "in" *> pExpr)
+  <|> (SThen <$> pExpr)
+  where sLet b Nothing  = SLet b
+        sLet b (Just i) = SThen (ELet b i)
 
 -------------
 -- Expressions
@@ -646,20 +701,20 @@
 pExpr = pExprOp
 
 pExprArg :: P Expr
-pExprArg = pExprApp <|< pLam <|< pCase <|< pLet <|< pIf <|< pDo
+pExprArg = pExprApp <|> pLam <|> pCase <|> pLet <|> pIf <|> pDo
 
 pExprApp :: P Expr
 pExprApp = do
   f <- pAExpr
-  as <- emany pAExpr
+  as <- many pAExpr
   pure $ foldl EApp f as
 
 pLam :: P Expr
 pLam = do
   loc <- getSLoc
   pSpec '\\' *>
-    (    eLamWithSLoc loc <$> esome pAPat <*> (pSRArrow *> pExpr)
-     <|< eLamCase loc <$> (pKeyword "case" *> pBlock pCaseArm)
+    (    eLamWithSLoc loc <$> some pAPat <*> (pSRArrow *> pExpr)
+     <|> eLamCase loc <$> (pKeyword "case" *> pBlock pCaseArm)
     )
 
 eLamCase :: SLoc -> [ECaseArm] -> Expr
@@ -676,16 +731,16 @@
 
 pDo :: P Expr
 pDo = do
-  q <- (Just <$> pQualDo) <|< (Nothing <$ pKeyword "do")
+  q <- (Just <$> pQualDo) <|> (Nothing <$ pKeyword "do")
   ss <- pBlock pStmt
   guard (not (null ss))
   pure (EDo q ss)
 
 pIf :: P Expr
 pIf = EIf <$> (pKeyword "if" *> pExpr) <*>
-              (eoptional (pSpec ';') *> pKeyword "then" *> pExpr) <*>
-              (eoptional (pSpec ';') *> pKeyword "else" *> pExpr)
-  <|< EMultiIf <$> (EAlts <$> (pKeyword "if" *> pBlock (pAlt (pSymbol "->"))) <*> pure [])
+              (optional (pSpec ';') *> pKeyword "then" *> pExpr) <*>
+              (optional (pSpec ';') *> pKeyword "else" *> pExpr)
+  <|> EMultiIf <$> (EAlts <$> (pKeyword "if" *> pBlock (pAlt (pSymbol "->"))) <*> pure [])
 
 pQualDo :: P Ident
 pQualDo = do
@@ -695,7 +750,7 @@
   satisfyM "QualDo" is
 
 pOperComma :: P Ident
-pOperComma = pOper <|< pComma
+pOperComma = pOper <|> pComma
   where
     pComma = mkIdentSLoc <$> getSLoc <*> ("," <$ pSpec ',')
 
@@ -714,30 +769,29 @@
   pure $ sel (foldl EUpdate ee us)
 
 pUpdate :: P [EField]
-pUpdate = pSpec '{' *> esepBy pEField (pSpec ',') <* pSpec '}'
+pUpdate = pSpec '{' *> sepBy pEField (pSpec ',') <* pSpec '}'
   where
     pEField = do
       fs <- (:) <$> pLIdentSym <*> many pSelect
-      EField fs <$> (pSpec '=' *> pExpr) <|< pure (EFieldPun fs)
-     <|<
+      EField fs <$> (pSpec '=' *> pExpr) <|> pure (EFieldPun fs)
+     <|>
       (EFieldWild <$ pSymbol "..")
 
 pSelect :: P Ident
 pSelect = pSpec '.' *> pLIdent
 
 pAExpr' :: P Expr
-pAExpr' = (
+pAExpr' =
       (EVar   <$> pLQIdentSym)
-  <|< (EVar   <$> pUQIdentSym)
-  <|< pLit
-  <|< (eTuple <$> (pSpec '(' *> esepBy pExpr (pSpec ',') <* pSpec ')'))
-  <|< EListish <$> (pSpec '[' *> pListish <* pSpec ']')
-  <|< (ESectL <$> (pSpec '(' *> pExprOp) <*> (pOperComma <* pSpec ')'))
-  <|< (ESectR <$> (pSpec '(' *> pOperCommaNoMinus) <*> (pExprOp <* pSpec ')'))
-  <|< (ESelect <$> (pSpec '(' *> esome pSelect <* pSpec ')'))
-  <|< (ELit noSLoc . LPrim <$> (pKeyword "_primitive" *> pString))
-  <|< (ETypeArg <$> (pSpec '@' *> pAType))
-  )
+  <|> (EVar   <$> pUQIdentSym)
+  <|> pLit
+  <|> (eTuple <$> (pSpec '(' *> sepBy pExpr (pSpec ',') <* pSpec ')'))
+  <|> EListish <$> (pSpec '[' *> pListish <* pSpec ']')
+  <|> (ESectL <$> (pSpec '(' *> pExprOp) <*> (pOperComma <* pSpec ')'))
+  <|> (ESectR <$> (pSpec '(' *> pOperCommaNoMinus) <*> (pExprOp <* pSpec ')'))
+  <|> (ESelect <$> (pSpec '(' *> some pSelect <* pSpec ')'))
+  <|> (ELit noSLoc . LPrim <$> (pKeyword "_primitive" *> pString))
+  <|> (ETypeArg <$> (pSpec '@' *> pAType))
   -- This weirdly slows down parsing
   -- <?> "aexpr"
 
@@ -747,30 +801,30 @@
   let
     pMore = do
       e2 <- pExpr
-      ((\ es -> LList (e1:e2:es)) <$> esome (pSpec ',' *> pExpr))
-       <|< (LFromThenTo e1 e2 <$> (pSymbol ".." *> pExpr))
-       <|< (LFromThen e1 e2 <$ pSymbol "..")
-       <|< pure (LList [e1,e2])
+      ((\ es -> LList (e1:e2:es)) <$> some (pSpec ',' *> pExpr))
+       <|> (LFromThenTo e1 e2 <$> (pSymbol ".." *> pExpr))
+       <|> (LFromThen e1 e2 <$ pSymbol "..")
+       <|> pure (LList [e1,e2])
   (pSpec ',' *> pMore)
-   <|< (LCompr e1 <$> (pSpec '|' *> esepBy1 pStmt (pSpec ',')))
-   <|< (LFromTo e1 <$> (pSymbol ".." *> pExpr))
-   <|< (LFrom e1 <$ pSymbol "..")
-   <|< pure (LList [e1])
+   <|> (LCompr e1 <$> (pSpec '|' *> sepBy1 pStmt (pSpec ',')))
+   <|> (LFromTo e1 <$> (pSymbol ".." *> pExpr))
+   <|> (LFrom e1 <$ pSymbol "..")
+   <|> pure (LList [e1])
 
 pExprOp :: P Expr
 pExprOp = pOperators pOper pExprArgNeg
 
 pExprArgNeg :: P Expr
-pExprArgNeg = (pSymbol "-" *> (ENegApp <$> pExprArg)) <|< pExprArg
+pExprArgNeg = (pSymbol "-" *> (ENegApp <$> pExprArg)) <|> pExprArg
 
 pOperators :: P Ident -> P Expr -> P Expr
 pOperators oper one = do
   r <- pOperators' oper one
-  mt <- eoptional (dcolon *> pType)
+  mt <- optional (dcolon *> pType)
   pure $ maybe r (ESign r) mt
 
 pOperators' :: P Ident -> P Expr -> P Expr
-pOperators' oper one = eOper <$> one <*> emany ((,) <$> oper <*> one)
+pOperators' oper one = eOper <$> one <*> many ((,) <$> oper <*> one)
   where eOper e [] | notNeg e = e
         eOper e ies = EOper e ies
         notNeg (ENegApp _) = False
@@ -783,33 +837,31 @@
 pBind :: P EBind
 pBind =
       pBind'
-  <|< PatBind     <$> pPatNotVar <*> ((pSpec '=' *> pExpr)
-                                      <|<
-                                      (EMultiIf <$> pAlts (pSpec '=')))
+  <|> PatBind     <$> pPatNotVar <*> (EMultiIf <$> pAlts (pSpec '='))
 
 -- Bindings allowed in top level, let, class
 pBind' :: P EBind
 pBind' =
       uncurry Fcn <$> pEqns
-  <|< Sign        <$> ((esepBy1 pLIdentSym (pSpec ',')) <* dcolon) <*> pType
-  <|< Infix       <$> ((,) <$> pAssoc <*> pPrec) <*> esepBy1 pTypeOper (pSpec ',')
+  <|> Sign        <$> (sepBy1 pLIdentSym (pSpec ',') <* dcolon) <*> pType
+  <|> Infix       <$> ((,) <$> pAssoc <*> pPrec) <*> sepBy1 pTypeOper (pSpec ',')
   where
-    pAssoc = (AssocLeft <$ pKeyword "infixl") <|< (AssocRight <$ pKeyword "infixr") <|< (AssocNone <$ pKeyword "infix")
+    pAssoc = (AssocLeft <$ pKeyword "infixl") <|> (AssocRight <$ pKeyword "infixr") <|> (AssocNone <$ pKeyword "infix")
     dig (TInt _ ii) | 0 <= i && i <= 9 = Just i  where i = fromInteger ii
     dig _ = Nothing
-    pPrec = satisfyM "digit" dig <|< pure 9
+    pPrec = satisfyM "digit" dig <|> pure 9
 
 -- Bindings allowed in a class definition
 pClsBind :: P EBind
 pClsBind =
       pBind'
-  <|< DfltSign    <$> (pKeyword "default" *> pLIdentSym <* dcolon) <*> pType
+  <|> DfltSign    <$> (pKeyword "default" *> pLIdentSym <* dcolon) <*> pType
 
 -- Bindings allowed in an instance definition
 pInstBind :: P EBind
-pInstBind = 
+pInstBind =
       uncurry Fcn <$> pEqns
--- no InstanceSig yet  <|< Sign        <$> (pLIdentSym <* dcolon) <*> pType
+  <|> Sign        <$> (sepBy1 pLIdentSym (pSpec ',') <* dcolon) <*> pType
 
 -------------
 
diff --git a/src/MicroHs/State.hs b/src/MicroHs/State.hs
--- a/src/MicroHs/State.hs
+++ b/src/MicroHs/State.hs
@@ -2,16 +2,19 @@
 module MicroHs.State(
   module MicroHs.State,
   ) where
-import Prelude(); import MHSPrelude hiding(fail)
+import qualified Prelude(); import MHSPrelude hiding(fail)
 import Control.Monad.Fail
 import Control.Monad
 
 newtype State s a = S (s -> (a, s))
 
 instance Functor (State s) where
+{-
   fmap f sa = S $ \ s ->
     case runState sa s of
       (a, ss) -> (f a, ss)
+-}
+  fmap f sa = sa >>= (return . f)  -- slightly faster
 
 instance Applicative (State s) where
   pure a = S $ \ s -> (a, s)
@@ -40,7 +43,7 @@
 modify f = S $ \ s -> ((), f s)
 
 put :: forall s . s -> State s ()
-put s = S $ \ _ -> ((), s)
+put s = S $ const ((), s)
 
 get :: forall s . State s s
 get = S $ \ s -> (s, s)
diff --git a/src/MicroHs/StateIO.hs b/src/MicroHs/StateIO.hs
--- a/src/MicroHs/StateIO.hs
+++ b/src/MicroHs/StateIO.hs
@@ -8,7 +8,7 @@
   module Control.Monad,
   module Data.Functor,
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Control.Applicative
 import Control.Monad
 import Data.Functor hiding(unzip)
diff --git a/src/MicroHs/SymTab.hs b/src/MicroHs/SymTab.hs
--- a/src/MicroHs/SymTab.hs
+++ b/src/MicroHs/SymTab.hs
@@ -13,20 +13,19 @@
   stInsertLcl,
   mapMSymTab,
   ) where
-import Prelude(); import MHSPrelude
-import Data.Char
+import qualified Prelude(); import MHSPrelude
+--import Data.Char
 import Control.Applicative
 import Data.List
 import GHC.Stack
 import MicroHs.Builtin(builtinMdl)
 import MicroHs.Expr(Expr(..), EType, conIdent)
-import MicroHs.Ident(Ident, showIdent, unIdent, mkIdentSLoc, slocIdent)
+import MicroHs.Ident(Ident, showIdent, unIdent, mkIdentSLoc, slocIdent, isUpperX)
 import MicroHs.List
-import MicroHs.MRnf
 import qualified MicroHs.IdentMap as M
 
 -- Symbol table
--- 
+--
 
 -- Symbol table entry for symbol i.
 data Entry = Entry
@@ -35,13 +34,13 @@
 --  deriving(Show)
 
 instance Show Entry where
-  showsPrec _ (Entry e t) = showsPrec 0 e . showString " :: " . showsPrec 0 t
+  showsPrec _ (Entry e t) = shows e . showString " :: " . shows t
 
 instance Eq Entry where
   Entry x _ == Entry y _  =  getIdent x == getIdent y
 
-instance MRnf Entry where
-  mrnf (Entry a b) = mrnf a `seq` mrnf b
+instance NFData Entry where
+  rnf (Entry a b) = rnf a `seq` rnf b
 
 getIdent :: Expr -> Ident
 getIdent ae =
@@ -75,7 +74,7 @@
     ("Locals:"  : map (("  " ++) . show) l) ++
     ("UGlobals:" : map (("  " ++) . show) (M.toList ug)) ++
     ("QGlobals:" : map (("  " ++) . show) (M.toList qg))
-  
+
 mapMSymTab :: forall m . Monad m => (Entry -> m Entry) -> SymTab -> m SymTab
 mapMSymTab f (SymTab l ug qg) = do
   l' <- mapM (\ (i, a) -> f a >>= \ a' -> return (i, a')) l
@@ -98,12 +97,12 @@
         Nothing  -> Left $ "undefined " ++ msg ++ ": " ++ showIdent i
                            -- ++ "\n" ++ show lenv ++ "\n" ++ show genv
 
--- When a module uses 'import Prelude()' the Mhs.Builtin (aka B@) will
+-- When a module uses 'import quakified Prelude()' the Mhs.Builtin (aka B@) will
 -- also not be imported.  So as a last recourse, look for the identifier
 -- unqualified.
 hackBuiltin :: Ident -> Ident
 hackBuiltin i =
-  case stripPrefix builtinMdl (unIdent i) of
+  case stripPrefix (unIdent builtinMdl) (unIdent i) of
     Just ('.':s) -> mkIdentSLoc (slocIdent i) s
     _            -> i
 
@@ -140,5 +139,5 @@
                                    | otherwise = SymTab l (M.insertWith union i as ug) qg
 
 isQual :: Ident -> Bool
-isQual i = isUpper (head s) && elem '.' s
+isQual i = isUpperX (head s) && elem '.' s
   where s = unIdent i
diff --git a/src/MicroHs/TCMonad.hs b/src/MicroHs/TCMonad.hs
--- a/src/MicroHs/TCMonad.hs
+++ b/src/MicroHs/TCMonad.hs
@@ -3,7 +3,7 @@
   module MicroHs.TCMonad,
   get, put, gets, modify,
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Data.Functor.Identity
 import GHC.Stack
 import Control.Applicative
@@ -14,9 +14,10 @@
 import MicroHs.Ident
 import qualified MicroHs.IdentMap as M
 import qualified MicroHs.IntMap as IM
-import MicroHs.MRnf
+import MicroHs.Names
 import MicroHs.State
 import MicroHs.SymTab
+import System.IO.Unsafe(unsafePerformIO)
 import Debug.Trace
 
 -----------------------------------------------
@@ -41,6 +42,14 @@
   let s' = trace msg s
   seq s' (put s')
 
+-- trace to stdout
+tcTrace' :: String -> TC s ()
+--tcTrace _ = return ()
+tcTrace' msg = do
+  s <- get
+  let s' = unsafePerformIO $ do putStrLn msg; return s
+  seq s' (put s')
+
 -----------------------------------------------
 
 data TypeExport = TypeExport
@@ -51,8 +60,8 @@
 
 --instance Show TypeExport where show (TypeExport i _ vs) = showIdent i ++ show vs
 
-instance MRnf TypeExport where
-  mrnf (TypeExport a b c) = mrnf a `seq` mrnf b `seq` mrnf c
+instance NFData TypeExport where
+  rnf (TypeExport a b c) = rnf a `seq` rnf b `seq` rnf c
 
 data ValueExport = ValueExport
   Ident           -- unqualified name
@@ -61,8 +70,8 @@
 
 --instance Show ValueExport where show (ValueExport i _) = showIdent i
 
-instance MRnf ValueExport where
-  mrnf (ValueExport a b) = mrnf a `seq` mrnf b
+instance NFData ValueExport where
+  rnf (ValueExport a b) = rnf a `seq` rnf b
 
 -----------------------------------------------
 -- Tables
@@ -97,8 +106,8 @@
        [IFunDep]
 --  deriving (Show)
 
-instance MRnf InstInfo where
-  mrnf (InstInfo a b c) = mrnf a `seq` mrnf b `seq` mrnf c
+instance NFData InstInfo where
+  rnf (InstInfo a b c) = rnf a `seq` rnf b `seq` rnf c
 
 -- This is the dictionary expression, instance variables, instance context,
 -- and instance.
@@ -111,11 +120,16 @@
 -- All known type equalities, normalized into a substitution.
 type TypeEqTable = [(Ident, EType)]
 
-data ClassInfo = ClassInfo [IdKind] [EConstraint] EKind [Ident] [IFunDep]  -- class tyvars, superclasses, class kind, methods, fundeps
-type IFunDep = ([Bool], [Bool])           -- the length of the lists is the number of type variables
+data ClassInfo = ClassInfo
+  [IdKind]         -- class tyvars
+  [EConstraint]    -- superclasses
+  EType            -- class constructor type
+  [(Ident,EType)]  -- methods with their types
+  [IFunDep]        -- fundeps
+type IFunDep = ([Bool], [Bool])           -- invariant: the length of the lists is the number of class tyvars
 
-instance MRnf ClassInfo where
-  mrnf (ClassInfo a b c d e) = mrnf a `seq` mrnf b `seq` mrnf c `seq` mrnf d `seq` mrnf e
+instance NFData ClassInfo where
+  rnf (ClassInfo a b c d e) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e
 
 -----------------------------------------------
 -- TCState
@@ -128,14 +142,14 @@
   dataTable   :: DataTable,             -- data/newtype definitions
   valueTable  :: ValueTable,            -- value symbol table
   assocTable  :: AssocTable,            -- values associated with a type, indexed by QIdent
-  uvarSubst   :: (IM.IntMap EType),     -- mapping from unique id to type
+  uvarSubst   :: IM.IntMap EType,       -- mapping from unique id to type
   tcMode      :: TCMode,                -- pattern, value, or type
   classTable  :: ClassTable,            -- class info, indexed by QIdent
   ctxTables   :: (InstTable,            -- instances
                   MetaTable,            -- instances with unification variables
                   TypeEqTable,          -- type equalities
                   ArgDicts              -- dictionary arguments
-                 ),             
+                 ),
   constraints :: Constraints,           -- constraints that have to be solved
   defaults    :: Defaults               -- current defaults
   }
@@ -260,9 +274,6 @@
 
 -----------------------------------------------
 
-builtinLoc :: SLoc
-builtinLoc = SLoc "builtin" 0 0
-
 tConI :: SLoc -> String -> EType
 tConI loc = tCon . mkIdentSLoc loc
 
@@ -279,11 +290,17 @@
 tApps i ts = eApps (tCon i) ts
 
 tArrow :: EType -> EType -> EType
-tArrow a r = tApp (tApp (tConI builtinLoc "Primitives.->") a) r
+tArrow a r = tApp (tApp (tConI builtinLoc nameArrow) a) r
 
 tImplies :: EType -> EType -> EType
-tImplies a r = tApp (tApp (tConI builtinLoc "Primitives.=>") a) r
+tImplies a r = tApp (tApp (tConI builtinLoc nameImplies) a) r
 
 etImplies :: EType -> EType -> EType
 etImplies (EVar i) t | i == tupleConstr noSLoc 0 = t
 etImplies a t = tImplies a t
+
+mkEqType :: SLoc -> EType -> EType -> EConstraint
+mkEqType loc t1 t2 = eAppI2 (mkIdentSLoc loc nameTypeEq) t1 t2
+
+mkCoercible :: SLoc -> EType -> EType -> EConstraint
+mkCoercible loc t1 t2 = eAppI2 (mkIdentSLoc loc nameCoercible) t1 t2
diff --git a/src/MicroHs/TargetConfig.hs b/src/MicroHs/TargetConfig.hs
--- a/src/MicroHs/TargetConfig.hs
+++ b/src/MicroHs/TargetConfig.hs
@@ -5,8 +5,7 @@
   , parseTargets
   , findTarget
   ) where
-import Prelude(); import MHSPrelude hiding(lex)
-import Control.Applicative
+import qualified Prelude(); import MHSPrelude hiding(lex)
 import Data.List
 import Text.ParserComb
 import MicroHs.Ident
@@ -85,7 +84,7 @@
 keyValue = (,) <$> key <*> (spec '=' *> value)
 
 keyValues :: Parser [(String,String)]
-keyValues = keyValue `esepBy` nl
+keyValues = keyValue `sepBy` nl
 
 target :: Parser Target
 target = Target <$> (targetName <* nl) <*> keyValues
@@ -105,5 +104,4 @@
 parseTargets fp file =
   case runPrsr targets $ lex (SLoc fp 1 1) file of
     Left lf -> Left $ formatFailed lf
-    Right [a] -> Right a
-    Right as  -> Left $ "Ambiguous:" ++ unlines (map show as)
+    Right a -> Right a
diff --git a/src/MicroHs/Translate.hs b/src/MicroHs/Translate.hs
--- a/src/MicroHs/Translate.hs
+++ b/src/MicroHs/Translate.hs
@@ -1,11 +1,13 @@
 -- Copyright 2023 Lennart Augustsson
 -- See LICENSE file for full license.
+{-# OPTIONS_GHC -Wno-unused-imports #-}
 module MicroHs.Translate(
   translate, translateAndRun
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
+import Data.ByteString.Internal(ByteString)
 import Data.Maybe
-import qualified MicroHs.IdentMap as M
+import Data.String
 import Unsafe.Coerce
 import PrimTable
 
@@ -14,6 +16,7 @@
 import MicroHs.Exp
 import MicroHs.ExpPrint(encodeString)
 import MicroHs.Ident
+import qualified MicroHs.IdentMap as M
 
 translateAndRun :: (Ident, [LDef]) -> IO ()
 translateAndRun defs = do
@@ -23,9 +26,9 @@
 translate :: (Ident, [LDef]) -> AnyType
 translate (mainName, ds) =
   let
-    look m n = fromMaybe (error $ "translate: not found " ++ showIdent n) $ M.lookup n m
-    mp = M.fromList [(n, trans (look mp) d) | (n, d) <- ds ]
-  in look mp mainName
+    look n = fromMaybe (error $ "translate: not found " ++ showIdent n) $ M.lookup n mp
+    mp = M.fromList [(n, trans look d) | (n, d) <- ds ]
+  in look mainName
 
 trans :: (Ident -> AnyType) -> Exp -> AnyType
 trans r ae =
@@ -35,6 +38,7 @@
     Lit (LInt i) -> unsafeCoerce i
     Lit (LDouble i) -> unsafeCoerce i
     Lit (LStr s) -> trans r (encodeString s)
+    Lit (LBStr s) -> unsafeCoerce (Data.String.fromString s :: ByteString)
     Lit (LPrim p) -> fromMaybe (error $ "trans: no primop " ++ show p) $ lookup p primTable
     Lit (LInteger i) -> trans r (encodeInteger i)
     Lit (LForImp s _) -> trans r (App (Lit (LPrim "dynsym")) (Lit (LStr s)))
@@ -58,6 +62,7 @@
   ("Y", _primitive "Y"),
   ("B'", _primitive "B'"),
   ("Z", _primitive "Z"),
+--  ("J", _primitive "J"),
   ("R", _primitive "R"),
   ("K2", _primitive "K2"),
   ("K3", _primitive "K3"),
@@ -131,8 +136,8 @@
   ("catch", _primitive "catch"),
   ("dynsym", _primitive "dynsym"),
   ("newCAStringLen", _primitive "newCAStringLen"),
-  ("peekCAString", _primitive "peekCAString"),
-  ("peekCAStringLen", _primitive "peekCAStringLen"),
+  ("packCString", _primitive "packCString"),
+  ("packCStringLen", _primitive "packCStringLen"),
   ("toInt", _primitive "toInt"),
   ("toPtr", _primitive "toPtr"),
   ("toDbl", _primitive "toDbl"),
@@ -145,7 +150,6 @@
   ("A.==", _primitive "A.=="),
   ("bs++", _primitive "bs++"),
   ("bs++.", _primitive "bs++."),
-  ("bs+++", _primitive "bs+++"),
   ("bs==", _primitive "bs=="),
   ("bs/=", _primitive "bs/="),
   ("bs<", _primitive "bs<"),
@@ -155,8 +159,10 @@
   ("bscmp", _primitive "bscmp"),
   ("bspack", _primitive "bspack"),
   ("bsunpack", _primitive "bsunpack"),
+  ("bsreplicate", _primitive "bsreplicate"),
   ("bslength", _primitive "bslength"),
   ("bssubstr", _primitive "bssubstr"),
+  ("bsindex", _primitive "bsindex"),
   ("fromUTF8", _primitive "fromUTF8"),
   ("toUTF8", _primitive "toUTF8"),
   ("headUTF8", _primitive "headUTF8"),
@@ -164,5 +170,7 @@
   ("fp+", _primitive "fp+"),
   ("fp2p", _primitive "fp2p"),
   ("fpnew", _primitive "fpnew"),
-  ("fpfin", _primitive "fpfin")
+  ("fpfin", _primitive "fpfin"),
+  ("fp2bs", _primitive "fp2bs"),
+  ("bs2fp", _primitive "bs2fp")
   ]
diff --git a/src/MicroHs/TypeCheck.hs b/src/MicroHs/TypeCheck.hs
--- a/src/MicroHs/TypeCheck.hs
+++ b/src/MicroHs/TypeCheck.hs
@@ -1,7 +1,6 @@
--- Copyright 2023 Lennart Augustsson
+-- Copyright 2023-2025 Lennart Augustsson
 -- See LICENSE file for full license.
 {-# OPTIONS_GHC -Wno-incomplete-uni-patterns -Wno-unused-imports -Wno-unused-do-bind #-}
-{-# LANGUAGE FlexibleContexts #-}
 module MicroHs.TypeCheck(
   typeCheck,
   TModule(..), showTModule,
@@ -14,10 +13,10 @@
   listPrefix,
   ValueExport(..), TypeExport(..),
   Symbols,
+  isInstId,
   ) where
-import Prelude(); import MHSPrelude
+import qualified Prelude(); import MHSPrelude
 import Control.Applicative
-import Control.Arrow(first)
 import Control.Monad
 import Data.Char
 import Data.Function
@@ -27,96 +26,25 @@
 import MicroHs.Deriving
 import MicroHs.Expr
 import MicroHs.Fixity
+import MicroHs.Flags
 import MicroHs.Graph
 import MicroHs.Ident
 import qualified MicroHs.IdentMap as M
 import qualified MicroHs.IntMap as IM
 import MicroHs.List
-import MicroHs.MRnf
+import MicroHs.Names
 import MicroHs.Parse(dotDotIdent)
 import MicroHs.SymTab
 import MicroHs.TCMonad
 import GHC.Stack
 import Debug.Trace
 
-boolPrefix :: String
-boolPrefix = "Data.Bool_Type."
-
-listPrefix :: String
-listPrefix = "Data.List_Type."
-
-nameList :: String
-nameList = listPrefix ++ "[]"
-identList :: Ident
-identList = mkIdentB nameList
-
-nameInt :: String
-nameInt = "Primitives.Int"
-identInt :: Ident
-identInt = mkIdentB nameInt
-
-nameWord :: String
-nameWord = "Primitives.Word"
-identWord :: Ident
-identWord = mkIdentB nameWord
-
-nameFloatW :: String
-nameFloatW = "Primitives.FloatW"
-identFloatW :: Ident
-identFloatW = mkIdentB nameFloatW
-
-nameChar :: String
-nameChar = "Primitives.Char"
-identChar :: Ident
-identChar = mkIdentB nameChar
-
-nameInteger :: String
-nameInteger = "Data.Integer_Type.Integer"
-identInteger :: Ident
-identInteger = mkIdentB nameInteger
-
-nameTypeEq :: String
-nameTypeEq = "Primitives.~"
-identTypeEq :: Ident
-identTypeEq = mkIdentB nameTypeEq
-
-nameImplies :: String
-nameImplies = "Primitives.=>"
-identImplies :: Ident
-identImplies = mkIdentB nameImplies
-
-nameArrow :: String
-nameArrow = "Primitives.->"
-identArrow :: Ident
-identArrow = mkIdentB nameArrow
-
-nameSymbol :: String
-nameSymbol = "Primitives.Symbol"
-
-nameNat :: String
-nameNat = "Primitives.Nat"
-
-nameType :: String
-nameType = "Primitives.Type"
-
-nameKind :: String
-nameKind = "Primitives.Kind"
-
-nameConstraint :: String
-nameConstraint = "Primitives.Constraint"
-
-nameKnownNat :: String
-nameKnownNat = "Data.TypeLits.KnownNat"
-
-nameKnownSymbol :: String
-nameKnownSymbol = "Data.TypeLits.KnownSymbol"
-
-nameCoercible :: String
-nameCoercible = "Data.Coerce.Coercible"
-
 --primitiveKinds :: [String]
 --primitiveKinds = [nameType, nameConstraint, nameSymbol, nameNat]
 
+maxTuple :: Int
+maxTuple = 15
+
 ----------------------
 
 -- Certain data structures persist during the entire compilation
@@ -124,12 +52,12 @@
 data GlobTables = GlobTables {
   gSynTable   :: SynTable,        -- type synonyms are needed for expansion
   gDataTable  :: DataTable,       -- data/newtype definitions
-  gClassTable :: ClassTable,      -- classes are neede for superclass expansion
+  gClassTable :: ClassTable,      -- classes are needed for superclass expansion etc
   gInstInfo   :: InstTable        -- instances are implicitely global
   }
 
-instance MRnf GlobTables where
-  mrnf (GlobTables a b c d) = mrnf a `seq` mrnf b `seq` mrnf c `seq` mrnf d
+instance NFData GlobTables where
+  rnf (GlobTables a b c d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d
 
 emptyGlobTables :: GlobTables
 emptyGlobTables = GlobTables { gSynTable = M.empty, gDataTable = M.empty, gClassTable = M.empty, gInstInfo = M.empty }
@@ -153,8 +81,8 @@
   }
 --  deriving (Show)
 
-instance MRnf a => MRnf (TModule a) where
-  mrnf (TModule a b c d e f) = mrnf a `seq` mrnf b `seq` mrnf c `seq` mrnf d `seq` mrnf e `seq` mrnf f
+instance NFData a => NFData (TModule a) where
+  rnf (TModule a b c d e f) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e `seq` rnf f
 
 setBindings :: TModule b -> a -> TModule a
 setBindings (TModule x y z w v _) a = TModule x y z w v a
@@ -164,13 +92,13 @@
 type Sigma = EType
 type Rho   = EType
 
-typeCheck :: forall a . GlobTables -> ImpType -> [(ImportSpec, TModule a)] -> EModule -> (TModule [EDef], GlobTables, Symbols)
-typeCheck globs impt aimps (EModule mn exps defs) =
+typeCheck :: Flags -> GlobTables -> ImpType -> [(ImportSpec, TModule a)] -> EModule -> (TModule [EDef], GlobTables, Symbols)
+typeCheck flags globs impt aimps (EModule mn exps defs) =
 --  trace (unlines $ map (showTModuleExps . snd) aimps) $
   let
     imps = map filterImports aimps
     tc = mkTCState mn globs imps
-  in case tcRun (tcDefs impt defs) tc of
+  in case tcRun (tcDefs flags impt defs) tc of
        (tds, tcs) ->
          let
            thisMdl = (mn, mkTModule impt tds tcs)
@@ -253,7 +181,7 @@
   let e = expLookup ti tys
       assc = getAssocs vals ast $ tyQIdent e   -- all associated values
       ves = concatMap one is
-      one i | i == dotDotIdent = assc          -- '..' means all assocaited values
+      one i | i == dotDotIdent = assc          -- '..' means all associated values
             | otherwise =
               case filter (\ (ValueExport i' _) -> i == i') assc of
                 ee : _ -> [ee]                 -- Pick the assocaited value if it exists
@@ -262,7 +190,7 @@
                                                -- This might accidentally pick up a constructor from
                                                -- another type, but it doesn't really matter.
   in ([TypeExport (unQualIdent ti) e ves], [])
-  
+
 getTVExps _ _ vals _ (ExpValue i) = ([], [ValueExport (unQualIdent i) (expLookup i vals)])
 getTVExps _ _ _ _ (ExpDefault _) = ([], [])
 
@@ -276,9 +204,6 @@
 eVarI :: SLoc -> String -> Expr
 eVarI loc = EVar . mkIdentSLoc loc
 
-getApp :: HasCallStack => EType -> (Ident, [EType])
-getApp t = fromMaybe (impossibleShow t) $ getAppM t
-
 -- Construct a dummy TModule for the currently compiled module.
 -- It has all the relevant export tables.
 -- The value&type export tables will later be filtered through the export list.
@@ -300,14 +225,15 @@
       case stLookup "" qi vt of
         Right e -> e
         _       -> Entry (EVar qi) t  -- XXX A hack for boot modules
-          
+
     -- Find all value Entry for names associated with a type.
     assoc i = case impt of
                 ImpBoot -> []  -- XXX For boot files the tables are not set up correctly.
                 _ -> getAssocs vt at (qualIdent mn i)
 
     -- All top level values possible to export.
-    ves = [ ValueExport i (ventry i t) | Sign is t <- tds, i <- is ]
+    ves = [ ValueExport i (ventry i t') | Sign is t <- tds, let t' = expandSyn' st t, i <- is ]
+      where st = synTable tcs
 
     -- All top level types possible to export.
     tes =
@@ -346,7 +272,7 @@
           [ (v, [Entry (EVar v) t]) | (i, ClassInfo _ _ t _ _) <- M.toList (gClassTable globs), let { v = mkClassConstructor i } ]
         -- Default methods are always entered with their qualified original name.
         qualIdentD (Entry e _) m i | not (isDefaultMethodId i) = qualIdent m i
-                                   | otherwise = 
+                                   | otherwise =
                                      case e of
                                        EVar qi -> qi
                                        _ -> undefined
@@ -368,7 +294,7 @@
       let assocs (_, TModule _ _ tes _ _ _) = [ (tyQIdent e, cs) | TypeExport _ e cs <- tes ]
       in  M.fromList $ concatMap assocs mdls
 
-    dflts = foldr mergeDefaults M.empty (map (tDefaults . snd) mdls)
+    dflts = foldr (mergeDefaults . tDefaults . snd) M.empty mdls
 
   in TC { moduleName = mdlName,
           unique = 1,
@@ -389,8 +315,8 @@
 mergeDefaults :: Defaults -> Defaults -> Defaults
 mergeDefaults ds = foldr (uncurry $ M.insertWith mrg) ds . M.toList
   where mrg :: [EType] -> [EType] -> [EType]
-        mrg ts ts' | null (filter (\ t -> not (elemBy eqEType t ts)) ts') = ts
-                   | null (filter (\ t -> not (elemBy eqEType t ts')) ts) = ts'
+        mrg ts ts' | not (any (\ t -> not (elemBy eqEType t ts)) ts') = ts
+                   | not (any (\ t -> not (elemBy eqEType t ts')) ts) = ts'
                    | otherwise = []
 
 mergeInstInfo :: InstInfo -> InstInfo -> InstInfo
@@ -417,9 +343,6 @@
 mkInstId loc ct = mkIdentSLoc loc $ instPrefix ++ uniqIdentSep ++ clsTy
   where clsTy = map (\ c -> if isSpace c then '@' else c) $ showExprRaw ct
 
-instPrefix :: String
-instPrefix = "inst"
-
 --------------------------
 
 -- Use the type table as the value table, and the primKind table as the type table.
@@ -440,7 +363,7 @@
   putTypeTable tt'
   putTCMode otcm
   return a
-  
+
 addAssocTable :: Ident -> [ValueExport] -> T ()
 addAssocTable i ids = modify $ \ ts -> ts { assocTable = M.insert i ids (assocTable ts) }
 
@@ -460,8 +383,8 @@
     mkInstInfo :: InstDictC -> T (Ident, InstInfo)
     mkInstInfo (e, iks, ctx, ct, fds) = do
       case (iks, ctx, getApp ct) of
-        ([], [], (c, [EVar i])) -> return $ (c, InstInfo (M.singleton i e) [] fds)
-        (_,  _,  (c, ts      )) -> return $ (c, InstInfo M.empty [(e, ii)] fds)
+        ([], [], (c, [EVar i])) -> return (c, InstInfo (M.singleton i e) [] fds)
+        (_,  _,  (c, ts      )) -> return (c, InstInfo M.empty [(e, ii)] fds)
           where ii u =
                   let ctx' = map (subst s) ctx
                       ts'  = map (subst s) ts
@@ -471,18 +394,36 @@
   it <- gets instTable
   putInstTable $ foldr (uncurry $ M.insertWith mergeInstInfo) it iis
 
+-- Generate a dictionary for the constraint.
+-- Reuse old dictionaries if possible.
+newDict :: SLoc -> EConstraint -> T Expr
+newDict loc ctx = do
+  ctx' <- derefUVar ctx
+  cs <- gets constraints
+  -- Check if there's already an identical constraint.
+  case find (\ (_, c) -> eqEType c ctx') cs of
+    Just (i, _) -> do
+--      traceM ("newDict reuse: " ++ show (i, ctx'))
+      return (EVar i)
+    _ -> do
+      i <- newDictIdent loc
+--      traceM ("newDict: " ++ show (i, ctx', length cs))
+      addConstraint i ctx'
+      return (EVar i)
+
 addConstraint :: Ident -> EConstraint -> T ()
 addConstraint d ctx = do
 --  tcTrace $ "addConstraint: " ++ showIdent d ++ " :: " ++ showEType ctx
-  ctx' <- expandSyn ctx
-  modify $ \ ts -> ts{ constraints = (d, ctx') : constraints ts }
+  modify $ \ ts -> ts{ constraints = (d, ctx) : constraints ts }
 
 withDicts :: forall a . HasCallStack => [(Ident, EConstraint)] -> T a -> T a
 withDicts ds ta = do
+--  tcTrace $ "+++ withDicts enter " ++ show ds
   ct <- gets ctxTables
   mapM_ addDict ds
   a <- ta
   putCtxTables ct
+--  tcTrace $ "--- withDicts leave " ++ show ds
   return a
 
 withDict :: forall a . HasCallStack => Ident -> EConstraint -> T a -> T a
@@ -497,25 +438,27 @@
 
 addDict :: HasCallStack => (Ident, EConstraint) -> T ()
 addDict (i, c) = do
-  c' <- expandSyn c >>= derefUVar
+  c' <- derefUVar c
   if null (metaTvs [c']) then
-    case c' of
-      (EApp (EApp (EVar eq) t1) t2) | eq == mkIdent nameTypeEq -> addEqDict i t1 t2
-      _ -> addInstDict i c'
+    addInstDict i c'
    else
     -- With constraint variables we might get unification variables.
     -- We stash them away in hope that we will learn more later.
     addMetaDict i c'
 
 addInstDict :: HasCallStack => Ident -> EConstraint -> T ()
-addInstDict i c = do
-  c' <- expandSyn c
-  ics <- expandDict (EVar i) c'
-  addInstTable ics
-  addArgDict i c
+addInstDict di c = do
+  ics <- expandDict (EVar di) c
+  -- Type equalities are handled differently.
+  let addeq [] = return []
+      addeq ((_, _, _, EApp (EApp (EVar eq) t1) t2, _):is) | eq == identTypeEq = do addEqDict t1 t2; addeq is
+      addeq (i:is) = (i :) <$> addeq is
+  ics' <- addeq ics
+  addInstTable ics'
+  addArgDict di c
 
-addEqDict :: Ident -> EType -> EType -> T ()
-addEqDict _i t1 t2 = do
+addEqDict :: EType -> EType -> T ()
+addEqDict t1 t2 = do
   is <- gets typeEqTable
 --  tcTrace ("withEqDict: " ++ show (is, (t1,t2), (addTypeEq t1 t2 is)))
   putTypeEqTable (addTypeEq t1 t2 is)
@@ -551,9 +494,6 @@
 kTypeTypeTypeS :: EType
 kTypeTypeTypeS = kArrow kType $ kArrow kType kType
 
-mkIdentB :: String -> Ident
-mkIdentB = mkIdentSLoc builtinLoc
-
 -- E.g.
 --  Kind :: Sort
 primSortTable :: KindTable
@@ -621,7 +561,7 @@
        (mkIdentB "\x2192",       [entry identArrow    kTypeTypeTypeS]),  -- ->
        (mkIdentB "\x21d2",       [entry identImplies  kImplies])         -- =>
       ] ++
-      map tuple (0 : enumFromTo 2 10)
+      map tuple (0 : enumFromTo 2 maxTuple)
 
 -- E.g.
 --  True :: Bool
@@ -638,7 +578,7 @@
         ts = map tVarK vks
         r = tApps c ts
       in  (c, [Entry (ECon $ ConData [(c, n)] c []) $ EForall True vks $ EForall True [] $ foldr tArrow r ts ])
-  in  map tuple (0 : enumFromTo 2 10)
+  in  map tuple (0 : enumFromTo 2 maxTuple)
 
 kArrow :: EKind -> EKind -> EKind
 kArrow = tArrow
@@ -657,36 +597,60 @@
 munify loc (Infer r) b = tSetRefType loc r b
 munify loc (Check a) b = unify loc a b
 
+-- Synonyms are expanded after kind checking.
+-- There should be no synonyms in any of the symbol tables (except synTable).
 expandSyn :: HasCallStack =>
              EType -> T EType
+--expandSyn at | trace ("expandSyn: " ++ show at) False = undefined
 expandSyn at = do
+  syns <- gets synTable
   let
+    rt = expandSyn' syns at
+    -- Check that there are no unexpanded synonyms left
+    chk (EApp f a) = do chk f; chk a
+    chk (EVar i) =
+      case M.lookup i syns of
+        Nothing -> return ()
+        _ -> tcError (getSLoc i) "bad synonym use"
+    chk (EUVar _) = return ()
+    chk (EForall _ _ t) = chk t
+    chk (ELit _ _) = return ()
+    chk _ = impossible
+  chk rt
+  return rt
+
+-- Expand with the given synonym table.
+expandSyn' :: HasCallStack =>
+              SynTable -> EType -> EType
+expandSyn' syns = esyn
+  where
+    esyn = syn []
+    -- Expand synonyms that have enough arguments
     syn ts t =
       case t of
-        EApp f a -> do
-          aa <- expandSyn a
-          syn (aa:ts) f
-        EVar i -> do
-          syns <- gets synTable
+        EApp f a -> syn (esyn a : ts) f
+        EVar i ->
           case M.lookup i syns of
-            Nothing -> return $ eApps t ts
+            Nothing -> eApps t ts
             Just (EForall _ vks tt) ->
-              let s = zip (map idKindIdent vks) ts
-                  lvks = length vks
+              let is = map idKindIdent vks
+                  s = zip is ts
+                  lis = length is
                   lts = length ts
-              in  case compare lvks lts of
-                    LT -> expandSyn $ eApps (subst s tt) (drop lvks ts)
-                    EQ -> expandSyn $ subst s tt
-                    GT -> tcError (getSLoc i) $ "bad synonym use"
+              in  if lis > lts then
+                    eApps t ts
+                  else
+                    -- Too few arguments, just leave it alone
+                    syn (drop lis ts) (subst s tt)
             Just _ -> impossible
-        EUVar _ -> return $ eApps t ts
-        ESign a _ -> expandSyn a   -- Throw away signatures, they don't affect unification
-        EForall b iks tt | null ts -> EForall b iks <$> expandSyn tt
-        ELit _ (LStr _) -> return t
-        ELit _ (LInteger _) -> return t
-        _ -> impossible
-  syn [] at
+        EUVar _ -> eApps t ts
+        ESign a _ -> syn ts a   -- Throw away signatures, they don't affect unification
+        EForall b iks tt | null ts -> EForall b iks (esyn tt)
+        ELit _ (LStr _) -> t
+        ELit _ (LInteger _) -> t
+        _ -> impossibleShow t
 
+
 mapEType :: (EType -> EType) -> EType -> EType
 mapEType fn = rec
   where
@@ -712,7 +676,8 @@
           return t'
     EVar _ -> return at
     ESign t k -> flip ESign k <$> derefUVar t
-    EForall b iks t -> EForall b iks <$> derefUVar t
+    EForall b iks t -> EForall b <$> iks' <*> derefUVar t
+      where iks' = mapM (\ (IdKind i k) -> IdKind i <$> derefUVar k) iks
     ELit _ (LStr _) -> return at
     ELit _ (LInteger _) -> return at
     _ -> impossible
@@ -738,10 +703,7 @@
 
 unify :: HasCallStack =>
          SLoc -> EType -> EType -> T ()
-unify loc a b = do
-  aa <- expandSyn a
-  bb <- expandSyn b
-  unifyR loc aa bb
+unify loc a b = unifyR loc a b
 
 unifyR :: HasCallStack =>
           SLoc -> EType -> EType -> T ()
@@ -779,7 +741,7 @@
     Just t2 -> unify loc (EUVar r1) t2
 unifyUnboundVar loc r1 t2 = do
   vs <- getMetaTyVars [t2]
-  if elem r1 vs then
+  if r1 `elem` vs then
     tcErrorTK loc $ "cyclic " ++ showExpr (EUVar r1) ++ " = " ++ showExpr t2
    else
     setUVar r1 t2
@@ -791,9 +753,6 @@
 newUVar :: T EType
 newUVar = EUVar <$> newUniq
 
-uniqIdentSep :: String
-uniqIdentSep = "$"
-
 newIdent :: SLoc -> String -> T Ident
 newIdent loc s = do
   u <- newUniq
@@ -822,21 +781,42 @@
   tLookup (msgTCMode tcm) i
 
 tInst :: HasCallStack => Expr -> EType -> T (Expr, EType)
+--tInst ae t | trace ("tInst: " ++ show (ae, t)) False = undefined
 tInst ae (EForall _ vks t) = do
   t' <- tInstForall vks t
   tInst ae t'
 tInst ae at | Just (ctx, t) <- getImplies at = do
   --tcTrace $ "tInst: addConstraint: " ++ show ae ++ ", " ++ show d ++ " :: " ++ show ctx
+{-
   if eqExpr ae eCannotHappen then
-    -- XXX Gruesome hack.  This avoid adding constraints in cases like
+    -- XXX Gruesome hack.  This avoids adding constraints in cases like
     --  (C a => a) -> T `subsCheck` b
-    tInst ae t
+    undefined
+    --tInst ae t
    else do
-    d <- newDictIdent (getSLoc ae)
-    addConstraint d ctx
-    tInst (EApp ae (EVar d)) t
+-}
+    d <- newDict (getSLoc ae) ctx
+    tInst (EApp ae d) t
 tInst ae at = return (ae, at)
 
+-- Instantiate a function, but delay generating the dictionaries.
+-- When generating the dictionaries here (like tInst) there
+-- is no type information; just a type variable.
+-- By delaying the dictionary generation we gain more
+-- type information, and can avoid let binding dictionaries by
+--  * finding an already bound dictionary for the same constraint
+--  * solving the constraint early
+tInstDelay :: HasCallStack => EType -> T ([EConstraint], EType)
+--tInstDelay  t | trace ("tInstDelay: " ++ show (ae, t)) False = undefined
+tInstDelay = inst []
+  where
+    inst cs (EForall _ vks t) = do
+      t' <- tInstForall vks t
+      inst cs t'
+    inst cs at | Just (ctx, t) <- getImplies at =
+      inst (ctx:cs) t
+    inst cs at = return (reverse cs, at)
+
 tInstForall :: [IdKind] -> EType -> T EType
 tInstForall vks t =
   if null vks then
@@ -863,9 +843,11 @@
 extValETop i t e = do
   mn <- gets moduleName
   venv <- gets valueTable
+  t' <- expandSyn t                 -- expand type synonyms before entering the symbol table
+--  when (show i == "mkTyCon") $ traceM (show "extValETop " ++ show (i, t, t'))
   let qi = qualIdent mn i
-      venv'  = stInsertGlbQ qi [Entry e t] venv
-      venv'' = stInsertGlbU  i [Entry e t] venv'
+      venv'  = stInsertGlbQ qi [Entry e t'] venv
+      venv'' = stInsertGlbU  i [Entry e t'] venv'
   putValueTable venv''
 
 -- Extend symbol table with i::t.
@@ -893,10 +875,14 @@
 extTyps :: [(Ident, EType)] -> T ()
 extTyps = mapM_ (uncurry extTyp)
 
-extSyn :: Ident -> EType -> T ()
-extSyn i t = do
-  senv <- gets synTable
-  putSynTable (M.insert i t senv)
+extSyn :: Ident -> [IdKind] -> EType -> T ()
+extSyn i iks t = do
+  -- Eta reduce type synonyms.
+  -- E.g. 'type T a = Maybe a' could be 'type T = Maybe'.
+  case etaReduce iks t of
+    (iks', t') -> do
+      senv <- gets synTable
+      putSynTable (M.insert i (EForall True iks' t') senv)
 
 extData :: Ident -> EDef -> T ()
 extData i d = do
@@ -933,14 +919,17 @@
   putTypeTable venv
   return a
 
-tcDefs :: ImpType -> [EDef] -> T [EDef]
-tcDefs impt ds = do
+tcDefs :: HasCallStack => Flags -> ImpType -> [EDef] -> T [EDef]
+tcDefs flags impt ds = do
 --  tcTrace ("tcDefs 1:\n" ++ showEDefs ds)
+  -- First, add infix declarations so the operators can be resolved
   mapM_ tcAddInfix ds
   dst <- tcDefsType ds
 --  tcTrace ("tcDefs 2:\n" ++ showEDefs dst)
   mapM_ addTypeAndData dst
   dste <- tcExpandClassInst impt dst
+  dumpIf flags Dderive $
+    tcTrace' $ "expanded:\n" ++ showEDefs dste
 --  tcTrace ("tcDefs 3:\n" ++ showEDefs dste)
   case impt of
     ImpNormal -> do
@@ -967,7 +956,7 @@
   mapM_ (\ i -> extFix (qualIdent mn i) fx) is
 tcAddInfix _ = return ()
 
--- Check type definitions
+-- Kind check type definitions
 tcDefsType :: HasCallStack => [EDef] -> T [EDef]
 tcDefsType ds = withTypeTable $ do
   kindSigs <- getKindSigns ds
@@ -976,13 +965,19 @@
 --  vars <- gets uvarSubst
 --  tcTrace $ show vars
   vt <- gets valueTable
-  let ent (Entry i t) = Entry i . mapEType def <$> derefUVar t
-      def (EUVar _) = kType    -- default kind variables to Type
-      def t = t
+  let ent (Entry i k) = Entry i <$> zonk k
+      zonk k = mapEType def <$> (derefUVar k >>= expandSyn)
+        where def (EUVar _) = kType    -- default kind variables to Type
+              def t = t
+      derefClass (Class ctx (n, vks) ct ms) = do
+        vks' <- mapM (\ (IdKind i k) -> IdKind i <$> zonk k) vks
+--        traceM("derefClass: " ++ show (n, vks, vks'))
+        pure (Class ctx (n, vks') ct ms)
+      derefClass d = pure d
   vt' <- mapMSymTab ent vt
   putValueTable vt'
+  mapM derefClass dst    -- make class definition LHSs have correct kinds
 --  tcTrace $ "tcDefType value table:\n" ++ show vt'
-  return dst
 
 -- Get all kind signatures, and do sort checking of them.
 getKindSigns :: HasCallStack => [EDef] -> T (M.Map EKind)
@@ -993,16 +988,15 @@
   iks' <- mapM kind iks
   return $ M.fromList iks'
 
--- Expand class and instance definitions (must be done after type synonym processing)
+-- Expand class and instance definitions (must be done after type synonym processing).
 tcExpandClassInst :: ImpType -> [EDef] -> T [EDef]
-tcExpandClassInst impt dst = withTypeTable $ do
-  dsc <- concat <$> mapM (expandClass impt) dst       -- Expand all class definitions
-  dsf <- concat <$> mapM expandField dsc              -- Add HasField instances
---  tcTrace $ showEDefs dsf
-  dsd <- concat <$> mapM doDeriving  dsf              -- Add derived instances
---  tcTrace $ showEDefs dsd
-  dsi <- concat <$> mapM expandInst  dsd              -- Expand all instance definitions
-  return dsi
+tcExpandClassInst impt dst = do
+  dsf <- withTypeTable $ do
+    dsc <- concat <$> mapM (expandClass impt) dst       -- Expand all class definitions
+    concat <$> mapM expandField dsc                     -- Add HasField instances
+  mapM_ addValueTypeClass dsf                           -- Add methods, needed while deriving
+  dsd <- concat <$> mapM doDeriving dsf                 -- Add derived instances
+  concat <$> mapM expandInst dsd                        -- Expand all instance definitions
 
 -- Check&rename the given kinds, also insert the type variables in the symbol table.
 withVks :: forall a . HasCallStack => [IdKind] -> ([IdKind] -> T a) -> T a
@@ -1041,12 +1035,9 @@
 addTypeKind kdefs adef = do
   let
     addDef (i, _) = do
-      k <-
-        case M.lookup i kdefs of
-           Nothing -> newUVar
-           Just k' -> return k'
+      k <- maybe newUVar return $ M.lookup i kdefs
       extValQTop i k
-      
+
   case adef of
     Data    lhs _ _ -> addDef lhs
     Newtype lhs _ _ -> addDef lhs
@@ -1055,7 +1046,7 @@
     _               -> return ()
 
 -- Add symbols associated with a type.
-addAssocs :: EDef -> T ()
+addAssocs :: HasCallStack => EDef -> T ()
 addAssocs adef = do
   mn <- gets moduleName
   let
@@ -1077,12 +1068,12 @@
     Class _ (i, _) _ ms -> addAssoc i [ x | Sign ns _ <- ms, m <- ns, x <- [m, mkDefaultMethodId m] ]
     _                   -> return ()
 
--- Add type synonyms to the synonym table, and data/newtype to the data table
+-- Add type synonyms to the synonym table, and data/newtype to the data table.
 addTypeAndData :: EDef -> T ()
 addTypeAndData adef = do
   mn <- gets moduleName
   case adef of
-    Type    (i, vs) t  -> extSyn  (qualIdent mn i) (EForall True vs t)
+    Type    (i, vs) t  -> extSyn  (qualIdent mn i) vs t
     Data    (i, _) _ _ -> extData (qualIdent mn i) adef
     Newtype (i, _) _ _ -> extData (qualIdent mn i) adef
     _                  -> return ()
@@ -1090,38 +1081,100 @@
 -- Do kind checking of all typeish definitions.
 tcDefType :: HasCallStack => EDef -> T EDef
 tcDefType def = do
-  --tcReset
   case def of
-    Data    lhs cs ds      -> withLHS lhs $ \ lhs' -> flip (,) kType       <$> (Data    lhs'  <$> mapM tcConstr cs <*> mapM tcDerive ds)
-    Newtype lhs c  ds      -> withLHS lhs $ \ lhs' -> flip (,) kType       <$> (Newtype lhs'  <$> tcConstr c       <*> mapM tcDerive ds)
-    Type    lhs t          -> withLHS lhs $ \ lhs' -> first                    (Type    lhs') <$> tInferTypeT t
-    Class   ctx lhs fds ms -> withLHS lhs $ \ lhs' -> flip (,) kConstraint <$> (Class         <$> tcCtx ctx <*> return lhs' <*> mapM tcFD fds <*> mapM tcMethod ms)
-    Sign      is t         ->                                                  Sign      is   <$> tCheckTypeTImpl False kType t
-    ForImp ie i t          ->                                                  ForImp ie i    <$> tCheckTypeTImpl False kType t
-    Instance ct m          ->                                                  Instance       <$> tCheckTypeTImpl True kConstraint ct <*> return m
-    Default mc ts          ->                                                  Default (Just c) <$> mapM (tcDefault c) ts
-                                                                                 where c = fromMaybe num mc
-    Deriving ct            ->                                                  Deriving       <$> tCheckTypeTImpl False kConstraint ct
+    Data    lhs cs ds      -> withLHS lhs $ \ lhs' -> cm kType       <$> (Data    lhs'  <$> mapM tcConstr cs <*> mapM (tcDeriving lhs') ds)
+    Newtype lhs c  ds      -> withLHS lhs $ \ lhs' -> cm kType       <$> (Newtype lhs'  <$> tcConstr c       <*> mapM (tcDeriving lhs') ds)
+    Type    lhs t          -> withLHS lhs $ \ lhs' -> first              (Type    lhs') <$> tInferTypeT t
+    Class   ctx lhs fds ms -> withLHS lhs $ \ lhs' -> cm kConstraint <$> (Class         <$> tcCtx ctx <*> return lhs' <*> mapM tcFD fds <*> mapM tcMethod ms)
+    Sign      is t         ->                                            Sign      is   <$> tCheckTypeTImpl False kType t
+    ForImp ie i t          ->                                            ForImp ie i    <$> tCheckTypeTImpl False kType t
+    Instance ct m          ->                                            Instance       <$> tCheckTypeTImpl True kConstraint ct <*> return m
+    Default mc ts          ->                                            Default (Just c) <$> mapM (tcDefault c) ts
+                                                                           where c = fromMaybe num mc
+-- We cant't do this now, because the classTable has not been fully populated yet.
+-- Instead, we do it in the deriving stage.
+--    StandDeriving st _ ct  ->                                            tcStand st ct
     _                      -> return def
  where
-   tcMethod (Sign is t) = Sign is <$> tCheckTypeTImpl False kType t
-   tcMethod (DfltSign i t) = DfltSign i <$> tCheckTypeTImpl False kType t
-   tcMethod m = return m
+   cm = flip (,)
+   tcMethod (Sign    is t) = Sign    is <$> (tCheckTypeTImpl False kType t >>= expandSyn)
+   tcMethod (DfltSign i t) = DfltSign i <$> (tCheckTypeTImpl False kType t >>= expandSyn)
+   tcMethod m              = return m
    tcFD (is, os) = (,) <$> mapM tcV is <*> mapM tcV os
      where tcV i = do { _ <- tLookup "fundep" i; return i }
-   tcDerive = tCheckTypeT (kType `kArrow` kConstraint)
    num = mkBuiltin noSLoc "Num"
    tcDefault c t = do
      EApp _ t' <- tCheckTypeT kConstraint (EApp (EVar c) t)
      return t'
 
+-- A standalone deriving has a regular instance head.
+-- If it has a via clause, the via type has to have the same kind
+-- as the type in the instance head.
+tcStand :: DerStrategy -> EConstraint -> T EDef
+tcStand st ct = do
+     ct' <- tCheckTypeTImpl True kConstraint ct
+     -- We need the kind of the type in the instance head.
+     -- It's needed for the number of arguments to "eta reduce",
+     -- and also for kind checking the via type.
+     -- So find the kind of the last argument to the class
+     (vks, kty) <- do
+       let (cvks, _ctx, cty) = splitContext ct'
+           cls = fst $ getApp cty
+       ctbl <- gets classTable
+       case M.lookup cls ctbl of
+         Just (ClassInfo vks@(_:_) _ _ _ _) -> case last vks of IdKind _ k -> return (cvks, k)
+         _ -> tcError (getSLoc ct) $ "not a class " ++ showIdent cls
+     let narg = length $ fst $ getArrows kty
+     st' <-
+       case st of
+         DerVia t -> DerVia <$> withExtVals (map (\ (IdKind i k) -> (i, k)) vks)
+                       (tCheckTypeT kty t)   -- make sure the via type has the same kind
+         _ -> return st
+     pure $ StandDeriving st' narg ct'
+
+-- The type variables vks are already in scope when we get here.
+tcDeriving :: LHS -> Deriving -> T Deriving
+tcDeriving (tyId, vks) (Deriving strat cs) = do
+  let tcDerive (_, c) = do
+        let loc = getSLoc c
+        -- The kind of c has to be of the form (k1 -> ... kn -> Type) -> Constraint
+        -- Check that it is.
+        k <- newUVar
+        --traceM $ "tcDerive 1: " ++ show c
+        c' <- tCheckTypeTImpl True (k `kArrow` kConstraint) c
+        --traceM $ "tcDerive 2: " ++ show c
+        (ks, _) <- getArrows <$> derefUVar k  -- get [k1,...,kn] and final kind
+        -- Checking that the final kind is Type happens with the tc call below.
+        let r = length ks                      -- number of args consumed by c
+            m = length vks                     -- number of args given to the data type
+            i = m - r                          -- keep this many
+            ty = tApps tyId (map (EVar . idKindIdent) (take i vks))
+        when (i < 0) $
+          tcError loc "Bad deriving"
+        -- The generated instance has the form 'instance ... => c ty'.
+        -- Check that this has kind Constraint.
+        -- Also check that any via type also fulfills this.
+        let tc t = do _ <- tCheckTypeTImpl True kConstraint (tApp c t); return ()
+        tc ty
+        case strat of
+          DerVia v -> tc v  -- XXX should this allow implicit quantification?
+          _        -> return ()
+        return (r, c')
+
+  cs' <- mapM tcDerive cs
+  -- Ignore the kind here, it's checked for each derived type
+  strat' <- case strat of
+              DerVia t -> DerVia . fst <$> tInferTypeT t
+              _        -> return strat
+  return $ Deriving strat' cs'
+
 withLHS :: forall a . HasCallStack => LHS -> (LHS -> T (a, EKind)) -> T a
 withLHS (i, vks) ta = do
   (_, ki) <- tLookupV i
   withVks vks $ \ vks' -> do
     (a, kr) <- ta (i, vks')
-    let kapp = foldr kArrow kr (map (\ (IdKind _ k) -> k) vks')
-    --unify (getSLoc i) ki kapp
+    let kapp = foldr (kArrow . (\ (IdKind _ k) -> k)) kr vks'
+    -- XXX polykinded definitions don't work properly
     _ <- subsCheckRho (getSLoc i) eCannotHappen ki kapp
     return a
 
@@ -1133,8 +1186,9 @@
   assertTCMode (==TCType) $
   withVks iks $ \ iks' ->
     Constr iks' <$> tcCtx ct <*> pure c <*>
-      either (\ x -> Left  <$> mapM (\ (s,t)     ->         (,)s  <$> tcTypeT (Check kType) t) x)
-             (\ x -> Right <$> mapM (\ (i,(s,t)) -> ((,)i . (,)s) <$> tcTypeT (Check kType) t) x) ets
+      case ets of
+        Left  x -> Left  <$> mapM (\ (s,t)     ->        (,)s <$> tcTypeT (Check kType) t) x
+        Right x -> Right <$> mapM (\ (i,(s,t)) -> (,)i . (,)s <$> tcTypeT (Check kType) t) x
 
 -- Expand a class defintion to
 --  * a "data" type for the dictionary, with kind Constraint
@@ -1185,29 +1239,34 @@
 -- Default methods are added as actual definitions.
 -- The constructor and methods are added to the symbol table in addValueType.
 expandClass :: ImpType -> EDef -> T [EDef]
-expandClass impt dcls@(Class ctx (iCls, vks) fds ms) = do
+expandClass impt dcls@(Class _ctx (iCls, vks) _fds ms) = do
   mn <- gets moduleName
   let
       meths = [ b | b@(Sign _ _) <- ms ]
-      methIds = concatMap (\ (Sign is _) -> is) meths
       mdflts = [ (i, eqns) | Fcn i eqns <- ms ]
       dflttys = [ (i, t) | DfltSign i t <- ms ]
       tCtx = tApps (qualIdent mn iCls) (map (EVar . idKindIdent) vks)
       mkDflt (Sign is t) = concatMap method is
         where method methId = [ Sign [iDflt] $ EForall True vks $ tCtx `tImplies` ty, def $ lookup methId mdflts ]
                 where ty = fromMaybe t $ lookup methId dflttys
-                      def Nothing = Fcn iDflt $ simpleEqn noDflt
+                      def Nothing = Fcn iDflt $ etaExp ty noDflt
                       def (Just eqns) = Fcn iDflt eqns
                       iDflt = mkDefaultMethodId methId
                       noDflt = mkExn (getSLoc methId) (unIdent methId) "noMethodError"
-              
       mkDflt _ = impossible
+      -- The type checker cannot handle something like
+      --   foo :: ((forall a . a -> Int) -> Int) -> Int
+      --   foo = undefined
+      -- but the eta expanded version is acceptable, so we eta expand
+      -- default methods.
+      -- XXX This isn't really enough for complicated nested quantifiers.
+      etaExp t e =
+        let n = length $ fst $ getArrows $ (\ (_,_,x)->x) $ splitContext t
+            vs = replicate n (EVar dummyIdent)
+        in  [Eqn vs $ simpleAlts e]
       dDflts = case impt of
                  ImpNormal -> concatMap mkDflt meths
                  ImpBoot   -> []
-  -- Add to the class table.  XXX also in addValueClass???
-  addClassTable (qualIdent mn iCls)
-                (ClassInfo vks ctx (EUVar 0) methIds (mkIFunDeps (map idKindIdent vks) fds))   -- Initial entry, no type needed.
   return $ dcls : dDflts
 expandClass _ d = return [d]
 
@@ -1232,57 +1291,67 @@
 defaultSuffix :: String
 defaultSuffix = uniqIdentSep ++ "dflt"
 
-splitInst :: EConstraint -> ([IdKind], [EConstraint], EConstraint)
-splitInst (EForall _ iks t) =
-  case splitInst t of
+-- Split something of the form
+--  forall vs . ctx => t
+-- into (vs, ctx, t)
+splitContext :: EConstraint -> ([IdKind], [EConstraint], EConstraint)
+splitContext (EForall _ iks t) =
+  case splitContext t of
     (iks', ctx, ct) -> (iks ++ iks', ctx, ct)
-splitInst act =
+splitContext act =
   case getImplies act of
     Just (ctx, ct) ->
-      case splitInst ct of
+      case splitContext ct of
         (iks, ctxs, ct') -> (iks, ctx : ctxs, ct')
     _ -> ([], [], act)
 
+-- expandInst runs when all kind checking has been done, but no value checking.
+-- So any generated type expressions must be kind correct and fully qualified,
+-- whereas value expressions do not.
 expandInst :: EDef -> T [EDef]
 expandInst dinst@(Instance act bs) = do
-  (vks, ctx, cc) <- splitInst <$> expandSyn act
+  (vks, ctx, cc) <- splitContext <$> expandSyn act
   let loc = getSLoc act
       qiCls = getAppCon cc
-  let iInst = mkInstId loc cc
-      sign = Sign [iInst] act
+      iInst = mkInstId loc cc
 --  tcTrace ("expandInst " ++ show iInst)
 --  (e, _) <- tLookupV iCls
   ct <- gets classTable
 --  let qiCls = getAppCon e
-  (ClassInfo _ supers _ mis fds) <-
+  (ClassInfo _ supers _ mits fds) <-
     case M.lookup qiCls ct of
       Nothing -> tcError loc $ "not a class " ++ showIdent qiCls
       Just x -> return x
-  -- XXX this ignores type signatures and other bindings
-  -- XXX should tack on signatures with ESign
-  let clsMdl = qualOf qiCls                   -- get class's module name
-      ies = [(i, ELam noSLoc qs) | Fcn i qs <- bs]
-      meth i = fromMaybe (ELam noSLoc $ simpleEqn $ EVar $ setSLocIdent loc $ mkDefaultMethodId $ qualIdent clsMdl i) $ lookup i ies
-      meths = map meth mis
+  let signs = [ (i, t) | Sign is t <- bs, i <- is ]
+      addSign i e = maybe e (ESign e) $ lookup i signs
+      clsMdl = qualOf qiCls                   -- get class's module name
+      ies = [(i, addSign i $ ELam loc qs) | Fcn i qs <- bs]
+      meth (i, _) = fromMaybe (ELam loc $ simpleEqn $ EVar $ setSLocIdent loc $ mkDefaultMethodId $ qualIdent clsMdl i) $ lookup i ies
+      meths = map meth mits
       sups = map (const (EVar $ mkIdentSLoc loc dictPrefixDollar)) supers
       args = sups ++ meths
-      instBind (Fcn i _) = i `elem` mis
+      instBind (Fcn i _) = isJust $ lookup i mits
+      instBind (Sign is _) = all (\ i -> isJust $ lookup i mits) is
       instBind _ = False
   case filter (not . instBind) bs of
     [] -> return ()
-    b:_ -> tcError (getSLoc b) $ "superflous instance binding"
-  let bind = Fcn iInst $ eEqns [] $ eApps (EVar $ mkClassConstructor qiCls) args
-  mn <- gets moduleName
-  addInstTable [(EVar $ qualIdent mn iInst, vks, ctx, cc, fds)]
+    b:_ -> tcError (getSLoc b) "superflous instance binding"
+
+  let body = eEqns [] $ eApps (EVar $ mkClassConstructor qiCls) args
+      bind = Fcn iInst body
+      sign = Sign [iInst] $ eForall vks $ addConstraints ctx cc
+  addInstTable [(EVar iInst, vks, ctx, cc, fds)]
   return [dinst, sign, bind]
+
 expandInst d = return [d]
 
 ---------------------
 
-tcDefsValue :: [EDef] -> T [EDef]
+tcDefsValue :: HasCallStack => [EDef] -> T [EDef]
 tcDefsValue defs = do
 --  tcTrace $ "tcDefsValue: ------------ start"
   -- Gather up all type signatures, and put them in the environment.
+  -- Definitions with no type signature will be missing.
   mapM_ addValueType defs
   let smap = M.fromList $ [ (i, ()) | Sign is _ <- defs, i <- is ]
       -- Split Fcn into those without and with type signatures
@@ -1302,7 +1371,7 @@
                    | otherwise = map (\ i -> fromMaybe i $ lookup i sub) x
               -- Map all (bound) identifiers in a PatBind into the first (bound) identifier
               sub = [ (d, i) | PatBind p _ <- unsigned, i:ds <- [patVars p], d <- ds ]
-      tcSCC (AcyclicSCC d@(Pattern _ _ _)) = tcPatSyn d
+      tcSCC (AcyclicSCC d@Pattern{}) = tcPatSyn d
       tcSCC (AcyclicSCC d) = tInferDefs smap [d]
       tcSCC (CyclicSCC ds) = tInferDefs smap ds
   --traceM $ "tcDefsValue: unsigned=" ++ show unsigned
@@ -1314,28 +1383,31 @@
 --  traceM $ showEDefs defs'
 --  tcTrace $ "tcDefsValue: ------------ check"
   --  type check all definitions (the inferred ones will be rechecked)
+  chksym
   defs'' <- mapM (\ d -> do { tcReset; tcDefValue d}) defs'
   let defs''' = concat signDefs ++ defs''
 --  traceM $ "tcDefsValue: ------------ done"
 --  traceM $ showEDefs defs'''
   pure defs'''
 
--- Infer a type for a definition
+-- Infer a type for a strongly connected component of definitions.
+-- Enter the deduced types into the global symbol table and return
+-- signatures with the deduced types.
 tInferDefs :: M.Map () -> [EDef] -> T [EDef]
 tInferDefs smap fcns = do
 --  traceM "tInferDefs"
   tcReset
   -- Invent type variables for the definitions
-  xts <- 
-           let f (Fcn i _)            = do t <- newUVar; pure [(i, t)]
-               f (Pattern (i, _) _ _) = do t <- newUVar; pure [(i, t)]
-               f (PatBind p _)        = concat <$> mapM g (patVars p)
-               f _                    = impossible
-               -- Only add type variables for those variables that don't have a signature
-               g i = case M.lookup i smap of
-                       Nothing -> do t <- newUVar; pure [(i, t)]
-                       _       -> pure []
-           in  concat <$> mapM f fcns
+  xts <-
+       let f (Fcn i _)            = do t <- newUVar; pure [(i, t)]
+           f (Pattern (i, _) _ _) = do t <- newUVar; pure [(i, t)]
+           f (PatBind p _)        = concat <$> mapM g (patVars p)
+           f _                    = impossible
+           -- Only add type variables for those variables that don't have a signature
+           g i = case M.lookup i smap of
+                   Nothing -> do t <- newUVar; pure [(i, t)]
+                   _       -> pure []
+       in  concat <$> mapM f fcns
   --tcTrace $ "tInferDefs: " ++ show (map fst xts)
   -- Temporarily extend the local environment with the type variables
   withExtVals xts $ do
@@ -1354,7 +1426,7 @@
       genTop (i, t) = do
         t' <- derefUVar t
         let vs = metaTvs [t']
-            ctx' = filter (\ c -> not (null (intersect vs (metaTvs [c])))) ctx
+            ctx' = filter (\ c -> not (null (vs `intersect` metaTvs [c]))) ctx
             t'' = addConstraints ctx' t'
             vs' = metaTvs [t'']
         t''' <- quantify vs' t''
@@ -1410,6 +1482,11 @@
     Class ctx (i, vks) fds ms -> addValueClass ctx i vks fds ms
     _ -> return ()
 
+-- Add methods to symbol table
+addValueTypeClass :: EDef -> T ()
+addValueTypeClass (Class ctx (i, vks) fds ms) = addValueClass ctx i vks fds ms
+addValueTypeClass _ = return ()
+
 -- Add a pattern synonym to the symbol table.
 addPatSyn :: EType -> Ident -> T ()
 addPatSyn at i = do
@@ -1421,29 +1498,32 @@
       mtch = (EVar qip, mkPatSynMatchType qip at)
   extValETop i at $ ECon $ ConSyn qi n mtch
 
--- XXX FunDep
+-- Add mathods to the value table.
 addValueClass :: [EConstraint] -> Ident -> [IdKind] -> [FunDep] -> [EBind] -> T ()
 addValueClass ctx iCls vks fds ms = do
   mn <- gets moduleName
-  let
-      meths = [ b | b@(Sign _ _) <- ms ]
-      methTys = map (\ (Sign _ t) -> t) meths
-      methIds = concatMap (\ (Sign is _) -> is) meths
+  let methIdTys = [ (i, t) | Sign is t <- ms, i <- is ]
       supTys = ctx  -- XXX should do some checking
-      targs = supTys ++ methTys
+      targs = supTys ++ map snd methIdTys
       qiCls = qualIdent mn iCls
       tret = tApps qiCls (map tVarK vks)
       cti = [ (qualIdent mn iCon, length targs) ]
       iCon = mkClassConstructor iCls
       iConTy = EForall True vks $ foldr tArrow tret targs
+      tvs = map (EVar . idKindIdent) vks
+      methIdTys' = map (\ (i, t) -> (i, EForall True vks $ tApps qiCls tvs `tImplies` t)) methIdTys
+      addMethod (i, t) = extValETop i t (EVar $ qualIdent mn i)
   extValETop iCon iConTy (ECon $ ConData cti (qualIdent mn iCon) [])
-  let addMethod (Sign is t) = mapM_ method is
-        where method i = extValETop i (EForall True vks $ tApps qiCls (map (EVar . idKindIdent) vks) `tImplies` t) (EVar $ qualIdent mn i)
-      addMethod _ = impossible
---  tcTrace ("addValueClass " ++ showEType (ETuple ctx))
-  mapM_ addMethod meths
+  mapM_ addMethod methIdTys'
   -- Update class table, now with actual constructor type.
-  addClassTable qiCls (ClassInfo vks ctx iConTy methIds (mkIFunDeps (map idKindIdent vks) fds))
+--  traceM $ "addValueClass " ++ show (iCls, vks)
+  -- expand all type synonyms before entering the table
+  info <- ClassInfo vks <$>
+                    mapM expandSyn ctx <*>
+                    expandSyn iConTy <*>
+                    mapM (\ (i, t) -> (,) i <$> expandSyn t) methIdTys' <*>
+                    return (mkIFunDeps (map idKindIdent vks) fds)
+  addClassTable qiCls info
 
 mkClassConstructor :: Ident -> Ident
 mkClassConstructor i = addIdentSuffix i "$C"
@@ -1455,29 +1535,32 @@
   case adef of
     Fcn i eqns -> do
       (_, t) <- tLookup "type signature" i
-      t' <- expandSyn t
 --      when (isConIdent i) $ do
---        tcTrace $ "tcDefValue: patsyn\n" ++ show i ++ " :: " ++ show t'
+--        tcTrace $ "tcDefValue: patsyn\n" ++ show i ++ " :: " ++ show t
 --        tcTrace $ "tcDefValue:\n" ++ showEDefs [adef]
 --      tcTrace $ "tcDefValue: ------- start " ++ showIdent i
---      tcTrace $ "tcDefValue: " ++ showIdent i ++ " :: " ++ showExpr t'
+--      tcTrace $ "tcDefValue: " ++ showIdent i ++ " :: " ++ showExpr t
 --      tcTrace $ "tcDefValue: " ++ showEDefs [adef]
-      teqns <- tcEqns True t' eqns
+      teqns <- tcEqns True t eqns
 --      tcTrace ("tcDefValue: after\n" ++ showEDefs [adef, Fcn i teqns])
 --      cs <- gets constraints
 --      tcTrace $ "tcDefValue: constraints: " ++ show cs
       checkConstraints
       mn <- gets moduleName
 --      tcTrace $ "tcDefValue: " ++ showIdent i ++ " done"
-      return $ Fcn (qualIdent mn i) teqns
+      return $ Fcn (qualIdent' mn i) teqns
     PatBind p e -> tcPatBind PatBind p e
     ForImp ie i t -> do
       mn <- gets moduleName
       t' <- expandSyn t
-      return (ForImp ie (qualIdent mn i) t')
-    Pattern _ _ _ -> impossible
+      return (ForImp ie (qualIdent' mn i) t')
+    Pattern{} -> impossible
     _ -> return adef
 
+qualIdent' :: IdentModule -> Ident -> Ident
+qualIdent' mn i | isInstId i = i
+                | otherwise  = qualIdent mn i
+
 -- This is only used during inference.
 -- When doing type checking the actual Pattern definition will have been
 -- removed by expandPatSyn.
@@ -1510,20 +1593,26 @@
   return [ Sign [ip] ty3 ]
 tcPatSyn _ = impossible
 
--- Add implicit forall and type check.
-tCheckTypeTImpl :: HasCallStack => Bool -> EType -> EType -> T EType
-tCheckTypeTImpl _ tchk t@(EForall _ _ _) = tCheckTypeT tchk t
-tCheckTypeTImpl impl tchk t = do
+-- Add implicit forall
+addForall :: Bool -> EType -> T EType
+addForall _ t@EForall{} = return t
+addForall expl t = do
   bvs <- stKeysLcl <$> gets valueTable         -- bound outside
   let fvs = freeTyVars [t]                     -- free variables in t
       -- these are free, and need quantification.  eDummy indicates missing kind
       iks = map (\ i -> IdKind i eDummy) (fvs \\ bvs)
-  --when (not (null iks)) $ tcTrace ("tCheckTypeTImpl: " ++ show (t, eForall iks t))
-  tCheckTypeT tchk (eForall' impl iks t)
+  --when (not (null iks)) $ tcTrace ("addForall: " ++ show (t, eForall iks t))
+  return $ eForall' expl iks t
 
+-- Add implicit forall and kind check, in type mode
+tCheckTypeTImpl :: HasCallStack => Bool -> EType -> EType -> T EType
+tCheckTypeTImpl expl tchk t = tCheckTypeT tchk =<< addForall expl t
+
+-- Check type in type mode
 tCheckTypeT :: HasCallStack => EType -> EType -> T EType
 tCheckTypeT = tCheck tcTypeT
 
+-- Infer type in type mode
 tInferTypeT :: HasCallStack => EType -> T (EType, EKind)
 tInferTypeT t = tInfer tcTypeT t
 
@@ -1579,6 +1668,8 @@
               EType -> Expr -> T Expr
 tCheckExpr t e | Just (ctx, t') <- getImplies t = do
 --  tcTrace $ "tCheckExpr: " ++ show (e, ctx, t')
+  xt <- expandSyn t
+  unless (eqEType t xt) undefined
   d <- newADictIdent (getSLoc e)
   e' <- withDict d ctx $ tCheckExprAndSolve t' e
   return $ eLam [EVar d] e'
@@ -1609,16 +1700,16 @@
 
 tcExpr :: HasCallStack =>
           Expected -> Expr -> T Expr
-tcExpr mt ae = do
---  tcTrace ("tcExpr enter: mt=" ++ show mt ++ " ae=" ++ showExpr ae)
+tcExpr mt ae = tcExprR mt ae {-do
+  tcTrace ("tcExpr enter: mt=" ++ show mt ++ " ae=" ++ showExpr ae)
   r <- tcExprR mt ae
---  tcTrace ("tcExpr exit: " ++ showExpr r)
-  return r
+  tcTrace ("tcExpr exit: " ++ showExpr r)
+  return r -}
 tcExprR :: HasCallStack =>
            Expected -> Expr -> T Expr
 tcExprR mt ae =
   let { loc = getSLoc ae } in
---  trace ("tcExprR " ++ show ae) $
+--  trace ("tcExprR " ++ show (ae, mt)) $
   case ae of
     EVar i | isIdent dictPrefixDollar i -> do
              -- Magic variable that just becomes the dictionary
@@ -1658,7 +1749,7 @@
             _      -> impossible
         TCExpr -> do
           let getExpected (Infer _) = pure Nothing
-              getExpected (Check t) = Just <$> (derefUVar t >>= expandSyn)
+              getExpected (Check t) = Just <$> derefUVar t
           case lit of
             LInteger i -> do
               mex <- getExpected mt
@@ -1684,11 +1775,13 @@
                   -- We don't need to check that _at is Rational, it's part of the fromRational type.
                   instSigma loc (EApp f ae) rt mt
             -- This implements OverloadedStrings.  It causes a small slowdown (2%)
-            LStr _ -> do
+            LStr s -> do
               mex <- getExpected mt
               case mex of
                 Just (EApp (EVar lst) (EVar c))
                  | lst == identList && c == identChar -> tcLit mt loc lit
+                Just (EVar bs)
+                 | bs == identByteString -> tcLit mt loc (LBStr s)
                 _ -> do
                   (f, ft) <- tInferExpr (EVar (mkBuiltin loc "fromString"))
                   (_at, rt) <- unArrow loc ft
@@ -1705,15 +1798,18 @@
       earms <- mapM (tcArm tt ta) arms
       return (ECase ea earms)
     ELet bs a -> tcBinds bs $ \ ebs -> do { ea <- tcExpr mt a; return (ELet ebs ea) }
-    ETuple es -> do
-      -- XXX checking if mt is a tuple would give better inference
-      let
-        n = length es
-      (ees, tes) <- fmap unzip (mapM tInferExpr es)
-      let
-        ttup = tApps (tupleConstr loc n) tes
-      munify loc mt ttup
-      return (ETuple ees)
+    ETuple es ->
+      case unTuple mt of
+        Just ts | length ts == length es -> do
+          ees <- zipWithM tCheckExpr ts es
+          return (ETuple ees)
+        _ -> do
+          (ees, tes) <- mapAndUnzipM tInferExpr es
+          let
+            n = length es
+            ttup = tApps (tupleConstr loc n) tes
+          munify loc mt ttup
+          return (ETuple ees)
     EParen e -> tcExpr mt e
     EDo mmn ass -> do
       case ass of
@@ -1721,7 +1817,7 @@
         [as] ->
           case as of
             SThen a -> tcExpr mt a
-            _ -> tcError loc $ "bad final do statement"
+            _ -> tcError loc "bad final do statement"
         as : ss -> do
           case as of
             SBind p a -> do
@@ -1742,7 +1838,7 @@
                 ithen = mkBuiltin loc ">>"
                 sthen = maybe ithen (\ mn -> qualIdent mn ithen) mmn
               tcExpr mt (EApp (EApp (EVar sthen) a) (EDo mmn ss))
-                
+
             SLet bs ->
               tcExpr mt (ELet bs (EDo mmn ss))
 
@@ -1766,13 +1862,20 @@
     -- Translate (if | a1; | a2 ...) into
     --           (case [] of _ | a1; | a2 ...)
     EMultiIf a ->
-      tcExpr mt $ ECase (EListish (LList [])) [(EVar (mkIdent "_"), a)]
+      case a of
+        EAlts [([], e)] [] -> tcExpr mt e
+        _                  -> tcExpr mt $ ECase (EListish (LList [])) [(EVar (mkIdent "_"), a)]
 
-    EListish (LList es) -> do
-      te <- newUVar
-      munify loc mt (tApp (tList loc) te)
-      es' <- mapM (tCheckExpr te) es
-      return (EListish (LList es'))
+    EListish (LList es) ->
+      case unList mt of
+        Just t -> do
+          es' <- mapM (tCheckExpr t) es
+          return (EListish (LList es'))
+        _ -> do
+          te <- newUVar
+          munify loc mt (tApp (tList loc) te)
+          es' <- mapM (tCheckExpr te) es
+          return (EListish (LList es'))
     EListish (LCompr eret ass) -> do
       let
         doStmts :: [EStmt] -> [EStmt] -> T ([EStmt], Typed Expr)
@@ -1803,15 +1906,35 @@
     EListish (LFromThen   e1 e2)    -> tcExpr mt (enum loc "FromThen" [e1,e2])
     EListish (LFromThenTo e1 e2 e3) -> tcExpr mt (enum loc "FromThenTo" [e1,e2,e3])
     ESign e t -> do
-      t' <- tcType (Check kType) t
-      e' <- instSigma loc e t' mt
-      checkSigma e' t'
+{-
+      -- As a hack, translate 'e :: T' to 'let s$999 :: T; s$999 = e in s$999'
+      -- This will ensure that dictinaries are inserted in the right place.
+      i <- newIdent (getSLoc e) "s"
+      tcExpr mt $ ELet [Sign [i] t, Fcn i $ eEqns [] e] (EVar i)
+-}
+      -- XXX wrong for kind signatures
+      t' <- withTypeTable $ tCheckTypeTImpl False kType t >>= expandSyn
+      case splitContext t' of
+        -- No context, handle this without a 'let' to avoid bloat.
+        ([], [], _) -> do
+          e' <- instSigma loc e t' mt
+          tCheckExpr t' e'
+        _ -> do
+          -- We have a forall/context.  As a hack, translate 'e :: T' to
+          -- let s$999 :: T; s$999 = e in s$999
+          -- This will ensure that dictinaries are inserted in the right place.
+          -- XXX Maybe it would be better to have this as part of the code above?
+          -- Or maybe do this rewrite all the time?
+          i <- newIdent (getSLoc e) "s"
+          let et = ELet [Sign [i] t, Fcn i $ eEqns [] e] (EVar i)
+          tcExpr mt et
+
     -- Only happens in type&kind checking mode.
     EForall b vks t ->
 --      assertTCMode (==TCType) $
       withVks vks $ \ vks' -> do
         tt <- tcExpr mt t
-        return (EForall b vks' tt)
+        derefUVar (EForall b vks' tt)
     EUpdate e flds -> do
       ises <- concat <$> mapM (dsEField e) flds
       me <- dsUpdate unsetField e ises
@@ -1822,13 +1945,14 @@
         let x = eVarI loc "$x"
         tcExpr mt $ eLam [x] $ foldl (\ e i -> EApp (eGetField i) e) x is
     ETypeArg _ ->
-        tcError loc $ "Bad type application"
+        tcError loc "Bad type application"
     _ -> error $ "tcExpr: cannot handle: " ++ show (getSLoc ae) ++ " " ++ show ae
       -- impossible
 
 tcExprAp :: HasCallStack =>
             Expected -> Expr -> [Expr] -> T Expr
-tcExprAp mt ae args =
+--tcExprAp _ ae args | trace ("tcExprAp: " ++ show (ae, args)) False = undefined
+tcExprAp mt ae args = do
   case ae of
     EApp f a -> tcExprAp mt f (a : args)
     EParen f -> tcExprAp mt f args
@@ -1838,6 +1962,7 @@
            | otherwise -> do
              -- Type checking an expression (or type)
              (fn, t) <- tLookupV i
+--             traceM ("tcExprAp " ++ show (fn, t))
              -- Variables bound in patterns start out with an (EUVar ref) type,
              -- which can be instantiated to a polytype.
              -- Dereference such a ref.
@@ -1854,18 +1979,20 @@
     _ -> do
       (f, t) <- tInferExpr ae
       tcExprApFn mt f t args
-    
-tcExprApFn :: Expected -> Expr -> EType -> [Expr] -> T Expr
---tcExprApFn _ fn fnt args | trace (show (fn, fnt, args)) False = undefined
-tcExprApFn mt fn (EForall {-True-}_ (IdKind i _:iks) ft) (ETypeArg t : args) = do
-  t' <- if t `eqEType` EVar dummyIdent then newUVar else tcType (Check kType) t
-  tcExprApFn mt fn (eForall iks (subst [(i, t')] ft)) args
-tcExprApFn mt fn tfn args = do
---  traceM $ "tcExprApFn: " ++ show (mt, fn, tfn, args)
+
+tcExprApFn :: HasCallStack =>
+              Expected -> Expr -> EType -> [Expr] -> T Expr
+--tcExprApFn mt fn fnt args | trace ("tcExprApFn: " ++ show (fn, fnt, args, mt)) False = undefined
+tcExprApFn mt fn (EForall {-True-}_ (IdKind i k:iks) ft) (ETypeArg t : args) = do
+  t' <- if t `eqEType` EVar dummyIdent then newUVar else tcType (Check k) t >>= expandSyn
+  tcExprApFn mt fn (subst [(i, t')] $ eForall iks ft) args
+tcExprApFn mt fn atfn aargs = do
+--  traceM $ "tcExprApFn: " ++ show (mt, fn, tfn, aargs)
 --  xx <- gets ctxTables
 --  traceM $ "tcExprApFn: ctxTables=" ++ show xx
   let loc = getSLoc fn
-  (fn', tfn') <- tInst fn tfn
+  (ctxs, tfn') <- tInstDelay atfn
+--  traceM $ "tcExprApFn: (fn', tfn') = " ++ show (fn', tfn')
   let loop ats     [] ft = final ats ft
       loop ats as@(_:_) (EForall _ vks ft) = do
         ft' <- tInstForall vks ft
@@ -1873,6 +2000,7 @@
       loop ats (a:as) ft = do
         (at, rt) <- unArrow loc ft
         loop ((a, at):ats) as rt
+
       final aats rt = do
 
         -- We want to do the unification of rt ant mt before checking the argument to
@@ -1882,11 +2010,11 @@
             ugly = -1::Int
         etmp' <- instSigma loc etmp rt mt
 
-        let apply f [] = return f
-            apply f ((a,at):ats) = do
-              a' <- checkSigma a at
-              apply (EApp f a') ats
-        res <- apply fn' (reverse aats)
+        args <- mapM (uncurry checkSigma) (reverse aats)
+        dicts <- mapM (newDict loc) ctxs
+        let res = foldl EApp fn (dicts ++ args)
+--        traceM (show res)
+
 --        cc <- gets constraints
 --        traceM $ "tcExprApFn: constraints=" ++ show cc
 
@@ -1895,9 +2023,9 @@
           _ -> return $ substEUVar [(ugly, res)] etmp'
 
         instSigma loc res rt mt
-      
-  loop [] args tfn'
 
+  loop [] aargs tfn'
+
 -- Is a pattern failure free?
 failureFree :: EPat -> T Bool
 failureFree p@(EVar _) = failureFreeAp [] p
@@ -1924,7 +2052,7 @@
                                 _ -> False
 failureFreeAp bs (ESign p _) = failureFreeAp bs p
 failureFreeAp _ _ = return False  -- bad pattern, just ignore
-                           
+
 eSetFields :: EField -> Expr -> Expr
 eSetFields (EField is e) r =
   let loc = getSLoc is
@@ -2019,6 +2147,7 @@
           LDouble _  -> tConI loc nameFloatW
           LChar _    -> tConI loc nameChar
           LStr _     -> tApp (tList loc) (tConI loc nameChar)
+          LBStr _    -> tConI loc nameByteString
           _          -> impossible
   tcLit' mt loc l t
 
@@ -2068,7 +2197,13 @@
 
 unArrow :: HasCallStack =>
            SLoc -> EType -> T (EType, EType)
---unArrow loc t@(EForall _ _ _) | trace ("unArrow: " ++ show t) False = undefined
+--unArrow _ t | trace ("unArrow: " ++ show t) False = undefined
+unArrow loc (EForall _ iks t) = do
+  -- Found forall in a co-variant position.
+  -- Make new unique tyvars in case of clashes.
+  -- XXX Is this correct?
+  (_, t') <- shallowSkolemise iks t
+  unArrow loc t'
 unArrow loc t = do
   case getArrow t of
     Just ar -> return ar
@@ -2078,32 +2213,32 @@
       unify loc t (tArrow a r)
       return (a, r)
 
+unTuple :: Expected -> Maybe [EType]
+unTuple (Infer _) = Nothing
+unTuple (Check t) = loop [] t
+  where loop ts (EApp f a) = loop (a:ts) f
+        loop ts (EVar i) | Just n <- getTupleConstr i, length ts == n = Just ts
+        loop _ _ = Nothing
+
+unList :: Expected -> Maybe EType
+unList (Check (EApp (EVar i) t)) | i == identList = Just t
+unList _ = Nothing
+
 getFixity :: FixTable -> Ident -> Fixity
 getFixity fixs i = fromMaybe (AssocLeft, 9) $ M.lookup i fixs
 
--- Dictionary argument names
-adictPrefix :: String
-adictPrefix = "adict"
-
 newADictIdent :: SLoc -> T Ident
 newADictIdent loc = newIdent loc adictPrefix
 
--- Needed dictionaries
-dictPrefix :: String
-dictPrefix = "dict"
-
-dictPrefixDollar :: String
-dictPrefixDollar = dictPrefix ++ uniqIdentSep
-
 newDictIdent :: SLoc -> T Ident
 newDictIdent loc = newIdent loc dictPrefix
 
-tcExprLam :: Expected -> SLoc -> [Eqn] -> T Expr
+tcExprLam :: HasCallStack => Expected -> SLoc -> [Eqn] -> T Expr
 tcExprLam mt loc qs = do
   t <- tGetExpType mt
   ELam loc <$> tcEqns False t qs
 
-tcEqns :: Bool -> EType -> [Eqn] -> T [Eqn]
+tcEqns :: HasCallStack => Bool -> EType -> [Eqn] -> T [Eqn]
 --tcEqns _ t eqns | trace ("tcEqns: " ++ showEBind (Fcn dummyIdent eqns) ++ " :: " ++ show t) False = undefined
 tcEqns top (EForall expl iks t) eqns | expl      = withExtTyps iks $ tcEqns top t eqns
                                      | otherwise =                   tcEqns top t eqns
@@ -2131,7 +2266,7 @@
         eqn = Eqn [] $ EAlts [([], EVar f)] (bs ++ [Fcn f eqns'])
       return [eqn]
 
-tcEqn :: EType -> Eqn -> T Eqn
+tcEqn :: HasCallStack => EType -> Eqn -> T Eqn
 --tcEqn t eqn | trace ("tcEqn: " ++ show eqn ++ " :: " ++ show t) False = undefined
 tcEqn t eqn =
   case eqn of
@@ -2141,14 +2276,15 @@
       return (Eqn ps' alts')
 
 -- Only used above
-tcPats :: EType -> [EPat] -> (EType -> [EPat] -> T Eqn) -> T Eqn
+tcPats :: HasCallStack =>
+          EType -> [EPat] -> (EType -> [EPat] -> T Eqn) -> T Eqn
 tcPats t [] ta = ta t []
 tcPats t (p:ps) ta = do
   (tp, tr) <- unArrow (getSLoc p) t
   -- tCheckPatC dicts used in tcAlt solve
   tCheckPatC tp p $ \ p' -> tcPats tr ps $ \ t' ps' -> ta t' (p' : ps')
 
-tcAlts :: EType -> EAlts -> T EAlts
+tcAlts :: HasCallStack => EType -> EAlts -> T EAlts
 tcAlts t (EAlts alts bs) =
 --  trace ("tcAlts: bs in " ++ showEBinds bs) $
   tcBinds bs $ \ bs' -> do
@@ -2156,7 +2292,7 @@
     alts' <- mapM (tcAlt t) alts
     return (EAlts alts' bs')
 
-tcAlt :: EType -> EAlt -> T EAlt
+tcAlt :: HasCallStack => EType -> EAlt -> T EAlt
 --tcAlt t (_, rhs) | trace ("tcAlt: " ++ showExpr rhs ++ " :: " ++ showEType t) False = undefined
 tcAlt t (ss, rhs) = tcGuards ss $ \ ss' -> do
   rhs' <- tCheckExprAndSolve t rhs
@@ -2186,7 +2322,7 @@
       alts' <- tcAlts t alts
       return (pp, alts')
 
-tCheckExprAndSolve :: EType -> Expr -> T Expr
+tCheckExprAndSolve :: HasCallStack => EType -> Expr -> T Expr
 tCheckExprAndSolve t e = do
   (e', bs) <- solveLocalConstraints $ tCheckExpr t e
   if null bs then
@@ -2210,8 +2346,8 @@
   (skol_tvs, rho2) <- skolemise sigma2
   exp1' <- subsCheckRho loc exp1 sigma1 rho2
   esc_tvs <- getFreeTyVars [sigma1,sigma2]
-  let bad_tvs = filter (\ i -> elem i esc_tvs) skol_tvs
-  when (not (null bad_tvs)) $
+  let bad_tvs = filter (`elem` esc_tvs) skol_tvs
+  unless (null bad_tvs) $
     tcErrorTK loc "Subsumption check failed"
   return exp1'
 
@@ -2244,8 +2380,8 @@
 tcPat :: Expected -> EPat -> T EPatRet
 tcPat mt ae =
   let loc = getSLoc ae
-      lit = tcPat mt (EViewPat (EApp (EVar (mkBuiltin loc "==")) ae) (EVar (mkBuiltin loc "True")))
-      isNeg (EVar i) = i == mkIdent "negate"
+      lit = tcPat mt (EViewPat (EApp (EVar (mkBuiltin loc "==")) ae) (eTrue loc))
+      isNeg (EVar i) = i == mkBuiltin loc "negate"
       isNeg _ = False
   in
   case ae of
@@ -2271,7 +2407,7 @@
     ETuple es -> do
       let
         n = length es
-      (xs, tes) <- fmap unzip (mapM tInferPat es)
+      (xs, tes) <- mapAndUnzipM tInferPat es
       let
         (sks, ds, ees) = unzip3 xs
         ttup = tApps (tupleConstr loc n) tes
@@ -2290,7 +2426,7 @@
     ELit _ _ -> lit
 
     ESign e t -> do
-      t' <- tcType (Check kType) t
+      t' <- tcType (Check kType) t >>= expandSyn
       instPatSigma loc t' mt
       tCheckPat t' e
 
@@ -2304,9 +2440,17 @@
       return (sk, d, EAt i p')
 
     EViewPat e p -> do
-      (e', te) <- tInferExpr e
-      (tea, ter) <- unArrow loc te
-      munify loc mt tea
+      (e', ter) <-
+        case mt of
+          Infer _ -> do
+            (e', te) <- tInferExpr e
+            (tea, ter) <- unArrow loc te
+            munify loc mt tea
+            return (e', ter)
+          Check tea -> do
+            ter <- newUVar
+            e' <- tCheckExpr (tea `tArrow` ter) e
+            return (e', ter)
       (sk, d, p') <- tcPat (Check ter) p
       return (sk, d, EViewPat e' p')
 
@@ -2318,7 +2462,7 @@
     EUpdate p [] -> do
       (p', _) <- tInferExpr p
       case p' of
-        ECon c -> tcPat mt $ eApps p (replicate (conArity c) eDummy)          
+        ECon c -> tcPat mt $ eApps p (replicate (conArity c) eDummy)
         _      -> impossible
     EUpdate p isps -> do
       me <- dsUpdate (const eDummy) p isps
@@ -2355,13 +2499,9 @@
 tcPatApCon mt args con xpt = do
   let loc = getSLoc con
       nargs = length args
-      checkArity ary =
-        if nargs < ary then
-          tcError loc "too few arguments"
-        else if nargs > ary then
-          tcError loc "too many arguments"
-        else
-          return ()
+      checkArity ary | nargs < ary = tcError loc "too few arguments"
+                     | nargs > ary = tcError loc "too many arguments"
+                     | otherwise   = return ()
   case con of
     -- Pattern synonym
     ECon (ConSyn qi n (e, t)) -> do
@@ -2372,10 +2512,10 @@
       tcPat mt vp
 
     -- Regular constructor
-    _ -> do 
+    _ -> do
       case xpt of
          -- Sanity check
-         EForall _ _ (EForall _ _ _) -> return ()
+         EForall _ _ EForall{} -> return ()
          _ -> impossibleShow con
       EForall _ avs apt <- tInst' xpt
 
@@ -2386,7 +2526,7 @@
           Just (ctx, pt') -> do
             di <- newADictIdent loc
             return ([(di, ctx)], EApp con (EVar di), pt')
-          
+
       let ary = arity pf
             where arity (ECon c) = conArity c
                   arity (EApp f _) = arity f - 1  -- deal with dictionary added above
@@ -2417,7 +2557,8 @@
     let v = head vs
     tcError (getSLoc v) $ "Multiply defined: " ++ showIdent v
 
-tcBinds :: forall a . [EBind] -> ([EBind] -> T a) -> T a
+tcBinds :: HasCallStack =>
+           [EBind] -> ([EBind] -> T a) -> T a
 tcBinds xbs ta = withFixes [ (i, fx) | Infix fx is <- xbs, i <- is ] $ do
   let
     tmap = M.fromList [ (i, t) | Sign is t <- xbs, i <- is ]
@@ -2428,14 +2569,14 @@
     nbs <- mapM tcBind xbs
     ta nbs
 
--- Temporarily exten the fixity table
+-- Temporarily extend the fixity table
 withFixes :: [FixDef] -> T a -> T a
 withFixes [] ta = ta
 withFixes fixs ta = do
-  ft <- gets fixTable
-  modify $ \ st -> st{ fixTable = foldr (uncurry M.insert) ft fixs }
+  oft <- gets fixTable
+  modify $ \ st -> st{ fixTable = foldr (uncurry M.insert) oft fixs }
   a <- ta
-  modify $ \ st -> st{ fixTable = ft }
+  modify $ \ st -> st{ fixTable = oft }
   return a
 
 tcBindVarT :: HasCallStack => M.Map EType -> Ident -> T (Ident, EType)
@@ -2445,7 +2586,7 @@
       t <- newUVar
       return (x, t)
     Just t -> do
-      tt <- withTypeTable $ tCheckTypeTImpl False kType t
+      tt <- withTypeTable $ tCheckTypeTImpl False kType t >>= expandSyn
       return (x, tt)
 
 tcBind :: EBind -> T EBind
@@ -2482,7 +2623,8 @@
     EForall b iks t -> EForall b iks (dsType t)
     ELit _ (LStr _) -> at
     ELit _ (LInteger _) -> at
-    _ -> impossible
+    EQVar _ _ -> at
+    _ -> impossibleShow at
 
 tListI :: SLoc -> Ident
 tListI loc = mkIdentSLoc loc nameList
@@ -2531,10 +2673,6 @@
   putUvarSubst osubst  -- reset the setUVar we did above
   return (EForall False newVarsK ty')
 
-allBinders :: [Ident] -- a,b,...,z,a1,a2,...
-allBinders = [ mkIdent [x] | x <- ['a' .. 'z'] ] ++
-             [ mkIdent ('a' : show i) | i <- [1::Int ..]]
-
 -- Skolemize the given variables
 shallowSkolemise :: [IdKind] -> EType -> T ([TyVar], EType)
 shallowSkolemise tvs ty = do
@@ -2570,7 +2708,7 @@
 metaTvs tys = foldr go [] tys
   where
     go (EUVar tv) acc
-      | elem tv acc = acc
+      | tv `elem` acc = acc
       | otherwise = tv : acc
     go (EVar _) acc = acc
     go (EForall _ _ ty) acc = go ty acc
@@ -2602,8 +2740,8 @@
    else do
     env_tys <- getEnvTypes
     esc_tvs <- getFreeTyVars (sigma : env_tys)
-    let bad_tvs = filter (\ i -> elem i esc_tvs) skol_tvs
-    when (not (null bad_tvs)) $
+    let bad_tvs = filter (`elem` esc_tvs) skol_tvs
+    unless (null bad_tvs) $
       tcErrorTK (getSLoc expr) $ "not polymorphic enough: " ++ unwords (map showIdent bad_tvs)
     return expr'
 
@@ -2615,7 +2753,7 @@
   let sub = [(v1, EVar v2) | (IdKind v1 _, IdKind v2 _) <- zip vs1 vs2]
   unify loc (subst sub t1) t2
   return exp1
-subsCheckRho loc exp1 sigma1@(EForall _ _ _) rho2 = do -- Rule SPEC
+subsCheckRho loc exp1 sigma1@EForall{} rho2 = do -- Rule SPEC
   (exp1', rho1) <- tInst exp1 sigma1
   subsCheckRho loc exp1' rho1 rho2
 subsCheckRho loc exp1 arho1 rho2 | Just _ <- getImplies arho1 = do
@@ -2641,9 +2779,10 @@
 instSigma :: HasCallStack =>
              SLoc -> Expr -> Sigma -> Expected -> T Expr
 instSigma loc e1 t1 (Check t2) = do
---  tcTrace ("instSigma: Check " ++ showEType t1 ++ " = " ++ showEType t2)
+  --tcTrace ("instSigma: Check e1=" ++ show e1 ++ " t1=" ++ showEType t1 ++ " t2=" ++ showEType t2)
   subsCheckRho loc e1 t1 t2
 instSigma loc e1 t1 (Infer r) = do
+  --tcTrace ("instSigma: Infer e1=" ++ show e1 ++ " t1=" ++ showEType t1 ++ " r=" ++ show r)
   (e1', t1') <- tInst e1 t1
   --tcTrace ("instSigma: Infer " ++ showEType t1 ++ " ==> " ++ showEType t1')
   tSetRefType loc r t1'
@@ -2752,7 +2891,7 @@
 
       ddata = Data lhs [cm, cn] []
             where lhs = (unQualIdent tycon, vks1)
-                  cm = Constr vks2 (if isEmptyCtx ctx2 then [] else [ctx2]) (unQualIdent mi) (Left $ zip (repeat False) ats)
+                  cm = Constr vks2 (if isEmptyCtx ctx2 then [] else [ctx2]) (unQualIdent mi) (Left $ map ((,) False) ats)
                   cn = Constr []   []                                       (unQualIdent ni) (Left [])
 
   in  -- trace ("M :: " ++ show tm ++ ",  N :: " ++ show tn) $
@@ -2781,8 +2920,7 @@
       getImplies' :: EType -> (EConstraint, EType)
       getImplies' ty = fromMaybe (emptyCtx, ty) $ getImplies ty
 
-  at' <- expandSyn at
-  case at' of
+  case at of
     EForall False vks t0 -> do
       -- Implicit forall, the xs need to be split between required and provided.
       let (reqCtx, t1) = getImplies' t0
@@ -2818,12 +2956,12 @@
 --  * components of a tupled constraint
 --  * superclasses of a constraint
 expandDict :: HasCallStack => Expr -> EConstraint -> T [InstDictC]
-expandDict edict ct = expandDict' [] [] edict =<< expandSyn ct
+expandDict edict ct = expandDict' [] [] edict ct
 
 expandDict' :: HasCallStack => [IdKind] -> [EConstraint] -> Expr -> EConstraint -> T [InstDictC]
 expandDict' avks actx edict acc = do
   let
-    (bvks, bctx, cc) = splitInst acc
+    (bvks, bctx, cc) = splitContext acc
     (iCls, args) = getApp cc
     vks = avks ++ bvks
     ctx = actx ++ bctx
@@ -2833,19 +2971,15 @@
     Nothing -> do
       ct <- gets classTable
       case M.lookup iCls ct of
-        Nothing ->
-         -- XXX ~ could be in the symbol table
-         if iCls == mkIdent "Primitives.~" then
-          return []
-         else do
+        Nothing -> do
           -- if iCls is a variable it's not in the class table, otherwise it's an error
           when (isConIdent iCls) $
             --impossible
             -- XXX it seems we can get here, e.g., Control.Monad.Fail without Applicative import
-            error ("expandDict: " ++ showExprRaw acc)
+            impossibleShow (acc, iCls)
           return [(edict, vks, ctx, cc, [])]
         Just (ClassInfo iks sups _ _ fds) -> do
-          let 
+          let
             vs = map idKindIdent iks
             sub = zip vs args
             sups' = map (subst sub) sups
@@ -2942,11 +3076,11 @@
 showInstDef (cls, InstInfo m ds _) = "instDef " ++ show cls ++ ": "
             ++ show (M.toList m) ++ ", " ++ showListS showInstDict ds
 
-showConstraint :: (Ident, EConstraint) -> String
-showConstraint (i, t) = show i ++ " :: " ++ show t
-
 showMatch :: (Expr, [EConstraint]) -> String
 showMatch (e, ts) = show e ++ " " ++ show ts
+
+showConstraint :: (Ident, EConstraint) -> String
+showConstraint (i, t) = show i ++ " :: " ++ show t
 -}
 
 type Goal = (Ident, EType)     -- What we want to solve
@@ -3088,8 +3222,8 @@
       return $ Just (ETuple [], ncs, [])
 solveTypeEq _ _ _ = impossible
 
-solveCoercible :: SolveOne
-solveCoercible loc _iCls [t1, t2] = do
+solveCoercible :: HasCallStack => SolveOne
+solveCoercible loc iCls [t1, t2] = do
   st <- gets synTable
   extNewtypeSyns        -- pretend newtypes are type synonyms
   t1' <- expandSyn t1
@@ -3099,8 +3233,8 @@
   -- and generate new Coercible constraints when not equal.
 --  traceM $ "solveCoercible: " ++ showExprRaw t1' ++ " and " ++ showExprRaw t2'
   case genCoerce t1' t2' of
-    Nothing -> return Nothing
-    Just [(u1, u2)] | u1 `eqEType` t1 && u2 `eqEType` t2 -> return Nothing  -- Nothing has improved
+    Nothing -> solveInstCoercible loc iCls t1 t2  -- look for a dict argument
+    Just [(u1, u2)] | u1 `eqEType` t1 && u2 `eqEType` t2 -> solveInstCoercible loc iCls t1 t2  -- look for a dict argument
     Just tts -> do
       let mkCo (u1, u2) = do
             i <- newDictIdent loc
@@ -3118,6 +3252,13 @@
 genCoerce (EApp f1 a1) (EApp f2 a2) = (++) <$> genCoerce f1 f2 <*> genCoerce a1 a2
 genCoerce _ _ = Nothing
 
+solveInstCoercible :: SLoc -> Ident -> EType -> EType -> T (Maybe (Expr, [Goal], [Improve]))
+solveInstCoercible loc iCls t1 t2 = do
+  msol <- solveInst loc iCls [t1, t2]
+  case msol of
+    Nothing -> solveInst loc iCls [t2, t1]
+    Just _ -> pure msol
+
 -- Pretend newtypes are type synonyms.
 -- XXX It's rather inefficient to do this over and over.
 extNewtypeSyns :: T ()
@@ -3129,11 +3270,11 @@
           -- it should be visible.
           let t = either (snd . head) (snd . snd . head) et
 --          traceM $ "extNewtypeSyns: " ++ showIdent qi ++ show vs ++ " = " ++ showExprRaw t
-          extSyn qi (EForall True vs t)  -- extend synonym table
+          extSyn qi vs t  -- extend synonym table
       ext _ = return ()
   mapM_ ext $ M.toList dt
-  
 
+
 isEUVar :: EType -> Bool
 isEUVar (EUVar _) = True
 isEUVar _ = False
@@ -3267,12 +3408,6 @@
   d <- newDictIdent loc
   addConstraint d (mkEqType loc t1 t2)
 
-mkEqType :: SLoc -> EType -> EType -> EConstraint
-mkEqType loc t1 t2 = eAppI2 (mkIdentSLoc loc nameTypeEq) t1 t2
-
-mkCoercible :: SLoc -> EType -> EType -> EConstraint
-mkCoercible loc t1 t2 = eAppI2 (mkIdentSLoc loc nameCoercible) t1 t2
-
 -- Possibly solve a type equality.
 -- Just normalize both types and compare.
 solveEq :: TypeEqTable -> EType -> EType -> Maybe [(EType, EType)]
@@ -3355,27 +3490,35 @@
 -}
 
 doDeriving :: EDef -> T [EDef]
-doDeriving def@(Data    lhs cs ds) = (def:) . concat <$> mapM (deriveHdr lhs  cs) ds
-doDeriving def@(Newtype lhs  c ds) = (def:) . concat <$> mapM (deriveHdr lhs [c]) ds
-doDeriving def@(Deriving ct)       = (def:) <$> standaloneDeriving ct
-doDeriving def                     = return [def]
+doDeriving def@(Data    lhs cs ds)    = (def:) . concat <$> mapM (deriveDer False lhs  cs) ds
+doDeriving def@(Newtype lhs  c ds)    = (def:) . concat <$> mapM (deriveDer True  lhs [c]) ds
+doDeriving (StandDeriving as _ act) = do
+  -- The StandDeriving has not been typechecked yet, so do it now.
+  def@(StandDeriving s n ct) <- withTypeTable $ tcStand as act
+  (def:) <$> standaloneDeriving s n ct
+doDeriving def                        = return [def]
 
-standaloneDeriving :: EType -> T [EDef]
-standaloneDeriving act = do
-  (_vks, _ctx, cc) <- splitInst <$> expandSyn act
-  dtable <- gets dataTable
---  traceM ("standaloneDeriving 1 " ++ show (ctx, cc))
-  (cls, tname) <-
+deriveDer :: Bool -> LHS -> [Constr] -> Deriving -> T [EDef]
+deriveDer newt lhs cs (Deriving strat ds) = concat <$> mapM (deriveStrat Nothing newt lhs cs strat) ds
+
+standaloneDeriving :: DerStrategy -> Int -> EConstraint -> T [EDef]
+standaloneDeriving str narg act = do
+  let (_vks, _ctx, cc) = splitContext act
+--  traceM ("standaloneDeriving 1 " ++ show (_vks, _ctx, cc))
+  (cls, ts, tname) <-
     case getAppM cc of
-      Just (c, ts@(_:_)) |
-        let t = last ts,
-        Just (n, _) <- getAppM t -> return (tApps c (init ts), n)
+      Just (c, ts@(_:_)) | Just (n, _) <- getAppM (last ts) -> return (c, init ts, n)
       _ -> tcError (getSLoc act) "malformed standalone deriving"
 --  traceM ("standaloneDeriving 2 " ++ show (act, cls, tname))
-  (lhs, cs) <-
+  dtable <- gets dataTable
+  (lhs, newt, cs) <-
     case M.lookup tname dtable of
-      Just (Newtype l  c _) -> return (l, [c])
-      Just (Data    l xs _) -> return (l, xs)
+      Just (Newtype l  c _) -> return (l, True,  [c])
+      Just (Data    l xs _) -> return (l, False, xs)
       _ -> tcError (getSLoc act) ("not data/newtype " ++ showIdent tname)
   -- We want 'instance ctx => cls ty'
-  deriveNoHdr act lhs cs cls
+  deriveStrat (Just act) newt lhs cs str (narg, tApps cls ts)
+
+chksym :: T ()
+chksym = return ()
+--  vt <- gets valueTable
diff --git a/src/Text/ParserComb.hs b/src/Text/ParserComb.hs
--- a/src/Text/ParserComb.hs
+++ b/src/Text/ParserComb.hs
@@ -5,13 +5,11 @@
 module Text.ParserComb(
   Prsr, runPrsr,
   satisfy, satisfyM,
-  satisfyMany,
-  choice,
-  many, emany, optional, eoptional,
-  some, esome,
-  esepBy, sepBy1, esepBy1,
-  esepEndBy, esepEndBy1,
-  (<?>), (<|<),
+  many, optional, some,
+  sepBy, sepBy1,
+  sepEndBy, sepEndBy1,
+  (<?>),
+  (<<),
   --notFollowedBy,
   --lookAhead,
   nextToken,
@@ -19,9 +17,9 @@
   TokenMachine(..),
   mapTokenState,
   ) where
-import Prelude(); import MHSPrelude hiding (fail)
+import qualified Prelude(); import MHSPrelude hiding (fail)
 import Control.Applicative
-import Control.Monad.Fail
+import Control.Monad.Fail as F
 import Control.Monad
 
 data LastFail t
@@ -35,16 +33,10 @@
 noFail = LastFail maxInt [] []
 
 longest :: forall t . LastFail t -> LastFail t -> LastFail t
-longest lf1@(LastFail l1 t1 x1) lf2@(LastFail l2 _ x2) =
-  if l1 < l2 then
-    lf1
-  else if l2 < l1 then
-    lf2
-  else
-    LastFail l1 t1 (x1 ++ x2)
-
-longests :: forall t . [LastFail t] -> LastFail t
-longests xs = foldl1 longest xs
+longest lf1@(LastFail l1 t1 x1) lf2@(LastFail l2 _ x2)
+  | l1 < l2   = lf1
+  | l2 < l1   = lf2
+  | otherwise = LastFail l1 t1 (x1 ++ x2)
 
 class TokenMachine tm t | tm -> t where
   tmNextToken :: tm -> (t, tm)
@@ -58,7 +50,7 @@
   case tmNextToken tm of
     (t, _) -> [t]
 
-data Res tm t a = Many [(a, tm)] (LastFail t)
+data Res tm t a = Success a tm (LastFail t) | Failure (LastFail t)
   --deriving (Show)
 
 newtype Prsr tm t a = P (tm -> Res tm t a)
@@ -68,81 +60,83 @@
 runP (P p) = p
 
 mapTokenState :: forall tm t . (tm -> tm) -> Prsr tm t ()
-mapTokenState f = P (\ tm -> Many [((), f tm)] noFail)
+mapTokenState f = P (\tm -> Success () (f tm) noFail)
 
 instance Functor (Prsr tm t) where
-  fmap f p = P $ \ t ->
+  fmap f p = P $ \t ->
     case runP p t of
-      Many aus lf -> Many [ (f a, u) | (a, u) <- aus ] lf
+      Success a u lf -> Success (f a) u lf
+      Failure lf -> Failure lf
 
 instance Applicative (Prsr tm t) where
-  pure a = P $ \ t -> Many [(a, t)] noFail
-  (<*>) = ap
+  pure a = P $ \t -> Success a t noFail
+  f <*> a = P $ \t ->
+    case runP f t of
+      Failure lf -> Failure lf
+      Success f' t' lff ->
+        case runP a t' of
+          Failure lfa -> Failure (longest lff lfa)
+          Success a' t'' lfa -> Success (f' a') t'' (longest lff lfa)
 -- Hugs does not have *> here
 --  (*>) p k = p >>= \ _ -> k
 
+(<<) :: Prsr tm t a -> Prsr tm t b -> Prsr tm t a
+(<<) f a = P $ \t ->
+    case runP f t of
+      Failure lf -> Failure lf
+      Success f' t' lff ->
+        case runP a t' of
+          Failure lfa -> Failure (longest lff lfa)
+          Success _ t'' lfa -> Success f' t'' (longest lff lfa)
+
 instance Monad (Prsr tm t) where
-  (>>=) p k = P $ \ t ->
+  (>>=) p k = P $ \t ->
     case runP p t of
-      Many aus plf ->
-        let ms = map (\ (a, u) -> runP (k a) u) aus
-            lfs = map (\ (Many _ lf) -> lf) ms
-            rrs = [ r | Many rs _ <- ms, r <- rs ]
-        in  Many rrs (longests (plf : lfs))
-  (>>) p k = p >>= \ _ -> k
+      Success a u lfa ->
+        case runP (k a) u of
+          Success b v lfb -> Success b v (longest lfa lfb)
+          Failure lfb -> Failure (longest lfa lfb)
+      Failure lf -> Failure lf
+  (>>) p k = p >>= const k
   return = pure
 
 instance TokenMachine tm t => MonadFail (Prsr tm t) where
-  fail m = P $ \ ts -> Many [] (LastFail (tmLeft ts) (firstToken ts) [m])
+  fail m = P $ \ts -> Failure (LastFail (tmLeft ts) (firstToken ts) [m])
 
 instance TokenMachine tm t => Alternative (Prsr tm t) where
-  empty = P $ \ ts -> Many [] (LastFail (tmLeft ts) (firstToken ts) ["empty"])
+  empty = F.fail "empty"
 
   (<|>) p q = P $ \ t ->
     case runP p t of
-      Many a lfa ->
+      Failure lfa ->
         case runP q t of
-          Many b lfb -> Many (a ++ b) (longest lfa lfb)
+          Success b v lfb -> Success b v (longest lfa lfb)
+          Failure lfb -> Failure (longest lfa lfb)
+      r -> r
 
 instance TokenMachine tm t => MonadPlus (Prsr tm t) where
-  mzero = empty
+  mzero = fail "mzero"
   mplus = (<|>)
 
--- Left biased choice
-infixl 3 <|<
-(<|<) :: forall tm t a . Prsr tm t a -> Prsr tm t a -> Prsr tm t a
-(<|<) p q = P $ \ t ->
-  case runP p t of
-    Many [] lfa ->
-      case runP q t of
-         Many b lfb -> Many b (longest lfa lfb)
-    r -> r
-
 satisfy :: forall tm t . TokenMachine tm t => String -> (t -> Bool) -> Prsr tm t t
 satisfy msg f = P $ \ acs ->
   case tmNextToken acs of
-    r@(c, _) | f c -> Many [r] noFail
-    _ -> Many [] (LastFail (tmLeft acs) (firstToken acs) [msg])
+    (c, cs) | f c -> Success c cs noFail
+    _ -> Failure (LastFail (tmLeft acs) (firstToken acs) [msg])
 
 satisfyM :: forall tm t a . TokenMachine tm t => String -> (t -> Maybe a) -> Prsr tm t a
 satisfyM msg f = P $ \ acs ->
   case tmNextToken acs of
-    (c, cs) | Just a <- f c -> Many [(a, cs)] noFail
-    _ -> Many [] (LastFail (tmLeft acs) (firstToken acs) [msg])
-
-satisfyMany :: forall tm t . TokenMachine tm t => (t -> Bool) -> Prsr tm t [t]
-satisfyMany f = P $ loop []
-  where loop res acs =
-          case tmNextToken acs of
-            (c, cs) | f c -> loop (c:res) cs
-                    | otherwise -> Many [(reverse res, acs)] noFail
+    (c, cs) | Just a <- f c -> Success a cs noFail
+    _ -> Failure (LastFail (tmLeft acs) (firstToken acs) [msg])
 
 infixl 9 <?>
 (<?>) :: forall tm t a . Prsr tm t a -> String -> Prsr tm t a
 (<?>) p e = P $ \ t ->
 --  trace ("<?> " ++ show e) $
   case runP p t of
-    Many rs (LastFail l ts _) -> Many rs (LastFail l ts [e])
+    Failure (LastFail l ts _) -> Failure (LastFail l ts [e])
+    s -> s
 
 {-
 lookAhead :: forall tm t a . TokenMachine tm t => Prsr tm t a -> Prsr tm t ()
@@ -155,7 +149,7 @@
 nextToken :: forall tm t . TokenMachine tm t => Prsr tm t t
 nextToken = P $ \ cs ->
   case tmNextToken cs of
-    (c, _) -> Many [(c, cs)] noFail
+    (c, _) -> Success c cs noFail
 
 {-
 eof :: forall tm t . TokenMachine tm t => Prsr tm t ()
@@ -174,39 +168,22 @@
 -}
 
 runPrsr :: forall tm t a . --X(Show a, Show s) =>
-           Prsr tm t a -> tm -> Either (LastFail t) [a]
+           Prsr tm t a -> tm -> Either (LastFail t) a
 runPrsr (P p) f =
   case p f of
-    Many [] lf -> Left lf
-    Many xs _  -> Right [a | (a, _) <- xs ]
+    Failure lf    -> Left lf
+    Success a _ _ -> Right a
 
 -------------------------------
 
-emany :: forall tm t a . Prsr tm t a -> Prsr tm t [a]
-emany p = esome p <|< pure []
-
-esome :: forall tm t a . Prsr tm t a -> Prsr tm t [a]
-esome p = (:) <$> p <*> emany p
-
-eoptional :: forall tm t a . Prsr tm t a -> Prsr tm t (Maybe a)
-eoptional p = (Just <$> p) <|< pure Nothing
-
-choice :: forall tm t a . TokenMachine tm t => [Prsr tm t a] -> Prsr tm t a
-choice [] = empty
-choice ps = foldr1 (<|>) ps
-
-sepBy1 :: forall tm t a sep . TokenMachine tm t => Prsr tm t a -> Prsr tm t sep -> Prsr tm t [a]
+sepBy1 :: TokenMachine tm t => Prsr tm t a -> Prsr tm t sep -> Prsr tm t [a]
 sepBy1 p sep = (:) <$> p <*> many (sep >> p)
 
-esepBy1 :: forall tm t a sep . Prsr tm t a -> Prsr tm t sep -> Prsr tm t [a]
-esepBy1 p sep = (:) <$> p <*> emany (sep >> p)
-
-esepBy :: forall tm t a sep . Prsr tm t a -> Prsr tm t sep -> Prsr tm t [a]
-esepBy p sep = esepBy1 p sep <|< pure []
-
-esepEndBy :: forall tm t a sep . Prsr tm t a -> Prsr tm t sep -> Prsr tm t [a]
-esepEndBy p sep = esepEndBy1 p sep <|< pure []
+sepBy :: TokenMachine tm t => Prsr tm t a -> Prsr tm t sep -> Prsr tm t [a]
+sepBy p sep = sepBy1 p sep <|> pure []
 
-esepEndBy1 :: forall tm t a sep . Prsr tm t a -> Prsr tm t sep -> Prsr tm t [a]
-esepEndBy1 p sep = (:) <$> p <*> ((sep >> esepEndBy p sep) <|< pure [])
+sepEndBy :: TokenMachine tm t => Prsr tm t a -> Prsr tm t sep -> Prsr tm t [a]
+sepEndBy p sep = sepEndBy1 p sep <|> pure []
 
+sepEndBy1 :: TokenMachine tm t => Prsr tm t a -> Prsr tm t sep -> Prsr tm t [a]
+sepEndBy1 p sep = (:) <$> p <*> ((sep >> sepEndBy p sep) <|> pure [])
diff --git a/src/Text/PrettyPrint/HughesPJLite.hs b/src/Text/PrettyPrint/HughesPJLite.hs
--- a/src/Text/PrettyPrint/HughesPJLite.hs
+++ b/src/Text/PrettyPrint/HughesPJLite.hs
@@ -17,7 +17,7 @@
   Style,
   render, renderStyle,
   ) where
-import Prelude(); import MHSPrelude hiding ((<>))
+import qualified Prelude(); import MHSPrelude hiding ((<>))
 
 infixl 6 <>, <+>
 infixl 5 $$, $+$
@@ -46,13 +46,13 @@
 reduceDoc p              = p
 
 hcat :: [Doc] -> Doc
-hcat = snd . reduceHoriz . foldr (\p q -> Beside p False q) empty
+hcat = snd . reduceHoriz . foldr (`Beside` False) empty
 
 hsep :: [Doc] -> Doc
-hsep = snd . reduceHoriz . foldr (\p q -> Beside p True q)  empty
+hsep = snd . reduceHoriz . foldr (`Beside` True)  empty
 
 vcat :: [Doc] -> Doc
-vcat = snd . reduceVert . foldr (\p q -> Above p False q) empty
+vcat = snd . reduceVert . foldr (`Above` False) empty
 
 nest :: Int -> Doc -> Doc
 nest k p = mkNest k (reduceDoc p)
@@ -139,9 +139,9 @@
 above_ p g q     = Above p g q
 
 above :: Doc -> Bool -> RDoc -> RDoc
-above (Above p g1 q1)  g2 q2 = above p g1 (above q1 g2 q2)
-above p@(Beside _ _ _) g  q  = aboveNest (reduceDoc p) g 0 (reduceDoc q)
-above p g q                  = aboveNest p             g 0 (reduceDoc q)
+above (Above p g1 q1) g2 q2 = above p g1 (above q1 g2 q2)
+above p@Beside{}      g  q  = aboveNest (reduceDoc p) g 0 (reduceDoc q)
+above p g q                 = aboveNest p             g 0 (reduceDoc q)
 
 -- Specfication: aboveNest p g k q = p $g$ (nest k q)
 aboveNest :: RDoc -> Bool -> Int -> RDoc -> RDoc
@@ -162,8 +162,8 @@
                                                 Empty -> nilAboveNest g k1 q
                                                 _     -> aboveNest  p g k1 q
 
-aboveNest (Above  _ _ _)      _ _ _ = error "aboveNest Above"
-aboveNest (Beside _ _ _)      _ _ _ = error "aboveNest Beside"
+aboveNest Above{}             _ _ _ = error "aboveNest Above"
+aboveNest Beside{}            _ _ _ = error "aboveNest Beside"
 
 -- Specification: text s <> nilaboveNest g k q
 --              = text s <> (text "" $g$ nest k q)
@@ -199,7 +199,7 @@
 beside p@(Beside p1 g1 q1) g2 q2
          | g1 == g2              = beside p1 g1 $! beside q1 g2 q2
          | otherwise             = beside (reduceDoc p) g2 q2
-beside p@(Above _ _ _)     g q   = let { d = reduceDoc p } in beside d g q
+beside p@Above{}           g q   = let { d = reduceDoc p } in beside d g q
 beside (NilAbove p)        g q   = nilAbove_ $! beside p g q
 beside (TextBeside t p)    g q   = TextBeside t rest
                                where
@@ -242,8 +242,8 @@
 sep1 _ (NilAbove p)        k ys = nilAbove_
                                   (aboveNest p False k (reduceDoc (vcat ys)))
 sep1 g (TextBeside s p) k ys    = textBeside_ s (sepNB g p (k - length s) ys)
-sep1 _ (Above _ _ _)       _ _  = error "sep1 Above"
-sep1 _ (Beside _ _ _)      _ _  = error "sep1 Beside"
+sep1 _ Above{}             _ _  = error "sep1 Above"
+sep1 _ Beside{}            _ _  = error "sep1 Beside"
 
 sepNB :: Bool -> Doc -> Int -> [Doc] -> Doc
 sepNB g (Nest _ p) k ys
@@ -258,14 +258,14 @@
   = sep1 g p k ys
 
 oneLiner :: Doc -> Doc
-oneLiner NoDoc               = NoDoc
-oneLiner Empty               = Empty
-oneLiner (NilAbove _)        = NoDoc
-oneLiner (TextBeside s p)    = textBeside_ s (oneLiner p)
-oneLiner (Nest k p)          = nest_ k (oneLiner p)
-oneLiner (p `Union` _)       = oneLiner p
-oneLiner (Above _ _ _)       = error "oneLiner Above"
-oneLiner (Beside _ _ _)      = error "oneLiner Beside"
+oneLiner NoDoc            = NoDoc
+oneLiner Empty            = Empty
+oneLiner (NilAbove _)     = NoDoc
+oneLiner (TextBeside s p) = textBeside_ s (oneLiner p)
+oneLiner (Nest k p)       = nest_ k (oneLiner p)
+oneLiner (p `Union` _)    = oneLiner p
+oneLiner Above{}          = error "oneLiner Above"
+oneLiner Beside{}         = error "oneLiner Beside"
 
 -- ---------------------------------------------------------------------------
 -- Rendering
@@ -305,7 +305,7 @@
 
     ribbonLen   = (lineLen * den) `quot` num
     bestLineLen = lineLen
-                    
+
 display :: Int -> Int -> String -> Doc -> String
 display _page_width _ribbon_width end doc
   = let lay :: Int -> Doc -> String
@@ -355,7 +355,7 @@
 nicest1 :: Int -> Int -> Int -> Doc -> Doc -> Doc
 nicest1 w r sl p q | fits (minWR - sl) p = p
                    | otherwise           = q
-  where minWR = if w < r then w else r
+  where minWR = min w r
 
 fits :: Int  -- Space available
      -> Doc
@@ -404,8 +404,8 @@
 fill1 g (Nest n p)          k ys = nest_ n (fill1 g p (k - n) ys)
 fill1 g (NilAbove p)        k ys = nilAbove_ (aboveNest p False k (fill g ys))
 fill1 g (TextBeside s p)    k ys = textBeside_ s (fillNB g p k ys)
-fill1 _ (Above _ _ _)       _ _  = error "fill1 Above"
-fill1 _ (Beside _ _ _)      _ _  = error "fill1 Beside"
+fill1 _ Above{}             _ _  = error "fill1 Above"
+fill1 _ Beside{}            _ _  = error "fill1 Beside"
 
 fillNB :: Bool -> Doc -> Int -> [Doc] -> Doc
 fillNB _ _           k _  | k `seq` False = undefined
diff --git a/src/runtime/bfile.c b/src/runtime/bfile.c
--- a/src/runtime/bfile.c
+++ b/src/runtime/bfile.c
@@ -5,7 +5,7 @@
  * There are two kinds: endpoints (source/sink) and transducers.
  * The streams are typically bytes.
  *
- *  FILE   source/sink for stdio FILE handles, handles
+ *  FILE   source/sink for stdio FILE handles
  *  buf    source/sink where the read/write uses a memory buffer.
  *
  *  lz77   transducer for LZ77 compression
@@ -40,6 +40,14 @@
     ERR("bfbuffer_init");
 }
 
+int
+bfbuffer_get(struct bfbuffer *bf)
+{
+  if (bf->pos >= bf->size)
+    return -1;
+  return bf->buf[bf->pos++];
+}
+
 void
 bfbuffer_snoc(struct bfbuffer *bf, int byte)
 {
@@ -52,6 +60,33 @@
   bf->buf[bf->pos++] = byte;
 }
 
+size_t
+bfbuffer_read(struct bfbuffer *bf, uint8_t *buf, size_t size)
+{
+  if (bf->pos + size > bf->size) {
+    size = bf->size - bf->pos;
+  }
+  memcpy(buf, bf->buf + bf->pos, size);
+  bf->pos += size;
+  return size;
+}
+
+size_t
+bfbuffer_write(struct bfbuffer *bf, const uint8_t *str, size_t size)
+{
+  if (bf->pos + size > bf->size) {
+    do {
+      bf->size *= 2;
+    } while (bf->pos + size > bf->size);
+    bf->buf = REALLOC(bf->buf, bf->size);
+    if (!bf->buf)
+      ERR("bfbuffer_write");
+  }
+  memcpy(bf->buf + bf->pos, str, size);
+  bf->pos += size;
+  return size;
+}
+
 void
 bfbuffer_free(struct bfbuffer *bf)
 {
@@ -70,6 +105,8 @@
   void (*putb)(int, struct BFILE*);
   void (*flushb)(struct BFILE*);
   void (*closeb)(struct BFILE*);
+  size_t (*readb)(uint8_t *, size_t, struct BFILE*); /* optional block read */
+  size_t (*writeb)(const uint8_t *, size_t, struct BFILE*); /* optional block write */
 } BFILE;
 
 static INLINE int
@@ -111,19 +148,40 @@
 }
 
 size_t
-readb(void *abuf, size_t size, BFILE *p)
+readb(uint8_t *buf, size_t size, BFILE *p)
 {
-  uint8_t *buf = abuf;
-  size_t s;
-  for (s = 0; s < size; s++) {
-    int c = getb(p);
-    if (c < 0)
-      break;
-    buf[s] = c;
+  if (p->readb) {
+    /* If there is a read method, use it. */
+    return p->readb(buf, size, p);
+  } else {
+    /* Otherwise, do it byte by byte. */
+    size_t s;
+    for (s = 0; s < size; s++) {
+      int c = getb(p);
+      if (c < 0)
+        break;
+      buf[s] = c;
+    }
+    return s;
   }
-  return s;
 }
 
+size_t
+writeb(const uint8_t *str, size_t size, BFILE *p)
+{
+  if (p->writeb) {
+    /* If there is a write method, use it. */
+    return p->writeb(str, size, p);
+  } else {
+    /* Otherwise, do it byte by byte. */
+    size_t s;
+    for(s = 0; s < size; s++) {
+      putb(str[s], p);
+    }
+    return s;
+  }
+}
+
 /* convert -n to a string, handles MINBOUND correctly */
 void
 putnegb(value_t n, BFILE *p)
@@ -168,9 +226,7 @@
 /***************** BFILE from/to memory buffer *******************/
 struct BFILE_buffer {
   BFILE    mets;
-  size_t   b_size;
-  size_t   b_pos;
-  uint8_t  *b_buffer;
+  struct bfbuffer bf;
 };
 
 int
@@ -178,9 +234,8 @@
 {
   struct BFILE_buffer *p = (struct BFILE_buffer *)bp;
   CHECKBFILE(bp, getb_buf);
-  if (p->b_pos >= p->b_size)
-    return -1;
-  return p->b_buffer[p->b_pos++];
+
+  return bfbuffer_get(&p->bf);
 }
 
 void
@@ -188,13 +243,8 @@
 {
   struct BFILE_buffer *p = (struct BFILE_buffer *)bp;
   CHECKBFILE(bp, getb_buf);
-  if (p->b_pos >= p->b_size) {
-    p->b_size *= 2;
-    p->b_buffer = realloc(p->b_buffer, p->b_size);
-    if (!p->b_buffer)
-      ERR("putb_buf");
-  }
-  p->b_buffer[p->b_pos++] = c;
+
+  bfbuffer_snoc(&p->bf, c);
 }
 
 void
@@ -202,9 +252,9 @@
 {
   struct BFILE_buffer *p = (struct BFILE_buffer *)bp;
   CHECKBFILE(bp, getb_buf);
-  if (p->b_pos == 0)
+  if (p->bf.pos == 0)
     ERR("ungetb");
-  p->b_buffer[--p->b_pos] = (uint8_t)c;
+  p->bf.buf[--p->bf.pos] = (uint8_t)c;
 }
 
 void
@@ -227,6 +277,24 @@
   CHECKBFILE(bp, getb_buf);
 }
 
+size_t
+readb_buf(uint8_t *buf, size_t size, BFILE *bp)
+{
+  struct BFILE_buffer *p = (struct BFILE_buffer *)bp;
+  CHECKBFILE(bp, getb_buf);
+
+  return bfbuffer_read(&p->bf, buf, size);
+}
+
+size_t
+writeb_buf(const uint8_t *str, size_t size, BFILE *bp)
+{
+  struct BFILE_buffer *p = (struct BFILE_buffer *)bp;
+  CHECKBFILE(bp, getb_buf);
+
+  return bfbuffer_write(&p->bf, str, size);
+}
+
 struct BFILE*
 openb_rd_buf(uint8_t *buf, size_t len)
 {
@@ -238,9 +306,11 @@
   p->mets.putb = 0;
   p->mets.flushb = 0;
   p->mets.closeb = closeb_rd_buf;
-  p->b_size = len;
-  p->b_pos = 0;
-  p->b_buffer = buf;
+  p->mets.readb = readb_buf;
+  p->mets.writeb = 0;
+  p->bf.size = len;
+  p->bf.pos = 0;
+  p->bf.buf = buf;
   return (struct BFILE*)p;
 }
 
@@ -255,15 +325,13 @@
   p->mets.putb = putb_buf;
   p->mets.flushb = flushb_buf;
   p->mets.closeb = closeb_wr_buf;
-  p->b_size = 1000;
-  p->b_pos = 0;
-  p->b_buffer = malloc(p->b_size);
-  if (!p->b_buffer)
-    ERR("openb_wr_buf");
+  p->mets.readb = 0;
+  p->mets.writeb = writeb_buf;
+  bfbuffer_init(&p->bf, 1000);
   return (struct BFILE*)p;
 }
 
-/* 
+/*
  * Get the buffer used by writing.
  * This should be the last operation before closing,
  * since the buffer can move when writing.
@@ -275,8 +343,8 @@
 {
   struct BFILE_buffer *p = (struct BFILE_buffer *)bp;
   CHECKBFILE(bp, getb_buf);
-  *bufp = p->b_buffer;
-  *lenp = p->b_pos;
+  *bufp = p->bf.buf;
+  *lenp = p->bf.pos;
 }
 
 #if WANT_STDIO
@@ -335,6 +403,22 @@
   FREE(p);
 }
 
+size_t
+readb_file(uint8_t *buf, size_t size, BFILE *bp)
+{
+  struct BFILE_file *p = (struct BFILE_file *)bp;
+  CHECKBFILE(bp, getb_file);
+  return fread(buf, 1, size, p->file);
+}
+
+size_t
+writeb_file(const uint8_t *str, size_t size, BFILE *bp)
+{
+  struct BFILE_file *p = (struct BFILE_file *)bp;
+  CHECKBFILE(bp, getb_file);
+  return fwrite(str, 1, size, p->file);
+}
+
 BFILE *
 add_FILE(FILE *f)
 {
@@ -346,6 +430,8 @@
   p->mets.putb   = putb_file;
   p->mets.flushb = flushb_file;
   p->mets.closeb = closeb_file;
+  p->mets.readb  = readb_file;
+  p->mets.writeb = writeb_file;
   p->file = f;
   return (BFILE*)p;
 }
@@ -367,9 +453,8 @@
 {
   struct BFILE_lz77 *p = (struct BFILE_lz77*)bp;
   CHECKBFILE(bp, getb_lz77);
-  if (p->bf.pos >= p->bf.size)
-    return -1;
-  return p->bf.buf[p->bf.pos++];
+
+  return bfbuffer_get(&p->bf);
 }
 
 void
@@ -406,7 +491,7 @@
   for (size_t i = 0; i < olen; i++) {
     putb(obuf[i], p->bfile);           /* and the data */
   }
-  free(obuf);
+  FREE(obuf);
   p->bf.pos = 0;
   flushb(p->bfile);
 }
@@ -427,6 +512,24 @@
   FREE(p);
 }
 
+size_t
+readb_lz77(uint8_t *buf, size_t size, BFILE *bp)
+{
+  struct BFILE_lz77 *p = (struct BFILE_lz77 *)bp;
+  CHECKBFILE(bp, getb_lz77);
+
+  return bfbuffer_read(&p->bf, buf, size);
+}
+
+size_t
+writeb_lz77(const uint8_t *str, size_t size, BFILE *bp)
+{
+  struct BFILE_lz77 *p = (struct BFILE_lz77 *)bp;
+  CHECKBFILE(bp, getb_lz77);
+
+  return bfbuffer_write(&p->bf, str, size);
+}
+
 BFILE *
 add_lz77_decompressor(BFILE *file)
 {
@@ -440,6 +543,8 @@
   p->mets.putb = 0;
   p->mets.flushb = 0;
   p->mets.closeb = closeb_lz77;
+  p->mets.readb = readb_lz77;
+  p->mets.writeb = 0;
   p->read = 1;
   p->bfile = file;
   p->numflush = 0;
@@ -474,6 +579,8 @@
   p->mets.putb = putb_lz77;
   p->mets.flushb = flushb_lz77;
   p->mets.closeb = closeb_lz77;
+  p->mets.readb = 0;
+  p->mets.writeb = writeb_lz77;
   p->read = 0;
   p->bfile = file;
   p->numflush = 0;
@@ -489,9 +596,9 @@
 /*
  * Run Length Encoding for ASCII
  * Format
- * c                -  c       one ASCII character
- * 0x80+n c         -  n       repetitions of ASCII character c
- * 0x80+n 0x80+m c  -  n*128+m repetitions of ASCII character c
+ * c                -  c         one ASCII character
+ * 0x80+n c         -  n+1       repetitions of ASCII character c, n>1
+ * 0x80+n 0x80+m c  -  n*128+m+1 repetitions of ASCII character c
  * ... for longer run lengths
  * Non-ASCII (i.e., >= 128) have very poor encoding:
  * 0x81 c-0x80
@@ -638,6 +745,8 @@
   p->mets.putb = 0;
   p->mets.flushb = 0;
   p->mets.closeb = closeb_rle;
+  p->mets.readb = 0;
+  p->mets.writeb = 0;
   p->count = 0;
   p->unget = -1;
   p->bfile = file;
@@ -658,6 +767,8 @@
   p->mets.putb = putb_rle;
   p->mets.flushb = flushb_rle;
   p->mets.closeb = closeb_rle;
+  p->mets.readb = 0;
+  p->mets.writeb = 0;
   p->count = 0;
   p->byte = -1;
   p->bfile = file;
@@ -687,9 +798,8 @@
 {
   struct BFILE_bwt *p = (struct BFILE_bwt*)bp;
   CHECKBFILE(bp, getb_bwt);
-  if (p->bf.pos >= p->bf.size)
-    return -1;
-  return p->bf.buf[p->bf.pos++];
+
+  return bfbuffer_get(&p->bf);
 }
 
 void
@@ -721,6 +831,24 @@
   closeb(p->bfile);
 }
 
+size_t
+readb_bwt(uint8_t *buf, size_t size, BFILE *bp)
+{
+  struct BFILE_bwt *p = (struct BFILE_bwt *)bp;
+  CHECKBFILE(bp, getb_bwt);
+
+  return bfbuffer_read(&p->bf, buf, size);
+}
+
+size_t
+writeb_bwt(const uint8_t *str, size_t size, BFILE *bp)
+{
+  struct BFILE_bwt *p = (struct BFILE_bwt *)bp;
+  CHECKBFILE(bp, getb_bwt);
+
+  return bfbuffer_write(&p->bf, str, size);
+}
+
 /* Sort all rotations of buf, and the indices of the sorted strings in res. */
 /*
  * |.......................................|
@@ -761,7 +889,7 @@
       return r;
     size_t o = a;
     return memcmp(compar_arg + m, compar_arg, o);
-    
+
   }
   return 0;
 }
@@ -779,7 +907,7 @@
 uint32_t
 encode_bwt(uint8_t *data, size_t len, uint8_t *last)
 {
-  uint32_t *res = malloc(len * sizeof(uint32_t));
+  uint32_t *res = MALLOC(len * sizeof(uint32_t));
   if (!res)
     ERR("encode_bwt");
   sort_buffer(data, len, res);
@@ -790,6 +918,7 @@
     if (offs == 0)
       zero = i;
   }
+  FREE(res);
   return zero;
 }
 
@@ -804,7 +933,7 @@
     return;
   putsb("BW1", p->bfile);             /* version no */
   putint32(p->bf.pos, p->bfile);      /* 32 bit length */
-  uint8_t *last = malloc(p->bf.pos);
+  uint8_t *last = MALLOC(p->bf.pos);
   if (!last)
     ERR("flushb_bwt");
   size_t zero = encode_bwt(p->bf.buf, p->bf.pos, last);
@@ -822,7 +951,7 @@
 decode_bwt(uint8_t *data, size_t len, uint8_t *odata, size_t zero)
 {
   size_t count[MAXBYTE];
-  uint32_t *pred = malloc(len * sizeof(uint32_t));
+  uint32_t *pred = MALLOC(len * sizeof(uint32_t));
   for(size_t i = 0; i < MAXBYTE; i++) {
     count[i] = 0;
   }
@@ -840,6 +969,7 @@
     odata[j - 1] = data[i];
     i = pred[i] + count[data[i]];
   }
+  FREE(pred);
 }
 
 BFILE *
@@ -855,6 +985,8 @@
   p->mets.putb = 0;
   p->mets.flushb = 0;
   p->mets.closeb = closeb_bwt;
+  p->mets.readb = readb_bwt;
+  p->mets.writeb = 0;
   p->read = 1;
   p->bfile = file;
   p->numflush = 0;
@@ -891,6 +1023,8 @@
   p->mets.putb = putb_bwt;
   p->mets.flushb = flushb_bwt;
   p->mets.closeb = closeb_bwt;
+  p->mets.readb = 0;
+  p->mets.writeb = writeb_bwt;
   p->read = 0;
   p->bfile = file;
   p->numflush = 0;
@@ -909,7 +1043,7 @@
   int      unget;
 };
 
-/* This is not right with WORD_SIZE==16 */
+/* XXX: This is not right with WORD_SIZE==16 */
 int
 getb_utf8(BFILE *bp)
 {
@@ -931,18 +1065,27 @@
   c2 = getb(p->bfile);
   if (c2 < 0)
     return -1;
-  if ((c1 & 0xe0) == 0xc0)
-    return ((c1 & 0x1f) << 6) | (c2 & 0x3f);
+  if ((c1 & 0xe0) == 0xc0) {
+    int c = ((c1 & 0x1f) << 6) | (c2 & 0x3f);
+    if (c < 0x80) ERR("getb_utf8: overlong encoding");
+    return c;
+  }
   c3 = getb(p->bfile);
   if (c3 < 0)
     return -1;
-  if ((c1 & 0xf0) == 0xe0)
-    return ((c1 & 0x0f) << 12) | ((c2 & 0x3f) << 6) | (c3 & 0x3f);
+  if ((c1 & 0xf0) == 0xe0) {
+    int c = ((c1 & 0x0f) << 12) | ((c2 & 0x3f) << 6) | (c3 & 0x3f);
+    if (c < 0x800) ERR("getb_utf8: overlong encoding");
+    return c;
+  }
   c4 = getb(p->bfile);
   if (c4 < 0)
     return -1;
-  if ((c1 & 0xf8) == 0xf0)
-    return ((c1 & 0x07) << 18) | ((c2 & 0x3f) << 12) | ((c3 & 0x3f) << 6) | (c4 & 0x3f);
+  if ((c1 & 0xf8) == 0xf0) {
+    int c = ((c1 & 0x07) << 18) | ((c2 & 0x3f) << 12) | ((c3 & 0x3f) << 6) | (c4 & 0x3f);
+    if (c < 0x10000) ERR("getb_utf8: overlong encoding");
+    return c;
+  }
   ERR("getb_utf8");
 }
 
@@ -1007,11 +1150,29 @@
   FREE(p);
 }
 
+size_t
+readb_utf8(uint8_t *buf, size_t size, BFILE *bp)
+{
+  struct BFILE_utf8 *p = (struct BFILE_utf8 *)bp;
+  CHECKBFILE(bp, getb_utf8);
+
+  return readb(buf, size, p->bfile);
+}
+
+size_t
+writeb_utf8(const uint8_t *str, size_t size, BFILE *bp)
+{
+  struct BFILE_utf8 *p = (struct BFILE_utf8 *)bp;
+  CHECKBFILE(bp, getb_utf8);
+
+  return writeb(str, size, p->bfile);
+}
+
 BFILE *
 add_utf8(BFILE *file)
 {
   struct BFILE_utf8 *p = MALLOC(sizeof(struct BFILE_utf8));
-  
+
   if (!p)
     memerr();
   p->mets.getb = getb_utf8;
@@ -1019,6 +1180,8 @@
   p->mets.putb = putb_utf8;
   p->mets.flushb = flushb_utf8;
   p->mets.closeb = closeb_utf8;
+  p->mets.readb = readb_utf8;
+  p->mets.writeb = writeb_utf8;
   p->bfile = file;
   p->unget = -1;
 
diff --git a/src/runtime/config-c64.h b/src/runtime/config-c64.h
--- a/src/runtime/config-c64.h
+++ b/src/runtime/config-c64.h
@@ -76,7 +76,6 @@
 /* #define ERR1(s,a) */
 
 #define GCRED    0              /* do some reductions during GC */
-#define FASTTAGS 1              /* compute tag by pointer subtraction */
 #define INTTABLE 0              /* use fixed table of small INT nodes */
 #define SANITY   0              /* do some sanity checks */
 #define STACKOVL 1              /* check for stack overflow */
diff --git a/src/runtime/config-esp32.h b/src/runtime/config-esp32.h
--- a/src/runtime/config-esp32.h
+++ b/src/runtime/config-esp32.h
@@ -76,7 +76,6 @@
 /* #define ERR1(s,a) */
 
 #define GCRED    0              /* do some reductions during GC */
-#define FASTTAGS 1              /* compute tag by pointer subtraction */
 #define INTTABLE 1              /* use fixed table of small INT nodes */
 #define SANITY   1              /* do some sanity checks */
 #define STACKOVL 1              /* check for stack overflow */
diff --git a/src/runtime/config-micro-64.h b/src/runtime/config-micro-64.h
--- a/src/runtime/config-micro-64.h
+++ b/src/runtime/config-micro-64.h
@@ -76,7 +76,6 @@
 /* #define ERR1(s,a) */
 
 #define GCRED    0              /* do some reductions during GC */
-#define FASTTAGS 0              /* compute tag by pointer subtraction */
 #define INTTABLE 0              /* use fixed table of small INT nodes */
 #define SANITY   0              /* do some sanity checks */
 #define STACKOVL 0              /* check for stack overflow */
diff --git a/src/runtime/config-mingw-64.h b/src/runtime/config-mingw-64.h
--- a/src/runtime/config-mingw-64.h
+++ b/src/runtime/config-mingw-64.h
@@ -73,7 +73,6 @@
 /* #define ERR1(s,a) */
 
 #define GCRED    1              /* do some reductions during GC */
-#define FASTTAGS 1              /* compute tag by pointer subtraction */
 #define INTTABLE 1              /* use fixed table of small INT nodes */
 #define SANITY   1              /* do some sanity checks */
 #define STACKOVL 1              /* check for stack overflow */
diff --git a/src/runtime/config-stm32f4.h b/src/runtime/config-stm32f4.h
--- a/src/runtime/config-stm32f4.h
+++ b/src/runtime/config-stm32f4.h
@@ -76,7 +76,6 @@
 /* #define ERR1(s,a) */
 
 #define GCRED    0              /* do some reductions during GC */
-#define FASTTAGS 1              /* compute tag by pointer subtraction */
 #define INTTABLE 1              /* use fixed table of small INT nodes */
 #define SANITY   1              /* do some sanity checks */
 #define STACKOVL 1              /* check for stack overflow */
diff --git a/src/runtime/config-unix-64.h b/src/runtime/config-unix-64.h
--- a/src/runtime/config-unix-64.h
+++ b/src/runtime/config-unix-64.h
@@ -58,14 +58,13 @@
 #if defined(__gnu_linux__) || defined(__APPLE__) || defined(__FreeBSD__)
 /* Only some platforms have 64 bit ffsl function directly. */
 #define FFS ffsl
-#elif defined(__GNUC__)
-/* GCC has ffsl as a builtin. */
-#define FFS __builtin_ffsl
-/* CLANG has ffsl as a builtin. */
-#elif defined(__clang__) && __has_builtin(__builtin__ffsl)
+#elif defined(__has_builtin)
+
+#if __has_builtin(__builtin__ffsl)
 #define FFS __builtin_ffsl
 #endif
 
+#endif
 
 /*
  * This is the character used for comma-separation in printf.
@@ -208,7 +207,6 @@
 /* #define ERR1(s,a) */
 
 #define GCRED    1              /* do some reductions during GC */
-#define FASTTAGS 1              /* compute tag by pointer subtraction */
 #define INTTABLE 1              /* use fixed table of small INT nodes */
 #define SANITY   1              /* do some sanity checks */
 #define STACKOVL 1              /* check for stack overflow */
diff --git a/src/runtime/config-windows-64.h b/src/runtime/config-windows-64.h
--- a/src/runtime/config-windows-64.h
+++ b/src/runtime/config-windows-64.h
@@ -139,7 +139,6 @@
 /* #define ERR1(s,a) */
 
 #define GCRED    1              /* do some reductions during GC */
-#define FASTTAGS 1              /* compute tag by pointer subtraction */
 #define INTTABLE 1              /* use fixed table of small INT nodes */
 #define SANITY   1              /* do some sanity checks */
 #define STACKOVL 1              /* check for stack overflow */
diff --git a/src/runtime/eval.c b/src/runtime/eval.c
--- a/src/runtime/eval.c
+++ b/src/runtime/eval.c
@@ -1,4788 +1,4963 @@
-/* Copyright 2023 Lennart Augustsson
- * See LICENSE file for full license.
- */
-#if !defined(WANT_GMP)
-#define WANT_GMP 0
-#endif
-
-#include <inttypes.h>
-#if WANT_STDIO
-#include <stdio.h>
-#include <locale.h>
-#endif  /* WANT_STDIO */
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <setjmp.h>
-#if WANT_MATH
-#include <math.h>
-#endif  /* WANT_MATH */
-#if WANT_DIR
-#include <dirent.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#endif  /* WANT_DIR */
-#if WANT_TIME
-#include <time.h>
-#endif
-#if WANT_GMP
-#include <gmp.h>
-#endif
-
-#if WANT_MD5
-#include "md5.h"
-#endif
-
-#if !defined(WANT_LZ77)
-#define WANT_LZ77 1
-#endif
-
-#if !defined(WANT_RLE)
-#define WANT_RLE 1
-#endif
-
-#if !defined(WANT_BWT)
-#define WANT_BWT 1
-#endif
-
-#if WANT_LZ77
-size_t lz77d(uint8_t *src, size_t srclen, uint8_t **bufp);
-size_t lz77c(uint8_t *src, size_t srclen, uint8_t **bufp);
-#endif
-
-#include "mhsffi.h"
-struct ffi_entry ffi_table[];
-int num_ffi;
-#define FFI_IX(i) ((i) < num_ffi ? ffi_table[i] : xffi_table[i - num_ffi])
-
-//#include "config.h"
-
-#define VERSION "v7.0\n"
-
-typedef intptr_t value_t;       /* Make value the same size as pointers, since they are in a union */
-#define PRIvalue PRIdPTR
-typedef uintptr_t uvalue_t;     /* Make unsigned value the same size as pointers, since they are in a union */
-#define PRIuvalue PRIuPTR
-typedef uintptr_t heapoffs_t;   /* Heap offsets */
-#define PRIheap PRIuPTR
-typedef uintptr_t tag_t;        /* Room for tag, low order bit indicates AP/not-AP */
-typedef intptr_t stackptr_t;    /* Index into stack */
-
-typedef uintptr_t counter_t;    /* Statistics counter, can be smaller since overflow doesn't matter */
-#define PRIcounter PRIuPTR
-typedef uintptr_t bits_t;       /* One word of bits */
-
-#if !defined(MALLOC)
-#define MALLOC malloc
-#endif
-
-#if !defined(REALLOC)
-#define REALLOC realloc
-#endif
-
-#if !defined(FREE)
-#define FREE free
-#endif
-
-#if !defined(EXIT)
-#define EXIT exit
-#endif
-
-#if !defined(PRINT)
-#define PRINT printf
-#endif
-
-#if !defined(MAIN)
-#define MAIN int main(int argc, char **argv)
-#endif
-
-#if !defined(PCOMMA)
-#define PCOMMA "'"
-#endif  /* !defined(PCOMMA) */
-
-#if !defined(GETRAW)
-int GETRAW(void) { return -1; }
-#endif  /* !defined(getraw) */
-
-#if !defined(GETTIMEMILLI)
-value_t GETTIMEMILLI(void) { return 0; }
-#endif  /* !define(GETTIMEMILLI) */
-
-#if !defined(TMPNAME)
-/* This is a really bad implementation, since it doesn't check for anything. */
-char* TMPNAME(const char* pre, const char* post) {
-  char *s = MALLOC(strlen(pre) + 3 + strlen(post) + 1);
-  strcpy(s, pre);
-  strcat(s, "TMP");
-  strcat(s, post);
-  return s;
-}
-#endif
-
-#if !defined(FFS)
-/* This is pretty bad, could use deBruijn multiplication instead. */
-int
-FFS(bits_t x)
-{
-  int i;
-  if (!x)
-    return 0;
-  for(i = 1; !(x & 1); x >>= 1, i++)
-    ;
-  return i;
-}
-#endif  /* !defined(FFS) */
-
-#if !defined(POPCOUNT)
-uvalue_t POPCOUNT(uvalue_t x) {
-#if defined(__GNUC__)
-  return __builtin_popcountl(x);
-#elif defined(__clang__) && __has_builtin(__builtin_popcountl)
-  return __builtin_popcountl(x);
-#else
-  uvalue_t count = 0;
-  while (x) {
-    x = x & (x - 1); // clear lowest 1 bit
-    count += 1;
-  }
-  return count;
-#endif
-}
-#endif
-
-#if !defined(CLZ)
-uvalue_t CLZ(uvalue_t x) {
-#if defined(__GNUC__)
-  if (x == 0) return WORD_SIZE;
-  return __builtin_clzl(x);
-#elif defined(__clang__) && __has_builtin(__builtin_clzl)
-  if (x == 0) return WORD_SIZE;
-  return __builtin_clzl(x);
-#else
-  value_t count = WORD_SIZE;
-  while (x) {
-    x = x >> 1;
-    count -= 1;
-  }
-  return count;
-#endif
-}
-#endif
-
-#if !defined(CTZ)
-uvalue_t CTZ(uvalue_t x) {
-  if (x == 0) return WORD_SIZE;
-#if defined(__GNUC__)
-  return __builtin_ctzl(x);
-#elif defined(__clang__) && __has_builtin(__builtin_ctzl)
-  return __builtin_ctzl(x);
-#else
-  uvalue_t count = 0;
-  while ((x & 1) == 0) {
-    x = x >> 1;
-    count += 1;
-  }
-  return count;
-#endif
-}
-#endif
-
-#if !defined(WANT_ARGS)
-#define WANT_ARGS 1
-#endif
-
-#if !defined(INLINE)
-#define INLINE inline
-#endif  /* !define(INLINE) */
-
-#if !defined(NORETURN)
-#define NORETURN __attribute__ ((noreturn))
-#endif /* !defined(NORETURN) */
-
-#if !defined(COUNT)
-#define COUNT(n) ++(n)
-#endif
-
-value_t
-iswindows(void)
-{
-#if defined(ISWINDOWS)
-  return 1;
-#else
-  return 0;
-#endif
-}
-
-/***************************************/
-
-/* Keep permanent nodes for LOW_INT <= i < HIGH_INT */
-#define LOW_INT (-10)
-#define HIGH_INT 256
-
-#if !defined(HEAP_CELLS)
-#define HEAP_CELLS 50000000
-#endif
-
-#if !defined(STACK_SIZE)
-#define STACK_SIZE 100000
-#endif
-
-#if !defined(ERR)
-#if WANT_STDIO
-#define ERR(s)    do { fprintf(stderr,"ERR: "s"\n");   EXIT(1); } while(0)
-#define ERR1(s,a) do { fprintf(stderr,"ERR: "s"\n",a); EXIT(1); } while(0)
-#else  /* WANT_STDIO */
-#define ERR(s) EXIT(1)
-#define ERR1(s,a) EXIT(1)
-#endif  /* WANT_STDIO */
-#endif  /* !define(ERR) */
-
-enum node_tag { T_FREE, T_IND, T_AP, T_INT, T_DBL, T_PTR, T_FUNPTR, T_FORPTR, T_BADDYN, T_ARR, T_BSTR,
-                T_S, T_K, T_I, T_B, T_C,
-                T_A, T_Y, T_SS, T_BB, T_CC, T_P, T_R, T_O, T_U, T_Z,
-                T_K2, T_K3, T_K4, T_CCB,
-                T_ADD, T_SUB, T_MUL, T_QUOT, T_REM, T_SUBR, T_UQUOT, T_UREM, T_NEG,
-                T_AND, T_OR, T_XOR, T_INV, T_SHL, T_SHR, T_ASHR,
-                T_POPCOUNT, T_CLZ, T_CTZ,
-                T_EQ, T_NE, T_LT, T_LE, T_GT, T_GE, T_ULT, T_ULE, T_UGT, T_UGE, T_ICMP, T_UCMP,
-                T_FPADD, T_FP2P, T_FPNEW, T_FPFIN, // T_FPSTR,
-                T_TOPTR, T_TOINT, T_TODBL, T_TOFUNPTR,
-                T_BININT2, T_BININT1, T_UNINT1,
-                T_BINDBL2, T_BINDBL1, T_UNDBL1,
-                T_BINBS2, T_BINBS1,
-#if WANT_FLOAT
-                T_FADD, T_FSUB, T_FMUL, T_FDIV, T_FNEG, T_ITOF,
-                T_FEQ, T_FNE, T_FLT, T_FLE, T_FGT, T_FGE, T_FSHOW, T_FREAD,
-#endif
-                T_ARR_ALLOC, T_ARR_COPY, T_ARR_SIZE, T_ARR_READ, T_ARR_WRITE, T_ARR_EQ,
-                T_RAISE, T_SEQ, T_EQUAL, T_COMPARE, T_RNF,
-                T_TICK,
-                T_IO_BIND, T_IO_THEN, T_IO_RETURN,
-                T_IO_CCBIND,
-                T_IO_SERIALIZE, T_IO_DESERIALIZE,
-                T_IO_STDIN, T_IO_STDOUT, T_IO_STDERR, T_IO_GETARGREF,
-                T_IO_PERFORMIO, T_IO_PRINT, T_CATCH,
-                T_IO_CCALL, T_IO_GC, T_DYNSYM,
-                T_NEWCASTRINGLEN, T_PEEKCASTRING, T_PEEKCASTRINGLEN,
-                T_BSAPPEND, T_BSAPPEND3, T_BSEQ, T_BSNE, T_BSLT, T_BSLE, T_BSGT, T_BSGE, T_BSCMP,
-                T_BSPACK, T_BSUNPACK, T_BSLENGTH, T_BSSUBSTR,
-                T_BSFROMUTF8, T_BSTOUTF8, T_BSHEADUTF8,  T_BSTAILUTF8,
-                T_BSAPPENDDOT,
-                T_LAST_TAG,
-};
-#if 0
-static const char* tag_names[] = {
-  "FREE", "IND", "AP", "INT", "DBL", "PTR", "FUNPTR", "FORPTR", "BADDYN", "ARR",
-  "S", "K", "I", "B", "C",
-  "A", "Y", "SS", "BB", "CC", "P", "R", "O", "U", "Z",
-  "K2", "K3", "K4", "CCB",
-  "ADD", "SUB", "MUL", "QUOT", "REM", "SUBR", "UQUOT", "UREM", "NEG",
-  "AND", "OR", "XOR", "INV", "SHL", "SHR", "ASHR",
-  "POPCOUNT", "CLZ", "CTZ",
-  "EQ", "NE", "LT", "LE", "GT", "GE", "ULT", "ULE", "UGT", "UGE",
-  "FPADD", "FP2P", "FPNEW", "FPFIN",
-  "TOPTR", "TOINT", "TODBL", "TOFUNPTR",
-  "BININT2", "BININT1", "UNINT1",
-  "BINDBL2", "BINDBL1", "UNDBL1",
-#if WANT_FLOAT
-  "FADD", "FSUB", "FMUL", "FDIV", "FNEG", "ITOF",
-  "FEQ", "FNE", "FLT", "FLE", "FGT", "FGE", "FSHOW", "FREAD",
-#endif
-  "ARR_ALLOC", "ARR_COPY", "ARR_SIZE", "ARR_READ", "ARR_WRITE", "ARR_EQ",
-  "RAISE", "SEQ", "EQUAL", "COMPARE", "RNF",
-  "TICK",
-  "IO_BIND", "IO_THEN", "IO_RETURN",
-  "C'BIND",
-  "IO_SERIALIZE", "IO_DESERIALIZE",
-  "IO_STDIN", "IO_STDOUT", "IO_STDERR", "IO_GETARGREF",
-  "IO_PERFORMIO", "IO_PRINT", "CATCH",
-  "IO_CCALL", "IO_GC", "DYNSYM",
-  "NEWCASTRINGLEN", "PEEKCASTRING", "PEEKCASTRINGLEN",
-  "BSFROMUTF8",
-  "STR",
-  "LAST_TAG",
-};
-#endif
-
-struct ioarray;
-struct bytestring;
-struct forptr;
-
-typedef struct node {
-  union {
-    struct node *uufun;
-    tag_t        uutag;             /* LSB=1 indicates that this is a tag, LSB=0 that this is a T_AP node */
-  } ufun;
-  union {
-    struct node    *uuarg;
-    value_t         uuvalue;
-    flt_t           uufloatvalue;
-    const char     *uucstring;
-    void           *uuptr;
-    HsFunPtr        uufunptr;
-    struct ioarray *uuarray;
-    struct forptr  *uuforptr;      /* foreign pointers and byte arrays */
-  } uarg;
-} node;
-typedef struct node* NODEPTR;
-#define NIL 0
-#define HEAPREF(i) &cells[(i)]
-#define GETTAG(p) ((p)->ufun.uutag & 1 ? (int)((p)->ufun.uutag >> 1) : T_AP)
-#define SETTAG(p,t) do { if (t != T_AP) (p)->ufun.uutag = ((t) << 1) + 1; } while(0)
-#define GETVALUE(p) (p)->uarg.uuvalue
-#define GETDBLVALUE(p) (p)->uarg.uufloatvalue
-#define SETVALUE(p,v) (p)->uarg.uuvalue = v
-#define SETDBLVALUE(p,v) (p)->uarg.uufloatvalue = v
-#define FUN(p) (p)->ufun.uufun
-#define ARG(p) (p)->uarg.uuarg
-#define CSTR(p) (p)->uarg.uucstring
-#define PTR(p) (p)->uarg.uuptr
-#define FUNPTR(p) (p)->uarg.uufunptr
-#define FORPTR(p) (p)->uarg.uuforptr
-#define BSTR(p) (p)->uarg.uuforptr->payload
-#define ARR(p) (p)->uarg.uuarray
-#define INDIR(p) ARG(p)
-#define NODE_SIZE sizeof(node)
-#define ALLOC_HEAP(n) do { cells = MALLOC(n * sizeof(node)); memset(cells, 0x55, n * sizeof(node)); } while(0)
-#define LABEL(n) ((heapoffs_t)((n) - cells))
-node *cells;                 /* All cells */
-
-/*
- * byte arrays
- */
-struct bytestring {
-  size_t size;
-  void *string;
-};
-
-/*
- * Arrays are allocated with MALLOC()/FREE().
- * During GC they are marked, and all elements in the array are
- * recursively marked.
- * At the end of the the mark phase there is a scan of all
- * arrays, and the unmarked ones are freed.
- */
-struct ioarray {
-  struct ioarray *next;         /* all ioarrays are linked together */
-  int permanent;                /* this array should never be GC-ed */
-  size_t marked;                /* marked during GC */
-  size_t size;                  /* number of elements in the array */
-  NODEPTR array[1];             /* actual size may be bigger */
-};
-struct ioarray *array_root = 0; /* root of all allocated arrays, linked by next */
-
-/*
- * A Haskell ForeignPtr has a normal pointer, and a finalizer
- * function that is to be called when there are no more references
- * to the ForeignPtr.
- * A complication is that using plusForeignPtr creates a new
- * ForeignPtr that must share the same finalizer.
- * There is one struct forptr for each ForeignPtr.  It has pointer
- * to the actual data, and to a struct final which is shared between
- * all ForeignPtrs that have been created with plusForeignPtr.
- * During GC the used bit is set for any references to the forptr.
- * The scan phase will traverse the struct final chain and run
- * the finalizer, and free associated structs.
- */
-struct final {
-  struct final  *next;      /* the next finalizer */
-  HsFunPtr       final;     /* function to call to release resource */
-  void          *arg;       /* argument to final when called */
-  size_t         size;      /* size of memory, if known, otherwise NOSIZE */
-#define NOSIZE ~0           /* used as the size in payload for actual foreign pointers */
-  struct forptr *back;      /* back pointer to the first forptr */
-  int            marked;    /* mark bit for GC */
-};
-
-/*
- * Foreign pointers are also used to represent bytestrings.
- * The difference between a foreign pointer and a bytestring
- * is that we can serialize the latter.
- * The size field is non-zero only for bytestrings.
- */
-struct forptr {
-  struct forptr *next;       /* the next ForeignPtr that shares the same finalizer */
-  struct final  *finalizer;  /* the finalizer for this ForeignPtr */
-  struct bytestring payload; /* the actual pointer to allocated data, and maybe a size */
-  //  char          *desc;
-};
-struct final *final_root = 0;   /* root of all allocated foreign pointers, linked by next */
-
-counter_t num_reductions = 0;
-counter_t num_alloc = 0;
-counter_t num_gc = 0;
-uintptr_t gc_mark_time = 0;
-uintptr_t gc_scan_time = 0;
-uintptr_t run_time = 0;
-
-#define MAXSTACKDEPTH 0
-#if MAXSTACKDEPTH
-stackptr_t max_stack_depth = 0;
-counter_t max_c_stack = 0;
-counter_t cur_c_stack = 0;
-#define MAXSTACK if (stack_ptr > max_stack_depth) max_stack_depth = stack_ptr
-#else
-#define MAXSTACK
-#endif
-
-NODEPTR *topnode;
-NODEPTR atptr;
-
-NODEPTR *stack;
-stackptr_t stack_ptr = -1;
-#if STACKOVL
-#define PUSH(x) do { if (stack_ptr >= stack_size-1) stackerr(); stack[++stack_ptr] = (x); MAXSTACK; } while(0)
-#else  /* STACKOVL */
-#define PUSH(x) do {                                            stack[++stack_ptr] = (x); MAXSTACK; } while(0)
-#endif  /* STACKOVL */
-#define TOP(n) stack[stack_ptr - (n)]
-#define POP(n) stack_ptr -= (n)
-#define POPTOP() stack[stack_ptr--]
-#define GCCHECK(n) gc_check((n))
-
-heapoffs_t heap_size = HEAP_CELLS; /* number of heap cells */
-heapoffs_t heap_start;             /* first location in heap that needs GC */
-stackptr_t stack_size = STACK_SIZE;
-
-counter_t num_marked;
-counter_t max_num_marked = 0;
-counter_t num_free;
-counter_t num_arr_alloc;
-counter_t num_arr_free;
-counter_t num_fin_alloc;
-counter_t num_fin_free;
-counter_t num_bs_alloc;
-counter_t num_bs_alloc_max;
-counter_t num_bs_free;
-counter_t num_bs_bytes;
-counter_t num_bs_inuse;
-counter_t num_bs_inuse_max;
-
-#define BITS_PER_WORD (sizeof(bits_t) * 8)
-bits_t *free_map;             /* 1 bit per node, 0=free, 1=used */
-heapoffs_t free_map_nwords;
-heapoffs_t next_scan_index;
-
-int want_gc_red = 0;
-
-NORETURN
-void
-memerr(void)
-{
-  ERR("Out of memory");
-  EXIT(1);
-}
-
-NORETURN
-void
-stackerr(void)
-{
-  ERR("stack overflow");
-  EXIT(1);
-}
-
-/***************************************/
-
-#include "bfile.c"
-
-/***************************************/
-
-struct ioarray*
-arr_alloc(size_t sz, NODEPTR e)
-{
-  struct ioarray *arr = MALLOC(sizeof(struct ioarray) + (sz-1) * sizeof(NODEPTR));
-  size_t i;
-
-  if (!arr)
-    memerr();
-  arr->next = array_root;
-  array_root = arr;
-  arr->marked = 0;
-  arr->permanent = 0;
-  arr->size = sz;
-  for(i = 0; i < sz; i++)
-    arr->array[i] = e;
-  //PRINT("arr_alloc(%d, %p) = %p\n", (int)sz, e, arr);
-  num_arr_alloc++;
-  return arr;
-}
-
-struct ioarray*
-arr_copy(struct ioarray *oarr)
-{
-  size_t sz = oarr->size;
-  struct ioarray *arr = MALLOC(sizeof(struct ioarray) + (sz-1) * sizeof(NODEPTR));
-
-  if (!arr)
-    memerr();
-  arr->next = array_root;
-  array_root = arr;
-  arr->marked = 0;
-  arr->permanent = 0;
-  arr->size = sz;
-  memcpy(arr->array, oarr->array, sz * sizeof(NODEPTR));
-  num_arr_alloc++;
-  return arr;
-}
-
-/*****************************************************************************/
-
-#if WANT_TICK
-struct tick_entry {
-  struct bytestring tick_name;
-  counter_t tick_count;
-} *tick_table = 0;
-size_t tick_table_size;
-size_t tick_index;
-
-/* Allocate a new tick table entry and return the index. */
-size_t
-add_tick_table(struct bytestring name)
-{
-  if (!tick_table) {
-    tick_table_size = 100;
-    tick_table = malloc(tick_table_size * sizeof(struct tick_entry));
-    if (!tick_table)
-      memerr();
-    tick_index = 0;
-  }
-  if (tick_index >= tick_table_size) {
-    tick_table_size *= 2;
-    tick_table = REALLOC(tick_table, tick_table_size * sizeof(struct tick_entry));
-    if (!tick_table)
-      memerr();
-  }
-  tick_table[tick_index].tick_name = name;
-  tick_table[tick_index].tick_count = 0;
-  return tick_index++;
-}
-
-/* Called with the tick index. */
-static inline void
-dotick(value_t i)
-{
-  tick_table[i].tick_count++;
-}
-
-void
-dump_tick_table(FILE *f)
-{
-  if (!tick_table) {
-    fprintf(f, "Tick table empty\n");
-    return;
-  }
-  for (size_t i = 0; i < tick_index; i++) {
-    counter_t n = tick_table[i].tick_count;
-    if (n)
-      fprintf(f, "%-60s %10"PRIcounter"\n", (char *)tick_table[i].tick_name.string, n);
-  }
-}
-#endif
-
-/*****************************************************************************/
-
-struct handler {
-  jmp_buf         hdl_buf;      /* env storage */
-  struct handler *hdl_old;      /* old handler */
-  stackptr_t      hdl_stack;    /* old stack pointer */
-  NODEPTR         hdl_exn;      /* used temporarily to pass the exception value */
-} *cur_handler = 0;
-
-/* Set FREE bit to 0 */
-static INLINE void mark_used(NODEPTR n)
-{
-  heapoffs_t i = LABEL(n);
-  if (i < heap_start)
-    return;
-#if SANITY
-  if (i >= free_map_nwords * BITS_PER_WORD) ERR("mark_used");
-#endif
-  free_map[i / BITS_PER_WORD] &= ~(1ULL << (i % BITS_PER_WORD));
-}
-
-/* Set FREE bit to 1, used to undo marking in GC */
-static INLINE void mark_unused(NODEPTR n)
-{
-  heapoffs_t i = LABEL(n);
-#if SANITY
-  if (i < heap_start)
-    ERR("Unmarking invalid heap address.");
-  if (i >= free_map_nwords * BITS_PER_WORD) ERR("mark_used");
-#endif
-  free_map[i / BITS_PER_WORD] |= 1ULL << (i % BITS_PER_WORD);
-}
-
-/* Test if FREE bit is 0 */
-static INLINE int is_marked_used(NODEPTR n)
-{
-  heapoffs_t i = LABEL(n);
-  if (i < heap_start)
-    return 1;
-#if SANITY
-  if (i >= free_map_nwords * BITS_PER_WORD)
-    ERR("is_marked_used");
-#endif
-  return (free_map[i / BITS_PER_WORD] & (1ULL << (i % BITS_PER_WORD))) == 0;
-}
-
-static INLINE void mark_all_free(void)
-{
-  memset(free_map, ~0, free_map_nwords * sizeof(bits_t));
-  next_scan_index = heap_start;
-}
-
-#if WANT_ARGS
-/* This single element array hold a list of the program arguments. */
-struct ioarray *argarray;
-#endif  /* WANT_ARGS */
-
-int verbose = 0;
-
-static INLINE NODEPTR
-alloc_node(enum node_tag t)
-{
-  heapoffs_t i = next_scan_index / BITS_PER_WORD;
-  int k;                        /* will contain bit pos + 1 */
-  heapoffs_t pos;
-  NODEPTR n;
-
-  /* This can happen if we run out of memory when parsing. */
-  if (num_free <= 0)
-    ERR("alloc_node");
-
-  for(;;) {
-    heapoffs_t word = free_map[i];
-    k = FFS(word);
-    if (k)
-      break;
-    i++;
-#if SANITY
-    if (i >= free_map_nwords) {
-#if 0
-      fprintf(stderr, "wordsize=%u, num_free=%u next_scan_index=%u i=%u free_map_nwords=%u\n", (uint)BITS_PER_WORD,
-              (uint)num_free, (uint)next_scan_index, (uint)i, (uint)free_map_nwords);
-#endif
-      ERR("alloc_node: free_map");
-    }
-#endif
-  }
-  pos = i * BITS_PER_WORD + k - 1; /* first free node */
-  n = HEAPREF(pos);
-  mark_used(n);
-  next_scan_index = pos;
-
-  SETTAG(n, t);
-  COUNT(num_alloc);
-  num_free--;
-  return n;
-}
-
-static INLINE NODEPTR
-new_ap(NODEPTR f, NODEPTR a)
-{
-  NODEPTR n = alloc_node(T_AP);
-  FUN(n) = f;
-  ARG(n) = a;
-  return n;
-}
-
-/* Needed during reduction */
-NODEPTR intTable[HIGH_INT - LOW_INT];
-NODEPTR combK, combTrue, combUnit, combCons, combPair;
-NODEPTR combCC, combZ, combIOBIND, combIORETURN, combIOCCBIND, combB, combC;
-NODEPTR combLT, combEQ, combGT;
-NODEPTR combShowExn, combU, combK2, combK3;
-NODEPTR combBININT1, combBININT2, combUNINT1;
-NODEPTR combBINDBL1, combBINDBL2, combUNDBL1;
-NODEPTR combBINBS1, combBINBS2;
-NODEPTR comb_stdin, comb_stdout, comb_stderr;
-#define combFalse combK
-
-/* One node of each kind for primitives, these are never GCd. */
-/* We use linear search in this, because almost all lookups
- * are among the combinators.
- */
-struct {
-  const char *name;
-  const enum node_tag tag;
-  const enum node_tag flipped;        /* What should (C op) reduce to? defaults to T_FREE */
-  NODEPTR node;
-} primops[] = {
-  /* combinators */
-  /* sorted by frequency in a typical program */
-  { "B", T_B },
-  { "O", T_O },
-  { "K", T_K },
-  { "C'", T_CC },
-  { "C", T_C },
-  { "A", T_A },
-  { "S'", T_SS },
-  { "P", T_P },
-  { "R", T_R },
-  { "I", T_I },
-  { "S", T_S },
-  { "U", T_U },
-  { "Y", T_Y },
-  { "B'", T_BB },
-  { "Z", T_Z },
-  { "K2", T_K2 },
-  { "K3", T_K3 },
-  { "K4", T_K4 },
-  { "C'B", T_CCB },
-/* primops */
-  { "+", T_ADD, T_ADD },
-  { "-", T_SUB, T_SUBR },
-  { "*", T_MUL, T_MUL },
-  { "quot", T_QUOT },
-  { "rem", T_REM },
-  { "uquot", T_UQUOT },
-  { "urem", T_UREM },
-  { "subtract", T_SUBR, T_SUB },
-  { "neg", T_NEG },
-  { "and", T_AND, T_AND },
-  { "or", T_OR, T_OR },
-  { "xor", T_XOR, T_XOR },
-  { "inv", T_INV },
-  { "shl", T_SHL },
-  { "shr", T_SHR },
-  { "ashr", T_ASHR },
-  { "popcount", T_POPCOUNT },
-  { "clz", T_CLZ },
-  { "ctz", T_CTZ },
-#if WANT_FLOAT
-  { "f+" , T_FADD, T_FADD},
-  { "f-" , T_FSUB, T_FSUB},
-  { "f*" , T_FMUL, T_FMUL},
-  { "f/", T_FDIV},
-  { "fneg", T_FNEG},
-  { "itof", T_ITOF},
-  { "f==", T_FEQ, T_FEQ},
-  { "f/=", T_FNE, T_FNE},
-  { "f<", T_FLT},
-  { "f<=", T_FLE},
-  { "f>", T_FGT},
-  { "f>=", T_FGE},
-  { "fshow", T_FSHOW},
-  { "fread", T_FREAD},
-#endif  /* WANT_FLOAT */
-
-  { "bs++", T_BSAPPEND},
-  { "bs++.", T_BSAPPENDDOT},
-  { "bs+++", T_BSAPPEND3},
-  { "bs==", T_BSEQ, T_BSEQ},
-  { "bs/=", T_BSNE, T_BSNE},
-  { "bs<", T_BSLT},
-  { "bs<=", T_BSLE},
-  { "bs>", T_BSGT},
-  { "bs>=", T_BSGE},
-  { "bscmp", T_BSCMP},
-  { "bspack", T_BSPACK},
-  { "bsunpack", T_BSUNPACK},
-  { "bslength", T_BSLENGTH},
-  { "bssubstr", T_BSSUBSTR},
-
-  { "ord", T_I },
-  { "chr", T_I },
-  { "==", T_EQ, T_EQ },
-  { "/=", T_NE, T_NE },
-  { "<", T_LT, T_GT },
-  { "u<", T_ULT, T_UGT },
-  { "u<=", T_ULE, T_UGE },
-  { "u>", T_UGT, T_ULT },
-  { "u>=", T_UGE, T_ULE },
-  { "<=", T_LE, T_GE },
-  { ">", T_GT, T_LT },
-  { ">=", T_GE, T_LE },
-  { "fp+", T_FPADD },
-  { "fp2p", T_FP2P },
-  { "fpnew", T_FPNEW },
-  { "fpfin", T_FPFIN },
-  //  { "fpstr", T_FPSTR },
-  { "seq", T_SEQ },
-  { "equal", T_EQUAL, T_EQUAL },
-  { "sequal", T_EQUAL, T_EQUAL },
-  { "compare", T_COMPARE },
-  { "scmp", T_COMPARE },
-  { "icmp", T_ICMP },
-  { "ucmp", T_UCMP },
-  { "rnf", T_RNF },
-  { "fromUTF8", T_BSFROMUTF8 },
-  { "toUTF8", T_BSTOUTF8 },
-  { "headUTF8", T_BSHEADUTF8 },
-  { "tailUTF8", T_BSTAILUTF8 },
-  /* IO primops */
-  { "IO.>>=", T_IO_BIND },
-  { "IO.>>", T_IO_THEN },
-  { "IO.return", T_IO_RETURN },
-  { "IO.C'BIND", T_IO_CCBIND },
-  { "IO.serialize", T_IO_SERIALIZE },
-  { "IO.print", T_IO_PRINT },
-  { "IO.deserialize", T_IO_DESERIALIZE },
-  { "IO.stdin", T_IO_STDIN },
-  { "IO.stdout", T_IO_STDOUT },
-  { "IO.stderr", T_IO_STDERR },
-  { "IO.getArgRef", T_IO_GETARGREF },
-  { "IO.performIO", T_IO_PERFORMIO },
-  { "IO.gc", T_IO_GC },
-  { "raise", T_RAISE },
-  { "catch", T_CATCH },
-  { "A.alloc", T_ARR_ALLOC },
-  { "A.copy", T_ARR_COPY },
-  { "A.size", T_ARR_SIZE },
-  { "A.read", T_ARR_READ },
-  { "A.write", T_ARR_WRITE },
-  { "A.==", T_ARR_EQ },
-  { "dynsym", T_DYNSYM },
-  { "newCAStringLen", T_NEWCASTRINGLEN },
-  { "peekCAString", T_PEEKCASTRING },
-  { "peekCAStringLen", T_PEEKCASTRINGLEN },
-  { "toPtr", T_TOPTR },
-  { "toInt", T_TOINT },
-  { "toDbl", T_TODBL },
-  { "toFunPtr", T_TOFUNPTR },
-};
-
-#if GCRED
-enum node_tag flip_ops[T_LAST_TAG];
-#endif
-
-#if WANT_STDIO
-/* Create a dummy foreign pointer for the standard stdio handles. */
-/* These handles are never gc():d. */
-void
-mk_std(NODEPTR n, FILE *f)
-{ 
-  struct final *fin = calloc(1, sizeof(struct final));
-  struct forptr *fp = calloc(1, sizeof(struct forptr));
-  if (!fin || !fp)
-    memerr();
-  BFILE *bf = add_utf8(add_FILE(f));
-  SETTAG(n, T_FORPTR);
-  FORPTR(n) = fp;
-  fin->arg = bf;
-  fin->back = fp;
-  fp->payload.string = bf;
-  fp->finalizer = fin;
-}
-#endif
-
-void
-init_nodes(void)
-{
-  enum node_tag t;
-  size_t j;
-  NODEPTR n;
-
-  ALLOC_HEAP(heap_size);
-  free_map_nwords = (heap_size + BITS_PER_WORD - 1) / BITS_PER_WORD; /* bytes needed for free map */
-  free_map = MALLOC(free_map_nwords * sizeof(bits_t));
-  if (!free_map)
-    memerr();
-
-  /* Set up permanent nodes */
-  heap_start = 0;
-#if !FASTTAGS
-  for (int j = 0; j < sizeof primops / sizeof primops[0]; j++) {
-    NODEPTR n = HEAPREF(heap_start++);
-    primops[j].node = n;
-    //MARK(n) = MARKED;
-    SETTAG(n, primops[j].tag);
-    switch (primops[j].tag) {
-    case T_K: combK = n; break;
-    case T_A: combTrue = n; break;
-    case T_I: combUnit = n; break;
-    case T_O: combCons = n; break;
-    case T_P: combPair = n; break;
-    case T_CC: combCC = n; break;
-    case T_B: combB = n; break;
-    case T_C: combC = n; break;
-    case T_Z: combZ = n; break;
-    case T_U: combU = n; break;
-    case T_K2: combK2 = n; break;
-    case T_K3: combK3 = n; break;
-    case T_IO_BIND: combIOBIND = n; break;
-    case T_IO_RETURN: combIORETURN = n; break;
-    case T_IO_CCBIND: combIOCCBIND = n; break;
-    case T_BININT1: combBININT1 = n; break;
-    case T_BININT2: combBININT2 = n; break;
-    case T_UNINT1: combUNINT1 = n; break;
-    case T_BINDBL1: combBINDBL1 = n; break;
-    case T_BINDBL2: combBINDBL2 = n; break;
-    case T_UNDBL1: combUNDBL1 = n; break;
-    case T_BINBS1: combBINBS1 = n; break;
-    case T_BINBS2: combBINBS2 = n; break;
-#if WANT_STDIO
-    case T_IO_STDIN:  comb_stdin  = n; mk_std(n, stdin);  break;
-    case T_IO_STDOUT: comb_stdout = n; mk_std(n, stdout); break;
-    case T_IO_STDERR: comb_stderr = n; mk_std(n, stderr); break;
-#endif  /* WANT_STDIO */
-    default:
-      break;
-    }
-  }
-#else
-  for(t = T_FREE; t < T_LAST_TAG; t++) {
-    NODEPTR n = HEAPREF(heap_start++);
-    SETTAG(n, t);
-    switch (t) {
-    case T_K: combK = n; break;
-    case T_A: combTrue = n; break;
-    case T_I: combUnit = n; break;
-    case T_O: combCons = n; break;
-    case T_P: combPair = n; break;
-    case T_CC: combCC = n; break;
-    case T_B: combB = n; break;
-    case T_C: combC = n; break;
-    case T_Z: combZ = n; break;
-    case T_U: combU = n; break;
-    case T_K2: combK2 = n; break;
-    case T_K3: combK3 = n; break;
-    case T_IO_BIND: combIOBIND = n; break;
-    case T_IO_RETURN: combIORETURN = n; break;
-    case T_IO_CCBIND: combIOCCBIND = n; break;
-    case T_BININT1: combBININT1 = n; break;
-    case T_BININT2: combBININT2 = n; break;
-    case T_UNINT1: combUNINT1 = n; break;
-    case T_BINDBL1: combBINDBL1 = n; break;
-    case T_BINDBL2: combBINDBL2 = n; break;
-    case T_UNDBL1: combUNDBL1 = n; break;
-    case T_BINBS1: combBINBS1 = n; break;
-    case T_BINBS2: combBINBS2 = n; break;
-#if WANT_STDIO
-    case T_IO_STDIN:  comb_stdin  = n; mk_std(n, stdin);  break;
-    case T_IO_STDOUT: comb_stdout = n; mk_std(n, stdout); break;
-    case T_IO_STDERR: comb_stderr = n; mk_std(n, stderr); break;
-#endif
-    default:
-      break;
-    }
-    for (j = 0; j < sizeof primops / sizeof primops[0];j++) {
-      if (primops[j].tag == t) {
-        primops[j].node = n;
-      }
-    }
-  }
-#endif
-#if GCRED
-  for (j = 0; j < sizeof primops / sizeof primops[0]; j++) {
-    flip_ops[primops[j].tag] = primops[j].flipped;
-  }
-#endif
-
-  /* The representation of the constructors of
-   *  data Ordering = LT | EQ | GT
-   * do not have single constructors.
-   * But we can make compound one, since they are irreducible.
-   */
-#define NEWAP(c, f, a) do { n = HEAPREF(heap_start++); SETTAG(n, T_AP); FUN(n) = (f); ARG(n) = (a); (c) = n;} while(0)
-  NEWAP(combLT, combZ,     combFalse);  /* Z B */
-  NEWAP(combEQ, combFalse, combFalse);  /* K K */
-  NEWAP(combGT, combFalse, combTrue);   /* K A */
-  {
-    /* The displaySomeException compiles to (U (U (K2 A))) */
-    NODEPTR x;
-    NEWAP(x, combK2, combTrue);        /* (K2 A) */
-    NEWAP(x, combU, x);                /* (U (K2 A)) */
-    NEWAP(combShowExn, combU, x);      /* (U (U (K2 A))) */
-  }
-#undef NEWAP
-
-#if INTTABLE
-  /* Allocate permanent Int nodes */
-  for (int i = LOW_INT; i < HIGH_INT; i++) {
-    NODEPTR n = HEAPREF(heap_start++);
-    intTable[i - LOW_INT] = n;
-    SETTAG(n, T_INT);
-    SETVALUE(n, i);
-  }
-#endif
-
-  /* Round up heap_start to the next bitword boundary to avoid the permanent nodes. */
-  heap_start = (heap_start + BITS_PER_WORD - 1) / BITS_PER_WORD * BITS_PER_WORD;
-
-  mark_all_free();
-
-  num_free = heap_size - heap_start;
-}
-
-#if GCRED
-int red_a, red_k, red_i, red_int, red_flip;
-#endif
-int red_bb, red_k4, red_k3, red_k2, red_ccb, red_z, red_r;
-
-//counter_t mark_depth;
-//counter_t max_mark_depth = 0;
-
-/* Mark all used nodes reachable from *np, updating *np. */
-void
-mark(NODEPTR *np)
-{
-  stackptr_t stk = stack_ptr;
-  NODEPTR n;
-  NODEPTR *to_push = 0;         /* silence warning by initializing */
-#if GCRED
-  value_t val;
-#endif
-  enum node_tag tag;
-
-  //  mark_depth++;
-  //  if (mark_depth % 10000 == 0)
-  //    PRINT("mark depth %"PRIcounter"\n", mark_depth);
-  top:
-  n = *np;
-  tag = GETTAG(n);
-  if (tag == T_IND) {
-#if SANITY
-    int loop = 0;
-    /* Skip indirections, and redirect start pointer */
-    while ((tag = GETTAG(n)) == T_IND) {
-      //      PRINT("*"); fflush(stdout);
-      n = INDIR(n);
-      if (loop++ > 10000000) {
-        //PRINT("%p %p %p\n", n, INDIR(n), INDIR(INDIR(n)));
-        ERR("IND loop");
-      }
-    }
-    //    if (loop)
-    //      PRINT("\n");
-#else  /* SANITY */
-    while ((tag = GETTAG(n)) == T_IND) {
-      n = INDIR(n);
-    }
-#endif  /* SANITY */
-    *np = n;
-  }
-  if (n < cells || n > cells + heap_size)
-    ERR("bad n");
-  if (is_marked_used(n)) {
-    goto fin;
-  }
-  num_marked++;
-  mark_used(n);
-  switch (tag) {
-#if GCRED
-   case T_INT:
-#if INTTABLE
-    if (LOW_INT <= (val = GETVALUE(n)) && val < HIGH_INT) {
-      SETTAG(n, T_IND);
-      INDIR(n) = intTable[val - LOW_INT];
-      red_int++;
-      goto top;
-    }
-    break;
-#endif  /* INTTABLE */
-   case T_AP:
-      if (want_gc_red) {
-        /* This is really only fruitful just after parsing.  It can be removed. */
-        if (GETTAG(FUN(n)) == T_AP && GETTAG(FUN(FUN(n))) == T_A) {
-          /* Do the A x y --> y reduction */
-          NODEPTR y = ARG(n);
-          SETTAG(n, T_IND);
-          INDIR(n) = y;
-          red_a++;
-          goto top;
-        }
-#if 0
-        /* This never seems to happen */
-        if (GETTAG(FUN(n)) == T_AP && GETTAG(FUN(FUN(n))) == T_K) {
-          /* Do the K x y --> x reduction */
-          NODEPTR x = ARG(FUN(n));
-          SETTAG(n, T_IND);
-          INDIR(n) = x;
-          red_k++;
-          goto top;
-        }
-#endif  /* 0 */
-        if (GETTAG(FUN(n)) == T_I) {
-          /* Do the I x --> x reduction */
-          NODEPTR x = ARG(n);
-          SETTAG(n, T_IND);
-          INDIR(n) = x;
-          red_i++;
-          goto top;
-        }
-#if 0
-        /* This is broken.
-         * Probably because it can happen in the middle of the C reduction code.
-         */
-        DO NOT ENABLE
-        if (GETTAG(FUN(n)) == T_C) {
-          NODEPTR q = ARG(n);
-          enum node_tag tt, tf;
-          while ((tt = GETTAG(q)) == T_IND)
-            q = INDIR(q);
-          if ((tf = flip_ops[tt])) {
-            /* Do the C op --> flip_op reduction */
-            // PRINT("%s -> %s\n", tag_names[tt], tag_names[tf]);
-            SETTAG(n, T_IND);
-            INDIR(n) = HEAPREF(tf);
-            red_flip++;
-            goto fin;
-          }
-        }
-#endif
-      }
-#else   /* GCRED */
-   case T_AP:
-#endif  /* GCRED */
-    /* Avoid tail recursion */
-    np = &FUN(n);
-    to_push = &ARG(n);
-    break;
-   case T_ARR:
-    {
-      struct ioarray *arr = ARR(n);
-
-      // arr->marked records marking progress through arr.
-      if (arr->marked >= arr->size) {
-        goto fin;
-      }
-      // We unmark the array as a whole and push it as long
-      // as there's more entries to scan.
-      mark_unused(n);
-      to_push = np;
-      np = &arr->array[arr->marked++];
-      break;
-    }
-   case T_FORPTR:
-   case T_BSTR:
-     FORPTR(n)->finalizer->marked = 1;
-     goto fin;
-
-   default:
-     goto fin;
-  }
-      
-  if (!is_marked_used(*to_push)) {
-    //  mark_depth++;
-    PUSH((NODEPTR)to_push);
-  }
-  goto top;
- fin:
-  //  if (mark_depth > max_mark_depth) {
-  //    max_mark_depth = mark_depth;
-  //  }
-  //  mark_depth--;
-  if (stack_ptr > stk) {
-    np = (NODEPTR *)POPTOP();
-    goto top;
-  }
-  return;
-}
-
-/* Perform a garbage collection:
-   - First mark from all roots; roots are on the stack.
-*/
-void
-gc(void)
-{
-  stackptr_t i;
-
-  num_gc++;
-  num_marked = 0;
-#if WANT_STDIO
-  if (verbose > 1)
-    PRINT("gc mark\n");
-#endif
-  gc_mark_time -= GETTIMEMILLI();
-  mark_all_free();
-  // mark everything reachable from the stack
-  for (i = 0; i <= stack_ptr; i++)
-    mark(&stack[i]);
-  // mark everything reachable from permanent array nodes
-  for (struct ioarray *arr = array_root; arr; arr = arr->next) {
-    if (arr->permanent) {
-      for (i = 0; i < arr->size; i++)
-        mark(&arr->array[i]);
-    }
-  }
-  gc_mark_time += GETTIMEMILLI();
-
-  if (num_marked > max_num_marked)
-    max_num_marked = num_marked;
-  num_free = heap_size - heap_start - num_marked;
-  if (num_free < heap_size / 50)
-    ERR("heap exhausted");
-
-  gc_scan_time -= GETTIMEMILLI();
-  /* Free unused arrays */
-  for (struct ioarray **arrp = &array_root; *arrp; ) {
-    struct ioarray *arr = *arrp;
-    if (arr->marked || arr->permanent) {
-      arr->marked = 0;
-      arrp = &arr->next;
-    } else {
-      *arrp = arr->next;        /* unlink */
-      num_arr_free++;
-      FREE(arr);                /* and FREE */
-    }
-  }
-
-  /* Run finalizers on unused foreign pointers. */
-  for (struct final **finp = &final_root; *finp; ) {
-    struct final *fin = *finp;
-    if (fin->marked) {
-      fin->marked = 0;
-      finp = &fin->next;
-    } else {
-      /* Unused, run finalizer and free all associated memory */
-      if (fin->size == NOSIZE) {
-        num_fin_free++;
-      } else {
-        num_bs_free++;
-        num_bs_inuse -= fin->size;
-        if (num_bs_alloc - num_bs_free > num_bs_alloc_max)
-          num_bs_alloc_max = num_bs_alloc - num_bs_free;
-      }
-      void (*f)(void *) = (void (*)(void *))fin->final;
-      //printf("forptr free fin=%p, f=%p", fin, f);
-      //fflush(stdout);
-      if (f) {
-        //printf("finalizer fin=%p final=%p\n", fin, f);
-        (*f)(fin->arg);
-      }
-      for (struct forptr *p = fin->back; p; ) {
-        struct forptr *q = p->next;
-        //printf("free fp=%p\n", p);
-        //printf(" p=%p desc=%s", p, p->desc ? p->desc : "NONE");
-        //fflush(stdout);
-        FREE(p);
-        //memset(p, 0x55, sizeof *p);
-        p = q;
-      }
-      //printf("\n");
-      *finp = fin->next;
-      //printf("free fin=%p\n", fin);
-      FREE(fin);
-      //memset(fin, 0x77, sizeof *fin);
-    }
-  }
-  gc_scan_time += GETTIMEMILLI();
-
-#if WANT_STDIO
-  if (verbose > 1) {
-    PRINT("gc done, %"PRIcounter" free\n", num_free);
-    //PRINT(" GC reductions A=%d, K=%d, I=%d, int=%d flip=%d\n", red_a, red_k, red_i, red_int, red_flip);
-  }
-#endif  /* !WANT_STDIO */
-
-#if 0
-  /* For debugging only: mark all free cells */
-  for(int n = 0; n < heap_size; n++) {
-    NODEPTR p = HEAPREF(n);
-    if (!is_marked_used(p)) {
-      SETTAG(p, T_FREE);
-    }
-  }
-#endif
-}
-
-/* Check that there are k nodes available, if not then GC. */
-static INLINE void
-gc_check(size_t k)
-{
-  if (k < num_free)
-    return;
-#if WANT_STDIO
-  if (verbose > 1)
-    PRINT("gc_check: %d\n", (int)k);
-#endif
-  gc();
-}
-
-static INLINE
-value_t
-peekWord(value_t *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-pokeWord(value_t *p, value_t w)
-{
-  *p = w;
-}
-
-static INLINE
-void *
-peekPtr(void **p)
-{
-  return *p;
-}
-
-static INLINE
-void
-pokePtr(void **p, void *w)
-{
-  *p = w;
-}
-
-static INLINE
-uvalue_t
-peek_uint8(uint8_t *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_uint8(uint8_t *p, value_t w)
-{
-  *p = (uint8_t)w;
-}
-
-static INLINE
-uvalue_t
-peek_uint16(uint16_t *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_uint16(uint16_t *p, value_t w)
-{
-  *p = (uint16_t)w;
-}
-
-#if WORD_SIZE >= 32
-static INLINE
-uvalue_t
-peek_uint32(uint32_t *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_uint32(uint32_t *p, value_t w)
-{
-  *p = (uint32_t)w;
-}
-#endif  /* WORD_SIZE >= 32 */
-
-#if WORD_SIZE >= 64
-static INLINE
-uvalue_t
-peek_uint64(uint64_t *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_uint64(uint64_t *p, value_t w)
-{
-  *p = (uint64_t)w;
-}
-#endif  /* WORD_SIZE >= 64 */
-
-static INLINE
-value_t
-peek_int8(int8_t *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_int8(int8_t *p, value_t w)
-{
-  *p = (int8_t)w;
-}
-
-static INLINE
-value_t
-peek_int16(int16_t *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_int16(int16_t *p, value_t w)
-{
-  *p = (int16_t)w;
-}
-
-#if WORD_SIZE >= 32
-static INLINE
-value_t
-peek_int32(int32_t *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_int32(int32_t *p, value_t w)
-{
-  *p = (int32_t)w;
-}
-#endif  /* WORD_SIZE >= 32 */
-
-#if WORD_SIZE >= 64
-static INLINE
-value_t
-peek_int64(int64_t *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_int64(int64_t *p, value_t w)
-{
-  *p = (int64_t)w;
-}
-#endif  /* WORD_SIZE >= 64 */
-
-static INLINE
-value_t
-peek_int(int *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_int(int *p, value_t w)
-{
-  *p = (int)w;
-}
-
-static INLINE
-value_t
-peek_uint(unsigned int *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_uint(unsigned int *p, value_t w)
-{
-  *p = (unsigned int)w;
-}
-
-static INLINE
-value_t
-peek_short(short *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_short(short *p, value_t w)
-{
-  *p = (short)w;
-}
-
-static INLINE
-value_t
-peek_ushort(unsigned short *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_ushort(unsigned short *p, value_t w)
-{
-  *p = (unsigned short)w;
-}
-
-static INLINE
-value_t
-peek_long(long *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_long(long *p, value_t w)
-{
-  *p = (long)w;
-}
-
-static INLINE
-value_t
-peek_ulong(unsigned long *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_ulong(unsigned long *p, value_t w)
-{
-  *p = (unsigned long)w;
-}
-
-static INLINE
-value_t
-peek_llong(long long *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_llong(long long *p, value_t w)
-{
-  *p = (long long)w;
-}
-
-static INLINE
-value_t
-peek_ullong(unsigned long long *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_ullong(unsigned long long *p, value_t w)
-{
-  *p = (unsigned long long)w;
-}
-
-#if WANT_FLOAT
-static INLINE
-flt_t
-peek_flt(flt_t *p)
-{
-  return *p;
-}
-
-static INLINE
-void
-poke_flt(flt_t *p, flt_t w)
-{
-  *p = w;
-}
-#endif  /* WANT_FLOAT */
-
-/* Look up an FFI function by name */
-value_t
-lookupFFIname(const char *name)
-{
-  size_t i;
-
-  for(i = 0; ffi_table[i].ffi_name; i++)
-    if (strcmp(ffi_table[i].ffi_name, name) == 0)
-      return (value_t)i;
-  if (xffi_table) {
-    for(i = 0; xffi_table[i].ffi_name; i++)
-      if (strcmp(xffi_table[i].ffi_name, name) == 0)
-        return (value_t)(i + num_ffi);
-  }
-  return -1;
-}
-
-NODEPTR
-ffiNode(const char *buf)
-{
-  NODEPTR r;
-  value_t i = lookupFFIname(buf);
-  char *fun;
-
-  if (i < 0) {
-    /* lookup failed, generate a node that will dynamically generate an error */
-    r = alloc_node(T_BADDYN);
-    fun = MALLOC(strlen(buf) + 1);
-    strcpy(fun, buf);
-    CSTR(r) = fun;
-  } else {
-    r = alloc_node(T_IO_CCALL);
-    SETVALUE(r, i);
-  }
-  return r;
-}
-
-/* If the next input character is c, then consume it, else leave it alone. */
-int
-gobble(BFILE *f, int c)
-{
-  int d = getb(f);
-  if (c == d) {
-    return 1;
-  } else {
-    ungetb(d, f);
-    return 0;
-  }
-}
-
-/* Get a non-terminating character.  ' ' and '\n' terminates a token. */
-int
-getNT(BFILE *f)
-{
-  int c;
-  
-  c = getb(f);
-  if (c == ' ' || c == '\n') {
-    return 0;
-  } else {
-    return c;
-  }
-}
-
-value_t
-parse_int(BFILE *f)
-{
-  // Parse using uvalue_t, which wraps on overflow.
-  uvalue_t i = 0;
-  int neg = 1;
-  int c = getb(f);
-  if (c == '-') {
-    neg = -1;
-    c = getb(f);
-  }
-  for(;;) {
-    i = i * 10 + (c - '0');
-    c = getb(f);
-    if (c < '0' || c > '9') {
-      ungetb(c, f);
-      break;
-    }
-  }
-  // Multiply by neg without triggering undefined behavior.
-  return (value_t)(((uvalue_t)neg) * i);
-}
-
-#if WANT_FLOAT
-flt_t
-parse_double(BFILE *f)
-{
-  // apparently longest float, when rendered, takes up 24 characters. We add one more for a potential
-  // minus sign, and another one for the final null terminator.
-  // https://stackoverflow.com/questions/1701055/what-is-the-maximum-length-in-chars-needed-to-represent-any-double-value
-  char buf[26];
-  for(int j = 0; (buf[j] = getNT(f)); j++)
-    ;
-
-  return strtod(buf, NULL);
-}
-#endif
-
-struct forptr *mkForPtr(struct bytestring bs);
-
-/* Create a forptr that has a free() finalizer. */
-struct forptr *
-mkForPtrFree(struct bytestring str)
-{
-  struct forptr *fp = mkForPtr(str);         /* Create a foreign pointer */
-  fp->finalizer->final = (HsFunPtr)FREE;     /* and set the finalizer to just free it */
-  return fp;
-}
-
-NODEPTR
-mkStrNode(struct bytestring str)
-{
-  NODEPTR n = alloc_node(T_BSTR);
-  FORPTR(n) = mkForPtrFree(str);
-  //printf("mkForPtr n=%p fp=%p %d %s payload.string=%p\n", n, fp, (int)FORPTR(n)->payload.size, (char*)FORPTR(n)->payload.string, FORPTR(n)->payload.string);
-  return n;
-}
-
-NODEPTR mkInt(value_t i);
-NODEPTR mkFlt(flt_t d);
-NODEPTR mkPtr(void* p);
-
-/* Table of labelled nodes for sharing during parsing. */
-struct shared_entry {
-  heapoffs_t label;
-  NODEPTR node;                 /* NIL indicates unused */
-} *shared_table;
-heapoffs_t shared_table_size;
-
-/* Look for the label in the table.
- * If it's found, return the node.
- * If not found, return the first empty entry.
-*/
-NODEPTR *
-find_label(heapoffs_t label)
-{
-  int i;
-
-  for(i = (int)label; ; i++) {
-    i %= shared_table_size;
-    if (shared_table[i].node == NIL) {
-      /* The slot is empty, so claim and return it */
-      shared_table[i].label = label;
-      return &shared_table[i].node;
-    } else if (shared_table[i].label == label) {
-      /* Found the label, so return it. */
-      return &shared_table[i].node;
-    }
-    /* Not empty and not found, try next. */
-  }
-}
-
-/* The memory allocated here is never freed.
- * This could be fixed by using a forptr and a
- * finalizer for read UTF-8 strings.
- * Fix this if there is a lot of deserialization.
- */
-struct bytestring
-parse_string(BFILE *f)
-{
-  struct bytestring bs;
-  size_t sz = 20;
-  uint8_t *buffer = MALLOC(sz);
-  size_t i;
-  int c;
-
-  if (!buffer)
-    memerr();
-  for(i = 0;;) {
-    c = getb(f);
-    if (c == '"')
-      break;
-    if (i >= sz - 1) {
-      sz *= 2;
-      buffer = REALLOC(buffer, sz);
-      if (!buffer)
-        memerr();
-    }
-    if (c == '\\') {
-      buffer[i++] = (uint8_t)parse_int(f);
-      if (!gobble(f, '&'))
-        ERR("parse string");
-    } else {
-      buffer[i++] = c;
-    }
-  }
-  buffer[i] = 0;                /* add a trailing 0 in case we need a C string */
-  buffer = REALLOC(buffer, i + 1);
-
-  bs.size = i;
-  bs.string = buffer;
-  //printf("parse_string %d %s\n", (int)bs.size, (char*)bs.string);
-  return bs;
-}
-
-NODEPTR
-parse(BFILE *f)
-{
-  stackptr_t stk = stack_ptr;
-  NODEPTR r, x, y;
-  NODEPTR *nodep;
-  heapoffs_t l;
-  value_t i;
-  int c;
-  size_t j;
-  char buf[80];                 /* store names of primitives. */
-
-  for(;;) {
-    c = getb(f);
-    if (c < 0) ERR("parse EOF");
-    switch (c) {
-    case ' ':
-    case '\n':
-      continue;
-    }
-    if (num_free < 3)
-      ERR("out of heap reading code");
-    GCCHECK(1);
-    switch(c) {
-    case '@':
-      x = TOP(0);
-      y = TOP(1);
-      POP(2);
-      PUSH(new_ap(y, x));
-      break;
-    case '}':
-      x = TOP(0);
-      POP(1);
-      if (stack_ptr != stk)
-        ERR("parse: stack");
-      return x;
-    case '&':
-#if WANT_FLOAT
-      r = mkFlt(parse_double(f));
-#else
-      while (getNT(f))          /* skip the float constant */
-        ;
-      r = alloc_node(T_DBL);
-      SETVALUE(r, 0);
-#endif
-      PUSH(r);
-      break;
-    case '#':
-      i = parse_int(f);
-      r = mkInt(i);
-      PUSH(r);
-      break;
-    case '[':
-      {
-        size_t sz;
-        struct ioarray *arr;
-        size_t i;
-        sz = (size_t)parse_int(f);
-        if (!gobble(f, ']')) ERR("parse arr 1");
-        arr = arr_alloc(sz, NIL);
-        for (i = 0; i < sz; i++) {
-          arr->array[i] = TOP(sz - i - 1);
-        }
-        r = alloc_node(T_ARR);
-        ARR(r) = arr;
-        POP(sz);
-        PUSH(r);
-        break;
-      }
-    case '_' :
-      /* Reference to a shared value: _label */
-      l = parse_int(f);  /* The label */
-      nodep = find_label(l);
-      if (*nodep == NIL) {
-        /* Not yet defined, so make it an indirection */
-        *nodep = alloc_node(T_IND);
-        INDIR(*nodep) = NIL;
-      }
-      PUSH(*nodep);
-      break;
-    case ':' :
-      /* Define a shared expression: :label e */
-      l = parse_int(f);  /* The label */
-      if (!gobble(f, ' ')) ERR("parse ' '");
-      nodep = find_label(l);
-      x = TOP(0);
-      if (*nodep == NIL) {
-        /* not referenced yet, so add a direct reference */
-        *nodep = x;
-      } else {
-        /* Sanity check */
-        if (INDIR(*nodep) != NIL) ERR("shared != NIL");
-        INDIR(*nodep) = x;
-      }
-      break;
-    case '"' :
-      /* Everything up to the next " is a string.
-       * Special characters are encoded as \NNN&,
-       * where NNN is the decimal value of the character */
-      PUSH(mkStrNode(parse_string(f)));
-      break;
-#if WANT_TICK
-    case '!':
-      if (!gobble(f, '"'))
-        ERR("parse !");
-      i = add_tick_table(parse_string(f));
-      r = alloc_node(T_TICK);
-      SETVALUE(r, (value_t)i);
-      PUSH(r);
-      break;
-#endif
-    case '^':
-      /* An FFI name */
-      for (j = 0; (buf[j] = getNT(f)); j++)
-        ;
-      r = ffiNode(buf);
-      PUSH(r);
-      break;
-    default:
-      buf[0] = c;
-      /* A primitive, keep getting char's until end */
-      for (j = 1; (buf[j] = getNT(f)); j++)
-        ;
-      /* Look up the primop and use the preallocated node. */
-      for (j = 0; j < sizeof primops / sizeof primops[0]; j++) {
-        if (strcmp(primops[j].name, buf) == 0) {
-          r = primops[j].node;
-          goto found;
-        }
-      }
-      ERR1("no primop %s", buf);
-    found:
-      PUSH(r);
-      break;
-    }
-  }
-}
-
-void
-checkversion(BFILE *f)
-{
-  char *p = VERSION;
-  int c;
-
-  while ((c = *p++)) {
-    if (c != getb(f))
-      ERR("version mismatch");
-  }
-  (void)gobble(f, '\r');                 /* allow extra CR */
-}
-
-/* Parse a file */
-NODEPTR
-parse_top(BFILE *f)
-{
-  heapoffs_t numLabels, i;
-  NODEPTR n;
-  checkversion(f);
-  numLabels = parse_int(f);
-  if (!gobble(f, '\n'))
-    ERR("size parse");
-  gobble(f, '\r');                 /* allow extra CR */
-  shared_table_size = 3 * numLabels; /* sparsely populated hashtable */
-  shared_table = MALLOC(shared_table_size * sizeof(struct shared_entry));
-  if (!shared_table)
-    memerr();
-  for(i = 0; i < shared_table_size; i++)
-    shared_table[i].node = NIL;
-  n = parse(f);
-  FREE(shared_table);
-  return n;
-}
-
-#if WANT_STDIO
-NODEPTR
-parse_file(const char *fn, size_t *psize)
-{
-  FILE *f = fopen(fn, "r");
-  if (!f)
-    ERR1("file not found %s", fn);
-
-  /* And parse it */
-  BFILE *p = add_FILE(f);
-  NODEPTR n = parse_top(p);
-  *psize = ftell(f);
-  closeb(p);
-  return n;
-}
-#endif  /* WANT_STDIO */
-
-counter_t num_shared;
-
-/* Two bits per node: marked, shared
- * 0, 0   -- not visited
- * 1, 0   -- visited once
- * 1, 1   -- visited more than once
- * 0, 1   -- printed
- */
-struct print_bits {
-  bits_t *marked_bits;
-  bits_t *shared_bits;
-};
-static INLINE void set_bit(bits_t *bits, NODEPTR n)
-{
-  heapoffs_t i = LABEL(n);
-  bits[i / BITS_PER_WORD] |= (1ULL << (i % BITS_PER_WORD));
-}
-#if WANT_STDIO
-static INLINE void clear_bit(bits_t *bits, NODEPTR n)
-{
-  heapoffs_t i = LABEL(n);
-  bits[i / BITS_PER_WORD] &= ~(1ULL << (i % BITS_PER_WORD));
-}
-#endif
-static INLINE int test_bit(bits_t *bits, NODEPTR n)
-{
-  heapoffs_t i = LABEL(n);
-  return (bits[i / BITS_PER_WORD] & (1ULL << (i % BITS_PER_WORD))) != 0;
-}
-
-size_t strNodes(size_t len);
-NODEPTR mkStringC(char *str);
-
-#if WANT_STDIO
-#if WORD_SIZE == 64
-#define CONVDBL "%.16g"
-#elif WORD_SIZE == 32
-#define CONVDBL "%.8g"
-#endif
-void
-convdbl(char *str, flt_t x)
-{
-  /* Using 16 decimals will lose some precision.
-   * 17 would keep the precision, but it frequently looks very ugly.
-   */
-  (void)snprintf(str, 25, CONVDBL, x);
-  if (strcmp(str, "nan") != 0 && strcmp(str, "-nan") != 0 &&
-      strcmp(str, "inf") != 0 && strcmp(str, "-inf") != 0 &&
-      !strchr(str, '.') && !strchr(str, 'e') && !strchr(str, 'E')) {
-    /* There is no decimal point and no exponent, so add a decimal point */
-    strcat(str, ".0");
-  }
-}
-
-NODEPTR
-dblToString(flt_t x)
-{
-  char str[30];
-  convdbl(str, x);
-  // turn it into a mhs string
-  GCCHECK(strNodes(strlen(str)));
-  return mkStringC(str);
-}
-
-void
-putdblb(flt_t x, BFILE *p)
-{
-  char str[30];
-  convdbl(str, x);
-  putsb(str, p);
-}
-
-void printrec(BFILE *f, struct print_bits *pb, NODEPTR n, int prefix);
-
-/* Mark all reachable nodes, when a marked node is reached, mark it as shared. */
-void
-find_sharing(struct print_bits *pb, NODEPTR n)
-{
- top:
-  while (GETTAG(n) == T_IND) {
-    n = INDIR(n);
-  }
-  if (n < cells || n >= cells + heap_size) abort();
-  //PRINT("find_sharing %p %llu ", n, LABEL(n));
-  tag_t tag = GETTAG(n);
-  if (tag == T_AP || tag == T_ARR || tag == T_BSTR) {
-    if (test_bit(pb->shared_bits, n)) {
-      /* Alread marked as shared */
-      //PRINT("shared\n");
-      ;
-    } else if (test_bit(pb->marked_bits, n)) {
-      /* Already marked, so now mark as shared */
-      //PRINT("marked\n");
-      set_bit(pb->shared_bits, n);
-      num_shared++;
-    } else {
-      /* Mark as visited, and recurse */
-      //PRINT("unmarked\n");
-      set_bit(pb->marked_bits, n);
-      switch(tag) {
-      case T_AP:
-        find_sharing(pb, FUN(n));
-        n = ARG(n);
-        goto top;
-      case T_ARR:
-        for(size_t i = 0; i < ARR(n)->size; i++) {
-          find_sharing(pb, ARR(n)->array[i]);
-        }
-        break;
-      default:
-        break;
-      }
-    }
-  } else {
-    /* Not an sharable node, so do nothing */
-    //PRINT("not T_AP\n");
-    ;
-  }
-}
-
-void
-print_string(BFILE *f, struct bytestring bs)
-{
-  uint8_t *str = bs.string;
-  putb('"', f);
-  for (size_t i = 0; i < bs.size; i++) {
-    int c = str[i];
-    if (c == '"' || c == '\\' || c < ' ' || c > '~') {
-      putb('\\', f);
-      putdecb(c, f);
-      putb('&', f);
-    } else {
-      putb(c, f);
-    }
-  }
-  putb('"', f);
-}
-
-/*
- * Recursively print an expression.
- * This assumes that the shared nodes has been marked as such.
- * The prefix flag is used to get a readable dump.
- */
-void
-printrec(BFILE *f, struct print_bits *pb, NODEPTR n, int prefix)
-{
-  int share = 0;
-
-  while (GETTAG(n) == T_IND) {
-    //putb('*', f);
-    n = INDIR(n);
-  }
-
-  if (test_bit(pb->shared_bits, n)) {
-    /* The node is shared */
-    if (test_bit(pb->marked_bits, n)) {
-      /* Not yet printed, so emit a label */
-      if (prefix) {
-        putb(':', f);
-        putdecb((value_t)LABEL(n), f);
-        putb(' ', f);
-      } else {
-        share = 1;
-      }
-      clear_bit(pb->marked_bits, n);  /* mark as printed */
-    } else {
-      /* This node has already been printed, so just use a reference. */
-      putb('_', f);
-      putdecb((value_t)LABEL(n), f);
-      if (!prefix)
-        putb(' ', f);
-      return;
-    }
-  }
-
-  //if (n == atptr) putb('@', f);
-  switch (GETTAG(n)) {
-  case T_AP:
-    if (prefix) {
-      putb('(', f);
-      printrec(f, pb, FUN(n), prefix);
-      putb(' ', f);
-      printrec(f, pb, ARG(n), prefix);
-      putb(')', f);
-    } else {
-      printrec(f, pb, FUN(n), prefix);
-      printrec(f, pb, ARG(n), prefix);
-      putb('@', f);
-    }
-    break;
-  case T_INT: putb('#', f); putdecb(GETVALUE(n), f); break;
-  case T_DBL: putb('&', f); putdblb(GETDBLVALUE(n), f); break;
-  case T_ARR:
-    if (prefix) {
-      /* Arrays serialize as '[sz] e_1 ... e_sz' */
-      putb('[', f);
-      putdecb((value_t)ARR(n)->size, f);
-      putb(']', f);
-      for(size_t i = 0; i < ARR(n)->size; i++) {
-        putb(' ', f);
-        printrec(f, pb, ARR(n)->array[i], prefix);
-      }
-    } else {
-      /* Arrays serialize as 'e_1 ... e_sz [sz]' */
-      for(size_t i = 0; i < ARR(n)->size; i++) {
-        printrec(f, pb, ARR(n)->array[i], prefix);
-      }
-      putb('[', f);
-      putdecb((value_t)ARR(n)->size, f);
-      putb(']', f);
-    }
-    break;
-  case T_PTR:
-    if (prefix) {
-      char b[200]; sprintf(b,"PTR<%p>",PTR(n));
-      putsb(b, f);
-    } else {
-      ERR("Cannot serialize pointers");
-    }
-    break;
-  case T_FUNPTR:
-      ERR("Cannot serialize function pointers");
-  case T_FORPTR:
-    if (n == comb_stdin)
-      putsb("IO.stdin", f);
-    else if (n == comb_stdout)
-      putsb("IO.stdout", f);
-    else if (n == comb_stderr)
-      putsb("IO.stderr", f);
-    else {
-      ERR("Cannot serialize foreign pointers");
-    }
-    break;
-  case T_BSTR:
-    print_string(f, FORPTR(n)->payload);
-    break;
-  case T_IO_CCALL: putb('^', f); putsb(FFI_IX(GETVALUE(n)).ffi_name, f); break;
-  case T_BADDYN: putb('^', f); putsb(CSTR(n), f); break;
-  case T_S: putsb("S", f); break;
-  case T_K: putsb("K", f); break;
-  case T_I: putsb("I", f); break;
-  case T_C: putsb("C", f); break;
-  case T_B: putsb("B", f); break;
-  case T_A: putsb("A", f); break;
-  case T_U: putsb("U", f); break;
-  case T_Y: putsb("Y", f); break;
-  case T_P: putsb("P", f); break;
-  case T_R: putsb("R", f); break;
-  case T_O: putsb("O", f); break;
-  case T_SS: putsb("S'", f); break;
-  case T_BB: putsb("B'", f); break;
-  case T_Z: putsb("Z", f); break;
-  case T_K2: putsb("K2", f); break;
-  case T_K3: putsb("K3", f); break;
-  case T_K4: putsb("K4", f); break;
-  case T_CC: putsb("C'", f); break;
-  case T_CCB: putsb("C'B", f); break;
-  case T_ADD: putsb("+", f); break;
-  case T_SUB: putsb("-", f); break;
-  case T_MUL: putsb("*", f); break;
-  case T_QUOT: putsb("quot", f); break;
-  case T_REM: putsb("rem", f); break;
-  case T_UQUOT: putsb("uquot", f); break;
-  case T_UREM: putsb("urem", f); break;
-  case T_SUBR: putsb("subtract", f); break;
-  case T_NEG: putsb("neg", f); break;
-  case T_AND: putsb("and", f); break;
-  case T_OR: putsb("or", f); break;
-  case T_XOR: putsb("xor", f); break;
-  case T_INV: putsb("inv", f); break;
-  case T_SHL: putsb("shl", f); break;
-  case T_SHR: putsb("shr", f); break;
-  case T_ASHR: putsb("ashr", f); break;
-  case T_POPCOUNT: putsb("popcount", f); break;
-  case T_CLZ: putsb("clz", f); break;
-  case T_CTZ: putsb("ctz", f); break;
-#if WANT_FLOAT
-  case T_FADD: putsb("f+", f); break;
-  case T_FSUB: putsb("f-", f); break;
-  case T_FMUL: putsb("f*", f); break;
-  case T_FDIV: putsb("f/", f); break;
-  case T_FNEG: putsb("fneg", f); break;
-  case T_ITOF: putsb("itof", f); break;
-  case T_FEQ: putsb("f==", f); break;
-  case T_FNE: putsb("f/=", f); break;
-  case T_FLT: putsb("f<", f); break;
-  case T_FLE: putsb("f<=", f); break;
-  case T_FGT: putsb("f>", f); break;
-  case T_FGE: putsb("f>=", f); break;
-  case T_FSHOW: putsb("fshow", f); break;
-  case T_FREAD: putsb("fread", f); break;
-#endif
-  case T_BSAPPEND: putsb("bs++", f); break;
-  case T_BSAPPENDDOT: putsb("bs++.", f); break;
-  case T_BSAPPEND3: putsb("bs+++", f); break;
-  case T_BSEQ: putsb("bs==", f); break;
-  case T_BSNE: putsb("bs/=", f); break;
-  case T_BSLT: putsb("bs<", f); break;
-  case T_BSLE: putsb("bs<=", f); break;
-  case T_BSGT: putsb("bs>", f); break;
-  case T_BSGE: putsb("bs>=", f); break;
-  case T_BSCMP: putsb("bscmp", f); break;
-  case T_BSPACK: putsb("bspack", f); break;
-  case T_BSUNPACK: putsb("bsunpack", f); break;
-  case T_BSLENGTH: putsb("bslength", f); break;
-  case T_BSSUBSTR: putsb("bssubstr", f); break;
-  case T_EQ: putsb("==", f); break;
-  case T_NE: putsb("/=", f); break;
-  case T_LT: putsb("<", f); break;
-  case T_LE: putsb("<=", f); break;
-  case T_GT: putsb(">", f); break;
-  case T_GE: putsb(">=", f); break;
-  case T_ULT: putsb("u<", f); break;
-  case T_ULE: putsb("u<=", f); break;
-  case T_UGT: putsb("u>", f); break;
-  case T_UGE: putsb("u>=", f); break;
-  case T_ICMP: putsb("icmp", f); break;
-  case T_UCMP: putsb("ucmp", f); break;
-  case T_FPADD: putsb("fp+", f); break;
-  case T_FP2P: putsb("fp2p", f); break;
-  case T_FPNEW: putsb("fpnew", f); break;
-  case T_FPFIN: putsb("fpfin", f); break;
-    //  case T_FPSTR: putsb("fpstr", f); break;
-  case T_EQUAL: putsb("equal", f); break;
-  case T_COMPARE: putsb("compare", f); break;
-  case T_RNF: putsb("rnf", f); break;
-  case T_SEQ: putsb("seq", f); break;
-  case T_IO_BIND: putsb("IO.>>=", f); break;
-  case T_IO_THEN: putsb("IO.>>", f); break;
-  case T_IO_RETURN: putsb("IO.return", f); break;
-  case T_IO_CCBIND: putsb("IO.C'BIND", f); break;
-  case T_IO_SERIALIZE: putsb("IO.serialize", f); break;
-  case T_IO_PRINT: putsb("IO.print", f); break;
-  case T_IO_DESERIALIZE: putsb("IO.deserialize", f); break;
-  case T_IO_GETARGREF: putsb("IO.getArgRef", f); break;
-  case T_IO_PERFORMIO: putsb("IO.performIO", f); break;
-  case T_IO_GC: putsb("IO.gc", f); break;
-  case T_RAISE: putsb("raise", f); break;
-  case T_CATCH: putsb("catch", f); break;
-  case T_ARR_ALLOC: putsb("A.alloc", f); break;
-  case T_ARR_COPY: putsb("A.copy", f); break;
-  case T_ARR_SIZE: putsb("A.size", f); break;
-  case T_ARR_READ: putsb("A.read", f); break;
-  case T_ARR_WRITE: putsb("A.write", f); break;
-  case T_ARR_EQ: putsb("A.==", f); break;
-  case T_DYNSYM: putsb("dynsym", f); break;
-  case T_NEWCASTRINGLEN: putsb("newCAStringLen", f); break;
-  case T_PEEKCASTRING: putsb("peekCAString", f); break;
-  case T_PEEKCASTRINGLEN: putsb("peekCAStringLen", f); break;
-  case T_TOINT: putsb("toInt", f); break;
-  case T_TOPTR: putsb("toPtr", f); break;
-  case T_TODBL: putsb("toDbl", f); break;
-  case T_TOFUNPTR: putsb("toFunPtr", f); break;
-  case T_BSFROMUTF8: putsb("fromUTF8", f); break;
-  case T_BSTOUTF8: putsb("toUTF8", f); break;
-  case T_BSHEADUTF8: putsb("headUTF8", f); break;
-  case T_BSTAILUTF8: putsb("tailUTF8", f); break;
-  case T_TICK:
-    putb('!', f);
-    print_string(f, tick_table[GETVALUE(n)].tick_name);
-    break;
-  default: ERR("print tag");
-  }
-  if (!prefix) {
-    if (GETTAG(n) != T_AP)
-      putb(' ', f);
-    if (share) {
-      putb(':', f);
-      putdecb((value_t)LABEL(n), f);
-      putb(' ', f);
-    }
-  }
-}
-
-/* Serialize a graph to file. */
-void
-printb(BFILE *f, NODEPTR n, int header)
-{
-  struct print_bits pb;
-  num_shared = 0;
-  pb.marked_bits = calloc(free_map_nwords, sizeof(bits_t));
-  if (!pb.marked_bits)
-    memerr();
-  pb.shared_bits = calloc(free_map_nwords, sizeof(bits_t));
-  if (!pb.shared_bits)
-    memerr();
-  find_sharing(&pb, n);
-  if (header) {
-    putsb(VERSION, f);
-    putdecb(num_shared, f);
-    putb('\n', f);
-  }
-  printrec(f, &pb, n, !header);
-  if (header) {
-    putb('}', f);
-  }
-  FREE(pb.marked_bits);
-  FREE(pb.shared_bits);
-}
-
-/* Show a graph. */
-void
-pp(FILE *f, NODEPTR n)
-{
-  BFILE *bf = add_FILE(f);
-  printb(bf, n, 0);
-  putb('\n', bf);
-  freeb_file(bf);
-}
-
-#if 0
-void
-ppmsg(const char *msg, NODEPTR n)
-{
-  printf("%s", msg);
-  pp(stdout, n);
-  printf("\n");
-}
-#endif
-
-void
-dump(const char *msg, NODEPTR at)
-{
-#if 0
-  atptr = at;
-  printf("dump: %s\n", msg);
-  pp(stdout, *topnode);
-#endif
-}
-
-#else  /* WANT_STDIO */
-NODEPTR
-dblToString(flt_t x)
-{
-  return mkStringC("no dblToString");
-}
-
-#endif  /* WANT_STDIO */
-
-NODEPTR
-mkInt(value_t i)
-{
-#if INTTABLE
-  if (LOW_INT <= i && i < HIGH_INT) {
-    return intTable[i - LOW_INT];
-  }
-#endif
-
-  NODEPTR n;
-  n = alloc_node(T_INT);
-  SETVALUE(n, i);
-  return n;
-}
-
-NODEPTR
-mkFlt(flt_t d)
-{
-  NODEPTR n;
-  n = alloc_node(T_DBL);
-  SETDBLVALUE(n, d);
-  return n;
-}
-
-NODEPTR
-mkPtr(void* p)
-{
-  NODEPTR n;
-  n = alloc_node(T_PTR);
-  PTR(n) = p;
-  return n;
-}
-
-NODEPTR
-mkFunPtr(void (*p)(void))
-{
-  NODEPTR n;
-  n = alloc_node(T_FUNPTR);
-  FUNPTR(n) = p;
-  return n;
-}
-
-struct forptr*
-mkForPtr(struct bytestring bs)
-{
-  struct final *fin = malloc(sizeof(struct final));
-  struct forptr *fp = malloc(sizeof(struct forptr));
-  if (!fin || !fp)
-    memerr();
-  if (bs.size == NOSIZE) {
-    num_fin_alloc++;
-  } else {
-    num_bs_alloc++;
-    num_bs_inuse += bs.size;
-    num_bs_bytes += bs.size;
-    if (num_bs_inuse > num_bs_inuse_max)
-      num_bs_inuse_max = num_bs_inuse;
-  }
-  //printf("mkForPtr p=%p fin=%p fp=%p\n", p, fin, fp);
-  fin->next = final_root;
-  final_root = fin;
-  fin->final = 0;
-  fin->arg = bs.string;
-  fin->size = bs.size;          /* The size is not really needed */
-  fin->back = fp;
-  fin->marked = 0;
-  fp->next = 0;
-  fp->payload = bs;
-  fp->finalizer = fin;
-  //  fp->desc = 0;
-  return fp;
-}
-
-struct forptr*
-mkForPtrP(void *p)
-{
-  struct bytestring bs = { NOSIZE, p };
-  return mkForPtr(bs);
-}
-
-struct forptr*
-addForPtr(struct forptr *ofp, int s)
-{
-  struct forptr *fp = malloc(sizeof(struct forptr));
-  struct final *fin = ofp->finalizer;
-  if (!fp)
-    memerr();
-  fp->next = ofp;
-  fin->back = fp;
-  if (ofp->payload.size != NOSIZE)
-    fp->payload.size = ofp->payload.size - s;
-  fp->payload.string = (uint8_t*)ofp->payload.string + s;
-  fp->finalizer = fin;
-  return fp;
-}
-
-struct forptr*
-bssubstr(struct forptr *fp, value_t offs, value_t len)
-{
-  struct forptr *res = addForPtr(fp, offs);
-  res->payload.size = len;
-  return res;
-}
-
-static INLINE NODEPTR
-mkNil(void)
-{
-  return combFalse;
-}
-
-static INLINE NODEPTR
-mkCons(NODEPTR x, NODEPTR xs)
-{
-  return new_ap(new_ap(combCons, x), xs);
-}
-
-size_t
-strNodes(size_t len)
-{
-  /* Each character will need a CHAR node and a CONS node, a CONS uses 2 T_AP nodes */
-  len *= (1 + 2);
-  /* And each string will need a NIL */
-  len += 1;
-  return len;
-}
-
-/* Turn a C string into a combinator string.
- * Does NOT do UTF decoding.
- */
-NODEPTR
-mkString(struct bytestring bs)
-{
-  NODEPTR n, nc;
-  size_t i;
-  const unsigned char *str = bs.string; /* no sign bits, please */
-
-  n = mkNil();
-  for(i = bs.size; i > 0; i--) {
-    nc = mkInt(str[i-1]);
-    n = mkCons(nc, n);
-  }
-  return n;
-}
-
-NODEPTR
-mkStringC(char *str)
-{
-  struct bytestring bs = { strlen(str), str };
-  return mkString(bs);
-}
-
-NODEPTR
-mkStringU(struct bytestring bs)
-{
-  BFILE *ubuf = add_utf8(openb_rd_buf(bs.string, bs.size));
-  NODEPTR n, *np, nc;
-
-  //printf("mkStringU %d %s\n", (int)bs.size, (char*)bs.string);
-
-  n = mkNil();
-  np = &n;
-  for(;;) {
-    int c = getb(ubuf);
-    if (c < 0)
-      break;
-    nc = mkInt(c);
-    *np = mkCons(nc, *np);
-    np = &ARG(*np);
-  }
-  closeb(ubuf);
-  return n;
-}
-
-NODEPTR
-bsunpack(struct bytestring bs)
-{
-  NODEPTR n, *np, nc;
-  size_t i;
-
-  n = mkNil();
-  np = &n;
-  for(i = 0; i < bs.size; i++) {
-    nc = mkInt(((uint8_t *)bs.string)[i]);
-    *np = mkCons(nc, *np);
-    np = &ARG(*np);
-  }
-  return n;
-}
-
-/* XXX This should somehow be merged with other utf8 decoders */
-value_t
-headutf8(struct bytestring bs, void **ret)
-{
-  uint8_t *p = bs.string;
-  if (bs.size == 0)
-    ERR("headUTF8 0");
-  int c1 = *p++;
-  if ((c1 & 0x80) == 0) {
-    if (ret)
-      *ret = p;
-    return c1;
-  }
-  if (bs.size == 1)
-    ERR("headUTF8 1");
-  int c2 = *p++;
-  if ((c1 & 0xe0) == 0xc0) {
-    if (ret)
-      *ret = p;
-    return ((c1 & 0x1f) << 6) | (c2 & 0x3f);
-  }
-  if (bs.size == 2)
-    ERR("headUTF8 2");
-  int c3 = *p++;
-  if ((c1 & 0xf0) == 0xe0) {
-    if (ret)
-      *ret = p;
-    return ((c1 & 0x0f) << 12) | ((c2 & 0x3f) << 6) | (c3 & 0x3f);
-  }
-  if (bs.size == 3)
-    ERR("headUTF8 3");
-  int c4 = *p++;
-  if ((c1 & 0xf8) == 0xf0) {
-    if (ret)
-      *ret = p;
-    return ((c1 & 0x07) << 18) | ((c2 & 0x3f) << 12) | ((c3 & 0x3f) << 6) | (c4 & 0x3f);
-  }
-  ERR("headUTF8 4");
-}
-
-NODEPTR evali(NODEPTR n);
-
-/* Follow indirections */
-static INLINE NODEPTR
-indir(NODEPTR *np)
-{
-  NODEPTR n = *np;
-  while (GETTAG(n) == T_IND)
-    n = INDIR(n);
-  *np = n;
-  return n;
-}
-
-/* Evaluate to an INT */
-static INLINE value_t
-evalint(NODEPTR n)
-{
-  n = evali(n);
-#if SANITY
-  if (GETTAG(n) != T_INT) {
-    ERR1("evalint, bad tag %d", GETTAG(n));
-  }
-#endif
-  return GETVALUE(n);
-}
-
-/* Evaluate to a Flt_T */
-static INLINE flt_t
-evaldbl(NODEPTR n)
-{
-  n = evali(n);
-#if SANITY
-  if (GETTAG(n) != T_DBL) {
-    ERR1("evaldbl, bad tag %d", GETTAG(n));
-  }
-#endif
-  return GETDBLVALUE(n);
-}
-
-/* Evaluate to a T_PTR */
-void *
-evalptr(NODEPTR n)
-{
-  n = evali(n);
-#if SANITY
-  if (GETTAG(n) != T_PTR) {
-    ERR1("evalptr, bad tag %d", GETTAG(n));
-  }
-#endif
-  return PTR(n);
-}
-
-/* Evaluate to a T_FUNPTR */
-HsFunPtr
-evalfunptr(NODEPTR n)
-{
-  n = evali(n);
-#if SANITY
-  if (GETTAG(n) != T_FUNPTR) {
-    ERR1("evalfunptr, bad tag %d", GETTAG(n));
-  }
-#endif
-  return FUNPTR(n);
-}
-
-/* Evaluate to a T_FORPTR */
-struct forptr *
-evalforptr(NODEPTR n)
-{
-  n = evali(n);
-#if SANITY
-  if (GETTAG(n) != T_FORPTR) {
-    ERR1("evalforptr, bad tag %d", GETTAG(n));
-  }
-#endif
-  return FORPTR(n);
-}
-
-/* Evaluate to a T_BSTR */
-struct forptr *
-evalbstr(NODEPTR n)
-{
-  n = evali(n);
-#if SANITY
-  if (GETTAG(n) != T_BSTR) {
-    ERR1("evalbstr, bad tag %d", GETTAG(n));
-  }
-#endif
-  return FORPTR(n);
-}
-
-/* Evaluate a string, returns a newly allocated buffer.
- * XXX this is cheating, should use continuations.
- * XXX the malloc()ed string is leaked if we yield in here.
- * Caller is responsible to free().
- * Does UTF-8 encoding.
- */
-struct bytestring
-evalstring(NODEPTR n)
-{
-  size_t sz = 100;
-  char *buf = MALLOC(sz);
-  size_t offs;
-  uvalue_t c;
-  NODEPTR x;
-  struct bytestring bs;
-
-  if (!buf)
-    memerr();
-  for (offs = 0;;) {
-    if (offs >= sz - 4) {
-      sz *= 2;
-      buf = REALLOC(buf, sz);
-      if (!buf)
-        memerr();
-    }
-    n = evali(n);
-    if (GETTAG(n) == T_K)            /* Nil */
-      break;
-    else if (GETTAG(n) == T_AP && GETTAG(x = indir(&FUN(n))) == T_AP && GETTAG(indir(&FUN(x))) == T_O) { /* Cons */
-      PUSH(n);                  /* protect from GC */
-      c = evalint(ARG(x));
-      n = POPTOP();
-      /* XXX Encode as UTF8 */
-      if (c < 0x80) {
-        buf[offs++] = (char)c;
-      } else if (c < 0x800) {
-        buf[offs++] = ((c >> 6 )       ) | 0xc0;
-        buf[offs++] = ((c      ) & 0x3f) | 0x80;
-      } else if (c < 0x10000) {
-        buf[offs++] = ((c >> 12)       ) | 0xe0;
-        buf[offs++] = ((c >> 6 ) & 0x3f) | 0x80;
-        buf[offs++] = ((c      ) & 0x3f) | 0x80;
-      } else if (c < 0x110000) {
-        buf[offs++] = ((c >> 18)       ) | 0xf0;
-        buf[offs++] = ((c >> 12) & 0x3f) | 0x80;
-        buf[offs++] = ((c >> 6 ) & 0x3f) | 0x80;
-        buf[offs++] = ((c      ) & 0x3f) | 0x80;
-      } else {
-	ERR("invalid char");
-      }
-      n = ARG(n);
-    } else {
-      ERR("evalstring not Nil/Cons");
-    }
-  }
-  buf[offs] = 0;                /* in case we use it as a C string */
-  bs.size = offs;
-  bs.string = buf;
-  return bs;
-}
-
-/* Does not do UTF-8 encoding */
-struct bytestring
-evalbytestring(NODEPTR n)
-{
-  size_t sz = 100;
-  uint8_t *buf = MALLOC(sz);
-  size_t offs;
-  uvalue_t c;
-  NODEPTR x;
-  struct bytestring bs;
-
-  if (!buf)
-    memerr();
-  for (offs = 0;;) {
-    if (offs >= sz - 1) {
-      sz *= 2;
-      buf = REALLOC(buf, sz);
-      if (!buf)
-        memerr();
-    }
-    n = evali(n);
-    if (GETTAG(n) == T_K)            /* Nil */
-      break;
-    else if (GETTAG(n) == T_AP && GETTAG(x = indir(&FUN(n))) == T_AP && GETTAG(indir(&FUN(x))) == T_O) { /* Cons */
-      PUSH(n);                  /* protect from GC */
-      c = evalint(ARG(x));
-      n = POPTOP();
-      buf[offs++] = c;
-      n = ARG(n);
-    } else {
-      ERR("evalbytestring not Nil/Cons");
-    }
-  }
-  buf[offs] = 0;                /* in case we use it as a C string */
-  bs.size = offs;
-  bs.string = buf;
-  return bs;
-}
-
-struct bytestring
-bsappend(struct bytestring p, struct bytestring q)
-{
-  if (p.size == 0)
-    return q;
-  if (q.size == 0)
-    return p;
-  struct bytestring r;
-  r.size = p.size + q.size;
-  r.string = MALLOC(r.size);
-  if (!r.string)
-    memerr();
-  memcpy(r.string, p.string, p.size);
-  memcpy((uint8_t *)r.string + p.size, q.string, q.size);
-  return r;
-}
-
-struct bytestring
-bsappenddot(struct bytestring p, struct bytestring q)
-{
-  struct bytestring r;
-  r.size = p.size + q.size + 1;
-  r.string = MALLOC(r.size);
-  if (!r.string)
-    memerr();
-  memcpy(r.string, p.string, p.size);
-  memcpy((uint8_t *)r.string + p.size, ".", 1);
-  memcpy((uint8_t *)r.string + p.size + 1, q.string, q.size);
-  return r;
-}
-
-/* 
- * Compare bytestrings.
- * We can't use memcmp() directly for two reasons:
- *  - the two strings can have different lengths
- *  - the return value is only guaranteed to be ==0 or !=0
- */
-int
-bscompare(struct bytestring bsp, struct bytestring bsq)
-{
-  uint8_t *p = bsp.string;
-  uint8_t *q = bsq.string;
-  size_t len = bsp.size < bsq.size ? bsp.size : bsq.size;
-  while (len--) {
-    int r = (int)*p++ - (int)*q++;
-    if (r) {
-      /* Unequal bytes found. */
-      if (r < 0)
-        return -1;
-      if (r > 0)
-        return 1;
-      return 0;
-    }
-  }
-  /* Got to the end of the shorter string. */
-  /* The shorter string is considered smaller. */
-  if (bsp.size < bsq.size)
-    return -1;
-  if (bsp.size > bsq.size)
-    return 1;
-  return 0;
-}
-
-/* Compares anything, but really only works well on strings.
- * if p < q  return -1
- * if p > q  return 1
- * if p == q return 0
- *
- * As we compare we update the argument pointers with any
- * progress we make, in case we are interruped and resume from the top.
- *
- * XXX This is a rather dodgy comparison, since we are comparing
- * functions, and the same data type could plausibly get different
- * functions in the Scott encoding.
- * But we only use it for lists, and it seems to work fine.
- */
-int
-compare(NODEPTR cmp)
-{
-  stackptr_t stk = stack_ptr;
-#define CRET(x) do { stack_ptr = stk; return (x); } while(0)
-  value_t x, y;
-  flt_t xd, yd;
-  void *f, *g;
-  void (*ff)(void), (*fg)(void);
-  NODEPTR p, q;
-  NODEPTR *ap, *aq;
-  enum node_tag ptag, qtag;
-  int r;
-
-  /* Since FUN(cmp) can be shared, allocate a copy for it. */
-  GCCHECK(1);
-  FUN(cmp) = new_ap(FUN(FUN(cmp)), ARG(FUN(cmp)));
-  aq = &ARG(cmp);
-  ap = &ARG(FUN(cmp));
-
-  PUSH(*ap);
-  PUSH(*aq);
-  for(;;) {
-    if (stk == stack_ptr)
-      return 0;
-    q = evali(TOP(0));
-    p = evali(TOP(1));
-    POP(2);
-    if (stk == stack_ptr) {
-      /* We have made some progress, save this in the compare node. */
-      *ap = p;
-      *aq = q;
-    }
-
-    ptag = GETTAG(p);
-    qtag = GETTAG(q);
-    if (ptag != qtag) {
-      /* Hack to make Nil < Cons */
-      if (ptag == T_K && qtag == T_AP)
-        CRET(-1);
-      if (ptag == T_AP && qtag == T_K)
-        CRET(1);
-      CRET(ptag < qtag ? -1 : 1);
-    }
-    switch (ptag) {
-    case T_AP:
-      PUSH(ARG(p));             /* compare arg part later */
-      PUSH(ARG(q));
-      PUSH(FUN(p));             /* compare fun part now */
-      PUSH(FUN(q));
-      break;
-    case T_INT:
-    case T_IO_CCALL:
-      x = GETVALUE(p);
-      y = GETVALUE(q);
-      if (x < y)
-        CRET(-1);
-      if (x > y)
-        CRET(1);
-      break;
-    case T_DBL:
-      xd = GETDBLVALUE(p);
-      yd = GETDBLVALUE(q);
-      if (xd < yd)
-        CRET(-1);
-      if (xd > yd)
-        CRET(1);
-      break;
-    case T_PTR:
-      f = PTR(p);
-      g = PTR(q);
-      if (f < g)
-        CRET(-1);
-      if (f > g)
-        CRET(1);
-      break;
-    case T_FUNPTR:
-      ff = FUNPTR(p);
-      fg = FUNPTR(q);
-      if ((intptr_t)ff < (intptr_t)fg)
-        CRET(-1);
-      if ((intptr_t)ff > (intptr_t)fg)
-        CRET(1);
-      break;
-    case T_FORPTR:
-      f = FORPTR(p)->payload.string;
-      g = FORPTR(q)->payload.string;
-      if (f < g)
-        CRET(-1);
-      if (f > g)
-        CRET(1);
-      break;
-    case T_BSTR:
-      r = bscompare(BSTR(p), BSTR(q));
-      if (r)
-        CRET(r);
-      break;
-    case T_ARR:
-      if (ARR(p) < ARR(q))
-        CRET(-1);
-      if (ARR(p) > ARR(q))
-        CRET(1);
-      break;
-    default:
-      break;
-    }
-  }
-#undef CRET
-}
-
-void
-rnf_rec(bits_t *done, NODEPTR n)
-{
- top:
-  if (test_bit(done, n))
-    return;
-  set_bit(done, n);
-  n = evali(n);
-  if (GETTAG(n) == T_AP) {
-    PUSH(ARG(n));               /* protect from GC */
-    rnf_rec(done, FUN(n));
-    n = POPTOP();
-    goto top;
-  }
-}
-
-/* Used to detect calls to error while we are already in a call to error. */
-int in_raise = 0;
-
-/* This is a yucky hack */
-int doing_rnf = 0;
-
-void
-rnf(value_t noerr, NODEPTR n)
-{
-  /* Mark visited nodes to avoid getting stuck in loops. */
-  bits_t *done = calloc(free_map_nwords, sizeof(bits_t));
-  if (!done)
-    memerr();
-  if (doing_rnf)
-    ERR("recursive rnf()");
-  doing_rnf = (int)noerr;
-  rnf_rec(done, n);
-  doing_rnf = 0;
-  FREE(done);
-}
-
-void execio(NODEPTR *);
-
-/* Evaluate a node, returns when the node is in WHNF. */
-NODEPTR
-evali(NODEPTR an)
-{
-  NODEPTR n = an;
-  stackptr_t stk = stack_ptr;
-  NODEPTR x, y, z, w;
-  value_t xi, yi, r;
-  struct forptr *xfp;
-#if WANT_FLOAT
-  flt_t xd, rd;
-#endif  /* WANT_FLOAT */
-  char *msg;
-#if FASTTAGS
-  heapoffs_t l;
-#endif
-  enum node_tag tag;
-  struct ioarray *arr;
-  struct bytestring xbs, ybs, rbs;
-
-#if MAXSTACKDEPTH
-  counter_t old_cur_c_stack = cur_c_stack;
-  if (++cur_c_stack > max_c_stack)
-    max_c_stack = cur_c_stack;
-#endif
-
-/* Reset stack pointer and return. */
-#define RET do { goto ret; } while(0)
-/* Check that there are at least n arguments, return if not. */
-#define HASNARGS(n) (stack_ptr - stk >= (n))
-#define CHECK(n) do { if (!HASNARGS(n)) RET; } while(0)
-
-#define SETIND(n, x) do { SETTAG((n), T_IND); INDIR((n)) = (x); } while(0)
-#define GOIND(x) do { SETIND(n, (x)); goto ind; } while(0)
-#define GOAP(f,a) do { FUN((n)) = (f); ARG((n)) = (a); goto ap; } while(0)
-/* CHKARGN checks that there are at least N arguments.
- * It also
- *  - sets n to the "top" node
- *  - set x, y, ... to the arguments
- *  - pops N stack elements
- * NOTE: No GC is allowed after these, since the stack has been popped.
- */
-#define CHKARG0 do { } while(0)
-#define CHKARG1 do { CHECK(1); POP(1); n = TOP(-1); x = ARG(n); } while(0)
-#define CHKARG2 do { CHECK(2); POP(2); n = TOP(-1); y = ARG(n); x = ARG(TOP(-2)); } while(0)
-#define CHKARG3 do { CHECK(3); POP(3); n = TOP(-1); z = ARG(n); y = ARG(TOP(-2)); x = ARG(TOP(-3)); } while(0)
-#define CHKARG4 do { CHECK(4); POP(4); n = TOP(-1); w = ARG(n); z = ARG(TOP(-2)); y = ARG(TOP(-3)); x = ARG(TOP(-4)); } while(0)
-
-/* Alloc a possible GC action, e, between setting x and popping */
-#define CHKARGEV1(e)   do { CHECK(1); x = ARG(TOP(0)); e; POP(1); n = TOP(-1); } while(0)
-
-#define SETINT(n,r)    do { SETTAG((n), T_INT); SETVALUE((n), (r)); } while(0)
-#define SETDBL(n,d)    do { SETTAG((n), T_DBL); SETDBLVALUE((n), (d)); } while(0)
-#define SETPTR(n,r)    do { SETTAG((n), T_PTR); PTR(n) = (r); } while(0)
-#define SETFUNPTR(n,r) do { SETTAG((n), T_FUNPTR); FUNPTR(n) = (r); } while(0)
-#define SETFORPTR(n,r) do { SETTAG((n), T_FORPTR); FORPTR(n) = (r); } while(0)
-#define SETBSTR(n,r)   do { SETTAG((n), T_BSTR); FORPTR(n) = (r); } while(0)
-#define OPINT1(e)      do { CHECK(1); xi = evalint(ARG(TOP(0)));                            e; POP(1); n = TOP(-1); } while(0);
-#define OPPTR2(e)      do { CHECK(2); xp = evalptr(ARG(TOP(0))); yp = evalptr(ARG(TOP(1))); e; POP(2); n = TOP(-1); } while(0);
-#define CMPP(op)       do { OPPTR2(r = xp op yp); GOIND(r ? combTrue : combFalse); } while(0)
-
- top:
-  COUNT(num_reductions);
-#if FASTTAGS
-  l = LABEL(n);
-  tag = l < T_IO_BIND ? l : GETTAG(n);
-#else   /* FASTTAGS */
-  tag = GETTAG(n);
-#endif  /* FASTTAGS */
-  switch (tag) {
-  ind:
-  case T_IND:  n = INDIR(n); goto top;
-
-  ap:
-  case T_AP:   PUSH(n); n = FUN(n); goto top;
-
-  case T_BSTR: RET;
-  case T_INT:  RET;
-  case T_DBL:  RET;
-  case T_PTR:  RET;
-  case T_FUNPTR: RET;
-  case T_FORPTR: RET;
-  case T_ARR:  RET;
-  case T_BADDYN: ERR1("FFI unknown %s", CSTR(n));
-    
-  /*
-   * Some of these reductions, (e.g., Z x y = K (x y)) are there to avoid
-   * that increase in arity that some "optimizations" in Abstract.hs
-   * stop reductions from happening.  This can be important for "full laziness".
-   * In practice, these reductions almost never happen, but there they are anyway. :)
-   */
-  case T_S:    GCCHECK(2); CHKARG3; GOAP(new_ap(x, z), new_ap(y, z));                     /* S x y z = x z (y z) */
-  case T_SS:   GCCHECK(3); CHKARG4; GOAP(new_ap(x, new_ap(y, w)), new_ap(z, w));          /* S' x y z w = x (y w) (z w) */
-  case T_K:                CHKARG2; GOIND(x);                                             /* K x y = *x */
-  case T_A:                CHKARG2; GOIND(y);                                             /* A x y = *y */
-  case T_U:                CHKARG2; GOAP(y, x);                                           /* U x y = y x */
-  case T_I:                CHKARG1; GOIND(x);                                             /* I x = *x */
-  case T_Y:                CHKARG1; GOAP(x, n);                                           /* n@(Y x) = x n */
-  case T_B:    GCCHECK(1); CHKARG3; GOAP(x, new_ap(y, z));                                /* B x y z = x (y z) */
-  case T_BB:   if (!HASNARGS(4)) {
-               GCCHECK(1); CHKARG2; red_bb++; GOAP(combB, new_ap(x, y)); } else {         /* B' x y = B (x y) */
-               GCCHECK(2); CHKARG4; GOAP(new_ap(x, y), new_ap(z, w)); }                   /* B' x y z w = x y (z w) */
-  case T_Z:    if (!HASNARGS(3)) {
-               GCCHECK(1); CHKARG2; red_z++; GOAP(combK, new_ap(x, y)); } else {          /* Z x y = K (x y) */
-                           CHKARG3; GOAP(x, y); }                                         /* Z x y z = x y */
-  case T_C:    GCCHECK(1); CHKARG3; GOAP(new_ap(x, z), y);                                /* C x y z = x z y */
-  case T_CC:   GCCHECK(2); CHKARG4; GOAP(new_ap(x, new_ap(y, w)), z);                     /* C' x y z w = x (y w) z */
-  case T_P:    GCCHECK(1); CHKARG3; GOAP(new_ap(z, x), y);                                /* P x y z = z x y */
-  case T_R:    if(!HASNARGS(3)) {
-               GCCHECK(1); CHKARG2; red_r++; GOAP(new_ap(combC, y), x); } else {          /* R x y = C y x */
-               GCCHECK(1); CHKARG3; GOAP(new_ap(y, z), x); }                              /* R x y z = y z x */
-  case T_O:    GCCHECK(1); CHKARG4; GOAP(new_ap(w, x), y);                                /* O x y z w = w x y */
-  case T_K2:   if (!HASNARGS(3)) {
-                           CHKARG2; red_k2++; GOAP(combK, x); } else {                    /* K2 x y = K x */
-                           CHKARG3; GOIND(x); }                                           /* K2 x y z = *x */
-  case T_K3:   if (!HASNARGS(4)) {
-                           CHKARG2; red_k3++; GOAP(combK2, x); } else {                   /* K3 x y = K2 x */
-                           CHKARG4; GOIND(x); }                                           /* K3 x y z w = *x */
-  case T_K4:   if (!HASNARGS(5)) {
-                           CHKARG2; red_k4++; GOAP(combK3, x); } else {                   /* K4 x y = K3 x */
-                           CHECK(5); POP(5); n = TOP(-1); x = ARG(TOP(-5)); GOIND(x); }   /* K4 x y z w v = *x */
-  case T_CCB:  if (!HASNARGS(4)) {
-               GCCHECK(2); CHKARG3; red_ccb++; GOAP(new_ap(combB, new_ap(x, z)), y); } else {  /* C'B x y z = B (x z) y */
-               GCCHECK(2); CHKARG4; GOAP(new_ap(x, z), new_ap(y, w)); }                   /* C'B x y z w = x z (y w) */
-
-    /*
-     * Strict primitives require evaluating the arguments before we can proceed.
-     * The easiest way to do this is to just recursively call evali() for each argument.
-     * The drawback of this is that it uses a lot of C stack.  (E.g., recompiling MicroHs
-     * uses a stack depth of 1800).
-     * Instead we use the following scheme:
-     *  When we find a strict binary (int) primitive we push T_BININT2,
-     *  set n=second argument.
-     *  Continue evaluation of n.
-     *  When n is finally evaluated and we are about to return we check if the stack top is T_BININT2.
-     *  If so, change the stack top to T_BININT1,
-     *  set n=first argument.
-     *  Continue evaluation of n.
-     *  When n is finally evaluated and we are about to return we check if the stack top is T_BININT1.
-     *  If so, we know that both arguments are now evaluated, and we perform the strict operation.
-     *
-     * On my desktop machine this is about 3% slower, on my laptop (Apple M1) it is about 3% faster.
-     *
-     * Pictorially for BININT
-     *  Before the code below:
-     *  ----
-     *  | --------> @
-     *  ----       / \
-     *  | ------> @   y
-     *  ----     / \
-     *  n ----> ADD x
-     *
-     * After
-     *  ----
-     *  | --------> @
-     *  ----       / \
-     *  | ------> @   y
-     *  ----     / \
-     *  | ->BI2 ADD x
-     *  ----        ^
-     *  n ----------|
-     *
-     *  x becomes an INT, stack is not empty, BININT2 found on top
-     *  ----
-     *  | --------> @
-     *  ----       / \
-     *  | ------> @   y
-     *  ----     / \
-     *  | ->BI2 ADD INT
-     *  ----        ^
-     *  n ----------|
-     *
-     *  After
-     *  ----
-     *  | --------> @
-     *  ----       / \
-     *  | ------> @   y
-     *  ----     / \    \
-     *  | ->BI1 ADD INT  |
-     *  ----             |
-     *  n ---------------|
-     *
-     *  y becomes an INT, stack is not empty, BININT1 found on top
-     *  do arithmetic
-     *  ----
-     *  | --------> @
-     *  ----       / \
-     *  | ------> @   INT
-     *  ----     / \    \
-     *  | ->BI1 ADD INT  |
-     *  ----             |
-     *  n ---------------|
-     *
-     *  ---- 
-     *  n -------> INT(x+y)
-     */
-  case T_ADD:
-  case T_SUB:
-  case T_MUL:
-  case T_QUOT:
-  case T_REM:
-  case T_SUBR:
-  case T_UQUOT:
-  case T_UREM:
-  case T_AND:
-  case T_OR:
-  case T_XOR:
-  case T_SHL:
-  case T_SHR:
-  case T_ASHR:
-  case T_EQ:
-  case T_NE:
-  case T_LT:
-  case T_LE:
-  case T_GT:
-  case T_GE:
-  case T_ICMP:
-  case T_ULT:
-  case T_ULE:
-  case T_UGT:
-  case T_UGE:
-  case T_UCMP:
-    CHECK(2);
-    n = ARG(TOP(1));
-    if (GETTAG(n) == T_INT) {
-      n = ARG(TOP(0));
-      PUSH(combBININT1);
-      if (GETTAG(n) == T_INT)
-        goto binint1;
-    } else {
-      PUSH(combBININT2);
-    }
-    goto top;
-  case T_NEG:
-  case T_INV:
-  case T_POPCOUNT:
-  case T_CLZ:
-  case T_CTZ:
-    CHECK(1);
-    n = ARG(TOP(0));
-    PUSH(combUNINT1);
-    goto top;
-
-#if WANT_FLOAT
-  case T_FADD:
-  case T_FSUB:
-  case T_FMUL:
-  case T_FDIV:
-  case T_FEQ:
-  case T_FNE:
-  case T_FLT:
-  case T_FLE:
-  case T_FGT:
-  case T_FGE:
-    CHECK(2);
-    n = ARG(TOP(1));
-    PUSH(combBINDBL2);
-    goto top;
-  case T_FNEG:
-    CHECK(1);
-    n = ARG(TOP(0));
-    PUSH(combUNDBL1);
-    goto top;
-
-  case T_ITOF: OPINT1(rd = (flt_t)xi); SETDBL(n, rd); RET;
-  case T_FREAD:
-    CHECK(1);
-    msg = evalstring(ARG(TOP(0))).string;
-#if WORD_SIZE == 64
-    xd = strtod(msg, NULL);
-#elif WORD_SIZE == 32
-    xd = strtof(msg, NULL);
-#else  /* WORD_SIZE */
-#error Unknown WORD_SIZE
-#endif  /* WORD_SIZE */
-    FREE(msg);
-    POP(1);
-    n = TOP(-1);
-    SETDBL(n, xd);
-    RET;
-
-  case T_FSHOW:
-    CHECK(1);
-    xd = evaldbl(ARG(TOP(0)));
-    POP(1);
-    n = TOP(-1);
-    GOIND(dblToString(xd));
-#endif  /* WANT_FLOAT */
-
-  case T_BSAPPEND:
-  case T_BSAPPENDDOT:
-  case T_BSEQ:
-  case T_BSNE:
-  case T_BSLT:
-  case T_BSLE:
-  case T_BSGT:
-  case T_BSGE:
-  case T_BSCMP:
-    CHECK(2);
-    n = ARG(TOP(1));
-    PUSH(combBINBS2);
-    goto top;
-
-  /* Retag a word sized value, keeping the value bits */
-#define CONV(t) do { CHECK(1); x = evali(ARG(TOP(0))); n = POPTOP(); SETTAG(n, t); SETVALUE(n, GETVALUE(x)); RET; } while(0)
-  case T_TODBL: CONV(T_DBL);
-  case T_TOINT: CONV(T_INT);
-  case T_TOPTR: CONV(T_PTR);
-  case T_TOFUNPTR: CONV(T_FUNPTR);
-#undef CONV
-
-  case T_FPADD: CHECK(2); xfp = evalforptr(ARG(TOP(0))); yi = evalint(ARG(TOP(1))); POP(2); n = TOP(-1); SETFORPTR(n, addForPtr(xfp, yi)); RET;
-  case T_FP2P:  CHECK(1);
-    //printf("T_FP2P\n");
-    xfp = evalforptr(ARG(TOP(0))); POP(1); n = TOP(-1);
-    //printf("T_FP2P xfp=%p, payload=%p\n", xfp, xfp->payload);
-    SETPTR(n, xfp->payload.string); RET;
-
-  case T_ARR_EQ:
-    {
-      CHECK(2);
-      x = evali(ARG(TOP(0)));
-      arr = ARR(x);
-      y = evali(ARG(TOP(1)));
-      POP(2);
-      n = TOP(-1);
-      GOIND(arr == ARR(y) ? combTrue : combFalse);
-    }
-
-  case T_BSTOUTF8:
-    {
-      CHECK(1);
-      struct bytestring bs = evalstring(ARG(TOP(0)));
-      POP(1);
-      n = TOP(-1);
-      SETBSTR(n, mkForPtrFree(bs));
-      RET;
-    }
-
-  case T_BSHEADUTF8:
-    CHECK(1);
-    x = evali(ARG(TOP(0)));
-    if (GETTAG(x) != T_BSTR) ERR("HEADUTF8");
-    POP(1);
-    n = TOP(-1);
-    SETINT(n, headutf8(BSTR(x), (void**)0));
-    RET;
-
-  case T_BSTAILUTF8:
-    CHECK(1);
-    x = evali(ARG(TOP(0)));
-    if (GETTAG(x) != T_BSTR) ERR("TAILUTF8");
-    POP(1);
-    n = TOP(-1);
-    { xfp = FORPTR(x);                              /* foreign pointer to the string */
-      void *out;
-      (void)headutf8(xfp->payload, &out);           /* skip one UTF8 character */
-      xi = (char*)out - (char*)xfp->payload.string; /* offset */
-      yi = xfp->payload.size - xi;                  /* remaining length */
-      SETBSTR(n, bssubstr(xfp, xi, yi));            /* make a substring */
-    }
-    RET;
-
-  case T_BSFROMUTF8:
-    if (doing_rnf) RET;
-    CHECK(1);
-    x = evali(ARG(TOP(0)));
-    if (GETTAG(x) != T_BSTR) ERR("FROMUTF8");
-    POP(1);
-    n = TOP(-1);
-    GCCHECK(strNodes(BSTR(x).size));
-    //printf("T_FROMUTF8 x = %p fp=%p payload.string=%p\n", x, x->uarg.uuforptr, x->uarg.uuforptr->payload.string);
-    GOIND(mkStringU(BSTR(x)));
-
-  case T_BSUNPACK:
-    if (doing_rnf) RET;
-    CHECK(1);
-    x = evali(ARG(TOP(0)));
-    if (GETTAG(x) != T_BSTR) ERR("BSUNPACK");
-    POP(1);
-    n = TOP(-1);
-    GCCHECK(strNodes(BSTR(x).size));
-    GOIND(bsunpack(BSTR(x)));
-
-  case T_BSPACK:
-    CHECK(1);
-    struct bytestring rbs = evalbytestring(ARG(TOP(0)));
-    POP(1);
-    n = TOP(-1);
-    SETBSTR(n, mkForPtrFree(rbs));
-    RET;
-
-  case T_BSSUBSTR:
-    CHECK(3);
-    xfp = evalbstr(ARG(TOP(0)));
-    xi = evalint(ARG(TOP(1)));
-    yi = evalint(ARG(TOP(2)));
-    POP(3);
-    n = TOP(-1);
-    SETBSTR(n, bssubstr(xfp, xi, yi));
-    RET;
-
-  case T_BSLENGTH:
-    CHECK(1);
-    xfp = evalbstr(ARG(TOP(0)));
-    POP(1);
-    n = TOP(-1);
-    SETINT(n, xfp->payload.size);
-    RET;
-
-  case T_RAISE:
-    if (doing_rnf) RET;
-    if (cur_handler) {
-      /* Pass the exception to the handler */
-      CHKARG1;
-      cur_handler->hdl_exn = x;
-      longjmp(cur_handler->hdl_buf, 1);
-    } else {
-      /* No handler:
-       * First convert the exception to a string by calling displaySomeException.
-       * The display function compiles to combShowExn, so we need to build
-       * (combShowExn x) and evaluate it.
-       */
-      if (in_raise) {
-        ERR("recursive error");
-        EXIT(1);
-      }
-      in_raise = 1;
-      CHECK(1);
-      GCCHECK(1);
-      //TOP(0) = new_ap(combShowExn, TOP(0));
-      FUN(TOP(0)) = combShowExn; /* TOP(0) = (combShowExn exn) */
-      x = evali(TOP(0));        /* evaluate it */
-      msg = evalstring(x).string;   /* and convert to a C string */
-      POP(1);
-#if WANT_STDIO
-      /* A horrible hack until we get proper exceptions */
-      if (strcmp(msg, "ExitSuccess") == 0) {
-        EXIT(0);
-      } else {
-        fprintf(stderr, "mhs: %s\n", msg);
-        EXIT(1);
-      }
-#else  /* WANT_STDIO */
-      ERR1("mhs error: %s", msg);
-#endif  /* WANT_STDIO */
-    }
-    
-
-  case T_SEQ:  CHECK(2); evali(ARG(TOP(0))); POP(2); n = TOP(-1); y = ARG(n); GOIND(y); /* seq x y = eval(x); y */
-    
-  case T_EQUAL:
-    CHECK(2); r = compare(TOP(1)); POP(2); n = TOP(-1); GOIND(r==0 ? combTrue : combFalse);
-  case T_COMPARE:
-    CHECK(2); r = compare(TOP(1)); POP(2); n = TOP(-1); GOIND(r < 0 ? combLT : r > 0 ? combGT : combEQ);
-
-  case T_RNF:
-    if (doing_rnf) RET;
-    CHECK(2);
-    xi = evalint(ARG(TOP(0)));
-    rnf(xi, ARG(TOP(1))); POP(2); n = TOP(-1); GOIND(combUnit);
-
-  case T_IO_PERFORMIO:
-    CHECK(1);
-    if (doing_rnf) RET;
-    execio(&ARG(TOP(0)));       /* run IO action */
-    x = ARG(TOP(0));           /* should be RETURN e */
-    if (GETTAG(x) != T_AP || GETTAG(FUN(x)) != T_IO_RETURN)
-      ERR("PERFORMIO");
-    POP(1);
-    n = TOP(-1);
-    GOIND(ARG(x));
-
-  case T_IO_CCBIND:           /* We should never have to reduce this */
-  case T_IO_BIND:
-  case T_IO_THEN:
-  case T_IO_RETURN:
-  case T_IO_SERIALIZE:
-  case T_IO_PRINT:
-  case T_IO_DESERIALIZE:
-  case T_IO_GETARGREF:
-  case T_IO_CCALL:
-  case T_CATCH:
-  case T_NEWCASTRINGLEN:
-  case T_PEEKCASTRING:
-  case T_PEEKCASTRINGLEN:
-  case T_ARR_ALLOC:
-  case T_ARR_COPY:
-  case T_ARR_SIZE:
-  case T_ARR_READ:
-  case T_ARR_WRITE:
-  case T_FPNEW:
-  case T_FPFIN:
-    //  case T_FPSTR:
-  case T_IO_GC:
-    RET;
-
-  case T_DYNSYM:
-    /* A dynamic FFI lookup */
-    CHECK(1);
-    msg = evalstring(ARG(TOP(0))).string;
-    GCCHECK(1);
-    x = ffiNode(msg);
-    FREE(msg);
-    POP(1);
-    n = TOP(-1);
-    GOIND(x);
-    
-#if WANT_TICK
-  case T_TICK:
-    xi = GETVALUE(n);
-    CHKARG1;
-    dotick(xi);
-    GOIND(x);
-#endif
-
-  default:
-    ERR1("eval tag %d", GETTAG(n));
-  }
-
-
- ret:
-  if (stack_ptr != stk) {
-    // In this case, n was an AP that got pushed and potentially
-    // updated.
-    uvalue_t xu, yu, ru;
-#if WANT_FLOAT
-    flt_t xd, yd, rd;
-#endif  /* WANT_FLOAT */
-    NODEPTR p;
-    
-    tag = GETTAG(TOP(0));
-    switch (tag) {
-    case T_BININT2:
-      n = ARG(TOP(1));
-      TOP(0) = combBININT1;
-      goto top;
-
-    case T_BININT1:
-      /* First argument */
-#if SANITY
-      if (GETTAG(n) != T_INT)
-        ERR("BININT 0");
-#endif  /* SANITY */
-    binint1:
-      xu = (uvalue_t)GETVALUE(n);
-      /* Second argument */
-      y = ARG(TOP(2));
-      while (GETTAG(y) == T_IND)
-        y = INDIR(y);
-#if SANITY
-      if (GETTAG(y) != T_INT)
-        ERR("BININT 1");
-#endif  /* SANITY */
-      yu = (uvalue_t)GETVALUE(y);
-      p = FUN(TOP(1));
-      POP(3);
-      n = TOP(-1);
-    binint:
-      switch (GETTAG(p)) {
-      case T_IND:   p = INDIR(p); goto binint;
-      case T_ADD:   ru = xu + yu; break;
-      case T_SUB:   ru = xu - yu; break;
-      case T_MUL:   ru = xu * yu; break;
-      case T_QUOT:  ru = (uvalue_t)((value_t)xu / (value_t)yu); break;
-      case T_REM:   ru = (uvalue_t)((value_t)xu % (value_t)yu); break;
-      case T_SUBR:  ru = yu - xu; break;
-      case T_UQUOT: ru = xu / yu; break;
-      case T_UREM:  ru = xu % yu; break;
-      case T_AND:   ru = xu & yu; break;
-      case T_OR:    ru = xu | yu; break;
-      case T_XOR:   ru = xu ^ yu; break;
-      case T_SHL:   ru = xu << yu; break;
-      case T_SHR:   ru = xu >> yu; break;
-      case T_ASHR:  ru = (uvalue_t)((value_t)xu >> yu); break;
-
-      case T_EQ:    GOIND(xu == yu ? combTrue : combFalse);
-      case T_NE:    GOIND(xu != yu ? combTrue : combFalse);
-      case T_ULT:   GOIND(xu <  yu ? combTrue : combFalse);
-      case T_ULE:   GOIND(xu <= yu ? combTrue : combFalse);
-      case T_UGT:   GOIND(xu >  yu ? combTrue : combFalse);
-      case T_UGE:   GOIND(xu >= yu ? combTrue : combFalse);
-      case T_UCMP:  GOIND(xu <  yu ? combLT   : xu > yu ? combGT : combEQ);
-      case T_LT:    GOIND((value_t)xu <  (value_t)yu ? combTrue : combFalse);
-      case T_LE:    GOIND((value_t)xu <= (value_t)yu ? combTrue : combFalse);
-      case T_GT:    GOIND((value_t)xu >  (value_t)yu ? combTrue : combFalse);
-      case T_GE:    GOIND((value_t)xu >= (value_t)yu ? combTrue : combFalse);
-      case T_ICMP:  GOIND((value_t)xu <  (value_t)yu ? combLT   : (value_t)xu > (value_t)yu ? combGT : combEQ);
-
-      default:
-        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));
-        ERR("BININT");
-      }
-      SETINT(n, (value_t)ru);
-      goto ret;
-
-    case T_UNINT1:
-      /* The argument */
-#if SANITY
-      if (GETTAG(n) != T_INT)
-        ERR("UNINT 0");
-#endif
-      xu = (uvalue_t)GETVALUE(n);
-      p = FUN(TOP(1));
-      POP(2);
-      n = TOP(-1);
-    unint:
-      switch (GETTAG(p)) {
-      case T_IND:      p = INDIR(p); goto unint;
-      case T_NEG:      ru = -xu; break;
-      case T_INV:      ru = ~xu; break;
-      case T_POPCOUNT: ru = POPCOUNT(xu); break;
-      case T_CLZ:      ru = CLZ(xu); break;
-      case T_CTZ:      ru = CTZ(xu); break;
-      default:
-        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));
-        ERR("UNINT");
-      }
-      SETINT(n, (value_t)ru);
-      goto ret;
-
-#if WANT_FLOAT
-    case T_BINDBL2:
-      n = ARG(TOP(1));
-      TOP(0) = combBINDBL1;
-      goto top;
-
-    case T_BINDBL1:
-      /* First argument */
-#if SANITY
-      if (GETTAG(n) != T_DBL)
-        ERR("BINDBL 0");
-#endif  /* SANITY */
-      xd = GETDBLVALUE(n);
-      /* Second argument */
-      y = ARG(TOP(2));
-      while (GETTAG(y) == T_IND)
-        y = INDIR(y);
-#if SANITY
-      if (GETTAG(y) != T_DBL)
-        ERR("BINDBL 1");
-#endif  /* SANITY */
-      yd = GETDBLVALUE(y);
-      p = FUN(TOP(1));
-      POP(3);
-      n = TOP(-1);
-    bindbl:
-      switch (GETTAG(p)) {
-      case T_IND:   p = INDIR(p); goto bindbl;
-      case T_FADD:  rd = xd + yd; break;
-      case T_FSUB:  rd = xd - yd; break;
-      case T_FMUL:  rd = xd * yd; break;
-      case T_FDIV:  rd = xd / yd; break;
-
-      case T_FEQ:   GOIND(xd == yd ? combTrue : combFalse);
-      case T_FNE:   GOIND(xd != yd ? combTrue : combFalse);
-      case T_FLT:   GOIND(xd <  yd ? combTrue : combFalse);
-      case T_FLE:   GOIND(xd <= yd ? combTrue : combFalse);
-      case T_FGT:   GOIND(xd >  yd ? combTrue : combFalse);
-      case T_FGE:   GOIND(xd >= yd ? combTrue : combFalse);
-
-      default:
-        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));
-        ERR("BINDBL");
-      }
-      SETDBL(n, rd);
-      goto ret;
-
-    case T_UNDBL1:
-      /* The argument */
-#if SANITY
-      if (GETTAG(n) != T_DBL)
-        ERR("UNDBL 0");
-#endif
-      xd = GETDBLVALUE(n);
-      p = FUN(TOP(1));
-      POP(2);
-      n = TOP(-1);
-    undbl:
-      switch (GETTAG(p)) {
-      case T_IND:   p = INDIR(p); goto undbl;
-      case T_FNEG:  rd = -xd; break;
-      default:
-        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));
-        ERR("UNDBL");
-      }
-      SETDBL(n, rd);
-      goto ret;
-#endif  /* WANT_FLOAT */
-
-    case T_BINBS2:
-      n = ARG(TOP(1));
-      TOP(0) = combBINBS1;
-      goto top;
-
-    case T_BINBS1:
-      /* First argument */
-#if SANITY
-      if (GETTAG(n) != T_BSTR)
-        ERR("BINBS 0");
-#endif  /* SANITY */
-      xbs = BSTR(n);
-      /* Second argument */
-      y = ARG(TOP(2));
-      while (GETTAG(y) == T_IND)
-        y = INDIR(y);
-#if SANITY
-      if (GETTAG(y) != T_BSTR)
-        ERR("BINBS 1");
-#endif  /* SANITY */
-      ybs = BSTR(y);
-      p = FUN(TOP(1));
-      POP(3);
-      n = TOP(-1);
-    binbs:
-      switch (GETTAG(p)) {
-      case T_IND:    p = INDIR(p); goto binbs;
-
-      case T_BSAPPEND: rbs = bsappend(xbs, ybs); break;
-      case T_BSAPPENDDOT: rbs = bsappenddot(xbs, ybs); break;
-      case T_BSEQ:   GOIND(bscompare(xbs, ybs) == 0 ? combTrue : combFalse);
-      case T_BSNE:   GOIND(bscompare(xbs, ybs) != 0 ? combTrue : combFalse);
-      case T_BSLT:   GOIND(bscompare(xbs, ybs) <  0 ? combTrue : combFalse);
-      case T_BSLE:   GOIND(bscompare(xbs, ybs) <= 0 ? combTrue : combFalse);
-      case T_BSGT:   GOIND(bscompare(xbs, ybs) >  0 ? combTrue : combFalse);
-      case T_BSGE:   GOIND(bscompare(xbs, ybs) >= 0 ? combTrue : combFalse);
-      case T_BSCMP:  r = bscompare(xbs, ybs); GOIND(r < 0 ? combLT : r > 0 ? combGT : combEQ);
-
-      default:
-        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));
-        ERR("BINBS");
-      }
-      SETBSTR(n, mkForPtrFree(rbs));
-      goto ret;
-
-    default:
-      stack_ptr = stk;
-      n = TOP(-1);
-    }
-  }
-#if MAXSTACKDEPTH
-  cur_c_stack = old_cur_c_stack; /* reset rather than counting down, in case of longjump */
-#endif
-  return n;
-}
-
-/* This is the interpreter for the IO monad operations.
- * 
- * Assuming every graph rewrite is atomic we want the graph
- * to always represent the rest of the program to run.
- * To this end, we need to mutate the graph every time
- * an IO operation has been performed to make sure we don't
- * execute it again.
- * To have a cell that is safe to mutate, we allocate a new
- * application on entry to execio().
- * Given the call execio(np) we allocate this graph, top,:
- *   BIND (*np) RETURN
- * and make np point to it.
- * This graph will be updated continuously as we execite IO action.
- * Invariant: the second argument to this BIND is always either RETURN
- * or a C'BIND.  The second argument to C'BIND has the same invariant.
- * This is the cycle:
- *  again:
- *   given top = BIND n q
- *   eval(n)
- *   case n
- *     BIND r s:  rewrite to top := BIND r (C'BIND s q)  -- (r >>= s) >>= q  -->  r >>= (\ x -> s x >>= q)
- *     THEN r s:  ... K s ...
- *     otherwise: res = execute n
- *       case q
- *         RETURN:     rewrite to  top := RETURN res;  return to caller
- *         C'BIND r s: rewrite to  top := BIND (r res) s; goto again
- */
-void
-execio(NODEPTR *np)
-{
-  stackptr_t stk = stack_ptr;
-  NODEPTR f, x, n, q, r, s, res, top1;
-  char *name;
-  struct handler *h;
-#if WANT_STDIO
-  void *ptr;
-  int hdr;
-#endif  /* WANT_STDIO */
-  NODEPTR top;
-
-/* IO operations need all arguments, anything else should not happen. */
-#define CHECKIO(n) do { if (stack_ptr - stk != (n)+1) {/*printf("\nLINE=%d\n", __LINE__);*/ ERR("CHECKIO");}; } while(0)
-/* #define RETIO(p) do { stack_ptr = stk; return (p); } while(0)*/
-#define GCCHECKSAVE(p, n) do { PUSH(p); GCCHECK(n); (p) = TOP(0); POP(1); } while(0)
-#define RETIO(p) do { stack_ptr = stk; res = (p); goto rest; } while(0)
-#define IOASSERT(p,s) do { if (!(p)) ERR("IOASSERT " s); } while(0)
-
-  GCCHECK(2);
-  top = new_ap(new_ap(combIOBIND, *np), combIORETURN);
-  *np = top;
-
- start:
-  //dump("start", top);
-  IOASSERT(stack_ptr == stk, "start");
-  //ppmsg("n before = ", ARG(FUN(top)));
-  n = evali(ARG(FUN(top)));     /* eval(n) */
-  //ppmsg("n after  = ", n);
-  if (GETTAG(n) == T_AP && GETTAG(top1 = indir(&FUN(n))) == T_AP) {
-    switch (GETTAG(indir(&FUN(top1)))) {
-    case T_IO_BIND:
-      GCCHECKSAVE(n, 2);
-      s = ARG(n);
-    bind:
-      q = ARG(top);
-      r = ARG(top1);
-      ARG(FUN(top)) = r;
-      ARG(top) = x = new_ap(new_ap(combIOCCBIND, s), q);
-      goto start;
-    case T_IO_THEN:
-      GCCHECKSAVE(n, 3);
-      s = new_ap(combFalse, ARG(n));
-      goto bind;
-    default:
-      break;
-    }
-  }
-  goto execute;
-
- rest:                          /* result is in res */
-  //ppmsg("res=", res);
-  q = ARG(top);
-  //ppmsg("q=", q);
-  if (GETTAG(q) == T_IO_RETURN) {
-    /* execio is done */
-    FUN(top) = combIORETURN;
-    ARG(top) = res;
-    IOASSERT(stack_ptr == stk, "stk");
-    return;
-  }
-  /* not done, it must be a C'BIND */
-  GCCHECKSAVE(res, 1);
-  IOASSERT(GETTAG(q) == T_AP && GETTAG(FUN(q)) == T_AP && GETTAG(FUN(FUN(q))) == T_IO_CCBIND, "rest-AP");
-  r = ARG(FUN(q));
-  s = ARG(q);
-  ARG(FUN(top)) = new_ap(r, res);
-  ARG(top) = s;
-  goto start;
-
- execute:
-  PUSH(n);
-  for(;;) {
-    COUNT(num_reductions);
-    //printf("execute switch %s\n", tag_names[GETTAG(n)]);
-    switch (GETTAG(n)) {
-    case T_IND:
-      n = INDIR(n);
-      TOP(0) = n;
-      break;
-    case T_AP:
-      n = FUN(n);
-      PUSH(n);
-      break;
-    case T_IO_BIND:
-      ERR("T_IO_BIND");
-    case T_IO_THEN:
-      ERR("T_IO_THEN");
-    case T_IO_CCBIND:
-      ERR("T_IO_CCBIND");
-    case T_IO_RETURN:
-      CHECKIO(1);
-      n = ARG(TOP(1));
-      RETIO(n);
-#if WANT_STDIO
-    case T_IO_PRINT:
-      hdr = 0;
-      goto ser;
-    case T_IO_SERIALIZE:
-      hdr = 1;
-    ser:
-      CHECKIO(2);
-      gc();                     /* DUBIOUS: do a GC to get possible GC reductions */
-      ptr = (struct BFILE*)evalptr(ARG(TOP(1)));
-      x = evali(ARG(TOP(2)));
-      //x = ARG(TOP(1));
-      printb(ptr, x, hdr);
-      putb('\n', ptr);
-      RETIO(combUnit);
-    case T_IO_DESERIALIZE:
-      CHECKIO(1);
-      ptr = (struct BFILE*)evalptr(ARG(TOP(1)));
-      gc();                     /* make sure we have room.  GC during parse is dodgy. */
-      n = parse_top(ptr);
-      RETIO(n);
-#endif
-#if WANT_ARGS
-    case T_IO_GETARGREF:
-      CHECKIO(0);
-      n = alloc_node(T_ARR);
-      ARR(n) = argarray;
-      RETIO(n);
-#endif
-
-    case T_IO_CCALL:
-      {
-        int a = (int)GETVALUE(n);
-        funptr_t f = FFI_IX(a).ffi_fun;
-        GCCHECK(1);             /* room for placeholder */
-        PUSH(mkFlt(0.0));       /* placeholder for result, protected from GC */
-        f(stk);                 /* call FFI function */
-        n = TOP(0);             /* pop actual result */
-        RETIO(n);               /* and this is the result */
-      }
-
-    case T_CATCH:
-      {
-        h = MALLOC(sizeof *h);
-        if (!h)
-          memerr();
-        CHECKIO(2);
-        h->hdl_old = cur_handler;
-        h->hdl_stack = stack_ptr;
-        cur_handler = h;
-        if (setjmp(h->hdl_buf)) {
-          /* An exception occurred: */
-          stack_ptr = h->hdl_stack;
-          x = h->hdl_exn;       /* exception value */
-          GCCHECKSAVE(x, 1);
-          f = ARG(TOP(2));      /* second argument, handler */
-          n = new_ap(f, x);
-          cur_handler = h->hdl_old;
-          FREE(h);
-          POP(3);
-          ARG(FUN(top)) = n;
-          goto start;
-        } else {
-          /* Normal execution: */
-          execio(&ARG(TOP(1))); /* execute first argument */
-          cur_handler = h->hdl_old; /* restore old handler */
-          FREE(h);
-          n = ARG(TOP(1));
-          IOASSERT(GETTAG(n) == T_AP && GETTAG(FUN(n)) == T_IO_RETURN, "CATCH");
-          RETIO(ARG(n));             /* return result */
-        }
-      }
-
-    case T_NEWCASTRINGLEN:
-      {
-      CHECKIO(1);
-      struct bytestring bs = evalbytestring(ARG(TOP(1)));
-      GCCHECK(4);
-      n = new_ap(new_ap(combPair, x = alloc_node(T_PTR)), mkInt(bs.size));
-      PTR(x) = bs.string;
-      RETIO(n);
-      }
-
-    case T_PEEKCASTRING:
-      {
-      size_t size;
-      CHECKIO(1);
-      name = evalptr(ARG(TOP(1)));
-      size = strlen(name);
-      GCCHECK(strNodes(size));
-      struct bytestring bs = { size, name };
-      RETIO(mkString(bs));
-      }
-
-    case T_PEEKCASTRINGLEN:
-      {
-      size_t size;
-      CHECKIO(2);
-      size = evalint(ARG(TOP(2)));
-      name = evalptr(ARG(TOP(1)));
-      GCCHECK(strNodes(size));
-      struct bytestring bs = { size, name };
-      RETIO(mkString(bs));
-      }
-
-    case T_ARR_ALLOC:
-      {
-      size_t size;
-      NODEPTR elem;
-      struct ioarray *arr;
-      CHECKIO(2);
-      GCCHECK(1);
-      size = evalint(ARG(TOP(1)));
-      elem = ARG(TOP(2));
-      arr = arr_alloc(size, elem);
-      n = alloc_node(T_ARR);
-      ARR(n) = arr;
-      RETIO(n);
-      }
-    case T_ARR_COPY:
-      {
-      struct ioarray *arr;
-      CHECKIO(1);
-      GCCHECK(1);
-      n = evali(ARG(TOP(1)));
-      if (GETTAG(n) != T_ARR)
-        ERR("T_ARR_COPY tag");
-      arr = arr_copy(ARR(n));
-      n = alloc_node(T_ARR);
-      ARR(n) = arr;
-      RETIO(n);
-      }
-    case T_ARR_SIZE:
-      CHECKIO(1);
-      n = evali(ARG(TOP(1)));
-      if (GETTAG(n) != T_ARR)
-        ERR("bad ARR tag");
-      RETIO(mkInt(ARR(n)->size));
-    case T_ARR_READ:
-      {
-      size_t i;
-      CHECKIO(2);
-      i = evalint(ARG(TOP(2)));
-      n = evali(ARG(TOP(1)));
-      if (GETTAG(n) != T_ARR)
-        ERR("bad ARR tag");
-      if (i >= ARR(n)->size)
-        ERR("ARR_READ");
-      RETIO(ARR(n)->array[i]);
-      }
-    case T_ARR_WRITE:
-      {
-      size_t i;
-      CHECKIO(3);
-      i = evalint(ARG(TOP(2)));
-      n = evali(ARG(TOP(1)));
-      if (GETTAG(n) != T_ARR)
-        ERR("bad ARR tag");
-      if (i >= ARR(n)->size) {
-        //PRINT("%d %p %d\n", (int)i, ARR(n), (int)ARR(n)->size);
-        ERR("ARR_WRITE");
-      }
-      ARR(n)->array[i] = ARG(TOP(3));
-      RETIO(combUnit);
-      }
-
-    case T_FPNEW:
-      {
-        CHECKIO(1);
-        //printf("T_FPNEW\n");
-        void *xp = evalptr(ARG(TOP(1)));
-        //printf("T_FPNEW xp=%p\n", xp);
-        n = alloc_node(T_FORPTR);
-        SETFORPTR(n, mkForPtrP(xp));
-        RETIO(n);
-      }
-    case T_FPFIN:
-      {
-        CHECKIO(2);
-        //printf("T_FPFIN\n");
-        struct forptr *xfp = evalforptr(ARG(TOP(2)));
-        //printf("T_FPFIN xfp=%p\n", xfp);
-        HsFunPtr yp = evalfunptr(ARG(TOP(1)));
-        //printf("T_FPFIN yp=%p\n", yp);
-        xfp->finalizer->final = yp;
-        RETIO(combUnit);
-      }
-
-#if 0
-    case T_FPSTR:
-      {
-        CHECKIO(2);
-        //printf("T_FPFIN\n");
-        struct forptr *xfp = evalforptr(ARG(TOP(2)));
-        //printf("T_FPFIN xfp=%p\n", xfp);
-        struct bytestring bs = evalstring(ARG(TOP(1)));
-        //printf("T_FPFIN yp=%p\n", yp);
-        xfp->desc = bs.string;
-        RETIO(combUnit);
-      }
-#endif
-
-    case T_IO_GC:
-      CHECKIO(0);
-      //printf("gc()\n");
-      gc();
-      RETIO(combUnit);
-
-    default:
-      //printf("bad tag %s\n", tag_names[GETTAG(n)]);
-      ERR1("execio tag %d", GETTAG(n));
-    }
-  }
-}
-
-#if WANT_ARGS
-heapoffs_t
-memsize(const char *p)
-{
-  heapoffs_t n = atoi(p);
-  while (isdigit(*p))
-    p++;
-  switch (*p) {
-  case 'k': case 'K': n *= 1000; break;
-  case 'm': case 'M': n *= 1000000; break;
-  case 'g': case 'G': n *= 1000000000; break;
-  default: break;
-  }
-  return n;
-}
-#endif
-
-extern uint8_t *combexpr;
-extern int combexprlen;
-
-MAIN
-{
-  NODEPTR prog;
-#if WANT_ARGS
-  char *inname = 0;
-  char **av;
-  char *progname;
-  char **gargv;
-  int gargc;
-  int inrts;
-#if WANT_TICK
-  int dump_ticks = 0;
-#endif
-#endif
-#if WANT_STDIO
-  char *outname = 0;
-  size_t file_size = 0;
-#endif
-  
-#if 0
-  /* MINGW doesn't do buffering right */
-  setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
-  setvbuf(stderr, NULL, _IONBF, BUFSIZ);
-#endif
-
-#ifdef INITIALIZATION
-  main_setup(); /* Do platform specific start-up. */
-#endif
-
-#if WANT_ARGS
-  progname = argv[0];
-  argc--, argv++;
-  gargv = argv;
-  for (av = argv, inrts = 0; argc--; argv++) {
-    char *p = *argv;
-    if (inrts) {
-      if (strcmp(p, "-RTS") == 0) {
-        inrts = 0;
-      } else {
-        if (strcmp(p, "-v") == 0)
-          verbose++;
-#if WANT_TICK
-        else if (strcmp(p, "-T") == 0)
-          dump_ticks = 1;
-#endif
-        else if (strncmp(p, "-H", 2) == 0)
-          heap_size = memsize(&p[2]);
-        else if (strncmp(p, "-K", 2) == 0)
-          stack_size = memsize(&p[2]);
-        else if (strncmp(p, "-r", 2) == 0)
-          inname = &p[2];
-#if WANT_STDIO
-        else if (strncmp(p, "-o", 2) == 0)
-          outname = &p[2];
-#endif  /* WANT_STDIO */
-        else
-          ERR("Usage: eval [+RTS [-v] [-T] [-Hheap-size] [-Kstack-size] [-rFILE] [-oFILE] -RTS] arg ...");
-      }
-    } else {
-      if (strcmp(p, "+RTS") == 0) {
-        inrts = 1;
-      } else {
-        *av++ = p;
-      }
-    }
-  }
-  gargc = av - gargv;
-
-  if (inname == 0)
-    inname = "out.comb";
-#endif
-
-  init_nodes();
-  stack = MALLOC(sizeof(NODEPTR) * stack_size);
-  if (!stack)
-    memerr();
-
-#if WANT_ARGS
-  /* Initialize an IORef (i.e., single element IOArray
-   * to contain the list of program arguments.
-   * The 0th element is the program name, and the rest
-   * are the non RTS arguments.
-   */
-  {
-    NODEPTR n;
-    /* No GC checks, the heap is empty. */
-    n = mkNil();
-    for(int i = gargc-1; i >= 0; i--) {
-      n = mkCons(mkStringC(gargv[i]), n);
-    }
-    n = mkCons(mkStringC(progname), n);
-    argarray = arr_alloc(1, n);      /* An IORef contains a single element array */
-    argarray->permanent = 1;         /* never GC the arguments, because a T_IO_GETARGREF can reach argarray */
-  }
-#endif  /* WANT_ARGS */
-
-  if (combexpr) {
-    int c;
-    BFILE *bf = openb_rd_buf(combexpr, combexprlen);
-    c = getb(bf);
-    /* Compressed combinators start with a 'Z' or 'z', otherwise 'v' (for version) */
-    if (c == 'z') {
-      /* add LZ77 compressor transducer */
-      bf = add_lz77_decompressor(bf);
-    } else {
-      /* put it back, we need it */
-      ungetb(c, bf);
-    }
-    prog = parse_top(bf);
-    closeb(bf);
-#if WANT_STDIO
-    file_size = combexprlen;
-#endif
-  } else {
-#if WANT_STDIO
-    prog = parse_file(inname, &file_size);
-#else
-    ERR("no stdio");
-#endif
-  }
-
-  /* GC unused stuff, nice for -o */
-  PUSH(prog);
-  want_gc_red = 1;
-  gc();
-  want_gc_red = 0;
-  prog = POPTOP();
-
-#if WANT_STDIO
-  heapoffs_t start_size = num_marked;
-  if (outname) {
-    /* Save GCed file (smaller), and exit. */
-    FILE *out = fopen(outname, "w");
-    if (!out)
-      ERR1("cannot open output file %s", outname);
-    struct BFILE *bf = add_FILE(out);
-    printb(bf, prog, 1);
-    closeb(bf);
-    EXIT(0);
-  }
-  if (verbose > 2) {
-    pp(stdout, prog);
-  }
-#endif
-  run_time -= GETTIMEMILLI();
-  PUSH(prog);
-  topnode = &TOP(0);
-  execio(&TOP(0));
-  prog = TOP(0);
-  POP(1);
-#if SANITY
-  if (GETTAG(prog) != T_AP || GETTAG(FUN(prog)) != T_IO_RETURN)
-    ERR("main execio");
-  NODEPTR res = evali(ARG(prog));
-  if (GETTAG(res) != T_I)
-    ERR("main execio I");
-#endif
-  /* Flush standard handles in case there is some BFILE buffering */
-  flushb((BFILE*)FORPTR(comb_stdout)->payload.string);
-  flushb((BFILE*)FORPTR(comb_stderr)->payload.string);
-  gc();                      /* Run finalizers */
-  run_time += GETTIMEMILLI();
-
-#if WANT_STDIO
-  if (verbose) {
-    if (verbose > 1) {
-      PRINT("node size=%"PRIheap", heap size bytes=%"PRIheap"\n", (heapoffs_t)NODE_SIZE, heap_size * NODE_SIZE);
-    }
-    setlocale(LC_NUMERIC, "");  /* Make %' work on platforms that support it */
-    PRINT("%"PCOMMA"15"PRIheap" combinator file size\n", (heapoffs_t)file_size);
-    PRINT("%"PCOMMA"15"PRIheap" cells at start\n", start_size);
-    PRINT("%"PCOMMA"15"PRIheap" cells heap size (%"PCOMMA""PRIheap" bytes)\n", heap_size, heap_size * NODE_SIZE);
-    PRINT("%"PCOMMA"15"PRIcounter" cells allocated (%"PCOMMA".1f Mbyte/s)\n", num_alloc, num_alloc * NODE_SIZE / ((double)run_time / 1000) / 1000000);
-    PRINT("%"PCOMMA"15"PRIcounter" GCs\n", num_gc);
-    PRINT("%"PCOMMA"15"PRIcounter" max cells used\n", max_num_marked);
-    PRINT("%"PCOMMA"15"PRIcounter" reductions (%"PCOMMA".1f Mred/s)\n", num_reductions, num_reductions / ((double)run_time / 1000) / 1000000);
-    PRINT("%"PCOMMA"15"PRIcounter" array alloc\n", num_arr_alloc);
-    PRINT("%"PCOMMA"15"PRIcounter" array free\n", num_arr_free);
-    PRINT("%"PCOMMA"15"PRIcounter" foreign alloc\n", num_fin_alloc);
-    PRINT("%"PCOMMA"15"PRIcounter" foreign free\n", num_fin_free);
-    PRINT("%"PCOMMA"15"PRIcounter" bytestring alloc (max %"PCOMMA""PRIcounter")\n", num_bs_alloc, num_bs_alloc_max);
-    PRINT("%"PCOMMA"15"PRIcounter" bytestring alloc bytes (max %"PCOMMA""PRIcounter")\n", num_bs_bytes, num_bs_inuse_max);
-    PRINT("%"PCOMMA"15"PRIcounter" bytestring free\n", num_bs_free);
-#if MAXSTACKDEPTH
-    PRINT("%"PCOMMA"15d max stack depth\n", (int)max_stack_depth);
-    PRINT("%"PCOMMA"15d max C stack depth\n", (int)max_c_stack);
-#endif
-    // PRINT("%"PCOMMA"15"PRIcounter" max mark depth\n", max_mark_depth);
-    PRINT("%15.2fs total expired time\n", (double)run_time / 1000);
-    PRINT("%15.2fs total gc time (%.2f + %.2f)\n",
-          (double)(gc_mark_time + gc_scan_time) / 1000,
-          (double)gc_mark_time / 1000,
-          (double)gc_scan_time / 1000);
-#if GCRED
-    PRINT(" GC reductions A=%d, K=%d, I=%d, int=%d flip=%d\n", red_a, red_k, red_i, red_int, red_flip);
-    PRINT(" special reductions B'=%d K4=%d K3=%d K2=%d C'B=%d, Z=%d, R=%d\n", red_bb, red_k4, red_k3, red_k2, red_ccb, red_z, red_r);
-#endif
-  }
-#endif  /* WANT_STDIO */
-
-#if WANT_TICK
-  if (dump_ticks) {
-    dump_tick_table(stdout);
-  }
-#endif
-
-#ifdef TEARDOWN
-  main_teardown(); /* do some platform specific teardown */
-#endif
-  EXIT(0);
-}
-
-#if WANT_MD5
-#include "md5.c"
-#endif  /* WANT_MD5 */
-
-#if WANT_LZ77
-#include "lz77.c"
-#endif
-
-/*********************/
-/* FFI adapters      */
-
-#define MHS_FROM(name, set, type) \
-void \
-name(stackptr_t stk, int n, type x) \
-{ \
-  NODEPTR r = TOP(0);           /* The pre-allocated cell for the result, */ \
-  CHECKIO(n+1);                 /* Check that we actually had the right number of arguments. */ \
-  set(r, x);                    /* Put result in pre-allocated cell. */ \
-}
-MHS_FROM(mhs_from_FloatW, SETDBL, flt_t);
-MHS_FROM(mhs_from_Int, SETINT, value_t);
-MHS_FROM(mhs_from_Word, SETINT, uvalue_t);
-MHS_FROM(mhs_from_Word8, SETINT, uvalue_t);
-MHS_FROM(mhs_from_Ptr, SETPTR, void*);
-MHS_FROM(mhs_from_ForPtr, SETFORPTR, struct forptr *);
-MHS_FROM(mhs_from_FunPtr, SETFUNPTR, HsFunPtr);
-MHS_FROM(mhs_from_CChar, SETINT, char);
-MHS_FROM(mhs_from_CSChar, SETINT, signed char);
-MHS_FROM(mhs_from_CUChar, SETINT, unsigned char);
-MHS_FROM(mhs_from_CShort, SETINT, short);
-MHS_FROM(mhs_from_CUShort, SETINT, unsigned short);
-MHS_FROM(mhs_from_CInt, SETINT, int);
-MHS_FROM(mhs_from_CUInt, SETINT, unsigned int);
-MHS_FROM(mhs_from_CLong, SETINT, long);
-MHS_FROM(mhs_from_CULong, SETINT, unsigned long);
-MHS_FROM(mhs_from_CLLong, SETINT, long long);
-MHS_FROM(mhs_from_CULLong, SETINT, unsigned long long);
-MHS_FROM(mhs_from_CSize, SETINT, size_t);
-#if WANT_TIME
-MHS_FROM(mhs_from_CTime, SETINT, time_t);
-#endif
-// MHS_FROM(mhs_from_CSSize, SETINT, ssize_t);
-MHS_FROM(mhs_from_CIntPtr, SETINT, intptr_t);
-MHS_FROM(mhs_from_CUIntPtr, SETINT, uintptr_t);
-void
-mhs_from_Unit(stackptr_t stk, int n)
-{
-  CHECKIO(n+1);                 /* Check that we actually had the right number of arguments. */
-  TOP(0) = combUnit;            /* Put result on top of stack */
-}
-
-#define MHS_TO(name, eval, type) \
-type name(stackptr_t stk, int n) \
-{ \
-  return eval(ARG(TOP(n+2)));                /* The stack has a reserved cell, and the FFI node on top of the arguments */ \
-}
-MHS_TO(mhs_to_FloatW, evaldbl, flt_t);
-MHS_TO(mhs_to_Int, evalint, value_t);
-MHS_TO(mhs_to_Word, evalint, uvalue_t);
-MHS_TO(mhs_to_Word8, evalint, uint8_t);
-MHS_TO(mhs_to_Ptr, evalptr, void*);
-MHS_TO(mhs_to_FunPtr, evalfunptr, HsFunPtr);
-MHS_TO(mhs_to_CChar, evalint, char);
-MHS_TO(mhs_to_CSChar, evalint, signed char);
-MHS_TO(mhs_to_CUChar, evalint, unsigned char);
-MHS_TO(mhs_to_CShort, evalint, short);
-MHS_TO(mhs_to_CUShort, evalint, unsigned short);
-MHS_TO(mhs_to_CInt, evalint, int);
-MHS_TO(mhs_to_CUInt, evalint, unsigned int);
-MHS_TO(mhs_to_CLong, evalint, long);
-MHS_TO(mhs_to_CULong, evalint, unsigned long);
-MHS_TO(mhs_to_CLLong, evalint, long long);
-MHS_TO(mhs_to_CULLong, evalint, unsigned long long);
-MHS_TO(mhs_to_CSize, evalint, size_t);
-#if WANT_TIME
-MHS_TO(mhs_to_CTime, evalint, time_t);
-#endif
-// MHS_TO(mhs_to_CSSize, evalint, ssize_t);
-MHS_TO(mhs_to_CIntPtr, evalint, intptr_t);
-MHS_TO(mhs_to_CUIntPtr, evalint, uintptr_t);
-
-
-/* The rest of this file was generated by the compiler, with some minor edits with #if. */
-void mhs_GETRAW(int s) { mhs_from_Int(s, 0, GETRAW()); }
-void mhs_GETTIMEMILLI(int s) { mhs_from_Int(s, 0, GETTIMEMILLI()); }
-#if WANT_MATH
-#if WORD_SIZE == 64
-void mhs_acos(int s) { mhs_from_FloatW(s, 1, acos(mhs_to_FloatW(s, 0))); }
-void mhs_asin(int s) { mhs_from_FloatW(s, 1, asin(mhs_to_FloatW(s, 0))); }
-void mhs_atan(int s) { mhs_from_FloatW(s, 1, atan(mhs_to_FloatW(s, 0))); }
-void mhs_atan2(int s) { mhs_from_FloatW(s, 2, atan2(mhs_to_FloatW(s, 0), mhs_to_FloatW(s, 1))); }
-void mhs_cos(int s) { mhs_from_FloatW(s, 1, cos(mhs_to_FloatW(s, 0))); }
-void mhs_exp(int s) { mhs_from_FloatW(s, 1, exp(mhs_to_FloatW(s, 0))); }
-void mhs_log(int s) { mhs_from_FloatW(s, 1, log(mhs_to_FloatW(s, 0))); }
-void mhs_sin(int s) { mhs_from_FloatW(s, 1, sin(mhs_to_FloatW(s, 0))); }
-void mhs_sqrt(int s) { mhs_from_FloatW(s, 1, sqrt(mhs_to_FloatW(s, 0))); }
-void mhs_tan(int s) { mhs_from_FloatW(s, 1, tan(mhs_to_FloatW(s, 0))); }
-#elif WORD_SIZE == 32  /* WORD_SIZE */
-void mhs_acos(int s) { mhs_from_FloatW(s, 1, acosf(mhs_to_FloatW(s, 0))); }
-void mhs_asin(int s) { mhs_from_FloatW(s, 1, asinf(mhs_to_FloatW(s, 0))); }
-void mhs_atan(int s) { mhs_from_FloatW(s, 1, atanf(mhs_to_FloatW(s, 0))); }
-void mhs_atan2(int s) { mhs_from_FloatW(s, 2, atan2f(mhs_to_FloatW(s, 0), mhs_to_FloatW(s, 1))); }
-void mhs_cos(int s) { mhs_from_FloatW(s, 1, cosf(mhs_to_FloatW(s, 0))); }
-void mhs_exp(int s) { mhs_from_FloatW(s, 1, expf(mhs_to_FloatW(s, 0))); }
-void mhs_log(int s) { mhs_from_FloatW(s, 1, logf(mhs_to_FloatW(s, 0))); }
-void mhs_sin(int s) { mhs_from_FloatW(s, 1, sinf(mhs_to_FloatW(s, 0))); }
-void mhs_sqrt(int s) { mhs_from_FloatW(s, 1, sqrtf(mhs_to_FloatW(s, 0))); }
-void mhs_tan(int s) { mhs_from_FloatW(s, 1, tanf(mhs_to_FloatW(s, 0))); }
-#else
-#error Unknown WORD_SIZE
-#endif  /* WORD_SIZE */
-#endif  /* WANT_MATH */
-
-#if WANT_STDIO
-void mhs_add_FILE(int s) { mhs_from_Ptr(s, 1, add_FILE(mhs_to_Ptr(s, 0))); }
-void mhs_add_utf8(int s) { mhs_from_Ptr(s, 1, add_utf8(mhs_to_Ptr(s, 0))); }
-void mhs_closeb(int s) { closeb(mhs_to_Ptr(s, 0)); mhs_from_Unit(s, 1); }
-void mhs_addr_closeb(int s) { mhs_from_FunPtr(s, 0, (HsFunPtr)&closeb); }
-void mhs_flushb(int s) { flushb(mhs_to_Ptr(s, 0)); mhs_from_Unit(s, 1); }
-void mhs_fopen(int s) { mhs_from_Ptr(s, 2, fopen(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }
-
-void mhs_getb(int s) { mhs_from_Int(s, 1, getb(mhs_to_Ptr(s, 0))); }
-void mhs_putb(int s) { putb(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
-void mhs_ungetb(int s) { ungetb(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
-void mhs_openwrbuf(int s) { mhs_from_Ptr(s, 0, openb_wr_buf()); }
-void mhs_openrdbuf(int s) { mhs_from_Ptr(s, 2, openb_rd_buf(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }
-void mhs_getbuf(int s) { get_buf(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2));  mhs_from_Unit(s, 3); }
-void mhs_system(int s) { mhs_from_Int(s, 1, system(mhs_to_Ptr(s, 0))); }
-void mhs_tmpname(int s) { mhs_from_Ptr(s, 2, TMPNAME(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }
-void mhs_unlink(int s) { mhs_from_Int(s, 1, unlink(mhs_to_Ptr(s, 0))); }
-#endif  /* WANT_STDIO */
-
-#if WANT_MD5
-void mhs_md5Array(int s) { md5Array(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2)); mhs_from_Unit(s, 3); }
-void mhs_md5BFILE(int s) { md5BFILE(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
-void mhs_md5String(int s) { md5String(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
-#endif  /* WANT_MD5 */
-
-#if WANT_LZ77
-void mhs_add_lz77_compressor(int s) { mhs_from_Ptr(s, 1, add_lz77_compressor(mhs_to_Ptr(s, 0))); }
-void mhs_add_lz77_decompressor(int s) { mhs_from_Ptr(s, 1, add_lz77_decompressor(mhs_to_Ptr(s, 0))); }
-void mhs_lz77c(int s) { mhs_from_CSize(s, 3, lz77c(mhs_to_Ptr(s, 0), mhs_to_CSize(s, 1), mhs_to_Ptr(s, 2))); }
-#endif  /* WANT_LZ77 */
-
-#if WANT_RLE
-void mhs_add_rle_compressor(int s) { mhs_from_Ptr(s, 1, add_rle_compressor(mhs_to_Ptr(s, 0))); }
-void mhs_add_rle_decompressor(int s) { mhs_from_Ptr(s, 1, add_rle_decompressor(mhs_to_Ptr(s, 0))); }
-#endif  /* WANT_RLE */
-
-#if WANT_BWT
-void mhs_add_bwt_compressor(int s) { mhs_from_Ptr(s, 1, add_bwt_compressor(mhs_to_Ptr(s, 0))); }
-void mhs_add_bwt_decompressor(int s) { mhs_from_Ptr(s, 1, add_bwt_decompressor(mhs_to_Ptr(s, 0))); }
-#endif  /* WANT_BWT */
-
-void mhs_calloc(int s) { mhs_from_Ptr(s, 2, calloc(mhs_to_CSize(s, 0), mhs_to_CSize(s, 1))); }
-void mhs_free(int s) { free(mhs_to_Ptr(s, 0)); mhs_from_Unit(s, 1); }
-void mhs_addr_free(int s) { mhs_from_FunPtr(s, 0, (HsFunPtr)&FREE); }
-void mhs_getenv(int s) { mhs_from_Ptr(s, 1, getenv(mhs_to_Ptr(s, 0))); }
-void mhs_iswindows(int s) { mhs_from_Int(s, 0, iswindows()); }
-void mhs_malloc(int s) { mhs_from_Ptr(s, 1, MALLOC(mhs_to_CSize(s, 0))); }
-void mhs_memcpy(int s) { memcpy(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_CSize(s, 2)); mhs_from_Unit(s, 3); }
-void mhs_memmove(int s) { memmove(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_CSize(s, 2)); mhs_from_Unit(s, 3); }
-void mhs_peekPtr(int s) { mhs_from_Ptr(s, 1, peekPtr(mhs_to_Ptr(s, 0))); }
-void mhs_peekWord(int s) { mhs_from_Word(s, 1, peekWord(mhs_to_Ptr(s, 0))); }
-void mhs_pokePtr(int s) { pokePtr(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
-void mhs_pokeWord(int s) { pokeWord(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); mhs_from_Unit(s, 2); }
-
-void mhs_peek_uint8(int s) { mhs_from_Word(s, 1, peek_uint8(mhs_to_Ptr(s, 0))); }
-void mhs_poke_uint8(int s) { poke_uint8(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); mhs_from_Unit(s, 2); }
-void mhs_peek_uint16(int s) { mhs_from_Word(s, 1, peek_uint16(mhs_to_Ptr(s, 0))); }
-void mhs_poke_uint16(int s) { poke_uint16(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); mhs_from_Unit(s, 2); }
-#if WORD_SIZE >= 32
-void mhs_peek_uint32(int s) { mhs_from_Word(s, 1, peek_uint32(mhs_to_Ptr(s, 0))); }
-void mhs_poke_uint32(int s) { poke_uint32(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); mhs_from_Unit(s, 2); }
-#endif  /* WORD_SIZE */
-#if WORD_SIZE >= 64
-void mhs_peek_uint64(int s) { mhs_from_Word(s, 1, peek_uint64(mhs_to_Ptr(s, 0))); }
-void mhs_poke_uint64(int s) { poke_uint64(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); mhs_from_Unit(s, 2); }
-#endif  /* WORD_SIZE */
-void mhs_peek_uint(int s) { mhs_from_Word(s, 1, peek_uint(mhs_to_Ptr(s, 0))); }
-void mhs_poke_uint(int s) { poke_uint(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); mhs_from_Unit(s, 2); }
-
-void mhs_peek_int8(int s) { mhs_from_Int(s, 1, peek_int8(mhs_to_Ptr(s, 0))); }
-void mhs_poke_int8(int s) { poke_int8(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); mhs_from_Unit(s, 2); }
-void mhs_peek_int16(int s) { mhs_from_Int(s, 1, peek_int16(mhs_to_Ptr(s, 0))); }
-void mhs_poke_int16(int s) { poke_int16(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); mhs_from_Unit(s, 2); }
-#if WORD_SIZE >= 32
-void mhs_peek_int32(int s) { mhs_from_Int(s, 1, peek_int32(mhs_to_Ptr(s, 0))); }
-void mhs_poke_int32(int s) { poke_int32(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); mhs_from_Unit(s, 2); }
-#endif  /* WORD_SIZE */
-#if WORD_SIZE >= 64
-void mhs_peek_int64(int s) { mhs_from_Int(s, 1, peek_int64(mhs_to_Ptr(s, 0))); }
-void mhs_poke_int64(int s) { poke_int64(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); mhs_from_Unit(s, 2); }
-#endif  /* WORD_SIZE */
-void mhs_peek_int(int s) { mhs_from_Int(s, 1, peek_int(mhs_to_Ptr(s, 0))); }
-void mhs_poke_int(int s) { poke_int(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); mhs_from_Unit(s, 2); }
-void mhs_peek_llong(int s) { mhs_from_CLLong(s, 1, peek_llong(mhs_to_Ptr(s, 0))); }
-void mhs_peek_long(int s) { mhs_from_CLong(s, 1, peek_long(mhs_to_Ptr(s, 0))); }
-void mhs_peek_ullong(int s) { mhs_from_CULLong(s, 1, peek_ullong(mhs_to_Ptr(s, 0))); }
-void mhs_peek_ulong(int s) { mhs_from_CULong(s, 1, peek_ulong(mhs_to_Ptr(s, 0))); }
-void mhs_poke_llong(int s) { poke_llong(mhs_to_Ptr(s, 0), mhs_to_CLLong(s, 1)); mhs_from_Unit(s, 2); }
-void mhs_poke_long(int s) { poke_long(mhs_to_Ptr(s, 0), mhs_to_CLong(s, 1)); mhs_from_Unit(s, 2); }
-void mhs_poke_ullong(int s) { poke_ullong(mhs_to_Ptr(s, 0), mhs_to_CULLong(s, 1)); mhs_from_Unit(s, 2); }
-void mhs_poke_ulong(int s) { poke_ulong(mhs_to_Ptr(s, 0), mhs_to_CULong(s, 1)); mhs_from_Unit(s, 2); }
-#if WANT_FLOAT
-void mhs_peek_flt(int s) { mhs_from_FloatW(s, 1, peek_flt(mhs_to_Ptr(s, 0))); }
-void mhs_poke_flt(int s) { poke_flt(mhs_to_Ptr(s, 0), mhs_to_FloatW(s, 1)); mhs_from_Unit(s, 2); }
-#endif  /* WANT_FLOAT */
-void mhs_sizeof_int(int s) { mhs_from_Int(s, 0, sizeof(int)); }
-void mhs_sizeof_llong(int s) { mhs_from_Int(s, 0, sizeof(long long)); }
-void mhs_sizeof_long(int s) { mhs_from_Int(s, 0, sizeof(long)); }
-#if WANT_DIR
-void mhs_closedir(int s) { mhs_from_Int(s, 1, closedir(mhs_to_Ptr(s, 0))); }
-void mhs_opendir(int s) { mhs_from_Ptr(s, 1, opendir(mhs_to_Ptr(s, 0))); }
-void mhs_readdir(int s) { mhs_from_Ptr(s, 1, readdir(mhs_to_Ptr(s, 0))); }
-void mhs_c_d_name(int s) { mhs_from_Ptr(s, 1, ((struct dirent *)(mhs_to_Ptr(s, 0)))->d_name); }
-void mhs_chdir(int s) { mhs_from_Int(s, 1, chdir(mhs_to_Ptr(s, 0))); }
-void mhs_mkdir(int s) { mhs_from_Int(s, 2, mkdir(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }
-void mhs_getcwd(int s) { mhs_from_Ptr(s, 2, getcwd(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }
-#endif  /* WANT_DIR */
-
-/* Use this to detect if we have (and want) GMP or not. */
-void mhs_want_gmp(int s) { mhs_from_Int(s, 0, WANT_GMP); }
-
-#if WANT_GMP
-void
-free_mpz(void *p)
-{
-  /*  printf("free_mpz %p\n", p);*/
-  mpz_clear(p);                 /* free any extra storage */
-  FREE(p);                      /* and free the mpz itself */
-}
-
-/* Allocate an initialize a GMP integer */
-struct forptr *
-new_mpz(void)
-{
-#if 0
-  {
-    static int done = 0;
-    if (!done) {
-      printf("GMP\n");
-      done = 1;
-    }
-  }
-#endif
-  mpz_ptr p = MALLOC(sizeof(*p));
-  if (!p) memerr();
-  mpz_init(p);
-  struct forptr *fp = mkForPtrP(p);
-  fp->finalizer->final = (HsFunPtr)free_mpz;
-  /*  printf("new_mpz %p %p\n", p, fp); */
-  return fp;
-}
-
-#if 0
-void
-print_mpz(mpz_ptr p)
-{
-  mpz_out_str(stdout, 10, p);
-}
-#endif
-
-void mhs_new_mpz(int s) { mhs_from_ForPtr(s, 0, new_mpz()); }
-
-/* Stubs for GMP functions */
-void mhs_mpz_abs(int s) { mpz_abs(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
-void mhs_mpz_add(int s) { mpz_add(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); mhs_from_Unit(s, 3); }
-void mhs_mpz_and(int s) { mpz_and(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); mhs_from_Unit(s, 3); }
-void mhs_mpz_cmp(int s) { mhs_from_Int(s, 2, mpz_cmp(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }
-void mhs_mpz_get_d(int s) { mhs_from_FloatW(s, 1, mpz_get_d(mhs_to_Ptr(s, 0))); }
-void mhs_mpz_get_si(int s) { mhs_from_Int(s, 1, mpz_get_si(mhs_to_Ptr(s, 0))); }
-void mhs_mpz_get_ui(int s) { mhs_from_Word(s, 1, mpz_get_ui(mhs_to_Ptr(s, 0))); }
-void mhs_mpz_init_set_si(int s) { mpz_init_set_si(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); mhs_from_Unit(s, 2); }
-void mhs_mpz_init_set_ui(int s) { mpz_init_set_ui(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); mhs_from_Unit(s, 2); }
-void mhs_mpz_ior(int s) { mpz_ior(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); mhs_from_Unit(s, 3); }
-void mhs_mpz_mul(int s) { mpz_mul(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); mhs_from_Unit(s, 3); }
-void mhs_mpz_mul_2exp(int s) { mpz_mul_2exp(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2)); mhs_from_Unit(s, 3); }
-void mhs_mpz_neg(int s) { mpz_neg(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
-void mhs_mpz_popcount(int s) { mhs_from_Int(s, 1, mpz_popcount(mhs_to_Ptr(s, 0))); }
-void mhs_mpz_sub(int s) { mpz_sub(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); mhs_from_Unit(s, 3); }
-void mhs_mpz_tdiv_q_2exp(int s) { mpz_tdiv_q_2exp(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2)); mhs_from_Unit(s, 3); }
-void mhs_mpz_tdiv_qr(int s) { mpz_tdiv_qr(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2), mhs_to_Ptr(s, 3)); mhs_from_Unit(s, 4); }
-void mhs_mpz_tstbit(int s) { mhs_from_Int(s, 2, mpz_tstbit(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }
-void mhs_mpz_xor(int s) { mpz_xor(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); mhs_from_Unit(s, 3); }
-#endif  /* WANT_GMP */
-
-struct ffi_entry ffi_table[] = {
-{ "GETRAW", mhs_GETRAW},
-{ "GETTIMEMILLI", mhs_GETTIMEMILLI},
-#if WANT_MATH
-{ "acos", mhs_acos},
-{ "asin", mhs_asin},
-{ "atan", mhs_atan},
-{ "atan2", mhs_atan2},
-{ "cos", mhs_cos},
-{ "exp", mhs_exp},
-{ "log", mhs_log},
-{ "sin", mhs_sin},
-{ "sqrt", mhs_sqrt},
-{ "tan", mhs_tan},
-#endif  /* WANT_MATH */
-
-#if WANT_STDIO
-{ "add_FILE", mhs_add_FILE},
-{ "add_utf8", mhs_add_utf8},
-{ "closeb", mhs_closeb},
-{ "&closeb", mhs_addr_closeb},
-{ "flushb", mhs_flushb},
-{ "fopen", mhs_fopen},
-{ "getb", mhs_getb},
-{ "putb", mhs_putb},
-{ "ungetb", mhs_ungetb},
-{ "openb_wr_buf", mhs_openwrbuf},
-{ "openb_rd_buf", mhs_openrdbuf},
-{ "get_buf", mhs_getbuf},
-{ "system", mhs_system},
-{ "tmpname", mhs_tmpname},
-{ "unlink", mhs_unlink},
-#endif  /* WANT_STDIO */
-
-#if WANT_MD5
-{ "md5Array", mhs_md5Array},
-{ "md5BFILE", mhs_md5BFILE},
-{ "md5String", mhs_md5String},
-#endif  /* WANT_MD5 */
-
-#if WANT_LZ77
-{ "add_lz77_compressor", mhs_add_lz77_compressor},
-{ "add_lz77_decompressor", mhs_add_lz77_decompressor},
-{ "lz77c", mhs_lz77c},
-#endif  /* WANT_LZ77 */
-
-#if WANT_RLE
-{ "add_rle_compressor", mhs_add_rle_compressor},
-{ "add_rle_decompressor", mhs_add_rle_decompressor},
-#endif  /* WANT_RLE */
-
-#if WANT_BWT
-{ "add_bwt_compressor", mhs_add_bwt_compressor},
-{ "add_bwt_decompressor", mhs_add_bwt_decompressor},
-#endif  /* WANT_RLE */
-
-{ "calloc", mhs_calloc},
-{ "free", mhs_free},
-{ "&free", mhs_addr_free},
-{ "getenv", mhs_getenv},
-{ "iswindows", mhs_iswindows},
-{ "malloc", mhs_malloc},
-{ "memcpy", mhs_memcpy},
-{ "memmove", mhs_memmove},
-{ "peekPtr", mhs_peekPtr},
-{ "peekWord", mhs_peekWord},
-{ "pokePtr", mhs_pokePtr},
-{ "pokeWord", mhs_pokeWord},
-
-{ "peek_uint8", mhs_peek_uint8},
-{ "poke_uint8", mhs_poke_uint8},
-{ "peek_uint16", mhs_peek_uint16},
-{ "poke_uint16", mhs_poke_uint16},
-#if WORD_SIZE >= 32
-{ "peek_uint32", mhs_peek_uint32},
-{ "poke_uint32", mhs_poke_uint32},
-#endif  /* WORD_SIZE >= 32 */
-#if WORD_SIZE >= 64
-{ "peek_uint64", mhs_peek_uint64},
-{ "poke_uint64", mhs_poke_uint64},
-#endif  /* WORD_SIZE >= 64 */
-{ "peek_uint", mhs_peek_uint},
-{ "poke_uint", mhs_poke_uint},
-
-{ "peek_int8", mhs_peek_int8},
-{ "poke_int8", mhs_poke_int8},
-{ "peek_int16", mhs_peek_int16},
-{ "poke_int16", mhs_poke_int16},
-#if WORD_SIZE >= 32
-{ "peek_int32", mhs_peek_int32},
-{ "poke_int32", mhs_poke_int32},
-#endif  /* WORD_SIZE >= 32 */
-#if WORD_SIZE >= 64
-{ "peek_int64", mhs_peek_int64},
-{ "poke_int64", mhs_poke_int64},
-#endif  /* WORD_SIZE >= 64 */
-{ "peek_int", mhs_peek_int},
-{ "poke_int", mhs_poke_int},
-{ "peek_llong", mhs_peek_llong},
-{ "peek_long", mhs_peek_long},
-{ "peek_ullong", mhs_peek_ullong},
-{ "peek_ulong", mhs_peek_ulong},
-{ "poke_llong", mhs_poke_llong},
-{ "poke_long", mhs_poke_long},
-{ "poke_ullong", mhs_poke_ullong},
-{ "poke_ulong", mhs_poke_ulong},
-#if WANT_FLOAT
-{ "poke_flt", mhs_poke_flt},
-{ "poke_flt", mhs_poke_flt},
-#endif  /* WANT_FLOAT */
-{ "sizeof_int", mhs_sizeof_int},
-{ "sizeof_llong", mhs_sizeof_llong},
-{ "sizeof_long", mhs_sizeof_long},
-#if WANT_DIR
-{ "c_d_name", mhs_c_d_name},
-{ "closedir", mhs_closedir},
-{ "opendir", mhs_opendir},
-{ "readdir", mhs_readdir},
-{ "chdir", mhs_chdir},
-{ "mkdir", mhs_mkdir},
-{ "getcwd", mhs_getcwd},
-#endif  /* WANT_DIR */
-{ "want_gmp", mhs_want_gmp},
-#if WANT_GMP
-{ "new_mpz", mhs_new_mpz},
-{ "mpz_abs", mhs_mpz_abs},
-{ "mpz_add", mhs_mpz_add},
-{ "mpz_and", mhs_mpz_and},
-{ "mpz_cmp", mhs_mpz_cmp},
-{ "mpz_get_d", mhs_mpz_get_d},
-{ "mpz_get_si", mhs_mpz_get_si},
-{ "mpz_get_ui", mhs_mpz_get_ui},
-{ "mpz_init_set_si", mhs_mpz_init_set_si},
-{ "mpz_init_set_ui", mhs_mpz_init_set_ui},
-{ "mpz_ior", mhs_mpz_ior},
-{ "mpz_mul", mhs_mpz_mul},
-{ "mpz_mul_2exp", mhs_mpz_mul_2exp},
-{ "mpz_neg", mhs_mpz_neg},
-{ "mpz_popcount", mhs_mpz_popcount},
-{ "mpz_sub", mhs_mpz_sub},
-{ "mpz_tdiv_q_2exp", mhs_mpz_tdiv_q_2exp},
+/* Copyright 2023,2024,2025 Lennart Augustsson
+ * See LICENSE file for full license.
+ */
+#if !defined(WANT_GMP)
+#define WANT_GMP 0
+#endif
+
+#include <inttypes.h>
+#if WANT_STDIO
+#include <stdio.h>
+#include <locale.h>
+#endif  /* WANT_STDIO */
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <setjmp.h>
+#if WANT_MATH
+#include <math.h>
+#endif  /* WANT_MATH */
+#if WANT_DIR
+#include <dirent.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#endif  /* WANT_DIR */
+#if WANT_TIME
+#include <time.h>
+#endif
+#if WANT_GMP
+#include <gmp.h>
+#endif
+
+#if WANT_MD5
+#include "md5.h"
+#endif
+
+#if !defined(WANT_LZ77)
+#define WANT_LZ77 1
+#endif
+
+#if !defined(WANT_RLE)
+#define WANT_RLE 1
+#endif
+
+#if !defined(WANT_BWT)
+#define WANT_BWT 1
+#endif
+
+#if WANT_LZ77
+size_t lz77d(uint8_t *src, size_t srclen, uint8_t **bufp);
+size_t lz77c(uint8_t *src, size_t srclen, uint8_t **bufp);
+#endif
+
+#if defined(__GNUC__) && __GNUC__ >= 14 && defined(__aarch64__)
+#define REGISTER(dcl, reg) register dcl asm(#reg)
+#else
+#define REGISTER(dcl, reg) dcl
+#endif
+
+#include "mhsffi.h"
+struct ffi_entry ffi_table[];
+int num_ffi;
+#define FFI_IX(i) ((i) < num_ffi ? ffi_table[i] : xffi_table[i - num_ffi])
+
+//#include "config.h"
+
+#define VERSION "v7.2\n"
+
+typedef intptr_t value_t;       /* Make value the same size as pointers, since they are in a union */
+#define PRIvalue PRIdPTR
+typedef uintptr_t uvalue_t;     /* Make unsigned value the same size as pointers, since they are in a union */
+#define PRIuvalue PRIuPTR
+typedef uintptr_t heapoffs_t;   /* Heap offsets */
+#define PRIheap PRIuPTR
+typedef uintptr_t tag_t;        /* Room for tag, low order bit indicates AP/not-AP */
+typedef intptr_t stackptr_t;    /* Index into stack */
+
+typedef uintptr_t counter_t;    /* Statistics counter, can be smaller since overflow doesn't matter */
+#define PRIcounter PRIuPTR
+typedef uintptr_t bits_t;       /* One word of bits */
+
+#if !defined(MALLOC)
+#define MALLOC malloc
+#endif
+
+#if !defined(REALLOC)
+#define REALLOC realloc
+#endif
+
+#if !defined(FREE)
+#define FREE free
+#endif
+
+#if !defined(EXIT)
+#define EXIT exit
+#endif
+
+#if !defined(PRINT)
+#define PRINT printf
+#endif
+
+#if !defined(MAIN)
+#define MAIN int main(int argc, char **argv)
+#endif
+
+#if !defined(PCOMMA)
+#define PCOMMA "'"
+#endif  /* !defined(PCOMMA) */
+
+#if !defined(GETRAW)
+int GETRAW(void) { return -1; }
+#endif  /* !defined(getraw) */
+
+#if !defined(GETTIMEMILLI)
+value_t GETTIMEMILLI(void) { return 0; }
+#endif  /* !define(GETTIMEMILLI) */
+
+#if !defined(TMPNAME)
+/* This is a really bad implementation, since it doesn't check for anything. */
+char* TMPNAME(const char* pre, const char* post) {
+  char *s = MALLOC(strlen(pre) + 3 + strlen(post) + 1);
+  strcpy(s, pre);
+  strcat(s, "TMP");
+  strcat(s, post);
+  return s;
+}
+#endif
+
+#if !defined(FFS)
+/* This is pretty bad, could use deBruijn multiplication instead. */
+int
+FFS(bits_t x)
+{
+  int i;
+  if (!x)
+    return 0;
+  for(i = 1; !(x & 1); x >>= 1, i++)
+    ;
+  return i;
+}
+#endif  /* !defined(FFS) */
+
+#if defined(__has_builtin)
+
+#if __has_builtin(__builtin_popcountl)
+#define BUILTIN_POPCOUNT
+#endif
+
+#endif
+
+#if !defined(POPCOUNT)
+uvalue_t POPCOUNT(uvalue_t x) {
+#if defined(BUILTIN_POPCOUNT)
+  return __builtin_popcountl(x);
+#else
+  uvalue_t count = 0;
+  while (x) {
+    x = x & (x - 1); // clear lowest 1 bit
+    count += 1;
+  }
+  return count;
+#endif
+}
+#endif
+
+#if defined(__GNUC__)
+#define BUILTIN_CLZ
+#elif defined(__clang__)
+
+#if __has_builtin(__builtin_clzl)
+#define BUILTIN_CLZ
+#endif
+
+#endif
+
+
+#if !defined(CLZ)
+uvalue_t CLZ(uvalue_t x) {
+#if defined(BUILTIN_CLZ)
+  if (x == 0) return WORD_SIZE;
+  return __builtin_clzl(x);
+#else
+  value_t count = WORD_SIZE;
+  while (x) {
+    x = x >> 1;
+    count -= 1;
+  }
+  return count;
+#endif
+}
+#endif
+
+#if defined(__has_builtin)
+
+#if __has_builtin(__builtin_ctzl)
+#define BUILTIN_CTZ
+#endif
+
+#endif
+
+
+#if !defined(CTZ)
+uvalue_t CTZ(uvalue_t x) {
+  if (x == 0) return WORD_SIZE;
+#if defined(BUILTIN_CLZ)
+  return __builtin_ctzl(x);
+#else
+  uvalue_t count = 0;
+  while ((x & 1) == 0) {
+    x = x >> 1;
+    count += 1;
+  }
+  return count;
+#endif
+}
+#endif
+
+#if !defined(WANT_ARGS)
+#define WANT_ARGS 1
+#endif
+
+#if !defined(INLINE)
+#define INLINE inline
+#endif  /* !define(INLINE) */
+
+#if !defined(NORETURN)
+#define NORETURN __attribute__ ((noreturn))
+#endif /* !defined(NORETURN) */
+
+#if !defined(COUNT)
+#define COUNT(n) ++(n)
+#endif
+
+value_t
+iswindows(void)
+{
+#if defined(ISWINDOWS)
+  return 1;
+#else
+  return 0;
+#endif
+}
+
+/***************************************/
+
+/* Keep permanent nodes for LOW_INT <= i < HIGH_INT */
+#define LOW_INT (-10)
+#define HIGH_INT 256
+
+#if !defined(HEAP_CELLS)
+#define HEAP_CELLS 50000000
+#endif
+
+#if !defined(STACK_SIZE)
+#define STACK_SIZE 100000
+#endif
+
+#if !defined(ERR)
+#if WANT_STDIO
+#define ERR(s)    do { fprintf(stderr,"ERR: "s"\n");   EXIT(1); } while(0)
+#define ERR1(s,a) do { fprintf(stderr,"ERR: "s"\n",a); EXIT(1); } while(0)
+#else  /* WANT_STDIO */
+#define ERR(s) EXIT(1)
+#define ERR1(s,a) EXIT(1)
+#endif  /* WANT_STDIO */
+#endif  /* !define(ERR) */
+
+enum node_tag { T_FREE, T_IND, T_AP, T_INT, T_DBL, T_PTR, T_FUNPTR, T_FORPTR, T_BADDYN, T_ARR,
+                T_S, T_K, T_I, T_B, T_C,
+                T_A, T_Y, T_SS, T_BB, T_CC, T_P, T_R, T_O, T_U, T_Z, T_J,
+                T_K2, T_K3, T_K4, T_CCB,
+                T_ADD, T_SUB, T_MUL, T_QUOT, T_REM, T_SUBR, T_UQUOT, T_UREM, T_NEG,
+                T_AND, T_OR, T_XOR, T_INV, T_SHL, T_SHR, T_ASHR,
+                T_POPCOUNT, T_CLZ, T_CTZ,
+                T_EQ, T_NE, T_LT, T_LE, T_GT, T_GE, T_ULT, T_ULE, T_UGT, T_UGE, T_ICMP, T_UCMP,
+                T_FPADD, T_FP2P, T_FPNEW, T_FPFIN, // T_FPSTR,
+                T_FP2BS, T_BS2FP,
+                T_TOPTR, T_TOINT, T_TODBL, T_TOFUNPTR,
+                T_BININT2, T_BININT1, T_UNINT1,
+                T_BINDBL2, T_BINDBL1, T_UNDBL1,
+                T_BINBS2, T_BINBS1,
+#if WANT_FLOAT
+                T_FADD, T_FSUB, T_FMUL, T_FDIV, T_FNEG, T_ITOF,
+                T_FEQ, T_FNE, T_FLT, T_FLE, T_FGT, T_FGE, T_FSHOW, T_FREAD,
+#endif
+                T_ARR_ALLOC, T_ARR_COPY, T_ARR_SIZE, T_ARR_READ, T_ARR_WRITE, T_ARR_EQ,
+                T_RAISE, T_SEQ, T_EQUAL, T_COMPARE, T_RNF,
+                T_TICK,
+                T_IO_BIND, T_IO_THEN, T_IO_RETURN,
+                T_IO_CCBIND,
+                T_IO_SERIALIZE, T_IO_DESERIALIZE,
+                T_IO_GETARGREF,
+                T_IO_PERFORMIO, T_IO_PRINT, T_CATCH,
+                T_IO_CCALL, T_IO_GC, T_DYNSYM,
+                T_NEWCASTRINGLEN, T_PACKCSTRING, T_PACKCSTRINGLEN,
+                T_BSAPPEND, T_BSEQ, T_BSNE, T_BSLT, T_BSLE, T_BSGT, T_BSGE, T_BSCMP,
+                T_BSPACK, T_BSUNPACK, T_BSREPLICATE, T_BSLENGTH, T_BSSUBSTR, T_BSINDEX,
+                T_BSFROMUTF8, T_BSTOUTF8, T_BSHEADUTF8, T_BSTAILUTF8,
+                T_BSAPPENDDOT,
+                T_IO_STDIN, T_IO_STDOUT, T_IO_STDERR,
+                T_LAST_TAG,
+};
+static const char* tag_names[T_LAST_TAG+1] =
+  { "FREE", "IND", "AP", "INT", "DBL", "PTR", "FUNPTR", "FORPTR", "BADDYN", "ARR", "THID" };
+
+struct ioarray;
+struct bytestring;
+struct forptr;
+
+typedef struct node {
+  union {
+    struct node *uufun;
+    intptr_t     uuifun;
+    tag_t        uutag;             /* LSB=1 indicates that this is a tag, LSB=0 that this is a T_AP node */
+  } ufun;
+  union {
+    struct node    *uuarg;
+    value_t         uuvalue;
+    flt_t           uufloatvalue;
+    const char     *uucstring;
+    void           *uuptr;
+    HsFunPtr        uufunptr;
+    struct ioarray *uuarray;
+    struct forptr  *uuforptr;      /* foreign pointers and byte arrays */
+  } uarg;
+} node;
+#define BIT_TAG   1
+#define BIT_IND   2
+#define BIT_NOTAP (BIT_TAG | BIT_IND)
+#define TAG_SHIFT 2
+
+typedef struct node* NODEPTR;
+#define NIL 0
+#define HEAPREF(i) &cells[(i)]
+#define GETTAG(p) ((p)->ufun.uutag & BIT_NOTAP ? ( (p)->ufun.uutag & BIT_IND ? T_IND : (int)((p)->ufun.uutag >> TAG_SHIFT) ) : T_AP)
+#define SETTAG(p,t) do { if (t != T_AP) { if (t == T_IND) { (p)->ufun.uutag = BIT_IND; } else { (p)->ufun.uutag = ((t) << TAG_SHIFT) | BIT_TAG; } } } while(0)
+#define GETVALUE(p) (p)->uarg.uuvalue
+#define GETDBLVALUE(p) (p)->uarg.uufloatvalue
+#define SETVALUE(p,v) (p)->uarg.uuvalue = v
+#define SETDBLVALUE(p,v) (p)->uarg.uufloatvalue = v
+#define FUN(p) (p)->ufun.uufun
+#define ARG(p) (p)->uarg.uuarg
+#define CSTR(p) (p)->uarg.uucstring
+#define PTR(p) (p)->uarg.uuptr
+#define FUNPTR(p) (p)->uarg.uufunptr
+#define FORPTR(p) (p)->uarg.uuforptr
+#define BSTR(p) (p)->uarg.uuforptr->payload
+#define ARR(p) (p)->uarg.uuarray
+#define ISINDIR(p) ((p)->ufun.uuifun & BIT_IND)
+#define GETINDIR(p) ((struct node*) ((p)->ufun.uuifun & ~BIT_IND))
+#define SETINDIR(p,q) do { (p)->ufun.uuifun = (intptr_t)(q) | BIT_IND; } while(0)
+#define NODE_SIZE sizeof(node)
+#define ALLOC_HEAP(n) do { cells = MALLOC(n * sizeof(node)); } while(0)
+#define LABEL(n) ((heapoffs_t)((n) - cells))
+node *cells;                 /* All cells */
+
+/*
+ * byte arrays
+ */
+struct bytestring {
+  size_t size;
+  void *string;
+};
+
+/*
+ * Arrays are allocated with MALLOC()/FREE().
+ * During GC they are marked, and all elements in the array are
+ * recursively marked.
+ * At the end of the the mark phase there is a scan of all
+ * arrays, and the unmarked ones are freed.
+ */
+struct ioarray {
+  struct ioarray *next;         /* all ioarrays are linked together */
+  int permanent;                /* this array should never be GC-ed */
+  size_t marked;                /* marked during GC */
+  size_t size;                  /* number of elements in the array */
+  NODEPTR array[1];             /* actual size may be bigger */
+};
+struct ioarray *array_root = 0; /* root of all allocated arrays, linked by next */
+
+enum fptype {
+  FP_FORPTR = 0,                /* a regular foreign pointer to unknown memory */
+  FP_BSTR,                      /* a bytestring */
+  FP_MPZ,                       /* a GMP MPZ pointer */
+};
+
+/*
+ * A Haskell ForeignPtr has a normal pointer, and a finalizer
+ * function that is to be called when there are no more references
+ * to the ForeignPtr.
+ * A complication is that using plusForeignPtr creates a new
+ * ForeignPtr that must share the same finalizer.
+ * There is one struct forptr for each ForeignPtr.  It has pointer
+ * to the actual data, and to a struct final which is shared between
+ * all ForeignPtrs that have been created with plusForeignPtr.
+ * During GC the used bit is set for any references to the forptr.
+ * The scan phase will traverse the struct final chain and run
+ * the finalizer, and free associated structs.
+ */
+struct final {
+  struct final  *next;      /* the next finalizer */
+  HsFunPtr       final;     /* function to call to release resource */
+  void          *arg;       /* argument to final when called */
+  size_t         size;      /* size of memory, if known, otherwise NOSIZE */
+#define NOSIZE ~0           /* used as the size in payload for actual foreign pointers */
+  struct forptr *back;      /* back pointer to the first forptr */
+  short          marked;    /* mark bit for GC */
+  enum fptype    fptype;    /* what kind of foreign pointer */
+};
+
+/*
+ * Foreign pointers are also used to represent bytestrings.
+ * The difference between a foreign pointer and a bytestring
+ * is that we can serialize the latter.
+ * The size field is non-zero only for bytestrings.
+ */
+struct forptr {
+  struct forptr *next;       /* the next ForeignPtr that shares the same finalizer */
+  struct final  *finalizer;  /* the finalizer for this ForeignPtr */
+  struct bytestring payload; /* the actual pointer to allocated data, and maybe a size */
+  //  char          *desc;
+};
+struct final *final_root = 0;   /* root of all allocated foreign pointers, linked by next */
+
+REGISTER(counter_t num_reductions,r19);
+counter_t num_alloc = 0;
+counter_t num_gc = 0;
+uintptr_t gc_mark_time = 0;
+uintptr_t gc_scan_time = 0;
+uintptr_t run_time = 0;
+
+#define MAXSTACKDEPTH 0
+#if MAXSTACKDEPTH
+stackptr_t max_stack_depth = 0;
+counter_t max_c_stack = 0;
+counter_t cur_c_stack = 0;
+#define MAXSTACK if (stack_ptr > max_stack_depth) max_stack_depth = stack_ptr
+#else
+#define MAXSTACK
+#endif
+
+NODEPTR *topnode;
+NODEPTR atptr;
+
+REGISTER(NODEPTR *stack,r20);
+REGISTER(stackptr_t stack_ptr,r21);
+#if STACKOVL
+#define PUSH(x) do { if (stack_ptr >= stack_size-1) stackerr(); stack[++stack_ptr] = (x); MAXSTACK; } while(0)
+#else  /* STACKOVL */
+#define PUSH(x) do {                                            stack[++stack_ptr] = (x); MAXSTACK; } while(0)
+#endif  /* STACKOVL */
+#define TOP(n) stack[stack_ptr - (n)]
+#define POP(n) stack_ptr -= (n)
+#define POPTOP() stack[stack_ptr--]
+#define GCCHECK(n) gc_check((n))
+
+heapoffs_t heap_size;       /* number of heap cells */
+heapoffs_t heap_start;      /* first location in heap that needs GC */
+REGISTER(stackptr_t stack_size,r22);      /* number of stack slots */
+
+counter_t num_marked;
+counter_t max_num_marked = 0;
+counter_t num_free;
+counter_t num_arr_alloc;
+counter_t num_arr_free;
+counter_t num_fin_alloc;
+counter_t num_fin_free;
+counter_t num_bs_alloc;
+counter_t num_bs_alloc_max;
+counter_t num_bs_free;
+counter_t num_bs_bytes;
+counter_t num_bs_inuse;
+counter_t num_bs_inuse_max;
+
+#define BITS_PER_WORD (sizeof(bits_t) * 8)
+bits_t *free_map;             /* 1 bit per node, 0=free, 1=used */
+heapoffs_t free_map_nwords;
+heapoffs_t next_scan_index;
+
+int want_gc_red = 0;
+
+NORETURN
+void
+memerr(void)
+{
+  ERR("Out of memory");
+  EXIT(1);
+}
+
+NORETURN
+void
+stackerr(void)
+{
+  ERR("stack overflow");
+  EXIT(1);
+}
+
+/***************************************/
+
+#include "bfile.c"
+
+/***************************************/
+
+struct ioarray*
+arr_alloc(size_t sz, NODEPTR e)
+{
+  struct ioarray *arr = MALLOC(sizeof(struct ioarray) + (sz-1) * sizeof(NODEPTR));
+  size_t i;
+
+  if (!arr)
+    memerr();
+  arr->next = array_root;
+  array_root = arr;
+  arr->marked = 0;
+  arr->permanent = 0;
+  arr->size = sz;
+  for(i = 0; i < sz; i++)
+    arr->array[i] = e;
+  //PRINT("arr_alloc(%d, %p) = %p\n", (int)sz, e, arr);
+  num_arr_alloc++;
+  return arr;
+}
+
+struct ioarray*
+arr_copy(struct ioarray *oarr)
+{
+  size_t sz = oarr->size;
+  struct ioarray *arr = MALLOC(sizeof(struct ioarray) + (sz-1) * sizeof(NODEPTR));
+
+  if (!arr)
+    memerr();
+  arr->next = array_root;
+  array_root = arr;
+  arr->marked = 0;
+  arr->permanent = 0;
+  arr->size = sz;
+  memcpy(arr->array, oarr->array, sz * sizeof(NODEPTR));
+  num_arr_alloc++;
+  return arr;
+}
+
+/*****************************************************************************/
+
+#if WANT_TICK
+struct tick_entry {
+  struct bytestring tick_name;
+  counter_t tick_count;
+} *tick_table = 0;
+size_t tick_table_size;
+size_t tick_index;
+
+/* Allocate a new tick table entry and return the index. */
+size_t
+add_tick_table(struct bytestring name)
+{
+  if (!tick_table) {
+    tick_table_size = 100;
+    tick_table = malloc(tick_table_size * sizeof(struct tick_entry));
+    if (!tick_table)
+      memerr();
+    tick_index = 0;
+  }
+  if (tick_index >= tick_table_size) {
+    tick_table_size *= 2;
+    tick_table = REALLOC(tick_table, tick_table_size * sizeof(struct tick_entry));
+    if (!tick_table)
+      memerr();
+  }
+  tick_table[tick_index].tick_name = name;
+  tick_table[tick_index].tick_count = 0;
+  return tick_index++;
+}
+
+/* Called with the tick index. */
+static inline void
+dotick(value_t i)
+{
+  tick_table[i].tick_count++;
+}
+
+void
+dump_tick_table(FILE *f)
+{
+  if (!tick_table) {
+    fprintf(f, "Tick table empty\n");
+    return;
+  }
+  for (size_t i = 0; i < tick_index; i++) {
+    counter_t n = tick_table[i].tick_count;
+    if (n)
+      fprintf(f, "%-60s %10"PRIcounter"\n", (char *)tick_table[i].tick_name.string, n);
+  }
+}
+#endif
+
+/*****************************************************************************/
+
+struct handler {
+  jmp_buf         hdl_buf;      /* env storage */
+  struct handler *hdl_old;      /* old handler */
+  stackptr_t      hdl_stack;    /* old stack pointer */
+  NODEPTR         hdl_exn;      /* used temporarily to pass the exception value */
+} *cur_handler = 0;
+
+/* Set FREE bit to 0 */
+static INLINE void mark_used(NODEPTR n)
+{
+  heapoffs_t i = LABEL(n);
+  if (i < heap_start)
+    return;
+#if SANITY
+  if (i >= free_map_nwords * BITS_PER_WORD) ERR("mark_used");
+#endif
+  free_map[i / BITS_PER_WORD] &= ~(1ULL << (i % BITS_PER_WORD));
+}
+
+/* Set FREE bit to 1, used to undo marking in GC */
+static INLINE void mark_unused(NODEPTR n)
+{
+  heapoffs_t i = LABEL(n);
+#if SANITY
+  if (i < heap_start)
+    ERR("Unmarking invalid heap address.");
+  if (i >= free_map_nwords * BITS_PER_WORD) ERR("mark_used");
+#endif
+  free_map[i / BITS_PER_WORD] |= 1ULL << (i % BITS_PER_WORD);
+}
+
+/* Test if FREE bit is 0 */
+static INLINE int is_marked_used(NODEPTR n)
+{
+  heapoffs_t i = LABEL(n);
+  if (i < heap_start)
+    return 1;
+#if SANITY
+  if (i >= free_map_nwords * BITS_PER_WORD)
+    ERR("is_marked_used");
+#endif
+  return (free_map[i / BITS_PER_WORD] & (1ULL << (i % BITS_PER_WORD))) == 0;
+}
+
+static INLINE void mark_all_free(void)
+{
+  memset(free_map, ~0, free_map_nwords * sizeof(bits_t));
+  next_scan_index = heap_start;
+}
+
+#if WANT_ARGS
+/* This single element array hold a list of the program arguments. */
+struct ioarray *argarray;
+#endif  /* WANT_ARGS */
+
+int verbose = 0;
+int gcbell = 0;
+
+static INLINE NODEPTR
+alloc_node(enum node_tag t)
+{
+  heapoffs_t i = next_scan_index / BITS_PER_WORD;
+  int k;                        /* will contain bit pos + 1 */
+  heapoffs_t pos;
+  NODEPTR n;
+  heapoffs_t word;
+
+  /* This can happen if we run out of memory when parsing. */
+  if (num_free <= 0)
+    ERR("alloc_node");
+
+  for(;;) {
+    word = free_map[i];
+    if (word)
+      break;
+    i++;
+#if SANITY
+    if (i >= free_map_nwords) {
+#if 0
+      fprintf(stderr, "wordsize=%u, num_free=%u next_scan_index=%u i=%u free_map_nwords=%u\n", (uint)BITS_PER_WORD,
+              (uint)num_free, (uint)next_scan_index, (uint)i, (uint)free_map_nwords);
+#endif
+      ERR("alloc_node: free_map");
+    }
+#endif
+  }
+  k = FFS(word);
+  pos = i * BITS_PER_WORD + k - 1; /* first free node */
+  n = HEAPREF(pos);
+  // mark_used(n); // equivalent to:
+  free_map[i] = word & (word-1);
+  next_scan_index = pos;
+
+  SETTAG(n, t);
+  COUNT(num_alloc);
+  num_free--;
+  return n;
+}
+
+static INLINE NODEPTR
+new_ap(NODEPTR f, NODEPTR a)
+{
+  NODEPTR n = alloc_node(T_AP);
+  FUN(n) = f;
+  ARG(n) = a;
+  return n;
+}
+
+/* Needed during reduction */
+NODEPTR intTable[HIGH_INT - LOW_INT];
+NODEPTR combK, combTrue, combUnit, combCons, combPair;
+NODEPTR combCC, combZ, combIOBIND, combIORETURN, combIOCCBIND, combB, combC;
+NODEPTR combLT, combEQ, combGT;
+NODEPTR combShowExn, combU, combK2, combK3;
+NODEPTR combBININT1, combBININT2, combUNINT1;
+NODEPTR combBINDBL1, combBINDBL2, combUNDBL1;
+NODEPTR combBINBS1, combBINBS2;
+NODEPTR comb_stdin, comb_stdout, comb_stderr;
+#define combFalse combK
+
+/* One node of each kind for primitives, these are never GCd. */
+/* We use linear search in this, because almost all lookups
+ * are among the combinators.
+ */
+struct {
+  const char *name;
+  const enum node_tag tag;
+  const enum node_tag flipped;        /* What should (C op) reduce to? defaults to T_FREE */
+  NODEPTR node;
+} primops[] = {
+  /* combinators */
+  /* sorted by frequency in a typical program */
+  { "B", T_B },
+  { "O", T_O },
+  { "K", T_K },
+  { "C'", T_CC },
+  { "C", T_C },
+  { "A", T_A },
+  { "S'", T_SS },
+  { "P", T_P },
+  { "R", T_R },
+  { "I", T_I },
+  { "S", T_S },
+  { "U", T_U },
+  { "Y", T_Y },
+  { "B'", T_BB },
+  { "Z", T_Z },
+  /*  { "J", T_J },*/
+  { "K2", T_K2 },
+  { "K3", T_K3 },
+  { "K4", T_K4 },
+  { "C'B", T_CCB },
+/* primops */
+  { "+", T_ADD, T_ADD },
+  { "-", T_SUB, T_SUBR },
+  { "*", T_MUL, T_MUL },
+  { "quot", T_QUOT },
+  { "rem", T_REM },
+  { "uquot", T_UQUOT },
+  { "urem", T_UREM },
+  { "subtract", T_SUBR, T_SUB },
+  { "neg", T_NEG },
+  { "and", T_AND, T_AND },
+  { "or", T_OR, T_OR },
+  { "xor", T_XOR, T_XOR },
+  { "inv", T_INV },
+  { "shl", T_SHL },
+  { "shr", T_SHR },
+  { "ashr", T_ASHR },
+  { "popcount", T_POPCOUNT },
+  { "clz", T_CLZ },
+  { "ctz", T_CTZ },
+#if WANT_FLOAT
+  { "f+" , T_FADD, T_FADD},
+  { "f-" , T_FSUB },
+  { "f*" , T_FMUL, T_FMUL},
+  { "f/", T_FDIV},
+  { "fneg", T_FNEG},
+  { "itof", T_ITOF},
+  { "f==", T_FEQ, T_FEQ},
+  { "f/=", T_FNE, T_FNE},
+  { "f<", T_FLT, T_FGT},
+  { "f<=", T_FLE, T_FGE},
+  { "f>", T_FGT, T_FLT},
+  { "f>=", T_FGE, T_FLE},
+  { "fshow", T_FSHOW},
+  { "fread", T_FREAD},
+#endif  /* WANT_FLOAT */
+
+  { "bs++", T_BSAPPEND },
+  { "bs++.", T_BSAPPENDDOT },
+  { "bs==", T_BSEQ, T_BSEQ },
+  { "bs/=", T_BSNE, T_BSNE },
+  { "bs<", T_BSLT, T_BSGT },
+  { "bs<=", T_BSLE, T_BSGE  },
+  { "bs>", T_BSGT, T_BSLT },
+  { "bs>=", T_BSGE, T_BSLE  },
+  { "bscmp", T_BSCMP },
+  { "bspack", T_BSPACK },
+  { "bsunpack", T_BSUNPACK },
+  { "bsreplicate", T_BSREPLICATE },
+  { "bslength", T_BSLENGTH },
+  { "bssubstr", T_BSSUBSTR },
+  { "bsindex", T_BSINDEX },
+
+  { "ord", T_I },
+  { "chr", T_I },
+  { "==", T_EQ, T_EQ },
+  { "/=", T_NE, T_NE },
+  { "<", T_LT, T_GT },
+  { "u<", T_ULT, T_UGT },
+  { "u<=", T_ULE, T_UGE },
+  { "u>", T_UGT, T_ULT },
+  { "u>=", T_UGE, T_ULE },
+  { "<=", T_LE, T_GE },
+  { ">", T_GT, T_LT },
+  { ">=", T_GE, T_LE },
+  { "fp+", T_FPADD },
+  { "fp2p", T_FP2P },
+  { "fpnew", T_FPNEW },
+  { "fpfin", T_FPFIN },
+  //  { "fpstr", T_FPSTR },
+  { "fp2bs", T_FP2BS },
+  { "bs2fp", T_BS2FP },
+  { "seq", T_SEQ },
+  { "equal", T_EQUAL, T_EQUAL },
+  { "sequal", T_EQUAL, T_EQUAL },
+  { "compare", T_COMPARE },
+  { "scmp", T_COMPARE },
+  { "icmp", T_ICMP },
+  { "ucmp", T_UCMP },
+  { "rnf", T_RNF },
+  { "fromUTF8", T_BSFROMUTF8 },
+  { "toUTF8", T_BSTOUTF8 },
+  { "headUTF8", T_BSHEADUTF8 },
+  { "tailUTF8", T_BSTAILUTF8 },
+  /* IO primops */
+  { "IO.>>=", T_IO_BIND },
+  { "IO.>>", T_IO_THEN },
+  { "IO.return", T_IO_RETURN },
+  { "IO.C'BIND", T_IO_CCBIND },
+  { "IO.serialize", T_IO_SERIALIZE },
+  { "IO.print", T_IO_PRINT },
+  { "IO.deserialize", T_IO_DESERIALIZE },
+  { "IO.stdin", T_IO_STDIN },
+  { "IO.stdout", T_IO_STDOUT },
+  { "IO.stderr", T_IO_STDERR },
+  { "IO.getArgRef", T_IO_GETARGREF },
+  { "IO.performIO", T_IO_PERFORMIO },
+  { "IO.gc", T_IO_GC },
+  { "raise", T_RAISE },
+  { "catch", T_CATCH },
+  { "A.alloc", T_ARR_ALLOC },
+  { "A.copy", T_ARR_COPY },
+  { "A.size", T_ARR_SIZE },
+  { "A.read", T_ARR_READ },
+  { "A.write", T_ARR_WRITE },
+  { "A.==", T_ARR_EQ },
+  { "dynsym", T_DYNSYM },
+  { "newCAStringLen", T_NEWCASTRINGLEN },
+  { "packCString", T_PACKCSTRING },
+  { "packCStringLen", T_PACKCSTRINGLEN },
+  { "toPtr", T_TOPTR },
+  { "toInt", T_TOINT },
+  { "toDbl", T_TODBL },
+  { "toFunPtr", T_TOFUNPTR },
+};
+
+#if GCRED
+enum node_tag flip_ops[T_LAST_TAG+1];
+#endif
+
+#if WANT_STDIO
+/* Create a dummy foreign pointer for the standard stdio handles. */
+/* These handles are never gc():d. */
+void
+mk_std(NODEPTR n, FILE *f)
+{
+  struct final *fin = calloc(1, sizeof(struct final));
+  struct forptr *fp = calloc(1, sizeof(struct forptr));
+  if (!fin || !fp)
+    memerr();
+  BFILE *bf = add_utf8(add_FILE(f));
+  SETTAG(n, T_FORPTR);
+  FORPTR(n) = fp;
+  fin->arg = bf;
+  fin->back = fp;
+  fp->payload.string = bf;
+  fp->finalizer = fin;
+}
+#endif
+
+void
+init_nodes(void)
+{
+  enum node_tag t;
+  size_t j;
+  NODEPTR n;
+
+  ALLOC_HEAP(heap_size);
+  free_map_nwords = (heap_size + BITS_PER_WORD - 1) / BITS_PER_WORD; /* bytes needed for free map */
+  free_map = MALLOC(free_map_nwords * sizeof(bits_t));
+  if (!free_map)
+    memerr();
+
+  /* Set up permanent nodes */
+  heap_start = 0;
+  for(t = T_FREE; t < T_LAST_TAG; t++) {
+    NODEPTR n = HEAPREF(heap_start++);
+    SETTAG(n, t);
+    switch (t) {
+    case T_K: combK = n; break;
+    case T_A: combTrue = n; break;
+    case T_I: combUnit = n; break;
+    case T_O: combCons = n; break;
+    case T_P: combPair = n; break;
+    case T_CC: combCC = n; break;
+    case T_B: combB = n; break;
+    case T_C: combC = n; break;
+    case T_Z: combZ = n; break;
+    case T_U: combU = n; break;
+    case T_K2: combK2 = n; break;
+    case T_K3: combK3 = n; break;
+    case T_IO_BIND: combIOBIND = n; break;
+    case T_IO_RETURN: combIORETURN = n; break;
+    case T_IO_CCBIND: combIOCCBIND = n; break;
+    case T_BININT1: combBININT1 = n; break;
+    case T_BININT2: combBININT2 = n; break;
+    case T_UNINT1: combUNINT1 = n; break;
+    case T_BINDBL1: combBINDBL1 = n; break;
+    case T_BINDBL2: combBINDBL2 = n; break;
+    case T_UNDBL1: combUNDBL1 = n; break;
+    case T_BINBS1: combBINBS1 = n; break;
+    case T_BINBS2: combBINBS2 = n; break;
+#if WANT_STDIO
+    case T_IO_STDIN:  comb_stdin  = n; mk_std(n, stdin);  break;
+    case T_IO_STDOUT: comb_stdout = n; mk_std(n, stdout); break;
+    case T_IO_STDERR: comb_stderr = n; mk_std(n, stderr); break;
+#endif
+    default:
+      break;
+    }
+    for (j = sizeof primops / sizeof primops[0]; j-- > 0; ) {
+      if (primops[j].tag == t) {
+        primops[j].node = n;
+      }
+      tag_names[primops[j].tag] = primops[j].name;
+    }
+  }
+
+#if GCRED
+  for (j = 0; j < sizeof primops / sizeof primops[0]; j++) {
+    flip_ops[primops[j].tag] = primops[j].flipped;
+  }
+#endif
+
+  /* The representation of the constructors of
+   *  data Ordering = LT | EQ | GT
+   * do not have single constructors.
+   * But we can make compound one, since they are irreducible.
+   */
+#define NEWAP(c, f, a) do { n = HEAPREF(heap_start++); SETTAG(n, T_AP); FUN(n) = (f); ARG(n) = (a); (c) = n;} while(0)
+  NEWAP(combLT, combZ,     combFalse);  /* Z B */
+  NEWAP(combEQ, combFalse, combFalse);  /* K K */
+  NEWAP(combGT, combFalse, combTrue);   /* K A */
+  {
+    /* The displaySomeException compiles to (U (U (K2 A))) */
+    NODEPTR x;
+    NEWAP(x, combK2, combTrue);        /* (K2 A) */
+    NEWAP(x, combU, x);                /* (U (K2 A)) */
+    NEWAP(combShowExn, combU, x);      /* (U (U (K2 A))) */
+  }
+#undef NEWAP
+
+#if INTTABLE
+  /* Allocate permanent Int nodes */
+  for (int i = LOW_INT; i < HIGH_INT; i++) {
+    NODEPTR n = HEAPREF(heap_start++);
+    intTable[i - LOW_INT] = n;
+    SETTAG(n, T_INT);
+    SETVALUE(n, i);
+  }
+#endif
+
+  /* Round up heap_start to the next bitword boundary to avoid the permanent nodes. */
+  heap_start = (heap_start + BITS_PER_WORD - 1) / BITS_PER_WORD * BITS_PER_WORD;
+
+  mark_all_free();
+
+  num_free = heap_size - heap_start;
+}
+
+#if GCRED
+counter_t red_a, red_k, red_i, red_int, red_flip, red_bi, red_bxi, red_ccbi, red_cc;
+#endif
+counter_t red_bb, red_k4, red_k3, red_k2, red_ccb, red_z, red_r;
+
+//counter_t mark_depth;
+//counter_t max_mark_depth = 0;
+
+/* Follow indirections */
+static INLINE NODEPTR
+indir(NODEPTR *np)
+{
+  NODEPTR n = *np;
+  while (GETTAG(n) == T_IND)
+    n = GETINDIR(n);
+  *np = n;
+  return n;
+}
+
+/* Mark all used nodes reachable from *np, updating *np. */
+void
+mark(NODEPTR *np)
+{
+  stackptr_t stk = stack_ptr;
+  NODEPTR n;
+  NODEPTR *to_push = 0;         /* silence warning by initializing */
+#if GCRED
+  value_t val;
+#endif
+  enum node_tag tag;
+
+  //  mark_depth++;
+  //  if (mark_depth % 10000 == 0)
+  //    PRINT("mark depth %"PRIcounter"\n", mark_depth);
+  top:
+  n = *np;
+  tag = GETTAG(n);
+  if (tag == T_IND) {
+#if SANITY
+    int loop = 0;
+    /* Skip indirections, and redirect start pointer */
+    while ((tag = GETTAG(n)) == T_IND) {
+      //      PRINT("*"); fflush(stdout);
+      n = GETINDIR(n);
+      if (loop++ > 10000000) {
+        //PRINT("%p %p %p\n", n, GETINDIR(n), GETINDIR(GETINDIR(n)));
+        ERR("IND loop");
+      }
+    }
+    //    if (loop)
+    //      PRINT("\n");
+#else  /* SANITY */
+    while ((tag = GETTAG(n)) == T_IND) {
+      n = GETINDIR(n);
+    }
+#endif  /* SANITY */
+    *np = n;
+  }
+  if (n < cells || n > cells + heap_size)
+    ERR("bad n");
+  if (is_marked_used(n)) {
+    goto fin;
+  }
+  num_marked++;
+  mark_used(n);
+  switch (tag) {
+#if GCRED
+   case T_INT:
+#if INTTABLE
+    if (LOW_INT <= (val = GETVALUE(n)) && val < HIGH_INT) {
+      SETINDIR(n, intTable[val - LOW_INT]);
+      COUNT(red_int);
+      goto top;
+    }
+    goto fin;
+#endif  /* INTTABLE */
+   case T_AP:
+      if (want_gc_red) {
+        enum node_tag funt = GETTAG(indir(&FUN(n)));
+        enum node_tag argt = GETTAG(indir(&ARG(n)));
+        enum node_tag funfunt = funt == T_AP ? GETTAG(indir(&FUN(FUN(n)))) : T_FREE;
+
+        /* This is really only fruitful just after parsing.  It can be removed. */
+        if (funfunt == T_A) {
+          /* Do the A x y --> y reduction */
+          NODEPTR y = ARG(n);
+          SETINDIR(n, y);
+          COUNT(red_a);
+          goto top;
+        }
+
+        if (funfunt == T_K) {
+          /* Do the K x y --> x reduction */
+          NODEPTR x = ARG(FUN(n));
+          SETINDIR(n, x);
+          COUNT(red_k);
+          goto top;
+        }
+
+        if (funt == T_I) {
+          /* Do the I x --> x reduction */
+          NODEPTR x = ARG(n);
+          SETINDIR(n, x);
+          COUNT(red_i);
+          goto top;
+        }
+
+        if(funt == T_B && argt == T_I) { 
+          /* B I --> I */
+          SETTAG(n, T_I);
+          COUNT(red_bi);
+          goto top;
+        }
+
+        if(funfunt == T_B && argt == T_I) { 
+          /* B x I --> x */
+          NODEPTR x = ARG(FUN(n));
+          SETINDIR(n, x);
+          COUNT(red_bxi);
+          goto top;
+        }
+
+        if(funfunt == T_CCB && argt == T_I) { 
+          /* C'B x I --> x */
+          NODEPTR x = ARG(FUN(n));
+          SETINDIR(n, x);
+          COUNT(red_ccbi);
+          goto top;
+        }
+
+        if(funt == T_C && argt == T_C) { 
+          /* C C --> I */
+          SETTAG(n, T_I);
+          COUNT(red_cc);
+          goto top;
+        }
+
+#if 0
+        /* Very rare */
+        if (funt == T_S && argt == T_AP && GETTAG(indir(&FUN(ARG(n)))) == T_K) {
+          /* S (K x) --> B x */
+          printf("SK"); fflush(stdout);
+        }
+#endif
+
+#if 0
+        /* Happens very rarely */
+        if (funt == T_C && argt == T_AP && GETTAG(indir(&FUN(ARG(n)))) == T_C) {
+          /* C (C a) --> a */
+          NODEPTR x = ARG(ARG(n));
+          SETINDIR(n, x);
+          //COUNT(red_cc);
+          goto top;
+        }
+#endif
+#if 0
+        /* Fairly frequent, but needs allocation */
+        if (funfunt == T_B && argt == T_AP && GETTAG(indir(&FUN(ARG(n)))) == T_K) {
+          /* B x (K y) --> K x y */
+          printf("BxK\n");
+        }
+#endif
+
+#if 0
+        /* This is broken.
+         * Probably because it can happen in the middle of the C reduction code.
+         */
+        DO NOT ENABLE
+        if (GETTAG(FUN(n)) == T_C) {
+          NODEPTR q = ARG(n);
+          enum node_tag tt, tf;
+          while ((tt = GETTAG(q)) == T_IND)
+            q = GETINDIR(q);
+          if ((tf = flip_ops[tt])) {
+            /* Do the C op --> flip_op reduction */
+            // PRINT("%s -> %s\n", tag_names[tt], tag_names[tf]);
+            SETINDIR(n, HEAPREF(tf));
+            COUNT(red_flip);
+            goto fin;
+          }
+        }
+#endif
+      }
+#else   /* GCRED */
+   case T_AP:
+#endif  /* GCRED */
+    /* Avoid tail recursion */
+    np = &FUN(n);
+    to_push = &ARG(n);
+    break;
+   case T_ARR:
+    {
+      struct ioarray *arr = ARR(n);
+
+      // arr->marked records marking progress through arr.
+      if (arr->marked >= arr->size) {
+        goto fin;
+      }
+      // We unmark the array as a whole and push it as long
+      // as there's more entries to scan.
+      mark_unused(n);
+      num_marked--;
+      to_push = np;
+      np = &arr->array[arr->marked++];
+      break;
+    }
+   case T_FORPTR:
+     FORPTR(n)->finalizer->marked = 1;
+     goto fin;
+
+   default:
+     goto fin;
+  }
+
+  if (!is_marked_used(*to_push)) {
+    //  mark_depth++;
+    PUSH((NODEPTR)to_push);
+  }
+  goto top;
+ fin:
+  //  if (mark_depth > max_mark_depth) {
+  //    max_mark_depth = mark_depth;
+  //  }
+  //  mark_depth--;
+  if (stack_ptr > stk) {
+    np = (NODEPTR *)POPTOP();
+    goto top;
+  }
+  return;
+}
+
+/* Perform a garbage collection:
+   - First mark from all roots; roots are on the stack.
+*/
+void
+gc(void)
+{
+  stackptr_t i;
+
+  num_gc++;
+  num_marked = 0;
+#if WANT_STDIO
+  if (verbose > 1)
+    PRINT("gc mark\n");
+#endif
+  gc_mark_time -= GETTIMEMILLI();
+  mark_all_free();
+  // mark everything reachable from the stack
+  for (i = 0; i <= stack_ptr; i++)
+    mark(&stack[i]);
+  // mark everything reachable from permanent array nodes
+  for (struct ioarray *arr = array_root; arr; arr = arr->next) {
+    if (arr->permanent) {
+      for (i = 0; i < arr->size; i++)
+        mark(&arr->array[i]);
+    }
+  }
+  gc_mark_time += GETTIMEMILLI();
+
+  if (num_marked > max_num_marked)
+    max_num_marked = num_marked;
+  num_free = heap_size - heap_start - num_marked;
+  if (num_free < heap_size / 50)
+    ERR("heap exhausted");
+
+  gc_scan_time -= GETTIMEMILLI();
+  /* Free unused arrays */
+  for (struct ioarray **arrp = &array_root; *arrp; ) {
+    struct ioarray *arr = *arrp;
+    if (arr->marked || arr->permanent) {
+      arr->marked = 0;
+      arrp = &arr->next;
+    } else {
+      *arrp = arr->next;        /* unlink */
+      num_arr_free++;
+      FREE(arr);                /* and FREE */
+    }
+  }
+
+  /* Run finalizers on unused foreign pointers. */
+  for (struct final **finp = &final_root; *finp; ) {
+    struct final *fin = *finp;
+    if (fin->marked) {
+      fin->marked = 0;
+      finp = &fin->next;
+    } else {
+      /* Unused, run finalizer and free all associated memory */
+      if (fin->size == NOSIZE) {
+        num_fin_free++;
+      } else {
+        num_bs_free++;
+        num_bs_inuse -= fin->size;
+        if (num_bs_alloc - num_bs_free > num_bs_alloc_max)
+          num_bs_alloc_max = num_bs_alloc - num_bs_free;
+      }
+      void (*f)(void *) = (void (*)(void *))fin->final;
+      //printf("forptr free fin=%p, f=%p", fin, f);
+      //fflush(stdout);
+      if (f) {
+        //printf("finalizer fin=%p final=%p\n", fin, f);
+        (*f)(fin->arg);
+      }
+      for (struct forptr *p = fin->back; p; ) {
+        struct forptr *q = p->next;
+        //printf("free fp=%p\n", p);
+        //printf(" p=%p desc=%s", p, p->desc ? p->desc : "NONE");
+        //fflush(stdout);
+        FREE(p);
+        //memset(p, 0x55, sizeof *p);
+        p = q;
+      }
+      //printf("\n");
+      *finp = fin->next;
+      //printf("free fin=%p\n", fin);
+      FREE(fin);
+      //memset(fin, 0x77, sizeof *fin);
+    }
+  }
+  gc_scan_time += GETTIMEMILLI();
+
+#if WANT_STDIO
+  if (verbose > 1) {
+    PRINT("gc done, %"PRIcounter" free\n", num_free);
+    /*PRINT(" GC reductions A=%"PRIcounter", K=%"PRIcounter", I=%"PRIcounter", int=%"PRIcounter" flip=%"PRIcounter"\n",
+      red_a, red_k, red_i, red_int, red_flip);*/
+  }
+  if (gcbell) {
+    fputc('\007', stderr);      /* ring the bell */
+    fflush(stderr);
+  }
+#endif  /* !WANT_STDIO */
+
+#if 0
+  /* For debugging only: mark all free cells */
+  for(int n = 0; n < heap_size; n++) {
+    NODEPTR p = HEAPREF(n);
+    if (!is_marked_used(p)) {
+      SETTAG(p, T_FREE);
+    }
+  }
+#endif
+}
+
+/* Check that there are k nodes available, if not then GC. */
+static INLINE void
+gc_check(size_t k)
+{
+  if (k < num_free)
+    return;
+#if WANT_STDIO
+  if (verbose > 1)
+    PRINT("gc_check: %d\n", (int)k);
+#endif
+  gc();
+}
+
+static INLINE
+value_t
+peekWord(value_t *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+pokeWord(value_t *p, value_t w)
+{
+  *p = w;
+}
+
+static INLINE
+void *
+peekPtr(void **p)
+{
+  return *p;
+}
+
+static INLINE
+void
+pokePtr(void **p, void *w)
+{
+  *p = w;
+}
+
+static INLINE
+uvalue_t
+peek_uint8(uint8_t *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_uint8(uint8_t *p, value_t w)
+{
+  *p = (uint8_t)w;
+}
+
+static INLINE
+uvalue_t
+peek_uint16(uint16_t *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_uint16(uint16_t *p, value_t w)
+{
+  *p = (uint16_t)w;
+}
+
+#if WORD_SIZE >= 32
+static INLINE
+uvalue_t
+peek_uint32(uint32_t *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_uint32(uint32_t *p, value_t w)
+{
+  *p = (uint32_t)w;
+}
+#endif  /* WORD_SIZE >= 32 */
+
+#if WORD_SIZE >= 64
+static INLINE
+uvalue_t
+peek_uint64(uint64_t *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_uint64(uint64_t *p, value_t w)
+{
+  *p = (uint64_t)w;
+}
+#endif  /* WORD_SIZE >= 64 */
+
+static INLINE
+value_t
+peek_int8(int8_t *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_int8(int8_t *p, value_t w)
+{
+  *p = (int8_t)w;
+}
+
+static INLINE
+value_t
+peek_int16(int16_t *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_int16(int16_t *p, value_t w)
+{
+  *p = (int16_t)w;
+}
+
+#if WORD_SIZE >= 32
+static INLINE
+value_t
+peek_int32(int32_t *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_int32(int32_t *p, value_t w)
+{
+  *p = (int32_t)w;
+}
+#endif  /* WORD_SIZE >= 32 */
+
+#if WORD_SIZE >= 64
+static INLINE
+value_t
+peek_int64(int64_t *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_int64(int64_t *p, value_t w)
+{
+  *p = (int64_t)w;
+}
+#endif  /* WORD_SIZE >= 64 */
+
+static INLINE
+value_t
+peek_int(int *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_int(int *p, value_t w)
+{
+  *p = (int)w;
+}
+
+static INLINE
+value_t
+peek_uint(unsigned int *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_uint(unsigned int *p, value_t w)
+{
+  *p = (unsigned int)w;
+}
+
+static INLINE
+value_t
+peek_short(short *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_short(short *p, value_t w)
+{
+  *p = (short)w;
+}
+
+static INLINE
+value_t
+peek_ushort(unsigned short *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_ushort(unsigned short *p, value_t w)
+{
+  *p = (unsigned short)w;
+}
+
+static INLINE
+value_t
+peek_long(long *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_long(long *p, value_t w)
+{
+  *p = (long)w;
+}
+
+static INLINE
+value_t
+peek_ulong(unsigned long *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_ulong(unsigned long *p, value_t w)
+{
+  *p = (unsigned long)w;
+}
+
+static INLINE
+value_t
+peek_llong(long long *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_llong(long long *p, value_t w)
+{
+  *p = (long long)w;
+}
+
+static INLINE
+value_t
+peek_ullong(unsigned long long *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_ullong(unsigned long long *p, value_t w)
+{
+  *p = (unsigned long long)w;
+}
+
+#if WANT_FLOAT
+static INLINE
+flt_t
+peek_flt(flt_t *p)
+{
+  return *p;
+}
+
+static INLINE
+void
+poke_flt(flt_t *p, flt_t w)
+{
+  *p = w;
+}
+#endif  /* WANT_FLOAT */
+
+/* Look up an FFI function by name */
+value_t
+lookupFFIname(const char *name)
+{
+  size_t i;
+
+  for(i = 0; ffi_table[i].ffi_name; i++)
+    if (strcmp(ffi_table[i].ffi_name, name) == 0)
+      return (value_t)i;
+  if (xffi_table) {
+    for(i = 0; xffi_table[i].ffi_name; i++)
+      if (strcmp(xffi_table[i].ffi_name, name) == 0)
+        return (value_t)(i + num_ffi);
+  }
+  return -1;
+}
+
+NODEPTR
+ffiNode(const char *buf)
+{
+  NODEPTR r;
+  value_t i = lookupFFIname(buf);
+  char *fun;
+
+  if (i < 0) {
+    /* lookup failed, generate a node that will dynamically generate an error */
+    r = alloc_node(T_BADDYN);
+    fun = MALLOC(strlen(buf) + 1);
+    strcpy(fun, buf);
+    CSTR(r) = fun;
+  } else {
+    r = alloc_node(T_IO_CCALL);
+    SETVALUE(r, i);
+  }
+  return r;
+}
+
+/* If the next input character is c, then consume it, else leave it alone. */
+int
+gobble(BFILE *f, int c)
+{
+  int d = getb(f);
+  if (c == d) {
+    return 1;
+  } else {
+    ungetb(d, f);
+    return 0;
+  }
+}
+
+/* Get a non-terminating character.  ' ' and '\n' terminates a token. */
+int
+getNT(BFILE *f)
+{
+  int c;
+
+  c = getb(f);
+  if (c == ' ' || c == '\n') {
+    return 0;
+  } else {
+    return c;
+  }
+}
+
+value_t
+parse_int(BFILE *f)
+{
+  // Parse using uvalue_t, which wraps on overflow.
+  uvalue_t i = 0;
+  int neg = 1;
+  int c = getb(f);
+  if (c == '-') {
+    neg = -1;
+    c = getb(f);
+  }
+  for(;;) {
+    i = i * 10 + (c - '0');
+    c = getb(f);
+    if (c < '0' || c > '9') {
+      ungetb(c, f);
+      break;
+    }
+  }
+  // Multiply by neg without triggering undefined behavior.
+  return (value_t)(((uvalue_t)neg) * i);
+}
+
+#if WANT_FLOAT
+flt_t
+parse_double(BFILE *f)
+{
+  // apparently longest float, when rendered, takes up 24 characters. We add one more for a potential
+  // minus sign, and another one for the final null terminator.
+  // https://stackoverflow.com/questions/1701055/what-is-the-maximum-length-in-chars-needed-to-represent-any-double-value
+  char buf[26];
+  for(int j = 0; (buf[j] = getNT(f)); j++)
+    ;
+
+  return strtod(buf, NULL);
+}
+#endif
+
+struct forptr *mkForPtr(struct bytestring bs);
+NODEPTR mkFunPtr(HsFunPtr p);
+
+/* Create a forptr that has a free() finalizer. */
+struct forptr *
+mkForPtrFree(struct bytestring str)
+{
+  struct forptr *fp = mkForPtr(str);         /* Create a foreign pointer */
+  fp->finalizer->final = (HsFunPtr)FREE;     /* and set the finalizer to just free it */
+  return fp;
+}
+
+NODEPTR
+mkStrNode(struct bytestring str)
+{
+  NODEPTR n = alloc_node(T_FORPTR);
+  struct forptr *fp = mkForPtrFree(str);
+  FORPTR(n) = fp;
+  fp->finalizer->fptype = FP_BSTR;
+  //printf("mkForPtr n=%p fp=%p %d %s payload.string=%p\n", n, fp, (int)FORPTR(n)->payload.size, (char*)FORPTR(n)->payload.string, FORPTR(n)->payload.string);
+  return n;
+}
+
+NODEPTR mkInt(value_t i);
+NODEPTR mkFlt(flt_t d);
+NODEPTR mkPtr(void* p);
+
+/* Table of labelled nodes for sharing during parsing. */
+struct shared_entry {
+  heapoffs_t label;
+  NODEPTR node;                 /* NIL indicates unused */
+} *shared_table;
+heapoffs_t shared_table_size;
+
+/* Look for the label in the table.
+ * If it's found, return the node.
+ * If not found, return the first empty entry.
+*/
+NODEPTR *
+find_label(heapoffs_t label)
+{
+  int i;
+
+  for(i = (int)label; ; i++) {
+    i %= shared_table_size;
+    if (shared_table[i].node == NIL) {
+      /* The slot is empty, so claim and return it */
+      shared_table[i].label = label;
+      return &shared_table[i].node;
+    } else if (shared_table[i].label == label) {
+      /* Found the label, so return it. */
+      return &shared_table[i].node;
+    }
+    /* Not empty and not found, try next. */
+  }
+}
+
+/* The memory allocated here is never freed.
+ * This could be fixed by using a forptr and a
+ * finalizer for read UTF-8 strings.
+ * Fix this if there is a lot of deserialization.
+ */
+struct bytestring
+parse_string(BFILE *f)
+{
+  struct bytestring bs;
+  size_t sz = 20;
+  uint8_t *buffer = MALLOC(sz);
+  size_t i;
+  int c;
+
+  if (!buffer)
+    memerr();
+  for(i = 0;;) {
+    c = getb(f);
+    if (c == '"')
+      break;
+    if (i >= sz - 1) {
+      sz *= 2;
+      buffer = REALLOC(buffer, sz);
+      if (!buffer)
+        memerr();
+    }
+#if 0
+    if (c == '\\') {
+      buffer[i++] = (uint8_t)parse_int(f);
+      if (!gobble(f, '&'))
+        ERR("parse string");
+    } else {
+      buffer[i++] = c;
+    }
+#else
+    /* See src/MicroHs/ExpPrint.hs for how strings are encoded. */
+    switch (c) {
+    case '\\':
+      c = getb(f);
+      if (c == '?')
+        c = 0x7f;
+      else if (c == '_')
+        c = 0xff;
+      break;
+    case '^':
+      c = getb(f);
+      if (c < 0x40)
+        c &= 0x1f;
+      else
+        c = (c & 0x1f) | 0x80;
+      break;
+    case '|':
+      c = getb(f);
+      c |= 0x80;
+      break;
+    default:
+      /* Unencoded */
+      ;
+    }
+    buffer[i++] = c;
+#endif
+  }
+  buffer[i] = 0;                /* add a trailing 0 in case we need a C string */
+  buffer = REALLOC(buffer, i + 1);
+
+  bs.size = i;
+  bs.string = buffer;
+  //printf("parse_string %d %s\n", (int)bs.size, (char*)bs.string);
+  return bs;
+}
+
+struct forptr *new_mpz(void);
+
+NODEPTR
+parse(BFILE *f)
+{
+  stackptr_t stk = stack_ptr;
+  NODEPTR r, x, y;
+  NODEPTR *nodep;
+  heapoffs_t l;
+  value_t i;
+  int c;
+  size_t j;
+  char buf[80];                 /* store names of primitives. */
+
+  for(;;) {
+    c = getb(f);
+    if (c < 0) ERR("parse EOF");
+    switch (c) {
+    case ' ':
+    case '\n':
+      continue;
+    }
+    if (num_free < 3)
+      ERR("out of heap reading code");
+    GCCHECK(1);
+    switch(c) {
+    case '@':
+      x = TOP(0);
+      y = TOP(1);
+      POP(2);
+      PUSH(new_ap(y, x));
+      break;
+    case '}':
+      x = TOP(0);
+      POP(1);
+      if (stack_ptr != stk)
+        ERR("parse: stack");
+      return x;
+#if WANT_GMP
+    case '%':
+      {
+        struct bytestring bs = parse_string(f); /* get all the digits, terminated by " */
+        struct forptr *fp = new_mpz();          /* a new mpz */
+        mpz_ptr op = fp->payload.string;        /* get actual pointer */
+        mpz_set_str(op, bs.string, 10);         /* convert to an mpz */
+        free(bs.string);
+        r = alloc_node(T_FORPTR);
+        FORPTR(r) = fp;
+        PUSH(r);
+        break;
+      }
+#endif
+    case '&':
+#if WANT_FLOAT
+      r = mkFlt(parse_double(f));
+#else
+      while (getNT(f))          /* skip the float constant */
+        ;
+      r = alloc_node(T_DBL);
+      SETVALUE(r, 0);
+#endif
+      PUSH(r);
+      break;
+    case '#':
+      i = parse_int(f);
+      r = mkInt(i);
+      PUSH(r);
+      break;
+    case '[':
+      {
+        size_t sz;
+        struct ioarray *arr;
+        size_t i;
+        sz = (size_t)parse_int(f);
+        if (!gobble(f, ']')) ERR("parse arr 1");
+        arr = arr_alloc(sz, NIL);
+        for (i = 0; i < sz; i++) {
+          arr->array[i] = TOP(sz - i - 1);
+        }
+        r = alloc_node(T_ARR);
+        ARR(r) = arr;
+        POP(sz);
+        PUSH(r);
+        break;
+      }
+    case '_':
+      /* Reference to a shared value: _label */
+      l = parse_int(f);  /* The label */
+      nodep = find_label(l);
+      if (*nodep == NIL) {
+        /* Not yet defined, so make it an indirection */
+        *nodep = alloc_node(T_FREE);
+        SETINDIR(*nodep, NIL);
+      }
+      PUSH(*nodep);
+      break;
+    case ':':
+      /* Define a shared expression: :label e */
+      l = parse_int(f);  /* The label */
+      if (!gobble(f, ' ')) ERR("parse ' '");
+      nodep = find_label(l);
+      x = TOP(0);
+      if (*nodep == NIL) {
+        /* not referenced yet, so add a direct reference */
+        *nodep = x;
+      } else {
+        /* Sanity check */
+        if (GETTAG(*nodep) != T_IND || GETINDIR(*nodep) != NIL) ERR("shared != NIL");
+        SETINDIR(*nodep, x);
+      }
+      break;
+    case '"':
+      /* Everything up to the next " is a string.
+       * Special characters are encoded as \NNN&,
+       * where NNN is the decimal value of the character */
+      PUSH(mkStrNode(parse_string(f)));
+      break;
+#if WANT_TICK
+    case '!':
+      if (!gobble(f, '"'))
+        ERR("parse !");
+      i = add_tick_table(parse_string(f));
+      r = alloc_node(T_TICK);
+      SETVALUE(r, (value_t)i);
+      PUSH(r);
+      break;
+#endif
+    case '^':
+      /* An FFI name */
+      for (j = 0; (buf[j] = getNT(f)); j++)
+        ;
+      r = ffiNode(buf);
+      PUSH(r);
+      break;
+    case ';':
+      /* <name is a C function pointer to name */
+      for (j = 0; (buf[j] = getNT(f)); j++)
+        ;
+      if (strcmp(buf, "0") == 0) {
+        PUSH(mkFunPtr((HsFunPtr)0));
+      } else if (strcmp(buf, "closeb") == 0) {
+        PUSH(mkFunPtr((HsFunPtr)closeb));
+      } else {
+        ERR1("unknown funptr '%s'", buf);
+      }
+      break;
+    default:
+      buf[0] = c;
+      /* A primitive, keep getting char's until end */
+      for (j = 1; (buf[j] = getNT(f)); j++)
+        ;
+      /* Look up the primop and use the preallocated node. */
+      for (j = 0; j < sizeof primops / sizeof primops[0]; j++) {
+        if (strcmp(primops[j].name, buf) == 0) {
+          r = primops[j].node;
+          goto found;
+        }
+      }
+      ERR1("no primop %s", buf);
+    found:
+      PUSH(r);
+      break;
+    }
+  }
+}
+
+void
+checkversion(BFILE *f)
+{
+  char *p = VERSION;
+  int c;
+
+  while ((c = *p++)) {
+    if (c != getb(f))
+      ERR("version mismatch");
+  }
+  (void)gobble(f, '\r');                 /* allow extra CR */
+}
+
+/* Parse a file */
+NODEPTR
+parse_top(BFILE *f)
+{
+  heapoffs_t numLabels, i;
+  NODEPTR n;
+  checkversion(f);
+  numLabels = parse_int(f);
+  if (!gobble(f, '\n'))
+    ERR("size parse");
+  gobble(f, '\r');                 /* allow extra CR */
+  shared_table_size = 3 * numLabels; /* sparsely populated hashtable */
+  shared_table = MALLOC(shared_table_size * sizeof(struct shared_entry));
+  if (!shared_table)
+    memerr();
+  for(i = 0; i < shared_table_size; i++)
+    shared_table[i].node = NIL;
+  n = parse(f);
+  FREE(shared_table);
+  return n;
+}
+
+#if WANT_STDIO
+NODEPTR
+parse_file(const char *fn, size_t *psize)
+{
+  FILE *f = fopen(fn, "r");
+  if (!f)
+    ERR1("file not found %s", fn);
+
+  /* And parse it */
+  BFILE *p = add_FILE(f);
+  NODEPTR n = parse_top(p);
+  *psize = ftell(f);
+  closeb(p);
+  return n;
+}
+#endif  /* WANT_STDIO */
+
+counter_t num_shared;
+
+/* Two bits per node: marked, shared
+ * 0, 0   -- not visited
+ * 1, 0   -- visited once
+ * 1, 1   -- visited more than once
+ * 0, 1   -- printed
+ */
+struct print_bits {
+  bits_t *marked_bits;
+  bits_t *shared_bits;
+};
+static INLINE void set_bit(bits_t *bits, NODEPTR n)
+{
+  heapoffs_t i = LABEL(n);
+  bits[i / BITS_PER_WORD] |= (1ULL << (i % BITS_PER_WORD));
+}
+#if WANT_STDIO
+static INLINE void clear_bit(bits_t *bits, NODEPTR n)
+{
+  heapoffs_t i = LABEL(n);
+  bits[i / BITS_PER_WORD] &= ~(1ULL << (i % BITS_PER_WORD));
+}
+#endif
+static INLINE int test_bit(bits_t *bits, NODEPTR n)
+{
+  heapoffs_t i = LABEL(n);
+  return (bits[i / BITS_PER_WORD] & (1ULL << (i % BITS_PER_WORD))) != 0;
+}
+
+size_t strNodes(size_t len);
+NODEPTR mkStringC(char *str);
+
+#if WANT_STDIO
+#if WORD_SIZE == 64
+#define CONVDBL "%.16g"
+#elif WORD_SIZE == 32
+#define CONVDBL "%.8g"
+#endif
+void
+convdbl(char *str, flt_t x)
+{
+  /* Using 16 decimals will lose some precision.
+   * 17 would keep the precision, but it frequently looks very ugly.
+   */
+  (void)snprintf(str, 25, CONVDBL, x);
+  if (strcmp(str, "nan") != 0 && strcmp(str, "-nan") != 0 &&
+      strcmp(str, "inf") != 0 && strcmp(str, "-inf") != 0 &&
+      !strchr(str, '.') && !strchr(str, 'e') && !strchr(str, 'E')) {
+    /* There is no decimal point and no exponent, so add a decimal point */
+    strcat(str, ".0");
+  }
+}
+
+NODEPTR
+dblToString(flt_t x)
+{
+  char str[30];
+  convdbl(str, x);
+  // turn it into a mhs string
+  GCCHECK(strNodes(strlen(str)));
+  return mkStringC(str);
+}
+
+void
+putdblb(flt_t x, BFILE *p)
+{
+  char str[30];
+  convdbl(str, x);
+  putsb(str, p);
+}
+
+void printrec(BFILE *f, struct print_bits *pb, NODEPTR n, int prefix);
+
+/* Mark all reachable nodes, when a marked node is reached, mark it as shared. */
+void
+find_sharing(struct print_bits *pb, NODEPTR n)
+{
+ top:
+  while (GETTAG(n) == T_IND) {
+    n = GETINDIR(n);
+  }
+  if (n < cells || n >= cells + heap_size) abort();
+  //PRINT("find_sharing %p %llu ", n, LABEL(n));
+  tag_t tag = GETTAG(n);
+  if (tag == T_AP || tag == T_ARR || tag == T_FORPTR) {
+    if (test_bit(pb->shared_bits, n)) {
+      /* Alread marked as shared */
+      //PRINT("shared\n");
+      ;
+    } else if (test_bit(pb->marked_bits, n)) {
+      /* Already marked, so now mark as shared */
+      //PRINT("marked\n");
+      set_bit(pb->shared_bits, n);
+      num_shared++;
+    } else {
+      /* Mark as visited, and recurse */
+      //PRINT("unmarked\n");
+      set_bit(pb->marked_bits, n);
+      switch(tag) {
+      case T_AP:
+        find_sharing(pb, FUN(n));
+        n = ARG(n);
+        goto top;
+      case T_ARR:
+        for(size_t i = 0; i < ARR(n)->size; i++) {
+          find_sharing(pb, ARR(n)->array[i]);
+        }
+        break;
+      default:
+        break;
+      }
+    }
+  } else {
+    /* Not an sharable node, so do nothing */
+    //PRINT("not T_AP\n");
+    ;
+  }
+}
+
+void
+print_string(BFILE *f, struct bytestring bs)
+{
+  uint8_t *str = bs.string;
+  putb('"', f);
+  for (size_t i = 0; i < bs.size; i++) {
+    int c = str[i];
+#if 0
+    if (c == '"' || c == '\\' || c < ' ' || c > '~') {
+      putb('\\', f);
+      putdecb(c, f);
+      putb('&', f);
+    } else {
+      putb(c, f);
+    }
+#else
+    if (c < 0 || c > 0xff)
+      ERR("print_string");
+    if (c < 0x20) {
+      putb('^', f); putb(c + 0x20, f);
+    } else if (c == '"' || c == '^' || c == '|' || c == '\\') {
+      putb('\\', f); putb(c, f);
+    } else if (c < 0x7f) {
+      putb(c, f);
+    } else if (c == 0x7f) {
+      putb('\\', f); putb('?', f);
+    } else if (c < 0xa0) {
+      putb('^', f); putb(c - 0x80 + 0x40, f);
+    } else if (c < 0xff) {
+      putb('|', f); putb(c - 0x80, f);
+    } else {                    /* must be c == 0xff */
+      putb('\\', f); putb('_', f);
+    }
+#endif
+  }
+  putb('"', f);
+}
+
+/*
+ * Recursively print an expression.
+ * This assumes that the shared nodes has been marked as such.
+ * The prefix flag is used to get a readable dump.
+ */
+void
+printrec(BFILE *f, struct print_bits *pb, NODEPTR n, int prefix)
+{
+  int share = 0;
+  enum node_tag tag;
+
+  while (GETTAG(n) == T_IND) {
+    //putb('*', f);
+    n = GETINDIR(n);
+  }
+
+  if (test_bit(pb->shared_bits, n)) {
+    /* The node is shared */
+    if (test_bit(pb->marked_bits, n)) {
+      /* Not yet printed, so emit a label */
+      if (prefix) {
+        putb(':', f);
+        putdecb((value_t)LABEL(n), f);
+        putb(' ', f);
+      } else {
+        share = 1;
+      }
+      clear_bit(pb->marked_bits, n);  /* mark as printed */
+    } else {
+      /* This node has already been printed, so just use a reference. */
+      putb('_', f);
+      putdecb((value_t)LABEL(n), f);
+      if (!prefix)
+        putb(' ', f);
+      return;
+    }
+  }
+
+  //if (n == atptr) putb('@', f);
+  tag = GETTAG(n);
+  switch (tag) {
+  case T_AP:
+    if (prefix) {
+      putb('(', f);
+      printrec(f, pb, FUN(n), prefix);
+      putb(' ', f);
+      printrec(f, pb, ARG(n), prefix);
+      putb(')', f);
+    } else {
+      printrec(f, pb, FUN(n), prefix);
+      printrec(f, pb, ARG(n), prefix);
+      putb('@', f);
+    }
+    break;
+  case T_INT: putb('#', f); putdecb(GETVALUE(n), f); break;
+  case T_DBL: putb('&', f); putdblb(GETDBLVALUE(n), f); break;
+  case T_ARR:
+    if (prefix) {
+      /* Arrays serialize as '[sz] e_1 ... e_sz' */
+      putb('[', f);
+      putdecb((value_t)ARR(n)->size, f);
+      putb(']', f);
+      for(size_t i = 0; i < ARR(n)->size; i++) {
+        putb(' ', f);
+        printrec(f, pb, ARR(n)->array[i], prefix);
+      }
+    } else {
+      /* Arrays serialize as 'e_1 ... e_sz [sz]' */
+      for(size_t i = 0; i < ARR(n)->size; i++) {
+        printrec(f, pb, ARR(n)->array[i], prefix);
+      }
+      putb('[', f);
+      putdecb((value_t)ARR(n)->size, f);
+      putb(']', f);
+    }
+    break;
+  case T_PTR:
+    if (prefix) {
+      char b[200]; snprintf(b,200,"PTR<%p>",PTR(n));
+      putsb(b, f);
+    } else {
+      ERR("Cannot serialize pointers");
+    }
+    break;
+  case T_FUNPTR:
+    /* There are a few function pointers that happen without user FFI.
+     * We need to be able to serialize these.
+     * XXX Make a table if we need more.
+     */
+    if (FUNPTR(n) == 0) {
+      putsb(";0 ", f);
+    } else if (FUNPTR(n) == (HsFunPtr)closeb) {
+      putsb(";closeb ", f);
+    } else {
+      ERR1("Cannot serialize function pointers %p", FUNPTR(n));
+    }
+    break;
+  case T_FORPTR:
+    if (n == comb_stdin)
+      putsb("IO.stdin", f);
+    else if (n == comb_stdout)
+      putsb("IO.stdout", f);
+    else if (n == comb_stderr)
+      putsb("IO.stderr", f);
+#if WANT_GMP
+    else if (FORPTR(n)->finalizer->fptype == FP_MPZ) {
+      /* Serialize as %99999" */
+      mpz_ptr op = FORPTR(n)->payload.string; /* get the mpz */
+      int sz = mpz_sizeinbase(op, 10);        /* maximum length */
+      char *s = malloc(sz + 2);
+      if (!s)
+        memerr();
+      (void)mpz_get_str(s, 10, op);           /* convert to a string */
+      putsb("%", f);
+      putsb(s, f);
+      putsb("\"", f);                         /* so we can use parse_string */
+      free(s);
+    }
+#endif  /* WANT_GMP */
+    else if (FORPTR(n)->finalizer->fptype == FP_BSTR) {
+      print_string(f, FORPTR(n)->payload);
+    } else {
+      ERR("Cannot serialize foreign pointers");
+    }
+    break;
+  case T_IO_CCALL: putb('^', f); putsb(FFI_IX(GETVALUE(n)).ffi_name, f); break;
+  case T_BADDYN: putb('^', f); putsb(CSTR(n), f); break;
+
+  case T_TICK:
+    putb('!', f);
+    print_string(f, tick_table[GETVALUE(n)].tick_name);
+    break;
+  default:
+    putsb(tag_names[tag], f);
+    break;
+  }
+  if (!prefix) {
+    if (GETTAG(n) != T_AP)
+      putb(' ', f);
+    if (share) {
+      putb(':', f);
+      putdecb((value_t)LABEL(n), f);
+      putb(' ', f);
+    }
+  }
+}
+
+/* Serialize a graph to file. */
+void
+printb(BFILE *f, NODEPTR n, int header)
+{
+  struct print_bits pb;
+  num_shared = 0;
+  pb.marked_bits = calloc(free_map_nwords, sizeof(bits_t));
+  if (!pb.marked_bits)
+    memerr();
+  pb.shared_bits = calloc(free_map_nwords, sizeof(bits_t));
+  if (!pb.shared_bits)
+    memerr();
+  find_sharing(&pb, n);
+  if (header) {
+    putsb(VERSION, f);
+    putdecb(num_shared, f);
+    putb('\n', f);
+  }
+  printrec(f, &pb, n, !header);
+  if (header) {
+    putb('}', f);
+  }
+  FREE(pb.marked_bits);
+  FREE(pb.shared_bits);
+}
+
+/* Show a graph. */
+void
+pp(FILE *f, NODEPTR n)
+{
+  BFILE *bf = add_FILE(f);
+  printb(bf, n, 0);
+  putb('\n', bf);
+  freeb_file(bf);
+}
+
+#if 0
+void
+ppmsg(const char *msg, NODEPTR n)
+{
+  printf("%s", msg);
+  pp(stdout, n);
+  printf("\n");
+}
+#endif
+
+void
+dump(const char *msg, NODEPTR at)
+{
+#if 0
+  atptr = at;
+  printf("dump: %s\n", msg);
+  pp(stdout, *topnode);
+#endif
+}
+
+#else  /* WANT_STDIO */
+NODEPTR
+dblToString(flt_t x)
+{
+  return mkStringC("no dblToString");
+}
+
+#endif  /* WANT_STDIO */
+
+NODEPTR
+mkInt(value_t i)
+{
+#if INTTABLE
+  if (LOW_INT <= i && i < HIGH_INT) {
+    return intTable[i - LOW_INT];
+  }
+#endif
+
+  NODEPTR n;
+  n = alloc_node(T_INT);
+  SETVALUE(n, i);
+  return n;
+}
+
+NODEPTR
+mkFlt(flt_t d)
+{
+  NODEPTR n;
+  n = alloc_node(T_DBL);
+  SETDBLVALUE(n, d);
+  return n;
+}
+
+NODEPTR
+mkPtr(void* p)
+{
+  NODEPTR n;
+  n = alloc_node(T_PTR);
+  PTR(n) = p;
+  return n;
+}
+
+NODEPTR
+mkFunPtr(void (*p)(void))
+{
+  NODEPTR n;
+  n = alloc_node(T_FUNPTR);
+  FUNPTR(n) = p;
+  return n;
+}
+
+struct forptr*
+mkForPtr(struct bytestring bs)
+{
+  struct final *fin = calloc(1, sizeof(struct final));
+  struct forptr *fp = calloc(1, sizeof(struct forptr));
+  if (!fin || !fp)
+    memerr();
+  if (bs.size == NOSIZE) {
+    num_fin_alloc++;
+  } else {
+    num_bs_alloc++;
+    num_bs_inuse += bs.size;
+    num_bs_bytes += bs.size;
+    if (num_bs_inuse > num_bs_inuse_max)
+      num_bs_inuse_max = num_bs_inuse;
+  }
+  //printf("mkForPtr p=%p fin=%p fp=%p\n", p, fin, fp);
+  fin->next = final_root;
+  final_root = fin;
+  fin->final = 0;
+  fin->arg = bs.string;
+  fin->size = bs.size;          /* The size is not really needed */
+  fin->back = fp;
+  fin->marked = 0;
+  fp->next = 0;
+  fp->payload = bs;
+  fp->finalizer = fin;
+  //  fp->desc = 0;
+  return fp;
+}
+
+struct forptr*
+mkForPtrP(void *p)
+{
+  struct bytestring bs = { NOSIZE, p };
+  return mkForPtr(bs);
+}
+
+struct forptr*
+addForPtr(struct forptr *ofp, int s)
+{
+  struct forptr *fp = malloc(sizeof(struct forptr));
+  struct final *fin = ofp->finalizer;
+  if (!fp)
+    memerr();
+  fp->next = ofp;
+  fin->back = fp;
+  if (ofp->payload.size != NOSIZE)
+    fp->payload.size = ofp->payload.size - s;
+  fp->payload.string = (uint8_t*)ofp->payload.string + s;
+  fp->finalizer = fin;
+  return fp;
+}
+
+struct forptr*
+bssubstr(struct forptr *fp, value_t offs, value_t len)
+{
+  struct forptr *res = addForPtr(fp, offs);
+  res->payload.size = len;
+  return res;
+}
+
+static INLINE NODEPTR
+mkNil(void)
+{
+  return combFalse;
+}
+
+static INLINE NODEPTR
+mkCons(NODEPTR x, NODEPTR xs)
+{
+  return new_ap(new_ap(combCons, x), xs);
+}
+
+size_t
+strNodes(size_t len)
+{
+  /* Each character will need a CHAR node and a CONS node, a CONS uses 2 T_AP nodes */
+  len *= (1 + 2);
+  /* And each string will need a NIL */
+  len += 1;
+  return len;
+}
+
+/* Turn a C string into a combinator string.
+ * Does NOT do UTF decoding.
+ */
+NODEPTR
+mkString(struct bytestring bs)
+{
+  NODEPTR n, nc;
+  size_t i;
+  const unsigned char *str = bs.string; /* no sign bits, please */
+
+  n = mkNil();
+  for(i = bs.size; i > 0; i--) {
+    nc = mkInt(str[i-1]);
+    n = mkCons(nc, n);
+  }
+  return n;
+}
+
+NODEPTR
+mkStringC(char *str)
+{
+  struct bytestring bs = { strlen(str), str };
+  return mkString(bs);
+}
+
+NODEPTR
+mkStringU(struct bytestring bs)
+{
+  BFILE *ubuf = add_utf8(openb_rd_buf(bs.string, bs.size));
+  NODEPTR n, *np, nc;
+
+  //printf("mkStringU %d %s\n", (int)bs.size, (char*)bs.string);
+
+  n = mkNil();
+  np = &n;
+  for(;;) {
+    int c = getb(ubuf);
+    if (c < 0)
+      break;
+    nc = mkInt(c);
+    *np = mkCons(nc, *np);
+    np = &ARG(*np);
+  }
+  closeb(ubuf);
+  return n;
+}
+
+NODEPTR
+bsunpack(struct bytestring bs)
+{
+  NODEPTR n, *np, nc;
+  size_t i;
+
+  n = mkNil();
+  np = &n;
+  for(i = 0; i < bs.size; i++) {
+    nc = mkInt(((uint8_t *)bs.string)[i]);
+    *np = mkCons(nc, *np);
+    np = &ARG(*np);
+  }
+  return n;
+}
+
+/* XXX This should somehow be merged with other utf8 decoders */
+value_t
+headutf8(struct bytestring bs, void **ret)
+{
+  uint8_t *p = bs.string;
+  if (bs.size == 0)
+    ERR("headUTF8 0");
+  int c1 = *p++;
+  if ((c1 & 0x80) == 0) {
+    if (ret)
+      *ret = p;
+    return c1;
+  }
+  if (bs.size == 1)
+    ERR("headUTF8 1");
+  int c2 = *p++;
+  if ((c1 & 0xe0) == 0xc0) {
+    if (ret)
+      *ret = p;
+    return ((c1 & 0x1f) << 6) | (c2 & 0x3f);
+  }
+  if (bs.size == 2)
+    ERR("headUTF8 2");
+  int c3 = *p++;
+  if ((c1 & 0xf0) == 0xe0) {
+    if (ret)
+      *ret = p;
+    return ((c1 & 0x0f) << 12) | ((c2 & 0x3f) << 6) | (c3 & 0x3f);
+  }
+  if (bs.size == 3)
+    ERR("headUTF8 3");
+  int c4 = *p++;
+  if ((c1 & 0xf8) == 0xf0) {
+    if (ret)
+      *ret = p;
+    return ((c1 & 0x07) << 18) | ((c2 & 0x3f) << 12) | ((c3 & 0x3f) << 6) | (c4 & 0x3f);
+  }
+  ERR("headUTF8 4");
+}
+
+NODEPTR evali(NODEPTR n);
+
+/* Evaluate to an INT */
+static INLINE value_t
+evalint(NODEPTR n)
+{
+  n = evali(n);
+#if SANITY
+  if (GETTAG(n) != T_INT) {
+    ERR1("evalint, bad tag %d", GETTAG(n));
+  }
+#endif
+  return GETVALUE(n);
+}
+
+/* Evaluate to a Flt_T */
+static INLINE flt_t
+evaldbl(NODEPTR n)
+{
+  n = evali(n);
+#if SANITY
+  if (GETTAG(n) != T_DBL) {
+    ERR1("evaldbl, bad tag %d", GETTAG(n));
+  }
+#endif
+  return GETDBLVALUE(n);
+}
+
+/* Evaluate to a T_PTR */
+void *
+evalptr(NODEPTR n)
+{
+  n = evali(n);
+#if SANITY
+  if (GETTAG(n) != T_PTR) {
+    ERR1("evalptr, bad tag %d", GETTAG(n));
+  }
+#endif
+  return PTR(n);
+}
+
+/* Evaluate to a T_FUNPTR */
+HsFunPtr
+evalfunptr(NODEPTR n)
+{
+  n = evali(n);
+#if SANITY
+  if (GETTAG(n) != T_FUNPTR) {
+    ERR1("evalfunptr, bad tag %d", GETTAG(n));
+  }
+#endif
+  return FUNPTR(n);
+}
+
+/* Evaluate to a T_FORPTR */
+struct forptr *
+evalforptr(NODEPTR n)
+{
+  n = evali(n);
+#if SANITY
+  if (GETTAG(n) != T_FORPTR) {
+    ERR1("evalforptr, bad tag %d", GETTAG(n));
+  }
+#endif
+  return FORPTR(n);
+}
+
+/* Evaluate to a bytestring */
+struct forptr *
+evalbstr(NODEPTR n)
+{
+  n = evali(n);
+#if SANITY
+  if (GETTAG(n) != T_FORPTR || FORPTR(n)->finalizer->fptype != FP_BSTR) {
+    ERR1("evalbstr, bad tag %d", GETTAG(n));
+  }
+#endif
+  return FORPTR(n);
+}
+
+/* Evaluate a string, returns a newly allocated buffer.
+ * XXX this is cheating, should use continuations.
+ * XXX the malloc()ed string is leaked if we yield in here.
+ * Caller is responsible to free().
+ * Does UTF-8 encoding.
+ */
+struct bytestring
+evalstring(NODEPTR n)
+{
+  size_t sz = 100;
+  char *buf = MALLOC(sz);
+  size_t offs;
+  uvalue_t c;
+  NODEPTR x;
+  struct bytestring bs;
+
+  if (!buf)
+    memerr();
+  for (offs = 0;;) {
+    if (offs >= sz - 4) {
+      sz *= 2;
+      buf = REALLOC(buf, sz);
+      if (!buf)
+        memerr();
+    }
+    PUSH(n);                    /* protect the list from GC */
+    n = evali(n);
+    POP(1);
+    if (GETTAG(n) == T_K)       /* Nil */
+      break;
+    else if (GETTAG(n) == T_AP && GETTAG(x = indir(&FUN(n))) == T_AP && GETTAG(indir(&FUN(x))) == T_O) { /* Cons */
+      PUSH(n);                  /* protect from GC */
+      c = evalint(ARG(x));
+      n = POPTOP();
+      if ((c & 0x1ff800) == 0xd800) {
+        // c is a surrogate
+        c = 0xfffd; // replacement character
+      }
+      if (c < 0x80) {
+        buf[offs++] = (char)c;
+      } else if (c < 0x800) {
+        buf[offs++] = ((c >> 6 )       ) | 0xc0;
+        buf[offs++] = ((c      ) & 0x3f) | 0x80;
+      } else if (c < 0x10000) {
+        buf[offs++] = ((c >> 12)       ) | 0xe0;
+        buf[offs++] = ((c >> 6 ) & 0x3f) | 0x80;
+        buf[offs++] = ((c      ) & 0x3f) | 0x80;
+      } else if (c < 0x110000) {
+        buf[offs++] = ((c >> 18)       ) | 0xf0;
+        buf[offs++] = ((c >> 12) & 0x3f) | 0x80;
+        buf[offs++] = ((c >> 6 ) & 0x3f) | 0x80;
+        buf[offs++] = ((c      ) & 0x3f) | 0x80;
+      } else {
+	ERR("invalid char");
+      }
+      n = ARG(n);
+    } else {
+      ERR("evalstring not Nil/Cons");
+    }
+  }
+  buf[offs] = 0;                /* in case we use it as a C string */
+  bs.size = offs;
+  bs.string = buf;
+  return bs;
+}
+
+/* Does not do UTF-8 encoding */
+struct bytestring
+evalbytestring(NODEPTR n)
+{
+  size_t sz = 100;
+  uint8_t *buf = MALLOC(sz);
+  size_t offs;
+  uvalue_t c;
+  NODEPTR x;
+  struct bytestring bs;
+
+  if (!buf)
+    memerr();
+  for (offs = 0;;) {
+    if (offs >= sz - 1) {
+      sz *= 2;
+      buf = REALLOC(buf, sz);
+      if (!buf)
+        memerr();
+    }
+    PUSH(n);                    /* protect list from GC */
+    n = evali(n);
+    POP(1);
+    if (GETTAG(n) == T_K)       /* Nil */
+      break;
+    else if (GETTAG(n) == T_AP && GETTAG(x = indir(&FUN(n))) == T_AP && GETTAG(indir(&FUN(x))) == T_O) { /* Cons */
+      PUSH(n);                  /* protect from GC */
+      c = evalint(ARG(x));
+      n = POPTOP();
+      buf[offs++] = c;
+      n = ARG(n);
+    } else {
+      //pp(stdout, n);
+      ERR("evalbytestring not Nil/Cons");
+    }
+  }
+  buf[offs] = 0;                /* in case we use it as a C string */
+  bs.size = offs;
+  bs.string = buf;
+  return bs;
+}
+
+struct bytestring
+bsreplicate(size_t size, uint8_t value)
+{
+  struct bytestring bs;
+  bs.size = size;
+  bs.string = MALLOC(size);
+  if (!bs.string)
+    memerr();
+  memset(bs.string, value, size);
+  return bs;
+}
+
+struct bytestring
+bsappend(struct bytestring p, struct bytestring q)
+{
+  struct bytestring r;
+  r.size = p.size + q.size;
+  r.string = MALLOC(r.size);
+  if (!r.string)
+    memerr();
+  memcpy(r.string, p.string, p.size);
+  memcpy((uint8_t *)r.string + p.size, q.string, q.size);
+  return r;
+}
+
+struct bytestring
+bsappenddot(struct bytestring p, struct bytestring q)
+{
+  struct bytestring r;
+  r.size = p.size + q.size + 1;
+  r.string = MALLOC(r.size);
+  if (!r.string)
+    memerr();
+  memcpy(r.string, p.string, p.size);
+  memcpy((uint8_t *)r.string + p.size, ".", 1);
+  memcpy((uint8_t *)r.string + p.size + 1, q.string, q.size);
+  return r;
+}
+
+/*
+ * Compare bytestrings.
+ * We can't use memcmp() directly for two reasons:
+ *  - the two strings can have different lengths
+ *  - the return value is only guaranteed to be ==0 or !=0
+ */
+int
+bscompare(struct bytestring bsp, struct bytestring bsq)
+{
+  uint8_t *p = bsp.string;
+  uint8_t *q = bsq.string;
+  size_t len = bsp.size < bsq.size ? bsp.size : bsq.size;
+  while (len--) {
+    int r = (int)*p++ - (int)*q++;
+    if (r) {
+      /* Unequal bytes found. */
+      if (r < 0)
+        return -1;
+      if (r > 0)
+        return 1;
+      return 0;
+    }
+  }
+  /* Got to the end of the shorter string. */
+  /* The shorter string is considered smaller. */
+  if (bsp.size < bsq.size)
+    return -1;
+  if (bsp.size > bsq.size)
+    return 1;
+  return 0;
+}
+
+/* Compares anything, but really only works well on strings.
+ * if p < q  return -1
+ * if p > q  return 1
+ * if p == q return 0
+ *
+ * As we compare we update the argument pointers with any
+ * progress we make, in case we are interruped and resume from the top.
+ *
+ * XXX This is a rather dodgy comparison, since we are comparing
+ * functions, and the same data type could plausibly get different
+ * functions in the Scott encoding.
+ * But we only use it for lists, and it seems to work fine.
+ */
+int
+compare(NODEPTR cmp)
+{
+  stackptr_t stk = stack_ptr;
+#define CRET(x) do { stack_ptr = stk; return (x); } while(0)
+  value_t x, y;
+  flt_t xd, yd;
+  void *f, *g;
+  void (*ff)(void), (*fg)(void);
+  NODEPTR p, q;
+  NODEPTR *ap, *aq;
+  enum node_tag ptag, qtag;
+  int r;
+
+  /* Since FUN(cmp) can be shared, allocate a copy for it. */
+  GCCHECK(1);
+  FUN(cmp) = new_ap(FUN(FUN(cmp)), ARG(FUN(cmp)));
+  aq = &ARG(cmp);
+  ap = &ARG(FUN(cmp));
+
+  PUSH(*ap);
+  PUSH(*aq);
+  for(;;) {
+    if (stk == stack_ptr)
+      return 0;
+    q = evali(TOP(0));
+    p = evali(TOP(1));
+    POP(2);
+    if (stk == stack_ptr) {
+      /* We have made some progress, save this in the compare node. */
+      *ap = p;
+      *aq = q;
+    }
+
+    ptag = GETTAG(p);
+    qtag = GETTAG(q);
+    if (ptag != qtag) {
+      /* Hack to make Nil < Cons */
+      if (ptag == T_K && qtag == T_AP)
+        CRET(-1);
+      if (ptag == T_AP && qtag == T_K)
+        CRET(1);
+      CRET(ptag < qtag ? -1 : 1);
+    }
+    switch (ptag) {
+    case T_AP:
+      PUSH(ARG(p));             /* compare arg part later */
+      PUSH(ARG(q));
+      PUSH(FUN(p));             /* compare fun part now */
+      PUSH(FUN(q));
+      break;
+    case T_INT:
+    case T_IO_CCALL:
+      x = GETVALUE(p);
+      y = GETVALUE(q);
+      if (x < y)
+        CRET(-1);
+      if (x > y)
+        CRET(1);
+      break;
+    case T_DBL:
+      xd = GETDBLVALUE(p);
+      yd = GETDBLVALUE(q);
+      if (xd < yd)
+        CRET(-1);
+      if (xd > yd)
+        CRET(1);
+      break;
+    case T_PTR:
+      f = PTR(p);
+      g = PTR(q);
+      if (f < g)
+        CRET(-1);
+      if (f > g)
+        CRET(1);
+      break;
+    case T_FUNPTR:
+      ff = FUNPTR(p);
+      fg = FUNPTR(q);
+      if ((intptr_t)ff < (intptr_t)fg)
+        CRET(-1);
+      if ((intptr_t)ff > (intptr_t)fg)
+        CRET(1);
+      break;
+    case T_FORPTR:
+      {
+      struct forptr *fp = FORPTR(p);
+      struct forptr *fq = FORPTR(q);
+#if WANT_GMP
+      if (fp->finalizer->fptype == FP_MPZ && fq->finalizer->fptype == FP_MPZ) {
+        int i = mpz_cmp(fp->payload.string, fq->payload.string);
+        if (i < 0)
+          CRET(-1);
+        if (i > 0)
+          CRET(1);
+      } else
+#endif
+      if (fp->finalizer->fptype == FP_BSTR && fq->finalizer->fptype == FP_BSTR) {
+        r = bscompare(BSTR(p), BSTR(q));
+        if (r)
+          CRET(r);
+      } else {
+        f = fp->payload.string;
+        g = fq->payload.string;
+        if (f < g)
+          CRET(-1);
+        if (f > g)
+          CRET(1);
+      }
+      }
+      break;
+    case T_ARR:
+      if (ARR(p) < ARR(q))
+        CRET(-1);
+      if (ARR(p) > ARR(q))
+        CRET(1);
+      break;
+    default:
+      break;
+    }
+  }
+#undef CRET
+}
+
+void
+rnf_rec(bits_t *done, NODEPTR n)
+{
+ top:
+  if (test_bit(done, n))
+    return;
+  set_bit(done, n);
+  n = evali(n);
+  if (GETTAG(n) == T_AP) {
+    PUSH(ARG(n));               /* protect from GC */
+    rnf_rec(done, FUN(n));
+    n = POPTOP();
+    goto top;
+  }
+}
+
+/* Used to detect calls to error while we are already in a call to error. */
+int in_raise = 0;
+
+/* This is a yucky hack */
+int doing_rnf = 0;
+
+void
+rnf(value_t noerr, NODEPTR n)
+{
+  /* Mark visited nodes to avoid getting stuck in loops. */
+  bits_t *done = calloc(free_map_nwords, sizeof(bits_t));
+  if (!done)
+    memerr();
+  if (doing_rnf)
+    ERR("recursive rnf()");
+  doing_rnf = (int)noerr;
+  rnf_rec(done, n);
+  doing_rnf = 0;
+  FREE(done);
+}
+
+void execio(NODEPTR *);
+
+/* Evaluate a node, returns when the node is in WHNF. */
+NODEPTR
+evali(NODEPTR an)
+{
+  NODEPTR n = an;
+  stackptr_t stk = stack_ptr;
+  NODEPTR x, y, z, w;
+  value_t xi, yi, r;
+  struct forptr *xfp;
+#if WANT_FLOAT
+  flt_t xd, rd;
+#endif  /* WANT_FLOAT */
+  char *msg;
+  heapoffs_t l;
+  enum node_tag tag;
+  struct ioarray *arr;
+  struct bytestring xbs, ybs, rbs;
+
+#if MAXSTACKDEPTH
+  counter_t old_cur_c_stack = cur_c_stack;
+  if (++cur_c_stack > max_c_stack)
+    max_c_stack = cur_c_stack;
+#endif
+
+/* Reset stack pointer and return. */
+#define RET do { goto ret; } while(0)
+#define HASNARGS(n) (stack_ptr - stk >= (n))
+/* Check that there are at least n arguments, return if not. */
+#define CHECK(n) do { if (!HASNARGS(n)) RET; } while(0)
+
+#define SETIND(n, x) SETINDIR(n, x)
+#define GOIND(x) do { NODEPTR _x = (x); SETIND(n, _x); n = _x; goto top; } while(0)
+#define GOAP(f,a) do { FUN((n)) = (f); ARG((n)) = (a); goto ap; } while(0)
+#define GOAP2(f,a,b) do { FUN((n)) = new_ap((f), (a)); ARG((n)) = (b); goto ap2; } while(0)
+/* CHKARGN checks that there are at least N arguments.
+ * It also
+ *  - sets n to the "top" node
+ *  - set x, y, ... to the arguments
+ *  - pops N stack elements
+ * NOTE: No GC is allowed after these, since the stack has been popped.
+ */
+#define CHKARG0 do { } while(0)
+#define CHKARG1 do { CHECK(1); POP(1); n = TOP(-1); x = ARG(n); } while(0)
+#define CHKARG2 do { CHECK(2); POP(2); n = TOP(-1); y = ARG(n); x = ARG(TOP(-2)); } while(0)
+#define CHKARG3 do { CHECK(3); POP(3); n = TOP(-1); z = ARG(n); y = ARG(TOP(-2)); x = ARG(TOP(-3)); } while(0)
+#define CHKARG4 do { CHECK(4); POP(4); n = TOP(-1); w = ARG(n); z = ARG(TOP(-2)); y = ARG(TOP(-3)); x = ARG(TOP(-4)); } while(0)
+#define CHKARG5 do { CHECK(5); POP(5); n = TOP(-1); /*v = ARG(n);*/ w = ARG(TOP(-2)); z = ARG(TOP(-3)); y = ARG(TOP(-4)); x = ARG(TOP(-5)); } while(0)
+
+/* Alloc a possible GC action, e, between setting x and popping */
+#define CHKARGEV1(e)   do { CHECK(1); x = ARG(TOP(0)); e; POP(1); n = TOP(-1); } while(0)
+
+#define SETINT(n,r)    do { SETTAG((n), T_INT); SETVALUE((n), (r)); } while(0)
+#define SETDBL(n,d)    do { SETTAG((n), T_DBL); SETDBLVALUE((n), (d)); } while(0)
+#define SETPTR(n,r)    do { SETTAG((n), T_PTR); PTR(n) = (r); } while(0)
+#define SETFUNPTR(n,r) do { SETTAG((n), T_FUNPTR); FUNPTR(n) = (r); } while(0)
+#define SETFORPTR(n,r) do { SETTAG((n), T_FORPTR); FORPTR(n) = (r); } while(0)
+#define SETBSTR(n,r)   do { SETTAG((n), T_FORPTR); FORPTR(n) = (r); FORPTR(n)->finalizer->fptype = FP_BSTR; } while(0)
+#define OPINT1(e)      do { CHECK(1); xi = evalint(ARG(TOP(0)));                            e; POP(1); n = TOP(-1); } while(0);
+#define OPPTR2(e)      do { CHECK(2); xp = evalptr(ARG(TOP(0))); yp = evalptr(ARG(TOP(1))); e; POP(2); n = TOP(-1); } while(0);
+#define CMPP(op)       do { OPPTR2(r = xp op yp); GOIND(r ? combTrue : combFalse); } while(0)
+
+ top:
+  l = LABEL(n);
+  if (l < T_IO_STDIN) {
+    /* The node is one of the permanent nodes; the address offset is the tag */
+    tag = l;
+  } else {
+    /* Heap allocated node */
+    if (ISINDIR(n)) {
+      /* Follow indirections */
+      NODEPTR on = n;
+      do {
+        n = GETINDIR(n);
+      } while(ISINDIR(n));
+      SETINDIR(on, n);          /* and short-circuit them */
+    }
+    tag = GETTAG(n);
+  }
+  COUNT(num_reductions);
+  switch (tag) {
+  ap2:         PUSH(n); n = FUN(n);
+  ap:
+  case T_AP:   PUSH(n); n = FUN(n); goto top;
+
+  case T_INT:  RET;
+  case T_DBL:  RET;
+  case T_PTR:  RET;
+  case T_FUNPTR: RET;
+  case T_FORPTR: RET;
+  case T_ARR:  RET;
+  case T_BADDYN: ERR1("FFI unknown %s", CSTR(n));
+
+  /*
+   * Some of these reductions, (e.g., Z x y = K (x y)) are there to avoid
+   * that increase in arity that some "optimizations" in Abstract.hs
+   * stop reductions from happening.  This can be important for "full laziness".
+   * In practice, these reductions almost never happen, but there they are anyway. :)
+   */
+  case T_S:    GCCHECK(2); CHKARG3; GOAP2(x, z, new_ap(y, z));                            /* S x y z = x z (y z) */
+  case T_SS:   GCCHECK(3); CHKARG4; GOAP2(x, new_ap(y, w), new_ap(z, w));                 /* S' x y z w = x (y w) (z w) */
+  case T_K:                CHKARG2; GOIND(x);                                             /* K x y = *x */
+  case T_A:                CHKARG2; GOIND(y);                                             /* A x y = *y */
+  case T_U:                CHKARG2; GOAP(y, x);                                           /* U x y = y x */
+  case T_I:                CHKARG1; GOIND(x);                                             /* I x = *x */
+  case T_Y:                CHKARG1; GOAP(x, n);                                           /* n@(Y x) = x n */
+  case T_B:    GCCHECK(1); CHKARG3; GOAP(x, new_ap(y, z));                                /* B x y z = x (y z) */
+  case T_BB:   if (!HASNARGS(4)) {
+               GCCHECK(1); CHKARG2; COUNT(red_bb); GOAP(combB, new_ap(x, y)); } else {    /* B' x y = B (x y) */
+               GCCHECK(2); CHKARG4; GOAP2(x, y, new_ap(z, w)); }                          /* B' x y z w = x y (z w) */
+  case T_Z:    if (!HASNARGS(3)) {
+               GCCHECK(1); CHKARG2; COUNT(red_z); GOAP(combK, new_ap(x, y)); } else {     /* Z x y = K (x y) */
+                           CHKARG3; GOAP(x, y); }                                         /* Z x y z = x y */
+//case T_J:                CHKARG3; GOAP(z, x);                                           /* J x y z = z x */
+  case T_C:    GCCHECK(1); CHKARG3; GOAP2(x, z, y);                                       /* C x y z = x z y */
+  case T_CC:   GCCHECK(2); CHKARG4; GOAP2(x, new_ap(y, w), z);                            /* C' x y z w = x (y w) z */
+  case T_P:    GCCHECK(1); CHKARG3; GOAP2(z, x, y);                                       /* P x y z = z x y */
+  case T_R:    if(!HASNARGS(3)) {
+               GCCHECK(1); CHKARG2; COUNT(red_r); GOAP2(combC, y, x); } else {            /* R x y = C y x */
+               GCCHECK(1); CHKARG3; GOAP2(y, z, x); }                                     /* R x y z = y z x */
+  case T_O:    GCCHECK(1); CHKARG4; GOAP2(w, x, y);                                       /* O x y z w = w x y */
+  case T_K2:   if (!HASNARGS(3)) {
+                           CHKARG2; COUNT(red_k2); GOAP(combK, x); } else {               /* K2 x y = K x */
+                           CHKARG3; GOIND(x); }                                           /* K2 x y z = *x */
+  case T_K3:   if (!HASNARGS(4)) {
+                           CHKARG2; COUNT(red_k3); GOAP(combK2, x); } else {              /* K3 x y = K2 x */
+                           CHKARG4; GOIND(x); }                                           /* K3 x y z w = *x */
+  case T_K4:   if (!HASNARGS(5)) {
+                           CHKARG2; COUNT(red_k4); GOAP(combK3, x); } else {              /* K4 x y = K3 x */
+                           CHKARG5; GOIND(x); }                                           /* K4 x y z w v = *x */
+  case T_CCB:  if (!HASNARGS(4)) {
+               GCCHECK(2); CHKARG3; COUNT(red_ccb); GOAP2(combB, new_ap(x, z), y);} else{ /* C'B x y z = B (x z) y */
+               GCCHECK(2); CHKARG4; GOAP2(x, z, new_ap(y, w)); }                          /* C'B x y z w = x z (y w) */
+
+    /*
+     * Strict primitives require evaluating the arguments before we can proceed.
+     * The easiest way to do this is to just recursively call evali() for each argument.
+     * The drawback of this is that it uses a lot of C stack.  (E.g., recompiling MicroHs
+     * uses a stack depth of 1800).
+     * Instead we use the following scheme:
+     *  When we find a strict binary (int) primitive we push T_BININT2,
+     *  set n=second argument.
+     *  Continue evaluation of n.
+     *  When n is finally evaluated and we are about to return we check if the stack top is T_BININT2.
+     *  If so, change the stack top to T_BININT1,
+     *  set n=first argument.
+     *  Continue evaluation of n.
+     *  When n is finally evaluated and we are about to return we check if the stack top is T_BININT1.
+     *  If so, we know that both arguments are now evaluated, and we perform the strict operation.
+     *
+     * On my desktop machine this is about 3% slower, on my laptop (Apple M1) it is about 3% faster.
+     *
+     * Pictorially for BININT
+     *  Before the code below:
+     *  ----
+     *  | --------> @
+     *  ----       / \
+     *  | ------> @   y
+     *  ----     / \
+     *  n ----> ADD x
+     *
+     * After
+     *  ----
+     *  | --------> @
+     *  ----       / \
+     *  | ------> @   y
+     *  ----     / \
+     *  | ->BI2 ADD x
+     *  ----        ^
+     *  n ----------|
+     *
+     *  x becomes an INT, stack is not empty, BININT2 found on top
+     *  ----
+     *  | --------> @
+     *  ----       / \
+     *  | ------> @   y
+     *  ----     / \
+     *  | ->BI2 ADD INT
+     *  ----        ^
+     *  n ----------|
+     *
+     *  After
+     *  ----
+     *  | --------> @
+     *  ----       / \
+     *  | ------> @   y
+     *  ----     / \    \
+     *  | ->BI1 ADD INT  |
+     *  ----             |
+     *  n ---------------|
+     *
+     *  y becomes an INT, stack is not empty, BININT1 found on top
+     *  do arithmetic
+     *  ----
+     *  | --------> @
+     *  ----       / \
+     *  | ------> @   INT
+     *  ----     / \    \
+     *  | ->BI1 ADD INT  |
+     *  ----             |
+     *  n ---------------|
+     *
+     *  ----
+     *  n -------> INT(x+y)
+     */
+  case T_ADD:
+  case T_SUB:
+  case T_MUL:
+  case T_QUOT:
+  case T_REM:
+  case T_SUBR:
+  case T_UQUOT:
+  case T_UREM:
+  case T_AND:
+  case T_OR:
+  case T_XOR:
+  case T_SHL:
+  case T_SHR:
+  case T_ASHR:
+  case T_EQ:
+  case T_NE:
+  case T_LT:
+  case T_LE:
+  case T_GT:
+  case T_GE:
+  case T_ICMP:
+  case T_ULT:
+  case T_ULE:
+  case T_UGT:
+  case T_UGE:
+  case T_UCMP:
+    CHECK(2);
+    n = ARG(TOP(1));
+    if (GETTAG(n) == T_INT) {
+      n = ARG(TOP(0));
+      PUSH(combBININT1);
+      if (GETTAG(n) == T_INT)
+        goto binint1;
+    } else {
+      PUSH(combBININT2);
+    }
+    goto top;
+  case T_NEG:
+  case T_INV:
+  case T_POPCOUNT:
+  case T_CLZ:
+  case T_CTZ:
+    CHECK(1);
+    n = ARG(TOP(0));
+    PUSH(combUNINT1);
+    goto top;
+
+#if WANT_FLOAT
+  case T_FADD:
+  case T_FSUB:
+  case T_FMUL:
+  case T_FDIV:
+  case T_FEQ:
+  case T_FNE:
+  case T_FLT:
+  case T_FLE:
+  case T_FGT:
+  case T_FGE:
+    CHECK(2);
+    n = ARG(TOP(1));
+    PUSH(combBINDBL2);
+    goto top;
+  case T_FNEG:
+    CHECK(1);
+    n = ARG(TOP(0));
+    PUSH(combUNDBL1);
+    goto top;
+
+  case T_ITOF: OPINT1(rd = (flt_t)xi); SETDBL(n, rd); RET;
+  case T_FREAD:
+    CHECK(1);
+    msg = evalstring(ARG(TOP(0))).string;
+#if WORD_SIZE == 64
+    xd = strtod(msg, NULL);
+#elif WORD_SIZE == 32
+    xd = strtof(msg, NULL);
+#else  /* WORD_SIZE */
+#error Unknown WORD_SIZE
+#endif  /* WORD_SIZE */
+    FREE(msg);
+    POP(1);
+    n = TOP(-1);
+    SETDBL(n, xd);
+    RET;
+
+  case T_FSHOW:
+    CHECK(1);
+    xd = evaldbl(ARG(TOP(0)));
+    POP(1);
+    n = TOP(-1);
+    GOIND(dblToString(xd));
+#endif  /* WANT_FLOAT */
+
+  case T_BSAPPEND:
+  case T_BSAPPENDDOT:
+  case T_BSEQ:
+  case T_BSNE:
+  case T_BSLT:
+  case T_BSLE:
+  case T_BSGT:
+  case T_BSGE:
+  case T_BSCMP:
+    CHECK(2);
+    n = ARG(TOP(1));
+    PUSH(combBINBS2);
+    goto top;
+
+  /* Retag a word sized value, keeping the value bits */
+#define CONV(t) do { CHECK(1); x = evali(ARG(TOP(0))); n = POPTOP(); SETTAG(n, t); SETVALUE(n, GETVALUE(x)); RET; } while(0)
+  case T_TODBL: CONV(T_DBL);
+  case T_TOINT: CONV(T_INT);
+  case T_TOPTR: CONV(T_PTR);
+  case T_TOFUNPTR: CONV(T_FUNPTR);
+#undef CONV
+
+  case T_FPADD: CHECK(2); xfp = evalforptr(ARG(TOP(0))); yi = evalint(ARG(TOP(1))); POP(2); n = TOP(-1); SETFORPTR(n, addForPtr(xfp, yi)); RET;
+  case T_FP2P:
+    CHECK(1);
+    xfp = evalforptr(ARG(TOP(0)));
+    POP(1);
+    n = TOP(-1);
+    SETPTR(n, xfp->payload.string);
+    RET;
+
+  case T_FP2BS:
+    CHECK(2);
+    xfp = evalforptr(ARG(TOP(0)));
+    xi = evalint(ARG(TOP(1)));
+    POP(2);
+    n = TOP(-1);
+    xfp->payload.size = xi;
+    SETBSTR(n, xfp);
+    RET;
+
+  case T_BS2FP:
+    CHECK(1);
+    xfp = evalbstr(ARG(TOP(0)));
+    POP(1);
+    n = TOP(-1);
+    SETFORPTR(n, xfp);
+    RET;
+
+  case T_ARR_EQ:
+    {
+      CHECK(2);
+      x = evali(ARG(TOP(0)));
+      arr = ARR(x);
+      y = evali(ARG(TOP(1)));
+      POP(2);
+      n = TOP(-1);
+      GOIND(arr == ARR(y) ? combTrue : combFalse);
+    }
+
+  case T_BSTOUTF8:
+    {
+      CHECK(1);
+      n = ARG(TOP(0));
+      /* Zap the pointer to the list so it can be GC:ed.
+       * The actual list is protected from GC by evalbytestring().
+       */
+      // ARG(TOP(0)) = combK;
+      struct bytestring bs = evalstring(n);
+      POP(1);
+      n = TOP(-1);
+      SETBSTR(n, mkForPtrFree(bs));
+      RET;
+    }
+
+  case T_BSHEADUTF8:
+    CHECK(1);
+    xfp = evalbstr(ARG(TOP(0)));
+    POP(1);
+    n = TOP(-1);
+    SETINT(n, headutf8(xfp->payload, (void**)0));
+    RET;
+
+  case T_BSTAILUTF8:
+    CHECK(1);
+    xfp = evalbstr(ARG(TOP(0)));
+    POP(1);
+    n = TOP(-1);
+    { void *out;
+      (void)headutf8(xfp->payload, &out);           /* skip one UTF8 character */
+      xi = (char*)out - (char*)xfp->payload.string; /* offset */
+      yi = xfp->payload.size - xi;                  /* remaining length */
+      SETBSTR(n, bssubstr(xfp, xi, yi));            /* make a substring */
+    }
+    RET;
+
+  case T_BSFROMUTF8:
+    if (doing_rnf) RET;
+    CHECK(1);
+
+    xfp = evalbstr(ARG(TOP(0)));
+    GCCHECK(strNodes(xfp->payload.size));
+    POP(1);
+    n = TOP(-1);
+    //printf("T_FROMUTF8 x = %p fp=%p payload.string=%p\n", x, x->uarg.uuforptr, x->uarg.uuforptr->payload.string);
+    GOIND(mkStringU(xfp->payload));
+
+  case T_BSUNPACK:
+    if (doing_rnf) RET;
+    CHECK(1);
+    struct forptr *xfp = evalbstr(ARG(TOP(0)));
+    GCCHECK(strNodes(xfp->payload.size));
+    POP(1);
+    n = TOP(-1);
+    GOIND(bsunpack(xfp->payload));
+
+  case T_BSPACK:
+    CHECK(1);
+    n = ARG(TOP(0));
+    /* Zap the pointer to the list so it can be GC:ed.
+     * The actual list is protected from GC by evalbytestring().
+     */
+    ARG(TOP(0)) = combK;
+    struct bytestring rbs = evalbytestring(n);
+    POP(1);
+    n = TOP(-1);
+    SETBSTR(n, mkForPtrFree(rbs));
+    RET;
+
+  case T_BSREPLICATE:
+    CHECK(2);
+    xi = evalint(ARG(TOP(0)));
+    yi = evalint(ARG(TOP(1)));
+    POP(2);
+    n = TOP(-1);
+    SETBSTR(n, mkForPtrFree(bsreplicate(xi, yi)));
+    RET;
+
+  case T_BSLENGTH:
+    CHECK(1);
+    xfp = evalbstr(ARG(TOP(0)));
+    POP(1);
+    n = TOP(-1);
+    SETINT(n, xfp->payload.size);
+    RET;
+
+  case T_BSSUBSTR:
+    CHECK(3);
+    xfp = evalbstr(ARG(TOP(0)));
+    xi = evalint(ARG(TOP(1)));
+    yi = evalint(ARG(TOP(2)));
+    POP(3);
+    n = TOP(-1);
+    SETBSTR(n, bssubstr(xfp, xi, yi));
+    RET;
+
+  case T_BSINDEX:
+    CHECK(2);
+    xfp = evalbstr(ARG(TOP(0)));
+    xi = evalint(ARG(TOP(1)));
+    POP(2);
+    n = TOP(-1);
+    SETINT(n, ((uint8_t *)xfp->payload.string)[xi]);
+    RET;
+
+  case T_RAISE:
+    if (doing_rnf) RET;
+    if (cur_handler) {
+      /* Pass the exception to the handler */
+      CHKARG1;
+      cur_handler->hdl_exn = x;
+      longjmp(cur_handler->hdl_buf, 1);
+    } else {
+      /* No handler:
+       * First convert the exception to a string by calling displaySomeException.
+       * The display function compiles to combShowExn, so we need to build
+       * (combShowExn x) and evaluate it.
+       */
+      if (in_raise) {
+        ERR("recursive error");
+        EXIT(1);
+      }
+      in_raise = 1;
+      CHECK(1);
+      GCCHECK(1);
+      //TOP(0) = new_ap(combShowExn, TOP(0));
+      FUN(TOP(0)) = combShowExn; /* TOP(0) = (combShowExn exn) */
+      x = evali(TOP(0));        /* evaluate it */
+      msg = evalstring(x).string;   /* and convert to a C string */
+      POP(1);
+#if WANT_STDIO
+      /* A horrible hack until we get proper exceptions */
+      if (strcmp(msg, "ExitSuccess") == 0) {
+        EXIT(0);
+      } else {
+        fprintf(stderr, "mhs: %s\n", msg);
+        EXIT(1);
+      }
+#else  /* WANT_STDIO */
+      ERR1("mhs error: %s", msg);
+#endif  /* WANT_STDIO */
+    }
+
+
+  case T_SEQ:  CHECK(2); evali(ARG(TOP(0))); POP(2); n = TOP(-1); y = ARG(n); GOIND(y); /* seq x y = eval(x); y */
+
+  case T_EQUAL:
+    CHECK(2); r = compare(TOP(1)); POP(2); n = TOP(-1); GOIND(r==0 ? combTrue : combFalse);
+  case T_COMPARE:
+    CHECK(2); r = compare(TOP(1)); POP(2); n = TOP(-1); GOIND(r < 0 ? combLT : r > 0 ? combGT : combEQ);
+
+  case T_RNF:
+    if (doing_rnf) RET;
+    CHECK(2);
+    xi = evalint(ARG(TOP(0)));
+    rnf(xi, ARG(TOP(1))); POP(2); n = TOP(-1); GOIND(combUnit);
+
+  case T_IO_PERFORMIO:
+    CHECK(1);
+    if (doing_rnf) RET;
+    execio(&ARG(TOP(0)));       /* run IO action */
+    x = ARG(TOP(0));            /* should be RETURN e */
+    if (GETTAG(x) != T_AP || GETTAG(FUN(x)) != T_IO_RETURN)
+      ERR("PERFORMIO");
+    POP(1);
+    n = TOP(-1);
+    GOIND(ARG(x));
+
+  case T_IO_CCBIND:           /* We should never have to reduce this */
+  case T_IO_BIND:
+  case T_IO_THEN:
+  case T_IO_RETURN:
+  case T_IO_SERIALIZE:
+  case T_IO_PRINT:
+  case T_IO_DESERIALIZE:
+  case T_IO_GETARGREF:
+  case T_IO_CCALL:
+  case T_CATCH:
+  case T_NEWCASTRINGLEN:
+  case T_PACKCSTRING:
+  case T_PACKCSTRINGLEN:
+  case T_ARR_ALLOC:
+  case T_ARR_COPY:
+  case T_ARR_SIZE:
+  case T_ARR_READ:
+  case T_ARR_WRITE:
+  case T_FPNEW:
+  case T_FPFIN:
+    //  case T_FPSTR:
+  case T_IO_GC:
+    RET;
+
+  case T_DYNSYM:
+    /* A dynamic FFI lookup */
+    CHECK(1);
+    msg = evalstring(ARG(TOP(0))).string;
+    GCCHECK(1);
+    x = ffiNode(msg);
+    FREE(msg);
+    POP(1);
+    n = TOP(-1);
+    GOIND(x);
+
+#if WANT_TICK
+  case T_TICK:
+    xi = GETVALUE(n);
+    CHKARG1;
+    dotick(xi);
+    GOIND(x);
+#endif
+
+  default:
+    ERR1("eval tag %s", tag_names[GETTAG(n)]);
+  }
+
+
+ ret:
+  if (stack_ptr != stk) {
+    // In this case, n was an AP that got pushed and potentially
+    // updated.
+    uvalue_t xu, yu, ru;
+#if WANT_FLOAT
+    flt_t xd, yd, rd;
+#endif  /* WANT_FLOAT */
+    NODEPTR p;
+
+    tag = GETTAG(TOP(0));
+    switch (tag) {
+    case T_BININT2:
+      n = ARG(TOP(1));
+      TOP(0) = combBININT1;
+      goto top;
+
+    case T_BININT1:
+      /* First argument */
+#if SANITY
+      if (GETTAG(n) != T_INT)
+        ERR("BININT 0");
+#endif  /* SANITY */
+    binint1:
+      xu = (uvalue_t)GETVALUE(n);
+      /* Second argument */
+      y = ARG(TOP(2));
+      while (GETTAG(y) == T_IND)
+        y = GETINDIR(y);
+#if SANITY
+      if (GETTAG(y) != T_INT)
+        ERR("BININT 1");
+#endif  /* SANITY */
+      yu = (uvalue_t)GETVALUE(y);
+      p = FUN(TOP(1));
+      POP(3);
+      n = TOP(-1);
+    binint:
+      switch (GETTAG(p)) {
+      case T_IND:   p = GETINDIR(p); goto binint;
+      case T_ADD:   ru = xu + yu; break;
+      case T_SUB:   ru = xu - yu; break;
+      case T_MUL:   ru = xu * yu; break;
+      case T_QUOT:  ru = (uvalue_t)((value_t)xu / (value_t)yu); break;
+      case T_REM:   ru = (uvalue_t)((value_t)xu % (value_t)yu); break;
+      case T_SUBR:  ru = yu - xu; break;
+      case T_UQUOT: ru = xu / yu; break;
+      case T_UREM:  ru = xu % yu; break;
+      case T_AND:   ru = xu & yu; break;
+      case T_OR:    ru = xu | yu; break;
+      case T_XOR:   ru = xu ^ yu; break;
+      case T_SHL:   ru = xu << yu; break;
+      case T_SHR:   ru = xu >> yu; break;
+      case T_ASHR:  ru = (uvalue_t)((value_t)xu >> yu); break;
+
+      case T_EQ:    GOIND(xu == yu ? combTrue : combFalse);
+      case T_NE:    GOIND(xu != yu ? combTrue : combFalse);
+      case T_ULT:   GOIND(xu <  yu ? combTrue : combFalse);
+      case T_ULE:   GOIND(xu <= yu ? combTrue : combFalse);
+      case T_UGT:   GOIND(xu >  yu ? combTrue : combFalse);
+      case T_UGE:   GOIND(xu >= yu ? combTrue : combFalse);
+      case T_UCMP:  GOIND(xu <  yu ? combLT   : xu > yu ? combGT : combEQ);
+      case T_LT:    GOIND((value_t)xu <  (value_t)yu ? combTrue : combFalse);
+      case T_LE:    GOIND((value_t)xu <= (value_t)yu ? combTrue : combFalse);
+      case T_GT:    GOIND((value_t)xu >  (value_t)yu ? combTrue : combFalse);
+      case T_GE:    GOIND((value_t)xu >= (value_t)yu ? combTrue : combFalse);
+      case T_ICMP:  GOIND((value_t)xu <  (value_t)yu ? combLT   : (value_t)xu > (value_t)yu ? combGT : combEQ);
+
+      default:
+        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));
+        ERR("BININT");
+      }
+      SETINT(n, (value_t)ru);
+      goto ret;
+
+    case T_UNINT1:
+      /* The argument */
+#if SANITY
+      if (GETTAG(n) != T_INT)
+        ERR("UNINT 0");
+#endif
+      xu = (uvalue_t)GETVALUE(n);
+      p = FUN(TOP(1));
+      POP(2);
+      n = TOP(-1);
+    unint:
+      switch (GETTAG(p)) {
+      case T_IND:      p = GETINDIR(p); goto unint;
+      case T_NEG:      ru = -xu; break;
+      case T_INV:      ru = ~xu; break;
+      case T_POPCOUNT: ru = POPCOUNT(xu); break;
+      case T_CLZ:      ru = CLZ(xu); break;
+      case T_CTZ:      ru = CTZ(xu); break;
+      default:
+        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));
+        ERR("UNINT");
+      }
+      SETINT(n, (value_t)ru);
+      goto ret;
+
+#if WANT_FLOAT
+    case T_BINDBL2:
+      n = ARG(TOP(1));
+      TOP(0) = combBINDBL1;
+      goto top;
+
+    case T_BINDBL1:
+      /* First argument */
+#if SANITY
+      if (GETTAG(n) != T_DBL)
+        ERR("BINDBL 0");
+#endif  /* SANITY */
+      xd = GETDBLVALUE(n);
+      /* Second argument */
+      y = ARG(TOP(2));
+      while (GETTAG(y) == T_IND)
+        y = GETINDIR(y);
+#if SANITY
+      if (GETTAG(y) != T_DBL)
+        ERR("BINDBL 1");
+#endif  /* SANITY */
+      yd = GETDBLVALUE(y);
+      p = FUN(TOP(1));
+      POP(3);
+      n = TOP(-1);
+    bindbl:
+      switch (GETTAG(p)) {
+      case T_IND:   p = GETINDIR(p); goto bindbl;
+      case T_FADD:  rd = xd + yd; break;
+      case T_FSUB:  rd = xd - yd; break;
+      case T_FMUL:  rd = xd * yd; break;
+      case T_FDIV:  rd = xd / yd; break;
+
+      case T_FEQ:   GOIND(xd == yd ? combTrue : combFalse);
+      case T_FNE:   GOIND(xd != yd ? combTrue : combFalse);
+      case T_FLT:   GOIND(xd <  yd ? combTrue : combFalse);
+      case T_FLE:   GOIND(xd <= yd ? combTrue : combFalse);
+      case T_FGT:   GOIND(xd >  yd ? combTrue : combFalse);
+      case T_FGE:   GOIND(xd >= yd ? combTrue : combFalse);
+
+      default:
+        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));
+        ERR("BINDBL");
+      }
+      SETDBL(n, rd);
+      goto ret;
+
+    case T_UNDBL1:
+      /* The argument */
+#if SANITY
+      if (GETTAG(n) != T_DBL)
+        ERR("UNDBL 0");
+#endif
+      xd = GETDBLVALUE(n);
+      p = FUN(TOP(1));
+      POP(2);
+      n = TOP(-1);
+    undbl:
+      switch (GETTAG(p)) {
+      case T_IND:   p = GETINDIR(p); goto undbl;
+      case T_FNEG:  rd = -xd; break;
+      default:
+        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));
+        ERR("UNDBL");
+      }
+      SETDBL(n, rd);
+      goto ret;
+#endif  /* WANT_FLOAT */
+
+    case T_BINBS2:
+      n = ARG(TOP(1));
+      TOP(0) = combBINBS1;
+      goto top;
+
+    case T_BINBS1:
+      /* First argument */
+#if SANITY
+      if (GETTAG(n) != T_FORPTR || FORPTR(n)->finalizer->fptype != FP_BSTR)
+        ERR("BINBS 0");
+#endif  /* SANITY */
+      xbs = BSTR(n);
+      /* Second argument */
+      y = ARG(TOP(2));
+      while (GETTAG(y) == T_IND)
+        y = GETINDIR(y);
+#if SANITY
+      if (GETTAG(y) != T_FORPTR || FORPTR(y)->finalizer->fptype != FP_BSTR)
+        ERR("BINBS 1");
+#endif  /* SANITY */
+      ybs = BSTR(y);
+      p = FUN(TOP(1));
+      POP(3);
+      n = TOP(-1);
+    binbs:
+      switch (GETTAG(p)) {
+      case T_IND:    p = GETINDIR(p); goto binbs;
+
+      case T_BSAPPEND: rbs = bsappend(xbs, ybs); break;
+      case T_BSAPPENDDOT: rbs = bsappenddot(xbs, ybs); break;
+      case T_BSEQ:   GOIND(bscompare(xbs, ybs) == 0 ? combTrue : combFalse);
+      case T_BSNE:   GOIND(bscompare(xbs, ybs) != 0 ? combTrue : combFalse);
+      case T_BSLT:   GOIND(bscompare(xbs, ybs) <  0 ? combTrue : combFalse);
+      case T_BSLE:   GOIND(bscompare(xbs, ybs) <= 0 ? combTrue : combFalse);
+      case T_BSGT:   GOIND(bscompare(xbs, ybs) >  0 ? combTrue : combFalse);
+      case T_BSGE:   GOIND(bscompare(xbs, ybs) >= 0 ? combTrue : combFalse);
+      case T_BSCMP:  r = bscompare(xbs, ybs); GOIND(r < 0 ? combLT : r > 0 ? combGT : combEQ);
+
+      default:
+        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));
+        ERR("BINBS");
+      }
+      SETBSTR(n, mkForPtrFree(rbs));
+      goto ret;
+
+    default:
+      stack_ptr = stk;
+      n = TOP(-1);
+    }
+  }
+#if MAXSTACKDEPTH
+  cur_c_stack = old_cur_c_stack; /* reset rather than counting down, in case of longjump */
+#endif
+  return n;
+}
+
+/* This is the interpreter for the IO monad operations.
+ *
+ * Assuming every graph rewrite is atomic we want the graph
+ * to always represent the rest of the program to run.
+ * To this end, we need to mutate the graph every time
+ * an IO operation has been performed to make sure we don't
+ * execute it again.
+ * To have a cell that is safe to mutate, we allocate a new
+ * application on entry to execio().
+ * Given the call execio(np) we allocate this graph, top = BIND (*np) RETURN.
+ * I.e.
+ *          @
+ *         / \
+ *        @  RETURN
+ *       / \
+ *    BIND (*np) 
+ * and make np point to it.
+ * This graph will be updated continuously as we execute IO actions.
+ *
+ * Invariant: the second argument to this BIND is always either RETURN
+ * or a C'BIND.  The second argument to C'BIND has the same invariant.
+ * C'BIND has the reduction rule (which is normally never used): 
+ *   C'BIND x y z = BIND (x z) y
+ *
+ * This is the cycle of the execio loop:
+ *  again:
+ *   given top = BIND n q
+ *   eval(n)
+ *   case n
+ *     BIND r s:  rewrite to top := BIND r (C'BIND s q)  -- (r >>= s) >>= q  -->  r >>= (\ x -> s x >>= q)
+ *     THEN r s:  ... K s ...
+ *     otherwise: res = execute n
+ *       case q
+ *         RETURN:     rewrite to  top := RETURN res;  return to caller
+ *         C'BIND r s: rewrite to  top := BIND (r res) s; goto again
+ */
+void
+execio(NODEPTR *np)
+{
+  stackptr_t stk = stack_ptr;
+  NODEPTR f, x, n, q, r, s, res, top1;
+  char *cstr;
+  struct handler *h;
+#if WANT_STDIO
+  void *ptr;
+  int hdr;
+#endif  /* WANT_STDIO */
+  NODEPTR top;
+  enum node_tag tag;
+  heapoffs_t l;
+
+/* IO operations need all arguments, anything else should not happen. */
+#define CHECKIO(n) do { if (stack_ptr - stk != (n)+1) {/*printf("\nLINE=%d\n", __LINE__);*/ ERR("CHECKIO");}; } while(0)
+/* #define RETIO(p) do { stack_ptr = stk; return (p); } while(0)*/
+#define GCCHECKSAVE(p, n) do { PUSH(p); GCCHECK(n); (p) = TOP(0); POP(1); } while(0)
+#define RETIO(p) do { stack_ptr = stk; res = (p); goto rest; } while(0)
+#define IOASSERT(p,s) do { if (!(p)) ERR("IOASSERT " s); } while(0)
+
+  GCCHECK(2);
+  top = new_ap(new_ap(combIOBIND, *np), combIORETURN);
+  *np = top;
+
+ start:
+  //dump("start", top);
+  IOASSERT(stack_ptr == stk, "start");
+  //ppmsg("n before = ", ARG(FUN(top)));
+  n = evali(ARG(FUN(top)));     /* eval(n) */
+  //ppmsg("n after  = ", n);
+  if (GETTAG(n) == T_AP && GETTAG(top1 = indir(&FUN(n))) == T_AP) {
+    switch (GETTAG(indir(&FUN(top1)))) {
+    case T_IO_BIND:
+      GCCHECKSAVE(n, 2);
+      s = ARG(n);
+    bind:
+      q = ARG(top);
+      r = ARG(top1);
+      ARG(FUN(top)) = r;
+      ARG(top) = x = new_ap(new_ap(combIOCCBIND, s), q);
+      goto start;
+    case T_IO_THEN:
+      GCCHECKSAVE(n, 3);
+      s = new_ap(combFalse, ARG(n));
+      goto bind;
+    default:
+      break;
+    }
+  }
+  goto execute;
+
+ rest:                          /* result is in res */
+  //ppmsg("res=", res);
+  q = ARG(top);
+  //ppmsg("q=", q);
+  if (GETTAG(q) == T_IO_RETURN) {
+    /* execio is done */
+    FUN(top) = combIORETURN;
+    ARG(top) = res;
+    IOASSERT(stack_ptr == stk, "stk");
+    return;
+  }
+  /* not done, it must be a C'BIND */
+  GCCHECKSAVE(res, 1);
+  IOASSERT(GETTAG(q) == T_AP && GETTAG(FUN(q)) == T_AP && GETTAG(FUN(FUN(q))) == T_IO_CCBIND, "rest-AP");
+  r = ARG(FUN(q));
+  s = ARG(q);
+  ARG(FUN(top)) = new_ap(r, res);
+  ARG(top) = s;
+  goto start;
+
+ execute:
+  PUSH(n);
+  for(;;) {
+    COUNT(num_reductions);
+    //printf("execute switch %s\n", tag_names[GETTAG(n)]);
+
+    l = LABEL(n);
+    if (l < T_IO_STDIN) {
+      /* The node is one of the permanent nodes; the address offset is the tag */
+      tag = l;
+    } else {
+      /* Heap allocated node */
+      if (ISINDIR(n)) {
+        /* Follow indirections */
+        NODEPTR on = n;
+        do {
+          n = GETINDIR(n);
+        } while(ISINDIR(n));
+        SETINDIR(on, n);          /* and short-circuit them */
+      }
+      tag = GETTAG(n);
+    }
+
+    switch (tag) {
+    case T_AP:
+      n = FUN(n);
+      PUSH(n);
+      break;
+    case T_IO_BIND:
+      ERR("T_IO_BIND");
+    case T_IO_THEN:
+      ERR("T_IO_THEN");
+    case T_IO_CCBIND:
+      ERR("T_IO_CCBIND");
+    case T_IO_RETURN:
+      CHECKIO(1);
+      n = ARG(TOP(1));
+      RETIO(n);
+#if WANT_STDIO
+    case T_IO_PRINT:
+      hdr = 0;
+      goto ser;
+    case T_IO_SERIALIZE:
+      hdr = 1;
+    ser:
+      CHECKIO(2);
+      gc();                     /* DUBIOUS: do a GC to get possible GC reductions */
+      ptr = (struct BFILE*)evalptr(ARG(TOP(1)));
+      x = evali(ARG(TOP(2)));
+      //x = ARG(TOP(1));
+      printb(ptr, x, hdr);
+      putb('\n', ptr);
+      RETIO(combUnit);
+    case T_IO_DESERIALIZE:
+      CHECKIO(1);
+      ptr = (struct BFILE*)evalptr(ARG(TOP(1)));
+      gc();                     /* make sure we have room.  GC during parse is dodgy. */
+      n = parse_top(ptr);
+      RETIO(n);
+#endif
+#if WANT_ARGS
+    case T_IO_GETARGREF:
+      CHECKIO(0);
+      n = alloc_node(T_ARR);
+      ARR(n) = argarray;
+      RETIO(n);
+#endif
+
+    case T_IO_CCALL:
+      {
+        int a = (int)GETVALUE(n);
+        funptr_t f = FFI_IX(a).ffi_fun;
+        GCCHECK(1);             /* room for placeholder */
+        PUSH(mkFlt(0.0));       /* placeholder for result, protected from GC */
+        f(stk);                 /* call FFI function */
+        n = TOP(0);             /* pop actual result */
+        RETIO(n);               /* and this is the result */
+      }
+
+    case T_CATCH:
+      {
+        h = MALLOC(sizeof *h);
+        if (!h)
+          memerr();
+        CHECKIO(2);
+        h->hdl_old = cur_handler;
+        h->hdl_stack = stack_ptr;
+        cur_handler = h;
+        if (setjmp(h->hdl_buf)) {
+          /* An exception occurred: */
+          stack_ptr = h->hdl_stack;
+          x = h->hdl_exn;       /* exception value */
+          GCCHECKSAVE(x, 1);
+          f = ARG(TOP(2));      /* second argument, handler */
+          n = new_ap(f, x);
+          cur_handler = h->hdl_old;
+          FREE(h);
+          POP(3);
+          ARG(FUN(top)) = n;
+          goto start;
+        } else {
+          /* Normal execution: */
+          n = ARG(TOP(1));          /* first argument, should be evaluated (but not overwritten) */
+          PUSH(n);
+          execio(&TOP(0));          /* execute first argument */
+          cur_handler = h->hdl_old; /* restore old handler */
+          FREE(h);
+          n = TOP(0);
+          POP(1);
+          IOASSERT(GETTAG(n) == T_AP && GETTAG(FUN(n)) == T_IO_RETURN, "CATCH");
+          RETIO(ARG(n));             /* return result */
+        }
+      }
+
+    case T_NEWCASTRINGLEN:
+      {
+      CHECKIO(1);
+      n = ARG(TOP(1));
+      /* Zap the pointer to the list so it can be GC:ed.
+       * The actual list is protected from GC by evalbytestring().
+       */
+      // ARG(TOP(1)) = combK;
+      struct bytestring bs = evalbytestring(n);
+      GCCHECK(4);
+      n = new_ap(new_ap(combPair, x = alloc_node(T_PTR)), mkInt(bs.size));
+      PTR(x) = bs.string;
+      RETIO(n);
+      }
+
+    case T_PACKCSTRING:
+      {
+      size_t size;
+      CHECKIO(1);
+      cstr = evalptr(ARG(TOP(1)));
+      size = strlen(cstr);
+      char *str = MALLOC(size);
+      memcpy(str, cstr, size);
+      struct bytestring bs = { size, str };
+      RETIO(mkStrNode(bs));
+      }
+
+    case T_PACKCSTRINGLEN:
+      {
+      size_t size;
+      CHECKIO(2);
+      cstr = evalptr(ARG(TOP(1)));
+      size = evalint(ARG(TOP(2)));
+      char *str = MALLOC(size);
+      memcpy(str, cstr, size);
+      struct bytestring bs = { size, str };
+      RETIO(mkStrNode(bs));
+      }
+
+    case T_ARR_ALLOC:
+      {
+      size_t size;
+      NODEPTR elem;
+      struct ioarray *arr;
+      CHECKIO(2);
+      GCCHECK(1);
+      size = evalint(ARG(TOP(1)));
+      elem = ARG(TOP(2));
+      arr = arr_alloc(size, elem);
+      n = alloc_node(T_ARR);
+      ARR(n) = arr;
+      RETIO(n);
+      }
+    case T_ARR_COPY:
+      {
+      struct ioarray *arr;
+      CHECKIO(1);
+      GCCHECK(1);
+      n = evali(ARG(TOP(1)));
+      if (GETTAG(n) != T_ARR)
+        ERR("T_ARR_COPY tag");
+      arr = arr_copy(ARR(n));
+      n = alloc_node(T_ARR);
+      ARR(n) = arr;
+      RETIO(n);
+      }
+    case T_ARR_SIZE:
+      CHECKIO(1);
+      n = evali(ARG(TOP(1)));
+      if (GETTAG(n) != T_ARR)
+        ERR("bad ARR tag");
+      RETIO(mkInt(ARR(n)->size));
+    case T_ARR_READ:
+      {
+      size_t i;
+      CHECKIO(2);
+      i = evalint(ARG(TOP(2)));
+      n = evali(ARG(TOP(1)));
+      if (GETTAG(n) != T_ARR)
+        ERR("bad ARR tag");
+      if (i >= ARR(n)->size)
+        ERR("ARR_READ");
+      RETIO(ARR(n)->array[i]);
+      }
+    case T_ARR_WRITE:
+      {
+      size_t i;
+      CHECKIO(3);
+      i = evalint(ARG(TOP(2)));
+      n = evali(ARG(TOP(1)));
+      if (GETTAG(n) != T_ARR)
+        ERR("bad ARR tag");
+      if (i >= ARR(n)->size) {
+        //PRINT("%d %p %d\n", (int)i, ARR(n), (int)ARR(n)->size);
+        ERR("ARR_WRITE");
+      }
+      ARR(n)->array[i] = ARG(TOP(3));
+      RETIO(combUnit);
+      }
+
+    case T_FPNEW:
+      {
+        CHECKIO(1);
+        //printf("T_FPNEW\n");
+        void *xp = evalptr(ARG(TOP(1)));
+        //printf("T_FPNEW xp=%p\n", xp);
+        n = alloc_node(T_FORPTR);
+        SETFORPTR(n, mkForPtrP(xp));
+        RETIO(n);
+      }
+    case T_FPFIN:
+      {
+        CHECKIO(2);
+        //printf("T_FPFIN\n");
+        struct forptr *xfp = evalforptr(ARG(TOP(2)));
+        //printf("T_FPFIN xfp=%p\n", xfp);
+        HsFunPtr yp = evalfunptr(ARG(TOP(1)));
+        //printf("T_FPFIN yp=%p\n", yp);
+        xfp->finalizer->final = yp;
+        RETIO(combUnit);
+      }
+
+#if 0
+    case T_FPSTR:
+      {
+        CHECKIO(2);
+        //printf("T_FPFIN\n");
+        struct forptr *xfp = evalforptr(ARG(TOP(2)));
+        //printf("T_FPFIN xfp=%p\n", xfp);
+        struct bytestring bs = evalstring(ARG(TOP(1)));
+        //printf("T_FPFIN yp=%p\n", yp);
+        xfp->desc = bs.string;
+        RETIO(combUnit);
+      }
+#endif
+
+    case T_IO_GC:
+      CHECKIO(0);
+      //printf("gc()\n");
+      gc();
+      RETIO(combUnit);
+
+    default:
+      //printf("bad tag %s\n", tag_names[GETTAG(n)]);
+      ERR1("execio tag %d", GETTAG(n));
+    }
+  }
+}
+
+#if WANT_ARGS
+heapoffs_t
+memsize(const char *p)
+{
+  heapoffs_t n = atoi(p);
+  while (isdigit(*p))
+    p++;
+  switch (*p) {
+  case 'k': case 'K': n *= 1000; break;
+  case 'm': case 'M': n *= 1000000; break;
+  case 'g': case 'G': n *= 1000000000; break;
+  default: break;
+  }
+  return n;
+}
+#endif
+
+extern uint8_t *combexpr;
+extern int combexprlen;
+
+MAIN
+{
+  NODEPTR prog;
+#if WANT_ARGS
+  char *inname = 0;
+  char **av;
+  char *progname;
+  char **gargv;
+  int gargc;
+  int inrts;
+#if WANT_TICK
+  int dump_ticks = 0;
+#endif
+#endif
+#if WANT_STDIO
+  char *outname = 0;
+  size_t file_size = 0;
+#endif
+
+#if 0
+  /* MINGW doesn't do buffering right */
+  setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
+  setvbuf(stderr, NULL, _IONBF, BUFSIZ);
+#endif
+
+#ifdef INITIALIZATION
+  main_setup(); /* Do platform specific start-up. */
+#endif
+
+  heap_size = HEAP_CELLS;       /* number of heap cells */
+  stack_size = STACK_SIZE;      /* number of stack slots */
+
+#if WANT_ARGS
+  progname = argv[0];
+  argc--, argv++;
+  gargv = argv;
+  for (av = argv, inrts = 0; argc--; argv++) {
+    char *p = *argv;
+    if (inrts) {
+      if (strcmp(p, "-RTS") == 0) {
+        inrts = 0;
+      } else {
+        if (strcmp(p, "-v") == 0)
+          verbose++;
+#if WANT_TICK
+        else if (strcmp(p, "-T") == 0)
+          dump_ticks = 1;
+#endif
+        else if (strncmp(p, "-H", 2) == 0)
+          heap_size = memsize(&p[2]);
+        else if (strncmp(p, "-K", 2) == 0)
+          stack_size = memsize(&p[2]);
+        else if (strncmp(p, "-r", 2) == 0)
+          inname = &p[2];
+#if WANT_STDIO
+        else if (strncmp(p, "-o", 2) == 0)
+          outname = &p[2];
+        else if (strcmp(p, "-B") == 0)
+          gcbell++;
+#endif  /* WANT_STDIO */
+        else
+          ERR("Usage: eval [+RTS [-v] [-B] [-T] [-Hheap-size] [-Kstack-size] [-rFILE] [-oFILE] -RTS] arg ...");
+      }
+    } else {
+      if (strcmp(p, "+RTS") == 0) {
+        inrts = 1;
+      } else {
+        *av++ = p;
+      }
+    }
+  }
+  gargc = av - gargv;
+
+  if (inname == 0)
+    inname = "out.comb";
+#endif
+
+  init_nodes();
+  stack = MALLOC(sizeof(NODEPTR) * stack_size);
+  if (!stack)
+    memerr();
+  stack_ptr = -1;
+  num_reductions = 0;
+
+#if WANT_ARGS
+  /* Initialize an IORef (i.e., single element IOArray
+   * to contain the list of program arguments.
+   * The 0th element is the program name, and the rest
+   * are the non RTS arguments.
+   */
+  {
+    NODEPTR n;
+    /* No GC checks, the heap is empty. */
+    n = mkNil();
+    for(int i = gargc-1; i >= 0; i--) {
+      n = mkCons(mkStringC(gargv[i]), n);
+    }
+    n = mkCons(mkStringC(progname), n);
+    argarray = arr_alloc(1, n);      /* An IORef contains a single element array */
+    argarray->permanent = 1;         /* never GC the arguments, because a T_IO_GETARGREF can reach argarray */
+  }
+#endif  /* WANT_ARGS */
+
+  if (combexpr) {
+    int c;
+    BFILE *bf = openb_rd_buf(combexpr, combexprlen);
+    c = getb(bf);
+    /* Compressed combinators start with a 'Z' or 'z', otherwise 'v' (for version) */
+    if (c == 'z') {
+      /* add LZ77 compressor transducer */
+      bf = add_lz77_decompressor(bf);
+    } else {
+      /* put it back, we need it */
+      ungetb(c, bf);
+    }
+    prog = parse_top(bf);
+    closeb(bf);
+#if WANT_STDIO
+    file_size = combexprlen;
+#endif
+  } else {
+#if WANT_STDIO
+    prog = parse_file(inname, &file_size);
+#else
+    ERR("no stdio");
+#endif
+  }
+
+  /* GC unused stuff, nice for -o */
+  PUSH(prog);
+  want_gc_red = 1;
+  gc();
+  gc();                         /* this finds some more GC reductions */
+  want_gc_red = 0;
+  prog = POPTOP();
+
+#if WANT_STDIO
+  heapoffs_t start_size = num_marked;
+  if (outname) {
+    /* Save GCed file (smaller), and exit. */
+    FILE *out = fopen(outname, "w");
+    if (!out)
+      ERR1("cannot open output file %s", outname);
+    struct BFILE *bf = add_FILE(out);
+    printb(bf, prog, 1);
+    closeb(bf);
+    EXIT(0);
+  }
+  if (verbose > 2) {
+    pp(stdout, prog);
+  }
+#endif
+  run_time -= GETTIMEMILLI();
+  PUSH(prog);
+  topnode = &TOP(0);
+  execio(&TOP(0));
+  prog = TOP(0);
+  POP(1);
+#if SANITY
+  if (GETTAG(prog) != T_AP || GETTAG(FUN(prog)) != T_IO_RETURN)
+    ERR("main execio");
+  NODEPTR res = evali(ARG(prog));
+  if (GETTAG(res) != T_I)
+    ERR("main execio I");
+#endif
+  /* Flush standard handles in case there is some BFILE buffering */
+  flushb((BFILE*)FORPTR(comb_stdout)->payload.string);
+  flushb((BFILE*)FORPTR(comb_stderr)->payload.string);
+  gc();                      /* Run finalizers */
+  run_time += GETTIMEMILLI();
+
+#if WANT_STDIO
+  if (verbose) {
+    if (verbose > 1) {
+      PRINT("node size=%"PRIheap", heap size bytes=%"PRIheap"\n", (heapoffs_t)NODE_SIZE, heap_size * NODE_SIZE);
+    }
+    setlocale(LC_NUMERIC, "");  /* Make %' work on platforms that support it */
+    PRINT("%"PCOMMA"15"PRIheap" combinator file size\n", (heapoffs_t)file_size);
+    PRINT("%"PCOMMA"15"PRIheap" cells at start\n", start_size);
+    PRINT("%"PCOMMA"15"PRIheap" cells heap size (%"PCOMMA""PRIheap" bytes)\n", heap_size, heap_size * NODE_SIZE);
+    PRINT("%"PCOMMA"15"PRIcounter" cells allocated (%"PCOMMA".1f Mbyte/s)\n", num_alloc, num_alloc * NODE_SIZE / ((double)run_time / 1000) / 1000000);
+    PRINT("%"PCOMMA"15"PRIcounter" GCs\n", num_gc);
+    PRINT("%"PCOMMA"15"PRIcounter" max cells used\n", max_num_marked);
+    PRINT("%"PCOMMA"15"PRIcounter" reductions (%"PCOMMA".1f Mred/s)\n", num_reductions, num_reductions / ((double)run_time / 1000) / 1000000);
+    PRINT("%"PCOMMA"15"PRIcounter" array alloc\n", num_arr_alloc);
+    PRINT("%"PCOMMA"15"PRIcounter" array free\n", num_arr_free);
+    PRINT("%"PCOMMA"15"PRIcounter" foreign alloc\n", num_fin_alloc);
+    PRINT("%"PCOMMA"15"PRIcounter" foreign free\n", num_fin_free);
+    PRINT("%"PCOMMA"15"PRIcounter" bytestring alloc (max %"PCOMMA""PRIcounter")\n", num_bs_alloc, num_bs_alloc_max);
+    PRINT("%"PCOMMA"15"PRIcounter" bytestring alloc bytes (max %"PCOMMA""PRIcounter")\n", num_bs_bytes, num_bs_inuse_max);
+    PRINT("%"PCOMMA"15"PRIcounter" bytestring free\n", num_bs_free);
+#if MAXSTACKDEPTH
+    PRINT("%"PCOMMA"15d max stack depth\n", (int)max_stack_depth);
+    PRINT("%"PCOMMA"15d max C stack depth\n", (int)max_c_stack);
+#endif
+    // PRINT("%"PCOMMA"15"PRIcounter" max mark depth\n", max_mark_depth);
+    PRINT("%15.2fs total expired time\n", (double)run_time / 1000);
+    PRINT("%15.2fs total gc time (%.2f + %.2f)\n",
+          (double)(gc_mark_time + gc_scan_time) / 1000,
+          (double)gc_mark_time / 1000,
+          (double)gc_scan_time / 1000);
+#if GCRED
+    PRINT(" GC reductions A=%"PRIcounter", K=%"PRIcounter", I=%"PRIcounter", int=%"PRIcounter", flip=%"PRIcounter", BI=%"PRIcounter", BxI=%"PRIcounter", C'BxI=%"PRIcounter", CC=%"PRIcounter"\n",
+          red_a, red_k, red_i, red_int, red_flip, red_bi, red_bxi, red_ccbi, red_cc);
+    PRINT(" special reductions B'=%"PRIcounter" K4=%"PRIcounter" K3=%"PRIcounter" K2=%"PRIcounter" C'B=%"PRIcounter", Z=%"PRIcounter", R=%"PRIcounter"\n",
+          red_bb, red_k4, red_k3, red_k2, red_ccb, red_z, red_r);
+#endif
+  }
+#endif  /* WANT_STDIO */
+
+#if WANT_TICK
+  if (dump_ticks) {
+    dump_tick_table(stdout);
+  }
+#endif
+
+#ifdef TEARDOWN
+  main_teardown(); /* do some platform specific teardown */
+#endif
+  EXIT(0);
+}
+
+#if WANT_MD5
+#include "md5.c"
+#endif  /* WANT_MD5 */
+
+#if WANT_LZ77
+#include "lz77.c"
+#endif
+
+/*********************/
+/* FFI adapters      */
+
+#define MHS_FROM(name, set, type) \
+void \
+name(stackptr_t stk, int n, type x) \
+{ \
+  NODEPTR r = TOP(0);           /* The pre-allocated cell for the result, */ \
+  CHECKIO(n+1);                 /* Check that we actually had the right number of arguments. */ \
+  set(r, x);                    /* Put result in pre-allocated cell. */ \
+}
+MHS_FROM(mhs_from_FloatW, SETDBL, flt_t);
+MHS_FROM(mhs_from_Int, SETINT, value_t);
+MHS_FROM(mhs_from_Word, SETINT, uvalue_t);
+MHS_FROM(mhs_from_Word8, SETINT, uvalue_t);
+MHS_FROM(mhs_from_Ptr, SETPTR, void*);
+MHS_FROM(mhs_from_ForPtr, SETFORPTR, struct forptr *);
+MHS_FROM(mhs_from_FunPtr, SETFUNPTR, HsFunPtr);
+MHS_FROM(mhs_from_CChar, SETINT, char);
+MHS_FROM(mhs_from_CSChar, SETINT, signed char);
+MHS_FROM(mhs_from_CUChar, SETINT, unsigned char);
+MHS_FROM(mhs_from_CShort, SETINT, short);
+MHS_FROM(mhs_from_CUShort, SETINT, unsigned short);
+MHS_FROM(mhs_from_CInt, SETINT, int);
+MHS_FROM(mhs_from_CUInt, SETINT, unsigned int);
+MHS_FROM(mhs_from_CLong, SETINT, long);
+MHS_FROM(mhs_from_CULong, SETINT, unsigned long);
+MHS_FROM(mhs_from_CLLong, SETINT, long long);
+MHS_FROM(mhs_from_CULLong, SETINT, unsigned long long);
+MHS_FROM(mhs_from_CSize, SETINT, size_t);
+#if WANT_TIME
+MHS_FROM(mhs_from_CTime, SETINT, time_t);
+#endif
+// MHS_FROM(mhs_from_CSSize, SETINT, ssize_t);
+MHS_FROM(mhs_from_CIntPtr, SETINT, intptr_t);
+MHS_FROM(mhs_from_CUIntPtr, SETINT, uintptr_t);
+void
+mhs_from_Unit(stackptr_t stk, int n)
+{
+  CHECKIO(n+1);                 /* Check that we actually had the right number of arguments. */
+  TOP(0) = combUnit;            /* Put result on top of stack */
+}
+
+#define MHS_TO(name, eval, type) \
+type name(stackptr_t stk, int n) \
+{ \
+  return eval(ARG(TOP(n+2)));                /* The stack has a reserved cell, and the FFI node on top of the arguments */ \
+}
+MHS_TO(mhs_to_FloatW, evaldbl, flt_t);
+MHS_TO(mhs_to_Int, evalint, value_t);
+MHS_TO(mhs_to_Word, evalint, uvalue_t);
+MHS_TO(mhs_to_Word8, evalint, uint8_t);
+MHS_TO(mhs_to_Ptr, evalptr, void*);
+MHS_TO(mhs_to_FunPtr, evalfunptr, HsFunPtr);
+MHS_TO(mhs_to_CChar, evalint, char);
+MHS_TO(mhs_to_CSChar, evalint, signed char);
+MHS_TO(mhs_to_CUChar, evalint, unsigned char);
+MHS_TO(mhs_to_CShort, evalint, short);
+MHS_TO(mhs_to_CUShort, evalint, unsigned short);
+MHS_TO(mhs_to_CInt, evalint, int);
+MHS_TO(mhs_to_CUInt, evalint, unsigned int);
+MHS_TO(mhs_to_CLong, evalint, long);
+MHS_TO(mhs_to_CULong, evalint, unsigned long);
+MHS_TO(mhs_to_CLLong, evalint, long long);
+MHS_TO(mhs_to_CULLong, evalint, unsigned long long);
+MHS_TO(mhs_to_CSize, evalint, size_t);
+#if WANT_TIME
+MHS_TO(mhs_to_CTime, evalint, time_t);
+#endif
+// MHS_TO(mhs_to_CSSize, evalint, ssize_t);
+MHS_TO(mhs_to_CIntPtr, evalint, intptr_t);
+MHS_TO(mhs_to_CUIntPtr, evalint, uintptr_t);
+
+
+/* The rest of this file was generated by the compiler, with some minor edits with #if. */
+void mhs_GETRAW(int s) { mhs_from_Int(s, 0, GETRAW()); }
+void mhs_GETTIMEMILLI(int s) { mhs_from_Int(s, 0, GETTIMEMILLI()); }
+#if WANT_MATH
+#if WORD_SIZE == 64
+void mhs_acos(int s) { mhs_from_FloatW(s, 1, acos(mhs_to_FloatW(s, 0))); }
+void mhs_asin(int s) { mhs_from_FloatW(s, 1, asin(mhs_to_FloatW(s, 0))); }
+void mhs_atan(int s) { mhs_from_FloatW(s, 1, atan(mhs_to_FloatW(s, 0))); }
+void mhs_atan2(int s) { mhs_from_FloatW(s, 2, atan2(mhs_to_FloatW(s, 0), mhs_to_FloatW(s, 1))); }
+void mhs_cos(int s) { mhs_from_FloatW(s, 1, cos(mhs_to_FloatW(s, 0))); }
+void mhs_exp(int s) { mhs_from_FloatW(s, 1, exp(mhs_to_FloatW(s, 0))); }
+void mhs_log(int s) { mhs_from_FloatW(s, 1, log(mhs_to_FloatW(s, 0))); }
+void mhs_sin(int s) { mhs_from_FloatW(s, 1, sin(mhs_to_FloatW(s, 0))); }
+void mhs_sqrt(int s) { mhs_from_FloatW(s, 1, sqrt(mhs_to_FloatW(s, 0))); }
+void mhs_tan(int s) { mhs_from_FloatW(s, 1, tan(mhs_to_FloatW(s, 0))); }
+#elif WORD_SIZE == 32  /* WORD_SIZE */
+void mhs_acos(int s) { mhs_from_FloatW(s, 1, acosf(mhs_to_FloatW(s, 0))); }
+void mhs_asin(int s) { mhs_from_FloatW(s, 1, asinf(mhs_to_FloatW(s, 0))); }
+void mhs_atan(int s) { mhs_from_FloatW(s, 1, atanf(mhs_to_FloatW(s, 0))); }
+void mhs_atan2(int s) { mhs_from_FloatW(s, 2, atan2f(mhs_to_FloatW(s, 0), mhs_to_FloatW(s, 1))); }
+void mhs_cos(int s) { mhs_from_FloatW(s, 1, cosf(mhs_to_FloatW(s, 0))); }
+void mhs_exp(int s) { mhs_from_FloatW(s, 1, expf(mhs_to_FloatW(s, 0))); }
+void mhs_log(int s) { mhs_from_FloatW(s, 1, logf(mhs_to_FloatW(s, 0))); }
+void mhs_sin(int s) { mhs_from_FloatW(s, 1, sinf(mhs_to_FloatW(s, 0))); }
+void mhs_sqrt(int s) { mhs_from_FloatW(s, 1, sqrtf(mhs_to_FloatW(s, 0))); }
+void mhs_tan(int s) { mhs_from_FloatW(s, 1, tanf(mhs_to_FloatW(s, 0))); }
+#else
+#error Unknown WORD_SIZE
+#endif  /* WORD_SIZE */
+#endif  /* WANT_MATH */
+
+#if WANT_STDIO
+void mhs_add_FILE(int s) { mhs_from_Ptr(s, 1, add_FILE(mhs_to_Ptr(s, 0))); }
+void mhs_add_utf8(int s) { mhs_from_Ptr(s, 1, add_utf8(mhs_to_Ptr(s, 0))); }
+void mhs_closeb(int s) { closeb(mhs_to_Ptr(s, 0)); mhs_from_Unit(s, 1); }
+void mhs_addr_closeb(int s) { mhs_from_FunPtr(s, 0, (HsFunPtr)&closeb); }
+void mhs_flushb(int s) { flushb(mhs_to_Ptr(s, 0)); mhs_from_Unit(s, 1); }
+void mhs_fopen(int s) { mhs_from_Ptr(s, 2, fopen(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }
+
+void mhs_getb(int s) { mhs_from_Int(s, 1, getb(mhs_to_Ptr(s, 0))); }
+void mhs_putb(int s) { putb(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_ungetb(int s) { ungetb(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_openwrbuf(int s) { mhs_from_Ptr(s, 0, openb_wr_buf()); }
+void mhs_openrdbuf(int s) { mhs_from_Ptr(s, 2, openb_rd_buf(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }
+void mhs_getbuf(int s) { get_buf(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2));  mhs_from_Unit(s, 3); }
+void mhs_system(int s) { mhs_from_Int(s, 1, system(mhs_to_Ptr(s, 0))); }
+void mhs_tmpname(int s) { mhs_from_Ptr(s, 2, TMPNAME(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }
+void mhs_unlink(int s) { mhs_from_Int(s, 1, unlink(mhs_to_Ptr(s, 0))); }
+void mhs_readb(int s) { mhs_from_Int(s, 3, readb(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1), mhs_to_Ptr(s, 2))); }
+void mhs_writeb(int s) { mhs_from_Int(s, 3, writeb(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1), mhs_to_Ptr(s, 2))); }
+#endif  /* WANT_STDIO */
+
+#if WANT_MD5
+void mhs_md5Array(int s) { md5Array(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2)); mhs_from_Unit(s, 3); }
+void mhs_md5BFILE(int s) { md5BFILE(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_md5String(int s) { md5String(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
+#endif  /* WANT_MD5 */
+
+#if WANT_LZ77
+void mhs_add_lz77_compressor(int s) { mhs_from_Ptr(s, 1, add_lz77_compressor(mhs_to_Ptr(s, 0))); }
+void mhs_add_lz77_decompressor(int s) { mhs_from_Ptr(s, 1, add_lz77_decompressor(mhs_to_Ptr(s, 0))); }
+void mhs_lz77c(int s) { mhs_from_CSize(s, 3, lz77c(mhs_to_Ptr(s, 0), mhs_to_CSize(s, 1), mhs_to_Ptr(s, 2))); }
+#endif  /* WANT_LZ77 */
+
+#if WANT_RLE
+void mhs_add_rle_compressor(int s) { mhs_from_Ptr(s, 1, add_rle_compressor(mhs_to_Ptr(s, 0))); }
+void mhs_add_rle_decompressor(int s) { mhs_from_Ptr(s, 1, add_rle_decompressor(mhs_to_Ptr(s, 0))); }
+#endif  /* WANT_RLE */
+
+#if WANT_BWT
+void mhs_add_bwt_compressor(int s) { mhs_from_Ptr(s, 1, add_bwt_compressor(mhs_to_Ptr(s, 0))); }
+void mhs_add_bwt_decompressor(int s) { mhs_from_Ptr(s, 1, add_bwt_decompressor(mhs_to_Ptr(s, 0))); }
+#endif  /* WANT_BWT */
+
+void mhs_calloc(int s) { mhs_from_Ptr(s, 2, calloc(mhs_to_CSize(s, 0), mhs_to_CSize(s, 1))); }
+void mhs_free(int s) { free(mhs_to_Ptr(s, 0)); mhs_from_Unit(s, 1); }
+void mhs_addr_free(int s) { mhs_from_FunPtr(s, 0, (HsFunPtr)&FREE); }
+void mhs_getenv(int s) { mhs_from_Ptr(s, 1, getenv(mhs_to_Ptr(s, 0))); }
+void mhs_iswindows(int s) { mhs_from_Int(s, 0, iswindows()); }
+void mhs_malloc(int s) { mhs_from_Ptr(s, 1, MALLOC(mhs_to_CSize(s, 0))); }
+void mhs_memcpy(int s) { memcpy(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_CSize(s, 2)); mhs_from_Unit(s, 3); }
+void mhs_memmove(int s) { memmove(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_CSize(s, 2)); mhs_from_Unit(s, 3); }
+void mhs_peekPtr(int s) { mhs_from_Ptr(s, 1, peekPtr(mhs_to_Ptr(s, 0))); }
+void mhs_peekWord(int s) { mhs_from_Word(s, 1, peekWord(mhs_to_Ptr(s, 0))); }
+void mhs_pokePtr(int s) { pokePtr(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_pokeWord(int s) { pokeWord(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); mhs_from_Unit(s, 2); }
+
+void mhs_peek_uint8(int s) { mhs_from_Word(s, 1, peek_uint8(mhs_to_Ptr(s, 0))); }
+void mhs_poke_uint8(int s) { poke_uint8(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_peek_uint16(int s) { mhs_from_Word(s, 1, peek_uint16(mhs_to_Ptr(s, 0))); }
+void mhs_poke_uint16(int s) { poke_uint16(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); mhs_from_Unit(s, 2); }
+#if WORD_SIZE >= 32
+void mhs_peek_uint32(int s) { mhs_from_Word(s, 1, peek_uint32(mhs_to_Ptr(s, 0))); }
+void mhs_poke_uint32(int s) { poke_uint32(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); mhs_from_Unit(s, 2); }
+#endif  /* WORD_SIZE */
+#if WORD_SIZE >= 64
+void mhs_peek_uint64(int s) { mhs_from_Word(s, 1, peek_uint64(mhs_to_Ptr(s, 0))); }
+void mhs_poke_uint64(int s) { poke_uint64(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); mhs_from_Unit(s, 2); }
+#endif  /* WORD_SIZE */
+void mhs_peek_uint(int s) { mhs_from_Word(s, 1, peek_uint(mhs_to_Ptr(s, 0))); }
+void mhs_poke_uint(int s) { poke_uint(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); mhs_from_Unit(s, 2); }
+
+void mhs_peek_int8(int s) { mhs_from_Int(s, 1, peek_int8(mhs_to_Ptr(s, 0))); }
+void mhs_poke_int8(int s) { poke_int8(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_peek_int16(int s) { mhs_from_Int(s, 1, peek_int16(mhs_to_Ptr(s, 0))); }
+void mhs_poke_int16(int s) { poke_int16(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); mhs_from_Unit(s, 2); }
+#if WORD_SIZE >= 32
+void mhs_peek_int32(int s) { mhs_from_Int(s, 1, peek_int32(mhs_to_Ptr(s, 0))); }
+void mhs_poke_int32(int s) { poke_int32(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); mhs_from_Unit(s, 2); }
+#endif  /* WORD_SIZE */
+#if WORD_SIZE >= 64
+void mhs_peek_int64(int s) { mhs_from_Int(s, 1, peek_int64(mhs_to_Ptr(s, 0))); }
+void mhs_poke_int64(int s) { poke_int64(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); mhs_from_Unit(s, 2); }
+#endif  /* WORD_SIZE */
+void mhs_peek_int(int s) { mhs_from_Int(s, 1, peek_int(mhs_to_Ptr(s, 0))); }
+void mhs_poke_int(int s) { poke_int(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_peek_llong(int s) { mhs_from_CLLong(s, 1, peek_llong(mhs_to_Ptr(s, 0))); }
+void mhs_peek_long(int s) { mhs_from_CLong(s, 1, peek_long(mhs_to_Ptr(s, 0))); }
+void mhs_peek_ullong(int s) { mhs_from_CULLong(s, 1, peek_ullong(mhs_to_Ptr(s, 0))); }
+void mhs_peek_ulong(int s) { mhs_from_CULong(s, 1, peek_ulong(mhs_to_Ptr(s, 0))); }
+void mhs_poke_llong(int s) { poke_llong(mhs_to_Ptr(s, 0), mhs_to_CLLong(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_poke_long(int s) { poke_long(mhs_to_Ptr(s, 0), mhs_to_CLong(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_poke_ullong(int s) { poke_ullong(mhs_to_Ptr(s, 0), mhs_to_CULLong(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_poke_ulong(int s) { poke_ulong(mhs_to_Ptr(s, 0), mhs_to_CULong(s, 1)); mhs_from_Unit(s, 2); }
+#if WANT_FLOAT
+void mhs_peek_flt(int s) { mhs_from_FloatW(s, 1, peek_flt(mhs_to_Ptr(s, 0))); }
+void mhs_poke_flt(int s) { poke_flt(mhs_to_Ptr(s, 0), mhs_to_FloatW(s, 1)); mhs_from_Unit(s, 2); }
+#endif  /* WANT_FLOAT */
+void mhs_sizeof_int(int s) { mhs_from_Int(s, 0, sizeof(int)); }
+void mhs_sizeof_llong(int s) { mhs_from_Int(s, 0, sizeof(long long)); }
+void mhs_sizeof_long(int s) { mhs_from_Int(s, 0, sizeof(long)); }
+#if WANT_DIR
+void mhs_closedir(int s) { mhs_from_Int(s, 1, closedir(mhs_to_Ptr(s, 0))); }
+void mhs_opendir(int s) { mhs_from_Ptr(s, 1, opendir(mhs_to_Ptr(s, 0))); }
+void mhs_readdir(int s) { mhs_from_Ptr(s, 1, readdir(mhs_to_Ptr(s, 0))); }
+void mhs_c_d_name(int s) { mhs_from_Ptr(s, 1, ((struct dirent *)(mhs_to_Ptr(s, 0)))->d_name); }
+void mhs_chdir(int s) { mhs_from_Int(s, 1, chdir(mhs_to_Ptr(s, 0))); }
+void mhs_mkdir(int s) { mhs_from_Int(s, 2, mkdir(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }
+void mhs_getcwd(int s) { mhs_from_Ptr(s, 2, getcwd(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }
+#endif  /* WANT_DIR */
+
+/* Use this to detect if we have (and want) GMP or not. */
+void mhs_want_gmp(int s) { mhs_from_Int(s, 0, WANT_GMP); }
+
+#if WANT_GMP
+void
+free_mpz(void *p)
+{
+  /*  printf("free_mpz %p\n", p);*/
+  mpz_clear(p);                 /* free any extra storage */
+  FREE(p);                      /* and free the mpz itself */
+}
+
+/* Allocate an initialize a GMP integer */
+struct forptr *
+new_mpz(void)
+{
+#if 0
+  {
+    static int done = 0;
+    if (!done) {
+      printf("GMP\n");
+      done = 1;
+    }
+  }
+#endif
+  mpz_ptr p = MALLOC(sizeof(*p));
+  if (!p)
+    memerr();
+  mpz_init(p);
+  struct forptr *fp = mkForPtrP(p);
+  fp->finalizer->final = (HsFunPtr)free_mpz;
+  fp->finalizer->fptype = FP_MPZ;
+  /*  printf("new_mpz %p %p\n", p, fp); */
+  return fp;
+}
+
+#if 0
+void
+print_mpz(mpz_ptr p)
+{
+  mpz_out_str(stdout, 10, p);
+}
+#endif
+
+void mhs_new_mpz(int s) { mhs_from_ForPtr(s, 0, new_mpz()); }
+
+/* Stubs for GMP functions */
+void mhs_mpz_abs(int s) { mpz_abs(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_mpz_add(int s) { mpz_add(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); mhs_from_Unit(s, 3); }
+void mhs_mpz_and(int s) { mpz_and(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); mhs_from_Unit(s, 3); }
+void mhs_mpz_cmp(int s) { mhs_from_Int(s, 2, mpz_cmp(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }
+void mhs_mpz_get_d(int s) { mhs_from_FloatW(s, 1, mpz_get_d(mhs_to_Ptr(s, 0))); }
+void mhs_mpz_get_si(int s) { mhs_from_Int(s, 1, mpz_get_si(mhs_to_Ptr(s, 0))); }
+void mhs_mpz_get_ui(int s) { mhs_from_Word(s, 1, mpz_get_ui(mhs_to_Ptr(s, 0))); }
+void mhs_mpz_init_set_si(int s) { mpz_init_set_si(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_mpz_init_set_ui(int s) { mpz_init_set_ui(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_mpz_ior(int s) { mpz_ior(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); mhs_from_Unit(s, 3); }
+void mhs_mpz_mul(int s) { mpz_mul(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); mhs_from_Unit(s, 3); }
+void mhs_mpz_mul_2exp(int s) { mpz_mul_2exp(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2)); mhs_from_Unit(s, 3); }
+void mhs_mpz_neg(int s) { mpz_neg(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_mpz_popcount(int s) {
+  mpz_ptr a = mhs_to_Ptr(s, 0);
+  if (mpz_sgn(a) < 0) {
+    mpz_t neg_a;
+    mpz_init(neg_a);
+    mpz_neg(neg_a, a);
+    mhs_from_Int(s, 1, -mpz_popcount(neg_a));
+    mpz_clear(neg_a);
+  } else {
+    mhs_from_Int(s, 1, mpz_popcount(a));
+  }
+}
+void mhs_mpz_sub(int s) { mpz_sub(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); mhs_from_Unit(s, 3); }
+void mhs_mpz_fdiv_q_2exp(int s) { mpz_fdiv_q_2exp(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2)); mhs_from_Unit(s, 3); }
+void mhs_mpz_tdiv_qr(int s) { mpz_tdiv_qr(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2), mhs_to_Ptr(s, 3)); mhs_from_Unit(s, 4); }
+void mhs_mpz_tstbit(int s) { mhs_from_Int(s, 2, mpz_tstbit(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }
+void mhs_mpz_xor(int s) { mpz_xor(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); mhs_from_Unit(s, 3); }
+#endif  /* WANT_GMP */
+
+struct ffi_entry ffi_table[] = {
+{ "GETRAW", mhs_GETRAW},
+{ "GETTIMEMILLI", mhs_GETTIMEMILLI},
+#if WANT_MATH
+{ "acos", mhs_acos},
+{ "asin", mhs_asin},
+{ "atan", mhs_atan},
+{ "atan2", mhs_atan2},
+{ "cos", mhs_cos},
+{ "exp", mhs_exp},
+{ "log", mhs_log},
+{ "sin", mhs_sin},
+{ "sqrt", mhs_sqrt},
+{ "tan", mhs_tan},
+#endif  /* WANT_MATH */
+
+#if WANT_STDIO
+{ "add_FILE", mhs_add_FILE},
+{ "add_utf8", mhs_add_utf8},
+{ "closeb", mhs_closeb},
+{ "&closeb", mhs_addr_closeb},
+{ "flushb", mhs_flushb},
+{ "fopen", mhs_fopen},
+{ "getb", mhs_getb},
+{ "putb", mhs_putb},
+{ "ungetb", mhs_ungetb},
+{ "openb_wr_buf", mhs_openwrbuf},
+{ "openb_rd_buf", mhs_openrdbuf},
+{ "get_buf", mhs_getbuf},
+{ "system", mhs_system},
+{ "tmpname", mhs_tmpname},
+{ "unlink", mhs_unlink},
+{ "readb", mhs_readb},
+{ "writeb", mhs_writeb},
+#endif  /* WANT_STDIO */
+
+#if WANT_MD5
+{ "md5Array", mhs_md5Array},
+{ "md5BFILE", mhs_md5BFILE},
+{ "md5String", mhs_md5String},
+#endif  /* WANT_MD5 */
+
+#if WANT_LZ77
+{ "add_lz77_compressor", mhs_add_lz77_compressor},
+{ "add_lz77_decompressor", mhs_add_lz77_decompressor},
+{ "lz77c", mhs_lz77c},
+#endif  /* WANT_LZ77 */
+
+#if WANT_RLE
+{ "add_rle_compressor", mhs_add_rle_compressor},
+{ "add_rle_decompressor", mhs_add_rle_decompressor},
+#endif  /* WANT_RLE */
+
+#if WANT_BWT
+{ "add_bwt_compressor", mhs_add_bwt_compressor},
+{ "add_bwt_decompressor", mhs_add_bwt_decompressor},
+#endif  /* WANT_RLE */
+
+{ "calloc", mhs_calloc},
+{ "free", mhs_free},
+{ "&free", mhs_addr_free},
+{ "getenv", mhs_getenv},
+{ "iswindows", mhs_iswindows},
+{ "malloc", mhs_malloc},
+{ "memcpy", mhs_memcpy},
+{ "memmove", mhs_memmove},
+{ "peekPtr", mhs_peekPtr},
+{ "peekWord", mhs_peekWord},
+{ "pokePtr", mhs_pokePtr},
+{ "pokeWord", mhs_pokeWord},
+
+{ "peek_uint8", mhs_peek_uint8},
+{ "poke_uint8", mhs_poke_uint8},
+{ "peek_uint16", mhs_peek_uint16},
+{ "poke_uint16", mhs_poke_uint16},
+#if WORD_SIZE >= 32
+{ "peek_uint32", mhs_peek_uint32},
+{ "poke_uint32", mhs_poke_uint32},
+#endif  /* WORD_SIZE >= 32 */
+#if WORD_SIZE >= 64
+{ "peek_uint64", mhs_peek_uint64},
+{ "poke_uint64", mhs_poke_uint64},
+#endif  /* WORD_SIZE >= 64 */
+{ "peek_uint", mhs_peek_uint},
+{ "poke_uint", mhs_poke_uint},
+
+{ "peek_int8", mhs_peek_int8},
+{ "poke_int8", mhs_poke_int8},
+{ "peek_int16", mhs_peek_int16},
+{ "poke_int16", mhs_poke_int16},
+#if WORD_SIZE >= 32
+{ "peek_int32", mhs_peek_int32},
+{ "poke_int32", mhs_poke_int32},
+#endif  /* WORD_SIZE >= 32 */
+#if WORD_SIZE >= 64
+{ "peek_int64", mhs_peek_int64},
+{ "poke_int64", mhs_poke_int64},
+#endif  /* WORD_SIZE >= 64 */
+{ "peek_int", mhs_peek_int},
+{ "poke_int", mhs_poke_int},
+{ "peek_llong", mhs_peek_llong},
+{ "peek_long", mhs_peek_long},
+{ "peek_ullong", mhs_peek_ullong},
+{ "peek_ulong", mhs_peek_ulong},
+{ "poke_llong", mhs_poke_llong},
+{ "poke_long", mhs_poke_long},
+{ "poke_ullong", mhs_poke_ullong},
+{ "poke_ulong", mhs_poke_ulong},
+#if WANT_FLOAT
+{ "poke_flt", mhs_poke_flt},
+{ "poke_flt", mhs_poke_flt},
+#endif  /* WANT_FLOAT */
+{ "sizeof_int", mhs_sizeof_int},
+{ "sizeof_llong", mhs_sizeof_llong},
+{ "sizeof_long", mhs_sizeof_long},
+#if WANT_DIR
+{ "c_d_name", mhs_c_d_name},
+{ "closedir", mhs_closedir},
+{ "opendir", mhs_opendir},
+{ "readdir", mhs_readdir},
+{ "chdir", mhs_chdir},
+{ "mkdir", mhs_mkdir},
+{ "getcwd", mhs_getcwd},
+#endif  /* WANT_DIR */
+{ "want_gmp", mhs_want_gmp},
+#if WANT_GMP
+{ "new_mpz", mhs_new_mpz},
+{ "mpz_abs", mhs_mpz_abs},
+{ "mpz_add", mhs_mpz_add},
+{ "mpz_and", mhs_mpz_and},
+{ "mpz_cmp", mhs_mpz_cmp},
+{ "mpz_get_d", mhs_mpz_get_d},
+{ "mpz_get_si", mhs_mpz_get_si},
+{ "mpz_get_ui", mhs_mpz_get_ui},
+{ "mpz_init_set_si", mhs_mpz_init_set_si},
+{ "mpz_init_set_ui", mhs_mpz_init_set_ui},
+{ "mpz_ior", mhs_mpz_ior},
+{ "mpz_mul", mhs_mpz_mul},
+{ "mpz_mul_2exp", mhs_mpz_mul_2exp},
+{ "mpz_neg", mhs_mpz_neg},
+{ "mpz_popcount", mhs_mpz_popcount},
+{ "mpz_sub", mhs_mpz_sub},
+{ "mpz_fdiv_q_2exp", mhs_mpz_fdiv_q_2exp},
 { "mpz_tdiv_qr", mhs_mpz_tdiv_qr},
 { "mpz_tstbit", mhs_mpz_tstbit},
 { "mpz_xor", mhs_mpz_xor},
diff --git a/tests/Arith.hs b/tests/Arith.hs
--- a/tests/Arith.hs
+++ b/tests/Arith.hs
@@ -6,7 +6,7 @@
 
 main :: IO ()
 main = do
-  putStrLn $ show [ op x y | x <- vals, y <- vals, op <- [(+),( - ),(*)] ]
-  putStrLn $ show [ op x y | x <- vals, y <- vals, y /= 0, op <- [quot, rem] ]
-  putStrLn $ show [ op x y | x <- vals, y <- vals, op <- [(==),(/=),(<),(<=),(>),(>=)] ]
-  putStrLn $ show [ op x y | x <- vals, y <- vals, let op = compare ]
+  print [ op x y | x <- vals, y <- vals, op <- [(+),( - ),(*)] ]
+  print [ op x y | x <- vals, y <- vals, y /= 0, op <- [quot, rem] ]
+  print [ op x y | x <- vals, y <- vals, op <- [(==),(/=),(<),(<=),(>),(>=)] ]
+  print [ op x y | x <- vals, y <- vals, let op = compare ]
diff --git a/tests/Array.hs b/tests/Array.hs
--- a/tests/Array.hs
+++ b/tests/Array.hs
@@ -19,4 +19,3 @@
   print $ a // [(1,'w')]
   print $ fmap fromEnum a
   print $ ixmap (0,2) succ a
-  
diff --git a/tests/Bang.hs b/tests/Bang.hs
--- a/tests/Bang.hs
+++ b/tests/Bang.hs
@@ -14,4 +14,3 @@
   print (2 !3)
   print (2!3)
   print (f 1)
-  
diff --git a/tests/Bounded.hs b/tests/Bounded.hs
new file mode 100644
--- /dev/null
+++ b/tests/Bounded.hs
@@ -0,0 +1,16 @@
+module Bounded where
+
+import Data.Int
+import Data.Word
+
+printBounds :: forall a. (Bounded a, Show a) => IO ()
+printBounds = print (minBound @a, maxBound @a)
+
+main :: IO ()
+main = do
+  printBounds @Int8
+  printBounds @Int16
+  printBounds @Int32
+  printBounds @Word8
+  printBounds @Word16
+  printBounds @Word32
diff --git a/tests/Bounded.ref b/tests/Bounded.ref
new file mode 100644
--- /dev/null
+++ b/tests/Bounded.ref
@@ -0,0 +1,6 @@
+(-128,127)
+(-32768,32767)
+(-2147483648,2147483647)
+(0,255)
+(0,65535)
+(0,4294967295)
diff --git a/tests/ByteStringIO.hs b/tests/ByteStringIO.hs
new file mode 100644
--- /dev/null
+++ b/tests/ByteStringIO.hs
@@ -0,0 +1,15 @@
+module ByteStringIO where
+
+import Data.ByteString as BS hiding (map)
+import Data.Char
+import System.IO (stdout)
+
+text :: ByteString
+text = BS.pack $ map (fromIntegral . ord) "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+
+main :: IO ()
+main = do
+  BS.writeFile "test.tmp" text
+  bs <- BS.readFile "test.tmp"
+  print $ bs == text
+  BS.hPut stdout (BS.pack [72, 101, 108, 108, 111, 33, 10]) -- "Hello!\n"
diff --git a/tests/ByteStringIO.ref b/tests/ByteStringIO.ref
new file mode 100644
--- /dev/null
+++ b/tests/ByteStringIO.ref
@@ -0,0 +1,2 @@
+True
+Hello!
diff --git a/tests/Bytestring.hs b/tests/Bytestring.hs
--- a/tests/Bytestring.hs
+++ b/tests/Bytestring.hs
@@ -1,6 +1,6 @@
 module Bytestring where
 import Data.Word
-import Data.ByteString
+import Data.ByteString as BS
 
 bs1 :: ByteString
 bs1 = pack [1,2,3]
@@ -25,3 +25,21 @@
         ]
   print [ compare x y | x <- [bs1, bs2, bs3, bs4], y <- [bs1, bs2, bs3, bs4] ]
   print $ unpack "abc"
+  print $ BS.replicate 64 42
+
+  -- breakSubstring
+  print $ breakSubstring "def" "abcdefg"
+  print $ breakSubstring "abc" "abcdefg"
+  print $ breakSubstring "fg" "abcdefg"
+  print $ breakSubstring "fn" "abcdefg"
+
+  -- isValidUtf8
+  print $ isValidUtf8 "\xC1\xB9"
+  print $ isValidUtf8 "\xE0\x8E\xA9"
+  print $ isValidUtf8 "\xF0\x80\x8E\xA9"
+  print $ isValidUtf8 "\xF4\x90\x80\x80"
+  print $ isValidUtf8 "\xED\xA0\x80" -- low surrogate
+  print $ isValidUtf8 "\xED\xBF\xBF" -- high surrogate
+
+  -- ByteString literals
+  print ("øßΞóïűæいהłДป็ş" :: ByteString)
diff --git a/tests/Bytestring.ref b/tests/Bytestring.ref
--- a/tests/Bytestring.ref
+++ b/tests/Bytestring.ref
@@ -1,6 +1,18 @@
 [1,2,3]
-"\1\2\3"
-"\1\2\3\1\2\4"
+"\SOH\STX\ETX"
+"\SOH\STX\ETX\SOH\STX\EOT"
 [True,False,False,False,False,True,False,False,False,False,True,False,False,False,False,True,False,True,True,True,True,False,True,True,True,True,False,True,True,True,True,False,False,True,False,True,False,False,False,True,True,True,False,True,False,False,False,False,True,True,False,True,False,True,False,True,True,True,True,True,False,False,False,True,False,False,True,False,True,False,True,False,False,False,False,False,True,True,True,False,True,False,True,False,True,True,True,False,False,False,True,False,True,True,True,True]
 [EQ,LT,GT,LT,GT,EQ,GT,LT,LT,LT,EQ,LT,GT,GT,GT,EQ]
 [97,98,99]
+"****************************************************************"
+("abc","defg")
+("","abcdefg")
+("abcde","fg")
+("abcdefg","")
+False
+False
+False
+False
+False
+False
+"\248\223\158\243\239q\230D\212B\DC4\ESCG_"
diff --git a/tests/CString.hs b/tests/CString.hs
new file mode 100644
--- /dev/null
+++ b/tests/CString.hs
@@ -0,0 +1,19 @@
+module CString where
+
+import Data.ByteString
+import Foreign.C.String
+import Foreign.Marshal.Alloc
+
+main :: IO ()
+main = do
+    (cstr, len) <- newCStringLen "hello"
+    print $ len == 5
+    bs1 <- packCString cstr
+    bs2 <- packCStringLen (cstr, len)
+    s1 <- peekCString cstr
+    s2 <- peekCStringLen (cstr, len)
+    print (bs1, bs2)
+    print (s1, s2)
+    free cstr
+    print (bs1, bs2)
+    print (s1, s2)
diff --git a/tests/CString.ref b/tests/CString.ref
new file mode 100644
--- /dev/null
+++ b/tests/CString.ref
@@ -0,0 +1,5 @@
+True
+("hello","hello")
+("hello","hello")
+("hello","hello")
+("hello","hello")
diff --git a/tests/Case.hs b/tests/Case.hs
--- a/tests/Case.hs
+++ b/tests/Case.hs
@@ -3,16 +3,16 @@
 
 main :: IO ()
 main = do
-  putStrLn $ show $ f1 False
-  putStrLn $ show  $ f2 False
-  putStrLn $ show  $ f2 True
---  putStrLn $ showInt  $ f3 False
-  putStrLn $ show $ map f4 [R,G,B]
-  putStrLn $ show $ f5 [(3::Int,4::Int)]
-  --putStrLn $ showInt $ f6 [(3,4)]
-  putStrLn $ show $ [ i | Just i <- [Just (1::Int), Nothing, Just 2] ]
+  print $ f1 False
+  print  $ f2 False
+  print  $ f2 True
+--  printInt  $ f3 False
+  print $ map f4 [R,G,B]
+  print $ f5 [(3::Int,4::Int)]
+  --printInt $ f6 [(3,4)]
+  print $ [ i | Just i <- [Just (1::Int), Nothing, Just 2] ]
   (x,y) <- return (2::Int,3::Int)
-  putStrLn $ show $ x + y
+  print $ x + y
 
 f1 :: Bool -> Bool
 f1 b =
diff --git a/tests/Catch.hs b/tests/Catch.hs
--- a/tests/Catch.hs
+++ b/tests/Catch.hs
@@ -1,6 +1,7 @@
 module Catch(main) where
 import Prelude
 import Control.Exception
+import System.IO
 
 f :: [Int] -> Int
 f (_:_) = 99
@@ -24,3 +25,15 @@
   putStrLn $ sshow z
   w <- catch (do { print (m ()); return "www" })  exn
   putStrLn $ sshow w
+  withFile "Catch.in" ReadMode $ \h -> do
+    let ln = hGetLine h
+    a <- ln
+    b <- ln
+    print a
+    print b
+  withFile "Catch.in" ReadMode $ \h -> do
+    let ln = hGetLine h `catch` exn
+    a <- ln
+    b <- ln
+    print a
+    print b
diff --git a/tests/Catch.ref b/tests/Catch.ref
--- a/tests/Catch.ref
+++ b/tests/Catch.ref
@@ -1,4 +1,8 @@
 "ok"
 "error: bang!"
-"no match at \"./Catch.hs\",6:1"
-"no default for m, at \"./Catch.hs\",9:3"
+"no match at \"./Catch.hs\",7:1"
+"no default for m, at \"./Catch.hs\",10:3"
+"hello"
+"bye"
+"hello"
+"bye"
diff --git a/tests/Class.hs b/tests/Class.hs
--- a/tests/Class.hs
+++ b/tests/Class.hs
@@ -38,8 +38,8 @@
 
 main :: IO ()
 main = do
-  putStrLn $ show $ f (5::Int)
-  putStrLn $ show $ g (5::Int)
-  putStrLn $ show $ h (5::Int) 'a'
-  putStrLn $ show $ f [88::Int]
-  putStrLn $ show $ f (1::Int, 'a')
+  print $ f (5::Int)
+  print $ g (5::Int)
+  print $ h (5::Int) 'a'
+  print $ f [88::Int]
+  print $ f (1::Int, 'a')
diff --git a/tests/Coerce.hs b/tests/Coerce.hs
--- a/tests/Coerce.hs
+++ b/tests/Coerce.hs
@@ -17,6 +17,18 @@
 casbs :: (Coercible a b) => [a] -> [b]
 casbs = coerce
 
+class Coercible a b => MyCoercible a b
+instance Coercible a b => MyCoercible a b
+
+f :: MyCoercible a b => a -> b
+f = coerce
+
+g :: MyCoercible a Int => a -> Int
+g = coerce
+
+h :: MyCoercible b a => a -> b
+h = coerce
+
 main :: IO ()
 main = do
   print (toInt (NT 5))
@@ -26,3 +38,6 @@
   print (coerce (List [NT 5, NT 6]) :: [NT])
   print (coerce (List [NT 7, NT 8]) :: [Int])
   print (coerce "hello" :: [Word8])
+  print (f (NT 12) :: Int)
+  print (g (NT 42))
+  print (h (NT 24) :: Int)
diff --git a/tests/Coerce.ref b/tests/Coerce.ref
--- a/tests/Coerce.ref
+++ b/tests/Coerce.ref
@@ -5,3 +5,6 @@
 [NT 5,NT 6]
 [7,8]
 [104,101,108,108,111]
+12
+42
+24
diff --git a/tests/Cpp.hs b/tests/Cpp.hs
new file mode 100644
--- /dev/null
+++ b/tests/Cpp.hs
@@ -0,0 +1,5 @@
+{-# LANGUAGE CPP #-}
+#define FOO 42
+
+module Cpp where
+main = print FOO
diff --git a/tests/Cpp.ref b/tests/Cpp.ref
new file mode 100644
--- /dev/null
+++ b/tests/Cpp.ref
@@ -0,0 +1,1 @@
+42
diff --git a/tests/Deriving.hs b/tests/Deriving.hs
--- a/tests/Deriving.hs
+++ b/tests/Deriving.hs
@@ -10,6 +10,13 @@
 newtype Alt f a = Alt (f a)
   deriving Show
 
+data E = X | Y | Z
+  deriving (Enum, Bounded, Show)
+
+-- Not yet
+-- data F a = F0 | F1 a | F2 (a,a) | F3 Int | F4 a Int | F5 (Int -> a)
+--   deriving Functor
+
 main :: IO ()
 main = do
   print $ A 'a' == (A 'a' :: T Char () ())
@@ -34,3 +41,6 @@
   print $ R{ x=R{x='b',y=11}, y=10 }
 
   print $ Alt [True]
+
+  print $ fromEnum Y
+  print (minBound :: E, maxBound :: E)
diff --git a/tests/Deriving.ref b/tests/Deriving.ref
--- a/tests/Deriving.ref
+++ b/tests/Deriving.ref
@@ -17,3 +17,5 @@
 R{x='a',y=10}
 R{x=R{x='b',y=11},y=10}
 Alt [True]
+1
+(X,Z)
diff --git a/tests/DfltSig.ref b/tests/DfltSig.ref
--- a/tests/DfltSig.ref
+++ b/tests/DfltSig.ref
@@ -1,1 +1,1 @@
-(0,'\0',[])
+(0,'\NUL',[])
diff --git a/tests/Do.hs b/tests/Do.hs
new file mode 100644
--- /dev/null
+++ b/tests/Do.hs
@@ -0,0 +1,5 @@
+module Do where
+
+main :: IO ()
+main = do
+  let a = 42 in print a
diff --git a/tests/Do.ref b/tests/Do.ref
new file mode 100644
--- /dev/null
+++ b/tests/Do.ref
@@ -0,0 +1,1 @@
+42
diff --git a/tests/Enum.hs b/tests/Enum.hs
--- a/tests/Enum.hs
+++ b/tests/Enum.hs
@@ -1,7 +1,60 @@
 module Enum(main) where
 
+import Data.Int
+import Data.Word
+import Numeric.Natural
+
 data T = A | B | C
   deriving (Bounded, Enum, Show)
 
+printEnumInt :: forall a. (Bounded a, Enum a, Num a, Show a) => IO ()
+printEnumInt = do
+  print $ enumFrom @a maxBound
+  print $ enumFromThen @a (maxBound - 2) maxBound
+  print $ enumFromTo @a (maxBound - 2) maxBound
+  print $ enumFromThenTo @a (maxBound - 5) (maxBound - 3) maxBound
+
 main :: IO ()
-main = print ([minBound .. maxBound] :: [T])
+main = do
+  -- derived instance
+  print $ succ A
+  print $ succ B
+  print $ pred B
+  print $ pred C
+  print $ map (toEnum @T) [0, 1, 2]
+  print $ map fromEnum [A, B, C]
+  print [A ..]
+  print [A, C ..]
+  print [C, A ..]
+  print [A, B .. C]
+  print [C, B .. A]
+  print ([minBound .. maxBound] :: [T])
+
+  -- Bool
+  print [False ..]
+  print [False, True ..]
+
+  -- Ordering
+  print [LT ..]
+  print [LT, EQ ..]
+
+  -- Char
+  let maxChar = maxBound :: Char
+  print [maxChar ..]
+  print [pred maxChar, maxChar ..]
+
+  -- Int, Word
+  printEnumInt @Int8
+  printEnumInt @Int16
+  printEnumInt @Int32
+  printEnumInt @Word8
+  printEnumInt @Word16
+  printEnumInt @Word32
+
+  -- Natural
+  let bigInt = 2 ^ 64 :: Natural
+  print [bigInt..bigInt+2]
+  print $ take 3 [bigInt..]
+  print [bigInt-2, bigInt..bigInt+2]
+  print $ take 3 [bigInt-2, bigInt..]
+  print [10 :: Natural, 5..]
diff --git a/tests/Enum.ref b/tests/Enum.ref
--- a/tests/Enum.ref
+++ b/tests/Enum.ref
@@ -1,1 +1,47 @@
+B
+C
+A
+B
 [A,B,C]
+[0,1,2]
+[A,B,C]
+[A,C]
+[C,A]
+[A,B,C]
+[C,B,A]
+[A,B,C]
+[False,True]
+[False,True]
+[LT,EQ,GT]
+[LT,EQ,GT]
+"\1114111"
+"\1114110\1114111"
+[127]
+[125,127]
+[125,126,127]
+[122,124,126]
+[32767]
+[32765,32767]
+[32765,32766,32767]
+[32762,32764,32766]
+[2147483647]
+[2147483645,2147483647]
+[2147483645,2147483646,2147483647]
+[2147483642,2147483644,2147483646]
+[255]
+[253,255]
+[253,254,255]
+[250,252,254]
+[65535]
+[65533,65535]
+[65533,65534,65535]
+[65530,65532,65534]
+[4294967295]
+[4294967293,4294967295]
+[4294967293,4294967294,4294967295]
+[4294967290,4294967292,4294967294]
+[18446744073709551616,18446744073709551617,18446744073709551618]
+[18446744073709551616,18446744073709551617,18446744073709551618]
+[18446744073709551614,18446744073709551616,18446744073709551618]
+[18446744073709551614,18446744073709551616,18446744073709551618]
+[10,5,0]
diff --git a/tests/Eq.hs b/tests/Eq.hs
--- a/tests/Eq.hs
+++ b/tests/Eq.hs
@@ -3,14 +3,14 @@
 
 main :: IO ()
 main = do
-  putStrLn $ show [1==(1::Int), 'a'=='a', 1.1==(1.1::Double),
+  print [1==(1::Int), 'a'=='a', 1.1==(1.1::Double),
                    True==True, False==False,
                    (Nothing::Maybe Int)==Nothing, Just (1::Int) == Just 1,
                    [1,2,3] == [1,2,3::Int],
                    (1,2) == (1::Int,2::Int),
                    (Left 1 :: Either Int Char) == Left 1, (Right 'a' :: Either Int Char) == Right 'a'
                   ]
-  putStrLn $ show [1==(2::Int), 'a'=='b', 1.1==(1.2::Double),
+  print [1==(2::Int), 'a'=='b', 1.1==(1.2::Double),
                    True==False, False==True,
                    Nothing==Just (1::Int), Just (1::Int) == Nothing,
                    [1,2,3] == [1,2,4::Int],
diff --git a/tests/Exn.hs b/tests/Exn.hs
new file mode 100644
--- /dev/null
+++ b/tests/Exn.hs
@@ -0,0 +1,9 @@
+module Exn where
+import Control.Concurrent
+import Control.Exception
+
+main :: IO ()
+main = do
+  catch (do threadDelay 1000; error "foo")
+        (\ (e :: SomeException) -> print e)
+  putStrLn "done"
diff --git a/tests/FArith.hs b/tests/FArith.hs
--- a/tests/FArith.hs
+++ b/tests/FArith.hs
@@ -12,9 +12,9 @@
 
 main :: IO ()
 main = do
-  putStrLn $ show [ op x y | x <- list1, y <- list1, op <- [(+), (-), (*)] ]
-  putStrLn $ show [ op x y | x <- list1, y <- list1, op <- [(==), (/=), (<), (<=), (>), (>=)] ]
-  putStrLn $ show [ x / y  | x <- list1, y <- [1.0::Double, -16.0::Double, 0.0625::Double]]
-  putStrLn $ show $ readDouble "1.625"
-  putStrLn $ show $ 1.0 + readDouble "2.5"
-  putStrLn $ show $ map readDouble ["1.5e4", "12500.0e-4"]
+  print [ op x y | x <- list1, y <- list1, op <- [(+), (-), (*)] ]
+  print [ op x y | x <- list1, y <- list1, op <- [(==), (/=), (<), (<=), (>), (>=)] ]
+  print [ x / y  | x <- list1, y <- [1.0::Double, -16.0::Double, 0.0625::Double]]
+  print $ readDouble "1.625"
+  print $ 1.0 + readDouble "2.5"
+  print $ map readDouble ["1.5e4", "12500.0e-4"]
diff --git a/tests/Forall.hs b/tests/Forall.hs
new file mode 100644
--- /dev/null
+++ b/tests/Forall.hs
@@ -0,0 +1,16 @@
+module Forall where
+-- Test nested forall in co-variant position
+
+k :: forall a . a -> (forall b. b->b)
+k _ y = y
+
+a :: a -> (forall b . b)
+a _ = undefined
+
+type Memo a = forall r. (a -> r) -> (a -> r)
+
+wrap :: (a -> b) -> (b -> a) -> Memo a -> Memo b
+wrap i j m f = m (f . i) . j
+
+main :: IO ()
+main = print (k True 'a')
diff --git a/tests/Forall.ref b/tests/Forall.ref
new file mode 100644
--- /dev/null
+++ b/tests/Forall.ref
@@ -0,0 +1,1 @@
+'a'
diff --git a/tests/ForeignC.hs b/tests/ForeignC.hs
--- a/tests/ForeignC.hs
+++ b/tests/ForeignC.hs
@@ -11,9 +11,9 @@
 main :: IO ()
 main = do
   x1 <- iabs (3 - 8)
-  putStrLn $ show x1
+  print x1
   x2 <- iabs (10 - 8)
-  putStrLn $ show x2
+  print x2
   p <- cerrno
   CInt e <- peek p
   print e
diff --git a/tests/FunDep.hs b/tests/FunDep.hs
--- a/tests/FunDep.hs
+++ b/tests/FunDep.hs
@@ -31,7 +31,7 @@
   isoL = ord
   isoR = chr
 
-data T a = T a
+newtype T a = T a
 
 instance C a b => C (T a) b where
   f (T a) = f a
diff --git a/tests/Guard.hs b/tests/Guard.hs
--- a/tests/Guard.hs
+++ b/tests/Guard.hs
@@ -2,7 +2,7 @@
 import Prelude
 
 f :: [Int] -> Int
-f [x] | x < 0 = 0 - x
+f [x] | x < 0 = - x
       | x < 10 = x+1
       | otherwise = 99
 f [x,y] = x+y
@@ -12,4 +12,4 @@
 
 main :: IO ()
 main = do
-  putStrLn $ show [f [0 - 7], f [5], f [20], f [2,3], f [1,2,3], f[1,2,3,4]]
+  print [f [- 7], f [5], f [20], f [2,3], f [1,2,3], f[1,2,3,4]]
diff --git a/tests/HigherKind.hs b/tests/HigherKind.hs
--- a/tests/HigherKind.hs
+++ b/tests/HigherKind.hs
@@ -1,12 +1,12 @@
 module HigherKind(main) where
 import Prelude
 
-data T f = C (f Int)
+newtype T f = C (f Int)
 
 showT :: forall f . (f Int -> String) -> T f -> String
 showT f (C x) = "(C " ++ f x ++ ")"
 
-data TT f a = CC (f a)
+newtype TT f a = CC (f a)
 
 showTT :: forall f a . (f a -> String) -> TT f a -> String
 showTT f (CC x) = "(CC " ++ f x ++ ")"
diff --git a/tests/IOTest.hs b/tests/IOTest.hs
--- a/tests/IOTest.hs
+++ b/tests/IOTest.hs
@@ -28,15 +28,15 @@
   hin <- openFile "test.tmp" ReadMode
   c1 <- hGetChar hin
   c2 <- hGetChar hin
-  putStrLn $ show (c1, c2)
+  print (c1, c2)
   writeFile "test2.tmp" "more\n"
   s <- readFile "test2.tmp"
-  putStrLn (show s)
+  print s
   foo
-  putStrLn $ show $ trace "tracing" (5::Int)
+  print $ trace "tracing" (5::Int)
   as <- getArgs
-  putStrLn $ show as
-  putStrLn $ show $ seq ((1::Int) + (2::Int)) (5::Int)
-  putStrLn $ show $ seq ((1::Int) + trace "seq" (2::Int)) (5::Int)
+  print as
+  print $ seq ((1::Int) + (2::Int)) (5::Int)
+  print $ seq ((1::Int) + trace "seq" (2::Int)) (5::Int)
   tend <- getTimeMilli
-  putStrLn $ show (tend - tstart) ++ "ms execution time"
+  print (tend - tstart) ++ "ms execution time"
diff --git a/tests/Infix.hs b/tests/Infix.hs
--- a/tests/Infix.hs
+++ b/tests/Infix.hs
@@ -16,4 +16,4 @@
 
 main :: IO ()
 main = do
-  putStrLn $ show $ 2 +++ 3 &&& 4 === 17
+  print $ 2 +++ 3 &&& 4 === 17
diff --git a/tests/Integer.hs b/tests/Integer.hs
--- a/tests/Integer.hs
+++ b/tests/Integer.hs
@@ -1,8 +1,15 @@
 module Integer(main) where
-import Prelude
+import System.IO.Serialize
+import System.IO.StringHandle
 
 main :: IO ()
 main = do
   print $ (1000::Integer) == 1000
   print $ ((10::Integer)^(100::Int)) /= 0
   print $ show (product [1..100::Integer]) == "93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000"
+  let i = 1234567890123456789012345678901234567890 :: Integer
+  print i
+  s <- handleWriteToString (\ h -> hSerialize h i)
+  h <- stringToHandle s
+  i' <- hDeserialize h
+  print $ i == i'
diff --git a/tests/Integer.ref b/tests/Integer.ref
--- a/tests/Integer.ref
+++ b/tests/Integer.ref
@@ -1,3 +1,5 @@
 True
 True
 True
+1234567890123456789012345678901234567890
+True
diff --git a/tests/Interactive.hs b/tests/Interactive.hs
new file mode 100644
--- /dev/null
+++ b/tests/Interactive.hs
@@ -0,0 +1,7 @@
+module Interactive(module Interactive) where
+import Prelude
+import System.IO.PrintOrRun
+default (Integer, Double, String, ())
+
+_it = 1+2
+_itIO = printOrRun _it
diff --git a/tests/Lit.ref b/tests/Lit.ref
new file mode 100644
--- /dev/null
+++ b/tests/Lit.ref
@@ -0,0 +1,1 @@
+99
diff --git a/tests/LitMatch.hs b/tests/LitMatch.hs
--- a/tests/LitMatch.hs
+++ b/tests/LitMatch.hs
@@ -26,7 +26,7 @@
 
 main :: IO ()
 main = do
-  putStrLn $ show [f 0, f 1, f 10, f (-1)]
-  putStrLn $ show [g 1 0, g 1 1, g 2 0, g 2 1, g 2 2]
-  putStrLn $ show [h 'a', h 'b', h 'c']
-  putStrLn $ show [s "aaa", s "apa", s "foo"]
+  print [f 0, f 1, f 10, f (-1)]
+  print [g 1 0, g 1 1, g 2 0, g 2 1, g 2 2]
+  print [h 'a', h 'b', h 'c']
+  print [s "aaa", s "apa", s "foo"]
diff --git a/tests/LocalPoly.hs b/tests/LocalPoly.hs
--- a/tests/LocalPoly.hs
+++ b/tests/LocalPoly.hs
@@ -3,7 +3,7 @@
 
 main :: IO ()
 main = do
-  putStrLn $ show $ f 1 ("a"::String)
+  print $ f 1 ("a"::String)
 
 f :: forall b . Int -> b -> ((Int, b), (b, b))
 f x b = (i x, i b)
diff --git a/tests/Makefile b/tests/Makefile
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -16,7 +16,7 @@
 test:
 	$(TMHS) Hello      && $(EVAL) > Hello.out      && diff Hello.ref Hello.out
 #	$(TMHS) IOTest     && (echo q | $(EVAL) a bb ccc | sed 's/^[0-9]*ms/1ms/' > IOTest.out) && diff IOTest.ref IOTest.out
-#	$(TMHS) Serdes     && $(EVAL) > Serdes.out     && diff Serdes.ref Serdes.out
+	$(TMHS) Serdes     && $(EVAL) > Serdes.out     && diff Serdes.ref Serdes.out
 	$(TMHS) StringTest && $(EVAL) > StringTest.out && diff StringTest.ref StringTest.out
 	$(TMHS) ListTest   && $(EVAL) > ListTest.out   && diff ListTest.ref ListTest.out
 	$(TMHS) Fac        && $(EVAL) > Fac.out        && diff Fac.ref Fac.out
@@ -81,10 +81,23 @@
 	$(TMHS) PatSyn     && $(EVAL) > PatSyn.out     && diff PatSyn.ref PatSyn.out
 	$(TMHS) Coerce     && $(EVAL) > Coerce.out     && diff Coerce.ref Coerce.out
 	$(TMHS) PatBind    && $(EVAL) > PatBind.out    && diff PatBind.ref PatBind.out
-	$(TMHS) EmptyCase  && $(EVAL) > EmptyCase.out
+	$(TMHS) EmptyCase  && $(EVAL)
 	$(TMHS) NumUnder   && $(EVAL) > NumUnder.out   && diff NumUnder.ref NumUnder.out
 	$(TMHS) LocalFix   && $(EVAL) > LocalFix.out   && diff LocalFix.ref LocalFix.out
 	$(TMHS) TypeApp    && $(EVAL) > TypeApp.out    && diff TypeApp.ref TypeApp.out
+	$(TMHS) Do         && $(EVAL) > Do.out         && diff Do.ref Do.out
+	$(TMHS) Via        && $(EVAL) > Via.out        && diff Via.ref Via.out
+	$(TMHS) ByteStringIO && $(EVAL) > ByteStringIO.out && diff ByteStringIO.ref ByteStringIO.out
+	$(TMHS) BitCount   && $(EVAL) > BitCount.out   && diff BitCount.ref BitCount.out
+	$(TMHS) Bounded    && $(EVAL) > Bounded.out    && diff Bounded.ref Bounded.out
+	$(TMHS) Typeable   && $(EVAL) > Typeable.out   && diff Typeable.ref Typeable.out
+	$(TMHS) Storable   && $(EVAL) > Storable.out   && diff Storable.ref Storable.out
+	$(TMHS) StandDer   && $(EVAL) > StandDer.out   && diff StandDer.ref StandDer.out
+	MHSCPPHS=../bin/cpphs \
+        $(TMHS) Cpp        && $(EVAL) > Cpp.out        && diff Cpp.ref Cpp.out
+	$(TMHS) Lit        && $(EVAL) > Lit.out        && diff Lit.ref Lit.out
+	$(TMHS) TypeOp     && $(EVAL) > TypeOp.out     && diff TypeOp.ref TypeOp.out
+	$(TMHS) Forall     && $(EVAL) > Forall.out     && diff Forall.ref Forall.out
 
 errtest:
 	sh errtester.sh $(MHS) < errmsg.test
diff --git a/tests/MutRec.hs b/tests/MutRec.hs
--- a/tests/MutRec.hs
+++ b/tests/MutRec.hs
@@ -3,6 +3,6 @@
 
 main :: IO ()
 main = do
-  let even i = if i == 0 then True  else odd  (i - 1)
-      odd  i = if i == 0 then False else even (i - 1)
-  putStrLn $ show $ map even [1::Int .. 5] ++ map odd [1 .. 5]
+  let even i = i == 0 || odd  (i - 1)
+      odd  i = i /= 0 && even (i - 1)
+  print $ map even [1::Int .. 5] ++ map odd [1 .. 5]
diff --git a/tests/Newtype.hs b/tests/Newtype.hs
--- a/tests/Newtype.hs
+++ b/tests/Newtype.hs
@@ -15,5 +15,5 @@
 
 main :: IO ()
 main = do
-  putStrLn $ show [f (N 1), f (N 2)]
+  print [f (N 1), f (N 2)]
   putStrLn $ showM show (g (M (3,4)))
diff --git a/tests/Rank2.hs b/tests/Rank2.hs
--- a/tests/Rank2.hs
+++ b/tests/Rank2.hs
@@ -7,14 +7,14 @@
 g :: (forall a . a -> Int -> a) -> (Int, Bool)
 g c = (c (1::Int) (1::Int), c True (1::Int))
 
-data Id = Id (forall a . a -> a)
+newtype Id = Id (forall a . a -> a)
 
 iD :: Id
 iD = Id (\ x -> x)
 
 main :: IO ()
 main = do
-  putStrLn $ show $ f id
-  putStrLn $ show $ g const
+  print $ f id
+  print $ g const
   case iD of
-    Id i -> putStrLn $ show (i (1::Int), i True)
+    Id i -> print (i (1::Int), i True)
diff --git a/tests/Read.hs b/tests/Read.hs
--- a/tests/Read.hs
+++ b/tests/Read.hs
@@ -56,6 +56,6 @@
   print (read "'\\''" :: Char)
   print (read "\"abc\"" :: String)
   print (read "\"a\nc\"" :: String)
-  print (read "\"a\1\&1c\"" :: String)
+  print (read "\"a\1111\&1c\"" :: String)
   print (read "\"\\\"\"" :: String)
   print (read "\"\\\\\"" :: String)
diff --git a/tests/Read.ref b/tests/Read.ref
--- a/tests/Read.ref
+++ b/tests/Read.ref
@@ -38,14 +38,14 @@
 (True,123)
 'a'
 '\n'
-'\1'
-'\2'
-'\3'
-'\4'
+'\SOH'
+'\STX'
+'\ETX'
+'\EOT'
 '\\'
 '\''
 "abc"
 "a\nc"
-"a\1\&1c"
+"a\1111\&1c"
 "\""
 "\\"
diff --git a/tests/Readline.hs b/tests/Readline.hs
--- a/tests/Readline.hs
+++ b/tests/Readline.hs
@@ -13,4 +13,4 @@
   case s of
     Just "quit" -> putStrLn "Bye"
     _ -> do putStrLn $ showMaybe showString s; loop
-    
+
diff --git a/tests/ST.hs b/tests/ST.hs
--- a/tests/ST.hs
+++ b/tests/ST.hs
@@ -18,7 +18,7 @@
           loop
   loop
   readSTRef rr
-  
+
 fac :: Int -> Int
 fac n = runST (facST n)
 
diff --git a/tests/Serdes.hs b/tests/Serdes.hs
--- a/tests/Serdes.hs
+++ b/tests/Serdes.hs
@@ -1,9 +1,7 @@
 module Serdes(main) where
-import Prelude
-import System.IO as IO
-import System.Environment
-import Debug.Trace
 
+import System.IO.Serialize
+
 f :: Int -> Int
 f x = x*2+1
 
@@ -12,4 +10,4 @@
   cprint ((+) :: Int->Int->Int)
   writeSerialized "f.tmp" f
   g <- readSerialized "f.tmp"
-  putStrLn $ show $ (g (5::Int) :: Int)
+  print (g (5::Int) :: Int)
diff --git a/tests/StandDer.hs b/tests/StandDer.hs
--- a/tests/StandDer.hs
+++ b/tests/StandDer.hs
@@ -4,10 +4,25 @@
 deriving instance Show X
 
 data T a = A | B | C a | D (T a)
-
 deriving instance (Show a) => Show (T a)
 
+newtype Y = Y X
+deriving newtype instance Show Y
+
+newtype M a = M (Maybe a)
+  deriving Show
+deriving newtype instance Functor M
+
+newtype Z = Z X
+  deriving Show
+
+newtype YY = YY X
+deriving via Z instance Show YY
+
 main :: IO ()
 main = do
   print X
   print [A, B, C True, D A]
+  print (Y X)
+  print (fmap fromEnum (M (Just 'a')))
+  print (YY X)
diff --git a/tests/StandDer.ref b/tests/StandDer.ref
--- a/tests/StandDer.ref
+++ b/tests/StandDer.ref
@@ -1,2 +1,5 @@
 X
 [A,B,C True,D A]
+X
+M (Just 97)
+Z X
diff --git a/tests/Storable.hs b/tests/Storable.hs
--- a/tests/Storable.hs
+++ b/tests/Storable.hs
@@ -1,7 +1,6 @@
 module Storable(main) where
 import Prelude
 import Data.Word
-import Data.Word8
 import Foreign.Marshal.Array
 import Foreign.Marshal.Utils
 import Foreign.Ptr
diff --git a/tests/StringTest.hs b/tests/StringTest.hs
--- a/tests/StringTest.hs
+++ b/tests/StringTest.hs
@@ -6,18 +6,20 @@
 main = do
   putStrLn $ if "abc" == "abc" then "yes" else "no"
   putStrLn $ if "abc" == "adc" then "yes" else "no"
-  putStrLn $ show (1234::Int)
-  putStrLn $ show (0::Int)
-  putStrLn $ show (- (567::Int))
-  putStrLn $ show 'x'
-  putStrLn $ show '\n'
-  putStrLn $ show False
+  print (1234::Int)
+  print (0::Int)
+  print (- (567::Int))
+  print 'x'
+  print '\n'
+  print False
 --  putStrLn $ showUnit ()
-  putStrLn $ show [1,20,3::Int]
-  putStrLn $ show [1::Int]
-  putStrLn $ show ([] :: [Int])
-  putStrLn $ show (123::Int, 'a')
-  putStrLn $ show (Nothing :: Maybe Int)
-  putStrLn $ show (Just 890 :: Maybe Int)
-  putStrLn $ show (Left   678 :: Either Int Bool)
-  putStrLn $ show (Right True :: Either Int Bool)
+  print [1,20,3::Int]
+  print [1::Int]
+  print ([] :: [Int])
+  print (123::Int, 'a')
+  print (Nothing :: Maybe Int)
+  print (Just 890 :: Maybe Int)
+  print (Left   678 :: Either Int Bool)
+  print (Right True :: Either Int Bool)
+  print $ length "hello"
+
diff --git a/tests/StringTest.ref b/tests/StringTest.ref
--- a/tests/StringTest.ref
+++ b/tests/StringTest.ref
@@ -14,3 +14,4 @@
 Just 890
 Left 678
 Right True
+5
diff --git a/tests/Symbol.hs b/tests/Symbol.hs
--- a/tests/Symbol.hs
+++ b/tests/Symbol.hs
@@ -1,7 +1,7 @@
 module Symbol(main) where
 import Prelude
 
-data T (s::Symbol) = A Int
+newtype T (s::Symbol) = A Int
 
 class C a where
   m :: a -> Int
diff --git a/tests/TestMap.hs b/tests/TestMap.hs
--- a/tests/TestMap.hs
+++ b/tests/TestMap.hs
@@ -1,5 +1,5 @@
 module TestMap(lookup) where
-import Prelude()
+import qualified Prelude()
 import Primitives
 
 lookup :: ()
diff --git a/tests/Text.hs b/tests/Text.hs
--- a/tests/Text.hs
+++ b/tests/Text.hs
@@ -1,5 +1,6 @@
 module Text where
 import Data.Text as T
+import Data.Text.Encoding
 
 bs1 :: Text
 bs1 = pack "abc"
@@ -29,3 +30,20 @@
   print (T.uncons bs1)
   print (T.null bs1)
   print (T.null (pack ""))
+  print (pack "\xD800") -- low surrogate
+  print (pack "\xDFFF") -- high surrogate
+
+  -- Data.Text.Encoding
+  print $ decodeLatin1 "äöüß"
+
+  let text = "øßΞóïűæいהłДป็ş" :: Text
+  print $ encodeUtf8 text
+  print $ encodeUtf16LE text
+  print $ encodeUtf16BE text
+  print $ encodeUtf32LE text
+  print $ encodeUtf32BE text
+  print $ decodeUtf8 (encodeUtf8 text) == text
+  print $ decodeUtf16LE (encodeUtf16LE text) == text
+  print $ decodeUtf16BE (encodeUtf16BE text) == text
+  print $ decodeUtf32LE (encodeUtf32LE text) == text
+  print $ decodeUtf32BE (encodeUtf32BE text) == text
diff --git a/tests/Text.ref b/tests/Text.ref
--- a/tests/Text.ref
+++ b/tests/Text.ref
@@ -9,3 +9,16 @@
 Just ('a',"bc")
 False
 True
+"\65533"
+"\65533"
+"\228\246\252\223"
+"\195\184\195\159\206\158\195\179\195\175\197\177\195\166\227\129\132\215\148\197\130\208\148\224\184\155\224\185\135\197\159"
+"\248\NUL\223\NUL\158\ETX\243\NUL\239\NULq\SOH\230\NULD0\212\ENQB\SOH\DC4\EOT\ESC\SOG\SO_\SOH"
+"\NUL\248\NUL\223\ETX\158\NUL\243\NUL\239\SOHq\NUL\230\&0D\ENQ\212\SOHB\EOT\DC4\SO\ESC\SOG\SOH_"
+"\248\NUL\NUL\NUL\223\NUL\NUL\NUL\158\ETX\NUL\NUL\243\NUL\NUL\NUL\239\NUL\NUL\NULq\SOH\NUL\NUL\230\NUL\NUL\NULD0\NUL\NUL\212\ENQ\NUL\NULB\SOH\NUL\NUL\DC4\EOT\NUL\NUL\ESC\SO\NUL\NULG\SO\NUL\NUL_\SOH\NUL\NUL"
+"\NUL\NUL\NUL\248\NUL\NUL\NUL\223\NUL\NUL\ETX\158\NUL\NUL\NUL\243\NUL\NUL\NUL\239\NUL\NUL\SOHq\NUL\NUL\NUL\230\NUL\NUL0D\NUL\NUL\ENQ\212\NUL\NUL\SOHB\NUL\NUL\EOT\DC4\NUL\NUL\SO\ESC\NUL\NUL\SOG\NUL\NUL\SOH_"
+True
+True
+True
+True
+True
diff --git a/tests/TypeApp.hs b/tests/TypeApp.hs
--- a/tests/TypeApp.hs
+++ b/tests/TypeApp.hs
@@ -9,3 +9,4 @@
   print $ read @Int "123"
   let (x, y) = foo @_ @Bool
   print $ typeOf y
+  return @IO ()
diff --git a/tests/TypeEq.hs b/tests/TypeEq.hs
--- a/tests/TypeEq.hs
+++ b/tests/TypeEq.hs
@@ -19,12 +19,6 @@
 e1 :: Exp Int
 e1 = Iff (Add (Int 1) (Int 2) `Equ` Int 3) (Int 1) (Int 999)
 
-main :: IO ()
-main = do
-  print (foo True)
-  print (eval e1)
-  print (geval ge1)
-
 data GExp a where
   GInt :: Int -> GExp Int
   GAdd :: GExp Int -> GExp Int -> GExp Int
@@ -39,3 +33,51 @@
 
 ge1 :: GExp Int
 ge1 = GIff (GAdd (GInt 1) (GInt 2) `GEqu` GInt 3) (GInt 1) (GInt 999)
+
+data ParenResult a where
+  ParenResult :: a -> (ParenResult a)
+
+data Foo c a where
+  Foo :: a -> Foo c a
+
+unFoo :: Foo c a -> a
+unFoo (Foo a) = a
+
+data Bar b a where
+  Bar :: Bar a a
+
+bar :: Bar b a -> a -> b
+bar c x = case c of Bar -> x
+
+data Tree a where
+  Leaf :: a -> Tree a
+  Branch :: Tree a -> Tree a -> Tree a
+
+toList :: Tree a -> [a]
+toList t = go t []
+  where
+    go (Leaf x) xs = x:xs
+    go (Branch l r) xs = go l (go r xs)
+
+data R a where
+  Pure :: a -> R a
+  Map :: (a -> b) -> R a -> R b
+  Alt :: R a -> R a -> R a
+
+instance (Show a) => Show (R a) where
+  show (Pure a) = "Pure " ++ show a
+
+splat :: R a -> [R a]
+splat t = go t []
+  where
+    go (Alt l r) ts = go l (go r ts)
+    go t ts = t:ts
+
+main :: IO ()
+main = do
+  print (foo True)
+  print (eval e1)
+  print (geval ge1)
+  print (unFoo (Foo (2::Int)))
+  print (toList (Branch (Leaf (1::Int)) (Branch (Leaf 2) (Leaf 3))))
+  print (splat (Alt (Pure 'a') (Pure 'b')))
diff --git a/tests/TypeEq.ref b/tests/TypeEq.ref
--- a/tests/TypeEq.ref
+++ b/tests/TypeEq.ref
@@ -1,3 +1,6 @@
 False
 1
 1
+2
+[1,2,3]
+[Pure 'a',Pure 'b']
diff --git a/tests/TypeOp.hs b/tests/TypeOp.hs
new file mode 100644
--- /dev/null
+++ b/tests/TypeOp.hs
@@ -0,0 +1,20 @@
+module TypeOp where
+import Data.Coerce
+
+data a + b = Plus a b
+type Foo = Int + Bool
+
+x :: Int `Either` Bool
+x = Left 5
+
+type a ~~ b = Coercible a b
+
+class a ~~ b => TypeOp a b
+
+instance a ~~ b => TypeOp a b
+
+f :: a ~~ b => a -> b
+f = coerce
+
+main :: IO ()
+main = print (f x :: Either Int Bool)
diff --git a/tests/TypeOp.ref b/tests/TypeOp.ref
new file mode 100644
--- /dev/null
+++ b/tests/TypeOp.ref
@@ -0,0 +1,1 @@
+Left 5
diff --git a/tests/Typeable.ref b/tests/Typeable.ref
--- a/tests/Typeable.ref
+++ b/tests/Typeable.ref
@@ -1,6 +1,6 @@
-Char
-IO Char
-(Char,Char)
+Bool
+IO Bool
+(Char,Bool)
 Monad
 T
 P (P T)
diff --git a/tests/Unicode.hs b/tests/Unicode.hs
--- a/tests/Unicode.hs
+++ b/tests/Unicode.hs
@@ -1,5 +1,5 @@
 module Unicode(main) where
-import Prelude
+import Data.Char
 
 main :: IO ()
 main = do
@@ -9,6 +9,19 @@
   writeFile "unicode.tmp" "\xe5\&bc"
   ustr <- readFile "unicode.tmp"
   print $ ustr == "\xe5\&bc"
+  let a = "å ä ö"
+  putStrLn a
+  print $ map isLower a
+  print $ map isUpper a
+  putStrLn $ map toUpper a
+  print $ map (isUpper . toUpper) a
 
-foo ∷ ∀ a . Eq a ⇒ a → a
+  let printCases c = putStrLn $ toLower c : toTitle c : toUpper c : ""
+  printCases '\x01C4' -- upper
+  printCases '\x01C5' -- title
+  printCases '\x01C6' -- lower
+  printCases '\x2168' -- IX
+  printCases '\x2178' -- ix
+
+foo ∷ ∀ α . Eq α ⇒ α → α
 foo x = if x == x then x else undefined
diff --git a/tests/Unicode.ref b/tests/Unicode.ref
--- a/tests/Unicode.ref
+++ b/tests/Unicode.ref
@@ -2,3 +2,13 @@
 åbc
 Ђઈ
 True
+å ä ö
+[True,False,True,False,True]
+[False,False,False,False,False]
+Å Ä Ö
+[True,False,True,False,True]
+ǆǅǄ
+ǆǅǄ
+ǆǅǄ
+ⅸⅨⅨ
+ⅸⅨⅨ
diff --git a/tests/Via.hs b/tests/Via.hs
new file mode 100644
--- /dev/null
+++ b/tests/Via.hs
@@ -0,0 +1,171 @@
+module Via where
+import Numeric
+import Data.Kind
+import Data.Semigroup
+import Data.Coerce
+
+newtype B = B Bool
+  deriving newtype Eq
+
+newtype N = N Int
+  deriving newtype (Eq, Ord)
+  deriving stock (Show)
+  deriving newtype Num
+
+data Id a = Id a
+  deriving stock Eq
+
+newtype BI = BI (Id Int)
+  deriving newtype Eq
+
+newtype Id2 a = Id2 (Id a)
+  deriving newtype Eq
+
+newtype Id3 a = Id3 a
+  deriving newtype Eq
+
+------
+
+newtype Hex a = Hex a
+
+instance (Integral a, Show a) => Show (Hex a) where
+  show (Hex a) = "0x" ++ showHex a ""
+
+newtype Unicode = U Int
+  deriving Show via (Hex Int)
+
+euroSign :: Unicode
+euroSign = U 0x20ac
+
+-------
+
+class SPretty a where
+  sPpr :: a -> String
+  default sPpr :: Show a => a -> String
+  sPpr = show
+
+data S = S String
+  deriving stock Show
+  deriving anyclass SPretty
+
+-------
+
+newtype P a = P (Maybe a)
+  deriving stock Show
+  deriving newtype (Eq, Functor)
+
+-------
+
+class (Monoid w, Monad m) => MonadAccum w m | m -> w where
+  add :: w -> m ()
+
+newtype MaybeT m a = MaybeT (m (Maybe a))
+
+instance Functor (MaybeT m) where fmap = undefined
+instance Applicative (MaybeT m) where pure = undefined; (<*>) = undefined
+instance Monad (MaybeT m) where (>>=) = undefined
+
+newtype LiftingAccum (t :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type)
+  = LiftingAccum (t m a)
+  deriving
+    (Functor, Applicative, Monad)
+    via (t m)
+
+instance (Monad (t m), MonadAccum w m) => MonadAccum w (LiftingAccum t m) where
+  add x = undefined
+
+deriving via
+  (LiftingAccum MaybeT m)
+  instance
+    (MonadAccum w m) =>
+    MonadAccum w (MaybeT m)
+
+{-
+hdr = (forall (w::Type) (m::(Type -> Type)) . ((MonadAccum w m) => (MonadAccum w (MaybeT m))))
+newty = (MaybeT m)
+narg=1,
+tycon=MaybeT
+iks=[(m::_a78),(a::_a79)]
+c=Constr [] [] MaybeT (Left [(False,(m (Maybe a)))])
+acls=(MonadAccum w)
+mvis=Just (LiftingAccum MaybeT m)
+oldty'=(m (Maybe a)))
+
+
+newtypeDer: instance (forall (w::Type) (m::(Type -> Type)) . ((MonadAccum w m) => (MonadAccum w (MaybeT m)))) where
+  add :: w -> (MaybeT m ()
+  add = coerce @((w -> (LiftingAccum MaybeT m ()))) add
+
+
+-}
+
+{-
+instance MonadAccum w m => MonadAccum w (MaybeT m) where
+  add = coerce
+          @(w -> LiftingAccum MaybeT m ())
+          @(w -> MaybeT m ())
+          (add @w @(LiftingAccum MaybeT m))
+-}
+
+-------
+
+newtype M a = M [a]
+  deriving stock Show
+  deriving newtype Semigroup
+
+-------
+
+class C a where
+  mc :: a -> a
+
+instance C Int where
+  mc = succ
+
+newtype I = I Int
+  deriving stock Show
+  deriving newtype C
+
+-------
+
+class CC a b where
+  mm :: b -> a -> b
+
+instance CC a Int where
+  mm x _ = x + 1
+
+newtype II = II Int
+  deriving stock Show
+  deriving newtype (CC a)
+
+-------
+
+main :: IO ()
+main = do
+  print $ B True == B True
+
+  let x = N 1
+      y = N 2
+  print $ x == x
+  print $ x == y
+  print $ x < y
+  print $ x + y
+
+  print $ BI (Id 1) == BI (Id 1)
+
+  print $ Id2 (Id False) == Id2 (Id False)
+
+  print $ Id3 (1 :: Int) == Id3 1
+
+  print euroSign
+
+  print $ sPpr $ S "hello"
+
+  print $ fmap (*5) (P (Just 2))
+
+  print $ stimes 3 (M "ab")
+
+  print $ mc (I 1)
+
+  print $ mm (II 99) ()
+
+  putStrLn "done"
diff --git a/tests/Via.ref b/tests/Via.ref
new file mode 100644
--- /dev/null
+++ b/tests/Via.ref
@@ -0,0 +1,15 @@
+True
+True
+False
+True
+N 3
+True
+True
+True
+0x20AC
+"S \"hello\""
+P (Just 10)
+M "ababab"
+I 2
+II 100
+done
diff --git a/tests/Word.hs b/tests/Word.hs
--- a/tests/Word.hs
+++ b/tests/Word.hs
@@ -1,5 +1,4 @@
 module Word(main) where
-import Prelude
 import Data.Word
 
 vals :: [Word16]
@@ -10,9 +9,9 @@
 
 main :: IO ()
 main = do
-  putStrLn $ show (1000::Word)
-  putStrLn $ show $ maxw*maxw > 0
-  putStrLn $ show [ op x y | x <- vals, y <- vals, op <- [(+),( - ),(*)] ]
-  putStrLn $ show [ op x y | x <- vals, y <- vals, y /= 0, op <- [quot, rem] ]
-  putStrLn $ show [ op x y | x <- vals, y <- vals, op <- [(==),(/=),(<),(<=),(>),(>=)] ]
-  putStrLn $ show [ op x y | x <- vals, y <- vals, let op = compare ]
+  print (1000::Word)
+  print $ maxw*maxw > 0
+  print [ op x y | x <- vals, y <- vals, op <- [(+),( - ),(*)] ]
+  print [ op x y | x <- vals, y <- vals, y /= 0, op <- [quot, rem] ]
+  print [ op x y | x <- vals, y <- vals, op <- [(==),(/=),(<),(<=),(>),(>=)] ]
+  print [ op x y | x <- vals, y <- vals, let op = compare ]
