packages feed

MicroHs 0.11.4.0 → 0.12.6.1

raw patch · 296 files changed

+18647/−14105 lines, 296 filesdep +arraydep +bytestringdep +ghc-internal

Dependencies added: array, bytestring, ghc-internal

Files

Makefile view
@@ -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
MicroHs.cabal view
@@ -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
README.md view
@@ -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.
Tools/Addcombs.hs view
@@ -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;"
Tools/Compress.hs view
@@ -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
generated/cpphs.c view
@@ -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 }
generated/mhs.c view
@@ -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 }
ghc/MHSPrelude.hs view
@@ -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
− ghc/MicroHs/Instances.hs
@@ -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
ghc/PrimTable.hs view
@@ -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
ghc/System/IO/MD5.hs view
@@ -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
hugs/MHSPrelude.hs view
@@ -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
− hugs/MicroHs/Instances.hs
@@ -1,5 +0,0 @@-module MicroHs.Instances(compiledWithGHC) where---- TODO: rename to compiledWithMicroHs-compiledWithGHC :: Bool-compiledWithGHC = True
hugs/PrimTable.hs view
@@ -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
hugs/System/IO/Serialize.hs view
@@ -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"
lib/AllOfLib.hs view
@@ -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
lib/Control/Applicative.hs view
@@ -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
lib/Control/Arrow.hs view
@@ -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)
lib/Control/Category.hs view
@@ -1,5 +1,5 @@ module Control.Category(module Control.Category) where-import Prelude()+import qualified Prelude() import Primitives import qualified Data.Function as F 
lib/Control/DeepSeq.hs view
@@ -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--
+ lib/Control/DeepSeq/Class.hs view
@@ -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+
lib/Control/Error.hs view
@@ -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
lib/Control/Error.hs-boot view
@@ -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
lib/Control/Exception.hs view
@@ -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  ------------------- 
lib/Control/Exception/Internal.hs view
@@ -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  ------------------ 
lib/Control/Monad.hs view
@@ -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
lib/Control/Monad/Fail.hs view
@@ -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
lib/Control/Monad/Fix.hs view
@@ -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 
lib/Control/Monad/IO/Class.hs view
@@ -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
lib/Control/Monad/ST.hs view
@@ -2,7 +2,7 @@   ST,   runST,   ) where-import Prelude(); import MiniPrelude+import qualified Prelude(); import MiniPrelude import Primitives(primPerformIO) import Control.Monad.ST_Type 
lib/Control/Monad/ST_Type.hs view
@@ -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 
lib/Control/Monad/Zip.hs view
@@ -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
lib/Data/Array.hs view
@@ -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
lib/Data/Bits.hs view
@@ -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
lib/Data/Bool.hs view
@@ -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
lib/Data/Bool_Type.hs view
@@ -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
lib/Data/Bounded.hs view
@@ -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
lib/Data/ByteString.hs view
@@ -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
lib/Data/ByteString/Internal.hs view
@@ -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 
lib/Data/Char.hs view
@@ -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
+ lib/Data/Char/Unicode.hs view
@@ -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)]
+ lib/Data/Char/Unicode.hs-boot view
@@ -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
lib/Data/Char_Type.hs view
@@ -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 
lib/Data/Coerce.hs view
@@ -1,5 +1,5 @@ module Data.Coerce(Coercible, coerce) where-import Prelude()+import qualified Prelude() import Primitives  type Coercible :: forall k . k -> k -> Constraint
lib/Data/Complex.hs view
@@ -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
lib/Data/Constraint.hs view
@@ -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 
lib/Data/Double.hs view
@@ -1,5 +1,5 @@ module Data.Double(Double) where-import Prelude()+import qualified Prelude() import Primitives import Data.Bool import Data.Eq
lib/Data/Dynamic.hs view
@@ -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
lib/Data/Either.hs view
@@ -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
lib/Data/Enum.hs view
@@ -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
lib/Data/Eq.hs view
@@ -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-
lib/Data/Fixed.hs view
@@ -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
lib/Data/Float.hs view
@@ -1,5 +1,5 @@ module Data.Float(Float) where-import Prelude()+import qualified Prelude() import Primitives import Data.Bool import Data.Eq
lib/Data/FloatW.hs view
@@ -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
lib/Data/Floating.hs view
@@ -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
lib/Data/Foldable.hs view
@@ -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
lib/Data/Foldable/Internal.hs view
@@ -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
lib/Data/Fractional.hs view
@@ -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
lib/Data/Function.hs view
@@ -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
lib/Data/Functor.hs view
@@ -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
lib/Data/Functor/Classes.hs view
@@ -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 ')'
lib/Data/Functor/Compose.hs view
@@ -1,12 +1,3 @@-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE PolyKinds #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE Trustworthy #-}-{-# LANGUAGE StandaloneDeriving #-}- ----------------------------------------------------------------------------- -- | -- Module      :  Data.Functor.Compose
lib/Data/Functor/Const.hs view
@@ -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
lib/Data/Functor/Const_Type.hs view
@@ -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
lib/Data/Functor/Contravariant.hs view
@@ -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 >$, $<, >$<, >$$< 
lib/Data/Functor/Identity.hs view
@@ -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
lib/Data/Functor/Product.hs view
@@ -1,8 +1,3 @@-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE PolyKinds #-}-{-# LANGUAGE Safe #-}-{-# LANGUAGE StandaloneDeriving #-} ----------------------------------------------------------------------------- -- | -- Module      :  Data.Functor.Product
lib/Data/Functor/Sum.hs view
@@ -1,8 +1,3 @@-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE PolyKinds #-}-{-# LANGUAGE Safe #-}-{-# LANGUAGE StandaloneDeriving #-} ----------------------------------------------------------------------------- -- | -- Module      :  Data.Functor.Sum
+ lib/Data/Generics.hs view
@@ -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))+
lib/Data/IOArray.hs view
@@ -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
lib/Data/IORef.hs view
@@ -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
lib/Data/Int.hs view
@@ -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
lib/Data/Int/Instances.hs view
@@ -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
lib/Data/Int/IntN.hs view
@@ -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.
lib/Data/Integer.hs view
@@ -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  ----------------- 
lib/Data/Integer/Internal.hs view
@@ -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]  -}-
lib/Data/Integer_Type.hs view
@@ -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
lib/Data/Integral.hs view
@@ -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
lib/Data/Ix.hs view
@@ -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 &&
lib/Data/Kind.hs view
@@ -1,3 +1,3 @@ module Data.Kind(Type, Constraint) where-import Prelude()+import qualified Prelude() import Primitives
lib/Data/List.hs view
@@ -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)
lib/Data/List/NonEmpty.hs view
@@ -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
lib/Data/List/NonEmpty_Type.hs view
@@ -1,5 +1,5 @@ module Data.List.NonEmpty_Type(module Data.List.NonEmpty_Type) where-import Prelude()+import qualified Prelude()  infixr 5 :| 
lib/Data/List_Type.hs view
@@ -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 :
+ lib/Data/MArray.hs view
@@ -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
lib/Data/Maybe.hs view
@@ -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
lib/Data/Maybe_Type.hs view
@@ -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
lib/Data/Monoid.hs view
@@ -11,7 +11,7 @@   First(..),   Last(..),   ) where-import Prelude()+import qualified Prelude() import Data.Maybe_Type import Data.Monoid.Internal import Data.Records
lib/Data/Monoid/Internal.hs view
@@ -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) 
lib/Data/Num.hs view
@@ -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 
lib/Data/Ord.hs view
@@ -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
lib/Data/Ordering_Type.hs view
@@ -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
lib/Data/Orphans.hs view
@@ -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) $
lib/Data/Proxy.hs view
@@ -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
lib/Data/Ratio.hs view
@@ -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
lib/Data/Ratio_Type.hs view
@@ -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 
lib/Data/Real.hs view
@@ -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
lib/Data/RealFloat.hs view
@@ -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
lib/Data/RealFrac.hs view
@@ -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)
lib/Data/Records.hs view
@@ -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
lib/Data/STRef.hs view
@@ -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
lib/Data/Semigroup.hs view
@@ -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
lib/Data/String.hs view
@@ -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
lib/Data/Text.hs view
@@ -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
+ lib/Data/Text/Encoding.hs view
@@ -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+            ]
lib/Data/Text/IO.hs view
@@ -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
lib/Data/Text/Lazy.hs view
@@ -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
+ lib/Data/Text/Lazy/Builder.hs view
@@ -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
lib/Data/Text/Lazy/IO.hs view
@@ -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)
lib/Data/Traversable.hs view
@@ -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
lib/Data/Tuple.hs view
@@ -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)  ----------------------------------- 
lib/Data/Type/Equality.hs view
@@ -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
lib/Data/TypeLits.hs view
@@ -4,7 +4,7 @@   KnownNat(..),   KnownSymbol(..),   ) where-import Prelude()+import qualified Prelude() import Primitives import Data.Char_Type import Data.Integer
lib/Data/Typeable.hs view
@@ -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
lib/Data/Typeable.hs-boot view
@@ -1,5 +1,5 @@ module Data.Typeable where-import Prelude()+import qualified Prelude() import Data.Char_Type import Data.Maybe_Type 
lib/Data/Version.hs view
@@ -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)
lib/Data/Void.hs view
@@ -1,5 +1,5 @@ module Data.Void(module Data.Void) where-import Prelude(); import MiniPrelude+import qualified Prelude(); import MiniPrelude  data Void 
lib/Data/Word.hs view
@@ -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
lib/Debug/Trace.hs view
@@ -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   ) 
lib/Foreign/C/Error.hs view
@@ -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) =
lib/Foreign/C/String.hs view
@@ -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!
lib/Foreign/C/Types.hs view
@@ -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
lib/Foreign/ForeignPtr.hs view
@@ -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
lib/Foreign/Marshal.hs view
@@ -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
lib/Foreign/Marshal/Alloc.hs view
@@ -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
lib/Foreign/Marshal/Array.hs view
@@ -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
lib/Foreign/Marshal/Error.hs view
@@ -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)
lib/Foreign/Marshal/Utils.hs view
@@ -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
lib/Foreign/Ptr.hs view
@@ -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
lib/Foreign/Storable.hs view
@@ -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 ()
lib/GHC/Stack.hs view
@@ -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. :( 
lib/GHC/Types.hs view
@@ -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
+ lib/Interactive.hs view
@@ -0,0 +1,6 @@+module Interactive(module Interactive) where+import Prelude+import System.IO.PrintOrRun+default Num (Integer, Double)+default IsString (String)+default Show (())
lib/Mhs/Builtin.hs view
@@ -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(..))
lib/MiniPrelude.hs view
@@ -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
lib/Numeric.hs view
@@ -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
lib/Numeric/FormatFloat.hs view
@@ -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
lib/Numeric/Natural.hs view
@@ -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
lib/Numeric/Read.hs view
@@ -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
lib/Numeric/Show.hs view
@@ -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
lib/Prelude.hs view
@@ -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)
lib/Primitives.hs view
@@ -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"-
lib/System/Cmd.hs view
@@ -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 
lib/System/Compress.hs view
@@ -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]
+ lib/System/Compress/ByteString.hs view
@@ -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)
lib/System/Console/GetOpt.hs view
@@ -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)
lib/System/Directory.hs view
@@ -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
lib/System/Environment.hs view
@@ -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
lib/System/Exit.hs view
@@ -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
lib/System/IO.hs view
@@ -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)
lib/System/IO/Error.hs view
@@ -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
lib/System/IO/Internal.hs view
@@ -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
lib/System/IO/MD5.hs view
@@ -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)
lib/System/IO/PrintOrRun.hs view
@@ -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
lib/System/IO/Serialize.hs view
@@ -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
+ lib/System/IO/StringHandle.hs view
@@ -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
lib/System/IO/TimeMilli.hs view
@@ -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 
lib/System/IO/Unsafe.hs view
@@ -1,5 +1,5 @@ module System.IO.Unsafe(unsafePerformIO, unsafeInterleaveIO) where-import Prelude()+import qualified Prelude() import Primitives  unsafePerformIO :: IO a -> a
lib/System/IO_Handle.hs view
@@ -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
lib/System/Info.hs view
@@ -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
lib/System/Process.hs view
@@ -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 
lib/Text/ParserCombinators/ReadP.hs view
@@ -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']))-
lib/Text/ParserCombinators/ReadPrec.hs view
@@ -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)
lib/Text/Printf.hs view
@@ -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
lib/Text/Read.hs view
@@ -38,7 +38,7 @@      readEither,      readMaybe      ) where-import Prelude()+import qualified Prelude() import Control.Error import Control.Monad import Data.Bool
lib/Text/Read/Internal.hs view
@@ -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-
lib/Text/Read/Internal.hs-boot view
@@ -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)]
lib/Text/Read/Lex.hs view
@@ -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
lib/Text/Show.hs view
@@ -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
lib/Unsafe/Coerce.hs view
@@ -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
lib/dist-mcabal/autogen/Paths_libs.hs view
@@ -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"
lib/gmp/Data/Integer/Internal.hs view
@@ -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  --------------------------------- {-
lib/gmp/Data/Integer_Type.hs view
@@ -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)   )
mhs/MHSPrelude.hs view
@@ -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)
mhs/PrimTable.hs view
@@ -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
mhs/System/Console/SimpleReadline.hs view
@@ -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
mhs/System/FilePath.hs view
@@ -10,7 +10,7 @@     takeDirectory,     (</>),   ) where-import Prelude(); import MHSPrelude+import qualified Prelude(); import MHSPrelude import Data.List  infixr 7 <.>
paths/Paths_MicroHs.hs view
@@ -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]
src/MicroHs/Abstract.hs view
@@ -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)
src/MicroHs/Builtin.hs view
@@ -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)
src/MicroHs/Compile.hs view
@@ -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}"
src/MicroHs/CompileCache.hs view
@@ -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)
src/MicroHs/Deriving.hs view
@@ -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 []]
src/MicroHs/Desugar.hs view
@@ -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')
src/MicroHs/EncodeData.hs view
@@ -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-
src/MicroHs/Exp.hs view
@@ -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))
src/MicroHs/ExpPrint.hs view
@@ -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)
src/MicroHs/Expr.hs view
@@ -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 
src/MicroHs/FFI.hs view
@@ -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"   ]
src/MicroHs/Fixity.hs view
@@ -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")
src/MicroHs/Flags.hs view
@@ -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
src/MicroHs/Graph.hs view
@@ -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) []
src/MicroHs/Ident.hs view
@@ -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
src/MicroHs/IdentMap.hs view
@@ -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
− src/MicroHs/Instances.hs
@@ -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
src/MicroHs/IntMap.hs view
@@ -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
src/MicroHs/IntSet.hs view
@@ -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)-
src/MicroHs/Interactive.hs view
@@ -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  ->
src/MicroHs/Lex.hs view
@@ -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
src/MicroHs/List.hs view
@@ -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
− src/MicroHs/MRnf.hs
@@ -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
src/MicroHs/Main.hs view
@@ -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
src/MicroHs/MakeCArray.hs view
@@ -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
+ src/MicroHs/Names.hs view
@@ -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"
src/MicroHs/Package.hs view
@@ -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
src/MicroHs/Parse.hs view
@@ -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  ------------- 
src/MicroHs/State.hs view
@@ -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)
src/MicroHs/StateIO.hs view
@@ -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)
src/MicroHs/SymTab.hs view
@@ -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
src/MicroHs/TCMonad.hs view
@@ -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
src/MicroHs/TargetConfig.hs view
@@ -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
src/MicroHs/Translate.hs view
@@ -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")   ]
src/MicroHs/TypeCheck.hs view
@@ -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
src/Text/ParserComb.hs view
@@ -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 [])
src/Text/PrettyPrint/HughesPJLite.hs view
@@ -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
src/runtime/bfile.c view
@@ -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; 
src/runtime/config-c64.h view
@@ -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 */
src/runtime/config-esp32.h view
@@ -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 */
src/runtime/config-micro-64.h view
@@ -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 */
src/runtime/config-mingw-64.h view
@@ -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 */
src/runtime/config-stm32f4.h view
@@ -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 */
src/runtime/config-unix-64.h view
@@ -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 */
src/runtime/config-windows-64.h view
@@ -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 */
src/runtime/eval.c view
@@ -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},
tests/Arith.hs view
@@ -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 ]
tests/Array.hs view
@@ -19,4 +19,3 @@   print $ a // [(1,'w')]   print $ fmap fromEnum a   print $ ixmap (0,2) succ a-  
tests/Bang.hs view
@@ -14,4 +14,3 @@   print (2 !3)   print (2!3)   print (f 1)-  
+ tests/Bounded.hs view
@@ -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
+ tests/Bounded.ref view
@@ -0,0 +1,6 @@+(-128,127)+(-32768,32767)+(-2147483648,2147483647)+(0,255)+(0,65535)+(0,4294967295)
+ tests/ByteStringIO.hs view
@@ -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"
+ tests/ByteStringIO.ref view
@@ -0,0 +1,2 @@+True+Hello!
tests/Bytestring.hs view
@@ -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)
tests/Bytestring.ref view
@@ -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_"
+ tests/CString.hs view
@@ -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)
+ tests/CString.ref view
@@ -0,0 +1,5 @@+True+("hello","hello")+("hello","hello")+("hello","hello")+("hello","hello")
tests/Case.hs view
@@ -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 =
tests/Catch.hs view
@@ -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
tests/Catch.ref view
@@ -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"
tests/Class.hs view
@@ -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')
tests/Coerce.hs view
@@ -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)
tests/Coerce.ref view
@@ -5,3 +5,6 @@ [NT 5,NT 6] [7,8] [104,101,108,108,111]+12+42+24
+ tests/Cpp.hs view
@@ -0,0 +1,5 @@+{-# LANGUAGE CPP #-}+#define FOO 42++module Cpp where+main = print FOO
+ tests/Cpp.ref view
@@ -0,0 +1,1 @@+42
tests/Deriving.hs view
@@ -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)
tests/Deriving.ref view
@@ -17,3 +17,5 @@ R{x='a',y=10} R{x=R{x='b',y=11},y=10} Alt [True]+1+(X,Z)
tests/DfltSig.ref view
@@ -1,1 +1,1 @@-(0,'\0',[])+(0,'\NUL',[])
+ tests/Do.hs view
@@ -0,0 +1,5 @@+module Do where++main :: IO ()+main = do+  let a = 42 in print a
+ tests/Do.ref view
@@ -0,0 +1,1 @@+42
tests/Enum.hs view
@@ -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..]
tests/Enum.ref view
@@ -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]
tests/Eq.hs view
@@ -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],
+ tests/Exn.hs view
@@ -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"
tests/FArith.hs view
@@ -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"]
+ tests/Forall.hs view
@@ -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')
+ tests/Forall.ref view
@@ -0,0 +1,1 @@+'a'
tests/ForeignC.hs view
@@ -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
tests/FunDep.hs view
@@ -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
tests/Guard.hs view
@@ -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]]
tests/HigherKind.hs view
@@ -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 ++ ")"
tests/IOTest.hs view
@@ -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"
tests/Infix.hs view
@@ -16,4 +16,4 @@  main :: IO () main = do-  putStrLn $ show $ 2 +++ 3 &&& 4 === 17+  print $ 2 +++ 3 &&& 4 === 17
tests/Integer.hs view
@@ -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'
tests/Integer.ref view
@@ -1,3 +1,5 @@ True True True+1234567890123456789012345678901234567890+True
+ tests/Interactive.hs view
@@ -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
+ tests/Lit.ref view
@@ -0,0 +1,1 @@+99
tests/LitMatch.hs view
@@ -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"]
tests/LocalPoly.hs view
@@ -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)
tests/Makefile view
@@ -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
tests/MutRec.hs view
@@ -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]
tests/Newtype.hs view
@@ -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)))
tests/Rank2.hs view
@@ -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)
tests/Read.hs view
@@ -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)
tests/Read.ref view
@@ -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" "\"" "\\"
tests/Readline.hs view
@@ -13,4 +13,4 @@   case s of     Just "quit" -> putStrLn "Bye"     _ -> do putStrLn $ showMaybe showString s; loop-    +
tests/ST.hs view
@@ -18,7 +18,7 @@           loop   loop   readSTRef rr-  + fac :: Int -> Int fac n = runST (facST n) 
tests/Serdes.hs view
@@ -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)
tests/StandDer.hs view
@@ -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)
tests/StandDer.ref view
@@ -1,2 +1,5 @@ X [A,B,C True,D A]+X+M (Just 97)+Z X
tests/Storable.hs view
@@ -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
tests/StringTest.hs view
@@ -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"+
tests/StringTest.ref view
@@ -14,3 +14,4 @@ Just 890 Left 678 Right True+5
tests/Symbol.hs view
@@ -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
tests/TestMap.hs view
@@ -1,5 +1,5 @@ module TestMap(lookup) where-import Prelude()+import qualified Prelude() import Primitives  lookup :: ()
tests/Text.hs view
@@ -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
tests/Text.ref view
@@ -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
tests/TypeApp.hs view
@@ -9,3 +9,4 @@   print $ read @Int "123"   let (x, y) = foo @_ @Bool   print $ typeOf y+  return @IO ()
tests/TypeEq.hs view
@@ -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')))
tests/TypeEq.ref view
@@ -1,3 +1,6 @@ False 1 1+2+[1,2,3]+[Pure 'a',Pure 'b']
+ tests/TypeOp.hs view
@@ -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)
+ tests/TypeOp.ref view
@@ -0,0 +1,1 @@+Left 5
tests/Typeable.ref view
@@ -1,6 +1,6 @@-Char-IO Char-(Char,Char)+Bool+IO Bool+(Char,Bool) Monad T P (P T)
tests/Unicode.hs view
@@ -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
tests/Unicode.ref view
@@ -2,3 +2,13 @@ åbc Ђઈ True+å ä ö+[True,False,True,False,True]+[False,False,False,False,False]+Å Ä Ö+[True,False,True,False,True]+džDžDŽ+džDžDŽ+džDžDŽ+ⅸⅨⅨ+ⅸⅨⅨ
+ tests/Via.hs view
@@ -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"
+ tests/Via.ref view
@@ -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
tests/Word.hs view
@@ -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 ]