MicroHs 0.9.18.0 → 0.10.3.0
raw patch · 180 files changed
+16860/−8160 lines, 180 files
Files
- Makefile +5/−6
- MicroHs.cabal +15/−6
- README.md +2/−1
- generated/cpphs.c +1518/−1386
- generated/mhs.c +4765/−4495
- ghc/Compat.hs +5/−0
- ghc/MHSPrelude.hs +2/−0
- lib/AllOfLib.hs +25/−0
- lib/Control/Applicative.hs +2/−0
- lib/Control/Category.hs +21/−0
- lib/Control/DeepSeq.hs +29/−3
- lib/Control/Error.hs +5/−1
- lib/Control/Exception.hs +1/−0
- lib/Control/Monad.hs +5/−3
- lib/Control/Monad/Fix.hs +74/−0
- lib/Control/Monad/IO/Class.hs +12/−0
- lib/Control/Monad/ST.hs +1/−1
- lib/Control/Monad/ST_Type.hs +3/−0
- lib/Control/Monad/Zip.hs +136/−0
- lib/Data/Array.hs +15/−1
- lib/Data/Bifoldable.hs +1039/−0
- lib/Data/Bifunctor.hs +176/−0
- lib/Data/Bitraversable.hs +105/−0
- lib/Data/Bits.hs +16/−1
- lib/Data/ByteString.hs +1/−1
- lib/Data/ByteString/Internal.hs +1/−1
- lib/Data/ByteStringX.hs +0/−652
- lib/Data/Char.hs +1/−1
- lib/Data/Double.hs +2/−1
- lib/Data/Either.hs +12/−0
- lib/Data/Fixed.hs +225/−0
- lib/Data/Float.hs +2/−1
- lib/Data/FloatW.hs +9/−3
- lib/Data/Foldable.hs +7/−35
- lib/Data/Foldable/Internal.hs +88/−0
- lib/Data/Foldable1.hs +571/−0
- lib/Data/Functor.hs +20/−1
- lib/Data/Functor/Classes.hs +559/−0
- lib/Data/Functor/Compose.hs +170/−0
- lib/Data/Functor/Const.hs +2/−8
- lib/Data/Functor/Const_Type.hs +19/−0
- lib/Data/Functor/Contravariant.hs +383/−0
- lib/Data/Functor/Identity.hs +3/−5
- lib/Data/Functor/Product.hs +115/−0
- lib/Data/Functor/Sum.hs +103/−0
- lib/Data/Hashable.hs +190/−0
- lib/Data/IORef.hs +2/−0
- lib/Data/Int/Instances.hs +17/−6
- lib/Data/Integer.hs +3/−2
- lib/Data/Kind.hs +3/−0
- lib/Data/List.hs +3/−4
- lib/Data/List/NonEmpty.hs +73/−61
- lib/Data/List/NonEmpty_Type.hs +6/−0
- lib/Data/Maybe.hs +1/−2
- lib/Data/Monoid.hs +20/−141
- lib/Data/Monoid/Internal.hs +251/−0
- lib/Data/Ord.hs +60/−0
- lib/Data/Orphans.hs +8/−0
- lib/Data/Ratio.hs +42/−0
- lib/Data/Records.hs +0/−25
- lib/Data/STRef.hs +3/−1
- lib/Data/Semigroup.hs +156/−5
- lib/Data/Text.hs +2/−3
- lib/Data/Traversable.hs +18/−11
- lib/Data/Tuple.hs +27/−2
- lib/Data/Tuple/Instances.hs +33/−0
- lib/Data/Type/Equality.hs +1/−1
- lib/Data/TypeLits.hs +3/−1
- lib/Data/Typeable.hs +5/−7
- lib/Data/Typeable/Internal.hs +26/−0
- lib/Data/Version.hs +1/−0
- lib/Data/Void.hs +1/−1
- lib/Data/Word.hs +36/−6
- lib/Debug/Trace.hs +1/−1
- lib/Foreign.hs +19/−0
- lib/Foreign/C.hs +9/−0
- lib/Foreign/C/Error.hs +490/−0
- lib/Foreign/C/String.hs +7/−1
- lib/Foreign/C/Types.hs +46/−0
- lib/Foreign/ForeignPtr.hs +4/−3
- lib/Foreign/Marshal.hs +13/−0
- lib/Foreign/Marshal/Array.hs +1/−1
- lib/Foreign/Marshal/Error.hs +28/−0
- lib/Foreign/Marshal/Utils.hs +1/−1
- lib/Foreign/Ptr.hs +1/−1
- lib/Mhs/Builtin.hs +31/−0
- lib/MiniPrelude.hs +62/−0
- lib/Numeric.hs +3/−67
- lib/Numeric/FormatFloat.hs +1/−1
- lib/Numeric/Natural.hs +3/−0
- lib/Numeric/Read.hs +83/−0
- lib/Numeric/Show.hs +69/−0
- lib/Prelude.hs +2/−0
- lib/Primitives.hs +21/−0
- lib/System/Cmd.hs +1/−0
- lib/System/Compress.hs +92/−13
- lib/System/Console/GetOpt.hs +409/−0
- lib/System/Directory.hs +1/−1
- lib/System/Environment.hs +2/−1
- lib/System/Exit.hs +1/−0
- lib/System/IO.hs +50/−45
- lib/System/IO/Error.hs +335/−0
- lib/System/IO/Internal.hs +113/−0
- lib/System/IO/MD5.hs +4/−3
- lib/System/IO/Serialize.hs +8/−7
- lib/System/IO/TimeMilli.hs +1/−0
- lib/System/IO_Handle.hs +14/−3
- lib/System/Process.hs +1/−1
- lib/Text/ParserCombinators/ReadP.hs +87/−63
- lib/Text/ParserCombinators/ReadPrec.hs +24/−38
- lib/Text/Printf.hs +1/−1
- lib/Text/Read.hs +101/−120
- lib/Text/Read/Internal.hs +799/−0
- lib/Text/Read/Internal.hs-boot +5/−0
- lib/Text/Read/Lex.hs +587/−56
- lib/Text/Read/Numeric.hs +0/−81
- mhs/MHSPrelude.hs +77/−0
- mhs/System/Console/SimpleReadline.hs +1/−1
- paths/Paths_MicroHs.hs +2/−1
- src/MicroHs/Abstract.hs +3/−2
- src/MicroHs/Compile.hs +53/−22
- src/MicroHs/CompileCache.hs +28/−8
- src/MicroHs/Deriving.hs +39/−72
- src/MicroHs/Desugar.hs +10/−5
- src/MicroHs/EncodeData.hs +16/−0
- src/MicroHs/Exp.hs +1/−1
- src/MicroHs/ExpPrint.hs +1/−0
- src/MicroHs/Expr.hs +33/−13
- src/MicroHs/FFI.hs +63/−45
- src/MicroHs/Fixity.hs +1/−0
- src/MicroHs/Flags.hs +3/−0
- src/MicroHs/Graph.hs +1/−0
- src/MicroHs/Ident.hs +28/−6
- src/MicroHs/IdentMap.hs +16/−4
- src/MicroHs/Instances.hs +1/−0
- src/MicroHs/IntMap.hs +30/−10
- src/MicroHs/IntSet.hs +1/−0
- src/MicroHs/Interactive.hs +3/−6
- src/MicroHs/Lex.hs +73/−23
- src/MicroHs/List.hs +1/−0
- src/MicroHs/Main.hs +48/−16
- src/MicroHs/MakeCArray.hs +1/−0
- src/MicroHs/Package.hs +3/−1
- src/MicroHs/Parse.hs +68/−42
- src/MicroHs/State.hs +1/−0
- src/MicroHs/StateIO.hs +1/−0
- src/MicroHs/SymTab.hs +11/−2
- src/MicroHs/TCMonad.hs +10/−1
- src/MicroHs/TargetConfig.hs +5/−13
- src/MicroHs/Translate.hs +6/−1
- src/MicroHs/TypeCheck.hs +288/−265
- src/Text/ParserComb.hs +1/−2
- src/Text/PrettyPrint/HughesPJLite.hs +1/−1
- src/runtime/MachDeps.h +2/−0
- src/runtime/bfile.c +604/−56
- src/runtime/config-unix-32.h +3/−0
- src/runtime/config-unix-64.h +16/−1
- src/runtime/eval.c +236/−69
- src/runtime/lz77.c +109/−26
- src/runtime/mhsffi.h +19/−16
- src/runtime/rle.c +4/−0
- tests/Arith.hs +7/−3
- tests/Arith.ref +1/−0
- tests/Bang.hs +17/−0
- tests/Bang.ref +6/−0
- tests/Foreign.hs +0/−19
- tests/Foreign.ref +0/−2
- tests/ForeignC.hs +19/−0
- tests/ForeignC.ref +2/−0
- tests/ImpMet.hs +5/−0
- tests/ImpMet.ref +1/−0
- tests/LameCase.hs +10/−0
- tests/LameCase.ref +4/−0
- tests/Makefile +6/−1
- tests/MultiIf.hs +33/−0
- tests/MultiIf.ref +9/−0
- tests/NoForall.hs +11/−0
- tests/NoForall.ref +1/−0
- tests/Word.hs +10/−3
- tests/Word.ref +4/−0
Makefile view
@@ -12,8 +12,7 @@ GHCINCS= -ighc -isrc -ipaths GHCWARNS= -Wall -Wno-unrecognised-warning-flags -Wno-x-partial -Wno-deprecations GHCOPTS= -O-GHCEXTS= -DNOTCABAL -XScopedTypeVariables -XPatternGuards -XTupleSections -XTypeSynonymInstances -XFlexibleInstances -XOverloadedRecordDot -XDisambiguateRecordFields -XOverloadedStrings-# -XOverloadedRecordUpdate+GHCEXTS= -DNOTCABAL -XScopedTypeVariables -XTypeSynonymInstances -XMultiParamTypeClasses -XFlexibleInstances -XBangPatterns GHCPKGS= -package mtl -package pretty -package haskeline -package process -package time -package ghc-prim -package containers -package deepseq -package directory -package text GHCTOOL= # -F -pgmF Tools/convertX.sh GHCOUTDIR= ghc-out@@ -190,8 +189,8 @@ ###### -VERSION=0.9.18.0-HVERSION=0,9,18,0+VERSION=0.10.3.0+HVERSION=0,10,3,0 MCABAL=$(HOME)/.mcabal MCABALMHS=$(MCABAL)/mhs-$(VERSION) MDATA=$(MCABALMHS)/data/mhs-$(VERSION)/data@@ -199,12 +198,12 @@ MCABALBIN=$(MCABAL)/bin MDIST=dist-mcabal BASE=base-$(VERSION)-BASEMODULES=Control.Applicative Control.Arrow Control.DeepSeq Control.Error Control.Exception Control.Monad Control.Monad.Fail Control.Monad.ST Data.Array 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.Float Data.FloatW Data.Floating Data.Foldable Data.Fractional Data.Function Data.Functor Data.Functor.Const Data.Functor.Identity Data.IOArray Data.IORef Data.Int Data.Integer Data.Integral Data.Ix 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.Time.Clock Data.Time.Format Data.Traversable Data.Tuple Data.Type.Equality Data.TypeLits Data.Typeable Data.Version Data.Void Data.Word Data.ZipList Debug.Trace Foreign.C.String Foreign.C.Types Foreign.ForeignPtr Foreign.Marshal.Alloc Foreign.Marshal.Array Foreign.Marshal.Utils Foreign.Ptr Foreign.Storable GHC.Stack GHC.Types Numeric Numeric.FormatFloat Numeric.Natural Prelude System.Cmd System.Compress System.Directory System.Environment System.Exit System.IO System.IO.MD5 System.IO.PrintOrRun System.IO.Serialize System.IO.TimeMilli System.IO.Unsafe System.Info System.Process Text.Printf Text.Read Text.Read.Lex Text.Read.Numeric Text.Show TimeCompat Unsafe.Coerce+BASEMODULES=Control.Applicative Control.Arrow Control.Category Control.DeepSeq Control.Error Control.Exception 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.Stack GHC.Types 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 @mkdir -p $(MCABALBIN) @mkdir -p $(MDIST)- @echo 'module Paths_MicroHs where {import Data.Version; version :: Version; version = makeVersion [$(HVERSION)]; getDataDir :: IO FilePath; getDataDir = return "$(MDATA)" }' > $(MDIST)/Paths_MicroHs.hs+ @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) MicroHs.Main -o$(MCABALBIN)/mhs $(MCABALBIN)/cpphs: bin/cpphs
MicroHs.cabal view
@@ -1,8 +1,8 @@ cabal-version: 3.0 name: MicroHs-version: 0.9.18.0+version: 0.10.3.0 -- *** When changing the version number, also- -- *** run updateversion.sh.+ -- *** run 'sh updateversion.sh' -- *** Yeah, it stinks. synopsis: A small compiler for Haskell license: Apache-2.0@@ -39,11 +39,16 @@ tests/*.ref data-files:- lib/**/*.hs- lib/**/*.hs-boot src/runtime/*.c src/runtime/*.h +-- Cabal doesn't seem to understand this, so it never copies+-- these files.+--if impl(ghc)+-- data-files:+ lib/**/*.hs+ lib/**/*.hs-boot+ source-repository head type: git location: https://github.com/augustss/MicroHs@@ -93,6 +98,7 @@ Data.Integer Compat PrimTable+ MHSPrelude System.IO.MD5 System.IO.Serialize System.IO.TimeMilli@@ -109,7 +115,10 @@ process >= 1.6 && < 1.8, directory >= 1.2 && < 1.5, text >= 2.0 && < 2.3,---++-- Hackage does not accept 'mhs' as a valid Haskell compiler,+-- so mcabal has a hack to recognize lines that start with+-- '--MHS' as non-comments. --MHS if impl(mhs)---MHS hs-source-dirs: mhs src+--MHS hs-source-dirs: mhs src paths --MHS build-depends: base >= 0.1 && < 10.0,
README.md view
@@ -63,7 +63,9 @@ * ImportQualifiedPost * IncoherentInstances * KindSignatures+ * LambdaCase * MonoLocalBinds+ * MultiWayIf * MultiParamTypeClasses * NamedFieldPuns * NegativeLiterals@@ -89,7 +91,6 @@ * 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. * The `BangPatterns` extension is parsed, but only effective at the a top level `let`/`where`.- * Lazy patterns (`~pat`) are ignored. * More differences that I don't remember right now. Mutually recursive modules are allowed the same way as with GHC, using `.hs-boot` files.
generated/cpphs.c view
@@ -1,1390 +1,1522 @@ static unsigned char data[] = {-122,2,118,55,46,2,48,10,54,2,53,55,10,2,65,32,95,2,48,32,-95,2,50,52,32,2,64,95,50,2,54,32,95,2,50,57,32,2,64,95,-51,2,49,32,64,2,64,95,48,224,22,2,2,51,51,32,224,22,12,2,-53,32,64,160,22,2,49,49,32,160,23,2,49,52,32,2,64,67,39,2,-32,95,49,160,17,2,64,66,32,2,95,51,56,32,15,2,50,32,95,96,-15,2,64,83,32,2,83,32,95,2,50,50,48,64,4,2,50,32,64,2,-95,49,54,2,52,32,95,2,49,54,54,2,32,64,102,2,114,111,109,2,-85,84,70,2,56,32,34,2,45,45,99,2,112,112,34,64,45,2,64,73,-32,32,95,2,50,51,57,64,12,32,75,224,105,1,2,52,49,32,32,76,-2,39,32,83,32,109,160,150,2,64,64,67,2,39,66,32,32,37,2,50,-52,51,64,94,96,58,224,105,23,2,118,101,114,2,115,105,111,2,110,34,-32,64,109,96,187,192,77,96,72,32,120,2,67,32,95,2,49,52,54,64,-64,32,5,224,69,2,2,79,32,35,2,51,50,32,2,64,75,32,32,55,-2,95,50,53,2,48,32,64,128,8,65,73,2,53,55,32,64,13,224,159,-58,2,104,101,108,161,10,224,156,12,65,19,224,150,5,224,60,1,2,85,-115,97,2,103,101,58,2,32,34,32,96,60,224,197,14,224,46,1,2,32,-91,102,2,105,108,101,2,32,46,46,2,46,93,32,2,91,32,45,2,68,-115,121,2,109,32,124,128,7,2,61,118,97,2,108,32,124,2,32,45,73,-2,112,97,116,2,104,32,93,2,42,32,32,2,91,45,79,64,45,2,93,-92,49,2,48,38,34,97,1,224,87,16,2,92,57,38,32,2,2,91,45,-45,2,110,111,109,2,97,99,114,2,111,93,32,96,11,2,108,105,110,2,-101,93,32,32,10,64,8,2,112,114,97,2,103,109,97,96,14,224,10,2,-2,116,101,120,2,116,93,92,224,97,34,2,115,116,114,2,105,112,93,64,-58,96,9,2,45,101,111,2,108,93,32,32,13,2,104,97,115,2,104,101,-115,128,109,2,97,121,111,2,117,116,93,64,10,2,117,110,108,2,105,116,-93,224,95,0,224,79,8,2,32,45,45,34,135,2,32,115,116,2,100,45,-99,2,112,112,45,2,111,112,116,34,40,2,115,32,93,64,59,2,105,110,-99,2,108,117,100,2,101,61,102,33,4,2,110,97,109,2,101,93,34,129,-163,226,2,8,2,66,32,67,2,32,67,39,34,244,65,190,128,8,160,9,-160,12,96,13,224,29,0,2,39,32,64,32,50,32,52,224,8,7,32,6,-98,59,226,75,0,2,66,32,83,34,15,226,74,3,2,53,56,32,192,91,-224,38,3,163,130,98,46,160,15,226,50,17,2,110,107,110,2,111,119,110,-2,32,111,112,64,235,162,58,64,195,67,211,98,62,2,50,53,57,130,126,-224,67,16,2,44,32,102,2,111,114,32,34,49,2,105,100,32,193,51,2,-116,114,121,226,135,6,226,119,2,130,228,225,135,0,225,67,2,2,54,48,-32,2,35,49,32,193,88,96,135,97,10,225,7,2,64,153,225,4,1,96,-167,2,53,51,32,2,95,55,51,65,18,2,56,56,32,2,64,35,49,228,-185,3,225,9,0,224,127,1,2,65,116,32,2,109,111,115,2,116,32,111,-2,110,101,32,34,26,2,112,117,116,2,32,102,105,35,8,2,40,45,79,-2,41,32,99,2,97,110,32,2,98,101,32,2,115,112,101,2,99,105,102,-2,105,101,100,130,137,224,157,1,64,116,128,0,131,235,33,201,97,98,68,-228,2,54,49,32,161,222,32,181,129,120,2,50,52,52,193,152,2,95,54,-50,66,33,2,95,50,48,2,53,32,95,2,49,56,49,129,29,96,65,128,-26,32,20,132,83,64,15,65,218,32,6,65,123,2,95,54,51,64,23,32,-6,96,51,2,95,54,53,37,137,192,0,2,58,54,53,33,92,37,217,2,-89,32,66,32,74,32,119,226,129,0,98,65,64,5,226,100,0,66,25,64,-46,96,188,128,122,224,9,12,160,65,66,138,32,50,2,53,56,51,66,7,-2,55,54,32,64,189,96,6,32,22,64,111,2,80,32,75,160,45,64,119,-161,16,64,251,128,65,2,32,61,61,65,142,128,233,64,125,2,85,32,64,-96,25,37,214,225,71,1,224,82,43,128,61,224,82,68,66,63,224,82,26,-2,95,54,52,96,7,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,-32,25,39,86,39,15,2,49,52,52,32,176,2,52,53,32,227,38,1,224,-44,0,192,63,224,64,7,32,103,64,208,224,62,1,2,55,57,32,192,62,-195,99,128,104,226,192,4,164,132,66,19,2,80,32,64,131,204,225,20,2,-224,101,2,128,103,224,101,7,224,164,2,224,43,0,64,91,35,45,2,54,-53,52,67,158,165,53,224,133,9,224,82,1,164,143,64,128,224,127,7,224,-52,1,97,72,224,51,3,160,26,96,53,104,160,32,54,130,13,36,191,200,-75,64,222,227,42,1,225,96,6,229,207,1,65,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,35,200,-33,44,35,200,2,83,32,67,192,153,33,37,96,76,32,18,128,17,128,27,-226,14,17,96,38,224,167,13,2,54,56,32,198,68,201,163,132,131,100,22,-2,54,52,56,97,40,64,12,33,50,2,85,32,75,192,78,132,214,41,233,-101,96,233,13,4,69,86,96,39,32,0,2,85,32,65,163,30,2,57,32,-67,224,120,3,32,121,229,209,1,224,193,30,2,66,32,90,128,198,224,196,-7,2,56,53,32,64,100,224,189,0,34,69,165,50,164,190,225,158,9,96,-49,2,83,32,80,225,23,15,102,56,234,182,0,97,18,160,12,2,54,53,-49,64,242,2,53,56,53,160,43,230,253,12,2,47,92,57,2,50,38,34,-225,226,4,65,174,42,195,192,98,233,232,14,200,81,128,59,165,252,224,135,-7,2,54,53,50,65,124,38,7,2,35,49,48,192,100,75,35,32,97,2,-52,53,52,170,74,65,7,64,198,34,67,32,111,34,67,2,79,32,80,231,-171,13,233,148,0,134,215,2,54,51,53,32,7,224,45,20,73,173,192,44,-68,249,224,44,18,233,216,1,192,48,66,188,224,48,18,224,44,5,66,129,-224,44,18,74,28,160,42,108,11,224,42,18,106,12,192,43,65,54,224,43,-23,74,56,192,134,69,24,224,47,18,138,90,192,92,65,124,225,17,19,106,-124,192,44,65,162,224,44,18,106,158,192,43,67,57,225,151,20,2,119,97,-114,140,196,32,44,65,196,195,136,200,21,32,108,34,8,67,205,134,219,38,-213,32,21,32,175,224,21,0,64,187,128,21,33,78,32,21,64,19,32,118,-34,93,32,18,33,53,96,40,38,247,72,154,72,254,2,50,51,32,64,89,-67,245,224,67,0,65,136,96,67,68,63,96,67,34,243,32,10,2,75,32,-95,2,49,50,54,128,47,32,63,100,214,224,1,8,37,150,2,54,51,50,-104,99,96,92,141,28,2,54,51,52,64,112,98,153,224,26,14,135,129,224,-27,13,133,124,224,19,5,100,250,224,18,5,102,254,107,80,2,49,54,32,-224,27,10,224,17,4,98,67,224,112,14,98,139,224,47,7,101,242,224,18,-5,100,102,224,18,5,171,175,224,84,11,96,252,33,59,137,219,65,105,32,-130,97,153,64,26,128,18,32,166,128,17,131,243,32,17,32,231,128,17,129,-252,32,17,33,13,128,17,129,248,32,17,193,225,64,183,128,17,32,80,128,-17,129,243,32,17,32,117,96,17,65,9,128,17,32,80,128,17,193,230,75,-8,128,17,129,222,64,162,192,17,224,180,0,192,179,65,203,80,124,38,9,-103,39,199,122,169,40,2,67,32,60,69,136,161,145,224,25,9,138,65,224,-26,13,97,86,139,135,231,202,0,160,26,161,94,34,158,2,85,32,67,37,-248,233,235,1,64,25,130,167,32,26,162,168,129,224,32,44,96,161,136,166,-234,29,5,160,49,128,37,134,66,133,125,230,127,1,224,132,9,96,31,224,-87,17,101,188,224,87,20,224,59,17,136,60,224,59,8,2,54,51,51,67,-134,144,99,224,160,3,225,67,15,195,10,224,189,10,98,247,225,66,12,108,-145,225,66,15,224,44,6,99,79,224,43,10,224,116,13,224,207,1,224,70,-6,109,18,224,114,30,109,105,224,114,11,225,3,14,194,70,224,25,9,136,-63,224,168,11,172,98,224,124,9,109,40,224,168,30,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,105,64,2,55,50,32,133,63,68,113,133,19,102,98,-32,97,239,26,2,106,226,234,45,1,204,145,239,32,0,2,49,52,57,212,-123,35,77,203,9,224,16,3,106,232,160,17,32,115,70,49,135,25,64,6,-103,25,224,1,9,108,146,237,52,10,224,29,8,224,26,17,224,23,14,224,-20,11,224,17,8,224,14,5,224,11,2,237,221,4,200,59,71,147,101,192,-71,197,2,56,57,32,243,40,2,2,51,52,38,51,26,2,104,115,115,2,-114,99,47,2,109,97,108,2,99,111,108,2,109,45,119,2,97,108,108,2,-97,99,101,40,191,2,105,118,101,2,114,115,101,2,47,99,112,32,33,2,-45,49,46,2,50,48,46,2,57,47,99,64,12,2,46,104,115,64,58,2,-44,56,48,2,58,49,34,213,231,32,104,134,131,65,99,2,90,32,90,32,-1,161,107,32,25,198,139,139,23,2,90,32,95,139,18,2,58,54,50,134,-147,2,85,32,90,224,51,7,81,51,32,25,241,127,3,65,255,246,154,0,-193,185,130,2,179,55,224,29,0,173,174,2,54,49,57,225,244,1,66,119,-98,238,243,96,2,49,148,32,144,32,5,34,109,97,247,107,139,2,54,50,-53,128,134,2,80,32,80,233,179,13,52,85,2,105,110,34,178,8,66,183,-108,147,47,0,101,99,32,189,135,71,2,95,51,52,2,57,32,95,64,228,-32,18,135,72,182,68,71,122,96,105,72,44,2,54,50,52,175,170,64,226,-2,51,52,53,162,192,247,48,1,2,51,52,54,225,184,2,32,5,2,45,-56,47,2,47,82,79,2,85,78,68,2,84,82,73,2,80,34,32,205,143,-244,62,6,87,234,96,209,2,50,52,55,136,216,2,51,51,53,129,120,135,-196,65,170,65,29,32,16,131,99,242,239,4,225,78,1,32,55,64,64,97,-64,224,22,2,160,204,225,77,0,128,93,248,47,2,64,88,131,71,32,228,-2,49,32,58,65,104,64,13,2,94,102,108,2,117,115,104,2,98,32,58,-64,21,96,30,64,161,97,130,32,18,130,46,209,219,225,214,4,45,192,32,-210,132,9,33,66,32,14,78,56,2,53,55,57,96,196,65,238,128,57,226,-52,13,129,221,51,178,227,69,2,224,173,3,228,72,3,98,41,111,182,2,-53,55,55,71,142,102,133,2,54,49,54,165,65,135,195,234,239,2,2,53,-54,57,142,157,165,86,234,143,1,2,54,48,52,96,5,66,96,64,46,2,-54,51,32,180,57,2,52,49,54,227,196,0,148,221,2,54,50,32,32,100,-184,128,171,87,2,53,54,51,192,63,128,75,64,108,160,6,241,147,0,32,-253,163,50,34,138,35,27,78,87,2,75,32,79,138,108,99,1,32,33,130,-150,161,182,117,5,160,147,64,11,64,144,2,54,48,54,162,138,32,18,99,-50,32,18,85,135,148,180,2,48,57,32,97,4,161,140,2,54,49,53,65,-176,64,196,96,120,148,182,227,102,0,2,79,32,64,69,216,112,50,131,131,-243,96,1,163,181,240,60,12,179,190,164,207,115,4,242,251,17,207,73,198,-13,145,163,224,119,0,2,64,64,82,69,217,161,37,245,230,6,128,127,224,-122,10,224,39,25,128,117,178,151,64,40,132,112,178,54,224,144,31,224,180,-28,130,123,33,102,204,44,128,37,226,104,1,98,107,98,143,243,3,20,2,-57,50,32,248,15,0,241,140,2,138,85,228,93,1,2,98,101,103,2,105,-110,123,2,99,111,100,2,101,125,34,205,41,64,158,161,253,243,118,4,242,-2,2,201,108,225,162,10,224,120,9,241,79,22,2,101,110,100,224,128,3,-224,130,7,226,128,0,228,129,0,97,62,32,22,241,85,0,247,21,4,225,-195,14,35,106,224,150,1,224,181,9,142,179,217,62,64,96,211,204,2,95,-50,56,32,104,128,247,72,108,64,208,2,54,55,32,32,197,96,127,195,94,-75,211,32,42,35,213,2,51,49,57,133,142,2,55,53,32,163,56,142,84,-192,200,224,100,2,96,57,70,148,116,126,71,189,224,40,3,67,146,160,201,-96,114,2,50,55,56,185,208,97,30,140,218,160,44,225,52,14,34,72,133,-235,2,75,50,32,197,253,64,55,32,17,199,133,87,52,96,22,208,97,51,-193,224,4,3,96,6,168,102,32,37,133,194,224,37,8,32,4,224,72,0,-133,210,136,25,164,140,64,149,96,54,2,89,32,64,193,159,201,214,226,192,-7,68,237,32,9,36,160,2,56,50,32,32,9,2,57,51,32,100,145,129,-59,2,82,32,64,215,127,163,125,2,85,32,35,212,167,128,76,130,12,151,-79,251,192,0,251,198,2,224,21,15,248,23,4,224,43,3,224,15,2,248,-39,5,118,239,233,180,2,65,41,233,180,4,224,67,0,224,53,1,224,154,-5,234,200,0,192,83,247,12,4,32,16,33,120,33,67,69,224,166,57,2,-50,49,50,188,60,213,105,33,244,36,51,227,81,1,2,112,114,111,2,103,-114,97,2,109,34,32,253,42,4,2,99,111,109,2,109,101,110,146,166,251,-161,4,194,140,227,181,2,245,194,1,102,16,234,155,5,128,228,248,18,1,-224,61,0,107,169,32,51,2,56,55,32,97,186,172,129,224,61,3,193,17,-161,14,161,11,224,255,4,133,139,224,249,4,96,253,224,176,41,224,177,53,-225,196,54,254,37,0,235,173,0,67,66,227,83,0,225,198,26,225,176,3,-225,220,13,182,81,225,203,103,163,213,155,155,230,32,2,193,213,227,154,1,-224,70,19,36,20,200,195,161,53,156,243,128,5,230,174,2,230,53,12,76,-148,64,3,193,7,248,157,3,253,56,6,254,254,16,2,76,105,110,2,101,-32,34,250,197,6,223,61,2,49,51,51,94,160,129,49,224,71,21,2,58,-32,34,226,33,1,128,62,224,46,19,2,32,108,105,32,119,2,98,101,102,-2,111,114,101,255,106,17,64,36,2,46,92,49,255,105,2,192,208,97,179,-224,10,8,224,113,19,2,73,110,32,127,39,224,74,0,226,46,3,157,21,-224,66,23,2,32,97,116,128,183,225,47,163,225,52,2,226,5,193,35,55,-171,217,96,1,2,80,32,73,139,242,195,142,168,75,236,247,0,232,91,3,-201,65,224,219,8,232,128,4,224,14,0,142,62,76,37,177,28,76,58,72,-251,111,71,227,248,0,79,156,108,84,113,83,2,53,56,55,231,141,4,75,-39,103,222,184,55,2,48,48,32,68,234,124,3,2,48,50,32,236,216,1,-109,125,236,145,3,237,18,31,96,173,32,140,2,53,54,55,228,45,4,217,-88,32,194,139,77,80,29,2,75,52,32,240,127,6,96,32,137,37,32,32,-224,30,1,224,32,5,137,52,96,32,96,35,128,27,32,24,137,54,32,24,-2,51,32,90,224,59,11,64,35,201,52,64,1,41,1,227,179,1,134,230,-238,152,3,141,74,159,94,224,67,0,208,244,230,124,6,230,100,1,198,103,-230,181,3,134,135,224,35,4,224,41,3,242,128,5,62,46,229,113,22,2,-95,95,70,2,73,76,69,2,95,95,34,227,95,2,224,91,65,2,76,73,-78,224,91,21,166,204,224,91,43,2,68,65,84,224,91,80,2,84,73,77,-224,91,6,232,36,1,170,227,202,51,255,197,2,138,238,94,9,154,93,200,-62,114,42,35,65,232,194,1,234,169,6,160,2,246,106,2,224,2,6,96,-112,224,199,7,224,49,2,224,157,15,224,85,0,224,14,3,207,222,196,94,-230,119,9,224,179,12,235,16,17,224,18,2,239,229,4,145,130,64,3,224,-24,3,230,156,0,232,224,1,100,11,150,62,192,5,153,70,225,40,1,35,-61,192,48,73,113,192,195,49,126,2,55,32,67,65,204,68,192,123,193,207,-216,105,67,253,133,2,245,175,5,192,175,224,22,65,225,178,13,235,18,0,-137,49,2,53,56,57,226,25,20,246,110,7,141,125,226,220,7,128,91,228,-20,0,119,46,246,101,4,226,249,11,227,20,0,206,171,97,51,133,113,96,-128,36,175,64,7,2,95,52,53,235,46,5,237,215,3,97,208,247,162,8,-243,156,1,96,15,2,52,55,48,192,16,230,92,7,230,77,8,226,52,15,-226,58,3,224,233,2,226,60,1,235,30,5,226,64,16,227,106,4,98,68,-224,56,1,110,253,171,165,2,52,53,56,226,47,10,227,8,13,103,74,247,-135,55,2,76,97,110,2,103,117,97,2,103,101,47,2,80,114,101,43,253,-2,99,101,115,2,115,111,114,2,47,67,112,32,34,2,47,77,97,2,99,-114,111,2,80,97,115,247,167,0,2,49,53,50,2,58,50,50,237,228,1,-246,90,6,54,158,128,9,72,149,198,114,2,95,53,57,33,134,2,53,57,-49,235,96,7,2,37,72,58,2,37,77,58,2,37,83,92,235,104,0,32,-37,180,132,226,151,21,224,114,49,2,100,32,37,2,98,32,37,2,89,92,-51,224,114,37,192,23,32,122,96,25,64,130,232,223,1,32,67,250,112,1,-224,46,20,63,92,37,228,159,242,2,53,57,55,224,52,12,224,123,2,227,-204,2,98,35,245,219,0,64,34,230,50,2,245,154,3,240,85,6,240,169,-34,224,39,12,226,249,0,224,137,9,224,141,32,224,221,14,224,164,3,132,-57,235,31,0,224,234,34,224,137,59,206,115,233,89,1,233,101,4,250,24,-0,246,109,1,249,121,0,193,226,128,85,128,16,206,142,242,102,7,132,206,-33,248,64,119,246,109,0,248,91,0,128,148,2,57,57,32,106,173,161,33,-2,95,53,51,32,22,129,118,39,207,34,221,145,172,169,250,147,12,211,243,-194,254,2,50,55,48,235,174,0,248,146,0,244,219,0,105,252,32,61,96,-106,235,233,2,59,213,2,52,52,57,228,77,2,76,30,2,98,114,101,2,-97,107,115,2,44,32,97,2,116,32,92,228,92,69,2,72,97,115,2,104,-68,101,2,102,105,110,2,101,46,104,132,93,2,50,53,58,2,54,34,32,-64,217,224,138,130,108,127,2,75,32,65,101,149,2,50,32,65,76,180,97,-193,252,108,0,148,132,99,206,252,180,0,192,19,140,220,228,175,1,2,53,-57,51,98,34,66,172,225,154,4,98,189,2,57,52,32,141,167,53,68,34,-50,68,84,34,38,65,228,128,77,140,103,2,73,32,58,96,41,64,88,2,-53,57,50,64,13,140,62,2,94,71,69,2,84,84,73,2,77,69,77,2,-73,76,76,96,36,140,60,114,12,225,74,1,2,100,101,102,2,97,117,108,-2,116,84,105,2,109,101,76,2,111,99,97,2,108,101,34,128,210,140,69,-32,226,230,221,0,228,227,3,67,74,88,53,192,216,130,120,150,66,214,192,-173,88,195,147,221,164,228,85,4,234,19,5,36,93,33,47,33,7,192,40,-236,98,3,248,85,4,227,213,5,2,52,48,32,163,213,224,57,2,224,132,-6,224,112,1,224,9,8,2,39,32,89,228,196,3,173,53,242,97,3,192,-7,246,66,4,224,5,3,246,78,27,244,150,7,229,85,3,235,14,3,172,-35,137,17,41,105,237,222,1,233,88,1,124,32,225,17,19,33,190,234,100,-10,191,30,225,146,1,245,231,0,143,11,131,108,238,7,12,233,204,3,225,-3,51,234,16,4,198,120,230,103,10,234,41,12,225,23,14,234,100,5,225,-29,26,32,161,225,29,2,224,126,4,96,231,233,137,0,64,184,251,58,0,-225,28,1,235,11,3,226,215,2,237,66,24,230,209,0,231,142,6,239,72,-9,245,51,11,96,214,234,41,0,235,50,2,148,255,2,95,53,52,188,222,-252,103,1,239,47,13,235,207,6,238,122,15,227,89,4,231,50,5,224,85,-10,225,214,3,226,151,31,192,199,100,228,210,15,246,229,6,245,215,1,2,-49,50,52,245,216,5,224,54,3,224,53,16,246,13,7,224,52,3,38,88,-225,187,2,158,138,129,237,160,6,135,93,224,38,2,64,16,252,24,1,127,-116,163,58,92,190,82,68,32,33,96,53,226,198,1,226,186,17,226,172,3,-251,117,2,226,105,1,2,58,53,56,218,204,231,211,37,96,147,32,61,134,-153,127,253,103,210,128,214,2,67,32,79,229,187,0,76,243,192,96,184,30,-175,15,237,63,1,240,71,3,133,225,252,44,0,2,53,55,56,96,5,124,-9,2,53,56,48,128,6,183,161,237,25,1,184,207,32,252,243,51,8,251,-217,3,230,108,1,64,177,244,210,19,2,35,105,110,2,99,108,117,2,100,-101,32,235,188,1,212,210,247,195,17,244,219,3,224,92,20,117,47,2,49,-32,92,224,91,1,224,152,0,2,51,53,50,224,87,20,64,254,189,91,225,-153,1,52,94,62,154,32,14,2,53,56,52,64,160,97,46,66,60,52,44,-32,19,32,4,254,179,17,2,92,57,50,2,38,47,34,128,94,161,97,65,-182,245,40,5,162,133,161,186,149,5,98,156,128,104,78,75,2,50,50,48,-190,43,64,30,32,65,136,63,32,151,2,51,32,75,33,152,196,110,228,108,-7,224,11,0,32,124,196,96,32,61,136,114,227,245,3,231,176,6,224,61,-6,192,8,189,220,96,75,244,228,0,128,144,244,221,0,2,52,32,65,128,-17,136,133,180,239,194,176,136,108,104,41,235,150,1,2,58,53,55,227,41,-2,231,224,4,132,166,136,6,232,123,6,251,56,7,255,215,2,118,33,96,-239,246,43,1,99,217,34,154,65,175,134,20,225,112,2,99,19,67,227,32,-45,35,83,227,140,0,2,52,54,53,150,245,75,103,32,13,130,16,48,27,-32,52,32,181,202,59,118,45,161,11,96,206,183,120,81,18,73,106,129,231,-107,255,214,179,32,67,32,13,2,85,32,67,248,4,0,226,210,7,37,114,-87,103,229,114,1,32,155,32,75,32,93,170,138,2,53,55,52,43,92,106,-140,96,209,32,25,130,22,251,40,0,231,212,17,133,79,129,60,134,210,132,-35,32,164,64,241,97,54,209,127,108,187,96,13,229,198,2,128,35,44,249,-202,221,163,55,2,53,51,52,96,137,226,98,5,137,149,231,93,17,242,83,-7,71,201,225,147,0,64,201,228,180,0,102,114,202,169,35,23,87,235,2,-50,54,49,161,88,210,37,171,134,2,50,52,56,32,8,184,225,228,50,17,-2,85,110,109,2,97,116,99,2,104,101,100,2,32,35,105,2,102,58,32,-2,112,111,115,2,105,116,105,2,111,110,115,2,32,111,102,2,32,111,112,-2,101,110,32,2,99,111,110,2,116,101,120,2,116,32,97,2,114,101,58,-228,48,1,67,163,120,113,100,9,107,97,2,50,54,52,249,25,0,164,64,-232,130,1,238,145,3,244,69,14,128,250,69,104,224,61,8,244,66,41,231,-232,4,240,40,0,243,211,4,253,2,0,232,5,7,212,1,224,69,9,224,-72,0,224,184,7,96,75,244,117,15,199,226,200,95,101,50,186,124,246,194,-21,224,136,0,224,31,15,233,26,1,98,207,247,171,3,224,8,2,224,36,-1,224,71,16,247,224,5,224,113,20,241,124,6,224,45,31,224,93,5,192,-175,224,128,7,224,224,18,224,191,27,224,56,17,237,87,1,224,5,12,225,-61,7,224,60,6,225,211,8,234,137,29,238,174,4,39,154,253,118,7,224,-152,5,224,201,3,225,196,6,225,202,11,224,152,61,2,117,110,100,2,101,-102,34,224,151,26,225,103,6,225,69,7,224,151,71,2,105,102,110,224,152,-143,224,151,15,227,123,3,224,151,12,192,11,227,213,0,224,145,25,224,190,-7,224,187,55,224,184,11,226,128,27,226,125,13,224,141,53,2,101,108,115,-227,17,12,224,143,113,225,31,13,172,69,121,26,207,5,249,191,4,224,5,-27,245,117,2,240,114,1,224,139,18,2,110,100,105,224,140,0,201,223,231,-236,67,96,96,84,132,184,64,231,194,4,231,130,14,225,160,120,225,20,3,-224,144,123,2,112,114,97,2,103,109,97,224,145,11,243,129,0,226,50,8,-254,83,5,143,90,224,22,3,192,146,104,153,224,11,10,241,122,9,232,219,-7,254,79,6,222,166,232,124,4,241,113,0,196,100,239,210,2,87,163,187,-240,108,51,228,231,13,253,59,11,230,172,7,228,233,3,228,221,12,225,147,-10,228,221,50,143,89,225,142,9,242,84,13,224,159,5,224,156,28,224,153,-47,2,119,97,114,2,110,105,110,2,103,34,32,224,152,9,232,196,34,227,-54,48,2,114,114,111,2,114,34,32,225,197,18,255,102,7,243,105,8,233,-243,11,225,208,14,228,220,26,80,165,224,143,7,224,214,8,177,186,132,246,-94,242,2,54,48,32,229,148,12,227,91,3,255,72,2,227,89,0,224,8,-9,154,164,238,2,5,140,12,34,247,47,141,32,112,82,28,2,50,54,57,-207,93,111,86,128,21,111,14,208,165,133,142,118,145,2,95,50,56,165,42,-224,27,2,144,52,245,235,9,245,93,6,227,47,5,224,38,13,224,19,10,-224,16,7,224,13,0,110,180,131,226,243,29,3,109,181,113,200,2,50,56,-56,33,4,2,49,57,32,255,130,1,227,233,2,226,26,34,237,63,9,228,-162,1,224,22,10,225,98,3,225,211,0,64,149,238,203,2,225,225,20,231,-82,4,231,8,3,193,167,252,208,1,2,50,52,51,64,88,79,186,2,51,-50,48,228,167,0,231,43,5,231,45,19,2,87,97,114,67,181,2,58,32,-117,2,110,107,110,2,111,119,110,2,32,100,105,2,114,101,99,2,116,105,-118,2,101,32,35,162,190,150,52,116,41,224,73,19,79,55,2,105,110,32,-231,106,11,232,100,16,246,21,0,130,172,226,84,11,226,56,9,129,246,32,-239,96,246,225,210,5,227,46,255,227,46,24,243,75,2,81,102,227,48,9,-119,11,50,221,248,182,1,225,106,3,128,207,183,102,226,30,59,231,87,2,-160,240,182,149,250,197,0,226,224,4,231,205,27,249,208,0,194,101,163,81,-227,78,1,227,42,9,226,233,60,232,110,35,232,71,7,233,24,23,247,252,-6,226,41,1,226,228,0,245,209,5,161,250,2,51,53,53,160,144,52,228,-34,133,34,139,160,132,225,86,0,224,98,0,33,247,226,56,1,225,57,3,-115,166,32,16,224,193,1,251,212,1,149,79,247,183,27,225,54,3,2,49,-52,49,64,39,233,168,5,247,205,0,181,142,224,92,2,117,174,163,249,225,-110,24,2,50,54,32,225,110,4,225,150,21,115,236,64,93,226,242,2,225,-200,22,2,52,54,54,117,104,192,106,224,49,35,128,16,235,215,1,229,250,-4,225,206,4,225,238,3,193,146,53,133,72,119,225,196,0,247,28,5,155,-97,224,119,2,197,197,226,109,1,224,41,15,193,255,85,251,235,63,3,224,-59,35,131,85,70,236,224,70,6,228,156,0,253,198,0,248,11,3,137,8,-160,86,32,54,101,83,225,197,13,228,212,2,197,10,252,98,6,224,28,4,-224,15,5,224,64,3,118,109,243,113,6,183,198,228,63,1,64,18,69,230,-196,148,228,33,0,226,237,9,247,210,5,70,84,2,53,49,32,253,101,6,-37,94,96,31,166,53,214,76,224,230,5,76,241,136,42,33,250,188,250,251,-153,5,134,160,70,76,96,136,226,89,7,253,3,0,194,215,192,17,224,91,-5,98,235,249,47,0,224,116,24,224,58,17,245,99,12,252,154,0,228,160,-6,162,70,228,213,4,237,98,6,167,142,165,32,193,216,223,85,226,136,1,-167,157,2,53,54,57,229,208,0,2,53,55,48,198,150,2,51,56,56,226,-165,1,224,203,6,231,177,13,2,53,55,49,237,46,10,251,63,16,226,84,-1,227,128,0,231,105,1,121,100,228,170,1,32,107,222,239,249,173,13,64,-32,72,78,2,52,49,55,255,167,0,110,202,63,30,236,23,0,225,130,1,-64,252,72,95,196,6,223,7,39,199,128,45,246,110,12,193,91,37,69,224,-233,1,226,234,1,231,48,12,233,156,16,225,17,6,230,139,22,223,77,200,-135,226,238,1,229,210,1,248,81,9,160,135,203,132,239,153,18,238,81,9,-237,184,9,248,195,3,248,196,66,224,156,5,229,204,7,225,125,4,224,122,-9,228,195,4,248,80,16,239,221,12,245,252,4,239,53,9,65,236,2,50,-49,54,224,209,1,110,175,246,129,13,224,43,26,96,39,224,30,17,246,51,-9,228,0,2,237,99,7,239,120,5,250,113,11,227,3,0,224,105,7,244,-195,6,225,21,6,224,78,42,245,162,4,224,173,5,224,77,1,251,61,4,-224,74,15,243,188,5,128,46,99,45,101,160,235,144,4,243,41,1,142,181,-126,157,206,29,224,57,2,125,236,128,34,157,40,253,244,1,36,23,229,124,-0,97,103,128,101,96,34,221,199,128,34,200,213,232,229,10,245,105,109,224,-224,3,113,79,225,110,0,229,213,1,224,234,11,225,12,24,161,104,196,90,-231,24,0,227,190,3,234,212,6,233,119,39,101,7,234,42,6,228,239,7,-232,203,0,195,214,194,72,254,255,2,201,1,224,240,19,230,226,1,137,81,-224,223,7,226,153,3,133,150,229,57,3,226,15,0,198,120,192,85,232,12,-12,231,243,13,238,141,10,245,246,5,226,190,1,231,185,2,231,137,38,231,-109,29,230,79,9,231,107,85,231,73,0,231,74,10,231,71,11,231,70,5,-161,30,241,170,0,71,58,225,0,27,224,239,19,231,63,5,231,56,3,129,-213,2,56,57,32,238,167,2,2,51,52,38,2,99,112,112,2,104,115,115,-2,114,99,47,2,109,97,108,2,99,111,108,2,109,45,119,2,97,108,108,-2,97,99,101,2,45,117,110,49,227,2,114,115,101,2,47,99,112,32,33,-2,45,49,46,2,50,48,46,2,57,47,76,2,97,110,103,2,117,97,103,-2,101,47,80,2,114,101,112,2,114,111,99,2,101,115,115,2,111,114,47,-2,67,112,112,2,104,115,47,32,5,2,73,102,100,2,101,102,46,2,104,-115,92,32,89,2,44,54,56,2,58,53,34,96,124,2,58,53,55,32,145,-2,10,65,32,108,0,215,158,235,212,0,131,177,33,76,64,170,226,140,3,-194,142,32,63,32,14,32,63,2,80,32,95,100,34,99,230,111,244,231,135,-2,97,151,139,128,66,188,201,170,160,15,2,35,57,50,164,58,64,12,96,-43,233,204,0,32,95,32,8,96,159,239,63,4,33,147,130,160,64,54,164,-163,65,69,107,223,32,52,32,28,32,52,2,85,32,90,224,1,8,225,183,-3,2,58,53,54,35,159,96,93,99,0,65,225,2,52,52,52,2,32,64,-73,197,156,212,155,72,121,64,192,66,59,2,53,54,51,64,116,78,231,139,-252,32,17,69,34,2,53,54,53,129,59,2,79,32,64,67,210,32,16,76,-39,240,143,23,2,35,100,101,95,124,165,127,208,198,44,111,65,9,160,173,-96,6,97,155,132,140,128,171,128,204,64,3,98,156,96,180,226,74,12,97,-244,2,48,58,48,193,243,77,19,32,245,32,160,2,54,32,102,250,46,2,-2,101,68,101,64,138,2,100,34,32,96,37,32,189,32,37,71,51,146,105,-65,186,2,51,53,50,65,208,196,143,138,185,32,43,32,178,97,112,2,75,-50,32,2,75,52,32,225,106,5,32,30,33,25,128,30,2,51,32,75,128,-30,160,28,32,27,33,59,161,130,133,10,230,107,1,227,87,1,168,122,233,-191,17,233,220,21,224,29,13,233,129,3,224,33,16,248,229,4,224,37,19,-249,14,5,224,41,22,249,59,6,224,45,25,250,135,7,224,49,28,252,80,-8,239,107,13,247,79,11,251,28,4,244,239,11,224,103,19,224,40,19,250,-53,12,225,78,55,224,41,44,235,138,3,236,142,1,244,188,7,224,5,9,-236,9,0,250,100,11,2,89,32,64,251,16,21,224,32,2,224,172,14,230,-177,1,250,206,26,224,155,2,233,92,1,192,5,253,245,8,160,222,230,226,-1,253,248,15,226,17,8,236,170,17,128,132,2,67,32,60,36,23,237,111,-3,224,67,9,236,244,5,224,203,12,128,70,211,147,224,37,8,148,224,236,-131,5,236,51,2,238,96,18,238,110,10,230,162,9,200,9,2,85,32,95,-2,53,51,57,209,121,114,24,232,37,1,234,133,11,240,243,0,69,245,73,-140,235,47,2,225,50,9,224,197,0,224,25,4,2,82,32,64,244,17,1,-225,123,10,225,247,11,224,195,5,2,52,50,32,233,146,11,193,187,239,45,-23,2,52,55,32,240,85,4,235,110,12,160,234,150,77,230,215,16,2,32,-32,34,225,194,1,225,19,11,225,151,7,235,81,1,65,123,54,91,204,223,-202,237,253,141,23,238,74,17,254,44,9,226,104,1,251,208,2,240,77,13,-2,67,32,61,2,61,32,64,224,39,15,193,200,225,178,8,229,61,0,224,-81,1,252,118,0,226,132,5,194,169,235,57,4,245,102,0,116,232,225,4,-4,192,106,240,168,8,192,36,64,61,76,78,41,33,163,70,226,147,12,228,-163,20,226,166,7,224,43,21,194,184,239,185,10,225,151,9,241,68,11,226,-206,14,235,205,1,241,116,7,253,192,12,242,2,25,250,86,14,227,193,5,-233,246,2,162,140,173,91,136,238,225,66,6,229,80,11,224,239,47,227,127,-2,224,239,27,194,102,227,196,6,227,46,2,236,212,7,226,149,0,228,199,-30,32,234,227,210,14,244,121,10,224,248,120,224,68,2,224,248,54,69,250,-224,248,17,233,55,19,224,199,3,238,82,11,241,41,1,252,68,7,224,73,-16,224,70,27,232,181,2,224,65,7,224,62,4,224,53,2,228,104,6,229,-123,2,99,117,228,116,9,230,16,15,227,61,6,224,88,5,247,238,2,36,-77,79,0,66,159,32,5,111,6,2,67,32,79,247,210,4,224,100,71,99,-250,224,100,5,212,214,224,100,26,225,57,2,235,52,1,230,253,2,224,88,-5,229,100,17,234,126,9,225,172,0,251,247,2,234,88,1,247,138,7,155,-212,126,10,64,123,192,96,237,65,0,237,36,16,192,64,161,30,166,77,251,-54,8,223,180,232,238,0,165,119,224,96,0,240,155,85,2,84,111,107,2,-101,110,105,2,115,101,46,176,155,2,50,49,53,2,58,49,51,245,137,7,-235,67,17,230,149,15,235,103,4,236,21,16,235,107,12,224,83,14,235,110,-39,235,111,10,235,114,74,244,199,1,247,79,11,235,189,255,235,189,255,235,-189,115,226,80,48,151,201,226,80,21,224,86,6,235,126,8,252,63,3,232,-74,23,2,49,50,51,225,138,10,2,83,32,80,225,138,31,227,72,1,246,-11,10,107,215,216,60,2,53,52,54,247,229,14,225,156,15,2,45,123,34,-228,217,7,224,251,13,251,67,6,233,142,13,194,130,116,192,247,110,6,235,-126,2,226,145,22,233,145,14,225,6,7,225,69,37,64,141,226,209,63,2,-125,45,34,226,209,21,226,211,3,234,45,0,229,69,13,227,201,26,224,248,-11,227,201,33,224,248,3,226,63,31,252,53,7,225,11,31,243,127,2,243,-1,1,250,225,3,104,47,129,93,96,107,234,26,7,229,229,80,188,45,229,-229,12,234,188,17,101,4,224,161,5,229,246,46,224,222,15,255,24,2,240,-115,18,231,104,21,224,101,3,239,206,4,240,68,6,229,29,28,225,138,2,-225,136,24,226,220,2,231,225,10,226,223,31,121,175,226,223,17,246,73,8,-255,213,13,192,195,251,193,4,224,90,10,201,162,129,34,155,71,224,50,2,-227,39,22,122,138,2,53,52,56,220,205,130,24,250,119,2,227,103,26,224,-63,0,224,54,2,224,65,8,225,80,10,253,13,6,255,39,2,224,194,10,-227,136,36,98,184,226,230,25,255,21,5,130,238,128,39,224,60,6,229,18,-21,242,234,217,242,236,9,224,46,18,242,239,5,228,30,9,242,242,214,245,-79,12,231,36,104,224,62,2,229,224,30,38,26,233,69,2,231,4,4,224,-213,65,234,58,13,224,214,83,2,54,32,35,65,173,234,32,17,242,139,12,-244,167,226,243,65,9,244,171,225,240,247,7,232,174,16,228,239,13,166,174,-228,92,4,237,140,2,236,3,7,227,49,44,111,169,227,48,49,224,62,2,-233,232,33,225,48,1,2,39,39,34,224,207,91,2,83,32,83,226,99,10,-2,66,32,90,229,213,15,224,230,7,232,104,3,224,231,30,2,56,32,35,-96,139,2,79,32,35,64,7,244,169,0,225,184,104,135,194,237,246,11,224,-199,0,225,211,16,245,176,67,2,66,32,79,161,18,117,186,225,23,9,245,-195,30,227,70,60,224,226,2,224,95,24,248,86,2,244,83,13,248,89,11,-172,88,248,167,255,248,167,166,249,12,200,229,156,33,227,151,9,228,240,34,-70,157,64,64,32,7,228,240,6,249,136,255,249,136,32,2,57,52,58,2,-49,49,34,225,68,0,236,21,5,228,234,11,249,113,1,237,57,15,249,100,-4,249,101,15,249,136,21,129,44,249,220,4,237,169,17,250,3,5,250,4,-19,228,223,1,224,162,26,225,201,2,249,254,3,250,10,19,235,131,27,245,-183,12,230,9,17,224,156,14,242,104,4,243,166,4,230,18,5,250,43,12,-251,5,26,250,124,16,242,203,7,245,165,4,224,106,19,224,97,20,234,110,-3,239,105,10,100,122,2,67,32,61,2,61,32,64,224,42,18,249,180,15,-243,14,3,240,217,9,240,215,6,240,213,8,249,202,96,2,39,32,80,246,-178,21,242,106,6,178,198,245,195,18,249,156,9,225,240,15,241,23,3,226,-59,2,252,182,2,245,210,11,234,210,9,248,130,1,224,102,8,229,47,0,-224,28,11,235,33,0,237,157,10,98,104,232,93,0,245,164,10,230,173,0,-235,76,17,228,21,10,225,247,8,193,68,202,194,162,43,231,105,1,133,209,-241,64,3,65,193,225,172,0,184,156,229,210,2,229,211,1,247,40,15,226,-139,64,245,172,22,248,140,24,242,145,1,228,194,0,209,78,224,224,19,246,-7,6,253,207,55,161,80,253,207,3,234,4,1,246,252,255,246,252,241,231,-93,1,96,42,229,46,9,246,97,13,228,250,13,228,60,1,167,164,227,139,-13,249,148,8,249,171,26,247,92,14,226,174,12,240,31,8,224,134,4,227,-65,11,247,117,60,230,114,21,247,77,30,247,79,10,243,134,13,232,139,15,-233,65,3,225,145,10,233,54,21,227,141,16,231,209,50,231,146,1,231,209,-44,225,94,13,181,187,253,166,2,230,21,13,232,37,23,255,94,43,232,100,-14,133,214,254,53,9,245,86,9,253,3,3,232,14,1,199,16,232,21,14,-232,18,13,232,15,17,231,242,12,138,85,231,248,10,226,39,5,231,249,38,-230,162,5,231,225,2,231,246,3,227,236,6,225,92,1,128,148,249,66,13,-128,56,99,100,225,91,2,46,166,70,230,225,241,2,232,20,4,235,22,9,-241,182,5,232,226,2,226,226,19,129,37,232,55,130,228,82,3,225,22,29,-224,241,10,228,48,3,227,212,8,231,115,17,232,102,16,231,183,38,247,16,-14,246,171,34,225,19,40,241,18,6,224,63,41,241,17,9,226,186,5,224,-182,3,224,202,0,98,61,192,212,230,37,0,224,16,0,2,53,52,57,241,-71,1,99,117,2,95,53,54,189,154,32,30,253,150,0,245,92,21,225,50,-5,238,45,10,228,14,0,241,190,5,239,138,6,224,5,1,244,113,0,226,-184,13,242,203,5,231,32,20,244,23,35,227,189,2,254,49,17,245,226,25,-245,224,11,245,69,5,239,185,12,237,93,2,224,61,20,211,243,245,130,78,-229,33,12,229,30,4,244,158,33,224,76,71,234,34,22,160,217,128,204,224,-60,6,242,63,16,224,246,10,244,67,2,172,189,128,98,237,242,14,230,241,-7,238,142,25,244,70,11,242,221,14,233,27,11,128,44,244,100,126,2,49,-55,49,2,58,49,50,232,90,4,108,182,229,101,1,2,50,50,50,232,146,-4,96,166,196,140,196,98,2,73,32,64,96,56,165,110,224,51,20,100,183,-37,13,228,158,0,2,95,49,55,64,7,32,114,2,95,50,49,32,18,2,-95,50,57,98,1,32,70,2,48,32,95,140,165,225,16,1,2,95,96,34,-128,173,224,47,3,32,34,224,47,15,2,39,95,96,160,48,224,33,15,2,-40,41,44,2,91,93,59,2,123,125,34,175,75,224,37,13,2,32,92,57,-2,38,34,32,224,33,19,2,58,33,35,2,36,37,38,2,42,43,46,2,-47,60,61,2,62,63,64,2,92,57,50,2,38,94,124,2,45,126,34,160,-52,193,28,230,250,2,83,58,224,20,4,68,214,143,96,128,11,231,34,0,-2,58,53,54,32,15,2,10,65,32,130,244,199,100,231,41,1,244,90,0,-2,95,54,32,226,112,0,35,100,2,49,56,48,246,231,6,224,30,1,225,-231,20,224,215,1,2,108,105,110,2,101,34,32,230,2,18,224,71,30,2,-112,114,97,2,103,109,97,224,73,0,232,80,0,128,208,224,68,30,2,100,-101,102,224,142,1,132,83,193,67,224,52,17,2,117,110,100,2,101,102,34,-162,108,129,16,135,80,2,56,49,32,32,18,2,54,32,80,64,11,227,118,-82,2,72,97,115,2,104,68,101,64,185,195,120,2,56,56,58,2,53,34,-32,99,248,69,56,2,53,48,32,2,64,35,48,234,125,10,160,163,242,242,-4,2,95,50,51,40,94,2,53,53,51,64,238,2,55,57,32,244,27,1,-97,252,225,249,0,224,208,101,2,57,58,53,227,153,1,230,216,2,232,0,-5,233,159,13,225,186,7,41,48,70,28,229,176,1,238,170,0,130,222,225,-10,0,120,97,236,122,2,64,7,76,47,136,255,103,22,129,69,45,235,226,-26,12,2,105,110,99,2,111,109,112,2,108,101,116,2,101,32,109,2,97,-99,114,2,111,32,100,64,213,2,105,116,105,2,111,110,58,2,92,49,48,-163,242,224,68,22,2,32,32,35,130,151,205,164,64,220,96,46,100,245,224,-54,5,224,219,4,37,4,96,23,224,28,3,234,41,8,253,252,6,241,217,-6,227,58,22,224,81,9,235,199,8,227,202,31,64,74,34,140,224,74,0,-226,144,1,161,148,64,65,240,206,6,228,47,9,228,169,0,161,38,2,53,-53,50,230,12,2,244,36,0,2,95,56,52,224,16,0,160,96,237,208,0,-102,110,232,48,0,163,13,70,9,195,13,163,59,160,25,111,83,64,25,32,-11,156,176,192,31,43,44,2,95,52,49,128,92,132,76,232,46,0,65,185,-33,183,96,151,128,8,2,57,32,95,2,50,54,55,64,9,96,68,235,94,-5,128,147,64,40,2,56,56,32,96,7,2,52,49,55,229,222,5,197,204,-32,56,243,56,2,131,224,97,7,41,54,226,101,19,2,35,112,114,229,64,-1,224,68,2,224,67,4,32,103,224,67,20,229,204,1,224,65,2,64,187,-96,191,219,180,230,62,1,169,157,227,210,12,238,185,8,226,48,10,2,51,-53,32,234,81,8,196,11,236,114,3,236,8,2,234,229,2,32,200,65,208,-199,113,96,95,224,33,1,130,103,74,73,2,53,57,32,235,95,10,254,84,-5,224,167,18,225,31,2,2,35,34,32,192,171,254,165,8,228,209,19,242,-35,7,224,98,28,192,59,176,226,229,226,1,141,16,225,6,8,160,245,64,-12,226,138,6,224,12,2,236,164,4,224,53,0,245,252,2,225,74,4,225,-73,7,2,54,48,32,225,97,12,238,52,5,2,89,32,66,32,91,227,43,-1,229,207,2,224,138,6,40,184,32,65,40,184,106,224,32,13,32,47,32,-13,2,75,32,75,96,13,32,109,96,13,2,65,32,64,2,58,53,53,32,-215,32,13,33,206,33,64,67,254,224,4,1,32,28,32,81,64,28,2,50,-51,51,32,47,73,57,2,67,32,80,32,9,2,95,52,52,230,231,3,38,-170,70,210,2,109,101,110,2,116,44,32,2,97,116,32,230,247,88,2,50,-53,58,2,54,34,32,64,234,224,139,131,2,64,75,50,224,141,131,2,90,-32,66,67,76,97,217,96,157,35,22,224,157,129,66,93,38,35,226,93,12,-101,81,65,218,101,158,64,9,201,174,96,12,218,19,192,216,96,18,141,229,-224,26,1,229,237,0,32,103,36,10,99,12,120,91,224,4,1,151,174,32,-31,32,100,32,31,224,29,6,224,34,5,32,144,227,8,26,69,232,2,98,-114,101,2,97,107,115,227,7,120,224,138,113,34,120,193,172,97,67,193,167,-217,219,225,156,0,33,86,141,95,249,247,2,224,10,30,251,183,4,214,171,-32,79,132,246,192,44,224,7,11,224,70,2,224,59,2,32,58,133,35,225,-255,3,224,60,5,128,41,32,40,133,62,2,90,32,90,121,239,2,58,53,-52,133,65,71,186,2,35,50,32,93,163,64,20,133,57,32,18,32,226,39,-230,32,17,130,237,96,38,66,222,128,38,130,154,66,234,72,173,32,16,130,-139,162,171,160,96,130,124,224,144,11,32,28,225,66,1,32,88,97,104,32,-24,32,23,129,10,32,19,32,81,128,128,128,225,32,17,32,193,128,17,128,-202,32,17,32,134,96,17,85,113,78,240,106,83,238,231,1,202,60,72,237,-2,51,54,32,2,64,95,52,70,206,2,52,50,54,66,117,245,31,1,170,-131,129,41,144,97,32,82,129,9,239,59,0,224,65,15,32,62,73,189,64,-118,74,121,103,51,70,213,135,51,32,27,134,221,96,86,32,85,193,77,201,-59,238,215,4,158,5,96,8,153,60,32,116,214,178,245,115,7,177,6,248,-87,5,236,223,0,66,174,42,131,2,55,51,32,224,60,11,246,54,2,64,-182,64,234,200,82,128,230,72,251,37,118,2,56,50,32,244,109,4,96,86,-73,165,224,20,4,160,89,192,70,224,44,2,165,200,192,49,64,255,130,56,-226,19,3,194,206,32,28,228,208,2,98,102,64,252,160,45,107,86,2,50,-51,32,72,191,98,45,193,56,225,125,7,233,81,1,225,125,1,96,37,73,-8,225,255,9,64,101,194,138,209,47,2,95,51,53,96,44,138,243,201,173,-116,184,238,43,32,2,67,97,110,2,110,111,116,2,32,101,120,2,112,97,-110,2,100,32,35,2,105,102,32,2,100,105,114,2,101,99,116,36,177,2,-32,105,110,2,32,102,105,2,108,101,32,238,0,2,206,2,2,95,49,51,-2,51,32,95,2,50,54,52,96,190,224,93,16,110,110,2,32,32,32,251,-232,2,224,166,1,32,75,73,180,96,66,97,238,97,153,64,183,35,116,33,-26,65,197,2,50,49,56,225,82,3,201,130,128,222,36,4,33,2,240,249,-1,224,133,15,2,87,97,114,2,110,105,110,2,103,58,32,2,116,114,97,-2,105,108,105,2,110,103,32,2,99,104,97,2,114,97,99,2,116,101,114,-2,115,32,97,2,102,116,101,2,114,32,35,2,105,102,34,239,21,28,143,-80,97,46,2,115,105,111,2,110,32,105,225,35,57,253,5,4,113,250,65,-215,34,142,101,227,225,214,52,2,112,97,114,2,115,101,32,225,213,90,227,-184,3,225,213,24,64,20,171,240,225,222,11,32,249,250,118,2,225,229,108,-225,45,68,225,223,4,35,247,193,29,163,213,134,72,225,5,1,64,8,33,-0,143,95,224,81,12,2,47,47,34,206,237,79,191,129,53,32,73,134,128,-38,37,33,48,2,54,57,32,33,72,2,50,57,32,150,163,192,17,2,51,-55,54,65,144,88,164,33,165,160,19,2,56,51,32,36,119,2,50,32,102,-224,97,0,2,124,124,34,128,97,33,187,2,95,52,48,65,129,2,57,54,-32,96,15,32,43,162,153,193,70,64,35,64,213,96,77,96,150,2,49,53,-32,150,198,128,151,135,6,224,151,4,130,18,224,151,40,2,38,38,34,224,-151,19,64,238,224,151,23,142,118,64,151,64,45,64,151,2,51,54,48,192,-123,224,10,13,224,145,9,80,4,33,171,178,239,224,198,2,224,150,6,96,-232,96,233,224,135,0,129,229,224,54,5,2,53,50,54,225,15,6,2,53,-50,55,227,227,0,224,38,5,241,232,0,224,218,3,139,71,224,83,9,247,-140,1,2,52,57,52,112,41,33,1,2,53,48,56,64,10,2,57,51,32,-181,157,224,74,1,32,9,96,98,224,17,3,73,106,96,37,2,52,49,51,-224,221,3,194,6,33,72,174,198,225,72,24,225,94,31,225,240,1,2,62,-61,34,224,162,7,2,50,57,53,64,195,131,66,225,155,13,79,158,193,155,-224,200,1,43,13,224,55,0,224,117,21,2,60,61,34,224,61,7,2,55,-48,32,224,60,20,64,117,245,1,1,224,55,1,101,201,224,116,28,2,61,-61,34,225,141,9,193,185,224,61,24,2,33,61,34,225,40,8,73,223,192,-61,33,165,174,14,225,121,2,226,45,3,32,38,101,172,224,29,0,226,144,-7,69,130,226,144,38,227,126,5,98,63,128,50,32,141,137,96,227,102,24,-75,127,225,84,8,2,56,55,32,130,197,225,139,16,75,231,226,1,9,74,-43,192,55,32,130,137,198,225,16,14,2,48,57,32,225,16,22,67,198,225,-16,8,166,247,225,16,35,64,50,32,141,175,2,228,130,34,74,26,226,112,-9,98,229,225,27,20,34,8,224,54,9,53,199,32,139,170,108,228,242,14,-224,56,11,2,49,49,57,224,56,1,32,198,138,164,32,22,2,52,32,80,-196,118,128,143,32,99,33,40,128,42,32,11,86,198,128,11,2,49,49,55,-224,11,2,36,95,192,35,34,254,68,168,67,239,96,17,109,67,64,9,107,-6,2,83,32,73,97,129,174,76,32,109,73,25,227,18,1,2,73,110,116,-2,101,103,101,2,114,58,32,2,100,105,118,2,105,115,105,41,172,2,98,-121,32,2,48,34,32,166,33,206,136,108,195,148,178,2,85,32,80,32,185,-2,57,48,32,32,4,148,234,123,75,224,17,8,198,98,238,46,3,216,41,-248,215,0,180,67,248,232,1,250,211,2,184,244,191,75,255,71,1,116,105,-197,178,104,88,251,64,1,213,58,32,51,33,61,66,124,32,6,172,54,150,-16,189,67,32,22,33,152,2,85,32,65,137,76,158,137,233,161,3,110,105,-64,5,160,71,184,38,154,99,136,219,2,85,32,75,248,237,2,33,126,66,-132,88,5,70,192,34,18,245,55,2,33,145,136,120,128,212,64,69,34,53,-126,195,71,97,32,30,135,255,253,229,0,186,227,214,97,238,80,6,64,63,-2,67,32,79,247,97,1,247,81,5,141,174,240,163,0,236,77,3,193,99,-160,98,118,23,98,157,2,49,57,54,253,91,1,207,69,96,28,34,219,224,-28,0,96,252,68,89,110,77,82,228,32,29,96,11,2,95,56,48,199,2,-142,168,185,38,130,13,2,58,53,49,208,161,143,200,254,202,4,174,197,207,-11,224,7,2,115,116,2,48,48,32,67,30,106,222,129,224,32,255,33,150,-65,250,160,6,193,158,96,26,79,106,64,21,32,59,2,52,56,53,96,59,-129,222,132,137,128,49,96,28,193,163,174,230,128,46,96,26,34,205,247,77,-1,65,69,226,147,0,188,121,239,174,5,243,247,1,66,8,2,48,51,32,-33,6,2,57,49,32,227,5,1,226,222,1,255,200,3,33,128,151,156,251,-80,0,2,53,49,53,224,95,3,160,163,128,220,160,12,65,18,128,37,64,-253,97,152,155,23,224,197,16,64,39,192,18,64,66,225,16,3,138,1,227,-188,0,204,120,73,23,108,150,34,206,98,15,240,66,0,98,225,113,228,99,-118,32,28,34,135,131,65,162,141,224,78,4,224,13,4,34,6,210,147,228,-135,6,2,108,97,115,2,116,58,32,2,91,93,34,196,17,112,53,82,224,-227,156,0,32,60,167,157,224,81,1,37,112,165,223,32,29,135,45,129,95,-133,23,120,107,64,250,32,23,99,235,32,13,240,134,1,70,110,196,121,227,-50,1,114,57,98,40,2,52,55,57,64,239,2,52,56,55,144,127,96,14,-32,65,133,189,242,154,1,32,138,32,84,128,93,133,119,224,27,7,128,135,-132,1,36,53,2,51,32,90,96,1,161,47,32,26,227,253,0,206,8,35,-98,2,51,54,55,128,160,132,179,98,60,250,229,0,162,65,250,223,6,109,-14,2,35,52,56,195,17,187,10,255,117,7,128,38,2,49,50,48,167,117,-2,95,51,49,70,116,167,16,194,126,224,50,10,224,89,0,154,185,224,89,-16,64,234,192,89,70,194,224,89,1,128,19,203,96,172,166,36,67,2,51,-57,57,227,27,0,2,82,32,95,235,120,1,84,225,129,39,2,58,53,48,-218,39,88,69,98,200,131,223,98,231,32,11,71,70,99,118,151,28,32,148,-2,55,53,32,170,89,164,64,32,6,140,116,192,13,65,99,103,50,64,143,-226,92,8,190,245,32,29,226,122,5,32,23,224,29,4,169,168,231,4,7,-32,25,169,63,72,165,135,231,2,52,57,57,224,147,2,132,218,71,194,2,-53,48,50,96,5,64,214,2,55,49,32,192,34,50,183,160,10,32,76,243,-66,2,141,33,128,65,32,25,162,147,165,45,32,16,246,133,1,160,42,192,-27,64,28,130,137,103,212,230,93,6,245,117,0,230,133,0,98,249,65,37,-236,229,0,168,12,223,53,138,223,68,91,96,38,129,169,230,206,1,229,62,-0,253,153,0,98,42,65,8,100,147,245,225,1,227,52,1,44,72,64,31,-97,169,2,52,57,55,131,126,2,57,56,32,2,64,58,52,66,39,252,71,-0,96,19,252,99,0,96,41,252,85,0,96,62,99,111,131,108,227,114,4,-32,163,96,126,97,154,108,63,65,124,2,52,57,51,96,56,225,102,9,96,-31,32,25,193,102,97,36,168,203,231,115,0,253,164,1,204,149,71,225,138,-9,67,27,39,23,136,175,128,126,129,161,66,221,229,48,4,32,25,168,42,-129,102,233,185,1,233,98,10,248,42,3,233,234,9,224,48,20,193,253,255,-48,3,233,144,0,232,47,3,101,16,224,237,15,102,97,197,34,102,95,79,-221,214,170,35,189,129,112,160,62,160,110,255,78,12,255,2,3,246,206,0,-151,198,224,117,21,224,115,5,224,113,5,224,51,18,209,6,233,163,1,100,-70,193,248,2,52,48,49,64,84,237,187,0,2,95,52,53,82,187,114,211,-2,50,48,53,116,129,103,9,128,86,50,161,32,4,34,81,202,139,66,59,-67,252,224,157,5,2,58,52,56,130,191,244,177,4,65,2,234,208,9,233,-224,1,193,189,248,97,2,97,69,137,165,233,193,5,201,135,131,74,70,81,-64,128,233,201,6,233,172,0,161,117,233,210,1,233,211,4,128,176,249,59,-3,167,92,226,221,2,133,12,64,6,99,33,65,94,163,84,69,128,68,83,-66,136,68,35,196,63,64,15,64,9,241,71,1,68,227,128,77,32,64,199,-197,200,239,133,215,32,24,131,174,98,229,129,220,136,35,226,210,4,128,113,-229,165,2,232,141,7,96,98,131,223,100,221,154,81,162,152,137,197,229,11,-0,194,181,235,130,10,162,80,192,86,194,40,170,47,131,79,128,8,165,21,-201,155,128,243,232,94,0,224,64,1,161,112,224,25,3,96,190,99,83,254,-72,0,237,64,1,224,174,12,224,124,7,229,148,1,224,127,22,224,101,3,-224,130,8,224,156,5,225,91,4,192,247,65,102,34,217,233,207,1,93,143,-2,46,47,108,2,105,98,47,2,68,97,116,2,97,47,73,142,102,221,168,-2,49,50,55,2,58,49,34,132,237,65,227,66,49,2,52,56,49,163,39,-32,19,133,27,193,118,2,83,32,83,134,155,232,241,0,129,182,232,247,0,-67,52,147,183,64,57,243,182,3,160,53,203,105,198,179,99,79,196,42,192,-7,34,152,66,26,2,75,50,32,224,204,37,2,54,51,58,222,118,138,80,-233,156,2,226,47,0,227,177,3,174,118,227,162,3,32,143,168,231,229,170,-0,163,107,2,52,56,48,98,69,132,64,196,212,224,80,12,236,130,1,224,-80,3,141,148,131,241,33,90,222,99,131,65,141,97,220,93,97,52,142,159,-228,48,11,228,105,13,160,47,236,36,4,224,61,11,108,51,228,108,4,224,-79,11,228,154,18,252,199,3,32,200,200,98,208,150,230,238,21,166,0,98,-179,104,72,75,205,216,83,66,197,128,8,2,57,32,67,240,89,9,174,202,-32,51,229,11,0,34,122,172,58,253,167,1,65,142,151,209,225,83,3,238,-0,4,168,30,224,99,4,227,214,0,2,89,32,67,224,82,2,226,237,0,-226,183,3,101,65,232,197,0,235,127,1,80,168,230,30,2,239,80,0,123,-9,138,240,254,65,4,232,179,17,192,146,152,11,237,162,4,2,116,87,46,-2,99,109,112,162,233,207,222,128,6,174,22,128,5,33,39,166,5,2,52,-55,53,227,211,0,64,39,227,211,2,164,180,194,108,231,0,6,162,239,231,-2,8,227,73,15,97,91,64,109,162,244,242,131,1,101,2,107,119,192,253,-227,161,45,224,91,1,227,161,9,224,95,4,227,161,31,224,80,2,162,150,-97,121,33,40,223,57,162,86,227,140,36,129,208,227,51,2,224,10,1,32,-89,134,248,34,212,32,11,133,118,245,189,9,245,80,11,2,52,54,55,101,-96,244,207,0,251,112,0,226,137,0,249,224,3,37,126,32,4,64,50,2,-51,56,50,32,234,2,54,56,32,250,112,4,249,253,2,210,111,2,51,57,-50,160,51,157,6,64,13,76,5,156,51,129,31,166,159,129,83,250,42,0,-2,52,55,49,162,198,224,90,56,33,21,230,120,0,224,209,6,106,45,231,-96,3,178,156,98,178,2,50,50,50,32,19,227,41,1,2,100,101,102,2,-105,110,101,2,100,34,32,196,199,164,28,225,104,2,246,255,1,224,100,0,-118,233,251,28,7,2,52,49,53,225,75,0,225,86,5,66,216,32,55,143,-114,253,3,13,2,44,41,34,199,157,246,219,4,144,145,255,78,1,64,237,-147,244,247,120,0,161,58,73,166,2,51,50,56,66,174,194,12,226,247,0,-65,113,36,85,193,62,2,90,32,80,65,88,64,66,99,9,247,198,4,96,-0,79,215,163,57,225,16,10,224,18,10,225,32,6,240,40,2,131,242,112,-120,245,5,0,224,45,8,64,71,106,64,99,58,224,70,11,98,52,64,34,-224,171,7,224,93,9,224,189,7,241,128,13,98,9,225,139,12,226,19,5,-241,156,0,228,41,0,117,210,235,99,0,96,124,233,194,0,89,223,2,64,-83,32,182,250,32,89,130,189,192,179,65,210,33,168,248,117,7,228,191,3,-224,5,0,132,79,32,42,64,45,104,233,224,69,12,2,64,75,51,224,26,-6,32,6,192,26,64,220,224,26,13,234,5,11,2,99,112,112,2,104,115,-115,2,114,99,47,2,109,97,108,2,99,111,108,2,109,45,119,2,97,108,-108,2,97,99,101,2,45,117,110,2,105,118,101,2,114,115,101,2,47,99,-112,32,33,2,45,49,46,2,50,48,46,2,57,47,76,2,97,110,103,2,-117,97,103,2,101,47,80,2,114,101,112,2,114,111,99,2,101,115,115,2,-111,114,47,2,67,112,112,2,104,115,47,32,5,2,73,102,100,2,101,102,-46,169,121,2,50,51,56,2,58,49,50,161,82,231,21,0,240,81,4,246,-93,1,160,13,64,10,225,83,0,103,101,65,85,121,67,225,9,13,225,80,-7,182,8,239,40,0,247,82,2,246,210,2,225,100,1,239,164,5,224,111,-38,64,214,64,1,67,140,227,128,0,110,157,110,90,2,53,48,32,224,48,-3,227,212,0,224,113,3,237,28,0,136,128,227,198,1,174,230,209,132,130,-106,2,53,56,32,241,233,1,224,89,10,225,226,104,2,52,53,58,225,226,-0,37,159,234,189,1,87,135,247,132,2,167,37,233,252,3,248,247,5,105,-16,132,228,250,98,0,224,21,6,237,36,1,155,101,239,3,0,70,46,231,-146,0,178,19,89,186,83,106,69,132,128,28,128,24,234,5,0,63,132,152,-132,64,39,165,166,225,55,1,2,39,96,95,128,213,32,64,180,121,2,51,-54,50,138,200,2,51,54,51,164,108,2,95,50,53,149,4,34,2,64,23,-32,67,224,66,1,2,69,120,112,2,101,99,116,2,101,100,32,2,101,110,-100,2,32,111,102,2,32,105,110,2,112,117,116,2,32,40,69,2,79,70,-41,196,102,32,92,137,138,251,137,3,67,26,68,110,32,28,211,34,226,43,-3,186,222,228,197,12,2,35,108,105,2,110,101,32,252,30,0,138,209,111,-219,2,51,51,32,2,95,49,53,187,106,224,64,7,93,23,253,135,2,96,-43,2,52,49,32,32,28,251,37,1,32,141,136,248,80,31,64,251,194,148,-131,194,138,213,246,104,5,2,64,35,51,185,45,155,20,39,16,225,255,3,-193,193,160,26,32,106,64,135,254,244,0,2,64,89,32,226,71,2,162,41,-229,210,1,74,26,224,92,1,224,10,0,247,24,13,208,93,136,23,248,66,-0,247,30,14,169,170,171,212,96,153,128,172,224,26,0,224,108,1,205,90,-98,217,140,168,226,223,2,203,237,243,193,0,248,18,14,192,87,224,204,6,-224,159,13,129,84,251,82,1,224,124,3,111,37,225,75,10,194,14,240,150,-2,161,183,224,134,10,208,197,220,102,224,107,21,254,82,5,162,42,138,201,-2,65,32,58,96,139,117,244,32,10,214,244,221,57,128,235,200,174,224,144,-10,2,51,52,32,244,240,2,225,6,5,103,101,253,201,0,253,209,1,221,-68,224,237,1,231,169,0,234,13,2,187,148,32,191,175,120,64,193,238,59,-0,233,59,1,64,5,229,160,0,134,53,96,56,32,48,132,116,32,196,233,-25,38,132,197,224,32,3,102,50,90,183,235,37,10,108,140,234,101,0,160,-145,234,47,19,235,107,0,233,52,6,224,145,16,224,48,12,233,78,2,232,-154,1,177,169,191,121,233,0,6,97,22,245,0,3,218,129,161,139,231,119,-6,124,59,2,52,52,52,193,180,231,12,6,65,17,65,97,167,68,224,217,-0,197,36,224,7,11,253,96,0,97,211,231,52,14,231,37,107,2,51,55,-55,231,37,0,2,58,52,53,134,144,249,124,5,225,95,7,225,104,3,193,-160,225,137,2,128,47,240,209,2,163,157,73,236,145,234,207,170,78,110,76,-38,2,52,53,49,209,228,96,33,76,48,140,8,254,48,0,224,69,0,224,-60,14,176,68,208,183,67,70,230,142,21,2,109,97,99,2,114,111,32,166,-142,194,26,166,145,129,250,224,63,21,2,32,101,120,167,66,237,171,0,224,-48,0,96,73,230,213,1,224,169,6,230,228,10,224,86,2,2,97,114,103,-2,117,109,101,2,110,116,115,2,44,32,98,39,146,2,119,97,115,2,32,-103,105,2,118,101,110,160,102,224,89,5,160,244,194,55,255,153,0,234,93,-0,42,47,100,81,136,126,86,242,215,0,234,124,3,251,180,1,246,163,1,-2,51,53,49,224,161,3,145,25,249,170,0,93,70,196,172,108,242,133,30,-2,52,49,55,106,164,2,50,55,32,199,102,165,183,99,129,195,5,100,146,-65,12,117,79,240,15,4,96,39,224,97,9,65,60,167,175,32,9,78,199,-161,76,165,246,133,141,69,70,65,126,70,95,228,120,0,34,212,169,36,89,-134,35,228,32,16,200,216,165,236,245,218,4,241,134,2,2,39,32,85,228,-106,2,242,246,2,250,106,1,230,134,1,96,105,184,129,96,1,2,80,32,-75,68,69,227,203,3,34,51,2,97,110,115,2,105,111,110,2,44,32,97,-2,116,32,92,227,217,69,2,72,97,115,2,104,68,101,78,42,235,1,0,-2,53,58,54,130,54,224,137,129,110,57,224,139,128,70,169,225,23,129,66,-176,34,68,211,196,34,176,144,96,34,128,32,22,186,122,254,244,10,188,100,-151,23,67,245,177,255,173,137,103,247,158,44,87,194,96,99,136,249,227,1,-0,75,56,136,30,238,149,1,197,241,224,53,2,137,36,226,222,16,228,187,-2,226,222,118,224,137,112,226,222,10,224,139,114,226,222,8,224,139,114,41,-6,101,144,34,70,170,206,226,70,15,32,89,64,129,64,167,226,72,120,224,-139,114,226,74,10,224,141,116,129,190,83,194,224,148,128,34,75,209,94,36,-238,64,152,140,135,75,78,2,58,52,52,138,204,2,73,32,58,96,16,104,-2,2,50,32,80,64,38,115,2,119,194,40,212,224,56,1,2,49,56,53,-224,11,2,41,162,128,11,32,63,186,149,2,49,51,52,33,6,169,232,2,-55,32,102,225,4,0,2,110,111,32,2,102,105,101,2,108,100,32,128,152,-96,29,144,176,41,10,192,105,2,52,48,32,160,11,32,81,136,42,2,95,-52,51,67,0,2,50,48,55,72,105,224,81,3,2,67,111,110,2,116,114,-111,2,108,46,69,2,120,99,101,2,112,116,105,2,111,110,46,94,60,2,-114,110,97,2,108,34,32,242,13,3,2,82,101,99,2,83,101,108,2,69,-114,114,2,111,114,34,250,98,3,32,98,134,72,195,103,41,90,73,93,140,-224,97,203,76,231,163,147,73,172,177,235,78,248,180,103,74,164,69,252,64,-8,2,52,49,54,79,93,32,195,172,164,215,122,139,57,73,250,107,188,32,-37,238,206,6,198,137,96,37,110,185,82,213,2,52,50,54,65,13,243,40,-0,77,168,129,162,65,49,2,50,57,32,160,28,33,33,97,160,147,88,71,-5,32,5,97,191,2,51,54,32,224,35,1,97,102,160,11,224,59,2,130,-21,64,11,32,97,249,161,2,115,249,110,233,2,50,48,53,96,146,139,73,-243,220,3,244,4,3,32,68,64,179,144,223,32,45,128,93,224,6,3,32,-95,132,215,39,105,39,202,2,52,32,65,161,89,175,139,244,111,1,224,114,-5,224,101,5,111,98,224,101,11,2,58,52,51,130,206,192,94,161,184,77,-123,224,94,34,67,189,224,94,14,130,226,225,208,0,224,69,3,160,60,68,-143,224,60,4,32,53,194,198,33,181,33,246,252,50,0,34,0,35,74,64,-10,60,101,2,51,32,35,188,245,255,232,3,224,34,13,130,165,34,129,107,-88,224,118,5,224,96,3,160,46,129,175,83,136,188,244,235,145,1,130,203,-119,191,128,10,252,208,2,224,137,5,204,160,148,149,2,52,51,51,98,194,-238,133,0,98,83,224,251,1,238,226,3,109,47,64,75,41,80,160,44,175,-32,224,70,0,2,50,57,53,255,62,1,225,129,4,224,42,8,224,113,2,-224,41,6,33,104,131,204,73,198,33,252,216,177,32,23,195,184,233,201,2,-132,0,237,232,0,65,2,241,51,1,112,191,193,35,32,63,131,118,32,87,-64,85,224,87,2,227,44,0,67,209,130,7,32,56,67,114,2,51,48,32,-161,182,225,192,11,226,27,2,215,113,94,233,65,109,64,19,227,13,0,224,-86,6,226,60,25,224,88,1,36,28,227,9,0,152,228,249,193,0,64,29,-131,17,130,15,192,1,75,38,241,168,0,224,20,7,224,17,8,224,14,5,-224,11,2,247,3,3,160,109,227,54,0,32,158,182,122,226,144,5,128,43,-255,219,1,239,161,2,255,134,3,251,208,2,226,168,2,99,121,66,92,225,-112,12,175,240,161,24,2,64,95,53,224,40,15,252,158,1,63,193,133,137,-88,30,101,132,96,197,206,184,32,17,124,247,129,173,64,35,95,245,2,49,-48,49,39,68,64,19,162,130,64,27,226,56,0,2,51,32,90,225,130,3,-32,26,130,59,2,80,32,58,97,18,96,37,37,13,32,13,199,173,226,172,-0,111,239,175,80,131,79,140,115,50,136,131,10,132,122,96,192,227,177,6,-2,58,52,49,226,7,0,64,92,70,100,227,9,15,214,232,182,228,227,4,-7,65,72,224,165,1,70,232,117,61,160,141,146,240,81,19,83,188,80,42,-197,126,50,249,148,36,32,161,112,128,186,1,96,35,226,152,6,160,43,160,-147,32,101,199,157,224,101,8,40,132,192,101,102,67,224,101,0,252,145,1,-149,48,224,103,19,250,224,1,160,95,53,82,32,153,243,70,0,224,60,21,-225,27,0,230,87,3,2,51,55,54,224,254,14,99,20,32,33,193,30,224,-85,14,178,166,40,250,232,190,1,2,87,104,101,2,110,32,108,2,111,111,-107,2,105,110,103,2,32,102,111,2,114,32,97,2,32,110,111,2,110,45,-101,2,109,112,116,2,121,32,115,2,101,113,117,2,101,110,99,2,101,32,-119,2,105,116,104,32,13,2,112,97,114,2,97,116,111,2,114,115,58,2,-92,49,48,2,38,92,57,2,38,34,32,129,190,197,3,252,162,0,246,127,-0,32,145,128,133,120,49,246,211,2,224,41,8,33,78,255,6,10,32,92,-207,42,246,162,2,2,52,49,49,168,31,212,241,232,242,6,147,66,74,89,-2,51,55,51,247,117,1,243,245,15,244,75,11,219,29,244,41,16,2,103,-111,116,192,47,224,181,6,32,180,131,129,124,23,2,89,32,67,216,197,224,-164,3,243,121,7,32,31,112,5,246,123,41,2,112,111,108,2,121,112,97,-32,9,43,206,2,49,50,47,64,43,2,84,101,120,2,116,47,80,64,19,-203,180,2,49,48,57,2,58,55,34,226,45,0,217,80,2,50,55,56,251,-168,2,249,95,4,64,202,224,25,13,66,76,216,219,250,176,9,151,75,249,-190,0,251,68,10,68,134,64,134,153,26,33,159,99,248,244,75,0,96,64,-192,12,128,44,100,98,97,102,2,50,55,55,32,52,37,15,129,118,224,134,-50,214,176,224,133,27,96,43,224,132,75,2,49,49,49,225,11,34,96,44,-224,134,8,197,144,224,134,50,2,55,57,32,224,133,32,96,43,224,132,16,-185,90,248,192,1,254,4,1,229,101,1,255,89,5,227,94,12,2,44,59,-40,2,41,91,93,2,123,125,96,195,98,230,157,0,119,52,229,23,0,71,-221,224,99,6,255,198,3,69,114,254,119,5,42,14,229,203,5,128,6,32,-127,34,104,128,97,159,173,165,132,228,55,19,2,66,97,100,2,32,99,104,-37,20,36,60,2,114,58,32,206,123,120,32,223,31,168,85,252,203,1,161,-164,170,192,255,216,0,254,166,22,110,182,254,166,5,248,101,0,141,46,254,-69,2,64,14,64,62,156,192,148,148,225,125,1,231,129,0,91,16,100,229,-247,74,1,160,103,231,159,1,225,232,0,162,18,193,241,192,91,216,50,224,-48,8,224,46,14,235,21,0,226,103,3,224,62,10,96,54,225,201,3,33,-4,226,54,5,225,134,1,2,95,39,34,229,135,0,253,66,0,224,98,25,-96,79,32,101,216,93,160,47,32,22,2,79,32,64,230,181,0,226,168,23,-2,33,64,35,2,36,37,38,2,42,43,46,2,47,60,61,2,62,63,92,-2,57,50,38,2,94,124,58,2,45,126,34,250,217,0,126,51,129,223,255,-182,3,224,204,15,2,101,69,34,224,58,11,206,23,128,18,227,231,15,130,-115,224,110,4,226,14,8,192,130,225,135,11,226,22,12,231,53,16,2,43,-34,32,231,46,2,226,45,5,226,37,7,224,192,30,205,152,224,192,93,2,-45,34,32,224,192,33,224,140,76,40,249,75,220,223,164,224,136,31,196,162,-253,97,20,2,105,115,115,73,212,2,43,47,45,2,47,100,105,2,103,105,-116,252,194,2,224,51,15,2,97,102,116,2,101,114,32,2,101,32,105,2,-110,32,102,2,108,111,97,224,50,27,2,108,105,116,2,101,114,97,2,108,-58,32,253,32,6,81,249,165,4,220,23,224,252,20,224,81,1,2,46,46,-46,227,207,1,163,133,131,153,160,0,2,89,32,66,165,59,125,83,108,25,-96,83,71,30,225,240,20,2,110,100,32,2,111,102,32,2,105,110,112,61,-218,32,227,244,44,0,224,47,14,2,115,116,114,65,65,160,226,233,237,2,-130,9,229,122,5,97,150,233,38,7,229,166,1,250,49,8,77,236,52,118,-161,245,167,22,203,247,161,223,122,51,234,17,79,2,49,56,58,2,52,54,-34,239,131,0,225,101,0,82,124,76,106,253,217,2,64,0,253,213,4,64,-36,71,247,65,47,230,240,4,110,45,34,170,160,60,238,248,0,114,9,32,-87,46,87,106,115,172,152,129,116,235,8,3,225,173,13,160,166,43,89,142,-208,236,12,2,77,175,45,92,64,136,2,51,56,49,129,69,66,109,235,222,-10,2,97,32,108,161,202,71,181,128,83,101,137,234,247,7,236,59,2,224,-70,1,2,98,105,110,2,100,34,32,130,49,236,138,1,65,194,236,156,5,-2,48,57,32,32,143,95,36,224,143,14,224,132,3,2,32,104,97,2,115,-32,110,86,189,54,89,2,32,39,34,230,141,1,224,150,41,237,58,5,97,-45,244,252,9,2,52,48,56,238,222,14,238,251,19,2,58,52,48,207,236,-142,87,32,16,207,239,225,139,4,67,130,241,92,0,224,140,0,182,213,224,-207,2,73,153,106,145,224,228,9,224,196,2,224,240,12,225,206,14,2,44,-32,103,45,145,2,39,39,34,226,209,0,224,152,12,237,136,3,160,138,163,-132,224,27,12,139,57,224,27,12,2,49,48,50,224,28,18,65,122,224,28,-17,97,84,224,28,15,169,130,224,28,13,224,144,18,97,83,224,27,14,131,-198,224,27,14,97,107,224,83,14,192,55,101,109,64,27,102,136,224,157,15,-209,239,224,28,11,237,246,0,120,224,2,57,49,32,98,113,239,164,1,229,-185,19,2,117,110,114,2,101,99,111,2,103,110,105,2,115,101,100,2,32,-101,115,2,99,97,112,2,101,32,115,208,157,37,201,226,8,3,2,58,32,-92,41,133,195,221,233,203,0,208,48,224,151,7,2,54,53,32,224,27,17,-97,138,224,27,14,98,54,224,27,14,247,251,0,224,27,10,97,109,224,27,-13,54,129,224,27,17,97,91,224,27,14,97,249,224,27,14,224,195,18,133,-137,224,27,13,147,232,224,27,14,101,235,224,27,14,97,79,228,193,9,59,-207,122,183,230,206,78,2,51,48,56,2,58,49,52,163,252,81,73,227,251,-5,224,141,8,107,208,229,230,23,196,137,34,217,160,17,226,155,10,2,39,-92,57,2,50,38,86,2,84,39,34,162,102,224,124,26,65,62,224,124,33,-87,200,224,124,20,2,85,83,39,228,245,2,2,51,55,52,224,4,18,224,-154,22,111,221,230,254,33,224,67,13,120,68,225,91,33,200,13,224,154,60,-224,86,1,168,184,226,9,61,224,67,22,67,71,224,154,33,209,44,224,242,-25,226,40,37,86,211,224,174,28,225,228,59,224,242,38,224,243,32,100,63,-224,156,54,101,183,224,156,34,177,92,227,188,29,69,163,227,188,34,171,208,-227,188,16,2,83,79,72,2,39,32,39,128,9,192,8,2,84,88,39,160,-9,2,73,39,32,128,8,2,89,78,39,160,9,2,85,66,39,2,32,111,-114,160,12,2,80,39,34,192,187,228,119,73,142,114,224,186,17,2,82,83,-39,228,119,7,225,220,90,102,208,224,197,33,239,55,0,225,31,25,104,10,-224,157,55,224,67,28,226,122,1,228,253,1,225,101,15,2,78,85,76,225,-240,1,2,78,65,75,225,241,35,104,80,228,64,34,225,241,23,2,76,70,-39,230,230,34,231,99,37,140,182,224,123,17,2,72,84,39,231,98,80,94,-210,224,124,20,2,71,83,39,226,234,38,225,122,39,165,32,224,218,73,143,-109,224,218,17,2,70,70,39,226,94,0,2,70,83,39,226,93,0,232,74,-19,231,83,137,210,31,232,224,91,226,216,38,253,124,0,231,83,61,224,155,-22,68,80,224,155,33,168,49,233,38,93,231,150,39,243,243,0,225,56,24,-77,139,224,88,34,192,245,227,108,63,224,246,22,224,157,38,184,146,227,178,-13,2,111,110,101,83,21,99,173,2,69,84,88,168,20,2,69,79,84,192,-9,2,78,81,39,192,29,40,40,128,9,2,77,39,32,195,225,2,69,83,-67,227,226,14,224,197,23,234,52,59,226,0,37,2,49,50,55,227,213,31,-224,88,28,224,224,59,224,156,1,234,52,35,226,2,28,229,99,37,2,52,-57,32,224,174,36,129,74,224,85,23,2,53,48,32,224,85,36,181,202,224,-86,24,228,149,37,2,49,57,32,224,86,29,238,105,37,146,129,231,13,21,-2,68,69,76,227,44,1,2,68,76,69,224,12,2,2,67,91,49,2,46,-46,52,2,93,39,34,227,62,7,228,67,23,239,15,38,164,246,234,175,94,-237,199,38,198,204,225,65,17,2,67,82,39,225,51,0,2,67,65,78,225,-46,40,228,104,106,196,102,233,125,73,233,124,23,2,66,69,76,225,45,1,-2,66,83,39,235,219,34,230,86,29,236,173,68,196,242,224,207,17,2,65,-67,75,224,195,1,32,115,186,38,121,13,2,52,56,32,32,19,2,52,48,-51,32,58,89,175,224,34,18,64,93,192,34,120,151,224,36,8,86,101,2,-95,48,32,184,41,120,216,32,203,245,239,1,32,15,86,75,192,68,225,9,-8,86,133,93,176,2,49,52,57,121,163,2,50,57,53,32,31,2,48,48,-32,2,64,64,35,123,123,32,19,43,194,192,18,32,29,194,193,246,176,28,-249,227,4,2,99,116,114,2,108,45,101,150,181,52,229,2,102,111,114,2,-109,101,100,150,166,2,94,34,32,246,167,7,64,86,249,2,0,64,113,64,-239,121,80,35,124,2,95,56,50,117,70,2,53,57,32,128,5,128,172,228,-214,0,235,15,1,204,209,224,17,1,128,40,237,113,3,208,155,244,231,9,-237,149,8,228,158,7,238,53,11,236,204,7,227,7,10,227,114,7,249,237,-3,126,253,68,33,225,103,6,253,208,18,218,10,225,110,4,194,127,58,163,-32,101,58,163,66,245,2,83,32,67,66,35,32,152,224,62,1,2,100,101,-99,2,105,109,97,2,108,34,32,162,78,2,49,50,53,154,254,90,251,32,-13,129,106,2,57,51,32,239,24,2,135,31,64,15,32,94,32,140,155,2,-2,51,54,50,97,163,64,69,157,69,190,242,106,106,32,41,32,6,224,136,-18,2,111,99,116,224,134,28,161,69,2,51,48,50,224,133,3,33,48,224,-91,18,2,104,101,120,224,224,27,131,39,32,90,135,169,160,90,32,201,64,-90,33,152,126,162,192,225,253,114,0,130,175,64,27,64,5,251,242,2,65,-19,32,87,157,8,67,114,174,222,159,41,226,226,4,184,73,95,73,32,25,-63,7,96,31,2,52,48,49,32,27,252,185,3,2,56,55,32,224,187,7,-152,103,64,108,2,53,51,32,224,28,9,160,111,2,95,50,48,65,133,32,-8,32,177,64,152,157,2,69,97,96,195,224,55,11,223,18,97,197,227,233,-20,2,92,49,48,2,38,101,120,162,135,107,157,2,114,32,109,2,111,114,-101,162,134,253,254,9,2,32,100,105,2,103,105,116,2,115,34,32,194,164,-32,116,98,69,32,144,2,50,49,50,249,30,2,2,102,111,108,2,100,108,-49,165,133,2,52,48,48,97,146,159,0,2,66,32,89,129,40,2,83,32,-80,195,59,33,41,96,79,157,244,170,73,225,132,0,97,131,68,241,2,50,-49,54,66,152,91,217,68,247,41,20,134,12,229,202,3,2,96,95,34,229,-55,10,93,13,165,141,227,158,2,225,29,20,2,69,120,112,189,172,2,110,-32,105,2,100,101,110,2,116,105,102,2,105,101,114,157,171,89,183,225,36,-5,2,79,32,35,68,165,219,176,2,58,51,57,158,117,99,95,99,88,32,-95,66,23,32,25,158,126,32,148,2,52,32,67,160,1,33,64,166,34,200,-67,167,172,131,180,181,185,97,243,32,64,132,27,32,15,2,53,32,66,163,-193,98,34,32,10,103,21,2,54,32,89,99,82,2,83,32,73,2,32,64,-90,126,245,192,6,226,90,1,96,54,99,91,98,91,33,148,163,44,64,13,-64,61,224,59,1,164,223,165,175,96,10,206,135,2,89,32,66,65,154,33,-201,230,97,33,2,102,97,105,2,108,101,100,2,32,116,111,2,32,112,97,-59,7,33,96,2,121,32,111,2,102,32,116,2,104,101,32,2,112,111,115,-2,115,105,98,2,108,101,32,2,99,104,111,2,105,99,101,2,115,58,92,-34,163,129,105,99,151,2,48,32,35,64,181,67,25,32,190,2,85,32,67,-64,152,97,128,224,112,19,224,69,2,224,67,1,96,13,2,50,55,54,243,-27,0,64,245,98,136,195,233,225,36,0,224,19,2,62,76,190,39,224,2,-2,128,20,224,55,2,225,62,6,224,28,3,2,90,32,64,224,13,2,33,-108,227,2,0,32,72,64,88,192,93,34,190,64,123,99,35,32,0,192,73,-226,70,1,197,194,128,69,32,39,32,19,133,172,2,85,32,58,66,92,64,-10,104,42,32,2,97,31,126,184,2,85,32,75,32,132,64,1,224,82,0,-2,51,56,52,254,253,3,101,37,128,41,2,52,32,65,104,146,160,33,66,-99,225,101,16,2,73,110,32,2,97,32,115,190,218,225,114,15,133,22,101,-53,99,151,102,124,197,86,224,157,20,161,15,130,103,97,240,96,159,137,50,-160,35,65,2,133,248,98,14,128,204,159,175,224,88,17,32,51,132,199,2,-85,32,90,192,30,32,19,196,173,64,243,2,50,54,51,227,43,3,133,150,-194,121,36,2,2,51,56,56,249,48,2,2,51,56,57,129,161,132,206,2,-83,32,85,195,252,64,95,68,185,49,245,96,86,82,39,234,214,4,232,146,-0,131,83,233,92,0,32,54,98,233,65,2,160,95,164,103,64,11,166,232,-32,24,69,31,2,51,56,55,66,11,64,146,197,110,128,56,32,19,200,85,-161,128,170,41,99,177,120,110,134,91,96,171,135,26,161,117,192,92,96,172,-201,203,252,255,2,64,49,32,94,130,146,65,106,64,180,32,16,194,143,35,-12,32,13,130,146,234,251,0,97,199,132,220,101,226,33,23,104,38,32,41,-225,196,1,234,251,5,65,131,35,109,2,82,32,95,235,249,11,159,86,2,-115,97,116,2,105,115,102,2,121,58,32,132,103,236,10,7,96,95,129,240,-99,222,101,122,98,205,32,95,224,75,1,2,82,97,110,2,32,111,117,2,-116,32,111,2,102,32,105,2,110,112,117,2,116,32,40,2,69,79,70,2,-41,34,32,133,243,137,41,64,73,130,38,32,16,96,142,96,202,224,153,10,-2,110,111,32,100,235,96,63,138,41,32,5,76,24,219,148,2,57,32,95,-128,11,32,83,194,55,227,38,0,73,187,32,35,65,29,66,132,2,50,52,-50,96,15,33,93,228,14,0,86,29,129,123,2,51,32,75,128,17,130,0,-228,1,4,128,119,69,188,100,97,32,51,64,21,98,53,141,80,163,100,131,-98,32,67,130,48,96,85,68,9,32,17,193,227,227,76,3,32,22,129,233,-230,89,5,71,179,39,114,196,209,69,38,229,29,11,101,20,101,23,163,123,-65,30,136,7,193,180,234,168,0,230,134,0,32,37,130,36,2,80,32,58,-64,39,128,148,32,163,32,13,161,147,96,60,105,122,224,60,2,97,183,162,-217,194,17,224,14,6,233,227,7,2,95,49,56,161,219,38,48,66,188,160,-10,193,241,64,114,168,185,192,18,231,97,23,32,20,99,222,65,219,96,206,-231,84,4,32,10,64,113,136,10,65,236,224,103,0,64,18,99,237,138,117,-101,210,33,52,32,24,200,84,225,130,3,138,55,142,127,171,37,66,102,111,-126,32,50,200,70,98,103,224,147,0,135,234,136,126,96,155,160,80,98,30,-224,74,8,136,145,64,6,32,74,66,16,2,85,32,64,64,16,194,14,33,-214,198,245,70,201,32,25,129,219,192,20,224,28,6,129,210,2,73,32,58,-96,192,160,39,231,40,1,224,11,2,230,247,2,96,57,129,243,34,168,2,-50,32,90,197,195,67,54,64,225,68,101,2,53,56,32,32,17,78,124,101,-0,2,80,32,67,96,238,32,24,64,194,224,12,0,109,220,224,45,0,197,-66,32,161,32,215,32,16,129,50,96,229,32,13,128,245,130,232,135,60,232,-26,6,231,221,2,134,248,138,248,168,49,44,243,195,153,224,5,7,232,102,-6,160,60,232,134,2,232,116,14,232,107,3,131,246,224,116,0,195,124,224,-114,0,66,62,244,144,2,181,15,224,73,2,237,58,0,32,67,241,124,5,-175,126,192,160,163,66,136,60,2,49,56,49,128,46,102,171,64,5,96,91,-164,168,32,0,2,79,32,75,235,40,1,224,174,92,2,52,55,32,224,174,-72,224,109,17,192,154,226,175,1,224,118,43,173,198,66,222,96,30,233,114,-2,44,107,72,119,224,147,3,103,173,224,250,18,128,127,39,54,2,49,56,-48,32,16,224,211,4,98,159,33,121,65,124,68,6,99,9,128,39,224,132,-36,225,23,1,64,1,36,237,192,94,235,43,5,194,202,224,48,4,74,246,-224,66,6,202,248,224,63,9,72,64,245,205,0,239,196,1,160,194,102,113,-32,31,45,113,239,76,5,171,210,2,50,52,56,68,14,224,131,8,234,216,-17,2,87,97,114,2,110,105,110,2,103,58,32,2,67,97,110,2,39,116,-32,2,102,105,110,2,100,32,102,40,90,238,6,2,235,211,5,175,123,240,-52,4,239,132,16,32,67,40,97,47,90,2,114,101,99,2,116,111,114,2,-105,101,115,75,58,2,92,57,38,246,125,2,240,192,1,160,89,192,203,70,-248,224,13,2,110,101,239,232,13,224,80,2,225,210,32,240,60,23,2,32,-32,65,2,115,107,101,33,12,48,56,2,98,121,58,176,55,2,95,49,51,-65,123,243,221,3,167,81,97,180,165,106,224,88,16,2,109,105,115,2,115,-105,110,2,103,32,102,33,97,224,82,1,224,40,0,224,157,0,241,188,1,-162,21,71,192,96,97,2,95,51,51,161,36,204,209,112,45,70,210,224,39,-6,90,51,241,211,0,130,82,194,118,160,63,134,252,66,81,2,51,53,49,-32,39,79,163,193,221,96,95,179,45,2,51,53,50,168,57,67,202,99,117,-160,19,162,197,201,133,33,24,35,225,169,103,41,5,96,39,32,121,38,78,-203,44,137,89,32,22,148,175,32,25,169,15,76,50,73,127,32,8,203,166,-113,253,96,23,39,142,236,82,2,241,28,2,225,190,13,53,193,2,47,34,-32,239,6,5,32,105,201,83,128,93,224,181,1,229,252,7,236,142,3,128,-230,224,251,12,32,81,135,199,73,165,91,74,135,47,225,131,1,73,147,2,-51,55,32,65,179,193,159,2,51,52,53,206,174,96,35,32,16,2,54,32,-102,224,185,0,32,5,2,45,56,47,2,47,82,79,2,85,78,68,2,84,-82,73,2,80,34,32,243,135,0,228,25,2,33,102,96,57,105,194,32,92,-116,204,97,239,75,18,226,5,5,64,177,137,2,70,102,197,63,98,191,2,-95,55,52,140,236,172,235,244,45,2,96,60,99,117,107,156,128,105,226,76,-6,225,35,1,151,249,247,251,0,194,167,107,193,160,46,203,74,64,73,106,-75,33,246,32,13,136,131,2,94,103,101,2,116,98,32,32,14,246,23,1,-128,166,2,50,50,50,102,54,225,226,9,225,40,13,243,168,6,2,117,110,-107,2,110,111,119,2,110,32,116,2,101,120,116,2,32,101,110,2,99,111,-100,35,123,237,50,2,129,128,138,124,66,232,238,106,0,2,52,48,32,32,-4,131,208,225,17,3,34,184,2,50,53,49,192,27,96,54,130,215,2,95,-52,50,109,107,2,52,49,32,65,15,162,254,135,8,47,32,2,51,52,51,-128,100,130,235,105,200,140,113,64,24,97,15,51,96,79,199,140,186,67,226,-244,254,1,175,254,32,22,74,161,96,92,34,173,96,162,64,11,32,68,173,-241,32,76,2,75,32,95,2,50,48,55,65,46,2,55,32,102,225,8,0,-2,67,111,110,2,116,114,111,2,108,46,69,2,120,99,101,2,112,116,105,-2,111,110,46,2,73,110,116,2,101,114,110,150,221,224,39,1,2,83,111,-109,2,101,69,120,160,35,141,206,167,179,32,100,208,51,129,34,108,250,203,-238,72,191,2,51,51,57,112,244,160,45,130,140,96,233,141,177,64,25,32,-17,2,99,97,116,2,99,104,32,32,14,173,192,210,14,226,219,0,2,51,-51,50,203,174,66,128,136,66,229,79,15,2,111,112,101,2,110,70,105,69,-75,2,99,97,110,2,110,111,116,2,32,111,112,2,101,110,32,163,250,226,-171,2,32,111,162,91,227,159,8,98,193,99,159,68,24,194,21,2,49,52,-56,172,222,226,208,14,32,8,133,40,32,90,130,58,32,32,66,211,64,37,-66,211,2,99,108,111,2,115,101,98,64,16,129,244,206,80,32,16,215,190,-224,250,8,2,50,55,32,224,133,5,104,168,224,37,4,65,123,2,50,57,-32,162,187,98,188,32,6,144,211,224,240,1,201,132,35,192,182,207,96,232,-64,151,2,97,100,100,2,95,70,73,2,76,69,32,32,18,129,210,96,18,-2,117,116,102,2,56,32,58,96,80,185,59,2,50,56,32,141,131,2,58,-51,50,204,89,32,10,129,183,224,188,8,230,77,3,2,49,51,48,163,58,-160,17,64,142,64,19,182,13,231,149,4,2,49,49,52,220,27,224,23,6,-32,116,132,54,224,24,5,86,33,224,23,8,226,18,1,2,119,43,34,238,-105,0,103,22,69,232,228,81,0,2,51,50,53,97,49,97,188,225,49,3,-129,47,228,24,3,170,37,32,242,174,75,2,49,48,51,2,32,35,48,97,-15,161,241,35,27,243,224,0,103,64,160,92,130,47,160,87,111,231,154,112,-96,6,32,56,2,116,111,73,2,110,116,32,32,14,130,26,2,94,102,111,-66,182,32,15,130,25,2,85,32,66,77,149,232,0,1,64,64,96,157,195,-112,79,92,2,50,56,50,229,186,1,121,135,242,185,4,32,77,164,22,50,-185,32,12,238,67,0,116,88,180,251,64,37,174,71,2,50,56,57,32,102,-49,46,185,126,32,11,74,75,65,133,32,37,64,6,162,23,52,30,227,30,-0,171,12,138,210,97,148,246,106,4,135,96,107,185,185,183,229,213,11,65,-211,143,234,235,238,7,203,107,224,15,1,72,193,243,186,2,134,116,32,99,-224,37,5,128,39,186,165,224,160,19,202,123,205,153,171,218,224,73,2,109,-159,105,55,224,56,3,108,78,246,201,3,224,116,0,224,152,1,96,20,113,-23,169,196,224,90,1,224,113,4,186,40,224,241,5,192,26,129,20,203,123,-239,39,1,225,89,32,70,114,234,244,3,224,241,14,225,115,3,224,237,7,-225,36,86,131,170,74,124,160,10,93,57,128,213,64,71,226,67,33,35,60,-192,233,170,189,64,101,245,243,0,224,93,4,224,116,3,224,105,91,96,11,-35,70,165,61,67,110,36,10,132,77,64,133,102,32,106,32,94,189,252,250,-6,179,101,145,23,208,18,194,221,128,18,240,73,14,169,153,192,51,239,72,-15,2,49,50,48,250,134,0,217,72,253,122,7,224,111,67,87,190,224,110,-98,2,49,49,49,224,111,1,185,137,224,111,83,86,174,224,110,98,93,115,-192,110,122,22,255,111,11,194,217,241,65,6,192,58,158,175,224,97,15,181,-21,224,97,19,207,10,2,51,49,53,224,32,10,34,238,173,132,87,143,171,-227,70,214,2,48,57,32,128,107,105,91,35,88,218,35,35,74,136,219,64,-15,32,54,135,56,224,54,17,218,158,2,49,51,32,224,53,2,188,39,223,-94,250,142,6,134,196,224,19,6,166,239,169,163,224,111,16,129,56,32,25,-107,142,192,111,135,113,224,220,18,182,94,2,51,48,49,224,54,3,135,155,-94,211,109,189,64,131,45,33,60,88,224,161,0,77,220,2,35,53,55,149,-89,224,38,8,73,18,224,38,1,2,49,48,50,181,129,224,39,7,118,231,-224,39,0,119,118,237,51,7,2,100,105,103,2,105,116,84,72,159,137,70,-100,221,251,21,0,32,57,96,76,192,16,96,15,128,86,193,184,224,49,28,-96,176,224,49,22,64,39,130,159,33,33,202,150,222,168,252,117,0,242,231,-5,158,128,199,33,67,97,179,248,84,29,224,47,0,182,209,96,2,147,202,-243,135,9,246,110,5,246,132,7,243,152,8,243,252,2,151,24,245,31,1,-64,5,224,117,0,167,226,134,100,224,162,0,73,188,169,220,2,95,53,51,-131,107,147,238,2,48,56,32,102,87,105,146,244,51,3,61,59,81,206,102,-134,226,99,5,161,84,33,53,66,127,130,254,96,118,128,36,131,153,99,170,-46,40,32,14,184,79,64,105,237,177,0,170,30,32,21,134,155,139,201,233,-249,1,100,49,130,92,96,152,232,190,81,32,177,232,190,8,232,187,34,232,-132,19,91,137,232,131,4,135,176,32,244,240,11,1,99,202,37,155,161,53,-161,45,170,83,190,199,235,5,64,79,52,235,5,32,192,96,233,157,47,224,-150,34,235,156,4,161,80,161,77,244,81,0,232,238,2,161,43,224,21,3,-64,101,226,46,1,161,69,97,106,133,215,2,80,32,79,243,151,0,163,168,-64,34,243,162,12,112,98,224,25,13,181,130,173,35,184,150,254,34,1,94,-111,128,5,223,141,254,63,2,224,28,1,244,97,5,229,26,1,2,44,59,-40,2,41,91,93,2,123,125,95,2,96,34,32,196,71,132,74,154,241,195,-205,108,123,224,88,5,2,95,50,57,65,45,224,34,0,65,109,126,247,164,-148,237,234,0,227,60,23,224,40,0,225,243,0,228,161,0,132,201,226,54,-4,225,249,1,227,131,9,96,27,227,27,7,236,146,5,96,37,160,26,247,-246,1,192,249,234,138,1,232,93,16,200,54,232,93,2,165,37,193,0,249,-161,1,227,65,17,236,127,73,180,231,85,208,96,162,224,220,5,193,7,33,-180,104,76,236,172,2,118,211,128,123,37,128,34,69,115,106,64,199,162,209,-228,12,23,237,19,29,224,94,2,232,187,0,32,141,33,83,232,202,15,2,-57,53,32,232,202,8,147,139,224,154,5,225,104,20,237,177,31,230,129,1,-67,42,32,164,224,99,2,192,25,96,54,2,67,32,79,164,58,177,176,132,-14,227,96,15,2,33,64,35,2,36,37,38,2,63,43,46,2,47,60,61,-2,62,63,92,55,197,2,94,124,58,2,45,126,34,135,62,130,108,226,66,-3,225,12,15,2,49,48,49,225,13,9,2,54,57,32,240,46,5,231,143,-3,208,86,225,28,57,162,52,163,19,184,101,229,111,2,200,37,99,59,234,-151,15,225,204,10,118,65,232,170,6,227,254,100,225,255,2,192,227,64,164,-193,224,194,180,239,4,0,160,21,64,152,193,78,192,128,224,118,6,96,112,-131,142,101,193,128,0,64,54,225,243,1,228,93,10,128,43,192,117,38,167,-64,16,226,108,2,225,208,23,240,214,75,228,70,5,160,190,96,199,237,226,-14,102,22,116,161,224,229,15,102,167,192,229,250,227,5,156,244,199,154,229,-131,13,128,96,101,128,224,96,2,134,254,225,155,3,218,35,160,168,133,214,-238,113,16,162,11,240,252,4,224,155,11,229,51,1,196,210,78,7,233,208,-1,36,16,194,215,224,142,20,193,163,131,61,225,146,1,167,13,225,53,9,-164,250,167,162,227,116,3,100,124,37,182,104,232,72,222,64,43,226,172,0,-226,152,9,198,41,168,118,129,227,224,54,5,224,231,3,192,209,40,218,142,-124,252,110,27,229,52,19,228,176,0,226,197,4,228,185,0,160,170,2,85,-32,35,193,148,153,144,237,32,1,172,210,225,65,1,64,132,229,130,15,2,-97,98,102,2,110,114,116,2,118,92,57,2,50,38,92,63,188,2,39,34,-32,237,80,1,226,196,17,131,137,229,158,11,110,124,64,108,38,160,33,26,-71,41,2,35,54,52,129,73,46,127,192,18,102,190,225,9,8,2,66,32,-79,32,214,128,45,228,103,0,225,115,0,173,197,224,215,5,241,246,13,227,-211,1,47,150,242,247,9,162,22,233,145,6,231,225,16,230,252,0,32,82,-33,119,128,68,128,41,143,215,160,42,224,41,9,96,144,192,41,97,174,231,-55,29,124,25,230,109,9,34,99,144,166,240,53,21,152,122,64,111,241,11,-3,128,213,224,14,0,240,81,28,224,35,5,112,63,240,77,6,64,104,144,-205,2,95,54,48,161,102,33,252,136,191,95,10,96,44,32,11,90,39,2,-50,57,57,32,5,2,55,49,32,162,6,2,95,55,50,192,10,32,70,143,-242,2,62,61,32,2,58,50,57,142,200,2,62,32,58,96,56,32,10,2,-60,32,58,96,79,32,10,2,105,99,109,2,112,32,58,96,99,248,224,1,-155,107,32,71,66,120,224,247,5,107,138,128,253,32,29,131,164,230,165,11,-228,58,7,33,130,166,39,112,101,224,10,4,228,54,4,237,19,0,226,69,-15,32,118,225,183,1,192,148,129,22,91,110,96,160,225,213,9,241,188,5,-64,47,64,42,178,58,225,189,20,100,233,32,43,129,81,2,80,32,58,89,-235,219,197,250,79,2,65,159,242,13,5,2,114,101,97,2,100,58,32,2,-102,97,105,2,108,101,100,132,10,36,229,32,62,252,4,1,192,62,246,210,-3,252,184,0,65,58,35,90,97,28,64,39,160,43,110,109,148,17,187,118,-48,115,219,111,224,11,4,32,106,129,228,228,208,2,227,204,1,230,200,0,-125,140,32,52,2,57,32,102,230,132,1,36,190,2,46,47,108,2,105,98,-47,2,84,101,120,2,116,47,82,32,201,2,47,76,101,2,120,46,104,2,-115,92,51,2,52,38,44,2,54,57,58,2,49,34,32,168,206,96,138,32,-107,226,66,1,64,13,226,56,0,160,178,105,200,163,138,91,158,64,195,163,-137,162,43,199,52,142,16,231,63,17,200,230,233,16,1,32,79,187,243,160,-85,32,5,231,25,0,224,38,10,224,123,2,64,170,230,106,0,225,190,5,-2,105,110,105,2,116,58,32,2,91,93,34,209,178,230,21,1,224,114,3,-198,69,224,115,1,32,82,130,161,243,71,2,2,115,101,113,192,213,128,19,-224,16,2,114,186,192,252,195,1,32,68,162,200,69,118,2,50,51,49,196,-15,253,182,11,2,35,108,105,2,110,101,34,194,98,103,117,255,244,15,2,-123,45,35,2,32,76,73,2,78,69,32,244,161,2,71,148,77,177,93,129,-64,7,85,191,32,206,98,69,224,57,1,2,32,35,45,2,125,34,32,160,-155,131,57,225,21,4,95,163,176,168,65,15,144,167,64,78,64,72,208,214,-131,205,32,155,2,50,50,51,240,73,1,160,25,95,153,96,16,32,96,212,-179,231,187,0,225,123,1,204,24,98,82,229,208,0,2,58,50,55,243,177,-0,236,24,12,95,195,238,2,17,236,52,9,149,96,32,86,227,175,0,160,-139,210,185,107,121,2,50,55,54,230,247,1,171,53,162,205,177,183,96,166,-238,63,0,224,51,0,224,186,2,180,230,64,127,198,157,128,81,32,124,131,-193,139,207,237,104,1,224,43,3,224,42,0,191,87,2,50,55,52,107,208,-32,29,133,47,65,214,212,134,2,50,55,50,135,69,33,125,32,25,197,192,-225,94,0,137,28,233,194,0,225,125,8,245,182,1,192,127,254,80,5,64,-84,130,252,33,102,116,241,225,30,0,32,25,130,209,202,248,32,34,127,228,-2,50,55,48,240,86,0,36,190,96,20,193,28,32,52,194,106,2,95,53,-32,2,64,95,52,32,4,32,19,130,29,117,110,66,118,224,1,1,234,84,-2,2,58,50,54,130,16,66,137,224,37,5,224,39,4,64,40,129,226,32,-99,66,153,121,176,2,95,50,48,96,106,2,54,55,32,224,205,3,151,142,-32,32,32,25,129,111,100,6,36,214,32,16,129,103,2,95,49,51,2,52,-32,75,32,117,246,226,3,92,130,32,62,157,167,131,244,64,107,64,17,227,-97,2,2,32,97,116,2,32,108,105,2,110,101,32,203,255,226,54,0,128,-63,43,54,38,150,218,118,224,66,12,2,99,111,108,192,61,130,42,224,57,-8,65,204,32,135,224,61,11,2,92,49,48,2,38,32,32,2,32,32,117,-2,115,101,100,2,32,98,121,2,32,32,34,162,97,64,62,2,50,54,52,-235,177,3,32,20,76,8,96,20,32,70,40,175,128,11,33,7,130,85,32,-15,2,50,32,67,235,243,1,67,79,151,46,2,50,54,51,227,221,18,134,-158,238,14,0,32,45,130,54,64,36,65,121,102,226,105,165,32,26,130,28,-2,90,32,85,97,128,199,163,37,4,2,75,32,95,230,210,9,2,99,112,-112,2,104,115,115,2,114,99,47,2,109,97,108,33,40,2,109,45,119,2,-97,108,108,2,97,99,101,2,45,117,110,2,105,118,101,2,114,115,101,2,-47,99,112,32,33,2,45,49,46,2,50,48,46,2,57,47,99,64,12,198,-243,2,55,57,58,166,243,2,58,50,53,130,88,72,242,128,147,96,110,160,-147,65,101,32,28,2,75,32,58,2,50,53,55,161,9,2,53,49,32,32,-4,98,80,2,53,54,32,96,19,2,52,50,32,70,114,2,53,50,32,34,-107,2,53,52,32,65,69,73,205,96,38,71,218,34,111,224,11,0,66,150,-138,138,96,6,194,101,129,57,225,194,4,2,69,120,105,2,116,83,117,2,-99,99,101,2,115,115,34,228,92,2,32,62,33,115,104,213,2,51,32,95,-67,162,196,224,226,7,11,64,68,2,70,97,105,2,108,117,114,166,85,224,-36,1,228,89,2,98,3,64,22,64,241,43,159,162,29,162,24,160,210,98,-24,96,11,32,186,130,24,175,215,244,69,0,148,201,68,213,160,16,128,73,-32,47,164,73,49,190,33,95,2,50,48,55,66,38,224,167,3,2,83,121,-115,2,116,101,109,2,46,69,120,2,105,116,34,237,137,4,64,17,2,67,-111,100,128,189,194,91,32,80,196,128,108,203,64,153,64,152,110,123,2,95,-52,49,97,157,130,80,224,73,1,130,10,32,71,32,27,130,94,32,52,2,-56,32,95,2,51,51,32,32,18,68,15,168,230,36,210,192,80,33,208,67,-233,72,103,66,196,129,104,32,44,228,101,0,2,50,52,52,228,252,0,64,-33,32,27,130,41,104,193,68,227,155,199,32,23,130,45,2,94,112,117,2,-116,98,32,32,14,229,202,1,179,133,219,166,108,248,69,63,66,77,237,65,-1,251,50,4,133,181,64,28,107,121,32,78,197,255,35,62,96,173,224,62,-0,32,27,129,124,229,60,1,216,118,96,37,98,129,165,193,2,95,51,54,-137,123,229,210,0,32,75,34,3,138,206,90,251,33,47,229,217,2,2,50,-52,48,160,126,129,108,233,121,8,2,104,101,97,139,48,106,74,64,45,190,-23,231,131,1,250,189,0,233,99,0,129,1,248,192,7,248,74,2,224,5,-3,200,126,128,145,236,173,6,225,85,0,236,24,1,96,40,32,5,97,89,-224,42,1,128,6,224,38,0,224,87,6,160,47,252,65,1,65,204,204,212,-100,201,224,109,1,96,185,241,91,3,32,6,34,46,251,196,3,121,211,241,-97,5,233,189,0,111,128,32,115,225,67,1,2,45,79,34,169,112,64,71,-241,163,1,242,117,2,224,52,10,2,45,115,116,2,114,105,112,2,45,101,-111,2,108,34,32,203,155,224,188,128,254,21,1,224,192,23,199,62,225,169,-255,225,169,105,247,90,1,96,69,236,138,12,2,45,45,104,2,97,115,104,-2,101,115,34,242,148,2,227,134,255,227,134,255,225,169,255,227,134,48,72,-253,146,43,224,6,3,236,90,3,241,123,2,167,43,223,145,161,180,231,100,-1,193,250,241,161,0,248,99,2,246,214,6,123,134,251,60,3,96,51,251,-128,1,137,50,179,237,160,33,160,99,255,167,1,224,117,4,146,64,179,45,-247,126,1,232,234,7,225,46,0,234,95,0,96,137,238,162,2,237,253,2,-196,164,255,130,14,192,195,224,39,1,224,177,3,244,196,2,239,24,3,146,-183,224,172,17,239,49,7,248,34,0,97,135,225,81,11,98,35,229,66,13,-2,111,34,32,192,65,2,82,32,64,171,235,96,91,224,254,4,128,10,81,-32,251,94,0,197,107,225,203,9,129,169,226,15,1,226,3,0,250,214,1,-225,242,20,243,197,28,216,95,251,6,3,224,178,4,192,12,96,180,33,2,-2,57,32,35,225,49,3,225,187,33,128,196,226,114,0,115,107,225,192,3,-243,94,25,2,97,110,115,2,105,34,32,224,120,4,224,78,5,224,72,31,-2,116,114,97,2,100,105,116,2,105,111,110,2,97,108,34,244,159,2,246,-3,0,224,61,21,2,115,116,100,224,133,2,214,32,32,53,75,90,2,51,-53,32,78,64,97,44,142,146,224,34,21,110,172,226,123,53,2,120,34,32,-226,123,2,229,48,2,224,77,44,2,105,110,99,2,108,117,100,174,111,226,-207,10,244,210,17,2,45,45,105,128,59,2,61,34,32,225,30,2,225,243,-0,225,161,2,250,231,3,224,139,18,2,80,34,32,226,60,7,224,69,9,-244,74,8,133,202,224,70,2,2,67,34,32,97,132,224,30,15,128,31,225,-53,52,2,65,34,32,225,131,9,224,250,51,2,45,104,101,2,108,112,34,-228,170,1,224,73,50,81,81,34,235,224,76,60,224,75,7,195,131,255,117,-10,250,87,4,228,22,17,245,74,0,238,34,0,100,135,225,169,1,135,181,-231,147,3,195,71,115,81,133,76,192,18,123,157,229,95,0,234,245,21,224,-203,9,224,45,65,225,189,4,227,255,7,92,54,227,255,7,224,78,21,2,-110,111,108,248,89,0,232,81,1,2,50,51,52,178,238,132,106,225,35,2,-225,46,3,104,109,224,85,9,2,68,85,73,96,80,2,58,50,51,145,61,-32,79,81,224,2,85,32,90,249,12,0,96,5,96,103,213,162,64,188,224,-43,3,185,130,128,46,224,41,1,32,40,211,115,224,40,0,130,16,224,35,-0,32,34,215,41,160,34,2,75,32,66,224,119,3,97,48,231,173,0,32,-46,241,116,1,249,170,10,32,31,145,69,2,85,32,58,64,80,128,10,123,-233,83,40,177,240,2,51,48,32,130,228,64,22,214,209,176,203,158,224,229,-181,0,192,18,40,74,64,21,225,168,1,241,205,7,101,26,75,70,224,168,-0,209,41,194,208,51,233,40,122,147,237,145,139,245,105,0,65,107,103,85,-131,32,33,166,123,18,2,35,49,32,128,77,96,192,64,30,215,103,89,191,-32,17,129,134,121,206,32,13,129,107,96,31,152,107,64,195,242,53,0,181,-237,75,212,96,19,242,69,0,32,19,251,116,0,96,246,128,230,32,22,179,-241,32,162,32,156,32,139,34,175,66,186,189,132,64,6,32,30,59,59,2,-117,97,108,33,110,64,33,161,96,2,49,57,32,225,96,0,41,111,224,22,-0,96,86,64,28,247,223,1,86,253,247,223,0,64,32,247,223,0,191,219,-128,139,64,38,32,25,2,82,32,95,183,240,64,28,243,124,2,129,135,217,-147,64,158,32,66,243,24,53,91,120,96,72,252,146,14,2,116,97,105,136,-56,97,125,64,45,128,213,51,72,32,41,126,60,2,50,49,49,96,27,129,-41,2,73,32,58,96,16,246,112,2,2,48,56,32,64,252,132,5,118,112,-128,56,150,112,192,11,97,39,148,182,64,6,214,112,52,150,64,174,160,61,-39,144,224,155,1,2,101,114,114,2,111,114,58,152,49,181,246,96,38,2,-58,50,48,163,230,245,198,16,2,67,111,110,2,116,114,111,2,108,46,69,-64,66,245,200,6,64,18,2,67,97,108,128,246,245,201,1,64,197,125,28,-163,18,67,225,192,7,230,100,1,173,64,107,122,99,46,65,112,2,50,48,-52,220,71,171,133,98,11,32,4,169,53,118,15,64,99,194,221,130,181,32,-16,194,0,248,182,19,252,142,0,66,95,223,124,225,198,5,2,109,100,53,-2,67,111,109,2,98,105,110,2,101,58,32,2,101,109,112,2,116,121,34,-163,248,2,67,32,80,253,72,0,96,171,102,174,72,104,68,254,32,19,2,-57,52,32,32,97,64,114,92,17,88,127,166,232,66,144,237,5,1,194,148,-236,101,3,224,255,2,96,19,199,31,32,15,66,117,65,39,88,26,100,5,-2,95,56,56,67,7,2,57,55,32,251,36,2,65,54,86,138,32,189,2,-65,114,114,2,97,121,32,32,18,226,129,0,226,242,0,66,69,96,161,32,-62,100,185,100,141,247,26,1,158,31,246,253,0,2,48,48,32,224,46,4,-169,241,192,46,2,95,57,51,172,10,195,37,32,50,164,162,32,126,226,228,-1,64,20,151,63,32,210,172,19,229,0,10,246,25,2,238,100,0,225,58,-0,233,230,13,32,67,55,138,128,67,32,134,32,222,65,34,32,174,2,51,-32,35,96,82,238,128,7,239,42,5,224,236,1,64,62,2,57,57,32,224,-45,5,96,96,204,188,229,132,6,254,15,5,228,38,0,224,43,11,194,135,-224,38,0,160,16,33,24,253,42,10,206,254,2,58,49,57,163,154,2,49,-49,51,32,4,2,57,54,32,2,64,95,53,162,4,129,254,2,35,56,32,-32,85,72,51,32,44,131,115,2,35,49,54,2,32,58,49,64,28,128,57,-2,52,32,80,37,87,97,251,98,59,96,69,2,49,49,53,96,5,67,235,-64,16,64,11,68,236,160,11,111,17,160,11,2,57,53,32,224,11,1,89,-85,96,12,153,85,97,36,41,216,170,58,131,12,238,183,2,248,227,4,242,-95,3,65,253,98,54,33,5,71,93,64,242,32,13,162,249,32,9,32,104,-64,23,70,213,192,23,241,187,1,95,23,224,29,7,224,53,16,88,100,36,-50,193,86,192,68,224,151,0,67,140,2,83,32,67,224,147,2,224,93,10,-128,161,170,130,33,58,224,31,6,130,110,199,155,96,235,32,73,2,56,55,-32,224,142,11,128,16,96,52,32,105,33,78,199,127,2,75,32,75,2,52,-32,90,160,167,32,23,131,208,128,155,171,7,128,163,162,247,95,63,227,54,-1,97,133,160,34,2,64,95,54,111,175,96,206,77,150,253,106,8,2,46,-47,108,2,105,98,47,2,68,97,116,2,97,47,73,2,110,116,101,2,103,-101,114,2,95,84,121,2,112,101,46,189,77,2,50,56,58,189,77,160,69,-2,57,48,32,32,4,96,225,58,140,128,189,192,18,42,84,32,133,224,5,-0,252,126,0,224,60,6,161,72,32,4,2,89,32,67,196,8,69,229,64,-171,128,199,96,218,243,204,1,98,164,2,56,48,32,235,42,2,98,189,128,-18,227,86,1,35,21,2,54,32,35,103,14,98,162,157,222,96,113,32,10,-2,65,32,58,96,166,103,177,32,10,232,125,0,71,150,2,49,56,55,135,-81,72,83,65,38,164,177,96,16,231,150,1,2,49,54,56,99,180,231,150,-1,224,56,0,67,30,192,11,97,106,64,11,32,63,131,128,64,254,74,117,-226,7,1,2,56,52,32,96,31,198,172,33,17,129,37,2,56,51,32,165,-246,34,146,227,20,1,96,47,224,15,8,64,65,233,183,9,96,28,101,103,-179,176,173,91,2,55,55,32,162,188,2,55,56,32,162,204,172,106,224,21,-2,128,159,173,56,2,49,56,48,233,4,2,2,56,49,32,96,19,105,231,-96,169,65,27,61,113,32,12,129,101,159,227,96,40,161,126,64,64,161,76,-64,83,235,119,0,96,109,170,69,97,214,172,43,32,4,224,14,6,192,189,-167,248,96,150,74,111,128,207,32,72,164,228,74,142,160,42,69,39,2,55,-53,32,224,42,2,64,60,32,42,172,83,64,42,64,11,32,24,99,124,64,-43,32,23,2,47,61,32,32,11,163,112,33,17,66,87,65,66,97,68,44,-71,138,99,37,163,235,240,7,236,5,5,210,235,236,5,5,236,7,1,132,-240,164,172,139,62,106,82,128,17,32,175,192,17,32,140,129,99,231,16,3,-192,9,192,59,108,144,171,14,96,60,101,240,39,81,32,13,226,239,1,32,-15,234,31,0,141,73,32,50,233,222,3,2,110,111,32,2,109,97,116,2,-99,104,32,2,97,116,32,182,166,64,32,96,7,43,13,226,245,0,74,51,-128,11,2,58,49,54,234,51,32,2,120,99,101,2,112,116,105,2,111,110,-46,68,102,2,114,110,97,106,41,224,39,1,2,80,97,116,64,22,2,77,-97,116,2,99,104,70,203,62,234,71,0,99,118,129,5,38,79,191,198,2,-49,50,55,234,47,3,2,49,51,50,199,206,160,15,66,3,99,219,2,54,-51,32,245,209,2,87,154,242,165,7,79,15,215,251,202,91,98,163,32,204,-129,53,2,54,53,32,128,16,205,57,32,10,195,120,128,24,130,53,161,95,-85,88,240,208,3,79,67,65,220,64,117,42,45,128,15,99,116,32,79,161,-138,152,48,197,54,224,39,3,161,138,225,46,1,2,39,92,57,2,50,38,-39,2,39,34,32,160,28,129,159,169,132,224,99,0,100,33,138,129,224,17,-3,139,117,233,57,3,224,168,1,32,169,96,35,134,67,64,156,206,192,132,-218,64,158,130,166,96,101,224,147,3,64,146,70,52,240,134,2,33,21,226,-190,3,73,194,227,26,3,135,114,166,171,44,179,99,108,161,162,33,145,69,-183,129,145,212,96,65,163,165,73,32,46,104,243,2,49,53,57,134,23,75,-148,131,4,2,90,32,95,2,49,54,48,226,64,2,224,163,5,224,160,0,-2,67,32,79,192,96,136,152,138,15,120,26,225,22,7,96,0,2,79,32,-80,54,232,241,36,3,64,79,2,97,34,32,192,27,32,124,224,27,5,2,-98,34,32,192,27,70,204,224,28,5,2,102,34,32,224,28,0,32,174,224,-28,5,146,73,128,28,33,67,224,28,5,109,125,128,28,32,253,224,27,5,-2,116,34,32,224,56,0,32,252,224,28,5,2,118,34,32,224,56,0,224,-143,8,64,3,96,31,250,151,2,33,193,132,80,69,201,65,76,165,24,157,-232,2,49,53,48,35,56,108,16,65,144,32,196,2,35,53,55,132,24,196,-109,2,53,53,32,2,58,49,53,202,191,238,155,0,225,189,0,115,145,100,-82,96,17,32,43,206,50,104,19,235,211,0,207,139,2,49,53,54,32,49,-37,162,138,198,248,128,1,185,64,64,30,64,69,131,183,64,67,226,230,2,-75,52,140,33,192,64,97,121,226,96,9,64,69,104,121,203,111,192,40,226,-52,3,224,10,1,96,50,106,46,235,242,1,96,250,129,28,128,74,32,201,-224,74,5,32,165,132,76,2,111,114,100,65,36,132,78,2,99,104,114,64,-12,210,172,106,10,234,12,1,32,193,135,101,224,175,1,67,254,134,43,33,-88,225,159,10,101,23,225,159,0,134,45,32,43,129,203,2,60,61,32,32,-11,204,124,198,68,64,60,161,243,64,16,97,186,32,106,32,13,129,86,131,-203,177,87,238,193,3,32,33,167,96,64,16,32,13,177,106,103,153,41,66,-65,235,108,59,67,84,199,111,64,17,32,11,2,61,61,32,32,11,160,194,-128,196,68,139,67,205,83,218,131,248,130,46,231,60,0,34,56,192,15,32,-59,242,102,0,2,49,51,56,64,23,69,60,32,22,211,110,32,16,32,156,-66,72,2,58,49,51,210,106,199,219,194,70,106,219,160,10,231,147,0,238,-35,0,192,32,254,34,1,196,203,242,106,1,97,20,224,65,4,224,64,5,-196,79,136,24,129,214,181,54,247,10,1,192,169,66,95,32,30,240,226,6,-96,30,172,43,115,240,97,33,178,244,180,241,32,19,226,67,0,192,53,240,-7,0,240,180,0,70,129,161,44,65,74,82,79,79,174,32,14,167,121,181,-28,80,78,2,83,116,114,2,105,110,103,33,164,181,25,163,52,110,198,84,-130,176,67,115,64,128,26,77,136,144,27,2,95,53,32,128,78,161,140,128,-39,32,55,106,113,33,227,160,31,180,202,2,110,101,119,2,67,65,83,96,-111,2,76,101,110,32,114,180,208,224,223,4,180,214,75,215,244,207,2,35,-48,109,87,32,20,237,80,1,239,82,9,180,217,160,49,171,54,180,215,139,-74,224,51,7,64,31,129,12,107,56,32,13,229,14,0,128,2,126,115,100,-51,64,5,98,123,180,226,239,214,14,180,239,233,209,3,84,188,84,53,79,-134,224,27,11,96,120,180,242,149,207,224,188,0,180,247,2,114,101,109,33,-16,180,227,253,62,1,247,20,0,253,85,5,224,20,1,224,17,8,224,14,-5,247,86,14,160,200,225,76,1,225,55,12,181,2,2,79,32,58,100,39,-68,17,46,237,42,49,114,186,192,7,2,95,57,57,211,54,2,95,49,48,-68,49,192,11,72,107,192,11,73,218,192,11,100,227,69,77,32,87,129,140,-2,94,112,111,2,107,101,87,133,80,181,17,2,94,112,101,2,101,107,87,-128,18,180,227,171,177,32,65,136,213,118,99,64,90,225,86,3,162,69,180,-94,224,50,1,143,232,160,50,246,107,1,32,18,169,127,69,200,32,13,141,-223,180,94,2,116,111,73,2,110,116,32,32,14,129,41,2,116,111,80,2,-116,114,32,32,14,194,112,225,201,4,179,48,175,239,210,243,252,126,0,96,-126,135,14,101,123,103,114,2,95,56,51,64,60,106,138,179,101,240,73,8,-178,100,201,130,2,95,57,56,140,221,128,65,32,7,64,67,2,95,56,52,-96,133,178,115,230,129,7,178,93,79,128,114,111,72,243,2,58,57,55,96,-20,2,113,117,111,32,227,178,22,226,122,93,177,52,242,96,3,243,202,2,-2,95,57,49,228,150,0,224,21,1,244,188,12,243,185,3,2,58,57,52,-197,40,73,37,2,95,53,49,64,227,129,170,2,94,102,114,2,101,101,32,-2,58,57,50,227,251,2,224,91,6,85,92,149,155,253,75,1,245,89,1,-187,52,80,126,224,116,3,2,58,57,49,227,240,6,230,85,1,250,125,4,-180,56,68,220,244,211,11,166,85,230,114,0,224,119,1,32,146,172,116,202,-223,48,155,250,78,6,103,28,177,25,33,249,2,51,32,90,227,202,3,2,-58,56,57,96,25,76,82,2,83,32,80,96,155,79,173,213,162,44,242,80,-206,65,113,130,78,224,95,7,96,94,177,81,229,100,3,229,18,0,177,45,-58,57,2,32,58,56,227,91,2,72,217,162,170,214,252,226,175,7,177,6,-247,195,6,2,117,110,100,2,101,102,105,2,110,101,100,74,216,2,58,56,-52,229,223,20,240,207,0,41,194,99,196,106,107,106,162,74,149,234,146,12,-78,41,234,142,2,72,78,64,1,2,95,55,53,224,37,3,234,111,2,64,-37,96,19,96,10,2,95,56,49,65,18,198,87,162,154,64,114,75,191,128,-130,64,45,161,65,32,20,32,12,97,123,230,115,1,132,4,96,175,65,112,-179,65,217,100,132,182,64,30,131,29,224,35,1,224,55,11,225,10,0,186,-141,43,253,131,230,118,57,224,13,0,72,21,225,105,6,180,62,2,58,32,-117,2,110,115,117,2,112,112,111,2,114,116,101,2,100,32,119,69,118,2,-115,105,122,158,155,32,54,2,55,54,56,64,250,59,58,2,55,52,56,2,-51,54,52,68,61,178,32,244,13,2,253,23,1,201,6,226,230,0,212,0,-81,243,129,20,65,146,32,196,161,33,129,143,2,56,32,35,97,98,66,111,-178,116,2,105,110,118,2,32,58,55,130,123,2,115,104,114,32,11,130,107,-74,118,178,21,230,191,15,178,28,227,16,0,165,10,178,39,2,95,54,48,-183,88,80,16,2,95,54,54,64,4,66,51,116,43,81,33,2,95,55,49,-236,119,0,65,65,107,173,241,216,1,251,5,4,87,47,89,13,240,130,0,-177,208,224,29,1,224,49,1,224,39,5,229,244,0,227,181,7,177,249,2,-62,61,32,2,58,54,57,128,10,32,9,129,9,75,255,176,227,2,60,32,-58,176,220,2,105,99,109,2,112,32,58,176,222,107,187,78,4,2,95,54,-51,32,102,176,230,75,184,175,219,65,64,174,36,50,103,174,35,229,253,93,-174,101,233,94,13,174,116,2,110,101,103,2,32,58,53,128,237,2,42,32,-58,174,24,2,45,32,58,173,124,2,43,32,58,173,121,224,156,68,2,58,-53,52,224,155,7,193,143,173,195,171,3,75,65,66,50,116,25,67,144,166,-112,32,39,169,42,85,94,173,174,53,68,173,172,64,54,66,100,99,65,173,-175,32,29,173,174,64,9,128,232,2,94,109,97,2,108,108,111,2,99,32,-58,173,152,2,73,79,46,2,112,101,114,2,102,111,114,2,109,73,79,32,-20,236,54,9,173,153,50,224,173,151,224,227,14,2,58,52,50,229,159,1,-114,166,2,95,52,48,64,63,232,124,1,214,142,173,129,2,114,97,105,2,-115,101,32,2,58,51,57,192,162,172,245,2,65,46,114,2,101,97,100,32,-14,128,177,32,161,2,103,101,116,2,65,114,103,2,82,101,102,32,20,174,-79,43,236,2,95,51,52,32,95,172,233,32,37,2,115,116,100,62,205,32,-34,163,135,96,34,32,148,2,58,51,51,224,34,2,2,111,117,116,32,34,-161,74,44,126,2,58,51,49,224,127,0,176,164,64,56,76,96,2,58,50,-57,224,56,2,2,105,110,32,2,58,50,56,252,186,0,128,156,117,250,231,-131,4,2,58,50,54,224,35,0,163,49,72,13,67,48,96,35,70,162,74,-43,172,112,32,91,2,62,62,32,2,58,50,51,160,122,74,55,128,33,45,-115,200,145,91,131,154,80,91,129,160,9,160,85,32,73,232,123,0,71,246,-111,236,175,30,107,15,111,223,236,155,1,73,232,64,32,117,50,192,32,2,-95,56,32,124,117,128,132,2,55,32,58,172,138,224,47,7,96,150,151,38,-151,241,247,202,1,231,73,6,194,220,172,133,120,69,48,89,227,3,5,202,-136,247,96,0,138,135,75,187,224,12,4,96,212,176,80,235,33,2,142,234,-237,131,1,248,238,0,166,172,2,51,32,66,71,122,161,13,151,253,76,82,-154,17,238,121,1,114,65,129,4,2,58,57,32,176,233,235,252,0,69,75,-162,217,2,58,54,32,161,179,2,114,101,116,2,117,114,110,35,125,225,196,-1,36,246,128,199,36,245,227,41,3,228,44,41,2,58,50,32,227,104,19,-227,80,0,44,35,64,15,64,200,38,107,249,13,1,224,0,255,224,0,255,-224,0,112,1,32,125,-};-unsigned char *combexpr = data;-int combexprlen = 27646;+122,76,90,49,82,118,0,0,25,118,55,46,48,10,55,56,54,10,65,32,+95,48,32,95,50,52,32,64,95,50,54,32,95,51,55,32,8,4,51,57,+32,64,64,224,22,4,1,52,50,224,22,13,64,8,128,22,1,49,49,192,+23,6,50,49,32,64,67,39,32,224,17,0,1,64,66,32,7,0,55,32,+15,0,50,160,15,3,64,83,32,83,32,10,64,19,1,50,50,32,60,2,+95,49,55,32,42,20,49,55,51,32,64,102,114,111,109,85,84,70,56,32,+34,45,45,99,112,112,34,64,45,1,64,73,64,95,2,50,52,54,64,12,+32,75,224,105,1,1,52,56,32,18,2,83,39,32,32,2,192,150,0,64,+32,122,1,66,32,64,113,0,53,64,17,32,182,64,145,224,105,22,6,118,+101,114,115,105,111,110,128,109,96,187,192,77,64,72,1,54,53,32,207,32,+53,0,53,32,53,96,5,224,69,2,3,79,32,35,51,32,99,0,75,64,+57,32,41,96,162,32,8,0,55,64,234,64,31,64,236,224,159,57,2,104,+101,108,161,10,224,156,12,65,19,224,150,5,224,60,1,6,85,115,97,103,+101,58,32,128,61,224,197,15,224,46,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,96,96,224,87,17,2,92,57,38,32,2,9,91,45,45,110,+111,109,97,99,114,111,32,93,64,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,97,36,4,+115,116,114,105,112,96,58,96,9,3,45,101,111,108,96,13,5,104,97,115,+104,101,115,128,109,4,97,121,111,117,116,96,10,3,117,110,108,105,224,95,+2,224,79,8,0,32,98,135,3,32,115,116,100,64,7,3,45,111,112,116,+34,40,1,115,32,96,59,7,105,110,99,108,117,100,101,61,65,4,4,110,+97,109,101,93,161,163,226,2,8,3,66,32,67,32,33,184,0,83,99,23,+128,8,160,9,160,12,96,13,224,29,0,0,39,97,219,32,52,224,8,7,+32,6,98,59,226,75,0,0,66,98,90,226,74,3,0,55,64,23,128,71,+224,38,3,163,130,98,46,160,15,226,50,17,6,110,107,110,111,119,110,32,+128,235,162,58,64,195,67,211,98,62,1,50,55,64,70,224,67,19,5,44,+32,102,111,114,32,34,49,1,105,100,160,71,4,115,32,116,114,121,226,135,+6,226,119,2,130,228,225,135,0,225,67,3,2,54,32,35,36,81,192,0,+64,135,97,10,225,7,2,64,153,225,4,1,96,167,0,54,32,13,1,56,+48,65,18,0,57,32,171,96,64,228,185,1,193,9,224,127,1,11,65,116,+32,109,111,115,116,32,111,110,101,32,34,26,3,112,117,116,32,99,8,20,+40,45,79,41,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,+100,130,137,224,157,1,64,116,128,0,131,235,33,201,97,98,68,228,0,55,+37,79,161,144,0,66,161,189,1,50,53,197,24,3,64,95,55,53,68,50,+1,95,50,69,27,1,49,56,68,206,194,11,128,26,32,20,96,64,96,42,+64,9,32,6,64,37,32,6,101,117,0,55,32,231,96,28,0,56,96,79,+128,0,2,58,55,56,32,220,37,217,0,89,66,59,32,3,226,129,1,98,+65,64,5,226,100,0,32,144,0,51,33,58,128,188,128,122,224,9,12,160,+65,66,138,32,50,0,55,32,176,32,182,0,57,130,116,96,6,32,22,64,+111,1,80,32,69,12,192,119,161,16,64,251,128,65,2,32,61,61,65,142,+129,208,64,125,0,85,160,25,37,214,64,209,193,250,224,82,41,129,133,224,+82,68,195,189,224,82,22,1,95,55,99,15,225,255,0,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,32,25,39,86,0,56,67,78,33,81,1,35,52,+160,134,224,44,5,192,63,224,64,7,32,103,64,208,224,62,1,0,55,224,+218,1,195,99,128,104,226,192,4,164,132,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,35,45,1,55,+56,68,93,1,51,52,192,77,224,133,7,224,82,1,164,143,64,128,224,127,+7,224,52,1,97,72,224,51,3,160,26,96,53,104,160,32,54,130,13,36,+48,200,75,64,222,227,42,1,225,96,6,131,140,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,35,+200,35,214,35,200,0,83,166,40,98,130,0,55,36,115,73,67,96,131,64,+162,224,173,16,97,105,96,38,224,167,13,96,100,132,16,201,163,132,131,100,+22,0,55,100,187,136,174,33,50,0,85,99,50,96,78,132,214,37,109,101,+96,233,13,4,65,187,96,39,32,0,2,85,32,65,163,30,0,56,99,58,+224,120,0,32,121,229,209,1,224,193,30,2,66,32,90,128,198,224,196,7,+68,235,101,142,160,189,32,110,225,93,0,195,213,226,129,11,0,83,64,212,+227,8,14,99,248,225,18,4,160,12,0,55,134,83,2,55,49,52,160,43,+230,253,12,3,47,92,57,50,230,199,1,128,137,65,1,1,50,51,192,98,+233,232,14,200,81,128,59,165,252,224,135,7,1,55,56,64,64,1,50,51,+71,23,101,184,203,35,32,97,1,54,49,202,74,70,19,68,157,34,67,32,+100,34,67,0,79,98,100,224,118,12,169,148,134,215,1,55,54,70,74,224,+45,20,73,173,192,44,65,75,224,44,18,233,216,1,192,48,66,188,224,48,+18,224,44,5,64,255,224,44,18,74,28,160,42,0,55,65,10,224,42,18,+106,12,192,86,65,31,224,43,23,74,56,192,47,65,121,224,47,18,138,90,+192,136,66,218,225,17,19,106,124,192,44,65,162,224,44,18,106,158,192,43,+66,149,225,151,20,2,119,97,114,140,196,32,44,65,196,195,136,200,21,32,+108,34,8,67,205,134,219,38,213,32,21,32,175,224,21,0,64,142,128,21,+33,78,32,21,64,19,32,73,34,93,0,58,99,86,96,40,38,247,69,167,+45,255,1,50,51,65,117,32,26,33,32,224,67,0,64,255,96,67,68,36,+96,67,34,243,34,38,0,75,32,7,0,51,64,118,32,25,34,4,100,214,+224,1,8,37,150,0,55,68,28,64,101,64,92,141,28,1,55,54,64,112,+130,153,224,26,14,134,85,224,27,13,205,150,224,19,3,101,144,224,18,5,+100,250,107,80,0,50,106,229,224,27,7,224,17,5,132,100,224,112,12,98,+139,224,47,6,98,22,224,18,6,136,61,224,18,4,228,121,0,224,84,9,+96,252,33,59,137,219,65,105,32,34,129,153,134,37,32,18,32,148,128,17,+131,243,32,17,32,184,128,17,129,252,32,17,32,249,128,17,129,248,32,17,+225,225,0,225,244,0,32,99,96,17,64,229,128,17,33,67,128,17,129,234,+32,17,32,98,128,17,193,230,75,8,128,17,129,222,64,162,192,17,224,180,+0,192,179,65,203,80,124,32,79,103,39,199,122,169,40,2,67,32,60,69,+136,161,145,224,25,9,138,65,224,26,13,97,67,139,135,231,202,0,160,26,+162,64,34,158,0,85,101,248,233,235,1,64,25,130,167,32,26,162,168,129,+224,32,44,96,161,136,166,234,29,5,160,49,128,37,134,66,133,125,230,127,+1,224,132,9,170,135,224,87,15,107,83,224,87,20,224,59,17,108,231,224,+59,9,2,55,54,50,67,134,144,99,224,160,3,225,67,15,96,33,224,189,+13,98,219,225,66,12,136,13,225,66,14,224,44,6,146,51,224,43,9,224,+116,13,168,148,224,70,9,137,44,224,114,29,109,62,224,114,11,225,3,14,+194,70,224,25,9,136,63,224,168,11,178,163,224,124,9,109,230,224,168,30,+64,36,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,105,64,38,179,133,63,68,113,+133,19,69,224,68,196,239,26,2,106,226,234,45,1,204,145,239,32,0,0,+49,111,165,112,240,35,77,203,9,224,16,3,106,232,160,17,71,39,99,113,+96,116,199,115,224,1,9,108,146,237,52,10,224,29,8,224,26,17,224,23,+14,224,20,11,224,17,8,224,14,5,224,11,2,237,221,4,200,59,71,147,+101,192,71,197,2,57,54,32,243,40,2,2,51,52,38,51,26,20,104,115,+115,114,99,47,109,97,108,99,111,108,109,45,119,97,108,108,97,99,101,40,+191,0,105,85,92,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,245,231,0,32,104,134,131,65,+99,0,90,96,1,161,107,0,58,112,241,168,78,75,23,0,90,203,18,32,+25,134,147,0,85,160,49,224,51,3,134,155,241,127,3,65,255,246,154,0,+193,185,130,2,179,55,224,29,0,173,174,0,55,86,103,193,244,66,119,98,+238,243,96,2,32,33,97,243,81,216,87,41,143,21,1,55,53,177,147,0,+80,233,179,15,52,85,0,105,201,176,98,192,108,147,1,95,53,130,195,32,+189,135,71,32,16,50,30,87,153,32,18,135,72,214,68,32,19,96,105,81,+141,0,55,83,82,110,217,64,226,0,53,64,27,179,233,215,48,0,53,34,+172,243,231,2,14,84,70,45,56,47,47,82,79,85,78,68,84,82,73,80,+243,232,0,145,244,244,62,1,87,234,96,209,0,50,99,73,32,16,0,53,+44,102,96,160,135,196,65,170,65,29,32,16,131,99,242,239,4,225,78,1,+32,55,69,247,97,64,224,22,2,160,204,225,77,0,128,93,248,47,2,64,+88,131,71,96,132,73,25,0,55,82,179,32,22,130,150,7,94,102,108,117,+115,104,98,32,32,16,130,62,96,170,97,139,0,58,97,155,131,247,160,216,+225,223,2,45,201,33,80,106,117,79,162,32,14,96,92,0,48,130,87,65,+247,128,57,226,61,13,129,230,0,51,245,99,0,128,238,224,182,1,228,81,+3,98,50,143,191,0,48,115,216,147,205,174,139,112,172,99,118,233,251,0,+1,54,57,138,143,197,95,234,152,1,0,55,66,31,32,5,66,105,98,4,+103,213,64,119,0,53,180,6,245,240,1,43,153,32,100,139,0,203,96,0,+54,82,182,128,63,128,75,64,108,160,6,244,70,0,32,253,163,59,34,147,+35,36,78,96,0,75,46,68,103,230,99,10,32,33,130,159,161,191,76,15,+111,122,160,11,64,144,1,55,51,143,193,64,117,66,170,97,47,32,87,133,+181,0,55,47,15,97,4,162,86,0,55,90,79,32,86,162,227,180,191,227,+111,0,0,79,67,133,177,26,131,140,243,105,1,163,190,240,69,12,179,199,+164,216,115,13,243,4,17,207,82,198,22,145,172,224,119,0,2,64,64,82,+67,198,161,37,245,239,6,128,127,224,122,10,224,39,25,128,117,178,160,64,+40,100,121,98,40,178,44,224,144,27,224,180,28,130,123,33,102,204,53,128,+37,226,104,1,98,107,98,143,243,12,20,148,252,179,4,225,70,1,138,94,+228,102,1,10,98,101,103,105,110,123,99,111,100,101,125,132,97,160,158,161,+253,243,127,4,242,11,2,201,117,225,162,10,224,120,9,241,88,22,2,101,+110,100,224,128,3,224,130,7,226,128,0,228,138,0,97,62,32,29,235,40,+3,247,10,3,225,195,12,103,241,244,20,17,131,9,217,71,64,96,211,213,+47,79,67,28,246,13,0,64,208,49,180,33,19,184,60,147,142,0,52,68,+21,0,51,37,8,2,95,52,56,96,152,32,55,147,70,32,27,142,93,192,+200,224,100,2,64,57,64,199,148,135,100,51,224,241,3,248,22,0,128,114,+0,50,100,0,225,30,0,102,204,192,44,225,52,14,34,72,133,244,1,75,+50,230,6,0,64,55,32,17,199,142,87,61,96,22,208,106,51,202,224,4,+3,96,6,168,111,32,37,133,194,224,37,8,32,4,192,72,64,208,166,119,+167,236,32,19,208,131,0,89,234,174,1,201,223,226,192,7,78,250,42,42,+33,74,65,73,3,95,50,48,48,110,152,162,27,0,82,160,64,213,189,72,+38,250,130,0,128,76,130,12,151,88,251,201,0,251,207,2,224,21,15,248,+32,4,224,43,3,224,15,2,248,48,5,118,248,233,189,2,65,41,233,189,+4,224,67,0,224,53,1,224,154,5,234,209,0,192,83,247,21,4,32,16,+33,120,33,67,69,224,198,57,135,166,252,147,0,99,11,34,162,227,81,1,+6,112,114,111,103,114,97,109,253,51,6,5,99,111,109,109,101,110,146,175,+251,170,4,194,140,227,181,2,245,203,1,102,16,234,164,5,128,228,248,27,+1,224,61,0,107,178,32,51,34,166,97,186,172,138,224,61,3,193,17,161,+14,161,11,224,255,4,133,139,224,249,4,96,253,224,176,41,224,177,53,225,+196,54,254,46,0,235,182,0,67,66,227,83,0,225,198,26,225,176,3,225,+220,13,182,90,225,203,103,163,213,155,164,230,32,2,193,213,227,154,1,224,+70,19,36,20,200,195,161,53,156,252,128,5,230,174,2,230,53,12,76,157,+64,3,193,7,248,166,3,253,65,6,255,7,16,0,76,54,254,223,65,250,+153,0,223,70,0,49,36,233,32,215,198,23,224,71,19,0,58,192,68,129,+65,64,62,224,46,19,0,32,87,118,62,179,63,132,192,126,255,115,10,64,+36,0,46,255,114,4,192,208,97,179,224,10,8,224,113,19,1,73,110,159,+48,224,74,0,226,46,3,140,152,224,66,23,2,32,97,116,128,183,225,47,+163,225,52,2,226,5,193,35,55,171,217,96,1,1,80,32,36,2,67,138,+195,142,168,75,180,101,224,15,0,104,91,201,65,224,219,8,232,128,4,224,+14,0,64,26,32,110,139,241,204,70,90,237,109,2,227,248,0,79,165,108,+84,155,225,0,49,140,208,238,236,0,64,14,71,222,184,64,99,210,0,55,+109,69,1,55,51,114,76,172,216,109,125,236,145,3,237,18,31,96,173,32,+140,0,54,73,169,225,108,2,217,97,32,194,139,77,80,38,1,75,52,240,+136,7,96,32,137,37,32,32,224,30,1,224,32,5,137,52,96,32,96,35,+128,27,32,24,137,54,32,24,0,51,224,57,2,224,59,2,64,35,201,52,+64,1,41,1,227,179,1,134,230,238,152,3,141,74,159,103,224,67,0,208,+253,230,124,6,230,100,1,198,103,230,181,3,134,135,224,35,4,224,41,3,+242,137,5,62,55,229,113,22,7,95,95,70,73,76,69,95,95,227,95,3,+224,91,65,2,76,73,78,224,91,21,166,204,224,91,43,2,68,65,84,224,+91,80,2,84,73,77,224,91,6,232,36,1,170,227,202,51,255,206,2,138,+238,94,18,80,110,233,242,1,114,51,35,65,232,194,1,234,169,6,160,2,+246,115,2,224,2,6,96,112,224,199,7,224,49,2,224,157,15,224,85,0,+224,14,3,207,222,196,94,230,119,9,224,179,12,235,16,17,224,18,2,239,+229,4,145,130,64,3,224,24,3,230,156,0,232,224,1,100,11,150,71,192,+5,153,79,225,40,1,35,61,192,48,73,113,192,195,49,126,0,53,159,230,+40,138,109,244,239,216,0,105,67,253,142,2,245,184,5,192,175,224,22,65,+225,178,13,235,18,0,137,49,1,55,49,144,28,225,101,15,246,119,7,141,+125,226,220,7,128,91,228,20,0,119,55,246,110,4,226,249,11,227,20,0,+206,171,97,51,125,35,1,95,57,65,109,36,175,64,7,1,95,54,155,178,+224,216,6,183,155,105,139,247,171,7,243,156,1,134,78,37,61,160,16,230,+92,7,230,77,8,226,52,15,226,58,3,224,233,2,226,60,1,235,30,5,+226,64,16,227,106,4,98,68,224,56,1,110,253,171,165,1,54,50,98,53,+226,47,6,227,8,13,103,74,247,144,55,11,76,97,110,103,117,97,103,101,+47,80,114,101,43,253,7,99,101,115,115,111,114,47,67,64,34,8,47,77,+97,99,114,111,80,97,115,247,176,0,5,49,53,50,58,50,50,237,228,1,+246,99,5,0,52,52,182,128,9,33,96,230,114,0,32,179,80,57,64,215,+224,168,5,7,37,72,58,37,77,58,37,83,235,104,1,32,37,161,242,226,+151,21,224,114,49,6,100,32,37,98,32,37,89,224,114,39,192,23,81,81,+64,25,64,130,232,223,1,32,67,161,228,224,46,23,54,85,37,228,97,225,+32,52,226,123,1,224,123,14,227,204,2,98,35,245,219,0,64,34,230,50,+2,245,154,3,240,85,6,240,169,34,224,39,12,226,249,0,224,137,9,224,+141,32,224,221,14,224,164,3,132,57,235,31,0,224,234,34,224,137,59,206,+115,233,89,1,233,101,4,250,33,0,246,109,1,249,130,0,193,226,64,85,+0,52,95,131,68,189,174,142,242,102,7,211,177,121,158,246,109,0,248,91,+0,128,148,92,84,70,87,161,33,1,95,54,84,9,129,118,39,207,32,11,+145,172,137,250,72,58,105,250,248,219,4,36,220,139,21,248,146,4,244,219,+0,105,252,96,61,147,54,203,233,59,222,0,54,32,46,227,49,1,76,30,+6,98,114,101,97,107,115,44,77,160,228,92,70,6,72,97,115,104,68,101,+102,76,130,164,93,3,50,53,58,54,131,149,224,138,130,108,127,0,75,156,+43,52,230,64,7,33,57,144,91,156,117,180,132,67,206,252,189,0,192,19,+140,220,228,175,1,1,55,50,43,233,162,172,225,154,4,98,189,89,226,150,+58,91,16,0,48,64,13,34,38,34,58,161,237,140,103,0,73,58,235,64,+41,64,88,2,55,50,49,64,13,140,62,3,94,71,69,84,74,49,3,77,+73,76,76,96,36,140,60,114,12,225,74,1,16,100,101,102,97,117,108,116,+84,105,109,101,76,111,99,97,108,101,64,231,32,44,140,69,32,226,230,221,+0,228,227,3,67,74,91,47,160,216,66,72,130,58,99,21,178,139,173,142,+163,147,221,173,228,85,4,234,19,5,36,93,33,47,71,50,160,40,236,98,+3,248,85,4,227,213,5,86,39,131,156,224,57,2,224,132,6,224,112,1,+224,9,8,0,39,237,38,5,173,53,242,97,3,192,7,246,66,4,224,5,+3,246,78,27,244,150,7,229,85,3,235,14,3,172,35,137,17,41,105,237,+222,1,233,88,1,124,32,225,17,19,32,135,234,100,10,191,39,225,146,1,+230,69,0,185,73,232,107,3,238,7,5,233,204,3,225,3,51,234,16,4,+198,120,230,103,10,234,41,12,225,23,14,234,100,5,225,29,26,35,57,225,+29,2,224,126,4,96,231,233,137,0,64,184,251,58,0,225,28,1,235,11,+3,226,215,2,237,66,24,230,209,0,231,142,6,239,72,9,245,51,11,96,+214,234,41,0,235,50,2,148,255,2,95,54,55,225,196,0,220,103,239,47,+13,235,207,6,238,122,15,227,89,4,231,50,5,224,85,10,225,214,3,226,+151,31,192,199,64,49,182,11,246,229,8,245,215,1,0,49,75,192,245,216,+3,224,54,3,224,53,16,246,13,7,224,52,3,38,88,225,187,2,158,138,+129,237,160,6,135,93,224,38,2,64,16,252,24,1,101,170,163,58,92,190,+82,68,32,33,96,53,226,198,1,226,186,17,226,172,3,251,117,2,226,105,+1,37,90,218,204,231,211,36,0,53,99,112,32,61,134,153,127,253,103,210,+128,214,0,67,76,115,197,187,134,168,239,134,0,192,170,237,63,3,240,71,+3,133,225,252,44,0,0,55,72,132,32,5,156,9,0,48,98,136,0,55,+136,204,237,25,3,184,207,32,252,243,51,8,251,217,3,230,108,1,64,177,+244,210,19,7,35,105,110,99,108,117,100,101,103,252,244,210,5,247,195,17,+244,219,3,224,92,20,117,47,0,49,224,91,3,224,152,0,0,53,84,162,+224,87,18,64,254,169,218,225,153,1,52,94,46,216,76,133,0,49,96,160,+161,189,39,139,32,34,0,55,46,217,254,179,18,4,92,57,50,38,47,160,+94,161,97,65,182,245,40,5,162,133,161,186,226,27,0,0,50,175,66,78,+75,0,50,106,104,94,43,64,42,32,65,136,63,32,161,0,48,34,25,0,+85,228,110,0,228,108,7,224,11,0,32,168,196,96,32,61,136,114,227,245,+3,231,176,6,224,61,6,192,8,221,220,64,75,244,228,0,128,144,244,221,+0,0,52,169,88,66,71,244,239,1,162,176,65,1,128,20,94,102,245,28,+1,66,130,226,200,0,231,224,3,132,166,136,6,232,123,6,251,56,7,255,+215,2,118,33,129,84,246,43,0,99,217,35,123,65,164,134,20,225,112,2,+99,19,67,227,32,45,32,15,227,140,0,0,54,161,119,108,95,32,13,128,+135,48,27,32,82,32,181,202,59,118,45,161,11,96,206,183,120,76,10,170,+38,33,231,107,255,214,179,32,67,32,13,0,85,187,76,130,250,226,210,5,+37,114,86,76,229,114,1,32,155,33,246,32,93,170,138,0,55,42,86,1,+95,53,118,243,96,209,32,25,130,22,251,40,0,231,212,17,130,229,129,60,+134,210,132,35,32,164,118,92,128,93,232,74,0,160,13,229,198,2,96,35,+0,54,67,22,170,221,130,94,32,63,32,13,32,137,226,98,5,137,149,231,+93,17,242,83,7,71,201,225,147,0,64,201,228,180,0,102,114,202,169,35,+151,71,228,1,50,55,193,88,75,108,64,191,171,134,0,50,32,204,0,95,+72,49,228,50,21,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,48,1,96,100,97,81,68,+9,107,97,1,50,56,201,45,228,64,0,232,130,1,238,145,3,244,69,14,+128,250,69,104,224,61,8,244,66,41,231,232,4,240,40,0,243,211,4,253,+2,0,232,5,7,212,1,224,69,9,224,72,0,224,184,7,96,75,244,117,+15,199,226,200,95,101,50,186,124,246,194,21,224,136,0,224,31,15,233,26,+1,98,207,247,171,3,224,8,2,224,36,1,224,71,16,247,224,5,224,113,+20,241,124,6,224,45,31,224,93,5,192,175,224,128,7,224,224,18,224,191,+27,224,56,17,237,87,1,224,5,12,225,61,7,224,60,6,225,211,8,234,+137,29,238,174,4,39,154,253,118,7,224,152,5,224,201,3,225,196,6,225,+202,11,224,152,61,1,117,110,32,154,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,224,145,25,224,190,7,224,187,55,224,184,11,226,128,27,226,125,13,+224,141,53,2,101,108,115,227,17,12,224,143,113,225,31,13,172,69,121,26,+207,5,249,191,4,224,5,27,245,117,2,240,114,1,224,139,18,1,110,100,+224,140,1,201,223,231,236,67,96,96,84,132,184,64,231,194,4,231,130,14,+225,160,120,225,20,3,224,144,123,5,112,114,97,103,109,97,224,145,11,243,+129,0,226,50,8,254,83,5,143,90,224,22,3,192,146,104,153,224,11,10,+241,122,9,232,219,7,254,79,6,222,166,232,124,4,187,245,236,222,1,239,+210,2,87,163,187,240,108,51,228,231,13,253,59,11,230,172,7,228,233,3,+228,221,12,225,147,10,228,221,50,143,89,225,142,9,242,84,13,224,159,5,+224,156,28,224,153,47,6,119,97,114,110,105,110,103,224,153,8,233,3,25,+224,125,59,4,101,114,114,111,114,224,123,11,224,2,9,225,15,0,224,99,+6,233,243,11,225,208,14,228,220,26,80,165,224,143,7,224,214,8,177,186,+100,246,82,98,0,49,110,65,229,148,10,227,91,3,255,72,2,227,89,0,+224,8,9,154,164,238,2,5,140,12,34,247,78,159,1,50,56,68,251,1,+50,56,99,3,180,182,69,29,101,17,96,58,128,69,115,92,64,29,67,50,+0,50,78,212,255,181,0,128,27,144,52,245,235,9,245,93,6,227,47,5,+224,38,13,224,19,10,224,16,7,224,13,0,110,180,142,148,243,29,3,70,+27,0,51,89,135,51,104,37,224,0,52,174,204,141,179,227,233,2,226,26,+34,237,63,9,228,162,1,224,22,10,225,98,3,225,211,0,65,45,238,203,+2,225,225,20,231,82,4,231,8,3,193,167,252,208,1,0,50,52,76,34,+132,79,186,1,52,57,134,215,128,30,231,43,3,231,45,19,0,87,131,181,+15,58,32,117,110,107,110,111,119,110,32,100,105,114,101,99,116,59,150,1,+32,35,162,190,150,52,116,41,224,73,19,79,55,1,105,110,231,106,12,232,+100,16,246,21,0,130,172,226,84,11,226,56,9,129,246,32,239,65,203,225,+210,6,227,46,255,227,46,24,243,75,2,32,25,227,48,10,119,11,34,90,+225,193,1,225,106,3,128,207,183,102,226,30,59,231,87,2,160,240,182,149,+250,197,0,226,224,4,231,205,27,249,208,0,194,101,163,81,227,78,1,227,+42,9,226,233,60,232,110,35,232,71,7,233,24,23,247,252,6,226,41,1,+226,228,0,245,209,5,161,250,1,53,51,120,90,84,139,0,54,94,144,34,+153,160,132,225,86,0,224,98,0,33,247,226,56,1,225,57,3,115,166,32,+16,224,193,1,251,212,1,149,79,247,183,27,225,54,3,1,49,52,73,173,+0,55,225,59,0,224,225,0,117,47,181,142,224,92,2,117,174,163,249,225,+110,24,137,255,224,172,6,225,150,16,99,159,85,72,226,242,2,225,200,22,+0,54,40,1,85,104,192,106,224,49,35,128,16,235,215,1,229,250,4,225,+206,4,225,238,3,193,146,53,133,96,170,193,8,247,28,5,155,97,224,119,+2,197,197,226,109,1,224,41,15,193,255,85,251,0,54,252,177,0,224,59,+37,131,85,70,236,224,70,6,228,156,0,253,198,0,248,11,3,137,8,160,+86,32,54,97,251,225,197,13,228,212,2,197,10,252,98,6,224,28,4,224,+15,5,224,64,3,118,109,243,113,6,183,198,228,63,1,64,18,133,199,129,+152,228,33,0,226,237,9,247,210,5,32,31,1,53,51,90,62,253,101,4,+34,201,96,31,166,53,182,76,224,230,6,76,241,136,42,33,250,120,155,251,+153,7,134,160,70,76,154,102,226,89,6,253,3,0,194,215,192,17,224,91,+5,98,235,249,47,0,224,116,24,224,58,17,245,99,12,252,154,0,228,160,+6,162,70,228,213,4,237,98,6,167,142,165,32,193,216,223,85,226,136,1,+167,157,1,54,57,96,134,129,10,0,57,230,150,0,0,52,123,237,162,165,+224,203,6,231,177,13,0,55,71,9,231,157,9,251,63,15,226,84,1,227,+128,0,231,105,1,121,100,228,170,1,32,107,222,239,249,173,13,64,32,33,+188,1,95,53,40,100,238,202,4,63,30,224,149,0,225,130,1,64,252,0,+56,32,246,196,6,223,7,32,15,154,198,246,110,12,193,91,42,58,128,37,+226,234,5,231,48,12,233,156,16,225,17,6,230,139,22,223,77,200,135,226,+238,1,229,210,1,248,81,9,160,135,203,132,239,153,18,238,81,9,237,184,+9,248,195,3,248,196,66,224,156,5,229,204,7,225,125,4,224,122,9,228,+195,4,248,80,16,239,221,12,245,252,4,239,53,9,97,236,71,239,192,209,+110,175,246,129,13,224,43,26,96,39,224,30,17,246,51,9,228,0,2,237,+99,7,239,120,5,250,113,11,227,3,0,224,105,7,244,195,6,225,21,6,+224,78,42,245,162,4,224,173,5,224,77,1,251,61,4,224,74,15,243,188,+5,128,46,99,45,101,160,235,144,4,243,41,1,142,181,126,157,206,29,224,+57,2,125,236,128,34,157,40,253,244,1,36,23,229,124,0,97,103,128,101,+64,34,253,199,0,128,34,200,213,232,229,10,245,105,109,224,224,3,113,79,+225,110,0,229,213,1,224,234,11,225,12,24,161,104,196,90,231,24,0,227,+190,3,234,212,6,233,119,39,65,37,68,175,237,29,4,228,239,6,232,203,+0,195,214,194,72,254,255,2,201,1,224,240,19,230,226,1,137,81,224,223,+7,226,153,3,133,150,229,57,3,226,15,0,198,120,192,85,232,12,12,231,+243,13,238,141,10,245,246,5,226,190,1,231,185,2,231,137,38,231,109,29,+230,79,9,231,107,85,231,73,0,231,74,10,231,71,11,231,70,5,161,30,+241,170,0,71,58,225,0,27,224,239,19,231,63,5,231,56,3,129,213,32,+175,238,167,2,29,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,49,227,3,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,227,2,46,104,115,64,89,4,44,54,56,58,53,131,238,0,58,+96,145,1,10,65,140,0,215,158,235,212,0,131,177,33,76,110,131,226,140,+2,194,142,32,63,32,7,32,63,0,80,83,46,98,177,164,11,231,135,3,+97,151,139,128,66,188,201,170,160,15,1,35,57,65,20,192,12,96,43,233,+204,0,32,95,32,8,96,159,239,63,4,33,147,65,187,131,237,164,163,65,+69,107,223,0,58,98,189,32,52,0,85,32,205,224,1,7,225,183,3,32,+40,32,178,96,93,99,0,65,225,1,54,48,33,236,0,73,197,156,212,155,+72,121,64,192,66,59,0,54,32,175,139,246,171,252,32,17,110,244,33,29,+96,53,0,79,65,59,33,16,0,54,98,131,240,143,23,0,35,159,124,165,+127,208,198,44,111,65,9,160,173,96,6,97,155,132,140,128,171,128,204,64,+3,98,156,96,180,226,74,12,97,244,2,48,58,48,161,243,109,19,32,245,+32,160,0,53,224,41,2,3,112,114,101,68,96,138,0,100,64,39,32,37,+32,189,32,37,71,51,65,123,98,4,45,22,35,123,97,251,96,4,138,185,+32,43,32,21,97,112,4,75,50,32,75,52,225,106,6,32,30,33,25,128,+30,0,51,192,30,160,28,32,27,32,237,161,130,133,10,230,107,1,227,87,+1,168,122,233,191,17,233,220,21,224,29,13,233,129,3,224,33,16,248,229,+4,224,37,19,249,14,5,224,41,22,249,59,6,224,45,25,250,135,7,224,+49,28,252,80,8,239,107,13,247,79,11,251,28,4,244,239,11,224,103,19,+224,40,19,250,53,12,225,78,55,224,41,44,235,138,3,236,142,1,244,188,+7,224,5,9,236,9,0,250,100,11,0,89,252,82,21,224,32,4,224,172,+14,230,177,1,250,206,26,224,155,2,233,92,1,192,5,253,245,8,160,222,+230,226,1,253,248,15,226,17,8,236,170,17,128,132,2,67,32,60,36,23,+237,111,3,224,67,9,236,244,5,224,203,12,128,70,238,222,1,224,37,6,+148,224,236,131,5,236,51,2,238,96,18,238,110,10,230,162,9,200,9,0,+85,82,74,105,171,102,146,82,24,232,37,1,234,133,11,240,243,0,69,245,+0,54,104,186,235,47,0,225,50,9,224,197,0,224,25,4,0,82,224,198,+0,227,144,7,239,95,10,161,229,224,195,5,0,52,243,175,5,255,129,6,+239,160,10,239,45,5,106,68,224,232,22,192,234,150,77,230,215,16,0,32,+166,205,225,19,16,225,151,7,235,81,1,65,123,182,86,135,241,252,5,2,+226,131,18,238,74,17,254,44,9,226,104,1,233,129,2,240,77,13,3,67,+32,61,61,224,39,17,193,200,225,178,8,229,61,0,224,81,1,252,118,0,+226,132,5,194,169,235,57,4,245,102,0,116,232,225,4,4,192,106,240,168,+8,192,36,64,61,76,78,39,175,162,14,226,147,12,228,163,20,226,166,7,+224,43,21,194,184,239,185,10,225,151,9,241,68,11,226,206,14,235,205,1,+241,116,7,253,192,12,242,2,25,250,86,14,227,193,5,233,246,2,130,140,+65,58,193,59,225,66,8,229,80,11,224,239,47,227,127,2,224,239,27,194,+102,227,196,6,228,3,1,236,212,8,226,149,0,228,199,29,67,133,227,210,+14,244,121,10,224,248,120,224,68,2,224,248,54,65,227,224,248,17,233,55,+19,224,199,3,238,82,11,241,41,1,252,68,7,224,73,16,224,70,27,232,+181,2,224,65,7,224,62,4,224,53,2,228,104,6,229,123,1,98,238,228,+116,10,230,16,15,227,61,6,224,88,5,247,238,2,36,77,90,28,81,32,+32,5,98,165,0,67,77,41,247,210,2,224,100,71,110,19,224,100,5,212,+214,224,100,26,225,57,2,235,52,1,230,253,2,224,88,5,229,100,17,234,+126,9,225,172,0,251,247,2,234,88,1,247,138,7,155,212,109,129,145,229,+128,96,237,65,0,237,36,16,192,64,161,30,166,77,251,54,8,223,180,232,+238,0,165,119,224,96,0,240,155,85,7,84,111,107,101,110,105,115,101,208,+155,5,50,49,53,58,49,51,245,137,7,235,67,17,230,149,15,235,103,4,+236,21,16,235,107,12,224,83,14,235,110,39,235,111,10,235,114,74,222,191,+247,79,13,235,189,255,235,189,255,235,189,115,226,80,48,151,201,226,80,21,+224,86,6,235,126,8,252,63,3,232,74,23,0,49,91,75,226,170,10,221,+60,225,138,24,227,72,1,246,11,10,107,215,216,60,1,54,55,32,43,247,+229,12,225,156,15,1,45,123,232,142,8,224,251,13,251,67,6,233,142,13,+194,130,103,49,247,110,6,235,126,2,226,145,22,233,145,14,225,6,7,225,+69,37,1,49,50,224,63,1,226,209,55,1,125,45,226,209,22,226,211,3,+234,45,0,229,69,13,227,201,26,224,248,11,227,201,33,224,248,3,226,63,+31,252,53,7,225,11,31,243,127,2,243,1,1,250,225,3,104,47,129,93,+96,107,234,26,7,229,229,80,188,45,229,229,12,234,188,16,0,55,102,123,+224,161,5,229,246,46,224,222,15,255,24,2,240,115,18,231,104,21,240,78,+2,163,191,232,17,2,240,68,2,229,29,28,237,240,2,225,136,24,226,220,+2,231,225,10,226,223,31,208,88,226,223,14,246,73,8,255,213,13,192,195,+251,193,4,224,90,10,201,162,129,34,155,71,224,50,2,227,39,22,122,138,+0,54,127,155,124,205,130,24,250,119,2,227,103,26,224,63,0,224,54,2,+224,65,8,225,80,10,253,13,6,255,39,2,224,194,10,227,136,36,98,184,+226,230,25,255,21,5,130,238,128,39,224,60,6,229,18,21,242,234,217,242,+236,9,224,46,18,242,239,5,228,30,9,242,242,214,245,79,12,231,36,104,+224,62,2,242,205,30,38,26,233,69,2,231,4,4,224,213,65,234,58,13,+224,214,83,0,53,137,168,234,32,17,242,139,12,244,167,226,243,65,9,244,+171,225,240,247,7,232,174,16,228,239,13,166,174,228,92,4,237,140,2,236,+3,7,227,49,44,0,51,234,74,1,227,48,43,224,62,2,233,232,33,225,+48,1,1,39,39,225,48,5,224,207,78,0,83,226,99,12,2,66,32,90,+229,213,15,224,230,7,232,104,3,227,21,30,0,55,48,250,64,139,0,79,+128,7,244,169,0,225,184,104,135,194,237,246,11,224,199,0,225,211,16,245,+176,67,0,66,53,176,128,91,117,186,225,23,9,245,195,30,227,70,60,252,+213,5,224,95,21,248,86,2,244,83,13,248,89,11,172,88,248,167,255,248,+167,166,249,12,200,229,156,33,227,151,9,228,240,34,64,229,64,64,32,7,+228,240,6,249,136,255,249,136,32,4,57,52,58,49,49,231,29,1,236,21,+5,228,234,11,249,113,1,237,57,15,249,100,4,249,101,15,249,136,21,129,+44,249,220,4,237,169,17,250,3,5,250,4,19,228,223,1,224,162,26,225,+201,2,249,254,3,250,10,19,235,131,27,245,183,12,230,9,17,224,156,14,+242,104,4,240,158,3,230,18,6,250,43,12,251,5,26,250,124,16,242,203,+7,245,165,4,224,106,19,224,97,20,234,110,3,239,105,10,100,122,3,67,+32,61,61,224,42,20,249,180,15,243,14,3,240,217,9,240,215,6,240,213,+8,249,202,96,0,39,48,229,246,178,20,242,106,6,178,198,245,195,18,249,+156,9,225,240,15,241,23,3,226,59,2,252,182,2,245,210,11,234,210,9,+248,130,1,224,102,8,229,47,0,224,28,11,235,33,0,237,157,10,98,104,+232,93,0,245,164,10,230,173,0,235,76,17,228,21,10,225,247,8,193,68,+202,194,162,43,231,105,1,133,209,241,64,2,118,135,225,172,0,184,156,229,+210,2,229,211,1,247,40,15,226,139,64,245,172,22,248,140,24,242,145,1,+228,194,0,209,78,224,224,19,246,7,6,253,207,55,161,80,253,207,3,234,+4,1,246,252,255,246,252,241,231,93,1,96,42,229,46,9,246,97,13,228,+250,13,228,60,1,167,164,227,139,13,249,148,8,249,171,26,249,248,2,226,+174,24,240,31,8,224,134,4,227,65,11,247,117,60,230,114,21,247,77,30,+247,79,10,243,134,13,232,139,15,233,65,3,225,145,10,233,54,21,227,141,+16,231,209,50,231,146,1,231,209,44,227,42,1,229,67,3,181,187,253,166,+2,230,21,13,232,37,23,255,94,43,232,100,13,133,214,254,53,10,245,86,+9,253,3,3,232,14,1,199,16,232,21,14,232,18,13,232,15,17,231,242,+12,138,85,231,248,10,226,39,5,231,249,38,230,162,5,231,225,2,231,246,+3,227,236,6,225,92,1,128,148,249,66,13,128,56,99,100,225,91,2,46,+166,70,230,225,241,2,232,20,4,235,22,9,241,182,5,232,226,2,226,226,+19,129,37,232,55,129,228,82,4,225,22,29,224,241,10,228,48,3,227,212,+8,231,115,17,232,102,16,231,183,38,247,16,14,246,171,34,225,19,40,241,+18,6,224,63,41,241,17,9,226,186,5,224,182,3,224,202,0,98,61,192,+212,230,37,0,224,16,0,1,54,55,169,255,229,218,0,2,95,54,57,102,+227,146,30,227,110,3,230,79,17,225,50,5,238,45,10,228,14,0,241,190,+5,239,138,6,224,5,1,244,113,0,226,184,13,242,203,5,231,32,20,244,+23,35,227,189,2,254,49,17,245,226,25,245,224,11,245,69,5,239,185,12,+237,93,2,224,61,20,211,243,245,130,78,229,33,12,229,30,4,244,158,33,+224,76,71,234,34,22,160,217,128,204,224,60,6,242,63,16,224,246,10,244,+67,2,172,189,128,98,237,242,14,230,241,7,238,142,25,244,70,11,242,221,+14,233,27,11,128,44,244,100,126,36,163,2,58,49,50,232,90,4,108,182,+229,101,1,1,50,50,97,165,233,33,5,196,140,196,98,0,73,129,240,0,+83,165,110,224,51,20,100,183,32,20,228,158,0,32,35,64,7,32,114,32,+56,64,24,1,52,54,33,19,34,78,0,50,53,231,172,165,225,16,1,1,+95,96,160,173,224,47,3,32,34,224,47,15,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,250,2,83,58,224,20,4,83,207,+143,96,128,11,231,34,0,1,58,54,65,44,1,10,65,162,244,199,100,231,+41,1,244,90,0,0,95,79,169,162,112,35,100,1,49,56,138,103,229,186,+11,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,80,0,128,208,224,68,30,2,100,101,102,+224,142,1,132,83,193,67,224,52,17,1,117,110,32,54,128,51,193,16,135,+80,0,56,68,24,33,49,65,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,1,54,55,32,186,108,139,+228,160,7,160,163,242,242,4,1,95,50,40,141,2,95,54,56,34,17,32,+30,97,239,162,9,97,252,193,249,224,208,102,0,57,160,208,233,203,3,232,+38,2,239,50,4,233,159,7,225,186,7,41,48,0,52,234,132,4,238,170,+0,130,222,225,10,0,120,97,236,122,2,64,7,76,47,136,255,103,22,129,+69,1,53,51,233,144,3,225,23,1,16,105,110,99,111,109,112,108,101,116,+101,32,109,97,99,114,111,32,98,96,8,105,116,105,111,110,58,92,49,48,+163,242,224,68,22,2,32,32,35,130,151,205,164,64,220,96,46,100,245,224,+54,5,224,219,4,37,4,0,48,224,28,7,234,41,8,253,252,6,241,217,+6,227,58,22,224,81,9,235,199,8,227,202,31,64,74,36,166,224,74,0,+226,144,1,161,148,64,65,240,206,6,228,47,9,228,169,0,161,38,1,54,+56,72,52,198,12,244,36,0,0,95,138,200,187,241,130,228,200,45,102,110,+232,48,0,163,13,55,88,227,13,0,163,59,160,25,111,83,96,5,0,54,+165,13,192,31,43,63,2,95,53,56,140,65,132,76,232,46,0,102,167,171,+67,128,8,0,53,32,4,0,56,33,202,1,50,57,96,48,235,94,5,128,+147,64,40,32,39,96,7,0,53,32,145,244,96,6,133,204,32,69,235,129,+0,195,224,97,7,32,86,226,101,19,0,35,229,64,3,224,68,2,224,67,+4,226,114,12,224,67,2,229,204,1,224,65,2,64,187,96,191,219,180,230,+62,1,169,157,227,210,12,238,185,8,226,48,10,0,51,33,13,234,81,7,+196,11,236,114,3,236,8,2,234,229,2,32,200,65,208,199,113,96,95,224,+33,1,130,103,74,73,225,80,1,235,95,3,254,84,5,224,167,18,225,31,+2,0,35,230,159,1,254,165,8,228,209,19,242,35,7,224,98,28,192,59,+176,226,229,226,1,141,16,225,6,8,160,245,64,12,226,138,6,224,12,2,+236,164,4,224,53,0,245,252,2,225,74,4,225,73,8,225,97,14,36,166,+228,145,2,0,89,96,181,227,43,1,229,207,2,224,138,6,40,184,34,250,+40,184,106,224,32,13,32,71,32,13,0,75,128,13,64,109,96,13,0,65,+96,13,32,75,32,13,32,132,37,19,64,54,224,4,1,32,28,35,185,64,+28,0,50,37,60,0,75,75,230,32,1,0,80,32,9,3,95,54,49,50,+230,231,2,38,170,70,210,8,109,101,110,116,44,32,97,116,32,230,247,88,+3,50,53,58,54,129,208,224,139,131,2,64,75,50,224,141,131,0,90,140,+249,97,217,96,157,0,52,224,157,131,66,93,35,82,226,93,13,69,81,97,+218,134,38,64,28,137,174,96,12,218,19,192,216,96,18,141,229,224,26,1,+248,117,0,32,103,37,14,99,12,120,91,224,4,1,151,174,32,31,32,100,+32,31,224,29,6,224,34,5,32,144,227,8,26,69,232,5,98,114,101,97,+107,115,227,7,120,224,138,113,34,120,193,172,97,67,193,167,217,219,225,156,+0,33,86,141,95,249,247,2,224,10,30,251,183,4,214,171,32,79,132,246,+192,44,224,7,11,224,70,2,224,59,2,32,58,133,35,225,255,3,224,60,+5,128,41,0,58,96,217,98,77,0,90,121,239,32,16,133,65,71,186,0,+35,72,156,32,21,32,20,133,57,32,18,34,57,39,230,32,17,130,237,96,+38,66,213,128,38,130,154,65,189,70,176,32,16,130,139,162,171,160,96,130,+124,224,144,11,32,28,225,66,1,32,88,97,88,32,24,32,23,129,10,32,+19,32,98,128,128,128,225,32,17,32,8,96,17,82,11,128,17,32,155,128,+17,128,203,113,155,234,66,1,112,157,145,126,50,64,73,106,0,53,38,54,+1,95,53,38,112,2,95,54,48,32,15,245,130,3,193,41,144,97,32,82,+129,9,239,59,0,224,65,15,32,62,73,189,64,118,74,121,70,213,53,191,+199,51,32,27,138,101,96,86,32,85,193,77,201,59,238,215,4,158,5,96,+8,153,60,32,116,111,218,233,0,6,200,92,248,87,8,236,223,0,66,174,+42,87,196,105,224,60,6,246,54,2,107,20,202,232,96,195,64,230,32,174,+0,51,40,141,231,224,4,128,54,32,31,167,174,243,162,2,96,89,192,70,+224,44,2,165,200,192,49,64,255,130,56,226,19,3,194,206,32,28,228,208,+2,98,102,64,252,160,45,107,86,0,51,32,206,32,102,210,2,128,118,225,+125,6,233,81,1,225,125,1,96,37,32,53,225,255,10,64,101,194,138,209,+47,1,95,53,77,116,2,95,54,51,97,123,201,173,116,184,238,43,32,23,+67,97,110,110,111,116,32,101,120,112,97,110,100,32,35,105,102,32,100,105,+114,101,99,116,36,177,6,32,105,110,32,102,105,108,238,0,4,206,2,1,+95,49,32,122,41,23,139,252,224,93,16,110,110,0,32,32,0,234,30,1,+224,166,1,32,75,64,67,97,116,97,238,97,153,64,183,0,53,64,23,67,+235,32,5,44,161,225,82,1,201,130,128,222,33,135,0,95,78,7,224,227,+23,12,87,97,114,110,105,110,103,58,32,116,114,97,105,37,184,8,103,32,+99,104,97,114,97,99,116,37,148,2,32,97,102,32,6,64,248,239,21,29,+143,80,97,46,0,115,47,79,225,35,59,253,5,4,113,250,65,215,2,95,+54,53,98,27,225,214,52,1,112,97,38,118,225,213,91,227,184,3,225,213,+24,64,20,171,240,225,222,11,35,136,132,14,225,229,113,225,45,68,225,223,+4,35,247,193,29,163,213,134,72,225,5,1,96,8,207,95,224,81,12,1,+47,47,206,237,111,191,129,53,32,73,134,128,38,37,66,65,68,70,1,54,+53,143,66,224,17,1,0,51,33,128,1,95,53,96,89,32,187,128,19,1,+53,53,33,97,0,53,32,198,224,97,1,1,124,124,192,97,45,86,0,53,+39,90,1,95,53,101,224,128,43,162,153,225,161,0,86,55,64,86,191,254,+33,213,64,227,86,198,96,151,64,45,224,151,7,130,18,224,151,40,0,38,+178,187,224,151,15,240,62,1,224,151,16,142,118,96,151,173,154,1,51,49,+64,103,96,123,224,10,13,224,145,9,80,4,216,3,88,243,192,32,224,150,+7,96,232,96,233,224,135,0,129,229,224,54,5,1,54,53,37,228,225,15,+4,0,54,96,165,167,244,224,38,4,241,232,0,224,218,3,139,71,224,83,+9,247,140,1,0,52,120,85,0,49,55,135,2,95,52,51,96,170,1,48,+48,104,169,194,147,128,53,0,49,134,75,224,17,3,128,116,102,164,64,92,+224,221,0,194,6,33,72,174,198,225,72,24,225,94,31,225,240,1,1,62,+61,214,226,224,144,0,1,52,49,34,244,0,52,128,167,225,155,14,71,41,+193,155,224,200,1,35,31,224,55,0,224,117,21,0,60,224,117,9,39,204,+224,60,20,64,117,245,1,1,224,55,1,72,221,224,116,29,0,61,224,116,+9,225,185,1,224,61,24,0,33,224,61,9,105,223,192,61,33,165,174,14,+225,121,2,226,45,3,32,38,69,151,224,29,1,226,144,7,68,101,226,144,+38,227,126,5,98,63,128,50,32,141,137,96,227,102,24,0,52,227,102,2,+224,217,0,73,24,98,197,225,139,16,0,52,243,162,0,226,220,4,32,128,+192,55,32,130,137,198,225,16,14,37,130,225,16,22,70,202,225,16,8,97,+109,225,16,37,64,50,32,141,175,2,228,130,34,0,52,226,230,11,130,229,+225,27,20,32,16,224,54,9,118,86,96,230,224,56,16,64,85,225,84,9,+0,50,34,225,192,56,32,198,138,164,32,22,0,49,85,107,132,118,128,143,+1,95,54,136,214,64,42,32,11,96,251,96,11,0,49,39,15,224,11,1,+72,17,160,35,40,49,68,168,81,246,96,17,109,67,64,9,107,6,1,83,+32,85,223,238,76,0,32,109,73,25,227,18,1,7,73,110,116,101,103,101,+114,58,39,205,1,118,105,105,172,3,98,121,32,48,232,0,0,206,136,108,+195,148,178,0,85,154,99,70,55,0,57,255,199,1,224,17,9,198,98,238,+46,3,216,41,248,215,0,180,67,248,232,1,250,211,2,184,244,191,75,255,+71,1,116,105,197,178,78,98,251,64,2,213,58,32,51,33,61,107,29,0,+54,130,73,214,16,189,67,32,22,32,164,0,85,84,127,96,35,134,239,233,+161,2,110,105,64,5,160,71,184,38,154,99,136,219,0,85,223,186,96,56,+32,39,64,252,88,5,104,117,249,9,0,161,243,136,120,128,212,64,69,2,+95,52,48,127,72,0,51,32,122,0,58,96,59,253,229,3,186,227,214,97,+238,80,6,64,63,0,67,34,109,247,97,0,247,81,5,141,174,240,163,0,+236,77,3,193,99,160,98,118,23,98,157,1,50,48,165,65,129,30,143,69,+96,28,73,191,192,28,96,252,68,89,110,77,82,228,32,29,96,11,0,95,+185,97,35,145,150,50,185,38,130,13,32,224,208,161,143,200,254,202,4,174,+197,207,11,224,7,2,65,231,0,52,119,81,0,52,37,168,225,224,0,32,+255,33,110,136,61,96,6,193,158,96,26,78,96,64,21,64,59,35,23,64,+59,186,70,142,124,96,49,96,28,194,55,174,230,128,46,96,26,186,200,251,+39,1,226,147,0,188,121,239,174,5,243,247,1,64,69,95,200,32,182,192,+93,252,248,0,183,150,224,253,1,33,128,151,156,251,80,1,203,197,128,95,+160,163,128,220,160,12,65,117,128,37,64,253,98,110,155,23,224,197,16,64,+39,64,48,192,243,225,16,3,138,1,227,188,0,204,120,65,62,64,74,37,+182,96,8,240,66,1,98,225,113,228,99,118,32,28,34,135,131,65,162,141,+224,78,4,224,13,4,34,6,210,147,228,135,6,7,108,97,115,116,58,32,+91,93,100,121,129,41,38,13,82,224,227,156,0,32,60,167,157,224,81,1,+37,112,165,223,32,29,135,45,129,95,133,23,120,107,64,250,32,23,99,235,+32,13,240,134,1,70,110,196,121,227,50,1,114,57,98,40,0,51,63,72,+99,167,141,113,128,14,32,65,133,189,242,154,1,35,30,33,14,128,93,133,+119,224,27,7,128,135,132,1,36,53,0,51,115,185,121,24,128,216,38,87,+160,54,206,8,75,35,96,247,195,10,154,117,250,229,0,162,65,250,223,6,+109,14,0,35,67,106,163,226,155,10,255,117,7,128,38,67,217,135,117,38,+216,106,46,163,193,162,126,224,50,10,224,89,0,154,185,224,89,16,66,53,+192,89,105,219,224,89,0,128,19,106,39,196,47,135,61,83,76,163,27,0,+82,68,112,203,120,84,225,129,39,33,38,212,25,64,216,32,70,33,151,64,+120,99,110,96,49,157,103,68,115,103,75,0,53,84,110,32,54,179,253,224,+54,16,128,213,32,131,102,201,192,53,130,108,224,108,18,180,12,0,53,224,+108,5,243,20,1,199,47,231,16,6,246,1,2,243,226,0,255,151,0,96,+253,224,47,1,231,24,0,134,14,255,87,4,231,36,0,224,91,8,252,163,+1,228,125,0,147,198,255,250,1,156,104,224,57,4,167,156,230,48,8,64,+19,224,162,0,69,252,244,11,0,176,129,64,27,1,95,51,69,255,67,214,+230,42,1,160,171,36,30,84,19,97,196,225,65,5,197,32,33,53,131,163,+234,75,9,233,222,11,0,54,157,98,233,93,1,239,254,0,163,80,234,110,+4,0,53,70,162,0,53,84,142,32,71,48,126,0,54,174,90,238,254,0,+238,139,2,198,253,0,53,45,181,128,51,101,33,39,156,32,76,136,230,138,+188,212,79,165,46,192,108,64,23,32,221,224,90,61,33,21,132,171,97,124,+224,209,4,98,121,225,253,1,130,104,245,47,5,229,90,1,0,100,121,35,+0,100,241,156,0,168,131,225,104,3,235,141,1,224,100,1,75,119,240,65,+8,93,227,161,75,225,86,5,73,150,113,220,170,161,241,145,10,1,44,41,+209,227,235,105,5,32,66,233,71,0,194,78,136,130,236,6,0,246,218,1,+1,95,52,69,251,0,54,70,141,204,34,245,233,12,0,90,107,88,96,174,+73,90,236,84,5,96,0,227,103,2,225,16,10,224,18,10,225,32,7,228,+182,1,66,215,165,6,233,147,0,224,45,6,97,73,77,76,129,88,224,70,+12,64,194,96,34,224,171,7,224,93,9,224,189,7,230,14,13,98,9,225,+139,12,226,19,5,230,42,0,203,62,138,96,97,87,229,225,0,96,101,105,+241,102,150,203,136,197,107,224,179,0,65,210,32,152,237,3,7,225,168,0,+224,5,3,139,10,32,42,64,45,94,185,224,69,13,0,64,39,49,224,26,+5,32,215,192,26,33,62,224,26,14,72,122,0,54,232,99,2,252,127,70,+32,5,1,73,102,33,72,252,125,0,4,51,56,58,49,50,252,127,0,160,+132,250,193,2,195,121,133,123,224,10,0,225,83,0,107,147,66,230,142,50,+225,9,12,225,80,7,170,150,160,81,237,68,2,202,116,225,100,6,237,212,+3,224,111,40,64,214,64,1,67,140,197,141,98,181,66,92,61,251,100,35,+224,48,0,227,212,0,254,212,11,170,238,224,69,0,131,47,96,72,194,33,+33,22,104,161,211,93,224,89,10,225,226,104,1,52,53,225,226,1,37,159,+252,247,1,71,156,231,199,2,33,112,101,142,239,13,2,231,84,9,71,78,+137,41,234,133,4,192,21,203,206,64,69,81,117,171,203,32,118,207,220,149,+38,120,62,144,66,87,39,65,209,107,211,100,181,225,26,1,2,39,96,95,+128,184,32,64,183,4,0,53,42,174,104,160,0,53,42,211,128,168,37,197,+137,117,33,229,64,23,228,53,4,2,69,120,112,55,241,3,101,100,32,101,+59,6,1,111,102,55,247,7,112,117,116,32,40,69,79,70,229,218,0,0,+58,103,156,252,21,16,36,149,139,3,254,227,5,248,24,17,0,35,56,164,+248,88,0,166,23,248,87,1,0,49,124,223,207,144,224,64,2,81,136,241,+248,2,96,43,34,213,32,28,240,42,0,64,141,236,140,0,96,251,194,119,+189,126,157,123,234,217,4,1,64,35,73,222,192,212,32,55,0,54,88,165,+225,226,0,193,164,160,26,32,42,64,135,243,101,0,1,64,89,226,42,3,+162,12,229,181,1,78,12,224,92,1,224,10,0,235,137,13,111,91,192,33,+236,179,1,235,143,14,254,57,0,76,244,128,153,128,172,224,26,0,224,108,+1,66,186,208,0,143,195,226,194,3,140,125,232,118,1,236,131,15,192,87,+224,204,6,224,159,13,129,84,239,195,1,224,124,3,66,57,225,75,11,194,+14,239,124,0,255,54,0,224,134,10,210,119,208,215,224,107,21,225,210,3,+226,42,0,140,13,1,65,32,32,10,139,225,0,75,64,10,222,228,209,170,+128,235,200,145,224,144,10,208,197,225,6,11,139,79,210,58,242,66,1,209,+181,224,237,1,231,140,0,255,32,3,144,5,32,191,96,201,32,156,138,61,+210,244,201,30,52,115,165,146,135,231,33,79,96,56,32,48,132,206,32,196,+232,252,38,172,93,233,178,3,127,165,32,57,235,8,10,107,5,234,72,0,+160,145,234,18,19,250,168,12,235,230,8,224,145,2,224,48,12,237,87,3,+231,24,0,177,132,179,234,232,227,6,97,22,194,243,167,87,225,139,3,231,+90,6,144,172,0,48,160,158,230,239,8,82,121,65,97,167,39,245,31,12,+245,47,12,82,21,97,211,231,23,14,231,8,107,2,51,55,55,231,8,0,+34,56,240,245,7,132,32,225,95,5,225,104,3,193,160,225,137,2,128,47,+230,203,0,254,68,1,33,137,100,143,245,237,0,84,129,32,248,33,71,66,+62,114,137,96,33,90,125,126,103,242,161,1,224,69,0,224,60,14,213,174,+128,143,100,26,230,142,21,4,109,97,99,114,111,198,142,194,26,166,145,129,+250,255,52,22,0,101,199,66,255,43,10,64,7,230,213,1,224,169,6,230,+228,10,224,86,2,11,97,114,103,117,109,101,110,116,115,44,32,98,39,146,+4,119,97,115,32,103,33,227,0,110,160,102,224,89,5,160,244,194,55,226,+176,0,244,133,1,1,50,55,99,40,142,20,121,149,128,167,234,109,2,202,+93,246,151,2,67,243,91,78,239,143,5,160,96,66,182,32,9,228,172,0,+108,213,133,30,2,53,56,53,106,135,96,59,135,102,165,183,244,215,4,66,+27,64,95,82,66,239,242,6,96,39,224,97,9,65,60,160,200,32,9,69,+230,161,76,165,246,133,141,69,70,65,126,70,95,228,120,0,34,212,169,36,+2,52,48,56,67,228,0,58,96,64,178,16,71,224,0,75,64,83,0,50,+227,114,2,33,218,1,97,110,89,66,4,44,32,97,116,32,227,128,70,4,+72,97,115,104,68,109,180,234,139,0,2,53,58,54,129,221,224,137,129,109,+195,224,139,128,81,236,225,23,129,150,164,66,143,139,187,0,54,84,63,100,+153,64,22,180,162,238,44,3,160,9,152,179,63,207,144,7,32,11,145,137,+102,233,1,95,49,121,118,85,34,32,10,98,235,32,76,136,171,232,149,0,+74,223,153,157,248,133,5,67,181,224,53,2,183,62,226,222,15,228,98,2,+226,222,118,224,137,112,226,222,10,224,139,114,226,222,8,224,139,114,216,204,+34,70,139,18,226,70,16,32,89,64,129,64,167,226,72,120,224,139,114,226,+74,10,224,141,116,129,190,83,76,224,148,128,34,75,219,171,53,245,64,152,+105,220,0,54,81,28,32,27,140,172,0,73,45,133,64,16,112,206,0,48,+111,119,39,175,73,140,149,245,40,200,192,56,0,49,45,226,224,11,1,99,+61,64,11,32,63,167,233,0,49,49,14,0,75,183,7,44,77,225,4,1,+6,110,111,32,102,105,101,108,201,180,96,29,144,87,65,47,160,105,44,102,+160,11,0,58,96,6,96,145,64,80,42,88,105,20,224,81,3,13,67,111,+110,116,114,111,108,46,69,120,99,101,112,116,38,145,8,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,204,194,32,98,251,11,1,67,103,41,1,73,4,140,135,97,203,+252,96,0,32,43,134,93,207,139,179,241,45,145,101,252,64,8,1,53,56,+78,244,0,50,173,42,198,46,234,224,0,73,161,107,99,75,140,238,117,5,+198,137,96,37,152,56,32,28,0,53,58,38,33,13,170,103,32,129,189,185,+0,52,33,210,32,28,32,113,128,28,32,11,65,160,128,11,0,49,82,190,+32,5,77,36,0,53,46,252,192,23,0,54,58,43,224,11,1,65,196,192,+11,224,100,0,32,97,134,190,243,131,1,110,144,0,50,115,130,0,53,170,+240,243,102,3,243,142,3,32,68,32,150,0,52,138,168,32,45,98,34,224,+6,4,32,95,222,69,71,202,0,52,94,75,96,21,249,161,2,187,8,224,+114,4,224,101,6,42,180,224,101,12,32,72,130,206,192,94,193,184,130,217,+224,94,29,0,52,39,247,224,94,16,130,226,225,208,0,224,69,3,160,60,+33,87,224,60,5,0,58,65,131,219,149,72,171,96,46,64,199,65,194,77,+108,120,93,51,103,128,9,157,20,221,212,192,66,200,239,92,48,0,49,84,+185,32,19,130,142,224,86,9,34,90,66,55,64,77,224,88,25,130,81,97,+48,150,149,247,114,0,64,29,226,13,0,34,143,32,67,253,65,1,221,150,+115,50,253,28,1,236,210,1,110,107,32,226,220,200,249,19,0,224,155,1,+193,206,225,2,14,254,216,0,96,170,125,39,224,40,13,236,167,0,0,64,+125,10,67,66,36,151,64,56,68,95,32,197,199,75,32,17,113,35,82,164,+32,22,130,116,45,36,1,49,32,32,13,226,57,0,96,27,130,49,32,13,+0,51,225,20,5,32,26,130,3,0,80,32,51,64,131,96,37,34,198,32,+13,193,163,234,47,0,109,79,182,166,143,149,138,44,49,94,143,98,141,236,+100,37,97,213,161,23,96,103,64,21,224,144,1,68,29,234,140,7,132,195,+252,191,1,180,68,145,36,211,161,32,58,129,196,192,165,190,34,192,141,144,+80,190,34,32,7,32,111,163,55,50,11,131,239,32,161,177,55,119,68,96,+35,226,42,6,160,43,160,147,32,101,179,52,224,101,8,0,53,80,136,160,+101,99,252,224,101,0,249,212,1,146,144,224,103,19,248,35,1,160,95,126,+15,240,166,1,224,60,21,225,27,0,228,16,3,0,51,82,27,224,254,12,+99,116,32,33,33,176,224,85,19,176,6,47,2,230,119,1,1,87,104,48,+59,31,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,117,101,110,99,101,4,32,119,105,116,104,+32,13,15,112,97,114,97,116,111,114,115,58,92,49,48,38,92,57,38,102,+169,33,74,217,29,255,185,1,211,223,32,145,128,133,117,145,244,51,2,224,+41,8,33,78,252,73,10,32,92,249,3,0,244,2,2,0,55,65,29,149,+34,130,89,230,171,6,132,233,254,20,1,241,172,22,241,171,11,216,125,241,+137,16,2,103,111,116,192,47,224,181,6,32,180,249,119,2,0,89,241,63,+0,39,144,253,173,12,219,174,67,49,243,219,42,3,112,111,108,121,33,153,+1,115,101,41,135,2,49,50,47,64,43,5,84,101,120,116,47,80,64,19,+201,109,4,49,48,57,58,55,210,35,248,249,0,54,122,35,82,224,14,1,+246,191,3,65,55,224,25,13,68,179,214,59,248,16,9,92,83,96,57,254,+82,2,248,164,5,116,212,151,53,122,144,46,213,67,104,209,171,96,64,192,+12,128,44,100,98,97,102,0,50,73,207,0,53,126,137,99,31,224,134,49,+143,14,224,133,29,96,43,224,132,75,0,49,156,22,225,11,30,96,44,224,+134,8,216,191,224,134,50,99,79,224,133,30,96,43,224,132,16,255,244,1,+182,32,251,100,1,229,101,1,252,185,5,227,94,12,8,44,59,40,41,91,+93,123,125,96,195,98,230,157,0,116,148,229,23,0,71,221,224,99,6,253,+38,3,34,60,251,215,6,234,33,1,165,203,128,6,38,23,33,206,128,97,+157,13,165,132,228,55,19,5,66,97,100,32,99,104,37,20,36,60,1,114,+58,236,52,0,117,128,220,127,168,85,250,43,1,161,164,128,128,251,93,0,+252,6,23,0,52,153,129,252,6,3,245,197,0,138,231,251,165,2,64,14,+64,62,162,161,114,77,225,125,1,231,129,0,126,115,68,229,217,244,65,234,+96,103,231,159,1,225,232,0,162,18,193,241,192,91,213,146,224,48,8,224,+46,14,246,94,0,226,103,3,224,62,10,96,54,254,240,30,1,95,39,229,+135,1,250,162,0,224,98,25,96,79,73,98,197,20,128,47,32,22,0,79,+230,181,2,226,168,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,248,57,1,123,147,129,223,253,22,3,+224,204,15,1,101,69,224,58,12,253,145,0,254,74,5,227,231,6,128,204,+224,110,4,226,14,8,192,130,225,135,11,226,22,12,231,53,16,0,43,231,+46,4,226,45,5,226,37,7,224,192,30,232,207,1,224,192,91,0,45,224,+192,35,224,140,76,40,249,75,220,221,4,224,136,31,196,162,250,193,20,2,+105,115,115,73,212,7,43,47,45,47,100,105,103,105,200,173,224,51,19,1,+97,102,36,200,8,32,101,32,105,110,32,102,108,111,50,5,224,50,25,1,+108,105,32,50,1,97,108,196,253,250,128,0,38,51,197,4,217,119,224,252,+20,224,81,1,2,46,46,46,227,207,1,163,133,131,153,160,0,0,89,129,+107,98,73,58,179,126,241,97,34,198,166,225,240,16,4,110,100,32,111,102,+32,221,0,112,59,58,32,227,241,229,0,224,47,14,2,115,116,114,65,65,+160,226,233,237,2,191,160,229,122,4,97,150,233,38,7,229,166,1,247,234,+8,64,213,0,55,98,239,64,68,167,22,203,247,161,223,87,236,234,17,80,+3,49,56,58,52,212,22,228,255,3,80,53,78,107,251,57,2,64,0,251,+53,4,64,36,95,237,67,176,230,240,4,65,140,92,83,160,60,238,248,0,+0,67,103,100,0,50,39,125,138,115,172,152,97,183,235,8,4,225,173,13,+160,166,0,58,107,249,115,194,236,12,1,45,175,40,128,111,78,0,53,32,+182,194,109,235,222,10,0,97,225,202,0,71,181,128,83,101,137,234,247,7,+236,59,2,224,70,1,3,98,105,110,100,194,49,236,138,2,144,211,224,17,+3,65,24,0,54,83,102,224,143,14,224,132,3,1,32,104,61,193,116,118,+52,18,0,32,198,200,65,141,224,150,41,237,58,5,97,45,143,240,238,69,+3,1,53,55,238,222,15,238,251,19,32,74,207,236,142,87,32,16,207,239,+225,139,4,175,134,111,137,237,239,0,165,208,224,207,3,66,96,106,145,224,+228,9,224,196,2,224,240,12,225,206,14,0,44,109,145,0,39,232,11,0,+224,152,14,237,136,3,160,138,229,200,0,224,27,10,208,192,224,27,10,0,+49,83,202,224,28,16,158,216,224,28,15,99,1,224,28,15,169,130,224,28,+13,224,144,18,97,83,224,27,14,131,198,224,27,14,99,165,224,83,14,192,+55,101,109,64,27,102,136,224,157,15,108,205,224,28,14,237,246,0,64,24,+0,52,81,13,239,164,5,229,185,19,9,117,110,114,101,99,111,103,110,105,+115,33,247,5,101,115,99,97,112,101,240,157,1,37,201,226,8,3,1,58,+32,73,133,195,221,233,203,0,208,48,224,151,7,0,54,245,96,0,224,27,+10,97,138,224,27,14,215,57,224,27,11,97,165,224,27,14,97,109,224,27,+13,133,67,224,27,14,97,91,224,27,14,97,249,224,27,14,224,195,18,68,+31,224,27,15,115,81,224,27,15,106,104,224,27,14,97,79,228,193,9,120,+61,230,206,81,5,51,48,56,58,49,52,163,252,81,73,227,251,5,224,141,+8,66,215,229,230,24,196,137,34,217,160,17,226,155,10,0,39,66,110,1,+86,84,228,120,0,224,124,26,110,94,224,124,32,87,76,224,124,20,1,85,+83,228,245,3,0,53,59,30,224,4,17,224,154,22,111,221,230,254,34,224,+67,12,66,57,225,91,34,200,13,224,154,60,224,86,1,168,101,226,9,61,+224,67,22,67,71,224,154,33,234,203,0,224,242,24,226,40,37,0,49,181,+230,224,174,24,225,228,59,224,242,38,224,243,32,100,63,224,156,54,101,183,+224,156,34,177,92,227,188,29,123,111,227,188,33,128,248,227,188,17,4,83,+79,72,39,32,160,9,192,8,1,84,88,192,9,0,73,192,8,1,89,78,+192,9,0,85,41,200,55,168,128,12,0,80,240,251,1,228,119,73,146,194,+224,186,17,0,82,228,119,9,225,220,90,102,208,224,197,33,179,135,225,31,+27,104,10,224,157,55,224,67,28,226,122,1,228,253,1,225,101,15,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,174,249,224,123,16,0,72,231,98,82,154,+54,224,124,18,0,71,226,234,40,225,122,39,165,32,224,218,73,151,154,224,+218,17,1,70,70,226,94,1,0,70,224,230,1,232,74,20,231,83,137,181,+199,232,69,62,226,216,68,208,238,231,83,62,224,155,22,118,169,224,155,32,+254,24,0,225,210,91,231,150,39,193,211,225,56,25,77,139,224,88,34,192,+245,227,108,63,224,246,22,224,157,38,209,191,227,178,12,2,111,110,101,83,+21,99,173,0,69,232,39,0,2,69,79,84,192,9,1,78,81,192,9,0,+84,40,40,128,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,2,224,88,59,224,224,59,224,156,1,+234,52,35,226,2,28,229,99,37,113,51,224,174,34,129,74,224,85,23,32,+120,224,85,36,189,247,224,86,24,228,149,37,183,5,224,86,25,238,105,37,+146,129,231,13,21,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,247,187,0,225,65,16,1,67,82,225,51,1,2,67,65,78,225,+46,40,228,104,106,251,91,0,233,125,72,233,124,23,0,66,226,110,3,0,+66,233,125,2,228,83,62,236,173,69,196,242,224,207,17,1,65,67,236,159,+2,0,95,94,224,122,38,32,56,2,95,52,52,100,4,0,53,64,58,1,+50,48,162,228,224,34,14,32,113,224,34,0,90,143,224,36,9,86,101,0,+95,69,42,120,41,120,216,32,47,245,239,1,32,15,0,52,224,68,2,225,+9,8,86,133,93,176,0,49,88,242,33,20,0,52,49,60,1,95,51,99,+170,0,35,89,188,64,19,89,201,160,18,58,184,128,138,246,176,30,249,227,+4,4,99,116,114,108,45,182,181,52,229,5,102,111,114,109,101,100,150,166,+0,94,246,167,9,64,86,249,2,0,64,113,64,239,121,80,52,8,0,95,+145,187,0,49,73,74,96,5,128,172,228,214,0,235,15,1,204,209,224,17,+1,128,40,237,113,3,208,155,244,231,9,237,149,8,228,158,7,238,53,11,+236,204,7,227,7,10,227,114,7,249,237,3,126,253,68,33,225,103,6,253,+208,18,218,10,225,110,4,194,127,58,163,33,181,58,163,66,245,0,83,124,+224,68,91,224,62,1,3,100,101,99,105,33,143,96,47,129,96,32,183,90,+254,90,251,32,153,96,124,2,50,48,48,94,167,160,191,131,116,0,53,77,+220,32,94,33,81,155,2,0,53,161,163,64,69,157,69,190,242,106,106,32,+41,32,11,224,136,18,2,111,99,116,224,134,28,161,69,0,53,120,95,224,+133,0,32,45,224,91,18,2,104,101,120,224,224,27,131,218,32,60,224,224,+4,32,213,92,63,227,43,3,32,5,2,55,32,35,63,222,191,216,108,69,+153,11,224,38,9,123,91,224,38,0,187,49,64,165,224,39,6,102,201,224,+39,0,153,6,1,95,50,40,6,225,172,2,7,105,103,105,116,84,111,73,+110,190,12,227,17,13,192,16,163,27,64,86,193,188,224,49,28,96,176,224,+49,22,64,39,96,255,65,33,32,41,65,124,34,186,127,196,194,3,254,148,+0,131,209,64,27,64,5,253,20,2,66,53,0,54,68,192,99,192,32,49,+224,44,2,128,42,253,204,3,89,107,32,65,64,29,0,39,96,5,35,33,+0,48,64,27,253,219,3,91,172,225,221,6,153,137,64,108,32,107,224,28,+9,160,111,33,106,191,249,125,255,36,244,32,90,1,66,32,38,131,133,64,+224,55,11,160,90,130,231,229,11,20,3,92,49,48,38,227,169,0,108,191,+5,114,32,109,111,114,101,163,168,255,32,9,0,32,97,235,0,115,255,244,+0,66,208,158,198,226,130,18,131,104,67,25,160,42,0,50,78,63,131,177,+224,14,0,226,158,28,226,154,25,64,104,159,15,171,175,225,200,0,97,199,+224,125,1,1,52,54,68,23,64,13,38,74,103,114,231,48,3,1,96,95,+196,170,230,157,3,64,112,166,243,229,4,2,225,97,20,0,69,255,18,0,+10,110,32,105,100,101,110,116,105,102,105,101,191,17,91,29,225,104,5,1,+79,32,102,11,221,22,32,203,159,202,100,197,100,190,33,53,65,92,32,25,+133,64,32,148,0,49,100,96,64,1,34,21,135,136,130,156,197,164,0,53,+97,143,32,255,135,194,98,251,32,64,133,34,32,15,0,50,229,39,0,98,+102,32,10,98,247,2,54,32,89,100,184,6,83,32,73,32,64,90,32,96,+148,160,6,226,158,1,96,54,99,141,98,159,0,89,69,107,99,84,64,13,+64,61,224,59,1,166,69,0,52,131,77,96,10,199,32,0,89,32,49,33,+154,0,80,254,120,35,3,102,97,105,108,33,87,2,116,111,32,124,129,33,+96,0,121,79,126,11,116,104,101,32,112,111,115,115,105,98,108,101,38,116,+5,111,105,99,101,115,58,66,231,129,105,102,199,1,56,32,121,232,97,202,+0,56,35,64,96,152,97,128,224,112,19,224,69,2,224,67,1,137,41,167,+174,164,79,67,246,228,45,1,225,36,0,224,19,2,63,178,191,141,224,2,+2,128,20,224,55,2,225,62,6,224,28,3,0,90,160,204,192,40,193,94,+100,233,64,88,192,93,34,190,65,72,33,89,96,0,192,73,226,70,1,134,+254,192,69,32,39,32,19,134,182,1,85,32,32,10,230,102,0,32,159,100,+222,67,15,100,117,0,75,32,132,64,1,224,82,0,0,53,99,232,96,119,+96,40,69,105,128,41,0,52,100,162,224,33,0,66,99,225,101,16,12,73,+110,32,97,32,115,101,113,117,101,110,99,101,225,114,15,133,90,101,121,99,+216,32,226,197,197,167,70,224,157,15,161,15,101,74,90,249,160,159,170,152,+128,35,65,2,134,60,64,80,101,185,32,44,32,54,224,88,19,0,58,96,+133,128,51,32,223,0,50,116,205,227,23,0,133,198,194,101,106,212,75,228,+218,130,0,53,103,166,32,66,165,35,32,103,161,161,64,106,68,165,0,57,+33,46,64,86,89,249,236,40,4,231,18,0,131,63,234,174,0,32,54,98,+213,64,238,160,95,164,83,64,11,97,222,0,75,96,196,32,16,132,100,0,+85,66,108,32,13,164,88,203,193,97,39,132,60,101,66,32,139,99,182,32,+41,233,100,0,235,193,6,64,247,34,205,0,82,227,203,3,225,225,1,0,+80,67,174,9,46,115,97,116,105,115,102,121,58,32,131,199,236,208,7,96,+95,130,155,99,62,100,218,66,50,65,21,224,75,1,0,82,37,86,2,111,+117,116,67,248,2,105,110,112,32,8,4,40,69,79,70,41,137,85,201,239,+64,73,130,209,1,95,51,76,74,101,14,224,153,12,0,110,164,75,96,63,+138,239,32,253,64,39,133,58,0,51,42,51,160,11,32,83,131,26,229,5,+5,102,95,102,186,227,210,0,227,201,11,99,192,99,195,96,16,32,76,130,+111,32,149,45,26,97,0,234,186,0,229,50,0,0,58,96,173,64,37,97,+36,130,87,224,35,1,96,234,161,243,193,68,224,14,6,232,186,7,0,95,+50,36,198,29,49,129,224,10,0,96,48,132,31,64,6,64,114,192,18,229,+244,23,32,20,98,133,70,117,96,181,229,231,4,33,65,96,113,102,157,0,+50,32,206,224,103,1,167,180,0,51,225,80,3,136,245,142,95,131,153,0,+95,96,50,75,17,32,50,167,27,103,213,224,122,1,134,100,107,232,128,130,+160,80,102,211,224,74,8,136,155,64,6,32,74,67,108,0,85,128,16,194,+218,33,164,197,111,69,67,32,25,229,48,1,64,20,224,28,6,130,103,0,+73,37,57,64,192,64,157,71,79,77,241,32,17,170,144,32,165,128,170,1,+95,51,115,211,192,12,136,76,192,45,64,5,106,190,96,221,96,224,230,49,+6,229,244,2,133,15,96,140,69,168,171,202,197,178,224,5,7,230,125,6,+160,60,230,157,2,230,139,14,230,130,3,134,15,224,116,0,194,231,224,114,+0,73,163,244,13,2,180,140,224,73,2,235,149,0,32,67,240,249,5,199,+76,224,230,1,64,36,134,83,0,49,90,123,64,46,100,214,64,5,96,91,+165,44,32,0,0,79,67,98,231,47,1,224,174,90,195,76,224,174,67,224,+109,17,192,154,224,42,0,224,118,44,172,33,66,180,96,30,231,137,2,42,+130,67,88,224,147,3,64,43,224,250,19,128,127,37,237,0,49,76,156,224,+211,5,98,159,33,121,65,124,67,163,98,234,128,39,224,132,36,225,23,1,+64,1,36,113,192,94,233,66,5,194,202,224,48,4,73,13,224,66,6,201,+15,224,63,9,70,247,245,74,0,238,31,1,160,194,101,220,48,58,64,36,+201,243,233,233,3,0,50,43,85,50,22,224,131,8,232,239,17,15,87,97,+114,110,105,110,103,58,32,67,97,110,39,116,32,102,51,220,32,4,42,187,+236,29,1,233,234,5,173,214,238,143,4,237,223,16,32,67,39,24,45,181,+0,114,44,133,4,111,114,105,101,115,73,81,1,92,57,224,89,1,239,27,+3,160,89,192,203,125,231,224,13,1,225,161,4,238,67,5,224,80,2,225,+210,32,238,151,23,4,32,32,65,115,107,43,224,51,147,1,32,98,40,39,+200,33,37,70,32,140,248,47,0,230,213,0,97,180,165,75,224,88,16,1,+109,105,44,25,1,110,103,97,97,224,82,1,224,40,0,224,157,0,240,23,+1,162,21,71,68,96,97,1,95,53,153,89,129,55,140,229,137,150,142,158,+224,39,1,0,51,108,79,224,157,3,235,134,0,160,63,129,88,105,54,45,+246,32,130,160,186,225,151,0,178,170,1,53,51,70,166,169,205,131,117,160,+19,162,197,203,158,32,76,96,67,106,227,40,112,96,39,32,17,38,78,135,+199,0,85,170,189,32,22,146,86,32,25,167,121,74,93,69,122,32,8,86,+225,68,42,112,88,96,23,40,247,234,125,2,239,51,2,225,190,13,53,62,+0,47,239,64,0,173,29,32,105,135,176,192,93,224,181,1,229,252,7,234,+185,3,128,230,224,251,12,32,81,135,183,0,80,39,111,79,55,135,47,225,+131,1,73,23,128,69,209,144,1,95,53,65,110,169,20,64,35,32,16,0,+56,242,202,2,32,5,12,45,56,47,47,82,79,85,78,68,84,82,73,80,+128,196,135,129,228,25,1,35,230,96,154,96,215,32,98,139,188,65,239,208,+224,97,211,140,50,224,145,4,32,52,162,41,98,58,116,21,96,253,83,207,+2,64,95,56,178,208,0,35,142,47,242,153,2,96,61,99,134,224,122,2,+226,93,6,225,52,0,183,135,128,241,192,181,128,167,224,199,3,97,30,33,+65,32,78,129,202,160,73,240,126,1,64,102,32,210,1,75,51,69,210,32,+14,136,211,4,94,103,101,116,98,65,114,170,180,0,50,38,92,0,79,41,+135,32,153,32,6,0,50,77,7,170,214,65,1,181,0,128,230,0,50,64,+17,226,51,12,225,121,13,244,105,6,12,117,110,107,110,111,119,110,32,116,+101,120,116,32,46,32,1,111,100,35,204,236,58,2,97,209,66,234,64,123,+130,241,138,15,108,194,65,181,235,18,1,97,2,35,9,0,50,50,47,160,+27,96,54,210,61,0,48,108,115,114,43,0,53,96,43,35,79,135,89,45,+156,0,53,182,61,64,54,141,75,0,50,110,227,32,17,173,62,0,49,33,+131,78,47,148,169,74,53,243,170,1,0,57,215,203,38,41,160,92,32,11,+96,134,64,11,32,68,209,155,0,49,33,120,33,3,100,28,0,52,225,8,+2,17,67,111,110,116,114,111,108,46,69,120,99,101,112,116,105,111,110,46,+53,125,2,101,114,110,150,171,224,39,1,3,83,111,109,101,224,35,0,140,+214,168,4,32,100,202,201,161,34,66,152,203,195,73,16,0,53,44,7,34,+75,173,140,70,238,192,233,142,54,64,30,32,17,4,99,97,116,99,104,34,+13,64,63,130,254,226,241,4,67,124,89,199,209,221,65,208,229,160,18,4,+111,112,101,110,70,101,156,3,99,97,110,110,51,36,64,16,216,55,226,235,+2,0,58,99,216,227,240,11,64,109,163,240,68,105,194,21,0,49,111,166,+226,254,3,131,16,224,33,2,67,192,128,90,244,170,1,227,185,2,0,48,+32,21,228,9,7,65,47,134,7,224,5,0,33,58,106,51,69,126,64,3,+224,96,1,98,51,226,210,7,3,72,97,110,100,39,237,11,97,108,114,101,+97,100,121,32,99,108,111,115,207,13,227,190,7,133,124,0,53,80,57,32,+5,136,126,227,195,1,152,39,32,188,130,192,35,179,34,108,32,14,130,161,+114,148,0,90,140,172,96,51,136,163,32,31,217,136,32,19,32,255,0,35,+120,93,64,29,32,20,3,65,46,119,114,57,190,33,220,64,26,67,249,96,+158,67,251,64,126,131,251,0,55,64,13,130,10,134,93,33,41,67,109,0,+48,37,174,167,165,32,32,130,28,7,116,111,70,117,110,80,116,114,32,50,+32,30,208,133,67,132,112,54,32,40,65,100,173,137,130,101,65,200,129,139,+225,142,4,34,152,0,57,110,124,119,11,225,195,1,170,89,167,185,229,58,+4,1,52,57,68,128,64,37,1,52,57,149,23,57,94,233,71,1,35,150,+32,3,79,242,99,228,243,80,1,98,78,162,2,167,115,32,150,193,86,117,+117,68,250,49,210,125,177,96,5,101,4,32,37,129,92,248,99,4,194,77,+100,3,172,155,225,229,2,129,59,232,3,1,224,55,6,229,248,1,229,250,+4,162,126,0,95,162,194,64,122,129,194,5,73,79,46,112,101,114,92,215,+4,73,79,32,94,38,161,191,64,31,129,209,1,102,112,42,113,65,142,129,+207,4,102,112,110,101,119,64,14,165,233,7,97,100,100,95,70,73,76,69,+64,18,129,194,96,18,5,117,116,102,56,32,58,97,70,146,0,0,52,87,+175,116,26,32,21,165,120,64,32,129,188,244,138,0,192,174,232,250,3,0,+49,72,128,224,17,3,64,216,64,19,161,91,234,66,4,0,49,66,153,147,+172,224,23,6,198,116,224,24,6,64,129,224,23,8,227,125,1,1,119,43,+232,166,0,0,52,136,166,187,170,102,173,0,52,114,233,32,6,201,126,193,+111,194,34,226,120,8,32,242,176,149,0,49,34,74,99,76,96,61,105,96,+0,56,225,206,0,104,239,126,190,32,92,65,178,192,6,0,49,52,54,160,+118,32,56,129,194,0,116,91,89,65,76,163,131,0,102,101,18,32,15,197,+145,131,212,234,173,0,67,77,100,11,197,204,66,24,0,50,65,149,200,86,+122,143,155,57,160,18,32,77,195,194,52,21,53,15,181,178,64,24,167,229,+0,51,69,178,0,51,51,243,50,164,99,62,0,51,91,73,160,11,0,52,+61,207,155,171,0,52,95,154,96,20,83,99,65,68,96,12,0,58,96,6,+162,44,65,43,48,239,32,207,32,22,130,45,97,23,0,51,70,154,32,7,+35,13,0,51,81,74,32,41,33,95,0,52,39,5,65,201,32,160,168,153,+67,49,0,51,89,230,0,80,64,165,165,218,64,185,171,89,114,144,184,80,+233,68,3,96,84,32,121,86,213,224,23,9,160,76,131,66,227,95,0,128,+27,246,55,0,160,24,192,52,32,238,166,7,103,235,236,55,0,66,187,1,+61,61,33,113,129,227,84,107,0,52,73,185,226,121,1,0,98,45,232,237,+51,1,128,61,239,203,1,144,165,233,51,13,65,11,236,171,2,132,163,233,+96,15,77,118,233,210,0,33,178,192,196,68,180,96,12,225,54,0,224,237,+1,240,39,4,65,162,169,18,116,156,96,33,65,171,75,112,37,185,160,219,+183,56,96,228,224,43,1,73,138,40,192,0,51,43,167,64,6,69,52,128,+37,235,183,0,64,39,130,119,70,173,64,76,162,36,0,51,64,182,32,70,+100,82,67,42,128,22,66,26,64,85,32,31,212,209,65,139,96,18,0,52,+95,111,231,136,1,112,110,163,200,142,47,32,242,116,224,96,233,96,50,135,+146,64,97,211,174,35,164,184,91,39,195,210,56,32,72,0,60,87,174,188,+132,224,25,9,96,70,203,213,178,86,128,25,163,137,33,222,154,103,226,25,+0,64,24,226,186,0,232,124,0,160,43,96,131,226,74,6,64,41,160,48,+128,36,160,219,120,105,128,0,224,129,12,162,160,224,85,14,132,206,224,85,+8,98,71,224,144,22,132,177,224,58,19,236,233,2,224,145,3,100,115,224,+171,12,166,221,224,112,14,99,76,224,171,45,140,224,224,171,20,224,59,16,+66,59,224,59,10,143,0,160,0,165,185,98,103,34,77,165,51,98,77,110,+231,70,205,154,174,128,3,196,40,164,79,101,176,238,9,2,192,12,0,49,+32,73,192,17,0,64,41,210,192,134,243,87,2,107,145,224,23,0,224,24,+0,224,93,0,116,224,224,99,6,224,86,4,252,57,1,224,142,11,0,52,+61,33,224,47,6,224,24,2,0,52,76,68,225,1,4,98,141,0,58,96,+6,171,66,133,212,193,7,71,209,66,235,36,15,224,179,0,128,123,67,5,+219,164,77,188,131,221,64,72,96,107,96,85,198,44,33,132,227,29,11,164,+223,192,31,69,21,1,52,55,73,155,224,24,0,229,213,7,187,129,64,91,+132,229,0,80,169,90,103,224,68,135,82,247,0,52,104,163,32,11,0,55,+69,56,0,50,73,59,160,19,252,240,2,97,225,210,130,192,66,224,63,2,+96,108,160,10,0,50,41,77,219,184,97,10,170,183,224,10,1,32,144,133,+74,231,25,1,230,123,14,131,64,250,106,1,254,125,0,108,172,117,180,227,+235,2,234,61,0,70,112,246,214,0,229,42,1,230,64,11,33,91,243,25,+4,230,255,11,96,253,231,77,2,225,108,10,69,99,160,0,114,155,32,226,+169,26,69,236,32,74,104,16,64,80,188,127,229,233,2,133,220,32,29,188,+19,1,51,54,40,124,0,51,64,13,128,10,0,52,156,170,128,10,64,193,+128,10,76,86,192,10,224,32,1,94,244,32,80,192,142,32,85,220,31,33,+115,32,30,107,205,0,55,105,188,64,36,137,206,224,142,0,38,188,129,186,+230,124,4,160,58,206,81,128,20,236,142,3,224,43,9,96,33,224,43,8,+235,220,3,96,25,224,18,1,0,52,54,93,105,87,0,54,164,181,32,159,+222,168,250,142,1,191,199,32,28,64,38,224,188,6,129,54,96,193,156,210,+64,11,128,78,66,123,224,40,5,224,55,11,123,49,160,10,219,224,231,130,+2,32,5,162,215,224,196,7,207,26,254,187,4,128,77,82,246,227,78,0,+224,68,6,224,66,2,237,152,0,32,217,220,150,225,83,2,64,145,68,183,+224,199,5,225,173,4,224,74,12,168,221,224,74,7,64,31,224,74,5,68,+33,206,132,160,70,64,94,224,233,8,225,171,2,32,6,213,166,32,105,227,+208,1,188,50,32,19,206,33,0,80,57,163,104,10,64,20,163,2,224,123,+3,0,52,148,88,114,143,1,52,54,144,10,225,73,3,108,163,225,141,7,+43,178,224,53,3,158,42,245,189,2,234,142,1,1,95,39,234,140,3,224,+205,10,135,123,171,4,32,162,201,168,32,183,66,6,128,183,131,70,224,168,+6,42,78,86,130,96,126,224,29,5,122,148,0,52,111,42,96,41,209,115,+70,126,32,5,0,55,34,153,113,180,64,18,32,66,0,35,76,138,32,42,+64,48,224,42,9,77,233,224,42,1,0,49,121,158,32,43,226,40,8,0,+52,108,194,102,104,0,83,141,235,97,16,136,9,0,79,241,153,2,1,46,+46,65,18,224,17,3,1,58,58,128,17,37,19,64,204,69,19,96,12,77,+137,224,12,0,0,49,213,66,224,57,3,1,60,45,224,75,7,1,45,62,+224,75,1,224,48,0,96,62,185,37,224,44,3,0,61,96,44,251,147,4,+226,207,6,0,52,205,242,224,20,5,100,226,33,5,130,227,97,173,66,150,+97,173,64,49,145,249,226,17,12,13,33,64,35,36,37,38,63,43,46,47,+60,61,62,63,87,210,4,94,124,58,45,126,64,136,32,59,194,182,226,163,+3,99,125,134,138,60,12,139,107,237,101,3,192,148,255,148,0,226,101,2,+226,90,2,33,159,224,91,10,143,130,141,217,237,36,2,189,158,249,171,3,+102,255,192,31,224,161,10,255,180,1,104,64,227,208,4,224,151,17,237,33,+0,140,211,160,170,166,141,227,168,5,32,226,228,112,8,67,67,65,96,0,+67,33,227,224,62,1,204,214,33,150,66,174,129,150,131,38,225,150,15,8,+44,59,40,41,91,93,123,125,96,161,136,170,105,228,189,6,77,156,32,102,+0,89,225,1,6,0,89,96,238,69,204,0,64,231,95,1,224,58,6,113,+6,228,248,5,65,54,65,104,249,168,3,96,213,105,97,0,50,80,167,205,+90,231,181,6,224,91,15,237,128,7,225,93,4,224,20,3,0,52,97,248,+239,97,4,140,74,129,224,201,123,132,81,123,137,87,43,133,18,97,4,225,+135,10,69,218,238,246,0,162,58,152,23,100,76,225,240,0,123,144,65,100,+72,80,193,167,64,89,97,167,64,69,225,121,11,64,61,225,62,4,96,194,+0,85,215,24,193,32,162,106,0,51,39,192,32,4,180,12,97,244,67,30,+224,201,7,207,182,224,109,12,117,215,227,247,4,162,231,130,101,65,136,192,+189,66,151,128,189,242,166,0,225,229,8,230,88,7,65,179,224,95,4,191,+196,171,189,232,52,18,226,55,11,165,166,224,20,6,128,86,224,20,5,0,+49,84,147,224,21,9,103,204,224,21,9,151,254,224,21,7,121,241,224,21,+8,224,109,11,156,120,226,228,7,128,85,225,17,4,129,115,240,74,8,193,+163,224,17,3,130,127,224,17,2,148,98,224,17,3,85,50,224,35,6,224,+34,8,141,98,224,17,3,140,56,224,17,3,224,88,8,136,222,224,16,2,+137,94,225,163,8,74,138,104,217,224,95,8,229,25,5,105,149,216,145,227,+75,0,226,190,2,33,36,83,250,0,52,112,200,41,24,94,47,109,40,0,+49,107,115,33,30,34,151,173,109,227,147,10,88,212,109,32,148,59,224,171,+13,68,66,132,217,226,102,23,105,125,224,20,8,136,77,224,20,6,226,35,+11,72,177,224,20,9,226,55,11,107,59,224,20,7,75,149,224,20,9,129,+37,224,20,6,226,118,11,76,214,224,20,9,224,209,11,77,64,224,20,9,+224,209,11,65,226,224,20,9,224,209,11,111,193,224,20,7,112,216,224,20,+8,224,209,11,118,214,224,20,8,224,209,11,83,250,224,20,9,224,209,11,+84,85,224,20,9,224,209,11,107,214,224,20,8,224,209,11,106,76,224,20,+8,224,209,11,228,26,12,119,175,224,20,8,228,47,11,107,153,228,47,10,+227,249,8,95,79,224,17,5,178,157,224,17,3,227,215,8,89,50,224,17,+6,133,253,224,17,3,197,170,224,17,1,228,155,8,177,201,224,17,3,228,+84,8,93,242,224,17,6,228,138,9,228,192,9,224,179,8,135,88,224,17,+4,224,179,8,92,152,224,17,6,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,178,33,71,210,0,51,42,57,133,174,233,99,+0,0,52,49,54,255,235,2,1,79,72,191,225,224,79,5,224,47,17,224,+46,8,128,178,32,103,224,50,14,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,227,83,8,+225,198,22,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,178,5,224,0,17,238,95,11,221,17,46,172,242,109,12,115,193,0,39,+146,18,250,191,2,155,159,247,59,3,187,18,58,95,137,132,224,19,0,185,+30,112,67,238,243,3,224,39,2,242,65,16,82,63,216,201,32,161,146,179,+127,85,141,38,50,150,122,132,32,39,96,4,112,95,145,121,71,203,192,217,+178,64,1,52,52,33,90,77,4,156,108,96,9,0,49,46,212,32,3,128,+95,184,160,0,49,52,119,32,13,146,34,95,62,32,55,255,62,2,78,131,+213,25,246,164,24,250,218,26,32,81,176,229,32,119,1,95,52,58,180,32,+28,79,150,1,95,52,68,164,32,11,77,182,0,52,68,125,74,245,106,249,+43,255,206,4,0,52,111,1,32,6,107,1,224,13,0,65,66,33,54,32,+92,215,122,48,20,32,4,32,81,85,0,147,31,32,29,208,162,128,29,32,+136,224,29,4,186,58,224,59,1,33,28,32,35,32,25,183,61,45,195,156,+159,32,5,92,170,160,147,122,223,0,52,67,54,32,5,96,190,66,222,0,+95,124,205,128,34,124,199,96,10,32,76,214,231,82,99,99,107,128,65,32,+25,129,146,92,98,160,16,129,149,224,42,2,192,27,64,28,129,167,123,157,+254,249,0,125,16,158,114,252,68,6,1,95,51,108,74,253,238,1,254,150,+1,93,38,131,26,32,94,128,38,97,169,64,104,64,97,245,30,0,147,39,+156,23,157,81,32,141,108,160,224,34,0,224,9,1,79,187,64,31,129,169,+133,29,32,7,119,184,64,58,32,89,0,75,83,50,32,13,129,180,0,90,+160,13,129,164,0,75,130,127,64,62,98,141,0,90,224,1,2,228,3,0,+32,31,193,154,126,58,130,59,123,214,65,166,225,102,8,32,31,32,25,193,+102,179,163,224,6,0,254,174,14,66,192,255,62,13,32,75,129,161,83,251,+226,55,2,96,25,184,125,129,102,99,179,83,47,226,93,8,195,250,160,4,+1,83,32,67,254,224,48,32,193,253,253,174,4,182,191,224,207,1,158,64,+244,152,4,224,237,4,115,65,32,232,157,252,64,242,0,53,66,8,204,42,+193,112,160,62,160,110,128,113,164,208,160,116,193,254,64,90,192,25,160,123,+224,117,22,224,115,5,224,113,5,224,51,17,174,7,224,0,2,0,58,100,+70,193,248,1,52,48,33,59,0,51,111,88,186,117,0,48,101,146,67,194,+0,50,36,186,64,235,69,15,165,35,68,204,0,52,73,145,205,37,66,59,+74,107,224,157,5,32,99,164,195,0,52,42,86,32,67,35,50,146,100,242,+111,1,191,143,163,106,32,23,36,237,224,34,18,33,244,32,2,79,250,64,+190,64,168,224,139,0,64,62,224,96,0,160,46,149,249,38,167,161,100,192,+56,223,127,255,177,1,224,60,3,224,137,6,198,107,152,177,0,52,77,170,+179,113,113,154,225,16,4,217,133,225,251,0,128,75,59,98,160,44,161,234,+224,70,0,0,52,43,62,192,71,64,72,83,176,175,163,224,42,7,224,113,+2,224,41,6,33,104,132,26,67,95,1,75,52,227,249,0,32,23,132,36,+224,23,9,199,215,33,27,195,63,131,52,130,74,185,204,58,76,224,22,2,+250,41,2,64,146,162,60,224,1,1,68,205,255,71,2,224,20,5,224,17,+8,224,14,5,224,11,2,255,73,3,160,109,132,163,32,197,64,195,224,197,+2,164,161,64,155,1,52,48,102,93,77,85,32,24,198,16,32,222,128,181,+32,19,198,7,130,20,225,81,4,98,199,225,5,2,131,75,160,239,192,92,+226,20,4,162,96,66,167,134,251,64,33,225,81,3,198,48,228,138,0,233,+13,3,192,21,160,104,224,29,0,219,5,250,249,1,32,88,131,67,96,157,+0,50,32,24,233,252,1,4,102,111,108,100,108,141,41,67,121,33,234,32,+45,216,114,160,134,0,83,228,209,4,96,79,130,18,97,5,201,182,248,124,+3,101,180,97,16,251,49,1,192,176,194,24,219,240,128,169,96,57,214,116,+1,64,95,116,29,132,226,103,93,100,20,128,36,35,6,224,36,5,197,9,+227,124,2,32,40,99,46,161,2,32,176,130,171,224,79,0,234,50,0,134,+113,136,160,64,6,97,230,68,242,166,232,73,20,67,130,65,214,71,183,199,+211,64,15,64,9,199,205,58,109,72,119,96,77,32,64,130,108,162,84,137,+119,103,15,73,125,102,169,36,12,163,37,106,105,230,102,4,128,113,233,57,+2,96,153,230,240,1,128,209,220,104,128,252,32,59,164,48,253,91,2,68,+58,193,182,97,118,232,184,3,229,228,0,192,86,197,188,65,31,230,227,0,+128,8,168,169,162,124,160,243,155,1,0,57,87,228,224,64,0,229,23,1,+192,25,131,249,64,14,226,143,0,231,26,0,224,174,13,224,124,7,233,40,+1,224,127,22,224,101,3,224,130,8,224,156,5,225,91,4,192,247,97,102,+0,54,227,28,2,24,92,51,52,38,46,47,108,105,98,47,68,97,116,97,+47,73,110,116,101,103,101,114,46,104,115,64,24,0,44,34,63,0,58,131,+57,33,141,189,200,0,51,32,82,134,187,0,58,96,111,163,36,136,109,165,+202,128,225,130,255,96,23,162,138,67,52,230,177,7,200,22,225,230,0,64,+57,228,22,4,196,201,192,7,34,152,87,6,0,75,32,70,224,204,36,3,+54,52,58,54,132,6,166,243,227,161,1,96,116,198,74,227,177,0,108,180,+227,162,3,64,251,221,153,228,157,0,163,107,0,51,72,76,231,212,0,228,+200,0,224,80,11,98,161,224,80,8,154,81,104,146,65,90,196,207,131,65,+100,120,90,109,229,136,1,32,85,36,180,228,48,11,228,105,13,160,47,98,+92,197,159,224,61,11,101,179,228,108,4,224,79,11,228,154,18,232,20,3,+32,200,133,106,196,10,65,213,234,130,19,169,148,97,10,36,124,32,63,173,+101,64,127,88,232,128,8,0,53,229,136,10,34,80,121,9,32,51,229,11,+0,136,100,172,67,167,178,65,142,254,197,0,225,83,0,232,74,1,97,34,+107,178,224,99,4,227,214,0,0,89,236,195,2,173,16,194,66,194,183,101,+65,236,89,0,160,85,68,162,130,102,198,30,168,63,140,85,96,145,224,143,+4,236,71,19,192,146,96,246,230,239,4,6,108,116,87,46,99,109,112,162,+233,161,19,160,6,32,8,153,237,161,91,166,5,0,51,32,28,227,211,0,+133,216,229,74,6,194,108,231,0,6,162,239,231,2,8,227,73,15,97,91,+64,109,162,244,231,226,1,100,217,68,30,236,40,0,227,161,46,224,91,0,+227,161,10,224,95,3,227,161,32,224,80,1,162,150,97,121,33,40,134,232,+163,161,227,140,38,129,208,227,51,2,224,10,1,32,89,134,248,34,212,32,+11,133,118,113,13,32,205,146,122,128,75,0,58,81,31,232,164,0,235,191,+4,138,20,233,77,2,128,229,32,133,98,66,32,70,225,98,0,205,95,162,+147,64,5,64,140,224,243,0,97,9,32,19,40,109,225,7,1,96,142,32,+201,128,246,129,52,225,36,2,132,100,225,229,1,229,232,1,32,179,132,216,+195,2,192,39,97,118,96,86,32,160,160,74,32,44,235,176,0,0,50,74,+213,96,36,32,21,132,18,243,110,10,195,189,242,91,0,240,183,0,202,111,+162,208,242,107,4,234,106,3,235,217,1,129,22,162,34,64,97,62,14,38,+122,102,195,169,118,224,69,16,203,181,243,153,10,160,27,115,158,64,92,179,+226,65,97,203,133,194,106,108,183,66,154,212,214,97,32,63,187,32,4,66,+132,208,139,1,95,50,127,60,244,86,5,33,38,234,17,3,237,106,2,98,+236,81,51,129,102,225,172,2,65,95,129,172,132,44,224,58,44,227,115,3,+224,58,38,188,248,194,147,224,67,0,224,56,25,188,237,0,51,42,125,229,+9,1,15,118,97,108,68,105,103,58,32,66,97,100,32,98,97,115,101,133,+18,71,76,96,83,67,10,108,220,0,51,52,18,59,146,149,218,224,17,1,+59,115,142,171,224,48,14,102,168,224,48,5,0,49,74,253,64,49,98,101,+224,49,8,0,54,98,163,224,49,4,33,205,97,185,100,23,66,48,99,229,+231,125,4,231,177,4,34,99,98,39,32,5,128,78,254,46,0,224,61,39,+135,103,224,61,12,224,48,13,97,32,165,4,0,56,106,79,224,231,15,225,+74,11,96,171,224,231,10,224,107,23,224,99,34,0,52,168,126,224,99,38,+35,41,135,7,224,206,35,163,112,224,106,37,32,105,183,79,85,251,119,203,+35,202,100,29,45,91,77,121,106,67,71,255,32,5,64,29,85,245,128,114,+117,245,128,10,32,70,134,123,1,62,61,38,33,64,39,64,11,64,10,134,+44,0,60,32,10,64,79,32,10,0,105,40,9,64,13,178,97,228,142,6,+71,207,248,87,2,0,35,108,45,224,20,7,64,197,224,20,8,151,247,224,+21,7,64,116,224,42,9,123,251,119,122,224,21,2,65,47,216,199,252,243,+8,224,17,21,129,75,224,16,19,168,234,224,16,6,33,6,207,246,230,58,+10,246,107,2,103,44,121,182,201,233,128,23,192,35,135,54,148,162,199,66,+224,35,4,237,244,3,232,189,2,233,208,6,32,18,79,23,224,21,0,224,+66,0,102,119,243,166,9,241,242,0,234,114,0,77,46,64,66,83,119,211,+125,245,252,1,66,142,230,57,0,138,180,141,141,237,140,24,97,32,251,75,+0,166,185,150,225,241,221,11,225,104,1,40,95,232,32,1,89,1,161,102,+234,172,0,192,23,225,128,0,138,69,81,189,64,0,71,67,96,75,128,48,+96,143,33,182,231,239,0,1,51,55,35,169,251,9,3,32,28,251,123,12,+98,179,97,163,51,156,226,101,7,96,54,170,250,226,6,6,225,51,4,231,+109,5,167,101,224,236,2,1,51,55,194,87,131,213,0,80,37,146,117,121,+32,17,187,15,0,51,84,184,0,51,90,246,128,133,187,97,0,51,43,236,+192,86,0,51,33,51,160,11,32,55,131,204,137,87,32,44,82,55,76,174,+68,218,32,41,65,178,97,98,32,41,219,88,0,75,243,236,3,96,49,135,+244,104,241,128,72,123,217,32,54,234,221,1,96,17,208,240,32,10,32,217,+233,191,0,89,41,0,51,72,201,195,42,0,51,123,24,69,25,96,189,64,+29,227,72,2,97,207,128,29,52,239,32,164,98,45,32,35,225,181,0,57,+145,32,57,34,94,92,12,166,146,65,118,92,52,64,228,32,213,192,143,96,+7,64,41,129,113,32,246,32,38,217,31,96,195,225,235,2,64,63,32,46,+64,69,105,224,138,83,110,228,253,60,1,78,45,113,90,96,90,65,118,64,+79,33,141,206,191,32,86,130,11,33,0,0,51,193,73,32,20,165,169,0,+51,61,58,130,27,32,19,203,242,129,18,0,90,125,178,133,219,32,28,251,+94,2,224,158,2,128,103,204,79,64,5,229,7,3,101,3,171,246,75,97,+224,113,1,66,45,0,58,96,27,96,19,33,100,58,20,0,51,84,150,64,+22,165,207,160,156,84,211,96,104,129,249,32,45,83,199,0,51,71,115,67,+66,32,27,246,224,0,0,50,98,2,32,17,225,74,0,160,44,93,233,32,+22,246,177,3,246,103,8,32,31,251,7,2,0,51,51,160,105,113,170,169,+64,113,84,2,1,51,53,214,112,192,244,66,140,85,153,65,90,216,79,138,+23,206,254,207,75,129,26,0,50,125,3,0,49,35,12,32,4,32,113,204,+88,128,33,235,34,2,224,236,0,226,83,7,64,205,164,195,129,134,129,40,+235,38,2,96,40,96,42,134,137,34,106,234,57,1,19,80,114,101,108,117,+100,101,46,114,101,97,100,58,32,110,111,32,112,97,114,202,63,154,130,32,+235,33,89,82,131,224,57,19,8,97,109,98,105,103,117,111,117,115,224,64,+3,65,33,130,43,66,64,64,13,205,227,37,182,96,16,67,237,206,0,64,+158,228,168,10,229,207,1,155,44,240,99,1,226,241,3,236,129,11,108,121,+229,179,10,32,106,190,238,66,108,33,216,32,67,32,19,177,126,160,19,99,+6,64,127,227,6,2,93,103,65,95,237,169,1,98,42,65,130,96,184,163,+114,228,74,2,64,167,143,114,237,167,1,130,64,65,253,193,195,44,218,160,+11,32,76,165,79,96,180,32,166,227,130,1,164,36,69,98,146,123,224,64,+0,59,86,164,60,38,220,224,10,0,0,51,36,132,224,86,1,229,110,0,+254,190,0,102,178,239,14,0,224,18,3,79,27,108,139,193,46,163,175,96,+147,33,38,197,11,71,145,128,135,96,218,128,135,96,159,128,135,160,10,96,+251,127,124,96,6,193,42,64,11,229,87,2,214,73,225,30,2,128,85,129,+30,96,11,32,64,196,15,229,176,3,64,172,69,121,64,155,112,98,161,59,+64,47,193,233,229,194,3,195,153,83,21,224,49,2,132,113,64,6,32,49,+0,73,34,145,64,44,192,10,196,46,32,39,95,39,99,139,160,16,80,163,+231,207,5,32,30,161,198,64,232,90,174,135,162,224,5,0,101,29,207,160,+96,67,98,45,239,211,2,200,72,160,30,141,79,224,30,9,165,40,249,189,+1,230,155,4,100,68,224,46,2,121,220,175,176,0,51,38,172,247,135,1,+251,249,2,100,131,253,14,4,255,19,2,160,176,81,130,224,21,1,69,49,+252,16,4,134,131,113,187,169,55,192,24,193,217,130,161,129,217,136,16,64,+6,167,69,168,3,89,191,64,34,131,110,231,251,0,0,58,96,25,165,118,+226,180,0,99,155,79,60,104,158,129,22,161,59,130,69,91,144,64,34,194,+16,104,175,65,154,128,43,184,159,234,240,0,234,220,1,224,19,2,247,185,+5,224,32,2,224,9,10,181,48,225,223,3,232,58,7,0,64,101,239,74,+205,160,218,224,4,0,222,95,96,58,175,125,224,57,9,224,179,7,129,169,+226,102,0,162,96,64,41,192,83,224,84,5,224,82,5,224,81,11,224,91,+4,224,82,9,224,183,3,224,58,17,226,239,5,224,59,20,225,114,9,224,+9,2,213,163,177,28,209,57,227,87,1,224,240,10,160,100,227,69,2,194,+254,139,137,236,195,3,96,164,97,163,98,185,97,47,179,103,0,51,95,94,+0,51,109,223,194,74,96,0,224,98,2,47,83,250,12,0,224,151,32,226,+162,5,224,100,2,131,170,178,85,225,7,0,205,140,224,13,21,99,166,130,+124,224,252,0,224,254,0,243,177,1,204,139,196,1,96,248,155,124,219,155,+73,4,225,19,9,224,248,6,136,235,224,98,20,245,157,0,192,97,223,80,+96,96,228,41,3,194,11,226,202,6,225,71,31,225,224,24,160,107,225,214,+21,226,202,21,226,142,3,193,99,224,49,41,224,176,2,228,22,9,225,93,+10,230,3,4,224,45,5,224,47,8,234,143,3,224,141,15,150,33,226,35,+4,193,63,224,142,23,252,140,16,5,84,101,120,116,47,80,73,255,2,114,+67,111,42,16,7,110,97,116,111,114,115,47,82,42,33,0,80,252,156,0,+3,53,49,58,51,252,156,0,166,18,72,66,96,108,174,35,96,11,37,171,+135,138,116,148,64,169,96,150,64,35,137,90,238,45,5,150,146,32,52,135,+180,108,227,137,159,64,46,192,70,215,18,128,71,220,0,70,157,64,21,142,+177,102,155,166,177,32,14,103,238,90,179,192,85,140,87,64,23,230,152,0,+238,150,1,64,61,134,95,0,55,135,64,255,213,1,226,254,0,226,251,1,+249,142,2,64,64,206,182,96,120,105,77,98,155,32,11,72,160,96,11,32,+97,135,17,241,197,3,128,216,64,100,250,76,0,83,195,250,53,2,150,73,+68,84,64,17,119,206,224,117,0,248,183,4,236,165,3,135,231,236,191,5,+164,143,251,219,3,32,198,192,126,96,88,33,135,64,104,130,185,224,104,5,+224,158,1,90,42,192,22,224,159,30,138,142,224,205,38,242,201,2,224,182,+9,224,140,1,224,179,19,224,112,30,201,146,232,67,8,161,153,233,164,2,+225,88,3,229,227,1,224,157,2,64,5,248,79,0,225,92,146,244,21,1,+193,96,224,195,14,225,105,76,224,125,5,122,197,244,100,4,130,179,171,235,+97,99,101,241,166,197,224,147,2,251,241,1,225,45,37,128,78,224,7,1,+224,123,99,224,86,10,224,85,58,96,71,128,163,224,204,101,255,221,8,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,71,0,+58,69,29,140,58,108,221,172,200,190,27,246,133,4,193,167,96,52,243,247,+1,177,245,32,19,221,133,133,207,32,16,211,218,242,39,2,168,96,242,51,+8,64,46,230,123,0,0,50,236,173,1,70,107,207,61,79,82,75,202,75,+126,173,186,175,64,134,116,69,242,76,147,175,64,160,10,206,68,64,76,211,+172,163,112,128,5,252,63,0,117,2,236,111,0,189,106,79,26,175,203,233,+38,4,224,28,7,238,76,11,140,39,224,65,9,182,53,96,24,157,161,97,+123,159,142,175,80,96,49,32,178,214,33,164,13,199,4,66,77,226,44,0,+192,75,68,88,199,5,132,71,128,46,167,50,224,34,7,32,93,199,111,33,+96,64,105,128,121,135,41,64,6,110,14,0,58,96,67,114,135,128,1,120,+142,32,33,64,199,210,144,224,4,3,158,182,128,205,32,37,130,22,225,212,+0,32,17,130,23,0,90,224,57,7,224,87,0,210,56,224,87,6,224,34,+3,130,22,234,230,6,237,40,2,64,242,255,106,0,239,79,2,132,244,160,+14,32,77,99,132,160,38,230,98,3,168,194,0,67,129,148,98,117,128,64,+64,84,96,26,32,132,240,197,0,82,91,0,50,116,221,32,6,117,145,84,+239,193,61,242,61,0,211,136,69,212,161,243,32,211,115,137,184,217,230,207,+1,131,28,168,45,243,182,4,251,30,2,113,192,180,241,132,102,193,40,105,+224,64,85,32,5,237,112,0,224,38,10,224,123,2,64,181,193,243,228,78,+6,7,105,110,105,116,58,32,91,93,100,50,68,29,225,90,0,224,114,4,+193,54,224,115,1,0,58,96,9,97,36,230,216,0,2,115,101,113,192,213,+128,19,224,16,2,228,25,11,64,68,130,105,95,98,1,95,50,50,197,189,+20,245,250,1,224,170,1,3,35,108,105,110,181,65,144,7,106,43,224,42,+12,8,123,45,35,32,76,73,78,69,32,245,177,0,138,87,81,69,0,57,+152,109,0,50,69,148,32,13,100,248,224,57,1,3,32,35,45,125,128,52,+32,155,216,228,225,21,2,67,37,212,187,229,181,0,96,86,104,90,131,126,+32,13,32,152,45,67,0,50,81,166,213,141,160,25,35,172,128,16,32,96,+197,70,242,100,0,225,123,1,207,117,98,82,242,40,0,32,51,131,66,64,+129,0,50,75,125,248,77,5,0,35,70,90,107,62,224,28,11,130,247,224,+18,4,159,253,32,86,227,118,0,198,39,101,53,182,235,1,50,57,119,228,+128,155,167,1,239,129,0,232,206,1,243,52,0,224,51,0,224,186,2,244,+200,0,242,245,2,96,81,32,124,131,110,88,35,134,158,224,43,9,224,42,+0,214,7,4,57,48,32,79,32,96,238,100,122,97,214,216,152,0,50,158,+92,0,50,92,164,32,25,215,93,225,94,0,207,102,96,91,225,125,10,239,+250,2,160,127,243,198,6,0,58,96,90,96,135,44,239,130,91,192,161,64,+123,96,110,212,149,109,150,32,140,66,105,132,128,32,50,96,20,193,28,32,+52,194,106,0,95,93,51,74,12,32,19,249,179,2,197,160,237,84,3,192,+137,231,92,0,224,37,6,224,39,4,64,40,245,171,0,66,153,0,56,119,+34,102,27,32,26,167,62,160,205,71,0,0,49,85,201,32,25,218,241,184,+154,1,50,56,166,88,0,49,55,58,0,75,32,117,225,43,1,167,57,0,+49,90,66,241,94,1,32,107,64,17,227,97,2,3,32,97,116,32,67,202,+163,156,226,54,2,128,63,56,113,33,75,152,147,224,66,14,2,99,111,108,+192,61,130,42,224,57,8,65,204,152,38,224,61,8,4,92,49,48,38,32,+32,0,7,117,115,101,100,32,98,121,32,160,73,128,62,1,50,56,235,195,+0,160,20,47,241,128,20,32,11,39,139,128,11,33,7,215,252,1,55,56,+122,148,66,2,34,144,67,79,136,224,1,50,55,197,31,227,221,11,168,72,+145,233,96,45,245,163,0,97,121,90,88,0,49,91,163,64,26,130,28,154,+44,0,50,191,12,0,80,55,127,32,105,240,116,10,11,99,112,112,104,115,+115,114,99,47,109,97,108,33,40,11,109,45,119,97,108,108,97,99,101,45,+117,110,42,47,48,133,0,47,96,33,6,45,49,46,50,48,46,57,128,12,+208,134,3,55,57,58,49,196,254,191,88,86,249,128,147,96,110,192,147,130,+76,1,75,32,32,10,194,60,62,20,33,14,92,1,0,50,222,254,58,217,+70,114,64,246,32,26,129,69,32,233,128,38,81,49,67,10,192,11,72,171,+159,6,96,6,194,101,129,57,225,194,4,10,69,120,105,116,83,117,99,99,+101,115,115,197,225,131,248,127,47,65,103,42,38,97,168,164,224,226,7,11,+64,68,5,70,97,105,108,117,114,166,85,224,36,1,228,89,2,97,247,70,+102,66,87,0,35,105,212,226,24,2,160,210,98,24,96,11,32,186,176,135,+147,174,164,54,222,249,105,185,128,16,128,73,0,58,96,178,97,42,67,79,+35,144,32,86,0,49,33,93,224,167,1,6,83,121,115,116,101,109,46,64,+174,64,167,224,192,5,2,67,111,100,128,189,194,91,32,80,235,193,1,39,+84,33,8,100,107,137,14,82,24,32,33,130,80,224,73,1,130,10,32,71,+32,27,187,239,0,50,63,20,0,95,91,37,32,18,230,114,0,68,210,192,+80,33,208,95,34,72,103,95,22,129,104,32,44,228,101,0,0,50,32,209,+196,252,64,33,32,27,130,41,193,172,75,236,0,50,94,244,103,64,95,62,+32,196,114,226,96,47,32,41,4,94,112,117,116,98,34,98,191,90,32,82,+0,56,33,155,0,95,65,59,32,6,0,50,95,28,163,108,191,59,234,139,+1,96,28,167,189,209,164,74,188,132,150,125,3,168,150,229,166,5,94,187,+228,147,3,224,242,4,181,31,0,50,34,214,37,43,170,63,0,50,72,133,+0,50,132,245,233,93,6,8,66,97,100,32,72,97,110,100,108,45,166,193,+168,96,37,95,171,129,254,191,201,98,25,233,228,4,221,31,160,121,98,57,+0,50,99,125,102,140,0,50,133,165,230,74,0,128,76,185,197,35,74,32,+12,129,201,3,102,112,50,112,64,13,129,196,0,95,34,29,251,116,6,246,+66,2,116,251,228,131,0,163,236,224,6,12,224,42,2,64,15,164,32,224,+42,29,160,28,224,49,10,224,42,15,224,49,10,224,42,22,224,49,3,68,+115,75,198,97,162,33,9,194,161,130,133,73,162,65,146,66,142,32,28,162,+162,34,100,33,62,81,208,32,19,199,3,242,159,0,209,199,73,33,158,16,+223,68,252,19,2,208,32,129,199,223,120,32,78,200,169,37,206,66,62,117,+172,96,62,32,27,219,214,199,204,167,194,0,58,96,37,101,17,162,18,0,+95,95,132,226,187,4,224,179,2,99,80,36,147,232,105,2,0,50,95,220,+96,72,230,104,0,226,171,5,0,104,54,142,98,160,92,50,96,45,97,7,+117,167,166,193,128,255,235,223,2,161,1,247,88,3,75,220,246,82,2,224,+5,3,203,14,189,118,243,228,0,114,160,225,85,0,98,247,98,220,96,40,+32,5,99,104,224,42,1,128,6,224,38,0,224,87,6,160,47,192,159,135,+97,32,151,0,79,96,33,71,89,224,109,1,152,53,0,50,45,107,33,254,+159,148,94,219,37,253,65,92,248,55,4,234,10,0,164,48,96,85,140,124,+229,145,2,1,45,79,168,75,96,71,166,63,205,229,128,64,224,52,10,9,+45,115,116,114,105,112,45,101,111,108,164,32,224,188,131,229,38,5,224,192,+19,196,221,225,169,255,225,169,105,252,98,2,64,69,239,26,12,6,45,45,+104,97,115,104,101,169,55,227,134,255,227,134,255,225,169,255,227,134,54,72,+113,136,171,224,6,3,234,86,3,244,11,2,167,43,116,16,252,84,8,99,+148,129,250,244,49,0,96,148,167,88,106,3,244,53,0,64,200,226,44,3,+187,63,167,153,219,118,182,141,160,33,160,99,248,215,1,224,117,4,148,208,+114,140,105,34,178,55,232,234,7,225,46,0,236,239,0,96,137,241,50,2,+240,141,2,196,164,213,149,244,249,5,224,195,0,224,39,1,224,177,3,235,+191,2,241,168,3,149,71,224,172,17,241,193,7,192,78,129,135,225,81,11,+98,35,229,66,13,0,111,195,99,2,66,32,82,149,29,192,91,224,254,4,+128,10,80,6,192,0,252,215,5,225,203,4,220,233,194,15,226,3,0,214,+49,225,242,22,246,85,28,0,49,206,191,227,95,2,224,178,4,192,12,96,+180,34,215,0,54,250,138,4,225,187,34,255,122,0,188,139,225,192,7,245,+238,25,3,97,110,115,105,230,164,0,225,3,3,192,78,224,72,31,3,116,+114,97,100,59,42,2,111,110,97,196,46,160,255,162,40,224,61,21,1,115,+116,139,21,194,70,180,151,1,50,51,76,81,79,31,58,157,186,175,195,227,+224,34,17,140,185,226,123,52,0,120,226,123,4,229,48,2,224,77,44,4,+105,110,99,108,117,238,152,1,226,207,8,247,98,17,0,45,192,59,0,61,+225,30,4,254,244,4,226,42,0,64,144,224,139,24,0,80,232,146,6,225,+231,6,163,38,246,218,7,133,202,224,70,2,0,67,96,70,224,30,17,128,+31,225,53,52,0,65,225,131,11,224,250,51,3,45,104,101,108,231,184,0,+224,73,53,83,225,34,235,224,76,60,224,75,7,195,131,225,48,2,196,158,+241,82,0,227,87,0,228,22,12,247,218,0,238,34,0,100,135,225,169,1,+135,181,231,147,3,195,71,112,144,99,71,224,18,0,79,6,160,18,147,190,+234,245,18,224,203,9,224,45,65,225,189,4,227,255,7,112,156,227,255,6,+224,78,21,1,110,111,250,233,1,232,81,1,0,50,50,245,241,108,3,225,+35,2,225,46,3,104,109,224,85,9,2,68,85,73,96,80,47,217,211,224,+52,146,87,192,90,207,155,147,96,5,96,103,210,79,64,85,224,43,3,254,+6,0,64,46,224,41,1,32,40,223,204,224,40,0,130,16,224,35,0,32,+34,214,38,160,34,0,75,224,119,5,113,9,231,173,0,32,46,241,116,1,+252,58,10,32,31,145,69,0,85,50,218,85,91,96,10,52,227,0,58,65,+117,212,128,0,51,84,97,66,92,64,22,213,21,176,203,222,70,165,181,192,+18,40,74,64,21,225,168,1,241,205,7,101,26,75,70,192,168,64,100,149,+239,162,208,63,178,40,122,150,125,145,139,247,249,0,65,107,103,85,99,32,+43,126,0,95,90,71,39,151,160,78,128,192,249,247,2,92,79,32,17,217,+226,32,14,32,13,129,107,96,31,148,234,64,195,242,53,0,181,16,75,212,+96,19,242,69,0,32,19,129,51,243,223,5,32,22,184,202,32,162,35,133,+87,170,147,47,99,144,0,58,96,6,32,30,61,203,2,117,97,108,33,110,+64,33,161,96,0,50,148,131,97,96,83,63,192,22,96,86,64,28,250,111,+1,181,94,154,111,64,32,250,111,0,101,206,192,139,64,38,32,25,0,82,+160,162,32,16,223,138,146,124,129,135,220,35,96,158,184,106,243,24,48,94,+8,96,72,225,29,0,243,24,5,0,116,56,35,99,59,97,125,64,45,128,+213,51,145,32,41,83,85,32,6,97,2,71,49,32,27,0,73,33,36,64,+16,249,0,2,0,49,123,214,0,49,132,5,121,0,128,56,153,0,192,11,+86,71,96,11,32,63,181,201,89,0,33,27,96,106,164,67,0,51,224,155,+2,5,101,114,114,111,114,58,154,193,184,134,96,38,32,64,163,230,248,86,+16,8,67,111,110,116,114,111,108,46,69,64,66,248,88,6,64,18,0,67,+58,53,248,89,6,64,197,127,172,163,18,215,79,64,7,230,100,1,173,64,+119,72,215,232,32,128,98,227,67,193,171,133,98,11,32,4,169,53,120,159,+64,99,194,221,215,199,64,32,251,70,24,255,30,0,66,95,96,162,35,197,+225,198,5,6,109,100,53,67,111,109,98,37,89,6,58,32,101,109,112,116,+121,217,244,86,68,223,216,128,171,64,93,104,104,156,65,1,49,48,65,131,+65,209,0,64,94,162,91,16,166,233,66,145,237,6,1,194,149,236,102,3,+225,0,1,0,48,96,19,199,32,32,156,66,118,65,40,122,171,97,17,95,+219,32,40,215,207,128,208,130,149,0,94,32,190,4,65,114,114,97,121,66,+91,226,130,0,226,243,0,66,70,96,161,32,62,183,29,64,192,248,184,0,+248,76,4,32,35,67,2,224,46,2,169,242,192,46,32,241,163,43,227,39,+0,32,40,159,252,32,146,64,201,162,230,64,20,121,209,64,211,172,21,229,+2,10,246,27,2,238,102,0,225,59,0,233,232,13,32,67,58,11,128,67,+36,11,32,135,65,35,32,134,1,48,32,128,82,238,130,7,239,44,5,249,+58,2,64,52,101,175,224,45,2,96,96,172,190,229,134,7,226,161,0,98,+251,249,96,1,224,43,10,194,137,224,38,0,160,16,33,24,131,191,255,188,+4,207,0,32,29,163,156,0,49,36,77,32,157,68,255,194,5,129,255,0,+35,64,69,0,95,72,53,32,44,131,117,0,35,35,209,32,12,167,104,0,+49,36,173,35,9,80,144,162,60,0,49,96,70,0,49,69,14,32,5,80,+228,64,16,64,11,0,53,224,11,2,98,137,96,11,1,50,48,64,179,192,+11,120,232,64,12,155,232,97,37,154,30,137,240,238,186,6,248,230,4,242,+98,3,65,254,98,55,32,192,71,96,64,243,32,13,162,251,33,64,32,104,+64,23,70,216,192,23,241,190,1,0,56,32,206,224,29,7,224,53,16,88,+103,36,53,193,87,192,68,224,151,0,67,142,0,83,162,95,128,69,224,93,+10,128,161,134,47,71,50,224,31,6,130,111,199,158,96,235,32,73,0,57,+33,132,224,142,10,128,16,96,52,127,4,33,96,199,150,1,75,52,225,255,+0,32,23,131,210,128,155,171,10,128,163,200,63,198,173,97,103,220,13,64,+34,34,39,111,178,96,206,77,153,255,253,8,22,46,47,108,105,98,47,68,+97,116,97,47,73,110,116,101,103,101,114,95,84,121,112,101,223,224,1,50,+56,223,224,160,69,0,57,68,10,0,57,98,197,58,143,98,203,224,18,0,+42,87,32,133,224,5,0,255,17,0,224,60,6,161,72,32,4,0,89,228,+9,1,69,232,64,171,128,199,96,218,243,207,1,98,164,0,56,122,144,227,+134,0,98,190,128,19,227,88,1,32,239,0,51,131,239,33,54,189,226,1,+32,58,96,114,32,10,0,65,64,10,218,206,32,10,232,129,0,71,154,0,+49,65,165,64,205,72,87,65,39,164,179,96,16,231,154,1,1,49,55,107,+81,65,114,167,154,224,56,0,69,83,192,11,97,107,124,63,96,6,165,126,+74,121,226,8,1,0,57,66,39,32,31,198,176,33,18,161,38,133,77,147,+122,227,21,1,96,47,224,15,8,64,65,233,187,9,96,28,191,59,133,219,+141,95,0,56,104,224,64,14,0,56,32,199,192,73,108,110,224,21,2,128,+159,173,60,0,49,97,100,201,8,0,56,100,105,0,49,100,67,32,101,170,+10,62,72,0,58,96,19,32,12,0,90,64,200,32,13,129,104,65,126,64,+64,161,76,64,83,235,123,0,96,109,222,100,254,208,6,224,14,5,192,189,+167,252,253,163,0,128,207,32,72,164,230,74,146,160,42,37,31,1,49,56,+114,140,192,42,64,60,32,42,172,87,64,42,64,11,32,24,67,125,96,43,+32,23,1,47,61,64,165,163,113,71,109,100,152,222,240,203,10,37,165,235,+244,7,236,9,5,210,239,236,9,5,236,11,1,132,241,167,51,107,66,102,+185,160,17,83,78,160,17,32,140,129,99,231,18,3,192,9,192,59,254,232,+2,0,58,96,60,101,242,39,83,32,13,226,239,1,32,15,234,35,0,141,+77,32,50,233,226,3,10,110,111,32,109,97,116,99,104,32,97,116,138,34,+64,83,138,245,0,49,45,177,226,245,0,74,55,128,11,32,84,234,55,32,+3,120,99,101,112,83,86,0,46,68,103,0,114,179,93,224,39,1,2,80,+97,116,64,22,0,77,64,128,0,70,203,66,234,75,0,99,118,129,5,38,+80,132,221,32,247,64,156,233,50,0,0,49,77,202,224,15,3,35,110,32,+4,66,13,0,55,161,92,137,110,87,158,242,169,7,79,19,32,202,228,176,+0,74,95,98,163,32,204,161,78,0,50,130,180,64,45,142,73,64,18,226,+205,2,71,92,225,95,1,85,92,240,212,3,96,156,140,220,0,49,42,235,+128,15,137,208,184,138,32,104,68,216,69,5,144,201,224,39,2,161,138,225,+46,1,6,39,92,57,50,38,39,39,165,155,193,159,169,134,224,99,0,97,+188,138,132,224,17,3,139,121,233,59,3,224,168,1,32,169,96,35,134,68,+64,156,206,196,132,218,64,158,130,166,96,101,224,147,3,64,146,70,53,240,+138,2,33,21,226,190,3,73,196,227,26,3,135,115,166,172,32,77,99,108,+161,162,33,145,68,216,129,145,212,100,65,186,165,73,32,138,151,53,41,247,+102,24,75,152,131,4,0,90,64,28,102,26,162,64,224,163,5,224,160,0,+0,67,89,248,128,96,136,153,138,17,120,30,225,22,7,96,0,0,79,32,+98,0,35,32,88,224,79,5,0,97,96,79,96,27,32,108,224,27,5,0,+98,224,27,1,76,107,224,28,5,0,102,224,28,2,33,38,224,28,5,146,+77,128,28,241,155,4,64,28,109,129,128,28,33,143,224,27,5,0,116,224,+56,2,250,128,4,64,28,0,118,224,56,2,224,143,8,64,3,96,31,250,+155,2,0,58,97,241,165,201,65,76,165,24,157,236,0,49,37,249,0,35,+35,98,138,238,32,12,1,64,35,64,4,64,53,196,109,1,54,50,64,56,+202,193,238,159,0,225,189,0,107,6,100,82,96,17,32,43,206,54,136,20,+203,213,207,143,0,49,39,226,39,249,203,89,248,132,1,185,68,64,30,64,+69,131,183,64,67,226,230,2,107,54,108,35,192,64,97,121,226,96,9,64,+69,98,0,203,113,192,40,226,52,3,224,10,1,96,50,106,47,235,244,1,+96,250,129,28,128,74,80,215,224,74,4,32,165,132,76,2,111,114,100,65,+36,132,78,2,99,104,114,64,12,210,176,106,11,234,13,0,64,193,135,101,+224,175,1,65,63,134,43,33,88,225,159,10,125,176,225,159,0,64,135,96,+43,129,203,0,60,70,240,64,24,96,108,198,68,64,60,161,243,64,16,97,+186,32,106,32,13,129,86,131,203,177,91,238,196,3,32,33,167,96,64,16,+32,13,177,110,103,153,41,103,64,146,76,60,99,84,199,111,64,17,32,11,+0,61,64,11,64,35,129,253,64,196,83,182,67,205,83,222,131,248,130,46,+231,60,0,34,56,192,15,32,59,242,106,0,0,49,149,71,69,210,32,22,+211,114,32,16,32,156,66,72,32,20,210,110,199,219,194,70,105,86,160,10,+168,111,218,133,224,32,2,254,38,1,196,203,242,110,1,97,20,224,65,4,+224,64,5,64,195,196,212,195,100,181,58,247,14,1,192,169,66,95,32,30,+240,230,6,96,30,172,44,115,244,97,33,178,248,180,245,32,19,226,67,0,+192,53,240,10,0,240,184,0,126,228,97,68,116,254,98,163,97,166,85,1,+64,51,181,32,80,81,0,83,63,71,1,110,103,33,164,181,29,163,52,97,+146,84,134,176,70,138,99,135,135,103,106,112,30,0,95,105,25,32,59,161,+141,128,40,32,56,106,114,33,228,192,31,129,152,4,110,101,119,67,65,128,+112,2,76,101,110,64,115,129,33,224,224,4,180,219,75,216,244,212,2,35,+49,109,89,32,20,237,82,1,239,85,8,109,223,224,49,1,171,55,180,220,+139,75,224,51,7,32,31,180,221,107,57,32,13,229,15,0,128,2,126,120,+100,52,64,5,98,124,180,231,239,217,13,96,35,233,220,4,32,54,32,200,+84,58,79,136,224,27,11,128,120,245,212,3,224,188,0,180,252,2,114,101,+109,33,16,180,232,253,67,1,247,25,0,253,90,5,224,20,1,224,17,8,+224,14,5,247,91,14,160,200,225,76,1,225,55,13,129,87,0,79,32,152,+180,246,34,22,86,144,32,6,66,47,224,8,0,32,6,72,88,115,62,32,+11,68,54,160,11,39,5,224,11,1,48,164,224,11,0,100,232,85,1,32,+91,129,144,5,94,112,111,107,101,87,133,85,181,26,4,94,112,101,101,107,+192,18,193,117,107,182,32,59,128,120,118,108,64,90,225,90,3,162,73,180,+103,224,50,0,115,158,224,50,0,246,116,1,32,18,201,132,113,89,116,199,+32,33,129,140,1,116,111,42,252,64,128,129,45,3,116,111,80,116,69,235,+179,161,225,205,6,179,55,175,245,210,250,252,135,0,97,30,141,154,101,128,+70,240,51,217,102,89,106,143,179,108,240,79,7,96,52,130,180,100,128,32,+69,32,241,117,105,96,66,32,7,64,68,0,95,132,230,32,46,248,95,0,+230,136,5,178,103,111,137,114,122,72,252,32,22,129,40,2,113,117,111,64,+232,178,34,226,132,94,177,65,242,109,3,243,216,2,0,95,112,182,175,13,+224,21,0,244,203,13,243,200,3,32,87,129,174,81,202,69,26,71,57,32,+20,129,180,6,94,102,114,101,101,32,58,176,98,132,6,224,94,6,85,110,+149,173,253,94,1,245,107,1,187,71,80,141,224,118,3,0,58,176,169,227,+254,1,230,100,1,250,144,3,212,73,68,45,244,228,11,166,100,230,129,0,+224,119,1,32,115,180,231,202,238,48,170,250,97,6,103,43,177,40,34,1,+0,51,227,216,5,0,58,177,38,76,97,0,83,100,252,143,188,213,179,45,+1,135,0,110,182,224,95,10,128,94,195,112,228,56,9,0,58,177,60,58,+76,33,98,227,101,2,72,232,162,179,215,14,226,184,7,177,21,247,214,6,+4,117,110,100,101,102,55,212,0,100,74,231,0,58,177,37,229,237,15,208,+222,41,139,131,206,106,122,106,177,74,164,234,161,12,78,56,234,157,2,72,+93,64,1,0,95,48,95,224,37,2,234,126,2,64,37,96,19,96,10,0,+95,81,55,0,58,177,74,0,85,199,97,64,114,75,206,128,130,64,45,161,+65,32,20,32,12,97,123,230,129,1,132,14,96,175,65,112,109,8,249,119,+1,132,192,64,30,131,32,224,35,1,224,55,11,193,10,177,206,83,163,131,+236,129,5,192,13,71,104,225,105,6,180,78,14,58,32,117,110,115,117,112,+112,111,114,116,101,100,32,119,69,128,2,115,105,122,158,174,32,54,0,55,+109,159,0,35,48,56,4,55,52,56,51,54,73,193,0,58,178,47,244,29,+2,235,192,0,81,177,248,34,2,116,11,148,16,82,2,129,20,65,146,32,+142,161,33,129,143,0,53,148,21,98,111,178,131,4,105,110,118,32,58,178,+129,0,115,75,114,178,68,74,133,178,36,230,205,15,178,43,227,16,0,165,+18,178,54,0,95,44,250,151,105,80,31,0,95,80,47,0,95,80,69,0,+95,116,58,81,48,0,95,84,55,140,134,82,154,145,232,241,231,1,251,24,+4,87,63,89,30,240,145,0,177,223,224,29,1,224,49,1,224,39,5,229,+254,0,227,181,7,178,8,0,62,32,232,177,190,0,62,32,9,129,9,76,+14,176,242,0,60,32,9,129,7,3,105,99,109,112,32,12,235,202,2,78,+19,0,95,79,218,0,58,176,245,75,199,175,234,65,64,174,51,50,118,174,+50,230,1,93,174,116,233,108,13,174,131,1,110,101,42,193,174,99,0,42,+32,9,128,236,0,45,32,9,128,236,0,43,32,9,233,58,9,224,156,56,+0,58,237,208,1,192,155,193,143,173,210,171,17,68,221,66,50,116,40,64,+12,166,113,1,64,58,173,221,117,109,173,189,53,83,173,187,64,41,66,100,+109,191,173,190,64,29,128,232,64,9,128,232,1,94,109,61,168,1,111,99,+32,15,229,78,1,203,79,173,172,50,218,173,157,224,206,14,0,58,173,176,+139,253,102,184,99,184,173,187,131,54,136,197,173,146,3,114,97,105,115,39,+37,173,137,4,65,46,114,101,97,41,136,173,131,11,73,79,46,103,101,116,+65,114,103,82,101,102,32,20,168,87,43,219,0,95,76,229,0,95,76,197,+228,86,1,2,115,116,100,62,197,101,189,173,20,32,62,128,20,32,59,174,+123,96,59,70,11,224,59,8,1,111,117,113,30,0,58,173,46,131,223,160,+170,128,243,128,78,32,39,32,78,165,255,44,238,0,58,173,6,33,72,172,+252,96,100,76,148,0,95,76,177,224,100,4,0,105,113,187,0,58,172,233,+225,236,2,0,58,172,220,128,99,0,105,44,214,236,213,2,205,149,208,213,+208,146,253,135,0,111,199,246,72,0,232,160,1,136,64,118,4,64,98,216,+111,225,215,1,173,27,205,114,44,227,101,28,162,92,77,7,32,35,129,16,+64,223,129,7,1,65,46,162,40,173,18,78,46,0,58,172,254,32,191,7,+112,101,114,102,111,114,109,73,43,209,173,5,93,224,128,241,119,30,232,152,+4,0,58,172,232,64,35,202,55,32,31,69,31,96,35,98,240,91,4,225,+210,0,0,62,36,147,172,207,0,95,64,78,65,205,111,211,42,109,169,169,+36,135,64,65,91,64,224,9,0,160,85,32,73,191,217,155,230,112,75,176,+66,145,154,96,35,247,231,0,107,7,85,128,64,40,192,32,0,95,189,155,+128,132,87,77,233,228,0,224,47,4,96,150,108,132,146,250,225,14,0,172,+122,232,94,1,195,241,172,128,121,105,48,254,228,24,5,203,96,178,192,235,+166,0,32,172,224,12,4,96,212,98,18,46,182,224,66,1,144,14,238,248,+3,172,79,166,157,0,51,98,24,111,164,130,0,74,8,129,96,74,213,226,+41,0,102,167,129,4,0,58,244,1,0,236,82,1,37,249,162,103,0,58,+226,211,0,4,114,101,116,117,114,34,212,164,115,65,196,38,11,128,199,38,+10,236,11,7,229,65,37,0,58,229,148,3,228,146,9,229,93,2,112,235,+64,200,39,103,203,21,224,0,255,224,0,255,224,0,243,1,32,125,+};+unsigned char *combexpr = data;+int combexprlen = 30298; #include "mhsffi.h" static struct ffi_entry table[] = { { 0,0 }
generated/mhs.c view
@@ -1,4499 +1,4769 @@ static unsigned char data[] = {-122,2,118,55,46,2,48,10,49,2,57,49,49,2,10,65,32,2,95,48,-32,2,95,50,51,2,32,64,95,2,50,48,52,2,32,64,66,224,15,2,-2,49,51,32,2,64,64,66,2,32,66,32,224,18,2,2,50,32,64,2,-64,64,83,2,39,32,66,32,42,2,39,32,67,2,32,83,32,32,33,2,-83,32,67,2,39,32,83,2,39,32,64,64,10,2,64,95,49,2,49,49,-32,32,42,2,53,32,64,2,95,49,53,2,52,32,95,2,49,53,54,2,-32,64,102,2,114,111,109,2,85,84,70,2,56,32,34,2,45,45,118,2,-101,114,115,2,105,111,110,2,34,32,64,64,0,2,67,39,66,2,32,85,-32,2,95,50,54,32,3,2,50,52,32,32,52,2,51,54,32,224,57,12,-2,77,105,99,2,114,111,72,2,115,44,32,160,64,2,32,34,32,32,63,-128,47,2,50,51,51,224,58,19,2,44,32,99,2,111,109,98,2,105,110,-97,2,116,111,114,2,32,102,105,2,108,101,32,224,67,5,2,50,51,52,-128,141,2,64,90,32,2,75,32,64,64,0,32,208,64,154,2,64,67,32,-224,209,25,2,110,117,109,2,101,114,105,2,99,45,118,224,217,4,2,66,-32,80,128,211,128,157,224,91,2,129,87,65,46,64,101,32,99,64,107,65,-60,96,23,2,83,32,95,2,50,51,53,64,41,129,87,224,23,4,32,121,-224,23,12,2,55,32,64,129,75,33,151,33,178,33,78,65,204,2,50,52,-48,2,32,64,85,32,118,2,65,32,64,160,119,32,56,2,95,55,55,129,-209,64,228,224,42,1,2,50,32,95,2,50,49,32,32,69,64,12,33,15,-2,35,48,32,96,49,225,155,1,64,12,225,99,16,2,102,108,97,2,103,-115,32,2,61,32,34,96,106,2,95,49,50,2,51,32,95,2,50,52,57,-160,120,2,67,32,67,98,35,2,95,49,55,2,57,48,32,96,194,32,2,-2,80,32,64,96,180,2,95,49,56,2,55,54,32,2,64,95,51,2,55,-48,32,32,4,2,49,32,102,224,86,0,33,184,2,109,97,110,2,100,45,-108,2,105,110,101,64,90,64,149,128,153,2,64,75,50,32,97,2,48,50,-32,64,61,96,255,160,105,32,15,2,56,53,32,130,92,65,94,32,15,96,-115,64,149,2,56,57,49,32,9,2,85,32,90,161,139,65,28,193,149,128,-45,128,153,2,95,49,57,2,48,55,32,226,236,0,32,149,2,51,50,32,-64,62,32,20,2,95,49,54,64,214,64,34,2,56,32,64,97,141,128,54,-2,32,64,83,160,60,2,51,57,32,64,32,226,56,0,97,84,2,57,54,-32,160,13,2,79,32,35,2,52,54,32,2,64,75,32,128,148,2,53,49,-32,96,70,2,79,32,64,64,84,2,57,32,35,65,156,224,29,4,96,0,-2,58,49,57,2,49,48,32,2,64,10,65,129,76,129,79,64,99,2,53,-50,32,64,9,2,53,32,95,33,64,64,229,2,51,32,35,128,241,162,11,-64,148,129,231,96,95,130,213,33,195,64,46,2,64,35,49,99,4,32,157,-2,51,57,49,32,62,32,8,2,54,48,48,2,32,35,49,64,195,32,12,-2,53,48,56,32,112,128,191,2,49,51,52,64,49,2,52,55,32,64,50,-96,47,128,0,2,73,32,64,32,158,64,91,96,158,224,1,15,34,172,2,-49,55,56,2,56,32,35,96,167,2,51,56,32,64,162,2,79,32,79,225,-16,2,129,8,64,161,66,237,226,9,1,2,47,108,105,2,98,34,32,65,-247,96,115,224,24,1,2,111,117,116,2,46,99,111,2,109,98,34,164,15,-64,84,224,6,21,97,82,224,13,0,97,4,224,6,0,224,27,3,224,99,-1,2,100,101,102,2,97,117,108,2,116,34,32,97,133,65,247,32,230,2,-66,32,89,97,242,98,33,32,7,130,206,66,1,34,10,2,64,80,32,225,-188,0,130,22,131,236,227,252,0,225,192,3,228,93,19,164,78,224,69,53,-2,118,34,32,224,69,58,2,113,34,32,224,69,58,2,114,34,32,224,69,-58,2,108,34,32,224,69,58,2,67,82,34,224,70,60,2,87,34,32,224,-70,59,224,69,60,2,84,34,32,224,69,58,2,88,67,80,2,80,34,32,-224,72,58,2,122,34,32,224,69,58,2,81,34,32,197,224,70,229,231,0,-4,128,66,64,14,64,98,131,144,192,25,64,10,231,110,0,224,10,0,232,-177,9,100,216,2,35,52,53,231,40,0,96,38,128,51,224,170,1,232,18,-4,128,50,2,49,48,53,230,63,2,160,34,160,49,68,16,165,116,37,48,-32,55,198,69,101,175,166,69,165,223,232,29,2,224,197,84,192,162,224,197,-15,128,49,64,7,231,6,8,224,190,10,129,140,133,170,2,95,51,49,64,-43,2,67,32,79,198,218,224,206,113,32,10,224,206,18,224,200,0,106,53,-96,200,224,170,114,105,211,224,170,24,107,27,224,170,9,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,169,34,224,192,4,2,54,56,32,224,71,0,226,50,17,99,216,-226,50,9,2,52,50,48,226,50,11,224,219,127,2,55,51,32,224,219,78,-226,98,99,2,56,48,32,226,97,18,107,128,192,202,64,183,196,152,43,135,-224,180,92,229,87,13,75,105,229,86,39,235,156,3,229,86,124,224,196,0,-229,85,27,224,189,1,64,43,2,95,49,48,79,110,34,69,227,95,0,193,-12,106,111,64,73,225,18,1,224,190,5,32,2,224,190,60,77,148,226,56,-30,32,164,226,56,12,227,87,13,160,139,206,92,96,233,238,92,19,2,85,-110,107,2,110,111,119,2,110,32,102,46,100,2,58,32,34,141,220,195,103,-224,53,6,44,75,77,37,97,246,238,26,5,225,70,3,64,209,174,123,64,-68,227,165,4,226,90,11,32,217,224,223,0,197,177,224,39,9,2,57,48,-48,224,39,30,77,104,224,39,27,232,41,3,224,39,9,33,140,192,40,230,-202,1,224,61,2,230,52,1,160,61,224,108,21,224,46,8,224,39,14,224,-107,1,224,39,19,2,55,56,57,224,79,30,229,64,1,224,39,21,228,157,-2,2,54,50,32,174,236,238,246,5,226,122,1,224,64,0,46,115,224,64,-9,65,58,2,55,53,32,143,1,48,168,32,210,224,59,0,194,237,100,103,-109,239,32,69,83,44,2,51,51,51,36,78,80,51,230,69,1,224,1,11,-106,223,224,0,3,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,228,137,2,132,84,80,77,227,224,9,129,182,33,238,225,182,3,2,90,-32,66,225,182,255,225,182,116,225,180,16,65,179,36,11,225,179,3,224,118,-3,169,176,225,150,20,225,197,255,224,23,14,225,122,10,65,116,37,248,225,-116,13,235,35,6,225,113,255,227,55,54,227,0,11,65,134,38,132,226,251,-15,226,253,1,225,140,255,225,140,20,225,97,9,65,95,41,76,225,95,17,-225,97,2,225,98,255,225,72,11,65,71,41,40,225,71,19,225,75,5,225,-77,198,225,16,6,65,14,153,147,225,14,20,225,22,11,225,26,42,224,124,-2,2,58,49,56,76,148,224,120,27,224,116,5,225,141,123,225,68,4,64,-201,153,80,225,66,26,225,64,6,224,204,82,224,163,3,64,162,236,3,6,-224,158,26,226,247,161,226,212,5,64,237,235,58,6,224,233,20,229,45,228,-229,16,7,65,44,234,179,18,228,2,25,224,81,2,64,75,233,138,12,96,-51,230,148,255,236,188,93,236,164,13,65,161,233,165,10,65,159,225,158,255,-238,91,104,238,78,14,65,170,137,240,2,75,32,67,49,237,2,48,32,95,-2,50,51,32,81,236,84,159,32,17,50,32,52,28,96,20,2,95,50,50,-2,52,32,102,244,110,0,2,101,120,112,2,111,115,101,2,100,45,109,2,-111,100,117,2,108,101,115,2,58,34,32,246,63,2,224,52,0,64,132,2,-85,32,64,2,95,52,51,64,12,119,248,224,79,14,2,111,116,104,2,101,-114,45,224,77,6,192,60,35,240,64,196,2,50,49,54,160,59,64,7,32,-62,96,8,245,17,16,2,32,32,34,128,55,32,31,2,51,50,57,86,70,-2,53,53,32,224,250,2,137,163,246,242,5,224,186,2,184,169,53,126,117,-133,2,52,50,32,32,129,179,23,2,49,52,51,2,32,95,54,64,13,179,-24,152,63,213,173,64,155,245,117,8,224,153,1,2,66,117,105,2,108,100,-105,2,110,103,32,2,112,97,99,2,107,97,103,2,101,32,34,253,185,1,-150,100,128,145,119,129,225,149,0,96,28,115,196,2,56,54,32,65,163,117,-182,246,238,3,86,174,87,154,96,63,182,228,183,7,128,8,118,244,224,228,-4,192,104,224,230,38,224,232,4,128,15,224,237,16,2,87,114,105,2,116,-105,110,224,236,8,151,193,86,89,246,215,20,2,32,116,111,193,199,2,49,-56,50,251,220,2,97,158,32,189,98,165,2,49,55,51,120,27,192,33,215,-83,159,73,64,106,55,204,64,208,2,56,56,55,96,231,2,51,55,51,2,-32,64,85,152,249,2,85,32,65,99,36,2,50,51,51,128,14,224,21,3,-193,211,2,49,57,53,64,65,52,240,32,108,90,182,64,75,162,152,55,206,-183,66,64,20,99,104,162,60,2,55,49,52,150,131,119,64,2,95,52,52,-2,56,32,95,2,50,57,56,96,110,162,141,64,50,128,180,96,99,128,153,-130,160,139,53,2,66,32,89,121,209,64,149,224,207,1,89,127,97,120,197,-88,128,7,249,21,0,153,217,160,192,2,51,53,56,126,124,64,89,32,88,-64,111,66,249,98,57,32,30,2,52,49,51,97,29,2,50,55,56,64,215,-2,53,48,32,248,140,5,56,141,150,114,2,95,51,57,66,12,130,52,33,-10,194,61,249,24,10,184,191,64,25,249,110,3,35,208,32,8,32,152,96,-4,128,127,65,83,128,88,33,130,182,97,32,149,161,116,64,143,64,85,2,-53,50,53,97,46,32,22,2,53,52,50,64,167,32,28,89,162,224,170,11,-2,73,32,64,2,64,35,51,161,7,160,92,249,78,36,194,172,2,110,97,-109,32,4,2,111,116,32,2,111,102,32,36,162,2,32,102,111,2,114,109,-32,64,20,2,45,118,101,2,114,115,105,2,111,110,58,194,156,35,79,32,-78,96,169,189,18,65,105,139,181,244,5,41,215,88,98,175,224,65,0,34,-43,65,223,100,202,129,145,131,138,124,190,64,8,101,33,98,129,117,248,55,-248,32,153,2,52,52,53,224,77,0,138,180,66,82,220,53,196,34,154,236,-220,105,187,254,96,134,163,105,66,191,91,105,225,65,1,225,46,2,2,107,-103,80,2,97,116,104,2,32,105,115,2,32,101,109,2,112,116,121,227,227,-0,130,151,250,76,2,58,68,253,239,5,128,27,128,140,96,110,254,214,0,-228,166,2,227,237,0,228,168,11,64,12,102,12,184,240,248,165,4,228,167,-33,2,73,110,115,2,116,97,108,2,108,105,110,228,170,8,251,4,1,228,-167,18,2,105,110,32,229,198,0,133,185,133,88,231,84,5,253,172,1,129,-111,160,10,224,19,0,224,245,3,68,25,66,79,217,239,132,214,161,7,128,-50,225,34,10,64,53,130,221,229,95,0,251,255,10,2,52,55,32,255,114,-3,253,52,5,194,72,224,87,2,163,226,96,10,225,154,5,231,38,16,161,-150,2,35,50,32,231,26,34,2,99,114,101,2,97,116,101,225,73,1,224,-109,6,99,2,225,20,1,64,12,2,51,32,67,69,83,104,9,132,0,165,-139,91,21,2,55,57,32,225,193,6,226,1,9,225,13,4,102,245,160,39,-2,51,50,48,232,52,0,37,186,163,213,200,205,253,93,19,224,79,0,32,-43,128,129,102,124,192,87,2,49,57,32,198,69,224,143,14,32,114,224,143,-9,2,50,50,57,230,118,1,67,221,233,210,1,255,195,0,99,152,253,211,-0,67,241,141,121,70,212,2,90,32,90,32,1,160,40,64,26,141,72,97,-239,69,92,228,16,1,130,157,226,146,0,160,165,124,85,2,51,57,53,96,-125,159,122,2,49,53,49,224,6,0,64,81,139,248,162,18,194,249,65,159,-35,155,32,155,2,53,57,32,226,49,1,224,30,8,2,51,55,56,224,30,-10,2,95,52,48,64,203,226,239,8,34,101,65,14,2,50,54,49,228,220,-0,138,203,167,235,97,58,224,99,0,64,227,97,171,65,116,65,185,2,56,-55,56,34,155,2,53,48,57,64,61,2,75,32,95,70,65,106,91,128,132,-229,78,2,125,202,130,116,2,51,56,32,96,121,32,22,65,178,2,56,56,-48,96,235,226,7,25,32,0,71,196,133,81,228,255,1,132,231,197,130,128,-13,93,175,231,69,1,130,203,255,140,20,131,155,161,145,2,85,32,95,129,-147,102,147,192,9,65,28,138,237,71,109,225,181,0,2,56,55,57,129,182,-232,104,1,192,136,32,109,200,72,134,122,224,54,0,224,141,0,128,87,64,-66,32,59,2,94,109,107,2,100,105,114,2,32,58,49,97,87,32,16,227,-210,1,2,85,115,97,2,103,101,58,2,32,109,104,2,115,32,91,2,45,-45,118,135,54,2,93,32,91,2,45,45,110,2,117,109,101,2,114,105,99,-224,19,3,2,118,93,32,2,91,45,113,64,4,2,108,93,32,2,91,45,-114,64,4,2,67,91,82,2,124,87,93,64,9,2,88,67,80,2,80,93,-32,2,91,45,68,2,100,101,102,64,7,2,84,93,32,2,91,45,122,64,-4,2,105,80,65,2,84,72,93,32,8,2,111,70,73,2,76,69,93,32,-8,2,97,91,80,64,18,64,10,2,76,80,65,128,28,2,80,80,75,2,-71,93,32,2,91,45,81,2,32,80,75,2,71,32,91,2,68,73,82,96,-31,2,116,84,65,2,82,71,69,64,76,2,77,111,100,44,128,2,78,97,-109,2,101,46,46,2,46,93,34,97,29,67,74,140,39,226,81,3,235,57,-1,226,168,0,2,51,54,49,226,168,0,224,42,4,99,236,99,195,40,254,-232,248,2,226,208,6,42,196,191,224,224,56,0,205,4,167,254,160,81,39,-135,226,23,3,162,66,230,88,11,224,16,2,162,108,172,232,172,9,101,213,-192,93,231,110,37,172,11,231,100,38,2,116,111,112,2,32,108,101,2,118,-101,108,2,32,100,101,2,102,110,115,2,58,32,32,64,0,236,18,1,228,-238,2,33,51,2,51,32,35,204,31,105,94,43,62,235,159,0,236,54,22,-2,40,117,110,2,112,114,117,2,110,101,100,160,92,224,89,4,224,76,1,-2,95,55,54,32,5,67,170,32,219,231,16,2,225,46,12,237,62,9,230,-252,30,228,73,1,145,12,225,47,3,160,66,132,66,110,167,224,216,21,2,-61,32,34,128,208,65,33,69,140,224,181,4,193,243,64,183,162,161,64,5,-75,127,64,46,104,73,129,238,231,87,4,65,29,2,52,54,56,68,254,100,-201,229,12,7,234,176,0,226,130,8,236,3,5,226,213,9,226,74,81,2,-102,105,110,2,97,108,32,2,112,97,115,2,115,32,32,224,0,1,233,178,-0,226,75,1,160,71,226,78,0,160,15,226,4,1,140,186,32,97,74,61,-64,0,224,100,1,2,109,115,34,225,94,0,239,148,0,239,95,0,234,218,-0,163,100,143,132,39,35,108,11,74,147,224,184,11,2,46,99,111,2,109,-98,34,160,86,135,97,224,60,35,192,57,225,144,7,43,236,224,183,2,2,-104,115,99,224,42,7,77,123,234,66,6,226,202,3,65,148,169,46,172,144,-234,140,4,199,104,226,7,14,226,32,8,2,50,49,49,224,143,2,2,77,-72,83,2,67,67,34,193,74,2,83,32,83,206,19,224,5,9,240,243,4,-79,210,238,18,0,224,1,1,96,202,224,19,4,182,51,229,17,1,228,217,-1,207,41,224,8,5,227,29,2,234,208,38,241,235,10,226,167,19,2,69,-120,101,2,99,117,116,39,1,238,41,17,227,148,4,230,79,0,32,250,141,-184,225,179,1,243,146,4,65,124,160,64,237,66,1,243,123,4,200,246,224,-199,8,107,46,2,56,50,54,160,102,144,199,239,28,4,235,162,18,2,111,-109,109,2,97,110,100,2,32,102,97,2,105,108,101,2,100,58,32,236,245,-3,226,24,9,227,254,80,2,67,32,99,2,111,109,112,2,105,108,97,2,-116,105,111,2,110,32,32,227,254,89,237,131,8,193,143,138,88,2,56,50,-55,227,183,19,2,36,73,78,224,74,2,224,66,4,224,59,25,2,79,85,-84,244,34,5,96,221,2,51,53,50,227,209,1,224,235,4,230,60,16,2,-45,119,32,2,45,87,97,2,108,108,32,2,45,79,51,2,32,45,73,245,-181,1,105,239,135,30,224,64,19,2,47,115,114,2,99,47,114,2,117,110,-116,2,105,109,101,239,29,9,224,57,31,2,47,101,118,2,97,108,45,230,-198,1,239,89,21,2,46,99,32,96,42,224,198,2,33,76,2,32,45,108,-2,109,32,45,2,111,32,36,225,27,3,250,49,3,2,56,50,56,225,111,-2,238,11,3,224,11,0,244,47,0,230,195,1,239,50,1,2,56,52,54,-171,36,227,164,0,64,12,131,42,212,50,32,16,99,162,114,196,32,88,2,-55,49,57,69,193,141,41,32,56,226,73,2,2,97,105,110,224,167,1,74,-86,145,138,2,85,32,67,97,205,139,254,113,1,225,130,1,2,50,51,52,-227,200,1,161,38,226,183,2,238,59,12,82,30,136,18,84,50,73,44,148,-199,225,62,2,2,125,34,32,128,134,64,29,2,85,32,90,201,80,226,93,-3,44,10,234,82,16,170,112,224,17,6,192,20,235,1,1,224,48,9,224,-51,10,224,57,3,241,15,2,224,29,18,224,65,3,140,135,249,31,13,224,-45,5,128,41,224,37,8,231,13,3,242,240,4,133,76,98,31,148,180,2,-67,32,80,68,39,52,145,68,39,33,250,36,79,100,48,49,217,164,87,169,-145,65,86,2,75,52,32,129,119,224,158,6,69,31,2,55,51,52,73,91,-98,104,224,29,5,166,215,224,231,6,225,2,2,192,40,248,32,2,119,220,-48,84,213,245,224,34,2,228,43,1,70,21,96,118,231,171,4,119,53,244,-128,7,64,253,65,6,40,139,2,52,51,49,83,87,128,222,224,93,1,128,-143,136,245,231,178,0,224,97,2,231,65,2,138,249,160,23,33,56,232,67,-7,225,10,5,232,167,4,225,51,2,192,167,229,125,0,231,225,6,192,186,-193,21,163,140,161,170,212,16,100,168,96,210,166,103,128,216,160,12,151,119,-227,82,12,235,101,1,227,126,4,229,203,6,64,132,33,249,2,50,32,90,-241,103,3,100,112,149,205,192,193,2,82,32,64,32,71,2,50,50,32,96,-15,176,123,161,8,224,88,1,193,9,225,4,0,250,235,19,2,65,32,34,-227,194,2,192,143,152,119,226,151,1,228,74,0,229,171,1,224,240,13,88,-46,242,127,6,224,249,3,228,74,2,2,64,92,49,2,48,38,34,195,112,-96,89,96,47,32,68,2,54,52,32,236,155,4,228,73,1,224,9,1,131,-85,246,118,3,2,95,54,54,64,98,87,192,210,213,96,4,120,72,227,90,-0,192,87,2,80,32,90,224,1,0,192,19,132,244,192,13,65,66,32,15,-2,52,32,90,192,18,32,13,2,51,32,90,224,48,2,243,27,1,225,181,-3,224,88,9,251,44,8,103,128,121,56,160,15,2,57,55,32,197,253,2,-52,48,48,34,108,2,48,51,32,238,168,22,2,78,111,32,47,9,2,105,-110,105,104,198,2,102,111,117,73,89,2,111,114,58,202,45,142,17,96,9,-131,225,70,58,147,211,218,153,2,55,50,32,112,61,86,95,64,29,147,214,-2,75,32,66,33,98,133,121,115,16,235,99,1,249,235,0,64,65,89,237,-96,187,32,84,250,104,10,195,226,234,99,2,156,159,33,182,225,28,0,97,-173,250,125,6,128,19,131,94,224,99,32,230,46,5,234,213,1,188,192,33,-204,225,144,3,224,112,4,96,111,192,116,228,98,0,99,230,243,69,3,156,-46,194,249,32,144,225,156,19,2,35,105,110,2,99,108,117,2,100,101,32,-2,92,51,52,162,229,232,175,1,227,48,3,67,188,224,149,1,96,147,224,-80,12,45,150,2,102,102,105,2,46,104,34,203,112,2,49,55,53,34,34,-225,119,24,172,223,225,30,9,200,47,252,5,18,129,19,225,25,1,226,198,-1,160,200,123,100,2,56,54,48,229,67,0,224,24,6,101,61,232,148,0,-2,79,32,95,224,217,11,57,59,2,116,105,99,2,32,115,116,2,114,117,-99,2,116,32,102,2,102,105,95,2,101,110,116,2,114,121,32,2,116,97,-98,2,108,101,91,2,93,32,61,2,32,123,34,227,204,0,240,244,5,96,-103,108,144,150,6,172,142,228,122,2,224,32,1,76,89,160,32,2,79,32,-102,224,125,0,2,123,32,48,2,44,48,32,104,215,224,22,3,2,125,59,-34,224,17,6,224,159,8,2,42,120,102,32,11,96,165,32,163,96,7,96,-52,241,85,4,151,86,244,210,2,2,110,105,109,2,112,108,101,2,109,101,-110,2,116,101,100,2,32,70,70,2,73,32,102,56,182,2,117,114,101,225,-215,1,2,56,54,55,226,235,32,233,78,5,225,222,3,126,185,66,251,226,-6,4,211,185,177,116,136,52,242,175,4,229,92,0,66,9,88,131,39,135,-151,183,2,56,54,56,243,108,2,97,99,98,41,230,164,3,66,43,227,78,-4,224,208,93,224,37,12,224,214,66,224,215,9,227,119,24,195,86,128,30,-224,5,0,32,83,32,52,164,136,228,143,0,232,189,6,197,43,64,173,2,-61,61,32,2,64,35,57,224,38,1,170,81,224,169,4,234,127,0,96,19,-2,56,55,50,79,68,70,69,2,55,56,53,228,219,5,224,11,0,69,237,-153,114,65,26,159,107,189,204,103,95,221,214,129,58,233,174,1,216,100,97,-61,227,206,12,2,100,121,110,2,97,109,105,210,64,64,85,88,89,2,56,-54,57,32,16,229,128,3,224,87,39,2,119,114,97,2,112,112,101,2,114,-34,32,224,87,5,105,166,224,87,1,225,58,1,224,79,23,132,118,238,0,-2,97,25,2,95,53,52,65,82,225,4,7,236,50,1,78,3,243,103,22,-165,163,64,43,165,45,2,56,55,49,117,69,178,143,128,184,81,198,208,55,-190,185,255,81,8,227,18,2,235,154,0,249,233,1,224,220,7,70,78,233,-127,0,193,100,161,16,226,92,0,245,117,4,193,38,154,51,154,164,253,212,-7,224,148,0,131,87,225,97,1,96,85,222,100,250,87,3,225,142,2,224,-36,5,224,16,2,224,107,0,236,22,4,169,228,96,17,66,208,225,216,3,-236,25,1,233,45,2,233,33,20,2,98,97,100,73,17,2,101,105,103,2,-110,32,105,2,109,112,111,2,114,116,32,243,73,18,67,18,156,7,228,95,-6,228,106,3,32,8,100,22,64,44,155,23,111,37,64,14,155,10,106,63,-32,14,66,239,32,14,230,65,3,58,40,2,82,65,87,230,87,7,32,21,-2,84,73,77,2,69,77,73,2,76,76,73,224,27,7,2,97,99,111,114,-70,224,19,4,2,100,100,95,90,169,224,23,11,2,117,116,102,2,56,34,-32,224,23,6,2,115,105,110,224,19,8,2,116,97,110,224,19,11,2,50,-34,32,224,20,5,2,99,97,108,2,108,111,99,224,21,8,2,108,111,115,-2,101,98,34,224,21,7,224,171,9,2,101,120,112,224,18,7,2,102,108,-117,2,115,104,98,224,21,8,2,111,112,101,224,145,8,2,102,114,101,103,-22,224,19,3,2,103,101,116,224,60,8,32,19,2,101,110,118,224,21,7,-2,105,115,119,2,105,110,100,2,111,119,115,224,24,7,2,108,111,103,224,-18,8,2,122,55,55,224,229,8,2,109,97,108,224,251,10,2,109,100,53,-2,65,114,114,2,97,121,34,224,23,9,2,66,70,73,225,150,9,32,23,-2,83,116,114,2,105,110,103,224,24,8,2,101,109,99,2,112,121,34,224,-21,9,2,109,111,118,224,246,8,2,112,117,116,224,246,8,225,215,10,2,-115,113,114,2,116,34,32,224,19,6,2,121,115,116,2,101,109,34,224,21,-6,226,0,10,2,116,109,112,37,185,224,122,8,2,117,110,103,225,115,10,-2,117,110,108,2,105,110,107,224,166,8,2,101,101,107,2,80,116,114,224,-22,8,2,111,107,101,224,22,14,2,87,111,114,2,100,34,32,224,69,9,-224,23,11,66,225,65,169,2,95,99,111,2,109,112,114,2,101,115,115,2,-111,114,34,224,34,15,2,100,101,99,224,36,16,64,95,2,95,117,105,2,-110,116,56,224,145,11,224,25,14,192,51,2,49,54,34,224,52,15,224,26,-10,192,53,2,51,50,34,224,53,15,224,26,10,192,53,2,54,52,34,224,-53,15,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,36,41,37,179,225,3,13,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,2,108,111,110,228,3,8,128,98,224,25,12,64,51,224,50,16,-224,49,16,2,117,108,108,224,102,17,224,103,17,224,104,17,224,51,16,2,-102,108,116,224,49,12,224,23,10,2,115,105,122,2,101,111,102,225,25,11,-160,25,224,100,11,192,26,224,27,11,70,44,2,100,105,114,230,150,12,224,-23,10,2,114,101,97,2,100,100,105,224,46,9,2,95,100,95,228,240,11,-2,99,104,100,224,44,9,2,109,107,100,224,20,9,37,24,2,99,119,100,-237,243,9,224,0,63,72,70,41,38,40,70,110,195,78,203,2,50,51,57,-76,181,142,210,40,241,2,56,56,52,234,233,3,238,226,0,2,95,56,57,-43,255,96,29,46,249,64,44,120,147,207,33,64,89,45,148,64,89,51,151,-202,72,2,56,54,53,41,215,145,247,224,5,2,160,24,169,196,169,186,160,-6,224,45,25,224,52,3,224,45,18,224,84,3,160,52,224,45,25,224,98,-4,2,53,57,32,224,231,0,48,146,192,11,64,234,153,48,2,115,99,109,-2,112,32,58,128,66,105,229,56,169,145,9,42,5,176,170,235,232,1,192,-11,237,100,0,177,157,115,244,234,202,2,183,171,86,32,2,49,51,32,193,-92,147,73,234,156,19,2,123,32,92,50,26,178,27,55,49,251,7,24,64,-46,2,44,32,109,2,104,115,95,34,206,2,114,95,34,242,84,4,240,185,-2,2,44,34,32,226,61,0,205,226,224,134,23,224,133,43,224,128,28,139,-80,90,170,236,121,1,91,33,33,191,224,99,17,224,223,2,110,27,64,99,-2,56,53,53,221,239,250,212,2,79,33,64,181,2,56,53,55,96,5,158,-28,224,17,3,175,32,245,104,16,175,34,234,138,3,140,48,2,38,32,109,-2,117,115,116,2,32,98,101,2,32,80,116,2,114,47,70,2,117,110,80,-136,193,76,0,224,181,12,2,40,72,115,128,37,2,41,34,32,214,99,224,-40,2,130,52,96,5,247,55,10,237,183,4,64,183,64,161,65,64,140,100,-2,85,32,66,129,5,116,144,237,130,0,241,33,0,129,90,180,238,149,170,-158,30,222,166,174,55,97,132,96,95,65,73,161,85,179,246,190,5,225,150,-17,2,59,32,109,33,246,64,15,2,95,85,110,2,105,116,40,2,115,44,-32,162,3,247,234,11,32,212,2,52,49,32,224,212,1,253,236,19,64,43,-252,124,0,224,77,0,77,238,61,138,224,139,12,224,122,0,2,32,95,53,-90,63,32,201,132,4,54,156,2,95,53,56,33,245,130,43,224,134,7,2,-95,55,54,160,248,110,61,65,97,141,183,226,53,5,64,192,247,158,19,162,-53,225,45,19,194,71,2,114,101,116,2,117,114,110,2,32,116,121,2,112,-101,32,194,81,2,73,79,58,238,137,0,2,49,53,48,213,102,32,141,64,-150,69,149,254,2,5,2,80,114,105,2,109,105,116,2,105,118,101,2,115,-46,73,2,79,34,32,96,183,64,163,99,219,47,217,143,205,242,46,0,67,-5,208,91,192,31,243,8,0,224,41,4,130,5,176,133,210,94,210,9,229,-116,0,102,94,2,57,56,32,224,43,1,240,203,1,128,139,134,75,254,126,-1,246,193,14,2,95,116,111,195,215,245,199,5,2,56,53,52,226,124,22,-226,109,36,64,146,133,243,183,204,224,148,20,98,209,241,179,0,247,234,5,-192,154,255,90,2,224,157,21,224,216,6,255,115,20,226,206,12,96,56,227,-60,7,64,208,134,181,69,13,153,70,113,49,163,215,2,67,32,60,161,247,-251,16,0,226,13,4,194,6,48,200,96,9,224,36,8,226,43,1,209,139,-133,118,225,250,3,133,94,199,144,224,30,10,120,55,224,212,1,229,51,3,-226,203,2,192,18,209,254,224,115,0,114,97,2,95,56,55,245,156,1,2,-51,49,57,129,130,103,88,180,186,227,151,54,2,78,111,116,2,32,97,32,-2,118,97,108,2,105,100,32,2,67,32,116,35,150,227,139,8,65,109,135,-192,184,183,229,241,14,227,150,2,2,70,108,111,2,97,116,87,96,71,224,-42,12,224,31,2,33,220,224,79,25,2,73,110,116,224,76,17,192,28,224,-73,28,207,73,224,74,13,224,29,0,224,75,17,2,68,97,116,2,97,46,-87,32,39,96,4,110,69,224,75,17,128,30,224,152,28,2,40,41,34,224,-74,16,70,95,224,73,22,2,83,121,115,48,215,37,15,2,46,72,97,2,-110,100,108,153,64,224,115,13,194,113,231,96,2,43,75,151,51,226,40,17,-2,70,111,114,69,192,2,46,67,46,2,84,121,112,32,175,128,67,66,132,-236,3,3,2,67,67,104,2,97,114,34,224,20,7,2,83,67,104,224,21,-10,2,85,67,104,224,43,11,238,149,11,2,67,85,83,224,22,12,161,250,-224,42,5,224,20,11,2,76,111,110,237,55,8,2,67,85,76,224,21,11,-33,31,2,100,105,102,2,102,34,32,224,152,7,45,130,224,20,9,224,21,-12,2,76,76,111,224,110,12,192,22,237,31,9,67,99,138,157,230,235,17,-228,64,1,64,45,138,74,224,45,17,224,42,2,201,52,230,235,10,108,57,-32,25,228,188,7,2,52,57,32,192,150,136,16,224,104,17,130,184,32,41,-64,51,230,246,24,2,118,111,105,2,100,32,109,235,47,0,233,7,20,230,-80,2,47,45,2,32,115,41,2,32,123,32,235,102,15,2,59,32,125,235,-103,1,70,97,232,196,0,2,48,55,49,2,32,64,80,236,212,0,129,6,-32,108,2,57,51,56,66,239,108,206,202,74,96,60,135,189,101,126,170,30,-2,51,48,32,96,6,69,119,107,176,64,9,173,0,2,35,49,50,192,65,-101,108,64,65,199,108,127,53,32,45,71,50,69,204,37,146,39,1,96,44,-2,51,53,32,32,138,96,136,160,21,64,20,105,110,73,251,61,39,152,17,-152,242,69,228,192,60,193,51,2,56,52,49,87,252,64,182,218,174,224,96,-1,2,57,50,32,160,73,237,199,2,224,66,1,129,163,2,56,52,51,170,-238,87,196,64,15,222,48,199,244,74,75,128,80,2,56,51,32,231,205,1,-224,22,6,34,59,224,155,0,226,206,0,65,13,66,55,66,215,64,14,134,-65,121,235,90,83,64,18,130,240,81,63,2,67,65,83,118,21,2,76,101,-110,96,44,130,220,2,94,108,122,54,136,96,16,130,194,32,76,46,109,39,-19,99,67,128,7,47,218,224,234,0,2,95,57,49,224,11,2,97,123,160,-11,75,55,128,11,65,135,32,139,129,198,66,1,112,66,32,14,79,73,96,-11,232,179,0,2,56,51,57,192,19,128,5,64,137,131,14,2,94,112,111,-117,196,64,156,64,26,96,18,149,238,96,18,130,128,237,226,0,225,248,3,-207,203,129,146,225,74,0,129,136,32,170,96,212,225,81,1,64,77,202,79,-39,213,122,164,123,63,89,157,96,29,130,109,32,50,2,56,32,58,130,88,-99,175,97,118,66,122,226,138,1,2,54,52,55,234,87,1,2,79,32,95,-252,8,17,2,32,117,110,2,115,105,103,2,110,101,100,2,32,99,104,2,-97,114,32,2,100,97,116,2,97,91,93,63,215,2,123,34,32,198,57,112,-12,195,184,81,140,32,109,139,106,2,56,51,50,2,32,35,50,169,67,229,-2,3,2,125,59,34,224,20,9,224,105,5,2,42,99,111,2,109,98,101,-2,120,112,114,32,108,64,117,128,49,33,44,59,79,228,33,19,68,32,192,-58,2,108,101,110,32,61,235,30,6,64,60,234,126,1,140,248,42,87,76,-97,238,139,2,161,112,208,40,177,18,2,83,32,85,228,63,0,254,206,4,-128,7,130,47,241,28,0,177,17,241,16,5,49,131,172,34,64,95,165,188,-2,54,52,54,239,188,1,224,160,6,2,49,52,57,171,200,33,194,96,80,-64,56,197,202,2,75,51,32,2,75,52,32,32,2,2,90,32,90,96,1,-230,82,1,64,38,130,164,32,38,224,32,1,224,1,5,230,129,6,32,51,-2,50,57,32,160,51,2,50,32,90,224,1,16,230,185,8,64,57,205,122,-64,1,33,49,220,38,225,55,6,253,71,5,175,169,253,91,5,143,176,192,-63,128,11,45,91,111,149,242,114,2,64,33,193,53,160,130,211,189,2,57,-32,67,159,180,101,241,83,9,36,39,221,93,223,37,211,46,35,99,139,164,-32,12,49,154,34,184,75,72,96,79,131,83,229,179,3,70,114,66,211,64,-37,64,52,197,221,227,168,0,70,109,199,71,96,86,167,98,2,56,50,51,-160,7,101,93,64,93,131,162,2,75,32,58,128,20,32,11,2,90,32,85,-101,19,64,43,68,75,154,166,96,32,130,43,134,7,229,193,1,32,79,2,-49,55,32,133,200,198,64,2,50,49,49,233,138,4,242,51,0,224,37,18,-2,77,72,83,2,67,79,78,2,70,34,32,225,162,2,255,100,0,129,164,-230,130,0,255,49,0,224,8,4,64,137,103,73,2,56,49,57,230,62,4,-230,65,5,236,167,2,2,50,52,50,76,211,165,140,2,49,52,51,35,9,-100,57,2,50,52,51,237,124,1,97,94,2,50,50,52,128,100,2,52,49,-56,64,59,233,80,4,2,111,117,108,2,100,32,110,44,192,2,102,105,110,-139,182,132,39,160,138,252,254,4,2,110,32,102,2,105,108,101,233,124,7,-207,15,230,191,1,238,240,2,2,56,50,48,224,65,2,2,100,101,102,2,-97,117,108,172,134,2,51,53,50,228,134,13,2,99,99,34,255,235,0,96,-37,224,103,3,144,79,225,32,4,64,105,230,6,5,255,217,2,225,42,30,-225,43,8,235,195,18,2,117,110,100,2,32,116,97,2,114,103,101,2,116,-58,32,255,252,9,2,56,49,52,108,95,96,12,110,101,224,11,3,224,0,-2,192,207,225,59,5,225,61,2,111,51,233,64,1,102,12,192,215,225,61,-28,99,236,2,49,51,51,64,5,71,253,39,231,239,9,0,224,59,22,168,-241,225,70,0,193,135,224,83,42,2,111,110,102,239,157,3,237,30,18,2,-117,110,105,2,120,45,34,131,153,229,197,0,2,95,54,55,230,84,1,65,-197,165,38,67,92,41,114,64,20,229,169,0,197,208,32,2,166,50,32,30,-66,198,247,155,7,210,200,210,197,227,179,1,183,170,101,29,146,177,249,12,-4,201,247,100,182,146,176,33,154,48,39,224,109,0,171,54,230,206,0,232,-182,1,2,55,57,55,232,182,0,64,189,128,126,2,95,50,53,160,140,224,-45,4,2,52,48,56,131,240,224,44,0,132,72,66,96,149,85,234,71,7,-226,193,4,225,100,17,2,67,97,110,2,39,116,32,90,192,210,94,192,147,-227,64,53,224,120,0,162,203,230,179,1,233,165,8,227,158,83,2,82,101,-97,195,157,2,115,32,102,36,174,2,46,32,80,2,111,115,115,2,105,98,-108,2,101,32,116,128,22,195,181,232,44,0,99,158,227,163,3,2,89,32,-66,34,38,68,228,244,230,3,168,168,231,64,1,226,208,0,227,190,3,225,-0,9,237,104,9,2,47,116,97,96,137,2,46,99,111,163,28,66,57,173,-51,250,156,0,133,236,33,17,42,113,65,246,167,181,96,166,32,89,115,46,-2,51,55,49,179,143,211,148,132,29,59,165,134,223,96,150,71,84,2,83,-32,64,100,77,80,160,2,51,56,51,32,22,200,137,224,51,4,225,91,19,-2,65,109,98,2,105,103,117,2,111,117,115,2,58,34,32,160,56,107,13,-170,186,229,3,3,163,43,160,217,203,93,33,189,179,156,198,32,2,50,52,-54,131,98,225,246,0,2,35,49,48,234,34,0,124,148,43,185,224,130,1,-2,84,97,114,33,56,231,148,2,192,34,88,240,33,32,166,152,162,97,149,-47,96,33,225,221,0,2,35,49,49,161,40,224,57,11,224,46,3,229,201,-24,160,74,161,246,41,63,192,249,32,39,124,45,96,12,65,0,213,104,106,-223,66,195,2,90,32,66,149,62,131,9,33,5,188,115,245,109,1,192,193,-131,22,67,44,139,20,199,219,224,193,4,234,224,0,224,46,4,69,4,163,-64,194,239,104,239,128,219,64,105,34,13,128,85,235,100,0,130,1,137,164,-64,36,96,191,206,120,2,75,32,66,96,119,109,3,205,153,40,45,235,128,-3,2,51,57,54,64,60,2,52,53,50,32,35,225,185,1,2,58,92,49,-2,48,38,34,231,187,1,236,140,23,2,32,32,102,71,105,227,172,2,126,-168,162,107,2,53,51,51,224,237,0,224,72,24,44,207,2,101,99,116,2,-101,100,58,224,75,1,105,10,64,231,100,123,130,173,236,188,2,67,54,98,-177,2,53,51,55,96,85,96,45,224,12,4,2,55,57,56,70,2,86,41,-65,41,129,48,2,48,53,32,134,16,160,7,66,32,64,78,172,171,66,20,-2,53,52,55,96,75,62,65,160,62,177,78,247,93,1,138,243,2,50,48,-54,102,169,224,102,0,224,211,2,2,101,111,102,128,202,43,138,2,50,52,-49,224,149,0,58,170,224,194,0,175,238,32,202,224,179,0,154,249,78,248,-134,179,224,210,6,2,56,48,52,224,197,1,96,8,32,117,64,74,178,190,-2,49,54,48,99,23,70,154,160,38,32,29,64,36,224,104,16,117,14,2,-56,48,51,101,207,48,121,224,107,2,79,61,2,35,54,49,162,183,64,17,-66,84,64,80,135,66,32,42,127,127,96,251,242,252,2,2,97,108,117,106,-131,225,53,7,250,75,1,66,167,250,78,1,64,81,239,252,0,225,129,2,-2,56,48,50,231,142,0,102,156,128,24,209,216,2,53,55,53,96,5,225,-166,1,204,239,162,47,225,120,10,64,106,164,235,140,215,129,93,224,67,3,-64,213,66,163,224,213,6,2,92,57,50,2,38,110,34,224,213,9,141,101,-180,97,64,213,164,36,128,107,176,166,225,197,4,225,101,6,2,49,32,35,-49,208,129,95,173,67,96,19,64,11,64,66,216,148,65,13,64,15,226,248,-0,225,123,11,2,107,101,121,224,163,10,251,241,2,110,249,225,122,5,237,-122,0,224,249,4,237,250,0,131,200,68,46,33,154,70,205,34,13,64,81,-231,247,0,252,139,9,165,97,187,1,32,31,2,90,32,95,97,152,2,49,-51,52,225,28,2,130,255,2,80,32,58,130,235,160,213,2,53,32,80,101,-212,2,52,52,57,231,162,0,147,185,33,88,2,58,49,55,64,156,98,42,-242,119,0,226,215,1,227,65,5,168,4,236,236,2,65,238,64,83,113,23,-70,213,225,139,2,96,148,68,51,239,19,10,2,50,53,56,65,184,126,63,-111,114,200,64,96,227,233,153,4,33,52,96,124,224,34,0,162,15,64,91,-130,228,66,38,240,123,17,240,125,10,96,59,175,171,116,198,64,112,246,75,-1,40,45,80,214,128,240,103,41,231,94,5,2,55,57,53,160,164,224,14,-1,179,27,2,35,54,52,252,112,1,66,24,115,110,104,141,156,111,104,147,-252,111,4,176,165,252,137,10,96,231,124,67,252,159,4,130,117,167,11,96,-161,170,98,224,195,5,32,151,131,5,224,196,1,241,77,3,226,91,0,96,-101,66,223,224,62,28,2,85,32,83,128,144,234,182,3,65,253,100,141,64,-61,161,14,2,55,54,57,220,68,96,17,64,175,2,54,56,32,32,4,35,-101,2,54,55,48,232,225,2,192,9,232,227,0,96,36,160,58,32,121,64,-6,194,230,136,45,225,69,9,193,2,224,219,5,96,21,100,69,129,135,224,-34,10,183,221,224,34,2,225,74,9,2,54,49,48,225,10,7,66,65,164,-139,83,142,64,162,32,108,64,21,132,94,97,37,49,209,67,61,2,52,56,-53,130,199,2,52,32,35,104,142,129,213,96,32,74,232,138,4,2,50,48,-52,108,255,224,23,7,2,54,53,53,114,177,64,22,224,24,4,36,0,2,-52,49,49,120,69,2,50,48,50,245,26,3,2,116,102,56,91,36,2,58,-32,98,44,25,219,46,226,74,3,32,2,136,66,64,147,131,110,35,182,230,-73,0,64,141,184,4,211,97,224,46,17,105,113,2,49,50,56,192,46,224,-44,33,224,41,32,131,80,98,116,43,177,32,4,65,15,160,168,64,58,224,-27,22,224,26,4,160,20,174,94,225,8,26,147,127,224,216,82,224,187,47,-224,184,22,2,49,57,50,247,3,4,224,139,29,224,111,12,182,85,32,29,-32,74,64,39,66,231,214,236,2,80,32,35,128,182,96,21,134,251,218,228,-250,194,0,163,71,35,41,66,223,115,212,72,63,208,105,134,198,128,46,224,-28,15,96,206,224,28,3,110,35,131,91,131,149,205,84,192,20,108,18,142,-142,160,183,251,125,0,96,76,247,67,24,70,140,197,204,64,14,247,82,1,-101,28,128,232,198,168,239,173,1,235,152,17,2,87,101,108,56,109,47,150,-2,111,32,105,2,110,116,101,2,114,97,99,93,12,2,32,77,105,2,99,-114,111,2,72,115,44,2,32,118,101,2,114,115,105,2,111,110,32,146,17,-2,50,50,57,64,90,164,150,241,45,6,2,51,54,49,239,51,0,251,160,-5,96,135,2,56,48,32,36,147,122,234,198,93,32,50,64,227,2,55,55,-52,136,189,34,7,97,246,231,90,1,203,75,79,101,32,118,64,64,104,50,-101,202,199,120,64,252,221,220,38,121,2,75,32,85,243,213,0,80,46,243,-229,3,224,1,11,118,33,244,20,13,224,44,25,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,150,161,168,232,209,4,65,171,249,80,0,225,128,34,225,176,255,225,176,-80,224,14,5,224,11,2,245,212,2,225,205,9,174,18,100,94,64,12,33,-246,68,10,99,236,96,15,2,50,56,57,165,208,192,34,242,215,0,109,174,-108,128,2,55,51,57,127,238,106,213,2,54,53,32,66,63,224,82,1,224,-44,0,100,184,242,115,2,2,121,112,101,2,32,39,58,2,113,117,105,2,-116,39,32,36,172,64,8,2,44,32,39,2,58,104,101,2,108,112,39,48,-165,2,114,32,104,32,9,184,9,224,78,5,148,219,83,88,32,124,159,70,-224,101,15,2,87,65,82,2,78,73,78,2,71,58,32,2,67,111,109,2,-112,105,108,61,203,2,119,105,116,2,104,32,71,2,72,67,44,2,32,115,-111,2,32,108,105,2,109,105,116,32,20,2,102,117,110,37,38,2,111,110,-97,2,108,105,116,2,121,46,34,227,4,1,165,221,65,44,187,200,225,27,-0,2,51,50,53,64,252,119,174,197,33,225,33,9,41,80,97,35,77,18,-171,79,244,215,0,64,22,64,48,224,174,1,2,46,109,104,2,115,105,34,-64,27,224,19,1,2,62,32,34,96,132,119,97,64,144,156,187,128,155,252,-164,1,230,202,4,2,35,53,56,199,246,225,185,1,69,143,108,221,160,214,-224,180,4,64,21,32,175,32,100,225,74,15,2,66,121,101,217,151,225,23,-0,129,25,236,230,1,2,95,53,52,107,76,64,226,130,80,133,208,153,113,-64,183,226,24,25,2,85,110,114,2,101,99,111,2,103,110,105,2,122,101,-100,95,56,2,109,97,110,155,66,224,87,10,248,109,4,198,30,141,71,153,-231,157,170,110,207,146,157,32,0,77,175,226,211,18,247,20,32,245,184,0,-192,165,243,9,9,83,85,2,51,50,52,246,196,4,224,191,5,236,11,0,-32,96,237,239,0,2,52,48,52,200,147,160,62,65,115,189,164,97,167,33,-111,2,79,32,80,224,151,13,67,73,167,221,32,185,128,109,224,119,0,190,-112,224,60,16,2,99,108,101,171,203,224,61,0,228,30,3,94,140,115,58,-103,225,227,231,8,119,65,32,196,103,218,2,51,54,52,231,217,0,231,238,-1,76,156,231,238,0,136,32,41,110,104,68,225,31,12,224,169,16,2,114,-101,108,2,111,97,100,224,170,5,227,156,5,100,146,65,141,224,22,6,132,-163,232,216,2,134,235,252,5,1,178,138,2,51,54,48,240,41,3,226,42,-4,64,233,224,213,0,224,233,3,225,20,4,165,79,225,247,14,224,218,16,-2,100,101,108,2,101,116,101,222,55,224,125,5,97,131,164,74,150,49,238,-74,1,98,68,128,26,154,255,226,73,3,97,111,67,158,225,105,13,224,140,-16,2,116,121,112,224,138,11,65,188,226,91,6,224,73,23,2,107,105,110,-255,12,0,224,73,5,2,56,50,32,224,73,36,230,26,0,79,83,228,81,-14,64,86,165,102,225,126,9,241,175,0,67,79,143,78,255,190,3,99,206,-2,115,58,92,55,92,102,161,2,32,32,32,32,0,96,9,171,72,96,26,-130,130,64,26,160,9,2,109,111,100,2,117,108,101,128,28,99,73,96,55,-128,9,2,97,108,108,2,32,100,101,2,102,105,110,2,105,116,105,2,111,-110,115,96,35,129,232,2,32,100,32,32,25,128,9,224,32,0,2,40,115,-41,2,32,100,92,64,36,65,128,2,32,101,32,32,0,2,115,104,111,2,-119,32,116,64,14,2,111,102,32,2,101,92,49,32,28,65,83,2,32,116,-32,224,28,7,2,116,92,49,32,28,65,38,128,186,2,116,104,105,2,115,-32,116,2,101,120,116,64,23,55,185,128,152,55,196,85,248,2,97,116,101,-87,205,2,114,101,115,76,25,64,33,32,134,2,110,32,32,96,0,2,97,-100,100,39,158,2,112,32,108,2,101,118,101,224,192,3,184,120,65,63,205,-166,227,103,8,206,29,227,103,10,36,8,148,176,219,199,229,106,10,45,15,-81,21,218,67,2,55,56,48,167,8,227,167,4,67,100,67,140,34,10,227,-231,11,229,219,21,2,49,53,48,142,5,2,55,56,49,104,196,140,190,131,-200,226,33,1,142,114,159,166,2,55,55,54,85,28,90,107,38,109,224,4,-13,192,103,73,25,64,104,255,36,0,2,79,32,95,82,3,220,34,230,187,-4,236,222,9,38,181,224,13,0,96,25,241,90,0,103,244,255,78,1,183,-66,85,8,135,109,253,78,8,224,204,2,238,86,0,230,217,16,98,69,253,-206,1,96,38,129,20,250,18,20,2,61,32,34,253,154,4,225,191,4,96,-122,141,212,234,4,5,2,95,105,116,130,71,64,96,226,71,92,133,255,226,-71,78,70,202,194,71,209,75,192,255,69,48,226,71,9,192,1,226,59,55,-226,45,72,64,177,191,62,127,21,49,196,32,217,97,43,116,200,2,73,32,-64,64,34,137,254,37,169,2,52,52,49,72,188,64,5,64,23,217,71,226,-47,15,133,44,176,136,96,37,2,51,55,52,240,218,19,2,40,109,111,224,-49,12,224,33,1,2,41,32,119,2,104,101,114,101,25,2,105,109,112,2,-111,114,116,2,32,80,114,2,101,108,117,2,100,101,92,224,17,1,2,83,-121,115,2,116,101,109,2,46,73,79,2,46,80,114,49,33,2,79,114,82,-2,117,110,92,132,243,2,97,117,108,2,116,32,40,2,73,110,116,2,101,-103,101,2,114,44,32,2,68,111,117,2,98,108,101,2,44,32,83,2,116,-114,105,2,110,103,44,2,32,40,41,2,41,92,49,221,110,96,226,134,57,-226,177,15,193,124,97,208,43,182,75,239,86,153,152,208,2,55,54,48,173,-65,235,132,3,66,205,65,236,226,154,12,126,224,168,1,72,239,238,33,0,-33,238,163,30,114,143,153,101,160,110,2,56,54,52,128,110,121,23,227,68,-65,145,247,224,169,14,66,222,168,106,231,148,0,32,26,218,126,224,103,0,-228,42,16,76,169,97,90,237,90,17,95,21,90,10,2,51,56,57,118,187,-2,95,52,54,232,144,0,190,199,224,47,4,109,64,202,161,242,228,1,224,-66,1,224,32,0,242,176,11,216,104,137,124,32,160,125,135,163,233,226,188,-16,32,215,52,144,221,140,2,55,54,54,232,119,2,64,74,122,90,147,59,-249,159,0,2,32,73,32,129,151,35,249,163,206,52,59,2,50,50,32,229,-4,0,224,24,1,2,80,32,75,239,241,4,99,231,64,13,44,246,183,86,-110,127,163,222,128,18,64,54,192,206,117,165,240,186,3,116,254,138,78,2,-51,53,50,181,214,32,3,96,65,230,52,20,2,114,97,110,2,115,108,97,-2,116,101,58,2,32,110,111,2,116,32,102,2,111,117,110,2,100,32,34,-130,3,154,236,179,246,120,79,129,1,198,138,32,208,128,169,57,117,164,182,-80,180,128,19,186,154,141,216,32,185,196,208,193,142,68,135,67,26,181,125,-133,8,131,123,64,78,64,17,251,13,9,224,32,19,244,209,0,224,32,15,-128,204,161,93,249,233,3,192,24,125,94,67,148,188,237,250,150,15,2,100,-121,110,2,115,121,109,250,148,6,2,95,57,48,162,190,250,76,11,96,156,-59,34,225,166,19,225,164,22,65,160,2,32,112,114,2,105,109,111,2,112,-32,34,160,105,33,152,2,56,55,57,223,134,66,170,226,247,0,224,231,10,-129,66,96,231,96,226,251,139,0,226,162,0,65,190,225,55,8,158,192,128,-79,251,94,8,226,223,1,224,105,3,96,21,112,239,246,163,0,224,116,0,-2,56,53,56,128,19,224,31,3,226,176,38,2,58,32,105,38,22,42,248,-37,233,207,191,151,169,2,54,52,57,228,141,1,182,141,32,73,102,215,143,-217,77,129,97,176,78,125,72,0,216,196,64,50,64,24,239,165,9,93,190,-196,15,67,171,224,30,9,73,5,96,30,56,79,224,30,11,32,125,96,30,-64,4,237,31,16,2,67,39,34,161,77,224,67,11,69,186,185,138,224,30,-12,192,98,89,186,224,98,16,2,83,39,34,166,227,224,67,11,73,233,96,-67,68,105,224,197,10,34,224,96,30,67,186,224,61,10,192,30,67,125,224,-30,10,192,160,67,232,224,30,10,193,65,69,38,224,191,16,2,66,39,34,-169,19,224,67,11,88,126,96,67,73,72,224,98,10,201,135,2,82,32,64,-224,98,17,2,75,50,34,97,169,66,136,224,36,17,2,51,34,32,64,36,-67,242,224,36,17,2,52,34,32,64,36,74,79,225,244,18,2,66,34,32,-165,38,224,180,11,58,183,128,180,2,43,32,64,224,30,11,193,85,2,45,-32,64,224,30,11,192,242,2,42,32,64,224,131,17,2,113,117,111,146,123,-64,8,224,40,19,2,114,101,109,96,39,32,7,224,38,19,2,117,113,117,-160,80,96,9,224,42,20,192,82,64,8,224,40,19,2,110,101,103,96,39,-32,7,224,38,19,212,118,32,7,224,38,19,2,111,114,34,64,37,54,175,-224,36,18,2,120,111,114,96,37,32,7,224,38,19,2,105,110,118,96,38,-32,7,224,38,19,2,115,104,108,96,38,32,7,224,38,21,128,116,32,7,-224,231,20,192,39,64,8,224,79,20,2,117,98,116,92,78,128,84,160,12,-224,48,19,2,61,61,34,64,42,69,199,224,36,17,2,47,61,34,64,36,-2,47,61,32,228,139,12,195,135,38,33,224,67,17,2,60,61,34,96,35,-224,67,14,194,185,2,62,32,64,224,67,17,2,62,61,34,96,35,224,172,-20,2,117,60,34,98,97,224,141,20,2,117,60,61,160,37,224,75,21,2,-62,34,32,64,37,224,149,20,2,117,62,61,160,37,224,75,20,2,111,114,-100,162,133,226,171,20,2,99,104,114,96,38,32,7,224,38,19,2,102,43,-34,120,130,228,39,10,224,36,2,2,45,34,32,64,36,228,45,10,224,36,-2,2,42,34,32,64,36,228,51,20,2,102,47,34,96,36,2,47,32,64,-224,36,18,162,76,32,7,224,75,21,160,38,226,79,11,224,38,2,129,199,-2,102,60,32,224,36,20,160,75,225,199,21,2,102,62,34,96,37,225,199,-20,2,102,62,61,160,37,224,75,21,196,155,64,8,224,40,20,83,237,128,-41,115,247,224,42,19,2,114,101,97,130,29,96,9,228,127,20,2,116,111,-102,132,128,32,8,228,10,20,2,101,113,34,100,5,2,101,113,32,224,38,-21,2,117,97,108,192,41,32,10,224,44,19,224,43,1,224,42,24,2,115,-99,109,149,254,64,8,224,208,20,192,40,64,8,230,142,20,2,110,102,34,-102,142,2,110,102,32,224,38,18,48,52,2,62,62,61,96,41,128,10,224,-44,24,224,43,1,224,42,22,2,114,101,116,2,117,114,110,192,46,128,13,-224,50,22,43,194,2,110,116,34,160,49,96,12,224,48,22,2,115,101,114,-2,105,97,108,59,88,192,52,224,16,0,224,56,22,2,100,101,115,224,58,-7,224,18,2,224,117,23,2,116,100,105,224,216,0,96,12,224,48,25,2,-111,117,116,224,49,2,32,13,224,50,25,2,101,114,114,224,50,2,32,13,-224,50,22,2,103,101,116,2,65,114,103,2,82,101,102,192,53,224,16,0,-225,118,23,2,101,114,102,2,111,114,109,2,73,79,34,193,122,192,16,224,-113,23,2,99,34,32,160,106,2,99,32,64,226,140,18,2,97,105,115,129,-103,96,9,229,209,20,2,97,116,99,2,104,34,32,69,211,64,9,224,42,-19,238,107,2,128,10,233,35,21,2,119,67,65,146,247,2,76,101,110,169,-46,224,18,3,224,60,19,2,112,101,101,2,107,67,65,128,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,2,80,116,114,160,42,32,9,224,42,21,2,68,98,108,160,-42,32,9,224,42,21,2,70,117,110,224,88,1,128,12,224,48,19,2,65,-46,97,2,108,108,111,130,22,160,11,224,46,21,2,115,105,122,130,25,128,-10,224,44,21,229,248,0,128,10,224,44,21,2,119,114,105,188,114,160,11,-224,46,21,167,142,64,8,224,40,19,2,98,115,43,136,76,64,8,224,40,-23,224,41,1,224,42,22,160,124,64,8,224,40,21,168,13,64,8,224,40,-21,136,15,32,7,224,38,22,192,79,232,18,21,2,98,115,62,160,39,229,-245,20,32,30,192,79,230,73,21,2,98,115,99,166,199,96,9,224,42,21,-2,112,97,99,2,107,34,32,96,43,64,10,224,44,21,2,117,110,112,224,-46,1,128,12,224,48,21,2,108,101,110,2,103,116,104,160,48,128,12,224,-48,21,44,40,2,115,116,114,160,48,128,12,232,173,21,128,9,168,176,160,-22,227,115,20,224,46,0,128,10,121,194,250,249,9,224,0,82,81,237,217,-217,182,207,186,101,219,59,81,243,251,56,20,103,189,120,138,248,221,3,154,-65,247,27,8,81,191,251,70,4,59,66,102,141,64,27,153,141,251,182,1,-122,131,251,182,49,64,82,153,200,224,110,4,160,108,152,255,32,81,56,210,-64,92,119,127,2,54,48,48,32,12,2,54,56,54,148,72,2,48,57,32,-96,43,254,37,0,119,145,120,37,86,236,32,10,2,50,32,95,32,31,90,-59,2,49,54,57,146,151,83,222,185,69,64,59,151,41,32,42,2,51,32,-75,51,255,2,75,32,66,154,201,120,74,118,84,120,221,225,32,0,150,87,-224,151,6,2,55,48,54,128,6,160,144,147,211,214,99,81,51,215,69,180,-136,64,45,2,53,51,53,243,112,1,32,53,57,81,155,16,84,164,32,52,-117,223,155,111,128,61,2,83,32,85,64,114,128,222,32,69,51,0,32,5,-40,26,225,94,2,32,241,243,196,1,124,3,2,83,32,67,118,107,50,209,-64,14,2,67,32,79,225,240,0,89,198,65,33,2,51,52,32,247,166,2,-252,39,0,2,54,53,52,32,28,2,52,51,57,160,34,2,35,51,54,245,-8,0,224,36,0,32,66,129,31,184,19,116,191,151,64,2,53,53,32,160,-91,193,154,2,57,49,32,32,117,2,53,56,48,64,87,255,10,0,216,73,-186,30,192,88,85,7,2,51,49,57,183,49,152,171,163,0,2,53,55,32,-128,189,118,178,33,19,83,84,225,164,1,85,188,120,254,2,75,32,90,96,-136,96,183,64,24,130,222,85,85,128,94,125,101,54,230,32,23,64,30,226,-225,1,2,55,53,52,188,205,96,24,130,167,253,49,0,86,67,84,158,32,-39,214,120,152,253,51,243,118,49,160,142,128,20,224,29,0,66,126,182,192,-224,35,1,96,95,130,237,2,89,32,66,185,118,152,165,128,100,253,70,6,-64,46,194,240,253,192,0,162,22,224,105,0,226,40,0,193,58,152,114,121,-195,247,69,3,65,119,2,54,52,48,90,148,155,65,192,78,128,157,226,193,-3,224,54,1,129,22,160,35,225,2,0,224,130,1,161,8,192,178,162,203,-254,8,2,64,194,131,119,119,168,152,200,219,54,32,235,2,50,53,56,32,-47,2,50,53,57,250,128,3,251,89,2,64,160,219,68,128,117,251,119,4,-2,52,48,55,184,2,187,183,94,71,251,188,2,32,178,84,114,226,202,1,-162,93,62,145,160,65,32,32,130,212,225,60,0,224,93,0,163,190,129,200,-130,2,127,160,99,142,130,225,193,9,65,200,183,142,88,88,250,91,0,224,-106,3,194,217,89,112,59,231,64,241,33,144,162,214,252,110,2,129,52,218,-212,163,127,192,69,64,175,34,205,2,50,50,51,227,159,4,225,84,1,64,-32,154,122,96,10,64,101,64,78,132,166,220,15,187,28,224,2,0,128,47,-254,105,0,224,8,0,160,24,224,25,11,154,212,249,171,3,224,29,5,224,-61,2,224,33,2,224,42,3,224,69,6,224,37,11,224,2,4,231,142,2,-224,113,16,224,85,10,131,97,224,2,23,224,48,4,225,31,8,224,178,5,-224,143,9,224,49,30,220,130,253,41,3,224,1,15,224,94,5,225,27,23,-224,151,16,224,57,5,225,9,24,225,6,5,225,249,16,224,61,15,224,125,-9,224,65,42,224,68,11,225,40,2,225,3,43,224,134,9,158,226,224,86,-2,224,145,22,224,151,25,224,1,15,40,156,69,68,167,87,231,126,2,225,-220,44,225,103,17,224,138,40,229,23,0,224,138,21,227,61,25,224,138,57,-200,108,225,177,16,230,157,3,224,96,9,225,178,36,224,153,37,134,240,226,-209,26,225,32,36,224,131,37,159,39,226,50,47,227,82,15,224,131,37,255,-199,0,224,65,30,224,114,11,225,119,36,2,50,55,32,224,244,29,225,129,-16,224,126,52,231,139,0,224,63,15,224,115,28,224,112,34,234,213,1,225,-226,29,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,225,121,21,229,3,32,227,223,8,227,220,11,-228,117,28,224,129,5,225,7,30,224,126,7,230,156,1,166,147,225,19,5,-225,13,16,227,228,9,224,124,25,205,147,232,38,12,231,31,7,136,183,224,-14,15,224,154,1,232,194,11,225,126,18,227,228,1,224,73,3,64,38,141,-17,32,39,32,166,76,39,42,212,46,72,2,56,53,32,2,64,64,35,78,-249,64,20,224,19,3,228,48,4,224,129,1,64,67,235,129,1,224,232,0,-237,169,0,174,92,67,125,237,121,3,224,183,6,235,92,10,234,85,8,224,-255,7,78,56,2,95,50,57,78,127,111,24,2,35,57,49,225,189,9,224,-88,11,226,91,2,225,101,4,231,50,6,198,21,229,109,3,224,40,12,163,-107,224,37,0,224,34,10,128,122,209,6,224,25,3,229,247,5,2,73,32,-64,224,252,0,65,66,64,5,233,79,2,226,26,0,224,220,5,238,24,1,-45,55,226,230,16,130,64,226,95,3,224,248,1,225,6,3,45,95,176,207,-165,50,225,208,3,224,74,10,233,237,12,141,195,226,120,6,226,44,6,2,-95,50,49,33,188,226,56,0,226,55,17,243,174,0,144,244,224,106,6,81,-212,224,16,21,77,145,227,38,6,111,151,2,57,32,102,243,45,0,2,92,-51,52,2,38,109,104,2,115,47,83,2,121,115,116,2,101,109,47,2,67,-111,110,2,115,111,108,2,101,47,83,2,105,109,112,2,108,101,82,55,151,-2,108,105,110,2,101,46,104,2,115,92,51,2,52,38,44,2,49,54,50,-2,58,53,34,227,14,10,131,91,225,121,1,224,237,17,228,64,7,238,128,-17,224,42,9,226,211,10,225,232,0,230,72,3,172,108,227,50,19,227,180,-3,175,232,65,123,96,8,130,209,66,75,227,225,5,226,155,1,224,2,0,-239,240,12,235,253,6,224,34,1,242,238,0,96,40,68,103,81,180,132,117,-226,11,8,96,135,160,5,112,61,224,139,2,64,209,129,106,32,68,2,55,-53,32,2,95,55,48,97,106,80,164,160,71,179,251,211,214,32,109,243,179,-1,224,42,3,64,41,64,237,226,108,12,228,178,7,241,104,0,224,245,11,-230,188,3,224,172,2,243,229,2,128,41,96,148,80,171,224,175,4,242,212,-2,66,252,242,122,0,196,136,224,255,4,177,63,181,4,224,48,3,224,55,-1,100,82,164,87,224,6,3,225,151,10,241,171,3,192,88,130,15,227,148,-26,224,169,2,227,10,1,225,2,7,36,91,225,113,2,224,182,9,224,175,-5,231,152,7,231,178,4,224,147,2,244,209,0,34,206,32,142,69,184,160,-6,225,142,1,231,65,0,228,35,2,226,156,12,225,201,8,227,157,8,2,-56,32,35,226,170,1,228,219,14,182,121,226,149,2,96,247,236,238,0,229,-94,2,2,64,64,85,244,230,4,129,59,224,242,2,244,5,0,226,112,3,-2,85,32,35,226,24,0,227,45,8,226,65,3,231,119,6,224,95,12,225,-13,2,226,218,9,224,105,2,224,32,2,227,244,16,225,52,31,97,197,243,-195,9,211,223,225,56,15,224,221,8,231,164,4,224,145,5,103,91,227,171,-17,226,142,5,118,169,64,23,228,143,0,167,154,164,67,161,131,70,213,244,-176,0,133,38,226,140,0,128,27,225,108,0,163,109,224,63,3,128,242,71,-97,224,67,15,2,67,32,80,225,179,6,160,70,246,11,1,229,0,4,226,-189,15,227,193,8,195,104,131,174,165,1,228,202,20,248,153,4,161,222,164,-131,100,182,195,119,225,169,5,228,205,2,160,60,2,50,50,54,229,230,2,-250,221,12,2,92,56,38,2,32,92,56,2,38,34,32,162,208,150,228,151,-13,248,171,0,164,104,128,150,2,82,32,64,229,141,21,225,189,0,227,27,-3,234,138,12,192,20,226,179,11,174,54,231,161,19,98,120,64,164,246,98,-0,132,160,65,199,138,8,134,120,248,74,3,250,128,4,32,13,35,128,96,-4,215,16,132,229,128,250,36,212,65,72,161,188,100,213,134,207,96,112,2,-49,53,32,64,194,2,53,52,48,130,54,198,221,230,56,3,98,65,139,236,-32,137,32,76,151,90,249,177,0,193,175,54,199,86,207,89,213,2,50,49,-56,160,225,64,20,154,3,232,119,3,32,50,226,119,4,67,123,65,230,64,-169,56,16,32,63,236,65,1,91,231,2,64,35,48,137,4,33,117,225,246,-1,2,103,101,116,2,82,97,119,2,32,102,97,2,105,108,101,2,100,34,-32,195,134,193,72,32,81,111,62,64,130,154,109,2,94,71,69,2,84,82,-65,2,87,32,58,128,130,124,61,2,55,52,52,96,15,154,87,2,94,102,-108,2,117,115,104,2,98,32,58,96,23,160,203,59,117,224,203,0,153,239,-225,126,2,155,201,2,95,52,49,2,51,32,95,66,173,120,130,235,164,3,-240,60,0,32,241,92,39,193,99,32,54,33,211,130,72,249,7,4,64,102,-153,147,59,54,2,50,32,65,152,34,2,52,49,32,128,176,2,51,56,32,-64,14,152,49,226,188,0,225,61,8,32,82,61,72,227,102,2,225,107,23,-2,50,52,52,36,181,161,103,99,119,99,110,254,81,15,2,83,97,118,2,-105,110,103,2,32,99,97,2,99,104,101,222,206,32,95,32,48,64,248,124,-137,2,95,50,55,201,202,64,141,66,18,128,16,32,191,66,151,129,127,61,-189,64,15,223,91,236,153,4,100,43,65,31,2,51,55,56,130,185,226,54,-5,130,105,78,93,97,61,250,31,5,65,92,32,115,65,125,32,204,193,19,-98,18,231,112,10,64,27,100,127,2,50,54,49,223,20,32,154,192,164,2,-53,32,58,128,32,32,15,2,73,79,46,2,115,101,114,2,105,97,108,2,-105,122,101,96,22,162,59,2,97,100,100,2,95,108,122,2,55,55,95,2,-99,111,109,2,112,114,101,2,115,115,111,2,114,32,58,128,114,129,204,62,-216,2,52,32,90,224,1,6,234,77,1,160,116,130,98,96,198,2,56,56,-32,67,104,93,31,127,39,192,222,64,23,64,205,2,50,57,32,45,180,221,-211,99,204,64,172,133,162,131,9,96,66,129,61,128,94,219,238,165,153,124,-108,2,95,51,56,33,41,2,51,56,57,130,107,64,64,224,35,1,98,8,-226,9,18,2,69,120,99,2,101,112,116,2,105,111,110,2,58,32,34,225,-57,0,218,208,129,99,128,199,46,234,36,46,32,148,2,51,55,53,195,173,-224,229,6,133,252,226,3,0,224,255,3,128,50,232,203,6,97,8,224,255,-5,91,186,128,172,2,51,55,52,224,167,3,45,126,237,116,0,171,95,225,-75,0,235,95,1,128,69,224,15,2,48,191,161,25,162,38,188,32,128,143,-97,125,225,104,0,65,72,65,44,2,85,32,67,204,58,101,155,227,131,3,-192,178,65,14,2,64,95,56,255,84,3,224,31,1,64,102,160,39,224,92,-4,244,247,5,33,104,66,1,225,170,1,2,51,51,49,131,22,2,51,51,-50,96,170,34,192,2,95,49,54,96,188,64,44,165,137,2,51,51,51,34,-118,2,85,32,66,169,188,32,139,128,88,64,35,130,243,238,11,0,240,37,-2,64,80,32,245,70,125,70,19,192,61,224,7,3,72,155,166,138,235,192,-9,253,96,2,228,124,13,148,237,226,118,4,167,190,226,120,12,35,102,2,-98,105,110,2,97,116,111,2,114,115,58,2,92,49,48,167,255,2,95,54,-53,166,186,253,182,6,96,221,131,193,224,221,11,128,155,2,56,48,32,199,-129,226,29,2,97,247,66,24,50,207,70,41,234,22,6,161,210,48,40,226,-185,10,32,56,135,33,208,56,227,149,7,193,63,192,83,228,153,0,160,123,-225,53,10,98,100,229,179,5,227,5,5,225,67,35,2,112,105,108,69,201,-2,117,115,101,2,100,32,98,2,111,111,116,2,32,109,111,2,100,117,108,-165,212,64,196,207,230,255,130,5,225,25,14,239,29,2,226,213,12,68,198,-226,211,2,128,185,34,54,207,140,195,224,65,12,226,62,38,225,7,4,224,-250,25,2,116,111,116,2,97,108,32,49,161,2,111,114,116,2,32,116,105,-2,109,101,32,64,0,128,245,238,159,0,107,215,32,127,123,3,166,225,138,-28,224,72,1,2,109,115,34,241,108,7,226,122,3,244,137,1,196,88,137,-219,137,228,37,17,225,176,2,2,54,52,54,64,4,137,149,32,120,131,17,-211,215,66,192,134,107,72,106,2,49,57,53,33,238,117,87,64,14,2,51,-53,56,64,77,121,26,64,40,134,117,166,233,202,68,97,82,107,72,97,78,-32,166,33,23,235,125,2,141,101,32,111,64,65,134,136,226,208,11,114,55,-176,243,145,248,74,21,163,24,225,181,0,197,89,178,187,194,2,41,79,226,-10,1,226,11,2,163,15,32,65,163,72,2,80,32,75,193,49,130,27,238,-111,3,248,2,0,114,166,130,46,209,170,2,52,51,57,82,168,96,78,129,-38,32,109,239,33,0,246,72,5,129,114,32,31,231,245,0,64,151,135,175,-2,52,32,65,161,76,135,16,2,85,32,90,231,180,5,64,26,233,136,0,-65,103,230,80,17,162,189,2,51,49,54,32,233,2,52,50,56,226,156,2,-64,174,226,170,11,2,79,32,35,74,184,128,107,241,49,2,65,64,65,71,-227,63,1,130,74,194,249,96,220,226,249,19,2,67,97,110,2,110,111,116,-2,32,102,105,2,110,100,32,2,112,97,99,2,107,97,103,227,237,8,163,-147,227,131,2,231,106,10,201,42,32,193,148,73,33,15,64,156,33,15,231,-118,2,2,112,107,103,32,92,64,26,166,126,2,52,51,53,73,23,66,69,-137,93,2,49,50,32,64,15,133,155,244,165,2,98,21,2,50,56,57,227,-70,2,223,91,208,3,98,148,194,55,162,0,76,251,182,195,229,72,37,128,-205,229,72,45,132,71,69,72,229,55,7,226,26,13,128,94,76,57,67,210,-232,165,10,128,54,68,42,2,95,52,52,32,125,231,94,1,241,67,8,225,-154,4,104,2,35,227,167,4,133,160,77,176,197,160,203,144,156,92,247,55,-3,225,45,107,108,64,2,100,32,34,230,108,7,232,249,4,206,216,69,47,-2,52,52,50,134,66,176,55,43,228,37,158,241,204,0,66,72,133,35,226,-1,43,231,74,51,224,211,1,103,69,226,6,56,2,45,98,111,2,111,116,-34,160,144,130,10,227,225,32,231,199,3,99,234,2,111,117,110,2,100,58,-32,227,228,8,226,82,35,33,88,169,75,226,83,1,2,54,50,55,230,155,-1,66,80,99,192,70,13,74,128,2,54,53,50,234,127,1,238,237,4,35,-241,128,50,134,99,37,107,197,84,64,20,204,162,248,178,4,134,128,65,245,-2,52,50,55,245,63,5,224,189,3,225,95,0,193,92,35,10,229,236,0,-246,15,3,251,13,6,251,207,0,255,84,7,242,8,2,252,78,8,248,203,-7,164,161,96,83,181,75,226,127,37,235,1,4,226,127,38,2,112,97,114,-41,194,235,9,3,104,174,2,54,51,55,254,250,8,224,183,4,231,176,7,-162,168,115,118,128,175,224,168,1,234,248,1,210,89,2,54,51,56,114,89,-96,29,154,29,167,121,231,2,1,130,175,128,15,224,190,16,194,173,2,97,-109,101,2,32,100,111,2,101,115,32,66,183,2,97,103,114,2,101,101,32,-2,119,105,116,2,104,32,102,49,229,96,29,194,198,247,184,1,103,21,98,-211,231,68,12,72,211,135,68,228,95,2,225,213,11,225,235,14,188,180,226,-133,17,250,213,13,189,125,251,204,0,232,27,10,97,116,83,19,2,54,51,-57,193,249,2,54,52,48,227,127,6,2,54,52,49,163,127,229,191,1,251,-214,8,253,123,1,224,28,14,188,215,224,28,13,227,101,21,225,44,0,255,-84,2,253,196,5,158,17,253,193,5,192,35,224,111,7,227,62,1,100,74,-252,51,0,224,5,33,148,220,229,220,40,205,231,227,92,43,2,116,121,112,-2,101,32,99,2,104,101,99,2,107,101,100,227,98,2,233,149,1,2,54,-52,50,67,12,67,52,224,53,1,2,45,45,45,2,45,45,92,224,45,0,-224,0,3,225,74,2,224,2,9,193,56,225,171,14,230,71,4,209,201,237,-82,1,226,54,0,113,183,172,77,226,55,19,226,59,6,226,32,50,224,2,-18,233,191,0,224,186,50,224,153,15,224,192,8,224,40,19,224,198,23,224,-200,16,225,149,0,224,81,7,224,224,3,226,218,1,230,112,12,227,60,12,-224,109,11,228,166,18,224,143,26,226,64,1,224,255,9,224,93,6,224,92,-13,192,32,228,215,14,253,216,3,198,240,224,8,9,231,2,104,2,100,101,-115,2,117,103,97,2,114,101,100,242,15,4,99,153,248,207,1,229,180,8,-229,165,2,128,177,224,5,9,226,198,4,224,207,3,244,147,3,225,30,1,-234,98,25,252,235,6,238,40,2,224,24,9,128,247,224,24,6,234,134,26,-2,100,111,110,205,215,224,166,9,231,55,5,224,91,2,224,89,17,2,44,-32,34,254,183,8,160,69,241,24,3,241,3,1,231,234,16,2,115,32,40,-192,74,245,28,0,224,72,10,224,69,21,2,32,43,32,232,8,11,224,65,-3,224,62,28,224,197,12,79,123,34,49,247,156,4,227,51,3,227,102,0,-226,52,18,226,254,12,233,91,32,57,44,136,209,128,159,32,11,66,66,233,-95,1,54,130,2,51,32,102,224,206,0,2,73,110,116,2,101,114,97,2,-99,116,105,2,118,101,34,254,146,0,218,141,226,121,5,227,91,45,2,108,-111,97,2,100,101,100,237,168,9,235,89,24,163,93,226,97,2,227,63,4,-254,202,2,64,5,228,86,0,236,124,4,224,18,0,2,54,53,53,249,233,-0,164,167,222,245,179,16,188,143,32,8,33,89,2,55,50,32,206,239,249,-12,8,226,241,2,244,142,3,229,162,1,146,120,224,96,1,2,85,32,65,-242,67,2,254,183,0,86,113,73,203,227,216,1,161,246,224,32,0,224,45,-4,205,64,243,121,0,224,16,11,224,32,8,66,53,2,54,53,56,64,148,-2,89,32,66,179,26,211,23,193,13,178,215,64,188,79,41,2,54,57,54,-242,229,2,65,55,212,72,2,95,57,49,105,12,77,119,226,209,1,225,135,-4,80,46,106,118,2,56,50,51,81,78,87,242,250,174,7,224,137,11,248,-11,1,170,114,224,10,4,224,167,4,65,83,225,49,1,224,76,9,140,136,-194,83,34,39,2,32,61,61,34,198,247,77,1,142,187,243,207,5,96,211,-161,167,64,12,192,177,64,207,162,25,60,157,72,99,77,23,75,84,129,98,-78,119,221,98,2,53,51,55,99,3,66,45,32,6,90,79,2,55,48,54,-96,45,2,48,55,32,107,138,2,48,57,32,96,50,147,253,72,82,32,40,-96,80,2,53,54,54,64,12,2,53,55,32,218,7,224,185,0,96,106,36,-101,32,75,64,66,92,156,128,39,227,101,1,2,101,111,102,131,97,62,96,-2,50,52,49,224,134,0,251,193,2,64,122,149,151,32,73,128,168,64,67,-227,49,0,32,190,236,101,0,64,36,95,220,255,207,0,164,185,127,127,118,-24,2,53,52,50,96,148,2,53,53,49,96,189,125,185,254,165,1,160,114,-255,194,1,192,230,2,54,48,51,96,196,228,67,3,224,175,1,129,111,35,-128,228,164,5,2,77,97,105,2,110,34,32,32,29,2,79,32,95,128,170,-83,220,224,36,6,2,109,97,105,128,36,160,128,64,127,180,42,68,56,225,-103,0,35,13,238,61,7,158,135,225,140,4,32,213,170,115,225,39,0,193,-211,225,230,3,2,50,56,53,225,242,2,61,108,2,35,52,48,129,23,2,-54,52,32,32,5,67,74,192,24,135,141,192,13,243,6,1,224,254,2,34,-228,33,64,64,34,33,31,128,198,228,249,0,224,192,13,2,119,104,101,2,-114,101,34,231,63,1,225,107,15,229,28,4,225,113,4,193,115,241,143,0,-66,178,147,7,128,241,134,233,224,9,66,225,74,2,224,5,8,64,177,161,-78,98,231,65,39,110,201,32,26,102,254,225,114,6,225,12,4,2,100,97,-116,2,97,34,32,96,209,73,189,160,8,66,153,224,88,4,224,99,12,32,-94,79,81,224,93,18,2,110,101,119,77,206,192,96,139,255,224,48,6,39,-145,40,2,66,61,97,189,224,107,17,98,29,131,58,143,165,2,54,51,48,-130,56,97,235,2,54,51,52,64,247,100,164,70,102,114,139,244,188,7,183,-69,2,57,49,49,32,21,66,104,159,6,129,210,128,247,224,129,18,64,6,-224,237,18,224,234,41,2,54,50,52,162,225,225,185,6,2,53,50,55,128,-226,2,57,51,32,233,57,1,226,129,0,66,14,224,153,4,161,8,229,77,-4,96,122,2,54,48,57,227,78,7,224,119,1,224,68,4,2,52,52,51,-224,222,21,138,238,192,224,2,57,57,32,128,75,226,37,25,121,69,224,88,-3,224,11,15,224,112,6,2,102,111,114,2,101,105,103,132,161,224,140,18,-224,27,8,2,99,99,97,2,108,108,34,160,26,2,54,48,50,65,6,149,-25,96,15,97,89,225,152,8,224,62,1,2,58,58,34,225,157,7,224,216,-13,2,55,48,48,224,245,15,72,20,227,164,4,98,188,128,54,2,49,57,-50,225,92,10,2,110,102,105,2,120,108,34,199,64,225,150,2,157,242,224,-45,10,2,114,34,32,196,139,224,92,3,133,62,224,46,9,204,6,64,28,-96,151,71,15,228,8,2,2,105,103,105,97,79,231,73,6,132,10,105,29,-71,239,86,114,114,73,171,58,32,103,2,95,54,49,96,121,248,37,10,35,-139,192,32,224,33,8,170,213,160,91,72,30,224,36,4,224,0,0,226,201,-0,161,8,226,201,5,226,125,13,226,136,15,65,27,226,112,18,2,99,108,-97,2,115,115,34,193,252,167,92,131,202,161,199,227,207,11,2,49,50,52,-227,208,0,128,170,226,17,17,34,134,194,130,224,137,6,2,54,49,51,224,-33,8,231,7,7,232,166,3,200,102,32,44,74,241,2,49,54,53,134,154,-224,252,17,66,117,227,222,19,2,110,115,116,2,97,110,99,228,193,1,164,-34,128,94,2,55,48,49,228,169,8,32,83,229,17,22,2,100,101,102,2,-97,117,108,196,51,2,53,55,52,96,219,64,196,96,94,225,205,6,227,105,-19,224,188,22,229,122,3,71,140,227,225,32,135,232,224,119,17,229,19,22,-2,112,97,116,46,12,196,162,197,245,226,43,17,229,251,1,232,116,3,77,-105,208,237,233,59,3,97,121,2,53,55,54,234,189,0,96,146,115,176,232,-143,7,224,237,18,2,60,45,34,160,158,141,209,230,77,43,225,2,32,163,-171,71,153,225,221,7,194,83,229,24,0,225,147,13,161,41,2,56,55,53,-36,33,234,151,1,156,105,2,85,32,83,188,109,36,91,2,60,32,64,114,-195,224,18,6,65,40,100,162,224,18,1,138,40,228,213,2,111,214,2,49,-51,56,100,213,228,241,6,128,253,160,27,2,95,53,57,138,17,226,163,0,-224,20,10,224,62,4,128,226,160,62,2,75,50,32,36,210,200,99,224,149,-6,67,81,236,181,5,224,58,3,241,106,0,103,192,161,246,224,115,1,69,-140,224,90,1,65,33,220,19,77,220,36,148,64,24,36,116,64,25,155,250,-160,25,98,3,160,24,155,254,232,125,8,2,55,53,50,232,125,1,64,39,-141,174,160,64,98,114,160,64,141,148,226,79,6,226,94,10,227,94,11,110,-85,72,119,226,20,3,230,202,1,99,76,64,131,226,37,3,2,83,79,85,-2,82,67,69,167,38,229,14,4,255,114,0,235,132,6,224,135,1,229,140,-5,204,178,224,158,16,208,234,128,37,144,39,2,51,51,32,227,144,7,224,-132,4,142,14,232,119,1,227,54,18,2,97,115,34,197,21,229,200,0,104,-170,232,78,22,231,235,3,231,234,10,2,104,105,100,52,144,225,32,11,160,-155,197,134,141,109,2,54,57,56,227,168,11,224,100,22,2,113,117,97,2,-108,105,102,2,105,101,100,128,103,2,58,49,54,74,13,143,208,236,152,22,-159,93,64,120,103,205,145,56,67,244,136,103,238,40,29,114,64,238,21,5,-229,193,15,96,96,224,95,0,231,64,13,224,46,4,142,48,64,157,96,215,-143,142,81,142,81,2,64,17,143,32,241,126,3,64,7,66,43,64,29,142,-8,2,90,32,66,64,21,192,50,132,187,66,104,225,88,1,112,102,63,190,-33,90,96,20,98,78,99,18,148,238,228,20,0,73,39,193,189,96,31,2,-90,32,95,108,224,2,50,49,53,196,147,64,100,131,254,230,87,4,42,104,-228,128,2,2,85,32,66,37,61,82,152,132,133,81,241,208,189,211,136,114,-40,249,100,1,240,220,1,116,59,239,19,1,122,2,180,114,96,56,224,16,-0,178,128,249,168,3,146,125,243,235,3,64,17,181,148,230,198,2,179,77,-241,17,3,178,83,243,12,2,192,10,213,194,67,228,240,114,1,182,200,2,-53,54,56,224,97,0,226,69,8,70,87,224,41,0,65,35,246,101,7,165,-116,131,242,65,104,191,101,179,1,238,92,0,238,61,3,208,42,231,150,4,-184,7,64,237,64,10,147,60,245,60,5,225,190,0,197,163,225,192,5,132,-160,98,20,240,170,8,132,134,232,87,6,254,62,1,214,12,246,9,2,193,-36,242,176,1,232,97,9,150,38,32,57,192,220,224,217,23,38,45,142,163,-128,199,134,82,229,132,1,229,53,11,228,228,18,110,175,97,169,64,23,2,-54,57,48,238,254,24,116,193,129,188,97,104,184,98,228,235,1,224,78,8,-236,42,24,224,77,2,32,7,34,141,226,146,2,73,70,179,199,144,118,107,-87,82,33,88,1,2,95,56,51,238,104,0,96,38,65,18,244,236,0,241,-192,14,224,5,8,242,144,4,32,79,230,210,6,224,167,0,68,69,64,37,-234,105,12,236,148,1,160,246,225,196,6,45,149,129,183,229,168,20,96,36,-119,184,2,56,54,32,224,51,0,229,176,1,94,63,225,220,7,2,54,56,-57,193,3,32,79,229,97,7,112,13,229,232,31,140,217,237,248,8,229,251,-5,241,62,5,35,156,73,10,32,5,69,30,224,105,23,99,97,224,105,25,-177,134,230,102,15,2,57,48,48,224,199,19,2,54,55,49,161,53,224,139,-15,173,253,129,169,224,221,18,2,55,56,54,197,207,224,110,10,2,49,50,-54,169,183,131,54,224,57,9,102,70,224,57,10,35,162,224,56,2,66,180,-183,110,225,62,22,91,199,136,186,130,88,226,188,5,231,146,13,133,4,195,-232,2,49,51,55,226,64,9,137,203,226,246,17,2,49,48,49,225,112,9,-243,93,9,66,178,226,247,9,32,23,207,93,232,231,2,2,54,56,56,237,-58,9,2,46,46,34,228,73,0,226,20,9,2,49,50,53,131,225,66,239,-33,44,121,13,64,14,200,52,232,4,3,64,115,97,80,2,54,56,53,2,-32,58,49,96,155,128,15,70,79,164,70,32,22,32,97,64,29,136,50,238,-73,18,65,34,160,231,227,93,3,89,121,64,70,163,166,96,8,64,79,168,-29,228,125,22,2,54,55,50,134,90,161,213,104,164,64,7,129,171,2,54,-56,48,160,7,32,38,64,85,134,180,225,232,15,2,49,56,50,234,183,1,-239,85,3,161,112,129,202,225,131,2,146,28,240,66,6,2,111,34,32,235,-83,1,64,104,2,54,54,48,161,82,204,190,242,208,12,2,81,117,97,2,-108,68,111,242,209,10,178,110,146,209,221,52,45,212,128,18,251,88,4,192,-7,64,59,233,116,2,253,181,12,192,168,192,71,168,73,99,250,103,253,2,-51,55,48,66,179,50,87,224,63,2,65,201,32,6,254,253,6,64,220,198,-53,242,214,23,2,55,55,49,241,216,22,154,231,227,15,0,241,71,20,2,-104,101,110,224,45,18,228,179,5,108,174,233,82,2,224,76,7,2,101,108,-115,185,103,192,77,64,215,196,88,224,204,13,119,224,224,160,18,2,108,101,-116,241,231,0,98,12,169,205,242,217,21,224,210,4,32,132,66,207,224,132,-17,2,56,51,52,244,39,22,2,97,115,101,225,83,33,188,103,224,177,0,-40,54,129,226,67,93,224,133,16,137,13,113,177,201,235,135,124,64,56,132,-75,234,250,5,64,37,32,183,234,36,7,134,215,97,36,233,199,9,33,111,-100,209,64,83,132,143,250,114,4,224,212,18,251,68,2,128,216,237,93,12,-64,87,132,201,229,203,1,139,159,160,8,224,249,15,245,103,29,100,9,238,-189,7,35,169,224,61,2,225,162,1,234,53,6,124,54,2,80,32,95,128,-168,96,86,224,57,15,64,197,197,63,230,210,14,72,107,224,180,12,75,15,-192,179,149,218,199,155,231,255,12,226,160,0,165,89,225,202,4,106,153,253,-115,5,106,213,136,93,252,202,9,240,128,8,248,230,21,206,8,252,241,12,-50,186,76,245,117,180,2,48,48,54,167,21,108,63,102,186,164,181,70,63,-224,183,8,32,240,224,154,5,231,243,12,138,52,224,197,7,232,30,18,253,-158,18,197,179,179,110,2,95,51,57,32,49,32,42,199,101,110,30,2,64,-73,32,224,196,1,138,223,224,198,0,235,178,40,230,229,8,215,207,112,73,-224,24,11,231,162,0,235,35,60,107,157,235,35,31,139,32,235,25,29,2,-54,54,51,234,146,1,235,6,22,32,44,229,57,9,235,7,3,192,243,252,-168,4,2,54,54,53,224,40,1,224,173,0,224,96,15,249,194,9,224,96,-3,2,54,55,32,224,96,10,64,118,225,14,18,130,15,225,111,31,131,197,-130,130,236,135,21,2,55,57,48,71,245,110,45,99,5,247,71,21,2,114,-105,109,2,105,116,105,2,118,101,34,162,23,156,178,66,141,235,139,0,232,-231,11,2,115,116,114,179,241,232,231,6,129,191,251,185,0,168,138,128,82,-64,91,112,110,86,42,66,248,42,165,64,22,198,145,174,219,65,153,69,21,-50,214,177,5,32,207,2,51,32,79,234,126,2,96,54,243,19,1,64,79,-96,102,118,32,97,174,227,72,2,163,127,225,219,12,137,30,33,80,131,228,-234,22,2,233,44,4,230,3,2,226,236,2,64,106,211,101,128,132,101,101,-160,132,243,26,10,67,47,230,147,1,224,9,21,242,69,12,128,120,229,114,-6,100,67,132,116,160,59,224,13,20,147,36,236,217,3,196,211,142,188,209,-102,141,51,173,58,226,132,0,224,147,14,230,240,1,224,94,10,66,185,240,-49,12,236,243,8,224,70,9,225,145,0,128,70,237,46,19,232,105,9,224,-213,2,241,83,9,241,226,0,240,217,3,139,45,232,7,50,238,51,7,2,-54,54,49,224,249,41,224,246,3,64,66,140,209,224,245,15,224,243,4,192,-240,224,232,3,66,141,211,233,34,165,65,206,163,121,135,56,162,189,101,38,-162,188,230,138,11,229,28,13,2,50,49,52,228,198,7,208,210,2,54,53,-54,224,218,3,224,54,5,79,252,235,115,43,224,125,7,128,105,200,194,65,-147,224,184,2,235,105,13,88,55,224,177,8,136,219,244,216,8,224,188,1,-126,235,32,98,64,135,225,27,8,250,203,19,228,123,15,2,53,50,56,224,-135,9,80,160,233,52,14,255,32,4,255,111,15,230,83,22,255,40,18,245,-4,0,224,123,21,65,1,229,176,6,193,237,32,130,64,29,208,115,253,112,-11,254,22,0,221,112,2,53,57,50,161,107,64,58,240,158,0,37,125,64,-15,208,144,176,174,149,218,2,54,53,51,128,104,240,94,4,240,174,41,85,-58,245,51,0,64,79,234,254,10,75,55,234,254,12,139,80,165,89,246,230,-3,246,227,17,152,54,2,50,55,56,202,27,193,52,235,70,123,97,0,132,-14,39,209,254,50,9,254,238,6,2,49,55,32,254,70,7,135,65,167,215,-71,249,160,219,254,110,12,160,38,90,85,224,38,0,81,14,182,201,64,140,-228,130,0,182,241,32,203,232,107,6,254,244,5,255,166,9,67,123,224,48,-4,163,140,192,48,254,201,1,255,16,17,224,37,3,225,39,0,228,100,5,-2,53,56,50,234,216,26,188,114,105,14,224,19,3,64,80,66,215,229,135,-1,97,209,133,135,64,64,160,24,255,70,1,172,104,251,254,0,66,50,233,-86,0,64,60,133,220,66,229,64,165,231,177,10,164,208,2,48,55,32,96,-40,175,44,187,56,185,60,198,202,143,58,128,21,128,55,137,209,98,203,179,-114,64,24,169,244,64,79,227,151,18,228,127,6,2,114,105,118,222,56,225,-77,0,126,40,149,218,98,221,236,96,7,249,131,2,213,214,98,65,227,12,-1,240,19,13,2,52,51,32,227,222,8,95,237,233,124,11,231,198,6,240,-28,15,245,246,2,168,19,2,51,53,32,232,51,11,168,189,191,249,227,157,-3,127,240,254,22,0,64,166,195,132,251,66,8,241,13,18,228,61,7,103,-48,34,143,233,21,12,148,123,32,118,65,217,191,17,108,103,227,10,0,96,-146,32,25,64,132,68,50,32,28,33,108,2,55,49,50,107,13,65,237,233,-66,1,64,178,131,170,123,19,156,212,165,24,137,196,189,149,160,49,128,214,-128,1,64,37,100,148,43,229,37,18,167,224,224,36,6,253,249,0,252,102,-2,92,99,106,164,224,5,13,224,114,4,195,45,221,110,158,83,253,113,2,-253,111,5,128,38,253,112,2,156,146,253,117,2,202,156,254,109,3,126,180,-197,227,160,2,229,244,0,224,119,1,158,206,221,8,2,51,50,52,235,111,-2,37,163,102,21,112,32,128,32,32,14,98,228,121,232,79,194,2,95,54,-57,161,36,128,32,2,48,55,54,96,203,195,10,253,231,11,134,118,163,188,-69,76,188,187,54,102,134,48,102,3,66,251,96,8,96,16,163,254,141,29,-2,52,48,48,33,252,88,28,65,253,121,238,129,254,96,169,251,209,0,98,-228,2,51,56,52,224,159,1,64,83,64,45,86,134,2,57,55,32,161,225,-224,79,3,225,12,3,103,42,246,225,9,2,66,97,100,2,32,71,65,2,-68,84,32,2,114,101,115,40,172,2,32,116,121,2,112,101,34,226,75,4,-74,76,98,239,2,56,32,67,34,186,2,95,56,54,68,53,2,51,51,48,-133,199,100,72,189,32,225,161,0,195,121,226,196,2,197,212,33,148,43,127,-86,101,128,53,131,137,224,160,7,72,93,32,49,163,7,194,52,133,8,64,-142,128,126,148,110,224,217,14,201,90,225,158,0,128,57,96,190,96,95,255,-94,3,32,33,67,225,128,146,32,174,64,7,197,180,96,179,2,64,90,32,-255,179,2,99,243,251,181,0,131,244,127,96,227,35,1,48,44,160,123,65,-163,71,139,96,108,120,169,225,90,0,123,190,2,55,32,79,239,3,2,224,-76,5,224,70,8,2,75,32,75,224,70,1,224,67,17,224,49,4,58,193,-224,120,0,204,212,2,49,50,55,132,161,65,215,96,113,222,30,224,170,0,-224,108,0,224,68,1,192,60,65,125,160,58,97,45,170,177,229,36,3,64,-34,229,95,7,234,250,12,229,92,6,111,228,233,176,8,75,203,225,53,0,-234,46,8,235,227,5,129,235,224,108,5,2,45,62,34,228,253,8,224,96,-5,227,88,2,225,225,0,244,127,4,224,26,0,196,121,224,11,0,232,48,-3,226,242,2,70,32,248,10,22,35,61,135,89,139,219,64,185,237,94,13,-250,48,23,132,236,193,62,193,48,161,134,96,7,169,205,224,82,23,224,93,-11,101,89,162,143,96,8,192,111,129,167,132,148,240,1,10,224,142,11,173,-184,2,50,57,32,224,15,1,64,249,204,138,73,27,246,27,7,242,79,2,-64,106,236,36,0,96,60,224,31,6,238,246,9,254,210,3,226,40,4,238,-84,3,2,54,32,85,68,184,2,89,32,64,138,10,96,193,160,237,166,11,-64,108,228,212,3,201,69,225,221,16,224,108,4,168,192,174,127,233,113,1,-238,16,19,191,192,254,165,16,162,102,248,198,19,226,102,6,158,136,64,87,-224,49,31,33,191,64,49,253,149,0,98,152,243,199,2,69,0,160,148,96,-174,234,29,6,228,33,0,240,241,5,2,54,48,53,96,54,138,140,98,12,-64,36,235,248,0,132,53,95,94,64,6,131,28,64,37,236,22,3,225,93,-4,234,219,2,162,28,207,201,234,207,19,210,247,107,214,234,214,13,66,184,-240,241,22,129,49,109,248,224,125,1,177,154,227,89,22,130,97,66,83,227,-62,9,192,69,161,8,224,15,0,64,148,240,3,5,224,226,5,232,205,8,-240,123,2,97,32,250,238,15,133,211,128,42,239,28,29,130,132,64,144,240,-89,0,33,118,64,15,163,206,229,216,7,229,116,7,66,49,249,239,14,249,-232,6,64,160,67,129,153,223,64,98,194,246,176,188,178,169,2,50,50,32,-96,29,194,226,65,228,64,15,250,195,10,66,219,240,124,12,64,24,251,123,-126,66,162,250,180,20,250,156,112,238,59,11,249,56,19,154,159,96,8,152,-128,227,140,3,229,155,7,250,185,17,97,91,250,185,5,65,38,132,57,2,-83,32,85,33,103,32,87,225,149,1,2,101,84,117,2,112,108,101,200,105,-133,191,2,90,32,90,64,134,129,116,32,61,64,252,249,139,17,2,108,105,-116,2,101,114,97,2,108,34,32,73,7,241,2,11,224,18,5,199,11,241,-70,6,185,178,134,75,111,226,64,36,122,78,97,127,204,81,224,34,18,146,-230,82,43,141,23,160,112,150,111,224,53,13,2,55,57,49,241,129,16,224,-145,20,2,57,48,51,235,189,3,66,49,241,3,0,241,2,0,64,145,192,-21,64,46,160,21,232,196,5,250,36,4,230,56,1,90,114,233,158,8,191,-51,250,42,5,224,41,5,2,61,62,34,229,180,3,64,111,200,58,245,16,-11,224,46,0,213,16,117,93,213,16,64,66,224,58,16,224,147,0,245,75,-1,203,95,64,58,196,96,192,58,152,173,242,164,28,182,241,242,164,5,65,-32,97,76,108,113,229,163,0,227,70,3,143,207,141,95,65,206,66,3,171,-186,252,38,7,130,116,244,45,2,103,136,206,84,171,224,35,130,106,22,245,-85,0,127,66,107,223,224,126,11,136,250,64,170,228,148,6,224,244,16,128,-30,241,85,4,2,102,111,114,2,97,108,108,225,89,6,2,55,48,52,230,-245,1,189,140,199,65,214,107,239,22,0,231,167,13,70,93,232,96,4,133,-208,178,237,168,133,70,219,232,96,8,69,154,84,114,168,105,96,39,231,244,-0,228,16,11,2,76,73,100,2,101,110,116,253,156,10,133,31,163,87,225,-166,1,177,16,35,182,161,219,156,126,2,49,52,55,123,13,110,114,70,35,-64,132,37,23,2,52,52,56,32,12,66,213,101,205,141,182,160,86,161,168,-148,229,112,62,32,0,2,75,50,32,192,30,129,159,64,251,233,108,15,136,-75,64,36,253,197,6,101,158,32,36,137,240,64,50,225,1,17,2,85,73,-100,225,1,46,32,255,2,53,48,55,192,246,224,213,37,131,172,110,179,115,-50,116,78,226,123,1,102,83,75,146,226,67,0,99,96,186,215,167,191,224,-19,4,64,84,131,198,128,75,152,255,231,22,2,128,145,226,111,4,213,133,-70,188,128,56,224,59,1,167,28,226,161,14,64,153,70,163,64,46,236,229,-9,239,43,8,236,182,1,64,216,232,135,0,224,39,14,105,137,238,177,7,-224,42,11,91,193,224,81,9,233,3,4,224,148,4,64,221,249,127,2,65,-233,148,127,109,26,225,248,0,96,127,113,32,2,90,32,67,97,247,65,141,-105,153,68,98,2,35,54,50,255,223,2,128,12,163,237,82,185,32,5,161,-165,239,115,7,65,55,131,217,78,104,81,224,39,225,32,46,131,208,96,54,-32,27,112,157,64,14,198,166,66,24,32,11,225,157,1,64,245,128,13,43,-95,32,168,50,199,90,40,34,102,129,182,104,194,64,65,251,93,6,233,117,-24,32,209,97,241,247,134,17,2,109,111,100,2,117,108,101,196,241,151,221,-235,132,13,145,127,64,36,137,25,38,248,130,83,238,188,9,233,157,18,133,-181,233,138,6,235,243,13,96,97,224,96,0,226,181,9,234,37,6,2,53,-56,57,234,97,1,224,26,11,225,5,18,2,112,97,116,41,70,2,110,34,-32,165,212,136,94,224,152,21,224,78,18,244,166,0,224,142,1,224,190,10,-65,208,232,141,6,73,16,229,11,0,71,208,96,36,232,66,6,93,52,64,-6,125,8,96,37,229,11,17,136,38,229,7,19,138,30,87,45,117,181,163,-23,191,90,244,184,10,242,171,1,128,47,195,73,224,49,7,232,147,5,229,-76,0,245,182,0,194,106,2,53,54,48,224,23,20,129,2,232,207,0,167,-26,110,69,231,26,8,97,26,231,26,18,2,81,73,100,230,25,26,192,215,-231,14,56,224,211,22,133,113,2,79,32,102,224,160,0,2,99,97,115,98,-55,224,19,4,2,108,97,115,2,115,34,32,224,20,5,2,100,97,116,2,-97,34,32,224,19,6,255,208,1,224,22,5,251,103,1,224,23,4,2,111,-34,32,224,17,5,2,101,108,115,224,125,8,233,16,1,224,21,6,2,101,-105,103,99,46,224,22,3,2,105,102,34,224,17,7,2,109,112,111,2,114,-116,34,224,21,7,224,57,9,2,110,102,105,2,120,34,32,224,20,10,224,-123,8,96,21,2,114,34,32,224,21,7,2,115,116,97,2,110,99,101,224,-23,7,2,108,101,116,224,18,7,228,241,1,224,21,3,2,110,101,119,195,-181,224,22,3,2,111,102,34,224,17,6,228,42,2,224,22,4,2,114,105,-109,2,105,116,105,2,118,101,34,224,24,6,2,116,104,101,224,44,8,224,-105,11,251,208,0,251,93,1,224,0,8,66,53,134,111,78,36,2,90,32,-85,164,70,68,222,243,0,13,98,181,236,58,6,2,46,46,34,229,61,9,-66,162,207,61,244,229,11,108,22,233,166,5,239,96,6,64,135,234,153,20,-2,83,121,109,2,79,112,101,97,186,234,154,52,99,123,103,69,71,36,163,-147,227,148,17,2,55,57,32,234,163,39,96,223,224,200,17,228,70,36,103,-225,224,168,1,228,27,29,65,108,137,141,117,225,236,242,14,181,246,237,31,-4,32,254,230,152,2,160,77,134,64,100,198,224,59,0,104,96,69,238,2,-53,53,52,225,231,0,186,68,224,212,10,141,161,233,67,4,225,162,0,230,-2,4,193,78,205,210,160,130,238,203,6,162,110,162,77,151,102,103,118,229,-229,8,213,97,96,37,64,29,2,54,32,67,233,188,3,41,221,97,22,2,-56,51,56,128,38,237,254,0,225,186,12,226,132,30,230,3,11,226,119,53,-225,240,22,131,214,2,79,32,79,42,128,187,250,96,12,123,221,128,13,243,-204,7,224,17,3,2,60,45,34,192,49,92,65,224,48,7,131,242,224,17,-3,135,198,96,48,2,56,55,53,32,170,224,113,0,231,181,1,228,137,2,-32,162,64,207,172,33,2,50,55,56,113,47,100,93,109,49,64,31,131,252,-113,166,235,190,1,146,12,235,164,3,161,66,98,163,236,98,3,235,94,6,-64,81,131,133,50,213,131,70,2,49,51,53,224,31,0,180,182,139,73,195,-1,42,101,201,92,130,162,136,220,64,25,153,217,2,53,53,49,137,173,73,-224,230,251,4,2,109,112,116,2,121,34,32,224,243,0,245,246,0,160,96,-189,228,41,38,64,17,65,217,250,118,2,86,6,224,21,0,250,134,0,224,-147,1,99,63,208,48,2,52,53,32,252,169,1,99,37,129,7,192,17,64,-47,192,17,65,3,228,9,0,107,124,58,217,142,91,65,43,96,15,69,150,-99,203,64,44,131,232,238,123,8,235,144,15,235,137,4,64,63,206,196,2,-90,32,64,64,190,32,6,224,7,0,113,95,64,35,131,164,70,126,96,24,-198,131,76,21,227,225,3,66,197,239,177,0,99,239,246,225,6,2,53,54,-55,64,101,161,159,33,60,224,9,1,96,192,228,230,0,67,90,102,124,43,-8,2,95,56,32,245,208,2,236,114,28,239,108,1,246,9,12,96,107,229,-22,0,32,206,226,20,1,2,40,41,34,139,187,224,91,17,236,198,2,224,-72,18,2,91,93,34,224,72,14,182,56,246,48,3,198,150,65,53,182,56,-243,115,16,166,1,165,252,32,49,32,236,240,49,7,96,19,239,244,12,96,-52,225,149,8,227,146,1,254,101,6,102,63,2,53,50,32,250,6,3,64,-68,213,103,227,47,3,67,246,131,105,32,47,98,39,238,237,15,150,244,238,-232,3,128,85,130,247,162,138,192,4,194,108,78,213,240,223,11,2,54,51,-32,224,234,15,130,218,231,81,30,224,88,5,109,22,231,85,4,64,106,251,-149,14,96,108,131,35,231,112,11,96,85,231,113,4,193,54,143,70,2,52,-53,48,48,74,35,46,33,17,70,146,102,150,231,152,13,134,103,231,152,4,-231,23,3,197,183,80,207,243,44,18,232,204,39,243,32,10,230,218,21,68,-8,166,23,37,41,162,220,133,95,60,190,238,49,5,245,71,1,151,238,100,-222,226,110,6,209,112,229,162,8,65,92,65,220,64,5,226,124,1,193,204,-192,2,32,33,250,252,0,64,237,224,190,2,230,63,3,197,201,230,67,22,-224,156,3,226,226,39,71,117,233,150,83,233,148,4,233,147,10,73,55,162,-24,2,53,32,85,99,220,64,155,50,124,32,17,33,119,76,95,247,183,5,-100,172,69,232,34,17,156,234,128,72,132,1,2,75,32,75,100,131,64,59,-32,14,2,80,32,58,96,89,225,173,18,129,34,112,126,160,78,128,40,198,-115,225,188,5,97,185,192,30,97,184,225,198,77,181,187,65,196,224,22,0,-225,184,1,194,86,64,220,132,83,129,118,160,23,33,133,224,74,0,64,34,-132,9,88,229,96,14,217,70,80,188,103,226,64,54,135,34,64,143,96,42,-148,45,64,21,161,57,225,55,4,116,244,225,50,1,232,134,2,97,5,128,-7,97,255,224,27,0,168,156,129,42,232,146,1,232,138,0,185,112,232,196,-0,32,125,68,247,66,27,118,148,66,152,229,222,8,226,233,12,34,231,225,-45,4,2,95,49,50,234,9,2,234,24,4,128,39,148,180,136,163,128,27,-168,202,64,7,98,156,192,20,233,145,14,129,121,177,150,193,27,160,152,2,-89,32,66,34,133,64,104,64,39,66,62,232,212,3,2,89,32,64,225,61,-2,67,161,129,30,134,1,242,226,1,64,76,65,169,224,29,1,104,137,97,-167,233,201,1,83,164,163,166,192,143,180,220,2,49,50,57,224,244,0,231,-79,4,64,229,174,103,171,8,65,144,64,21,169,243,134,170,228,213,2,227,-32,22,227,20,0,229,8,3,96,24,32,121,32,106,63,107,224,51,7,64,-15,224,45,2,128,21,105,113,224,47,8,234,235,3,163,67,138,212,196,6,-64,189,170,1,129,245,149,190,131,102,141,195,66,21,32,34,2,35,49,48,-192,0,68,36,64,40,162,234,64,144,33,138,64,20,166,182,2,51,32,66,-227,2,12,225,248,6,194,139,97,215,64,16,129,248,163,15,129,58,224,225,-1,239,57,1,156,54,161,171,129,168,168,49,64,7,196,198,64,90,99,155,-35,115,32,14,64,117,96,14,64,11,130,168,35,225,2,52,32,75,128,57,-42,150,232,157,1,193,101,224,13,5,64,186,119,153,96,135,160,85,200,242,-224,39,1,99,201,65,145,96,20,72,30,130,70,32,44,64,55,161,23,2,-51,56,52,160,20,221,47,110,186,160,53,76,55,2,51,56,51,32,25,195,-231,227,75,1,128,57,161,64,32,127,245,241,12,2,65,109,98,2,105,103,-117,2,111,117,115,110,117,192,46,2,54,52,55,170,19,66,250,35,232,223,-146,64,201,130,9,68,245,233,112,2,32,84,89,38,86,243,170,72,224,121,-23,2,58,92,49,2,48,38,34,224,116,2,224,41,16,2,32,32,102,2,-111,117,110,2,100,58,32,32,0,160,48,132,31,224,119,0,104,177,97,250,-109,50,108,76,169,117,238,8,3,2,69,79,70,238,6,4,224,114,7,79,-146,34,12,128,31,224,145,21,2,101,120,112,2,101,99,116,2,101,100,58,-160,145,32,45,2,52,49,56,64,123,2,51,48,50,241,45,1,225,53,1,-131,28,55,146,183,148,33,254,2,60,32,64,2,35,54,32,72,17,224,18,-4,110,106,224,18,5,64,149,130,47,224,19,2,140,136,2,75,32,102,224,-150,0,2,84,82,97,2,119,34,32,96,114,236,161,3,160,246,96,21,2,-75,32,66,224,215,18,2,123,45,35,160,207,81,134,65,75,224,243,2,2,-35,45,125,216,29,224,160,8,187,160,224,18,3,67,205,224,158,6,2,73,-110,100,170,142,160,139,224,27,2,2,66,114,97,149,225,128,27,165,127,225,-26,6,65,208,224,121,6,66,227,224,121,6,65,122,64,93,67,38,242,78,-6,106,187,224,23,11,66,176,231,220,1,224,151,1,2,125,32,108,2,97,-121,111,2,117,116,34,96,143,225,41,2,224,23,4,128,111,99,39,2,95,-53,52,32,4,126,197,224,25,7,224,20,1,225,222,7,224,195,9,137,135,-192,57,34,63,225,52,1,160,18,2,51,49,32,224,23,1,193,218,235,120,-44,226,163,0,229,170,1,133,146,82,243,234,250,2,2,52,53,56,235,221,-0,96,30,140,9,135,20,32,195,74,75,108,222,128,209,96,4,100,186,165,-116,68,214,96,95,165,197,2,83,32,85,233,203,1,234,49,0,233,238,2,-161,36,253,205,3,101,26,224,46,33,99,56,230,85,2,128,119,224,39,10,-129,71,160,85,224,39,17,135,250,196,247,197,133,64,37,172,150,224,82,2,-165,52,70,162,155,129,199,105,254,159,5,169,168,108,41,79,179,64,29,2,-52,54,51,162,3,192,236,224,111,25,224,71,0,192,110,255,41,1,224,38,-10,236,78,0,224,77,2,102,79,32,43,108,30,212,250,46,19,128,199,227,-147,0,159,153,32,163,243,19,1,66,15,69,247,64,182,127,251,37,127,152,-157,37,7,160,9,38,165,160,209,64,32,127,78,226,126,0,37,59,2,51,-32,67,227,146,5,243,75,0,193,150,252,198,0,193,150,116,162,96,29,64,-32,224,29,1,103,77,110,202,225,58,31,140,180,193,58,226,5,12,148,164,-224,158,0,2,95,52,48,32,159,33,228,130,96,224,50,35,101,184,226,15,-5,224,41,13,2,57,56,32,131,64,2,52,55,52,136,87,2,52,55,54,-192,8,173,237,192,223,97,204,192,251,2,49,53,48,128,198,224,245,21,137,-224,64,23,193,90,170,120,171,108,32,83,98,140,176,8,231,237,1,72,215,-96,25,64,103,160,71,228,5,2,194,191,170,96,225,162,0,254,135,1,64,-9,234,237,0,138,235,234,216,0,233,30,0,201,28,151,163,246,154,0,226,-38,6,103,228,224,19,6,2,49,50,54,192,177,224,51,12,106,76,224,28,-15,179,181,2,52,55,57,160,190,195,71,136,113,179,147,96,250,224,244,20,-193,126,194,174,131,71,224,21,7,2,49,52,56,160,140,193,193,228,241,8,-97,251,224,132,1,223,197,160,29,96,165,240,142,2,227,143,4,70,0,232,-200,20,2,85,110,114,2,101,99,111,2,103,110,105,2,122,101,100,2,32,-105,110,2,112,117,116,200,208,230,120,5,99,169,194,18,138,128,64,186,129,-151,176,151,65,212,215,34,107,122,32,33,127,52,202,154,130,50,224,127,4,-2,73,108,108,2,101,103,97,2,108,32,67,2,104,97,114,2,32,108,105,-61,124,2,97,108,34,129,65,128,218,225,88,6,166,46,210,111,245,33,0,-65,131,228,214,1,224,162,6,64,135,102,144,97,74,224,81,38,225,253,45,-140,153,100,214,229,64,0,164,197,237,235,4,244,147,1,96,126,96,72,2,-57,50,32,244,111,0,252,5,6,96,148,229,114,37,167,132,132,56,237,12,-0,2,49,53,50,153,151,129,38,2,53,50,57,2,32,64,73,128,248,196,-157,224,192,1,227,11,0,224,193,5,224,179,2,2,53,50,56,224,179,8,-224,178,69,224,75,0,64,63,213,1,192,98,225,140,4,64,32,166,58,225,-160,17,72,141,142,2,68,140,99,145,240,60,1,86,136,229,157,4,147,33,-198,36,32,30,198,184,112,142,64,237,151,62,109,43,140,252,65,76,64,100,-244,208,3,225,79,8,197,23,229,29,0,243,2,3,128,15,224,16,0,231,-205,14,225,35,0,224,39,2,32,57,119,75,240,80,3,240,82,0,224,115,-4,129,205,144,89,224,123,2,209,124,231,77,7,200,52,228,165,0,2,51,-55,56,241,104,2,32,154,130,235,41,214,232,53,1,229,74,3,242,211,6,-233,22,0,162,129,226,39,53,65,25,177,223,224,201,1,166,196,65,119,192,-228,244,152,1,162,200,227,252,1,98,199,130,86,2,51,57,49,164,44,210,-51,244,130,0,132,26,160,52,224,174,6,192,194,192,179,224,191,32,227,161,-6,224,166,2,228,46,14,196,41,128,168,227,111,24,224,95,0,34,149,65,-107,162,149,129,254,236,124,0,96,16,254,238,6,239,65,3,2,108,101,116,-254,108,7,2,119,104,101,2,114,101,34,224,20,6,2,100,111,34,224,17,-6,2,111,102,34,254,117,3,225,88,1,99,23,128,11,227,139,2,177,214,-226,166,1,235,230,8,238,101,1,161,46,253,156,0,227,177,6,227,211,2,-154,170,137,21,232,142,0,227,246,5,227,103,1,249,137,2,224,67,9,169,-27,235,238,9,228,24,12,134,132,228,24,0,160,149,224,106,96,162,42,65,-249,146,208,228,139,2,102,201,233,160,9,201,28,34,94,32,149,224,14,0,-204,21,234,176,7,113,128,164,141,224,27,0,130,62,2,95,52,51,61,215,-64,143,226,12,1,2,46,46,34,228,183,3,64,49,224,141,2,51,56,227,-74,1,115,215,234,22,1,239,57,0,130,169,76,175,67,80,206,76,236,17,-0,237,47,34,234,254,8,232,196,0,234,134,1,152,160,234,146,6,235,223,-14,2,48,49,32,135,98,198,150,79,17,159,227,163,193,160,35,192,13,96,-137,205,13,246,122,1,225,160,4,238,6,11,128,139,224,214,7,206,117,224,-214,121,134,10,224,214,24,230,110,0,237,15,4,224,145,39,161,251,224,152,-19,160,139,224,138,18,187,205,232,5,3,100,135,247,13,1,230,54,1,229,-143,2,197,142,151,19,140,124,229,142,31,241,147,3,161,55,192,25,224,107,-19,64,227,64,185,114,4,84,120,230,1,38,182,197,236,77,0,99,171,236,-34,2,97,41,163,83,2,57,32,102,227,185,0,2,92,51,52,2,38,115,-114,2,99,47,77,2,105,99,114,2,111,72,115,2,47,76,101,2,120,46,-104,2,115,92,51,2,52,38,44,2,51,52,52,2,58,49,52,180,62,246,-229,1,226,104,8,224,11,2,205,239,166,116,239,254,9,129,132,178,112,51,-164,44,149,63,170,35,245,2,54,48,52,72,150,254,139,0,104,240,228,214,-8,252,32,4,224,107,2,195,25,241,145,14,161,39,233,179,4,162,36,228,-147,3,241,67,6,241,228,7,226,181,20,32,0,133,158,97,207,72,33,224,-217,13,69,121,122,86,224,29,12,130,118,65,179,2,52,57,55,139,190,226,-17,3,98,14,2,50,50,32,66,213,64,9,2,52,32,80,224,65,6,40,-136,124,168,122,12,136,159,224,105,12,168,176,224,117,0,193,142,133,111,232,-187,4,225,21,60,224,216,22,230,177,8,171,46,232,46,0,244,21,21,165,-35,226,2,19,172,65,131,109,2,50,55,54,225,63,14,224,35,0,225,163,-17,224,33,28,129,169,2,49,32,67,97,169,225,129,14,225,169,41,225,54,-0,2,50,53,32,164,242,95,225,68,0,154,143,64,32,123,207,96,79,128,-97,32,12,60,30,160,51,64,42,153,240,105,156,65,188,2,50,53,56,122,-19,32,124,253,123,2,131,106,239,47,4,65,253,241,211,1,96,227,2,50,-56,52,197,155,133,134,244,4,0,129,33,109,94,64,23,64,44,62,95,244,-36,3,224,33,25,173,157,130,23,235,227,0,241,93,1,92,247,197,254,130,-135,189,216,224,79,11,129,72,163,245,96,186,232,91,4,96,63,128,19,91,-48,105,127,224,152,15,224,32,24,224,185,2,97,60,128,100,65,131,34,169,-96,46,224,168,18,160,17,224,33,20,97,199,154,130,225,134,19,64,37,152,-4,227,94,1,232,117,2,225,71,0,2,50,52,55,128,93,135,73,225,75,-20,160,130,225,78,3,254,149,3,66,110,39,226,2,85,32,90,192,41,226,-65,1,131,19,160,118,231,209,1,106,137,224,48,1,224,100,1,224,145,1,-225,114,19,225,116,4,224,98,50,65,44,152,209,230,237,1,225,44,11,225,-43,54,121,46,248,238,5,225,62,2,224,104,3,118,89,64,86,64,70,224,-241,11,224,123,40,240,44,2,224,119,9,129,60,32,41,224,98,3,225,0,-0,200,184,99,179,225,221,7,168,3,196,61,205,147,224,43,6,102,10,224,-221,1,76,20,224,106,1,224,203,33,249,70,3,224,122,111,224,50,0,224,-98,0,240,2,3,108,242,2,50,32,102,233,101,0,2,68,97,116,2,97,-46,73,2,110,116,101,2,103,114,97,2,108,46,94,2,58,32,110,53,37,-2,116,105,118,2,101,32,101,2,120,112,111,2,110,101,110,156,119,66,129,-242,197,0,235,50,1,226,6,3,128,152,192,203,32,201,235,78,0,224,191,-2,160,36,224,179,4,224,36,21,98,31,64,126,146,223,32,107,2,50,32,-75,134,46,67,205,230,89,7,102,161,230,89,1,103,196,64,42,206,141,64,-44,64,25,46,41,201,180,188,35,2,80,32,75,248,145,0,209,9,199,229,-193,199,234,193,13,60,248,81,25,230,62,2,242,122,3,32,94,234,130,2,-75,244,135,234,209,236,134,61,224,37,5,128,39,194,225,224,160,18,234,231,-3,136,132,64,72,224,73,3,97,169,236,106,0,192,56,106,87,189,108,245,-247,1,151,74,192,152,196,17,242,30,0,224,90,1,224,113,4,96,92,224,-241,7,192,26,129,20,212,105,147,4,233,43,1,225,89,26,2,52,52,32,-254,60,2,224,241,16,225,115,3,224,237,7,225,36,86,222,122,202,153,66,-98,173,152,128,73,226,69,33,35,252,231,105,1,224,119,0,107,82,249,237,-0,224,94,0,224,119,4,224,107,93,96,12,67,78,205,212,75,53,35,73,-67,165,64,22,137,234,2,90,32,83,116,226,2,48,56,32,227,211,7,64,-103,32,36,237,36,0,231,247,7,253,57,32,235,78,15,221,38,135,238,113,-175,224,128,4,254,229,34,224,112,29,2,56,56,32,224,111,100,253,212,1,-64,112,234,165,2,224,112,79,183,82,224,111,96,190,139,128,111,106,148,224,-111,9,248,164,16,192,59,2,83,32,80,224,98,18,2,54,54,32,224,98,-24,233,181,1,2,49,52,32,224,33,9,66,248,97,24,66,246,140,182,85,-92,122,226,102,249,166,211,237,36,8,189,242,141,27,64,90,224,57,21,192,-109,2,53,49,50,224,57,5,235,60,0,254,119,13,102,222,224,19,6,64,-175,64,58,170,74,224,116,17,129,69,64,108,117,86,224,116,1,136,2,224,-232,19,129,89,64,50,143,76,224,58,0,250,158,3,213,67,228,104,0,250,-59,8,166,34,202,3,40,80,2,82,32,95,224,47,1,234,164,1,166,149,-229,227,0,249,115,2,224,91,8,250,235,2,207,145,145,98,165,232,252,110,-0,224,57,4,206,110,253,160,5,133,97,224,162,0,81,87,130,218,83,234,-130,93,108,115,2,53,52,54,133,84,110,241,250,152,2,127,67,34,164,158,-239,225,68,4,203,18,33,54,65,97,161,54,232,185,4,149,117,69,101,148,-46,231,126,81,32,17,231,126,8,231,123,34,231,68,19,77,54,231,67,5,-134,108,64,247,137,175,64,84,98,109,36,79,175,77,174,63,169,21,141,71,-233,199,65,2,52,48,32,233,199,33,235,217,2,232,95,44,224,150,34,234,-94,4,161,82,161,79,96,86,231,172,7,246,121,1,224,22,1,64,103,226,-50,1,239,177,0,65,109,135,206,2,80,32,79,147,190,149,241,66,198,64,-35,249,8,0,229,66,3,87,44,224,25,14,68,108,185,66,245,155,1,249,-76,1,140,59,157,235,131,42,98,201,224,28,7,220,25,132,188,236,176,1,-2,44,59,40,2,41,91,93,2,123,125,95,2,96,34,32,238,56,2,219,-184,227,145,0,107,64,224,88,5,94,69,64,182,224,35,0,65,113,69,145,-196,89,248,183,0,227,66,23,248,224,1,193,190,228,102,0,132,142,226,58,-4,225,253,1,227,137,9,96,27,227,33,7,235,88,5,190,49,96,26,248,-30,1,192,250,252,97,3,255,185,20,231,20,4,164,234,193,0,246,109,2,-227,69,16,235,69,73,248,107,0,160,162,224,220,5,248,103,2,123,164,235,-115,3,220,111,133,70,247,55,3,162,212,228,17,23,235,218,29,224,94,2,-252,166,1,32,103,146,210,231,120,12,92,195,224,19,7,99,43,32,0,224,-155,3,225,106,20,236,121,31,230,72,1,184,60,224,99,2,192,25,96,54,-2,67,32,79,164,64,212,113,132,19,227,100,15,2,33,64,35,2,36,37,-38,2,63,43,46,2,47,60,61,2,62,63,92,2,57,50,38,2,94,124,-58,2,45,126,34,135,6,130,111,226,69,3,225,13,15,151,108,224,20,6,-2,54,57,32,238,247,5,231,87,3,207,31,225,29,57,194,55,163,23,189,-208,229,119,2,199,238,99,63,233,71,15,225,206,10,215,211,232,115,3,228,-2,100,226,1,2,224,228,0,64,165,193,227,194,184,237,203,0,246,248,0,-2,89,32,66,161,80,247,78,3,224,119,2,96,113,131,147,96,236,128,0,-64,54,225,245,1,228,98,10,128,43,192,117,38,176,64,16,226,111,2,225,-210,23,239,161,75,228,75,5,160,190,96,199,236,159,14,2,57,50,32,97,-70,224,229,17,105,121,192,229,252,169,2,35,31,2,38,34,32,224,237,1,-226,209,0,236,217,6,147,31,136,177,224,32,0,135,4,225,155,3,212,13,-252,66,28,128,84,239,195,6,224,155,11,252,8,3,100,214,140,193,233,220,-1,66,75,217,188,224,144,20,193,165,131,64,225,148,1,167,20,225,55,9,-164,255,245,227,1,227,119,0,32,40,2,50,57,54,168,243,72,233,64,43,-226,174,0,226,154,9,198,48,168,126,129,229,224,54,5,224,233,3,224,210,-0,72,228,144,156,195,20,232,187,12,97,76,229,59,21,228,182,0,226,201,-4,228,191,0,160,172,2,85,32,35,193,152,149,248,236,238,1,172,160,225,-67,1,190,146,229,136,12,2,97,98,102,2,110,114,116,2,118,92,57,2,-50,38,92,62,249,2,39,34,32,237,30,1,226,200,17,131,141,229,164,11,-2,49,51,57,96,108,89,86,34,0,91,88,37,144,105,177,34,137,64,128,-160,19,102,199,225,11,8,2,66,32,79,32,216,128,46,228,109,0,225,119,-0,253,16,1,253,13,14,240,187,1,227,217,1,78,72,241,190,8,162,26,-233,156,6,231,235,16,231,5,0,32,82,33,121,128,68,160,41,142,136,160,-43,224,42,9,96,145,224,42,0,96,244,231,66,29,123,69,230,119,9,66,-104,188,197,232,49,1,106,118,128,180,64,31,219,29,229,141,9,227,32,7,-32,98,165,15,111,23,224,10,4,227,28,4,236,4,0,225,39,15,64,119,-144,50,2,80,32,58,119,48,218,78,132,140,128,159,65,110,248,31,5,2,-114,101,97,2,100,58,32,2,102,97,105,2,108,101,100,130,124,35,89,64,-64,176,10,224,64,2,244,13,4,32,78,127,177,96,215,127,139,107,212,128,-3,132,76,96,46,67,199,32,42,102,165,87,196,159,230,224,11,4,64,109,-144,61,227,70,2,226,64,1,229,66,0,34,71,95,60,33,107,228,254,2,-35,52,2,108,105,98,2,47,84,101,2,120,116,47,2,82,101,97,2,100,-47,76,2,101,120,46,2,104,115,92,32,23,2,44,54,57,2,58,49,34,-217,68,128,138,2,58,49,52,64,7,152,104,64,232,96,208,120,100,2,52,-57,53,67,34,97,201,2,52,57,54,128,28,245,7,1,125,160,249,106,1,-64,28,196,112,64,11,130,19,109,150,64,14,194,2,66,0,2,35,52,32,-32,129,33,193,64,24,129,163,199,252,176,10,134,242,129,229,64,36,129,188,-160,34,99,28,160,61,129,148,160,24,98,145,160,24,241,125,3,103,90,251,-61,8,224,10,0,247,213,8,252,12,0,233,159,3,33,3,78,155,64,8,-37,130,238,173,2,225,123,1,2,85,110,109,2,97,116,99,2,104,101,100,-2,32,34,32,232,160,7,241,203,1,194,200,226,250,0,177,125,241,180,1,-229,167,15,224,62,10,128,59,241,214,3,223,152,233,193,3,232,89,8,162,-164,32,211,2,54,51,32,36,132,255,137,0,195,213,201,179,237,250,3,97,-9,127,60,2,51,57,49,209,196,224,64,3,230,44,0,252,215,2,224,214,-0,46,154,249,254,3,238,196,0,234,77,1,242,186,6,229,39,5,136,138,-224,36,6,227,134,0,175,87,242,230,1,209,167,234,161,5,249,77,2,239,-66,3,224,82,4,243,48,0,225,102,4,226,19,1,224,165,7,240,15,10,-236,175,7,224,67,42,181,63,224,41,3,224,60,1,224,57,21,203,172,243,-34,4,230,169,1,225,145,2,226,102,10,244,8,6,233,127,19,132,228,226,-4,10,130,35,32,20,203,79,224,16,0,167,98,226,124,11,227,243,1,166,-124,163,111,227,93,1,2,66,97,100,2,32,115,116,2,114,105,110,2,103,-32,103,2,97,112,34,232,251,2,224,80,6,226,194,6,71,225,130,60,227,-3,6,83,106,96,255,96,54,226,255,5,100,118,68,250,165,132,2,67,32,-80,54,37,102,219,93,116,69,168,244,186,3,232,234,3,164,100,232,10,9,-176,118,224,33,16,69,91,224,32,21,203,142,224,99,16,128,190,224,133,20,-204,184,224,33,17,245,95,0,224,33,16,224,135,24,136,212,224,67,20,97,-47,233,212,51,233,189,2,233,208,19,98,84,132,189,37,187,2,50,54,52,-223,164,37,191,103,111,70,220,134,226,2,32,35,54,130,178,225,228,7,245,-182,2,175,59,130,56,72,108,251,217,14,234,240,1,164,81,239,59,11,116,-40,192,23,2,95,56,55,2,57,32,95,140,23,229,210,0,201,185,32,7,-230,77,2,64,227,225,165,2,66,156,224,179,8,228,6,0,238,107,6,244,-165,0,224,111,4,224,99,8,224,98,27,255,54,3,224,35,15,229,151,0,-96,81,2,55,32,35,67,6,67,53,215,244,160,22,73,69,32,43,227,79,-0,128,43,32,129,224,21,2,99,132,66,56,224,100,16,96,33,97,205,224,-32,19,69,34,224,33,22,32,218,224,33,21,228,10,10,224,32,5,35,204,-224,99,22,96,23,224,33,13,68,124,137,134,102,186,232,48,4,229,195,4,-230,174,0,224,16,1,229,226,6,150,96,99,91,172,25,241,200,18,230,99,-1,250,139,1,250,46,2,226,64,0,45,188,45,78,2,54,49,32,249,39,-9,160,70,229,149,1,44,99,131,104,192,221,110,53,224,21,0,147,201,192,-12,219,75,229,195,2,163,36,66,91,99,189,161,30,138,136,183,191,233,139,-9,2,78,85,76,102,34,98,58,224,37,16,2,83,79,72,128,37,64,154,-224,37,17,2,84,88,34,96,37,64,149,224,37,16,2,69,84,88,128,37,-67,121,224,37,17,2,79,84,34,96,37,64,201,224,37,17,2,78,81,34,-96,37,144,36,224,37,14,2,65,67,75,128,37,67,168,224,37,16,2,66,-69,76,128,37,65,252,224,37,17,2,83,34,32,64,36,69,218,224,36,16,-2,72,84,34,96,36,72,38,224,36,16,2,76,70,34,129,82,225,121,20,-2,86,84,34,128,37,225,121,20,2,70,70,34,128,37,225,121,20,2,67,-82,34,128,37,225,121,20,2,83,79,34,128,37,225,121,20,2,83,73,34,-128,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,162,173,225,128,20,2,78,65,75,160,38,226,251,21,2,-89,78,34,128,38,226,252,22,2,66,34,32,96,38,225,131,20,2,67,65,-78,160,38,226,254,21,2,77,34,32,96,37,225,132,20,2,83,85,66,160,-38,225,132,20,2,69,83,67,160,38,225,132,20,2,70,83,34,128,37,225,-131,20,2,71,83,34,128,37,225,130,20,2,82,83,34,132,9,225,129,20,-2,85,83,34,128,37,225,128,21,2,80,34,32,96,37,225,127,20,2,68,-69,76,195,41,64,229,244,25,4,224,0,14,69,68,143,176,2,95,52,56,-169,116,71,119,103,95,2,52,56,50,96,6,102,153,2,52,56,51,128,6,-64,33,2,53,57,32,201,98,2,95,54,48,224,11,0,64,77,143,242,2,-62,61,32,64,12,143,240,2,62,32,58,128,62,32,11,2,60,32,58,128,-87,32,11,2,105,99,109,2,112,32,58,128,109,144,79,244,13,12,92,249,-2,44,123,125,2,96,59,34,160,98,177,22,242,105,1,2,52,55,48,250,-155,2,2,95,53,48,32,254,250,186,4,248,225,8,181,156,32,77,82,164,-103,98,186,76,231,33,0,242,146,1,244,225,2,176,4,81,185,64,6,64,-46,103,178,183,117,187,185,97,204,143,50,38,174,236,93,1,73,112,230,243,-0,2,95,55,54,236,167,1,64,136,135,235,224,183,6,224,14,0,234,242,-1,65,144,140,39,108,215,73,70,171,243,224,35,6,178,138,160,35,242,87,-0,96,223,224,242,7,106,0,224,242,35,175,138,224,241,52,130,121,224,181,-6,34,2,224,181,2,2,53,53,32,128,43,130,87,224,179,0,250,186,16,-192,61,224,19,3,174,209,224,222,35,232,123,2,224,222,48,130,253,64,35,-2,53,55,53,248,253,1,232,250,0,115,86,232,251,0,160,13,76,160,2,-53,52,53,64,134,66,84,233,7,0,238,105,1,64,90,131,76,81,78,225,-61,21,130,201,224,38,9,226,62,13,188,18,224,39,2,111,173,226,66,6,-245,43,6,2,100,105,103,2,105,116,84,2,111,73,110,2,116,34,32,170,-86,237,88,10,192,16,173,98,109,156,208,223,224,49,27,96,176,224,49,22,-64,39,96,255,97,34,244,46,4,109,8,148,21,65,233,246,168,7,254,209,-14,64,45,212,67,184,251,248,211,3,185,1,237,78,2,241,190,12,194,63,-64,78,94,5,128,124,238,47,2,241,100,15,2,51,53,32,171,10,2,54,-55,32,243,106,0,173,14,96,77,164,50,239,62,1,239,106,0,224,75,1,-109,220,233,12,14,2,85,82,67,136,195,251,74,5,96,114,192,226,66,240,-2,95,49,57,66,145,2,52,54,50,140,40,96,19,2,53,56,48,64,169,-69,64,32,49,2,53,48,56,243,130,2,113,87,224,174,4,186,193,186,151,-96,209,161,158,223,12,160,186,172,171,225,76,0,2,53,50,32,241,112,14,-236,160,3,188,94,110,190,242,53,8,2,85,110,99,2,108,111,115,53,146,-2,123,45,32,2,99,111,109,2,109,101,110,130,171,135,33,228,22,5,252,-119,2,240,145,12,2,49,50,51,236,150,3,109,121,243,39,17,127,73,245,-63,0,161,15,242,165,6,237,30,11,224,149,39,192,103,224,148,28,2,49,-50,53,224,149,28,227,97,1,224,150,7,247,27,3,244,186,20,224,46,30,-165,160,243,253,1,224,233,0,244,213,10,224,177,10,244,62,1,160,26,244,-121,1,224,18,4,253,232,0,195,147,66,137,134,133,2,85,32,66,90,99,-129,18,54,118,99,92,218,36,2,51,55,49,192,101,225,173,10,64,68,216,-233,193,113,128,50,67,81,238,215,0,131,94,102,96,69,217,224,72,4,100,-221,64,112,135,87,64,81,166,61,146,74,245,198,4,192,156,160,100,224,74,-5,128,60,230,31,16,229,248,5,148,109,250,66,19,2,68,97,116,2,97,-47,67,2,104,97,114,218,62,2,49,48,53,250,63,0,243,75,3,224,128,-0,229,155,17,192,109,230,1,0,128,171,229,168,4,98,9,133,168,68,129,-128,196,229,45,6,156,12,64,7,92,41,241,17,1,254,89,4,2,60,32,-64,111,56,116,95,227,6,0,2,67,32,61,2,61,32,64,224,24,0,220,-107,97,248,219,205,227,235,10,224,69,13,250,166,1,224,69,3,185,144,130,-203,113,4,224,91,6,229,144,17,2,109,111,100,2,117,108,101,246,213,0,-2,90,32,75,235,194,2,200,177,154,133,129,84,69,27,167,224,60,160,95,-253,221,83,217,176,224,175,3,137,178,96,173,160,88,65,101,198,224,146,174,-63,195,64,21,64,95,198,246,250,163,5,224,13,0,187,42,181,11,33,179,-76,149,2,52,52,57,113,162,96,10,139,155,117,142,71,48,231,54,0,2,-75,32,66,128,44,42,224,64,5,67,91,230,89,4,128,59,224,60,4,250,-89,4,225,235,5,114,188,246,29,1,224,25,1,250,123,6,226,25,3,243,-3,2,228,162,5,224,46,13,218,119,249,18,7,225,88,4,192,30,66,12,-96,88,246,246,2,147,14,246,3,4,192,171,250,142,0,229,147,3,251,22,-2,249,240,5,246,91,0,226,79,1,162,4,229,242,6,246,90,3,243,172,-10,200,186,135,54,129,139,194,81,161,140,225,141,6,227,5,1,224,51,12,-66,49,171,47,224,52,3,135,141,192,63,64,11,153,102,255,59,1,96,28,-64,7,218,41,227,216,9,248,31,3,65,70,116,89,201,121,212,149,65,141,-32,70,37,95,96,229,163,157,193,47,224,231,13,96,35,224,179,9,189,233,-106,21,253,189,1,224,190,2,194,36,68,135,251,99,5,230,234,3,181,177,-225,132,3,224,159,1,225,77,0,224,158,23,160,108,225,138,5,129,190,193,-61,250,180,5,224,165,0,224,95,50,184,29,160,95,192,69,128,101,226,47,-15,234,62,0,64,22,231,105,0,226,186,4,229,133,11,225,77,1,99,56,-228,96,1,246,148,1,65,239,222,15,227,133,3,233,154,8,232,215,3,249,-124,2,233,5,6,234,81,19,192,59,68,221,225,22,8,226,202,3,247,63,-18,254,242,6,224,162,12,227,250,2,230,117,17,129,229,224,138,12,171,94,-163,60,33,117,224,208,16,128,169,253,78,13,2,108,97,121,2,111,117,116,-2,32,101,114,2,114,111,114,2,32,125,34,141,221,229,188,21,224,153,24,-227,241,5,161,78,96,43,64,23,101,120,228,88,8,229,128,1,230,183,4,-102,98,226,56,1,135,101,192,13,130,23,98,51,227,140,2,224,10,4,229,-168,3,2,95,50,57,76,179,66,169,231,184,2,230,179,0,228,237,12,225,-58,1,130,242,138,69,64,67,225,66,1,2,115,121,110,2,116,97,120,129,-66,225,64,30,71,95,217,216,186,204,199,118,237,21,1,32,24,114,84,137,-11,64,122,192,47,64,158,160,46,138,117,104,39,64,14,138,50,2,85,32,-75,2,32,65,32,128,102,138,7,135,108,32,102,2,90,32,85,169,79,233,-35,4,224,18,6,138,34,231,0,8,224,18,6,65,52,135,254,163,206,64,-16,160,103,32,159,133,52,2,85,32,73,224,7,4,105,17,224,67,1,64,-225,160,42,192,49,224,140,7,113,163,224,18,5,113,121,224,72,5,70,59,-224,72,6,192,7,224,41,6,224,157,2,2,85,32,90,233,97,2,65,46,-138,138,107,86,32,24,2,95,54,50,131,81,96,52,66,53,64,35,138,149,-161,162,99,205,161,162,137,72,187,212,32,238,32,19,66,89,32,19,2,73,-32,58,130,16,203,208,98,218,81,110,112,51,2,51,56,52,32,70,2,90,-32,90,67,74,2,51,56,51,2,32,64,89,96,93,64,155,201,207,234,245,-1,229,236,5,192,186,39,221,236,128,1,208,142,106,125,197,54,224,24,13,-160,8,109,105,2,52,52,50,198,254,176,12,2,51,54,32,232,202,1,34,-115,143,97,227,41,1,161,137,96,11,74,206,2,52,52,53,113,80,132,149,-172,0,140,150,97,104,192,205,198,80,230,15,5,149,68,235,79,1,224,7,-1,163,209,228,38,1,231,94,1,169,90,139,104,224,33,13,128,27,224,26,-6,171,154,128,137,33,141,232,117,2,224,38,13,132,9,103,75,163,203,162,-61,194,68,130,225,128,232,96,11,160,16,130,140,67,145,226,148,2,77,49,-90,132,96,116,129,8,225,7,4,161,68,192,31,32,4,130,31,33,7,140,-104,204,76,2,57,56,32,247,209,4,34,188,2,51,32,102,228,158,0,2,-80,114,101,2,108,117,100,172,83,66,39,132,72,2,75,32,58,129,172,162,-202,230,183,7,232,195,1,32,8,101,134,64,47,132,95,228,155,0,132,132,-66,4,160,69,160,44,64,20,237,212,1,65,84,226,82,0,201,30,234,220,-5,240,235,5,163,174,224,53,5,166,104,2,57,49,52,132,101,96,7,162,-154,224,5,16,240,68,1,2,52,50,53,70,43,65,67,128,1,227,247,1,-65,146,224,21,12,2,50,32,90,224,20,5,32,19,2,51,32,90,224,17,-2,32,16,2,52,32,90,192,14,64,72,32,15,224,13,5,129,246,230,198,-4,204,93,224,226,4,224,16,1,160,13,128,8,97,122,230,202,0,225,59,-6,192,48,236,190,2,224,27,7,244,157,4,159,145,138,55,86,197,65,79,-58,81,2,95,56,56,67,187,226,77,1,2,95,51,50,97,93,67,231,128,-39,228,143,11,98,137,239,138,1,224,7,29,228,188,10,32,110,200,45,192,-112,229,152,3,69,18,71,22,32,55,146,228,224,36,1,33,96,224,55,0,-160,35,48,157,224,35,7,193,129,140,184,2,95,57,50,68,162,2,57,50,-52,234,251,7,2,54,51,57,234,250,4,118,1,142,245,224,5,3,169,120,-2,51,51,32,32,185,96,76,192,77,35,178,2,48,52,32,105,142,40,106,-234,250,4,147,102,2,50,50,50,237,202,3,148,251,225,88,9,192,128,97,-39,162,0,234,112,1,236,103,2,224,36,0,237,206,0,162,48,64,159,33,-210,2,51,57,57,96,28,230,77,13,128,9,225,171,12,236,218,1,226,120,-0,224,107,1,226,152,1,33,116,225,202,6,160,123,177,231,150,51,82,104,-132,62,209,207,37,23,70,146,230,214,5,224,7,13,235,141,6,134,15,130,-214,235,128,4,224,2,11,225,57,7,239,84,5,224,44,17,224,45,26,224,-48,6,224,49,42,237,154,0,32,5,64,8,228,255,1,102,210,160,5,237,-6,5,196,39,134,234,226,69,2,144,232,132,239,231,18,1,224,5,3,231,-30,4,196,136,224,66,1,2,95,54,32,240,63,1,100,31,198,125,163,178,-2,49,57,32,230,106,0,232,27,2,97,227,198,211,2,95,54,52,2,54,-32,85,69,55,224,22,4,236,48,3,192,88,224,85,9,160,50,229,130,3,-2,95,49,54,225,149,5,140,73,224,2,23,227,49,3,225,37,4,230,231,-0,225,142,9,225,185,14,97,35,224,68,11,242,48,3,224,33,11,224,98,-8,224,28,19,241,181,8,198,237,224,8,5,2,95,54,53,242,181,8,225,-201,1,225,30,3,230,22,5,2,39,32,89,228,215,2,242,119,2,239,85,-1,173,103,160,42,192,19,129,137,200,15,192,101,225,37,7,128,92,237,109,-3,226,195,6,96,5,193,148,224,57,3,162,140,224,25,10,225,33,5,227,-77,12,195,4,225,90,3,192,164,227,93,5,225,39,5,96,17,87,210,233,-61,7,160,68,96,86,225,169,2,230,174,1,224,224,7,71,68,174,205,64,-39,2,54,53,52,234,180,6,228,191,0,252,107,1,115,135,44,8,224,120,-0,128,201,224,28,13,67,44,241,70,4,65,144,64,3,234,87,2,224,246,-2,226,20,3,129,7,224,210,4,160,247,224,128,7,229,226,12,224,218,0,-202,196,244,84,10,226,93,11,232,220,1,228,93,2,226,92,255,226,92,45,-226,90,1,226,2,19,225,67,3,246,255,2,226,8,22,34,95,229,214,2,-224,27,0,226,13,7,224,156,2,192,150,70,49,64,148,255,11,2,226,44,-1,227,3,17,122,135,224,121,9,224,138,11,254,146,2,227,89,13,234,215,-2,145,218,2,52,55,53,98,187,226,222,6,193,229,34,74,178,178,226,26,-1,226,10,1,225,250,6,239,117,21,225,132,6,233,94,1,224,89,8,162,-129,237,223,0,32,92,198,225,224,82,4,224,77,16,214,222,223,220,78,35,-64,12,160,69,224,74,10,160,70,250,95,12,2,110,111,116,2,32,101,120,-2,112,111,114,2,116,101,100,250,101,0,240,65,0,218,8,139,17,80,206,-161,77,64,29,65,185,96,29,2,82,32,64,171,251,100,184,140,70,2,51,-57,55,202,110,2,95,52,48,57,213,2,52,48,51,226,142,0,136,42,160,-7,224,151,12,2,58,32,34,136,65,2,51,50,57,250,152,0,72,40,74,-46,235,129,8,224,5,6,111,187,171,92,200,130,96,3,237,236,11,167,236,-44,247,76,46,128,45,97,234,239,91,3,175,96,96,21,224,23,8,224,33,-3,129,209,235,94,13,244,132,5,193,159,162,130,248,86,5,129,174,245,94,-3,192,21,224,160,4,224,140,0,190,19,237,128,38,229,125,23,228,234,1,-139,250,234,133,2,228,15,6,250,193,9,165,227,33,135,2,55,49,57,236,-120,0,34,149,204,33,224,240,8,224,0,6,225,193,12,143,108,225,190,6,-210,124,141,76,224,46,3,79,138,253,50,8,64,43,2,57,51,48,78,223,-2,48,56,32,234,165,2,96,3,239,190,3,226,27,60,164,241,242,121,3,-97,121,251,108,0,239,73,16,160,62,65,165,230,10,1,140,247,243,51,0,-249,23,4,100,248,185,133,136,39,226,107,30,197,90,224,85,25,107,127,226,-193,51,226,192,36,247,193,4,238,128,1,235,48,3,160,13,104,22,229,175,-0,232,107,7,232,58,1,248,124,3,227,165,15,248,64,0,239,4,9,248,-80,7,233,5,7,225,25,6,77,135,64,128,128,20,33,30,103,188,2,57,-53,52,66,77,2,49,51,32,197,174,33,22,2,55,50,48,230,232,6,239,-143,22,96,241,232,36,3,227,113,0,192,54,231,186,1,239,168,5,223,169,-198,62,143,59,224,93,1,125,91,130,167,226,78,5,86,74,244,148,2,117,-203,2,55,50,32,247,203,1,64,15,227,237,2,227,230,16,224,165,26,160,-145,112,84,228,65,5,224,79,6,228,82,2,228,63,7,228,21,9,229,55,-61,99,204,33,127,229,57,2,225,174,6,194,41,224,220,9,243,242,3,224,-220,8,97,213,224,85,32,160,82,225,114,8,225,27,25,103,76,218,88,39,-153,71,127,92,104,167,143,2,51,56,55,147,93,99,190,2,95,51,49,32,-90,64,49,218,113,32,108,62,179,192,49,39,220,224,36,3,150,65,232,237,-5,236,25,0,212,211,247,238,2,203,47,247,172,3,235,146,6,203,81,239,-100,5,241,97,7,224,21,2,243,17,4,224,89,0,160,124,224,52,3,241,-71,3,160,11,61,157,175,86,236,161,28,235,91,1,198,253,227,31,0,237,-78,1,254,204,3,243,233,3,239,236,11,236,191,3,192,155,241,153,5,235,-132,1,96,56,147,223,66,4,225,226,4,237,141,5,225,103,0,229,26,7,-224,38,50,242,157,4,196,231,226,192,18,225,38,14,245,1,4,253,188,13,-224,21,8,227,1,5,129,228,95,86,140,139,230,120,10,225,180,32,193,69,-225,180,11,230,140,14,224,13,9,225,233,5,224,27,0,233,59,1,193,195,-115,168,224,184,1,224,0,3,237,56,0,224,182,28,192,239,224,129,22,224,-171,77,224,170,37,198,231,224,170,115,227,216,53,197,81,224,151,13,240,22,-0,235,45,7,239,222,4,228,167,5,235,55,6,195,205,109,196,249,28,7,-248,254,2,152,84,248,235,10,224,223,53,208,91,224,223,14,241,132,0,228,-185,52,101,105,33,160,214,65,129,192,105,27,249,132,0,137,35,228,220,10,-72,119,96,56,131,250,253,249,12,231,105,2,127,234,251,249,2,32,77,249,-161,6,224,99,0,196,59,252,142,8,251,110,4,237,2,3,2,49,55,50,-214,238,128,67,186,3,2,90,32,95,160,164,98,116,60,168,33,173,71,33,-157,51,230,190,16,235,127,0,231,21,0,246,232,6,107,108,223,186,124,212,-39,125,65,88,239,126,26,239,115,19,2,117,110,100,2,101,102,105,2,110,-101,100,2,32,109,111,2,100,117,108,2,101,58,32,239,131,6,189,1,233,-47,8,254,17,0,248,253,6,247,52,5,74,69,32,165,244,110,8,231,240,-9,160,41,2,95,56,32,33,93,248,135,2,255,103,0,229,224,0,235,88,-1,226,78,3,146,61,96,33,97,152,65,116,222,146,244,14,4,244,99,11,-217,57,249,176,20,232,101,10,235,87,1,224,61,12,64,163,249,80,3,163,-28,228,162,1,224,24,1,193,195,114,229,191,232,251,73,0,33,138,233,235,-0,96,220,254,222,0,147,193,130,9,161,32,224,122,1,32,152,162,163,128,-25,65,32,101,136,225,43,1,65,37,159,163,201,156,96,136,99,149,52,188,-226,85,19,185,151,131,11,226,80,1,146,88,98,68,64,92,155,236,89,209,-236,72,11,2,50,48,50,224,58,2,2,116,121,81,2,73,100,101,2,110,-116,34,162,120,172,95,64,70,146,148,245,253,8,221,159,244,89,0,98,11,-2,95,53,49,128,230,238,48,2,225,43,0,227,186,2,227,172,6,176,186,-76,64,75,64,226,111,1,193,96,64,137,67,21,32,137,2,80,32,58,128,-107,179,42,163,13,64,20,203,98,251,218,17,33,66,2,54,56,32,196,82,-128,12,142,151,2,95,55,56,255,92,17,67,68,96,55,160,0,224,50,18,-224,42,7,175,133,70,48,64,162,139,211,226,237,26,224,29,30,242,57,7,-224,41,2,224,18,9,224,82,13,224,21,24,216,220,96,9,130,73,34,162,-32,227,105,6,33,249,98,142,32,20,2,50,50,53,35,70,44,198,69,230,-162,162,2,52,50,51,162,247,224,29,13,134,13,2,56,49,49,101,201,2,-56,50,32,192,124,227,100,1,33,221,227,70,0,224,6,3,224,14,1,77,-32,97,94,141,13,98,154,111,86,72,151,228,105,1,132,46,228,38,9,240,-165,0,197,209,130,42,135,28,226,153,0,2,55,52,53,231,2,1,186,54,-2,55,52,54,240,111,5,96,99,214,76,235,24,2,224,98,0,96,95,232,-102,0,128,156,129,26,2,57,53,49,232,132,0,69,63,163,26,64,76,34,-105,37,156,2,57,51,57,255,214,2,2,51,53,54,206,195,200,115,162,213,-103,246,136,253,78,44,68,72,2,55,51,32,230,139,10,2,79,32,35,36,-97,228,169,0,33,169,33,145,130,187,64,131,194,197,35,170,35,147,2,53,-56,50,104,243,32,123,2,55,48,32,32,9,2,56,51,32,235,7,0,224,-34,18,96,231,2,35,49,48,132,242,65,239,214,83,142,32,242,91,8,152,-167,129,133,32,11,33,86,99,108,2,57,52,48,228,176,2,2,45,62,34,-193,204,32,32,96,30,105,146,2,52,49,55,241,230,0,135,211,134,173,224,-66,10,2,61,62,34,226,234,3,133,182,64,65,65,101,173,78,224,127,6,-33,48,2,49,50,54,193,49,224,123,0,32,214,145,182,2,50,49,32,248,-18,1,224,59,2,2,49,50,52,132,117,192,48,96,15,64,48,65,29,224,-48,10,160,108,2,56,53,57,33,47,224,109,6,224,233,10,231,151,3,224,-63,4,2,54,53,56,241,190,0,224,230,16,241,222,2,235,57,2,101,221,-249,150,4,195,64,228,49,7,167,107,199,81,98,208,200,70,231,98,5,130,-246,242,83,3,133,154,131,0,2,49,51,49,67,112,69,65,219,111,226,252,-9,226,104,28,105,120,243,247,3,213,87,224,134,14,99,26,32,124,64,5,-64,46,72,219,96,140,211,103,140,25,64,106,2,57,52,50,114,223,64,39,-99,87,66,19,2,48,55,32,232,250,0,68,239,100,131,128,80,99,70,160,-6,64,29,135,242,224,29,6,224,12,6,64,130,64,43,135,193,97,204,32,-29,2,54,53,32,96,21,135,144,160,21,2,52,49,56,96,21,65,205,32,-21,226,221,1,2,80,114,105,2,109,105,116,2,105,118,101,2,115,46,61,-66,232,64,35,135,52,147,167,224,114,2,224,128,7,128,20,64,48,135,80,-2,95,54,32,2,95,52,51,37,183,64,238,224,97,12,163,141,130,87,32,-166,2,95,54,50,193,153,228,47,14,224,79,21,163,154,224,79,25,205,171,-64,172,135,90,56,82,128,236,134,10,133,211,2,55,55,32,2,95,55,51,-108,128,2,50,49,54,160,11,44,55,174,189,66,26,33,76,160,33,2,49,-51,51,64,155,212,34,224,63,17,32,40,99,35,165,196,224,65,0,102,144,-98,96,156,42,224,65,6,32,28,102,2,2,52,49,51,169,197,224,56,0,-160,201,229,35,0,224,120,16,107,204,64,32,224,116,0,74,192,66,17,96,-13,2,80,32,66,65,58,2,48,57,32,226,229,2,160,16,245,170,0,2,-56,51,51,73,94,97,146,169,206,2,83,32,73,141,212,234,45,2,64,164,-150,118,139,28,247,131,7,117,85,32,180,208,103,64,149,235,74,1,224,76,-11,52,240,224,77,0,233,104,0,96,146,2,54,51,56,215,41,169,248,250,-150,0,248,61,9,239,77,20,254,172,9,249,217,11,231,48,4,104,103,105,-210,224,0,8,164,6,160,46,226,42,1,225,113,1,91,120,193,171,65,159,-107,179,33,21,34,183,246,42,0,224,230,0,225,241,3,221,157,37,2,133,-51,98,1,132,67,236,24,5,35,242,34,242,139,72,32,64,2,57,56,52,-233,50,6,39,76,250,84,6,235,159,1,66,135,2,67,32,60,33,31,204,-254,233,208,0,193,56,192,24,97,149,176,17,192,222,41,239,72,161,174,29,-246,79,0,148,23,162,12,227,0,4,2,48,52,56,234,153,6,226,231,6,-166,26,103,235,144,10,98,78,240,123,5,224,165,10,158,213,96,165,245,58,-1,224,126,6,140,107,32,207,236,224,3,2,112,101,32,2,115,105,103,2,-110,97,116,2,117,114,101,135,248,250,126,10,224,215,4,224,209,12,240,138,-2,224,112,5,2,50,52,50,239,63,1,224,72,3,227,251,4,2,52,49,-49,241,112,2,225,94,14,225,50,0,226,44,7,241,184,1,2,53,50,55,-225,51,14,206,186,224,54,1,66,80,134,118,224,114,8,50,193,99,183,136,-165,192,50,163,5,163,155,162,15,229,36,6,2,48,53,56,250,60,7,135,-245,64,14,2,95,57,55,81,243,238,179,3,241,10,20,2,67,97,110,2,-110,111,116,2,32,115,97,2,116,105,115,2,102,121,32,2,99,111,110,2,-115,116,114,2,97,105,110,2,116,58,32,177,19,106,156,2,56,54,52,224,-231,0,64,212,135,31,33,124,2,55,53,57,32,4,2,54,51,32,203,115,-64,29,135,39,227,152,11,229,56,4,227,196,2,239,39,6,128,78,32,201,-224,168,1,2,92,51,52,2,38,115,114,2,99,47,77,2,105,99,114,2,-111,72,115,2,47,84,121,2,112,101,67,2,104,101,99,2,107,46,104,2,-115,92,51,2,52,38,44,2,49,50,56,2,53,58,49,2,57,34,32,143,-71,2,90,32,67,66,225,40,191,2,55,51,50,133,44,2,95,57,57,224,-197,0,204,69,226,32,0,166,111,140,35,2,49,56,53,228,61,0,69,188,-193,158,187,69,224,171,58,2,57,49,58,192,171,208,249,187,178,226,209,1,-236,6,0,213,13,226,65,0,32,146,184,14,225,67,2,226,48,23,241,142,-1,224,29,2,144,64,78,20,101,141,33,205,230,183,2,101,124,131,235,225,-41,3,78,69,241,156,0,229,90,17,73,46,252,196,5,236,98,0,2,53,-53,32,160,189,134,174,221,127,128,10,2,51,57,53,230,33,2,2,52,48,-56,67,116,166,145,224,161,6,224,19,12,230,54,1,162,174,71,124,130,144,-32,11,150,63,130,169,32,90,243,44,0,128,139,163,215,2,52,52,55,137,-136,64,46,70,15,168,80,224,229,3,163,164,32,4,197,14,227,226,8,145,-65,192,203,229,50,3,225,78,4,226,96,2,67,194,32,208,64,164,171,63,-238,193,3,225,212,17,228,234,4,2,48,53,53,196,234,224,176,5,171,127,-104,113,235,88,1,64,104,2,95,54,57,228,201,2,209,164,106,149,2,55,-54,32,160,59,93,126,116,205,64,178,64,98,32,27,192,53,65,43,138,7,-136,47,239,27,3,251,81,5,244,18,0,255,201,0,228,199,1,151,55,130,-5,79,57,136,144,189,254,239,38,4,236,145,0,32,119,32,221,111,78,46,-34,129,112,2,95,53,55,66,52,71,160,170,248,232,111,3,192,92,226,50,-4,224,76,15,64,215,176,219,2,53,55,57,96,33,96,133,119,76,2,95,-57,54,85,186,160,12,2,49,52,52,97,26,75,54,2,57,54,57,224,37,-2,43,54,224,12,2,81,135,224,12,0,224,76,1,64,105,234,127,1,68,-135,2,57,54,53,149,31,133,105,139,126,235,217,15,32,45,194,179,173,7,-228,46,1,2,49,53,56,64,233,226,159,6,67,180,80,208,144,207,230,145,-0,228,61,5,228,95,1,194,115,229,215,5,39,238,244,53,0,228,9,9,-46,60,65,85,2,48,57,50,193,180,64,159,135,18,247,235,1,65,1,96,-122,33,98,147,173,35,16,166,96,75,124,149,118,64,22,173,129,64,101,2,-57,49,55,150,7,128,97,110,114,2,49,54,57,64,179,146,211,2,58,49,-51,66,211,231,124,11,167,239,210,230,249,83,4,195,162,137,197,233,194,6,-96,212,224,25,12,104,20,224,25,12,154,224,233,77,7,96,21,2,85,32,-66,163,191,232,222,1,237,24,0,64,9,71,55,251,216,0,234,55,13,56,-171,115,215,247,46,2,224,43,11,96,185,71,102,129,82,161,160,67,92,224,-58,7,229,243,0,224,141,1,234,202,8,162,115,251,23,3,253,161,7,236,-7,3,254,81,2,255,36,0,246,42,0,254,107,23,244,35,3,241,37,1,-229,64,2,250,182,3,120,212,245,125,0,133,178,2,51,48,56,236,11,6,-235,222,4,252,121,1,233,253,5,64,21,244,71,2,224,84,0,148,46,247,-52,0,165,29,64,12,2,50,51,57,99,212,67,0,130,182,227,94,1,249,-78,9,212,108,106,68,232,109,1,244,98,3,224,119,1,245,7,3,224,69,-6,2,49,55,52,224,69,8,96,130,68,154,181,166,96,135,149,241,177,85,-232,88,3,225,168,19,230,186,0,175,107,225,119,4,251,215,3,226,86,3,-253,82,8,193,112,250,127,10,247,65,4,225,176,11,225,178,4,184,87,225,-184,6,253,134,3,224,31,24,192,28,136,133,243,84,2,254,155,1,183,49,-161,234,225,193,1,225,190,39,226,10,19,226,109,5,193,218,224,140,4,253,-216,2,214,240,111,75,254,235,2,227,82,6,111,112,173,67,255,136,6,231,-120,4,135,122,224,186,4,177,141,230,102,1,96,187,71,252,136,1,99,224,-137,155,99,226,122,204,254,166,2,226,126,34,105,157,226,50,9,237,62,6,-237,11,0,107,29,64,1,128,245,224,33,8,99,126,224,73,1,240,221,1,-170,111,238,45,1,234,172,2,66,199,96,174,235,182,1,2,63,63,63,171,-145,65,193,138,142,145,72,226,148,11,230,207,0,114,18,186,253,239,188,22,-227,48,4,253,130,12,229,13,4,250,19,1,224,52,3,224,58,4,160,59,-228,255,1,224,28,4,255,192,4,250,211,12,229,219,0,239,124,2,227,233,-11,195,159,145,5,229,81,9,228,161,11,96,101,160,144,249,177,0,224,236,-1,118,188,224,160,0,226,143,8,130,117,150,134,227,97,4,229,145,0,205,-180,196,89,240,149,1,227,92,2,224,197,8,226,44,5,225,124,3,224,157,-4,225,69,0,225,138,3,212,87,2,90,32,75,64,27,160,6,224,198,3,-209,248,168,82,225,42,6,240,155,3,228,161,4,132,80,2,51,51,57,234,-242,1,132,92,99,58,83,159,118,245,49,10,228,64,1,243,187,1,180,206,-227,205,4,192,156,125,237,229,76,7,242,2,3,2,51,55,32,226,154,2,-232,137,3,194,38,244,119,4,232,19,2,64,8,155,118,160,168,105,73,255,-163,2,225,44,11,64,4,192,154,239,53,39,2,51,53,55,2,58,50,53,-163,163,174,101,151,56,101,117,225,28,3,32,246,67,192,225,112,21,251,252,-3,225,117,9,231,132,2,141,150,116,44,224,231,31,2,65,32,64,224,231,-50,2,54,58,50,224,231,1,245,129,2,227,222,1,226,165,5,227,7,2,-226,165,17,245,145,3,64,7,174,108,167,34,160,38,213,112,35,32,226,78,-3,68,230,143,10,236,30,4,246,251,4,147,169,247,191,1,98,156,2,53,-52,48,206,62,112,211,94,47,246,82,33,147,179,232,162,2,238,13,0,230,-48,2,102,147,64,160,142,127,160,120,108,31,236,32,1,2,51,57,52,236,-32,0,96,44,173,212,2,51,51,51,32,136,75,136,224,1,11,138,129,192,-105,127,122,160,62,141,169,2,79,32,95,111,61,49,208,64,148,224,14,2,-64,184,96,14,32,124,160,19,110,185,192,12,141,107,186,186,97,21,166,66,-128,188,39,134,228,141,0,230,192,7,242,212,0,214,185,225,133,4,65,16,-97,115,237,200,5,224,55,10,225,186,4,2,51,53,51,224,51,41,119,8,-224,51,38,97,25,249,123,9,121,183,113,105,34,129,232,248,1,226,9,1,-181,45,224,56,2,242,6,4,103,168,235,215,0,224,142,13,2,49,49,48,-143,64,226,167,3,246,141,4,231,100,13,231,181,6,231,63,2,224,47,7,-192,5,242,11,10,66,157,235,116,5,192,1,247,77,5,225,240,5,231,73,-5,195,225,249,162,0,221,90,117,246,227,121,2,245,239,16,85,236,2,97,-32,99,2,108,97,115,2,115,32,34,133,185,2,51,50,57,165,194,225,146,-4,224,165,7,235,206,3,224,28,12,227,43,1,227,71,20,235,204,8,224,-2,3,243,35,15,165,105,192,5,212,55,71,25,131,73,224,32,6,38,148,-138,1,50,196,65,235,114,181,67,111,245,87,1,224,10,13,234,128,10,150,-73,190,192,225,103,2,151,100,2,55,55,57,64,36,225,97,1,2,115,117,-112,2,101,114,102,2,108,111,117,2,115,32,105,55,76,2,97,110,99,2,-101,32,98,2,105,110,100,2,105,110,103,229,209,1,225,40,16,234,64,23,-231,196,6,236,184,6,37,244,233,209,4,224,98,1,64,25,234,87,4,239,-66,8,224,140,4,67,42,200,49,234,61,9,105,185,234,167,12,232,58,7,-224,13,4,128,10,72,47,232,186,7,230,109,7,97,170,226,135,18,226,170,-9,242,76,1,224,2,3,192,168,224,30,3,226,98,2,113,237,2,66,32,-79,182,140,246,178,11,224,253,24,238,114,6,186,29,251,127,5,176,78,99,-141,234,188,0,238,210,8,38,215,32,126,225,24,4,168,197,227,54,2,238,-126,2,72,142,222,62,64,7,34,172,224,60,4,70,250,148,37,2,50,57,-52,227,155,6,128,52,225,159,1,216,250,224,31,0,2,51,53,50,224,13,-2,160,192,218,78,237,70,2,2,54,49,32,224,19,6,214,182,239,109,6,-2,49,55,51,237,129,5,2,51,48,49,164,172,225,250,2,67,134,239,34,-4,32,196,2,56,55,57,227,192,0,233,9,25,226,111,1,229,149,3,160,-75,168,93,239,24,3,64,164,90,27,224,222,0,233,54,6,233,22,5,226,-154,9,179,67,2,57,48,32,68,59,132,18,58,61,132,72,33,119,226,211,-3,70,229,180,216,225,26,2,97,164,229,180,1,2,51,56,55,224,14,3,-2,48,52,49,242,96,1,138,124,2,83,32,95,2,53,52,49,2,32,64,-73,79,133,187,152,64,55,233,169,1,181,38,32,49,2,52,56,54,135,169,-33,62,32,25,64,35,96,25,71,20,125,50,64,20,142,191,228,194,1,68,-183,36,171,64,26,137,243,187,158,74,47,2,51,54,55,242,252,1,105,77,-153,210,64,243,240,63,4,65,216,99,17,244,94,2,112,56,129,74,38,194,-65,209,64,99,233,182,0,64,82,104,30,101,226,88,153,120,159,128,19,64,-41,137,179,232,34,0,245,106,8,98,81,232,60,11,232,59,24,228,32,3,-252,53,2,192,136,98,43,201,110,162,197,233,114,2,204,32,55,142,228,63,-7,224,93,59,160,89,161,221,73,116,139,135,168,113,90,157,32,73,131,39,-38,47,97,92,94,5,32,43,64,102,195,220,230,190,11,190,35,254,34,26,-2,100,101,114,2,105,118,101,254,21,4,2,51,51,48,228,87,4,67,117,-111,199,226,249,3,64,177,138,221,2,79,32,80,224,97,13,2,68,97,116,-2,97,46,66,2,111,117,110,2,100,101,100,192,7,96,103,74,150,64,67,-224,57,21,2,69,110,117,2,109,46,69,32,4,192,51,100,148,224,51,21,-224,4,0,224,51,0,139,191,224,103,20,2,113,46,69,2,113,34,32,160,-47,66,189,224,47,21,2,73,120,46,2,73,120,34,160,47,57,245,224,47,-23,2,79,114,100,64,3,224,49,0,65,251,224,49,21,78,58,2,97,98,-108,2,101,46,84,160,8,224,59,0,68,67,224,59,16,2,84,101,120,2,-116,46,82,2,101,97,100,96,4,224,161,29,96,51,2,83,104,111,2,119,-46,83,32,4,192,51,2,56,49,32,229,14,4,65,236,171,199,185,10,142,-138,223,57,137,146,33,213,2,52,32,102,224,90,0,224,80,0,238,164,13,-163,226,235,20,3,64,65,33,127,177,117,233,247,2,197,237,240,158,0,230,-27,11,235,218,2,245,250,9,240,245,5,243,91,2,243,170,3,243,110,4,-243,136,7,236,42,4,249,143,4,236,43,16,235,121,9,224,48,10,232,131,-11,231,104,2,235,76,9,101,151,222,130,224,83,22,224,80,2,233,213,1,-224,85,2,37,215,224,72,1,224,65,12,200,82,233,175,9,101,175,224,25,-12,236,22,0,224,22,14,224,104,11,138,214,236,71,13,251,198,4,232,211,-0,140,76,119,237,64,62,32,234,128,240,91,57,231,204,8,225,34,17,224,-194,9,205,145,244,120,2,205,35,98,239,67,32,247,37,2,237,22,24,224,-28,16,226,166,9,128,114,224,2,0,147,132,225,73,26,236,42,9,224,8,-18,202,19,130,200,219,128,179,78,48,101,34,17,2,85,32,102,236,249,1,-35,199,2,80,97,114,2,101,110,34,225,162,0,244,58,1,224,47,0,2,-79,32,35,69,107,161,118,129,39,2,56,53,48,96,14,175,229,236,73,1,-235,91,3,96,58,71,55,225,177,0,224,95,3,242,202,0,225,121,6,202,-235,2,85,32,35,178,76,225,230,9,246,50,5,141,43,235,191,6,160,172,-193,1,100,101,226,110,3,162,31,226,17,2,239,207,1,64,9,189,229,96,-156,140,107,169,151,32,165,32,214,71,78,224,215,3,250,172,6,96,250,2,-52,52,32,224,34,7,235,198,1,240,193,2,253,148,3,224,119,23,71,41,-192,83,33,33,226,172,1,96,113,50,165,224,30,1,104,98,64,166,252,77,-9,2,85,32,65,133,50,96,95,32,96,96,59,32,76,227,91,2,245,252,-0,225,212,1,128,137,2,54,51,32,180,45,173,58,224,249,0,83,59,226,-96,8,2,83,116,114,239,73,1,129,235,2,57,48,51,224,56,5,130,106,-238,92,1,226,98,3,226,137,5,86,49,224,255,1,224,105,5,2,115,80,-114,2,101,99,34,96,28,129,13,64,142,128,44,247,145,0,106,200,155,46,-2,55,57,48,236,2,8,167,17,139,243,69,8,139,43,80,50,158,44,233,-119,9,64,148,225,57,0,129,80,128,20,225,169,1,69,77,137,225,64,92,-139,235,100,236,80,175,64,94,64,6,2,53,48,55,96,31,64,107,160,31,-44,24,64,31,32,94,2,35,57,55,191,252,64,107,33,171,67,56,64,44,-140,9,48,241,231,174,0,240,142,18,230,196,0,230,193,7,230,88,9,249,-157,5,194,188,166,156,216,139,97,239,240,27,26,224,91,5,165,13,134,160,-124,163,33,223,130,90,117,68,225,212,1,2,116,121,112,2,101,82,101,2,-112,34,32,250,181,7,111,155,53,172,2,49,50,49,32,99,226,240,2,249,-208,2,129,64,66,56,98,153,107,232,224,107,18,2,109,107,84,2,121,67,-111,2,110,65,112,192,110,186,162,198,152,224,74,41,224,182,0,243,243,0,-130,113,214,49,99,4,130,22,224,39,37,224,130,12,65,225,224,130,1,2,-91,93,34,195,201,227,199,0,236,63,4,130,232,74,117,238,72,4,106,164,-2,76,105,115,2,116,95,84,33,123,142,82,64,90,224,36,9,2,84,121,-101,170,191,64,34,173,231,234,66,33,203,54,234,65,52,233,141,12,226,203,-9,251,60,3,194,192,226,144,8,233,48,0,169,28,2,54,52,54,234,142,-0,240,180,14,251,97,6,252,151,18,230,160,5,138,99,254,1,7,242,167,-12,226,19,0,233,19,3,64,65,115,2,238,184,5,234,198,1,227,178,1,-32,214,121,56,243,81,6,206,93,133,204,143,200,195,204,128,8,242,152,12,-225,190,1,2,60,62,34,233,133,2,225,148,0,32,53,2,53,55,55,224,-81,13,229,127,0,230,125,0,224,100,7,226,207,4,64,58,224,111,1,2,-69,81,34,160,111,254,62,2,65,3,225,33,1,193,30,97,21,228,27,7,-224,105,33,2,76,84,34,228,78,4,224,100,13,74,148,160,97,225,134,4,-224,103,33,2,71,84,34,128,50,160,57,138,219,231,153,23,160,37,224,29,-5,232,18,2,231,180,1,224,123,5,64,142,224,123,1,2,99,111,109,2,-112,97,114,142,123,231,0,12,78,201,227,242,9,131,179,64,30,144,30,224,-30,9,48,113,2,110,103,95,228,58,2,142,90,55,174,246,190,5,98,122,-34,81,224,14,3,240,204,14,2,87,97,114,2,110,105,110,2,103,58,32,-2,99,97,110,240,213,8,133,152,96,227,80,222,2,56,54,52,224,77,22,-2,32,121,101,2,116,44,32,128,60,83,27,89,227,224,255,7,248,80,3,-181,254,64,202,200,19,129,123,129,248,64,41,184,117,64,34,135,217,67,11,-2,73,79,46,88,84,2,111,114,109,2,73,79,32,195,32,97,0,73,144,-82,58,155,248,32,104,96,16,64,62,64,83,229,68,37,176,220,229,67,140,-132,141,182,244,197,84,138,253,239,252,30,247,64,8,229,7,10,238,22,2,-238,35,13,229,20,83,227,97,3,98,121,225,153,1,2,38,38,34,229,31,-85,2,54,53,32,224,111,3,2,84,114,117,195,206,228,66,23,228,59,15,-129,62,161,92,228,221,0,229,72,6,224,145,33,2,70,97,108,2,115,101,-34,228,226,3,228,155,14,86,158,224,55,2,2,61,61,34,228,150,16,83,-194,228,119,9,99,5,64,29,136,204,99,48,2,90,32,90,239,238,0,130,-101,148,230,2,48,51,51,151,134,231,193,4,162,151,140,195,234,199,0,133,-245,130,19,153,151,233,64,4,246,11,0,228,127,1,2,49,52,56,231,194,-0,58,9,60,164,2,53,56,50,121,75,183,99,54,74,2,51,32,35,142,-213,43,149,67,114,105,239,249,65,0,64,198,137,110,216,92,66,88,224,240,-1,197,91,96,40,137,116,245,149,8,2,111,108,34,129,15,133,196,2,66,-32,89,128,229,52,39,2,50,48,50,224,47,2,2,102,111,108,2,100,114,-49,235,93,2,132,122,110,149,240,141,2,224,10,2,241,204,0,64,94,134,-4,242,78,1,228,104,9,247,192,5,98,95,97,249,98,238,133,90,98,20,-64,77,244,132,0,248,36,3,203,203,224,137,9,241,203,1,95,93,2,53,-57,51,97,43,142,49,228,251,89,241,198,0,228,251,0,153,73,238,254,6,-64,9,246,230,0,228,247,2,196,4,218,223,109,181,173,186,197,196,232,214,-8,96,108,130,155,227,177,0,64,28,76,43,239,44,0,96,233,2,53,55,-56,162,121,176,31,229,170,9,224,174,12,2,116,111,69,224,172,42,227,72,-4,243,190,9,192,118,224,172,8,207,152,196,245,224,184,11,228,56,1,175,-180,231,172,9,231,32,21,224,207,1,98,100,135,195,38,34,34,46,99,126,-102,7,198,13,64,33,239,156,0,231,131,31,248,253,3,235,188,1,163,45,-239,67,10,226,146,9,236,56,8,255,147,6,236,87,33,246,154,11,255,14,-21,230,255,1,246,121,2,142,248,244,190,5,237,40,16,192,80,2,82,32,-64,230,72,1,237,92,22,224,27,1,32,53,61,26,226,14,0,230,40,2,-226,152,3,2,109,97,120,97,102,209,219,224,25,2,2,105,110,66,224,25,-1,229,169,6,194,37,115,104,134,17,240,65,0,66,158,255,220,1,189,42,-134,30,165,248,2,52,53,52,113,63,229,164,5,226,175,3,130,50,90,239,-254,32,0,225,139,0,241,129,14,244,165,7,2,95,50,52,97,174,224,83,-0,246,167,5,191,138,2,50,49,56,225,90,0,244,168,2,226,89,6,148,-244,241,170,0,99,127,243,98,2,98,233,2,57,52,56,255,212,0,116,21,-32,39,160,54,2,95,54,53,32,174,230,242,0,34,233,2,52,52,56,255,-199,0,42,177,32,45,80,142,32,212,160,20,64,60,71,188,193,71,94,251,-230,201,0,233,90,2,192,117,238,209,11,161,114,242,51,8,224,157,5,225,-107,0,136,0,2,85,32,66,132,129,202,86,2,48,49,57,224,169,0,242,-36,2,129,178,189,234,65,73,97,205,149,13,96,88,128,11,94,197,64,14,-160,20,224,127,3,192,208,64,123,223,89,2,90,32,95,130,4,64,20,135,-172,52,39,229,21,0,96,4,32,111,147,187,2,49,52,57,224,64,0,135,-175,229,220,6,253,224,8,228,219,0,161,199,253,228,34,224,234,2,244,167,-12,247,139,1,254,14,6,64,157,136,45,255,170,75,230,41,1,214,72,255,-81,1,205,79,239,71,6,160,200,148,33,255,158,9,224,81,42,160,77,192,-237,136,188,129,98,192,58,223,208,131,101,255,208,7,66,227,65,175,32,41,-2,95,56,56,65,85,109,189,131,9,183,92,2,89,32,66,41,102,64,113,-231,47,11,32,4,249,252,1,167,65,41,155,231,65,2,64,24,224,57,1,-248,34,0,232,23,1,226,240,0,64,202,250,67,1,228,143,4,137,73,228,-143,0,160,8,228,120,3,228,155,15,253,66,5,246,50,5,251,85,5,224,-76,1,253,102,1,224,39,6,253,102,5,253,69,7,224,113,1,163,15,224,-61,14,253,191,7,224,2,3,67,231,229,62,6,128,155,249,212,10,229,43,-4,251,47,1,192,22,224,208,0,201,241,227,165,6,2,49,51,50,35,42,-226,138,4,252,202,1,229,166,6,128,56,2,57,53,49,228,227,0,2,51,-52,49,98,141,225,176,5,224,165,9,122,156,224,5,4,252,48,1,167,181,-250,105,8,2,95,53,50,153,133,225,104,1,250,100,10,240,30,7,225,35,-4,64,150,160,57,233,191,21,155,178,71,95,133,0,133,36,35,62,179,9,-239,119,1,251,171,7,225,80,0,253,227,13,224,100,25,167,118,192,95,194,-121,139,254,230,168,3,192,48,250,238,3,226,23,10,224,2,0,172,208,226,-208,2,204,227,253,150,3,201,51,226,201,6,224,41,8,233,69,2,254,234,-8,231,204,7,233,228,4,245,239,0,248,111,2,176,133,151,236,168,216,32,-22,200,212,71,51,120,40,251,79,0,162,122,225,62,11,160,71,231,162,7,-225,120,6,249,146,10,92,196,96,7,98,101,240,36,0,201,67,240,31,6,-160,116,233,204,2,255,162,21,193,87,225,1,3,225,95,18,253,232,8,225,-110,90,128,62,225,110,59,225,10,9,227,212,2,255,58,5,225,139,22,219,-88,227,243,76,130,239,227,211,0,228,2,47,228,3,8,224,12,3,229,125,-0,196,15,247,88,23,249,115,8,128,69,227,253,8,96,159,2,48,53,32,-232,77,8,228,86,20,228,51,11,226,195,3,192,39,72,6,66,2,175,28,-96,82,242,246,5,62,129,2,83,101,108,2,69,114,114,2,111,114,34,128,-89,242,52,5,234,231,6,251,214,0,71,184,214,97,195,94,224,40,0,34,-140,2,51,32,102,224,99,0,2,103,101,116,206,110,224,77,3,64,66,142,-190,255,22,2,2,101,116,70,2,105,101,108,183,183,66,55,242,90,2,66,-78,224,42,1,2,46,83,101,224,43,0,96,44,243,108,7,32,118,224,75,-3,139,14,43,12,99,41,64,17,242,184,5,224,93,6,2,72,97,115,224,-93,4,242,188,12,2,82,101,99,2,111,114,100,2,115,34,32,96,34,210,-191,147,151,131,232,189,135,64,30,233,194,2,128,28,128,6,64,26,137,2,-2,85,32,67,231,39,1,225,255,7,227,169,16,64,63,193,137,107,13,131,-48,234,246,7,97,182,234,246,15,98,163,67,132,231,174,3,230,83,7,233,-136,19,230,105,8,233,21,6,229,40,0,163,15,230,209,3,249,103,2,228,-93,5,244,240,3,2,51,51,55,237,118,11,195,43,160,113,252,234,8,240,-173,1,232,208,0,2,95,57,57,2,48,32,35,140,72,97,83,33,34,105,-224,195,36,145,68,2,90,32,75,64,34,160,6,64,4,160,10,2,95,49,-55,2,57,32,102,226,7,0,2,92,51,52,2,38,115,114,2,99,47,77,-2,105,99,114,2,111,72,115,2,47,84,121,2,112,101,67,2,104,101,99,-2,107,46,104,2,115,92,51,2,52,38,44,2,49,49,54,2,56,58,50,-2,53,34,32,225,40,1,64,206,34,173,237,179,6,225,111,10,110,22,241,-31,5,243,222,2,224,2,0,171,95,131,176,170,245,97,111,224,5,4,171,-11,224,92,0,158,49,229,227,6,224,17,9,234,252,0,241,182,2,225,39,-16,226,9,11,230,239,0,235,83,7,231,78,2,224,245,3,234,198,21,245,-250,1,231,62,1,199,59,2,48,48,50,233,111,0,229,189,8,235,68,1,-174,236,239,224,3,239,214,14,231,29,18,224,169,3,47,136,96,120,103,116,-2,56,55,57,229,222,0,237,95,1,206,162,179,5,213,210,66,118,225,72,-12,225,79,0,237,67,12,120,17,225,109,6,178,161,186,199,103,36,248,73,-1,224,171,2,139,127,100,9,84,95,96,124,166,23,229,251,3,165,233,226,-232,1,2,110,111,77,2,101,116,104,2,111,100,69,230,43,1,235,204,0,-224,248,22,130,66,226,79,5,227,150,2,244,30,5,238,79,1,224,248,10,-225,36,12,193,13,163,158,2,51,48,49,224,28,2,56,215,39,110,241,167,-2,211,67,224,162,25,247,179,4,226,239,15,252,200,9,133,185,128,29,224,-161,6,165,174,221,119,146,104,96,5,45,127,33,122,2,57,51,57,230,132,-3,2,80,114,105,2,109,105,116,49,47,2,115,46,61,2,62,34,32,160,-62,64,35,128,62,105,67,101,184,252,119,3,169,42,128,29,243,22,6,224,-25,19,96,91,135,68,228,124,0,2,57,49,55,245,20,2,2,51,51,50,-99,60,99,108,126,82,229,110,1,2,95,52,51,94,91,2,49,48,57,99,-34,64,75,135,113,32,53,2,51,32,75,115,3,224,1,5,118,115,228,245,-10,239,169,6,224,34,17,224,32,3,224,29,20,32,198,192,227,96,152,135,-248,135,110,231,32,0,103,145,255,73,1,127,36,53,187,183,75,64,42,230,-174,9,65,12,32,8,231,27,18,164,94,96,38,230,190,12,105,255,196,182,-64,156,243,117,1,224,82,6,36,125,205,74,196,197,136,24,97,121,96,59,-200,129,225,187,2,76,26,161,182,122,197,129,182,64,44,136,143,225,158,6,-250,183,2,225,143,81,224,26,17,224,23,14,224,20,11,224,17,8,224,14,-5,225,243,3,225,91,0,137,103,226,221,1,2,55,53,32,251,29,0,248,-233,2,43,208,65,161,229,76,0,225,241,2,101,70,33,219,160,15,77,208,-104,74,252,83,8,103,96,224,14,0,70,201,165,118,226,39,6,139,194,130,-38,224,46,4,34,39,96,12,234,21,0,244,50,1,221,202,2,57,53,52,-109,103,53,22,105,249,195,139,226,211,1,100,235,58,63,102,225,225,15,1,-32,13,121,201,224,121,0,224,225,1,32,145,151,35,232,118,6,65,62,202,-102,52,4,133,35,197,171,169,203,242,187,1,245,134,2,140,72,224,33,18,-71,226,230,232,1,224,190,4,192,25,36,225,165,87,195,42,224,45,10,160,-105,181,112,64,43,248,195,1,224,44,9,224,43,1,229,59,1,171,151,229,-173,0,64,243,197,171,139,31,128,184,232,85,6,232,139,0,33,192,192,13,-97,252,235,86,2,128,125,225,200,0,96,160,71,113,2,50,56,54,64,109,-243,105,0,224,96,33,34,34,70,60,96,103,233,95,2,224,56,40,234,76,-2,201,71,191,240,2,52,52,48,246,128,0,34,142,193,7,86,2,242,139,-1,195,113,199,42,32,201,68,211,70,11,2,50,55,53,240,187,1,224,252,-18,2,95,51,52,160,104,245,60,11,177,83,241,48,8,192,178,105,153,160,-73,233,250,5,224,60,0,241,107,9,224,52,5,224,112,2,96,48,234,92,-6,224,44,4,225,103,3,245,82,3,224,36,3,32,17,101,245,224,234,8,-37,108,148,252,161,99,193,106,130,114,65,102,135,127,138,45,227,99,0,203,-209,245,131,4,227,75,12,128,93,227,142,19,226,45,4,224,33,12,195,26,-227,51,9,227,52,2,248,137,6,37,6,217,87,228,245,2,66,8,2,50,-49,55,104,22,228,125,1,163,206,237,221,4,247,20,0,224,87,9,157,135,-64,73,111,13,32,17,209,2,228,161,4,225,25,0,235,101,2,128,208,174,-249,131,233,231,204,0,246,179,2,139,44,64,89,231,95,3,249,107,7,37,-107,34,219,224,127,1,227,115,11,167,236,247,226,2,233,152,3,224,28,7,-225,3,33,131,38,32,8,97,223,224,249,4,225,113,5,161,155,238,5,2,-148,44,224,91,14,100,118,33,91,250,58,3,224,16,11,231,32,7,99,225,-38,51,234,171,2,2,102,117,110,2,100,101,112,106,164,49,99,238,180,10,-226,24,4,98,157,226,132,3,238,84,20,254,20,1,231,2,0,44,121,157,-163,226,24,1,194,98,224,45,11,33,58,224,46,15,224,171,9,226,251,11,-131,88,193,94,225,184,4,224,101,0,96,102,142,88,224,102,9,226,164,4,-172,97,231,10,9,227,190,23,193,243,224,159,8,192,24,160,159,224,255,9,-135,75,224,152,12,231,121,11,231,30,11,227,41,7,226,211,0,252,203,2,-44,194,112,217,2,51,50,49,161,93,2,51,50,50,225,0,0,166,221,224,-59,1,253,174,6,231,48,0,227,169,60,225,122,2,242,79,6,227,137,7,-224,201,9,64,183,213,66,117,50,83,174,227,20,4,224,172,134,134,120,234,-116,8,191,155,224,187,8,226,248,6,229,169,2,2,51,49,52,202,45,228,-236,0,70,153,141,205,128,192,2,80,32,35,201,154,135,253,68,72,64,36,-141,89,229,108,3,248,224,6,32,104,2,57,56,51,168,35,32,127,2,57,-56,52,106,116,2,54,50,32,229,84,3,225,72,3,225,78,6,2,48,48,-49,232,240,13,229,124,9,247,129,5,225,69,27,205,213,165,104,253,174,4,-69,2,2,57,49,49,230,251,8,2,51,56,52,225,123,9,227,137,15,197,-113,33,96,107,193,148,1,231,28,3,224,91,6,165,181,224,91,10,234,90,-1,228,141,13,160,123,32,102,64,116,138,97,224,121,18,233,233,0,238,128,-1,173,75,225,228,7,246,231,3,34,9,227,185,1,224,36,3,142,93,48,-52,2,49,48,49,108,165,96,118,64,25,237,132,1,32,60,96,169,32,51,-64,24,248,79,1,32,24,97,83,160,24,235,131,1,96,26,197,139,224,112,-4,69,120,96,36,46,193,96,4,83,15,64,23,208,209,232,152,14,130,225,-64,40,226,224,3,96,103,175,164,225,9,14,96,51,194,239,237,6,0,255,-199,7,238,85,4,86,57,228,8,2,122,245,160,13,111,119,234,79,2,229,-114,8,194,246,197,54,192,96,231,152,5,161,244,161,237,224,104,5,254,227,-13,238,121,6,224,40,3,236,74,4,232,82,0,32,138,2,56,48,32,250,-39,5,80,155,100,16,116,8,2,50,50,53,124,233,160,245,34,104,2,85,-32,65,160,91,232,27,11,97,73,130,117,46,210,2,49,32,58,128,59,64,-14,85,119,250,77,6,243,20,2,2,67,111,110,2,115,116,114,2,97,105,-110,154,95,64,55,249,100,1,66,153,96,147,130,68,74,71,96,25,64,23,-65,74,33,20,64,22,130,116,136,126,232,134,0,248,50,2,247,78,12,212,-28,244,57,1,252,33,4,231,205,4,212,94,224,39,17,226,103,2,231,136,-8,224,27,2,131,237,98,222,244,114,1,2,83,32,66,225,203,3,147,83,-230,64,5,96,177,249,100,5,146,248,245,2,28,254,119,0,245,0,23,228,-134,3,78,34,224,15,1,148,144,245,22,2,2,83,32,79,97,100,32,5,-181,174,215,221,245,47,9,232,160,25,212,71,250,80,0,227,170,0,232,98,-12,254,114,7,225,54,1,161,154,250,250,8,160,96,250,149,7,225,87,10,-193,88,242,182,4,224,105,77,128,29,201,74,154,41,2,51,48,50,245,207,-1,249,223,0,231,238,8,180,219,244,181,18,251,84,0,64,83,72,66,244,-185,7,246,69,0,244,208,8,166,156,32,201,236,53,9,227,92,0,103,255,-141,218,38,136,136,171,228,21,1,64,116,224,84,4,50,192,2,50,32,83,-120,201,2,90,32,67,250,13,0,226,83,1,255,14,7,67,216,230,52,3,-252,184,15,241,109,3,64,117,111,176,189,161,167,120,95,177,64,227,160,86,-32,152,230,37,3,253,17,16,253,52,17,255,179,1,251,234,4,147,118,128,-22,226,201,0,227,219,1,101,130,145,169,64,168,185,221,185,246,73,84,84,-10,195,70,227,138,2,169,60,136,253,2,48,55,32,224,211,8,224,69,17,-96,238,248,15,1,222,30,247,240,1,133,242,58,252,37,163,2,57,51,52,-64,4,254,146,0,64,106,224,56,8,32,230,224,52,21,199,78,248,125,19,-70,113,248,125,16,2,51,48,52,166,9,66,182,119,228,34,58,2,75,52,-32,2,90,32,90,160,1,252,72,1,64,37,166,103,248,163,9,227,138,0,-247,10,154,246,235,6,64,215,199,7,33,94,99,31,70,231,64,23,135,5,-99,206,144,91,39,197,96,24,135,7,32,16,68,72,2,48,52,49,239,219,-3,2,100,102,108,103,97,64,39,131,86,228,32,1,228,149,1,64,108,104,-25,227,140,4,247,24,22,235,39,24,100,206,138,173,2,57,52,50,227,34,-0,255,26,7,78,214,128,29,230,212,1,246,157,5,200,207,230,66,0,237,-149,1,235,71,2,252,110,5,129,77,120,12,147,149,182,38,236,199,24,171,-121,216,97,64,198,66,202,64,75,243,225,0,244,58,0,237,23,20,172,202,-64,65,107,63,96,72,168,177,225,90,7,96,37,69,148,225,24,1,64,48,-131,85,231,213,1,224,9,1,161,196,232,212,0,245,214,5,232,221,2,226,-118,0,232,184,4,194,116,231,121,1,224,46,20,147,202,224,47,3,201,20,-224,47,14,174,188,225,192,0,201,149,224,47,15,197,124,224,198,8,233,161,-16,182,119,233,122,12,224,28,3,239,230,11,235,154,7,235,54,8,225,154,-8,64,46,130,231,226,184,3,251,254,1,232,181,2,245,121,6,230,86,5,-104,81,224,36,0,193,25,96,29,239,44,6,128,115,180,6,64,19,153,24,-125,254,199,70,66,115,2,53,55,53,98,75,121,0,64,33,193,218,156,159,-254,149,4,2,36,120,34,224,175,4,197,223,187,44,227,233,3,240,234,5,-240,163,13,2,48,49,55,225,103,1,251,138,10,2,48,50,50,99,148,247,-126,0,226,10,0,174,210,230,236,8,224,252,6,172,143,2,48,50,57,195,-138,233,23,0,226,184,3,226,88,19,213,241,225,158,15,224,31,5,97,158,-248,67,5,225,24,5,143,133,78,126,239,133,7,248,250,3,237,217,6,248,-217,2,161,24,2,56,49,32,199,205,2,49,49,54,240,66,4,224,132,8,-225,35,8,224,141,3,171,37,64,69,126,205,78,169,237,226,0,2,55,56,-53,96,89,203,147,139,96,248,149,2,64,58,128,5,64,3,244,229,4,241,-198,11,225,219,4,195,226,230,211,1,142,171,224,67,20,224,73,20,231,32,-4,160,76,228,16,5,233,18,1,201,97,225,245,3,225,114,5,32,88,139,-44,224,66,12,242,130,3,233,242,12,228,92,4,160,168,160,79,242,156,7,-239,148,5,97,72,224,78,0,235,249,4,64,66,243,124,1,228,76,5,41,-214,2,55,49,32,232,9,1,243,75,8,224,225,7,226,56,0,224,141,5,-228,194,15,160,44,224,120,28,229,222,2,227,82,11,165,92,227,126,5,237,-180,11,237,181,9,228,249,13,229,2,3,228,248,2,172,198,228,243,7,131,-146,157,239,221,248,203,244,228,245,22,192,135,228,120,5,192,114,229,69,1,-224,77,0,238,153,25,242,105,4,228,62,10,86,33,2,55,50,56,248,29,-3,236,28,3,231,71,9,130,248,250,124,4,239,219,10,137,12,65,55,235,-22,0,192,198,173,96,97,37,133,78,2,57,55,57,225,15,3,2,98,97,-100,2,32,102,105,2,110,97,108,2,32,100,111,2,32,115,116,2,97,116,-101,2,109,101,110,145,135,238,210,13,224,16,6,232,48,1,232,54,2,232,-25,4,229,144,5,144,124,224,74,5,233,144,0,230,78,2,2,49,56,49,-247,71,1,254,77,9,235,72,1,128,11,224,131,0,226,67,5,224,8,36,-226,112,3,247,192,2,228,113,10,243,81,4,243,125,1,130,134,246,147,1,-160,15,238,138,10,109,8,2,53,50,52,229,248,0,205,198,236,29,8,226,-245,12,224,33,4,34,228,2,56,51,52,230,91,7,227,251,3,76,12,244,-56,3,78,37,162,54,103,123,240,121,1,2,49,54,48,180,226,2,56,50,-32,32,8,168,88,103,163,128,56,66,196,147,206,2,54,57,57,168,7,224,-58,2,97,222,171,93,64,253,192,247,80,39,68,238,252,104,2,2,97,105,-108,162,102,110,81,2,55,57,48,71,72,148,136,226,159,2,2,105,110,100,-160,38,64,140,63,133,226,23,1,224,83,8,2,62,62,61,128,43,227,248,-11,2,98,34,32,226,79,2,32,163,226,81,0,226,15,27,245,173,5,163,-81,225,240,61,225,109,0,224,208,11,225,34,0,231,66,9,229,29,4,78,-10,129,26,224,78,0,242,189,15,196,152,229,217,21,254,248,1,228,243,8,-252,202,10,229,27,25,232,33,4,229,255,4,232,22,9,225,118,3,96,17,-32,2,109,81,77,90,225,29,1,2,70,114,111,2,109,84,104,2,101,110,-84,2,111,34,32,227,176,1,177,5,32,10,84,157,227,52,4,224,125,23,-224,119,0,160,72,224,115,18,162,103,224,101,83,160,213,224,99,13,225,151,-24,163,38,225,151,24,162,42,224,179,16,231,16,1,98,100,224,169,11,96,-167,224,159,4,231,1,9,229,191,1,233,85,4,228,147,0,86,106,253,49,-7,148,42,232,212,5,234,45,10,232,196,7,135,103,2,51,57,49,227,239,-1,238,214,6,224,17,1,225,20,2,198,152,243,206,4,243,244,1,116,222,-226,101,3,236,19,2,233,141,6,179,167,2,49,54,51,177,78,2,52,56,-32,123,57,227,150,0,236,128,5,236,236,1,154,208,200,111,193,14,101,123,-231,198,0,144,216,128,41,249,125,1,250,3,10,102,58,96,132,236,10,13,-172,9,97,216,128,99,213,133,2,50,49,53,251,51,4,168,60,32,24,182,-139,224,51,11,221,173,229,163,0,247,54,10,250,193,5,231,70,14,248,226,-6,235,225,3,205,37,2,56,56,32,225,89,12,226,10,9,32,15,2,53,-48,52,182,250,171,112,247,214,17,225,239,10,254,159,9,243,46,5,224,163,-39,241,240,12,166,62,255,220,2,173,196,129,186,243,154,2,96,204,32,5,-205,38,235,171,11,241,141,20,194,50,241,92,32,247,99,6,228,72,16,239,-254,2,238,182,9,227,33,5,141,13,208,80,2,55,57,51,240,80,13,238,-84,6,252,254,25,249,196,7,225,150,5,226,104,0,225,159,2,162,49,2,-48,51,51,218,220,2,55,56,56,64,147,160,245,225,126,4,33,118,234,28,-0,247,17,7,163,193,227,34,3,242,70,44,167,196,238,238,17,232,129,1,-231,91,7,236,208,1,229,69,4,239,95,11,224,42,4,164,199,235,125,5,-215,151,232,237,2,254,158,4,226,176,8,100,144,2,52,55,32,227,134,11,-234,160,2,225,208,9,236,78,2,249,109,18,196,92,241,90,4,236,7,1,-224,18,4,236,137,3,236,160,4,198,80,224,69,6,242,145,5,227,62,11,-245,89,0,227,102,6,227,111,5,247,237,8,233,80,11,237,30,8,224,67,-35,227,245,2,248,64,4,242,201,7,224,39,14,209,71,237,214,10,242,231,-19,241,203,1,246,85,8,237,220,8,242,7,14,225,75,4,243,115,4,224,-245,9,224,50,6,215,254,224,70,6,242,86,1,224,75,0,229,221,1,224,-244,21,224,79,69,225,2,6,243,78,0,248,4,1,157,202,67,30,243,220,-6,210,80,224,40,8,2,53,48,32,199,75,2,50,53,53,229,234,7,229,-87,16,189,73,67,227,237,120,0,199,187,237,126,7,32,9,2,83,116,114,-2,105,110,103,246,5,0,240,116,8,224,100,2,236,248,2,228,198,5,2,-48,55,50,233,53,6,225,190,6,223,41,227,110,6,228,164,2,213,2,33,-5,205,80,239,10,12,226,229,8,227,81,1,224,125,10,245,51,10,226,211,-95,226,55,0,224,50,16,193,246,225,248,6,2,51,55,51,69,69,2,53,-50,32,240,130,1,230,69,1,162,11,65,226,2,50,53,54,102,107,2,53,-55,32,32,5,2,56,55,32,226,28,46,239,149,9,32,9,2,82,97,116,-2,105,111,110,2,97,108,34,226,24,159,247,202,11,229,0,23,228,239,7,-226,33,16,226,34,13,230,120,0,228,85,3,197,193,228,125,21,226,46,17,-246,243,18,243,99,3,210,250,230,37,4,226,74,7,34,21,254,75,1,237,-1,4,224,67,35,81,147,249,99,9,233,119,7,225,10,8,224,73,11,229,-232,8,227,3,14,32,42,225,234,0,228,253,1,227,7,21,72,34,2,49,-50,55,197,40,135,253,246,86,2,64,40,32,127,32,49,2,56,53,48,192,-48,172,12,93,177,128,20,2,50,56,57,232,76,5,224,108,5,224,58,9,-227,112,63,2,73,110,116,2,101,103,101,2,114,34,32,227,111,148,193,140,-159,150,2,95,50,52,105,223,32,212,2,95,49,55,248,200,1,252,40,2,-2,49,55,49,173,15,224,171,3,32,100,2,53,56,32,96,7,199,14,227,-83,5,194,66,135,163,233,104,13,233,30,23,233,24,25,234,131,18,160,136,-226,69,0,169,255,193,30,148,169,226,55,1,2,57,52,52,227,192,8,228,-143,17,224,119,67,232,24,2,216,86,79,211,248,98,0,250,239,16,237,244,-2,242,7,6,132,158,188,23,234,187,6,96,180,67,159,135,119,255,79,9,-226,148,9,2,50,48,52,253,194,3,229,78,13,250,49,15,238,79,19,236,-221,20,227,64,13,252,58,12,227,67,30,236,94,9,197,64,240,30,8,240,-203,0,240,212,4,254,4,21,228,170,4,129,236,2,57,57,48,246,174,6,-248,122,16,251,219,12,192,96,128,249,96,248,249,71,2,229,193,2,226,162,-0,2,50,49,32,225,112,2,183,212,224,178,2,210,213,2,50,55,32,192,-75,85,104,45,80,179,245,97,45,2,90,32,95,224,53,4,32,146,196,75,-2,95,54,50,133,58,231,157,3,225,171,9,228,13,0,237,133,6,37,129,-35,105,66,75,240,194,2,253,122,4,228,61,3,47,171,129,64,226,52,4,-226,46,5,2,49,55,57,242,167,14,243,71,5,2,32,73,32,224,107,2,-225,48,6,242,110,5,32,69,176,13,208,222,41,213,105,207,68,247,250,90,-1,225,255,5,197,120,216,214,2,56,54,51,2,32,64,80,64,7,79,1,-223,185,226,179,9,147,126,2,52,50,32,179,216,2,52,48,51,163,110,239,-166,3,242,175,7,226,23,1,129,175,164,46,64,160,64,132,240,242,5,252,-253,1,209,15,66,24,2,50,48,50,160,41,58,90,51,239,65,151,64,221,-230,215,1,2,116,99,69,2,120,112,114,2,58,32,99,2,97,110,110,2,-111,116,32,2,104,97,110,2,100,108,101,2,58,32,34,193,147,154,148,103,-195,42,243,2,56,54,50,64,108,244,157,3,224,92,9,2,79,32,35,65,-80,130,109,192,55,226,102,1,224,60,2,2,58,49,50,2,57,53,32,2,-64,10,65,192,67,2,48,52,51,102,222,38,179,96,28,32,53,32,28,161,-169,240,247,8,230,199,7,2,48,48,51,240,225,1,34,195,2,49,51,56,-96,117,64,73,32,25,64,102,2,57,52,48,104,142,32,14,64,21,32,54,-224,21,3,32,14,64,21,32,124,224,21,2,64,106,64,21,34,166,32,21,-225,57,1,2,80,114,105,2,109,105,116,2,105,118,101,2,115,46,87,2,-111,114,100,33,49,32,37,64,44,224,81,3,32,174,64,21,32,135,96,228,-2,50,53,56,201,1,32,6,59,137,64,12,64,248,2,50,56,54,129,219,-2,50,55,57,236,42,0,2,95,54,32,64,50,32,82,236,66,1,96,38,-64,82,32,32,224,82,4,149,220,34,63,224,68,2,150,170,233,229,1,2,-56,54,55,35,112,64,148,138,121,136,68,224,31,17,150,192,224,31,14,68,-37,32,35,2,53,32,80,40,134,148,237,220,149,128,57,130,62,224,223,3,-98,178,138,3,98,71,2,56,53,57,224,21,11,128,70,96,199,224,59,0,-160,110,128,230,224,45,1,33,254,2,51,32,35,131,147,2,38,48,46,224,-56,11,224,45,13,224,44,31,96,36,192,44,65,119,32,37,33,119,2,83,-32,83,192,1,32,228,67,217,208,174,212,102,68,143,242,145,0,71,45,151,-137,192,11,64,112,33,51,146,233,2,85,32,65,32,47,2,85,32,75,243,-60,4,249,218,0,231,185,2,64,57,66,61,68,19,64,51,97,59,32,125,-224,59,1,32,17,67,61,224,32,17,220,232,224,38,23,224,34,29,224,244,-95,2,49,49,52,224,245,128,224,246,11,231,252,8,230,207,2,224,246,19,-224,184,27,224,144,27,38,34,133,14,2,50,56,48,128,37,69,170,224,232,-21,224,51,9,34,249,225,102,20,224,53,0,43,10,129,231,224,60,3,70,-130,224,59,16,136,148,226,186,18,227,202,3,233,176,0,224,94,4,226,247,-19,224,94,36,67,199,134,119,2,66,32,89,192,201,204,181,237,199,3,128,-27,130,128,70,154,160,76,224,108,18,64,13,192,108,202,25,234,216,2,64,-97,226,217,0,224,93,2,87,144,224,92,44,225,133,31,128,58,224,185,42,-235,53,2,194,244,226,90,14,160,98,224,32,25,138,62,225,119,2,236,99,-0,192,199,96,52,71,205,192,52,224,15,11,2,50,56,51,224,85,2,65,-211,136,46,195,139,193,103,33,225,235,82,1,225,225,19,38,226,96,181,65,-134,128,179,225,48,10,160,24,225,39,5,131,244,65,220,32,166,106,172,125,-180,227,81,8,192,85,224,25,17,64,198,168,171,97,11,134,145,2,53,56,-57,230,189,4,224,125,1,64,47,168,197,224,47,13,167,146,224,47,3,136,-223,129,5,2,115,101,113,140,121,96,8,76,37,96,34,136,236,43,158,103,-29,225,5,1,64,15,125,38,224,138,0,32,45,75,158,32,45,2,85,32,-90,32,1,98,195,64,20,136,243,2,102,47,32,64,12,136,173,65,90,224,-33,2,135,74,71,61,169,12,38,217,200,5,233,31,0,37,247,224,19,7,-80,209,224,18,2,85,140,232,29,1,224,18,0,97,95,224,20,8,35,29,-224,19,1,233,95,2,232,128,2,96,155,132,30,32,176,2,52,32,90,224,-177,1,130,96,165,52,104,188,99,19,40,255,74,105,64,33,161,187,160,211,-78,33,32,6,137,155,76,44,64,6,70,10,137,84,35,245,64,16,64,71,-168,98,112,23,224,204,3,76,197,115,123,32,61,224,43,6,224,39,2,2,-38,49,46,232,168,3,160,14,64,28,139,72,64,35,96,206,171,74,128,140,-2,80,32,38,96,40,128,162,128,59,192,73,2,64,89,32,82,64,160,80,-253,59,0,224,211,0,146,74,192,74,128,16,2,95,54,56,227,225,0,64,-116,130,103,2,105,116,111,2,102,32,58,128,49,97,26,42,175,2,56,55,-49,88,234,35,209,192,211,64,7,171,21,151,50,42,106,96,6,66,109,33,-105,224,39,0,139,52,96,11,32,84,64,7,66,101,2,62,61,32,64,13,-162,115,2,62,32,58,128,64,64,12,2,60,61,32,64,13,130,108,2,102,-60,32,64,12,129,221,2,102,110,101,2,103,32,58,129,145,64,14,2,42,-32,58,129,24,64,12,2,45,32,58,129,185,64,12,2,43,32,58,128,249,-161,253,225,255,1,237,165,0,226,8,3,226,15,1,74,202,32,51,2,73,-32,58,128,47,224,63,0,239,4,0,64,8,163,117,83,111,130,116,2,50,-32,65,160,18,128,196,65,138,113,249,39,124,64,21,128,204,210,25,242,39,-0,147,139,243,135,9,243,132,12,193,171,243,9,14,224,30,5,239,117,0,-83,3,253,250,8,174,198,181,190,224,85,19,217,1,224,85,46,175,143,160,-216,192,25,208,85,198,161,166,87,243,61,17,225,54,6,224,32,3,128,115,-247,124,1,244,187,14,244,178,16,175,172,70,203,2,57,52,56,110,149,78,-156,246,189,2,2,52,57,32,233,75,3,2,90,32,67,224,27,10,224,95,-10,198,56,224,51,7,250,133,1,244,18,12,181,219,224,53,8,176,46,224,-25,10,245,38,1,208,114,66,114,163,50,238,254,11,55,23,142,253,64,58,-224,36,4,2,68,97,116,2,97,46,73,151,54,2,95,84,121,2,112,101,-46,247,67,1,64,47,163,107,224,84,11,2,70,108,111,2,97,116,87,160,-39,131,134,241,137,1,134,187,145,142,2,95,51,57,100,24,149,118,64,45,-239,191,5,65,83,64,21,239,191,18,2,67,104,97,160,145,64,44,224,59,-1,2,48,51,48,128,21,131,152,194,178,243,178,3,145,104,98,139,145,129,-224,26,4,242,197,3,2,50,51,55,240,179,0,242,138,1,67,250,96,181,-74,1,200,188,242,10,6,2,95,57,56,101,109,237,18,2,224,89,2,73,-110,64,173,128,14,100,153,50,241,161,21,128,14,33,62,133,206,70,200,227,-29,1,244,206,0,100,37,197,227,185,236,66,65,166,249,160,6,243,12,1,-33,25,66,116,128,187,160,29,104,240,242,254,4,126,206,49,170,39,89,128,-140,96,142,241,197,1,224,181,1,65,165,162,143,64,10,34,106,65,16,168,-30,2,54,52,54,97,198,145,74,64,28,66,10,32,1,2,80,32,90,32,-5,52,219,160,164,52,119,32,80,192,106,37,67,50,142,98,253,224,10,1,-64,64,170,36,32,1,2,80,32,83,161,81,242,91,4,81,60,160,69,225,-241,1,36,161,247,58,10,242,106,8,245,146,12,40,215,195,163,224,112,12,-123,115,224,106,1,196,198,148,161,181,16,246,81,2,244,37,5,224,149,0,-98,134,128,127,64,145,121,242,218,54,2,95,50,55,32,159,64,7,99,228,-2,51,57,53,162,57,224,15,4,138,237,2,57,55,57,227,83,0,243,171,-2,227,56,1,2,101,120,105,2,115,116,101,2,110,116,105,2,97,108,115,-2,32,110,111,2,116,32,97,2,108,108,111,2,119,101,100,2,32,105,110,-2,32,112,97,2,116,116,101,2,114,110,32,2,98,105,110,2,100,105,110,-2,103,34,32,255,31,3,227,21,9,114,88,71,113,225,57,15,2,56,57,-57,226,87,0,74,93,246,180,5,224,17,8,65,223,132,83,107,246,231,20,-2,249,167,0,247,87,1,246,69,1,229,98,0,247,203,1,163,9,229,252,-0,68,12,212,115,248,36,4,245,219,7,2,55,55,55,65,50,96,143,252,-62,2,2,99,110,83,161,12,252,181,3,248,24,9,225,243,0,163,62,2,-50,51,49,227,228,9,64,22,194,111,111,142,134,205,185,248,225,15,2,231,-91,3,231,99,2,224,34,3,228,4,0,88,36,248,84,3,2,55,53,51,-227,65,0,240,206,5,2,55,53,52,108,18,32,49,68,84,160,36,182,130,-132,42,196,3,118,61,65,227,205,76,160,104,131,18,164,86,240,200,2,227,-7,1,255,2,1,249,149,6,69,245,248,234,0,200,102,225,70,5,66,86,-97,146,225,128,4,2,68,34,32,228,162,5,161,203,193,136,131,65,148,235,-32,255,196,72,225,178,11,249,212,13,248,216,2,225,98,18,240,13,0,136,-176,200,133,227,243,0,255,249,3,226,159,0,64,112,226,150,4,160,19,97,-141,94,176,96,92,129,130,161,78,197,181,229,189,0,226,91,6,224,58,18,-228,165,0,225,233,25,225,210,22,227,19,9,225,227,3,225,187,2,162,237,-82,233,193,73,131,206,135,250,234,26,6,77,173,2,57,50,53,227,49,6,-229,22,1,102,246,35,47,32,82,36,218,2,85,32,80,225,1,2,227,186,-3,229,77,6,32,83,140,139,228,100,3,64,132,168,81,2,50,49,54,192,-130,2,54,52,49,121,19,172,135,64,107,224,166,21,162,23,128,97,200,192,-2,57,57,54,97,103,2,57,53,52,193,130,128,113,64,87,96,79,122,168,-232,108,10,122,178,229,85,18,136,109,232,110,8,129,242,160,99,200,213,180,-7,231,179,1,103,123,224,94,16,228,139,9,96,45,224,106,7,32,133,98,-62,192,109,204,201,96,109,225,245,5,2,51,53,32,233,57,19,134,33,233,-57,16,64,126,168,18,69,169,2,85,32,95,164,181,224,102,8,160,190,224,-124,13,117,200,168,217,128,87,168,106,159,231,160,93,251,219,8,158,205,232,-225,2,234,35,1,225,84,3,129,148,161,224,160,108,128,18,227,21,2,252,-206,5,113,115,64,250,96,247,79,62,251,120,4,105,112,142,117,32,69,236,-150,2,225,196,4,192,32,136,13,64,213,136,255,71,58,64,167,64,17,135,-49,236,61,0,147,145,73,95,32,56,129,73,229,43,9,226,109,2,103,0,-48,97,232,52,10,237,233,7,193,19,226,205,4,225,25,3,235,91,12,130,-207,129,151,64,26,96,30,225,169,0,128,195,172,33,160,189,81,207,145,157,-224,168,1,227,153,3,32,30,71,63,227,174,10,61,92,136,4,225,232,8,-116,130,79,207,100,83,62,45,190,37,224,40,12,252,148,0,2,50,50,54,-234,235,8,76,85,228,18,2,230,42,5,100,204,66,219,135,59,241,78,1,-72,8,99,64,224,177,1,2,55,51,54,130,40,231,32,4,196,215,43,248,-39,193,227,165,0,2,50,52,32,158,60,145,208,231,101,9,41,48,231,83,-2,133,239,192,154,232,8,1,233,2,0,245,66,0,226,21,13,96,127,242,-15,0,231,2,0,233,135,4,224,81,3,224,1,1,32,58,106,150,224,58,-0,133,223,128,2,226,27,2,235,5,2,64,214,240,90,1,224,49,2,229,-221,4,39,215,160,36,192,106,226,17,8,224,140,4,226,26,15,231,137,1,-233,199,5,231,178,4,235,84,0,224,134,8,2,55,51,55,234,102,4,224,-162,10,230,129,5,64,0,141,94,65,83,132,103,66,16,134,115,50,46,2,-51,32,75,2,52,32,75,2,52,32,65,192,26,64,36,175,48,214,252,64,-156,224,181,1,248,134,2,225,191,13,65,252,2,50,50,53,200,191,225,179,-0,133,117,227,199,7,224,55,7,130,184,226,68,9,39,63,237,37,0,227,-35,1,2,52,52,53,230,87,9,69,198,192,72,224,49,35,164,118,65,43,-67,166,73,200,66,249,117,235,2,48,57,57,228,165,0,227,191,4,225,233,-7,33,234,233,112,5,129,51,2,95,51,49,158,127,224,208,0,235,134,5,-110,36,96,4,236,203,10,224,20,0,2,51,50,54,160,188,96,78,224,21,-0,163,159,224,163,1,224,0,1,128,126,139,229,159,138,2,50,57,56,208,-137,230,139,3,2,50,50,55,234,205,2,228,90,8,33,56,33,67,128,59,-33,1,239,34,1,135,103,225,167,6,66,72,200,35,227,11,8,72,185,192,-152,225,29,15,150,36,151,245,64,1,224,149,9,192,17,86,15,225,177,7,-225,10,13,64,148,136,74,2,95,51,55,2,51,32,102,242,107,5,2,83,-116,114,46,118,2,46,73,115,128,8,75,241,64,48,176,74,224,48,10,2,-78,117,109,64,3,192,40,220,21,147,20,165,71,194,118,66,119,32,11,143,-204,230,14,0,240,130,1,128,66,248,35,1,69,80,229,40,2,35,58,108,-92,87,120,129,119,237,94,4,227,77,0,163,144,64,52,33,117,224,28,6,-164,111,192,26,231,93,2,229,39,6,209,126,224,95,1,244,26,2,187,115,-64,50,134,106,135,75,131,176,224,15,1,224,211,0,184,213,2,57,51,48,-49,101,113,135,82,83,96,230,169,30,169,36,130,3,231,107,4,149,199,233,-189,13,228,145,1,234,95,4,162,21,2,57,55,53,230,74,1,103,120,2,-48,51,56,228,64,2,224,77,6,64,149,247,162,1,2,83,32,73,247,12,-4,175,244,239,241,14,230,14,8,228,106,0,40,154,65,72,171,203,197,145,-232,164,2,104,110,2,50,49,55,243,90,0,64,13,232,93,0,66,210,110,-142,41,20,96,39,243,8,0,42,55,34,222,195,199,73,66,91,104,226,76,-2,179,81,247,42,14,64,7,192,119,160,252,185,96,76,70,2,95,54,57,-148,246,64,111,178,238,228,160,2,64,143,218,234,64,171,131,226,47,88,96,-241,2,48,51,54,128,59,219,181,145,103,104,245,161,1,64,29,131,84,67,-213,32,81,170,75,74,135,161,128,224,168,3,184,224,74,235,138,105,96,141,-177,90,231,64,1,193,166,225,158,0,253,95,1,225,5,2,248,91,1,130,-120,178,196,2,56,51,57,226,83,2,179,54,243,21,2,244,137,4,238,182,-1,106,231,193,114,128,95,236,35,2,243,166,3,2,56,55,32,224,57,0,-169,115,245,163,9,224,156,1,244,233,12,98,30,228,79,0,75,97,216,230,-224,57,3,245,57,10,227,41,12,65,255,137,205,100,175,242,155,8,64,31,-2,49,32,35,224,152,3,228,42,1,236,39,0,35,177,229,101,7,245,74,-5,65,185,132,1,2,75,32,66,230,11,11,171,235,239,137,11,239,51,3,-38,184,230,138,2,239,134,18,32,40,64,81,233,5,6,64,134,196,117,37,-90,249,229,5,177,62,250,248,5,250,245,10,195,47,225,195,0,224,40,16,-226,77,7,145,175,250,76,4,165,52,143,163,165,5,233,92,6,72,172,32,-216,92,59,232,78,9,2,49,52,51,160,26,231,53,2,85,169,173,86,177,-166,245,145,9,68,42,244,94,3,2,116,111,111,2,32,109,97,2,110,121,-32,2,97,114,103,2,117,109,101,2,110,116,115,244,108,1,224,62,15,224,-61,5,2,102,101,119,224,60,7,2,95,56,56,227,127,1,250,142,8,228,-200,0,32,253,248,30,5,224,37,4,129,110,224,37,8,251,126,15,174,6,-224,73,11,192,25,98,234,224,111,16,224,36,1,238,71,4,236,43,2,109,-25,71,23,112,160,32,3,64,228,160,56,227,48,4,128,73,95,168,131,243,-68,168,252,57,18,129,182,224,32,18,162,252,224,33,19,198,221,224,215,9,-234,103,2,249,142,7,224,39,4,202,107,225,111,3,229,86,8,231,68,1,-211,133,250,214,5,229,127,6,224,77,3,253,61,30,244,225,2,224,31,3,-178,147,224,78,0,224,114,10,224,192,2,244,185,1,224,154,29,124,174,228,-181,0,112,41,110,76,42,170,137,180,96,52,227,106,8,248,244,28,2,66,-97,100,216,220,214,70,68,143,180,24,103,57,34,60,2,48,57,32,96,22,-212,13,36,166,251,97,1,228,114,5,224,23,1,230,249,0,161,46,103,16,-193,102,199,28,234,20,0,228,169,0,255,217,25,229,12,1,224,46,20,197,-18,233,43,3,175,155,224,47,13,192,95,242,227,2,255,42,12,228,34,0,-228,60,20,145,209,234,0,5,180,145,241,30,8,242,30,6,64,117,105,250,-33,174,241,43,1,246,95,12,243,175,15,233,94,5,235,173,2,231,105,7,-242,225,2,232,144,8,234,13,5,235,166,2,251,174,9,108,1,2,56,56,-32,231,113,2,231,217,11,138,70,66,78,40,32,174,235,225,20,40,2,57,-48,48,237,58,4,234,74,7,224,239,0,252,255,16,241,14,4,169,28,192,-14,133,132,241,109,1,192,129,249,17,3,225,40,9,236,163,3,204,169,233,-100,4,249,116,2,240,99,3,129,87,245,128,2,253,3,6,227,40,0,195,-246,139,222,103,91,228,22,4,228,238,3,106,236,37,255,232,254,6,226,122,-39,195,63,229,31,1,227,234,5,227,70,14,180,241,227,70,0,230,21,16,-245,219,2,227,70,6,192,25,32,207,229,149,5,128,224,251,55,7,226,248,-2,227,34,3,203,169,227,50,3,225,66,1,110,248,225,66,13,161,206,181,-165,73,212,46,56,79,18,32,19,2,52,53,52,75,148,72,66,236,145,2,-226,140,6,252,155,5,255,94,8,64,78,35,117,78,11,36,115,224,70,6,-47,68,224,149,5,251,219,4,232,61,13,224,230,4,247,200,9,51,152,128,-78,99,116,238,110,1,248,155,5,235,248,5,209,3,95,199,226,73,2,150,-212,232,72,3,231,135,16,227,150,9,224,10,0,230,245,14,224,198,6,239,-107,7,224,174,24,166,76,228,139,7,74,106,48,224,97,9,215,109,228,151,-10,249,252,5,96,227,32,73,2,54,51,57,196,159,252,252,9,227,52,2,-130,235,76,249,183,26,179,228,32,54,2,53,48,52,32,22,2,53,48,53,-227,79,5,241,32,11,235,252,1,228,162,4,227,55,4,240,194,0,245,172,-2,227,147,22,239,222,13,144,78,225,145,0,232,206,6,225,140,4,227,113,-4,69,250,208,70,2,55,57,51,248,7,7,2,49,57,49,225,255,8,254,-105,8,135,136,247,62,2,232,5,2,230,90,6,225,217,2,128,183,230,107,-8,129,156,2,48,51,51,195,174,2,55,56,56,64,155,245,9,0,225,185,-2,140,200,149,241,78,43,65,165,80,9,201,184,192,17,2,75,32,75,224,-61,0,2,53,48,54,128,18,150,136,105,147,98,23,250,225,3,233,238,26,-224,40,11,129,205,235,217,1,239,7,6,34,58,228,9,4,246,221,2,255,-76,6,229,90,4,227,128,12,232,204,2,73,142,2,85,32,67,229,16,3,-138,67,100,25,32,25,65,50,245,142,0,244,96,6,2,110,101,103,2,97,-116,101,202,46,227,210,0,240,88,8,162,7,228,6,8,174,211,232,151,1,-231,13,13,232,166,18,249,90,5,240,221,1,249,35,5,254,67,16,228,191,-6,224,71,7,227,37,8,232,252,9,148,103,224,8,3,229,59,26,224,112,-8,249,14,7,228,83,4,227,20,8,138,186,248,162,6,251,81,3,251,89,-0,38,81,244,231,1,233,36,10,225,118,1,226,19,1,66,229,213,149,231,-177,3,38,162,130,233,241,5,1,232,215,9,225,254,12,233,111,3,251,151,-2,224,225,3,232,237,6,244,221,0,225,0,3,232,246,7,39,124,62,60,-128,89,39,43,2,56,54,52,108,241,197,92,233,6,22,225,116,4,83,35,-246,177,7,252,250,12,224,205,14,229,105,0,224,199,2,227,85,6,117,136,-39,208,96,25,2,75,32,85,224,29,19,77,106,241,46,7,225,190,6,249,-22,7,166,83,227,98,9,224,101,9,32,44,88,145,2,50,48,56,2,32,-64,102,227,203,0,2,98,105,110,2,100,34,32,235,71,15,132,84,227,136,-6,225,173,1,244,186,3,221,110,229,225,2,224,57,4,224,35,2,242,218,-0,69,179,233,181,0,249,62,5,32,36,193,155,233,154,11,226,136,8,2,-48,56,52,224,150,4,234,227,7,226,236,0,239,186,0,67,57,245,46,12,-102,65,99,65,105,153,227,65,12,237,25,11,224,240,8,113,96,150,9,248,-156,0,231,179,3,235,235,8,226,175,7,251,103,8,64,192,64,35,234,30,-4,224,240,10,235,201,4,224,0,6,246,1,11,64,74,122,198,227,27,25,-250,220,1,2,50,48,50,183,226,36,118,32,36,38,169,2,49,53,54,226,-92,3,2,116,99,80,2,97,116,58,2,32,34,32,166,185,132,160,114,168,-35,193,2,56,54,50,240,150,6,224,76,10,2,79,32,35,72,103,135,65,-192,55,229,48,2,64,203,168,32,174,23,105,202,188,128,97,191,89,189,83,-12,224,151,1,2,61,61,34,231,219,0,224,34,14,2,84,114,117,230,225,-1,224,163,4,49,7,78,191,113,30,2,50,48,55,195,175,97,13,64,27,-152,118,2,80,32,58,96,29,152,104,40,55,64,14,152,89,100,227,228,221,-11,101,126,225,199,3,93,249,2,48,53,50,192,117,248,131,1,246,171,8,-2,57,50,48,251,16,0,229,218,0,226,142,5,131,144,234,228,2,227,83,-0,255,49,21,132,251,248,172,14,239,46,1,230,211,14,228,10,0,130,138,-232,41,1,75,41,195,94,128,19,71,45,106,76,32,7,225,225,0,235,173,-1,132,54,199,88,2,50,48,51,216,32,114,228,227,45,7,65,47,153,149,-253,202,1,128,67,234,115,1,234,129,5,230,119,4,105,32,235,219,2,224,-60,8,93,3,224,245,2,96,14,235,124,4,226,150,0,195,253,224,61,0,-133,5,129,15,245,131,2,105,189,196,34,96,23,41,119,2,56,51,32,67,-153,130,254,160,7,234,79,2,235,64,3,224,2,2,229,207,1,225,218,2,-224,2,3,137,127,225,157,2,253,68,14,34,128,102,156,247,225,1,118,56,-193,27,238,230,5,128,7,105,220,251,238,3,32,0,224,9,0,235,239,13,-161,2,96,86,224,210,6,241,139,3,96,92,65,230,132,142,245,69,3,236,-240,1,244,87,2,224,231,0,201,62,237,32,3,227,127,1,107,161,235,163,-4,236,158,2,148,184,102,169,233,81,3,233,196,3,128,102,173,178,224,26,-5,224,148,4,128,221,225,180,17,129,17,224,66,9,226,145,0,224,127,14,-224,106,0,129,151,224,35,20,227,178,3,241,215,6,224,2,0,238,133,1,-224,14,3,240,138,8,224,1,11,33,98,224,130,4,224,234,16,224,246,12,-236,222,6,237,239,1,224,5,12,246,57,9,128,72,242,115,1,102,111,100,-25,227,142,0,140,212,133,81,223,70,166,60,2,50,55,56,224,42,5,119,-94,36,138,101,244,64,44,99,147,128,65,192,22,64,8,245,160,3,243,220,-12,235,202,10,227,130,1,225,60,3,239,162,14,225,138,0,225,32,6,224,-181,12,251,148,1,96,223,225,13,0,96,186,225,13,23,224,225,14,194,249,-199,109,227,13,6,228,68,3,227,173,8,135,100,2,51,56,52,96,113,69,-244,231,75,2,232,52,12,2,97,109,98,2,105,103,117,2,111,117,115,2,-32,111,112,2,101,114,97,2,116,111,114,2,32,101,120,2,112,114,101,2,-115,115,105,2,111,110,34,228,73,10,226,70,4,255,36,3,193,101,224,240,-1,2,53,56,32,225,29,3,224,209,10,224,172,38,2,98,97,100,2,32,-112,114,2,101,102,105,2,120,32,101,224,164,9,228,250,2,2,95,49,55,-2,57,32,102,224,55,0,2,92,51,52,2,38,115,114,2,99,47,77,2,-105,99,114,2,111,72,115,2,47,70,105,2,120,105,116,2,121,46,104,2,-115,92,51,2,52,38,44,2,54,51,58,2,55,34,32,192,56,100,238,233,-132,1,225,210,0,173,238,173,86,39,217,105,91,119,77,214,54,168,5,128,-220,65,202,34,29,32,5,236,90,2,2,80,32,75,2,50,32,85,132,253,-2,75,32,95,133,237,2,64,89,32,205,138,237,135,12,155,141,139,57,64,-79,34,86,209,62,149,177,128,113,130,76,96,115,2,50,48,48,170,43,2,-50,48,49,225,87,5,103,204,226,78,1,64,100,135,16,132,168,132,124,228,-91,0,230,149,3,136,70,160,179,200,125,128,74,168,236,111,6,239,13,2,-224,61,7,193,25,224,33,1,225,3,1,161,25,113,242,224,21,0,72,86,-39,146,105,224,163,26,32,6,189,109,2,95,49,56,2,51,32,35,100,15,-64,39,223,211,234,98,15,241,70,2,64,46,155,114,2,65,32,58,129,44,-32,11,2,90,32,85,74,55,97,95,32,14,2,75,32,58,129,187,234,4,-0,101,200,235,235,3,64,32,138,115,114,171,64,14,138,115,2,95,52,57,-180,88,65,95,146,40,96,193,32,30,177,244,160,6,160,24,64,11,128,30,-224,24,12,160,49,96,31,32,7,43,201,196,49,64,115,202,168,41,21,239,-212,2,233,106,9,248,16,7,227,194,6,253,103,9,119,180,169,245,2,55,-52,49,248,192,9,255,48,5,236,168,32,2,103,101,116,2,65,112,112,2,-67,111,110,204,172,236,105,7,255,158,3,2,85,32,73,170,98,106,167,161,-141,96,105,2,51,53,50,226,24,17,250,1,1,32,40,98,112,64,65,130,-77,104,127,64,14,130,52,88,211,211,248,253,126,0,115,79,76,63,199,148,-106,66,238,22,3,172,254,224,2,0,239,126,6,234,204,1,142,105,117,35,-97,81,34,223,240,121,8,64,112,130,135,64,209,2,48,49,51,254,72,0,-235,103,1,32,35,78,59,224,148,0,239,218,1,136,8,224,156,7,224,16,-3,2,54,57,32,128,64,130,209,2,83,32,83,105,71,255,132,17,172,44,-224,33,19,150,184,254,130,8,253,186,8,165,67,226,95,19,2,90,32,95,-236,201,5,253,236,14,145,209,66,92,38,91,119,19,221,181,79,88,219,66,-240,10,0,254,106,2,224,57,11,142,194,224,57,1,224,93,13,64,27,224,-93,4,241,87,4,224,240,5,237,252,2,139,190,251,130,9,251,127,14,2,-85,32,83,221,70,224,125,1,101,86,98,219,64,227,248,228,2,249,61,4,-2,48,49,55,234,204,1,225,76,11,224,215,1,34,86,2,55,51,51,163,-159,192,102,32,65,79,44,224,228,1,2,95,50,52,96,63,241,142,0,226,-5,18,192,241,128,31,224,28,6,96,77,225,11,12,201,72,250,202,10,167,-85,215,162,250,184,8,2,85,32,66,224,188,3,36,8,249,242,4,249,29,-5,253,86,3,224,56,6,120,103,224,46,16,248,101,23,225,100,8,225,246,-17,225,4,16,173,236,248,163,11,225,178,25,242,78,0,129,178,224,198,1,-226,197,10,150,183,225,12,3,224,95,23,167,204,224,94,0,224,60,2,226,-99,13,229,255,34,2,100,115,69,2,70,105,101,2,108,100,115,229,254,12,-68,164,135,85,136,113,163,31,32,194,64,25,135,96,241,149,14,250,193,1,-235,212,6,243,251,3,64,202,169,81,241,121,3,161,14,224,40,1,32,79,-163,249,224,230,2,64,130,199,111,2,95,50,49,32,224,251,164,0,2,54,-52,49,125,59,66,195,64,38,230,172,2,158,207,128,137,145,133,96,123,104,-161,225,38,17,2,101,110,117,2,109,34,32,129,91,64,80,134,187,161,20,-101,13,161,19,134,197,79,113,236,172,0,226,132,9,99,203,224,26,13,136,-111,226,186,12,184,139,229,139,15,209,57,32,132,139,54,230,214,0,168,172,-96,38,102,239,96,32,132,41,229,157,6,65,101,224,36,6,255,121,14,92,-57,224,37,2,239,77,1,229,139,12,228,152,28,224,101,4,96,21,228,37,-7,109,144,228,37,6,224,128,0,228,37,10,192,119,228,37,1,2,56,48,-32,245,213,4,227,64,1,224,25,6,225,63,3,105,243,65,221,136,134,105,-222,230,121,5,187,216,240,80,1,233,232,21,199,124,231,237,19,224,206,11,-192,25,233,146,1,224,244,21,249,206,11,129,48,128,23,96,245,156,26,236,-136,2,229,239,0,161,170,2,95,50,53,67,28,155,13,250,31,20,160,116,-32,155,234,24,0,247,156,5,141,163,249,162,4,132,219,139,104,205,69,126,-161,96,69,96,4,203,125,32,244,174,157,98,9,122,54,128,56,148,36,33,-199,130,34,224,0,1,227,6,12,225,219,8,97,220,137,242,228,204,12,129,-119,179,173,64,242,34,157,64,6,162,23,85,133,99,245,76,40,228,52,1,-2,118,97,108,151,74,248,23,2,2,121,112,101,100,71,224,18,1,2,107,-105,110,154,135,224,18,1,2,115,111,114,2,116,34,32,128,90,236,245,3,-229,100,20,242,172,0,241,55,0,161,158,136,188,32,61,118,45,142,128,2,-52,48,51,226,37,5,249,70,10,70,168,96,22,2,55,54,32,224,54,6,-129,49,65,5,246,102,0,195,3,232,158,24,241,199,0,234,131,19,133,255,-2,52,53,32,128,194,188,226,232,7,23,2,95,55,57,222,223,224,42,10,-128,26,224,94,1,133,253,64,94,192,212,103,47,225,134,2,2,101,116,83,-2,76,111,99,2,69,120,112,2,114,34,32,160,242,184,200,162,162,97,86,-2,55,52,54,224,71,2,161,74,124,43,192,19,64,56,134,169,2,79,32,-58,128,27,97,211,128,180,2,51,54,55,160,35,230,85,1,254,49,0,164,-97,228,88,0,247,169,0,94,13,67,121,2,50,57,56,236,28,2,228,122,-1,130,0,224,55,6,32,144,40,94,32,5,142,65,173,140,160,6,227,179,-1,114,7,192,49,231,18,15,2,117,110,100,49,253,2,110,101,100,168,57,-130,99,250,231,0,224,54,15,238,103,0,2,51,50,57,246,197,2,38,136,-226,17,0,67,224,247,255,5,240,228,0,224,157,2,226,182,0,224,105,15,-243,78,1,199,185,175,95,178,62,224,61,21,192,167,200,140,96,51,160,180,-251,172,22,130,0,35,77,128,45,82,82,49,82,191,153,215,166,152,57,242,-163,0,2,95,57,51,223,199,228,189,3,129,6,66,27,209,83,228,96,3,-2,91,93,34,242,0,3,224,146,8,79,54,193,64,203,223,192,202,32,8,-176,164,124,237,224,53,3,32,114,160,53,250,218,1,224,91,8,2,52,52,-32,248,221,1,245,248,0,160,91,228,34,1,135,49,118,85,65,63,2,57,-53,48,233,102,0,2,49,54,57,225,112,3,2,66,111,111,2,108,34,32,-160,54,133,139,224,28,1,2,68,97,116,2,97,46,66,32,33,2,95,84,-121,2,112,101,46,32,39,32,37,64,63,131,140,201,107,255,175,6,65,81,-251,185,2,249,39,4,246,98,1,252,42,6,134,41,128,14,241,184,18,38,-242,129,176,252,0,2,232,150,2,99,211,251,247,4,181,154,224,109,2,170,-143,69,70,64,174,243,170,1,235,50,0,181,221,224,17,5,255,61,7,167,-163,131,119,2,50,52,50,236,67,2,135,184,192,169,224,71,4,96,48,163,-179,2,48,54,50,244,153,6,227,194,20,2,110,111,116,2,32,112,111,2,-108,121,109,2,111,114,112,2,104,105,99,2,32,101,110,2,111,117,103,2,-104,58,32,131,48,32,57,2,52,49,56,65,4,32,118,227,229,2,235,189,-5,111,77,32,91,72,123,2,52,52,56,228,199,1,224,41,8,97,233,135,-5,134,246,64,149,64,90,32,22,102,31,130,75,98,93,135,16,64,48,222,-127,137,246,96,137,64,196,160,29,133,197,190,157,96,70,130,71,235,117,3,-77,214,195,236,2,48,56,50,114,142,152,242,194,80,252,100,0,64,5,225,-215,1,128,48,66,6,225,81,4,242,160,5,226,172,5,249,63,8,227,49,-0,226,146,1,168,189,73,171,2,49,54,51,229,175,4,231,185,5,80,66,-32,114,182,164,102,229,227,168,0,64,237,254,28,1,226,141,9,128,77,2,-53,57,32,129,133,32,43,201,218,113,19,189,6,162,81,224,127,12,98,159,-75,70,64,62,130,210,254,158,6,96,189,32,129,229,23,11,247,182,4,165,-121,100,56,2,55,53,50,181,119,203,161,64,72,173,109,96,233,160,139,2,-55,53,51,235,199,0,64,46,71,245,148,97,64,57,164,139,2,55,53,52,-193,32,100,253,64,45,64,136,128,10,64,43,202,12,233,114,6,2,49,48,-53,243,205,0,227,134,1,65,157,87,235,172,61,238,204,5,228,25,7,57,-137,229,179,1,224,93,13,249,204,5,227,238,3,167,196,109,167,66,9,197,-109,233,192,7,159,99,129,37,65,205,67,60,224,107,12,71,117,129,206,224,-208,7,64,166,235,234,5,240,214,3,236,6,8,2,48,53,56,232,100,1,-224,135,7,224,43,4,110,169,98,102,107,69,249,228,3,160,6,177,16,99,-86,240,4,2,160,247,249,24,0,226,136,2,225,38,5,240,13,2,56,243,-117,112,194,198,128,139,243,213,2,193,68,225,153,0,228,125,6,236,47,7,-129,227,65,86,132,147,244,223,0,100,13,64,155,231,144,1,235,80,6,216,-171,230,73,0,253,184,0,254,27,7,223,83,254,56,12,100,116,225,205,7,-2,49,49,48,254,77,6,254,205,3,254,232,4,252,191,7,220,197,194,113,-64,202,232,26,0,100,57,238,225,2,224,79,0,253,213,2,135,28,160,59,-33,110,173,130,64,14,253,47,5,224,117,7,224,150,0,229,10,3,165,8,-99,159,202,17,2,95,50,51,33,189,32,8,224,151,25,222,111,152,36,224,-131,6,65,228,153,184,236,206,3,120,212,186,239,225,61,11,254,176,8,162,-213,253,252,3,224,9,0,128,147,162,221,239,90,6,224,65,1,104,143,231,-216,8,253,209,11,255,19,8,236,25,0,192,99,228,7,3,224,26,0,96,-115,128,167,224,31,4,224,131,2,240,65,0,192,84,224,133,1,236,101,2,-224,203,2,224,92,5,64,47,75,169,141,70,242,94,0,137,122,35,108,227,-113,0,67,43,135,142,2,79,32,80,103,190,2,51,50,54,122,198,183,241,-114,194,64,27,96,107,35,52,136,11,51,147,69,202,2,48,54,53,165,203,-110,31,224,39,16,84,184,161,226,64,8,224,39,17,69,251,128,39,64,88,-96,147,36,14,219,241,2,49,53,50,166,12,160,186,237,241,0,238,214,2,-108,171,227,198,7,162,209,200,16,238,167,11,226,3,11,225,142,5,224,30,-12,224,85,16,236,50,0,224,85,22,226,103,6,98,23,65,49,64,149,237,-99,1,227,35,1,33,2,64,250,137,23,235,133,6,75,128,2,76,105,116,-2,115,46,75,2,110,111,119,2,110,83,121,2,109,98,111,75,183,64,47,-136,89,225,42,141,244,38,2,225,42,75,239,186,1,229,155,10,153,12,234,-48,2,164,222,69,46,111,123,230,96,3,156,46,236,184,10,241,83,2,67,-153,134,111,166,117,228,161,7,229,25,2,224,25,8,224,131,0,241,29,10,-224,45,9,225,40,2,230,144,11,229,27,8,166,14,224,19,8,100,76,230,-212,15,224,49,4,230,137,3,254,48,0,229,112,17,128,6,132,166,193,228,-234,151,9,71,142,78,140,192,45,68,185,232,115,4,180,66,238,210,2,224,-107,30,132,37,234,137,0,230,50,2,194,243,224,243,6,160,154,139,221,171,-223,96,82,45,6,232,108,6,162,11,225,207,5,226,226,3,167,31,130,15,-64,5,129,102,244,0,1,238,177,10,193,95,236,181,5,37,104,79,210,239,-244,3,235,218,7,240,15,3,65,75,225,37,6,190,90,131,51,107,3,122,-184,198,32,128,166,43,113,96,241,187,5,2,52,57,32,229,108,0,236,209,-17,224,112,0,161,43,225,188,1,224,55,2,145,80,128,7,234,62,1,144,-117,246,162,2,241,246,22,2,77,117,108,2,116,105,112,2,108,101,32,2,-99,111,110,2,115,116,114,2,97,105,110,2,116,32,115,2,111,108,117,2,-116,105,111,2,110,115,32,2,102,111,114,242,23,0,169,226,107,69,78,43,-231,5,0,98,15,140,107,70,236,2,52,56,54,65,4,90,117,64,24,140,-88,2,83,32,85,155,157,246,26,2,2,117,112,108,2,101,67,111,192,117,-2,115,34,32,194,29,65,43,78,199,78,51,128,104,75,23,2,56,56,32,-38,209,159,23,66,74,104,197,96,124,65,84,164,140,137,50,225,184,1,169,-56,224,16,1,228,36,0,195,123,227,217,5,192,38,96,68,251,204,9,96,-5,234,210,1,130,115,37,241,131,235,228,62,5,241,115,4,232,70,1,229,-182,4,97,217,96,205,234,91,4,161,206,130,87,143,206,101,147,254,79,2,-228,89,8,66,104,233,150,4,143,69,2,52,55,32,32,22,231,222,1,67,-115,97,43,229,99,5,245,127,1,67,33,53,53,99,136,2,89,32,67,227,-88,4,163,121,230,224,0,225,31,0,96,255,224,15,2,241,201,0,230,32,-1,192,83,64,148,2,51,49,32,233,137,4,128,157,159,249,32,230,164,22,-98,240,113,226,224,22,1,227,11,7,230,201,2,224,10,8,227,90,0,35,-87,246,2,0,244,62,2,132,29,64,25,164,153,65,30,253,253,1,161,199,-193,41,192,205,176,200,224,206,0,224,105,4,82,140,224,25,0,228,233,3,-2,51,32,80,96,25,64,201,143,125,64,41,85,51,227,215,4,236,43,5,-224,103,2,64,67,228,148,5,230,213,4,225,100,7,163,171,96,50,130,206,-240,122,7,236,60,3,209,221,236,190,6,2,95,56,50,227,227,1,244,116,-2,225,217,3,163,54,227,67,3,224,190,1,78,160,225,13,4,230,17,3,-225,58,2,129,53,129,246,224,20,0,240,119,1,94,173,129,171,210,40,2,-49,48,49,36,224,106,184,113,254,79,241,241,93,11,187,151,182,122,237,156,-8,180,143,113,253,225,37,48,32,14,225,39,3,99,176,101,132,2,51,57,-55,197,132,228,244,1,2,102,114,101,2,101,32,116,42,81,2,32,118,97,-2,114,105,97,2,98,108,101,2,32,105,110,2,32,111,117,2,116,112,117,-2,116,32,102,88,98,2,112,34,32,230,26,2,227,17,3,240,91,0,230,-206,1,164,238,228,235,5,228,232,5,231,16,1,225,158,2,140,241,234,15,-1,228,168,17,228,145,9,228,136,8,226,230,2,247,210,1,67,75,140,73,-130,254,240,15,3,64,27,139,106,65,113,135,64,230,240,1,245,179,3,228,-139,4,224,42,8,224,228,0,169,67,239,92,2,226,118,0,168,193,228,198,-0,251,141,2,154,79,98,69,228,19,0,135,230,162,24,238,82,5,227,188,-2,161,248,224,8,3,243,73,0,67,115,223,51,233,221,2,81,151,192,59,-233,244,3,224,25,5,224,26,6,224,29,7,227,238,3,227,133,10,192,196,-226,229,4,64,146,139,172,32,196,82,209,32,170,33,152,64,22,137,195,64,-217,107,181,66,101,137,130,90,156,180,31,94,47,197,60,64,7,97,91,96,-13,64,65,135,245,2,83,32,83,254,41,0,71,173,64,6,66,246,99,10,-64,35,64,16,67,18,128,201,64,56,136,21,47,63,2,51,32,75,128,18,-64,49,192,75,139,232,40,180,224,58,0,210,197,96,22,135,13,178,197,128,-236,64,15,34,148,64,71,134,224,96,90,80,225,64,18,247,28,3,202,242,-64,23,130,160,235,199,5,241,226,3,242,195,3,64,47,130,180,97,218,231,-192,3,32,25,132,138,97,135,161,4,128,49,130,12,32,140,2,50,32,90,-128,120,64,21,129,143,80,61,224,143,5,129,144,66,233,136,129,227,201,7,-241,167,0,238,98,3,254,113,9,189,5,224,39,18,2,50,49,32,236,128,-6,237,23,0,96,26,237,149,12,234,239,0,227,71,6,69,1,227,73,1,-229,213,1,228,186,2,241,73,6,210,80,195,67,224,132,8,139,160,236,13,-2,133,122,101,207,252,82,1,224,50,33,196,4,184,89,64,176,159,11,128,-47,224,172,6,229,203,2,164,85,160,244,225,74,11,225,73,17,225,72,16,-227,228,0,232,171,3,224,58,18,234,88,8,233,103,13,228,247,4,233,93,-8,224,19,0,198,197,225,69,12,136,107,225,69,8,225,64,9,178,98,225,-64,20,66,210,172,23,224,29,0,68,207,96,51,64,15,34,52,200,223,224,-64,3,64,55,132,32,192,232,32,218,184,212,91,94,64,80,40,50,2,50,-57,48,198,12,64,36,224,89,0,224,12,4,237,187,2,32,8,224,98,0,-41,253,224,11,1,44,170,224,122,2,64,7,227,229,5,117,149,237,112,7,-244,255,3,177,230,245,147,0,195,121,225,184,0,227,164,11,160,67,224,46,-24,77,72,226,141,5,253,159,12,227,216,9,193,60,227,218,5,225,215,6,-250,113,1,2,51,53,50,181,192,227,205,3,128,47,32,45,189,57,198,91,-224,94,10,206,189,32,44,240,87,1,224,180,1,239,156,5,227,60,3,224,-75,10,192,24,32,75,255,200,2,111,95,205,248,128,29,160,103,2,95,55,-50,78,30,216,243,97,199,133,245,110,121,134,120,69,108,96,137,109,177,134,-100,32,150,249,86,0,32,126,32,103,215,24,181,220,32,90,2,49,52,32,-64,12,134,63,153,171,227,48,6,117,75,90,36,55,98,76,108,144,205,111,-115,2,48,56,51,120,36,140,126,49,221,254,31,0,165,169,247,226,35,209,-1,181,231,200,187,66,189,94,40,132,54,158,134,236,45,1,234,176,4,239,-53,1,65,244,98,231,44,153,239,153,5,2,109,105,110,2,105,109,117,2,-109,34,32,210,90,32,92,233,66,2,249,178,1,2,95,52,55,2,32,64,-73,193,146,64,83,199,33,241,79,13,233,101,5,243,14,5,224,13,0,102,-27,226,154,0,97,242,160,75,145,88,33,234,196,158,128,29,32,223,2,55,-57,48,80,115,35,241,2,79,32,35,2,55,53,32,241,98,0,242,243,6,-64,162,135,146,245,228,20,2,78,97,116,149,225,75,216,32,44,162,54,97,-75,143,49,132,24,209,248,195,149,96,186,239,88,3,41,72,232,205,0,2,-50,55,56,143,197,196,253,236,224,3,252,171,7,64,207,237,52,4,228,115,-6,203,113,131,210,243,66,12,163,179,252,184,6,97,53,252,215,0,227,97,-0,255,213,9,243,31,0,243,3,1,225,202,9,199,201,88,181,249,113,4,-242,212,19,224,199,1,242,215,12,226,56,25,224,123,1,2,95,53,48,114,-215,244,215,5,241,19,5,233,197,3,243,121,0,228,160,0,228,56,4,65,-241,244,216,3,129,107,129,205,219,231,225,143,4,161,232,168,221,2,57,55,-54,97,187,105,253,177,188,32,40,32,9,99,209,231,227,18,225,173,2,231,-147,9,232,12,4,229,187,1,244,153,10,132,71,225,20,3,251,86,9,97,-20,97,181,225,35,1,32,14,247,232,5,135,86,225,95,15,224,28,18,65,-65,135,242,229,39,6,170,86,75,157,101,89,165,51,128,49,135,236,131,101,-226,172,18,164,18,226,162,8,226,157,7,234,95,0,247,22,23,142,79,32,-19,64,201,165,57,196,103,229,66,0,68,219,224,251,1,32,174,69,193,72,-130,227,179,7,84,247,116,169,223,151,64,19,77,61,128,59,255,164,2,69,-189,96,92,64,77,200,110,96,170,2,57,49,55,156,131,2,51,51,50,64,-83,84,218,45,175,194,157,64,29,32,44,2,75,32,66,228,54,13,2,56,-53,32,253,103,7,175,218,224,149,1,225,47,0,96,130,174,223,71,220,225,-103,7,224,49,1,64,44,64,89,247,29,6,64,144,198,68,224,189,12,2,-56,55,32,224,189,4,134,29,71,39,225,230,4,224,12,4,64,244,227,145,-0,81,157,106,82,131,104,146,86,103,172,241,185,0,2,67,32,79,194,189,-64,113,246,248,1,192,50,202,233,199,72,232,99,8,227,80,1,240,78,0,-250,50,13,235,234,4,235,201,0,237,160,6,251,141,13,235,201,17,249,251,-3,254,15,19,241,105,0,68,97,241,103,1,181,81,34,177,232,253,1,65,-106,252,154,0,211,181,227,85,2,129,98,198,169,236,7,1,224,35,3,169,-239,104,56,216,209,247,50,0,226,26,5,2,48,57,32,192,133,104,101,64,-126,135,55,130,167,252,30,8,2,49,48,32,229,212,3,64,242,241,116,11,-64,71,133,141,226,233,16,97,72,245,248,15,130,141,247,251,4,226,152,11,-232,137,8,239,246,4,192,136,132,212,105,74,64,122,47,207,176,92,64,204,-134,48,226,195,2,228,180,1,66,236,233,197,3,237,186,4,160,100,65,209,-249,176,2,226,68,2,143,200,169,109,236,117,7,251,7,4,184,130,224,33,-12,128,27,226,224,4,232,193,3,249,27,13,226,202,24,254,88,9,254,74,-6,236,163,2,253,14,0,251,107,22,64,62,201,255,133,164,80,52,58,3,-132,86,32,9,130,115,252,193,12,224,12,1,224,20,0,224,160,5,237,64,-4,96,2,224,136,12,253,151,6,230,75,0,245,31,1,64,144,41,207,168,-241,249,133,9,225,8,3,208,58,249,211,13,2,48,52,55,192,49,224,18,-6,160,193,32,245,2,53,55,55,171,13,105,47,2,48,52,54,65,3,2,-57,57,48,99,203,2,53,56,49,32,34,2,56,50,32,91,115,32,198,111,-19,67,35,128,9,44,125,164,183,224,30,0,2,35,50,32,240,17,3,255,-189,14,225,165,2,71,28,96,137,76,8,139,137,115,213,2,51,53,51,96,-30,239,244,0,35,14,68,12,99,40,66,50,196,220,225,136,1,99,165,240,-154,1,225,144,2,230,150,0,97,236,99,172,224,110,10,201,181,2,51,53,-55,128,212,2,57,51,51,96,52,214,145,64,130,135,81,169,115,114,0,32,-4,224,14,6,46,228,45,168,238,48,1,96,56,217,252,228,109,19,2,90,-32,66,228,100,45,244,88,15,192,124,135,73,228,97,0,244,25,0,64,27,-135,56,2,95,51,52,2,48,32,58,131,4,220,239,128,69,64,20,133,114,-239,211,1,2,53,53,32,229,163,2,214,187,227,59,0,166,4,64,57,234,-242,4,228,165,1,228,119,0,226,224,3,228,136,4,229,51,1,224,17,5,-140,243,228,35,5,243,234,0,224,32,0,224,62,3,247,194,6,224,23,0,-160,38,240,59,5,96,8,160,5,2,95,55,52,243,96,4,237,79,15,236,-157,0,205,159,130,151,241,67,4,244,141,2,228,253,3,66,122,134,217,247,-159,5,231,6,3,71,96,79,80,218,206,2,55,51,51,65,120,2,56,51,-57,188,195,65,100,255,135,19,2,101,120,112,2,97,110,100,2,68,105,99,-2,116,58,32,143,120,2,95,49,50,71,212,243,207,0,237,138,16,228,127,-14,225,71,4,242,55,8,226,126,0,220,143,232,160,6,229,214,2,224,19,-4,195,194,224,22,17,233,59,1,242,222,1,255,96,1,224,55,8,232,115,-3,224,29,10,43,30,32,30,68,221,2,50,50,54,251,116,1,230,105,6,-255,188,4,230,237,0,144,64,236,63,1,255,162,11,244,98,1,99,36,246,-170,1,146,107,176,131,176,119,33,117,228,49,2,232,193,0,91,255,37,165,-32,169,133,135,229,126,12,232,225,0,105,188,168,236,101,234,64,109,124,66,-140,128,165,224,225,15,11,230,172,18,249,249,5,248,210,7,232,221,19,255,-72,14,225,123,13,227,185,3,225,90,56,100,235,61,37,65,91,160,95,225,-75,23,227,12,2,202,162,89,197,78,81,244,113,3,192,21,232,29,1,179,-213,179,212,233,113,5,64,20,147,243,64,169,32,98,69,20,218,218,45,254,-226,109,1,238,206,1,96,136,82,13,32,74,67,228,112,141,229,97,5,108,-231,102,156,150,136,229,254,2,200,231,251,171,3,224,46,18,192,44,122,242,-198,47,138,119,131,95,159,80,159,42,116,20,85,197,2,54,51,32,33,229,-32,7,69,7,2,55,56,53,197,246,76,92,2,58,49,48,64,251,107,163,-154,111,65,182,243,227,1,245,169,16,240,155,27,96,33,96,57,224,223,2,-235,170,0,210,5,250,4,0,252,22,0,96,153,166,137,201,253,64,220,32,-235,149,158,241,215,8,207,186,232,74,2,255,15,13,253,45,3,192,148,227,-83,2,172,224,234,118,1,179,94,245,99,0,2,95,54,57,227,247,1,69,-249,50,39,226,161,19,159,14,128,23,238,56,0,125,81,164,76,77,219,229,-253,1,2,36,120,34,135,234,99,14,188,27,2,75,52,32,32,2,252,33,-1,128,31,136,38,237,89,13,212,54,224,231,0,2,57,49,32,161,243,176,-110,110,58,242,223,4,231,214,1,231,24,0,139,171,238,29,5,148,190,243,-5,0,224,43,0,160,23,128,35,243,0,8,224,21,9,225,246,0,224,94,-4,208,164,237,254,2,224,31,18,192,67,249,108,1,66,36,163,28,228,223,-3,232,106,3,224,32,8,160,69,216,77,64,7,253,119,5,226,63,3,239,-228,3,247,151,15,193,27,251,161,7,64,81,224,15,1,214,51,227,26,1,-128,76,179,135,226,224,1,128,159,236,221,1,65,188,137,248,235,92,1,245,-226,1,160,107,32,229,177,55,128,138,224,8,0,64,61,138,33,234,249,2,-64,20,239,97,31,218,253,234,249,53,245,251,4,224,215,1,239,93,9,64,-247,64,25,132,229,226,238,14,115,113,226,238,2,51,109,240,72,13,82,23,-224,230,27,108,29,235,221,63,228,225,1,128,130,132,220,32,63,76,198,69,-237,224,1,7,233,66,0,233,5,7,235,67,6,224,34,17,224,32,3,32,-188,205,152,64,125,132,87,225,98,1,236,94,1,97,70,132,115,33,119,164,-116,162,119,64,29,164,49,104,153,100,240,122,210,64,25,249,74,7,2,97,-100,105,2,99,116,34,128,27,130,108,98,170,46,171,32,67,64,20,130,108,-227,183,3,227,201,0,234,51,1,229,169,2,232,95,2,83,238,242,133,2,-104,101,236,178,3,242,156,11,128,54,222,110,224,21,5,2,56,48,32,96,-146,130,122,227,249,5,253,209,0,204,128,224,177,3,234,200,13,232,25,6,-224,59,1,240,6,1,109,58,253,179,4,168,59,228,202,6,201,180,192,137,-64,194,166,65,224,35,5,224,75,7,160,37,235,28,8,225,18,9,98,182,-249,159,8,233,189,1,244,25,7,225,96,0,207,167,225,155,8,2,55,50,-32,242,19,12,64,26,227,35,5,224,99,73,225,131,0,237,194,4,224,15,-2,224,132,3,224,47,2,131,111,238,119,2,226,121,26,169,38,227,104,0,-224,140,16,240,233,1,224,106,63,131,141,233,246,3,225,60,10,237,11,6,-237,94,5,241,119,1,166,175,156,146,2,48,52,48,225,161,6,128,174,163,-37,64,118,65,62,246,79,1,32,5,180,157,246,85,5,93,121,225,19,11,-232,86,0,207,117,237,170,12,246,128,6,224,127,1,236,76,4,232,13,2,-250,39,3,101,242,34,230,129,100,39,63,248,23,2,239,18,3,228,42,18,-227,47,2,235,78,1,239,205,2,160,16,2,53,48,32,203,106,109,202,108,-209,47,209,73,243,2,52,52,56,215,189,224,119,2,97,99,51,125,239,238,-2,2,83,117,98,2,115,117,109,2,112,116,105,2,111,110,32,2,99,104,-101,2,99,107,32,2,102,97,105,2,108,101,100,143,250,249,104,9,97,169,-246,102,18,217,40,240,27,4,65,17,64,200,64,62,133,254,115,82,2,89,-32,83,64,148,129,145,233,38,1,209,220,227,59,1,97,103,229,158,3,228,-165,1,228,162,5,236,40,3,192,251,241,102,12,228,181,8,128,51,197,51,-245,47,1,224,32,7,100,217,192,26,178,95,160,26,171,203,34,106,97,237,-224,9,1,249,170,9,195,77,233,59,0,170,21,239,120,11,229,145,3,224,-238,18,172,56,225,54,4,250,51,4,224,31,5,250,53,2,175,107,195,222,-224,91,0,224,63,5,193,78,239,93,9,224,13,7,224,58,8,250,115,15,-129,137,219,248,227,22,10,128,26,160,154,247,96,4,231,17,7,244,16,0,-227,243,2,225,184,5,229,39,1,225,80,30,194,243,235,187,0,226,63,13,-226,3,4,233,164,4,161,98,244,111,5,225,23,3,198,240,117,204,224,220,-0,230,68,3,224,46,4,224,194,2,248,76,9,229,132,0,165,118,120,232,-109,63,130,83,2,51,53,54,228,130,3,231,188,8,224,198,4,252,95,9,-229,230,3,193,164,230,226,2,239,179,5,160,145,228,136,9,128,31,129,118,-224,27,6,227,109,0,44,22,104,138,239,179,1,109,24,224,4,1,223,79,-244,200,23,2,102,114,101,2,101,84,121,2,86,97,114,2,115,58,32,244,-200,3,112,134,230,132,3,64,76,36,141,241,157,2,177,156,32,4,176,18,-128,6,68,190,206,245,2,89,32,67,222,9,97,22,228,153,3,240,182,11,-164,89,225,214,11,192,25,107,248,165,247,230,205,5,64,8,96,31,176,208,-230,112,4,252,120,0,233,70,8,241,171,6,230,91,5,254,79,14,65,201,-228,222,2,251,215,1,233,214,0,234,76,1,230,247,6,200,38,231,28,3,-231,71,3,254,224,3,246,60,11,238,63,4,224,187,3,179,167,241,190,2,-225,7,35,242,226,0,2,57,53,49,225,9,5,224,40,2,211,51,198,228,-140,106,193,212,230,233,13,112,76,49,61,251,10,0,254,73,2,224,245,5,-164,228,128,179,245,108,0,245,178,0,229,246,6,128,13,210,9,128,143,217,-104,238,53,2,112,198,224,110,7,224,177,0,2,51,55,48,32,36,2,52,-48,48,35,102,122,200,192,112,134,103,2,51,49,57,167,164,227,62,5,2,-79,32,35,2,51,53,32,166,182,131,47,2,49,52,56,224,136,2,173,77,-249,13,5,236,25,1,248,245,8,145,239,234,5,9,224,25,0,231,244,2,-145,63,233,10,4,230,23,9,132,210,172,56,129,210,225,4,7,243,207,1,-224,19,0,64,186,141,243,2,85,32,67,244,55,14,32,25,205,252,244,88,-14,195,163,234,239,4,230,230,4,244,130,8,205,146,242,161,0,2,95,56,-52,2,52,32,102,228,165,0,2,45,62,34,97,243,224,21,5,2,80,114,-105,2,109,105,116,2,105,118,101,2,115,46,45,128,32,224,89,5,244,186,-8,225,160,1,238,70,1,240,169,12,227,73,0,229,244,1,65,198,228,190,-0,64,160,245,247,2,73,206,101,26,32,21,172,184,197,54,193,132,96,117,-236,12,0,225,64,0,235,25,7,187,230,239,98,3,224,36,18,64,92,64,-8,32,91,64,100,239,24,2,231,239,5,230,188,4,138,35,226,79,6,237,-136,4,246,77,14,255,41,9,232,26,21,138,5,233,107,17,224,31,6,233,-107,0,2,83,32,67,224,169,0,233,39,10,160,54,229,75,4,163,100,107,-186,246,5,2,226,217,0,55,79,249,128,4,193,153,249,150,0,233,145,12,-231,224,9,252,77,2,224,13,5,224,56,12,232,26,6,239,229,2,245,166,-0,227,198,4,231,184,0,247,155,5,32,44,226,13,4,234,49,6,225,8,-9,204,196,64,254,168,56,225,10,13,233,167,0,128,121,246,81,3,209,54,-241,48,9,224,220,5,227,60,8,2,57,50,51,224,32,0,240,255,5,254,-151,21,226,72,3,97,49,65,159,70,2,64,155,96,159,238,82,10,109,248,-173,173,195,243,232,233,15,2,99,97,110,2,110,111,116,2,32,117,110,2,-105,102,121,168,234,229,237,5,2,56,51,54,229,237,12,224,66,1,2,32,-97,110,2,100,32,34,132,104,128,45,236,183,13,226,93,6,67,158,142,15,-254,167,2,231,45,2,35,206,232,30,0,187,102,255,245,1,2,54,54,32,-128,65,142,18,188,225,155,145,128,8,220,242,84,236,152,216,2,48,54,53,-213,73,64,62,243,244,4,229,52,2,2,126,34,32,96,34,135,198,255,71,-2,224,156,5,171,19,240,21,3,133,80,64,104,32,119,228,234,11,64,251,-229,96,0,226,95,8,243,150,2,226,95,23,240,180,4,101,105,2,54,48,-32,240,45,5,228,120,1,229,163,3,67,1,107,58,196,11,2,48,53,55,-243,111,7,226,70,44,2,121,99,108,2,105,99,32,226,64,10,72,167,98,-72,2,57,57,48,128,71,226,73,18,2,61,32,34,226,71,15,238,53,7,-240,68,5,225,143,0,228,179,1,220,155,128,224,253,198,1,97,142,192,141,-161,151,136,153,227,185,21,225,33,16,2,57,55,57,233,161,2,143,138,2,-48,54,49,202,132,224,233,13,2,101,114,114,2,111,114,58,193,48,96,132,-136,99,65,242,2,80,32,102,224,41,0,2,116,121,112,2,101,34,32,2,-64,64,102,224,17,0,2,107,105,110,145,98,224,18,1,2,115,111,114,86,-178,224,18,3,2,114,101,97,2,108,109,34,163,37,184,154,241,119,38,2,-53,57,32,128,62,135,161,177,119,133,71,241,92,4,239,18,5,239,15,17,-246,132,1,241,67,24,165,111,237,14,12,198,234,231,59,15,98,42,238,47,-11,130,244,238,29,6,233,112,4,48,207,239,115,38,251,155,0,246,205,9,-239,16,8,237,60,26,187,13,224,133,1,242,8,1,61,175,32,195,191,238,-238,86,1,65,165,98,55,110,76,225,95,1,241,229,15,161,132,238,104,18,-235,161,6,225,123,41,228,160,6,195,157,132,22,35,150,235,112,3,227,201,-10,66,139,191,53,232,9,2,163,202,244,85,6,111,119,196,111,33,30,2,-55,51,50,128,69,97,225,192,77,227,190,2,242,212,6,90,194,99,183,224,-59,1,2,50,53,52,127,174,173,80,224,65,0,178,52,225,23,12,248,180,-0,225,90,15,194,59,233,78,8,238,223,7,187,189,162,14,224,78,15,214,-163,224,213,8,192,24,98,163,225,43,6,226,128,16,224,46,13,225,54,14,-129,53,161,114,225,183,10,224,23,13,252,141,0,224,99,3,239,156,9,224,-132,9,226,245,3,66,237,136,50,252,220,7,174,74,188,214,86,200,252,214,-0,229,249,0,108,133,236,198,0,64,75,200,60,101,233,151,3,204,195,192,-39,64,38,136,44,224,112,4,253,66,1,224,107,3,64,44,136,54,253,32,-12,221,26,253,23,58,224,29,20,224,26,17,224,23,14,253,101,2,160,197,-200,168,45,53,232,173,5,245,53,3,232,173,17,245,181,3,243,157,2,188,-41,239,115,14,253,19,5,162,249,244,161,0,116,143,160,11,235,204,0,2,-56,55,52,249,251,3,233,170,0,234,74,5,105,32,74,76,144,211,2,55,-56,53,238,199,4,201,80,228,107,2,234,109,3,210,48,96,7,130,177,241,-96,2,166,66,227,191,1,243,132,11,134,119,161,90,222,83,220,242,121,128,-242,45,21,35,0,241,12,5,242,166,8,242,26,0,242,22,13,240,209,9,-64,146,97,225,229,125,7,71,39,166,99,227,100,21,2,52,57,32,227,100,-9,175,247,64,239,201,126,129,154,64,114,136,133,53,32,35,26,127,161,134,-216,64,26,168,97,227,53,11,227,61,7,227,65,30,226,211,1,32,95,64,-171,194,207,129,160,176,14,237,107,1,254,175,6,191,30,235,252,1,249,71,-36,224,89,0,240,11,22,227,39,1,236,68,0,232,70,15,204,1,240,52,-20,230,70,8,229,114,8,136,252,255,222,1,239,198,6,234,226,3,188,26,-235,205,0,231,93,8,230,84,16,129,6,165,208,249,59,3,228,61,4,241,-92,29,241,165,3,231,89,196,251,110,18,241,40,9,209,82,228,92,7,228,-157,2,234,213,0,237,53,19,243,213,10,2,52,53,32,241,238,7,226,135,-4,165,106,2,51,49,50,228,19,4,226,84,17,224,121,5,255,109,5,162,-94,230,41,6,103,227,250,158,12,192,140,243,142,3,241,31,2,251,86,2,-253,24,1,226,201,6,227,224,4,226,131,4,230,51,9,121,148,32,205,46,-16,37,227,128,154,165,64,225,129,1,32,2,141,249,224,104,7,193,4,97,-14,101,141,96,11,2,54,48,48,224,66,4,128,60,224,36,3,192,211,160,-25,70,103,110,84,247,131,4,237,218,1,2,98,97,100,2,32,115,121,2,-110,111,110,2,121,109,32,2,117,115,101,223,110,96,169,64,69,230,0,14,-233,79,2,204,62,101,27,177,132,33,115,37,206,32,19,2,90,32,90,229,-41,3,247,169,1,97,109,254,82,39,217,155,237,246,29,236,122,56,173,43,-236,134,1,135,86,65,88,228,182,0,161,171,185,74,200,227,2,80,32,75,-230,228,1,226,88,4,132,195,253,200,1,232,213,1,32,11,130,213,32,97,-102,232,98,61,252,155,3,225,134,8,97,221,227,169,4,229,69,26,96,50,-140,144,192,44,238,116,30,229,56,26,238,231,29,228,226,21,251,216,2,139,-211,253,110,2,233,25,1,241,52,0,62,82,207,138,2,56,55,57,253,228,-1,98,160,93,157,240,218,2,2,117,98,115,116,159,2,109,112,108,2,101,-109,101,2,110,116,101,144,252,199,217,139,195,125,117,64,14,139,171,32,14,-2,52,32,90,224,1,4,255,35,0,128,54,139,166,131,132,73,209,32,6,-33,111,64,25,138,250,224,128,1,2,100,105,99,81,91,64,26,242,38,1,-251,75,7,201,151,229,25,7,228,54,0,192,247,153,136,130,4,179,30,146,-36,2,48,52,49,99,150,251,54,8,64,158,32,117,91,93,32,47,160,230,-137,74,96,110,106,139,32,88,2,51,32,102,245,213,6,2,45,104,97,2,-112,112,101,2,110,34,32,160,72,137,100,250,196,134,2,61,62,34,250,196,-21,160,32,250,196,31,76,97,65,26,65,22,225,21,6,224,84,2,2,84,-121,112,133,55,64,49,246,133,4,110,3,34,23,2,57,56,51,135,84,65,-206,2,57,56,52,115,233,2,56,50,32,224,129,0,75,23,93,235,105,15,-116,174,64,75,130,142,236,134,3,65,247,224,79,15,149,90,244,157,3,2,-50,57,54,98,141,93,73,96,80,130,208,241,221,25,134,73,128,20,234,175,-1,229,141,4,224,26,12,133,123,229,83,9,96,22,130,43,165,56,192,149,-241,76,21,164,168,224,44,2,241,56,20,130,232,233,189,10,192,24,226,69,-1,128,7,224,40,8,226,110,7,159,48,230,118,0,224,12,1,2,95,57,-52,32,84,96,161,74,198,238,12,5,224,175,0,228,41,4,130,240,178,139,-32,33,64,229,160,76,2,55,56,56,224,67,6,135,128,197,240,224,253,7,-243,112,13,242,54,138,128,254,229,238,21,225,34,2,226,57,9,242,32,4,-33,8,143,162,97,15,2,89,32,66,167,103,228,68,1,168,250,135,18,64,-53,116,32,225,63,2,198,126,221,0,230,225,1,224,101,0,143,149,160,52,-224,60,2,224,172,4,242,73,6,64,35,165,205,2,80,32,35,96,181,32,-121,64,24,208,252,169,207,34,55,32,50,64,24,133,255,99,249,142,253,2,-48,51,49,128,25,215,187,250,107,0,2,51,48,32,96,24,165,168,101,227,-2,55,52,55,248,3,3,2,91,93,34,160,137,133,152,131,34,224,5,1,-128,237,32,238,202,94,135,89,114,166,64,9,2,83,32,83,69,83,55,148,-132,181,251,0,9,230,30,0,96,52,128,154,130,177,80,235,234,87,8,2,-99,111,109,2,112,111,115,2,101,83,101,152,75,185,172,2,48,50,55,32,-54,2,53,52,48,185,189,102,226,130,227,139,181,42,224,200,205,65,106,71,-249,225,106,6,2,50,57,32,165,21,251,155,6,224,149,5,128,144,224,143,-1,2,104,97,115,2,70,105,101,2,108,100,34,195,161,2,48,55,32,96,-78,229,176,0,224,78,36,2,115,101,116,224,78,13,133,179,134,162,32,14,-33,79,224,64,3,44,249,64,198,249,89,3,2,99,67,111,2,110,69,114,-57,192,161,192,69,226,230,65,2,225,161,0,196,43,103,250,2,55,57,48,-129,157,97,64,2,48,50,51,250,32,20,32,97,2,116,114,111,2,108,46,-69,2,120,99,101,2,112,116,105,2,111,110,46,2,73,110,116,2,101,114,-110,2,97,108,46,232,254,0,234,221,7,2,50,52,32,170,129,104,90,251,-106,20,2,44,32,97,2,116,32,34,161,9,72,115,2,56,54,50,241,46,-0,65,2,128,207,236,148,0,163,204,106,131,102,19,96,206,2,95,57,48,-168,253,96,213,2,53,48,52,128,118,2,53,48,53,97,142,60,143,226,134,-5,161,160,224,231,2,2,104,97,114,128,134,242,12,0,64,198,99,127,35,-150,66,96,35,194,64,21,201,124,253,141,12,78,202,217,25,254,119,6,171,-191,224,21,8,232,186,4,2,50,50,32,243,33,3,232,107,0,244,149,7,-238,84,1,180,132,255,165,1,224,29,7,238,122,1,168,8,244,95,1,132,-202,84,71,65,153,2,54,32,67,73,242,206,114,32,133,32,204,132,70,40,-51,165,118,67,223,70,95,2,95,51,50,197,250,101,242,105,143,122,181,36,-188,2,90,32,67,33,175,78,58,161,12,227,8,13,2,78,101,115,43,69,-2,32,102,105,35,12,2,115,32,110,63,254,2,97,108,108,2,111,119,101,-235,88,1,225,11,4,73,180,254,83,7,245,44,3,141,49,78,61,224,50,-6,160,162,194,67,174,213,224,154,10,226,170,21,2,101,120,116,2,114,97,-32,96,173,2,40,115,41,162,180,32,48,2,52,49,56,206,230,131,162,228,-179,2,32,15,172,84,160,32,161,53,237,212,1,235,170,9,224,26,6,106,-96,167,9,143,183,208,227,131,11,115,28,246,61,1,163,37,236,217,19,132,-117,111,99,128,149,2,57,51,56,32,33,119,19,238,42,2,255,235,0,131,-13,254,22,1,166,17,2,85,32,80,32,32,229,106,15,166,112,2,53,55,-53,164,132,64,20,134,96,129,25,97,52,32,248,64,24,65,54,128,24,64,-47,99,171,120,207,2,57,51,49,128,78,64,45,150,38,106,130,32,112,144,-29,225,57,2,2,67,32,79,231,99,1,224,25,5,100,0,193,28,64,123,-32,135,197,172,198,81,160,57,252,48,7,227,208,1,226,227,1,201,140,242,-68,8,129,113,226,250,11,137,154,229,187,4,2,111,114,100,2,32,119,105,-2,108,100,99,2,97,114,100,226,252,9,138,194,224,194,0,81,7,200,178,-232,209,0,71,123,98,14,64,207,224,254,0,248,20,2,193,229,225,197,1,-87,64,33,71,64,72,2,65,32,64,2,64,65,32,96,20,166,54,96,74,-100,117,107,253,64,25,232,155,1,238,107,10,233,52,0,225,52,4,164,86,-96,124,98,65,242,154,4,248,143,4,96,168,249,133,13,64,124,133,127,2,-75,32,66,244,44,9,148,4,136,163,145,2,155,46,224,74,4,32,167,147,-214,227,94,3,64,88,133,194,216,0,239,153,8,64,34,216,150,33,238,133,-247,64,203,161,10,69,199,192,7,64,173,64,29,226,217,0,230,99,0,134,-97,32,27,91,238,232,38,42,2,103,101,116,232,38,12,2,48,56,32,129,-173,203,174,241,146,0,133,241,220,204,96,11,231,236,0,103,32,228,159,0,-231,12,22,2,80,114,111,2,120,121,34,164,13,224,156,2,64,125,220,171,-103,22,130,105,138,174,64,131,253,17,3,32,17,96,29,64,8,33,122,64,-33,176,236,98,51,34,173,36,51,92,166,144,74,64,35,199,109,64,55,129,-117,64,66,235,28,2,97,206,160,110,129,161,238,225,18,2,50,52,55,64,-12,99,132,238,225,0,246,124,12,2,57,50,51,243,248,3,231,82,3,89,-159,229,122,1,101,98,109,201,64,117,35,225,248,239,2,129,125,185,175,242,-135,1,88,193,224,5,6,247,59,7,134,184,96,59,238,85,13,228,112,0,-128,24,143,187,166,86,2,54,57,57,97,101,219,152,242,3,5,176,25,177,-232,99,214,66,12,70,51,64,73,2,80,32,95,2,55,50,32,76,89,104,-119,2,57,53,55,133,201,230,42,2,246,111,2,199,115,150,116,32,69,219,-115,160,211,64,162,246,66,0,141,71,65,252,249,228,0,181,235,130,71,131,-78,2,80,32,58,128,33,228,101,0,225,156,10,192,216,247,109,3,96,42,-221,138,232,212,4,96,153,102,236,96,244,225,103,0,207,47,224,40,0,32,-89,96,238,231,124,4,2,58,57,57,131,174,244,218,0,224,238,1,76,127,-99,50,32,36,131,132,68,155,224,178,19,224,210,0,128,106,247,122,1,2,-57,57,54,131,121,2,57,53,52,224,120,0,227,90,1,208,106,72,93,204,-240,252,208,4,64,46,131,111,2,90,32,85,96,144,191,239,251,29,0,132,-252,133,170,32,30,131,93,224,167,1,2,55,51,54,77,185,231,204,0,130,-148,233,77,6,98,66,2,55,51,55,128,15,231,64,0,2,52,54,56,100,-223,93,127,2,57,57,49,253,126,2,225,76,4,68,126,170,65,234,76,14,-64,158,64,209,32,159,229,146,0,245,46,6,245,52,8,128,251,131,252,253,-167,0,72,10,253,137,24,224,32,23,224,29,20,224,26,17,224,23,14,224,-20,11,224,17,8,224,14,5,224,11,2,235,188,1,70,218,254,66,0,225,-3,4,198,144,69,24,144,133,64,21,190,193,87,250,115,221,145,130,236,31,-1,224,9,2,68,112,164,5,2,51,48,50,68,207,67,149,224,6,6,105,-220,64,3,100,163,192,76,32,5,43,104,2,51,48,48,160,28,119,102,224,-106,18,108,227,224,108,1,66,51,96,114,224,108,31,2,82,32,95,224,108,-24,161,51,74,31,128,34,224,110,6,160,103,224,117,2,224,106,9,224,63,-3,224,113,2,173,41,131,39,192,147,224,40,0,224,108,18,224,115,2,128,-67,224,61,13,160,106,43,236,2,57,32,102,231,134,0,2,92,51,52,2,-38,115,114,2,99,47,77,2,105,99,114,2,111,72,115,2,47,84,67,2,-77,111,110,2,97,100,46,2,104,115,92,32,25,2,44,49,55,2,52,58,-53,237,42,2,118,24,68,125,166,242,2,56,54,32,224,11,1,231,10,2,-52,48,192,11,2,53,57,32,192,10,2,54,48,32,160,10,2,58,57,56,-203,142,66,124,2,53,56,32,64,18,132,240,251,23,1,224,9,1,96,33,-35,224,140,79,86,197,32,46,176,203,224,46,10,224,56,2,60,222,224,56,-1,224,63,5,182,110,224,53,10,224,149,1,224,52,8,165,3,51,19,226,-59,3,183,245,193,161,96,51,128,50,224,6,6,224,33,0,64,13,224,91,-4,224,33,14,160,26,224,40,3,224,33,13,224,40,3,69,45,69,56,119,-122,32,180,234,229,1,232,151,16,96,242,51,102,171,67,69,149,90,156,230,-22,0,238,177,15,2,97,115,115,2,101,114,116,66,54,2,100,101,58,2,-32,101,120,2,112,101,99,47,112,2,61,34,32,253,17,2,249,254,1,121,-241,45,112,32,154,139,183,42,32,70,157,2,79,32,95,120,112,64,7,73,-70,96,7,32,152,229,148,0,241,223,21,2,103,111,116,160,113,128,98,160,-93,196,198,73,172,102,198,133,229,32,16,165,219,2,49,50,52,32,17,225,-78,0,2,55,32,102,224,84,0,2,84,67,69,2,120,112,114,153,175,224,-25,7,249,81,0,224,26,9,2,75,105,110,235,77,0,224,26,6,2,83,-111,114,212,108,32,120,99,44,145,3,53,19,160,11,32,153,133,113,199,7,-65,137,41,55,33,176,107,238,2,57,55,56,239,102,0,231,44,1,240,108,-18,225,54,19,2,77,117,108,2,116,105,112,2,108,121,32,2,100,101,102,-2,105,110,101,2,100,58,32,160,184,2,51,50,57,96,246,143,173,32,147,-165,239,2,51,57,55,2,32,58,57,95,172,140,134,2,57,55,55,239,95,-0,64,153,128,22,254,98,0,194,173,221,152,155,18,96,197,98,163,32,51,-200,141,40,129,78,12,96,24,128,16,226,164,12,233,6,18,233,35,14,247,-27,0,203,18,233,154,8,216,146,160,163,224,31,1,105,81,32,235,234,195,-4,76,75,64,6,99,107,234,195,0,224,94,13,36,237,233,142,3,235,140,-1,233,207,23,253,71,1,224,173,10,224,200,12,97,175,234,124,10,96,130,-241,249,6,96,23,67,129,2,55,52,32,195,32,75,193,145,73,36,214,128,-239,99,134,131,132,64,6,96,79,254,173,7,2,99,99,32,226,214,3,32,-38,69,246,96,87,129,47,129,52,41,184,192,21,2,57,55,48,224,11,2,-224,133,0,32,6,67,181,96,11,32,141,132,174,237,118,1,97,11,114,132,-32,76,129,210,187,102,107,167,237,8,2,64,68,35,46,2,53,56,50,130,-105,2,54,55,32,224,6,7,32,95,234,8,0,2,50,32,75,2,52,32,-65,162,140,237,236,9,224,114,4,224,101,4,2,55,50,50,224,101,14,32,-72,227,194,0,224,72,26,2,53,56,49,224,72,17,131,119,246,4,0,224,-69,3,128,60,68,14,224,60,5,2,58,57,54,240,10,2,192,46,189,194,-2,54,54,32,171,31,235,41,14,192,66,131,203,112,188,235,28,4,32,26,-195,178,71,32,2,49,49,52,67,181,32,86,225,79,0,235,77,7,32,29,-130,91,32,27,82,9,98,73,128,14,79,147,98,95,102,154,197,154,66,118,-96,76,235,155,12,32,31,202,146,142,123,82,108,112,93,108,40,40,107,236,-40,0,32,42,196,183,171,193,235,69,5,119,41,235,179,15,235,214,93,235,-116,4,2,58,57,53,225,185,1,2,57,51,55,213,239,117,56,2,53,49,-48,170,75,2,79,32,80,91,146,67,70,69,206,32,15,66,244,71,67,244,-109,0,64,29,100,165,97,255,111,111,97,64,129,96,68,187,123,217,32,43,-49,148,2,51,32,102,241,147,2,2,105,109,105,2,116,105,118,2,101,115,-46,227,213,0,32,48,129,242,224,38,12,166,238,32,36,197,185,224,189,21,-66,252,121,40,224,196,0,2,52,49,32,133,131,32,22,96,20,74,219,144,-43,96,180,224,48,9,102,10,224,48,2,128,242,224,48,18,142,41,224,48,-1,101,115,224,48,19,99,166,224,48,2,99,118,224,48,1,217,236,96,27,-98,127,224,42,1,129,114,64,162,225,114,0,168,190,225,163,11,65,56,131,-30,48,164,96,32,65,153,2,57,53,50,64,74,134,112,224,10,1,96,128,-32,37,189,153,2,57,53,49,64,51,212,68,159,241,96,5,32,26,64,198,-71,189,225,180,12,2,45,62,34,145,34,64,66,244,82,1,125,231,212,82,-64,66,226,38,0,2,58,57,52,130,154,115,247,32,13,162,66,161,46,103,-186,65,8,226,37,15,96,112,32,34,130,35,224,34,12,2,78,97,116,128,-35,129,14,226,147,13,2,121,109,98,2,111,108,34,96,38,129,42,224,38,-12,60,78,2,115,116,114,2,97,105,110,160,81,222,201,226,239,20,233,183,-0,32,48,129,82,224,38,12,169,249,32,36,184,123,65,45,129,106,32,19,-196,111,38,1,224,61,1,2,98,117,105,41,103,2,110,34,32,2,64,64,-35,32,32,64,3,2,58,57,51,201,68,119,239,117,224,67,41,140,143,241,-147,0,178,204,32,95,96,100,41,194,2,57,51,54,167,106,224,18,7,32,-63,129,129,108,154,134,49,123,43,224,9,0,171,138,243,215,2,2,57,51,-53,224,6,1,138,151,108,54,96,81,32,80,197,215,108,219,140,222,2,60,-32,64,102,46,214,26,160,18,120,150,47,173,2,55,52,49,252,156,1,252,-117,4,96,200,232,64,5,54,125,2,73,100,101,97,166,120,141,2,90,32,-95,224,138,1,2,85,32,73,160,214,216,31,32,28,141,203,106,111,72,207,-253,35,2,190,6,136,22,125,150,249,228,10,64,7,131,68,64,73,234,173,-7,148,56,186,227,96,82,204,255,129,58,167,116,108,175,173,36,67,36,197,-189,64,89,179,90,85,208,133,235,224,87,1,245,238,1,101,255,248,176,1,-161,90,213,63,128,115,192,251,130,101,116,33,74,203,64,126,101,32,2,51,-53,51,97,79,75,48,32,38,248,25,0,231,19,10,59,50,231,19,2,74,-42,231,19,7,216,107,242,219,194,242,206,9,32,250,204,161,225,37,12,111,-176,225,37,0,163,74,232,57,7,136,51,225,43,173,225,18,7,32,229,233,-183,0,201,230,245,13,13,32,41,131,131,85,58,250,204,2,224,39,6,32,-38,131,147,32,38,47,86,192,39,234,9,1,77,196,132,79,228,24,3,176,-182,255,78,5,129,114,237,34,7,188,104,191,102,32,13,246,6,0,151,69,-2,57,50,49,108,122,95,17,196,132,128,121,227,155,1,225,252,2,185,20,-162,1,90,182,246,100,0,195,158,2,95,52,51,104,143,154,21,32,72,131,-144,234,234,4,246,66,14,32,44,234,127,8,125,216,246,68,204,246,63,10,-2,58,57,49,198,229,224,244,26,225,24,207,158,106,225,18,1,228,132,4,-2,55,51,49,101,123,80,95,97,62,32,32,132,122,236,255,5,248,165,17,-191,87,224,79,4,103,174,64,119,70,69,32,34,175,220,2,55,50,57,41,-187,190,241,168,121,207,70,224,2,3,188,94,225,22,6,186,162,100,73,2,-54,53,55,240,199,2,125,136,75,235,2,55,49,51,253,0,4,96,145,131,-105,167,58,74,1,66,42,177,56,32,141,253,123,1,154,143,151,114,231,21,-0,136,93,96,121,149,104,224,25,6,99,173,67,196,232,160,5,129,5,232,-161,4,96,115,99,183,231,145,0,68,206,224,12,0,149,1,224,50,5,67,-244,224,50,5,157,38,231,52,3,189,142,230,31,2,239,223,3,182,86,178,-95,228,170,1,232,9,2,64,47,200,8,200,100,189,4,168,12,232,44,2,-221,221,126,31,137,208,102,185,228,242,3,33,232,136,150,240,56,0,96,34,-2,54,57,56,193,97,192,16,65,154,178,77,95,241,2,95,54,55,150,101,-65,204,128,11,253,20,5,220,176,226,250,6,133,124,2,53,55,55,193,18,-32,152,98,246,192,211,224,130,1,162,55,160,186,2,54,54,56,224,117,0,-224,206,4,128,171,224,131,4,194,84,137,231,254,16,1,233,107,3,131,28,-192,130,224,50,1,185,27,243,86,0,225,50,8,65,51,234,184,2,141,176,-241,227,1,241,47,13,2,95,55,54,128,45,105,172,236,90,6,2,36,102,-34,224,140,0,2,89,32,66,160,156,203,131,64,144,32,7,64,50,245,162,-20,2,36,120,34,246,213,2,2,49,52,56,225,14,5,224,162,24,244,19,-0,253,35,0,129,225,225,87,0,235,0,2,206,218,226,171,14,96,16,225,-91,0,251,106,0,67,45,164,149,228,156,1,227,12,2,97,112,255,171,2,-231,155,6,160,51,97,65,224,0,0,236,110,6,137,167,227,153,4,65,7,-227,203,7,224,169,0,47,138,226,122,1,66,135,228,142,2,2,54,54,57,-227,81,7,65,69,68,183,64,164,2,51,53,50,129,152,104,12,176,182,66,-28,149,42,160,223,228,55,6,161,100,228,156,9,182,179,224,206,6,64,74,-224,206,6,76,243,228,154,8,228,117,3,132,118,224,225,17,128,77,236,162,-0,101,170,96,216,98,232,150,57,77,64,2,48,54,32,248,31,5,240,161,-1,131,215,224,193,6,173,17,224,174,6,229,73,9,128,159,95,33,104,225,-96,11,160,13,224,177,1,128,9,64,174,226,5,3,97,146,35,233,2,48,-32,79,2,32,35,55,249,242,1,230,232,4,224,94,3,253,71,1,228,116,-4,134,64,229,154,0,195,236,130,126,161,233,224,123,7,229,91,11,44,17,-2,57,49,48,227,36,1,250,193,3,66,240,32,58,33,174,58,159,120,221,-96,165,238,58,1,133,58,2,51,50,52,134,230,36,82,156,8,96,21,115,-174,199,66,245,186,1,80,16,227,1,3,39,20,138,173,82,18,70,201,188,-163,231,174,1,47,124,47,193,34,205,66,173,254,169,3,225,189,2,92,188,-48,242,64,135,2,56,56,55,141,18,69,227,64,6,198,37,78,58,64,234,-253,4,0,255,80,1,198,156,129,89,230,72,11,248,138,1,226,121,8,68,-239,65,54,64,78,128,144,198,52,201,31,142,240,195,27,231,64,0,129,184,-230,95,1,224,29,5,230,54,5,160,7,226,62,1,248,152,2,2,101,113,-34,172,243,230,65,1,224,87,1,225,246,7,231,17,0,228,41,0,160,225,-230,99,0,151,121,255,151,0,100,250,145,72,97,129,65,18,130,78,229,146,-4,97,216,96,40,37,216,101,125,197,149,231,116,26,230,78,16,230,76,1,-200,123,232,141,1,229,103,0,230,91,54,34,51,64,19,226,163,7,34,46,-66,59,125,73,129,247,232,75,2,251,234,6,226,7,157,154,49,2,48,55,-32,193,236,117,215,134,37,2,95,56,53,96,245,213,237,128,39,225,167,4,-164,163,225,148,117,65,149,212,57,233,220,7,226,101,8,226,85,6,215,226,-64,217,147,76,37,69,34,194,32,98,197,33,234,235,3,139,162,225,159,0,-229,134,0,68,147,175,76,228,64,2,96,139,48,57,201,246,227,80,2,107,-22,192,57,99,128,68,151,69,36,170,194,137,229,227,20,5,96,13,144,60,-101,202,172,116,2,57,50,32,233,198,1,2,56,52,56,233,147,2,234,82,-2,85,81,69,176,165,213,41,17,2,56,32,102,225,8,1,194,40,168,38,-2,56,52,50,102,1,87,125,65,50,230,140,1,33,43,141,113,228,64,3,-166,140,2,55,51,48,233,36,1,225,9,3,74,163,224,13,0,234,152,1,-173,165,224,40,2,180,4,2,57,48,50,97,16,102,70,2,51,57,49,238,-79,0,224,207,4,2,55,51,57,105,247,253,220,3,113,89,134,0,204,60,-230,158,0,224,244,8,130,107,32,209,142,32,124,49,195,82,65,38,70,236,-68,183,224,50,1,55,90,2,116,114,111,2,108,46,69,2,120,99,101,2,-112,116,105,2,111,110,46,2,73,110,116,2,101,114,110,2,97,108,46,2,-112,97,116,64,9,2,77,97,116,2,99,104,70,2,97,105,108,196,175,131,-76,209,119,104,117,130,220,2,56,54,50,196,84,206,146,2,80,32,35,137,-10,64,20,142,25,225,53,3,2,95,56,57,231,77,0,2,57,48,49,110,-220,64,228,111,46,196,122,33,81,86,176,32,47,239,46,3,230,195,6,32,-6,2,56,52,51,131,146,65,94,79,109,114,220,227,110,1,161,73,130,193,-2,56,57,55,167,224,224,46,4,126,57,195,156,37,1,68,6,213,253,192,-111,231,81,16,130,250,224,5,3,233,136,0,229,44,1,227,75,2,139,128,-240,201,11,233,178,5,228,50,3,226,164,9,238,123,6,224,77,8,224,75,-5,237,14,0,164,200,238,133,5,224,5,3,96,158,232,16,1,248,22,3,-228,59,1,106,183,238,59,9,32,83,248,38,1,237,129,2,233,214,2,170,-225,230,66,2,241,121,2,166,69,224,17,0,2,83,32,73,196,111,224,52,-1,207,149,241,197,7,160,119,247,200,0,238,37,0,241,194,7,224,143,5,-224,190,0,227,193,2,239,161,4,224,56,0,229,255,0,238,206,4,225,220,-1,237,104,8,192,83,225,181,3,249,79,0,202,211,32,34,35,158,237,215,-0,237,239,1,237,108,2,100,75,2,56,57,57,64,122,209,154,160,9,230,-139,17,43,133,2,49,50,54,203,134,230,135,11,204,140,228,194,1,67,11,-216,192,2,57,48,48,64,16,227,26,1,197,244,226,134,2,227,7,4,236,-109,6,227,59,3,106,210,241,146,5,163,135,224,128,18,2,55,56,55,224,-128,5,225,71,1,226,104,4,225,99,1,102,214,174,167,128,144,224,82,5,-125,180,33,80,160,84,224,91,0,102,193,192,40,224,108,3,226,235,2,231,-76,5,64,51,90,18,239,171,10,219,235,197,172,36,218,221,156,101,24,131,-215,32,152,32,24,217,238,182,78,199,158,64,7,98,58,2,58,56,57,213,-121,175,222,128,211,64,124,224,97,1,226,233,0,224,246,17,98,71,224,246,-24,32,110,244,213,0,177,210,233,145,24,32,51,200,115,224,162,1,225,244,-1,33,65,230,217,6,249,130,13,224,13,1,205,1,164,14,244,153,1,224,-69,2,101,204,226,26,2,228,244,2,64,122,2,39,32,85,32,47,2,55,-57,32,224,176,1,2,92,51,52,2,38,115,114,2,99,47,77,2,105,99,-114,2,111,72,115,2,47,68,101,2,115,117,103,2,97,114,46,2,104,115,-92,32,25,2,44,51,56,2,53,58,49,2,48,34,32,229,112,5,243,44,-5,229,109,5,227,248,2,224,2,9,224,71,1,228,182,3,230,13,6,230,-10,4,229,190,10,128,201,244,78,0,132,174,224,85,9,133,10,229,246,5,-224,96,1,224,102,8,247,158,14,230,122,17,247,174,15,227,135,8,224,52,-26,224,195,3,224,31,11,130,5,225,95,17,246,209,13,224,23,1,247,8,-2,233,157,0,194,68,224,8,10,166,112,224,11,0,215,26,247,42,0,105,-153,195,41,128,83,228,144,4,226,239,3,240,163,6,166,61,209,194,224,76,-0,226,207,12,69,234,131,112,2,56,54,53,225,172,5,229,117,5,231,169,-4,138,154,198,90,142,162,202,43,232,51,8,245,70,3,111,4,245,70,2,-105,72,65,200,32,36,199,94,183,29,183,21,228,98,2,225,243,11,236,83,-1,242,40,0,114,205,224,144,5,165,68,147,22,196,184,196,154,229,123,1,-235,134,0,2,52,49,51,238,139,0,64,163,236,186,4,252,122,4,96,135,-145,200,224,141,4,130,81,2,95,56,55,196,124,250,95,17,226,206,7,232,-71,0,224,48,14,226,202,2,226,197,17,226,161,3,226,32,0,97,33,128,-220,32,213,253,68,6,114,176,128,200,148,157,189,42,224,138,3,226,226,36,-106,250,226,214,3,226,212,0,226,96,18,173,215,247,174,4,194,52,242,38,-4,129,149,210,213,207,49,226,67,2,240,33,0,196,166,226,73,14,193,110,-244,1,6,248,129,2,194,4,34,84,2,56,55,53,226,84,10,228,92,3,-229,191,3,176,111,228,79,3,233,247,3,224,11,12,228,24,55,230,53,7,-239,71,0,223,8,228,229,4,227,164,10,224,182,0,225,197,1,2,54,52,-48,224,60,3,226,5,8,241,202,2,224,40,0,74,55,74,172,52,59,235,-24,2,229,82,9,230,8,4,224,164,6,236,113,1,141,4,228,112,2,74,-161,79,224,242,244,6,194,46,246,236,1,96,225,72,11,129,171,228,34,1,-213,145,32,160,247,134,0,226,114,0,229,33,2,245,245,0,2,56,56,50,-240,131,2,250,5,1,2,56,56,51,234,57,0,96,16,2,50,51,57,236,-10,7,224,45,0,65,193,93,77,65,30,2,56,52,32,148,2,2,56,56,-53,234,147,0,99,196,137,72,128,178,96,16,192,100,229,96,10,163,31,66,-131,228,203,0,253,86,3,233,2,3,99,94,43,207,162,196,228,13,5,253,-1,7,129,46,228,235,9,100,23,183,188,164,247,224,39,5,132,73,192,38,-224,37,2,252,254,3,133,174,224,229,0,2,90,32,89,237,118,0,231,226,-11,222,2,32,59,235,43,3,233,250,0,237,178,1,239,29,2,164,8,237,-173,5,231,201,5,230,94,15,178,110,224,59,4,163,230,238,196,20,106,214,-236,50,2,237,226,2,230,147,3,228,84,18,235,17,1,146,37,233,72,1,-153,69,238,86,1,244,206,3,228,229,0,233,190,2,226,252,1,255,246,4,-235,6,21,224,63,0,206,121,228,74,3,174,85,251,190,0,227,144,0,179,-190,150,214,2,55,48,52,128,39,251,213,8,176,230,32,30,32,222,242,50,-0,248,118,4,89,145,248,119,2,131,96,152,125,2,56,57,50,145,194,34,-177,32,63,209,242,128,177,116,116,255,70,6,229,210,6,224,21,20,224,227,-5,224,46,8,160,35,195,205,149,18,166,138,215,218,128,84,228,228,3,99,-129,228,14,0,243,204,7,238,212,4,187,131,250,232,1,143,158,2,52,53,-52,117,138,96,66,254,156,2,225,252,11,229,133,0,236,8,0,240,163,2,-240,224,6,225,252,5,232,57,0,224,66,0,224,94,1,231,208,2,253,141,-1,109,91,36,89,2,50,57,56,248,143,3,240,56,2,194,43,96,26,32,-93,232,154,0,249,252,1,32,208,36,67,129,181,194,243,243,178,4,245,226,-5,224,5,2,202,180,231,41,8,246,40,0,250,115,11,192,25,160,90,225,-40,1,192,18,232,77,0,32,77,2,56,56,56,246,243,1,128,6,136,42,-130,148,101,192,2,57,48,32,97,123,175,70,68,210,224,14,5,2,95,54,-51,162,202,160,0,247,229,13,225,205,0,226,56,1,164,41,225,8,1,150,-175,2,56,57,49,228,42,7,247,144,7,2,110,34,32,224,22,11,2,116,-116,34,175,215,220,26,239,252,0,98,165,220,170,67,126,32,231,164,158,34,-129,124,38,161,231,188,151,225,185,3,32,80,208,100,33,25,34,166,193,177,-128,56,2,51,51,53,160,142,80,114,64,45,208,121,165,184,80,203,144,77,-241,141,0,128,238,39,39,96,107,228,144,0,231,243,0,235,190,3,130,54,-64,119,176,231,67,91,239,23,17,232,109,2,238,193,1,235,72,10,230,38,-1,233,41,6,238,249,14,224,98,12,229,29,0,183,80,163,130,229,86,4,-234,110,1,249,5,5,192,8,224,17,9,96,8,194,37,252,64,1,252,37,-4,252,38,1,224,93,1,237,76,6,224,89,1,224,8,0,2,95,55,52,-65,113,97,92,2,54,56,48,241,126,12,2,61,61,34,233,105,0,250,227,-4,237,91,1,230,255,2,228,91,4,224,16,16,123,224,66,111,82,174,130,-252,84,49,99,102,98,151,2,35,50,32,254,222,1,240,59,4,241,110,25,-2,69,110,99,2,111,100,101,2,68,97,116,2,97,46,104,145,113,2,49,-52,49,2,58,49,51,241,113,2,225,253,6,228,169,0,237,118,14,224,45,-28,224,22,0,193,234,249,179,4,234,252,10,234,90,5,170,50,65,21,225,-148,16,53,102,2,54,48,32,252,65,1,225,143,9,245,44,5,226,160,3,-226,122,4,237,113,1,234,97,3,234,227,4,165,109,197,187,35,113,147,174,-57,108,32,11,147,134,35,201,68,17,88,215,128,3,2,80,32,90,32,1,-164,89,229,234,8,65,222,32,53,2,95,52,57,106,57,66,214,2,90,32,-66,133,68,134,175,160,14,230,105,6,234,119,4,202,72,65,158,2,75,51,-32,192,24,224,55,11,32,15,58,46,171,107,32,126,136,126,225,158,5,66,-100,32,26,200,89,100,162,156,165,196,18,233,141,3,242,187,7,230,121,2,-248,195,10,2,85,32,73,233,251,2,234,222,24,246,111,16,169,208,214,11,-49,183,39,51,33,123,2,56,54,52,75,76,140,74,64,197,135,74,2,80,-32,58,108,184,64,235,241,103,0,233,113,4,96,162,101,106,224,184,15,75,-195,181,241,234,253,0,224,149,0,96,57,172,14,192,36,224,37,9,96,24,-221,121,237,120,4,2,67,32,79,235,211,2,246,236,3,32,184,134,90,230,-171,7,2,51,53,50,32,8,37,254,227,246,1,2,99,111,110,2,65,114,-105,2,116,121,34,225,24,2,36,23,226,54,4,96,132,32,84,198,129,32,-33,71,227,66,38,32,22,32,45,232,122,6,231,123,2,96,44,127,14,235,-184,0,199,11,36,127,67,112,129,37,2,55,49,32,97,124,64,88,230,229,-7,133,153,175,144,224,95,0,96,64,192,53,214,207,239,7,0,32,5,64,-107,175,92,32,31,205,203,176,11,64,146,37,55,64,89,238,184,7,158,172,-96,86,190,110,252,50,1,129,225,227,32,3,202,98,38,63,78,104,99,7,-76,150,32,55,2,75,32,89,231,17,0,247,36,1,226,61,9,224,25,12,-2,50,49,32,241,124,0,226,12,0,96,20,227,171,1,79,170,137,55,224,-37,22,230,239,3,242,67,2,226,138,4,224,48,4,2,90,32,67,224,88,-10,224,38,10,175,135,90,207,241,202,5,232,142,0,250,104,12,244,14,9,-244,13,13,130,246,238,115,3,224,49,13,236,155,3,241,159,13,32,42,140,-77,199,14,225,64,18,243,209,2,225,63,3,229,17,1,132,40,84,162,229,-136,0,228,31,15,100,85,224,25,12,96,76,129,38,224,25,6,96,168,192,-25,251,131,5,99,10,224,184,16,96,30,224,185,11,81,57,252,64,8,225,-133,9,64,120,225,133,8,237,111,6,161,72,224,88,5,162,6,2,54,54,-32,252,169,6,224,164,10,245,248,3,224,163,13,225,21,13,96,91,225,21,-12,252,152,2,224,111,10,99,234,225,19,26,224,58,10,100,174,224,170,21,-224,59,16,64,34,224,59,22,227,249,14,226,23,16,99,100,225,1,12,164,-218,224,138,14,227,183,8,128,138,2,49,51,52,225,1,24,64,114,224,58,-10,2,56,54,55,36,79,79,98,225,7,24,112,122,224,65,10,232,211,2,-226,234,13,226,233,21,228,226,14,224,146,1,227,221,39,229,29,2,232,242,-0,100,214,35,232,136,17,67,232,32,249,39,102,160,193,158,60,96,17,109,-179,160,17,32,48,136,55,160,48,106,92,70,196,32,24,135,151,2,102,47,-61,40,93,64,18,64,12,32,149,2,58,56,54,231,69,2,103,255,32,4,-38,160,134,98,64,6,32,34,135,27,70,208,32,88,239,8,2,197,37,246,-153,15,196,251,135,177,224,7,1,117,202,32,232,64,195,67,37,32,98,135,-72,64,95,104,151,116,139,161,12,99,220,32,34,179,93,32,1,158,51,226,-195,11,207,19,228,245,17,224,25,9,95,230,233,74,17,103,132,43,211,95,-185,2,55,52,49,200,234,75,189,119,45,224,19,2,167,109,126,113,176,189,-207,171,2,52,50,32,64,207,246,250,2,149,55,240,94,1,255,125,3,32,-7,80,12,214,241,41,166,86,120,2,53,54,32,2,64,79,32,32,174,236,-67,0,2,95,49,50,75,66,2,52,56,32,248,224,2,33,50,2,53,56,-50,98,93,32,109,65,235,45,153,2,51,32,35,240,135,3,233,237,9,97,-3,73,238,160,24,128,141,108,202,188,104,224,6,5,239,102,3,229,97,4,-214,46,183,206,225,109,9,233,83,0,234,109,10,234,48,0,160,100,128,65,-41,70,64,207,2,53,48,52,32,218,2,48,53,32,234,182,2,128,52,129,-99,117,148,129,99,253,26,5,106,2,229,181,5,224,53,0,65,166,241,121,-7,2,102,34,32,205,161,64,34,2,53,55,53,221,114,96,49,97,246,224,-50,14,224,127,8,139,65,2,95,56,52,87,180,224,150,2,177,59,229,106,-21,233,178,9,242,240,2,231,234,6,161,118,32,105,35,251,130,143,2,95,-52,48,74,150,172,96,129,221,237,25,2,180,58,233,44,11,254,106,0,224,-32,15,199,169,225,200,8,192,24,190,19,211,143,2,51,55,48,236,141,21,-207,13,64,193,79,15,34,213,249,147,0,227,154,8,65,36,48,71,2,56,-54,49,192,167,226,77,12,32,73,238,74,0,96,92,224,154,2,2,95,57,-48,65,198,225,33,5,225,95,1,226,178,33,224,154,0,196,148,238,2,13,-254,141,2,212,59,212,237,252,221,12,252,220,7,224,52,21,234,140,9,224,-10,4,224,52,13,163,67,224,41,4,249,42,5,64,42,236,115,4,226,245,-5,113,163,2,76,105,115,2,116,95,84,2,121,112,101,2,46,43,43,241,-162,0,250,206,2,194,243,227,202,3,240,186,11,195,98,228,101,8,33,199,-252,45,0,64,23,36,241,98,222,239,65,7,38,33,140,254,37,21,69,46,-37,114,128,32,32,52,156,120,2,51,48,32,160,17,32,43,139,67,2,75,-32,66,192,168,78,158,248,32,0,229,117,5,224,242,1,2,105,109,112,2,-111,115,115,2,105,98,108,2,101,58,32,160,237,173,234,148,232,128,61,69,-149,2,56,54,50,128,78,98,99,253,242,0,224,94,11,37,212,2,51,50,-32,242,23,2,64,64,252,27,1,96,174,168,9,224,218,3,166,159,241,247,-0,189,94,102,18,2,51,49,32,32,91,173,28,224,115,14,69,219,160,98,-239,229,4,230,84,3,224,56,12,67,85,230,128,14,193,100,150,104,64,6,-168,56,97,220,161,228,97,207,226,75,11,2,82,97,116,2,105,111,95,98,-76,2,95,109,107,96,13,2,110,97,108,229,141,1,99,207,32,5,99,202,-224,15,1,83,84,64,109,136,227,97,105,32,13,136,228,97,69,2,58,56,-53,136,229,72,60,129,172,73,27,90,182,2,53,54,48,64,9,2,52,53,-32,148,191,32,83,73,98,2,53,53,32,176,148,2,52,55,32,128,36,224,-37,6,66,218,160,37,224,215,24,2,73,110,116,2,101,103,101,2,114,46,-95,2,105,110,116,67,47,2,84,111,73,128,17,224,218,1,102,189,186,154,-48,173,244,26,5,32,7,188,222,224,105,30,161,67,32,110,224,106,10,229,-103,6,200,37,130,104,65,81,97,54,40,247,64,29,35,20,2,95,54,50,-128,33,164,49,32,36,137,173,161,105,66,21,66,155,2,56,53,50,32,39,-200,115,2,56,53,51,64,18,34,54,41,184,100,213,140,96,139,65,224,29,-15,32,77,131,196,2,117,113,117,2,111,116,32,32,14,131,167,2,73,32,-58,64,50,211,31,75,51,225,220,2,216,207,2,80,32,35,145,217,64,20,-129,255,253,12,0,117,175,250,53,1,133,179,247,78,1,38,15,220,19,52,-255,103,61,2,56,51,52,160,51,50,239,132,144,98,245,220,64,232,227,0,-252,17,13,2,95,55,57,195,212,39,148,131,33,2,58,56,52,130,136,70,-240,178,151,136,27,64,6,139,10,64,42,145,252,235,106,3,244,198,1,232,-2,2,64,185,248,93,1,235,189,0,133,59,221,196,192,7,246,69,1,225,-16,1,160,19,32,10,254,5,2,229,188,10,158,40,91,100,35,2,39,76,-2,49,51,32,227,147,0,2,52,54,32,82,132,165,214,83,198,96,200,128,-237,171,214,221,84,34,30,2,56,32,102,233,54,1,2,118,34,32,128,39,-130,66,243,125,0,96,252,253,31,5,151,111,198,201,241,229,2,150,137,253,-58,3,193,185,251,160,4,65,146,160,47,223,40,64,208,2,55,53,52,253,-199,5,96,29,65,49,234,101,0,128,25,116,18,64,248,243,120,0,2,56,-51,53,160,42,235,250,0,225,165,1,255,230,8,248,72,3,231,236,7,224,-187,0,152,178,250,138,1,97,151,2,56,52,52,227,230,7,2,66,111,111,-2,108,46,111,2,116,104,101,2,114,119,105,2,115,101,34,232,189,0,245,-204,3,248,50,4,97,22,2,55,55,49,164,213,224,116,2,64,23,192,232,-194,163,131,130,179,105,116,164,104,2,112,208,2,51,54,57,161,179,131,153,-128,239,251,156,0,227,91,0,251,96,0,224,17,1,192,140,227,147,0,243,-205,0,230,250,0,251,204,6,254,20,2,155,4,232,191,4,234,32,2,249,-243,6,251,160,2,255,86,14,128,146,253,207,0,228,31,2,238,200,0,224,-27,1,100,28,235,84,12,128,30,135,55,131,3,196,63,193,87,44,177,103,-63,236,177,0,228,79,8,225,174,1,226,163,1,2,39,32,80,99,112,64,-41,68,71,160,124,227,201,1,2,95,56,32,163,108,131,138,232,43,0,227,-240,0,193,85,240,228,0,234,168,1,163,101,157,123,250,194,2,99,24,253,-211,1,227,91,0,245,23,3,158,41,155,233,101,50,225,112,3,236,46,2,-163,194,225,208,5,225,95,14,253,108,1,224,16,1,62,77,64,217,96,146,-227,89,9,235,117,0,2,95,52,52,113,5,106,158,2,55,48,49,236,151,-3,224,167,7,224,22,8,244,53,0,226,129,0,192,36,229,27,5,64,141,-49,103,74,114,252,187,9,124,162,2,48,58,48,99,133,201,79,96,210,224,-46,25,138,19,207,186,229,27,5,2,109,34,32,233,189,1,2,56,51,51,-34,3,145,61,229,157,0,70,133,2,83,32,73,230,132,5,64,186,65,52,-225,12,0,198,212,122,178,234,237,1,97,3,96,218,2,53,55,55,66,71,-103,151,224,131,6,2,112,34,32,224,159,1,2,54,52,54,64,39,167,167,-66,119,102,166,34,238,75,133,98,225,32,22,186,185,230,104,0,133,57,226,-223,1,131,117,32,161,237,131,5,2,52,48,51,226,199,1,236,175,1,177,-16,98,163,32,51,240,23,2,32,35,66,189,130,95,145,66,247,222,1,242,-128,1,235,212,1,2,83,32,80,226,144,1,224,72,1,203,61,102,51,198,-217,230,15,2,128,120,199,15,101,242,192,37,227,115,1,33,22,32,195,210,-5,156,241,131,241,224,10,1,33,27,200,167,32,184,250,181,7,231,141,2,-153,241,230,254,3,194,249,228,199,0,238,158,5,217,3,197,89,230,130,5,-252,242,11,225,97,3,253,26,13,210,207,252,97,27,252,250,12,192,64,253,-32,1,224,116,1,245,115,9,242,57,1,225,200,1,120,3,255,121,0,255,-153,2,230,214,3,224,181,5,167,246,230,255,11,224,40,5,235,184,0,224,-186,11,224,28,2,132,245,220,202,67,1,228,33,1,133,164,32,175,165,167,-2,53,52,48,237,23,0,93,20,242,160,0,225,43,3,254,12,3,232,204,-2,241,133,45,129,204,225,19,1,241,166,16,243,169,13,240,150,4,229,223,-2,232,161,9,150,174,128,254,224,198,1,224,16,0,254,98,29,225,191,26,-225,23,0,225,190,21,170,107,225,189,12,224,27,2,64,210,240,250,4,206,-226,165,7,193,206,226,106,10,128,224,246,215,1,160,55,187,195,96,28,2,-82,32,95,224,219,2,240,68,4,240,65,19,2,112,97,116,2,86,97,114,-2,115,32,34,130,40,112,154,102,49,160,225,118,64,126,230,2,56,51,57,-104,62,152,55,96,88,96,127,36,72,172,219,69,251,73,160,129,88,160,54,-2,53,48,55,204,49,128,17,209,195,153,118,111,189,200,184,224,31,11,73,-215,97,55,224,29,5,233,254,2,224,204,1,2,91,93,34,207,39,224,36,-17,2,40,41,34,229,40,2,222,227,64,220,173,194,32,20,140,250,64,27,-32,19,2,104,101,97,2,100,85,84,32,58,32,17,236,64,1,2,52,56,-54,101,160,32,55,32,23,191,33,203,193,131,130,71,112,97,146,235,191,1,-32,42,202,205,110,31,99,219,35,182,32,23,138,191,134,38,39,73,2,80,-32,85,35,232,62,89,2,55,57,55,216,164,2,55,57,56,2,32,64,89,-230,96,0,237,142,1,100,19,224,7,2,65,0,205,2,226,17,1,2,56,-51,50,144,102,96,220,135,48,69,80,50,210,162,58,164,91,164,96,105,118,-161,204,110,98,165,128,97,246,249,100,5,134,204,237,26,1,197,202,64,46,-137,19,154,87,2,95,56,48,160,104,192,215,136,13,105,48,96,108,70,229,-235,127,0,224,141,3,192,36,167,196,237,154,0,166,155,167,56,227,32,0,-160,254,120,253,146,10,227,29,1,2,95,56,50,97,246,146,211,211,11,33,-31,208,81,65,40,236,76,0,236,49,0,231,176,4,102,120,224,27,1,106,-186,199,15,199,255,236,65,13,236,28,6,224,19,2,165,136,224,16,13,202,-249,234,54,0,225,225,0,192,21,143,242,224,162,2,102,244,222,183,231,221,-2,32,2,224,175,4,171,121,230,169,3,228,243,4,231,234,5,134,36,119,-19,78,126,229,79,3,192,2,182,29,224,174,0,136,46,224,138,2,241,6,-4,203,81,233,42,3,232,55,2,235,167,4,104,140,128,5,173,207,139,174,-241,234,1,229,183,0,224,100,1,237,251,4,224,71,3,129,19,97,37,64,-214,100,55,37,35,224,70,3,43,51,252,36,0,98,188,193,252,227,135,13,-246,239,2,195,146,161,198,225,183,6,129,170,255,2,3,81,43,224,196,0,-224,43,0,84,208,68,106,164,213,192,157,251,79,8,227,237,0,32,176,96,-32,135,43,96,68,224,53,0,43,28,230,215,1,160,0,99,205,192,220,194,-215,162,64,32,124,2,53,55,56,251,193,14,240,45,1,35,57,32,12,225,-6,1,163,177,196,139,224,20,2,162,208,163,101,234,128,2,131,54,228,135,-1,239,16,1,232,150,2,166,246,96,81,246,193,1,122,209,171,151,128,25,-241,4,1,44,103,136,182,32,109,134,165,224,109,10,226,34,1,243,135,1,-229,65,3,2,58,56,50,213,175,2,95,56,49,157,8,2,51,57,49,162,-10,129,53,100,203,32,40,254,155,1,2,56,50,52,64,25,70,32,32,11,-32,183,32,29,134,62,253,103,3,254,189,3,236,96,3,163,202,132,172,36,-193,32,60,190,112,99,187,228,101,2,193,43,195,212,195,100,97,52,164,178,-229,169,0,226,124,5,197,141,128,165,32,98,198,155,101,53,220,43,63,117,-225,120,0,37,157,248,23,1,98,43,79,244,88,31,2,95,52,53,66,170,-165,100,32,75,134,207,109,206,102,224,64,36,64,16,158,142,94,166,2,56,-48,57,116,105,78,71,32,31,237,170,0,32,17,83,214,2,56,50,48,237,-200,1,65,102,225,129,2,224,177,0,129,212,32,14,71,158,64,19,167,158,-118,184,2,51,50,52,128,96,33,119,32,29,212,201,133,41,128,89,237,90,-1,139,60,233,238,3,228,198,5,32,70,137,27,192,32,237,215,2,160,26,-231,19,3,160,19,216,202,71,62,71,103,227,66,12,128,161,224,44,7,131,-167,192,27,224,28,7,167,78,224,28,13,109,130,224,28,0,252,254,0,182,-17,228,101,2,39,156,33,136,132,27,224,155,6,172,188,65,203,64,71,195,-58,131,142,103,218,232,117,5,230,25,2,203,196,224,30,3,101,167,142,75,-118,39,225,60,0,2,83,32,66,238,76,4,230,245,2,225,79,2,64,56,-245,87,4,224,56,1,231,85,5,228,99,2,242,73,1,230,116,3,228,53,-2,128,25,66,187,48,114,198,200,228,78,2,228,95,10,226,5,0,229,108,-0,241,81,7,2,115,114,99,2,47,77,105,2,99,114,111,2,72,115,47,-56,236,2,77,97,112,2,46,104,115,113,102,2,54,53,58,2,49,34,32,-224,60,1,33,88,214,104,177,4,121,108,32,84,96,98,191,187,100,192,32,-42,131,155,247,169,4,110,26,160,154,32,33,234,65,2,64,78,2,51,53,-54,164,221,243,96,5,231,198,3,83,214,112,201,238,17,2,199,23,237,191,-2,151,213,67,177,129,22,232,7,4,240,37,2,128,42,32,79,197,131,242,-10,3,241,59,2,32,72,124,82,133,194,192,7,167,203,229,191,3,226,53,-0,141,109,32,242,131,50,196,185,163,61,161,0,164,97,2,56,48,52,64,-41,100,55,64,26,128,19,2,55,32,58,96,19,193,34,64,37,160,212,120,-10,139,22,64,95,128,47,36,245,32,18,2,58,56,48,132,84,96,229,241,-226,1,201,50,224,224,3,246,102,3,193,11,196,36,99,122,64,86,211,251,-224,46,3,131,189,193,103,140,187,139,47,162,165,148,34,244,46,4,128,181,-2,56,48,54,128,219,64,10,224,5,6,226,191,4,192,120,233,132,9,245,-243,5,224,17,13,160,153,227,106,4,170,25,242,18,1,233,104,2,227,165,-3,207,41,224,214,2,232,58,0,224,61,45,225,249,0,224,61,23,241,212,-0,224,61,3,233,40,0,225,4,1,229,201,0,97,126,65,83,216,126,239,-209,1,251,154,1,224,31,3,235,225,2,228,86,2,96,40,224,39,5,224,-40,8,227,101,4,102,244,224,46,4,195,5,195,27,74,224,83,207,197,150,-34,151,134,206,118,43,32,13,197,162,234,111,2,224,10,6,224,109,1,232,-1,0,32,55,196,129,233,179,2,64,27,32,25,132,112,92,234,67,41,188,-234,67,183,245,80,6,32,185,102,52,111,74,82,92,100,190,32,42,245,123,-9,99,1,102,108,80,153,254,44,9,69,44,2,33,34,32,170,150,32,66,-167,245,245,184,0,170,220,241,102,0,128,128,225,221,1,160,31,203,180,226,-231,7,224,13,15,226,223,0,225,206,9,241,251,18,226,209,10,249,231,3,-226,191,22,205,147,226,166,19,225,47,0,224,10,4,224,11,15,226,50,20,-33,76,254,130,0,91,33,234,243,3,173,136,228,134,5,168,82,209,117,2,-50,52,55,167,35,172,88,224,254,10,250,43,2,237,73,10,237,163,3,96,-14,98,131,236,226,4,32,12,2,57,32,95,128,12,2,58,55,57,133,121,-2,90,32,85,34,11,111,253,194,169,128,16,194,242,100,224,2,55,57,51,-136,132,248,122,4,227,142,0,114,64,167,15,133,82,153,111,107,233,185,128,-152,75,104,189,248,153,3,231,148,4,108,34,202,54,106,220,252,185,3,249,-217,4,141,17,32,152,103,165,77,121,87,171,160,7,237,86,1,129,59,147,-202,32,212,210,73,160,193,160,221,2,54,54,56,236,158,0,160,146,241,62,-2,128,84,96,107,97,235,128,76,236,102,3,202,31,67,147,76,189,2,55,-51,32,244,22,10,2,79,32,35,2,49,50,48,246,53,0,2,49,50,51,-32,24,49,188,250,19,1,43,164,238,12,13,165,147,32,192,132,54,193,0,-55,174,42,99,226,58,7,64,152,99,206,228,6,5,2,33,33,58,2,32,-101,109,2,112,116,121,250,107,0,135,35,226,108,11,239,176,16,145,245,224,-87,8,2,60,48,34,99,6,97,34,131,6,104,247,236,39,2,128,11,105,-53,32,38,211,31,105,60,224,206,1,174,146,255,90,8,247,249,12,224,40,-25,161,92,246,139,25,185,203,198,97,201,119,249,9,6,248,225,4,249,7,-22,131,54,131,120,248,10,1,220,50,203,30,224,104,9,140,85,224,66,3,-200,108,224,112,11,129,9,249,120,7,225,21,21,225,61,31,250,61,9,248,-118,89,96,242,68,48,99,134,67,124,74,98,96,5,36,222,145,154,2,55,-53,54,235,230,2,247,209,0,233,203,6,67,202,2,53,55,53,160,65,227,-163,0,2,55,56,57,220,133,191,214,132,59,183,236,248,102,13,161,49,224,-202,3,242,137,0,248,115,4,224,49,0,250,85,2,224,41,0,226,90,0,-107,118,227,182,1,146,54,169,56,128,36,132,120,2,53,48,52,221,197,2,-53,48,53,184,106,68,1,204,162,2,55,57,48,96,5,242,114,5,244,148,-6,249,120,14,226,77,11,225,135,1,249,12,2,129,63,225,31,1,226,106,-2,218,250,35,207,136,141,119,117,64,180,134,66,236,15,1,160,22,119,140,-96,181,151,28,125,140,70,7,2,55,52,53,200,51,96,222,65,189,2,55,-52,54,231,64,0,125,157,102,210,64,123,64,140,205,83,33,198,76,72,97,-215,165,218,37,128,32,97,97,99,120,46,228,198,8,152,246,32,51,198,244,-96,160,131,121,96,161,67,115,224,24,2,99,214,128,24,134,64,34,64,2,-49,32,85,33,203,225,88,5,64,91,224,19,7,64,84,224,19,6,70,4,-250,3,1,160,19,64,59,216,15,253,125,5,162,173,134,218,156,97,229,128,-5,2,103,101,116,2,83,76,111,2,99,32,69,2,85,86,97,2,114,34,-32,252,138,0,70,29,107,43,226,238,3,120,245,160,81,34,129,2,55,55,-56,226,60,1,224,147,6,101,62,224,147,6,97,11,96,131,224,84,3,64,-18,224,86,0,192,18,224,19,2,223,240,68,78,229,203,10,224,119,7,64,-64,224,119,7,64,253,79,158,224,80,3,2,95,50,51,133,113,224,125,13,-224,17,6,224,101,7,144,114,224,101,5,64,85,224,76,10,186,44,224,97,-6,224,224,13,224,225,7,64,45,224,18,6,129,87,224,18,4,64,199,224,-140,7,66,38,224,140,12,67,177,225,216,2,97,199,2,56,48,32,99,145,-224,142,6,225,5,1,209,128,224,119,5,136,218,224,119,4,66,177,226,117,-1,96,91,225,228,9,130,59,167,54,225,128,13,226,246,8,224,245,9,64,-165,224,125,6,132,61,171,106,224,132,4,211,50,224,107,11,225,58,7,225,-57,15,225,173,9,35,211,137,83,163,211,225,91,6,41,125,99,52,224,73,-6,32,53,181,129,128,53,225,23,5,73,194,160,37,177,52,196,47,227,144,-26,161,200,128,62,177,95,228,110,12,129,60,231,218,8,225,10,6,64,99,-226,190,13,227,178,21,225,91,3,230,62,8,228,168,7,226,49,3,160,55,-227,146,20,226,85,4,96,232,134,42,96,232,69,231,224,59,6,224,12,11,-226,129,3,32,64,178,89,128,64,224,66,3,161,236,224,141,7,227,185,7,-224,15,7,2,58,55,55,182,239,225,225,5,224,31,2,198,61,96,33,143,-64,2,51,55,50,217,142,96,46,128,40,190,215,64,38,76,48,224,122,26,-166,102,140,139,32,219,32,233,100,240,2,55,55,52,70,134,40,215,151,138,-63,123,44,159,2,48,32,79,2,32,35,55,32,19,99,54,32,30,162,155,-224,30,4,32,205,192,30,235,124,2,244,105,5,217,159,233,118,10,235,69,-2,254,136,1,224,21,7,239,229,6,242,214,1,238,252,0,243,22,61,253,-73,9,160,141,253,38,19,200,86,254,169,1,253,144,10,136,106,242,233,8,-74,57,148,51,246,222,4,182,254,32,50,32,30,2,53,32,79,64,37,33,-186,233,31,0,253,37,4,32,2,160,91,239,53,1,211,27,96,62,232,236,-3,225,131,12,236,61,0,169,156,141,187,170,224,224,60,2,193,212,128,85,-128,20,128,72,224,77,1,32,10,94,95,80,5,192,89,224,75,1,160,104,-224,21,6,96,50,154,156,111,187,103,124,32,77,2,56,32,102,232,139,0,-2,36,104,34,250,193,0,64,36,128,50,224,49,20,2,118,115,34,225,47,-0,185,241,2,55,54,57,225,188,1,171,7,138,177,35,1,65,10,160,23,-218,3,32,223,251,61,3,237,243,15,79,195,190,111,64,21,189,155,192,25,-162,23,130,98,35,37,202,210,202,5,215,156,243,226,1,32,36,234,226,4,-96,64,106,39,64,164,123,13,32,202,36,38,187,103,96,214,120,102,234,57,-93,208,147,43,74,47,222,2,51,57,57,199,6,84,71,173,68,156,135,66,-110,240,179,0,143,171,248,40,0,128,194,234,31,40,192,53,224,96,3,160,-20,224,81,1,224,28,4,152,193,224,28,1,234,43,54,224,228,1,224,130,-12,2,53,57,32,70,38,224,169,0,225,44,0,2,53,52,48,140,88,44,-219,225,52,1,134,190,192,155,234,75,36,225,9,6,108,244,224,137,1,206,-153,225,30,11,225,31,22,234,106,71,250,252,1,224,106,6,224,134,4,2,-53,50,52,129,89,219,199,97,75,32,43,231,230,1,2,83,32,73,179,197,-143,27,239,233,4,32,41,129,160,192,55,236,129,1,234,156,32,224,57,4,-225,222,5,128,25,100,49,226,103,14,226,1,2,32,11,249,203,0,234,174,-51,37,85,226,107,0,192,88,170,99,224,122,15,225,218,22,234,210,13,226,-43,17,94,254,253,86,0,36,105,136,156,224,49,6,119,189,2,55,54,50,-100,187,64,249,228,140,11,234,87,35,226,208,39,228,12,33,224,28,7,234,-133,32,160,49,225,241,18,234,142,2,226,129,5,33,19,182,32,36,24,225,-56,11,224,146,2,226,104,3,32,55,181,151,224,57,7,193,215,226,17,2,-224,87,15,74,6,161,193,224,9,0,32,88,137,202,226,226,11,195,76,160,-40,137,212,224,40,11,177,39,227,24,2,32,46,134,221,224,46,11,211,21,-145,217,64,61,74,75,64,15,32,13,209,186,190,244,90,51,98,247,179,0,-128,73,96,97,32,76,171,30,2,55,53,55,182,97,2,50,57,56,255,52,-5,151,63,224,61,1,254,199,0,96,10,119,72,148,19,166,151,247,51,6,-247,232,3,96,229,32,118,235,149,0,83,253,104,121,82,4,49,253,65,47,-32,31,171,140,242,117,0,114,103,2,79,32,80,64,14,103,170,247,122,5,-138,252,160,31,84,59,224,31,6,131,114,96,197,192,64,104,72,32,105,248,-108,1,33,2,32,201,104,190,114,145,105,145,65,59,96,42,64,60,224,53,-1,130,73,60,13,96,42,192,10,203,178,156,67,224,7,7,121,235,32,37,-232,178,1,40,141,97,136,104,141,64,90,224,243,81,96,32,192,189,173,134,-64,105,97,189,153,4,2,55,52,55,120,255,65,156,172,132,64,54,224,41,-15,234,28,1,2,91,93,34,160,46,129,214,252,212,6,2,76,105,115,2,-116,95,84,2,121,112,101,2,46,34,32,64,36,253,166,12,233,173,1,84,-80,212,165,169,34,64,21,173,76,2,55,52,51,33,105,84,26,154,247,75,-35,78,86,32,19,175,197,74,207,58,24,96,175,234,192,2,2,102,34,32,-162,140,77,173,105,239,90,51,224,38,14,64,79,129,167,2,75,32,80,32,-3,65,15,64,3,32,22,129,166,68,68,2,95,51,49,97,86,189,143,106,-160,99,65,2,49,51,52,69,143,153,81,171,10,157,143,130,93,180,230,246,-83,3,32,88,170,141,66,137,78,75,64,67,119,255,141,249,32,16,150,93,-224,30,2,32,5,229,203,2,77,55,224,56,0,154,28,219,107,171,163,65,-198,64,159,160,34,155,47,139,183,187,50,2,58,55,51,161,242,224,99,2,-32,66,109,147,79,203,96,57,67,43,2,51,55,32,90,99,172,56,224,85,-1,211,238,32,73,227,228,0,98,210,2,51,49,32,69,52,66,174,96,180,-32,32,227,229,3,64,30,2,83,32,80,2,32,64,73,128,134,197,227,169,-254,159,81,103,194,128,243,224,10,3,255,112,0,97,35,64,82,96,142,123,-224,224,126,4,215,116,64,214,2,50,57,32,128,201,96,8,64,184,48,116,-128,53,32,11,75,139,128,11,32,84,175,169,77,149,2,51,50,32,205,40,-128,82,66,180,36,242,225,26,1,224,112,21,74,105,192,112,34,61,224,111,-0,97,110,160,110,162,200,2,51,32,66,224,76,6,216,46,224,188,0,100,-82,2,64,95,57,160,152,64,60,198,50,32,10,204,246,67,18,187,223,96,-56,32,26,130,107,2,85,32,73,64,13,64,19,98,233,246,178,6,2,105,-109,112,2,111,115,115,2,105,98,108,2,101,34,32,97,176,88,71,96,54,-2,75,52,32,32,2,82,175,224,1,1,237,214,2,64,42,129,219,64,254,-98,192,220,66,254,56,0,80,11,192,207,65,229,72,34,64,66,192,72,157,-243,157,225,166,126,131,182,96,7,32,177,97,186,69,38,99,133,192,118,228,-60,2,171,47,64,21,130,21,2,73,32,58,2,55,50,52,229,125,3,248,-51,1,38,179,160,218,2,50,32,75,32,221,160,240,196,3,134,31,76,65,-254,50,9,228,61,2,2,115,117,112,2,101,114,34,254,58,10,32,74,196,-55,128,70,224,52,2,2,67,34,32,96,32,129,147,32,107,67,185,2,90,-32,67,250,178,1,2,95,51,54,65,7,32,57,233,3,0,64,243,32,45,-2,98,115,43,2,43,46,32,32,14,129,153,73,108,132,8,2,55,49,54,-231,206,5,207,234,32,182,95,238,63,100,160,25,240,94,0,254,8,3,99,-133,101,158,99,147,64,85,32,6,65,230,127,125,142,134,2,51,57,55,205,-123,243,27,4,225,34,19,2,100,117,112,2,108,105,99,2,97,116,101,2,-32,100,101,2,102,105,110,2,105,116,105,2,111,110,32,161,49,2,51,50,-57,226,67,1,226,139,6,2,99,104,101,2,99,107,68,2,117,112,34,129,-152,79,119,226,219,0,64,211,32,7,69,125,38,4,187,175,255,156,12,156,-70,97,73,34,18,32,70,194,46,233,41,2,144,97,243,11,1,164,37,157,-197,237,46,1,233,4,0,235,209,1,32,79,130,104,139,4,100,25,64,155,-98,178,104,223,65,116,146,37,32,43,191,132,67,131,241,4,1,243,234,2,-128,66,34,137,195,18,199,48,243,161,5,160,49,64,5,32,15,224,52,8,-232,134,8,244,5,1,243,151,5,243,232,14,160,236,244,18,64,224,188,1,-244,157,3,224,64,14,224,65,2,97,18,244,16,15,224,25,0,243,241,3,-127,186,160,75,96,23,100,103,226,35,2,169,66,255,64,3,224,60,3,96,-2,133,97,224,137,6,131,98,127,1,2,54,57,56,244,71,4,196,230,32,-109,96,8,224,5,16,34,155,255,33,0,244,196,5,100,247,32,85,2,85,-32,65,243,114,6,225,111,15,34,189,192,36,226,13,3,148,208,225,219,7,-129,70,129,24,243,124,2,243,99,0,152,253,226,60,0,224,40,0,224,72,-14,225,132,5,225,196,10,255,94,2,105,35,149,15,195,52,162,166,160,6,-148,203,191,24,130,121,97,48,97,107,128,181,227,126,1,102,13,111,82,131,-178,224,9,1,224,68,21,225,101,0,161,192,102,98,224,60,3,198,201,225,-238,4,70,184,160,216,64,134,98,202,160,18,64,14,32,63,137,107,224,208,-10,231,27,3,225,26,0,246,113,1,226,214,17,224,28,1,224,29,41,227,-64,10,247,235,1,227,42,1,248,45,4,160,52,227,180,5,227,84,2,114,-121,2,49,51,57,111,214,230,93,4,245,249,0,138,255,46,231,224,25,0,-2,95,52,51,192,34,224,157,0,161,138,129,135,33,131,153,132,225,60,11,-117,254,204,186,166,151,181,29,170,192,2,54,48,49,169,27,200,90,67,14,-247,189,1,65,36,225,49,5,229,63,5,226,245,9,225,18,0,226,242,95,-226,214,3,241,66,0,129,74,78,45,237,249,13,133,196,108,26,224,41,22,-68,107,39,169,144,98,97,64,96,4,227,57,13,2,90,32,85,224,13,1,-230,119,1,227,1,27,2,75,32,35,96,112,227,2,19,225,59,15,224,13,-4,101,116,226,161,0,161,215,129,67,226,115,2,160,221,184,139,248,111,0,-91,136,144,238,32,47,2,53,55,55,226,168,8,76,58,128,59,224,8,1,-225,42,1,225,8,0,165,126,194,105,2,89,32,67,234,189,38,97,52,32,-202,160,65,145,33,66,3,229,216,1,64,24,76,224,224,118,2,152,230,2,-48,56,32,201,144,173,194,205,203,202,64,47,168,82,38,228,89,0,128,8,-142,163,86,213,106,13,234,65,7,128,92,120,200,32,17,173,167,64,77,171,-18,32,20,147,54,75,59,32,25,210,86,2,48,57,32,32,13,138,160,74,-114,32,13,32,18,96,27,239,79,1,32,19,236,31,0,107,68,96,229,32,-21,137,171,134,153,32,75,113,240,165,191,252,253,4,2,56,57,32,224,207,-0,165,151,32,61,189,101,78,167,32,13,211,194,131,163,134,159,226,24,6,-202,208,230,182,1,232,232,14,224,13,3,196,50,163,194,231,107,0,141,187,-226,65,5,227,192,12,201,181,227,15,0,201,244,229,41,7,32,201,65,127,-250,215,0,169,209,234,51,1,64,33,174,186,242,70,5,119,247,129,160,166,-181,239,184,0,33,25,236,216,1,68,255,228,241,8,231,196,7,228,110,0,-163,223,74,134,224,247,7,229,228,9,228,170,2,160,138,251,159,4,234,142,-5,161,163,225,62,6,232,82,0,177,52,233,164,3,32,112,2,52,52,56,-224,43,0,161,42,238,11,4,234,141,2,96,68,224,23,0,228,47,0,192,-252,161,71,227,64,0,241,5,0,144,160,233,61,5,198,243,180,235,254,163,-18,232,67,4,225,85,2,231,32,0,139,225,224,204,11,254,155,3,224,58,-45,224,55,11,97,167,237,208,2,196,68,248,105,1,109,172,83,190,237,153,-9,35,118,65,63,128,244,245,186,7,245,185,3,235,43,2,132,100,65,91,-247,77,1,221,216,169,90,150,9,128,182,192,189,229,0,1,192,17,81,184,-180,147,64,16,224,77,24,100,183,226,19,3,86,47,226,93,4,192,29,224,-89,3,253,253,1,200,24,237,232,3,233,145,2,227,27,5,194,149,224,183,-2,162,237,32,83,181,65,65,84,65,65,36,149,97,20,100,121,143,229,2,-50,50,53,194,155,32,22,211,10,35,200,160,4,246,19,3,96,38,212,187,-117,102,2,54,57,53,35,212,2,54,57,54,174,35,102,99,67,162,225,21,-2,180,196,64,41,192,6,64,7,78,167,32,37,32,60,133,43,96,246,228,-11,1,237,254,3,129,9,199,93,96,31,225,77,3,64,99,87,158,195,65,-32,7,99,106,228,3,3,2,57,51,32,161,21,163,127,137,218,160,135,82,-238,96,66,96,228,132,161,229,187,0,32,192,32,60,32,219,197,47,64,126,-2,54,54,49,231,90,0,64,99,73,224,153,146,251,0,0,128,35,233,39,-1,2,54,54,52,128,39,40,241,193,162,202,210,67,186,131,181,192,70,224,-40,1,129,68,96,157,164,203,166,120,157,47,96,236,32,181,130,230,245,136,-2,128,162,32,69,127,251,228,35,2,224,104,5,160,32,32,79,98,135,96,-86,129,203,224,239,11,192,173,96,63,98,152,235,152,1,228,126,1,224,242,-1,155,30,196,134,165,180,233,158,0,99,51,86,155,2,54,54,54,128,222,-245,240,1,87,46,32,220,177,106,233,89,0,2,54,56,56,225,1,1,71,-253,96,183,98,148,96,48,71,156,32,19,162,248,231,182,3,72,89,147,47,-96,36,128,50,81,145,192,35,241,197,1,2,67,39,34,147,14,96,109,225,-13,35,224,233,1,192,22,129,1,224,191,2,220,49,192,176,118,17,97,132,-224,177,7,65,255,192,177,168,94,224,177,15,2,83,39,34,192,177,195,78,-238,124,2,216,124,64,61,224,206,16,234,228,5,101,176,198,193,225,168,3,-96,190,237,98,2,162,71,32,143,168,55,224,193,3,65,190,233,42,1,69,-160,32,131,226,169,5,163,207,128,131,175,235,199,236,227,72,3,235,133,13,-240,171,0,226,72,4,229,144,1,226,92,9,194,83,240,168,3,224,75,14,-2,55,50,32,224,75,9,163,135,191,144,64,213,32,156,32,213,198,24,227,-238,4,161,227,226,133,3,32,139,193,17,73,16,96,62,202,214,201,53,106,-166,97,178,226,18,8,32,19,162,18,64,198,128,30,2,50,32,79,224,25,-1,32,24,130,179,225,136,5,226,74,1,68,47,229,228,6,32,4,110,5,-32,28,194,103,106,244,2,55,52,32,64,19,184,172,224,79,4,166,74,64,-30,229,47,0,163,5,149,147,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,-108,190,224,36,16,133,44,96,73,229,108,10,91,60,170,91,227,58,8,98,-78,227,46,1,181,234,228,126,12,2,66,34,32,194,94,225,252,3,32,64,-227,77,1,224,55,9,2,66,39,34,224,54,12,193,171,224,24,7,69,37,-224,24,12,64,221,224,24,1,127,56,160,6,33,238,220,191,162,118,163,225,-32,24,230,56,11,239,124,0,238,122,7,246,44,3,66,123,229,76,3,2,-67,32,61,2,61,32,64,2,35,55,32,224,32,9,235,236,2,86,196,234,-33,5,226,148,0,167,89,224,126,11,192,101,128,76,246,134,7,160,6,192,-115,205,47,224,151,19,128,35,32,69,224,44,6,253,98,3,136,90,232,211,-2,140,202,224,202,4,160,185,224,35,21,94,246,225,180,1,251,180,0,150,-48,224,38,5,34,94,160,38,238,193,6,226,47,1,2,75,52,34,203,45,-224,35,17,2,51,34,32,224,35,24,2,50,34,32,251,84,1,241,82,6,-224,57,0,66,34,196,235,58,211,65,69,90,245,64,74,64,20,155,157,164,-134,79,243,228,163,1,238,96,5,170,139,64,81,194,135,231,185,7,32,29,-231,78,0,98,165,199,251,32,24,228,224,0,128,24,165,142,32,24,228,229,-0,96,24,197,48,32,24,189,86,192,24,235,68,0,67,200,191,221,221,253,-116,66,253,253,13,32,191,32,220,130,30,226,74,4,192,32,96,31,225,197,-3,128,230,236,112,3,32,98,2,54,53,57,132,69,76,232,64,94,128,16,-76,73,128,9,32,50,129,101,2,79,32,58,96,37,123,172,2,58,54,53,-193,82,96,133,224,1,3,65,84,245,158,22,32,91,98,245,32,70,204,34,-245,177,5,248,125,10,245,218,9,245,183,12,224,11,2,192,8,216,204,32,-109,241,147,0,108,168,45,55,32,4,98,235,99,252,244,59,0,32,41,223,-136,131,219,207,219,224,146,5,192,233,248,198,4,2,39,32,85,93,162,249,-64,13,2,95,51,51,33,99,2,52,52,57,64,110,146,137,239,118,21,99,-190,128,53,2,54,53,50,224,53,5,249,247,7,128,38,2,51,51,52,224,-38,4,225,16,6,143,101,159,88,65,135,168,120,113,100,177,183,239,84,5,-161,57,237,85,2,252,50,7,242,111,2,110,58,238,57,3,64,58,241,162,-1,161,50,225,152,3,32,31,223,248,2,51,51,32,2,75,32,85,32,34,-241,161,1,82,133,2,50,55,52,225,192,1,130,190,110,49,2,52,55,32,-212,43,112,63,32,29,130,169,2,85,32,67,239,64,3,157,95,253,157,19,-2,32,61,32,254,189,3,2,54,52,57,192,186,169,50,2,49,50,52,80,-32,65,132,96,27,64,127,2,52,56,54,71,133,112,53,32,90,73,151,96,-27,2,58,54,52,207,13,67,99,2,95,52,57,127,181,190,136,2,53,48,-50,234,4,2,2,52,57,53,224,67,1,128,6,173,160,224,43,14,65,166,-2,53,48,49,104,6,64,7,32,21,2,54,32,79,39,122,231,202,0,128,-111,64,6,96,24,2,52,54,32,229,183,1,224,96,0,96,29,32,16,84,-219,64,176,196,251,32,45,67,13,65,54,32,59,64,29,169,148,65,107,225,-254,13,250,109,0,128,54,128,45,131,60,245,16,5,2,54,52,53,192,101,-2,51,32,58,2,54,52,52,96,13,2,114,110,102,99,115,32,16,196,254,-100,80,234,76,4,224,4,8,225,221,0,225,206,12,2,84,109,111,2,100,-117,108,2,101,32,34,242,119,2,226,15,8,190,203,242,22,8,224,244,0,-174,87,160,214,224,25,5,227,22,0,34,18,128,233,32,10,241,112,5,228,-52,2,80,107,68,99,246,239,2,248,250,4,143,69,32,106,100,123,239,90,-4,160,20,208,100,150,194,255,121,1,2,54,52,48,96,116,82,59,193,146,-160,99,160,6,100,192,228,40,1,2,95,54,51,244,5,1,254,227,3,243,-236,10,252,75,5,159,215,160,122,224,130,0,227,230,2,64,88,96,138,32,-165,98,116,166,136,32,25,162,94,227,69,2,2,51,55,32,71,174,131,234,-225,201,17,225,200,5,227,213,38,2,40,46,46,2,46,41,32,2,119,104,-101,2,114,101,92,2,49,48,38,163,225,2,54,51,54,198,132,131,180,96,-138,32,164,242,139,1,163,217,2,51,53,32,64,23,130,203,99,51,101,127,-35,134,49,147,166,23,164,249,238,93,2,2,67,32,60,39,136,253,114,1,-233,236,6,192,24,34,228,82,36,69,171,224,41,14,128,25,160,41,224,43,-3,133,172,2,53,51,52,96,164,64,5,67,205,162,153,32,176,131,102,2,-85,32,83,224,146,9,224,18,6,65,65,224,18,6,98,97,247,204,0,160,-19,65,226,229,84,0,228,135,0,96,8,160,16,96,130,225,122,1,2,112,-97,116,2,116,101,114,2,110,34,32,129,114,37,84,228,145,1,72,78,228,-145,0,2,49,57,32,154,116,224,71,13,2,100,101,102,2,97,117,108,2,-116,34,32,164,182,101,17,96,42,34,82,64,15,2,49,52,32,224,50,6,-2,44,32,34,162,153,102,25,2,50,48,32,227,174,0,224,214,7,64,26,-96,121,2,53,51,53,224,201,15,2,105,110,115,2,116,97,110,2,99,101,-34,192,202,160,79,64,55,155,120,64,59,227,80,5,129,25,229,183,4,224,-92,13,2,99,108,97,2,115,115,34,192,89,176,78,97,44,64,7,209,216,-243,243,1,128,183,66,175,224,202,6,67,103,33,160,204,48,100,183,224,132,-14,34,6,227,52,19,2,105,110,102,2,105,120,34,190,100,100,82,229,27,-4,32,104,97,187,224,23,6,33,134,247,75,0,224,24,0,197,43,230,110,-0,247,102,5,225,198,35,134,211,128,0,66,136,225,107,10,224,243,19,225,-120,8,2,102,111,114,2,101,105,103,2,110,32,105,2,109,112,111,2,114,-116,32,2,99,99,97,2,108,108,34,128,111,2,53,50,52,64,45,69,72,-68,10,224,184,2,41,51,32,216,209,168,231,104,4,224,89,1,2,58,58,-34,194,219,226,42,1,160,178,229,105,10,135,204,234,0,2,234,98,1,192,-26,226,89,44,128,216,193,199,237,207,1,2,54,50,54,104,106,2,50,55,-32,96,186,102,41,224,58,5,2,123,45,35,2,32,83,79,2,85,82,67,-2,69,32,35,2,45,125,34,160,238,104,200,65,20,224,44,5,2,113,117,-97,2,108,105,102,2,105,101,100,240,41,0,161,170,225,244,0,97,79,226,-20,5,65,88,233,139,17,2,97,115,32,161,138,2,51,49,57,224,125,6,-228,132,0,201,3,96,99,122,188,224,65,2,2,104,105,100,2,105,110,103,-160,145,228,53,2,73,83,98,114,226,115,4,73,36,226,190,2,132,53,226,-110,1,187,255,227,130,5,114,65,224,18,5,114,47,227,149,5,65,170,229,-54,36,2,116,121,112,196,104,226,92,24,130,54,224,94,19,227,91,6,224,-231,10,195,86,226,195,27,108,32,104,195,96,53,229,205,10,225,18,8,230,-74,10,230,73,40,225,18,2,230,70,18,160,166,228,26,14,224,108,32,2,-110,101,119,224,111,29,45,103,128,7,164,13,39,108,214,126,237,2,1,227,-161,21,2,100,97,116,2,97,34,32,224,104,2,224,78,0,240,160,7,224,-211,53,224,103,8,224,208,10,229,138,21,2,32,124,34,227,27,3,128,251,-224,254,4,168,120,216,12,46,255,132,89,72,183,231,216,15,2,114,105,118,-227,164,0,227,163,44,228,28,0,96,123,140,60,229,104,1,229,71,2,129,-50,225,70,23,32,108,149,79,167,135,163,27,2,80,32,66,160,144,192,254,-98,106,87,92,79,67,224,177,4,96,33,192,130,165,190,225,169,12,227,66,-2,227,117,12,96,99,224,248,9,224,236,0,177,195,192,100,238,9,4,70,-171,238,10,1,160,18,247,93,1,64,180,129,40,162,170,163,60,238,79,6,-65,79,160,68,163,92,32,58,140,107,72,22,194,237,82,97,129,40,237,157,-1,229,161,3,224,28,0,225,223,4,2,54,50,56,193,45,231,217,4,224,-208,1,225,31,11,43,206,2,41,34,32,230,100,2,2,58,54,50,216,178,-193,162,226,48,13,32,40,140,129,2,65,32,58,102,249,64,51,47,164,193,-2,204,178,211,57,64,15,64,9,128,21,64,169,51,53,167,58,32,64,222,-156,226,230,16,97,114,224,125,0,229,139,29,229,200,22,225,44,4,224,66,-0,246,159,1,224,39,12,226,49,1,66,0,224,179,9,224,101,3,97,229,-33,125,104,30,225,120,5,2,61,62,34,241,127,0,64,214,98,62,160,171,-65,47,205,150,65,225,198,183,167,70,206,27,66,147,140,147,229,38,0,131,-160,247,164,8,133,200,247,164,1,252,232,0,2,53,48,48,227,151,3,241,-38,16,98,64,226,73,21,231,70,9,32,161,210,88,33,7,32,13,222,3,-36,100,32,13,219,56,2,49,56,32,130,25,2,58,54,49,177,227,2,39,-32,89,248,22,0,247,106,0,254,157,5,254,208,0,212,255,174,55,96,17,-148,155,244,32,1,2,83,32,73,248,113,0,239,156,0,192,61,138,59,245,-2,5,161,55,128,199,204,228,154,40,185,53,32,5,102,147,160,81,238,178,-2,129,133,206,189,225,136,11,160,106,119,70,229,90,3,234,207,0,64,74,-160,208,197,114,160,96,212,109,157,143,2,53,48,51,255,186,2,239,51,2,-152,236,240,145,10,225,26,6,225,234,3,235,46,12,229,230,0,158,76,128,-14,138,32,238,105,2,218,39,224,181,47,224,166,6,96,163,224,160,10,224,-133,13,224,125,2,226,0,0,226,21,0,225,210,3,249,236,2,42,89,207,-247,245,22,1,192,160,249,166,5,226,225,1,2,91,93,34,193,190,186,229,-114,60,32,41,85,64,54,246,32,142,130,50,174,51,32,184,80,72,2,53,-48,53,226,71,1,32,24,164,16,65,64,2,50,51,57,133,201,107,149,36,-202,239,88,0,158,242,227,183,4,160,254,96,159,193,178,160,224,194,224,225,-254,1,97,88,241,63,6,112,134,253,16,1,224,26,4,120,57,64,52,224,-22,4,102,165,234,128,6,99,221,234,129,7,138,130,32,192,96,98,176,121,-239,21,22,2,95,97,34,246,31,2,238,194,0,234,203,7,232,67,1,193,-28,129,125,224,193,7,96,62,192,26,240,147,5,173,60,33,68,224,31,0,-138,81,231,160,16,224,26,8,2,49,50,54,232,49,3,249,161,2,226,162,-4,244,130,3,201,15,226,179,7,225,1,1,2,45,62,34,128,81,196,158,-96,86,229,115,23,74,102,232,190,6,225,211,13,98,226,225,44,13,98,145,-99,22,224,22,4,66,151,97,188,224,211,1,192,12,2,49,51,32,166,130,-225,25,6,247,12,1,231,34,4,160,202,241,56,5,234,47,12,233,216,2,-233,111,10,237,118,31,2,53,49,53,232,199,0,233,160,6,225,176,2,232,-79,4,231,234,2,225,40,16,97,214,226,85,13,172,87,226,8,13,224,232,-16,226,8,12,238,28,10,252,3,4,229,167,5,240,231,1,167,105,226,117,-2,102,157,2,66,32,79,129,185,240,196,11,2,102,34,32,224,241,2,192,-163,224,48,17,2,116,104,101,180,115,198,33,224,43,17,2,101,108,115,173,-232,226,158,3,225,35,17,227,229,2,233,94,6,228,202,22,97,235,226,245,-12,100,6,133,255,224,25,6,247,163,0,225,202,9,172,126,225,202,23,225,-188,1,160,171,241,58,1,66,176,210,230,237,147,4,2,111,34,32,235,133,-24,2,46,100,111,249,86,1,32,69,2,53,32,35,163,122,247,30,1,53,-19,245,117,1,69,106,174,39,226,182,12,102,95,226,181,12,165,231,160,233,-224,231,3,224,15,0,138,128,128,15,227,113,13,128,145,225,220,4,225,7,-3,160,7,224,228,6,2,108,101,116,238,152,1,224,226,14,242,34,1,246,-56,15,226,188,0,228,97,3,195,103,96,125,244,182,5,246,35,14,2,97,-115,101,236,246,1,224,25,3,2,111,102,34,242,226,1,225,136,15,226,169,-9,170,5,225,136,8,161,89,231,66,6,146,233,225,151,4,69,171,59,218,-231,56,0,188,70,199,76,229,143,4,252,163,14,82,72,244,79,12,230,102,-0,230,99,7,34,177,63,171,226,13,1,2,54,49,50,129,63,128,9,32,-5,240,139,2,249,80,1,233,47,4,242,152,4,236,100,3,206,186,34,171,-219,160,224,125,0,192,57,105,122,225,9,1,128,3,193,69,138,40,233,35,-0,193,25,162,215,32,156,2,55,32,95,105,205,247,115,14,2,115,116,36,-128,247,201,27,129,65,234,55,0,192,8,233,126,7,245,34,2,234,135,13,-235,27,0,164,107,188,70,132,27,233,154,1,65,206,125,165,96,9,129,164,-91,157,128,9,128,17,44,243,143,69,97,125,111,46,73,66,32,22,143,81,-230,70,5,71,106,32,158,2,57,48,32,97,238,123,74,64,52,175,174,98,-157,2,51,57,49,182,13,96,9,127,212,72,9,160,24,64,49,238,183,1,-2,79,32,95,97,155,96,146,78,187,238,114,0,96,51,96,45,142,156,92,-170,108,190,33,190,32,20,222,86,96,22,96,87,43,180,32,23,141,240,130,-76,163,52,222,20,163,142,194,30,230,194,6,253,23,6,70,98,96,141,239,-176,10,2,53,50,54,230,142,8,35,148,217,69,128,181,209,145,234,208,6,-64,131,224,18,6,111,109,230,41,9,250,215,13,97,29,106,39,161,204,161,-48,2,35,57,52,163,155,94,60,32,5,194,4,32,36,130,126,224,98,6,-64,194,224,98,6,157,189,96,45,64,104,249,30,10,224,22,14,224,209,7,-99,196,228,113,30,160,80,160,75,100,107,128,226,120,203,96,28,2,53,52,-51,33,205,236,196,1,224,36,2,146,114,64,36,2,54,48,57,193,148,228,-22,9,224,49,2,165,147,224,12,1,192,62,192,94,224,43,6,236,28,8,-33,219,176,57,82,14,100,171,122,76,66,231,2,48,55,32,66,250,91,80,-64,18,36,31,128,150,190,148,96,11,2,58,54,48,144,101,2,73,32,58,-96,41,255,68,6,192,67,146,186,96,54,158,203,64,6,32,43,2,102,115,-104,2,111,119,32,32,14,163,119,96,58,2,53,53,48,91,215,2,53,54,-48,67,58,77,245,224,128,1,128,197,128,73,64,11,32,58,131,128,32,229,-2,52,32,80,64,60,110,37,2,56,57,32,66,199,35,220,160,65,32,11,-90,92,128,11,2,49,48,55,224,11,2,49,50,160,11,2,54,48,51,64,-168,2,56,53,32,160,17,34,63,32,97,195,180,142,24,165,140,67,172,2,-95,50,48,2,50,32,102,229,37,0,2,73,110,116,2,101,103,101,2,114,-58,32,2,100,105,118,2,105,115,105,2,111,110,32,2,98,121,32,2,48,-34,32,164,250,244,126,0,137,135,64,79,2,85,32,80,32,185,2,56,48,-32,32,4,103,18,101,219,224,17,9,197,40,247,116,5,102,117,240,231,5,-241,137,2,128,16,138,151,241,205,0,145,158,239,200,1,33,22,2,51,32,-67,239,121,3,209,86,228,69,4,32,38,161,68,232,205,0,198,91,105,140,-73,134,2,85,32,65,97,169,99,180,235,180,5,139,71,85,202,128,71,168,-226,80,154,174,211,101,213,245,100,2,2,54,48,49,32,45,80,4,97,150,-228,0,0,130,180,65,166,33,145,225,128,8,2,105,110,105,2,116,58,32,-176,90,129,95,193,64,245,253,5,197,151,192,88,32,82,133,108,129,39,64,-152,2,95,52,51,69,36,2,54,48,48,98,3,133,2,228,8,2,34,99,-70,12,193,49,98,14,128,107,100,199,96,55,97,88,34,209,2,55,48,32,-32,38,193,200,130,84,182,170,239,66,0,147,167,210,232,239,86,4,86,207,-68,10,37,155,193,36,241,228,5,242,99,1,112,228,236,138,3,194,7,160,-98,64,70,32,252,2,57,32,95,2,49,56,54,194,152,113,122,97,10,96,-28,68,34,192,28,97,160,40,214,128,194,32,30,2,52,49,32,128,11,2,-95,54,56,169,243,2,53,54,49,135,233,135,44,97,4,2,58,53,57,132,-24,160,198,203,59,32,7,242,212,3,236,116,3,140,155,65,88,72,123,33,-94,96,130,130,132,32,255,34,58,99,252,128,6,194,66,96,26,70,41,118,-147,32,7,2,55,50,32,64,59,255,193,0,192,27,128,28,194,219,200,102,-96,46,129,204,146,194,245,33,1,227,55,0,33,149,160,170,65,82,64,5,-160,33,137,111,64,69,2,53,57,32,64,116,235,197,1,245,21,0,171,65,-192,253,212,232,239,202,1,2,53,57,54,224,95,3,160,163,128,220,160,12,-99,165,169,101,2,53,57,55,64,8,167,5,224,197,15,64,39,135,19,128,-66,225,16,3,105,124,228,96,1,96,232,131,130,107,231,69,62,147,138,194,-183,243,138,1,98,232,136,35,131,229,236,192,0,224,78,2,224,13,4,34,-6,198,20,224,20,0,43,103,171,102,32,29,233,152,1,99,107,144,168,32,-23,134,15,100,82,32,13,133,226,200,238,246,106,3,130,245,244,227,0,34,-139,105,213,2,53,55,51,132,139,96,14,32,65,197,194,73,72,2,53,57,-50,209,125,64,26,132,75,2,95,50,50,34,229,2,49,51,57,217,84,32,-25,250,196,0,171,165,32,191,32,71,128,146,164,15,224,27,6,128,188,167,-82,71,1,161,126,162,149,102,154,2,55,49,32,162,44,85,71,117,75,2,-54,51,32,134,238,194,246,32,6,103,57,224,13,0,65,190,68,55,102,216,-225,79,8,170,116,32,29,225,109,5,32,23,224,29,4,186,88,230,94,7,-32,25,193,111,2,75,32,95,225,204,3,32,25,202,223,100,79,230,249,1,-230,162,10,229,98,1,231,42,11,224,48,20,103,18,184,116,247,249,0,198,-208,246,205,8,230,249,0,234,229,4,96,97,225,251,1,98,251,72,77,132,-157,246,218,2,160,62,248,227,0,247,84,3,167,52,247,188,9,247,237,0,-224,117,21,224,115,5,224,113,5,224,51,17,2,56,51,32,238,25,3,129,-120,194,178,100,7,66,182,84,167,194,230,2,55,55,32,131,180,98,198,69,-151,67,184,99,160,32,28,38,153,2,53,56,50,249,34,3,130,237,224,157,-5,32,99,162,251,2,53,55,57,64,67,229,231,0,35,1,160,10,32,170,-2,51,32,35,172,85,228,21,4,224,34,12,33,244,32,2,2,83,32,95,-102,78,96,168,192,139,64,62,224,96,0,160,46,131,201,69,96,215,121,237,-241,0,249,252,6,224,60,3,224,137,6,206,148,168,138,65,90,231,157,3,-225,16,4,210,230,225,251,0,128,75,107,147,168,38,224,70,5,2,50,52,-55,224,71,0,65,168,73,37,164,231,224,42,7,224,113,2,224,41,6,33,-104,132,74,110,186,2,52,32,90,162,22,32,23,132,70,2,66,32,89,227,-39,1,131,28,251,9,0,65,2,2,82,32,95,224,22,2,225,35,0,32,-63,132,106,251,109,1,232,3,0,251,132,5,224,20,1,224,17,8,224,14,-5,224,11,2,192,8,130,246,64,109,34,37,160,197,64,195,224,197,1,33,-94,224,197,4,64,164,240,168,2,241,210,0,2,39,32,85,240,190,2,227,-16,2,227,104,1,239,241,2,64,88,132,176,235,106,10,2,102,111,108,2,-100,108,49,184,242,81,119,64,45,132,196,224,134,0,2,83,32,80,228,45,-2,96,79,164,204,228,83,0,113,62,104,116,235,0,6,233,108,1,234,64,-1,213,64,136,22,128,169,233,77,5,201,19,190,18,103,154,71,79,233,85,-4,233,56,0,211,91,226,216,1,233,95,3,128,176,132,4,224,79,0,71,-37,128,169,204,40,160,6,32,138,32,45,131,206,232,58,1,134,108,32,24,-170,220,69,148,243,92,0,242,88,5,70,135,67,15,230,58,2,231,216,7,-96,144,203,7,253,194,0,220,39,229,182,1,253,201,2,251,221,0,234,205,-2,164,255,192,86,196,215,169,122,133,254,128,8,32,229,105,185,210,19,121,-81,231,230,0,224,64,2,143,45,224,25,3,188,57,224,27,0,230,53,3,-224,174,13,224,124,7,106,136,253,175,0,224,127,18,224,101,3,224,130,8,-224,156,5,225,91,4,192,247,65,102,35,89,226,219,1,2,92,51,52,2,-38,108,105,2,98,47,68,2,97,116,97,2,47,73,110,110,83,2,46,104,-115,64,22,2,44,49,50,2,55,58,49,98,246,33,139,168,103,2,53,54,-56,165,212,2,58,53,54,131,162,246,199,0,196,227,244,34,1,159,113,226,-71,0,103,143,229,202,5,235,36,0,234,178,3,227,211,4,195,250,192,7,-35,158,66,98,2,75,50,32,224,202,35,2,54,51,58,2,54,34,32,250,-48,6,160,168,226,43,0,227,108,3,174,97,227,93,2,67,74,174,57,228,-88,0,163,38,2,53,54,55,96,5,228,131,6,224,80,11,235,201,2,224,-80,2,172,219,107,111,33,88,196,227,131,61,100,51,230,27,0,97,50,142,-55,227,235,11,228,36,13,160,47,235,107,4,224,61,11,103,43,228,39,4,-224,79,11,228,85,18,231,43,3,32,200,203,114,208,129,233,153,21,168,171,-97,10,101,101,75,81,181,34,245,19,0,2,53,48,56,240,68,11,174,17,-32,51,177,163,2,53,54,51,226,169,1,132,218,228,30,6,193,68,229,147,-6,161,199,229,149,8,226,33,15,135,152,32,109,161,204,230,117,1,99,173,-107,141,199,171,226,121,46,224,91,0,226,121,10,224,95,3,226,121,32,224,-80,1,161,110,171,129,64,24,226,121,1,226,100,38,132,119,226,11,2,224,-10,1,32,89,134,22,33,172,32,11,133,216,2,95,52,56,211,67,2,51,-48,51,236,149,1,143,146,2,53,55,32,64,5,81,23,174,243,32,112,160,-34,32,5,160,10,32,76,232,150,1,2,95,50,53,224,65,1,2,58,53,-53,132,159,207,229,32,16,227,87,1,160,42,192,27,64,28,162,171,171,174,-226,40,3,96,19,241,61,4,96,100,180,31,167,134,199,175,132,186,101,190,-229,215,2,96,97,130,205,143,170,174,88,161,255,134,215,2,95,50,55,161,-93,234,9,3,239,225,1,142,50,138,145,194,173,230,108,0,2,89,32,67,-224,82,2,229,133,0,229,79,3,96,170,197,71,208,37,144,104,232,115,3,-241,49,0,65,38,96,145,224,143,4,236,96,8,96,148,224,146,5,65,253,-233,68,5,2,108,116,87,2,46,99,109,2,112,34,32,128,28,177,191,184,-218,179,125,96,5,33,39,163,193,2,52,57,32,33,62,98,223,86,229,32,-24,236,166,2,225,234,0,104,141,64,31,193,188,237,177,15,224,166,3,163,-68,128,13,38,28,224,185,1,32,75,130,169,64,126,200,168,75,42,153,227,-129,237,64,15,115,177,161,231,32,66,79,127,96,85,32,64,130,222,44,96,-2,53,52,52,112,190,32,121,32,22,179,133,128,24,34,109,133,142,121,37,-131,162,64,165,89,136,195,176,172,237,197,19,87,74,2,58,53,52,167,117,-230,22,7,96,38,113,114,64,115,195,122,229,143,1,44,121,2,57,32,35,-69,29,223,54,224,46,12,64,36,183,179,32,107,131,48,243,69,3,139,167,-243,93,3,99,14,162,164,228,225,1,76,162,196,99,224,232,31,229,35,0,-130,134,201,63,197,172,128,87,65,57,224,87,37,128,236,74,130,224,91,1,-128,206,160,198,192,197,224,93,5,81,192,110,88,224,91,13,224,126,38,227,-14,6,2,78,117,109,2,101,114,105,2,99,46,115,56,147,40,171,2,65,-116,66,62,216,2,58,32,110,2,101,103,97,2,116,105,118,2,101,32,97,-2,114,103,117,2,109,101,110,191,120,240,63,2,153,54,237,61,0,224,213,-3,64,5,224,178,22,97,189,108,249,102,1,224,22,1,224,75,52,247,144,-1,227,251,13,224,236,14,2,117,110,115,2,117,112,112,2,111,114,116,2,-101,100,32,2,98,97,115,223,215,128,140,117,9,226,120,6,194,110,35,64,-2,52,54,56,232,130,4,164,248,224,49,6,194,60,207,242,160,11,226,72,-8,224,70,4,152,183,174,170,224,61,0,240,31,0,225,64,12,103,16,132,-65,224,10,2,224,55,2,225,86,3,2,53,52,54,98,218,39,92,128,65,-205,132,225,81,16,35,137,134,157,194,191,130,119,160,34,96,82,96,14,96,-204,32,44,243,97,0,2,50,32,75,2,52,32,65,160,21,238,144,0,225,-33,3,236,133,0,227,100,60,193,128,236,242,0,204,10,184,199,240,253,1,-125,71,240,18,2,156,57,64,163,193,9,128,162,226,132,22,224,64,8,228,-217,0,224,86,11,243,106,5,224,98,30,160,66,211,217,33,72,170,77,137,-97,60,69,255,28,2,173,191,150,250,101,95,97,236,224,249,4,107,229,249,-58,6,99,212,64,38,64,54,126,217,192,22,38,105,2,55,32,102,227,75,-0,2,32,37,32,163,39,224,45,5,179,121,60,185,70,41,115,227,102,244,-158,212,64,15,32,184,201,221,250,172,2,81,91,97,158,202,43,65,244,98,-81,225,226,3,2,52,49,51,96,139,103,117,32,27,193,12,32,11,92,210,-128,16,32,96,250,216,0,136,56,200,169,2,49,51,52,64,248,2,51,50,-32,152,2,224,28,11,232,217,3,160,18,134,166,32,86,135,80,241,152,8,-2,108,97,115,251,130,1,137,86,33,133,64,209,252,24,0,32,60,135,118,-2,85,32,67,104,16,32,176,119,19,65,57,32,6,39,197,39,232,2,54,-32,102,224,84,0,2,45,62,34,200,9,72,49,97,47,32,85,128,59,158,-217,2,53,51,55,96,238,72,2,163,81,170,45,231,34,0,99,244,253,32,-1,245,245,3,103,38,233,70,0,234,82,2,160,160,2,52,57,53,32,160,-64,5,96,153,132,160,34,58,143,219,239,14,7,128,152,2,52,57,50,162,-187,149,122,85,173,96,161,210,212,82,124,226,110,3,96,100,153,133,64,9,-160,17,225,10,6,2,32,124,34,164,151,32,24,32,235,65,1,72,78,64,-37,55,235,67,7,160,157,64,118,32,117,253,206,0,160,174,32,128,132,138,-129,34,97,70,253,26,3,97,82,146,180,192,245,224,127,3,2,119,104,101,-2,114,101,34,232,170,0,2,53,50,53,121,206,128,143,110,66,96,118,2,-50,57,32,229,39,0,65,160,171,243,2,50,50,32,249,94,0,64,100,98,-4,99,180,132,140,2,60,32,64,2,35,51,32,66,116,224,18,4,66,121,-235,61,0,128,18,65,42,2,85,32,66,170,120,78,131,2,51,49,32,253,-25,7,130,88,207,17,192,12,224,25,1,224,21,0,129,27,225,68,9,193,-52,225,4,6,2,46,46,34,224,30,4,104,202,224,137,7,224,117,81,224,-110,14,224,97,21,224,189,20,225,112,7,143,108,225,112,4,65,228,64,117,-224,115,2,224,102,30,224,173,18,98,97,226,241,0,225,15,5,101,197,227,-80,0,226,237,39,64,116,32,15,44,2,224,228,0,34,114,239,74,1,224,-140,3,224,15,0,96,99,211,197,224,103,12,188,54,96,76,252,30,0,196,-191,32,5,192,49,77,67,160,153,192,17,156,219,96,57,213,68,2,80,32,-67,225,7,12,101,9,225,78,6,2,60,45,34,226,28,5,128,6,99,131,-38,8,224,44,5,2,108,101,116,228,38,0,227,162,23,32,143,205,5,64,-145,134,226,101,236,32,35,69,84,224,163,23,32,220,71,68,226,187,5,224,-53,14,2,52,57,57,224,217,8,2,58,58,34,192,58,2,50,48,32,229,-62,1,228,251,8,2,100,101,102,2,97,117,108,203,127,129,165,96,197,32,-6,97,184,2,58,53,50,198,30,252,138,1,96,6,152,197,32,31,240,110,-1,2,80,32,35,103,146,32,25,32,23,189,26,64,188,32,13,208,21,105,-118,65,219,2,52,55,57,96,38,132,202,2,80,32,58,2,53,50,52,228,-213,6,70,121,32,22,226,98,1,157,3,254,174,0,234,197,5,65,108,2,-61,61,32,251,162,0,202,69,164,54,200,135,224,46,15,49,167,64,248,108,-30,96,5,32,121,175,35,2,53,50,48,175,26,32,19,218,95,39,167,2,-52,57,49,195,213,70,218,34,224,97,138,64,216,128,86,32,46,209,183,43,-233,235,195,5,235,172,0,64,58,70,26,75,235,241,104,0,242,228,2,217,-41,253,90,8,229,208,8,224,25,1,224,27,5,137,117,228,123,4,66,133,-41,5,34,230,232,108,5,2,115,101,112,2,49,32,65,2,98,111,118,198,-145,224,37,17,2,66,101,115,2,105,100,101,229,64,1,231,251,4,230,86,-7,61,77,171,10,237,134,3,238,249,0,236,142,5,66,34,204,43,175,137,-226,255,1,83,221,144,19,34,23,225,47,0,96,51,131,8,241,156,1,162,-40,225,56,2,224,97,0,225,31,4,192,49,203,201,171,218,254,167,1,231,-74,5,224,195,5,224,79,0,32,193,33,196,244,162,3,128,69,171,44,64,-11,253,99,6,224,71,19,128,104,224,71,10,97,1,34,106,96,247,156,188,-254,66,1,114,96,192,90,236,164,12,230,141,1,128,22,139,208,129,116,113,-54,225,102,40,224,195,4,227,224,1,68,66,224,232,1,120,205,35,15,67,-33,195,15,206,230,237,68,10,98,13,225,143,3,225,192,21,223,236,225,176,-0,98,79,227,225,0,224,30,5,225,109,0,68,196,226,96,4,224,66,18,-192,201,226,188,4,160,135,33,140,250,198,1,2,49,55,32,196,122,33,7,-32,12,162,207,139,248,188,17,2,53,49,51,136,140,239,222,1,96,36,89,-237,97,105,226,206,12,132,95,65,68,133,114,233,231,8,68,3,227,250,49,-2,111,110,101,2,76,105,110,2,101,114,32,227,254,24,224,41,0,228,2,-6,227,249,20,2,85,32,90,193,30,99,154,227,130,9,224,62,6,65,34,-140,207,131,86,224,60,0,224,20,0,66,153,224,81,0,224,61,6,66,129,-77,230,228,120,0,64,137,89,105,135,160,64,53,110,221,230,31,0,255,49,-1,225,244,6,164,140,224,63,1,32,61,166,205,232,110,15,98,8,32,157,-232,244,7,32,54,233,92,3,103,186,232,208,2,231,243,9,224,72,38,234,-48,14,32,176,135,101,102,181,217,231,223,211,184,255,218,7,163,196,64,27,-99,136,176,93,151,230,107,121,193,66,135,174,122,182,120,204,105,238,79,153,-2,50,50,53,100,58,73,160,162,208,167,43,64,54,223,82,237,148,20,2,-102,111,114,2,97,108,108,237,152,5,128,235,2,54,50,50,225,52,4,225,-11,0,32,90,135,175,2,80,32,75,66,107,161,20,224,9,0,32,31,135,-187,162,63,2,51,54,55,144,187,64,192,126,83,202,195,89,244,2,51,57,-57,155,112,133,104,64,61,135,202,2,75,32,89,176,91,181,63,196,72,133,-107,97,37,98,146,132,219,174,252,51,204,111,243,2,50,49,53,124,20,33,-203,2,49,53,54,225,114,1,189,239,100,8,240,31,4,96,223,165,62,240,-138,0,32,33,2,50,57,54,240,65,0,96,34,193,150,83,85,197,97,137,-148,219,77,165,212,211,6,243,192,0,32,51,239,226,0,152,64,49,199,2,-48,32,35,102,14,113,212,32,249,2,35,57,48,97,67,64,219,162,73,164,-73,64,20,131,15,96,20,131,43,64,20,226,115,1,113,188,128,20,233,227,-0,2,52,52,56,192,192,225,246,1,2,64,92,57,2,50,38,61,2,43,-45,58,2,60,62,46,2,33,35,36,2,37,94,38,2,42,47,124,2,126,-63,92,2,50,50,54,2,38,92,49,2,51,54,38,2,92,49,56,2,51,-38,92,160,14,2,53,38,92,2,49,52,54,224,14,0,2,52,38,92,224,-14,8,32,4,224,59,2,2,50,56,38,66,82,32,134,226,132,1,236,105,-9,64,238,236,105,5,81,154,162,99,65,51,160,192,2,57,52,32,234,164,-0,64,68,148,140,225,190,0,2,50,57,55,121,252,34,90,76,172,33,13,-163,219,32,45,209,173,2,75,32,66,205,39,97,230,162,109,2,58,52,57,-129,197,227,92,24,102,121,227,92,0,99,38,100,214,43,39,239,182,1,228,-208,0,98,39,74,184,2,56,55,32,165,72,192,35,32,19,114,36,69,117,-67,28,96,116,96,113,96,95,133,100,32,96,220,63,37,12,75,163,101,18,-32,22,197,16,193,21,107,44,99,223,235,186,92,96,182,235,186,2,96,133,-253,226,0,34,128,248,77,1,71,233,76,186,32,35,130,4,225,99,6,83,-250,193,99,76,17,228,192,7,103,145,123,57,32,250,32,13,219,6,225,113,-13,97,55,225,113,20,108,117,225,113,2,158,84,160,7,64,110,253,249,1,-227,116,0,224,201,7,64,67,148,242,193,56,236,108,1,225,60,1,233,59,-0,232,213,14,140,211,128,168,249,45,11,128,71,129,101,193,103,32,194,64,-121,2,65,32,58,96,56,158,239,79,60,2,56,53,32,64,30,130,23,32,-14,2,52,32,35,2,49,48,48,188,100,251,135,0,87,83,105,157,224,20,-7,164,153,96,70,142,30,64,66,188,89,70,58,2,56,48,32,77,178,110,-73,2,56,50,32,2,64,64,75,96,111,129,210,117,209,32,13,129,169,101,-169,32,13,205,185,205,86,194,139,199,247,121,6,246,174,3,138,154,75,110,-2,52,53,53,235,26,4,33,252,99,220,137,215,170,169,121,46,32,190,157,-44,36,51,203,233,32,123,129,196,98,37,64,87,233,144,10,192,138,32,83,-67,65,192,89,226,84,0,227,196,5,224,47,4,71,27,224,47,0,2,58,-52,55,189,59,227,68,2,238,59,28,224,39,24,166,102,235,145,0,237,36,-15,226,65,9,235,110,3,224,7,5,224,190,7,238,31,13,227,252,2,192,-13,255,202,2,135,118,101,116,2,52,55,53,242,223,1,224,89,4,235,214,-3,171,147,133,59,127,251,231,29,0,224,15,0,227,101,1,238,206,20,192,-171,238,199,3,238,196,5,224,88,7,224,104,11,225,119,1,238,156,14,237,-203,18,238,41,1,205,203,202,147,64,224,238,146,2,224,118,7,224,50,7,-133,210,219,49,197,174,227,37,3,229,127,14,224,225,9,128,88,141,0,204,-28,238,141,39,32,189,206,146,224,188,10,132,134,34,236,210,126,104,238,233,-115,1,165,3,225,85,15,193,52,238,43,14,96,137,135,174,238,10,13,236,-77,3,73,83,175,179,39,232,84,196,199,232,96,255,99,247,2,95,55,52,-68,131,65,145,101,15,2,57,32,67,206,12,122,109,2,64,73,32,69,4,-33,128,162,194,32,43,252,201,0,131,198,242,4,0,225,66,11,230,21,1,-225,209,1,228,79,3,225,66,3,163,238,227,200,3,225,221,12,160,222,225,-0,0,97,189,144,16,97,4,195,90,227,231,26,224,67,5,97,221,72,190,-243,42,2,228,1,3,64,252,165,236,243,47,0,243,44,19,241,25,0,224,-210,2,243,39,86,2,97,98,111,2,118,101,78,2,101,115,116,239,45,25,-224,42,1,243,49,58,225,178,13,243,49,10,225,238,1,242,178,2,224,24,-12,226,9,4,225,54,15,172,126,229,250,24,243,31,49,224,151,7,243,43,-7,241,121,8,242,59,5,66,24,32,69,196,195,164,196,97,35,228,196,0,-233,10,29,160,151,224,138,2,242,225,5,98,183,241,149,0,243,129,16,244,-74,24,175,74,225,42,8,243,137,1,225,179,19,229,99,2,254,166,1,64,-150,35,59,215,48,246,115,1,227,64,22,243,104,0,253,217,8,224,23,1,-226,21,11,226,90,3,243,116,14,192,167,169,116,2,95,55,53,225,212,2,-229,91,27,96,125,225,76,0,249,5,0,142,167,133,59,110,163,95,186,65,-9,128,67,225,70,2,193,33,210,50,64,253,47,127,191,168,244,156,2,97,-213,254,233,4,230,68,30,192,48,224,28,4,170,48,224,224,6,96,21,232,-63,5,230,130,19,163,218,117,78,225,57,4,225,58,26,239,233,0,137,25,-2,53,50,32,235,101,8,210,224,97,56,70,129,33,3,139,37,32,19,57,-182,100,84,249,220,1,101,59,89,220,64,28,96,37,37,166,32,12,135,130,-100,197,66,114,245,202,1,34,119,228,49,0,122,46,194,225,135,189,128,39,-201,49,226,103,25,227,82,11,229,220,17,253,128,6,112,204,113,93,225,138,-2,229,170,6,2,98,101,115,2,116,32,103,219,233,229,131,4,248,182,21,-160,198,98,90,102,198,105,61,231,144,5,229,2,5,195,15,248,17,7,250,-36,14,228,54,10,233,80,18,229,2,1,224,124,8,97,74,65,162,99,140,-230,97,3,192,42,228,125,0,226,78,5,193,186,193,188,246,255,1,247,158,-32,247,205,3,151,112,224,46,12,200,159,229,163,1,225,200,48,2,49,34,-32,225,201,9,226,133,12,225,208,4,227,203,0,133,6,64,61,101,40,225,-213,2,229,178,0,72,222,225,184,5,224,220,20,197,172,250,107,26,164,158,-250,35,23,236,212,0,64,56,70,141,228,40,0,250,14,2,230,101,19,226,-138,14,229,134,4,32,13,47,82,151,82,32,6,64,4,35,248,138,221,147,-244,33,27,32,17,202,223,2,54,52,32,32,13,244,1,2,151,143,64,34,-182,54,71,168,32,13,253,220,1,32,36,96,241,132,96,241,100,0,2,48,-32,58,99,50,254,99,10,64,28,202,37,111,164,33,164,64,138,2,58,52,-53,132,159,241,4,4,225,147,2,32,42,107,48,134,73,224,246,1,181,194,-98,204,37,118,166,81,65,245,129,249,96,227,64,101,208,135,199,77,192,42,-101,81,202,228,230,63,0,232,169,2,233,84,10,230,63,44,254,39,2,224,-35,8,192,86,230,63,0,96,236,252,42,17,249,57,15,148,92,128,110,160,-10,227,103,7,2,102,105,116,2,115,34,32,128,25,149,9,96,108,130,20,-32,171,129,48,130,20,2,75,50,32,230,34,0,231,212,2,65,151,253,167,-3,129,167,249,147,7,65,248,227,185,8,252,31,3,234,183,21,229,45,7,-231,198,12,143,5,231,134,4,224,238,6,2,100,105,115,2,112,108,97,2,-121,32,108,2,97,121,34,229,57,6,232,223,12,224,29,0,65,79,174,20,-225,178,0,239,11,31,33,88,87,234,248,50,0,46,99,88,138,224,78,0,-207,11,241,16,1,64,5,96,53,232,235,9,228,63,2,96,32,224,184,0,-228,57,15,225,113,7,234,42,7,240,171,24,225,106,57,2,50,34,32,225,-77,5,133,114,230,222,10,224,210,29,225,130,82,65,231,101,39,124,238,128,-31,160,7,100,26,35,12,133,19,145,111,67,49,33,160,32,254,32,24,214,-177,35,31,153,154,32,19,248,166,1,2,48,32,95,2,50,51,32,102,140,-2,50,53,56,106,250,72,104,117,78,128,26,2,95,49,55,64,98,85,29,-192,44,2,95,51,50,74,240,139,49,48,139,160,21,2,50,54,49,147,123,-192,58,64,59,166,152,32,116,184,225,97,227,255,163,1,208,135,101,26,89,-187,2,50,57,56,255,243,2,2,51,51,50,89,211,119,48,123,76,250,95,-0,96,124,88,227,65,224,229,116,0,225,80,5,225,247,1,2,114,101,99,-2,117,114,115,2,105,118,101,2,32,109,111,2,100,117,108,2,101,58,32,-161,253,235,247,0,82,212,2,51,50,57,160,193,224,71,15,2,44,32,105,-2,109,112,111,2,114,116,32,2,99,104,97,2,105,110,58,160,69,65,116,-89,98,156,74,128,69,172,3,2,52,53,48,97,114,217,200,2,90,32,90,-129,184,32,19,134,102,32,227,2,51,32,75,185,181,237,152,5,2,50,55,-52,253,24,0,97,4,97,201,33,15,89,177,75,126,64,22,210,169,32,22,-121,29,64,28,128,16,82,233,2,52,53,32,189,206,64,26,167,71,88,136,-32,92,237,171,0,32,25,249,82,1,97,230,87,128,58,54,93,64,2,50,-55,32,235,247,4,98,214,132,21,224,42,0,225,142,2,64,52,129,18,2,-51,49,54,65,212,2,50,56,32,239,228,2,165,121,190,3,69,125,128,73,-32,58,96,51,58,9,189,36,2,95,52,48,32,94,2,52,48,51,227,55,-0,225,150,17,2,77,111,100,33,212,2,32,110,111,2,116,32,102,2,111,-117,110,2,100,58,32,161,222,183,65,97,221,2,49,50,51,65,108,173,200,-224,76,17,2,92,49,48,2,38,115,101,2,97,114,99,2,104,32,112,2,-97,116,104,2,61,34,32,160,190,128,71,64,58,64,73,2,49,51,49,192,-4,67,80,157,213,65,43,224,91,23,2,112,97,99,2,107,97,103,2,101,-32,112,224,92,1,224,83,18,225,63,0,229,55,14,233,225,0,225,140,1,-225,137,4,33,65,245,45,0,241,19,1,199,25,131,190,129,194,224,31,1,-80,240,2,51,55,32,234,5,3,227,36,0,167,95,132,101,193,95,231,255,-6,128,5,104,220,193,12,2,52,51,57,98,136,228,241,8,66,174,228,241,-2,169,73,226,131,0,2,50,56,57,234,77,2,165,91,247,161,2,35,109,-128,135,228,13,35,193,129,2,100,111,101,2,115,32,110,34,52,2,99,111,-110,2,116,97,105,2,110,32,109,130,71,226,60,1,192,244,229,172,12,245,-147,1,227,243,3,227,67,18,160,220,101,31,161,115,215,86,99,240,35,14,-35,177,134,238,120,122,237,196,5,204,16,228,173,0,122,172,48,162,132,31,-133,233,224,229,1,2,46,116,120,78,114,32,25,133,239,91,134,94,114,128,-5,32,22,203,12,62,153,159,204,36,19,64,88,96,5,32,31,235,30,1,-188,19,32,19,132,179,225,74,8,73,174,2,58,52,51,171,31,234,195,2,-38,84,234,195,2,124,11,96,106,197,224,133,205,198,181,224,244,4,236,212,-0,128,49,32,94,171,34,226,185,8,165,196,164,67,2,50,52,50,64,25,-69,58,100,89,100,231,2,50,55,57,133,82,65,38,248,97,1,227,40,2,-194,64,2,50,52,32,226,168,9,224,240,1,2,76,111,97,2,100,105,110,-2,103,32,112,162,67,245,119,0,227,130,18,2,50,55,49,160,140,224,180,-1,228,244,2,224,176,2,64,68,2,50,57,54,32,4,163,188,66,87,39,-76,97,227,226,226,4,226,223,19,2,80,97,99,96,155,2,99,111,109,2,-112,105,108,2,101,32,118,2,101,114,115,2,105,111,110,2,32,109,105,2,-115,109,97,2,116,99,104,2,58,32,112,128,33,164,126,226,83,1,128,111,-230,254,18,160,82,2,114,61,34,103,140,160,153,225,75,2,36,188,64,183,-137,50,65,180,184,171,129,180,135,207,69,131,199,207,71,250,128,22,2,51,-51,52,224,22,3,97,10,38,168,132,108,66,157,2,51,53,53,64,162,138,-116,33,91,64,122,229,150,0,32,23,119,251,64,68,245,64,0,65,41,32,-18,152,249,64,37,157,183,2,50,32,65,128,17,134,245,32,17,2,52,32,-75,128,17,131,68,119,112,231,168,0,64,88,32,20,2,90,32,85,98,133,-163,54,2,51,53,51,2,32,95,56,96,17,178,220,199,200,216,158,231,191,-0,32,34,131,55,96,123,232,2,0,32,23,65,110,192,23,64,132,96,2,-192,30,96,32,130,243,33,152,2,54,32,58,100,71,32,13,2,94,71,69,-2,84,84,73,2,77,69,77,2,73,76,76,2,73,32,58,64,27,161,99,-214,101,238,29,11,39,87,96,142,237,4,9,233,217,0,100,201,131,157,234,-2,9,170,141,160,81,234,58,15,167,208,71,217,227,150,5,231,218,18,226,-112,17,2,70,105,108,231,214,10,231,44,3,167,39,253,186,5,234,170,1,-2,52,48,57,243,91,1,128,249,224,237,2,234,126,1,193,55,164,237,101,-250,100,57,95,114,96,253,199,72,199,110,234,248,7,67,60,187,18,235,3,-3,160,14,100,1,110,108,97,213,233,110,6,98,185,35,241,224,248,1,2,-109,104,115,2,99,112,112,2,46,104,115,230,139,0,206,16,164,255,249,167,-2,224,138,1,96,132,197,93,225,5,4,207,171,235,177,4,2,52,50,51,-100,235,224,171,0,128,156,251,36,0,225,227,3,2,49,50,48,100,31,67,-124,99,154,228,187,3,64,114,65,48,68,185,75,232,165,97,237,124,6,2,-114,101,109,58,179,97,210,2,102,97,105,2,108,101,100,128,219,32,113,131,-96,2,94,117,110,2,108,105,110,2,107,32,58,96,101,161,31,225,33,2,-2,50,49,49,224,77,2,2,77,72,83,2,67,80,80,2,72,83,34,160,-184,238,165,1,232,220,5,148,154,230,33,10,192,180,102,17,205,157,230,3,-2,226,151,19,2,82,117,110,2,32,99,112,2,112,104,115,226,146,20,33,-211,231,248,3,231,186,2,33,36,224,87,12,96,83,230,82,0,200,47,224,-133,15,2,32,45,45,2,110,111,108,2,105,110,101,32,8,2,115,116,114,-2,105,112,32,192,58,233,233,0,234,179,0,108,160,233,141,0,2,49,57,-32,97,255,231,8,0,232,224,22,165,79,139,71,224,142,17,2,79,34,32,-232,169,1,33,198,204,245,228,221,0,68,251,128,1,233,243,2,32,40,133,-30,2,79,32,102,224,76,0,2,39,45,68,2,77,73,78,2,95,86,69,-2,82,83,73,2,79,78,95,2,98,97,115,2,101,40,120,2,44,121,44,-2,122,41,61,2,40,120,60,2,61,52,124,2,124,121,60,2,61,49,52,-2,41,39,34,32,72,224,56,3,2,45,68,95,2,95,77,72,2,83,95,-95,64,24,133,213,64,237,140,247,2,56,32,79,224,214,1,32,24,133,93,-228,206,6,162,234,114,156,236,157,4,226,236,20,234,131,38,2,99,97,108,-2,108,67,111,2,109,109,97,68,214,131,14,236,180,16,2,49,52,56,236,-180,23,2,44,32,34,229,26,19,32,234,166,58,2,115,121,115,2,116,101,-109,35,99,64,222,99,99,227,232,3,224,236,2,97,5,181,152,64,34,224,-21,4,112,141,33,34,99,54,240,27,4,2,50,49,48,240,27,10,58,22,-224,39,5,33,64,2,51,55,55,97,102,136,205,229,51,4,165,40,64,29,-35,137,32,171,133,47,104,10,39,246,193,125,2,49,51,52,65,126,78,214,-70,185,2,57,49,32,253,104,0,104,86,122,161,105,73,225,51,2,130,120,-134,224,42,20,237,155,2,2,51,52,38,2,108,105,98,2,47,83,121,65,-33,2,47,73,79,37,125,64,19,2,44,50,56,2,53,58,56,129,94,2,-90,32,66,64,96,75,168,96,110,97,18,33,238,128,131,160,19,180,254,64,-36,224,118,7,32,202,229,93,0,49,145,167,75,32,41,224,84,3,171,33,-249,11,3,165,189,252,173,4,67,222,224,136,1,241,24,0,242,167,0,203,-92,235,65,2,73,50,149,51,33,192,32,14,133,102,2,94,116,109,2,112,-110,97,2,109,101,32,32,17,227,177,0,227,176,8,227,178,4,64,60,219,-196,59,244,64,106,32,137,2,54,32,89,135,73,251,155,1,213,101,254,20,-17,208,85,82,1,97,176,97,213,2,35,49,50,254,6,3,245,137,1,217,-78,108,42,224,45,0,112,230,255,159,0,181,212,246,194,1,224,42,3,106,-13,243,177,2,224,129,17,168,58,242,176,0,224,74,8,113,130,34,215,64,-112,224,33,14,40,232,224,33,22,134,34,224,67,20,97,57,96,33,106,88,-130,225,224,36,7,162,4,215,193,224,0,3,225,132,8,226,88,4,225,133,-19,193,44,225,132,71,2,49,50,53,224,166,2,137,125,224,133,18,194,216,-202,223,40,208,67,87,99,254,248,69,1,250,79,0,250,78,1,231,89,4,-140,178,115,163,2,52,48,53,169,46,65,92,2,58,52,48,249,217,0,228,-161,9,138,215,233,79,9,228,175,2,32,64,230,73,9,37,72,32,6,192,-219,2,83,32,67,161,1,102,51,2,95,54,50,142,230,168,121,165,49,192,-59,71,176,2,48,54,32,234,116,4,234,83,4,172,219,2,50,54,52,254,-196,0,234,145,7,224,47,0,196,122,64,74,131,177,69,17,76,213,32,19,-172,58,64,1,102,116,109,255,47,230,2,35,54,53,167,13,79,243,2,35,-57,48,129,60,33,107,229,54,14,2,68,97,116,2,97,47,67,2,104,97,-114,197,54,34,146,2,58,49,34,239,105,2,32,170,96,166,215,59,242,58,-6,2,49,52,57,96,123,2,57,32,35,156,66,128,11,44,54,160,190,203,-52,36,241,110,64,149,0,34,9,141,33,35,1,32,4,118,225,76,89,164,-198,64,13,132,230,2,85,32,58,64,35,128,10,122,66,67,156,109,184,54,-115,2,58,51,57,130,3,45,80,64,15,101,39,137,127,231,211,2,246,46,-5,38,131,240,42,19,244,133,0,2,64,58,51,64,197,96,120,241,28,0,-149,71,32,68,222,121,233,175,2,231,197,11,232,78,21,246,208,1,241,124,-2,226,110,1,156,65,224,26,12,226,137,6,224,102,21,106,108,247,58,11,-232,167,33,2,99,111,108,232,171,5,128,52,32,0,224,37,1,2,101,110,-100,2,45,111,102,2,45,102,105,2,108,101,34,96,28,224,26,1,2,110,-111,32,2,108,111,99,2,97,116,105,2,111,110,34,224,55,8,224,28,7,-33,119,130,223,110,205,71,133,75,119,101,4,32,26,194,79,99,154,2,51,-57,51,164,81,224,183,12,237,137,0,175,12,173,209,48,133,34,53,32,75,-217,102,32,71,67,151,130,155,64,83,254,48,0,218,58,130,188,135,180,128,-6,32,39,130,161,2,89,32,66,165,56,231,195,9,167,194,96,48,217,208,-218,241,253,74,2,192,18,34,76,253,207,7,181,198,239,248,1,131,237,226,-161,0,195,12,2,48,32,80,32,5,2,56,54,32,32,158,2,56,55,32,-117,200,128,238,32,81,2,51,56,56,97,60,85,150,241,76,4,96,24,64,-63,2,49,50,52,142,171,99,222,138,76,133,150,32,68,132,173,32,22,80,-11,96,92,32,132,36,244,128,11,32,68,131,38,33,86,126,42,80,50,2,-49,53,55,228,109,2,2,67,111,110,2,116,114,111,2,108,46,69,2,120,-99,101,2,112,116,105,2,111,110,46,2,73,110,116,2,101,114,110,2,97,-108,34,32,64,224,39,1,2,83,111,109,2,101,69,120,160,35,165,248,137,-85,32,100,130,19,103,249,131,131,2,56,50,32,54,180,168,197,2,51,56,-51,96,47,66,193,250,201,0,2,51,56,52,128,160,194,52,39,135,82,14,-96,23,242,28,0,96,58,171,84,65,234,2,56,48,32,217,205,159,253,2,-51,56,49,116,140,160,136,196,152,77,31,128,94,129,221,34,194,56,125,32,-14,129,147,230,28,6,230,153,0,2,51,55,56,240,220,1,238,237,3,74,-245,109,225,144,154,2,58,51,55,129,174,2,75,32,90,160,104,64,57,242,-50,0,241,17,1,145,202,138,140,68,249,102,100,227,204,16,2,111,112,101,-2,110,70,105,91,77,2,99,97,110,81,165,64,16,196,30,231,30,3,96,-174,165,144,211,86,2,51,55,54,161,235,2,55,51,32,32,4,75,232,2,-51,55,53,246,95,6,97,221,2,97,99,116,59,186,86,98,96,38,128,52,-66,53,2,55,50,32,64,19,129,116,32,14,66,53,100,235,64,3,32,24,-240,70,1,214,193,64,35,199,233,98,225,2,54,55,32,64,5,99,197,67,-217,163,197,2,54,56,32,2,64,116,111,96,131,32,24,64,30,166,26,64,-24,100,80,32,10,231,79,0,244,249,1,244,206,2,70,239,212,206,2,67,-32,66,96,102,102,215,32,57,244,138,2,129,143,64,25,244,67,5,34,96,-192,184,32,56,166,4,32,40,196,105,192,28,224,37,0,68,55,32,31,198,-250,252,105,1,2,51,54,50,247,151,1,33,225,66,228,2,50,53,49,243,-40,3,34,146,78,218,65,73,243,252,7,2,50,55,55,173,228,147,90,226,-102,0,242,5,12,247,113,21,241,93,1,247,96,25,2,115,97,118,47,18,-2,99,97,99,2,104,101,32,163,192,231,20,6,192,175,109,252,2,54,48,-32,226,118,5,160,184,32,253,225,241,0,254,121,4,219,5,55,121,166,248,-96,12,72,224,248,86,0,194,38,250,150,16,203,12,203,148,36,184,96,220,-217,225,2,95,55,56,231,44,3,253,0,1,253,59,19,67,223,65,76,230,-125,10,253,70,5,237,96,1,117,154,214,119,128,18,253,159,4,248,143,5,-127,191,242,151,3,239,173,1,248,189,11,148,222,235,205,1,129,246,160,182,-248,187,1,241,20,0,2,49,54,54,236,131,6,32,113,133,249,64,51,38,-184,224,162,19,108,25,158,189,2,51,50,54,128,174,200,33,252,238,3,64,-27,224,126,4,242,246,3,250,32,31,243,255,13,250,16,10,232,211,19,2,-105,110,118,2,97,108,105,2,100,97,116,57,113,66,174,209,200,254,113,4,-237,25,1,224,154,4,68,107,184,220,192,130,224,172,2,226,142,4,226,39,-2,148,62,224,48,0,64,177,105,202,2,51,53,52,225,121,2,32,14,100,-214,67,26,168,50,66,51,68,20,237,113,0,144,79,129,85,66,59,225,227,-1,219,153,112,98,89,121,96,0,96,35,96,181,119,243,153,132,2,58,51,-53,179,97,65,33,77,95,2,51,53,54,128,143,35,130,32,29,187,184,96,-128,131,126,110,76,224,105,4,145,243,192,135,253,226,0,168,182,75,48,64,-169,206,173,254,149,2,224,61,2,101,15,233,44,2,64,126,101,12,80,238,-96,147,229,26,0,240,212,8,32,31,165,131,90,117,101,176,218,130,161,99,-89,240,158,14,32,104,2,79,32,64,160,58,189,47,97,123,229,153,0,66,-228,148,60,128,2,96,153,224,183,3,64,176,2,95,51,52,141,7,137,236,-164,65,59,49,32,82,32,117,98,148,128,10,226,252,3,129,130,217,197,224,-98,1,175,206,249,10,6,184,249,227,5,0,163,29,225,246,0,96,8,2,-95,54,51,66,67,163,231,65,221,95,150,255,119,3,138,140,2,51,52,49,-238,110,0,250,67,0,224,44,1,33,3,170,240,64,222,77,98,66,169,203,-100,251,229,10,137,37,102,144,226,73,0,234,223,2,255,231,2,64,64,42,-126,161,12,193,6,240,17,1,201,100,142,83,37,126,2,51,51,53,137,197,-224,217,0,42,217,156,57,225,81,4,160,70,225,69,10,225,94,0,225,60,-8,74,52,225,60,25,128,73,209,172,176,219,35,64,98,54,226,126,7,224,-44,4,192,120,123,114,224,48,20,44,186,209,51,45,72,32,135,101,171,32,-252,131,126,96,6,64,185,195,116,160,45,129,200,67,8,128,78,115,239,224,-9,0,117,220,64,35,166,157,32,54,176,30,160,54,160,34,224,63,11,96,-55,204,85,226,37,16,170,214,72,103,73,163,225,198,1,68,108,161,158,2,-90,32,83,225,144,4,226,240,0,227,74,1,227,1,1,227,31,1,103,9,-224,80,4,225,115,16,201,67,224,177,0,230,92,0,237,44,1,251,181,1,-224,192,3,64,47,224,192,73,226,98,0,233,211,5,224,190,15,192,46,97,-151,232,72,0,224,191,16,192,14,131,41,227,226,2,128,209,133,162,228,188,-2,228,186,1,195,17,251,97,3,115,163,163,111,37,222,130,119,247,247,0,-209,225,226,136,5,167,100,224,89,1,252,195,2,225,33,6,192,114,224,227,-1,234,234,1,224,11,0,254,236,4,160,207,229,68,23,225,69,8,225,52,-1,224,208,0,138,29,2,82,32,64,229,152,29,247,30,10,225,248,5,225,-55,1,64,15,185,221,227,172,7,243,25,4,123,175,128,11,32,30,126,133,-225,73,0,163,92,224,98,14,228,14,18,224,97,38,165,236,225,244,3,162,-237,81,68,64,7,230,148,9,224,13,19,229,97,3,193,195,233,209,4,214,-2,2,95,52,55,224,184,5,224,171,4,41,187,224,24,0,195,151,143,161,-73,199,225,211,4,81,74,224,176,8,224,177,65,208,62,64,158,224,177,39,-139,134,154,184,224,21,1,143,171,66,199,237,225,2,224,195,17,169,175,172,-155,199,155,192,8,32,72,219,225,224,72,28,232,170,5,227,21,1,151,144,-224,5,0,39,132,224,61,0,229,224,4,96,49,234,76,0,234,85,1,225,-57,0,224,167,5,247,204,2,96,17,227,162,2,96,16,224,15,0,192,224,-225,151,1,224,119,33,192,35,225,39,19,229,25,11,251,197,0,65,69,138,-21,228,137,1,227,5,16,225,143,2,230,249,6,203,169,224,103,15,32,101,-220,22,224,101,29,232,174,4,225,181,1,225,46,6,160,67,228,231,6,230,-135,5,225,150,67,224,98,10,225,129,60,138,84,2,35,50,32,32,11,138,-79,231,89,15,230,55,0,227,156,1,224,5,1,135,102,224,225,1,231,127,-6,200,61,171,149,231,117,14,231,141,17,224,128,3,192,208,170,44,102,59,-231,29,8,229,144,4,132,32,135,34,228,44,0,43,66,64,255,203,18,178,-18,65,110,145,236,64,168,65,25,2,48,32,58,101,182,64,11,2,51,32,-58,101,208,227,249,0,228,234,21,226,4,3,242,78,8,97,126,64,186,168,-236,81,198,34,145,128,165,83,202,192,255,32,37,179,205,41,26,234,108,0,-97,88,100,120,118,158,182,142,214,149,128,24,64,11,182,189,224,24,11,160,-49,150,221,44,54,108,65,66,129,32,113,243,50,20,2,50,55,52,224,192,-0,131,91,57,255,64,42,249,255,1,76,143,243,192,2,2,50,56,50,247,-24,0,251,105,2,67,68,143,127,32,48,129,137,118,227,39,96,96,140,129,-188,2,50,57,32,214,202,96,17,32,43,129,155,75,26,44,29,151,53,64,-37,161,151,127,53,2,50,57,48,66,28,150,15,141,12,79,200,237,12,0,-80,248,116,108,129,103,96,180,64,44,184,209,65,28,87,38,97,29,32,25,-197,239,224,206,17,97,146,65,217,66,89,64,50,129,67,155,40,113,164,224,-64,1,2,49,57,50,128,218,117,100,64,63,32,27,2,94,109,100,2,53,-66,70,2,73,76,69,33,76,64,24,228,179,2,64,188,117,82,158,209,104,-229,155,39,2,50,48,32,96,108,194,199,112,35,76,83,254,20,4,62,64,-64,199,64,153,2,35,52,55,131,7,153,93,64,63,225,74,7,64,25,246,-41,3,32,17,129,44,32,37,2,51,32,90,224,1,14,233,163,2,162,28,-64,172,160,196,121,70,180,60,153,229,240,134,2,253,218,4,82,54,112,255,-158,27,239,217,9,113,146,98,179,226,79,8,64,14,122,59,235,151,0,65,-5,137,123,242,98,6,2,79,32,35,65,8,192,180,32,172,225,225,10,98,-54,254,55,1,225,238,6,128,100,32,57,216,183,226,121,4,2,50,57,49,-226,121,14,84,198,246,161,5,64,24,239,152,12,66,137,196,207,238,189,0,-111,34,171,56,239,130,2,251,60,5,161,100,239,135,6,230,54,5,230,71,-7,98,105,224,85,5,224,80,0,98,212,64,170,130,152,2,95,52,56,64,-232,88,208,64,174,2,90,32,67,128,6,160,58,211,150,224,28,6,73,203,-224,28,16,76,234,224,28,16,107,113,224,29,16,2,50,52,55,224,29,3,-2,95,53,57,225,21,0,51,160,160,10,32,187,164,98,128,187,120,156,62,-205,160,56,32,17,36,115,96,72,2,48,57,32,112,203,64,16,96,149,224,-16,3,128,137,224,17,3,128,125,160,17,128,122,96,80,128,122,131,159,64,-6,224,122,1,34,48,32,48,81,172,2,51,48,53,96,5,99,203,2,48,-55,32,64,5,66,252,96,70,96,82,128,70,96,10,2,58,51,48,131,153,-2,98,115,62,2,61,32,58,96,41,128,13,64,12,131,108,2,98,115,60,-96,26,130,205,32,13,64,12,130,160,2,98,115,99,2,109,112,32,32,14,-201,15,199,172,231,238,1,98,225,104,154,95,177,231,207,9,64,143,148,156,-95,223,64,6,167,84,81,254,32,89,130,199,112,176,32,13,130,42,100,25,-32,13,129,124,112,223,32,13,196,118,244,47,13,96,126,198,242,226,9,6,-99,130,65,189,180,142,70,183,98,137,64,54,189,40,32,54,161,173,128,45,-146,175,129,173,87,70,160,17,32,48,244,197,3,64,26,224,62,2,120,232,-94,125,32,24,193,65,2,47,61,32,32,13,129,64,2,98,115,61,96,13,-128,244,58,192,64,95,134,63,145,197,37,82,106,35,32,24,162,121,2,51,-32,66,227,211,1,228,173,0,2,64,95,57,164,53,64,42,162,41,228,133,-0,228,117,3,126,193,134,95,121,38,103,48,183,112,246,194,0,132,187,244,-94,0,252,130,4,189,53,41,139,64,44,96,13,128,23,41,43,151,182,32,-6,247,65,0,32,100,200,237,34,229,98,23,93,224,32,22,193,54,251,9,-1,96,25,230,35,1,192,20,213,247,64,82,32,131,231,64,19,101,79,39,-255,247,191,1,224,208,36,68,7,224,208,0,38,194,224,207,0,121,6,126,-98,96,6,193,135,224,92,5,247,155,0,225,44,14,224,171,6,186,33,96,-107,96,106,101,218,96,6,137,14,96,86,227,101,0,224,85,7,103,110,224,-77,2,32,46,130,33,137,61,96,35,167,149,2,75,52,32,231,109,26,2,-58,50,55,130,14,2,82,32,95,104,179,32,16,163,11,73,173,151,180,160,-5,119,83,183,198,123,200,128,37,2,53,32,58,96,25,227,178,0,108,142,-253,15,18,106,6,254,81,4,2,46,109,104,2,115,99,97,57,166,94,79,-124,65,140,79,231,220,15,253,13,5,166,178,129,226,253,10,0,187,35,167,-91,69,71,198,226,2,50,55,49,161,60,190,140,225,104,3,64,105,93,155,-160,105,224,132,3,32,24,108,49,225,152,5,249,182,1,233,57,6,2,49,-50,50,130,152,225,174,0,250,102,0,160,77,120,197,224,158,1,2,50,50,-49,128,23,138,218,224,122,5,64,227,252,20,3,224,226,2,226,16,3,96,-213,164,52,2,50,54,57,65,154,130,18,2,73,79,46,2,100,101,115,2,-101,114,105,59,22,2,122,101,32,2,58,50,54,129,247,2,94,97,100,2,-100,95,108,2,122,55,55,2,95,100,101,2,99,111,109,2,112,114,101,2,-115,115,111,2,114,32,58,96,133,225,133,6,128,178,169,119,224,133,0,190,-116,98,27,117,180,224,143,2,32,70,130,39,2,94,117,110,2,103,101,116,-2,98,32,58,96,40,225,115,6,32,61,32,6,234,124,3,88,162,38,193,-79,104,32,190,140,219,227,71,3,32,49,108,74,35,164,2,50,32,102,226,-71,0,2,104,71,101,2,116,67,104,2,97,114,58,2,32,69,79,2,70,-34,32,129,14,223,198,2,49,52,52,64,126,130,123,2,94,103,101,128,141,-226,107,0,227,109,6,89,53,32,18,34,176,195,239,187,123,252,115,17,2,-111,112,101,2,110,66,105,2,110,97,114,2,121,70,105,2,108,101,58,60,-120,2,110,110,111,2,116,32,111,32,22,252,125,4,255,46,2,161,61,225,-8,1,91,29,224,232,5,98,20,96,199,169,65,2,50,54,48,64,184,129,-228,2,94,99,108,2,111,115,101,96,201,129,231,195,227,2,58,50,53,183,-16,224,218,12,227,63,9,224,36,3,64,242,59,121,191,179,156,55,96,154,-224,155,4,198,135,224,163,0,64,116,130,53,98,85,140,146,96,55,192,18,-2,117,116,102,44,22,96,81,166,29,91,161,32,119,64,58,177,212,64,31,-232,105,3,224,186,1,253,133,3,2,49,50,48,251,166,0,222,68,96,19,-67,135,64,221,235,177,3,2,49,49,52,171,178,224,23,7,33,35,133,17,-224,24,5,71,222,224,23,8,225,233,1,2,119,43,34,197,196,2,50,53,-50,173,196,226,188,0,2,50,48,55,134,63,190,76,225,204,1,199,182,228,-186,7,32,241,173,202,2,102,111,112,34,45,32,15,129,236,139,235,229,201,-11,229,199,5,32,48,130,15,239,215,5,32,22,168,21,79,29,79,144,242,-8,8,224,2,25,62,64,237,160,5,242,105,6,224,1,13,126,118,48,166,-225,52,1,2,70,108,97,2,103,115,123,193,56,224,0,5,243,99,1,224,-2,31,96,150,224,102,11,2,118,101,114,2,98,111,115,2,101,61,34,195,-113,64,33,89,74,81,40,224,0,9,224,199,31,77,247,194,68,224,189,54,-224,186,16,2,114,117,110,2,73,116,61,224,184,3,2,50,52,53,224,184,-14,224,181,56,224,180,35,224,177,16,39,183,2,100,105,114,225,107,5,228,-221,1,224,184,11,224,181,53,224,180,32,224,177,16,2,112,97,116,2,104,-115,61,224,176,9,229,147,2,224,182,10,224,179,50,224,178,29,224,175,16,-2,111,117,116,2,112,117,116,225,97,33,224,167,47,224,166,26,224,163,16,-2,108,111,97,2,100,105,110,2,103,61,34,226,185,24,224,155,44,224,154,-23,227,79,17,2,101,97,100,2,67,97,99,2,104,101,61,224,153,24,224,-150,41,224,149,20,224,146,16,2,119,114,105,2,116,101,67,224,147,28,224,-144,38,224,143,17,224,140,16,2,117,115,101,2,84,105,99,2,107,115,61,-224,138,22,224,135,35,224,134,14,224,131,16,2,100,111,67,2,80,80,61,-224,128,21,224,125,32,224,124,11,224,121,16,2,99,112,112,2,65,114,103,-228,11,34,224,132,29,224,131,8,224,128,17,171,110,224,253,20,224,114,26,-224,113,5,224,110,16,2,98,117,105,2,108,100,80,2,107,103,61,224,110,-5,76,125,224,240,12,224,119,23,224,118,2,228,25,17,2,105,115,116,224,-114,33,224,111,20,246,210,1,229,217,15,2,107,103,80,37,220,225,207,29,-224,104,17,170,82,224,100,14,2,105,110,115,2,116,97,108,2,108,80,107,-228,237,17,224,88,14,224,77,11,2,116,97,114,44,135,231,62,35,224,0,-10,192,106,2,49,50,53,225,45,1,32,76,77,159,173,143,89,3,128,11,-2,58,50,52,140,22,2,83,32,83,88,12,88,94,188,150,224,154,5,2,-78,111,116,2,104,105,110,2,103,34,32,215,16,171,105,88,15,79,35,255,-94,0,43,68,246,48,0,224,225,9,2,74,117,115,2,116,32,34,161,89,-64,111,123,80,252,98,0,96,166,43,42,73,159,173,92,111,9,96,15,32,-171,248,62,0,139,4,186,216,64,124,140,42,52,123,145,96,45,156,2,35,-52,48,139,137,51,239,160,16,205,58,191,117,171,5,224,235,8,2,70,97,-108,2,115,101,34,139,153,224,24,4,2,84,114,117,128,23,225,80,1,83,-255,193,80,122,243,96,6,185,66,85,226,143,146,2,50,52,51,75,126,190,-66,244,174,5,249,2,25,96,86,215,219,50,70,97,112,77,105,122,245,32,-27,236,29,0,224,64,5,32,25,217,207,248,128,1,32,58,209,130,241,82,-8,226,180,0,129,222,149,208,239,218,2,225,248,2,161,247,76,86,224,51,-0,129,120,32,97,92,232,227,163,1,237,177,3,249,131,1,240,49,3,224,-72,4,240,191,7,189,65,33,166,239,221,6,39,206,97,141,114,100,189,91,-2,65,46,119,71,82,45,50,189,96,116,71,34,45,160,2,193,24,189,49,-32,29,192,26,246,59,8,189,46,162,109,224,36,1,224,34,3,129,235,236,-109,2,2,55,46,48,2,92,49,48,2,38,34,32,64,29,180,37,2,50,-50,57,64,208,86,218,2,50,51,51,160,19,35,215,35,164,32,218,78,94,-142,125,32,176,128,18,224,165,1,207,227,34,96,32,13,211,219,32,10,211,-216,65,138,60,130,250,145,6,32,6,206,174,54,114,176,102,131,84,32,85,-252,226,3,2,50,50,54,144,86,33,15,32,25,213,166,111,49,147,47,122,-121,97,215,32,12,58,88,196,30,96,30,229,245,2,160,35,154,169,160,11,-128,110,212,26,34,95,188,110,180,52,253,13,0,96,88,160,107,123,155,122,-72,32,32,213,246,117,124,66,19,32,19,225,85,0,66,38,124,249,96,25,-146,212,2,115,116,100,43,34,33,33,188,249,87,78,188,212,177,212,226,118,-1,2,95,50,49,33,9,66,124,65,122,2,35,49,48,128,115,129,90,65,-27,47,57,209,118,64,33,2,58,50,49,241,67,0,32,17,68,169,114,225,-32,23,176,230,43,154,81,123,188,176,192,215,187,138,64,5,32,220,112,22,-195,187,227,18,5,128,246,131,49,32,26,91,111,64,92,248,77,3,80,185,-184,171,92,47,64,30,129,35,2,115,101,113,2,117,97,108,64,124,161,31,-227,238,0,32,109,226,160,1,2,77,72,83,2,68,73,82,99,54,67,80,-124,80,243,159,3,188,66,224,19,0,226,77,2,32,28,245,31,12,113,102,-35,155,64,142,240,247,20,245,119,7,155,104,240,253,10,219,96,2,50,48,-57,64,208,129,144,2,112,101,101,2,107,67,65,2,83,116,114,38,134,32,-21,186,194,2,95,57,51,99,50,32,16,249,179,1,164,163,149,125,83,239,-64,133,130,231,128,6,129,64,96,159,32,56,129,173,2,116,111,73,2,110,-116,32,32,14,129,110,84,17,2,101,110,118,64,16,162,132,229,63,3,246,-34,7,197,57,223,151,225,81,0,32,101,161,89,187,46,228,198,8,2,116,-97,105,2,108,34,32,32,34,122,58,186,250,64,71,65,238,155,30,2,50,-48,49,96,27,226,210,1,187,5,59,48,99,139,90,175,32,5,135,221,38,-113,192,56,2,49,55,53,224,11,2,116,181,130,228,187,55,103,1,34,196,-90,225,160,61,35,159,224,155,1,2,101,114,114,2,111,114,58,135,176,134,-229,128,38,2,58,49,57,161,126,36,147,88,130,51,32,35,212,231,43,3,-2,67,111,110,2,116,114,111,2,108,46,69,64,66,64,64,224,26,1,96,-18,2,67,97,108,128,246,196,73,32,83,182,98,158,184,158,111,254,119,6,-252,66,0,2,95,51,50,249,218,3,2,49,57,52,183,243,196,123,164,249,-91,138,64,0,190,119,64,168,199,129,98,211,96,32,223,51,228,218,5,163,-143,228,205,2,32,45,130,11,2,83,32,85,225,198,7,2,109,100,53,2,-67,111,109,2,98,105,110,53,233,2,101,109,112,2,116,121,34,199,48,100,-209,70,56,160,171,70,2,119,205,180,166,58,76,32,97,64,114,2,89,32,-66,123,244,184,188,68,59,228,30,1,197,23,229,91,2,224,255,3,250,125,-2,98,11,98,153,32,100,40,1,119,52,36,112,101,121,91,114,232,85,0,-97,54,66,236,32,189,2,65,114,114,2,97,121,32,32,18,226,129,0,194,-240,57,128,128,160,32,61,100,180,35,229,229,72,4,248,20,4,2,49,57,-48,224,46,5,248,166,8,122,228,245,8,5,92,216,160,145,226,228,0,96,-20,181,246,65,0,133,191,67,110,95,76,138,108,137,226,254,94,2,187,218,-225,58,0,192,25,172,76,136,209,64,67,234,176,0,32,134,34,40,65,34,-32,175,132,76,204,97,229,153,1,133,194,236,146,0,232,208,0,64,51,104,-235,224,44,2,96,95,32,10,101,7,33,219,97,125,152,179,96,19,193,190,-232,231,3,224,43,10,194,134,229,31,2,96,16,33,23,251,213,0,2,50,-32,90,232,183,6,2,58,49,56,221,207,36,74,32,157,65,244,194,3,129,-253,2,35,56,32,89,76,71,240,97,160,32,44,2,35,49,54,33,111,189,-141,32,57,2,52,32,80,153,116,162,58,96,69,2,49,48,53,96,5,67,-234,64,16,64,11,69,210,160,11,37,166,224,11,0,94,6,224,11,0,71,-181,96,12,135,131,97,36,43,168,129,155,32,8,66,62,160,2,234,35,7,-65,185,128,50,161,252,165,213,125,77,64,242,32,13,162,248,32,9,126,23,-127,130,224,23,0,199,123,33,235,127,2,224,29,5,224,53,16,95,33,36,-49,193,86,192,68,224,151,0,67,139,38,232,224,147,2,109,55,224,69,5,-128,161,139,22,71,164,224,31,6,130,109,162,247,100,39,64,73,93,43,224,-142,10,128,16,96,52,32,105,33,78,132,135,237,9,7,96,29,100,159,130,-246,109,213,128,163,162,246,89,125,227,53,1,219,189,64,34,2,64,95,53,-32,23,167,56,68,82,62,9,228,222,1,2,92,51,52,2,38,108,105,2,-98,47,68,2,97,116,97,2,47,73,110,2,116,101,103,2,101,114,95,2,-84,121,112,2,101,46,104,2,115,92,51,2,52,38,44,2,50,56,58,2,-49,34,32,228,149,1,2,49,56,48,64,4,96,223,44,178,128,187,192,18,-234,249,0,128,5,32,229,235,84,0,224,60,3,161,70,32,4,2,89,32,-67,196,5,69,226,64,169,128,197,140,196,99,83,99,91,66,162,157,48,195,-131,98,187,189,67,227,84,0,35,19,2,52,32,35,103,11,98,160,33,51,-2,75,32,58,96,113,76,68,64,10,217,64,32,10,234,17,1,39,147,2,-49,55,55,135,78,74,17,65,36,196,174,223,40,167,147,126,159,2,49,53,-57,231,147,0,224,56,0,67,28,192,11,97,104,104,135,96,6,174,56,67,-238,226,5,1,95,31,64,31,198,169,33,17,129,37,95,25,133,243,124,151,-195,18,96,47,224,15,8,64,65,194,53,228,49,0,32,19,219,91,66,129,-97,75,137,53,64,147,98,186,65,58,192,73,94,36,224,21,3,128,159,96,-21,201,190,198,144,137,227,2,49,55,50,128,187,170,86,45,148,32,12,129,-101,2,90,32,85,97,65,129,104,65,126,222,155,32,10,190,142,2,85,32,-73,64,35,190,124,105,219,131,138,40,19,96,4,224,14,6,192,189,250,163,-1,137,235,128,207,32,72,164,226,75,75,160,42,69,37,106,35,224,42,0,-64,60,32,42,235,118,2,94,37,32,24,99,122,190,63,2,47,61,32,32,-11,163,110,71,103,32,176,159,245,67,105,219,119,37,161,155,122,239,60,2,-2,39,32,85,224,20,1,99,124,235,254,5,134,98,2,49,51,57,165,253,-254,237,1,103,83,94,162,209,45,68,212,160,17,32,140,129,99,231,13,3,-192,9,192,59,64,146,220,11,96,60,101,238,94,64,66,161,194,239,190,58,-177,30,160,141,233,219,3,2,110,111,32,2,109,97,116,2,99,104,32,2,-97,116,32,210,172,79,80,209,22,194,245,106,48,96,11,2,58,49,53,234,-48,32,2,120,99,101,2,112,116,105,2,111,110,46,68,102,2,114,110,97,-106,38,224,39,1,51,212,64,22,2,77,97,116,2,99,104,70,203,59,234,-68,1,190,113,134,90,173,242,2,49,49,55,234,44,4,78,27,224,15,4,-255,133,10,191,217,139,17,239,94,15,170,88,98,163,190,215,32,37,2,53,-32,73,96,16,208,63,32,10,195,120,128,24,173,161,129,95,77,50,162,139,-80,48,2,35,51,57,131,69,115,59,2,53,32,35,130,7,189,120,161,138,-100,235,71,159,190,196,224,39,1,242,179,8,2,39,92,57,2,50,38,39,-2,39,34,32,242,182,2,128,230,224,99,3,100,33,138,126,224,17,3,139,-114,233,54,3,224,168,1,32,169,96,35,134,65,126,21,226,42,0,97,144,-134,187,244,5,11,64,146,70,52,253,252,2,33,21,226,190,3,175,54,231,-112,6,166,169,44,176,104,2,161,162,81,64,230,65,0,205,250,65,186,165,-73,176,249,143,171,70,23,75,145,131,4,2,90,32,95,2,49,53,48,226,-64,2,224,163,5,224,160,0,2,67,32,79,245,183,1,67,229,138,12,72,-22,71,67,225,22,4,96,0,2,79,32,80,2,32,35,55,2,32,64,102,-224,79,4,2,97,34,32,192,27,32,124,224,27,5,2,98,34,32,192,27,-71,245,224,28,5,2,102,34,32,224,28,0,32,174,224,28,5,2,110,34,-32,224,28,0,33,67,224,28,5,109,122,128,28,32,253,224,27,5,2,116,-34,32,224,56,0,32,252,224,28,5,2,118,34,32,224,56,0,224,143,8,-64,3,211,122,225,193,2,132,80,69,201,65,76,165,24,100,200,33,124,2,-48,32,35,97,135,65,45,83,210,2,35,53,55,132,24,196,109,53,56,2,-58,49,52,202,189,238,152,1,193,189,113,111,100,82,150,14,96,6,150,186,-72,19,246,129,1,166,134,2,49,52,54,71,249,32,66,144,87,205,201,2,-35,52,53,128,80,133,231,182,60,64,67,226,230,2,245,186,1,192,64,146,-31,226,96,8,183,0,235,109,1,192,40,226,52,3,224,10,1,96,50,106,-44,235,240,1,96,250,129,28,128,74,70,156,224,74,4,32,165,132,76,2,-111,114,100,65,36,132,78,2,99,104,114,64,12,214,83,244,158,4,32,23,-131,79,78,118,192,175,67,254,134,43,182,49,225,159,6,111,83,225,159,0,-119,156,64,43,129,203,2,60,61,32,32,11,204,122,198,68,181,118,65,243,-181,112,96,106,32,13,183,147,99,203,179,215,238,190,3,32,33,215,133,32,-16,32,13,177,101,103,153,64,136,32,5,108,57,181,69,103,111,181,61,2,-61,61,32,32,11,160,194,248,184,1,67,205,81,137,248,72,1,69,212,248,-72,3,128,15,32,59,215,22,32,39,105,166,85,18,32,22,128,221,248,152,-0,82,87,96,26,96,43,199,219,194,70,110,179,160,10,231,147,0,199,189,-224,32,0,236,62,0,228,203,0,244,234,1,97,20,224,65,4,224,64,5,-65,218,196,212,195,100,181,162,171,189,224,169,2,119,6,96,246,240,223,4,-181,99,73,193,73,173,32,16,216,159,141,94,32,129,32,19,226,67,0,192,-53,242,134,1,208,177,116,244,103,16,115,239,208,116,32,14,167,121,181,113,-80,75,211,165,96,27,170,93,32,75,105,69,85,67,176,65,64,222,216,79,-64,74,112,24,2,95,53,32,128,78,161,140,128,39,32,55,106,113,33,227,-160,31,181,139,2,110,101,119,212,21,2,76,101,110,32,114,181,139,224,223,-4,181,144,75,215,181,77,173,57,109,85,32,20,237,78,1,239,80,9,181,-80,216,7,160,49,129,32,249,201,5,248,25,1,109,185,160,52,64,13,229,-14,0,128,2,70,206,65,248,111,213,84,201,32,34,239,212,20,180,237,233,-209,3,84,167,84,50,79,132,224,27,11,96,120,180,219,96,85,224,188,1,-180,226,2,114,101,109,33,16,180,222,255,84,5,113,50,254,228,7,192,20,-224,17,8,224,14,5,224,11,2,225,132,2,192,200,225,76,1,225,55,12,-180,255,2,79,32,58,100,39,68,17,46,235,42,49,114,183,192,7,2,95,-56,57,211,51,2,95,57,49,224,10,1,66,148,160,10,118,108,128,10,100,-223,84,241,32,83,129,136,2,94,112,111,2,107,101,87,133,76,181,10,2,-94,112,101,2,101,107,87,96,18,180,219,218,189,84,50,32,69,33,38,2,-58,57,56,225,78,4,130,61,180,82,224,46,0,111,220,128,46,248,223,1,-86,167,100,136,69,150,2,95,57,52,67,101,180,76,182,120,179,138,2,116,-111,80,2,116,114,32,2,58,57,51,225,184,10,179,27,175,219,210,222,251,-203,0,64,118,134,251,101,104,134,230,109,135,106,161,179,78,240,51,7,178,-77,201,109,2,95,56,56,140,200,128,63,32,7,64,65,2,95,55,50,96,-129,178,92,230,108,7,178,70,79,107,114,88,72,222,2,58,56,55,96,20,-2,113,117,111,32,221,177,255,226,101,93,177,29,252,109,4,243,178,0,2,-95,56,49,228,128,0,252,152,2,244,163,11,243,161,3,2,58,56,52,197,-18,80,37,2,95,51,57,64,226,129,165,2,94,102,114,2,101,101,32,2,-58,56,50,227,229,2,224,91,5,85,67,149,129,210,247,253,87,8,65,122,-151,168,249,142,1,176,132,227,218,1,230,63,1,206,48,71,138,212,32,186,-82,244,186,8,166,63,230,92,0,224,120,2,32,52,172,95,202,202,80,158,-244,178,3,137,80,2,58,56,48,253,78,1,254,100,5,241,2,1,177,1,-130,180,66,225,176,210,76,88,2,83,32,80,96,183,79,179,213,165,44,248,-144,155,110,173,224,122,10,96,121,176,247,229,106,3,229,24,0,176,209,58,-252,32,125,193,160,66,251,163,7,246,255,2,226,202,7,208,146,247,198,5,-2,117,110,100,2,101,102,105,2,110,101,100,74,222,2,58,55,50,229,229,-20,176,186,2,95,52,50,163,215,71,176,99,55,2,95,52,54,115,125,234,-152,9,78,47,234,148,2,72,84,64,1,2,95,54,51,224,37,3,234,117,-2,64,37,96,19,96,10,2,95,54,57,65,18,193,140,199,88,32,114,75,-197,128,130,64,45,161,65,32,20,32,12,97,123,230,121,1,132,29,96,175,-33,112,147,26,249,103,1,132,197,64,30,131,56,224,35,1,224,55,11,193,-10,177,175,83,153,132,1,113,50,224,13,0,105,208,225,105,5,180,68,2,-58,32,117,2,110,115,117,2,112,112,111,2,114,116,101,2,100,32,119,69,-128,2,115,105,122,2,101,34,32,64,246,2,51,50,55,96,102,2,35,50,-49,2,52,55,52,2,56,51,54,75,36,2,58,54,56,162,85,248,25,2,-171,183,64,117,248,20,2,116,1,148,6,81,182,129,20,65,146,32,196,161,-33,129,143,2,54,32,35,97,98,66,111,178,35,2,105,110,118,2,32,58,-54,130,123,2,115,104,114,32,11,130,107,74,124,177,247,230,197,15,177,137,-227,43,0,165,37,209,112,32,196,151,92,78,242,2,95,53,52,64,4,66,-51,80,48,117,160,2,95,53,57,236,125,0,65,65,106,180,177,160,251,8,-7,87,51,89,16,240,136,0,177,189,224,29,1,224,49,1,224,39,4,177,-144,227,208,10,177,66,2,62,61,32,2,58,53,55,128,10,32,9,129,9,-76,5,176,205,2,60,32,58,176,201,2,105,99,109,2,112,32,58,175,192,-107,193,77,212,2,95,53,49,64,102,128,244,75,190,174,20,65,64,173,244,-50,109,173,240,230,24,93,174,49,233,100,13,174,8,2,110,101,103,32,149,-128,237,2,42,32,58,173,107,2,45,32,58,173,104,2,43,32,58,173,90,-224,156,68,2,58,52,50,224,155,7,193,143,173,128,171,9,35,131,77,18,-2,95,51,55,136,80,66,57,113,251,2,58,52,48,245,100,1,173,151,37,-148,173,150,64,54,96,42,32,217,2,58,51,55,224,29,0,128,232,64,9,-128,232,2,94,109,97,2,108,108,111,2,99,32,58,173,119,2,73,79,46,-2,112,101,114,2,102,111,114,2,109,73,79,32,20,224,249,1,203,92,173,-135,50,230,237,85,0,224,227,12,2,58,51,48,229,159,1,76,166,36,16,-67,205,173,95,131,75,136,231,172,227,2,114,97,105,2,115,101,32,2,58,-50,55,254,246,0,128,172,2,65,46,114,2,101,97,100,32,14,128,177,32,-161,63,171,2,65,114,103,2,82,101,102,32,20,211,92,32,100,101,15,68,-120,99,108,64,107,128,190,32,49,2,62,62,32,2,58,50,50,166,1,74,-42,128,33,44,205,252,147,0,71,36,141,226,95,137,96,9,44,147,128,9,-2,58,50,49,250,207,3,111,70,174,120,151,246,159,101,224,35,2,96,32,-116,140,192,32,2,95,56,32,123,205,128,132,2,55,32,58,172,185,224,47,-7,108,253,96,155,143,143,225,14,0,236,202,0,226,202,6,49,83,160,24,-108,31,228,171,0,130,87,208,31,129,10,233,246,0,70,38,224,11,2,96,-210,205,216,224,64,1,142,66,166,246,2,51,32,66,102,223,226,135,0,74,-128,129,75,75,106,226,180,0,68,214,68,213,65,237,240,46,0,227,137,0,-70,206,162,24,2,58,54,32,161,158,2,114,101,116,2,117,114,110,36,39,-225,175,1,36,53,128,201,36,52,227,127,7,227,107,37,2,58,50,32,226,-167,19,235,38,1,194,143,64,202,94,163,254,26,0,224,0,255,224,0,255,-224,0,255,224,0,255,224,0,255,224,0,255,224,0,255,224,0,47,1,32,-125,-};-unsigned char *combexpr = data;-int combexprlen = 89821;+122,76,90,49,237,115,1,0,26,118,55,46,48,10,49,57,54,50,10,65,+32,95,48,32,95,50,51,32,64,95,50,48,52,32,64,66,224,15,2,6,+49,51,32,64,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,49,49,32,95,50,49,53,64,10,28,53,52,32,95,49,53,+54,32,64,102,114,111,109,85,84,70,56,32,34,45,45,118,101,114,115,105,+111,110,34,64,75,15,64,64,67,39,66,32,85,32,95,50,54,32,95,50,+52,56,64,52,1,51,54,64,52,224,57,9,8,77,105,99,114,111,72,115,+44,32,160,64,0,32,96,65,128,47,0,50,64,42,224,58,17,16,44,32,+99,111,109,98,105,110,97,116,111,114,32,102,105,108,101,224,67,6,2,50,+53,55,128,141,3,64,90,32,75,128,9,2,83,39,32,64,154,2,64,67,+32,224,209,25,6,110,117,109,101,114,105,99,224,217,6,2,66,32,80,128,+211,128,157,224,91,2,129,87,65,46,64,101,2,32,64,67,64,107,65,60,+96,23,0,83,64,48,0,56,64,41,129,87,224,23,4,0,57,224,23,13,+1,54,48,128,23,2,66,32,66,65,157,65,78,65,204,9,50,54,51,32,+64,85,32,75,32,65,160,120,0,66,64,56,2,95,55,55,129,209,64,228,+224,42,0,1,49,57,64,4,1,32,64,64,241,5,50,54,53,32,64,35,+64,12,128,69,161,155,64,12,225,99,16,6,102,108,97,103,115,32,61,129,+81,8,64,95,49,50,51,32,95,50,55,96,151,64,154,66,45,0,39,65,+65,2,56,50,52,64,100,96,242,0,80,96,9,64,85,14,57,50,55,32,+64,95,52,48,54,32,95,52,48,55,32,224,86,1,11,99,111,109,109,97,+110,100,45,108,105,110,101,64,90,2,35,48,32,96,3,9,64,64,64,75,+50,32,95,50,48,50,96,61,97,47,160,105,4,95,49,57,51,53,96,15,+64,101,64,115,1,57,52,128,49,64,9,64,213,1,85,32,193,139,65,28,+193,149,128,45,128,153,2,95,49,57,97,131,162,236,4,32,95,51,54,56,+64,20,0,52,64,166,1,49,54,65,134,64,34,64,7,129,186,128,60,98,+53,65,36,128,32,226,56,0,64,149,1,51,51,64,175,96,13,6,79,32,+35,52,54,32,64,128,120,2,95,49,53,97,118,2,39,32,79,96,171,3,+54,48,32,35,65,156,224,29,4,96,0,8,58,49,57,54,49,32,64,10,+65,129,76,129,79,64,99,1,53,50,96,9,2,53,32,95,65,112,4,95,+49,56,51,32,161,35,162,11,64,148,129,231,96,95,130,213,0,52,128,46,+161,232,0,95,65,122,0,51,64,62,6,54,32,95,54,52,51,32,96,22,+64,12,3,53,53,49,32,192,191,1,49,51,65,189,0,35,65,6,1,64,+64,128,47,128,0,1,73,32,96,158,0,48,160,158,224,1,17,1,83,32,+66,3,0,50,96,160,2,95,49,51,130,86,1,79,32,225,18,3,129,10,+64,163,0,51,226,98,4,3,47,108,105,98,98,94,129,26,224,24,1,3,+111,117,116,46,67,225,196,17,64,84,224,6,21,97,84,224,6,0,160,20,+97,13,224,6,0,224,27,3,224,106,1,6,100,101,102,97,117,108,116,64,+105,0,58,130,0,5,10,65,32,66,32,89,97,251,98,42,0,83,194,215,+66,10,4,67,32,64,64,80,100,56,97,100,130,31,131,245,228,5,0,225,+201,3,228,102,19,164,87,224,69,53,0,118,224,69,60,0,113,224,69,60,+0,114,224,69,60,0,108,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,112,231,11,0,128,68,64,14,64,30,128,33,+192,25,64,10,192,108,224,10,1,128,136,232,188,3,100,227,1,35,52,134,+66,224,38,0,128,51,224,172,1,232,29,4,128,50,1,49,48,192,51,163,+252,64,34,160,49,68,18,133,127,70,87,69,78,166,80,0,50,64,118,166,+80,165,234,232,40,2,224,197,84,192,162,224,197,15,128,49,64,7,231,17,+8,224,190,10,104,125,165,179,2,95,51,53,70,194,0,67,69,199,224,203,+1,225,148,109,0,49,199,63,193,148,64,40,97,142,96,55,0,82,224,224,+7,224,218,0,74,243,128,218,225,146,120,224,195,0,128,49,224,177,27,224,+170,112,106,235,224,170,24,0,52,224,170,13,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,+169,241,224,192,4,0,54,234,74,0,226,246,19,100,158,226,246,9,0,52,+107,136,226,246,8,224,219,127,0,55,67,148,160,37,224,219,69,226,98,99,+0,56,202,116,128,48,224,204,6,108,79,192,202,110,21,165,92,0,55,235,+71,0,228,134,107,0,57,206,97,230,26,34,236,107,3,230,26,124,224,196,+0,128,48,225,121,6,226,70,6,224,189,1,64,43,2,95,49,48,80,61,+1,95,52,227,95,1,193,12,103,196,64,73,225,18,1,224,190,5,0,67,+224,190,62,0,55,228,154,20,226,56,4,112,137,226,56,10,227,87,13,160,+139,207,43,96,233,239,43,19,7,85,110,107,110,111,119,110,32,79,51,1,+58,32,136,208,204,238,224,53,7,4,79,32,35,49,48,163,114,238,233,5,+224,0,2,193,229,65,3,97,63,129,243,111,223,0,50,71,162,0,52,237,+188,0,224,144,12,1,46,99,128,132,224,48,33,0,111,128,48,224,39,24,+0,97,233,174,0,164,77,175,240,64,234,228,75,4,226,74,19,0,57,228,+145,13,1,49,56,128,19,228,146,5,227,73,10,0,53,110,107,161,206,198,+160,224,39,11,0,49,224,39,30,232,245,1,224,39,21,231,144,1,224,39,+11,0,39,224,40,1,231,14,1,224,61,2,229,136,1,160,61,224,108,21,+224,46,8,224,39,14,224,107,1,224,39,19,0,56,115,243,224,79,27,229,+100,3,224,39,19,228,206,2,1,54,50,208,170,240,180,5,227,105,1,224,+64,0,0,83,224,64,11,65,58,0,55,160,57,3,64,95,50,54,104,121,+226,72,0,131,220,137,226,79,164,0,56,111,164,6,95,51,54,57,32,75,+32,81,241,132,36,224,1,17,108,150,224,0,4,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,69,35,82,59,+192,113,224,0,4,65,233,0,55,225,233,5,0,90,224,145,4,224,1,11,+225,233,255,224,29,11,224,26,17,224,23,14,224,20,11,224,17,8,224,14,+5,224,11,2,192,8,96,5,225,231,17,65,230,0,54,225,230,5,224,119,+3,171,5,225,198,22,225,248,255,224,29,13,224,26,17,224,23,14,225,173,+11,65,167,0,53,225,167,15,236,171,6,224,1,15,225,164,255,224,29,11,+224,26,17,224,23,14,224,20,11,227,102,12,65,185,0,52,227,97,17,227,+99,1,225,191,255,224,32,15,224,29,20,224,26,17,225,148,10,65,146,0,+51,225,146,19,225,148,2,225,149,255,224,32,15,224,29,20,225,123,9,65,+122,0,50,225,122,21,128,1,225,128,1,225,131,214,225,35,6,65,32,156,+149,225,32,22,192,1,225,40,4,64,0,224,46,21,225,44,11,224,130,2,+64,126,156,117,224,126,20,224,116,3,224,31,11,224,1,3,227,32,214,226,+227,7,0,58,143,97,225,192,29,225,188,6,224,40,17,128,1,225,74,100,+224,216,4,64,213,237,248,6,224,75,19,226,148,7,224,43,19,64,1,224,+216,56,224,172,3,64,171,236,186,6,224,71,15,224,167,5,224,37,15,192,+1,226,201,141,226,128,5,64,252,0,54,224,252,23,224,246,2,224,28,9,+224,1,5,227,189,214,224,32,23,230,193,8,65,95,235,136,16,224,1,13,+229,161,8,224,85,2,64,78,234,29,12,96,52,224,87,21,225,156,248,224,+29,20,224,26,17,224,23,14,224,20,11,224,17,8,224,14,5,239,87,14,+65,212,234,95,10,65,210,224,100,3,224,1,11,225,209,255,224,29,11,224,+26,17,224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,241,52,15,+65,221,138,194,0,75,119,100,2,48,32,95,85,220,4,64,95,51,48,54,+152,36,1,55,55,160,18,216,194,71,58,248,194,20,3,110,97,109,101,216,+186,121,55,118,125,0,55,78,56,184,71,224,83,41,6,118,101,114,115,105,+111,110,224,86,2,0,50,151,105,0,57,88,95,224,86,48,13,99,111,109,+112,105,108,101,114,58,32,109,104,115,45,216,183,118,71,224,81,46,6,100,+101,112,101,110,100,115,224,168,2,0,52,86,100,150,179,1,32,85,122,123,+160,63,88,196,90,29,224,78,9,1,79,32,122,55,152,184,128,233,96,9,+1,49,55,81,55,64,0,0,67,89,5,224,158,0,96,151,224,131,1,15,+101,120,112,111,115,101,100,45,109,111,100,117,108,101,115,58,185,103,153,249,+224,211,1,3,64,66,32,85,89,206,0,56,64,94,96,149,224,79,14,4,+111,116,104,101,114,224,77,7,192,60,158,55,2,95,50,49,65,30,64,59,+193,38,64,8,225,38,16,0,32,161,31,64,36,130,32,1,51,57,251,75,+2,130,152,140,58,252,203,5,224,190,2,161,74,1,50,54,97,94,2,50,+49,57,64,4,184,1,5,49,52,51,32,95,54,64,13,184,2,158,24,225,+198,4,224,157,17,15,66,117,105,108,100,105,110,103,32,112,97,99,107,97,+103,101,160,172,252,149,2,128,145,123,77,227,51,0,96,28,130,147,97,220,+0,49,98,153,252,199,3,91,131,155,141,156,186,0,66,224,60,0,2,95,+52,54,221,64,222,36,2,66,32,66,124,220,224,5,4,224,255,3,192,131,+225,1,38,225,3,4,128,15,225,8,16,3,87,114,105,116,225,7,10,68,+84,130,194,227,11,20,2,32,116,111,193,230,2,49,56,55,228,126,3,225,+1,0,157,217,228,183,0,224,221,2,161,223,0,39,96,2,3,32,95,49,+55,93,107,224,71,1,160,65,150,20,96,8,64,17,65,7,0,67,93,240,+124,47,1,51,55,97,23,4,52,48,57,32,64,89,219,5,64,64,64,85,+32,65,64,6,1,95,50,64,169,64,14,224,21,3,3,64,95,54,56,65,+179,161,33,67,176,1,83,39,95,131,164,189,228,109,1,64,16,162,174,96,+182,225,197,6,192,185,225,154,37,225,155,38,6,67,111,109,112,114,101,115,+69,22,3,32,116,105,109,225,156,0,129,88,225,158,0,64,66,1,50,51,+64,116,96,83,126,157,0,52,187,30,0,64,225,172,3,1,109,115,253,143,+1,96,234,128,47,131,100,0,55,220,149,125,155,1,95,50,64,165,0,51,+129,12,195,185,64,50,101,56,64,9,0,53,161,118,131,200,143,132,6,66,+32,89,32,66,32,80,97,114,225,172,1,94,140,96,166,200,81,128,7,64,+167,127,44,64,0,138,116,70,75,0,57,65,134,0,51,78,147,64,88,64,+111,68,33,197,85,2,52,53,51,97,250,158,167,0,49,79,252,255,141,4,+1,64,35,76,78,101,227,0,51,64,255,131,65,0,80,227,206,1,98,142,+255,192,12,64,25,129,89,67,245,66,79,64,144,0,90,64,13,0,90,158,+184,64,218,192,88,1,95,50,166,237,64,180,162,74,2,95,49,53,66,13,+100,242,1,53,56,103,19,1,57,53,65,0,96,235,224,163,7,0,73,64,+9,0,51,197,248,128,85,160,79,98,33,97,27,226,30,19,195,178,71,141,+15,32,110,111,116,32,111,102,32,116,104,101,32,102,111,114,109,96,20,0,+45,199,83,195,162,98,37,0,51,64,135,84,80,64,0,65,98,143,40,195,+160,64,1,232,125,41,192,8,157,119,96,86,142,211,128,35,1,95,49,93,+196,93,233,1,51,57,128,241,96,21,0,51,126,49,99,61,66,109,0,50,+65,28,65,42,0,55,159,244,0,52,160,43,64,77,0,54,226,96,0,162,+254,132,24,98,95,64,36,229,83,2,163,210,227,164,0,4,67,32,95,52,+54,70,174,225,86,0,225,67,2,14,107,103,80,97,116,104,32,105,115,32,+101,109,112,116,121,228,254,0,130,165,129,245,96,6,0,79,66,54,0,79,+199,178,227,55,0,128,140,96,110,134,198,231,128,5,228,40,20,64,19,66,+37,223,16,254,197,4,228,38,33,6,73,110,115,116,97,108,108,229,197,10,+64,124,168,136,229,194,17,1,105,110,192,46,96,105,230,115,0,234,40,5,+196,117,70,220,224,13,1,229,229,0,224,245,4,68,39,0,50,66,241,131,+138,96,86,225,7,0,128,50,225,34,10,64,53,137,136,230,122,0,233,53,+11,0,55,225,130,2,160,134,161,246,64,86,232,164,0,225,160,2,161,192,+135,202,232,92,26,161,150,0,35,194,168,232,80,28,4,99,114,101,97,116,+232,70,2,224,109,6,106,29,225,20,1,4,95,49,56,51,54,64,231,0,+51,96,19,164,21,168,31,66,175,0,49,234,5,0,193,193,234,67,13,225,+13,0,230,16,0,67,86,64,29,165,180,0,95,195,68,64,10,0,56,96,+10,193,94,224,79,19,2,95,52,56,98,121,107,35,224,87,1,235,231,2,+234,211,22,224,143,3,235,200,4,64,63,232,40,1,0,90,135,158,69,79,+0,48,65,9,1,57,50,96,118,67,241,144,182,71,191,0,90,160,1,193,+247,64,29,144,133,161,195,194,170,65,186,0,57,64,163,0,50,69,125,225,+226,0,224,30,8,0,52,201,184,224,30,4,1,95,52,97,129,226,160,8,+1,95,50,69,34,1,95,50,70,153,160,125,143,46,168,135,96,235,224,99,+0,66,132,97,92,0,50,166,155,6,57,50,57,32,64,35,53,135,43,0,+75,66,1,168,74,0,55,129,97,228,255,0,96,20,162,37,135,154,98,121,+102,92,1,51,49,96,235,225,184,25,2,64,64,64,71,131,133,2,228,176,+1,132,152,197,51,128,13,0,64,231,4,4,130,124,129,18,226,118,2,228,+243,3,131,76,167,181,0,85,64,124,164,176,224,9,1,65,28,142,109,71,+44,160,23,64,191,1,48,32,96,27,139,240,101,198,160,136,0,66,64,135,+136,7,64,17,224,54,2,224,141,0,160,87,136,99,7,94,109,107,100,105,+114,32,58,129,87,1,10,65,236,197,2,4,85,115,97,103,101,109,232,2,+32,91,45,198,252,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,114,64,4,5,67,91,82,+124,87,93,64,9,3,88,67,80,80,64,7,3,68,100,101,102,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,192,28,3,80,+80,75,71,64,7,9,81,32,80,75,71,32,91,68,73,82,96,31,5,116,+84,65,82,71,69,64,76,0,77,109,116,8,78,97,109,101,46,46,46,93,+34,97,38,67,4,141,23,226,90,3,236,14,1,229,154,1,0,57,226,177,+1,224,42,4,67,102,1,54,48,64,44,0,85,232,192,4,229,2,5,75,+115,132,157,65,214,162,151,67,39,167,198,97,147,96,64,96,6,231,254,0,+236,211,9,229,135,3,162,104,230,48,1,198,51,224,17,4,224,20,0,237,+105,3,174,3,173,9,96,81,160,116,231,83,38,235,112,45,16,116,111,112,+32,108,101,118,101,108,32,100,101,102,110,115,58,32,96,0,237,18,1,228,+211,2,5,49,55,53,55,32,35,205,31,235,126,1,172,111,229,31,11,231,+115,2,8,40,117,110,112,114,117,110,101,100,160,92,224,89,4,224,76,1,+1,95,55,64,96,67,222,0,49,230,245,4,225,52,18,238,68,9,230,231,+30,228,131,1,147,254,225,53,3,160,66,132,124,240,210,15,224,222,2,0,+61,192,214,73,248,67,166,224,187,5,226,3,2,99,221,160,203,174,8,75,+128,71,31,238,205,1,162,84,224,211,1,101,100,64,32,97,32,229,81,9,+224,54,1,239,127,15,160,111,232,60,5,226,98,91,9,102,105,110,97,108,+32,112,97,115,115,130,92,226,98,4,163,197,97,103,160,71,226,102,0,160,+15,237,232,17,224,100,2,237,232,4,235,25,4,228,45,3,227,164,1,225,+3,1,99,146,161,113,2,32,95,52,232,157,0,224,203,12,4,46,99,111,+109,98,241,56,5,102,90,224,67,37,233,50,2,225,177,7,1,53,53,229,+221,2,3,109,104,115,99,224,45,10,68,151,128,13,225,179,0,233,231,6,+64,8,194,24,192,53,225,238,4,231,218,0,224,130,10,194,52,192,25,224,+27,2,2,50,49,49,224,158,2,4,77,72,83,67,67,225,118,1,131,50,+226,233,1,96,24,241,20,2,224,20,1,224,90,2,229,224,8,65,241,0,+56,65,64,66,121,64,10,67,122,174,107,1,56,51,243,193,3,7,47,105,+110,99,108,117,100,101,225,248,2,224,89,3,226,207,1,224,90,42,3,99,+98,105,116,226,81,3,227,178,7,161,115,229,188,5,230,139,1,3,95,49,+56,54,233,241,0,224,146,1,128,1,129,190,224,25,9,250,133,0,228,232,+2,230,15,2,208,82,224,8,23,227,234,2,235,253,38,244,78,10,227,215,+19,5,69,120,101,99,117,116,247,21,0,239,107,11,227,21,1,247,134,3,+2,49,56,54,141,38,225,164,1,97,167,226,157,1,1,52,54,160,64,64,+59,164,34,224,200,1,172,247,224,199,10,140,91,0,56,98,193,64,7,140,+82,192,209,105,114,224,207,17,13,99,111,109,109,97,110,100,32,102,97,105,+108,101,100,192,214,192,133,227,31,7,229,46,80,1,67,32,151,192,1,97,+116,83,4,229,46,91,192,0,129,108,225,144,0,226,233,1,171,222,2,56,+54,56,228,215,19,2,36,73,78,224,84,5,224,77,12,224,70,25,2,79,+85,84,224,71,3,228,82,3,128,253,0,51,173,168,194,92,128,103,161,20,+227,86,4,231,176,18,14,45,119,32,45,87,97,108,108,32,45,79,51,32,+45,73,225,236,3,227,233,3,224,85,0,224,84,27,7,47,115,114,99,47,+114,117,110,244,185,3,225,87,6,160,80,162,16,121,70,196,130,224,85,15,+224,156,3,224,135,1,224,47,7,1,79,32,115,89,232,118,0,224,114,0,+192,193,224,188,35,4,47,101,118,97,108,186,58,160,191,224,71,4,224,69,+17,1,46,99,192,248,164,110,192,238,96,234,65,252,110,20,233,253,3,160,+25,116,55,128,20,224,159,13,0,42,231,10,1,225,199,2,10,36,73,78,+32,45,108,109,32,45,111,32,226,57,7,224,0,4,87,101,99,6,161,122,+97,115,0,51,76,48,128,27,210,136,64,0,240,142,4,224,11,0,247,167,+0,245,88,1,193,20,2,95,49,56,103,79,78,250,167,87,128,12,128,68,+215,160,1,49,57,117,44,0,64,77,241,64,88,2,55,54,51,72,45,98,+3,86,89,227,159,2,2,97,105,110,224,202,2,77,32,148,92,91,108,64,+2,142,209,108,181,225,144,1,1,50,53,100,154,224,153,2,228,14,4,226,+52,12,84,162,130,52,86,196,75,203,152,54,225,98,2,0,125,192,137,64,+29,0,85,240,149,2,234,215,2,0,89,64,18,224,13,0,243,47,2,179,+50,96,49,224,17,4,232,12,0,232,34,7,224,48,2,224,51,10,224,57,+3,233,129,3,224,29,17,224,65,3,143,90,227,205,3,245,250,1,224,45,+5,128,41,224,37,8,233,113,3,245,116,4,64,53,2,95,55,55,65,240,+142,55,78,82,3,95,49,49,53,133,126,72,97,0,32,134,16,2,95,51,+49,98,108,104,142,0,50,185,198,1,75,52,161,119,224,158,6,70,118,1,+55,56,107,247,0,56,200,81,224,29,1,168,74,224,231,6,225,2,2,192,+40,232,82,4,111,70,130,18,224,34,5,224,62,0,103,108,96,118,224,33,+3,1,95,55,189,24,128,14,96,99,132,102,65,6,74,248,79,90,1,95,+55,82,6,192,0,96,40,217,23,145,131,232,151,1,160,97,232,152,2,141,+146,160,23,1,95,55,184,167,160,126,225,10,8,128,23,97,4,192,163,224,+167,4,192,158,233,74,7,192,186,193,21,163,141,161,170,214,148,102,84,96,+210,164,50,128,216,197,186,114,221,227,82,12,83,112,131,34,227,126,4,160,+0,226,65,0,0,67,97,249,0,50,243,233,6,240,139,5,64,97,0,82,+99,198,193,140,179,78,193,8,224,41,0,193,9,225,4,0,64,149,229,165,+15,1,65,32,228,92,1,224,143,1,155,9,226,151,1,161,63,96,21,229,+201,2,224,240,9,69,192,128,191,228,120,12,228,74,2,4,64,92,49,48,+38,192,123,0,67,96,89,96,47,2,79,32,35,92,52,239,52,3,163,179,+142,251,160,9,131,85,237,224,3,2,95,55,49,66,11,90,89,213,89,96,+4,64,30,129,96,67,90,192,87,0,80,245,88,0,225,112,1,132,244,192,+13,65,66,0,85,64,50,224,32,0,3,85,32,75,51,224,48,4,245,159,+11,64,124,224,19,8,236,219,0,170,33,104,183,123,202,166,248,65,72,197,+254,5,51,57,32,95,52,52,180,20,225,185,17,1,78,111,81,168,2,105,+110,105,106,29,2,102,111,117,74,176,1,111,114,235,132,0,144,170,96,9,+130,117,70,58,0,54,180,130,134,248,102,196,4,95,49,56,48,51,147,121,+150,117,0,75,110,187,0,67,164,0,128,166,92,113,64,53,66,247,96,175,+1,52,32,117,106,252,238,6,195,214,130,124,197,61,133,29,225,18,3,97,+164,97,195,253,6,1,128,19,131,85,224,102,32,162,16,164,230,224,116,0,+96,184,147,190,225,137,6,224,115,4,96,114,192,119,195,206,0,54,120,58,+247,250,3,72,32,225,137,19,0,35,174,126,3,32,92,51,52,162,210,232,+191,10,2,79,32,35,64,206,192,137,64,80,119,245,224,80,10,7,109,104,+115,102,102,105,46,104,128,75,96,122,0,53,76,243,104,125,225,118,24,174,+63,225,26,5,224,13,0,100,81,192,36,224,46,2,224,10,6,164,122,225,+162,5,129,44,129,48,225,54,0,225,41,0,170,188,0,57,229,14,3,0,+79,224,224,13,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,96,251,97,44,228,73,2,64,96,105,177,157,78,137,179,0,79,233,45,+2,4,123,32,48,44,48,136,166,224,22,3,1,125,59,224,17,7,224,122,+8,1,42,120,64,11,96,128,1,32,61,128,136,96,52,227,215,1,185,167,+224,67,1,23,85,110,105,109,112,108,101,109,101,110,116,101,100,32,70,70,+73,32,102,101,97,116,117,114,176,135,234,94,0,97,182,3,95,54,57,56,+64,188,78,18,0,50,225,204,0,64,29,138,54,0,57,100,189,184,193,129,+223,65,124,226,228,1,230,181,3,233,99,1,146,189,97,253,168,129,193,242,+163,12,167,103,121,168,64,5,185,182,64,95,163,22,227,29,1,198,49,242,+86,1,227,196,1,64,56,4,61,61,32,64,35,134,14,192,30,135,114,166,+52,97,169,248,206,1,64,144,74,233,240,2,1,130,52,1,67,39,89,87,+0,83,100,100,2,83,32,73,128,140,72,243,229,182,2,225,118,0,68,151,+154,239,147,93,224,245,1,169,108,160,23,96,9,160,246,0,83,224,248,4,+153,233,97,111,226,140,12,5,100,121,110,97,109,105,204,81,64,85,89,222,+1,57,49,75,65,225,27,5,224,87,37,6,119,114,97,112,112,101,114,224,+87,8,69,140,224,87,1,225,95,1,224,79,23,131,52,236,11,2,97,77,+1,95,53,155,238,191,128,193,248,244,136,1,234,238,1,76,192,244,144,22,+164,114,163,249,130,124,101,1,1,49,57,64,50,205,27,97,247,123,223,160,+23,168,146,224,132,12,235,147,1,192,146,203,51,225,66,14,69,41,232,71,+0,224,64,0,194,253,224,93,0,128,66,245,112,3,225,74,6,155,220,244,+254,0,227,70,7,102,225,225,129,4,0,66,72,38,66,177,138,140,251,253,+1,226,6,5,225,178,33,3,118,97,108,117,244,149,1,224,104,10,97,79,+131,15,142,253,226,22,0,224,140,6,224,17,4,164,41,192,139,226,252,1,+104,235,133,227,226,97,3,64,40,232,106,23,232,107,20,1,98,97,104,91,+11,101,105,103,110,32,105,109,112,111,114,116,32,168,101,243,234,11,67,178,+0,51,168,74,0,65,136,89,157,22,105,92,64,14,157,9,96,162,64,14,+156,220,129,196,212,253,224,13,11,231,228,1,0,32,73,193,160,107,66,130,+224,107,2,67,95,224,107,2,67,198,2,10,65,32,229,251,3,5,71,69,+84,82,65,87,230,17,7,10,71,69,84,84,73,77,69,77,73,76,76,113,+102,224,27,3,2,97,99,111,115,38,224,19,4,2,100,100,95,92,252,224,+23,11,3,117,116,102,56,224,23,8,0,115,143,200,224,19,4,1,116,97,+224,19,12,0,50,224,20,7,4,99,97,108,108,111,99,251,224,21,4,3,+108,111,115,101,120,132,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,196,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,7,109,100,53,65,114,114,97,121,224,23,10,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,101,224,22,4,2,111,+107,101,224,22,14,3,87,111,114,100,224,69,11,224,23,11,66,204,4,108,+122,55,55,95,86,137,4,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,1,109,107,+224,20,10,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,192,27,234,249,0,224,+0,74,73,18,0,54,105,18,143,73,0,53,74,25,114,7,142,171,3,49,+32,95,57,105,206,234,217,0,238,156,1,3,95,57,51,55,160,30,88,175,+2,49,57,49,184,234,174,187,64,91,146,67,2,95,52,56,235,23,0,2,+57,49,51,141,182,224,5,5,160,24,1,95,49,175,0,138,146,128,6,224,+45,25,224,52,3,224,45,18,224,84,3,160,52,224,45,25,224,98,4,1,+53,57,224,232,1,1,54,48,224,11,0,64,234,142,150,4,115,99,109,112,+32,64,14,138,242,89,21,81,60,0,90,175,16,140,174,117,185,1,57,48,+64,57,141,181,147,122,154,69,64,60,139,32,111,217,74,224,88,48,0,53,+184,27,237,192,1,192,11,175,100,141,154,64,10,84,136,65,128,172,35,184,+63,123,81,139,148,64,98,139,116,224,155,9,79,217,77,9,236,0,19,0,+123,114,219,178,220,0,83,246,1,16,224,48,1,64,46,10,44,32,109,104,+115,95,97,100,100,114,95,128,56,211,21,224,38,1,1,125,44,128,25,128,+174,224,129,25,224,128,43,224,123,25,193,154,225,2,26,224,128,77,226,16,+4,65,171,141,17,155,226,145,123,129,161,0,90,117,77,225,189,1,246,89,+0,206,4,148,247,96,8,150,113,1,49,56,88,132,224,166,17,225,158,2,+112,214,111,213,3,48,48,32,64,154,162,98,114,128,184,114,58,96,29,68,+30,1,56,57,99,76,224,17,4,81,49,64,46,238,106,15,1,56,51,98,+210,224,124,1,206,83,16,38,32,109,117,115,116,32,98,101,32,80,116,114,+47,70,117,110,170,186,77,229,224,181,12,2,40,72,115,128,37,0,41,193,+66,224,40,4,131,13,96,5,224,249,7,0,79,240,92,6,97,252,218,204,+175,42,193,51,162,21,97,1,97,19,160,43,129,26,209,26,1,48,53,242,+149,1,243,126,1,129,128,129,169,129,69,83,38,160,90,97,56,242,74,0,+113,8,1,57,48,65,61,160,103,181,119,126,81,226,99,19,0,59,98,95,+64,15,8,95,85,110,105,116,40,115,44,32,162,108,249,125,11,4,79,32,+35,52,49,224,250,2,128,191,249,203,16,0,52,254,15,0,255,163,3,1,+50,53,111,235,224,139,9,224,122,0,3,32,95,54,50,101,40,0,48,97,+249,1,54,50,70,46,88,91,161,54,224,134,6,1,95,55,181,0,161,133,+229,28,5,0,58,150,79,176,30,225,9,17,65,7,1,116,111,194,200,193,+199,129,1,1,56,57,251,160,13,226,78,2,225,56,35,64,146,144,99,67,+159,133,63,117,25,64,222,166,68,0,85,97,191,71,66,0,51,82,132,96,+222,127,240,96,61,144,146,255,232,6,11,80,114,105,109,105,116,105,118,101,+115,46,40,98,213,64,41,0,54,165,179,6,83,32,95,55,54,56,32,130,+229,99,68,128,123,3,66,32,95,57,83,255,166,17,162,141,128,59,167,137,+4,54,32,95,51,53,64,34,0,53,70,11,64,24,134,183,227,186,3,0,+57,96,61,183,220,64,34,134,203,224,161,17,1,73,79,192,161,198,184,0,+85,130,229,225,14,2,64,166,212,26,192,31,243,197,0,225,56,10,180,68,+64,29,0,85,166,221,100,215,199,164,225,77,3,128,43,244,144,1,128,139,+134,225,146,43,226,42,21,99,50,196,58,96,105,67,174,226,48,5,230,144,+22,226,51,1,226,110,6,253,232,2,224,63,19,227,47,2,96,56,227,157,+7,64,208,134,6,69,148,155,70,101,229,164,56,2,67,32,60,161,100,134,+18,247,163,3,168,57,97,115,0,90,64,4,0,85,166,55,224,36,3,225,+152,1,129,97,197,253,225,103,3,133,229,201,45,224,30,10,68,180,224,212,+2,229,186,3,226,56,2,192,18,128,0,224,115,2,102,215,0,95,92,151,+202,107,130,171,2,49,56,57,97,64,186,101,253,42,19,166,84,225,106,19,+17,78,111,116,32,97,32,118,97,108,105,100,32,67,32,116,121,112,101,253,+37,0,0,49,89,210,97,109,97,244,66,244,64,70,0,79,137,129,224,74,+9,227,3,2,4,70,108,111,97,116,116,70,245,252,13,224,31,2,0,64,+224,79,27,0,73,141,32,224,76,13,192,28,224,73,28,209,201,224,74,13,+224,29,0,224,75,17,3,68,97,116,97,96,69,96,4,112,57,224,75,17,+128,30,224,152,28,132,216,224,74,13,70,192,224,73,22,0,83,115,87,8,+46,73,79,46,72,97,110,100,108,151,89,224,115,13,194,113,227,78,0,108,+234,156,255,226,40,17,0,70,136,143,8,46,67,46,84,121,112,101,115,46,+128,67,66,132,237,174,3,3,67,67,104,97,238,12,8,1,67,83,224,21,+12,0,85,224,43,13,240,137,11,1,67,85,224,22,13,161,250,224,42,5,+224,20,11,0,76,239,43,10,1,67,85,224,21,12,5,80,116,114,100,105,+102,238,136,8,3,67,83,105,122,239,16,8,1,67,83,224,21,12,0,76,+224,110,14,224,22,12,1,84,105,143,104,238,217,10,67,121,135,78,230,110,+17,228,86,1,64,45,231,62,23,224,42,2,0,54,232,58,26,3,118,111,+105,100,235,167,2,233,22,20,224,53,1,8,40,105,110,116,32,115,41,32,+123,229,198,6,224,33,1,0,59,158,135,160,226,135,141,100,239,137,240,1,+56,55,110,115,0,56,104,254,64,105,96,9,64,8,4,48,50,32,35,49,+121,228,69,7,105,21,64,65,135,182,64,18,139,109,108,42,96,31,3,10,+65,32,94,245,169,10,0,32,64,30,199,159,190,141,0,50,73,213,166,218,+2,48,32,95,89,167,64,121,101,198,64,248,69,105,160,23,198,215,64,18,+0,55,94,177,160,19,69,170,64,73,64,14,64,13,70,244,1,50,55,65,+33,1,56,55,143,64,0,52,158,35,224,58,6,64,31,137,136,223,25,1,+56,56,92,141,0,56,104,192,0,50,106,45,128,29,224,31,7,103,86,3,+49,53,32,95,71,246,4,95,49,56,51,32,170,74,224,163,3,224,166,5,+64,38,0,56,64,213,235,212,0,192,213,1,95,57,224,116,0,235,243,3,+224,30,7,137,173,188,84,225,19,2,130,75,1,56,56,64,201,122,130,224,+65,0,224,232,1,0,56,225,61,2,224,255,4,0,57,136,233,81,89,202,+236,192,0,65,171,136,191,0,94,153,214,97,189,206,7,64,113,0,56,97,+239,64,120,2,10,65,32,83,132,1,67,65,152,230,2,76,101,110,64,44,+64,32,64,62,178,128,96,18,163,42,5,56,53,32,75,32,95,97,15,192,+7,1,95,56,80,216,128,231,0,95,130,81,160,11,129,121,128,11,0,56,+224,11,0,65,4,0,52,98,159,71,39,1,95,51,171,82,65,186,140,178,+233,5,0,109,40,96,31,0,95,108,192,64,135,0,54,224,135,24,103,252,+160,135,128,11,128,135,128,11,128,135,64,11,224,135,1,1,49,56,65,103,+224,137,4,96,11,224,136,0,1,56,56,94,231,160,137,64,5,64,137,131,+135,0,94,84,172,1,80,116,99,34,64,37,96,18,153,73,96,18,131,84,+175,68,106,26,72,126,64,82,168,108,227,22,7,143,130,0,95,137,15,64,+65,195,119,64,51,0,48,126,43,74,171,204,212,96,71,68,15,128,170,64,+167,99,152,110,22,64,14,253,181,0,1,50,32,162,79,64,224,128,58,130,+20,0,94,155,193,64,174,67,86,96,193,1,117,116,128,15,162,9,244,87,+3,96,23,130,14,163,94,0,54,66,111,196,227,0,79,228,229,13,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,100,223,101,211,114,149,197,51,84,84,+2,49,56,55,170,35,3,55,53,32,35,158,196,0,66,253,134,4,1,125,+59,96,62,224,20,5,224,105,5,10,42,99,111,109,98,101,120,112,114,32,+61,96,117,128,49,159,47,229,156,19,69,155,192,58,5,108,101,110,32,61,+32,165,164,224,165,3,235,167,1,142,130,4,79,32,35,53,57,240,59,4,+129,111,64,28,243,155,3,0,83,99,143,141,133,96,16,94,162,224,7,1,+229,52,1,243,154,3,243,153,5,2,95,54,52,112,89,128,95,205,168,1,+57,48,241,108,1,224,160,6,133,82,76,34,0,52,160,161,64,56,130,184,+3,85,32,75,52,160,2,0,90,160,1,231,102,1,64,38,212,152,224,32,+2,224,1,7,231,151,7,64,54,130,193,3,95,52,56,52,98,59,130,176,+3,85,32,75,50,224,69,16,224,73,11,128,75,196,199,1,75,51,224,169,+6,224,48,4,3,58,49,56,54,239,236,1,97,112,129,89,225,118,8,140,+146,76,206,161,108,81,114,224,19,4,177,121,192,63,128,11,2,95,49,50,+80,136,199,227,139,250,145,151,100,170,128,130,200,141,0,57,110,161,71,173,+74,143,86,14,0,75,64,40,134,167,64,65,64,144,214,51,3,49,32,95,+53,128,78,2,95,49,54,102,66,0,54,68,11,64,79,131,117,230,69,3,+72,44,67,18,64,37,64,15,198,240,230,24,0,79,156,205,108,96,86,175,+35,1,56,54,163,84,0,54,196,13,1,54,54,96,93,0,75,65,163,64,+20,3,10,65,32,90,77,95,64,14,164,216,158,142,96,32,228,215,0,230,+211,4,4,95,49,56,53,56,129,54,232,20,0,2,50,49,49,233,192,3,+0,67,168,202,129,77,224,37,14,6,77,72,83,67,79,78,70,160,42,129,+142,96,2,64,16,129,164,128,122,180,166,146,251,224,8,3,64,137,70,94,+2,49,56,54,243,99,1,1,66,39,175,158,229,110,0,238,15,2,2,50,+49,57,64,4,166,25,5,49,52,51,32,95,54,112,121,0,50,64,254,206,+228,168,251,65,171,119,21,96,237,234,161,4,11,111,117,108,100,32,110,111,+116,32,102,105,110,141,30,132,102,160,138,224,43,3,4,105,110,32,102,105,+140,125,226,237,3,161,26,231,221,2,192,188,98,13,225,40,3,4,100,101,+102,97,117,155,41,3,64,95,51,56,70,221,228,197,10,1,99,99,225,73,+0,0,32,96,37,224,103,3,145,36,225,32,4,64,105,233,172,7,96,146,+225,42,34,225,43,8,237,43,18,9,117,110,100,32,116,97,114,103,101,116,+239,78,2,68,179,122,63,3,56,53,53,32,67,55,96,12,120,134,224,11,+3,224,0,2,192,207,225,59,5,225,61,2,150,219,235,55,0,96,179,192,+215,225,61,28,99,236,1,49,56,70,149,0,49,107,79,240,113,2,224,59,+22,233,224,3,104,2,161,135,224,83,42,1,111,110,109,111,224,0,0,225,+90,17,4,117,110,105,120,45,130,28,230,4,1,0,95,100,79,64,0,67,+200,235,214,1,67,92,0,80,131,239,229,162,0,198,15,1,75,52,198,113,+64,30,133,132,250,99,4,211,157,211,154,227,179,1,186,114,101,29,147,134,+164,142,145,167,160,53,132,182,147,133,3,95,49,56,52,133,1,64,109,67,+198,232,224,0,66,149,235,96,0,1,49,56,105,140,228,26,1,128,126,1,+95,50,200,36,224,45,4,0,52,98,136,184,244,96,44,132,72,66,96,235,+223,4,226,245,0,226,193,4,225,100,17,2,67,97,110,67,238,4,112,97,+114,115,101,162,190,224,255,0,227,66,53,224,122,0,162,205,230,181,1,129,+87,227,160,94,2,82,101,97,195,159,0,115,100,176,9,46,32,80,111,115,+115,105,98,108,101,192,22,195,183,232,109,0,99,160,227,165,3,0,89,98,+40,68,230,245,189,3,168,233,231,66,1,160,0,227,192,5,225,0,9,239,+36,9,0,47,160,137,0,46,227,30,0,66,59,135,129,180,34,129,145,98,+104,1,52,57,110,102,160,155,64,181,0,53,66,213,116,152,0,52,87,86,+116,249,212,254,96,51,0,52,98,85,64,52,105,113,71,86,0,83,164,79,+82,10,1,52,49,66,139,200,133,224,51,4,225,91,19,9,65,109,98,105,+103,117,111,117,115,58,225,64,0,107,78,170,251,229,5,3,136,87,64,0,+64,217,173,144,2,49,50,52,133,193,230,34,1,0,50,67,223,65,32,225,+246,0,0,35,92,6,195,104,64,136,1,51,55,230,67,2,0,84,97,56,+231,150,2,192,34,4,79,32,35,51,50,246,72,0,162,97,150,153,96,33,+225,221,0,0,35,94,18,128,187,224,57,10,224,46,3,229,203,24,160,74,+96,0,3,95,49,50,55,224,249,0,2,95,49,51,90,11,128,12,65,0,+0,54,136,129,139,32,4,50,52,32,64,90,216,60,163,9,64,59,127,122,+246,215,1,192,193,131,22,67,44,139,85,199,221,224,193,4,235,33,0,224,+46,4,69,6,240,52,1,98,239,0,55,139,101,64,219,64,105,0,80,192,+85,235,165,0,130,1,137,166,64,36,96,191,137,98,64,41,128,119,109,68,+221,109,0,79,98,174,235,193,0,1,52,51,102,12,0,52,118,203,225,185,+1,3,58,92,49,48,190,72,129,157,236,205,22,2,32,32,102,71,107,227,+172,2,0,50,69,255,162,107,0,53,64,11,160,237,224,72,24,6,101,120,+112,101,99,116,101,224,75,3,105,12,3,95,49,51,53,68,148,165,219,236,+253,2,67,54,98,177,1,53,54,96,85,78,67,224,12,6,1,56,52,97,+226,88,189,65,41,128,6,0,52,156,206,224,7,0,74,197,64,78,186,89,+64,49,0,53,77,89,2,95,49,53,142,46,64,62,186,213,248,199,1,131,+187,68,254,3,95,49,55,52,107,86,96,39,224,211,1,1,101,111,167,85,+65,146,2,95,50,49,104,13,96,151,114,140,192,197,172,204,0,49,67,152,+192,182,96,10,129,222,70,184,224,213,8,143,241,96,192,96,193,0,48,128,+193,135,101,2,95,49,54,82,145,1,49,56,77,153,160,38,64,29,135,100,+224,104,13,118,123,1,56,52,152,231,93,22,224,107,1,2,51,32,35,133,+234,1,49,56,101,216,0,58,128,88,129,121,104,226,96,248,224,247,1,3,+118,97,108,117,106,130,225,50,7,96,68,103,215,97,17,251,34,0,64,81,+172,217,99,216,0,49,113,120,1,54,48,225,124,1,65,1,0,56,64,183,+224,106,6,4,92,57,50,38,110,224,106,10,167,95,64,6,128,106,163,182,+128,107,196,233,225,84,3,224,244,9,99,62,225,20,0,160,19,68,84,64,+66,0,54,160,66,1,56,52,110,130,64,35,225,16,17,2,107,101,121,224,+163,10,130,64,193,14,66,64,225,15,3,130,219,100,138,224,249,2,198,6,+163,90,67,192,70,20,1,48,55,68,30,64,81,231,137,0,252,244,9,128,+198,142,35,96,31,0,90,169,54,0,49,123,50,192,120,131,5,0,80,96,+213,194,154,4,53,56,52,32,80,101,102,2,53,48,52,64,111,129,95,103,+58,84,105,0,95,65,94,64,48,220,230,196,117,226,108,2,226,214,5,167,+156,230,99,1,97,244,64,72,158,37,76,86,225,145,1,160,154,130,192,238,+173,6,0,50,115,74,0,50,115,129,111,12,199,216,96,233,233,49,4,1,+95,50,86,169,224,34,2,162,21,0,58,137,247,192,185,240,230,1,2,56,+51,54,71,191,1,51,51,65,157,97,37,0,35,131,115,161,134,0,54,194,+27,224,39,15,198,3,228,247,16,82,58,0,47,167,41,229,159,3,224,93,+1,224,135,15,96,186,64,26,0,55,224,122,16,96,216,131,88,134,135,0,+52,70,50,96,103,68,64,0,54,97,4,128,19,64,41,240,12,1,0,50,+73,233,235,5,1,74,27,192,15,239,13,0,148,188,0,52,189,110,191,227,+98,17,128,6,64,81,131,37,169,35,124,209,134,133,235,112,3,0,51,96,+239,193,163,225,191,7,240,110,4,0,50,73,71,215,143,225,217,5,1,49,+56,64,136,225,218,9,224,79,8,128,234,181,106,0,99,86,206,1,100,105,+117,88,64,63,212,153,192,18,131,11,65,193,81,239,245,115,2,0,80,105,+15,69,210,234,65,1,64,38,104,19,171,75,96,148,0,49,64,221,66,150,+136,113,202,147,64,92,131,92,109,18,71,213,64,18,237,37,0,242,197,18,+242,152,6,192,0,64,62,163,31,3,32,67,32,80,97,116,250,39,1,86,+239,130,170,89,193,64,122,233,126,5,1,56,50,172,247,224,14,2,96,56,+2,79,32,35,75,224,192,112,68,166,118,39,106,173,159,249,106,179,255,249,+4,178,199,66,59,224,25,6,97,148,127,205,224,21,3,103,75,0,85,201,+43,96,161,172,130,224,195,5,1,49,56,115,34,224,196,3,64,0,98,152,+0,66,139,107,100,233,96,101,69,109,224,62,28,0,85,73,242,96,44,236,+214,2,71,255,102,176,99,126,129,14,1,56,48,97,232,224,17,0,66,182,+0,49,65,16,68,228,2,55,49,52,235,1,2,192,9,235,3,0,96,36,+160,58,160,139,200,3,138,77,225,69,9,193,2,224,219,5,96,21,102,211,+129,135,224,34,10,96,165,224,34,4,225,74,9,0,54,171,42,225,10,2,+0,58,128,213,69,240,85,239,64,162,136,56,64,169,139,24,67,137,0,53,+101,197,116,147,3,95,50,57,56,92,15,165,18,160,32,1,52,55,204,36,+1,50,48,143,33,224,23,7,1,54,53,128,63,64,22,224,24,4,5,49,+49,49,52,49,49,100,74,2,50,48,50,225,79,2,3,117,116,102,56,94,+174,5,58,32,98,97,100,32,222,184,226,74,3,0,83,202,98,64,147,132,+28,187,149,203,145,188,95,195,168,224,46,18,107,145,0,49,193,160,224,44,+35,224,41,32,131,80,98,116,0,56,110,56,65,15,160,168,117,72,224,27,+21,224,26,4,160,20,97,13,225,8,28,76,219,224,216,84,224,187,47,224,+184,22,0,49,94,50,224,139,40,224,111,12,73,57,128,29,0,79,132,221,+66,231,218,131,1,80,32,100,66,150,170,67,174,187,46,99,44,64,63,96,+223,131,71,1,57,48,98,247,117,246,91,17,198,171,167,139,96,5,224,28,+15,96,206,224,28,3,67,9,163,91,131,149,207,116,192,20,110,50,97,143,+192,183,99,210,64,152,96,76,224,152,0,64,21,249,164,11,71,4,197,204,+64,14,249,179,2,69,28,128,232,231,140,0,241,205,0,232,192,17,31,87,+101,108,99,111,109,101,32,116,111,32,105,110,116,101,114,97,99,116,105,118,+101,32,77,105,99,114,111,72,115,44,32,7,118,101,114,115,105,111,110,32,+148,51,5,50,53,50,32,95,50,110,177,193,243,232,12,1,0,51,92,162,+177,83,192,20,245,77,2,95,217,1,49,56,114,131,198,93,2,95,51,57,+125,162,0,48,135,93,0,56,104,31,121,10,199,245,205,105,73,34,0,54,+107,154,136,12,89,204,232,37,0,64,252,174,75,5,51,54,57,32,75,32,+70,139,128,1,82,78,128,132,224,1,19,120,69,224,0,4,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,200,230,220,0,224,0,0,65,200,233,+179,1,224,1,21,225,179,9,225,230,255,224,32,15,224,29,20,224,26,17,+224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,192,8,78,125,224,+0,5,66,3,174,183,68,199,0,51,67,217,2,95,49,55,92,140,68,85,+128,15,0,51,68,236,102,57,192,34,102,79,68,102,107,205,110,5,0,55,+94,158,1,95,52,72,143,1,95,52,137,251,224,82,2,224,44,0,101,33,+244,252,2,10,121,112,101,32,39,58,113,117,105,116,39,69,21,64,8,13,+44,32,39,58,104,101,108,112,39,32,102,111,114,32,64,9,136,190,224,78,+6,119,100,0,51,157,125,0,55,95,66,224,101,17,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,20,105,109,105,116,101,100,32,102,117,110,99,116,+105,111,110,97,108,105,116,121,46,170,141,67,59,169,10,65,44,178,52,225,+27,1,0,54,70,161,0,55,95,251,97,34,192,24,225,33,5,0,67,139,+49,0,55,79,119,171,184,247,96,0,3,95,49,55,57,64,96,224,174,1,+4,46,109,104,115,105,96,126,224,19,1,1,62,32,128,143,77,29,96,144,+159,70,128,155,202,212,65,229,231,51,2,0,35,84,17,128,150,225,185,1,+69,248,116,205,160,214,224,180,4,2,95,49,56,87,71,0,80,224,187,2,+225,74,6,1,66,121,114,172,225,23,4,129,25,237,79,1,1,95,53,64,+231,96,226,162,80,134,57,155,252,64,183,226,24,25,17,85,110,114,101,99,+111,103,110,105,122,101,100,32,99,111,109,109,97,189,205,224,87,10,194,224,+122,231,64,10,70,135,141,176,156,114,64,119,64,25,0,85,66,155,129,20,+0,64,78,25,226,211,18,160,12,249,157,25,248,65,0,192,165,245,146,9,+85,23,0,51,191,7,224,191,13,64,0,64,140,0,54,201,163,67,127,0,+52,104,203,144,50,128,62,65,158,96,189,0,58,129,167,3,10,65,32,79,+146,104,224,151,9,67,73,168,70,2,54,32,95,96,135,224,119,1,175,221,+224,60,16,2,99,108,101,172,52,224,61,0,228,30,3,89,189,104,30,104,+74,227,231,8,121,0,0,39,168,67,1,52,48,99,161,104,66,232,87,0,+0,55,76,193,232,87,0,136,137,2,95,51,49,106,109,225,31,12,224,169,+16,4,114,101,108,111,97,130,25,224,170,0,227,156,5,100,146,65,141,224,+22,6,132,163,233,65,1,130,4,98,63,226,7,2,73,53,64,132,226,42,+13,125,202,192,213,224,233,3,225,20,4,165,79,225,247,14,224,218,16,4,+100,101,108,101,116,131,109,224,125,8,97,131,164,74,152,186,162,53,120,202,+0,56,192,26,157,138,226,73,3,100,111,79,175,225,105,13,224,140,16,2,+116,121,112,224,138,11,66,145,97,202,224,73,33,1,107,105,163,201,224,73,+9,225,37,13,224,73,16,230,26,0,79,188,228,81,14,64,86,183,248,225,+126,9,203,219,99,79,143,183,224,93,1,0,67,131,206,0,115,121,229,102,+161,0,32,96,0,96,9,171,177,96,26,130,130,64,26,160,9,5,109,111,+100,117,108,101,128,28,99,73,96,55,128,9,9,97,108,108,32,100,101,102,+105,110,105,70,105,128,35,129,232,3,32,100,32,32,192,9,224,32,0,4,+40,115,41,32,100,96,36,65,128,1,32,101,64,72,4,115,104,111,119,32,+96,14,3,111,102,32,101,96,28,65,83,0,32,96,159,224,28,4,0,116,+96,28,65,38,128,186,7,116,104,105,115,32,116,101,120,96,23,2,101,120,+112,128,152,2,32,32,101,88,132,2,97,116,101,90,86,2,114,101,115,76,+130,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,187,1,65,63,206,15,227,103,6,0,51,123,52,227,+103,14,2,49,55,54,71,3,134,183,109,180,229,106,9,1,79,32,114,242,+129,171,65,206,156,170,0,80,227,167,5,64,74,71,131,0,75,227,231,13,+229,219,21,81,62,142,250,91,55,2,95,52,48,109,39,100,55,192,0,64,+225,0,54,235,44,0,128,63,155,176,102,213,0,89,67,113,79,11,0,79,+146,71,128,173,230,150,6,198,154,224,13,1,0,85,224,13,2,96,25,241,+158,0,149,27,149,63,77,187,103,213,0,51,163,194,129,47,255,178,4,115,+44,69,64,69,78,100,129,64,177,252,228,0,0,50,213,7,64,21,141,189,+230,212,19,98,64,230,198,0,128,38,129,15,224,53,19,1,32,61,160,51,+193,205,225,186,4,96,122,140,111,224,50,1,73,255,0,95,102,168,64,29,+138,137,226,66,88,0,55,79,58,226,66,81,70,5,130,66,0,55,102,58,+192,0,64,225,217,242,226,66,51,226,52,64,98,51,88,30,226,51,4,233,+199,2,0,51,93,175,0,52,64,180,0,64,149,29,0,73,97,167,64,43,+130,86,0,51,98,84,64,18,133,61,3,80,32,95,52,74,204,128,5,64,+23,220,61,226,51,15,133,43,130,55,128,37,0,52,97,64,224,48,16,0,+40,224,49,14,224,33,1,5,41,32,119,104,101,114,101,24,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,242,31,97,117,108,116,+32,40,73,110,116,101,103,101,114,44,32,68,111,117,98,108,101,44,32,83,+116,114,105,110,103,44,32,40,1,41,41,164,244,161,211,73,3,226,181,18,+193,153,97,240,1,64,83,98,21,4,49,32,95,54,56,140,184,242,213,0,+235,131,2,98,209,66,9,226,158,12,1,64,90,130,246,123,157,177,176,97,+204,0,90,242,15,0,114,247,153,128,160,110,0,57,135,165,1,55,57,172,+167,227,72,63,136,235,224,169,14,66,86,168,115,231,147,0,1,49,55,180,+83,224,103,2,228,46,16,76,168,97,90,224,174,4,227,136,7,0,52,92,+250,0,52,120,173,0,83,77,84,97,88,237,94,0,224,47,6,72,74,96,+157,160,82,147,76,224,66,2,224,32,0,243,24,11,163,52,67,11,131,60,+0,51,109,44,131,237,226,188,16,1,79,32,124,128,96,215,65,52,224,76,+0,64,226,133,140,121,127,0,67,129,192,64,91,2,83,32,73,96,220,155,+75,131,235,2,95,49,50,66,52,193,191,224,24,1,0,80,133,218,160,13,+164,45,64,13,0,39,132,82,161,239,195,251,128,18,64,54,228,3,0,242,+28,5,148,105,66,68,4,66,32,95,51,56,138,77,100,174,96,40,230,56,+20,19,114,97,110,115,108,97,116,101,58,32,110,111,116,32,102,111,117,110,+100,32,131,43,187,84,180,94,101,56,129,1,134,19,96,233,128,169,0,83,+252,21,0,80,180,128,19,128,15,96,252,96,185,196,237,193,142,68,154,67,+26,97,9,197,37,131,123,64,78,64,17,250,47,4,128,138,224,32,18,134,+34,165,90,224,32,11,130,250,161,93,250,81,3,192,24,0,85,64,157,67,+148,191,221,250,254,15,5,100,121,110,115,121,109,164,80,218,252,2,95,57,+53,239,93,0,129,2,224,98,3,96,156,0,85,225,166,21,225,164,22,65,+160,6,32,112,114,105,109,111,112,161,160,97,152,0,57,96,64,72,56,99,+190,224,131,0,224,231,10,129,66,96,231,96,226,251,243,0,226,162,0,65,+190,225,55,8,128,34,128,79,98,234,224,28,3,98,136,224,105,8,96,21,+80,238,219,162,224,116,2,0,57,68,36,64,0,224,31,3,226,176,38,1,+58,32,70,22,5,115,115,105,98,108,101,207,190,152,17,1,54,57,164,68,+66,168,179,40,78,101,82,7,143,216,0,54,193,176,64,22,72,88,217,44,+96,50,135,239,236,193,6,2,79,32,35,78,16,162,170,236,224,8,4,79,+32,35,55,57,160,30,0,79,224,30,13,100,158,0,64,140,192,237,30,16,+1,67,39,96,201,112,251,224,129,10,0,55,160,67,65,164,224,30,10,192,+98,90,34,224,98,16,0,83,128,98,99,153,224,67,9,68,173,96,67,68,+105,224,197,10,0,51,160,30,67,186,224,61,10,192,30,67,125,224,30,10,+192,160,67,232,224,30,10,193,65,69,38,224,191,16,0,66,128,191,69,40,+224,67,10,72,195,96,67,73,101,224,98,10,201,164,0,82,224,98,19,1,+75,50,96,98,0,75,66,136,224,36,17,0,51,128,36,66,108,224,36,17,+0,52,128,36,71,3,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,146,122,64,8,224,40,19,1,114,101,132,246,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,212,117,2,97,110,100,224,38,+19,0,111,147,44,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,182,128,84,160,12,224,48,19,1,61,61,96,+42,69,199,224,36,17,0,47,128,36,0,47,224,36,10,68,139,195,135,0,+60,224,67,19,0,60,128,67,0,60,224,67,14,194,185,0,62,224,67,19,+0,62,128,67,0,62,224,172,20,1,117,60,130,97,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,130,171,1,111,114,226,171,20,0,99,161,233,+0,99,225,232,21,1,102,43,96,37,0,102,228,39,10,224,36,2,0,45,+128,36,228,45,10,224,36,2,0,42,128,36,228,51,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,+196,155,64,8,224,40,20,83,236,128,41,115,246,224,42,19,1,114,101,183,+37,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,164,171,96,10,224,44,+19,224,43,1,224,42,24,2,115,99,109,149,253,64,8,224,208,20,192,40,+64,8,224,40,19,1,114,110,128,248,1,114,110,224,247,20,3,73,79,46,+62,161,201,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,80,191,192,49,96,12,224,48,22,7,+115,101,114,105,97,108,105,122,151,206,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,132,220,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,238,107,2,128,10,224,44,19,4,+110,101,119,67,65,146,247,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,151,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,0,115,+195,129,128,10,224,44,21,229,248,0,128,10,224,44,21,2,119,114,105,188,+113,160,11,224,46,21,167,142,64,8,224,40,19,2,98,115,43,136,76,64,+8,224,40,23,224,41,1,224,42,22,160,124,64,8,224,40,21,168,13,64,+8,224,40,21,136,15,1,98,115,232,16,20,1,98,115,168,17,64,8,224,+40,21,133,247,1,98,115,229,245,20,1,98,115,166,75,64,8,224,40,21,+198,199,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,113,192,12,+224,48,21,3,115,117,98,115,163,17,192,12,224,48,19,192,9,96,48,224,+22,0,224,48,18,1,116,111,224,46,0,128,10,224,93,20,0,112,170,218,+0,112,234,219,21,1,112,50,129,110,64,8,224,40,21,1,110,101,169,134,+64,9,224,42,21,0,102,167,5,96,9,122,108,146,176,224,0,98,82,151,+185,228,86,21,87,121,187,19,179,38,118,161,243,50,17,1,32,61,84,55,+0,110,153,52,147,45,224,56,0,141,108,247,197,4,120,36,251,244,4,2,+95,105,116,103,55,64,27,154,55,243,161,0,155,49,252,100,49,64,82,154,+114,224,110,4,160,108,0,54,186,140,1,53,54,96,92,0,55,96,242,2,+54,51,48,116,57,84,234,2,95,49,55,81,32,64,43,216,122,152,59,83,+45,119,150,3,95,51,54,56,96,167,83,242,1,49,54,115,233,148,136,185,+239,64,59,151,211,9,95,51,54,57,32,75,32,85,32,75,183,151,64,65,+87,227,90,27,148,34,160,47,151,1,224,151,6,1,55,52,154,33,192,144,+148,125,215,13,81,221,215,239,181,50,64,45,0,53,89,93,97,10,0,75,+128,53,148,128,96,161,64,52,118,137,156,54,128,61,1,83,32,85,55,185,+74,1,67,39,87,90,3,67,39,32,79,156,203,161,94,0,51,207,59,96,+4,4,90,32,90,32,83,183,166,1,85,32,96,14,0,67,64,48,161,240,+3,95,49,55,56,64,197,188,117,96,0,128,106,97,73,7,54,57,56,32,+95,50,50,55,160,33,0,35,122,0,224,35,6,2,49,55,56,151,125,96,+222,66,163,65,141,121,0,1,50,53,192,90,160,43,0,52,89,238,2,64,+95,54,85,172,1,49,53,66,42,96,0,216,242,186,199,192,88,85,176,1,+51,53,150,48,129,14,226,255,0,84,48,224,7,0,65,218,98,16,128,0,+65,72,131,49,65,204,0,90,96,161,193,236,64,47,182,21,128,94,80,173,+66,13,129,182,64,39,3,10,65,32,89,249,166,0,152,213,0,67,118,243,+253,147,6,64,46,130,188,121,12,64,158,100,71,119,49,129,11,86,248,192,+17,160,193,152,162,121,243,247,117,3,64,254,1,54,56,65,21,0,49,84,+168,128,64,64,78,0,55,250,67,2,130,71,224,54,1,126,49,65,5,163,+12,128,103,224,130,1,96,113,250,74,1,162,81,254,85,2,64,194,0,54,+160,194,128,149,157,23,123,102,4,67,32,95,50,56,92,181,0,50,85,188,+225,243,0,251,137,3,64,160,219,116,128,117,251,167,5,1,52,55,184,50,+187,231,0,55,97,188,251,236,0,2,95,49,55,64,17,128,0,193,49,89,+82,0,55,192,65,1,49,55,67,93,225,60,3,224,93,0,163,68,0,67,+163,99,98,12,0,52,99,14,0,80,94,209,156,87,129,9,65,200,98,239,+152,136,250,139,0,224,106,3,194,96,89,160,1,95,52,153,81,0,54,67,+143,97,102,252,158,1,129,52,196,110,128,1,224,69,0,64,175,3,57,32,+95,50,64,247,224,212,0,96,33,160,181,64,164,185,116,64,10,64,83,64,+78,132,129,64,40,86,255,187,76,224,2,0,128,47,254,153,0,224,8,0,+160,24,224,25,11,155,4,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,97,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,159,18,224,86,2,224,145,22,224,86,15,225,184,9,+224,1,7,0,83,68,193,0,49,198,222,231,4,2,224,0,1,224,195,13,+224,2,17,225,103,12,224,138,40,197,162,224,0,4,224,108,13,224,2,21,+224,138,57,229,162,0,224,0,3,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,222,191,224,0,3,226,+209,12,224,2,19,224,131,54,190,207,224,0,4,224,116,25,192,2,227,82,+15,224,131,37,104,221,224,65,34,224,114,11,224,47,19,225,119,8,0,50,+198,224,224,0,2,224,223,19,224,2,9,224,126,52,231,139,0,224,63,15,+224,115,28,224,106,13,128,1,224,112,6,234,92,1,192,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,238,113,0,96,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,+141,17,3,95,49,51,57,110,122,0,50,111,101,0,53,109,190,110,127,64,+20,0,52,78,53,160,19,228,48,4,224,129,1,64,67,235,129,1,64,0,+193,72,128,108,173,227,67,6,237,121,3,224,69,4,235,92,12,234,85,8,+224,255,7,0,67,77,202,2,51,51,50,160,235,1,64,35,139,234,224,88,+25,160,152,224,83,0,192,43,231,50,6,198,21,192,46,64,14,224,40,12,+163,107,224,37,0,224,34,10,207,93,144,140,224,25,3,229,247,5,0,73,+192,13,173,202,64,5,233,79,2,96,126,142,198,224,220,3,97,116,64,16,+1,64,80,225,59,1,226,230,8,130,64,160,236,98,95,224,248,1,224,25,+2,77,95,172,219,164,187,225,208,3,224,74,10,226,205,11,65,10,192,139,+224,18,2,226,44,5,3,95,50,49,54,226,56,2,226,55,17,243,52,0,+144,123,224,106,6,81,90,224,16,21,77,145,224,16,4,175,151,0,57,242,+179,2,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,147,20,224,89,4,163,91,+225,121,1,224,237,17,224,142,5,238,128,19,224,42,9,226,211,10,225,232,+0,228,96,0,64,5,225,149,8,227,50,8,192,62,130,186,192,65,128,8,+130,209,66,75,227,225,5,226,155,1,224,2,0,239,240,12,224,121,3,224,+68,4,242,117,0,96,40,68,103,83,201,132,117,224,142,1,162,11,96,135,+160,5,64,143,224,139,3,64,209,129,106,6,67,32,95,55,53,32,95,145,+106,112,164,160,71,64,53,177,245,100,199,243,57,3,224,42,3,64,41,64,+237,226,108,12,224,0,1,224,205,0,145,104,224,245,11,161,106,97,72,224,+172,2,97,185,224,246,2,128,148,80,171,224,175,4,196,68,162,252,242,122,+0,160,65,64,231,224,255,1,128,43,128,5,224,48,5,224,55,1,100,82,+164,87,224,6,3,225,151,10,241,171,3,192,88,130,15,193,124,227,148,18,+224,169,2,128,44,225,175,9,100,91,225,113,2,224,182,9,224,175,5,224,+127,0,166,253,160,176,162,163,224,147,1,128,107,134,202,1,95,52,98,217,+160,6,225,142,1,231,65,0,128,15,100,35,128,10,225,4,16,226,190,2,+227,157,3,1,56,50,149,160,224,235,1,228,219,10,181,255,226,149,2,96,+247,236,238,0,229,94,2,1,64,64,84,97,130,185,225,59,1,224,242,2,+161,76,227,102,5,1,85,32,237,58,1,227,45,8,226,65,3,231,119,6,+224,95,12,225,13,2,226,218,9,224,105,2,224,32,2,227,244,16,225,52,+31,97,197,243,195,9,98,35,225,56,18,224,221,8,224,22,2,225,198,6,+0,56,96,111,227,171,17,226,142,5,66,64,96,23,228,143,0,167,154,164,+67,161,131,70,213,244,176,0,133,38,226,140,0,128,27,225,108,0,163,109,+224,63,3,128,242,71,97,224,67,15,0,67,135,55,224,70,9,226,5,0,+229,0,5,226,189,15,227,193,8,195,104,131,174,165,1,228,202,20,161,197,+228,179,3,160,162,132,182,195,119,225,169,5,228,205,2,160,60,1,50,52,+70,102,193,86,250,99,12,6,92,56,38,32,92,56,38,199,82,153,223,183,+13,248,50,0,164,104,128,150,0,82,224,10,1,224,194,12,129,252,227,27,+7,228,189,0,227,18,3,192,20,128,204,226,179,5,174,54,224,26,7,231,+161,3,98,120,64,164,246,98,0,132,160,65,199,138,8,134,120,248,74,3,+64,23,248,87,1,99,128,96,4,161,181,164,229,128,250,0,57,96,7,0,+50,89,29,196,213,134,207,96,112,118,230,2,64,95,53,118,136,230,221,2,+230,56,3,98,65,139,236,0,54,96,76,151,90,249,56,0,248,75,3,0,+51,153,92,1,50,51,64,236,64,225,64,20,155,9,232,119,3,0,48,232,+23,6,67,123,66,20,64,169,0,49,65,28,64,124,172,65,0,54,64,11,+0,35,134,36,2,50,48,50,233,116,2,12,103,101,116,82,97,119,32,102,+97,105,108,101,100,129,252,225,72,3,1,95,50,251,225,0,0,56,155,86,+7,94,71,69,84,82,65,87,32,64,17,189,81,64,43,0,53,129,148,0,+56,96,173,0,55,154,31,6,94,102,108,117,115,104,98,64,42,64,24,128,+212,91,10,160,212,66,208,1,10,65,225,135,3,155,88,3,95,52,53,51,+122,92,97,113,235,173,4,240,69,0,0,83,155,182,193,108,0,90,98,98,+130,81,64,135,239,124,0,64,102,0,54,218,198,2,50,32,65,152,43,0,+55,152,122,3,95,49,51,56,96,157,152,58,226,197,0,225,70,8,2,95,+49,55,140,64,195,111,225,116,23,0,50,76,187,193,112,99,128,254,94,20,+12,83,97,118,105,110,103,32,99,97,99,104,101,32,97,133,1,95,49,123,+221,0,51,64,248,0,53,97,137,1,51,48,204,168,64,224,1,50,32,192,+16,64,191,162,50,3,49,55,55,49,96,207,221,55,96,172,204,162,64,150,+92,84,1,95,52,145,18,228,183,6,97,198,0,55,114,151,98,141,133,205,+192,60,2,95,51,48,74,179,0,55,141,45,231,108,10,64,124,98,204,0,+50,94,10,160,151,189,137,250,20,2,98,41,128,46,126,72,64,37,130,70,+11,73,79,46,115,101,114,105,97,108,105,122,101,64,196,64,30,66,68,18,+97,100,100,95,108,122,55,55,95,99,111,109,112,114,101,115,115,111,114,96,+30,130,81,7,85,32,75,51,32,75,52,32,66,57,224,1,5,234,97,1,+160,141,65,193,163,67,1,51,50,69,135,2,51,54,49,94,150,64,209,160,+234,96,23,97,237,0,51,77,201,165,61,0,51,169,207,0,55,110,144,0,+75,131,30,128,66,66,215,192,94,130,102,229,174,0,94,149,8,64,95,52,+50,52,32,95,52,50,64,56,64,35,255,97,4,98,20,226,21,18,9,69,+120,99,101,112,116,105,111,110,58,130,19,96,65,218,229,97,124,128,132,0,+52,65,154,5,51,56,55,32,95,52,177,109,129,245,224,229,2,1,52,49,+161,211,224,25,9,0,48,128,50,166,218,224,88,3,198,61,160,255,91,207,+128,172,0,52,67,132,224,167,1,2,46,104,115,128,159,234,48,0,225,75,+1,128,114,224,69,1,224,15,1,1,52,50,64,125,97,25,194,16,101,95,+160,194,97,125,225,104,0,65,72,66,93,0,85,162,76,197,176,227,143,2,+224,178,0,65,14,1,64,95,129,152,224,31,8,64,102,65,10,224,92,6,+0,49,242,41,5,65,104,131,83,192,188,99,254,77,186,113,164,0,55,69,+80,1,95,49,98,193,96,44,165,158,6,51,54,57,32,75,32,85,233,209,+0,2,95,51,57,128,88,64,35,131,12,238,32,0,240,58,2,3,95,49,+55,53,102,99,1,83,32,70,40,192,61,224,7,3,72,176,166,159,64,14,+235,213,5,227,96,2,228,136,13,131,145,226,118,4,167,211,226,120,12,14,+99,111,109,98,105,110,97,116,111,114,115,58,92,49,48,168,20,1,95,54,+68,61,128,175,253,203,4,96,221,131,196,224,221,11,96,155,0,51,117,15,+128,30,226,29,2,97,247,72,156,2,95,49,52,103,4,232,73,4,193,210,+0,89,104,60,226,185,7,2,49,55,53,232,26,1,191,68,227,149,4,193,+63,192,83,196,178,192,123,225,53,9,0,51,98,100,229,191,5,227,5,5,+225,67,35,2,112,105,108,69,213,14,117,115,101,100,32,98,111,111,116,32,+109,111,100,117,108,165,224,64,196,210,223,225,211,1,225,25,18,239,50,2,+226,213,11,64,125,129,152,160,64,96,185,0,85,99,36,111,161,195,224,65,+12,226,62,38,225,7,4,224,250,25,17,116,111,116,97,108,32,105,109,112,+111,114,116,32,116,105,109,101,32,64,0,128,245,64,121,201,3,4,49,55,+53,55,32,123,24,166,237,96,89,224,72,2,0,109,228,87,1,129,205,233,+227,4,244,158,2,64,14,130,5,64,7,137,249,1,95,51,116,141,160,181,+6,54,57,48,32,95,54,56,104,23,64,120,130,33,211,236,0,58,131,128,+67,194,64,211,1,57,53,67,202,102,246,65,248,70,208,1,95,51,107,66,+64,40,134,120,167,2,202,89,97,82,107,93,97,78,3,95,49,49,52,235,+146,4,141,122,0,73,104,247,0,53,134,136,226,208,11,100,251,64,64,128,+213,106,188,138,113,163,58,226,191,2,97,171,64,159,226,2,0,96,177,162,+10,226,11,2,163,15,1,83,39,195,72,0,80,135,28,98,116,98,27,161,+92,110,132,128,216,64,2,96,24,98,46,130,69,2,95,50,50,64,125,139,+0,129,37,2,49,55,53,162,108,139,16,246,92,1,129,113,2,49,55,53,+130,228,64,246,0,54,199,177,71,176,73,137,96,21,135,18,0,85,231,185,+10,64,29,233,153,0,65,108,230,85,17,162,194,1,51,53,69,250,0,52,+104,164,194,161,1,52,56,226,175,13,2,79,32,35,74,135,128,108,226,150,+0,1,95,51,64,144,64,183,192,201,194,79,194,254,96,226,226,254,19,17,+67,97,110,110,111,116,32,102,105,110,100,32,112,97,99,107,97,103,227,242,+8,163,152,227,136,1,230,188,0,231,111,2,201,72,1,95,52,130,182,97,+15,134,149,231,123,2,3,112,107,103,34,130,85,166,131,226,192,0,100,53,+1,95,52,77,88,64,30,134,126,68,84,0,54,73,63,69,59,98,132,97,+56,226,136,1,167,144,250,32,0,227,91,0,128,11,1,95,51,104,215,96,+31,130,21,77,37,182,237,229,93,37,232,170,15,152,229,225,27,14,1,52,+50,228,125,23,0,91,64,10,161,112,228,109,3,0,50,71,164,225,231,1,+163,228,64,237,1,79,32,66,11,0,53,130,11,130,15,4,79,32,35,57,+51,244,165,1,224,124,32,132,244,69,245,229,228,8,226,195,13,129,235,76,+243,64,40,233,83,10,128,54,68,216,1,95,52,64,146,64,53,136,12,242,+6,7,226,67,5,104,176,1,95,52,199,178,134,78,98,218,166,78,96,0,+64,20,100,28,239,164,2,225,198,47,225,33,39,108,237,0,100,225,40,8,+233,153,4,207,141,69,207,0,52,101,207,1,95,49,74,134,69,89,4,95,+49,56,51,32,166,155,131,29,69,162,228,45,1,231,234,49,224,197,35,103,+216,224,195,6,225,234,40,0,45,64,69,128,68,97,215,228,110,35,232,89,+3,100,119,3,111,117,110,100,204,49,228,113,2,226,54,35,1,49,55,216,+251,226,55,1,0,54,213,31,97,105,135,4,102,159,107,18,1,54,57,99,+84,139,17,135,1,175,139,0,52,68,188,64,50,134,245,69,254,229,228,1,+64,23,0,54,228,136,2,228,140,6,0,53,68,15,187,186,160,196,224,192,+5,225,98,0,193,95,1,95,52,64,136,128,0,243,122,0,251,47,8,200,+51,224,35,2,224,44,1,160,62,224,19,1,64,16,224,116,2,128,21,128,+76,224,8,9,101,14,246,6,1,226,133,37,133,240,193,139,234,112,9,226,+5,17,6,112,97,114,115,105,110,103,193,247,224,0,1,250,42,7,246,167,+7,224,160,69,226,168,19,64,162,1,101,100,236,80,3,105,245,0,54,82,+70,224,0,2,225,226,5,234,173,3,160,165,163,93,117,0,128,175,224,168,+1,236,63,1,211,181,0,54,82,183,2,95,52,51,106,50,155,121,168,193,+160,60,227,100,0,128,15,224,190,16,195,98,7,97,109,101,32,100,111,101,+115,99,108,12,97,103,114,101,101,32,119,105,116,104,32,102,105,160,29,225,+131,0,161,78,168,87,99,136,232,134,12,74,26,131,14,230,46,2,160,65,+226,154,11,226,179,10,227,12,4,227,55,8,226,6,10,161,90,163,25,96,+167,233,93,10,65,116,79,26,2,95,54,56,134,51,97,80,0,51,228,52,+6,0,52,82,111,99,234,239,69,4,131,106,224,1,3,158,215,224,28,14,+190,51,224,28,13,64,1,224,223,20,224,53,16,232,95,8,0,54,248,180,+3,96,0,168,232,160,2,228,41,5,159,166,224,91,2,224,35,2,224,114,+7,224,26,4,225,166,11,225,175,1,224,235,19,239,2,12,229,157,2,97,+131,0,53,88,195,0,75,242,228,6,225,231,16,225,240,4,227,241,37,207,+195,227,241,43,9,116,121,112,101,32,99,104,101,99,107,227,247,4,233,132,+1,0,54,82,180,0,54,86,46,224,53,2,0,45,64,0,224,45,1,224,+221,6,225,85,17,225,121,1,226,10,12,231,145,4,160,194,239,46,2,160,+17,1,54,56,64,140,206,41,224,0,1,224,81,11,226,208,4,226,181,47,+226,37,18,226,151,0,224,186,53,224,153,15,64,1,224,192,4,224,40,19,+224,198,23,224,200,16,225,149,0,224,81,7,224,224,3,167,140,224,73,6,+196,153,227,89,4,224,64,7,224,2,4,224,70,3,224,30,10,224,69,1,+224,143,12,226,64,1,224,27,7,232,49,3,224,92,18,192,32,229,108,14,+128,37,128,93,200,38,224,8,9,231,151,104,6,100,101,115,117,103,97,114,+231,154,5,131,153,204,61,224,0,3,243,77,2,161,160,128,177,224,5,9,+225,25,1,228,117,6,64,0,96,211,225,30,4,224,223,19,232,34,1,225,+146,1,134,123,107,170,224,24,6,235,182,26,4,100,111,110,101,32,228,96,+1,224,141,5,231,179,5,224,91,2,224,89,17,0,44,224,76,1,128,42,+238,105,2,242,219,2,192,29,232,102,18,2,115,32,40,192,74,130,148,224,+142,0,224,72,4,224,69,21,1,32,43,192,143,224,65,16,224,62,28,224,+197,12,79,45,0,49,239,28,1,224,0,5,128,111,99,76,226,26,18,226,+228,12,233,214,32,1,95,51,125,115,193,100,0,57,124,36,233,218,2,4,+95,52,48,57,32,224,205,1,10,73,110,116,101,114,97,99,116,105,118,101,+161,20,64,93,188,91,226,95,5,227,65,45,3,108,111,97,100,238,201,10,+225,17,0,228,121,1,97,253,195,241,227,67,0,192,14,225,16,5,66,254,+164,50,140,95,228,60,0,192,165,165,132,160,18,0,54,152,107,227,118,0,+129,33,144,58,242,17,2,64,161,3,56,56,32,95,105,180,96,14,250,206,+9,226,240,2,246,80,3,229,136,1,97,227,224,96,2,72,139,115,209,128,+37,2,32,95,55,175,164,84,255,1,48,48,192,11,224,92,1,224,32,2,+224,45,4,64,0,125,241,213,62,224,16,11,224,32,8,0,83,64,11,0,+50,64,150,0,89,244,222,0,212,219,193,15,180,156,64,190,80,77,1,55,+52,224,111,0,231,50,3,1,95,57,127,146,64,209,252,66,2,194,212,193,+87,228,47,0,144,157,67,23,129,57,1,95,56,92,243,64,144,1,73,32,+126,205,227,36,4,224,156,11,249,226,1,171,2,224,10,4,224,186,4,65,+104,192,0,224,233,11,141,24,194,104,7,67,32,67,32,61,61,32,64,119,+96,128,86,144,0,245,167,5,225,186,4,224,246,3,82,40,141,52,3,49,+53,54,53,173,167,75,228,130,12,79,185,223,69,1,53,54,99,24,95,207,+64,6,0,56,112,51,160,45,145,179,2,55,52,51,116,133,64,60,189,131,+1,49,53,87,24,2,95,49,53,66,154,1,49,53,97,130,155,222,224,185,+0,127,235,3,95,49,50,54,67,114,1,55,52,94,128,128,39,227,122,1,+2,101,111,102,131,118,64,198,2,95,50,49,64,123,128,136,226,203,0,64,+118,149,54,66,207,67,239,160,123,164,102,96,187,131,74,194,244,2,53,54,+57,64,5,146,218,161,252,0,32,206,120,1,49,53,97,227,64,139,96,227,+1,53,56,97,76,2,67,32,79,229,19,0,64,114,181,142,224,233,2,0,+54,68,161,1,49,55,68,175,228,91,0,224,176,1,97,113,1,56,57,92,+191,228,188,3,3,77,97,105,110,96,225,0,79,160,170,0,54,109,144,224,+36,5,0,109,192,36,160,128,64,127,181,239,68,80,225,106,0,1,56,55,+224,52,3,110,208,96,54,225,143,5,0,48,96,234,224,19,1,100,251,129,+214,225,233,3,0,51,93,192,225,245,0,3,57,49,32,35,99,82,64,11,+70,42,0,54,127,239,160,24,130,51,192,13,244,50,1,224,254,2,1,67,+39,65,64,64,34,0,52,193,71,132,40,224,192,16,3,119,104,101,114,229,+209,1,138,163,225,107,11,225,215,0,225,113,8,193,115,226,40,1,252,198,+0,128,241,135,0,224,9,66,225,74,2,224,5,8,65,53,161,78,128,20,+127,15,0,55,64,200,1,51,56,98,114,225,114,5,225,12,4,3,100,97,+116,97,129,203,2,49,54,55,163,183,1,54,55,103,13,224,88,3,224,99,+12,1,49,51,64,154,224,93,19,5,110,101,119,116,121,112,162,44,1,49,+54,155,62,226,1,10,0,54,131,25,224,101,15,195,85,163,91,2,95,49,+54,160,48,1,54,48,98,218,71,57,1,95,54,100,161,70,120,121,131,245,+240,7,130,60,2,95,57,53,70,195,65,235,98,162,161,204,128,241,224,129,+18,105,214,224,231,17,224,228,35,0,54,186,218,225,173,8,0,53,88,105,+68,244,152,201,169,68,192,68,98,2,224,147,4,64,70,229,68,6,0,54,+70,222,2,49,54,51,65,150,227,66,4,224,119,1,224,68,4,0,52,67,+180,224,216,19,138,249,160,218,0,55,147,13,226,25,29,154,21,224,88,1,+224,11,27,224,124,6,5,102,111,114,101,105,103,132,161,224,152,18,65,234,+0,56,69,157,1,54,48,230,18,1,224,47,7,4,99,99,97,108,108,224,+73,12,3,99,97,112,105,164,13,65,58,96,141,224,32,4,4,117,110,115,+97,102,196,48,192,34,1,55,48,193,197,0,54,125,202,224,199,5,2,54,+49,51,224,64,2,1,58,58,226,27,0,192,52,225,53,13,0,55,74,134,+224,28,13,72,123,227,245,4,106,78,128,54,0,50,139,105,225,32,6,3,+110,102,105,120,128,241,65,232,224,45,1,0,52,94,161,224,45,12,0,114,+224,227,0,224,92,3,135,145,224,46,10,160,45,96,28,96,151,65,120,228,+89,2,2,105,103,105,97,160,231,157,6,190,109,69,243,71,124,88,11,124,+13,171,163,67,159,67,41,249,176,13,1,67,32,224,32,0,224,33,8,165,+143,160,91,1,95,49,167,110,192,36,224,0,0,227,38,0,154,215,227,38,+6,226,218,13,226,229,15,64,168,226,193,18,3,99,108,97,115,155,144,65,+252,96,160,196,33,161,199,228,38,9,0,49,107,54,192,164,226,11,17,0,+57,64,15,130,124,226,125,7,72,183,224,33,6,224,232,6,232,242,4,200,+177,89,135,70,53,0,54,222,65,224,246,15,72,245,228,53,20,5,110,115,+116,97,110,99,229,18,1,164,121,128,94,1,55,51,229,0,9,2,49,51,+54,229,98,22,5,100,101,102,97,117,108,196,138,1,54,48,104,43,65,219,+128,94,225,199,6,224,188,17,0,55,143,162,229,203,29,128,169,227,219,30,+193,103,224,119,15,225,52,22,5,112,97,116,116,101,114,196,237,198,70,226,+37,15,131,1,232,185,3,67,125,209,48,233,128,2,1,54,48,98,235,229,+26,2,96,140,98,130,232,212,7,224,231,18,1,60,45,192,152,204,244,230,+158,41,224,252,33,131,159,132,6,225,215,5,194,77,161,24,225,141,16,1,+49,51,95,157,1,56,55,67,116,234,220,0,68,96,124,75,0,83,68,112,+83,57,2,67,32,60,179,6,224,18,6,64,210,224,18,6,67,190,228,201,+4,117,55,0,49,97,74,1,85,32,228,229,6,132,130,160,27,0,95,67,+132,193,117,128,0,224,44,4,64,108,224,44,17,224,42,4,169,153,128,42,+0,75,67,78,0,49,200,199,101,69,224,174,1,66,32,237,22,5,224,58,+3,140,157,165,115,194,15,224,116,1,109,22,224,90,0,65,58,221,185,78,+61,1,35,49,108,186,0,80,109,155,66,215,224,25,1,99,48,160,24,0,+54,173,231,226,22,1,104,231,1,55,57,160,108,72,231,64,39,142,15,160,+64,96,128,160,64,141,245,226,104,6,226,119,10,227,113,11,110,182,72,225,+173,116,231,52,6,126,150,64,131,0,56,226,62,2,5,83,79,85,82,67,+69,98,66,229,33,6,0,52,177,3,99,97,235,156,2,224,135,1,229,159,+5,98,183,66,3,224,158,15,209,96,128,37,112,12,96,85,224,118,5,226,+3,0,168,118,227,65,18,0,97,230,103,0,0,48,134,236,200,169,232,77,+22,231,234,2,65,238,224,86,7,5,104,105,100,105,110,103,225,18,11,160,+155,197,139,141,189,0,55,92,148,227,179,9,224,100,22,8,113,117,97,108,+105,102,105,101,100,128,103,65,250,143,121,192,164,236,232,17,1,83,39,113,+150,2,49,55,50,162,200,131,120,0,54,98,161,238,120,30,1,54,49,167,+144,238,101,2,229,198,17,96,6,160,95,231,69,13,224,46,4,100,195,1,+54,50,67,23,64,215,143,222,81,226,81,85,64,17,143,112,209,188,192,7,+66,29,64,29,142,88,0,90,128,21,160,50,64,234,176,150,225,88,1,112,+183,0,83,64,14,93,104,165,234,99,4,149,86,228,181,11,128,31,0,90,+173,54,0,50,117,29,96,0,64,100,131,240,230,98,3,2,55,50,54,228,+114,3,0,85,105,187,0,73,242,65,0,82,68,128,84,243,240,1,114,123,+247,204,0,224,30,0,96,142,253,34,3,122,80,64,8,210,137,224,16,0,+178,211,224,67,1,97,240,192,17,180,83,64,17,100,207,230,209,4,64,30,+0,80,67,106,241,97,1,178,165,243,96,2,192,10,214,42,67,214,240,194,+1,128,85,2,49,53,57,132,106,0,66,231,138,11,137,215,160,41,65,35,+243,248,1,160,158,133,102,148,127,67,197,118,109,147,168,238,178,3,238,147,+3,128,250,231,161,6,96,86,128,255,64,10,147,143,245,164,5,96,0,65,+190,197,149,225,192,5,150,255,98,20,96,95,232,64,3,99,192,232,92,1,+128,112,161,216,118,110,160,51,232,96,2,224,19,0,232,102,11,64,240,97,+2,192,214,224,211,23,1,95,55,150,138,160,193,0,54,241,83,6,237,230,+13,228,222,16,111,5,97,163,64,175,0,55,182,140,232,181,19,117,14,129,+182,97,98,64,41,160,201,132,229,224,78,8,224,126,4,230,133,13,224,77,+0,1,39,66,66,135,226,140,2,73,75,128,83,176,198,83,251,0,95,82,+107,88,99,2,95,56,56,129,32,192,38,65,18,245,57,0,242,10,14,224,+5,8,242,218,4,0,56,138,32,230,190,2,224,167,0,2,64,95,56,69,+114,234,104,11,136,113,160,240,225,190,6,0,95,234,245,21,165,156,96,36,+65,105,1,50,53,64,31,160,51,229,164,1,0,54,87,199,225,214,6,1,+55,50,208,107,0,54,121,71,229,85,4,1,54,53,96,6,229,220,30,98,+152,64,86,230,151,5,229,239,5,224,96,4,4,54,32,95,53,52,64,73,+0,53,160,123,224,105,21,168,98,224,105,23,151,22,225,43,15,1,95,57,+96,113,224,199,16,1,55,48,98,14,224,139,18,173,246,129,169,224,221,18,+0,56,116,227,101,195,224,110,10,0,49,100,192,227,48,1,224,57,9,131,+87,224,57,9,114,29,224,56,0,66,174,183,181,225,62,22,92,34,129,63,+151,98,226,182,5,231,134,13,132,248,195,226,0,49,86,255,226,64,6,0,+54,132,116,226,240,17,1,49,48,113,8,237,90,15,1,49,55,156,66,226,+241,7,2,49,55,50,199,231,232,213,2,1,55,50,128,144,236,141,4,1,+46,46,136,207,226,14,13,0,49,200,19,64,254,1,10,65,153,78,64,14,+200,34,231,242,4,183,150,4,49,55,49,57,32,64,15,136,23,65,244,64,+190,132,58,1,49,55,72,200,0,58,96,35,228,39,2,237,213,8,2,79,+32,35,80,250,100,133,227,87,5,128,35,1,55,49,162,106,96,8,64,79,+168,11,228,113,22,1,55,48,101,165,1,55,49,161,64,163,222,1,55,49,+162,24,0,49,164,74,66,122,64,85,134,162,248,68,4,96,71,224,145,2,+113,96,1,49,55,104,153,225,112,5,132,1,240,34,5,0,111,161,111,247,+211,11,1,54,57,167,207,239,35,29,221,234,1,95,52,167,172,230,186,9,+68,207,131,210,64,204,0,54,193,34,243,11,11,4,81,117,97,108,68,96,+157,238,38,12,98,144,105,78,103,105,0,85,97,75,128,133,234,21,5,64,+7,64,59,233,176,2,254,89,12,193,9,192,71,200,156,206,19,2,95,52,+48,65,26,1,50,53,98,25,192,63,66,23,0,54,255,160,8,64,220,230,+119,5,230,243,22,1,95,56,65,217,236,171,19,0,105,155,124,227,99,0,+224,43,4,226,174,5,149,143,67,47,211,62,241,173,6,1,104,101,186,194,+224,77,59,2,101,108,115,181,232,224,77,1,227,32,4,89,244,224,245,15,+77,119,224,245,28,194,144,66,163,228,49,5,1,45,62,162,193,236,91,14,+65,139,197,84,224,132,12,0,55,74,168,224,132,19,1,108,101,243,66,0,+160,133,179,140,224,184,19,209,151,129,18,64,132,205,158,225,9,13,92,217,+224,80,19,1,99,97,161,102,225,179,13,224,45,6,189,170,192,177,0,55,+125,222,96,133,189,43,229,194,9,107,12,64,18,226,174,6,225,202,2,0,+48,66,241,64,46,100,185,169,206,226,45,5,199,79,226,7,9,1,55,48,+66,7,224,225,29,224,181,4,128,183,197,204,234,187,17,198,196,157,18,64,+136,96,56,133,245,107,249,3,53,52,32,64,255,203,9,255,250,6,75,173,+75,83,237,2,3,128,131,64,192,237,222,7,72,97,229,58,5,170,236,136,+122,133,1,253,11,8,0,95,79,62,1,95,54,184,218,64,90,238,57,10,+68,110,224,90,5,231,179,11,169,244,236,153,7,231,222,18,236,83,0,253,+162,9,197,43,179,20,133,200,0,66,160,169,64,146,97,242,78,190,192,195,+138,159,225,33,0,166,158,230,244,22,224,5,9,226,39,1,106,233,207,253,+224,24,11,147,71,234,227,62,98,168,232,106,12,234,5,11,138,224,234,217,+30,109,151,192,19,234,198,21,1,49,55,229,7,10,234,199,3,72,156,96,+76,252,184,3,1,55,48,245,235,2,224,173,0,224,96,15,228,94,9,224,+96,3,109,168,224,96,8,64,118,225,14,18,130,15,225,111,30,185,89,130,+130,224,84,18,3,54,32,95,56,85,204,0,52,67,18,1,64,95,169,0,+228,54,18,7,112,114,105,109,105,116,105,118,229,29,0,156,101,66,141,0,+54,232,95,19,2,115,116,114,179,165,232,95,6,169,137,136,95,85,210,104,+2,160,82,213,119,2,80,32,35,115,1,0,85,105,150,65,7,138,90,110,+149,97,153,0,67,80,180,0,50,208,185,3,95,52,48,57,234,68,4,96,+54,134,18,67,117,64,79,98,216,149,198,65,174,227,72,2,170,171,225,219,+12,136,150,1,49,53,105,171,233,239,4,0,53,232,164,3,0,52,234,188,+0,226,236,3,64,106,243,76,1,64,132,96,235,160,132,171,48,241,13,4,+142,162,128,152,224,9,22,241,249,12,128,120,241,99,7,65,108,132,116,160,+59,224,13,20,197,175,225,4,0,228,211,0,142,124,209,32,165,209,160,6,+194,132,224,147,14,230,181,0,224,94,11,66,185,75,168,230,236,5,236,185,+11,224,70,9,225,145,0,128,70,99,83,236,244,14,235,48,9,224,213,2,+241,13,9,160,101,224,169,3,1,95,56,118,44,224,227,9,253,34,5,107,+217,226,10,5,224,74,9,1,49,54,233,25,9,224,243,25,224,240,3,64,+66,108,223,224,239,16,224,237,4,192,234,224,226,3,0,58,133,73,195,116,+65,200,99,115,96,88,226,183,1,100,191,98,182,96,180,230,132,8,229,22,+13,1,50,55,99,87,228,245,4,104,71,64,6,205,208,96,218,224,54,5,+69,227,228,147,19,234,49,15,224,125,7,233,44,2,64,184,0,54,224,184,+4,240,241,14,160,157,177,100,64,41,225,236,9,239,142,4,231,34,5,139,+141,244,184,11,190,196,64,136,243,51,11,224,68,1,250,145,9,228,155,15,+0,53,83,9,225,95,7,80,128,226,17,7,188,132,96,132,222,249,225,178,+13,0,51,129,52,253,35,30,255,1,6,176,251,224,123,22,65,1,251,70,+1,228,167,0,97,32,0,49,233,147,7,0,54,191,254,96,180,227,191,9,+140,226,128,83,133,237,99,34,229,31,13,224,186,4,3,119,104,101,114,237,+88,0,66,70,236,223,12,64,87,134,43,229,119,4,100,233,96,157,64,125,+245,177,5,0,39,67,93,0,80,64,14,64,64,99,102,70,171,224,137,1,+227,207,1,64,93,198,30,235,122,17,228,108,45,224,114,13,64,113,203,177,+70,142,64,46,131,239,66,184,231,99,2,227,166,0,0,50,128,29,241,110,+5,255,136,15,190,226,0,53,65,51,96,249,64,58,196,47,3,54,56,53,+32,64,15,0,54,192,15,146,39,0,56,163,56,131,27,0,56,227,27,4,+229,27,8,231,226,3,227,120,5,160,35,0,56,99,110,182,160,64,79,168,+58,231,14,4,139,117,236,84,9,141,114,167,12,0,55,248,83,2,98,120,+248,80,12,153,157,0,50,115,107,145,151,161,52,194,173,236,156,22,96,163,+130,185,0,85,236,25,1,255,46,1,255,240,6,106,169,233,78,5,139,7,+117,59,137,79,160,126,224,39,7,224,38,3,91,95,224,38,0,81,220,183,+217,64,140,201,26,216,1,0,56,81,253,224,74,4,128,229,223,240,2,32,+85,32,224,164,6,70,44,224,48,4,147,108,224,48,0,255,197,1,224,161,+10,224,37,10,225,39,0,206,164,194,132,139,160,236,46,21,164,89,100,38,+224,19,3,96,80,195,10,99,12,97,252,134,227,72,69,160,24,96,26,129,+171,64,12,92,47,157,8,104,177,227,72,0,129,87,96,22,162,239,233,7,+10,160,139,89,193,64,40,0,54,132,88,65,57,92,121,154,76,200,38,66,+161,147,76,0,49,166,140,139,39,98,110,64,31,160,24,171,74,64,79,227,+58,17,229,181,7,2,114,105,118,223,66,225,77,0,127,50,150,240,98,156,+228,81,5,228,225,3,169,248,164,225,230,82,0,229,63,14,0,55,227,129,+9,2,54,53,56,234,210,13,233,34,6,228,253,13,167,125,164,252,0,54,+229,22,7,131,254,72,121,65,66,227,123,3,0,67,159,151,242,184,0,0,+54,70,235,99,120,170,222,227,242,1,230,45,18,245,201,12,0,54,107,23,+230,159,9,149,61,0,80,129,205,70,196,64,154,200,17,222,13,96,25,64,+132,2,95,49,48,137,159,1,95,55,172,87,66,42,241,36,3,96,215,70,+229,64,86,107,134,97,62,130,65,224,2,0,0,83,160,49,128,214,128,1,+64,37,98,52,4,53,48,32,95,52,159,107,224,36,8,64,1,126,230,96,+0,157,106,145,195,1,66,39,125,160,224,5,9,224,114,4,96,15,254,108,+2,98,215,165,61,126,111,254,109,5,128,38,254,110,2,157,150,254,115,2,+203,230,255,107,3,127,178,197,122,160,2,160,125,224,119,3,159,204,128,211,+72,215,111,227,172,185,0,83,65,2,1,52,32,145,106,128,32,1,57,53,+118,196,97,128,113,12,1,95,55,114,227,224,32,0,1,49,50,65,51,159,+31,172,247,254,229,8,134,13,157,162,3,95,54,50,48,129,167,119,40,0,+67,65,73,133,246,66,239,96,8,96,16,0,54,130,246,142,103,2,52,51,+57,79,160,66,33,0,79,186,248,129,254,96,169,252,219,0,64,0,1,95,+52,172,20,96,159,64,83,64,45,87,72,111,223,137,139,224,79,2,225,12,+3,101,49,206,190,226,229,1,18,66,97,100,32,71,65,68,84,32,114,101,+115,117,108,116,32,116,121,112,162,244,224,59,1,0,50,100,38,2,54,57,+32,67,77,1,95,57,101,131,1,51,54,132,217,118,203,0,54,99,186,160,+51,161,155,99,121,160,0,66,196,197,200,0,50,64,131,0,52,99,65,96,+53,131,137,224,160,7,71,244,0,48,227,7,0,194,52,65,100,128,142,128,+126,99,98,224,217,15,202,132,225,158,0,128,57,96,190,96,95,0,49,227,+103,2,2,95,49,51,67,225,128,146,64,174,134,38,101,168,96,179,0,64,+91,9,0,85,130,254,96,140,1,50,54,68,57,198,175,98,166,97,247,195,+35,0,95,64,25,96,123,65,163,71,127,96,108,121,107,225,90,0,64,186,+1,51,55,104,226,208,77,224,76,5,224,70,8,0,75,224,70,3,224,67,+17,224,49,4,0,65,224,120,2,96,0,97,212,149,102,97,215,96,113,223,+40,224,170,0,224,108,0,224,68,1,192,60,0,51,137,128,64,58,65,45,+64,7,229,239,7,69,178,229,95,6,236,36,13,229,92,7,64,83,96,216,+230,61,4,99,202,161,53,233,197,8,237,13,5,66,26,224,108,7,248,210,+2,225,194,1,224,96,4,169,155,192,28,229,213,7,224,26,2,196,121,224,+11,0,192,8,226,240,1,129,21,203,64,71,227,246,57,7,235,249,2,224,+10,13,234,232,2,100,200,193,26,193,12,161,98,96,7,149,216,224,82,24,+224,93,11,101,53,162,107,96,8,192,111,129,131,132,112,64,24,241,39,6,+224,142,11,168,235,0,54,137,119,128,15,65,7,253,97,9,2,54,54,50,+133,19,224,19,0,109,62,0,54,70,17,64,6,64,216,225,131,9,97,95,+64,80,0,54,225,88,18,225,55,1,96,187,194,34,0,54,95,102,224,31,+6,117,140,237,106,11,138,188,226,85,4,224,54,1,77,77,75,29,1,32,+89,129,53,152,250,166,137,128,181,134,44,229,1,3,201,102,237,240,15,226,+194,6,136,231,143,214,233,146,2,239,103,19,80,23,233,192,8,160,207,236,+119,1,66,42,97,58,224,136,16,97,154,97,132,0,53,106,178,64,87,224,+49,31,0,49,128,49,219,150,138,101,242,187,0,133,45,160,148,0,51,129,+142,234,62,4,102,191,64,64,245,170,6,71,182,234,173,0,98,93,64,36,+198,80,172,180,125,237,1,49,54,90,156,64,29,181,104,160,66,225,93,4,+234,252,3,162,28,209,32,227,22,1,234,240,9,103,243,77,29,97,104,234,+247,12,67,9,224,117,2,225,49,17,0,51,131,177,192,125,179,23,227,170,+22,130,97,66,83,227,143,9,192,69,161,8,224,15,0,64,148,239,199,5,+224,226,5,232,250,8,241,210,2,97,32,228,145,13,128,55,192,42,244,206,+18,162,161,64,142,135,41,64,144,240,29,0,0,53,112,29,64,25,228,31,+7,68,91,229,161,7,65,119,132,20,239,96,8,251,95,6,92,152,64,184,+135,157,155,92,64,104,194,252,176,134,80,86,64,88,144,54,64,95,160,150,+0,50,96,150,162,198,224,131,4,242,172,8,193,194,105,110,224,157,14,252,+155,7,98,75,226,157,3,224,5,8,225,106,1,251,188,101,96,163,228,68,+12,250,88,14,155,191,96,8,140,197,227,53,3,96,60,251,217,28,97,26,+192,19,139,130,65,38,131,226,7,83,32,85,32,95,50,48,50,226,86,2,+4,101,84,117,112,108,237,156,0,0,67,104,183,65,2,70,137,0,90,80,+234,0,53,96,10,128,69,242,252,2,144,104,64,21,64,31,129,130,250,201,+11,6,108,105,116,101,114,97,108,64,96,240,234,13,224,18,5,65,41,240,+215,4,133,139,65,36,234,223,0,110,2,64,36,0,95,91,140,96,173,203,+216,224,34,18,200,123,0,83,173,11,160,112,65,243,224,53,15,1,56,51,+160,52,224,145,4,129,104,224,145,20,0,57,65,41,160,0,65,33,240,235,+3,225,55,1,131,188,96,21,65,9,160,21,0,54,226,208,10,187,98,229,+255,1,91,176,233,146,8,64,39,164,121,224,41,15,0,61,224,41,1,65,+88,64,111,247,78,5,228,115,5,224,46,1,180,155,101,2,212,155,64,66,+224,58,16,224,147,1,244,214,0,203,83,64,58,230,216,5,1,54,48,157,+204,242,140,28,100,138,224,19,3,96,80,175,217,110,185,233,11,2,96,234,+101,241,229,20,5,79,71,229,107,28,242,188,1,228,142,10,2,83,32,95,+113,121,69,37,227,37,0,67,223,97,215,108,240,229,245,0,227,239,3,144,+78,141,222,66,89,66,142,172,57,253,239,7,128,236,244,160,2,208,124,101,+139,172,95,2,95,49,48,148,130,169,52,69,74,64,11,224,126,14,137,76,+64,170,231,219,17,225,127,5,128,30,241,212,4,4,102,111,114,97,108,99,+215,225,228,2,126,108,199,71,191,85,199,147,214,129,239,149,0,231,249,13,+70,175,226,26,3,163,191,136,178,99,144,64,36,199,137,232,178,3,65,158,+138,168,104,187,96,39,251,110,0,228,155,11,4,76,73,100,101,110,121,127,+225,117,6,133,200,163,226,225,166,1,177,143,0,83,129,177,145,148,97,110,+96,126,0,50,105,188,66,39,64,132,0,67,64,7,98,48,133,144,80,207,+129,22,96,86,161,168,100,56,144,189,3,64,64,64,75,79,203,128,30,129,+159,64,251,225,11,4,233,190,3,104,157,64,36,227,193,6,74,15,65,124,+0,57,100,79,64,50,225,1,17,0,85,225,1,48,3,39,32,95,53,103,+20,96,246,224,213,37,131,252,111,50,78,254,154,116,226,123,1,102,252,75,+228,226,67,0,99,235,163,97,163,189,224,19,4,64,84,228,0,0,129,8,+231,191,5,128,145,226,111,4,96,145,64,56,167,26,250,161,3,0,55,244,+202,3,236,200,1,64,152,228,90,1,224,39,13,138,254,238,240,6,224,42,+11,107,125,224,81,8,233,15,4,249,42,2,147,27,224,68,1,0,64,65,+169,148,190,109,44,225,184,0,187,234,0,85,81,102,129,183,65,77,84,35,+0,49,66,10,0,35,98,164,224,131,0,243,125,0,66,160,105,126,0,50,+161,101,239,178,7,65,41,199,254,147,182,0,85,96,46,172,104,64,54,1,+10,65,144,220,64,14,198,241,65,216,0,55,175,27,96,12,64,94,128,13,+0,79,96,241,2,80,32,95,65,116,155,235,64,112,65,104,64,65,255,40,+11,224,5,9,225,227,2,102,96,247,185,19,3,109,111,100,117,168,234,67,+68,97,127,235,150,13,145,190,64,36,121,36,0,54,180,177,138,33,234,6,+32,138,69,233,243,6,236,5,13,96,97,224,96,0,229,23,9,64,57,224,+46,3,111,111,170,202,224,26,11,225,5,18,6,112,97,116,116,101,114,110,+229,184,0,130,2,224,152,21,224,78,18,0,116,212,229,224,142,1,224,190,+10,65,208,0,54,228,166,5,0,50,161,90,100,203,120,123,64,36,228,203,+6,124,25,1,49,54,67,125,64,29,228,203,20,136,113,228,199,19,138,105,+87,108,68,167,0,83,163,23,101,161,244,247,12,242,234,1,128,47,195,73,+224,49,7,232,222,5,229,12,0,96,53,229,15,0,97,57,131,92,224,23,+15,129,2,201,26,166,218,105,26,230,218,10,65,26,230,218,18,0,81,229,+217,28,192,215,230,206,56,224,211,22,133,99,0,79,226,55,2,2,99,97,+115,98,55,224,19,4,3,108,97,115,115,224,20,7,3,100,97,116,97,224,+19,8,4,101,102,97,117,108,96,221,224,22,5,251,154,1,224,23,4,0,+111,224,17,7,1,101,108,224,125,9,232,208,1,224,21,6,2,101,105,103,+99,46,224,22,3,1,105,102,224,17,8,3,109,112,111,114,224,146,8,0,+105,224,57,9,3,110,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,1,108,101,224,125,8,228,241,1,+224,21,3,3,110,101,119,116,163,181,224,22,3,0,111,224,210,8,228,42,+2,224,22,4,6,114,105,109,105,116,105,118,224,65,8,2,116,104,101,224,+44,8,224,105,11,252,15,0,181,1,224,0,11,66,53,134,111,78,133,0,+90,155,88,0,58,132,222,228,33,2,243,18,2,196,255,235,200,3,1,46,+46,64,102,229,34,6,66,162,136,96,228,103,0,147,78,233,88,3,229,185,+0,143,187,64,121,241,253,0,227,112,11,5,83,121,109,79,112,101,97,172,+238,231,8,67,50,227,131,4,131,67,227,131,0,64,23,231,163,3,115,209,+233,82,1,128,177,1,67,32,137,81,0,79,147,241,225,58,1,234,185,50,+99,218,105,135,0,48,227,242,1,227,243,17,0,48,140,122,233,236,33,97,+54,235,130,20,228,166,36,64,185,224,169,2,228,123,29,65,218,238,25,1,+137,226,97,254,72,45,236,129,12,64,238,138,17,118,133,237,68,14,182,154,+237,113,4,0,67,238,85,4,160,127,134,180,64,36,226,172,1,96,132,70,+128,1,53,56,96,92,105,228,187,21,225,6,10,141,243,233,213,4,225,213,+0,230,148,4,193,129,254,161,2,64,130,239,109,7,167,218,130,237,192,245,+198,79,230,119,3,246,5,0,64,37,64,29,0,54,226,170,5,1,64,35,+80,16,2,64,95,56,64,192,64,38,238,80,0,225,236,12,227,36,49,143,+28,231,180,1,227,40,2,129,10,224,23,4,123,175,227,65,19,254,27,2,+227,97,52,231,63,11,227,84,53,226,204,18,65,96,65,149,231,73,6,144,+172,224,17,3,1,60,45,224,17,7,133,7,224,17,3,136,219,0,79,143,+181,77,70,64,238,128,14,232,202,0,193,1,64,119,132,252,127,40,137,148,+136,37,110,3,64,31,131,229,115,3,236,208,1,147,105,236,182,3,161,24,+117,33,250,108,2,236,112,7,64,81,0,54,128,113,195,248,1,49,56,128,+69,176,217,65,67,140,91,195,129,1,54,57,64,5,97,53,131,34,130,94,+64,51,100,162,2,49,53,56,140,39,0,56,65,144,225,11,3,4,101,109,+112,116,121,230,143,2,96,80,224,96,2,191,53,0,83,96,61,92,139,251,+235,3,87,42,224,21,0,64,38,192,24,160,147,99,191,178,138,1,53,55,+134,77,129,6,1,49,57,163,135,173,179,64,17,138,239,96,17,65,3,228,+137,0,108,142,2,49,56,52,143,45,65,43,96,15,64,6,100,75,64,44,+132,104,239,77,8,236,162,15,224,12,0,164,0,0,48,207,150,0,90,128,+190,0,90,161,90,64,7,220,47,68,242,167,146,96,24,199,149,77,39,237,+173,3,128,217,208,131,68,111,64,29,238,220,4,0,54,99,206,229,146,0,+224,9,1,96,192,229,102,0,67,48,96,49,79,13,0,56,247,75,3,237,+132,27,240,62,2,247,132,12,96,107,229,150,0,1,64,85,226,20,2,1,+40,41,104,58,224,91,19,237,216,2,224,72,18,1,91,93,224,72,15,183,+179,128,11,151,171,199,73,0,58,129,60,208,152,230,129,19,166,124,64,49,+131,164,241,3,3,96,19,230,230,12,96,52,225,149,8,227,146,1,67,2,+227,146,2,102,191,64,76,251,42,2,64,68,0,54,162,52,227,47,3,67,+246,96,78,0,56,121,228,0,90,239,255,17,157,216,239,250,3,128,85,130,+247,162,138,192,4,162,108,100,158,231,209,10,0,53,99,60,224,234,13,130,+218,231,209,30,224,88,5,102,115,231,213,4,64,106,105,161,238,232,12,96,+134,231,240,14,96,85,231,241,4,193,54,129,200,2,52,57,54,70,131,0,+55,85,213,70,104,102,108,64,38,232,24,9,134,61,232,24,4,231,151,3,+96,0,64,140,227,152,0,243,254,12,233,126,39,243,242,10,233,125,20,100,+8,166,23,1,66,39,167,95,165,95,0,53,97,82,239,67,2,246,25,1,+153,75,101,54,226,110,5,64,90,97,91,229,162,8,65,92,65,220,64,5,+226,124,1,193,204,192,2,0,66,224,177,0,128,237,224,190,2,230,63,3,+197,201,230,67,22,224,156,3,226,226,39,69,186,234,22,83,234,20,4,234,+19,9,81,196,194,24,0,52,92,21,1,49,53,115,16,0,80,96,17,0,+53,64,80,248,137,7,97,0,0,55,64,247,1,85,32,158,8,128,72,0,+54,96,72,0,75,66,179,64,14,131,186,1,80,32,64,11,202,250,225,173,+12,129,34,113,144,160,78,128,40,198,115,225,188,5,97,185,192,30,97,184,+225,198,77,133,201,97,196,224,22,0,225,184,1,194,86,64,220,132,83,129,+118,160,23,1,90,32,224,74,1,64,34,132,9,89,183,96,14,218,24,81,+206,105,13,64,88,103,34,96,143,96,42,117,63,96,21,161,57,225,55,4,+118,6,225,50,1,193,25,193,19,128,7,97,255,224,27,0,168,156,129,42,+232,146,1,232,138,0,186,66,192,39,96,125,174,233,66,53,98,152,229,222,+8,226,233,12,0,80,225,45,6,1,95,49,128,64,138,9,234,24,4,128,+39,97,169,133,133,0,50,128,27,64,11,64,128,194,156,192,20,225,8,8,+225,217,0,192,182,130,12,161,229,64,152,0,89,125,89,64,104,64,39,66,+62,194,88,64,7,0,89,233,196,4,67,161,129,30,134,1,128,0,162,80,+0,55,204,153,223,145,1,57,53,129,167,192,37,96,17,195,166,192,143,96,+0,73,162,128,195,97,237,231,79,3,64,229,0,54,128,229,80,211,161,144,+64,21,169,243,134,170,228,213,2,227,32,22,227,20,0,229,8,3,96,24,+72,84,0,55,64,102,224,51,7,64,15,224,45,2,128,21,67,14,224,47,+9,234,235,3,163,67,138,212,96,0,64,182,254,12,1,128,241,97,42,67,+135,128,5,64,34,131,49,2,35,49,48,192,0,68,36,64,40,162,234,64,+144,0,80,128,42,166,182,0,51,227,2,14,225,248,6,194,139,97,215,64,+16,129,248,163,15,129,58,224,225,1,239,185,1,157,8,128,0,0,95,129,+132,69,4,64,128,131,143,100,198,64,90,99,155,0,73,96,155,64,117,96,+14,64,11,130,168,3,85,32,75,52,96,113,64,18,129,213,225,101,5,224,+13,5,64,174,112,125,96,135,160,85,200,242,224,39,1,99,201,65,145,96,+20,104,30,67,179,64,61,65,129,161,23,0,52,117,137,64,20,132,162,174,+144,160,53,76,55,0,52,83,51,227,231,0,227,75,1,128,57,161,64,0,+51,97,98,247,3,9,8,65,109,98,105,103,117,111,117,115,159,18,160,46,+0,54,106,186,194,250,0,95,187,30,130,9,64,218,164,245,233,112,2,107,+238,1,95,52,92,172,170,72,224,121,23,4,58,92,49,48,38,224,116,3,+224,41,16,11,32,32,102,111,117,110,100,58,32,32,32,32,160,48,132,31,+224,119,0,104,177,97,250,158,78,138,231,105,117,238,8,3,2,69,79,70,+238,6,4,224,114,7,80,57,0,48,198,42,224,145,21,8,101,120,112,101,+99,116,101,100,58,160,145,64,252,81,43,4,95,49,51,53,55,241,173,1,+225,53,1,131,28,241,22,8,67,100,224,18,6,101,117,224,18,5,120,20,+98,47,224,19,2,65,162,65,133,224,150,1,3,84,82,97,119,161,32,224,+24,5,160,248,192,24,224,218,19,2,123,45,35,160,210,81,115,65,78,224,+246,2,2,35,45,125,192,71,224,163,8,102,58,224,162,5,66,5,224,161,+6,1,73,110,202,145,224,164,8,3,84,66,114,97,150,246,128,27,165,130,+225,29,6,66,137,224,121,6,67,53,224,121,6,65,125,64,93,67,41,242,+209,6,125,152,224,23,11,66,45,231,223,1,224,151,1,6,125,32,108,97,+121,111,117,160,180,225,41,2,224,23,4,128,111,99,42,0,95,73,52,2,+95,54,52,230,39,0,224,25,1,224,20,1,225,225,7,224,195,9,137,138,+192,57,1,49,53,163,131,224,18,2,159,40,195,155,161,218,235,123,44,96,+0,66,166,229,173,1,133,149,0,52,68,0,232,19,2,112,186,229,180,2,+82,24,131,43,0,53,65,88,115,169,76,225,128,209,96,4,100,189,169,85,+68,217,96,95,0,89,105,180,135,3,167,92,136,102,64,83,251,106,0,234,+70,0,234,3,2,161,54,244,39,4,167,213,224,46,30,99,77,96,32,160,+42,224,39,15,129,89,160,85,224,39,17,141,15,224,206,4,161,200,172,171,+244,185,3,197,197,101,195,160,130,159,225,224,39,3,0,52,132,62,97,87,+68,74,64,29,0,53,64,183,98,21,192,236,224,111,25,224,71,0,192,110,+96,204,224,110,15,128,230,224,77,5,102,100,1,95,49,87,102,82,20,188,+167,0,53,66,80,227,165,3,96,52,64,163,202,13,130,33,97,250,65,110,+6,66,32,95,55,53,32,95,143,135,89,154,128,9,2,56,51,32,160,209,+64,32,0,54,80,4,226,144,0,3,95,52,53,51,227,164,7,160,168,160,+255,144,136,225,150,5,0,53,153,222,128,15,225,180,2,103,98,110,223,225,+58,31,131,169,193,58,226,5,12,96,243,224,158,1,1,95,52,82,133,1,+35,49,189,60,224,50,35,101,205,226,15,5,224,41,13,135,90,64,232,93,+117,128,8,171,142,0,53,159,160,224,223,1,151,82,160,251,0,49,96,251,+108,92,224,245,19,129,215,64,23,193,90,170,141,64,8,128,206,130,140,239,+150,4,169,116,64,25,80,228,192,71,228,23,2,194,191,170,117,161,162,224,+138,19,72,75,231,234,0,242,39,2,128,210,226,194,1,1,53,50,226,83,+9,192,101,128,176,3,95,49,50,50,72,17,64,86,230,244,12,4,108,105,+110,101,32,230,245,0,162,119,1,51,51,111,86,98,119,132,50,173,125,224,+211,0,76,141,100,236,165,14,0,50,85,99,192,12,0,54,98,171,3,67,+32,95,56,84,80,160,145,129,211,0,52,128,170,129,30,67,37,224,37,0,+96,102,128,43,197,59,111,114,225,51,32,228,94,29,165,48,225,188,7,97,+165,0,50,242,238,1,1,79,32,249,41,2,225,203,10,228,139,3,128,153,+130,233,96,9,162,59,204,203,236,184,0,195,19,133,169,137,102,122,139,1,+53,50,139,239,228,98,6,160,92,205,225,245,21,0,98,103,96,78,129,14,+224,227,6,1,64,35,83,168,64,86,0,51,161,187,226,138,26,196,69,128,+123,224,21,7,2,49,53,51,64,50,250,171,0,230,9,9,96,120,131,247,+164,96,224,29,4,102,40,128,247,114,58,229,38,4,96,214,233,153,19,17,+85,110,114,101,99,111,103,110,105,122,101,100,32,105,110,112,117,116,202,124,+232,33,5,97,174,195,169,140,44,64,79,0,48,103,113,178,67,65,160,175,+99,108,68,99,22,64,220,204,70,97,37,64,146,224,127,1,19,73,108,108,+101,103,97,108,32,67,104,97,114,32,108,105,116,101,114,97,108,168,251,128,+218,225,89,6,162,68,96,102,237,149,0,161,132,96,98,224,162,11,64,6,+64,39,129,74,224,81,38,225,120,1,226,39,10,225,254,16,97,5,131,245,+226,116,0,166,92,239,151,4,246,63,1,96,126,227,44,7,254,49,7,138,+103,231,9,36,163,241,155,73,224,0,1,3,95,49,53,53,165,11,129,40,+76,104,82,32,192,121,224,194,4,1,49,53,66,54,224,195,8,224,181,3,+0,53,224,181,9,224,180,69,224,75,0,64,63,225,103,3,64,124,143,201,+224,32,2,164,70,225,162,17,74,56,143,176,68,90,99,147,241,234,1,88,+54,231,54,4,148,207,199,189,0,85,234,226,1,114,60,64,237,96,105,90,+211,206,170,65,76,0,58,128,154,244,208,0,225,79,8,196,229,228,235,0,+194,24,195,80,224,16,2,233,102,14,225,35,0,224,39,2,0,83,184,249,+224,20,1,64,1,178,0,224,115,4,129,205,146,7,224,123,2,211,42,232,+230,7,201,205,228,167,0,0,52,127,54,230,17,2,130,237,0,85,226,246,+1,118,40,192,238,64,0,192,44,96,171,193,104,162,129,226,39,53,65,25,+179,141,224,201,1,167,214,65,119,192,228,133,46,230,3,1,227,254,2,98,+199,130,86,0,52,101,228,224,83,2,227,179,0,164,28,160,52,224,174,6,+192,194,192,179,224,191,32,227,163,6,224,166,2,228,48,14,196,43,128,168,+160,181,227,111,17,224,95,0,66,149,216,74,232,248,0,134,237,193,21,231,+199,2,127,187,0,67,64,7,72,141,112,131,240,255,3,1,108,101,110,172,+224,18,3,3,119,104,101,114,111,115,224,20,3,1,100,111,224,17,7,1,+111,102,241,56,2,224,177,0,103,184,194,226,128,110,224,50,1,0,105,96,+50,152,114,88,155,248,113,8,64,46,184,182,143,170,227,44,5,1,49,50,+147,13,96,32,140,128,224,0,0,225,232,1,99,167,230,8,0,0,50,186,+154,161,109,65,60,147,193,67,250,97,28,65,96,0,55,158,142,128,15,99,+43,224,30,3,164,128,232,72,2,135,183,96,77,0,54,192,77,129,134,205,+45,104,200,74,12,132,48,193,226,228,45,5,130,20,112,206,160,108,0,52,+64,95,224,14,0,200,249,235,247,7,114,220,164,59,224,27,0,129,109,3,+95,52,56,55,141,64,225,119,1,1,46,46,241,162,1,227,87,0,224,153,+3,170,166,227,220,4,105,136,149,161,236,181,3,240,164,0,65,114,128,78,+68,171,129,254,246,35,3,130,226,147,124,1,48,50,144,111,224,25,1,202,+175,175,150,64,18,173,82,233,216,9,163,44,0,49,158,222,120,55,99,125,+167,226,227,55,31,224,171,18,66,144,67,214,64,132,68,240,99,248,227,67,+0,239,78,29,237,29,8,224,230,0,234,218,1,97,91,234,230,7,237,254,+14,70,140,98,182,164,132,125,109,0,83,105,154,161,25,160,35,192,13,96,+137,207,44,248,174,1,226,129,5,224,214,10,128,139,224,214,7,246,90,1,+224,214,119,64,137,224,214,26,160,151,131,132,239,46,0,224,145,39,161,251,+224,152,19,160,139,224,138,18,226,198,20,64,207,70,168,108,23,226,187,30,+68,103,152,45,137,238,227,238,0,236,21,2,96,148,162,190,0,57,229,167,+2,21,92,51,52,38,115,114,99,47,77,105,99,114,111,72,115,47,76,101,+120,46,104,115,64,21,6,44,51,57,52,58,49,52,174,228,227,227,0,225,+211,9,224,11,2,205,174,67,11,229,19,6,131,9,137,123,206,240,143,46,+0,48,82,47,1,54,52,70,236,0,54,164,104,128,40,133,171,225,62,3,+225,197,0,133,34,224,107,0,194,132,225,220,1,233,69,11,128,59,225,143,+5,96,81,65,140,229,159,5,224,84,1,226,47,4,226,32,17,0,64,138,+19,161,199,72,18,224,217,13,112,1,128,67,224,29,10,130,2,97,179,64,+23,228,208,11,96,34,3,53,49,32,67,115,101,2,53,53,51,224,69,8,+1,95,49,95,130,0,64,155,175,136,148,224,109,12,224,86,7,193,146,132,+222,232,176,4,225,25,60,224,220,26,240,25,8,171,39,234,206,0,245,167,+21,164,150,226,10,19,177,26,131,109,0,51,151,15,225,67,10,224,35,0,+225,171,17,224,33,28,129,173,0,48,161,173,225,133,12,96,13,192,14,225,+174,31,225,59,13,0,95,93,59,68,13,155,113,108,251,65,154,0,51,86,+152,128,85,99,83,132,122,131,76,239,4,4,65,219,241,116,1,133,26,69,+27,132,232,132,211,245,112,0,128,251,109,49,64,23,64,44,77,153,245,144,+2,224,33,25,64,20,0,85,195,206,234,160,5,98,112,94,120,197,75,130,+101,191,89,224,79,11,129,14,163,215,96,186,97,237,224,209,2,192,19,92,+177,105,64,224,152,15,224,32,24,224,185,2,97,60,128,100,65,236,174,46,+224,168,19,160,17,224,33,20,97,199,0,51,171,200,225,134,17,64,37,153,+130,227,56,1,231,194,2,225,71,0,0,50,94,165,64,51,134,150,225,75,+20,160,130,225,78,3,192,83,109,16,1,49,53,86,234,1,85,32,254,65,+0,226,65,1,130,237,160,118,231,30,1,0,51,84,21,224,48,1,224,100,+1,224,145,1,225,114,19,225,116,4,224,98,50,65,44,154,79,230,207,1,+225,44,11,130,116,225,43,48,218,172,224,100,1,225,62,3,224,104,3,68,+153,96,86,64,70,224,241,11,224,123,40,64,91,236,66,2,224,119,5,129,+187,0,57,224,98,5,225,0,0,200,146,99,179,225,221,7,167,229,196,61,+142,81,224,43,8,101,232,224,221,1,68,184,224,106,1,224,203,33,175,145,+224,122,116,224,50,0,224,98,0,239,213,3,109,20,0,50,233,71,2,24,+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,95,248,1,111,110,222,194,66,129,242,152,0,96,220,226,+6,8,128,152,192,203,2,95,49,48,234,155,0,224,191,2,160,36,224,179,+4,224,36,21,98,31,0,58,129,254,1,10,65,64,107,0,50,96,110,64,+18,144,47,66,27,3,53,32,95,54,87,235,64,11,0,54,102,75,67,11,+106,89,165,59,225,5,1,64,28,0,54,96,28,1,80,32,64,11,138,130,+96,122,64,14,134,131,70,98,1,80,32,127,113,1,64,80,128,24,196,212,+96,24,97,78,160,24,254,74,1,0,80,160,212,160,24,222,3,64,1,0,+89,161,27,226,179,5,224,10,0,168,28,86,161,234,158,0,232,53,1,64,+22,135,250,118,170,100,55,247,60,16,7,109,97,116,99,104,101,100,32,217,+230,254,251,1,245,70,0,237,34,0,227,117,0,179,108,128,133,232,166,14,+120,103,224,62,10,128,59,202,145,99,179,167,14,233,93,3,192,216,231,177,+0,99,22,245,2,7,242,217,9,96,93,135,243,183,194,96,56,210,96,245,+67,8,131,105,228,77,4,224,214,0,185,176,224,34,5,193,110,97,134,225,+3,4,248,215,8,149,107,224,36,5,129,167,84,100,0,56,160,230,128,29,+1,67,39,129,243,224,41,1,96,14,225,60,1,176,42,192,163,224,82,3,+192,18,162,10,224,167,4,224,165,11,225,171,9,186,248,224,67,52,233,160,+1,224,41,0,224,60,1,224,57,21,234,106,2,225,242,0,192,127,225,145,+5,224,60,9,178,218,193,254,160,64,235,15,5,226,138,0,107,196,226,4,+10,130,35,247,148,2,224,16,0,128,57,226,124,12,161,184,99,153,0,80,+160,30,66,140,227,93,1,13,66,97,100,32,115,116,114,105,110,103,32,103,+97,112,242,127,1,224,80,8,226,194,6,90,179,128,215,227,3,6,155,211,+96,152,226,206,0,194,255,132,170,197,118,0,85,107,140,1,35,56,114,47,+245,177,5,235,91,0,96,198,129,99,225,151,13,160,100,224,33,17,0,57,+126,237,224,32,19,99,3,224,99,19,214,11,224,133,18,99,40,224,33,20,+212,4,224,33,17,224,135,24,84,98,224,67,22,97,47,67,229,174,32,242,+48,8,0,57,128,169,235,229,1,103,201,64,8,189,204,1,53,56,97,219,+4,54,32,64,35,54,64,43,100,7,192,18,2,64,35,57,211,71,143,166,+0,80,101,187,0,50,65,67,134,245,223,32,89,159,64,121,2,52,57,32,+128,71,101,59,225,228,4,227,208,1,96,78,167,133,66,161,240,86,2,235,+71,5,132,90,130,129,100,81,163,254,162,130,226,238,1,224,23,0,1,95,+57,247,80,1,64,22,98,165,221,194,0,79,66,224,230,77,0,64,227,226,+44,2,66,156,224,179,8,228,6,0,224,97,0,201,17,160,16,224,111,4,+224,99,8,224,98,27,225,22,1,128,86,224,35,11,230,25,0,96,81,0,+56,142,122,67,53,202,125,160,22,0,56,132,9,227,79,1,96,43,65,219,+224,21,1,99,132,66,56,224,100,16,96,33,97,205,224,32,19,142,218,224,+33,20,0,50,224,33,23,228,10,10,224,32,5,124,254,224,99,20,249,255,+16,100,124,66,226,104,193,0,89,193,176,131,70,231,85,5,252,20,8,229,+226,8,245,140,2,0,53,120,237,96,128,226,140,10,96,61,230,99,0,236,+5,1,168,87,167,44,161,233,76,239,146,45,128,0,230,44,1,160,70,229,+149,1,250,247,0,192,221,64,33,224,21,1,96,76,0,49,192,12,64,0,+69,76,166,136,227,36,2,66,91,99,189,161,30,138,128,0,79,146,210,233,+139,9,2,78,85,76,102,34,98,58,224,37,16,2,83,79,72,128,37,64,+154,224,37,17,1,84,88,128,37,66,240,224,37,16,0,69,192,37,67,121,+224,37,17,1,79,84,128,37,65,138,224,37,17,1,78,81,128,37,155,93,+224,37,14,2,65,67,75,128,37,68,239,224,37,16,1,66,69,161,9,67,+206,224,37,17,0,83,128,36,65,96,224,36,16,0,72,160,187,65,157,224,+36,16,1,76,70,161,82,225,121,20,0,86,160,74,102,7,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,1,68,67,151,128,0,35,103,132,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,0,+50,225,131,20,0,71,192,37,225,130,20,0,82,160,37,109,38,224,37,16,+0,85,192,37,225,128,21,0,80,160,37,225,127,20,0,68,195,228,0,49,+96,229,209,168,224,0,19,69,68,143,168,2,95,52,56,169,116,71,119,102,+250,0,53,83,26,1,95,49,75,1,64,12,160,26,79,203,1,53,57,64,+124,105,98,1,95,54,86,79,128,11,64,77,0,54,96,77,1,62,61,79,+218,64,43,64,12,96,11,143,215,0,60,96,11,143,202,3,105,99,109,112,+96,14,143,192,250,132,1,137,251,64,119,105,250,224,20,4,65,39,224,20,+7,0,57,224,20,12,66,132,224,20,7,0,49,98,154,224,21,9,66,99,+224,106,8,138,79,224,20,5,0,53,65,243,0,67,108,81,224,106,2,97,+8,0,49,110,158,0,95,171,59,224,7,53,65,21,144,189,79,50,1,73,+32,114,166,71,193,183,120,211,156,173,154,3,67,32,61,61,233,77,1,135,+198,187,9,157,95,238,122,5,200,37,103,162,234,102,0,199,213,96,216,252,+7,7,226,101,1,3,99,97,115,101,98,102,192,58,141,48,72,89,135,176,+244,0,0,130,16,242,182,0,139,34,64,101,104,110,136,201,207,126,232,170,+0,76,6,3,67,32,60,32,134,133,168,85,136,79,224,234,3,224,28,0,+128,232,96,229,211,225,137,15,192,250,224,34,1,96,110,224,68,3,204,28,+224,67,5,225,5,2,226,52,3,192,0,108,123,210,5,1,53,48,125,87,+0,52,104,147,154,174,96,81,224,106,91,0,58,129,113,227,57,10,0,54,+227,15,11,0,49,101,110,227,37,8,68,81,224,63,8,224,41,11,67,180,+226,249,8,0,49,101,118,226,250,44,64,190,137,191,129,251,0,80,207,71,+130,35,115,196,96,36,164,159,83,111,203,40,98,109,250,199,5,64,41,0,+54,160,78,253,172,1,138,236,130,86,211,241,255,56,5,71,110,224,77,4,+96,162,192,41,255,67,16,77,59,234,190,0,124,243,205,9,64,136,132,247,+65,190,0,50,71,50,238,36,0,128,14,238,189,1,69,91,143,242,65,86,+68,240,207,190,224,35,6,0,54,132,160,160,35,171,38,64,105,213,45,224,+242,2,192,63,224,242,32,227,75,2,224,241,48,133,209,224,181,6,86,32,+224,181,1,0,53,64,195,64,43,213,175,160,179,225,23,0,226,90,4,0,+64,224,61,1,224,19,3,172,19,224,222,35,160,165,224,222,52,249,253,0,+1,95,54,64,94,236,231,3,96,53,118,252,96,173,76,198,160,13,67,182,+1,53,56,71,86,159,88,204,210,242,52,1,64,90,229,31,2,225,61,20,+111,136,224,38,10,226,62,13,144,161,226,66,23,248,140,6,7,100,105,103,+105,116,84,111,73,184,116,97,19,241,35,9,192,16,177,45,64,86,244,170,+0,224,49,27,96,176,224,49,22,64,39,96,255,65,34,65,53,247,224,1,+101,32,151,224,65,138,227,103,5,0,52,65,210,226,51,6,114,3,64,45,+132,72,111,76,64,75,83,210,211,179,230,101,1,207,104,64,182,228,230,1,+160,172,194,63,96,78,0,54,192,124,230,116,4,194,26,229,39,5,158,81,+98,2,178,209,64,10,0,51,144,217,96,77,164,50,175,227,143,98,210,66,+231,148,25,4,83,79,85,82,67,140,142,160,204,195,20,68,123,131,224,130,+240,3,95,49,57,53,102,77,98,138,160,19,1,54,50,68,58,0,52,106,+54,1,64,95,92,236,247,77,1,64,205,224,174,5,96,89,160,210,64,186,+249,177,1,87,97,219,75,240,118,1,225,76,0,94,113,245,59,13,232,212,+4,85,250,114,245,96,118,246,0,5,15,85,110,99,108,111,115,101,100,32,+123,45,32,99,111,109,109,219,32,136,114,228,22,5,243,124,0,244,92,14,+231,108,0,129,248,232,135,0,225,194,13,90,167,193,15,132,103,0,51,160,+161,246,112,1,240,233,11,224,149,39,192,103,224,148,28,138,185,224,149,25,+227,97,1,224,150,7,234,19,5,169,128,226,251,11,224,46,30,241,180,6,+224,233,2,224,84,4,129,121,224,177,10,192,158,224,26,0,64,6,195,163,+224,18,2,165,156,227,147,1,66,137,134,133,0,85,137,249,129,18,3,83,+32,95,50,109,130,128,185,3,95,52,48,55,192,101,225,173,10,64,68,134,+158,0,85,225,113,0,128,50,67,81,242,162,0,131,94,67,51,101,217,224,+72,4,100,221,67,113,135,87,64,81,166,61,150,21,230,59,3,224,156,0,+160,100,224,74,5,128,60,230,31,16,229,248,5,152,56,105,90,3,95,49,+55,57,229,213,2,19,92,51,52,38,108,105,98,47,68,97,116,97,47,67,+104,97,114,46,104,115,64,19,4,44,49,48,53,58,144,155,132,8,215,22,+224,128,0,229,155,17,192,109,230,1,0,96,171,68,83,229,168,1,98,9,+133,168,68,129,222,187,235,162,18,130,78,192,25,236,12,4,203,63,235,88,+59,224,69,10,129,110,224,69,7,132,202,162,203,141,44,224,91,5,229,144,+17,4,109,111,100,117,108,237,39,1,237,19,2,162,200,235,214,12,135,224,+237,238,0,141,41,166,152,236,254,10,96,173,160,88,65,101,198,224,150,121,+1,64,85,129,123,0,54,230,246,1,161,96,163,195,224,13,0,190,245,110,+5,1,85,32,232,20,6,6,108,97,121,111,117,116,76,144,167,97,0,225,+163,9,109,208,246,157,1,224,34,0,228,40,0,225,207,8,170,115,228,86,+1,197,30,249,54,0,224,58,1,224,56,4,196,142,160,29,229,22,1,161,+25,224,31,6,111,5,206,253,216,252,192,7,64,247,199,21,0,52,104,38,+232,17,2,130,5,200,23,188,142,0,52,79,234,1,35,54,233,222,0,224,+58,2,192,0,224,151,14,192,240,224,150,2,206,175,225,68,0,66,98,250,+39,4,225,20,1,160,17,193,131,161,22,192,39,192,24,225,47,0,154,127,+226,168,1,71,121,224,127,1,228,130,3,218,126,96,43,247,208,5,224,251,+3,68,9,96,252,162,170,225,3,18,96,128,224,51,12,113,60,96,117,224,+52,4,135,230,192,63,64,22,96,39,227,106,1,128,28,64,7,193,220,200,+46,160,235,130,139,230,110,5,130,46,100,167,96,22,228,96,5,252,114,3,+65,117,120,172,202,1,128,67,129,188,3,95,49,52,51,161,20,164,37,192,+122,225,22,13,96,35,224,226,9,140,154,64,199,251,194,2,224,237,3,129,+186,133,15,162,0,249,72,1,231,114,0,129,237,64,192,225,29,1,224,159,+0,128,233,224,158,26,160,108,225,185,5,129,237,193,108,64,88,255,7,1,+224,165,0,224,95,50,128,186,192,95,192,69,128,101,226,94,15,234,198,0,+64,54,226,151,0,224,97,1,230,13,14,225,77,1,99,103,228,232,1,250,+231,1,65,239,160,67,225,125,1,129,90,233,95,17,228,247,1,227,222,1,+234,217,25,192,59,132,109,225,22,6,226,249,3,227,247,1,163,250,224,198,+0,251,208,6,234,2,13,224,196,1,230,253,18,129,229,224,138,12,171,230,+163,107,1,48,50,64,65,224,208,13,128,169,165,18,235,160,6,134,46,7,+32,101,114,114,111,114,32,125,102,52,224,101,2,128,95,133,99,229,105,1,+224,154,24,228,33,5,161,79,96,43,64,23,96,219,228,136,8,234,172,1,+194,107,161,177,102,237,97,71,161,103,245,41,0,192,16,130,31,130,59,193,+116,131,151,224,13,9,226,9,1,5,67,32,95,51,51,50,165,107,193,44,+224,171,3,131,93,119,70,199,238,230,66,13,161,92,131,45,98,89,96,47,+225,100,1,5,115,121,110,116,97,120,129,100,225,98,30,72,9,142,99,104,+31,103,38,168,32,205,191,191,88,192,22,139,76,64,227,1,80,32,124,93,+201,204,209,191,159,1,192,46,138,228,104,232,64,14,138,182,4,85,32,75,+32,65,107,156,100,64,1,10,65,120,187,0,52,74,62,2,90,32,85,170,+16,233,228,4,224,18,6,145,3,224,18,4,151,129,232,20,9,65,106,232,+6,5,160,105,1,64,85,73,82,0,64,64,7,133,119,192,15,224,69,6,+139,202,230,62,8,160,45,224,60,1,165,188,224,169,6,65,245,224,80,6,+181,49,224,18,3,79,84,160,65,224,80,7,224,41,6,129,137,160,41,234,+63,3,65,75,139,79,108,52,5,75,32,64,95,54,50,131,167,96,52,66,+122,64,35,202,13,97,168,98,94,97,191,101,102,4,10,65,32,73,32,64,+11,130,18,191,166,0,80,72,126,138,233,1,95,52,124,57,2,90,32,90,+67,139,0,52,81,130,0,89,96,73,64,135,233,67,1,203,191,230,46,5,+224,166,0,130,89,173,74,232,106,0,224,12,0,230,230,4,202,149,164,191,+192,39,227,101,0,227,162,0,96,8,110,79,1,52,56,134,148,224,70,3,+99,53,122,141,64,22,167,237,229,84,3,64,36,67,218,99,153,71,139,227,+131,1,98,69,135,243,0,57,69,59,0,52,87,29,246,220,0,173,4,173,+154,231,198,2,193,14,228,103,6,162,137,150,79,192,117,224,7,3,164,70,+228,168,1,228,79,0,168,130,64,183,64,60,224,33,12,128,27,224,26,6,+129,40,160,137,100,114,232,248,0,224,38,13,132,106,103,206,164,44,162,106,+194,113,184,212,96,12,96,11,248,229,0,134,36,98,158,67,226,226,200,2,+0,39,78,67,0,56,64,125,0,85,193,15,225,14,4,161,82,192,31,0,+85,68,12,66,103,107,111,77,122,166,188,0,51,115,192,224,0,2,225,168,+2,225,163,6,83,141,2,95,52,48,238,247,3,10,77,104,115,46,66,117,+105,108,116,105,110,133,35,2,49,55,49,67,50,92,187,1,48,53,174,192,+161,205,224,58,6,5,80,114,101,108,117,100,173,190,66,200,133,11,0,75,+99,50,196,254,128,1,231,154,3,233,166,1,0,32,152,190,96,59,133,24,+229,69,0,101,46,96,194,160,69,160,44,0,58,130,206,224,90,0,204,34,+226,217,3,195,55,194,218,232,209,3,192,125,130,215,164,74,96,26,1,95,+57,106,30,2,95,49,52,171,180,98,225,86,226,96,48,230,245,2,195,47,+238,115,0,224,16,2,160,13,224,133,3,224,158,10,96,245,130,189,195,238,+195,204,96,143,64,46,64,124,0,55,99,119,6,57,55,57,32,95,57,51,+65,199,225,239,1,1,95,51,203,68,1,95,50,80,113,64,48,116,179,0,+52,112,105,1,95,51,68,86,128,101,128,32,194,119,224,15,1,130,143,165,+162,1,95,51,81,210,2,95,49,48,69,53,80,207,131,206,0,49,130,2,+140,171,2,95,57,55,64,35,1,57,55,210,105,97,55,66,109,0,56,81,+112,225,0,0,96,137,131,56,108,52,140,44,64,155,117,46,128,70,192,71,+2,95,49,51,140,241,224,82,1,96,86,2,49,50,56,168,29,224,20,1,+229,92,11,192,114,99,101,129,88,128,0,225,118,9,229,125,0,161,255,161,+136,64,151,3,53,32,95,52,131,110,229,193,14,189,143,64,10,209,140,192,+7,192,11,224,141,1,224,107,2,225,240,1,2,95,51,56,239,207,0,224,+0,1,193,181,0,56,97,103,66,222,210,5,0,73,64,186,158,203,224,117,+11,224,7,3,224,205,2,64,18,133,58,130,157,229,214,1,224,2,5,192,+137,226,117,0,224,32,15,224,33,17,224,36,3,224,37,30,237,24,0,0,+39,137,239,227,158,9,195,178,160,46,192,1,177,39,101,147,229,249,1,224,+5,3,230,5,4,195,173,224,66,1,0,95,230,97,1,163,93,116,148,161,+219,4,95,49,48,55,50,229,74,1,96,81,135,32,97,159,195,59,3,95,+54,57,48,64,12,75,245,224,22,2,192,219,224,88,3,224,85,9,160,50,+232,164,3,0,95,221,71,196,76,129,22,224,2,11,226,217,3,225,22,1,+226,112,0,224,29,0,225,129,3,193,90,192,246,228,193,4,224,20,0,224,+8,2,1,95,55,238,63,0,225,136,0,225,74,1,224,162,3,64,15,225,+239,3,88,211,226,106,1,194,179,238,64,2,172,79,160,42,192,19,196,146,+129,133,192,101,224,193,1,224,92,3,160,62,192,195,97,248,224,5,3,193,+33,224,57,3,162,13,224,25,10,160,2,224,25,17,226,133,1,225,112,3,+192,164,64,19,226,202,1,225,39,5,96,17,87,69,231,158,7,160,68,96,+86,224,80,0,228,150,2,224,224,8,70,3,168,3,64,39,0,54,109,15,+64,53,201,28,227,252,0,64,126,155,222,70,183,0,50,69,147,192,120,128,+201,224,28,13,64,96,245,242,1,168,193,64,3,232,191,1,130,29,225,241,+3,227,180,2,224,210,5,160,247,224,128,7,224,215,0,224,236,3,224,218,+0,201,44,224,249,2,199,20,226,93,11,226,192,1,227,222,2,226,92,255,+226,92,45,226,90,1,96,0,226,2,14,225,67,3,64,13,226,8,31,0,+55,224,165,5,96,26,193,4,231,144,4,128,155,192,149,69,177,64,147,246,+107,3,64,0,96,149,64,106,227,2,13,121,249,224,120,8,224,136,10,236,+136,3,160,57,166,15,227,105,17,128,212,128,185,144,196,95,91,75,112,226,+238,5,230,167,2,160,3,191,76,162,147,225,76,2,224,90,1,232,79,3,+98,147,225,175,3,241,141,1,226,246,3,200,118,229,234,1,161,6,138,228,+227,142,16,64,84,238,137,8,242,105,4,128,178,64,39,78,237,130,176,232,+74,1,232,84,3,130,199,192,207,225,41,3,224,97,1,226,81,6,233,96,+1,224,89,8,163,78,64,250,64,66,65,61,199,47,224,82,4,224,77,16,+225,208,1,161,173,91,68,224,69,1,224,74,10,160,70,250,159,12,11,110,+111,116,32,101,120,112,111,114,116,101,100,250,165,0,96,0,73,168,208,58,+0,82,64,107,109,149,101,103,0,54,64,9,3,95,52,51,54,202,82,7,+95,52,51,57,32,95,52,52,128,111,129,124,66,108,160,7,224,121,12,1,+58,32,128,111,1,95,51,188,56,96,113,0,54,144,135,225,43,4,229,36,+0,204,132,226,216,2,229,44,1,98,17,232,27,3,132,156,163,196,229,110,+6,226,96,0,224,11,1,0,83,81,58,98,30,229,102,28,160,117,228,182,+0,97,204,249,226,11,214,124,192,13,162,251,128,16,226,255,1,229,132,4,+192,155,227,9,4,228,74,2,96,56,139,217,1,55,54,230,221,4,225,2,+2,96,102,230,207,0,230,75,7,224,38,50,163,6,134,59,96,38,227,255,+21,225,38,14,163,58,128,108,245,123,0,163,241,224,21,14,165,91,161,10,+129,228,87,6,133,81,246,73,7,225,73,1,225,180,25,205,160,128,48,225,+180,5,224,145,2,237,7,1,224,13,11,246,42,14,161,41,230,14,2,107,+238,224,184,1,224,0,3,229,254,0,224,182,28,192,239,224,129,22,224,171,+77,224,170,37,216,54,224,128,22,224,170,84,227,216,53,233,236,1,224,151,+11,233,105,1,160,13,227,217,45,153,215,1,52,55,219,103,192,224,196,155,+96,48,0,54,69,75,227,253,11,3,64,95,55,55,235,20,0,198,43,238,+66,7,192,219,128,155,246,111,0,77,216,83,81,240,181,6,192,100,195,93,+229,96,5,229,113,1,128,27,224,251,0,80,223,1,50,56,206,86,128,67,+177,23,1,90,32,192,165,97,150,1,95,57,64,28,69,253,182,133,96,62,+160,88,192,203,233,140,0,192,17,96,188,100,16,153,35,136,184,158,235,0,+51,113,219,230,171,26,230,160,19,15,117,110,100,101,102,105,110,101,100,32,+109,111,100,117,108,101,230,176,8,111,38,0,79,193,127,225,22,1,129,220,+65,77,0,51,232,155,10,225,62,5,160,37,1,95,56,82,250,239,192,1,+245,133,0,160,46,64,101,226,24,3,146,106,96,194,97,96,65,60,217,190,+225,62,1,224,63,1,224,2,0,162,134,224,21,6,160,196,194,154,99,70,+227,68,1,224,22,1,193,78,106,60,181,176,224,253,2,138,220,1,56,48,+225,106,0,2,49,52,56,132,160,64,164,224,209,0,224,187,0,64,181,0,+51,146,11,167,208,96,96,66,59,0,57,150,55,225,184,16,176,87,130,99,+225,179,1,136,202,97,167,64,92,149,162,80,145,88,123,228,139,6,3,95,+50,48,50,224,58,2,6,116,121,81,73,100,101,110,128,60,250,26,0,96,+70,149,185,192,226,228,121,1,180,5,97,48,66,239,97,155,2,95,53,53,+99,46,225,228,1,129,146,150,206,227,18,1,227,4,6,128,70,116,106,83,+69,230,202,0,226,205,0,96,137,150,45,0,80,86,127,64,107,246,57,8,+65,177,160,20,231,207,1,128,88,0,51,219,27,192,12,138,86,0,95,172,+139,202,221,105,229,234,226,2,128,55,160,0,224,50,18,224,42,7,209,106,+64,148,138,70,225,16,1,224,9,4,162,168,224,9,4,224,39,11,170,13,+234,6,1,164,107,228,192,2,0,67,86,226,0,53,167,21,114,168,1,54,+52,98,69,149,105,114,219,0,95,120,57,64,37,1,95,51,87,194,96,0,+66,113,1,50,50,88,21,82,205,1,49,51,119,39,100,63,0,57,67,86,+179,20,96,239,248,159,3,96,4,160,21,248,183,5,139,216,245,103,13,166,+193,229,38,1,168,203,132,200,250,78,1,161,69,232,211,9,224,142,5,224,+122,0,96,15,225,192,6,224,7,1,230,246,27,224,157,2,96,16,231,96,+1,238,201,3,161,149,167,28,128,81,194,190,69,230,214,102,66,185,182,15,+224,213,8,224,0,2,67,54,128,88,2,95,52,55,67,78,160,110,225,143,+9,172,126,225,146,36,128,206,238,172,4,97,11,130,60,0,80,225,163,13,+224,76,1,129,55,192,238,128,233,192,39,230,145,0,167,203,128,180,154,146,+146,114,225,226,30,96,0,224,85,28,100,46,226,56,49,101,185,0,48,64,+199,155,143,224,238,8,227,252,6,193,225,194,67,226,29,1,199,126,96,138,+160,29,236,36,2,236,39,1,226,33,5,160,34,224,61,0,124,153,227,37,+15,235,252,0,226,202,7,160,132,224,10,2,225,160,1,133,12,225,34,6,+70,207,172,166,166,236,233,82,1,169,74,193,57,1,95,55,68,50,225,49,+3,0,51,91,244,0,95,219,38,160,98,224,218,0,224,155,9,240,217,17,+192,54,193,55,227,83,1,225,50,0,193,39,132,212,64,52,224,93,2,0,+83,160,53,103,39,226,104,3,230,220,11,99,83,230,197,0,137,128,250,0,+0,227,146,15,224,165,26,160,145,64,168,227,237,6,224,79,6,227,254,2,+224,0,1,64,177,105,60,223,108,155,2,228,209,44,99,212,242,118,20,194,+40,224,202,9,235,1,2,224,202,9,97,195,224,85,32,160,82,225,96,8,+224,0,1,225,9,12,3,64,64,95,56,107,95,64,63,96,7,130,98,131,+80,224,5,0,92,147,0,52,71,64,163,206,224,6,5,224,14,1,1,52,+52,167,107,0,54,103,107,104,153,98,47,77,16,96,250,96,11,137,254,128,+13,227,13,1,227,145,2,203,51,96,233,204,117,96,11,65,174,0,55,94,+196,224,163,2,64,45,0,55,103,69,227,90,2,96,100,65,56,66,123,228,+133,2,224,99,0,96,96,95,123,0,51,234,244,5,130,17,224,22,1,224,+59,0,128,192,134,17,0,57,149,198,114,222,122,134,162,225,64,112,3,95,+56,51,52,70,31,170,26,156,118,0,49,96,67,228,102,3,131,88,129,183,+129,192,73,96,74,108,0,48,190,102,236,18,5,4,79,32,35,57,55,194,+220,2,95,49,50,64,159,137,146,126,77,192,223,7,95,55,54,54,32,95,+54,50,72,90,2,49,49,53,82,78,64,9,2,56,51,32,239,165,0,224,+34,18,98,150,1,35,49,67,13,65,198,141,9,64,147,0,52,64,110,76,+60,160,150,1,52,51,96,61,0,48,158,253,3,95,51,53,53,129,248,203,+254,1,95,52,85,183,192,49,64,29,224,36,2,235,109,0,116,51,77,44,+130,7,229,194,1,246,40,1,98,12,0,79,132,193,3,95,57,56,55,235,+43,2,1,45,62,139,37,129,242,64,30,64,141,3,95,49,52,54,229,75,+1,134,197,140,184,224,66,10,0,61,160,66,226,57,2,76,244,1,52,54,+65,88,163,118,224,127,6,3,79,32,35,49,66,58,128,95,224,123,0,2,+49,52,54,75,118,1,49,52,65,76,244,255,0,224,59,2,2,49,51,48,+69,37,224,48,1,96,15,64,48,65,151,224,48,10,160,108,1,56,53,64,+213,224,109,6,224,233,10,224,193,1,224,233,2,64,63,0,54,76,196,128,+35,224,230,17,160,31,224,35,1,98,146,108,88,224,16,1,97,172,237,187,+28,99,40,195,83,162,233,173,181,227,113,3,229,174,3,135,170,131,94,1,+49,51,65,76,67,94,0,52,217,47,64,37,227,89,5,226,197,28,64,127,+231,99,5,200,205,224,141,20,131,126,0,57,96,5,64,128,78,243,96,147,+198,201,99,249,67,126,2,95,57,56,101,55,96,92,99,187,66,32,0,48,+195,169,66,238,141,255,192,80,99,170,160,6,64,29,141,214,224,29,6,224,+12,6,64,130,64,43,141,120,97,217,90,151,0,56,96,65,64,150,224,21,+1,2,52,54,55,128,21,141,131,226,234,1,10,80,114,105,109,105,116,105,+118,101,115,46,98,245,64,35,141,18,132,241,224,114,2,224,128,7,128,20,+64,48,0,54,174,202,0,75,103,30,129,43,64,23,132,40,76,213,67,221,+97,6,224,121,12,163,178,130,124,66,254,1,54,50,193,184,228,171,14,224,+79,21,163,191,224,79,25,98,18,160,172,132,163,0,75,64,190,64,14,132,+141,134,116,1,55,55,78,87,143,151,0,49,70,106,146,138,98,141,162,56,+0,48,224,33,0,2,49,51,56,240,22,0,172,21,224,63,13,1,49,51,+74,239,230,65,0,224,65,0,103,49,0,48,249,60,1,224,65,6,2,49,+52,52,163,229,167,101,0,49,224,56,0,160,201,130,89,224,120,18,1,52,+52,66,216,64,32,224,116,0,75,126,1,56,51,160,13,0,80,102,130,2,+52,53,55,235,186,3,160,16,96,42,66,26,1,56,56,93,1,0,52,192,+18,135,212,0,73,67,62,233,240,4,115,90,141,68,107,54,100,24,235,14,+2,104,225,1,49,52,68,141,96,0,64,149,241,194,1,224,76,11,0,49,+193,90,96,31,169,128,96,146,0,54,145,209,64,48,176,152,239,95,0,235,+200,9,245,71,20,64,82,252,123,5,237,109,11,231,172,4,105,14,247,49,+8,96,0,164,30,160,46,226,42,1,225,113,1,78,158,193,171,65,159,65,+85,65,226,0,48,233,182,2,232,134,1,225,241,2,168,17,3,64,95,50,+52,184,37,66,1,132,61,242,184,5,64,167,81,4,64,8,64,65,2,49,+48,51,131,212,137,226,96,219,0,83,97,113,225,30,2,80,203,64,119,128,+13,6,64,67,32,60,32,64,35,97,242,236,70,2,225,59,0,192,24,97,+152,128,1,224,237,0,1,95,57,67,132,117,77,96,0,255,97,2,226,15,+0,227,3,4,0,49,150,84,224,73,0,64,233,226,234,4,166,66,104,19,+238,125,0,65,131,246,119,3,224,165,10,128,29,96,165,242,135,6,224,126,+1,115,14,1,51,51,245,114,3,13,116,121,112,101,32,115,105,103,110,97,+116,117,114,101,136,32,128,151,238,12,4,224,215,4,224,209,12,64,41,167,+74,224,112,6,0,57,101,192,173,204,224,72,2,227,254,5,150,249,225,94,+21,225,50,0,226,47,7,224,126,0,1,95,53,68,39,225,51,12,128,0,+224,54,3,66,83,134,101,224,114,8,1,49,49,104,192,168,205,192,50,163,+8,163,158,162,15,229,39,6,66,133,200,50,194,0,104,29,64,14,66,150,+103,58,253,188,3,234,254,9,225,158,1,2,67,97,110,94,47,17,115,97,+116,105,115,102,121,32,99,111,110,115,116,114,97,105,110,116,247,26,0,107,+28,0,57,128,116,96,0,0,58,129,75,83,254,4,32,95,56,48,53,64,+4,131,120,75,219,64,29,212,177,227,156,9,229,60,4,227,200,2,238,238,+6,132,176,0,55,230,167,3,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,50,57,53,58,49,57,213,235,0,90,97,55,1,49,56,64,132,65,+84,68,102,1,49,48,161,17,163,182,229,234,4,255,9,2,3,95,49,50,+53,230,140,1,64,187,0,57,160,37,174,190,224,172,57,2,51,48,49,224,+172,0,215,118,175,43,226,211,1,238,121,5,226,67,3,2,49,52,53,64,+179,64,226,225,68,1,226,50,23,202,60,224,29,4,150,229,0,53,181,84,+1,49,49,101,147,198,188,101,129,131,237,225,41,3,66,78,0,52,193,31,+227,47,12,98,114,76,241,240,67,5,204,140,0,52,106,78,96,189,134,179,+208,254,128,10,0,52,121,88,198,38,0,52,65,139,0,53,65,184,224,161,+10,224,19,12,230,59,1,64,0,66,145,137,155,128,77,138,227,162,170,0,+54,160,24,224,139,0,163,217,0,50,75,10,96,33,137,141,0,83,168,85,+224,229,3,163,166,0,90,229,16,1,227,228,7,0,48,73,203,128,248,64,+203,229,52,3,225,78,4,226,96,2,99,196,0,49,65,31,203,98,160,61,+224,95,4,225,212,9,228,236,4,1,49,48,164,71,229,253,5,100,31,107,+162,185,203,1,57,53,98,109,139,123,64,110,2,95,55,52,228,209,2,160,+89,1,52,56,80,172,112,202,96,65,85,192,122,251,65,77,98,253,1,56,+49,160,231,97,49,138,18,136,58,239,162,3,165,190,180,81,130,137,243,78,+3,228,207,1,211,227,207,192,136,155,177,149,239,173,4,236,187,0,1,49,+52,66,34,111,213,2,35,49,50,131,230,1,95,54,76,255,108,213,171,3,+194,83,64,73,192,92,226,56,4,224,76,15,64,215,138,219,2,95,54,50,+65,218,1,52,53,72,12,96,39,68,88,75,32,224,13,0,170,105,143,212,+74,64,224,39,2,108,86,224,13,0,90,21,224,13,0,1,50,48,224,13,+0,64,110,234,143,1,145,91,66,228,74,111,65,10,0,55,171,143,235,234,+15,64,46,67,67,64,71,173,19,228,59,1,0,50,66,57,0,75,226,172,+7,64,166,81,94,153,66,230,160,0,228,74,5,228,108,1,194,128,229,229,+5,0,49,108,233,145,227,228,22,9,2,95,57,55,64,30,97,31,226,46,+1,135,33,194,227,100,30,129,220,1,95,54,68,18,0,58,99,29,166,110,+75,142,156,40,64,22,134,103,96,101,0,57,76,136,74,191,0,54,125,118,+70,144,0,95,64,140,243,147,0,64,47,228,5,0,231,254,12,66,157,104,+239,98,165,137,2,0,64,195,175,137,212,233,209,6,96,198,224,25,12,105,+210,224,25,12,104,133,233,92,8,96,21,0,85,163,17,192,115,128,144,131,+25,96,9,65,25,195,104,224,67,9,96,115,78,77,229,158,4,224,43,13,+96,185,71,116,129,82,161,160,67,99,224,58,7,230,0,0,224,141,1,193,+15,224,211,0,162,116,192,179,224,105,4,224,27,2,204,25,213,109,108,202,+245,131,0,203,118,224,98,0,160,38,224,13,6,229,11,0,245,2,0,64,+196,229,77,2,238,26,0,139,152,192,63,134,122,102,186,245,212,3,224,121,+3,244,196,11,224,125,0,244,201,16,224,96,2,148,201,160,43,131,71,160,+12,0,50,106,53,127,2,98,189,227,106,3,128,0,233,207,4,181,7,106,+95,232,134,1,64,50,212,252,224,119,1,96,95,181,197,224,69,6,157,189,+224,69,5,96,130,254,140,0,160,135,74,165,192,135,224,9,0,225,180,23,+130,170,226,28,0,225,131,5,129,110,161,157,226,98,2,225,81,2,107,255,+203,175,225,203,1,193,182,224,40,1,225,188,16,225,190,4,100,59,225,196,+14,225,163,1,246,175,18,224,37,5,192,34,136,170,193,90,129,93,225,121,+0,102,94,161,246,225,205,1,225,202,39,226,22,19,226,127,5,193,230,224,+140,4,248,248,3,183,186,248,238,22,111,154,173,106,161,162,254,9,1,193,+1,160,63,249,6,7,130,232,230,127,1,96,187,72,27,136,32,99,248,137,+192,99,250,122,185,224,0,0,226,138,36,105,194,226,62,9,128,72,237,50,+9,107,66,154,103,64,245,224,33,8,99,138,224,73,1,241,7,1,170,148,+238,84,1,225,110,0,110,203,128,174,235,219,1,2,63,63,63,171,182,3,+95,49,52,48,69,142,209,114,226,160,11,160,0,70,125,0,54,166,125,225,+209,0,238,132,14,227,60,5,227,14,1,227,33,2,229,37,4,64,17,128,+33,224,52,3,224,58,4,160,59,229,23,1,224,28,4,225,244,0,224,2,+8,192,32,128,104,239,163,5,227,245,11,160,70,88,132,102,74,229,105,7,+228,173,11,96,101,160,144,64,79,130,252,224,131,0,119,11,224,160,0,226,+143,8,130,117,118,207,227,97,5,255,41,3,229,226,1,128,100,222,200,227,+92,1,224,197,8,226,44,5,225,124,3,224,157,4,225,69,0,225,138,3,+212,129,181,211,213,218,224,198,2,210,31,128,65,226,54,7,240,194,3,251,+87,15,1,49,51,120,78,171,23,132,98,99,64,83,207,119,61,2,49,48,+57,178,218,226,210,3,172,83,227,211,5,192,162,2,95,55,55,231,252,5,+192,213,210,47,228,225,2,236,203,2,225,21,4,164,56,64,16,98,3,95,+106,160,155,105,90,186,160,225,37,15,64,4,192,141,239,83,40,4,54,55,+58,50,53,163,156,64,154,64,126,107,138,101,110,225,15,3,1,95,55,74,+47,225,105,28,252,162,3,225,110,9,231,143,2,64,251,180,85,224,237,31,+0,65,224,237,52,0,54,224,237,3,245,170,2,227,221,1,226,164,5,227,+6,2,226,164,17,64,243,255,150,3,128,213,166,29,192,38,213,153,69,249,+226,71,2,68,229,143,46,236,53,4,247,36,4,147,207,192,50,162,149,1,+53,56,66,37,160,104,74,229,65,83,246,123,32,161,129,64,177,136,173,238,+43,0,224,0,0,64,83,0,51,140,52,253,84,0,236,54,0,236,55,1,+115,49,172,55,96,44,0,51,140,97,89,192,1,75,32,75,159,224,1,11,+138,152,192,105,0,57,175,243,64,62,141,194,0,79,131,118,93,192,75,163,+224,14,2,66,71,96,14,67,184,128,19,109,117,224,12,0,96,74,97,114,+64,78,141,201,130,149,106,141,142,231,129,226,230,192,7,242,250,0,214,227,+225,134,4,121,71,135,176,225,170,6,224,55,7,225,187,4,0,52,144,88,+224,51,37,0,51,192,165,224,51,35,96,178,249,165,9,89,225,113,142,0,+73,113,117,164,111,226,10,1,160,255,224,56,2,242,43,4,103,168,235,239,+0,224,142,13,1,49,49,175,144,226,168,3,129,84,170,180,229,254,3,231,+71,1,231,96,3,160,2,160,183,224,47,7,192,5,246,21,10,240,214,1,+224,115,1,128,1,247,116,5,225,240,5,231,73,5,195,226,249,204,0,105,+68,132,222,66,55,227,123,1,246,22,16,86,19,7,97,32,99,108,97,115,+115,32,182,7,0,51,162,215,225,147,6,224,166,7,225,38,2,224,28,13,+227,45,1,224,54,9,227,73,2,64,14,235,217,4,224,2,3,225,9,3,+231,187,3,129,3,224,5,0,212,93,71,20,148,94,224,32,6,0,80,202,+2,64,31,77,179,116,120,2,64,64,75,65,139,129,37,224,10,13,234,129,+10,150,112,255,9,0,225,104,1,0,95,119,140,0,56,116,80,225,98,2,+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,229,212,1,225,12,2,224,1,11,234,66,17,+224,56,4,194,121,236,186,0,0,39,192,8,233,10,8,64,25,224,110,0,+128,55,239,92,6,224,140,4,71,42,230,255,1,226,229,4,201,187,224,79,+6,128,18,224,93,1,128,16,224,13,4,128,10,73,234,96,98,232,182,2,+230,112,7,64,0,166,183,224,104,4,224,158,2,226,171,6,168,203,224,2,+6,192,168,224,30,3,226,99,2,114,7,0,66,96,37,109,43,246,217,10,+224,253,24,192,89,163,137,186,70,224,179,4,165,212,70,12,234,190,2,238,+224,8,3,49,48,55,51,98,100,225,24,1,168,206,192,78,238,17,4,104,+145,98,147,74,49,0,66,77,113,224,60,5,77,175,0,48,100,29,0,51,+221,12,224,150,0,128,52,225,159,1,217,33,224,31,0,1,51,56,164,75,+224,192,3,254,12,1,237,72,0,116,141,224,19,4,214,221,161,26,196,161,+0,50,157,86,224,58,1,0,51,128,39,67,232,225,250,1,70,33,244,68,+0,96,67,2,32,95,57,227,193,2,233,12,25,226,111,1,224,23,1,162,+252,136,108,226,254,0,136,74,64,164,154,67,160,222,233,57,6,233,25,5,+128,0,226,154,3,139,14,204,158,132,18,126,73,118,208,0,56,226,211,4,+0,58,134,255,213,21,161,26,97,164,229,181,1,1,52,51,140,0,160,14,+0,48,74,233,193,216,138,127,0,83,73,88,1,52,32,96,147,0,35,162,+32,64,55,158,111,64,100,181,64,121,95,0,57,135,119,149,90,64,35,96,+25,0,54,86,229,181,111,64,27,2,10,65,32,228,194,1,68,183,0,34,+128,26,137,246,187,198,74,50,0,52,72,200,160,142,143,38,153,249,94,29,+240,65,4,97,216,67,17,1,53,50,225,4,0,112,58,129,74,1,95,51,+97,111,64,99,233,185,0,101,90,165,206,119,28,0,54,73,168,160,19,64,+41,137,182,232,36,0,167,244,65,223,0,67,244,176,1,232,62,11,130,0,+232,61,18,228,32,3,252,93,2,192,136,98,43,201,112,162,197,0,54,233,+116,1,171,77,0,52,65,248,228,63,6,224,93,59,160,89,193,221,138,125,+226,219,0,66,16,64,73,99,39,0,50,121,177,1,95,51,155,13,129,57,+195,220,230,191,12,190,76,232,52,19,190,75,6,100,101,114,105,118,101,32,+254,62,3,1,51,54,131,235,192,181,67,118,111,202,226,250,3,64,178,138,+225,0,79,127,20,224,97,10,11,68,97,116,97,46,66,111,117,110,100,101,+100,192,7,96,103,77,135,66,38,224,57,21,3,69,110,117,109,96,4,224,+51,0,139,128,224,51,19,224,4,0,224,51,0,139,195,224,103,20,3,113,+46,69,113,192,47,104,119,224,47,21,4,73,120,46,73,120,224,47,0,71,+195,224,47,21,2,79,114,100,64,3,224,49,0,224,249,25,78,62,3,97,+98,108,101,224,8,0,224,59,0,66,6,224,59,16,17,84,101,120,116,46,+82,101,97,100,46,73,110,116,101,114,110,97,108,96,13,224,170,29,96,60,+3,83,104,111,119,96,4,224,51,0,66,188,229,24,2,65,245,171,211,101,+153,66,28,101,136,191,106,137,157,0,49,91,169,224,90,1,224,80,0,194,+80,238,177,5,163,236,235,32,3,65,184,132,121,229,245,0,98,136,230,2,+7,64,44,230,16,3,136,158,224,17,0,224,20,3,224,21,7,224,24,1,+224,25,11,224,28,1,224,29,4,224,83,1,204,17,235,94,9,224,48,10,+224,2,3,232,188,0,231,76,1,235,49,9,104,182,0,54,133,249,224,83,+23,224,80,2,129,35,224,81,9,83,167,0,56,97,153,102,149,234,213,2,+7,104,111,119,115,80,114,101,99,234,195,4,224,102,12,200,91,192,103,224,+1,1,101,184,224,25,12,236,32,0,224,22,14,224,104,11,138,223,241,236,+3,224,201,4,251,235,3,232,222,0,64,84,2,95,56,48,69,76,64,64,+0,79,98,57,1,79,32,123,94,231,215,8,224,220,11,128,2,192,34,224,+169,1,205,158,244,133,2,64,22,77,47,98,240,67,33,234,219,1,224,230,+6,224,234,4,224,28,22,224,253,3,128,28,128,114,224,2,0,127,116,224,+71,10,225,75,8,236,53,9,224,8,18,202,30,64,57,160,231,97,90,130,+218,0,51,83,130,0,85,227,200,2,66,46,4,80,97,114,101,110,194,46,+192,113,128,83,139,109,128,52,2,79,32,35,75,51,161,123,129,44,0,56,+95,161,104,47,236,157,4,194,177,128,140,96,58,71,12,225,182,0,169,218,+235,33,0,137,224,225,126,5,202,251,1,85,32,210,95,96,118,225,223,4,+246,68,5,141,59,225,77,2,161,10,64,90,193,6,64,8,226,109,0,64,+5,162,36,226,22,2,239,225,1,64,9,132,166,128,156,129,13,154,149,64,+165,2,79,32,35,71,93,224,215,3,224,253,0,224,250,2,82,241,224,34,+6,235,214,1,64,1,176,211,128,59,224,119,29,77,244,192,83,1,85,32,+249,228,2,96,113,0,49,70,85,192,30,64,61,2,56,55,49,64,61,249,+224,6,2,64,85,32,85,0,171,25,1,49,57,160,209,0,48,233,22,3,+128,10,64,4,225,212,1,128,137,0,49,172,120,2,95,50,53,128,81,224,+32,2,72,213,226,102,7,2,83,116,114,239,90,1,129,236,0,57,224,57,+8,226,161,13,228,208,3,226,120,5,224,50,2,65,105,0,54,224,186,0,+1,95,56,205,118,0,54,237,164,0,2,49,48,53,130,91,235,254,5,237,+12,0,0,95,70,228,65,2,0,49,226,172,3,71,33,71,52,106,250,0,+83,100,162,3,49,52,50,55,74,8,67,15,233,144,9,64,136,225,67,0,+153,135,128,20,225,179,1,69,94,137,251,64,92,140,5,100,251,84,80,64,+94,139,144,0,48,128,31,140,11,96,120,76,150,71,140,1,32,35,97,0,+135,153,75,56,116,137,64,44,0,54,96,44,0,90,141,68,100,77,98,112,+240,168,13,230,250,0,230,247,7,227,103,3,134,142,231,73,0,229,51,0,+128,249,97,135,161,192,129,248,128,112,238,98,2,240,53,9,224,91,5,64,+47,154,122,230,210,12,6,116,121,112,101,82,101,112,161,255,160,121,174,233,+0,53,85,220,3,49,50,55,55,226,239,4,132,252,224,87,0,130,33,98,+151,0,54,136,205,98,8,224,97,1,8,109,107,84,121,67,111,110,65,112,+192,100,132,28,105,13,224,64,35,224,162,0,243,240,0,226,133,0,64,175,+130,238,129,247,224,39,35,7,95,53,52,55,32,95,53,52,253,170,0,64,+0,227,151,0,236,30,4,162,174,142,13,233,208,34,202,205,128,150,233,207,+35,164,181,226,64,6,225,224,7,64,39,194,45,224,24,1,225,246,20,5,+99,111,109,112,97,114,139,40,100,196,2,54,57,48,101,11,185,211,138,44,+229,54,1,234,70,1,234,80,4,243,80,2,106,0,233,234,0,128,5,169,+107,128,68,160,74,232,130,8,64,58,114,124,238,50,4,234,85,1,98,104,+66,223,111,227,232,231,1,237,206,1,101,45,196,140,176,55,96,8,227,41,+4,226,89,10,1,60,62,233,200,2,160,161,128,73,69,167,224,81,43,225,+87,4,64,0,198,5,224,57,24,1,69,81,192,52,246,228,0,193,199,193,+53,193,50,97,41,227,154,7,224,95,23,1,76,84,232,133,4,224,90,14,+74,13,160,87,225,144,4,224,93,23,0,71,192,93,160,47,138,74,231,3,+23,160,37,224,29,5,231,124,2,96,7,96,4,230,84,4,163,135,145,49,+1,75,50,96,196,245,198,1,98,17,1,50,50,224,14,3,239,211,15,9,+87,97,114,110,105,110,103,58,32,99,239,220,10,132,155,147,182,3,51,32,+95,57,105,40,224,77,19,4,32,121,101,116,44,160,60,82,35,82,54,224,+183,7,247,89,3,164,110,64,202,0,51,167,1,97,9,65,1,97,19,72,+86,113,34,64,34,144,239,66,162,2,73,79,46,87,92,3,111,114,109,73,+149,180,99,76,65,0,110,178,1,95,50,121,24,96,104,96,16,96,62,144,+123,228,180,34,175,227,128,204,228,179,124,1,61,61,228,174,0,225,155,0,+100,187,105,239,158,145,138,122,228,195,3,246,48,6,228,125,10,236,251,2,+64,55,237,8,8,228,138,92,1,38,38,228,138,71,193,46,64,0,228,133,+32,2,84,114,117,228,188,0,227,188,22,227,181,15,129,66,161,96,228,77,+0,228,174,6,224,135,23,3,70,97,108,115,192,136,128,49,96,5,96,4,+228,11,11,145,100,98,207,2,90,32,90,238,138,0,130,18,147,140,2,48,+56,54,150,45,130,28,237,31,0,108,44,96,10,224,144,0,165,24,129,211,+152,62,232,7,4,160,28,228,30,3,252,219,1,117,242,64,74,72,40,93,+111,150,10,4,95,49,56,51,32,149,131,75,155,84,254,64,60,64,4,224,+198,0,65,77,99,228,0,89,128,156,5,80,32,95,50,48,50,227,148,2,+5,102,111,108,100,114,49,233,9,0,142,246,66,175,231,134,0,110,224,224,+10,2,96,232,192,94,139,11,227,138,0,227,190,10,227,181,4,129,201,65,+157,99,167,164,176,97,131,64,77,235,57,0,246,130,3,131,114,224,137,11,+240,30,1,93,189,0,54,151,230,117,168,228,81,73,128,76,228,81,24,64,+9,245,49,0,96,80,142,15,163,115,217,42,107,230,171,235,197,7,231,147,+8,96,110,130,63,227,8,0,64,28,98,34,205,81,96,214,2,54,50,49,+162,29,174,90,228,255,30,1,116,111,224,171,42,226,235,4,241,253,9,192,+120,224,171,8,128,195,195,15,224,183,13,227,152,2,230,231,8,230,91,21,+224,199,0,130,73,0,54,98,73,2,85,32,75,71,103,67,26,101,97,197,+103,64,33,235,115,40,247,63,3,64,0,227,18,4,162,108,237,108,3,226,+119,9,226,96,1,189,183,161,246,224,16,1,224,13,13,203,22,160,89,226,+186,11,224,47,6,225,134,1,192,54,96,108,244,216,7,96,73,198,204,160,+93,237,226,1,162,54,227,23,7,0,82,229,151,3,224,23,2,224,51,19,+2,66,32,82,79,33,0,56,65,4,229,118,1,128,5,226,150,9,2,109,+97,120,97,108,162,152,224,31,9,1,105,110,224,31,2,226,41,5,113,158,+133,176,194,160,98,154,237,138,1,195,215,101,189,165,151,0,52,64,180,229,+67,8,226,171,3,162,53,138,33,129,185,225,142,0,239,173,14,225,175,1,+160,135,0,50,154,162,254,52,0,128,26,196,195,99,75,78,187,161,156,129,+154,193,152,226,92,6,147,42,160,12,1,49,52,147,207,161,229,166,129,1,+95,57,242,180,1,146,75,1,49,52,147,154,70,152,100,16,198,145,0,67,+80,202,254,13,1,1,95,50,99,151,4,32,95,57,56,49,192,20,64,60,+70,170,193,71,93,65,254,253,1,226,93,2,160,117,226,220,0,228,34,2,+161,114,240,95,8,224,157,5,96,0,65,107,138,194,0,85,131,100,195,40,+95,206,0,50,224,169,0,225,90,0,1,49,49,148,135,197,178,193,205,147,+67,0,57,128,185,64,11,64,229,64,14,160,20,224,127,3,192,208,64,123,+139,27,2,85,32,90,199,192,64,20,170,241,132,49,229,22,1,65,179,103,+152,0,50,101,2,128,43,136,62,225,3,3,97,0,64,171,252,38,3,228,+223,0,129,32,252,42,35,224,235,2,224,58,9,245,194,4,252,84,6,0,+58,100,216,128,202,253,241,73,64,200,134,38,244,36,0,98,245,64,243,140,+142,139,101,224,54,1,160,200,2,52,48,55,174,136,160,22,224,81,50,160,+77,192,237,136,165,129,98,192,58,222,23,171,251,0,54,254,23,5,68,112,+9,66,32,95,57,55,57,32,95,57,51,127,212,227,10,1,181,147,0,89,+105,79,64,113,231,44,11,0,90,97,89,170,43,167,62,0,89,231,62,4,+64,24,224,57,1,64,1,233,117,0,136,19,226,241,0,66,169,248,127,1,+224,0,0,64,218,137,50,228,144,0,160,8,228,121,3,228,156,15,229,162,+1,251,137,0,198,13,224,2,1,96,40,224,76,1,251,201,1,224,39,6,+251,201,11,224,37,0,124,37,128,29,96,68,224,61,16,160,62,224,29,7,+96,2,67,232,229,63,6,64,0,229,63,1,229,44,15,249,107,1,192,22,+224,208,0,135,32,160,218,227,166,2,1,51,55,109,254,226,138,2,237,153,+7,229,167,0,128,56,0,57,102,244,97,110,1,49,51,96,11,0,67,250,+48,2,224,64,2,224,165,2,110,88,224,5,4,163,130,242,230,5,229,212,+0,96,118,0,53,86,195,64,0,225,23,0,248,155,10,64,8,239,93,3,+225,35,4,64,150,160,57,233,188,21,100,175,1,55,51,202,130,165,37,69,+83,145,204,238,206,1,225,166,2,230,163,2,163,88,224,100,43,167,119,192,+95,96,77,163,44,70,156,230,169,1,192,48,249,37,3,192,51,224,243,2,+224,2,0,172,185,128,160,193,91,224,18,6,194,22,226,204,5,224,60,11,+233,73,2,226,31,1,221,240,231,205,6,195,205,98,234,193,211,197,119,68,+112,175,147,64,249,200,241,64,22,134,30,100,230,150,116,249,133,0,162,122,+225,62,11,160,71,231,163,7,225,120,6,236,20,4,64,107,98,90,128,35,+233,57,2,239,103,6,160,105,96,12,229,168,0,225,41,3,224,2,6,193,+76,224,246,3,225,84,18,252,20,8,225,99,90,133,17,225,99,59,225,10,+9,227,201,2,230,191,1,164,103,225,128,8,162,211,227,221,77,64,10,245,+138,1,227,236,48,227,237,8,224,12,3,128,166,175,120,238,204,3,246,5,+15,192,63,171,77,192,69,227,231,8,96,159,129,183,232,55,5,228,64,20,+228,29,11,226,184,3,192,39,65,123,65,102,130,59,114,60,104,93,233,128,+1,10,114,101,99,83,101,108,69,114,114,111,114,137,125,241,190,6,234,210,+6,250,12,0,71,162,0,54,232,125,1,64,210,224,40,1,124,192,224,99,+1,2,103,101,116,206,92,224,77,3,64,66,142,172,224,42,1,6,115,101,+116,70,105,101,108,77,1,64,30,140,149,224,30,1,13,68,97,116,97,46,+82,101,99,111,114,100,115,46,83,224,43,5,139,85,224,117,4,224,30,3,+138,248,224,74,14,2,72,97,115,224,43,3,139,15,163,167,0,54,128,241,+187,124,64,30,235,2,1,160,28,128,6,0,58,128,33,107,94,230,218,2,+225,200,7,227,103,16,64,63,137,208,66,80,107,251,0,54,128,85,137,11,+78,133,83,148,98,135,162,89,234,191,0,96,66,234,191,15,98,130,67,99,+128,210,128,156,192,23,224,1,1,233,81,17,230,50,8,160,11,192,31,128,+85,226,238,1,230,154,3,248,111,2,224,43,2,192,5,131,200,0,49,140,+180,253,160,9,163,10,251,106,0,105,185,226,205,1,1,51,57,119,198,4,+49,48,51,56,32,145,105,97,92,150,224,128,51,118,238,64,135,1,64,90,+150,183,160,6,64,4,160,10,2,95,49,55,226,174,3,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,55,54,58,50,53,241,48,0,100,206,+1,51,57,81,135,237,112,5,192,238,225,98,2,141,211,225,16,4,100,23,+165,66,192,2,171,27,96,93,192,247,97,98,224,5,4,170,199,224,92,0,+124,153,229,170,7,224,17,9,234,184,0,192,56,225,39,19,224,61,7,235,+83,0,215,236,224,21,0,233,224,3,224,247,5,234,130,21,160,44,231,5,+4,199,2,1,48,53,86,48,67,7,192,40,192,114,229,149,0,235,6,1,+174,175,194,52,134,224,239,153,12,230,234,18,224,175,3,2,95,51,56,96,+47,103,65,0,57,229,182,2,237,33,1,206,100,128,253,133,225,162,124,225,+78,12,225,85,0,192,201,237,5,4,119,115,128,0,225,90,0,178,103,129,+97,134,252,128,108,173,102,192,171,139,65,65,5,0,50,81,205,96,124,165,+239,229,211,3,165,193,226,238,1,7,110,111,77,101,116,104,111,100,230,3,+2,235,142,0,224,248,22,130,72,226,85,5,160,13,224,23,4,190,251,206,+17,224,248,10,225,36,12,193,13,163,164,0,51,133,62,195,180,2,55,55,+52,241,106,4,211,6,224,162,25,232,88,1,226,245,18,66,7,251,201,5,+101,200,163,149,224,161,6,165,189,0,54,165,167,146,43,96,5,3,95,57,+57,55,82,111,240,245,4,11,80,114,105,109,105,116,105,118,101,115,46,61,+191,87,64,62,135,12,64,102,64,10,101,177,229,233,1,143,86,233,57,0,+242,217,6,224,25,19,96,91,135,73,227,144,0,96,25,224,11,2,192,8,+97,141,64,47,135,77,99,85,64,76,1,57,54,242,150,0,0,83,72,119,+73,64,1,51,57,93,117,1,49,54,131,58,195,148,1,95,52,102,235,0,+49,185,229,64,75,135,122,5,95,51,54,57,32,75,114,246,224,1,5,118,+105,96,0,224,25,7,128,1,230,101,0,224,34,15,224,32,3,224,29,20,+2,95,57,54,136,189,160,152,135,231,135,173,231,73,0,99,36,254,122,1,+105,47,1,64,85,130,188,133,168,230,215,9,4,95,49,51,56,57,166,203,+231,68,13,164,142,96,38,230,231,12,106,7,228,236,5,64,162,232,107,2,+224,88,5,1,49,48,150,143,228,251,1,132,171,129,127,64,59,64,106,130,+79,225,193,1,0,67,225,188,0,0,56,122,166,129,188,64,44,168,121,225,+164,5,250,152,2,225,86,18,225,149,54,224,26,17,224,23,14,224,20,11,+224,17,8,224,14,5,225,249,3,96,0,64,242,201,86,199,150,1,48,50,+99,221,251,94,8,68,122,0,52,65,221,165,131,225,248,2,101,125,0,49,+74,252,96,15,77,212,166,129,96,41,224,67,1,71,157,243,137,1,65,127,+165,173,226,46,6,0,55,180,136,224,61,4,64,46,0,52,160,12,234,91,+0,244,43,1,64,43,134,198,74,185,64,44,0,53,138,42,195,147,226,219,+1,98,140,95,179,66,63,246,149,1,84,5,248,69,2,224,226,3,2,95,+57,55,151,38,232,180,6,65,64,0,54,161,64,0,89,198,243,65,110,69,+227,169,252,165,62,245,128,5,129,135,224,33,18,129,133,198,39,224,190,4,+192,25,0,85,224,219,1,131,54,224,186,1,224,49,5,160,109,181,110,64,+43,199,232,224,44,11,224,43,1,229,119,1,171,226,229,233,0,64,247,197,+168,139,84,128,188,232,145,6,232,205,0,0,95,65,50,128,13,98,1,96,+34,139,139,128,125,225,205,0,96,160,70,55,0,51,128,231,243,103,0,224,+96,33,1,49,51,64,97,128,103,233,161,2,224,56,40,96,148,233,137,5,+129,28,1,95,52,100,192,161,7,230,84,1,86,0,242,137,1,195,119,199,+102,0,80,139,173,66,156,0,51,249,209,3,224,252,18,1,95,51,223,238,+232,67,0,231,196,0,128,208,160,224,241,57,4,192,178,89,98,192,73,64,+0,234,54,1,224,60,0,241,116,9,224,52,5,224,112,2,96,48,234,158,+6,224,44,4,225,103,3,224,39,1,224,36,5,0,66,96,35,224,234,10,+1,95,51,101,176,131,98,224,6,1,162,114,65,102,135,139,138,105,227,103,+0,96,78,0,64,224,113,2,227,79,16,144,230,227,146,19,131,213,160,197,+224,33,12,243,173,0,160,230,227,51,1,227,52,2,228,150,5,69,11,97,+194,228,250,5,66,8,0,50,76,3,228,129,4,227,210,4,128,71,64,49,+151,18,224,87,9,145,232,96,73,160,17,203,215,228,165,4,225,25,0,161,+49,224,208,1,160,87,131,233,231,216,0,64,105,182,177,139,104,76,174,128,+76,99,62,134,43,249,105,2,1,55,52,66,219,224,127,1,227,115,11,129,+246,224,205,1,160,34,160,231,224,28,7,225,3,32,134,40,64,8,131,47,+224,249,3,225,113,5,161,155,238,71,2,108,25,224,91,15,100,118,0,67,+250,56,5,224,16,11,231,37,7,97,142,1,51,51,234,231,3,5,102,117,+110,100,101,112,106,224,0,90,238,246,12,226,24,4,98,157,226,132,3,128,+8,235,160,14,129,177,224,184,3,76,181,106,165,226,24,2,194,98,224,45,+11,0,49,163,120,224,46,10,224,171,9,226,251,11,131,88,193,94,225,184,+4,224,101,0,96,102,224,149,15,96,0,226,128,1,231,14,14,96,42,227,+190,18,212,72,224,159,8,192,24,160,159,224,255,10,136,171,224,152,11,224,+78,10,231,124,2,226,193,3,227,41,5,226,211,0,252,201,2,1,95,57,+71,49,64,33,212,188,0,51,181,123,224,217,1,196,118,227,165,4,193,187,+231,103,0,227,169,57,225,122,2,129,17,227,137,16,224,201,9,64,99,193,+211,162,27,227,20,6,224,172,133,0,56,96,61,234,121,9,160,172,224,187,+8,226,248,6,229,169,2,76,21,160,142,228,236,0,70,153,141,217,128,192,+0,80,179,129,128,139,0,32,136,191,64,36,213,77,229,108,1,248,233,6,+108,251,1,51,48,168,36,94,147,1,48,51,64,186,74,208,241,151,0,226,+114,2,252,90,4,193,81,1,48,53,231,139,9,128,152,229,127,8,227,170,+3,225,245,29,96,27,229,107,1,253,175,4,69,5,1,57,53,103,214,225,+197,4,1,52,50,97,14,229,139,13,227,140,7,197,116,1,49,48,73,95,+3,95,49,48,52,78,10,231,32,4,224,92,5,0,49,165,185,224,92,10,+234,94,1,228,145,13,160,124,0,54,133,234,138,101,224,122,19,96,0,65,+200,238,139,1,173,86,225,233,6,65,16,226,14,3,227,190,1,224,36,3,+142,104,0,83,64,99,71,199,160,119,64,25,237,143,1,1,80,32,132,109,+0,80,128,24,0,54,224,24,3,100,213,160,24,235,136,1,96,26,197,144,+224,112,5,202,165,0,90,65,10,2,90,32,64,83,80,64,23,208,226,232,+157,14,130,230,64,40,226,229,3,96,103,162,71,225,9,14,96,51,194,244,+237,15,0,97,136,235,31,2,238,95,4,1,50,51,251,12,2,129,191,192,+13,111,130,234,84,2,229,119,8,194,248,197,59,192,96,231,157,5,161,245,+161,238,224,104,5,136,23,227,53,0,224,29,0,238,193,5,224,40,2,236,+79,4,232,87,0,4,95,49,49,51,50,244,108,5,100,195,103,100,65,9,+2,95,50,50,67,220,68,76,96,26,5,57,53,32,85,32,65,160,91,232,+32,11,97,73,130,117,5,95,57,57,56,32,58,128,59,64,14,85,184,250,+102,6,243,85,2,8,67,111,110,115,116,114,97,105,110,154,120,64,55,130,+118,64,181,66,153,96,100,130,68,66,132,96,25,64,23,66,178,0,85,128,+22,0,54,96,22,136,131,131,76,248,132,0,224,245,3,96,26,224,5,0,+96,233,205,175,212,109,161,141,231,210,7,164,170,167,214,224,39,11,226,103,+2,231,141,8,224,27,2,131,238,98,222,244,179,1,0,83,98,8,225,203,+0,147,100,230,69,5,96,177,249,158,5,64,26,1,67,32,245,67,28,160,+75,233,160,16,224,141,0,228,135,3,78,39,224,15,1,148,209,68,157,181,+87,0,83,86,237,150,243,181,239,160,75,245,112,10,128,98,225,23,8,195,+12,0,85,64,144,128,37,169,59,184,184,129,15,232,103,10,160,25,254,139,+0,225,54,1,128,11,161,81,224,27,0,244,185,0,225,11,0,225,87,17,+193,88,160,0,224,105,83,128,29,201,79,146,217,2,51,53,55,246,16,1,+250,38,0,160,0,244,236,8,96,55,244,198,13,128,126,140,63,126,124,244,+202,7,103,59,118,253,244,225,7,166,157,0,90,142,195,236,58,5,227,92,+0,104,3,0,51,118,58,70,137,65,204,228,22,3,64,117,247,245,3,82,+202,0,50,64,76,0,80,65,237,250,85,1,226,84,1,255,40,7,67,217,+230,53,3,252,243,15,195,195,65,136,64,117,177,184,114,15,174,213,95,203,+64,228,192,86,247,98,5,253,76,16,225,212,1,243,251,13,224,35,5,75,+61,140,63,96,22,226,202,0,227,220,1,157,17,96,8,64,168,64,67,131,+167,70,231,103,215,84,21,195,72,227,140,2,169,64,137,1,249,239,1,224,+212,1,224,70,18,96,240,199,64,196,129,227,141,1,210,38,0,95,86,132,+3,95,57,56,49,64,4,225,41,1,231,80,1,224,56,1,1,66,32,224,+52,22,255,148,1,248,145,17,73,134,248,145,16,0,51,147,251,64,75,134,+83,98,60,3,75,52,32,90,224,1,0,192,221,96,37,64,46,248,183,13,+227,141,0,224,1,11,227,229,1,224,34,14,224,32,3,224,29,20,224,26,+17,224,23,14,224,20,11,246,249,6,64,215,199,10,1,95,57,73,177,107,+114,96,23,135,8,67,209,157,21,0,51,84,249,64,24,0,54,129,8,1,+49,51,119,37,90,75,231,117,1,2,100,102,108,103,100,64,39,131,88,228,+35,1,228,152,1,131,142,105,238,227,143,3,130,97,247,38,16,235,45,24,+0,51,85,250,170,178,0,57,212,153,64,68,255,102,6,2,95,49,50,165,+31,230,217,1,233,155,2,227,233,0,64,19,166,71,214,56,235,77,4,198,+169,245,154,0,96,246,131,248,201,227,75,88,236,209,25,96,209,248,116,2,+64,203,64,8,64,79,131,87,244,72,3,237,37,22,179,192,96,68,161,203,+131,98,231,179,0,233,199,3,64,37,68,116,225,31,1,64,48,131,94,231,+225,1,224,9,1,161,205,232,224,0,228,128,1,224,25,1,104,19,226,127,+0,232,196,11,231,133,2,224,46,20,94,187,224,47,5,201,32,224,47,14,+208,73,224,92,0,134,71,224,47,16,198,58,224,198,8,233,173,16,169,174,+64,24,232,110,9,224,28,2,239,247,2,235,169,20,229,131,2,226,119,0,+96,39,225,164,6,175,190,96,26,235,27,3,248,242,2,224,32,0,224,152,+8,224,231,0,128,31,104,107,224,36,0,193,39,96,29,240,154,7,192,119,+67,193,64,19,99,187,68,3,231,95,1,66,131,2,54,49,56,98,89,0,+54,67,246,77,204,198,189,98,168,69,227,228,36,1,1,36,120,158,229,192,+143,197,246,129,176,227,255,4,241,9,5,0,52,238,230,10,2,95,49,48,+177,61,225,185,0,251,174,6,2,48,55,53,64,131,239,160,1,226,24,0,+174,237,225,128,1,224,252,13,172,169,1,48,56,227,155,0,231,154,0,226,+102,31,197,116,225,158,15,224,31,5,97,158,241,29,4,225,24,6,97,84,+73,183,239,160,9,224,142,1,225,9,7,96,94,224,170,2,77,161,66,56,+135,230,0,49,64,228,128,37,225,148,0,226,154,3,225,19,5,10,66,32,+95,56,56,50,32,95,53,52,55,64,4,71,110,161,20,136,35,0,80,237,+147,2,2,79,32,35,74,2,167,77,231,84,1,227,207,5,225,53,11,160,+144,225,100,1,224,40,15,237,66,1,224,40,8,235,218,5,252,27,0,225,+102,10,226,5,8,225,111,3,160,70,2,95,49,50,68,98,66,150,0,50,+93,62,142,222,0,56,101,122,236,143,1,140,92,193,108,131,60,160,5,64,+3,224,117,1,224,114,6,224,120,9,67,59,163,186,128,179,224,183,0,224,+67,21,224,73,20,224,74,2,224,76,0,229,0,5,234,12,1,202,92,224,+51,0,226,83,8,66,70,128,11,224,66,11,194,142,236,194,7,226,151,7,+129,44,128,168,192,79,229,26,6,192,69,160,66,97,72,224,78,0,236,245,+4,2,95,49,49,158,219,160,31,229,47,5,0,56,230,36,0,64,0,199,+237,224,178,4,229,123,5,163,25,224,141,5,229,168,15,160,44,224,120,23,+64,29,235,39,4,225,171,5,164,234,228,107,2,224,48,23,71,196,224,48,+4,227,94,0,227,12,16,161,45,128,26,228,115,10,86,117,0,55,172,110,+224,77,0,225,130,2,195,186,225,133,0,130,75,225,81,2,96,123,228,142,+1,192,58,68,247,67,24,235,98,0,192,182,173,174,96,221,199,38,64,7,+230,59,1,19,98,97,100,32,102,105,110,97,108,32,100,111,32,115,116,97,+116,101,109,101,177,215,226,95,4,235,148,8,160,16,228,34,0,232,122,3,+228,138,2,229,198,7,144,204,224,74,5,233,219,0,225,128,0,65,127,164,+131,233,43,0,192,245,160,2,224,29,3,218,216,96,90,96,101,224,8,43,+100,142,230,139,2,239,142,1,227,197,7,226,171,0,192,66,96,68,135,171,+227,125,1,192,15,128,32,238,217,4,109,85,0,53,185,192,238,20,3,160,+0,128,50,160,125,232,31,9,224,33,4,0,67,134,58,192,22,193,33,227,+79,2,76,89,225,71,0,174,115,128,164,135,177,96,36,107,211,0,50,133,+208,65,126,96,8,168,142,103,217,128,56,66,197,134,138,1,55,52,180,122,+224,58,3,97,222,129,204,96,253,192,247,103,96,77,26,252,190,2,2,97,+105,108,162,103,64,173,1,95,56,64,165,1,95,57,131,119,226,160,2,2,+105,110,100,160,38,64,141,231,23,0,199,181,224,84,5,2,62,62,61,128,+44,233,38,11,0,98,194,214,193,32,226,83,0,226,8,5,226,17,13,229,+188,1,160,34,225,242,65,225,111,0,224,209,12,225,36,0,230,153,9,234,+199,4,78,90,0,57,101,17,224,79,0,160,0,128,142,243,16,2,196,156,+160,2,224,24,1,232,6,4,160,66,228,248,11,224,39,4,172,83,229,32,+24,169,148,224,130,2,224,211,11,225,119,9,96,17,0,66,64,87,64,216,+239,31,4,9,70,114,111,109,84,104,101,110,84,111,226,74,2,0,66,177,+86,1,39,66,116,240,227,55,4,224,125,23,224,119,0,160,72,224,115,18,+162,104,224,101,83,160,213,224,99,13,225,151,24,230,184,31,237,100,2,224,+179,12,192,173,64,18,224,169,14,96,167,224,159,4,224,77,2,196,18,227,+110,0,232,172,4,228,150,0,86,189,165,115,192,124,64,50,144,142,224,144,+1,233,132,11,96,22,232,27,2,135,107,0,52,200,247,163,187,230,162,3,+224,17,1,225,20,2,97,19,224,14,0,128,1,224,109,0,213,49,160,80,+194,148,204,77,232,229,6,132,14,2,49,50,49,68,1,82,12,117,181,1,+49,48,95,171,225,32,3,224,216,4,103,162,97,97,244,172,0,193,15,101,+127,193,44,177,39,128,41,224,147,0,224,81,1,224,136,1,102,62,96,132,+235,98,13,171,97,97,217,128,99,213,216,0,50,83,214,224,85,5,64,158,+2,95,49,51,116,169,224,51,13,237,53,0,197,166,128,60,228,121,2,200,+212,193,245,231,74,14,249,54,6,161,96,169,43,141,94,116,111,225,89,10,+97,73,226,11,4,0,66,141,87,97,48,0,56,97,144,224,0,0,224,159,+10,225,240,11,194,185,231,84,1,243,128,5,224,164,39,226,243,0,226,50,+9,0,54,239,138,1,205,29,97,187,224,208,0,192,205,110,38,224,202,2,+96,0,229,211,1,234,75,7,229,177,11,160,46,192,213,192,51,224,48,10,+161,52,227,68,0,228,114,15,171,144,224,87,5,64,44,96,7,224,41,3,+128,187,193,125,229,238,1,128,84,235,61,6,97,110,225,42,1,97,166,65,+124,112,198,1,56,51,240,198,13,237,232,7,226,120,5,161,205,224,29,0,+226,117,8,225,209,8,226,164,0,225,218,2,128,138,2,49,48,56,99,185,+136,198,0,52,103,220,192,123,225,185,2,1,95,53,140,133,224,149,0,236,+127,1,96,70,227,95,7,226,115,7,237,24,5,208,56,226,237,5,200,2,+96,0,225,134,4,202,189,225,140,11,245,142,5,229,131,6,229,111,10,224,+42,5,165,4,235,190,4,246,130,0,160,107,226,235,6,160,17,226,236,3,+68,205,0,51,188,169,224,213,8,234,225,1,192,30,192,129,192,13,108,143,+192,24,249,253,10,193,213,233,244,1,160,2,128,23,224,18,4,129,248,160,+48,230,56,1,96,2,182,156,224,69,4,96,18,224,39,4,224,152,2,198,+247,149,222,227,162,6,224,2,0,192,157,224,193,1,160,57,225,164,1,233,+209,2,224,58,3,224,153,0,224,67,27,248,172,2,224,35,3,194,104,247,+159,6,224,39,8,129,112,224,19,3,238,23,0,238,234,5,225,238,5,160,+54,128,137,228,109,2,225,59,0,224,135,0,192,196,224,114,8,192,14,96,+53,243,234,4,224,245,9,224,50,6,64,86,161,123,224,70,3,98,221,224,+75,5,226,35,0,224,244,22,224,79,69,225,2,6,194,44,0,83,64,72,+152,139,158,91,67,30,226,3,0,224,46,3,224,40,11,193,192,2,95,49,+51,208,151,224,0,1,229,88,16,100,193,131,227,237,185,19,8,114,111,109,+83,116,114,105,110,103,246,119,0,224,219,5,224,95,5,237,50,2,228,193,+5,1,49,50,134,135,192,60,225,185,8,223,181,227,105,6,228,159,2,213,+115,87,49,173,138,224,0,2,224,88,1,226,224,8,227,76,1,224,125,10,+224,191,2,229,5,11,226,206,83,225,171,0,224,50,16,193,241,225,243,6,+86,25,65,248,229,253,1,193,53,64,161,162,6,112,12,86,6,64,6,0,+50,64,12,234,210,1,226,23,61,6,82,97,116,105,111,110,97,207,217,226,+25,153,226,27,10,228,82,0,224,39,5,227,183,1,228,235,7,226,34,16,+226,35,13,230,116,0,224,131,2,229,189,0,224,113,13,192,1,226,47,17,+224,56,12,230,36,6,224,121,1,224,45,4,0,83,226,75,7,1,49,51,+145,219,96,0,237,59,4,224,67,36,225,117,1,224,135,2,233,116,7,225,+10,8,224,73,11,235,179,0,224,56,5,227,4,8,1,49,51,107,231,96,+0,228,249,1,227,8,21,0,49,90,205,0,51,238,42,4,251,195,4,67,+84,141,63,0,56,73,90,128,48,168,78,0,67,75,217,96,20,1,51,52,+171,83,224,108,13,224,58,9,128,0,227,113,58,6,73,110,116,101,103,101,+114,227,112,150,193,141,79,153,3,75,32,95,50,156,133,0,57,64,54,161,+16,64,72,252,156,2,0,49,143,2,224,171,6,65,237,64,23,2,95,49,+49,171,38,233,137,2,128,47,64,1,0,83,167,160,233,39,3,233,33,1,+224,228,1,233,27,13,192,29,193,199,233,21,9,192,33,129,36,225,33,2,+226,210,0,226,70,0,169,252,193,30,148,230,226,56,1,0,57,239,50,0,+224,119,18,232,227,8,224,119,59,229,248,2,216,149,80,13,248,161,0,64,+0,228,190,4,217,206,228,204,1,225,59,1,203,182,64,117,137,7,224,28,+2,182,39,0,85,131,39,237,248,5,233,56,1,226,148,9,0,50,96,43,+254,31,10,229,79,3,128,91,161,54,224,115,1,160,49,225,46,2,231,212,+22,238,48,1,225,100,5,192,160,225,7,8,227,67,33,227,51,1,227,60,+5,226,187,1,192,208,241,5,1,241,14,4,254,119,21,224,85,0,225,236,+1,2,49,48,51,208,27,192,95,128,74,224,104,9,225,115,7,190,181,226,+133,1,195,77,128,99,229,195,7,226,163,0,188,32,192,84,120,19,251,172,+2,163,200,1,49,49,67,243,160,75,85,164,0,80,244,49,0,97,46,0,+90,224,53,6,1,64,64,228,76,0,0,95,77,199,68,43,231,159,3,225,+172,9,228,14,0,237,131,6,4,32,95,55,54,55,104,241,207,131,192,202,+161,100,228,62,4,1,95,53,167,1,226,53,4,226,47,5,1,50,51,247,+235,2,96,127,192,108,224,41,4,2,83,32,73,184,105,130,232,225,48,5,+242,169,5,0,85,67,186,97,63,208,221,3,64,95,51,56,131,5,1,49,+48,240,60,1,226,0,5,197,121,96,0,67,225,69,105,0,80,64,7,70,+224,223,76,226,180,9,97,144,0,48,114,153,116,19,0,52,106,12,225,34,+1,225,241,0,241,24,4,226,23,1,129,175,164,47,64,160,64,8,240,241,+5,185,1,224,182,1,98,24,0,50,111,230,186,153,3,95,49,53,52,64,+4,252,150,4,22,116,99,69,120,112,114,58,32,99,97,110,110,111,116,32,+104,97,110,100,108,101,58,32,134,228,116,212,68,206,116,211,3,51,32,95,+57,97,26,244,216,4,224,92,9,4,79,32,35,51,50,194,109,160,55,102,+75,96,0,224,60,3,2,58,49,51,90,133,1,10,65,192,67,1,48,57,+113,153,3,48,57,52,32,64,28,65,30,1,10,65,97,5,240,245,11,96,+21,230,200,2,0,48,87,46,181,173,0,57,98,130,131,155,64,73,0,56,+128,102,1,57,56,96,23,1,48,56,128,95,0,55,224,21,5,0,55,128,+21,0,54,224,21,4,72,111,64,21,0,53,96,21,225,57,1,13,80,114,+105,109,105,116,105,118,101,115,46,87,111,114,91,58,64,37,0,52,224,81,+5,0,57,128,21,0,51,192,228,1,49,51,201,3,64,12,137,16,0,49,+96,101,97,32,64,14,65,70,140,45,0,95,65,18,1,51,49,82,230,236,+69,0,96,38,64,82,0,50,224,82,5,0,50,137,28,65,120,224,68,1,+64,44,74,240,201,188,5,57,49,52,32,95,53,218,186,0,51,166,168,224,+31,17,149,202,224,31,14,68,37,3,49,51,52,48,124,167,117,39,0,54,+143,53,192,57,162,62,224,223,2,98,178,96,244,64,174,2,64,95,57,73,+239,224,21,10,138,90,224,59,4,160,110,128,230,224,45,1,4,95,49,56,+51,32,164,167,2,38,48,46,197,92,224,56,3,224,45,13,224,44,31,96,+36,192,44,65,119,0,49,97,119,0,83,224,1,1,2,39,32,95,65,140,+208,172,133,252,64,9,96,27,176,98,96,5,224,11,3,64,118,0,57,100,+174,6,80,32,64,85,32,65,32,76,202,250,114,0,229,49,2,0,39,96,+36,199,186,64,57,0,55,125,238,128,51,97,59,0,50,64,65,250,14,1,+0,95,64,163,224,32,17,96,169,224,38,26,224,34,29,224,244,95,0,49,+67,6,224,245,126,224,246,11,230,226,4,160,17,198,207,224,246,19,224,184,+27,224,144,27,0,85,128,123,64,106,71,44,76,202,98,148,224,232,19,224,+51,9,3,49,51,50,57,224,53,28,0,90,223,211,224,60,3,1,49,51,+224,59,18,136,148,226,186,18,227,202,3,233,177,0,224,94,4,226,247,19,+224,94,36,67,199,134,119,0,66,93,12,128,106,204,182,237,200,3,128,27,+98,55,0,49,69,196,160,76,224,108,18,64,13,192,108,201,90,234,217,2,+64,97,226,217,0,224,93,2,69,63,224,92,44,225,133,31,128,58,224,185,+42,235,54,2,194,244,226,90,14,160,98,224,32,25,138,62,225,119,2,64,+36,143,151,160,199,96,52,70,77,192,52,224,15,11,0,51,71,222,224,85,+0,0,58,131,100,69,155,160,177,193,103,0,89,208,101,129,109,225,225,17,+72,164,64,181,65,134,128,179,225,48,10,160,24,225,39,5,131,244,65,220,+72,188,64,20,125,239,96,165,227,81,3,192,85,224,25,17,64,198,168,171,+97,11,134,145,0,54,135,215,226,193,0,224,125,1,64,47,168,197,224,47,+13,96,162,224,47,5,0,54,193,38,5,66,32,64,115,101,113,98,154,0,+32,96,8,76,37,96,34,136,236,0,83,96,84,0,49,190,122,65,5,64,+15,108,247,224,138,0,64,45,136,244,4,85,32,90,32,90,130,195,64,20,+136,243,2,102,47,32,64,12,136,173,65,90,224,33,2,135,74,71,61,169,+12,0,55,232,5,1,233,31,0,72,114,224,19,6,0,52,103,175,224,18,+0,1,50,56,98,112,224,18,7,97,95,224,20,8,233,45,1,233,95,5,+232,128,2,96,155,132,30,3,85,32,75,52,224,177,2,65,176,100,52,97,+190,64,56,0,64,99,19,1,95,54,111,56,64,33,161,187,160,211,156,103,+94,90,64,6,0,56,128,6,70,10,137,84,0,52,106,36,110,205,168,98,+112,24,224,204,3,76,197,115,125,0,54,128,184,224,43,2,224,39,2,1,+38,49,136,160,160,25,160,14,64,28,0,54,106,128,64,35,96,206,171,74,+128,140,1,80,32,128,40,128,162,128,59,192,73,2,64,89,32,82,65,160,+80,198,232,224,211,1,0,50,227,166,0,64,74,128,16,0,95,222,8,161,+45,0,54,96,116,3,105,116,111,102,66,3,64,49,97,26,0,56,74,72,+65,11,67,176,192,211,64,7,128,138,79,23,64,6,98,193,0,51,77,188,+1,95,53,224,39,2,1,54,48,224,11,0,64,84,130,122,2,102,62,61,+96,98,162,115,0,62,96,12,130,115,1,102,60,128,26,130,108,1,102,60,+96,12,129,221,3,102,110,101,103,64,14,65,145,64,14,0,42,96,12,129,+193,1,102,45,96,12,129,55,1,102,43,96,12,128,207,142,121,193,255,237,+165,0,226,8,3,226,15,1,67,51,3,10,65,32,73,96,63,128,171,128,+63,239,4,0,64,8,163,117,69,185,130,116,0,50,100,19,64,18,128,196,+65,138,113,250,0,85,97,206,68,168,96,21,243,109,1,101,64,101,159,101,+92,224,2,0,97,144,128,114,242,73,6,193,171,160,143,224,198,0,175,53,+224,30,5,239,117,0,83,4,161,1,205,143,2,95,49,48,184,220,181,193,+224,86,19,139,218,224,86,49,130,139,192,218,192,25,128,104,135,84,233,142,+0,243,64,19,225,56,6,224,32,3,146,91,166,249,224,32,11,145,37,224,+219,10,192,24,111,174,70,205,0,57,111,242,3,49,48,56,53,118,84,214,+193,111,190,160,203,96,43,224,27,11,224,95,10,198,58,224,51,8,193,84,+230,203,0,243,161,9,224,53,10,161,225,224,25,10,240,255,1,208,116,66,+116,163,52,239,0,11,2,73,110,116,142,255,64,58,224,36,4,3,68,97,+116,97,64,30,87,57,4,95,84,121,112,101,192,12,160,47,163,109,224,84,+11,5,70,108,111,97,116,87,160,39,131,136,241,139,1,134,189,145,144,1,+95,52,111,232,181,121,64,45,0,54,96,45,239,133,0,143,193,93,170,224,+107,15,2,67,104,97,192,145,239,193,4,2,48,56,51,128,21,131,154,194,+179,225,156,1,98,178,68,233,80,149,151,73,224,26,4,242,199,4,66,14,+128,22,242,140,2,67,252,128,181,131,235,233,21,0,242,12,2,2,95,49,+48,134,14,237,21,2,224,90,2,73,113,1,56,51,192,14,64,94,1,50,+55,82,102,97,22,96,14,64,24,133,209,70,203,227,30,1,161,80,164,40,+197,230,185,241,66,66,166,252,160,6,224,249,0,65,26,66,142,128,188,160,+29,104,243,160,37,128,162,65,24,4,95,49,50,53,54,192,140,96,142,241,+200,1,224,181,1,65,29,162,144,65,177,0,48,129,117,168,33,1,54,57,+69,244,1,50,57,145,77,64,28,66,11,4,32,67,32,80,32,66,184,0,+79,178,108,5,90,32,95,56,56,56,224,106,1,0,75,71,31,150,210,224,+10,1,0,58,128,71,175,195,0,80,64,228,97,81,242,94,4,73,72,160,+69,225,242,1,0,90,161,120,225,123,5,242,109,8,194,17,245,95,4,1,+95,55,192,221,225,194,0,242,207,5,147,167,192,106,196,199,148,164,64,48,+194,84,197,37,244,40,3,224,149,0,98,135,128,127,1,49,57,185,246,160,+67,2,32,95,50,71,16,96,7,65,110,0,52,123,199,224,15,8,212,171,+64,191,163,85,243,175,2,227,58,1,12,101,120,105,115,116,101,110,116,105,+97,108,115,32,84,56,25,97,108,108,111,119,101,100,32,105,110,32,112,97,+116,116,101,114,110,32,98,105,110,100,105,110,103,251,47,0,227,23,14,97,+64,71,91,225,58,15,0,57,252,149,1,0,64,74,97,246,184,5,224,17,+8,65,224,132,85,107,250,64,83,167,24,172,2,160,5,96,18,161,78,246,+45,3,133,101,193,54,101,78,165,254,75,219,193,167,248,41,4,129,51,245,+223,1,0,56,84,243,0,56,156,233,252,67,2,2,99,110,83,161,12,195,+118,225,208,2,248,28,2,225,244,0,195,63,0,56,97,199,227,229,5,66,+117,129,23,98,52,206,93,96,12,225,15,4,64,93,199,94,231,102,2,224,+34,3,228,5,0,88,40,192,32,65,135,1,55,57,73,121,218,21,240,210,+3,0,56,67,133,128,49,68,85,160,36,182,134,132,43,97,62,109,211,128,+197,73,11,192,107,64,104,131,19,164,87,160,6,128,0,64,57,67,8,225,+176,0,165,16,227,49,2,96,84,192,43,128,105,225,70,5,125,196,65,146,+225,128,4,0,68,226,141,0,160,158,161,203,193,136,131,66,116,239,0,54,+228,73,2,225,178,11,249,216,13,248,220,2,225,98,18,240,17,0,136,178,+200,135,227,244,0,192,246,224,76,1,0,67,64,15,128,72,128,14,96,56,+96,19,68,13,68,210,128,92,129,130,161,78,197,182,229,190,0,226,91,6,+224,58,18,228,166,0,225,233,25,225,210,22,227,19,9,64,0,64,197,188,+151,227,142,0,128,217,67,106,129,72,225,215,2,131,9,0,48,162,138,219,+214,67,235,136,25,96,76,228,97,4,199,148,0,57,163,161,228,123,16,103,+149,128,25,225,177,2,129,24,160,99,0,54,224,99,1,128,147,192,144,102,+162,224,94,16,227,177,9,165,116,224,106,5,0,67,161,100,192,109,136,167,+160,109,224,255,4,1,50,57,119,97,224,110,14,197,71,224,95,7,200,97,+96,126,167,57,65,100,0,85,227,219,0,224,102,8,101,4,224,124,15,64,+19,104,146,224,87,0,137,29,136,70,192,93,193,40,227,180,2,93,248,232,+8,2,233,75,1,225,84,3,129,148,137,74,192,108,128,18,197,153,232,255,+7,114,56,96,250,104,235,110,50,250,162,3,104,151,141,159,2,49,50,55,+155,192,225,196,9,192,32,0,57,96,51,64,213,137,143,70,96,64,167,64,+17,183,252,236,107,0,98,170,72,134,0,64,193,73,228,81,9,226,109,2,+113,69,1,50,52,231,90,11,227,232,0,173,18,193,19,226,205,4,225,25,+3,234,131,12,130,207,196,113,160,63,225,169,0,128,195,233,61,1,134,211,+0,50,114,120,0,67,224,168,2,237,132,4,0,50,123,186,224,201,4,1,+95,57,112,121,115,144,229,72,0,224,63,5,0,49,116,134,6,95,49,57,+53,32,95,51,130,77,224,40,14,251,190,0,0,50,125,12,234,18,5,125,+145,229,80,15,100,200,66,219,134,97,160,0,0,58,135,46,99,64,224,177,+1,1,55,56,64,131,132,107,225,145,4,128,87,1,50,56,253,73,1,1,+49,50,96,43,192,223,193,147,230,139,3,0,89,224,247,0,128,1,69,21,+192,64,231,46,1,128,33,244,108,3,226,21,13,96,127,224,192,0,230,40,+0,232,173,4,224,81,3,224,1,1,0,67,169,189,224,58,0,133,219,128,+2,226,27,2,234,44,2,65,153,192,49,162,101,160,46,236,110,4,1,49,+54,174,3,192,106,226,17,8,224,140,4,226,26,15,225,98,0,231,58,5,+230,216,5,234,123,0,224,134,8,0,55,77,125,224,69,2,224,162,10,234,+12,5,64,0,140,133,65,83,143,22,66,16,138,15,3,85,32,75,51,83,+208,1,75,52,182,52,64,26,238,88,1,214,38,64,156,224,181,1,247,176,+2,225,191,13,65,252,0,50,160,168,225,179,3,133,117,227,199,7,224,55,+7,160,249,226,68,8,139,16,128,51,227,35,2,68,219,99,55,227,38,1,+101,198,192,72,224,49,35,225,162,0,131,166,3,54,32,95,51,95,86,117,+21,66,196,196,165,227,191,4,225,233,8,0,53,129,101,160,231,129,67,83,+219,95,113,224,208,3,229,245,0,218,63,160,4,235,241,10,224,20,0,0,+51,109,22,64,188,96,78,224,21,0,162,0,224,163,1,224,0,1,128,126,+139,11,158,180,118,158,230,50,7,64,255,239,140,0,224,127,7,64,203,1,+95,50,96,106,96,59,1,95,51,78,85,227,215,1,225,167,9,66,72,0,+54,228,116,8,161,33,64,186,192,152,225,29,15,0,55,96,121,151,31,64,+1,224,149,9,192,17,101,254,225,177,6,225,10,13,64,148,213,115,1,48,+57,241,147,7,8,83,116,114,105,110,103,46,73,115,128,8,75,23,64,48,+176,253,224,48,10,2,78,117,109,64,3,192,40,209,16,146,60,165,71,194,+118,66,119,3,54,32,95,53,193,190,134,14,239,169,1,128,66,212,219,109,+167,236,93,3,0,80,135,241,0,49,86,162,129,119,236,132,4,227,77,0,+163,144,64,52,0,95,97,36,224,28,3,164,111,192,26,64,18,167,93,229,+39,6,168,5,224,95,2,137,119,103,31,103,225,128,76,134,106,135,75,131,+176,224,15,1,224,211,0,176,177,0,57,68,169,0,56,80,174,113,122,96,+230,169,30,169,36,130,3,231,107,5,148,240,129,74,233,190,7,228,146,1,+228,67,2,226,190,1,0,48,142,183,136,33,98,92,0,48,136,200,224,78,+13,0,58,114,33,193,126,1,83,32,101,52,246,53,0,129,58,161,50,239,+25,8,128,22,224,182,2,228,108,0,1,49,50,84,45,130,247,0,57,200,+167,234,173,3,136,112,0,55,67,121,133,39,64,13,121,133,241,107,0,98,+218,109,188,131,35,1,50,55,132,96,64,25,2,48,55,50,227,207,1,73,+74,0,56,226,84,5,178,128,225,234,2,64,8,238,252,7,64,7,192,133,+161,182,64,189,114,104,82,169,0,55,93,233,64,20,204,89,82,40,224,66,+11,1,48,53,101,66,64,42,0,54,195,252,1,49,49,64,158,84,56,114,+172,96,101,251,27,0,169,15,100,191,128,55,131,110,67,239,0,90,75,143,+128,20,195,90,224,111,5,152,36,107,5,138,131,110,60,176,154,231,90,1,+193,190,225,182,0,128,108,192,30,161,23,193,219,194,146,178,5,0,56,167,+51,227,34,0,97,163,242,86,1,243,202,4,135,45,77,246,107,1,193,132,+128,95,64,48,164,21,229,116,3,0,53,224,57,2,169,141,244,229,10,224,+157,1,224,60,2,0,54,230,191,0,98,55,228,106,0,107,124,216,42,224,+58,3,172,181,244,124,3,227,68,12,83,126,131,138,100,203,161,68,224,182,+4,1,54,57,221,235,225,67,2,160,222,160,102,1,55,48,229,129,8,244,+141,5,65,187,132,29,0,75,227,64,6,166,39,93,199,225,122,3,225,25,+3,76,221,195,110,1,49,54,136,27,102,166,224,165,0,160,141,233,33,5,+64,81,233,33,6,64,134,196,145,0,89,255,131,0,161,224,176,128,228,8,+0,182,21,161,18,66,104,0,67,152,82,170,29,225,197,0,224,40,15,91,+118,224,212,4,144,241,224,34,4,175,19,143,191,165,33,233,120,6,77,208,+3,55,32,95,54,237,98,2,231,76,1,2,49,52,51,160,26,231,81,2,+98,26,96,160,97,160,100,61,244,212,8,132,209,230,231,1,17,116,111,111,+32,109,97,110,121,32,97,114,103,117,109,101,110,116,115,243,175,1,224,63,+16,224,62,5,2,102,101,119,224,61,7,1,95,57,162,213,131,19,227,158,+6,161,33,96,255,163,65,224,37,10,161,112,224,37,8,161,122,225,160,9,+250,164,16,224,25,0,98,236,224,111,16,224,36,1,229,190,2,236,73,4,+100,14,75,131,0,67,159,184,104,194,160,56,227,50,4,128,73,94,240,131,+247,68,172,226,53,1,224,186,8,128,233,224,32,18,171,26,224,33,18,173,+19,225,109,11,192,25,96,253,225,111,18,203,126,225,111,3,229,90,8,193,+148,132,16,224,7,1,224,78,8,224,117,2,244,232,1,224,192,18,252,131,+0,224,32,15,197,38,224,105,8,192,24,224,105,0,224,35,10,204,115,225,+3,3,224,181,30,124,15,228,210,0,64,46,64,45,3,95,51,51,50,169,+237,96,52,227,135,8,227,63,14,248,84,6,2,66,97,100,216,60,213,166,+0,58,130,98,71,155,103,89,66,88,0,55,103,88,69,178,196,196,166,79,+239,165,0,161,53,224,23,2,161,64,130,125,162,131,225,97,0,199,60,234,+78,0,228,199,0,161,0,224,16,1,226,165,6,229,42,3,224,46,20,197,+48,233,99,3,175,213,224,47,12,239,213,0,64,173,64,29,160,46,224,40,+9,195,169,228,88,20,97,168,234,57,6,180,203,64,1,230,34,5,224,75,+1,96,120,168,122,93,94,234,234,1,128,137,250,172,0,231,232,8,243,233,+4,160,103,169,144,235,231,2,231,135,7,243,27,2,225,24,2,136,80,224,+147,2,244,92,0,232,245,1,251,15,4,107,4,0,53,253,0,0,128,61,+128,49,224,111,3,138,126,66,78,72,63,175,38,225,21,40,1,57,52,255,+125,0,128,0,224,236,4,64,1,251,240,12,252,97,2,224,234,2,192,236,+224,16,0,133,161,161,97,129,50,224,75,6,224,45,3,193,41,236,222,3,+204,228,232,206,4,192,56,225,23,0,225,88,3,245,187,2,252,101,6,227,+41,0,195,248,130,104,65,58,228,24,5,96,36,165,11,104,178,87,252,233,+29,5,192,179,226,123,31,240,173,0,128,0,241,102,0,227,119,22,203,228,+194,164,160,46,224,40,9,229,81,16,224,25,0,0,85,230,182,7,128,224,+234,43,6,226,249,3,224,36,1,235,202,1,227,51,3,225,66,1,112,102,+225,66,13,161,206,181,224,73,243,1,49,48,76,34,65,159,0,52,89,110,+136,95,236,187,2,224,0,2,224,121,3,128,7,133,19,227,118,4,0,48,+71,190,69,156,64,76,224,70,5,0,80,66,3,224,149,3,224,87,2,225,+41,9,161,108,224,230,3,227,116,6,78,150,203,40,131,117,238,168,1,227,+227,4,97,86,227,212,4,169,236,1,50,54,240,234,2,99,233,107,188,224,+150,1,231,165,14,160,141,227,151,2,224,10,0,230,248,14,224,199,6,235,+175,1,236,109,0,224,175,22,166,79,228,142,7,3,66,32,95,57,126,43,+1,49,48,114,131,198,167,228,154,6,236,239,1,236,161,0,0,67,64,21,+127,197,96,144,242,179,5,227,54,5,130,237,77,27,183,87,128,6,64,124,+0,53,68,177,1,95,53,146,150,224,0,6,130,224,231,16,2,227,97,3,+160,119,224,25,1,232,173,4,224,199,0,96,135,128,43,253,35,1,236,32,+15,165,60,195,158,241,122,3,128,32,96,165,132,216,64,32,193,143,227,117,+4,69,255,208,131,1,56,51,248,70,9,148,70,225,247,4,224,170,8,135,+141,192,22,160,25,224,241,0,225,218,4,225,219,2,128,227,230,112,8,96,+50,1,49,48,119,213,99,178,0,56,112,21,80,38,128,30,225,187,2,140,+235,150,48,78,78,65,167,80,46,201,190,192,17,0,75,234,174,1,1,95,+53,192,18,150,199,64,0,130,25,192,0,226,212,10,233,245,12,133,71,226,+194,1,160,252,225,46,3,225,178,8,195,173,230,150,5,232,158,14,160,116,+224,141,8,192,24,204,96,228,145,5,1,50,52,232,62,3,224,139,1,227,+178,1,224,108,1,73,205,0,85,229,78,5,131,51,96,62,0,85,114,75,+246,7,1,244,217,6,5,110,101,103,97,116,101,202,109,192,92,232,206,8,+194,65,224,133,6,239,48,0,232,214,1,225,77,0,231,75,4,232,229,18,+225,102,3,160,90,224,134,3,249,203,8,228,36,2,228,252,10,224,71,7,+228,22,2,231,220,6,227,163,9,227,172,1,229,120,25,224,112,8,240,101,+6,228,143,5,227,78,8,130,96,129,103,224,38,0,251,202,3,251,210,0,+2,95,54,53,199,194,224,0,2,128,69,96,228,225,119,1,226,20,1,67,+32,102,192,231,175,5,1,83,32,210,224,226,183,0,233,22,10,225,255,12,+233,174,3,192,122,224,226,6,233,44,6,245,85,0,225,1,3,233,53,7,+3,64,95,57,49,199,14,3,80,32,95,57,86,132,254,16,1,224,105,0,+233,69,14,225,117,4,83,131,247,43,7,224,137,0,242,206,6,224,205,7,+231,11,4,192,48,239,234,4,64,182,143,182,96,199,224,197,1,99,23,164,+84,83,59,240,48,2,224,36,6,123,125,241,161,9,192,0,225,9,5,0,+51,82,227,1,95,52,243,213,0,160,166,232,75,6,1,50,54,136,166,224,+195,6,128,197,224,126,5,64,44,142,62,1,54,32,238,114,2,3,98,105,+110,100,227,253,0,224,70,6,201,55,96,118,254,55,5,65,139,251,160,1,+224,53,0,208,35,227,94,3,228,219,6,224,35,2,160,33,118,235,155,98,+64,14,249,243,5,0,67,249,2,1,224,162,0,130,123,228,27,1,225,17,+3,195,54,192,150,235,93,7,227,39,0,231,102,0,67,117,133,129,245,201,+6,64,98,131,125,106,19,161,35,225,38,5,228,94,8,128,252,224,240,5,+113,247,70,18,96,249,66,67,227,250,1,227,56,10,226,234,9,224,196,4,+129,50,128,235,245,114,4,224,240,10,192,43,185,65,224,0,5,227,229,10,+100,0,123,124,227,87,25,96,94,107,53,0,50,122,2,64,52,0,51,88,+202,0,53,66,102,65,48,244,24,2,5,99,80,97,116,58,32,130,104,66,+73,97,166,115,64,4,51,32,95,57,48,104,177,241,18,2,224,76,10,2,+79,32,35,79,126,135,183,160,55,218,178,192,203,168,151,174,146,106,67,65,+190,97,198,0,54,136,165,0,48,87,128,224,152,1,1,61,61,162,252,224,+35,18,2,84,114,117,231,32,1,224,165,4,81,133,153,35,65,59,84,2,+99,216,97,15,64,27,0,54,96,27,1,80,32,64,11,217,6,0,65,128,+26,152,247,101,33,229,27,11,99,13,225,202,3,72,235,3,95,49,49,48,+134,11,64,65,0,51,160,120,2,48,54,55,236,79,0,242,27,0,249,35,+1,226,227,0,226,56,3,101,123,130,124,226,175,10,192,40,131,41,130,103,+1,64,95,89,119,67,25,228,193,9,64,112,151,216,66,41,1,48,54,242,+229,1,224,192,1,64,35,151,117,128,145,227,252,1,99,14,224,156,8,224,+16,4,64,121,0,58,106,96,129,52,0,83,165,138,230,218,3,233,160,4,+129,37,224,33,19,141,19,128,252,245,66,13,130,91,166,14,167,96,224,30,+2,247,180,1,90,214,231,251,4,229,255,9,96,75,137,163,66,217,254,37,+1,146,82,250,23,0,228,44,3,160,103,64,84,224,57,11,130,227,224,57,+1,224,93,13,112,153,224,93,3,229,121,4,225,18,5,197,56,128,32,224,+29,7,168,54,224,217,6,128,22,0,85,64,40,98,193,224,125,2,99,126,+98,148,0,53,77,110,237,126,1,0,54,237,215,3,0,48,159,248,128,121,+225,76,11,224,215,1,64,53,93,179,224,102,4,67,173,100,61,192,228,1,+95,50,128,27,212,111,226,5,19,204,17,128,31,224,28,6,96,77,225,11,+12,96,90,239,101,13,96,195,232,4,13,163,198,224,188,4,0,54,238,140,+6,237,181,5,225,181,0,96,56,224,16,2,130,146,226,39,4,65,135,224,+92,6,109,35,224,82,16,233,147,1,237,32,13,225,136,8,226,27,18,225,+41,16,100,50,227,14,9,129,9,225,215,23,106,169,225,215,1,224,199,1,+226,234,10,139,58,225,49,3,224,95,23,0,54,107,86,224,94,1,224,60,+2,226,136,13,96,63,230,238,29,9,100,115,69,70,105,101,108,100,115,32,+187,0,230,174,4,68,201,215,187,75,244,163,68,0,80,101,185,67,43,160,+25,253,33,8,0,57,93,62,64,0,193,81,237,95,2,232,66,2,64,202,+101,0,64,35,229,216,1,161,14,253,31,2,0,57,95,125,232,92,5,96,+130,0,54,160,130,253,116,2,64,238,0,52,70,1,81,251,68,40,64,39,+134,210,129,100,115,145,128,138,137,44,96,124,135,74,225,40,17,3,101,110,+117,109,248,233,2,0,53,135,21,193,22,96,146,161,22,134,237,0,67,133,+250,227,177,14,133,246,224,26,12,152,78,226,163,13,226,190,0,229,179,13,+155,182,97,85,133,171,230,254,0,0,49,165,50,199,157,128,32,132,81,227,+157,5,102,110,224,36,6,229,75,9,96,190,80,249,224,37,2,228,159,17,+229,144,0,228,185,17,224,94,4,96,21,132,70,128,91,228,139,7,0,51,+99,16,228,46,5,224,133,0,235,178,5,227,254,9,228,79,11,192,24,228,+79,0,2,50,53,49,235,203,3,227,104,1,224,24,7,225,101,4,104,74,+66,3,136,212,250,240,2,232,68,1,111,92,241,190,5,131,66,224,169,10,+231,202,0,232,59,19,224,206,11,254,56,39,96,154,237,176,6,129,81,128,+23,96,246,144,198,100,82,128,0,230,61,0,161,215,1,95,50,66,188,175,+184,224,80,9,238,202,2,160,116,0,90,164,18,68,171,236,12,5,96,30,+64,174,226,229,1,132,1,224,63,2,211,135,96,69,96,4,73,212,96,32,+0,90,64,124,85,81,98,42,1,75,50,192,23,96,0,97,225,130,67,224,+0,1,227,44,12,225,219,8,97,220,138,64,99,222,129,157,97,86,161,222,+230,56,3,128,220,224,216,2,235,231,0,237,166,0,192,200,162,10,226,20,+1,160,9,129,239,226,34,2,234,254,6,101,42,97,160,243,134,3,128,23,+177,152,128,70,78,49,0,80,255,32,2,193,182,218,40,232,36,8,194,29,+142,62,194,60,128,228,96,64,64,43,2,95,57,50,242,105,3,230,135,7,+130,47,235,100,0,254,62,5,13,115,101,99,116,105,111,110,32,102,105,120,+105,116,121,165,91,96,49,76,19,224,43,1,1,36,120,166,154,108,207,240,+103,0,65,137,139,166,209,190,239,207,7,225,140,6,128,30,225,144,5,195,+84,69,254,109,82,0,79,255,139,4,167,122,239,92,8,99,18,96,166,224,+148,3,224,178,9,225,222,56,128,198,245,100,7,130,86,99,136,143,46,232,+237,2,248,16,3,225,208,11,160,84,241,128,2,100,32,224,21,6,224,60,+30,64,58,243,212,8,77,136,226,22,4,128,174,225,116,1,135,109,225,110,+5,224,0,1,226,51,86,74,105,232,181,16,78,147,64,0,224,211,3,225,+147,5,162,22,236,23,1,227,33,0,192,51,249,147,2,242,133,4,68,254,+225,65,0,161,67,224,13,0,222,59,192,1,227,72,6,128,20,132,210,160,+14,99,248,132,226,228,74,0,131,244,1,50,51,170,141,228,241,1,64,0,+226,123,1,193,171,66,86,133,169,0,85,105,45,147,38,224,122,4,65,48,+138,0,128,50,226,192,10,102,193,224,13,5,160,172,128,2,160,14,226,253,+13,0,89,225,18,3,103,46,225,7,3,129,74,242,145,5,224,61,0,131,+85,129,16,104,247,64,107,128,36,96,117,166,60,73,15,0,52,104,212,217,+73,160,7,249,88,2,224,190,2,224,2,3,192,30,192,136,199,126,224,2,+0,152,79,225,158,2,251,18,3,99,216,129,147,1,85,32,176,146,129,180,+163,168,225,27,0,253,244,5,128,7,101,150,227,31,6,224,9,0,224,165,+2,247,170,2,161,2,96,86,224,210,6,96,17,194,51,64,92,65,230,136,+195,225,6,1,225,115,0,252,85,8,217,55,128,188,255,194,3,192,131,168,+105,225,83,2,192,45,160,245,96,153,232,61,5,225,248,3,193,98,188,188,+224,26,5,224,148,4,128,221,64,0,225,177,10,225,17,0,224,66,9,226,+145,0,224,127,14,224,106,0,96,170,224,35,21,128,1,169,88,192,0,233,+210,1,96,2,128,178,226,167,0,160,14,224,50,4,224,88,15,210,104,224,+0,1,224,234,14,224,2,3,224,246,0,64,0,228,139,9,250,81,3,250,+93,4,193,222,128,122,225,236,0,130,42,128,181,1,95,49,125,167,160,85,+102,251,68,35,138,31,121,55,224,227,0,1,95,50,148,15,224,42,1,1,+51,51,73,124,0,50,128,65,64,44,99,147,128,65,192,22,68,136,232,51,+0,224,125,1,162,89,246,174,4,224,171,2,224,173,2,225,74,2,161,98,+192,44,224,62,4,128,166,225,32,6,224,181,12,3,52,55,32,95,84,40,+160,223,225,13,0,96,186,225,13,23,224,225,13,183,237,192,76,227,13,8,+160,190,227,173,13,96,16,1,95,52,75,94,170,216,245,220,2,238,175,12,+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,246,35,0,226,70,15,96,123,64,224,+129,53,96,21,224,240,1,1,53,56,225,29,4,224,209,10,224,172,38,9,+98,97,100,32,112,114,101,102,105,120,224,164,11,228,250,2,2,95,49,55,+254,18,3,16,92,51,52,38,115,114,99,47,77,105,99,114,111,72,115,47,+70,104,22,2,46,104,115,64,24,4,44,54,52,58,55,192,68,164,238,237,+185,1,225,210,0,171,37,170,228,3,95,54,57,48,164,206,235,27,1,129,+28,160,220,66,172,97,217,250,240,1,73,134,2,75,50,32,79,53,150,119,+133,237,1,64,89,100,79,65,35,229,41,3,233,83,1,98,17,139,155,64,+79,0,51,234,123,1,138,53,128,113,96,122,192,115,77,4,103,228,0,52,+74,143,247,225,3,64,19,249,250,1,208,11,64,228,169,165,171,238,100,91,+64,138,198,149,64,34,0,80,192,179,130,133,193,199,96,182,210,127,128,6,+193,59,224,61,3,193,25,224,33,1,225,3,1,161,25,0,65,225,25,4,+72,86,146,61,77,177,99,26,2,95,49,49,88,149,109,106,3,56,51,32,+35,96,202,64,39,0,54,209,226,216,244,1,52,48,226,59,4,4,110,101,+103,97,116,152,245,64,46,145,233,0,65,88,200,65,44,3,10,65,32,90,+65,77,64,14,145,152,0,75,96,26,207,160,193,31,132,34,171,80,64,32,+141,228,0,75,185,4,68,158,88,194,1,52,57,99,17,139,24,143,137,64,+193,65,201,174,33,206,40,128,24,64,11,174,79,224,24,11,160,49,130,8,+1,95,49,74,131,164,49,0,58,128,7,208,68,98,171,158,163,227,172,1,+192,182,196,198,240,58,5,227,194,0,248,17,20,1,95,55,159,101,226,162,+15,128,40,244,76,30,8,103,101,116,65,112,112,67,111,110,219,63,250,252,+7,168,38,96,11,0,85,128,206,96,233,244,99,1,96,105,2,51,56,56,+226,24,17,247,45,0,3,67,32,95,51,118,139,64,65,130,77,104,127,64,+14,0,54,224,80,1,244,152,7,134,104,129,66,96,160,0,51,128,6,65,+19,64,58,130,64,65,1,0,80,228,105,2,2,118,97,108,155,90,252,41,+2,1,121,112,130,118,224,18,1,0,107,222,162,224,18,1,3,115,111,114,+116,64,18,64,90,244,51,1,245,48,22,102,106,129,122,224,12,1,3,95,+49,50,50,64,238,65,163,171,173,236,222,5,164,181,131,145,238,227,6,66,+214,140,28,0,50,224,54,7,161,131,131,29,130,87,196,250,170,233,234,12,+4,162,67,151,129,231,71,0,226,99,19,96,144,1,55,57,133,127,0,50,+132,173,226,111,3,226,109,0,247,213,4,1,95,56,231,49,0,224,42,10,+242,39,4,245,201,0,65,34,194,31,98,175,225,135,2,9,101,116,83,76,+111,99,69,120,112,114,196,43,65,10,155,229,114,70,97,87,0,55,127,221,+192,71,129,74,0,50,92,84,224,19,0,64,56,132,28,0,79,68,73,64,+27,97,212,128,180,1,52,48,86,92,0,58,128,43,161,236,241,63,0,97,+198,200,71,237,26,1,64,8,1,95,57,98,248,98,133,193,119,227,227,1,+224,12,1,224,25,0,4,95,49,49,56,53,64,5,0,57,124,131,137,130,+177,160,224,27,6,163,38,160,6,0,66,163,54,64,207,206,56,163,119,103,+178,192,245,227,228,15,9,117,110,100,101,102,105,110,101,100,32,207,126,242,+106,0,224,54,19,228,18,0,0,51,94,95,161,214,107,110,226,60,0,104,+41,237,170,4,128,35,224,157,5,226,225,0,224,105,15,232,249,1,199,252,+165,10,167,233,224,61,21,192,167,168,32,128,51,160,180,224,55,9,0,79,+255,234,3,98,43,2,50,55,32,160,45,71,253,0,80,96,200,232,73,1,+205,228,232,78,0,2,95,57,56,232,70,2,192,0,161,6,66,70,197,26,+228,140,3,1,91,93,96,163,225,8,13,2,79,32,35,67,106,193,64,226,+23,1,224,254,0,166,79,69,97,224,53,4,232,127,0,160,89,224,91,12,+71,84,237,228,2,224,91,5,128,0,64,182,133,143,0,83,164,62,129,25,+66,146,66,224,81,253,112,162,0,51,179,93,0,83,164,158,227,229,1,171,+61,64,45,0,35,168,213,74,82,71,249,1,95,52,71,155,64,0,0,73,+101,235,66,196,136,32,1,49,50,68,116,96,58,96,24,217,244,160,239,199,+178,1,95,49,165,107,96,20,130,26,88,108,221,222,224,212,0,160,8,176,+93,100,2,254,2,0,64,95,133,206,65,202,101,139,1,57,57,93,30,129,+49,108,80,225,176,1,3,66,111,111,108,196,117,0,50,133,104,224,28,1,+4,68,97,116,97,46,64,33,6,95,84,121,112,101,46,34,128,188,228,155,+0,204,167,242,76,4,0,49,65,96,161,166,114,73,239,182,4,236,241,1,+242,186,6,99,245,155,195,232,71,19,1,95,52,164,135,194,7,230,174,3,+0,49,119,228,161,41,225,64,0,224,109,7,130,61,0,49,101,49,236,231,+2,232,98,1,225,92,0,224,17,4,252,29,4,96,19,109,158,132,91,2,+50,49,57,253,31,2,152,107,192,169,224,71,4,96,48,164,151,72,61,235,+40,5,228,166,20,21,110,111,116,32,112,111,108,121,109,111,114,112,104,105,+99,32,101,110,111,117,103,104,196,20,66,131,156,38,1,57,53,195,230,96,+0,231,111,4,140,70,0,56,98,199,66,158,229,214,0,224,41,8,97,233,+134,76,136,6,64,149,64,90,2,49,50,49,101,178,98,75,68,11,200,32,+64,48,134,113,91,125,90,144,96,137,102,181,96,29,64,44,96,29,138,184,+64,70,130,71,251,124,3,2,95,49,48,96,49,97,32,131,146,0,51,141,+24,194,80,207,92,97,218,225,215,1,128,48,232,121,0,193,81,226,77,3,+143,81,246,198,3,239,206,6,227,49,0,226,146,0,1,49,54,148,169,118,+233,139,12,193,198,232,200,6,214,56,141,51,103,244,228,140,0,64,237,132,+118,128,134,226,141,7,96,77,1,50,49,97,41,131,6,214,161,0,85,225,+31,1,64,19,141,99,224,127,10,98,159,131,229,0,50,187,98,245,45,7,+64,189,2,10,65,32,229,251,11,160,149,131,12,166,93,100,56,0,55,66,+43,96,83,194,38,64,72,170,135,96,233,160,139,2,55,57,57,66,176,205,+238,0,49,71,221,138,240,64,57,164,139,1,56,48,143,119,2,79,32,64,+101,225,64,45,64,136,128,10,64,43,132,128,234,130,8,1,49,49,104,187,+128,250,227,134,0,65,157,224,117,1,131,84,226,14,2,228,25,5,139,232,+64,21,224,93,16,231,141,0,227,238,8,164,50,0,54,67,223,66,9,198,+81,160,23,224,39,0,149,242,161,37,133,38,224,107,13,72,89,129,206,224,+208,6,101,197,226,33,4,247,209,2,94,107,224,27,5,0,49,102,81,224,+135,15,224,43,4,111,118,98,102,96,105,240,115,3,160,6,0,85,229,49,+1,224,252,2,192,247,239,167,0,226,136,2,225,38,5,0,95,66,98,192,+169,69,97,0,50,250,24,2,98,95,223,38,225,68,1,225,153,0,251,160,+8,224,17,3,193,227,65,86,132,147,102,248,68,47,100,13,64,155,225,220,+0,236,95,7,207,58,192,32,154,135,228,23,5,164,29,160,123,224,25,9,+210,107,225,205,8,89,219,224,0,1,172,148,192,47,235,77,0,64,2,224,+39,1,128,134,128,1,226,113,1,64,202,232,254,0,100,57,128,188,96,172,+224,79,0,244,100,2,135,28,160,59,2,95,49,49,113,128,131,213,246,204,+6,224,117,6,224,150,0,229,10,3,165,8,152,211,64,134,133,10,145,228,+224,151,25,135,49,64,142,169,47,224,131,3,3,95,49,50,48,148,107,237,+221,3,111,99,177,126,96,0,225,61,6,245,63,8,162,213,129,54,200,27,+160,9,128,147,162,221,130,95,224,126,0,224,65,1,154,217,231,216,7,192,+2,244,96,3,224,32,0,200,176,237,40,0,192,99,228,7,3,224,26,0,+252,248,2,224,31,4,224,131,2,176,99,224,84,1,224,133,1,224,219,0,+198,111,193,154,224,92,2,64,47,251,90,3,97,67,97,150,80,141,252,218,+2,67,43,135,142,0,79,75,79,71,235,126,21,1,55,56,131,119,138,106,+64,27,202,211,136,11,2,95,52,48,69,84,0,49,103,229,96,39,64,21,+224,39,17,0,55,102,109,65,226,64,87,224,39,16,1,50,48,105,219,64,+8,64,88,96,147,0,56,99,65,132,5,0,48,64,70,167,48,0,58,130,+47,136,28,239,229,2,185,224,129,71,195,198,96,11,232,16,1,97,183,239,+182,6,226,3,11,225,142,5,224,30,12,224,85,16,233,91,0,224,85,22,+226,103,6,98,23,65,49,64,242,251,227,3,64,0,161,2,64,250,137,23,+235,133,6,75,128,13,76,105,116,115,46,75,110,111,119,110,83,121,109,98,+107,183,64,47,172,208,225,42,140,201,132,225,42,78,0,54,168,47,64,1,+229,155,8,0,53,244,62,0,204,171,190,38,79,53,144,103,230,96,1,237,+98,1,224,163,0,225,81,5,170,159,134,111,166,117,224,201,5,128,1,165,+25,224,25,8,224,131,0,225,31,4,230,238,2,224,71,6,225,40,0,230,+144,11,229,27,8,166,14,224,19,8,252,49,1,224,67,8,224,49,6,225,+194,3,108,31,145,147,224,33,0,224,51,3,224,13,4,224,10,1,96,57,+110,237,72,228,64,6,226,84,2,234,178,7,64,39,68,130,128,59,84,210,+249,9,9,225,251,4,224,132,57,132,89,213,69,215,29,0,75,66,44,133,+52,2,75,32,75,77,119,128,12,64,43,234,187,0,128,2,230,149,0,193,+96,130,1,224,31,0,128,2,160,233,104,232,224,184,0,192,153,64,144,96,+255,226,124,10,193,180,128,99,225,144,5,230,35,0,134,32,129,215,128,146,+198,255,239,34,6,102,89,0,39,169,207,234,50,2,0,48,76,38,224,195,+2,236,75,8,224,26,2,240,143,5,193,106,160,108,67,164,64,12,153,92,+198,145,128,166,0,79,160,239,64,35,64,242,203,234,224,95,1,237,66,10,+224,112,0,162,130,226,18,1,224,55,2,146,165,128,7,192,226,172,173,118,+121,231,0,0,128,79,239,77,15,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,243,109,0,128,71,152,98,2,95,49,48,103,62,128,0,66,+33,140,177,71,94,0,53,80,81,3,95,54,54,51,132,154,177,37,81,191,+245,238,5,5,116,117,112,108,101,67,224,117,0,0,115,207,191,129,44,79,+57,155,95,64,104,0,66,78,200,0,52,82,94,109,135,101,14,152,155,96,+99,171,11,225,232,2,153,255,130,41,66,12,212,194,98,83,228,130,13,81,+245,160,230,143,94,0,90,64,35,237,160,0,229,125,4,160,123,162,14,0,+89,64,13,194,43,170,28,224,16,1,229,8,0,160,14,227,33,1,234,196,+2,106,243,229,255,5,137,113,96,5,235,182,1,130,230,188,34,224,60,1,+133,34,242,87,4,233,42,1,224,57,0,96,87,66,76,97,63,224,144,0,+64,11,161,59,130,202,144,178,102,119,249,202,0,160,0,227,223,3,66,219,+97,176,228,112,2,86,209,96,51,193,44,65,158,215,127,230,72,5,247,115,+1,67,149,2,49,49,56,96,171,0,89,64,16,227,204,2,193,195,193,42,+225,32,0,97,0,224,15,2,96,27,65,81,128,213,224,83,3,64,149,0,+56,225,221,1,106,110,128,158,0,95,81,125,64,29,164,138,97,233,67,70,+224,22,2,227,127,7,128,95,252,145,0,224,10,4,227,206,0,0,56,96,+5,183,248,224,147,0,97,86,96,142,112,79,97,30,97,47,231,188,0,97,+200,193,41,192,205,177,173,224,206,0,224,105,4,0,57,67,211,192,25,196,+49,64,23,0,53,133,217,79,53,176,98,69,224,0,55,85,180,228,75,3,+224,185,0,224,103,7,64,67,195,227,224,31,0,227,55,1,96,130,224,149,+2,128,224,128,50,64,11,241,95,9,237,33,3,195,99,237,163,6,1,95,+56,219,100,250,185,3,224,52,1,64,1,163,55,227,68,3,224,190,1,79,+133,225,13,4,194,172,242,206,0,129,58,84,167,193,246,224,20,0,249,91,+1,84,69,134,61,128,113,64,165,1,55,50,68,219,130,31,1,49,49,80,+214,242,66,11,100,52,248,67,0,238,129,8,161,37,114,226,225,37,48,1,+67,32,225,39,4,99,177,188,107,229,247,0,229,103,1,4,102,114,101,101,+32,93,9,20,32,118,97,114,105,97,98,108,101,32,105,110,32,111,117,116,+112,117,116,32,102,90,43,0,112,229,225,3,227,17,4,241,64,0,229,89,+1,164,239,129,37,196,236,128,13,196,233,161,140,225,183,5,141,214,234,244,+1,228,169,17,228,146,9,228,137,8,226,230,2,170,220,163,75,140,51,130,+254,192,73,64,65,64,27,140,31,65,113,135,180,231,100,1,228,67,2,228,+139,5,224,42,8,224,228,0,130,135,224,191,0,227,158,3,133,15,228,198,+1,226,199,0,75,146,67,180,98,69,194,103,128,89,162,24,239,55,6,227,+188,2,96,0,164,181,160,8,212,46,99,115,249,70,4,129,57,82,124,192,+59,224,22,2,224,25,6,224,26,6,224,29,7,227,238,3,227,133,10,192,+196,226,229,4,64,146,202,93,115,182,1,64,95,74,96,64,22,138,72,64,+217,131,168,233,246,0,92,101,181,4,1,49,57,97,77,101,60,64,7,108,+196,96,13,64,65,136,104,122,182,70,24,64,68,134,171,126,189,99,10,79,+178,64,23,96,6,96,201,64,56,136,136,3,85,32,75,51,98,180,64,18,+136,55,155,2,98,143,0,95,85,121,160,58,135,8,0,56,128,22,128,98,+96,22,192,236,64,15,0,57,128,213,215,238,1,75,51,113,198,0,58,128,+25,248,1,0,200,58,64,23,220,44,161,69,96,23,224,11,2,192,8,98,+3,64,47,130,180,97,218,231,193,3,2,49,49,56,212,122,0,66,225,4,+0,128,49,130,12,3,85,32,75,50,192,120,64,21,129,143,81,34,224,143,+5,129,144,66,233,136,130,192,139,195,201,167,179,180,20,128,29,161,46,2,+67,32,60,239,47,1,243,236,1,224,39,14,169,94,226,62,2,233,121,5,+238,122,12,131,99,227,71,9,1,67,32,227,73,3,194,133,228,186,4,200,+91,178,46,169,67,227,67,0,224,132,8,113,163,236,129,3,234,4,2,254,+27,1,224,50,33,196,4,137,20,0,49,64,176,140,119,128,47,224,172,6,+224,0,0,228,85,0,160,244,225,74,11,227,211,2,224,145,6,64,25,225,+72,12,192,41,227,180,2,224,58,20,224,35,0,202,89,233,103,13,228,247,+4,160,101,233,93,1,224,19,0,198,197,225,69,12,225,21,3,224,45,3,+225,64,8,179,71,225,64,20,66,210,172,138,72,232,96,29,254,57,0,64,+15,128,21,64,176,224,64,4,64,55,132,32,192,232,1,95,48,100,143,64,+24,187,254,3,50,32,95,51,141,95,143,175,64,169,160,89,224,12,4,238,+47,2,0,95,90,194,160,98,0,95,232,115,2,1,95,50,129,56,192,122,+203,33,227,229,0,108,173,237,228,7,161,19,96,17,178,203,246,120,0,195,+121,225,184,0,227,164,11,160,67,224,46,24,94,218,160,47,129,174,192,121,+160,46,227,216,16,193,60,237,84,7,225,215,4,64,11,136,175,0,51,101,+80,227,205,7,128,47,0,85,129,252,132,222,1,48,53,224,71,0,224,98,+8,128,219,96,48,237,163,1,224,184,1,193,47,227,64,9,224,75,10,192,+24,0,85,97,135,162,240,143,215,205,243,128,29,160,103,2,95,55,55,78,+149,217,220,65,203,72,168,206,240,206,57,0,90,128,137,109,182,134,104,0,+67,65,226,240,161,0,65,203,216,1,182,197,4,64,95,55,53,56,101,175,+134,67,154,148,227,52,6,118,52,91,13,2,95,52,52,72,41,190,39,108,+23,0,51,102,178,0,48,71,113,3,64,64,95,51,96,194,224,0,0,0,+83,248,203,37,96,175,64,4,131,136,200,191,73,150,3,55,32,95,54,132,+58,159,111,228,63,1,234,180,4,239,172,0,114,14,98,235,0,80,240,16,+7,6,109,105,110,105,109,117,109,255,199,0,127,119,229,9,1,162,187,64,+107,2,52,55,32,96,81,96,85,64,83,199,37,194,90,241,199,5,160,23,+163,148,162,205,162,208,224,13,0,102,31,226,158,0,0,54,65,47,160,75,+145,208,2,95,55,54,194,105,128,29,75,133,127,103,6,55,49,52,32,79,+32,35,88,0,194,126,243,193,6,64,162,0,54,96,162,246,205,20,3,78,+97,116,34,100,113,64,74,1,10,65,194,54,97,75,143,53,132,28,210,112,+195,153,96,186,227,212,1,68,28,129,54,129,69,0,50,101,64,0,55,100,+243,160,7,193,18,246,42,7,154,145,227,26,0,225,119,2,131,71,203,117,+0,55,99,142,243,186,12,99,183,160,155,251,88,2,65,53,253,192,0,227,+97,0,143,200,243,151,12,128,161,98,100,225,202,8,199,205,66,142,236,23,+0,225,251,12,225,248,2,224,199,1,243,79,12,226,56,25,224,123,1,2,+95,53,52,69,203,225,227,4,226,74,2,113,24,128,43,137,201,194,22,228,+160,1,228,56,4,65,241,245,97,4,193,235,76,49,188,208,225,143,4,161,+232,128,19,67,101,67,252,1,49,52,99,226,177,194,0,67,98,38,99,210,+231,232,18,225,174,2,165,191,232,17,15,64,29,133,192,225,20,5,224,16,+0,225,21,5,129,15,192,82,96,36,65,21,97,182,225,36,1,0,80,227,+49,1,160,0,96,86,225,96,15,224,28,18,65,66,135,247,229,40,6,170,+91,97,104,69,77,165,52,128,49,135,241,131,102,226,173,18,164,19,226,163,+8,129,7,226,48,1,234,100,0,226,75,9,193,48,129,153,142,84,0,66,+128,201,165,58,196,104,229,67,0,68,220,224,251,1,64,174,168,135,227,180,+7,96,219,0,66,144,251,163,141,1,49,52,72,95,128,59,3,95,50,49,+54,224,24,1,0,54,96,253,64,77,200,115,96,170,0,57,100,220,88,237,+0,54,105,20,69,184,2,95,49,54,99,92,1,58,49,96,8,3,10,65,+32,75,193,252,224,130,8,175,133,97,72,129,239,175,223,224,149,1,225,47,+0,96,130,174,228,87,54,225,87,0,161,103,224,49,1,64,44,64,89,247,+150,6,64,144,198,69,224,189,12,0,51,97,85,224,189,1,134,30,71,40,+225,230,4,224,12,4,64,244,254,54,0,68,88,97,60,131,105,146,91,103,+173,241,190,0,0,67,66,193,167,170,2,49,49,52,254,113,1,192,50,202,+238,199,73,232,100,8,227,80,1,240,83,0,246,153,13,162,2,129,123,235,+206,0,224,54,0,224,55,1,145,159,251,87,11,128,48,235,206,3,184,49,+101,209,254,249,19,160,47,130,85,241,108,1,64,0,65,158,0,53,232,254,+2,65,106,0,54,136,253,243,186,1,227,85,2,129,98,198,170,236,12,1,+224,35,3,130,18,0,49,88,170,249,74,0,160,237,179,222,226,26,1,129,+23,64,9,103,153,64,126,135,56,130,167,226,165,8,95,247,224,78,0,64,+15,102,197,128,12,241,121,2,64,71,133,142,226,233,16,97,72,128,71,245,+253,9,130,141,224,21,2,226,152,13,232,138,8,128,42,243,116,0,128,136,+132,212,97,160,64,122,1,75,50,208,97,64,204,134,49,226,195,2,228,180,+1,66,236,233,198,3,227,153,2,224,100,0,65,102,226,183,1,231,143,3,+143,205,169,110,230,124,3,161,136,251,128,1,72,101,224,33,15,128,27,128,+113,162,224,232,194,3,225,31,2,130,199,224,31,2,226,202,18,224,54,0,+194,205,224,219,5,236,168,4,253,248,0,192,49,231,227,9,160,53,70,192,+194,233,166,14,1,49,49,107,52,97,123,138,2,232,52,2,250,14,4,192,+12,224,20,0,224,160,5,132,215,225,236,1,104,241,224,136,9,224,180,0,+131,155,230,75,0,192,58,128,144,1,95,51,132,153,226,61,3,217,139,225,+8,3,208,63,224,77,2,96,67,185,217,157,124,224,18,10,160,193,83,185,+1,50,48,128,139,146,113,0,48,121,216,2,95,49,48,130,46,3,95,54,+50,52,64,35,124,242,2,50,32,95,70,79,64,161,192,9,2,56,51,32,+164,184,224,30,0,0,35,237,223,1,64,215,227,91,8,0,53,233,248,0,+161,29,0,53,206,30,76,10,96,19,0,52,71,179,2,95,51,56,100,160,+236,108,0,99,15,188,4,66,61,228,221,0,225,137,1,99,166,162,139,225,+145,5,160,113,161,237,99,173,224,110,10,201,183,0,51,185,211,2,95,57,+56,111,194,0,53,195,203,64,130,135,82,169,116,114,6,0,90,233,131,0,+192,14,1,95,57,64,92,238,50,1,64,56,64,68,228,110,24,0,90,226,+246,0,228,101,38,192,30,224,255,2,228,98,3,65,100,228,98,3,244,31,+0,64,27,135,57,4,95,51,55,54,32,64,14,0,54,160,167,224,69,0,+64,20,133,115,162,183,3,32,95,50,55,66,3,197,164,0,53,214,193,227,+60,0,166,5,64,57,234,244,4,228,166,1,64,2,100,120,226,225,3,228,+137,4,128,2,224,17,9,140,245,225,21,3,160,248,97,216,192,32,224,62,+3,237,242,0,224,86,6,160,38,162,29,239,183,0,224,5,1,1,95,55,+223,1,224,106,1,237,81,11,225,231,0,205,161,130,151,160,53,165,162,224,+72,1,228,254,3,66,122,192,63,128,162,162,214,231,7,2,71,97,81,75,+65,120,82,96,0,55,121,40,1,95,56,86,56,96,20,70,216,66,222,112,+21,0,53,92,44,65,197,238,135,1,9,101,120,112,97,110,100,68,105,99,+116,223,233,1,95,49,76,79,0,51,138,41,128,0,224,222,0,228,177,4,+225,119,3,228,128,2,225,71,4,225,88,0,192,243,226,126,0,162,16,197,+70,225,69,3,165,215,224,19,4,195,194,224,22,17,233,60,1,161,231,193,+234,166,93,224,55,6,232,116,3,224,29,10,84,28,0,55,80,172,1,95,+50,75,164,160,0,192,79,64,34,224,91,1,160,52,230,238,0,96,64,231,+139,1,224,93,3,201,128,224,62,1,131,36,225,60,0,178,109,128,66,208,+121,233,101,3,224,77,1,124,5,1,95,54,68,79,133,135,229,126,12,160,+46,190,124,128,10,133,235,64,109,124,72,140,129,165,225,224,99,5,160,105,+230,173,17,128,80,209,232,192,17,225,252,23,224,0,1,128,47,233,69,5,+225,123,10,227,185,3,225,90,56,100,235,96,89,0,95,81,151,64,0,225,+75,23,224,246,1,167,83,99,81,110,82,194,193,224,21,3,232,30,1,179,+215,179,214,233,114,5,64,20,147,245,64,23,0,50,133,20,137,241,2,83,+32,73,245,0,1,104,200,174,207,97,104,82,15,65,175,108,135,95,230,229,+97,4,108,232,102,156,64,44,225,144,2,232,232,1,251,177,3,64,133,224,+48,16,192,46,64,214,128,0,64,163,138,123,131,98,100,126,130,87,0,51,+155,55,4,32,95,57,49,48,73,227,1,95,57,72,171,2,95,56,51,229,+249,0,1,53,48,128,228,135,172,0,75,186,120,65,185,243,232,1,64,17,+165,112,0,67,245,174,4,128,190,240,159,21,96,33,96,57,224,226,2,235,+174,0,210,10,250,13,0,161,51,64,146,167,188,96,131,228,66,0,86,122,+96,249,162,200,241,220,2,207,190,128,115,96,117,255,24,13,132,36,160,50,+160,148,160,13,244,94,1,130,150,96,102,179,99,245,104,0,2,95,55,52,+182,253,96,37,2,95,55,54,64,53,226,164,17,130,221,128,23,238,60,0,+64,142,196,79,77,223,230,0,1,1,36,120,101,246,0,58,131,17,188,36,+1,75,52,64,2,252,42,1,128,31,136,41,237,93,14,180,59,192,231,0,+49,128,180,64,8,208,114,78,62,242,228,4,161,102,238,18,0,131,225,231,+42,0,193,54,148,195,96,74,72,243,224,43,0,160,23,161,217,243,5,8,+224,22,10,225,248,0,224,96,4,208,170,238,4,2,224,31,18,192,67,224,+134,0,98,38,163,31,97,239,160,68,226,68,0,107,100,224,32,6,160,69,+216,84,64,7,64,26,226,65,13,64,50,207,234,230,218,2,134,123,200,42,+161,29,160,35,230,165,0,64,81,224,15,1,128,151,229,177,3,128,76,179,+141,226,226,1,128,159,193,252,129,190,0,54,234,222,1,130,242,243,226,7,+0,95,106,122,224,138,1,224,8,0,64,61,138,38,234,254,2,64,20,239,+103,31,219,8,96,101,234,254,48,226,121,1,235,0,3,66,168,239,99,6,+64,247,64,25,132,231,226,240,14,167,144,160,148,115,115,226,140,2,224,100,+0,64,71,132,238,224,230,23,108,34,224,227,55,192,8,228,227,1,128,130,+132,222,2,95,51,54,76,203,70,33,224,1,7,233,71,0,224,111,1,224,+1,5,135,211,224,34,18,224,32,3,1,95,57,81,139,96,0,0,58,128,+174,225,98,4,236,99,2,65,70,132,117,0,50,228,118,0,162,119,64,29,+164,51,102,238,132,242,90,217,64,25,0,54,96,25,228,200,1,3,97,100,+105,99,185,64,64,34,194,170,2,95,49,48,65,225,64,21,130,109,227,184,+3,227,202,0,234,57,1,229,172,2,234,33,2,73,51,242,140,2,104,107,+198,19,224,49,1,242,163,5,128,54,182,129,233,60,3,64,196,135,237,0,+51,130,123,64,59,227,250,1,253,221,0,204,134,224,177,3,163,246,225,130,+6,232,31,6,224,59,1,240,13,1,109,64,160,94,96,73,111,211,128,46,+224,96,4,96,17,224,137,1,1,95,55,85,108,224,37,4,226,104,0,224,+74,1,192,36,228,122,3,129,31,225,16,9,165,204,224,21,1,192,108,137,+193,128,82,193,84,225,94,2,207,171,225,153,8,0,50,196,248,224,72,5,+97,103,203,4,224,99,79,192,14,164,88,227,140,1,192,15,224,132,3,224,+47,2,131,110,232,58,0,226,119,28,169,39,227,103,0,224,140,16,240,237,+1,224,13,15,224,120,53,163,155,234,6,3,225,75,10,230,162,0,160,121,+237,113,4,96,31,224,86,0,65,36,104,198,0,48,177,95,224,175,7,163,+50,96,118,133,77,239,41,1,64,8,246,105,8,0,50,150,171,192,69,225,+34,0,195,69,192,179,224,34,0,237,189,4,246,148,6,224,127,1,160,227,+226,228,0,200,27,224,44,1,96,14,2,49,49,50,69,155,64,37,0,79,+248,43,4,64,0,228,55,26,224,101,0,235,94,3,239,224,2,160,16,0,+50,64,46,96,10,120,156,64,89,3,95,54,57,56,106,65,0,50,70,66,+151,209,224,119,2,97,106,1,49,53,240,1,3,23,83,117,98,115,117,109,+112,116,105,111,110,32,99,104,101,99,107,32,102,97,105,108,101,100,144,13,+228,186,6,97,128,235,42,0,224,246,1,237,147,2,217,60,97,6,224,31,+0,2,49,49,50,68,33,0,58,129,25,70,138,83,101,0,89,132,78,129,+145,233,52,1,209,239,225,29,0,150,112,64,127,197,171,228,178,1,225,231,+4,164,143,0,67,108,56,207,49,224,43,0,226,142,2,229,14,9,128,51,+197,64,160,24,127,126,224,32,5,98,160,192,26,178,114,160,26,97,108,98,+106,97,237,224,9,1,224,107,0,98,133,64,8,200,209,195,86,131,144,97,+193,102,218,239,147,12,229,129,1,229,167,8,224,135,3,192,50,225,35,1,+225,38,20,66,14,224,162,2,194,155,237,104,1,224,31,5,224,194,0,239,+182,0,196,23,224,91,0,224,63,5,232,165,5,195,137,224,13,11,224,58,+8,194,117,224,44,12,167,189,227,78,12,128,26,160,154,247,172,4,224,198,+6,228,211,0,231,106,3,194,127,224,120,1,226,4,7,192,53,226,136,3,+225,100,20,195,135,162,221,226,139,15,226,79,4,187,110,224,175,11,225,166,+10,198,160,118,43,224,240,0,192,140,224,46,8,224,194,2,224,96,2,162,+135,229,208,0,165,194,121,72,109,155,130,151,0,51,168,56,128,49,193,53,+224,198,14,166,253,224,101,2,128,47,224,97,3,224,216,2,230,110,0,160,+82,160,145,228,212,9,128,31,129,118,224,27,6,227,185,0,0,32,181,10,+240,15,1,109,114,224,4,1,128,115,245,39,25,9,102,114,101,101,84,121,+86,97,114,115,245,39,5,112,226,192,184,64,174,101,151,160,19,145,252,177,+251,0,75,241,162,0,128,6,69,10,207,81,0,89,162,114,201,250,228,229,+3,162,214,226,127,5,129,126,225,214,11,192,25,184,50,166,69,231,27,5,+134,82,0,85,141,192,224,30,5,96,22,129,170,233,163,8,67,84,242,10,+3,224,247,1,228,50,8,225,19,1,65,204,229,45,2,252,58,1,202,51,+195,244,231,69,8,200,117,231,106,3,231,149,3,192,35,128,173,224,175,6,+238,155,7,224,187,3,180,8,192,191,225,7,38,64,43,96,77,0,57,71,+105,224,0,1,224,40,4,211,148,64,0,65,232,140,198,193,214,231,55,13,+117,99,145,215,197,246,225,136,14,164,250,128,179,245,205,0,96,42,245,208,+10,128,13,210,103,128,143,0,54,238,145,8,1,49,48,78,166,96,94,224,+111,3,224,178,0,0,52,74,14,6,95,52,51,57,32,95,52,145,235,160,+113,134,174,0,51,181,91,227,65,7,2,79,32,35,77,141,132,143,131,50,+249,20,1,64,137,173,170,133,196,194,235,236,117,0,161,0,224,165,3,194,+224,224,26,16,232,68,2,96,2,233,90,5,230,47,9,132,214,172,151,129,+212,225,5,7,207,75,224,19,2,64,187,208,190,224,138,7,143,221,0,48,+239,2,0,64,29,228,208,1,227,220,0,85,27,83,20,225,230,1,0,48,+96,244,2,95,56,53,229,250,2,64,50,192,158,96,117,142,51,238,180,1,+209,125,227,227,4,91,99,224,106,1,224,36,20,64,92,181,5,64,100,238,+143,2,231,13,5,128,165,165,218,137,141,225,105,6,229,195,2,128,1,232,+103,5,161,13,227,212,3,160,33,231,56,18,137,111,224,126,3,228,240,6,+224,31,5,232,157,0,0,83,224,169,2,232,89,10,160,54,192,50,226,127,+3,171,36,245,127,0,225,243,0,0,95,88,147,160,0,96,139,129,153,0,+49,161,172,160,119,229,11,18,231,197,1,254,161,1,224,13,3,224,56,12,+224,57,3,229,43,1,160,44,129,212,226,224,4,230,214,0,224,221,3,64,+9,226,13,5,233,99,6,225,8,9,128,6,129,9,167,86,225,10,13,160,+160,120,178,234,164,7,96,163,225,217,1,225,181,15,227,60,8,0,57,183,+215,64,32,224,80,1,64,18,226,114,0,233,164,0,224,17,9,225,49,2,+66,220,64,74,64,155,96,159,226,124,2,205,188,103,15,173,23,161,81,232,+7,16,12,99,97,110,110,111,116,32,117,110,105,102,121,32,173,34,129,94,+165,8,1,56,56,65,42,224,66,19,3,32,97,110,100,160,58,160,45,225,+10,3,226,192,0,226,93,7,67,158,238,250,7,230,73,3,2,49,48,57,+180,77,128,61,67,223,128,92,64,69,70,9,64,65,141,187,96,175,0,54,+197,178,96,8,220,111,0,67,197,234,2,49,49,49,129,227,0,58,128,62,+243,108,4,12,80,114,105,109,105,116,105,118,101,115,46,126,34,104,203,64,+44,160,89,230,230,10,2,49,49,48,134,209,228,82,1,203,164,64,104,126,+193,228,234,9,64,251,229,96,0,226,95,8,195,12,226,95,26,240,30,4,+101,105,1,49,51,64,234,239,151,2,160,38,229,163,6,67,1,106,88,228,+11,0,90,218,226,70,58,4,121,99,108,105,99,226,64,11,71,195,66,20,+2,95,49,48,150,97,226,74,20,0,61,226,72,17,162,74,225,27,1,239,+175,4,225,144,0,192,248,173,52,224,225,0,192,224,161,143,224,142,0,161,+153,0,54,225,153,2,227,187,15,225,35,17,0,48,96,7,200,192,142,239,+90,180,64,27,224,235,16,4,101,114,114,111,114,203,125,128,133,213,231,86,+237,224,41,1,3,116,121,112,101,64,37,224,17,1,2,107,105,110,144,207,+224,18,1,2,115,111,114,86,45,224,18,3,4,114,101,97,108,109,64,19,+64,90,135,219,240,228,39,0,49,66,38,64,62,135,164,176,228,133,74,166,+188,102,145,226,197,2,194,44,238,48,13,231,91,0,240,176,25,165,114,236,+47,12,198,237,193,146,231,7,9,0,85,102,31,237,80,8,130,247,237,62,+6,160,137,139,124,120,182,0,90,64,49,192,25,224,100,8,238,154,12,169,+16,238,55,4,224,180,4,237,88,3,224,81,7,236,96,9,113,60,96,34,+160,25,0,85,227,219,0,3,95,55,55,52,255,116,0,237,125,1,65,171,+98,61,109,115,225,101,1,224,136,9,137,199,161,138,225,95,12,129,132,166,+134,225,129,49,228,169,6,195,165,132,31,0,80,98,118,231,233,0,227,209,+9,98,145,128,165,232,18,3,163,210,243,200,6,110,158,227,161,2,3,32,+95,49,56,64,54,138,129,2,49,48,53,184,183,206,223,225,130,9,97,21,+90,74,99,196,224,60,0,1,95,50,65,109,2,49,48,53,172,124,224,65,+0,136,189,225,30,13,128,34,225,97,18,194,66,233,94,8,192,24,226,142,+4,226,21,0,224,78,15,129,209,225,141,10,192,24,98,170,225,50,6,226,+135,16,224,46,13,96,0,224,49,13,65,121,97,115,225,190,10,224,23,13,+96,21,67,144,224,99,3,238,200,9,224,132,9,226,252,3,66,244,220,139,+252,100,5,97,32,252,94,0,1,48,55,66,46,188,94,192,193,140,149,236,+214,0,64,75,200,76,101,247,64,40,0,95,105,1,76,211,192,39,0,58,+130,194,128,38,224,112,1,252,202,1,224,107,3,64,44,136,70,252,168,12,+220,162,224,19,3,224,1,1,196,127,224,34,16,224,32,3,224,29,20,224,+26,17,224,23,14,252,237,2,160,197,200,184,0,89,130,141,232,189,1,237,+43,1,161,86,224,85,2,228,18,1,165,211,194,183,210,203,187,176,64,21,+238,157,10,128,68,103,244,227,72,1,130,79,128,111,224,79,0,129,212,71,+175,74,81,249,117,1,96,28,234,90,9,64,109,106,92,143,254,0,56,251,+84,4,224,96,0,228,114,3,234,125,3,209,92,96,7,130,177,240,140,2,+166,79,192,185,163,191,133,72,238,172,6,225,98,0,65,96,0,54,197,187,+131,213,153,0,241,95,21,66,110,240,62,5,241,217,8,241,77,0,241,73,+13,64,0,240,2,5,64,148,97,232,233,93,8,0,49,230,113,0,96,105,+227,107,17,0,50,227,107,10,128,156,103,113,169,148,0,48,129,161,64,114,+136,153,3,85,32,75,51,191,48,134,230,64,26,168,117,255,229,17,255,231,+4,227,5,10,64,1,227,72,4,226,218,1,64,95,208,30,0,89,99,237,+1,67,39,208,37,166,248,208,1,192,73,254,199,0,226,88,0,161,175,162,+156,224,41,2,231,111,10,224,89,2,224,47,21,227,46,2,236,91,0,232,+84,15,204,24,96,232,229,155,7,224,28,3,230,77,4,229,121,8,105,16,+0,55,204,100,192,105,239,221,0,225,197,0,138,247,226,160,0,225,226,8,+231,114,9,160,78,230,55,9,230,153,4,224,39,0,224,240,0,233,75,2,+225,216,3,225,88,5,224,55,1,160,255,231,31,15,231,110,175,224,219,3,+224,58,11,192,30,165,37,145,119,97,57,228,108,2,228,178,2,234,247,0,+224,60,3,160,62,225,101,2,237,1,6,1,49,48,246,26,1,161,11,226,+149,6,165,127,0,51,149,10,96,66,226,98,21,224,121,5,229,166,1,242,+54,0,230,62,8,103,248,224,181,16,98,66,227,92,0,224,157,2,192,21,+193,64,224,62,1,226,94,3,226,197,3,160,44,192,152,226,142,1,160,110,+230,83,2,120,226,7,67,32,95,54,51,32,95,54,97,145,1,95,55,166,+9,225,140,1,0,66,222,245,224,104,7,193,15,134,93,225,37,0,1,54,+52,161,36,160,66,128,60,224,36,3,192,211,160,25,70,135,142,130,246,207,+4,238,8,1,13,98,97,100,32,115,121,110,111,110,121,109,32,117,115,110,+75,224,170,0,64,70,230,26,14,160,0,161,120,184,0,69,54,177,182,3,+32,85,32,95,79,56,2,64,90,32,89,154,229,68,0,235,17,0,133,46,+229,34,1,229,37,29,96,246,193,118,225,176,1,229,34,12,225,173,3,224,+36,9,236,163,28,173,84,96,11,192,118,244,137,0,207,223,132,202,129,180,+216,159,201,12,0,80,134,176,224,241,2,192,223,132,215,224,82,5,227,53,+0,130,233,78,150,135,160,251,242,6,225,142,8,193,230,160,14,160,0,228,+25,11,228,132,2,96,50,140,185,192,44,229,88,2,225,133,11,225,87,2,+229,76,23,224,121,8,239,23,12,224,161,11,224,39,1,197,144,243,191,0,+252,197,2,197,147,130,16,97,139,2,95,51,56,100,97,3,67,32,95,57,+253,59,3,64,0,124,244,241,16,2,2,117,98,115,116,216,8,109,112,108,+101,109,101,110,116,101,145,50,64,0,66,196,139,236,124,204,0,58,129,102,+128,14,1,52,32,66,206,224,1,1,255,107,2,64,39,139,207,100,204,0,+57,186,219,0,54,128,65,139,35,224,128,1,2,100,105,99,81,145,64,26,+0,54,236,164,1,229,89,0,0,49,154,160,161,132,229,46,8,228,64,0,+160,248,116,196,194,5,179,88,146,91,1,48,57,131,158,250,139,7,96,159,+2,10,65,32,90,178,0,54,98,231,64,19,137,109,96,110,106,181,3,95,+52,48,57,224,180,2,150,15,6,45,104,97,112,112,101,110,97,47,64,52,+137,135,141,229,225,197,4,1,95,49,115,28,2,85,32,67,247,138,1,224,+32,11,227,94,0,227,7,0,224,41,4,138,100,179,103,225,248,1,128,33,+75,139,0,50,115,179,2,55,54,55,224,170,2,1,61,62,96,159,224,21,+6,245,201,2,160,32,224,89,5,1,95,49,68,236,1,64,67,181,173,192,+0,64,229,138,13,97,22,225,21,6,224,84,2,0,84,179,140,96,49,246,+191,4,110,45,98,24,1,51,48,128,8,65,207,1,49,48,108,94,67,185,+253,3,1,125,27,0,48,166,215,2,49,48,56,150,205,1,48,57,130,147,+236,180,3,65,251,224,83,18,212,244,195,98,2,95,49,51,69,165,64,83,+143,32,96,91,242,21,28,151,151,166,240,224,32,11,192,190,128,64,229,189,+12,224,26,12,128,230,229,131,9,96,22,241,179,1,165,101,192,186,224,50,+11,241,162,1,164,213,224,44,2,160,153,224,48,5,225,113,1,194,80,128,+7,224,40,8,226,121,7,0,83,98,30,132,120,182,73,164,133,0,57,67,+85,96,128,0,56,67,254,238,65,4,224,142,0,228,53,4,64,79,0,67,+165,79,161,18,64,36,71,60,192,189,96,118,128,33,64,20,199,213,77,181,+68,224,224,101,4,135,182,198,30,224,254,1,225,185,18,243,205,0,229,209,+23,235,30,98,129,32,230,28,21,225,68,2,226,62,9,64,27,242,119,0,+2,49,48,56,145,164,97,15,0,89,231,149,0,228,113,1,136,39,167,64,+64,53,116,126,225,63,2,96,0,225,169,8,64,141,224,101,0,0,54,111,+236,160,52,224,60,2,224,172,4,242,160,5,96,35,165,251,1,80,32,128,+181,0,80,101,137,64,176,146,70,138,6,1,95,57,166,72,65,254,100,135,+66,108,120,74,0,48,89,12,64,25,216,31,218,210,2,48,56,51,128,24,+165,213,102,16,0,55,69,174,228,187,1,1,91,93,152,2,96,43,152,2,+0,67,137,169,201,175,64,237,0,64,165,192,231,135,0,114,253,64,9,0,+83,98,149,87,248,132,226,251,103,9,230,75,0,96,52,3,49,48,53,56,+226,178,0,70,147,234,142,8,8,99,111,109,112,111,115,101,83,101,152,176,+97,64,64,203,71,21,0,53,64,165,96,16,103,16,162,228,130,248,1,54,+52,202,34,65,107,72,40,225,107,7,133,193,64,175,192,155,156,3,224,150,+6,128,145,224,144,1,6,104,97,115,70,105,101,108,168,31,83,234,0,48,+129,86,229,223,0,224,79,37,2,115,101,116,224,79,13,133,223,134,210,1,+49,48,79,40,224,64,3,1,95,51,97,89,249,192,3,4,99,67,111,110,+69,90,39,161,195,0,55,133,205,254,249,1,225,174,1,97,187,104,42,0,+56,71,238,225,66,0,0,48,164,47,250,135,15,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,233,47,0,230,225,0,96,95,2,49,48,55,70,44,106,178,104,138,232,+139,1,224,95,10,4,44,32,97,116,32,193,9,66,15,0,57,198,180,64,+207,131,29,132,187,139,109,163,207,106,180,64,213,128,206,2,95,57,53,168,+71,96,213,0,53,85,147,64,12,0,53,72,240,1,67,39,92,249,226,137,+5,163,35,224,231,2,1,104,97,97,69,130,61,128,125,195,130,1,80,32,+165,146,96,21,0,54,160,21,253,247,11,0,48,82,229,217,122,64,170,133,+12,160,10,107,240,224,21,8,64,197,228,183,1,137,172,201,233,232,155,0,+224,55,4,196,237,96,61,131,87,163,170,224,29,11,128,99,64,2,168,52,+244,185,1,132,205,84,161,1,57,56,67,188,65,177,0,52,206,172,0,95,+92,112,0,95,64,127,4,95,49,56,51,32,165,121,67,226,65,2,1,95,+51,66,181,96,151,101,245,105,191,123,23,0,80,75,222,165,76,73,42,97,+13,227,9,13,7,78,101,115,116,101,100,32,102,67,13,10,115,32,110,111,+116,32,97,108,108,111,119,235,138,2,225,12,4,146,58,193,12,134,83,245,+135,3,96,21,110,118,224,50,6,245,103,1,98,68,207,16,224,155,10,226,+172,21,4,101,120,116,114,97,128,174,2,40,115,41,162,182,3,66,32,95,+52,99,236,100,142,131,164,192,165,67,12,0,50,204,135,160,32,161,55,193,+209,235,220,11,224,26,6,106,146,96,21,99,199,132,29,238,114,2,72,115,+163,226,101,140,163,115,237,12,18,164,119,67,68,128,149,2,57,56,53,64,+56,129,2,232,62,0,209,82,163,15,254,127,1,166,22,0,85,104,250,229,+110,14,64,60,102,168,83,246,0,54,65,22,64,20,134,101,129,25,106,138,+89,162,64,24,213,108,96,47,99,173,64,64,1,95,57,97,193,64,32,217,+202,107,244,88,95,144,87,225,57,2,0,67,67,231,238,88,1,224,25,3,+100,2,193,28,64,250,0,51,229,175,1,198,85,160,57,252,147,6,227,210,+2,226,229,1,201,145,163,104,227,190,5,166,0,226,96,7,137,160,229,190,+4,11,111,114,100,32,119,105,108,100,99,97,114,100,226,254,9,138,201,224,+195,0,81,66,200,184,232,215,0,0,50,128,213,128,208,224,255,0,248,113,+2,193,230,225,198,2,134,102,64,72,4,65,32,64,64,65,97,126,64,35,+113,180,64,47,105,43,108,41,64,25,232,161,1,238,159,11,233,59,0,225,+54,4,164,90,96,125,193,18,228,148,0,248,232,4,1,48,54,229,213,1,+249,227,7,64,125,133,131,0,75,224,123,4,180,117,151,170,136,170,145,55,+155,140,224,74,4,77,13,99,6,227,97,4,64,89,0,54,96,89,216,88,+239,207,8,64,34,216,238,0,90,66,234,96,17,130,211,64,174,69,204,192,+7,64,174,64,29,226,220,0,230,104,0,134,102,64,27,232,124,46,0,103,+232,44,14,69,162,97,176,203,183,241,201,0,64,148,84,39,132,136,96,11,+231,242,0,0,57,71,38,228,163,0,231,18,7,128,135,238,215,3,2,111,+120,121,165,138,224,157,3,64,126,221,12,103,29,141,121,138,184,64,132,106,+71,69,23,138,135,101,78,144,140,7,53,55,32,64,79,32,35,52,144,113,+129,102,64,116,241,26,4,1,66,64,145,24,64,44,209,24,136,172,0,53,+178,252,0,48,164,78,64,185,170,180,99,225,2,64,95,56,84,126,0,75,+128,28,193,190,2,80,32,35,67,224,129,194,64,66,226,207,0,75,115,197,+246,135,45,161,202,78,107,239,107,22,0,50,122,209,0,48,97,90,239,107,+2,227,40,7,98,172,0,57,199,198,131,45,231,179,3,90,83,229,217,1,+101,193,110,79,64,120,1,95,52,64,107,224,85,1,204,175,246,122,6,237,+107,1,128,42,247,47,4,235,195,0,102,216,0,57,128,195,240,38,11,64,+16,143,229,160,93,131,174,249,211,0,224,5,0,103,71,227,234,2,64,18,+0,83,128,153,239,57,13,229,45,0,128,24,128,126,167,19,0,55,150,206,+252,171,1,225,66,1,129,242,161,159,98,79,132,148,100,248,64,54,64,76,+2,80,32,95,70,58,1,95,57,113,37,64,204,128,86,224,76,0,243,43,+2,161,94,231,35,0,96,117,128,242,133,80,157,183,225,157,0,174,14,64,+37,200,121,224,74,2,213,161,225,9,1,224,181,8,224,16,8,107,18,177,+130,73,104,160,174,224,167,0,130,19,211,4,65,111,161,12,192,179,138,252,+0,49,229,235,2,192,149,249,192,7,224,181,3,183,156,130,217,199,104,226,+164,10,225,106,1,130,242,233,91,1,128,119,101,248,2,57,53,32,135,247,+192,43,225,1,1,166,150,224,54,1,1,95,57,172,94,232,221,3,64,132,+132,189,2,95,50,49,74,78,96,130,0,52,73,40,2,49,48,52,178,236,+64,107,224,166,21,162,37,128,97,172,131,64,64,0,52,161,37,68,8,231,+8,0,0,58,128,89,102,247,64,11,230,212,3,224,97,10,169,112,225,145,+19,234,120,3,96,119,96,104,225,15,25,235,224,5,192,155,132,233,131,169,+236,235,0,96,86,80,83,96,197,64,38,0,54,96,38,71,13,224,182,19,+224,214,0,128,109,225,209,0,161,29,130,38,65,30,192,125,197,40,243,8,+1,69,188,99,81,130,195,255,156,1,96,47,133,66,0,90,64,45,64,14,+133,43,253,222,1,167,115,168,35,64,33,181,59,224,175,0,1,55,56,72,+184,234,72,1,131,73,235,202,6,99,57,0,55,207,241,233,188,0,0,50,+101,19,1,95,51,165,126,115,231,200,226,225,88,3,3,67,32,95,55,172,+192,236,203,14,96,161,64,30,64,162,130,145,87,240,247,224,5,247,230,8,+161,3,130,159,7,95,51,54,57,32,75,32,85,106,138,224,1,11,188,67,+128,0,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,1,95,57,137,108,224,0,3,0,58,+129,124,199,97,123,52,130,16,65,252,104,155,0,73,235,36,12,161,157,65,+159,74,92,1,95,49,105,160,243,70,0,151,204,166,140,230,148,2,88,69,+230,58,4,247,132,5,2,75,105,110,238,54,0,64,131,131,81,1,95,52,+130,37,0,49,150,220,242,211,0,229,227,0,96,9,68,58,166,76,0,51,+98,185,0,51,128,124,224,6,4,108,227,64,3,102,237,192,76,0,83,74,+26,1,95,51,104,5,192,32,224,106,19,111,236,224,108,1,75,106,96,114,+224,108,31,0,82,224,108,26,161,186,77,38,128,34,224,110,6,160,103,224,+117,2,224,106,9,224,63,3,224,113,2,176,50,131,178,192,147,224,40,0,+224,108,18,224,115,2,128,67,224,61,13,160,106,2,95,49,55,225,219,3,+25,92,51,52,38,115,114,99,47,77,105,99,114,111,72,115,47,84,67,77,+111,110,97,100,46,104,115,64,25,5,44,49,56,51,58,53,240,50,2,130,+54,102,78,201,157,0,51,103,108,224,13,0,79,218,224,13,1,110,235,128,+13,1,53,57,224,11,1,1,54,48,224,11,0,66,80,0,54,162,235,67,+14,74,178,64,19,175,17,134,37,233,213,1,96,73,98,218,127,0,130,225,+64,47,133,56,224,47,11,224,57,2,76,70,224,57,0,224,64,6,0,51,+224,64,16,224,152,1,224,53,9,165,126,1,52,57,226,74,4,111,72,104,+53,97,176,96,52,163,140,224,6,5,224,33,0,133,213,224,92,2,224,33,+14,160,26,224,40,3,224,33,13,224,40,3,69,198,129,179,69,157,64,182,+133,146,134,237,235,80,14,96,245,0,83,64,205,132,59,1,54,32,125,231,+230,183,0,241,201,15,5,97,115,115,101,114,116,66,71,12,100,101,58,32,+101,120,112,101,99,116,101,100,61,162,68,164,137,253,72,0,125,59,0,51,+107,51,0,50,160,204,115,50,1,64,79,96,18,0,57,160,8,75,71,96,+8,1,49,48,248,157,2,224,134,19,4,44,32,103,111,116,160,117,160,102,+160,97,128,0,65,5,134,104,198,132,0,58,128,111,103,111,3,50,52,32,+75,101,86,97,87,0,55,227,48,2,4,84,67,69,120,112,148,207,224,25,+8,252,162,0,224,26,9,229,67,1,224,26,8,2,83,111,114,215,143,3,+95,49,50,55,224,168,0,2,95,49,51,99,38,96,12,64,156,245,178,0,+202,175,2,50,49,57,71,218,171,158,0,50,83,2,146,137,234,213,6,241,+47,7,179,144,225,62,19,17,77,117,108,116,105,112,108,121,32,100,101,102,+105,110,101,100,58,32,160,189,0,51,134,174,178,209,64,150,198,14,1,51,+54,73,255,64,116,143,169,1,49,48,81,179,242,134,0,0,50,201,10,0,+89,130,81,194,177,98,105,172,58,253,152,0,102,242,96,53,206,83,1,95,+50,64,10,64,17,131,168,226,183,15,226,209,12,209,79,224,28,12,171,213,+167,160,233,44,4,233,230,2,170,62,245,23,5,203,36,237,46,3,1,49,+48,204,218,0,48,65,41,237,47,1,224,96,12,2,49,48,48,237,38,2,+236,243,8,234,137,19,236,76,11,224,176,0,224,203,12,100,11,235,57,9,+160,131,245,40,6,128,24,103,227,90,130,96,0,65,126,223,172,1,50,50,+227,32,0,99,158,163,156,96,7,110,253,68,45,226,80,1,4,115,117,99,+99,32,226,236,3,64,39,102,30,96,93,129,59,161,64,76,186,192,23,2,+49,48,49,131,18,192,13,224,145,1,64,7,131,33,164,214,64,7,240,90,+4,97,29,117,196,64,57,129,136,129,199,140,120,239,140,2,100,92,0,57,+64,215,130,223,2,49,48,49,140,79,224,7,5,64,101,132,54,3,85,32,+75,50,82,222,83,233,64,22,0,49,250,33,4,224,121,10,224,108,4,1,+55,54,82,30,224,107,13,64,76,227,235,0,224,76,27,2,54,50,52,224,+76,20,131,161,249,85,0,224,73,4,160,64,0,49,224,64,8,64,56,0,+54,228,113,0,149,219,64,49,147,131,3,49,48,49,51,203,246,236,0,15,+224,70,0,131,249,116,15,235,243,4,64,27,195,223,71,98,0,49,64,13,+64,20,131,226,97,97,236,38,7,64,30,130,130,1,75,50,65,123,64,15,+166,205,0,50,64,36,64,15,129,160,76,110,165,215,66,159,96,80,236,120,+12,64,32,206,181,102,231,0,57,117,89,0,67,76,130,98,109,147,107,141,+9,64,44,164,241,204,160,131,168,192,1,122,138,64,0,224,22,5,192,1,+236,148,3,224,34,12,224,32,3,224,29,20,224,26,17,236,83,4,64,176,+225,199,1,0,57,94,177,248,152,2,0,53,83,142,106,32,0,79,67,202,+1,57,56,99,108,0,48,64,20,0,79,131,20,78,205,247,207,0,64,31,+132,24,105,73,145,99,97,72,193,105,129,235,96,46,236,70,6,10,80,114,+105,109,105,116,105,118,101,115,46,228,5,0,64,49,130,1,224,39,12,167,+53,64,37,197,245,224,196,21,67,23,124,145,192,203,0,57,185,169,96,22,+96,20,73,36,146,210,96,183,224,48,8,0,57,141,68,224,48,0,64,15,+224,48,21,98,241,224,48,2,81,29,224,48,20,99,193,224,48,2,68,245,+224,48,2,221,85,96,27,98,137,224,42,1,161,118,64,163,225,118,0,130,+12,225,170,13,97,59,131,47,113,158,64,34,65,159,2,57,57,57,64,142,+69,183,224,10,3,96,132,64,38,175,131,4,57,57,56,32,58,64,32,163,+29,0,57,100,58,64,5,2,95,57,57,97,94,232,53,4,225,186,2,1,+45,62,133,230,0,58,64,66,160,61,67,90,0,57,106,185,151,187,64,66,+226,45,0,0,58,96,26,128,13,0,53,64,13,162,73,161,51,0,51,96,+47,226,43,18,96,112,0,58,96,40,224,34,15,1,78,97,66,117,0,58,+97,112,224,35,15,5,83,121,109,98,111,108,128,38,129,43,224,38,12,8,+67,111,110,115,116,114,97,105,110,160,81,161,47,226,246,21,234,4,0,0,+58,97,104,224,91,15,170,70,0,58,98,171,105,90,0,48,65,57,65,106,+0,58,97,213,128,19,234,69,3,6,98,117,105,108,116,105,110,64,92,80,+4,64,3,0,58,96,48,97,120,123,91,119,126,67,46,64,19,168,4,82,+136,180,193,1,95,57,72,17,2,57,56,49,64,4,99,78,224,18,10,0,+58,99,121,204,240,134,78,126,153,224,9,0,171,222,240,75,2,1,57,56,+105,14,128,6,96,86,108,140,128,81,0,58,96,6,101,154,109,49,141,52,+2,60,32,64,102,70,217,130,160,18,124,2,0,85,72,163,0,55,202,207,+136,206,240,255,0,232,119,10,5,103,101,116,73,100,101,97,166,112,233,0,+90,64,122,192,138,0,85,81,71,96,133,253,35,0,0,57,105,107,138,180,+64,250,128,22,213,3,110,178,136,65,99,105,253,80,10,64,7,99,69,96,+73,234,241,7,150,45,64,13,245,86,0,96,140,169,206,231,144,0,67,52,+128,10,0,50,72,111,128,0,0,58,96,89,96,82,96,84,166,2,224,87,+1,206,180,142,183,128,13,97,154,161,90,129,46,192,115,160,251,64,181,142,+249,1,95,50,73,65,66,23,105,136,0,51,151,248,0,51,129,11,0,55,+218,50,231,34,10,0,57,94,192,231,33,0,106,104,231,32,7,219,212,224,+1,9,231,17,91,224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,+243,186,9,0,58,97,8,225,37,17,101,189,225,37,0,163,74,232,70,7,+136,64,224,134,1,224,1,3,225,43,151,225,18,7,0,58,96,243,233,252,+5,233,129,10,128,41,131,131,86,39,254,53,2,224,39,6,0,58,109,0,+128,38,0,52,224,39,1,234,29,0,110,5,132,79,228,24,3,177,12,205,+74,131,168,129,114,237,96,7,82,35,163,144,249,69,3,195,91,1,95,57,+85,89,4,64,95,55,54,51,228,132,1,96,121,191,232,96,83,225,252,1,+97,35,0,83,194,1,95,26,247,83,0,195,158,1,95,52,98,24,0,57,+95,145,96,72,131,144,234,254,4,225,52,13,64,44,234,140,8,0,90,132,+109,224,1,9,227,104,176,192,8,247,43,10,0,58,97,82,161,118,224,1,+11,224,244,4,225,24,207,220,51,96,0,0,58,97,37,228,132,1,0,55,+69,185,138,78,130,247,0,58,98,153,237,15,8,226,98,14,64,46,241,114,+0,224,79,1,103,174,64,119,70,69,0,58,67,58,98,134,1,55,55,73,+187,0,54,231,55,0,78,25,238,102,0,64,61,107,181,1,55,53,144,244,+224,21,0,0,55,64,49,99,17,110,108,107,131,102,170,1,57,53,74,151,+0,51,107,99,1,95,54,72,209,128,145,252,195,1,155,87,151,170,230,232,+0,136,48,176,239,224,25,10,99,128,64,158,232,115,5,64,101,247,134,0,+160,19,64,189,99,138,231,100,0,68,161,224,12,0,64,70,224,50,7,64,+189,224,50,5,159,168,64,174,199,7,105,51,193,204,101,242,239,210,3,65,+212,242,115,1,160,198,231,220,5,189,151,200,72,96,54,191,130,222,169,231,+255,1,93,93,64,32,65,176,169,163,123,241,228,197,3,1,95,55,132,176,+224,88,0,160,34,116,44,252,37,2,0,55,91,208,220,87,94,243,1,95,+55,104,162,161,218,232,174,1,224,179,4,64,202,193,10,162,193,133,79,0,+54,96,48,128,16,128,160,224,211,0,224,130,1,169,53,160,186,0,55,65,+148,192,105,224,206,4,96,171,224,131,4,160,110,169,186,217,194,0,39,233,+62,4,130,239,192,130,224,50,1,129,70,96,50,113,130,225,50,8,64,13,+0,53,230,6,4,241,218,4,241,26,13,0,95,147,135,169,127,236,45,6,+1,36,102,138,168,64,128,0,89,224,156,0,160,227,96,144,73,158,80,207,+245,189,19,1,36,120,246,248,4,95,147,192,0,129,64,224,162,22,244,36,+0,253,229,0,96,179,224,185,0,0,64,234,211,2,206,178,226,171,14,96,+16,225,91,0,98,217,217,29,164,104,228,111,1,129,119,99,12,97,112,66,+30,129,132,231,110,7,160,51,97,65,224,0,0,236,65,6,132,165,227,153,+4,64,62,227,203,7,196,59,224,177,0,0,79,128,194,97,244,99,47,192,+67,65,143,91,82,157,92,232,97,6,100,160,150,208,69,86,224,29,6,131,+31,160,29,253,108,20,238,7,2,1,73,79,184,22,192,0,100,68,129,44,+99,3,133,58,83,45,3,95,55,49,52,224,68,2,9,73,79,46,112,101,+114,102,111,114,109,224,67,1,97,43,96,60,162,222,224,60,0,228,41,5,+64,222,69,30,65,124,0,51,78,129,4,66,32,95,51,53,66,42,177,102,+2,64,95,55,186,34,229,11,9,162,56,229,112,9,96,57,97,62,224,21,+3,139,29,225,162,4,71,224,229,110,8,229,73,3,129,5,225,173,5,196,+48,132,222,160,12,128,204,67,179,99,149,150,96,73,105,96,15,0,57,64,+204,249,14,4,241,76,1,132,171,224,193,6,196,130,224,174,5,230,29,9,+128,159,0,90,201,136,96,11,160,13,224,177,1,128,9,64,174,226,217,3,+97,142,97,202,2,79,32,35,64,169,160,144,231,143,4,224,94,3,131,95,+229,72,8,135,20,96,10,67,76,196,192,131,82,161,229,224,123,7,64,0,+230,47,7,0,67,65,38,115,240,248,58,4,101,74,66,218,1,95,52,66,+193,91,151,64,66,96,165,238,225,1,134,14,0,51,71,169,3,64,95,57,+53,85,72,106,252,96,21,147,2,128,0,246,125,2,99,39,227,213,2,0,+58,103,254,146,187,64,66,64,10,64,164,161,156,79,133,75,90,94,144,70,+136,128,57,232,10,8,93,186,0,95,104,96,1,95,57,155,31,1,95,57,+66,208,64,6,157,30,66,27,0,58,96,234,254,2,0,68,183,228,199,1,+193,78,230,153,9,160,200,132,224,226,121,9,100,51,0,39,99,17,96,152,+231,8,1,128,78,133,9,227,27,1,232,20,0,129,184,231,51,1,224,29,+5,231,10,5,160,7,226,62,1,249,118,2,1,101,113,220,91,231,21,1,+224,87,1,224,14,0,194,22,199,229,192,102,192,225,165,188,69,144,83,152,+158,29,128,71,196,206,97,129,65,18,205,64,0,95,230,102,1,97,216,96,+40,0,52,166,81,198,105,232,72,26,231,34,16,231,32,1,201,79,193,57,+230,59,2,231,47,54,3,64,95,56,55,98,158,226,163,5,66,46,0,54,+98,46,0,90,161,247,233,31,2,97,8,194,15,226,7,159,96,70,1,57,+53,150,111,64,12,118,131,166,94,0,56,85,169,96,48,128,21,96,39,225,+167,4,164,163,225,148,117,65,149,212,224,225,144,3,66,107,226,101,8,226,+85,6,184,144,96,217,172,187,84,107,1,55,52,229,33,1,224,200,1,204,+118,225,159,0,232,64,3,128,24,228,64,4,158,221,80,127,138,202,227,80,+2,107,234,192,57,99,128,68,151,0,50,235,150,1,138,185,227,20,5,96,+13,136,99,101,202,128,29,2,56,51,56,234,154,2,0,56,99,168,197,79,+162,39,65,16,117,248,0,55,106,202,96,96,1,56,48,226,41,3,0,36,+194,40,168,34,0,56,109,140,2,95,55,57,64,91,0,48,80,100,193,132,+0,58,103,67,197,49,204,185,134,140,0,55,170,42,130,219,225,9,2,75,+119,224,13,0,235,108,1,174,76,224,40,2,128,178,2,95,57,52,120,152,+150,163,1,52,51,96,254,226,247,2,160,207,0,55,86,215,254,192,6,64,+33,64,71,68,118,173,16,230,158,0,224,244,8,130,107,0,58,65,120,64,+209,127,230,195,82,65,115,70,236,88,179,224,50,1,29,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,112,97,116,64,9,7,77,97,116,99,104,70,97,105,88,77,165,16,+67,76,161,87,1,57,53,132,235,66,220,0,57,67,11,128,127,207,57,1,+80,32,169,10,64,20,142,237,225,53,3,1,95,57,69,102,187,3,99,26,+0,58,97,41,111,213,196,122,0,80,106,165,67,131,239,213,3,230,195,6,+0,66,65,226,181,246,65,94,138,189,0,75,240,4,3,161,73,130,193,1,+57,52,178,214,224,46,5,127,6,128,0,3,95,57,52,53,100,6,214,164,+192,111,225,221,2,231,81,5,130,250,224,5,3,128,73,229,41,0,223,180,+160,216,140,84,64,0,128,66,224,1,1,233,178,4,238,6,3,230,229,4,+224,134,1,224,140,1,224,77,9,224,75,5,234,226,0,164,200,192,76,143,+89,224,5,3,96,158,160,102,224,64,2,143,92,64,23,68,59,106,183,224,+116,4,192,83,236,52,0,224,114,1,192,34,105,214,100,110,230,66,4,224,+66,1,96,111,224,17,3,0,83,152,225,224,52,5,208,105,224,40,3,236,+172,6,160,51,174,249,160,206,242,105,0,224,143,5,160,62,227,193,4,240,+117,4,224,56,0,229,255,0,239,162,4,225,220,1,160,35,225,234,3,178,+218,160,97,225,172,0,192,154,64,157,0,80,99,158,238,171,0,238,195,1,+64,46,163,251,164,75,70,14,125,30,64,0,160,9,230,139,17,3,79,32,+35,49,67,34,131,10,230,135,11,204,140,97,106,163,112,96,45,160,111,0,+55,64,16,227,26,1,128,40,226,134,4,64,27,129,64,226,110,4,236,75,+0,241,229,0,163,27,224,34,2,178,196,224,128,18,2,56,51,51,224,128,+5,225,71,1,226,104,3,224,108,0,166,214,175,123,128,144,224,82,5,126,+94,0,53,224,84,0,224,91,0,102,193,192,40,224,108,3,226,235,2,231,+76,5,64,51,90,185,240,127,10,220,146,197,172,0,58,100,225,179,239,1,+80,32,163,215,0,80,69,26,65,97,96,24,182,245,199,158,64,7,98,58,+0,58,97,244,251,134,3,128,211,64,124,224,97,1,226,233,0,224,246,17,+98,71,224,246,24,0,58,68,251,128,110,210,166,233,145,24,0,58,101,82,+224,162,6,225,244,1,0,85,230,217,8,130,47,177,41,224,13,10,133,33,+228,14,0,96,190,117,123,224,69,2,101,204,226,26,2,192,69,160,122,0,+39,72,252,1,49,55,233,33,3,25,92,51,52,38,115,114,99,47,77,105,+99,114,111,72,115,47,68,101,115,117,103,97,114,46,104,115,64,25,6,44,+51,57,48,58,49,48,240,177,2,227,200,3,129,86,227,192,3,64,0,229,+213,3,224,2,7,224,71,1,228,182,3,228,191,2,160,83,230,10,1,224,+195,1,224,201,6,192,10,71,76,224,85,12,133,10,224,55,2,224,96,4,+224,102,8,224,103,6,224,55,5,230,122,11,224,50,14,96,98,229,240,4,+224,52,26,224,195,3,224,31,11,130,5,128,0,225,95,11,199,90,224,53,+5,224,23,1,239,89,0,128,18,96,30,194,68,224,8,10,96,242,224,11,+2,174,60,224,94,0,137,153,195,41,128,83,228,144,4,194,176,161,170,131,+131,230,61,4,209,194,224,76,0,192,20,226,207,4,106,116,99,112,0,57,+119,178,224,95,2,229,117,5,231,169,4,138,154,198,90,142,162,202,43,194,+194,229,172,0,234,173,1,175,4,228,54,1,0,95,105,72,65,200,1,66,+32,247,200,0,183,241,183,233,228,98,2,225,243,11,64,41,140,83,242,40,+0,148,124,224,144,4,165,68,64,8,200,11,228,154,1,229,123,1,192,208,+1,95,52,147,178,96,15,64,163,224,102,2,128,136,224,135,5,180,162,224,+38,5,66,81,1,95,57,232,255,3,192,33,224,1,5,226,206,8,226,205,+5,224,48,9,226,202,2,224,26,7,226,197,1,192,17,193,62,97,65,97,+33,128,220,1,95,54,245,107,20,84,157,82,119,224,0,4,226,226,38,106,+250,226,214,3,226,212,0,160,77,226,96,11,173,215,160,33,96,53,226,52,+0,196,115,96,21,129,149,64,141,130,66,128,24,226,67,2,192,133,228,166,+0,226,73,14,230,29,5,244,1,0,64,36,185,85,194,4,83,215,0,50,+226,84,11,228,92,3,229,191,3,96,121,225,53,1,131,43,225,29,1,224,+11,12,228,24,55,128,102,228,194,6,64,72,223,175,192,0,193,42,192,236,+224,140,1,160,182,224,155,0,2,95,54,56,71,134,224,60,0,226,5,8,+160,98,224,101,4,73,199,0,50,127,159,0,50,156,180,230,218,8,193,151,+192,1,224,164,9,163,28,160,43,98,173,161,68,106,161,79,224,242,244,6,+194,46,169,222,192,225,72,11,129,171,128,64,65,216,213,145,2,95,57,50,+234,154,1,161,100,229,33,3,64,16,117,245,1,57,50,142,109,228,190,2,+113,39,0,57,143,93,64,21,128,16,0,50,93,213,128,0,192,42,224,45,+0,65,193,85,156,65,30,1,51,49,180,2,1,57,51,178,250,100,250,0,+90,101,10,73,102,96,178,96,16,192,100,224,86,0,225,187,1,163,31,66,+131,228,203,0,160,198,229,236,7,99,40,2,64,95,57,213,125,228,13,5,+253,213,6,97,82,97,115,228,235,6,100,23,183,188,202,148,224,39,4,224,+38,5,224,37,2,160,131,192,229,129,136,128,229,0,90,110,249,141,118,161,+230,235,106,4,129,122,96,59,235,43,3,233,250,0,237,178,1,226,76,0,+96,65,237,106,3,64,1,196,14,192,19,225,203,0,224,111,12,224,59,5,+163,230,225,124,2,238,196,9,106,214,224,55,0,96,93,194,112,230,147,3,+228,84,18,160,0,0,58,112,169,145,83,169,72,97,98,227,117,0,255,9,+4,228,229,1,233,190,2,226,252,1,240,199,3,224,208,0,235,6,13,224,+63,0,206,121,228,74,3,174,85,160,214,101,120,131,144,99,148,134,97,83,+172,161,239,252,169,8,64,0,1,95,57,83,203,0,58,98,132,160,222,64,+72,194,123,0,39,248,119,5,100,65,216,125,0,51,65,149,3,95,57,52,+48,96,63,209,242,128,177,84,116,163,69,224,206,0,225,182,2,224,21,24,+224,227,5,224,46,8,160,35,195,205,149,18,128,28,247,218,0,128,84,228,+225,2,131,129,228,14,0,224,22,0,179,204,64,49,194,73,130,33,96,29,+186,232,143,158,2,52,57,56,117,138,104,143,129,70,96,54,225,252,11,229,+133,0,64,71,224,42,0,128,33,134,98,225,252,15,232,57,0,224,66,0,+224,94,1,231,208,2,96,19,168,73,253,139,3,128,74,160,242,176,56,194,+43,96,26,0,90,66,130,160,13,249,252,1,1,64,64,68,67,129,181,96,+0,0,58,97,218,243,178,1,96,71,162,97,96,95,192,5,202,180,224,194,+0,246,180,6,128,22,243,175,4,224,25,2,160,90,225,40,1,192,18,128,+5,131,155,1,57,51,85,26,182,243,128,6,136,42,130,148,133,192,0,55,+129,123,96,224,132,210,224,14,5,0,95,92,40,98,202,160,0,247,229,13,+225,205,0,226,56,1,164,41,225,8,1,98,33,1,95,57,229,74,4,96,+0,247,144,7,0,110,183,254,247,167,7,215,168,67,68,124,26,160,166,166,+39,220,170,88,25,0,51,131,135,124,174,156,38,161,231,188,151,225,185,3,+0,58,96,146,143,185,0,57,188,225,128,194,128,56,0,55,182,56,0,51,+119,142,0,58,65,51,128,45,165,184,80,203,144,77,131,16,65,149,129,94,+0,55,92,185,97,166,132,144,231,243,0,128,42,229,76,1,0,58,96,119,+176,231,67,91,225,70,0,224,2,1,161,53,226,240,1,102,237,198,11,224,+23,2,128,1,230,38,1,233,41,6,238,249,14,224,98,12,229,29,0,130,+181,195,130,229,86,4,64,18,224,41,1,165,70,170,5,160,23,224,17,6,+96,8,194,37,252,64,1,252,37,4,252,38,1,224,93,1,225,98,0,134,+26,224,89,1,224,8,0,1,95,55,120,179,97,92,1,55,50,64,75,241,+126,9,1,61,61,248,230,1,250,227,4,64,0,134,249,230,255,2,128,1,+163,250,224,16,16,64,112,67,192,0,54,81,207,130,252,84,49,0,56,65,+234,98,151,0,35,64,225,222,222,224,70,1,186,107,241,110,21,9,69,110,+99,111,100,101,68,97,116,97,209,113,5,49,53,50,58,49,51,241,113,2,+225,253,6,228,169,0,224,22,5,235,228,0,224,45,28,224,22,0,193,234,+195,235,232,154,1,226,142,6,160,45,234,47,0,65,166,121,79,225,148,15,+2,79,32,35,67,141,233,242,0,225,143,9,64,88,226,100,1,226,160,3,+226,122,4,101,102,160,50,192,0,226,41,0,165,60,133,109,197,187,0,58,+101,29,1,10,65,89,108,0,58,103,158,100,81,100,17,88,215,128,3,1,+80,32,72,119,164,89,229,234,8,69,69,1,10,65,70,225,106,57,66,214,+0,90,129,56,64,14,66,148,160,14,230,105,6,234,119,4,202,72,65,158,+0,75,66,52,128,24,224,55,11,4,64,95,49,54,50,203,107,0,58,96,+6,252,240,0,193,158,66,100,0,58,75,151,228,162,2,64,33,96,7,99,+245,233,141,3,232,180,1,246,88,2,128,23,160,87,248,195,3,0,85,216,+82,163,125,234,222,22,224,37,11,224,36,1,194,94,74,61,4,49,48,32,+64,80,64,7,0,49,65,253,64,188,129,95,135,74,2,80,32,58,108,184,+64,235,241,103,0,233,113,4,96,162,186,156,224,184,13,75,195,181,241,132,+121,224,149,3,175,1,97,150,192,36,224,37,9,96,24,221,121,237,120,4,+0,67,72,240,234,32,0,246,236,3,0,58,96,32,230,171,10,7,51,56,+56,32,95,50,48,50,227,246,2,7,99,111,110,65,114,105,116,121,195,214,+107,86,64,42,226,54,2,96,132,0,58,110,143,166,175,95,3,98,38,64,+22,0,54,232,122,7,224,9,0,96,120,0,57,97,12,98,153,107,184,199,+11,1,95,49,101,114,129,37,134,237,0,58,96,88,230,229,7,133,153,128,+85,254,229,1,96,64,192,53,214,207,239,7,0,2,95,55,56,66,174,175,+92,1,55,55,237,203,0,96,146,1,55,56,72,137,1,95,54,106,29,129,+88,237,237,1,158,172,96,86,131,105,99,99,134,142,129,225,227,32,3,202,+98,1,95,55,88,26,131,7,76,150,3,10,65,32,75,109,154,241,97,2,+226,61,14,224,25,12,64,123,130,204,106,133,174,72,96,182,227,171,0,79,+170,137,55,224,37,22,230,239,3,96,0,224,49,6,96,200,224,48,3,0,+90,201,159,224,38,23,175,135,246,73,6,164,28,227,236,12,96,40,133,74,+224,90,2,64,22,244,13,10,130,246,128,17,224,49,19,160,32,102,106,241,+159,13,1,95,49,109,4,231,14,1,225,64,18,143,135,225,63,8,229,17,+1,64,0,0,58,116,162,229,136,0,228,31,15,114,116,224,25,12,201,164,+107,57,224,25,4,96,168,192,25,228,87,4,68,178,224,184,18,96,30,224,+185,10,1,50,49,244,63,0,128,59,129,86,225,83,8,110,38,225,133,7,+128,44,225,82,0,161,72,224,88,5,162,6,71,71,192,0,224,164,16,64,+93,224,163,21,225,21,13,103,13,225,21,12,99,174,224,111,16,64,29,225,+19,27,224,58,10,100,174,224,170,21,224,59,16,64,34,224,59,22,227,249,+14,224,231,3,224,25,4,97,93,225,1,12,166,133,224,138,14,227,183,8,+128,138,0,49,226,207,1,224,58,16,228,74,14,0,57,75,49,0,53,233,+48,1,224,65,18,64,206,224,65,12,242,41,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,104,+242,100,214,0,58,96,6,163,232,1,95,57,94,63,160,193,96,66,128,17,+109,179,160,17,0,58,96,219,224,48,1,103,178,1,49,55,70,25,64,32,+7,10,65,32,102,47,61,32,58,96,18,64,12,0,61,96,12,0,54,231,+69,1,103,255,0,66,79,5,158,151,96,6,0,58,64,103,64,34,70,208,+0,52,117,9,198,90,163,206,228,249,14,228,251,1,96,183,224,7,2,117,+202,81,100,97,207,96,184,135,72,64,95,104,151,116,139,161,12,99,220,0,+58,96,6,64,133,1,32,83,129,91,226,195,12,195,171,224,25,9,196,219,+224,25,9,132,60,233,74,15,103,132,1,95,55,76,219,3,95,55,56,55,+200,234,107,220,135,239,224,19,0,96,68,80,215,0,50,71,212,112,189,207,+171,0,56,132,124,246,250,2,149,55,240,94,1,129,75,143,35,1,66,32,+112,12,214,241,3,95,49,53,52,64,4,6,54,32,64,79,32,35,49,64,+63,137,126,2,95,49,50,75,66,211,189,104,13,1,54,54,80,16,137,38,+64,109,64,163,2,49,56,51,137,75,192,0,233,237,9,97,3,73,238,160,+24,128,141,108,202,188,104,224,6,5,64,0,193,246,229,198,4,130,218,131,+4,228,75,11,96,134,234,109,15,96,116,65,48,160,100,128,65,1,95,56,+66,190,8,95,53,52,55,32,95,53,52,56,234,182,3,128,52,96,50,0,+56,123,185,129,99,253,26,5,224,135,12,99,175,224,135,8,96,21,224,82,+0,65,195,241,150,7,0,102,239,78,1,64,34,2,54,49,56,221,143,96,+49,98,19,224,50,14,224,156,9,139,95,2,95,56,57,76,9,224,23,2,+129,126,226,170,9,229,136,4,224,25,4,101,81,192,232,226,199,4,101,246,+161,148,3,95,56,57,54,194,173,4,95,52,51,57,32,236,126,0,129,251,+237,55,2,128,67,237,55,12,133,189,224,32,18,195,12,225,94,8,192,24,+190,49,211,173,1,52,48,155,51,236,171,16,207,43,96,193,0,55,66,209,+68,136,128,0,227,184,8,65,36,4,85,32,95,57,48,128,109,226,107,15,+2,95,57,48,199,17,128,92,224,154,2,1,95,57,121,100,225,33,5,226,+72,14,226,208,20,224,154,0,196,178,224,37,10,234,118,2,193,124,128,43,+230,66,0,224,48,1,170,238,133,94,252,250,1,224,52,21,161,42,224,52,+6,224,10,0,224,52,13,160,244,224,41,4,192,229,150,100,64,42,234,160,+3,226,246,6,0,68,81,193,11,76,105,115,116,95,84,121,112,101,46,43,+43,241,192,0,128,83,227,231,3,227,232,4,224,0,6,196,138,99,99,228,+131,8,120,69,204,4,111,90,130,222,239,95,7,0,58,96,50,70,98,0,+49,81,147,1,49,52,102,89,100,49,2,56,56,52,66,81,1,51,48,192,+17,0,58,96,6,109,72,224,168,0,78,188,160,186,229,147,7,224,242,1,+11,105,109,112,111,115,115,105,98,108,101,58,32,160,237,130,42,181,6,128,+61,69,179,0,57,69,222,64,16,98,99,254,16,0,224,94,11,2,79,32,+35,80,250,242,53,1,64,64,252,57,1,96,174,168,39,224,218,2,96,95,+175,190,114,21,189,124,102,48,124,199,66,225,224,115,18,83,218,160,98,161,+129,224,65,3,134,114,224,56,12,86,4,230,158,14,161,100,96,155,0,58,+96,6,168,86,97,220,161,228,97,207,226,75,11,4,82,97,116,105,111,130,+76,2,95,109,107,96,13,2,110,97,108,229,142,1,99,207,1,95,57,132,+75,224,15,2,69,211,0,58,100,13,2,10,65,32,97,105,0,58,96,20,+96,13,0,75,96,13,0,54,232,90,0,129,172,0,57,70,110,90,212,0,+48,68,6,0,53,80,189,116,221,3,95,56,57,56,64,88,162,180,1,32,+95,70,146,96,36,224,37,4,0,57,85,14,192,37,224,215,24,11,73,110,+116,101,103,101,114,46,95,105,110,116,67,47,1,84,111,160,17,224,218,1,+102,219,65,109,70,63,70,102,244,56,3,2,95,57,48,171,79,224,105,30,+161,67,1,105,110,224,106,11,229,103,6,200,67,64,0,0,58,97,81,97,+54,0,67,69,248,104,172,0,95,73,163,64,33,164,49,0,58,96,141,225,+105,2,137,182,3,95,56,57,57,88,33,168,145,1,57,48,98,8,5,49,+32,95,54,54,32,100,213,140,126,139,95,224,29,15,0,58,97,83,9,10,+65,32,117,113,117,111,116,32,58,64,34,64,14,0,73,64,10,243,61,0,+64,105,225,220,1,65,177,64,13,73,103,96,74,0,85,96,20,129,255,145,+95,134,248,196,132,160,16,247,108,4,1,95,57,107,165,99,6,0,56,109,+72,2,95,56,56,200,161,0,79,196,151,98,245,161,165,233,1,1,203,24,+252,47,5,1,95,56,68,165,96,49,1,95,56,124,142,0,64,64,150,0,+54,160,185,96,119,0,95,130,113,132,164,0,57,107,40,96,42,146,26,101,+178,171,136,132,101,210,163,133,204,96,185,96,198,230,156,1,75,219,133,59,+221,226,192,7,160,234,224,255,1,224,254,1,0,83,64,57,254,35,0,229,+188,10,64,135,64,54,2,95,56,57,69,163,0,54,68,8,194,184,0,57,+66,168,1,55,52,199,223,64,17,162,172,0,58,96,9,66,26,221,114,2,+95,56,48,248,185,3,1,36,118,155,0,96,67,243,155,3,96,252,232,128,+0,225,191,1,64,237,231,103,0,231,79,0,97,2,160,182,64,15,193,185,+96,183,193,255,65,146,160,47,223,70,96,208,66,85,225,181,2,128,29,65,+49,234,131,0,128,25,65,222,96,248,243,150,0,0,56,115,234,197,164,225,+162,0,160,170,192,140,248,85,3,232,29,8,198,214,192,187,152,208,160,58,+129,171,87,172,0,55,227,230,7,13,66,111,111,108,46,111,116,104,101,114,+119,105,115,101,231,118,0,216,50,224,244,0,248,80,0,129,22,78,22,224,+38,1,224,23,0,0,55,174,218,128,23,0,58,97,227,131,58,2,83,32,+64,251,148,0,227,53,0,192,87,224,17,2,192,102,227,109,0,64,14,115,+197,230,212,0,225,15,5,192,45,65,204,154,252,225,22,3,107,231,224,55,+4,193,26,194,177,224,131,0,224,88,1,219,203,128,146,206,162,227,249,3,+195,167,226,57,0,94,83,1,53,50,235,46,13,128,30,135,17,130,221,196,+25,193,49,1,95,53,79,132,236,169,2,228,41,8,225,136,1,226,125,1,+0,39,66,96,160,41,68,33,160,124,227,163,1,0,95,64,14,99,70,128,+88,232,5,0,227,202,0,193,85,240,220,0,161,134,110,109,161,17,93,115,+250,186,2,98,242,161,115,160,51,228,255,0,213,15,96,240,87,114,64,240,+235,124,2,129,68,228,48,2,226,224,11,225,95,14,65,148,129,152,224,16,+1,2,95,55,53,66,111,96,146,227,51,9,235,79,0,1,95,50,68,129,+247,10,0,133,64,224,167,14,224,22,7,0,53,246,52,0,226,129,0,192,+36,228,245,5,68,1,91,63,120,12,252,179,7,124,154,2,48,58,48,99,+95,160,70,130,103,224,46,25,137,237,128,0,228,245,7,0,109,231,139,0,+65,237,0,56,75,94,119,225,128,16,64,245,70,95,0,83,90,156,225,86,+7,65,52,225,12,0,160,48,1,55,54,66,40,224,59,0,0,50,129,19,+102,93,72,37,1,56,56,117,84,224,131,6,0,112,253,108,2,2,95,54,+57,64,39,124,212,67,254,135,114,66,130,73,82,130,225,0,58,96,30,178,+70,239,248,1,0,80,161,120,66,223,131,117,0,80,64,22,237,93,3,0,+52,156,159,129,64,236,137,1,177,8,98,163,0,80,239,27,1,129,252,66,+189,130,95,145,58,193,179,242,120,3,235,174,1,0,83,226,222,1,64,122,+192,72,203,23,102,13,198,179,224,174,1,160,120,208,91,185,183,128,37,227,+115,1,1,95,56,73,244,209,253,156,233,131,241,224,10,1,0,58,97,98,+198,191,163,243,229,49,1,227,13,5,99,46,230,216,0,194,249,160,188,238,+120,7,225,231,1,167,4,230,92,4,224,43,5,163,177,225,97,2,192,121,+224,39,4,165,91,129,55,163,106,243,14,4,252,89,3,238,17,2,229,156,+7,100,55,193,39,224,116,0,192,121,224,84,1,248,86,1,225,200,1,119,+251,161,206,96,0,230,88,5,224,221,11,240,62,3,224,40,20,181,165,225,+113,0,238,241,4,224,28,2,132,245,220,194,67,1,192,237,97,194,0,80,+96,175,165,167,0,53,66,28,128,190,125,12,160,181,225,43,5,166,240,96,+11,232,166,2,225,132,12,128,66,225,255,1,224,32,8,130,110,225,19,1,+224,32,8,196,247,243,161,13,224,225,2,229,223,4,232,123,9,96,30,160,+254,160,212,195,60,64,153,225,205,6,249,14,1,224,50,0,224,87,8,177,+208,254,124,5,225,226,27,225,58,0,225,225,21,233,218,0,226,155,11,224,+27,1,64,199,240,247,4,206,223,128,30,225,241,0,226,141,10,128,225,193,+89,224,55,0,187,222,96,28,0,82,224,220,4,240,65,4,240,62,19,7,+112,97,116,86,97,114,115,32,133,124,144,151,102,84,160,225,150,91,0,50,+72,26,94,41,1,95,53,106,106,164,235,96,127,0,58,68,143,105,157,70,+30,0,90,231,156,0,160,54,0,53,102,249,97,49,128,17,209,192,153,145,+111,186,162,13,224,31,12,80,19,97,55,224,29,5,1,51,51,96,135,2,+52,48,53,230,67,2,1,91,93,128,198,224,45,29,1,40,41,128,45,224,+36,20,1,45,62,230,150,3,0,56,79,106,96,242,239,203,1,2,95,56,+56,69,20,0,58,96,27,6,10,65,32,104,101,97,100,96,59,0,58,96,+24,172,108,1,53,50,79,223,0,54,76,114,0,58,97,100,134,184,139,237,+131,212,71,194,97,193,67,215,198,227,67,231,101,199,70,26,149,87,0,80,+96,23,139,17,98,56,71,155,6,80,32,85,32,90,32,90,72,60,145,99,+70,102,65,59,247,237,1,201,26,64,51,68,21,224,7,1,65,1,208,57,+160,0,102,165,79,53,97,159,0,58,72,19,128,111,2,83,32,85,226,105,+0,164,173,164,178,105,200,161,251,110,142,128,21,66,21,163,68,200,54,169,+253,166,65,196,12,150,122,65,185,97,47,64,33,1,95,56,241,244,0,160,+215,96,240,96,216,136,248,71,55,165,243,224,141,5,192,36,168,22,237,198,+0,166,237,167,138,227,79,0,160,254,121,71,96,8,227,76,2,2,95,56,+55,97,246,146,255,211,55,2,95,56,55,132,217,0,58,97,40,236,158,0,+132,43,0,83,234,225,2,64,140,144,207,224,27,0,107,12,128,27,232,81,+1,224,16,0,236,147,4,192,1,172,110,224,19,2,165,218,224,16,13,203,+75,199,230,225,225,1,192,21,104,108,224,162,3,184,158,192,51,232,47,0,+0,67,224,175,6,171,203,230,251,3,229,34,4,224,42,2,230,118,0,119,+63,0,51,88,187,160,33,224,60,3,182,73,224,174,0,136,128,224,138,2,+192,2,160,24,132,155,128,55,224,52,1,224,55,2,226,107,0,104,222,128,+5,174,33,64,42,109,48,210,100,197,230,224,100,1,192,198,224,71,8,129,+19,97,37,64,214,100,56,0,52,224,70,5,2,95,49,55,200,141,130,188,+193,252,227,135,13,161,214,64,8,195,146,161,198,225,183,6,129,170,224,0,+0,129,87,224,196,1,224,43,0,84,252,132,164,224,157,4,251,153,8,227,+237,0,1,95,49,128,32,135,125,96,68,224,53,0,0,95,66,247,251,196,+4,165,243,192,220,194,215,64,181,2,95,56,55,83,60,92,135,252,11,12,+199,207,96,41,97,24,193,6,163,177,196,139,224,20,2,162,208,64,0,0,+58,99,110,241,146,3,229,47,0,232,19,0,64,57,232,232,2,167,37,96,+81,246,237,1,65,210,203,233,128,25,202,51,76,185,134,142,64,109,211,194,+224,109,8,226,34,1,168,137,229,65,6,0,58,99,73,103,16,1,95,56,+66,239,119,113,0,48,130,10,0,54,70,6,1,56,55,101,200,0,58,100,+87,182,142,2,56,55,50,64,25,0,54,71,100,0,56,73,209,0,58,96,+37,160,130,226,59,9,226,29,4,178,65,64,0,3,95,56,55,51,96,60,+134,99,132,107,128,192,96,231,193,43,195,212,195,100,97,52,164,178,229,169,+0,226,124,5,197,141,128,165,0,58,96,104,96,159,101,53,220,87,82,144,+193,120,0,79,248,67,3,98,43,77,195,67,33,3,95,52,57,55,232,177,+1,0,58,96,253,103,42,1,50,48,64,133,0,58,96,36,64,16,126,216,+2,52,55,50,64,89,68,160,3,95,56,53,57,96,31,237,252,0,2,95,+56,54,118,153,0,54,238,26,2,65,102,225,129,2,192,177,64,34,118,24,+3,54,54,32,58,96,19,167,158,118,228,1,51,54,98,244,2,56,54,53,+96,43,129,155,137,135,193,253,129,117,70,116,139,142,234,29,3,228,198,5,+2,95,56,54,235,83,0,224,29,0,224,26,5,231,19,3,160,19,129,141,+135,62,71,103,227,66,12,128,161,224,44,7,131,167,192,27,224,28,7,98,+155,224,28,15,180,61,160,28,100,147,130,49,132,16,228,101,1,1,32,95,+94,157,132,27,224,155,6,236,131,0,0,58,96,71,195,58,131,142,103,218,+232,117,5,230,25,2,204,22,224,30,3,101,167,142,157,118,83,225,60,0,+0,83,167,27,128,13,192,46,96,16,225,79,2,64,56,245,131,4,224,56,+1,224,19,3,224,62,2,161,20,114,155,230,116,3,160,108,192,28,64,16,+153,129,230,54,0,232,62,2,192,41,227,150,0,226,5,0,128,0,241,163,+10,20,115,114,99,47,77,105,99,114,111,72,115,47,73,110,116,77,97,112,+46,104,115,113,184,3,55,51,58,49,234,124,2,65,88,131,211,203,220,101,+106,65,127,101,239,130,195,0,56,74,97,64,42,131,155,0,85,128,203,96,+38,96,19,203,186,0,58,96,40,202,65,114,215,85,100,97,240,243,178,5,+97,59,161,172,84,40,113,27,238,99,2,64,1,237,25,0,174,64,120,1,+70,35,238,20,2,193,237,193,92,246,159,0,0,80,229,131,1,195,40,96,+148,241,141,1,1,95,56,76,68,197,194,192,7,167,203,229,191,3,226,53,+0,141,156,1,95,56,165,206,196,185,128,11,99,230,0,58,100,24,100,12,+1,53,49,64,4,100,85,64,26,128,19,2,52,32,58,96,19,193,34,64,+37,128,212,68,134,0,95,70,30,1,64,58,96,95,128,47,81,177,64,65,+64,29,96,51,165,96,194,102,137,50,224,224,3,238,124,2,225,11,0,196,+36,99,122,64,86,130,87,224,46,5,131,189,193,103,140,188,128,40,162,165,+180,116,1,56,53,177,173,162,148,192,77,230,194,0,226,228,5,233,111,10,+160,24,225,213,0,169,120,192,85,192,1,160,138,224,137,1,231,251,15,224,+75,59,232,142,2,224,75,23,167,159,224,75,17,193,15,161,35,128,2,229,+168,0,97,93,0,56,158,179,162,225,225,191,3,118,69,224,31,4,224,122,+0,228,53,4,96,40,224,39,5,224,40,8,224,11,0,160,47,224,46,6,+66,192,156,1,186,213,0,58,66,112,102,225,161,167,239,176,0,225,132,23,+224,40,26,129,97,247,195,0,225,62,23,96,171,99,49,64,10,224,5,0,+162,192,224,26,5,224,27,0,113,33,224,30,2,224,31,12,160,33,224,27,+6,224,34,0,104,84,96,151,225,29,3,0,58,98,246,2,10,65,32,119,+104,0,58,96,44,163,196,235,90,0,224,10,6,225,121,1,232,236,0,0,+58,96,120,96,55,234,158,2,64,27,0,58,96,114,158,1,100,20,190,1,+68,162,246,141,6,1,95,56,87,69,1,95,49,185,79,1,95,49,101,169,+0,58,101,22,224,42,6,101,45,104,223,81,179,255,67,9,70,23,0,33,+134,13,0,73,64,213,68,207,161,254,133,152,171,199,194,160,160,128,228,27,+1,160,31,204,159,227,254,9,227,249,11,231,8,7,129,46,227,238,33,224,+63,0,163,82,227,220,32,128,56,166,44,227,195,28,225,64,0,224,10,4,+224,11,15,227,79,5,0,58,96,22,152,97,1,49,48,91,66,109,66,72,+211,0,58,96,33,192,26,237,93,0,160,26,194,104,127,223,80,111,194,48,+128,16,194,65,133,125,0,51,71,12,233,243,3,65,21,228,33,0,114,179,+141,184,165,196,154,51,108,91,186,68,83,104,213,16,64,54,232,6,11,101,+219,202,168,107,78,226,229,1,250,157,6,97,94,65,19,65,117,109,235,64,+6,151,31,237,200,2,129,206,148,107,0,58,122,155,98,187,160,193,160,221,+0,55,120,227,192,199,64,59,0,55,96,86,128,167,128,84,96,107,224,76,+2,236,216,3,128,79,135,243,77,47,1,48,57,96,7,244,183,6,3,79,+32,35,49,64,74,182,249,1,49,50,65,144,231,218,1,64,196,0,54,238,+126,14,162,89,0,58,96,237,227,124,0,120,114,76,95,169,208,175,5,96,+152,99,85,227,141,5,8,33,33,58,32,101,109,112,116,121,251,47,0,131,+71,64,218,227,106,1,192,68,240,34,14,96,168,224,87,9,0,60,155,166,+0,58,97,34,131,218,105,105,236,153,2,128,11,105,167,0,58,98,78,238,+160,1,224,206,1,175,4,160,2,193,130,227,123,0,248,189,5,224,40,24,+130,13,232,49,3,224,40,15,234,16,0,168,158,227,188,2,249,205,2,249,+165,4,164,30,249,203,15,163,54,199,164,184,206,160,59,163,37,224,104,11,+154,120,224,66,3,149,18,224,112,12,161,9,224,150,3,225,21,25,166,127,+224,39,24,164,120,249,124,23,249,58,68,96,242,68,48,99,134,88,87,71,+15,96,5,2,95,55,57,131,228,0,56,245,237,4,64,87,224,81,8,250,+152,6,196,148,100,137,163,230,2,54,49,56,160,93,227,191,0,1,56,51,+64,107,125,101,1,56,51,142,144,100,87,184,169,224,107,14,231,206,0,224,+231,1,243,24,0,249,49,4,224,49,0,234,216,0,224,41,2,226,119,0,+104,185,227,211,1,146,197,198,38,96,36,132,149,0,53,102,12,160,10,68,+68,207,18,237,49,0,80,198,2,95,56,51,161,11,224,0,0,128,68,230,+215,9,250,54,3,226,106,11,160,24,249,202,5,129,64,193,32,226,135,4,+219,219,1,58,56,72,65,99,236,0,80,143,105,102,95,64,151,168,217,160,+22,152,27,64,181,96,23,97,59,102,36,0,55,95,66,136,29,96,222,65,+190,0,55,100,72,134,40,126,126,108,117,64,123,64,140,205,226,1,95,56,+89,135,0,58,97,216,165,247,3,95,52,48,54,129,36,2,52,57,56,64,+223,228,227,7,153,180,0,58,96,57,224,160,1,131,150,128,161,199,25,96,+24,131,243,128,24,178,6,6,52,52,48,32,85,32,83,225,88,6,64,175,+224,19,7,65,183,224,19,6,96,79,224,19,7,68,2,234,210,0,228,144,+2,0,85,83,156,66,174,90,47,221,66,229,157,5,12,103,101,116,83,76,+111,99,32,69,85,86,97,114,239,145,0,224,76,7,64,62,64,60,70,80,+107,241,227,5,3,121,154,160,103,74,242,133,11,128,0,96,113,224,44,3,+128,93,224,230,5,65,59,224,113,7,65,111,89,245,224,60,6,224,18,1,+0,52,71,172,160,19,116,132,224,19,0,1,95,50,112,39,64,0,225,80,+7,66,141,224,125,7,99,244,229,100,6,67,20,224,125,12,224,142,16,224,+222,1,224,95,7,225,156,10,0,49,225,156,5,200,249,225,72,2,225,44,+1,224,241,11,224,216,8,64,195,224,18,6,129,84,224,138,5,136,168,224,+138,5,64,104,224,234,12,108,164,225,235,1,129,218,134,80,225,129,9,192,+36,133,212,224,120,7,65,78,224,119,6,64,243,225,78,7,224,70,1,64,+107,225,2,0,224,157,2,128,132,165,32,225,6,9,129,106,224,18,4,65,+105,224,122,6,64,62,224,241,12,132,154,224,133,6,203,239,225,75,7,226,+179,10,226,178,23,224,210,3,225,210,9,0,58,96,30,228,32,1,225,127,+7,98,37,224,74,8,0,58,96,161,228,86,16,225,17,37,224,168,11,224,+19,29,225,29,31,225,240,7,225,26,17,226,4,6,1,64,58,98,92,224,+232,1,226,19,6,166,198,0,58,97,39,225,14,3,228,176,27,170,48,96,+62,183,55,64,62,70,52,224,160,6,224,12,11,226,148,3,0,58,96,76,+224,64,1,224,66,3,161,236,224,242,7,227,222,7,224,15,7,0,58,96,+91,224,248,9,224,31,2,245,58,0,64,33,143,49,1,52,48,135,244,0,+90,160,251,128,40,134,154,96,38,76,154,224,122,26,166,179,140,245,4,50,+52,32,95,56,101,174,1,95,56,69,161,1,58,56,70,142,64,31,2,55,+49,51,64,4,4,52,32,79,32,35,89,218,99,74,0,58,96,36,224,30,+8,0,57,224,30,0,64,74,247,76,5,202,242,98,56,232,65,0,233,224,+4,235,175,2,160,5,224,21,10,96,18,137,65,224,77,0,233,72,3,139,+238,192,40,160,11,224,17,15,130,198,224,81,3,210,220,224,39,7,224,141,+1,224,25,3,254,2,7,128,80,2,95,55,57,233,123,0,224,70,9,168,+183,224,117,7,110,142,72,152,160,24,170,186,160,2,64,50,6,95,56,48,+49,32,79,32,139,6,233,108,0,224,97,1,131,167,160,91,160,144,245,156,+2,96,62,233,57,3,225,131,12,236,167,0,169,233,99,229,203,46,224,60,+2,193,212,128,85,128,20,128,72,224,77,1,1,95,54,86,95,0,55,80,+80,192,89,224,75,1,160,104,224,21,6,96,50,96,190,144,37,103,239,3,+95,56,48,52,232,216,2,1,36,104,238,199,0,96,36,128,50,224,49,20,+1,118,115,248,146,1,129,111,1,95,56,104,50,192,13,139,84,138,254,1,+95,56,104,57,160,23,103,109,0,39,97,128,252,25,3,161,13,238,93,8,+80,45,104,100,64,213,171,32,224,25,0,194,23,130,98,1,58,56,74,6,+243,228,0,74,107,129,41,128,45,211,183,64,77,234,142,2,64,33,106,116,+64,164,145,225,0,56,72,117,220,67,64,214,121,66,234,134,93,208,253,3,+95,55,56,55,68,99,162,192,106,29,207,174,234,115,15,173,125,0,54,241,+51,0,144,43,249,26,0,128,216,224,78,0,224,13,0,234,102,34,224,98,+1,160,62,224,69,0,224,27,4,153,180,224,111,6,192,190,234,107,54,224,+130,10,1,48,53,102,62,224,211,0,225,68,0,1,53,56,98,1,109,64,+225,76,1,103,58,224,183,1,0,90,225,10,2,234,146,34,0,56,106,16,+192,144,109,99,224,147,1,207,9,225,40,10,225,42,22,234,177,73,131,132,+224,107,10,224,135,4,2,53,55,56,129,162,220,198,97,86,1,95,56,83,+130,160,181,2,83,32,73,180,82,143,139,240,118,4,1,95,56,99,17,65,+24,96,55,224,207,1,234,227,33,160,52,224,67,8,225,244,5,128,150,97,+203,224,102,2,233,206,50,226,81,13,1,95,56,164,62,66,189,0,50,226,+190,1,224,157,0,0,48,246,80,0,233,209,29,224,102,13,226,12,22,227,+114,19,64,138,254,115,1,0,58,96,22,100,170,225,45,4,64,182,162,172,+0,58,96,210,228,205,11,225,46,40,226,239,34,224,194,22,224,28,18,225,+89,31,226,56,1,225,202,15,226,197,2,226,91,6,0,58,98,183,225,54,+9,96,35,162,217,226,113,2,0,58,97,73,224,46,13,128,100,160,90,0,+58,96,61,102,80,0,80,225,144,12,224,234,2,224,97,3,0,58,96,70,+96,55,224,57,6,194,28,226,124,2,224,87,15,74,159,162,25,224,9,0,+0,58,96,95,224,185,14,98,219,226,37,0,64,92,126,207,0,49,94,255,+64,28,246,98,1,71,53,163,11,179,142,128,73,97,27,0,48,135,44,104,+198,87,148,87,12,0,51,81,255,103,220,224,63,0,102,143,224,61,0,255,+228,0,96,10,119,243,148,190,166,194,247,222,6,248,147,3,101,129,0,58,+72,156,160,118,84,140,104,186,83,49,1,95,55,178,129,0,48,130,245,0,+95,243,3,0,114,245,0,79,64,201,1,55,57,103,235,250,185,11,160,31,+248,69,10,131,114,96,197,192,64,115,38,0,58,106,74,211,31,2,55,57,+57,147,31,2,56,48,48,201,210,65,59,96,42,64,60,224,53,1,252,63,+1,64,42,128,10,96,62,168,168,92,117,224,7,7,124,161,0,58,106,226,+232,206,1,97,136,72,206,105,26,224,243,81,96,32,128,189,106,154,192,105,+97,189,153,175,2,55,57,51,121,170,1,53,56,204,197,96,54,224,41,15,+234,93,1,1,91,93,153,2,96,166,1,10,65,253,6,7,10,76,105,115,+116,95,84,121,112,101,46,34,96,231,129,219,64,255,129,23,233,238,5,116,+222,213,51,169,99,64,21,205,141,1,56,57,65,105,129,116,96,54,109,187,+1,64,58,64,24,96,33,107,113,0,49,128,175,235,1,2,0,102,139,0,+150,253,122,246,122,222,224,38,14,64,79,129,167,0,75,98,254,65,15,64,+3,0,58,73,229,98,48,74,119,0,51,108,61,221,193,106,225,99,65,0,+49,67,65,149,77,160,29,67,28,93,193,66,93,0,55,161,166,246,225,4,+1,58,55,92,160,194,137,0,48,64,232,64,34,69,78,142,58,2,95,55,+56,65,189,99,114,192,30,2,95,55,56,163,170,64,22,77,120,224,56,0,+154,199,220,22,129,108,97,198,64,159,160,34,64,36,1,95,55,227,168,0,+75,170,2,58,55,56,161,242,224,99,2,0,50,110,194,2,95,55,55,192,+57,67,43,73,168,1,95,50,67,168,96,220,224,85,0,212,162,0,58,96,+155,131,228,98,210,0,55,69,0,0,90,98,174,133,152,96,66,226,241,0,+64,30,0,83,86,202,160,134,163,151,202,39,159,131,103,214,138,21,224,10,+3,255,162,0,97,35,64,82,64,142,79,141,224,246,0,128,126,216,2,64,+214,79,203,96,201,96,8,3,64,64,95,51,112,8,64,53,2,64,95,50,+98,37,96,11,0,58,96,215,96,167,64,18,164,174,224,82,0,66,180,1,+95,49,64,26,161,26,224,112,21,0,90,224,112,2,1,49,57,224,111,1,+65,110,160,110,64,6,64,110,0,51,225,180,1,160,76,216,188,224,188,0,+100,82,1,64,95,96,71,102,139,96,6,102,50,0,58,96,51,165,100,252,+138,0,96,56,1,58,55,66,120,96,37,0,73,96,13,129,242,247,64,8,+9,105,109,112,111,115,115,105,98,108,101,163,223,69,163,96,54,1,75,52,+64,2,82,108,224,1,3,238,25,2,96,45,129,222,65,1,98,195,220,240,+254,230,0,155,84,128,210,65,232,72,37,64,67,192,73,133,148,158,143,166,+129,131,185,96,7,0,51,128,7,67,85,131,136,192,118,228,63,2,104,15,+100,63,64,38,3,10,65,32,73,65,23,196,60,96,34,104,2,101,128,0,+54,129,119,135,109,249,253,4,163,196,84,184,250,212,0,224,32,11,154,6,+64,27,208,115,224,41,4,97,129,160,41,96,29,219,53,160,252,1,95,50,+78,25,3,95,55,54,55,225,132,2,1,45,62,97,124,224,21,6,10,80,+114,105,109,105,116,105,118,101,115,46,160,32,224,89,5,132,109,186,27,225,+148,3,0,54,198,125,125,148,99,185,103,242,67,199,1,95,52,72,14,96,+37,130,58,107,71,65,235,160,21,130,53,142,183,1,95,55,80,117,255,235,+9,229,75,2,3,115,117,112,101,185,120,232,20,5,2,58,55,54,186,150,+160,70,224,52,2,0,67,64,48,2,58,55,54,130,106,0,75,129,75,0,+90,225,121,3,1,95,52,100,117,1,95,55,217,11,2,58,55,54,130,106,+6,98,115,43,43,46,32,58,96,24,132,60,66,123,68,186,1,54,48,232,+220,5,209,57,1,57,56,101,199,1,51,50,192,25,241,173,0,255,193,3,+100,147,102,172,100,161,64,85,0,80,64,148,0,90,129,181,129,7,0,52,+65,7,142,178,244,106,4,225,34,19,20,100,117,112,108,105,99,97,116,101,+32,100,101,102,105,110,105,116,105,111,110,32,161,49,0,51,65,35,192,0,+227,153,6,7,99,104,101,99,107,68,117,112,163,151,93,47,227,233,0,64,+211,1,95,54,102,139,1,52,51,221,75,232,27,6,99,82,189,227,64,7,+1,53,57,99,0,195,24,234,55,2,156,77,230,96,0,157,57,1,95,55,+72,35,243,36,2,234,18,1,236,223,1,0,58,96,85,1,10,65,172,18,+101,39,64,155,106,126,64,7,64,172,0,50,134,159,0,58,96,80,64,43,+68,145,242,83,1,245,57,2,128,66,0,75,65,118,132,29,64,116,72,62,+244,240,5,160,49,64,5,0,67,224,52,10,233,148,8,140,156,64,58,244,+70,1,224,218,0,224,88,3,224,236,4,224,23,8,224,17,17,140,252,192,+122,128,1,245,97,1,224,188,1,160,119,224,61,8,224,64,2,224,65,2,+97,18,224,46,14,160,93,223,251,224,2,1,205,156,64,71,109,144,226,35,+4,170,80,96,0,225,69,1,224,2,5,228,77,0,224,137,3,131,98,67,+5,1,95,55,249,244,2,128,137,213,132,128,8,224,5,16,2,95,55,53,+224,126,0,225,39,2,140,246,96,85,2,85,32,65,224,90,0,192,29,225,+111,13,0,89,225,110,1,226,13,3,96,134,225,219,8,129,70,129,24,244,+203,2,192,98,185,99,226,60,0,224,40,0,224,72,14,225,132,5,224,31,+4,129,196,128,87,69,248,138,49,97,135,227,52,0,162,166,160,6,96,4,+168,64,162,121,97,48,97,107,128,181,227,126,1,103,24,112,96,131,178,224,+9,1,224,68,21,225,101,0,161,192,224,60,8,199,213,225,150,1,128,254,+97,25,64,191,64,217,167,214,192,232,0,85,89,81,65,208,224,208,10,232,+39,3,225,26,0,224,8,0,226,214,18,224,28,1,224,29,41,224,195,8,+65,219,227,87,0,227,42,0,160,138,226,8,3,224,51,0,194,107,227,84,+0,64,35,1,95,49,122,128,203,248,166,93,161,86,204,13,1,54,51,224,+25,1,1,95,52,76,64,160,116,160,157,161,138,129,135,2,64,95,54,166,+129,225,60,10,119,77,205,200,166,151,146,239,128,156,2,32,95,54,108,117,+104,131,160,96,67,14,129,253,193,95,225,49,5,229,63,5,128,233,226,245,+3,225,18,0,226,242,95,226,214,3,242,80,0,129,74,1,53,50,239,7,+15,133,196,109,40,224,41,22,68,107,80,143,97,66,97,64,96,4,227,57,+13,1,90,32,224,13,2,129,15,227,1,31,0,75,160,112,227,2,19,225,+59,15,224,13,4,101,116,226,161,0,161,215,129,67,226,115,2,160,221,64,+157,135,215,96,9,0,54,105,118,130,94,64,13,233,6,6,96,213,0,50,+160,168,224,8,1,225,42,1,225,8,0,165,126,194,105,0,89,161,255,161,+232,235,200,26,97,52,0,80,129,24,160,18,130,3,229,216,1,64,24,106,+177,224,118,1,64,239,1,95,55,65,204,169,144,174,208,206,217,202,64,2,+79,32,35,74,49,161,86,193,170,64,5,2,58,55,53,207,177,234,65,7,+160,92,73,102,234,250,1,64,77,172,29,1,95,52,82,167,66,47,112,96,+64,40,112,130,3,53,51,32,58,96,19,170,114,64,13,0,51,128,27,240,+93,1,0,58,96,181,235,68,2,96,229,0,58,66,123,64,21,134,153,1,+95,55,91,94,129,179,110,67,254,76,2,80,207,192,207,165,151,0,58,103,+37,96,131,3,52,56,32,58,96,60,96,217,131,163,134,159,226,24,6,202,+208,230,182,1,227,159,1,129,136,224,13,10,236,151,0,131,194,231,107,0,+98,126,226,65,6,227,192,12,201,181,227,15,0,201,244,229,41,7,2,95,+55,52,65,120,252,38,0,169,209,128,2,98,249,1,95,55,92,154,192,27,+224,7,1,113,74,102,244,198,181,128,0,110,210,76,104,161,197,68,255,224,+228,5,231,196,10,228,110,0,163,223,74,134,224,247,7,229,228,9,228,170,+2,160,138,252,238,4,234,142,5,161,163,225,62,6,232,82,0,178,66,233,+164,3,0,67,75,31,79,187,128,43,161,42,239,22,4,197,217,197,161,224,+23,0,228,47,0,192,252,161,71,227,64,0,160,165,209,174,225,33,0,105,+61,128,27,76,1,162,129,224,30,0,96,238,224,32,1,201,44,224,186,3,+97,85,231,32,0,139,225,224,204,11,185,158,129,101,224,58,44,224,55,11,+97,167,237,208,2,196,68,249,119,1,109,172,84,204,237,153,9,2,79,32,+35,85,134,128,244,246,200,7,246,199,3,235,43,2,132,100,65,91,248,3,+1,223,39,129,22,183,23,128,182,192,189,229,0,1,192,17,82,198,181,161,+64,16,224,77,24,100,183,226,19,5,64,199,226,93,2,192,29,224,89,3,+215,240,131,24,193,230,229,113,0,226,75,0,230,131,1,131,203,162,149,224,+183,2,162,237,0,58,119,180,68,148,65,84,65,65,0,53,128,174,0,58,+100,121,143,229,0,50,115,91,164,196,75,206,96,131,0,90,64,89,96,4,+247,33,4,64,38,213,201,94,67,1,95,55,73,100,2,58,55,52,132,252,+0,83,145,47,67,162,225,21,2,181,210,105,142,160,6,64,7,65,188,0,+75,64,60,64,17,206,220,228,11,1,224,235,1,128,70,111,221,167,99,0,+83,228,234,5,96,99,87,2,163,65,2,95,55,50,97,50,228,3,3,0,+51,73,219,97,21,163,127,137,218,160,135,115,252,127,171,64,143,132,161,229,+187,0,1,95,55,89,196,0,83,161,125,133,61,1,95,55,102,149,163,225,+0,66,98,218,96,38,253,61,2,128,35,233,39,1,0,55,90,52,64,39,+0,50,96,39,160,140,128,101,242,149,0,224,70,0,224,40,1,161,68,129,+62,100,203,98,243,0,55,66,108,192,236,0,58,96,224,175,210,169,109,128,+162,2,95,55,51,65,12,202,75,224,104,9,160,32,2,95,55,51,64,46,+0,58,96,86,129,203,224,239,11,192,173,96,63,98,194,235,152,1,192,172,+226,147,0,1,95,55,122,129,129,39,96,117,161,209,164,178,131,231,97,185,+116,15,129,34,98,236,64,253,0,52,64,4,171,113,161,251,65,201,225,1,+2,103,253,64,183,103,121,96,48,83,47,0,58,96,25,96,19,231,182,2,+83,58,100,63,0,58,96,36,128,50,104,20,160,35,241,197,1,1,67,39,+145,234,0,58,96,109,225,13,35,224,233,1,192,22,129,1,224,191,1,0,+50,221,63,192,176,64,249,0,58,97,132,224,177,7,87,134,192,177,200,94,+224,177,14,0,83,224,177,0,64,95,249,197,0,194,48,217,138,0,50,209,+204,224,206,10,230,73,1,160,200,64,30,225,168,8,128,207,134,6,192,18,+66,71,1,95,55,85,34,96,106,224,193,2,87,49,166,168,64,33,0,54,+96,131,226,169,5,163,207,128,131,130,56,231,236,0,227,72,3,224,160,7,+224,153,0,226,72,10,229,144,1,226,92,9,194,83,226,143,2,224,75,16,+237,253,2,224,255,4,195,59,128,78,119,184,64,219,196,53,227,238,1,161,+227,226,133,3,0,54,225,17,1,105,16,64,62,202,214,201,53,138,166,65,+178,226,18,8,0,48,226,18,0,64,198,96,30,1,48,54,224,25,3,0,+58,97,136,224,55,7,87,242,192,55,212,147,229,228,1,0,90,75,236,128,+28,194,103,138,244,0,56,64,135,68,122,224,79,8,166,74,64,30,229,47,+0,163,5,149,147,97,91,129,96,226,110,2,226,51,6,97,146,224,36,17,+225,107,2,224,36,16,225,220,3,224,73,24,112,18,224,73,22,96,6,224,+36,17,133,44,96,73,229,108,10,0,49,162,197,67,253,228,227,8,134,113,+160,250,96,41,227,46,3,228,126,3,0,66,188,236,227,77,5,1,56,50,+227,77,3,224,55,9,0,66,164,4,224,54,7,193,171,224,24,7,93,172,+224,24,12,0,54,224,49,5,160,176,64,6,0,58,96,6,226,118,3,163,+225,0,58,96,222,228,91,8,131,221,238,122,10,206,129,66,247,153,109,229,+76,1,185,149,131,98,224,32,5,235,236,1,0,50,65,64,234,33,5,226,+148,0,167,89,224,126,11,192,101,128,76,246,134,7,160,6,192,115,205,47,+224,151,19,128,35,0,80,96,75,224,44,3,178,98,70,137,96,152,231,237,+1,236,202,0,224,202,4,160,185,224,35,21,2,79,32,35,78,104,160,228,+166,106,128,154,224,38,7,0,49,224,38,0,238,193,6,226,47,1,1,75,+52,194,47,224,35,18,0,51,224,35,26,0,50,224,35,0,128,0,241,82,+3,224,57,0,66,34,196,235,1,80,32,97,69,124,0,0,49,132,230,156,+169,164,134,92,67,228,163,1,238,96,5,170,139,64,81,194,135,231,185,7,+0,58,99,166,226,165,2,199,251,0,58,99,221,224,24,3,165,142,0,58,+99,209,224,24,2,197,48,0,58,100,89,224,24,3,235,68,0,67,200,96,+164,140,13,75,203,138,213,255,11,12,252,130,0,252,120,3,99,89,160,32,+96,31,225,197,3,96,230,1,48,54,165,93,160,98,0,55,187,98,113,0,+64,94,128,16,76,73,128,9,0,58,100,138,5,10,65,32,79,32,58,96,+37,123,172,0,58,96,28,241,108,1,128,1,65,78,231,87,7,2,95,55,+48,107,61,1,58,55,76,74,232,73,0,238,81,1,224,11,0,192,8,161,+144,64,54,135,215,108,84,1,64,95,65,41,98,151,99,168,243,231,0,2,+58,55,48,129,131,96,138,239,135,2,192,92,224,155,3,224,19,21,99,0,+0,39,84,9,94,91,224,47,9,0,66,92,39,5,56,32,95,52,57,52,+64,130,94,71,160,0,224,243,1,239,54,6,99,126,128,53,1,54,57,77,+206,224,53,2,160,110,224,2,0,128,38,0,51,148,199,224,38,0,160,72,+224,85,1,3,67,32,95,52,66,78,65,92,0,54,78,197,160,128,241,119,+0,239,20,5,96,0,2,58,54,57,237,22,2,64,69,251,243,3,64,163,+237,36,1,128,152,239,71,0,0,58,96,86,225,184,0,97,51,192,145,65,+170,0,58,96,131,66,209,7,51,54,57,32,75,32,85,32,94,110,224,179,+4,132,126,82,81,0,51,170,191,128,87,0,54,128,55,0,54,64,186,65,+225,115,248,0,54,65,92,64,29,130,118,159,165,239,13,0,157,44,160,14,+253,106,12,2,32,61,32,254,138,3,1,54,57,129,42,0,58,96,87,64,+110,0,49,73,67,2,49,52,50,192,27,64,127,0,53,74,230,2,95,54,+57,105,47,2,49,51,48,192,27,0,58,96,6,227,48,0,1,95,53,78,+210,96,142,80,167,0,53,239,147,1,3,66,32,95,53,67,119,192,67,128,+6,128,254,224,43,15,65,179,0,53,79,83,64,16,79,210,1,53,51,143,+87,231,151,0,128,111,0,64,192,24,80,45,197,132,224,96,1,96,29,2,+64,95,54,84,154,64,176,164,200,2,54,57,48,101,198,65,54,2,79,32,+35,68,168,96,59,0,58,97,107,226,10,13,166,109,193,109,128,45,164,225,+5,54,56,56,32,58,54,71,159,5,10,65,32,114,110,102,99,126,0,58,+64,21,194,28,225,147,17,6,84,109,111,100,117,108,101,161,152,135,123,128,+98,99,82,67,208,0,51,64,149,161,47,241,172,9,224,189,0,195,106,160,+160,99,243,2,95,54,56,64,11,224,38,5,1,58,54,89,127,149,150,0,+51,117,147,0,58,96,38,144,166,131,198,0,55,98,116,99,105,1,58,54,+72,214,64,231,2,52,56,48,64,231,130,44,64,142,81,62,228,86,2,80,+57,68,133,246,189,2,240,25,1,161,64,64,41,0,95,100,157,239,40,4,+160,20,163,247,96,67,255,71,3,0,54,77,160,1,10,65,114,9,193,147,+160,99,160,6,96,238,228,54,1,1,95,54,73,194,161,18,224,127,0,228,+131,8,96,94,130,120,224,38,0,127,165,160,122,224,130,0,227,243,2,64,+88,96,138,1,95,49,73,136,230,140,0,2,58,54,56,167,10,227,70,2,+76,43,0,64,195,247,226,5,17,226,4,5,227,214,38,14,40,46,46,46,+41,32,119,104,101,114,101,92,49,48,38,163,226,0,54,78,17,96,0,163,+181,96,138,0,58,96,6,164,90,163,218,0,55,76,123,96,46,97,214,1,+95,53,79,231,100,113,2,83,32,83,166,57,165,6,64,151,173,118,5,67,+32,60,32,64,35,253,64,1,233,186,6,192,24,0,85,73,241,2,95,54,+55,165,140,224,41,10,214,4,96,41,224,43,3,133,186,1,53,54,69,244,+96,20,99,206,226,196,0,64,182,98,196,242,7,0,224,146,1,224,18,6,+108,66,224,18,5,98,97,247,154,0,160,19,65,226,229,85,0,228,136,1,+64,8,160,16,96,130,225,122,1,6,112,97,116,116,101,114,110,193,114,72,+227,228,146,0,91,93,228,146,0,150,97,1,64,85,192,88,224,71,6,6,+100,101,102,97,117,108,116,128,71,100,243,0,53,164,251,0,49,128,7,1,+53,55,224,50,7,0,44,229,203,0,102,26,0,54,177,190,97,54,224,214,+6,130,131,64,70,64,160,224,129,13,7,105,110,115,116,97,110,99,101,224,+202,0,160,79,64,55,129,14,96,220,227,80,4,129,25,229,184,4,224,92,+13,4,99,108,97,115,115,224,89,0,147,12,129,44,64,7,214,92,243,193,+1,128,183,110,140,224,202,5,64,42,0,85,250,198,1,100,238,224,132,14,+246,220,12,224,239,3,2,102,105,120,128,146,164,82,229,83,4,0,56,161,+187,224,23,6,75,65,166,127,224,24,1,161,228,230,111,1,247,52,5,225,+198,35,134,212,128,0,66,136,225,107,10,224,243,19,225,120,8,19,102,111,+114,101,105,103,110,32,105,109,112,111,114,116,32,99,99,97,108,108,160,111,+1,53,55,96,45,73,174,68,10,224,184,2,0,51,77,77,103,50,96,0,+231,105,3,224,89,1,1,58,58,164,172,226,42,3,160,178,229,105,10,135,+205,234,14,2,234,132,1,192,26,226,89,44,128,216,193,199,237,157,1,0,+54,102,186,1,95,54,74,49,64,186,64,97,224,58,6,13,123,45,35,32,+83,79,85,82,67,69,32,35,45,125,205,87,72,201,97,20,224,44,5,8,+113,117,97,108,105,102,105,101,100,192,39,193,170,225,244,0,97,79,226,20,+5,65,88,233,140,17,1,97,115,193,250,0,51,125,127,224,125,3,228,132,+1,201,4,64,99,122,138,224,65,2,5,104,105,100,105,110,103,232,57,0,+228,53,0,137,84,68,224,226,115,3,73,37,226,190,2,100,53,235,204,1,+160,0,229,37,6,65,217,227,149,6,65,73,227,149,6,64,189,229,54,36,+3,116,121,112,101,194,134,226,92,23,130,54,224,94,18,227,91,7,224,231,+10,195,86,226,195,27,108,46,94,217,128,53,192,82,229,205,2,225,18,8,+230,74,10,230,73,40,225,18,2,230,70,19,128,166,228,26,14,224,108,32,+2,110,101,119,224,111,29,145,78,2,95,54,55,135,206,1,64,85,96,248,+64,86,145,231,227,161,26,3,100,97,116,97,224,104,4,224,78,0,64,57,+240,110,3,224,211,53,224,103,8,224,208,10,226,46,11,227,79,2,0,124,+160,63,163,27,195,148,224,254,1,64,0,0,58,104,138,115,126,0,85,64,+65,66,159,72,183,224,149,14,3,101,114,105,118,227,164,0,96,127,227,163,+39,168,58,160,123,0,54,168,244,229,71,11,97,50,225,70,23,1,95,53,+100,109,231,135,0,163,27,0,80,132,109,238,107,1,143,71,0,66,64,9,+132,130,224,177,1,96,33,192,130,165,190,225,169,12,227,66,2,227,117,12,+96,99,224,248,9,224,236,0,140,119,224,100,0,238,10,4,70,171,193,40,+224,18,0,247,43,0,96,180,129,40,162,170,163,60,96,229,224,69,1,90,+159,160,68,163,92,0,58,96,149,109,11,0,80,226,237,0,0,85,192,203,+247,199,2,229,161,3,224,28,0,225,223,4,0,54,77,69,231,217,10,224,+208,3,225,31,9,3,40,46,46,41,193,33,96,31,0,58,101,166,203,179,+97,162,226,48,13,0,58,96,112,5,10,65,32,65,32,58,102,249,109,180,+0,57,225,2,0,204,178,211,7,64,15,97,166,96,21,64,169,0,54,76,+179,173,245,64,6,226,230,21,97,114,224,125,0,227,92,11,226,207,9,229,+200,22,225,44,4,224,66,0,246,109,1,224,39,12,192,0,0,58,106,75,+224,179,9,224,101,3,97,229,2,95,53,52,104,30,225,120,5,1,61,62,+161,118,64,72,207,33,161,227,101,226,128,184,110,9,198,183,163,162,132,42,+0,58,100,120,140,147,229,38,0,131,160,247,114,8,111,2,99,163,151,114,+67,76,64,30,2,95,53,52,98,134,224,219,1,96,116,131,124,241,39,4,+65,88,226,73,21,231,70,9,0,58,96,170,98,74,3,54,51,32,58,96,+22,128,13,0,50,64,13,130,248,2,95,54,54,119,79,110,22,68,125,131,+131,0,89,247,228,0,102,232,126,94,96,138,128,186,169,217,175,213,96,109,+174,55,96,17,116,186,234,14,0,87,111,127,150,239,126,2,224,61,2,138,+59,224,46,3,225,55,0,144,86,204,228,153,246,66,219,128,5,102,147,160,+81,238,178,2,129,133,96,10,225,136,14,160,106,119,20,229,90,3,192,11,+96,74,160,208,197,114,160,96,160,58,128,35,1,95,53,82,137,96,20,64,+64,239,51,2,152,186,229,158,5,128,90,225,26,5,225,234,3,224,139,5,+160,31,229,230,0,96,63,160,14,97,249,129,233,130,54,217,245,224,181,47,+224,166,6,96,163,224,160,10,224,133,13,224,125,2,226,0,0,226,21,0,+193,13,218,102,192,98,155,188,249,206,4,0,64,100,61,160,151,160,24,0,+53,64,223,64,13,1,55,53,87,136,64,117,71,20,130,24,96,10,128,48,+213,91,192,227,249,183,5,227,36,1,1,91,93,163,36,250,246,0,224,105,+4,224,92,2,174,118,2,95,53,52,112,139,205,223,211,106,132,83,64,132,+0,50,97,131,83,191,71,106,1,95,53,237,75,1,97,1,247,222,1,66,+110,161,65,96,159,210,239,161,105,195,35,161,182,129,51,161,56,66,233,240,+181,2,97,103,224,26,9,96,162,224,26,12,88,55,96,243,224,22,6,139,+241,234,203,5,65,131,69,80,75,21,240,195,0,239,95,22,0,95,201,140,+239,12,5,129,203,224,95,6,139,44,0,75,230,25,4,232,166,1,193,60,+97,46,129,162,234,126,0,165,7,231,205,9,224,26,8,1,49,50,239,169,+2,64,0,130,143,225,48,7,97,194,224,100,0,224,165,4,100,40,186,90,+227,7,8,244,231,3,201,116,227,24,7,225,28,1,0,45,198,105,165,3,+96,85,192,253,229,215,15,74,202,233,34,5,97,137,224,133,1,192,12,65,+136,134,153,225,3,6,247,36,1,231,57,5,226,59,13,96,216,193,10,224,+26,5,99,100,225,37,12,126,186,192,207,163,246,234,152,19,128,31,99,229,+225,169,1,225,197,1,199,123,64,7,237,223,19,0,53,162,94,224,67,1,+254,160,2,161,179,232,183,4,232,82,2,225,213,18,224,177,17,225,213,11,+238,78,10,225,63,14,171,90,243,167,7,131,103,224,169,3,224,92,1,1,+105,102,163,79,1,53,55,68,154,226,78,13,224,202,5,230,75,7,224,21,+0,0,53,181,97,226,180,2,103,65,2,66,32,79,163,83,224,127,17,226,+235,6,224,48,17,2,116,104,101,181,23,198,197,224,43,17,3,101,108,115,+101,160,43,226,222,2,225,149,17,225,143,1,234,2,7,229,43,22,194,184,+224,25,9,99,248,228,19,13,99,248,192,26,225,177,5,165,68,226,61,23,+226,47,0,192,172,235,5,1,74,104,211,139,238,56,4,0,111,97,16,233,+224,21,0,46,160,37,163,41,2,54,49,32,112,120,96,112,70,121,131,28,+245,96,1,101,197,88,165,226,153,15,98,23,227,216,12,96,67,227,73,0,+160,225,224,249,0,224,247,3,224,15,2,161,30,227,189,16,128,161,160,155,+160,76,225,24,3,160,7,224,245,6,1,108,101,247,40,2,224,243,15,224,+86,2,226,206,12,226,155,0,224,38,0,226,55,19,99,176,226,29,12,244,+186,0,225,49,8,161,12,197,9,228,70,0,111,119,229,25,4,224,162,13,+1,99,97,227,20,0,224,25,6,0,111,195,139,225,0,18,0,56,227,22,+0,71,89,96,28,253,10,1,128,22,230,60,7,230,42,3,253,104,2,83,+12,245,19,12,228,118,3,64,0,202,207,201,233,131,18,227,75,5,192,183,+129,229,231,101,10,225,52,2,64,33,4,64,95,54,49,56,137,41,97,61,+0,54,104,21,65,58,96,9,1,95,54,102,236,224,129,1,137,83,239,164,+1,0,85,72,152,236,51,0,160,89,192,114,96,128,229,132,1,128,3,193,+252,139,19,233,203,0,193,65,163,29,3,95,54,54,48,170,164,248,94,14,+2,115,116,36,129,30,201,195,129,104,160,69,235,43,1,234,38,7,246,13,+2,225,67,0,228,86,4,160,18,163,93,97,38,74,177,99,72,234,66,2,+65,246,93,219,128,9,129,203,92,136,128,9,128,17,0,58,77,233,77,222,+97,89,120,1,68,210,0,58,64,220,173,245,226,184,1,0,50,106,7,1,+95,52,92,52,65,120,110,30,64,52,176,153,98,119,1,52,51,107,145,0,+54,160,9,64,8,1,54,53,68,226,128,24,64,49,239,162,1,0,79,161,+156,96,146,79,166,239,93,0,96,51,96,45,143,135,2,66,32,80,127,84,+1,64,85,96,116,0,54,160,20,96,22,97,6,0,80,96,23,142,219,130,+40,163,14,161,187,129,30,226,31,1,193,68,167,9,162,142,230,213,3,96,+141,99,159,193,108,196,90,195,65,230,213,1,103,148,230,186,0,0,58,118,+62,252,154,11,64,131,224,18,6,136,83,230,138,8,251,194,13,97,29,106,+229,161,204,161,48,1,35,57,65,154,64,167,95,39,1,95,53,95,176,194,+5,130,126,224,98,6,67,52,224,98,6,65,8,160,45,64,104,250,9,10,+224,22,14,224,209,7,66,128,224,110,6,236,84,10,172,83,128,80,160,75,+100,146,128,226,64,141,128,28,1,53,56,66,67,236,63,1,224,36,2,103,+83,96,36,0,54,109,171,128,232,225,56,5,201,82,128,49,164,233,224,12,+1,160,62,224,94,0,224,43,6,236,189,8,0,58,101,64,223,228,100,135,+123,55,98,231,130,250,100,110,3,95,49,50,55,192,150,191,127,96,11,0,+58,96,6,5,10,65,32,73,32,58,96,41,192,74,2,95,49,52,83,123,+160,67,78,74,192,54,159,182,64,6,9,10,65,32,102,115,104,111,119,32,+58,96,32,224,58,0,2,53,57,51,92,194,1,54,48,65,252,0,54,78,+157,224,128,0,96,185,160,73,96,11,0,58,96,6,96,58,1,48,52,64,+53,1,53,57,67,158,1,54,51,96,169,1,54,51,97,13,97,125,2,54,+51,52,224,11,0,1,49,48,96,76,160,11,0,56,224,35,1,101,35,1,+49,56,83,4,96,17,0,73,67,135,64,9,99,135,142,192,165,141,67,172,+3,95,50,48,50,230,65,2,21,73,110,116,101,103,101,114,58,32,100,105,+118,105,115,105,111,110,32,98,121,32,48,230,220,0,245,105,0,135,150,64,+79,0,85,125,171,0,56,69,123,70,225,165,220,224,17,9,128,64,248,95,+7,64,9,236,151,1,113,6,130,45,224,16,2,138,222,162,191,100,17,229,+115,0,70,47,3,95,54,51,54,252,101,0,97,210,210,65,228,69,4,1,+95,54,130,194,0,54,233,3,1,198,91,98,52,73,204,0,85,133,159,131,+180,236,109,5,139,142,118,181,96,71,167,49,81,133,175,116,101,213,224,119,+0,64,81,70,138,144,254,1,95,54,203,242,128,0,0,58,97,166,1,10,+65,225,128,9,5,105,110,105,116,58,32,177,2,129,95,193,64,246,232,5,+197,151,192,88,0,58,96,9,69,199,97,39,64,152,2,95,52,56,98,73,+84,191,0,58,96,142,119,68,228,8,0,1,95,53,66,55,64,91,97,49,+98,14,128,107,100,199,96,55,97,88,0,52,177,215,243,235,0,130,84,131,+119,233,106,0,64,9,0,89,162,22,240,20,7,0,67,96,144,0,67,69,+155,193,36,230,202,3,129,213,193,209,236,209,6,194,7,160,98,64,70,3,+95,49,48,57,66,94,242,91,0,114,34,103,105,96,28,68,34,192,28,97,+160,242,154,0,4,67,32,95,52,49,210,166,203,135,2,95,54,48,106,53,+199,44,97,4,0,58,98,18,99,53,96,198,201,26,0,67,112,243,243,191,+0,64,11,64,25,224,7,0,66,139,1,53,57,105,218,103,152,162,132,0,+80,98,58,99,252,128,6,194,66,96,26,65,110,64,21,66,206,79,231,2,+95,54,51,233,153,0,192,27,128,28,230,235,1,136,102,96,46,96,26,0,+50,199,57,160,173,227,55,1,0,89,162,76,139,77,64,5,160,33,137,111,+64,69,130,76,0,50,197,86,161,119,161,122,235,77,2,65,128,97,211,227,+180,0,1,95,54,201,54,128,95,160,163,128,220,160,12,99,165,169,101,1,+54,52,99,158,167,5,224,197,15,65,1,135,118,128,66,225,16,3,105,124,+228,96,1,96,232,131,130,64,142,1,52,57,184,198,226,183,1,244,50,1,+98,232,136,35,131,229,236,246,0,224,78,2,224,13,4,0,58,100,48,101,+158,224,20,0,0,79,107,224,137,175,64,205,227,5,0,133,126,0,75,66,+60,64,189,104,113,0,65,96,13,133,226,65,86,72,238,196,224,226,245,1,+245,206,0,2,95,54,48,137,206,186,1,128,14,0,58,100,117,170,23,65,+76,135,11,73,67,0,58,68,255,96,160,1,50,50,117,166,138,53,0,54,+96,25,251,175,0,128,159,64,217,2,52,32,64,128,146,164,15,224,27,6,+128,188,167,82,103,1,129,126,130,149,65,157,1,95,54,81,23,130,44,87,+180,64,1,1,95,54,70,166,70,238,194,246,1,95,54,170,120,192,13,65,+126,100,55,70,216,225,79,8,169,173,0,58,96,39,224,29,2,0,49,224,+29,6,187,67,230,94,7,0,58,96,102,97,111,0,75,226,27,5,0,58,+96,167,106,223,100,79,230,249,1,230,162,10,229,98,1,231,42,11,224,48,+20,103,18,132,24,248,228,1,198,208,228,203,3,184,115,64,13,234,229,7,+96,97,225,251,1,98,251,71,230,132,157,247,197,2,160,62,160,110,229,31,+0,224,116,2,227,159,0,229,88,2,216,216,224,117,21,224,115,5,224,113,+5,224,51,17,85,204,224,0,5,0,58,98,44,235,253,0,1,49,57,64,+84,167,58,64,16,0,50,65,76,66,186,98,198,69,151,67,184,99,160,1,+95,54,66,201,0,54,84,50,250,13,1,130,237,224,157,5,0,58,96,119,+108,238,1,50,50,64,67,248,130,1,1,49,49,160,10,3,95,49,56,51,+172,147,230,205,5,224,34,13,1,73,32,64,2,0,83,166,78,96,168,192,+139,64,62,224,96,0,160,46,131,201,69,96,129,100,192,56,197,67,102,37,+160,10,224,60,1,224,137,6,160,119,200,138,85,110,231,157,3,225,16,4,+211,45,225,251,0,128,75,0,52,67,127,232,217,3,224,70,0,1,50,54,+224,71,1,64,72,74,67,128,72,224,42,8,224,113,2,224,41,6,0,58,+96,8,163,95,1,75,52,238,181,0,0,58,64,37,129,228,167,250,232,67,+0,162,50,167,40,0,82,224,22,4,225,35,0,0,58,96,122,162,36,224,+1,1,153,144,226,211,0,224,20,5,224,17,8,224,14,5,224,11,2,192,+8,130,246,96,109,132,123,0,85,128,195,224,197,2,207,117,160,197,64,164,+240,169,2,192,18,1,66,39,224,21,3,166,227,224,29,0,162,217,239,241,+1,64,88,132,176,97,23,233,233,5,5,102,111,108,100,108,49,182,67,81,+83,1,64,58,67,36,224,134,4,0,83,228,45,4,64,79,64,39,137,228,+160,122,113,62,104,116,235,0,6,233,108,1,234,64,1,211,79,136,22,128,+169,233,77,5,201,19,134,19,98,28,88,65,233,85,5,233,56,0,164,101,+226,216,2,233,95,3,128,176,132,4,224,79,0,71,37,128,169,111,34,133,+226,64,6,0,50,97,0,0,54,160,45,200,58,134,108,0,58,102,126,101,+196,0,73,197,53,0,83,75,113,64,212,229,129,1,138,110,230,58,2,231,+216,7,96,144,203,7,168,205,229,71,0,252,157,0,131,85,193,117,234,205,+10,164,255,192,86,196,215,169,122,133,254,128,8,1,95,53,68,212,232,230,+0,103,150,128,64,71,215,224,64,1,156,50,224,25,4,131,44,65,6,226,+78,0,160,145,233,225,1,224,174,5,224,124,7,106,136,97,169,224,127,22,+224,101,3,224,130,8,224,156,5,225,91,4,192,247,65,102,0,55,244,136,+3,12,92,51,52,38,108,105,98,47,68,97,116,97,47,174,83,2,46,104,+115,64,22,4,44,49,50,56,58,130,246,0,58,97,225,101,189,66,16,101,+212,0,58,96,109,162,225,97,124,128,222,244,34,3,96,5,65,92,226,241,+0,229,202,7,197,84,225,228,0,64,57,227,211,4,195,250,192,7,3,80,+32,95,55,73,211,1,50,32,224,202,35,3,54,52,58,54,249,133,4,227,+92,1,139,37,132,26,227,108,1,174,97,227,93,3,0,49,238,57,0,228,+88,0,202,76,82,100,230,235,0,196,101,224,80,12,235,201,2,224,80,2,+97,153,96,69,97,108,196,227,131,61,100,51,0,52,71,76,64,116,97,50,+142,55,227,235,11,228,36,13,160,47,235,107,4,224,61,11,103,43,228,39,+4,224,79,11,228,85,18,231,43,3,0,58,96,208,164,36,207,33,233,153,+19,168,171,98,175,101,101,75,81,181,34,245,19,0,2,53,53,49,240,68,+11,174,17,0,58,96,57,96,51,0,48,75,126,130,169,66,253,226,169,2,+163,136,193,68,229,147,6,161,199,229,149,8,226,33,15,97,1,64,109,161,+204,230,117,1,67,173,0,48,105,10,202,23,226,121,45,224,91,1,226,121,+9,224,95,4,226,121,31,224,80,2,161,110,104,60,0,58,96,24,226,121,+1,226,100,38,132,119,226,11,2,224,10,1,0,58,96,97,1,10,65,67,+240,0,58,96,173,108,180,89,184,115,67,1,51,51,106,116,108,149,175,146,+0,48,131,82,86,60,142,243,0,53,224,34,1,88,64,128,10,0,58,96,+6,202,187,0,50,71,196,160,65,0,58,96,53,102,63,224,16,0,227,87,+1,160,42,192,27,64,28,162,171,171,174,226,40,3,96,19,129,112,64,19,+112,218,165,176,1,95,49,176,34,179,104,196,186,236,23,0,165,215,2,64,+64,58,96,104,135,96,138,21,173,205,161,106,65,174,0,50,72,245,103,153,+195,237,225,212,0,98,101,110,50,97,125,226,173,0,230,108,0,0,89,160,+36,208,45,226,98,2,192,148,96,170,197,71,208,37,144,104,64,14,251,195,+0,209,49,97,38,99,18,224,143,3,194,96,236,96,0,96,148,224,146,5,+65,253,233,68,5,6,108,116,87,46,99,109,112,219,149,177,191,184,218,179,+125,96,5,0,58,97,49,98,30,0,57,65,62,121,223,0,57,128,24,236,+166,2,225,234,0,79,88,96,31,193,188,231,123,0,224,166,18,104,209,192,+13,0,49,79,18,192,185,0,58,96,81,160,126,200,168,75,42,65,209,193,+237,64,15,127,66,161,231,3,95,49,54,50,192,85,0,58,96,6,105,1,+1,95,53,115,214,0,53,92,17,0,58,86,105,128,163,64,24,1,57,48,+197,142,0,53,64,159,131,162,64,165,71,84,195,176,172,237,161,34,1,53,+57,79,62,96,76,96,93,230,22,6,96,38,65,24,65,62,227,122,0,229,+143,1,5,95,49,52,57,32,35,125,220,192,82,224,46,11,64,36,183,179,+0,58,96,113,244,168,0,194,19,66,96,130,103,169,141,228,196,2,228,225,+1,76,162,196,99,224,232,31,128,148,254,74,2,169,41,224,87,4,87,33,+224,87,37,128,236,74,130,224,91,1,128,206,160,198,192,197,224,93,5,110,+81,224,91,17,224,126,38,227,14,6,7,78,117,109,101,114,105,99,46,88,+147,26,73,110,116,65,116,66,97,115,101,58,32,110,101,103,97,116,105,118,+101,32,97,114,103,117,109,101,110,191,173,161,105,164,37,143,192,65,113,146,+163,192,213,64,5,224,178,22,97,189,108,249,0,51,224,22,5,224,75,52,+0,57,224,22,3,64,0,224,236,29,12,117,110,115,117,112,112,111,114,116,+101,100,32,98,255,177,1,128,140,117,9,226,120,6,194,110,3,83,32,95,+50,164,56,200,130,164,248,224,49,6,194,60,160,83,192,11,226,72,8,224,+70,4,110,31,160,49,101,25,162,245,160,22,225,64,12,103,16,132,65,224,+10,2,224,55,2,225,86,3,2,53,56,57,98,218,0,80,192,65,205,132,+225,81,16,0,58,100,47,131,137,98,191,130,119,160,34,96,82,227,109,1,+0,58,96,95,143,59,0,50,79,62,96,36,0,58,96,34,227,204,8,236,+133,1,227,100,60,193,128,236,242,0,128,88,129,122,240,253,4,125,71,225,+103,1,129,52,0,35,217,35,193,55,226,132,24,224,64,8,228,217,0,224,+86,11,225,225,3,224,98,32,160,66,164,157,65,72,170,77,99,140,92,69,+96,109,142,226,173,191,150,250,64,76,1,50,54,175,148,224,249,1,205,138,+98,204,198,158,65,14,64,38,64,54,126,217,192,22,3,95,49,51,55,227,+75,2,2,32,37,32,163,39,224,45,5,130,7,92,185,87,47,97,92,64,+15,107,53,128,15,0,58,96,6,188,92,237,94,2,90,66,234,43,2,65,+244,98,81,226,96,1,3,64,95,52,53,64,189,167,117,1,95,53,86,126,+161,28,75,142,160,16,0,58,96,51,130,98,136,56,200,169,0,49,86,194,+1,64,35,125,40,224,28,15,232,217,3,160,18,173,15,96,93,251,130,11,+2,108,97,115,251,130,1,137,86,1,85,32,96,209,252,24,0,0,58,96,+8,99,12,136,16,1,95,53,123,237,1,53,54,138,107,0,55,64,189,0,+51,238,70,3,1,45,62,161,95,2,58,53,56,210,131,255,166,6,153,40,+224,18,4,140,49,162,238,128,18,66,115,95,19,96,117,89,8,1,53,55,+153,88,233,118,0,224,142,0,162,152,224,12,0,224,25,1,224,21,0,1,+95,54,66,165,96,171,2,79,32,35,64,17,164,185,128,24,128,25,224,197,+1,1,46,46,201,105,128,30,191,159,224,137,5,224,117,81,224,110,14,224,+97,21,224,189,20,225,112,7,110,168,225,112,5,64,41,64,117,224,115,2,+224,102,30,224,173,19,123,236,64,70,105,240,225,15,4,99,251,235,77,0,+1,95,53,68,35,64,7,1,53,55,130,84,225,50,4,119,21,1,95,53,+239,58,0,96,116,1,95,53,79,15,224,228,0,1,58,53,81,175,234,226,+0,224,140,1,224,15,1,255,20,1,224,103,14,186,108,96,76,250,241,0,+194,245,1,52,52,224,49,0,73,219,160,153,192,17,219,101,0,58,96,117,+99,113,2,58,53,55,171,141,1,53,55,68,139,122,173,1,53,55,203,136,+0,80,64,78,226,251,0,73,67,2,95,53,55,107,177,108,55,102,21,0,+58,64,57,128,46,0,89,141,70,128,2,192,199,147,182,134,31,103,214,237,+83,0,166,66,64,5,96,12,233,5,1,224,59,4,227,133,5,224,25,1,+224,27,5,133,96,226,48,4,69,136,3,85,32,75,51,228,87,7,8,115,+101,112,49,32,65,98,111,118,200,146,224,37,17,4,66,101,115,105,100,224,+38,0,224,124,1,228,11,12,1,95,53,78,100,224,37,2,105,113,234,228,+0,232,121,5,2,32,95,53,190,66,128,79,64,189,226,150,0,79,200,110,+216,236,149,3,98,123,65,119,1,95,53,124,117,160,0,169,51,225,56,1,+224,97,0,225,31,4,195,103,199,180,167,197,192,207,224,42,3,190,217,224,+195,2,224,79,0,94,86,0,53,144,77,161,189,128,69,167,23,64,11,249,+78,6,224,71,19,135,41,224,71,10,97,1,2,95,53,55,97,240,64,19,+254,67,7,224,90,0,232,143,12,228,66,1,128,22,135,187,64,1,1,95,+53,125,197,225,102,40,224,195,4,96,144,0,53,86,190,64,163,224,141,1,+116,184,67,15,135,38,99,15,202,209,224,159,4,137,47,98,13,225,143,3,+225,192,21,161,149,225,176,1,98,79,64,191,1,61,61,224,30,8,225,109,+0,0,90,192,121,194,96,224,66,18,226,188,12,160,135,1,95,53,96,220,+64,13,2,95,53,55,64,108,193,197,72,50,128,22,176,221,183,252,1,53,+53,111,243,164,209,193,199,0,53,86,31,129,105,226,206,12,132,95,65,68,+136,20,231,156,8,65,117,227,250,49,7,111,110,101,76,105,110,101,114,227,+254,25,224,41,0,228,2,6,227,249,20,0,85,104,155,97,30,64,0,224,+167,6,161,30,225,212,7,136,186,131,86,224,60,0,224,20,0,105,240,192,+81,224,61,6,65,89,73,209,228,120,0,64,137,207,252,0,58,96,53,223,+111,235,26,5,100,192,225,244,3,164,140,224,63,1,0,58,97,239,98,197,+0,85,193,223,0,54,129,208,99,133,0,58,73,90,170,12,0,83,64,32,+158,238,128,90,98,217,128,169,230,9,5,179,92,227,127,2,224,19,0,128,+17,167,134,64,5,102,182,166,193,199,65,248,44,7,160,152,98,63,68,36,+146,77,0,54,99,226,0,58,96,168,192,193,233,148,5,98,127,231,245,0,+160,17,232,61,6,1,32,124,129,243,64,29,231,249,37,160,174,0,58,96,+136,114,18,0,80,234,157,0,232,110,5,106,166,224,119,6,1,60,45,233,+28,5,160,6,97,128,160,126,235,34,2,0,101,176,66,96,30,1,49,32,+98,99,193,18,192,152,163,93,0,58,96,162,181,49,0,53,85,132,99,135,+0,58,64,86,225,201,1,97,237,251,201,0,160,181,0,54,82,206,225,156,+1,224,129,3,3,119,104,101,114,195,29,224,132,26,96,134,0,54,160,134,+65,24,96,96,0,54,72,113,65,14,99,34,225,42,22,2,79,32,35,77,+104,234,169,5,224,53,15,0,52,132,96,224,177,3,1,58,58,225,96,1,+99,87,224,56,0,224,40,6,5,100,101,102,97,117,108,209,163,161,9,64,+199,2,95,53,54,102,153,0,58,96,14,98,98,193,49,64,37,69,115,126,+46,0,58,96,39,120,173,3,54,50,32,58,96,194,169,253,1,80,32,133,+177,0,80,97,128,182,201,230,87,0,133,24,0,58,65,76,225,176,5,137,+159,65,142,160,71,125,135,200,4,227,225,0,227,110,1,229,217,4,208,94,+164,13,232,147,7,224,46,7,1,95,53,109,209,102,8,96,5,0,58,96,+133,226,209,19,99,36,143,25,227,44,4,0,54,227,44,6,65,150,234,154,+2,225,207,9,224,72,38,235,250,14,1,58,53,84,166,202,202,217,231,223,+211,184,255,218,7,167,217,64,27,103,157,176,93,110,182,141,67,96,0,0,+58,64,143,129,212,2,32,95,51,85,174,122,182,80,153,2,95,50,50,122,+188,1,53,51,232,79,1,171,64,64,54,0,54,161,229,225,43,2,226,116,+9,5,102,111,114,97,108,108,228,122,5,128,235,0,54,163,67,225,11,8,+2,58,53,53,130,134,2,80,32,75,102,128,129,20,224,9,0,2,58,53,+53,199,76,98,98,0,52,82,220,172,112,0,52,105,204,204,125,1,53,50,+91,137,100,200,1,95,51,64,52,128,93,130,182,2,75,32,89,176,91,96,+117,194,233,139,223,132,31,0,53,98,57,136,240,165,222,0,83,175,243,0,+50,82,99,3,95,49,53,52,65,135,225,197,0,97,151,104,89,64,153,240,+31,4,96,223,169,83,128,246,156,25,1,51,51,94,26,144,65,96,34,225,+150,0,198,176,161,223,225,241,0,128,138,238,96,0,145,241,160,51,230,196,+0,152,64,3,95,49,52,48,183,69,113,212,3,48,32,64,35,83,155,64,+42,195,116,1,80,32,168,94,3,64,58,53,52,131,15,96,20,64,38,128,+20,226,115,1,112,246,128,20,130,52,120,30,224,228,2,100,72,224,20,7,+66,84,224,20,8,114,92,224,20,7,0,52,176,171,224,20,5,128,190,224,+20,5,67,8,224,83,9,64,179,224,20,8,224,125,11,97,105,224,20,7,+0,51,224,125,11,103,140,224,20,8,224,62,12,65,70,224,251,8,225,16,+11,135,175,224,146,7,224,167,12,224,83,11,111,200,224,21,10,224,148,11,+102,18,224,20,7,1,56,55,68,248,224,22,9,0,54,225,85,12,0,56,+154,41,224,22,10,128,177,226,230,5,1,56,55,125,221,196,46,250,114,0,+224,7,179,1,58,53,66,47,240,155,16,67,86,240,155,5,68,229,164,203,+66,189,166,243,66,32,200,164,64,68,150,244,225,63,0,0,51,98,127,100,+194,80,222,0,53,230,67,0,1,58,53,67,23,160,45,196,219,156,31,164,+213,0,58,101,25,229,196,27,96,214,229,196,1,64,168,107,83,0,73,234,+83,3,231,57,0,97,3,113,53,172,15,224,35,1,2,95,53,51,116,140,+64,34,0,66,192,116,96,113,109,37,135,115,0,58,96,8,160,254,95,173,+139,143,0,58,96,189,225,21,4,129,102,65,27,232,9,93,64,182,232,9,+3,64,133,160,121,100,232,96,249,171,255,136,254,0,58,96,52,225,99,8,+65,180,225,99,1,64,21,231,40,7,68,65,114,146,3,49,48,32,58,96,+21,225,113,18,112,67,225,113,21,67,117,225,113,1,98,52,224,7,0,64,+110,233,149,1,229,220,0,224,201,8,198,91,225,56,0,242,233,1,225,60,+1,161,61,225,63,9,224,24,0,224,168,1,192,19,252,183,4,96,71,129,+101,225,103,0,130,112,0,65,65,9,130,26,1,95,53,98,207,0,50,99,+22,0,50,130,23,3,95,53,50,55,94,74,0,48,190,204,253,239,0,89,+187,128,240,224,20,6,199,1,64,70,180,10,88,92,134,162,67,181,0,50,+107,111,69,57,2,95,53,50,69,211,0,75,96,111,129,210,120,57,0,58,+96,23,163,102,64,13,129,169,243,211,1,194,139,206,116,123,110,249,22,3,+142,50,81,235,1,52,57,241,151,5,2,95,53,49,70,239,176,84,96,37,+120,195,3,51,32,95,49,152,254,2,95,52,49,242,102,0,0,58,96,173,+194,37,64,87,240,13,10,192,138,2,95,53,49,111,84,160,89,226,84,0,+227,196,5,224,47,3,0,50,73,131,224,47,0,0,58,96,9,251,173,2,+243,226,1,244,184,22,224,39,24,131,68,187,100,243,161,18,186,98,226,65,+2,64,8,209,235,224,7,5,224,190,7,224,54,4,224,145,0,227,252,2,+192,13,255,71,0,169,62,133,116,1,53,49,245,188,0,224,89,6,160,165,+225,220,0,2,95,53,49,101,114,96,37,129,194,138,37,160,15,224,51,0,+224,219,5,241,81,5,128,34,64,171,161,17,226,76,1,245,65,0,224,88,+7,224,104,11,225,119,1,160,226,241,150,5,252,216,14,243,121,3,192,135,+128,30,224,224,1,245,15,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,147,125,160,0,164,138,+224,193,11,245,10,13,1,49,57,245,15,0,224,188,10,132,134,0,58,96,+16,235,86,1,235,219,1,165,3,225,85,15,193,52,227,93,8,192,24,0,+85,199,174,224,33,8,165,200,242,202,1,105,74,150,48,1,79,32,124,102,+231,232,0,64,255,99,247,0,95,84,48,0,58,97,145,69,15,1,52,57,+97,68,64,143,156,213,0,64,65,110,3,95,49,54,50,194,194,0,58,96,+6,227,198,3,192,193,245,173,6,227,114,3,225,209,5,228,79,3,225,66,+2,128,14,64,0,227,200,1,225,221,12,163,238,225,0,0,97,189,150,141,+97,4,195,90,128,54,227,231,20,224,67,5,97,221,104,61,249,167,1,228,+1,3,64,252,165,236,130,124,225,193,1,249,169,12,98,239,132,22,224,210,+0,249,164,86,0,97,85,160,3,78,101,115,116,245,170,25,224,42,1,249,+174,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,+249,156,19,224,151,7,249,168,7,224,82,2,132,223,131,235,224,74,0,81,+20,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,244,47,0,101,56,249,254,11,230,187,+0,225,42,15,164,201,224,92,4,128,1,228,246,2,225,179,16,192,52,185,+233,96,0,112,141,0,58,96,36,197,18,227,64,29,192,153,247,35,9,224,+23,1,225,200,1,225,237,12,229,72,14,224,167,0,129,179,2,64,95,55,+169,230,96,0,229,91,27,96,125,225,76,0,192,72,177,15,133,59,113,11,+2,51,32,95,112,131,128,67,225,70,2,193,33,96,16,0,55,96,253,2,+52,57,56,64,161,196,112,219,25,65,213,248,51,4,230,68,30,192,48,224,+28,4,98,33,224,224,8,96,21,232,63,5,225,57,14,97,54,128,198,155,+203,225,57,4,225,58,26,242,81,0,169,25,0,50,96,9,235,101,4,128,+41,163,149,70,129,0,58,96,107,140,221,86,18,68,84,246,18,1,97,70,+118,18,0,49,182,18,64,188,66,101,194,217,98,168,228,36,0,118,101,130,+54,162,225,161,77,201,36,226,90,25,227,69,11,224,39,4,229,207,4,224,+242,0,225,130,1,65,36,225,125,4,229,157,6,0,98,69,152,0,103,216,+167,229,118,4,160,84,164,114,192,135,197,119,160,198,111,9,96,172,105,48,+226,240,1,160,169,228,245,2,195,2,254,129,7,163,163,224,227,17,228,41,+0,164,195,232,0,11,234,228,1,224,124,8,103,239,65,162,99,127,196,65,+224,42,3,228,112,0,226,65,5,128,138,225,3,0,192,193,225,223,0,254,+14,26,225,55,0,193,194,224,46,13,196,194,192,28,225,200,50,0,49,225,+201,11,224,88,0,226,133,3,225,208,4,227,190,0,132,249,64,61,97,82,+225,213,2,229,165,0,72,209,160,70,225,187,5,224,220,13,235,111,1,230,+19,24,164,145,224,109,4,160,79,225,203,2,227,252,0,78,177,102,128,228,+27,0,225,223,1,224,68,9,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,100,10,207,+246,3,48,56,32,58,96,95,214,92,64,247,118,92,0,48,138,201,103,155,+0,58,96,195,228,83,1,96,241,100,83,71,184,128,37,0,52,64,37,218,+186,96,37,98,78,128,37,132,159,129,113,129,164,64,138,0,58,99,132,234,+49,1,226,112,8,2,95,53,48,97,135,96,11,224,246,2,128,38,134,101,+2,95,52,55,166,68,65,245,129,249,96,227,64,101,208,122,167,64,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,232,155,11,255,+169,16,181,38,96,110,200,107,227,103,6,3,102,105,116,115,220,161,180,252,+64,108,130,20,0,53,162,20,67,121,89,147,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,235,43,2,228,86,3,64,22,224,238,6,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,54,+90,30,218,141,0,79,83,60,238,86,0,64,0,165,144,196,25,0,66,64,+5,96,53,232,222,9,160,252,99,238,117,39,192,184,228,57,15,225,113,7,+234,29,7,225,109,10,225,199,1,225,106,61,0,50,225,107,7,133,114,225,+35,3,224,210,36,225,130,82,65,231,101,39,3,64,85,32,90,161,241,160,+7,100,26,0,58,116,59,223,63,1,52,56,83,220,3,52,57,55,32,64,+24,215,30,0,89,64,200,68,100,0,58,96,25,184,153,0,48,75,166,136,+98,1,50,56,84,232,1,50,56,68,11,117,65,128,26,1,95,49,96,231,+85,16,192,44,1,95,51,90,11,129,14,2,95,55,55,192,21,0,50,121,+243,100,14,192,18,1,49,55,166,152,3,58,52,57,54,192,116,0,83,105,+190,164,189,208,122,69,26,0,50,85,213,0,51,151,3,129,202,3,95,51,+54,56,66,107,64,153,1,49,54,102,87,220,186,96,124,64,48,65,224,192,+15,225,80,6,225,247,1,17,114,101,99,117,114,115,105,118,101,32,109,111,+100,117,108,101,58,32,161,253,160,197,97,226,1,95,51,124,246,224,71,19,+13,44,32,105,109,112,111,114,116,32,99,104,97,105,110,192,69,65,116,91,+7,158,165,128,69,128,0,1,95,52,86,46,1,58,52,89,154,70,120,4,+51,54,57,32,75,185,148,98,33,192,186,237,130,3,0,51,233,41,0,97,+56,214,83,0,66,97,129,0,51,118,143,6,51,53,49,32,95,52,54,167,+170,195,13,98,113,131,176,224,42,0,225,41,2,64,52,128,173,0,51,107,+169,1,52,54,165,237,232,149,1,255,249,1,69,24,128,73,64,193,64,225,+65,19,159,26,6,95,52,51,57,32,95,52,159,100,225,121,22,0,77,97,+111,9,32,110,111,116,32,102,111,117,110,100,225,121,0,96,172,161,120,2,+49,50,51,65,27,99,74,224,76,19,15,92,49,48,38,115,101,97,114,99,+104,32,112,97,116,104,61,128,74,158,187,128,165,96,73,0,49,88,245,128,+4,95,185,65,135,0,51,96,8,224,91,23,6,112,97,99,107,97,103,101,+224,92,3,224,83,18,225,63,0,160,207,128,1,228,210,1,161,226,225,140,+3,225,137,4,1,95,52,125,171,96,0,98,135,112,161,198,180,99,89,161,+194,224,31,1,0,39,67,223,164,142,169,160,226,191,0,166,250,132,0,193,+95,231,154,6,128,5,104,119,193,12,1,52,56,157,118,228,140,8,64,157,+228,140,2,128,206,226,131,2,121,19,195,66,164,246,247,47,2,1,95,51,+127,218,226,126,0,227,168,28,193,129,3,100,111,101,115,98,52,6,99,111,+110,116,97,105,110,163,183,226,60,2,192,244,229,71,12,245,33,1,227,142,+3,224,191,6,227,67,3,160,220,125,84,161,115,132,130,163,148,0,80,101,+82,132,205,120,8,237,95,5,96,0,226,207,1,0,51,64,134,1,95,52,+126,237,67,194,0,51,99,194,224,229,1,2,46,116,120,78,13,0,58,96,+33,104,214,2,95,52,57,79,50,96,5,0,58,96,104,117,195,1,56,57,+64,211,88,99,0,51,75,22,128,5,0,58,96,37,164,19,65,116,74,181,+64,42,224,100,5,161,74,73,73,0,58,97,227,234,94,6,1,53,56,234,+94,3,67,241,128,106,197,123,133,104,198,80,224,244,4,236,111,0,128,49,+0,58,96,33,165,221,226,185,5,165,95,164,67,0,50,87,112,0,51,113,+80,100,89,85,143,1,95,51,81,19,70,128,65,168,247,239,1,227,40,2,+194,64,0,52,226,168,11,224,240,1,7,76,111,97,100,105,110,103,32,194,+67,245,5,0,229,15,4,227,130,5,0,51,115,203,132,232,224,182,1,228,+246,2,224,178,2,65,223,2,51,51,50,64,19,110,28,0,52,70,145,1,+95,50,64,132,224,163,1,193,52,224,165,16,0,80,160,157,24,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,192,191,164,128,226,85,1,128,111,230,155,18,160,82,0,114,128,57,+192,153,129,78,192,246,130,239,1,95,52,103,231,66,156,68,77,221,216,64,+247,135,114,145,192,135,114,224,24,3,0,51,224,24,3,71,182,192,47,66,+157,160,22,161,243,1,52,55,71,18,1,52,55,115,32,1,52,56,97,216,+132,148,94,251,100,168,0,55,72,96,0,51,66,237,2,95,52,56,98,83,+2,95,51,52,64,47,229,210,0,2,95,52,56,102,170,0,56,241,172,1,+228,245,2,97,108,70,169,1,95,52,72,189,64,205,253,143,0,0,51,105,+32,0,58,96,24,128,17,0,52,201,60,0,58,96,78,192,38,0,90,233,+83,0,0,58,96,108,3,10,65,32,90,69,197,0,58,96,146,192,37,73,+127,0,58,96,197,189,238,1,75,52,192,76,64,225,243,211,0,193,44,82,+190,225,9,1,68,111,1,52,55,130,53,96,6,224,25,6,101,154,128,6,+224,26,7,65,175,160,6,0,58,97,82,160,127,128,144,64,23,192,144,128,+16,129,206,202,40,0,58,96,110,224,157,1,202,147,77,192,195,255,1,95,+51,116,156,160,6,110,120,201,131,129,171,3,95,52,55,50,161,173,97,162,+68,207,64,89,179,199,0,51,68,165,77,165,96,33,96,124,0,58,64,49,+128,28,168,241,133,96,107,99,232,224,0,0,58,98,54,224,37,7,217,212,+169,29,233,14,1,0,58,98,149,128,237,0,50,97,182,193,184,1,64,58,+99,27,225,248,0,0,52,160,2,224,31,0,64,32,176,33,4,52,54,54,+32,58,101,246,15,10,65,32,94,71,69,84,84,73,77,69,77,73,76,76,+73,64,22,129,61,133,36,64,126,239,103,12,2,95,52,51,97,10,174,36,+177,208,128,179,235,37,0,104,116,65,181,238,116,14,192,22,224,49,3,138,+243,64,53,198,222,2,79,32,35,75,219,128,198,235,150,9,97,9,150,91,+64,0,232,123,1,235,175,3,235,220,6,164,238,64,132,229,157,5,233,225,+18,228,117,17,0,70,68,195,233,221,8,233,51,3,169,46,224,120,0,99,+189,236,76,1,0,52,99,240,207,182,225,17,7,236,32,1,193,143,162,24,+162,156,98,184,1,52,53,100,92,201,79,96,33,165,207,236,154,3,69,65,+235,17,1,236,165,0,160,14,108,170,97,153,98,45,242,27,1,192,141,3,+95,52,53,53,231,94,2,7,109,104,115,99,112,112,46,104,208,169,64,42,+143,178,163,99,226,20,3,224,138,0,96,132,199,100,225,5,4,130,42,224,+45,5,2,95,52,54,96,6,224,171,1,128,156,242,160,0,225,227,3,0,+49,70,164,2,95,52,54,132,120,230,192,5,126,211,76,90,70,190,75,252,+167,104,239,30,6,5,114,101,109,111,118,101,97,210,5,102,97,105,108,101,+100,128,219,0,58,96,134,67,46,7,117,110,108,105,110,107,32,58,96,101,+161,31,225,33,2,2,50,49,49,224,77,2,7,77,72,83,67,80,80,72,+83,239,104,3,224,46,6,225,228,5,106,223,0,66,235,0,4,128,245,232,+69,10,192,209,136,53,136,143,232,39,4,226,180,19,8,82,117,110,32,99,+112,112,104,115,226,175,20,1,95,52,99,191,224,185,0,160,133,169,226,1,+56,56,224,91,13,96,87,232,122,0,224,244,1,224,140,16,7,32,45,45,+115,116,114,105,112,160,138,236,12,6,234,229,0,206,100,162,174,99,171,79,+135,194,74,96,39,3,67,39,32,79,141,7,224,109,15,1,45,73,168,86,+160,49,224,25,1,10,47,115,114,99,47,114,117,110,116,105,109,190,64,100,+117,64,76,1,57,53,224,193,10,2,79,32,35,91,32,132,154,228,175,2,+224,20,1,66,141,242,180,4,224,66,11,235,169,0,132,253,129,93,225,44,+18,0,79,225,91,1,130,154,231,164,0,0,50,229,245,0,224,1,1,236,+191,2,64,43,134,63,0,79,226,164,2,8,45,68,95,95,77,72,83,95,+95,64,86,0,75,70,196,65,84,70,40,3,50,53,49,32,224,160,2,0,+58,97,125,134,28,227,118,10,105,107,239,48,4,227,120,20,129,14,237,22,+32,8,99,97,108,108,67,111,109,109,97,69,98,131,154,194,46,239,71,8,+0,49,98,254,226,4,20,0,44,226,246,19,96,234,167,30,7,115,121,115,+116,101,109,32,58,96,222,99,239,228,116,3,224,236,2,97,5,183,198,64,+34,224,21,4,114,187,1,95,52,144,126,225,62,3,1,95,50,82,240,228,+245,8,105,236,225,102,6,0,52,68,43,1,95,52,97,66,129,43,229,19,+0,165,180,64,29,0,52,97,192,232,241,0,3,95,52,53,51,70,39,97,+125,0,49,114,89,1,35,52,105,100,1,95,52,94,157,206,182,106,200,124,+194,107,218,225,51,2,130,63,141,28,1,55,57,226,55,2,8,92,51,52,+38,108,105,98,47,83,97,33,5,47,73,79,46,104,115,64,19,5,44,50,+56,52,58,56,129,94,0,90,129,47,110,59,64,110,97,18,2,48,50,32,+128,131,160,19,96,0,0,67,96,36,224,118,7,0,58,96,208,133,233,0,+89,138,243,135,184,224,84,3,173,180,197,36,181,68,64,12,168,173,228,78,+1,224,136,1,243,70,0,160,53,98,200,160,17,237,212,0,66,17,151,97,+0,65,96,14,133,242,7,94,116,109,112,110,97,109,101,66,20,227,122,0,+227,121,10,227,123,5,64,63,206,180,1,95,49,69,58,64,186,2,54,32,+89,135,216,128,170,146,115,64,1,65,110,184,139,97,66,160,213,64,26,234,+192,0,84,50,97,179,97,216,0,35,66,202,96,105,96,36,247,186,1,219,+127,110,192,224,45,0,0,52,176,20,96,33,216,5,201,166,224,42,5,0,+51,243,206,1,96,36,224,129,17,138,168,96,123,224,117,13,64,10,67,2,+64,112,224,33,14,156,80,224,33,19,0,49,102,148,224,67,20,97,57,96,+33,107,78,130,228,224,36,7,141,111,249,242,0,224,0,3,225,132,8,226,+91,4,225,133,19,193,44,225,132,71,0,49,178,108,128,0,138,12,224,133,+18,194,219,163,223,73,95,100,232,68,1,250,118,1,252,128,0,252,127,1,+231,199,4,143,70,117,212,1,52,52,146,20,1,95,52,69,93,0,58,106,+180,233,130,9,132,164,139,102,233,222,9,228,178,2,0,58,96,70,164,164,+69,66,1,95,50,87,32,234,20,6,0,50,87,169,224,236,0,0,83,114,+243,64,67,101,4,1,95,54,75,249,0,48,232,252,0,165,69,192,60,72,+46,65,95,235,20,3,234,243,4,131,239,1,95,50,88,33,161,83,235,49,+7,235,68,4,73,107,82,174,1,95,52,132,189,192,75,237,97,1,64,104,+68,47,111,121,0,58,96,38,131,239,64,134,77,49,0,58,96,145,64,245,+64,1,102,181,112,209,3,52,48,32,35,115,165,64,224,0,52,64,210,82,+224,161,169,229,119,14,8,68,97,116,97,47,67,104,97,114,197,119,3,49,+48,49,58,191,152,103,125,64,215,96,192,217,170,103,38,0,49,245,14,0,+0,49,65,194,96,5,128,123,160,11,97,114,96,205,215,119,2,95,52,50,+96,41,147,122,0,52,133,20,3,95,52,52,48,64,4,128,19,133,25,98,+69,0,58,96,19,175,4,64,203,96,10,92,177,77,82,128,58,3,51,55,+32,58,109,103,2,10,65,32,78,117,0,51,161,56,138,40,232,20,2,161,+211,135,220,0,52,99,91,231,212,17,247,89,0,64,106,129,123,0,85,243,+240,1,98,90,64,68,66,199,230,17,0,232,55,4,232,6,4,224,120,0,+224,107,21,244,80,3,226,155,1,158,176,224,26,12,226,182,6,224,102,21,+2,108,105,110,243,198,0,225,11,4,232,232,33,2,99,111,108,160,65,224,+52,4,1,64,64,224,37,2,9,101,110,100,45,111,102,45,102,105,108,170,+248,224,26,1,10,110,111,32,108,111,99,97,116,105,111,110,193,93,224,28,+17,0,58,97,162,149,207,100,100,79,156,133,66,0,58,97,120,147,103,67,+199,0,52,232,145,0,224,183,12,238,86,0,175,231,174,158,1,95,51,72,+219,0,58,112,126,162,155,0,51,115,120,130,155,68,246,132,148,133,65,124,+13,98,188,135,245,128,6,0,58,96,51,3,10,65,32,89,229,118,0,232,+4,9,200,3,64,48,220,63,133,247,78,229,229,66,0,192,18,1,66,39,+96,21,198,75,128,20,224,29,0,225,230,0,250,215,0,0,58,96,150,128,+194,247,144,1,0,54,82,106,0,50,228,174,1,245,167,1,224,15,1,141,+220,131,204,130,10,69,158,0,56,139,167,192,91,209,234,0,50,81,234,64,+80,179,17,243,234,3,69,117,114,122,0,48,119,126,118,138,0,52,100,233,+0,73,64,85,65,111,0,85,64,23,148,87,70,126,204,101,147,121,64,24,+64,63,2,49,50,52,143,249,96,146,139,14,134,85,1,95,49,147,71,66,+121,0,55,64,74,101,89,1,49,51,68,56,96,11,0,58,96,6,96,132,+2,49,32,75,77,103,0,55,66,9,0,55,228,238,2,12,67,111,110,116,+114,111,108,46,69,120,99,101,112,66,104,8,46,73,110,116,101,114,110,97,+108,66,31,224,39,1,3,83,111,109,101,224,35,0,98,58,96,231,0,58,+96,215,119,248,135,12,3,64,95,52,49,85,150,64,104,108,183,0,49,157,+85,67,63,198,28,1,95,52,118,238,1,58,52,76,188,97,163,0,90,65,+11,64,16,130,13,181,30,64,58,172,19,66,104,98,18,153,46,104,39,1,+95,52,72,169,0,95,129,207,0,58,96,118,237,167,0,96,94,64,30,3,+10,65,32,99,86,245,1,32,58,96,63,190,195,230,199,2,235,250,1,0,+49,184,80,102,57,240,27,2,64,8,114,179,145,229,1,58,52,75,194,101,+78,213,2,64,57,243,213,0,242,92,1,147,21,139,75,66,93,103,15,228,+74,16,3,111,112,101,110,81,25,4,58,32,99,97,110,82,240,64,16,196,+156,231,218,4,64,174,166,14,246,112,0,86,14,98,146,0,48,83,87,65,+122,1,58,52,67,180,249,177,4,97,218,4,97,99,116,105,118,68,135,0,+58,96,38,128,52,79,236,73,213,0,58,64,63,160,19,0,55,64,91,69,+105,64,3,0,58,96,30,250,19,7,0,48,255,233,1,102,65,0,48,97,+72,0,48,100,67,88,248,164,67,5,48,52,32,64,116,111,96,131,64,24,+129,62,70,152,64,24,100,206,0,58,96,58,128,46,248,70,1,247,255,2,+74,182,247,255,0,68,75,1,95,52,138,96,1,58,52,65,86,225,248,5,+64,25,245,245,5,0,90,164,44,100,227,84,240,131,163,64,85,242,101,0,+118,13,224,222,2,1,64,58,96,41,227,218,0,129,105,0,51,71,247,218,+233,1,95,50,111,156,0,50,67,204,242,119,2,1,51,48,89,233,139,37,+138,230,213,85,0,51,130,100,244,165,0,232,253,1,239,215,11,128,97,66,+53,250,195,11,228,174,1,226,84,17,218,178,9,115,97,118,101,100,32,99,+97,99,104,166,239,231,146,8,192,175,64,27,0,51,74,43,226,118,4,160,+184,1,58,51,72,190,187,136,172,30,171,178,181,89,0,51,140,61,138,104,+0,50,73,94,251,168,0,194,38,171,253,229,151,2,171,123,64,21,138,140,+139,85,1,95,51,77,210,253,51,1,0,95,88,157,64,0,236,45,0,229,+250,0,251,125,0,229,216,8,79,157,80,109,230,251,10,215,96,128,69,238,+28,1,118,229,64,8,248,41,1,176,44,251,225,12,147,36,192,41,164,94,+251,235,1,224,45,5,182,41,193,34,193,246,160,182,252,11,1,96,183,103,+195,88,50,224,0,4,1,95,51,178,244,64,51,0,89,224,162,21,82,188,+64,12,96,11,105,30,159,52,192,62,128,177,204,34,224,126,2,193,101,65,+29,197,15,253,114,23,245,45,13,128,248,231,93,4,233,81,19,9,105,110,+118,97,108,105,100,97,116,101,130,174,210,135,130,176,0,51,225,13,2,192,+244,225,106,4,100,56,1,95,51,94,47,232,39,0,160,172,226,142,4,226,+39,2,149,104,192,179,65,119,158,7,0,51,140,36,160,0,2,95,51,57,+68,214,99,26,168,176,66,51,68,20,238,45,0,110,44,161,87,122,137,225,+227,0,222,235,81,33,124,143,96,0,96,35,96,181,66,21,188,154,0,58,+96,104,68,190,65,33,72,124,0,51,127,231,155,22,0,58,96,42,100,127,+64,128,131,126,111,8,224,105,4,146,178,192,135,196,110,201,52,75,174,64,+169,96,32,201,205,97,16,224,61,3,101,15,233,170,1,96,126,101,12,81,+173,96,147,232,245,9,96,219,116,220,2,50,49,32,101,167,98,93,68,205,+129,90,91,202,105,87,64,95,0,79,245,200,1,0,51,106,97,97,114,229,+144,0,66,219,148,242,128,2,96,144,224,174,3,125,153,0,51,124,213,202,+97,164,56,0,55,66,43,70,222,98,139,128,10,193,17,225,157,0,161,50,+135,241,224,2,1,193,244,250,76,1,128,33,160,126,227,20,1,225,237,0,+96,8,1,95,54,64,115,143,12,129,212,254,83,1,129,103,139,1,0,51,+125,106,224,125,2,68,126,224,44,1,0,58,65,34,129,224,1,80,32,74,+42,0,58,66,160,129,20,199,13,255,36,4,105,28,0,51,95,101,226,64,+0,66,253,203,84,224,195,0,64,4,0,83,75,69,161,12,193,6,160,134,+96,202,165,122,110,200,69,117,108,20,224,217,3,1,95,51,139,130,225,81,+5,160,70,225,69,10,225,94,0,225,60,8,74,43,225,60,25,128,73,128,+159,243,24,0,0,64,162,110,244,7,7,224,44,4,192,120,124,180,224,48,+20,254,179,3,0,49,81,198,101,52,254,180,6,0,39,227,107,1,160,45,+129,200,223,7,145,227,224,9,1,118,146,65,214,166,148,0,67,114,173,68,+174,160,54,160,34,224,63,11,96,55,210,142,226,37,16,0,54,226,37,0,+125,159,225,198,1,100,99,129,158,0,90,225,144,6,226,240,0,227,74,1,+160,2,97,41,195,31,103,0,224,80,4,225,115,16,128,48,99,217,231,196,+1,228,84,5,224,66,0,224,192,6,132,229,224,192,70,226,98,0,164,220,+224,190,22,192,46,65,151,193,170,224,191,18,192,14,131,41,227,226,2,128,+209,207,129,64,1,100,188,224,188,0,169,38,229,138,0,156,137,229,182,2,+1,53,56,162,119,199,94,242,86,0,226,136,5,167,91,224,89,1,254,5,+2,225,33,6,192,114,224,227,1,234,225,1,224,11,0,160,9,160,133,128,+207,128,19,229,68,17,225,69,8,225,52,1,224,208,0,138,20,0,82,144,+36,229,152,25,224,81,8,224,225,2,96,197,225,55,1,64,15,136,180,227,+172,8,64,20,225,55,0,110,50,128,11,1,95,51,111,40,225,73,1,163,+92,224,98,14,228,14,18,224,97,38,165,236,225,244,3,162,237,81,185,96,+43,230,148,8,224,13,19,224,176,1,227,4,1,224,35,1,128,17,129,27,+1,52,55,224,184,5,224,171,5,136,223,192,127,96,11,70,57,2,95,51,+56,232,242,1,128,83,0,83,224,176,11,224,177,65,162,168,96,158,224,177,+38,0,56,128,43,0,56,224,18,0,225,111,1,0,58,98,199,237,216,2,+224,195,17,169,166,128,1,231,155,0,192,8,0,58,96,94,224,72,33,224,+234,1,224,86,1,226,77,0,224,5,1,0,85,224,61,2,229,224,4,96,+49,234,67,0,234,76,1,225,57,0,224,167,5,160,58,129,26,106,247,227,+162,0,96,16,224,15,0,192,224,224,168,0,224,119,34,192,35,225,39,19,+128,26,229,25,4,192,24,129,69,138,21,228,137,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,6,10,65,32,35,50,32,58,99,76,146,174,228,253,2,224,110,+3,166,55,160,13,132,81,160,5,135,102,224,225,1,224,51,1,236,80,0,+72,61,171,149,231,117,14,231,141,17,224,128,3,192,208,170,44,102,59,231,+29,8,229,144,4,132,32,135,34,228,44,0,0,73,100,16,65,12,212,106,+193,110,145,227,64,168,65,25,0,48,65,25,136,147,1,35,51,64,11,231,+205,3,228,234,21,226,4,3,227,249,0,64,8,168,54,0,58,96,186,168,+236,81,189,2,75,50,32,128,165,83,193,192,255,0,58,96,177,115,123,0,+57,161,4,106,53,120,225,215,241,183,3,215,10,128,24,64,11,183,50,224,+24,11,160,49,151,82,1,95,49,89,32,139,217,0,58,96,6,243,41,12,+224,200,6,1,95,51,158,123,128,166,218,117,0,58,64,54,128,10,108,168,+0,54,204,168,143,88,85,145,96,65,252,23,4,67,80,145,199,0,58,111,+172,214,227,2,95,49,52,64,152,111,224,1,95,51,80,71,150,202,128,17,+0,58,96,6,180,245,2,95,51,53,146,141,64,37,161,163,127,244,0,51,+111,231,1,51,54,96,106,66,42,143,203,237,24,0,80,251,116,111,129,115,+128,180,129,154,193,46,87,38,97,41,0,58,113,48,224,206,22,97,158,65,+229,66,101,64,50,219,155,91,169,113,167,181,30,253,131,1,143,214,0,50,+64,149,0,53,64,81,0,58,114,64,13,10,65,32,94,109,100,53,66,70,+73,76,69,32,58,96,25,228,202,2,64,241,128,49,160,217,216,156,0,51,+81,60,64,66,194,222,112,49,76,106,254,222,4,1,64,35,125,83,64,164,+0,35,141,100,185,233,96,63,225,85,7,64,25,246,55,3,0,58,96,24,+128,37,0,51,163,178,224,1,11,233,188,2,194,42,64,175,160,199,121,213,+180,77,154,116,201,23,164,62,247,146,3,119,57,190,232,164,23,239,243,2,+115,211,99,221,226,93,8,64,14,98,219,235,177,0,65,8,112,112,242,115,+7,1,79,32,97,11,192,181,0,58,96,82,225,239,7,98,68,192,152,225,+252,8,128,100,0,58,114,226,226,135,10,152,154,226,135,10,84,215,214,178,+161,55,0,58,96,27,239,181,12,66,154,196,236,97,7,133,123,175,163,97,+223,251,198,5,128,169,239,149,1,230,68,5,229,233,2,140,60,64,107,64,+79,239,131,3,160,73,98,214,64,155,218,241,64,220,64,113,113,219,0,90,+145,226,1,90,32,160,58,211,155,224,28,6,73,217,224,28,16,76,248,224,+28,16,107,127,224,29,16,0,50,113,11,224,29,0,1,95,53,84,137,144,+166,0,54,68,56,96,10,0,58,96,6,224,187,1,118,204,0,51,96,41,+132,105,0,50,88,94,96,161,159,165,96,16,128,149,224,16,2,160,137,224,+17,2,160,125,128,17,128,122,96,80,128,122,131,150,64,6,224,122,1,93,+73,0,51,95,178,1,95,51,95,195,1,95,51,95,215,1,95,51,95,241,+2,95,51,52,66,240,128,70,127,134,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,96,2,98,115,60,+96,26,130,193,2,98,115,60,64,12,130,148,4,98,115,99,109,112,64,14,+228,140,0,167,186,231,252,1,98,213,96,145,94,95,231,221,9,64,143,68,+145,1,95,51,131,72,1,51,51,164,67,69,48,0,58,65,77,64,89,112,+190,0,58,96,19,123,195,128,13,129,124,112,237,0,58,96,62,244,52,2,+228,54,6,0,58,96,126,199,0,226,9,6,130,235,99,119,230,197,1,98,+251,0,58,96,6,160,54,161,173,128,45,168,8,64,17,119,75,160,17,0,+58,96,71,244,202,1,190,214,160,62,94,206,0,51,126,199,96,46,97,65,+0,47,65,92,190,170,2,98,115,61,64,13,64,39,154,197,64,95,64,10,+86,12,81,211,0,75,170,49,0,58,99,255,103,93,138,71,131,163,228,161,+0,1,64,95,96,111,130,41,222,45,228,121,0,228,105,3,0,83,180,10,+96,40,161,34,121,20,0,48,133,19,228,175,2,244,108,0,252,135,3,0,+51,189,58,0,85,96,86,128,13,129,25,192,69,64,11,66,224,158,141,96,+6,165,9,125,205,0,51,90,132,0,58,64,34,225,190,1,164,181,189,255,+166,26,192,20,214,5,64,109,0,57,96,117,231,66,16,101,67,1,95,49,+64,42,183,196,224,208,36,0,90,224,208,3,248,139,1,1,95,50,121,11,+64,10,0,58,96,6,193,135,224,92,5,203,105,225,44,15,224,171,6,186,+38,96,107,64,106,126,220,0,58,96,6,169,16,190,133,224,85,13,103,101,+224,77,2,0,58,123,45,233,63,1,190,161,116,9,0,52,231,100,30,0,+58,124,26,96,221,93,250,119,171,160,5,119,83,224,11,0,120,60,190,169,+1,95,51,97,111,131,243,224,5,1,0,58,96,37,166,200,170,191,0,58,+64,42,160,51,75,34,190,84,163,222,190,65,129,40,235,8,23,0,58,106,+68,254,145,4,3,46,109,104,115,121,230,94,143,124,129,140,152,232,11,15,+131,71,232,70,6,130,29,253,74,0,187,99,167,138,64,161,163,112,1,95,+51,94,147,128,136,254,184,1,224,105,3,89,121,160,105,224,132,3,1,95,+51,94,81,225,211,7,249,246,1,233,107,6,0,49,67,19,107,113,224,42,+2,224,159,4,100,99,0,48,65,130,94,246,160,32,224,109,2,93,236,172,+232,224,213,6,226,62,3,96,200,130,50,96,188,104,115,95,82,0,58,96,+65,68,157,14,79,46,100,101,115,101,114,105,97,108,105,122,101,32,58,96,+29,74,106,20,97,100,100,95,108,122,55,55,95,100,101,99,111,109,112,114,+101,115,115,111,114,64,31,193,255,0,83,66,145,0,64,172,14,243,124,2,+170,200,133,72,244,90,3,225,25,3,129,146,202,186,224,215,0,0,50,158,+27,224,53,2,224,224,5,88,231,65,55,0,50,80,46,192,223,130,124,127,+9,235,66,0,161,27,224,88,1,127,209,170,69,224,80,0,107,38,0,51,+95,226,1,95,49,105,119,227,122,5,65,210,65,10,5,117,110,103,101,116,+98,64,251,235,173,11,224,215,3,1,95,50,94,253,235,92,3,106,132,0,+95,70,138,66,137,141,210,228,48,3,2,95,50,57,96,211,3,95,50,48,+50,226,245,2,12,104,71,101,116,67,104,97,114,58,32,69,79,70,190,139,+0,58,96,196,101,217,3,52,52,32,58,96,56,64,158,128,156,96,121,101,+81,3,51,50,32,79,67,19,0,50,74,192,1,95,50,66,113,133,116,96,+174,239,214,0,228,122,2,0,50,78,124,202,80,0,80,229,140,0,64,146,+128,173,253,138,15,22,111,112,101,110,66,105,110,97,114,121,70,105,108,101,+58,32,99,97,110,110,111,116,32,64,22,0,32,253,148,3,1,49,51,66,+251,140,154,195,243,225,54,4,209,22,164,13,161,224,1,95,50,183,61,0,+58,99,119,227,248,6,1,95,50,88,225,138,188,225,211,2,99,110,99,120,+224,5,0,221,0,66,176,64,3,228,31,1,142,103,225,124,6,20,72,97,+110,100,108,101,32,97,108,114,101,97,100,121,32,99,108,111,115,101,100,161,+132,227,167,6,66,144,100,128,67,175,0,50,190,14,99,106,73,184,0,50,+93,16,96,189,131,84,1,75,51,104,78,96,22,99,146,104,185,99,66,96,+51,130,212,0,58,96,60,163,178,78,46,80,15,0,58,96,29,65,238,96,+142,97,240,166,179,67,106,0,58,96,129,231,121,0,3,95,50,55,57,64,+149,0,55,112,75,128,84,188,35,7,116,111,70,117,110,80,116,114,64,50,+198,90,80,99,195,123,0,58,97,85,101,191,134,74,0,58,100,237,226,54,+16,65,177,229,113,10,225,227,8,66,83,81,134,96,36,0,50,113,251,193,+246,231,69,0,229,140,5,226,15,18,64,148,129,82,69,90,0,80,162,237,+1,95,50,105,253,224,6,1,68,232,96,50,160,206,200,125,96,45,100,196,+228,39,8,130,16,64,20,225,233,6,129,80,192,219,224,55,8,75,101,224,+200,1,228,69,1,130,131,1,95,50,75,146,160,184,129,199,14,73,79,46,+112,101,114,102,111,114,109,73,79,32,94,38,161,213,64,31,129,214,6,102,+112,102,105,110,32,58,64,119,128,14,2,110,101,119,64,14,163,244,69,158,+144,9,97,68,192,18,3,117,116,102,56,64,18,129,194,97,115,71,26,98,+64,178,186,0,67,64,31,161,60,229,149,6,160,213,100,219,0,49,105,25,+224,17,2,64,215,64,19,161,113,239,37,4,0,49,72,53,97,91,224,23,+7,0,57,207,62,224,24,5,68,172,224,23,8,227,129,1,1,119,43,163,+110,65,120,103,42,229,83,3,0,50,71,155,67,180,138,43,229,76,2,203,+54,226,141,7,0,58,98,170,65,36,0,102,100,155,0,58,96,85,207,95,+233,73,14,233,71,6,1,58,50,211,10,82,139,83,10,239,38,2,224,2,+34,0,95,206,141,224,0,3,130,56,224,1,21,114,22,1,51,55,228,168,+2,5,70,108,97,103,115,123,193,42,224,0,6,231,67,2,224,2,33,96,+157,224,106,11,7,118,101,114,98,111,115,101,61,229,213,0,64,33,79,243,+196,96,224,0,6,224,206,33,81,100,194,61,224,0,8,224,196,41,224,193,+16,4,114,117,110,73,116,224,191,4,0,50,84,48,224,191,13,224,188,59,+224,187,38,224,184,16,5,109,104,115,100,105,114,225,121,5,231,79,1,224,+191,12,224,188,56,224,187,35,224,184,16,4,112,97,116,104,115,224,183,10,+232,12,2,224,189,11,224,186,53,224,185,32,224,182,16,4,111,117,116,112,+117,226,41,5,225,111,21,224,174,50,224,173,29,224,170,16,6,108,111,97,+100,105,110,103,226,213,27,224,162,47,224,161,26,227,114,17,6,101,97,100,+67,97,99,104,228,54,5,224,160,13,224,157,44,224,156,23,224,153,16,4,+119,114,105,116,101,224,154,30,224,151,41,224,150,20,224,147,16,6,117,115,+101,84,105,99,107,227,49,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,60,35,224,139,32,224,138,11,224,135,17,224,133,37,+224,130,29,224,129,8,224,126,17,175,121,225,138,20,224,114,26,224,113,5,+224,110,16,6,98,117,105,108,100,80,107,228,79,7,82,52,224,240,12,224,+119,23,224,118,2,224,115,16,3,108,105,115,116,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,230,140,35,224,0,13,192,108,0,49,86,+28,193,47,2,95,49,50,76,223,186,23,93,73,128,11,0,58,96,6,77,+241,109,4,74,238,97,13,125,0,224,156,3,6,78,111,116,104,105,110,103,+128,156,237,21,1,0,50,93,180,110,188,2,56,32,95,78,192,1,64,35,+84,19,225,83,6,224,70,1,4,74,117,115,116,32,160,68,75,227,76,109,+192,49,65,20,64,166,0,64,98,20,160,15,87,103,160,15,0,58,96,6,+245,18,3,128,221,0,58,64,124,64,23,111,248,96,119,4,49,48,50,32,+35,88,227,186,38,160,16,207,116,254,105,3,0,75,224,235,9,3,70,97,+108,115,84,131,161,75,224,24,1,2,84,114,117,128,23,225,80,0,158,160,+129,80,158,154,96,6,189,125,90,38,97,20,1,95,50,94,108,1,58,50,+190,162,248,242,5,236,144,26,160,182,215,136,238,142,1,0,95,119,37,96,+244,245,40,7,0,53,226,131,0,129,171,175,211,241,61,1,225,197,3,161,+196,176,129,96,51,129,69,64,186,109,149,195,114,238,66,3,253,136,1,243,+104,3,224,72,4,244,162,6,0,50,255,96,1,243,5,6,1,101,97,145,+119,0,75,97,39,141,178,1,65,46,103,188,1,32,58,96,80,129,249,0,+52,224,2,2,128,85,1,58,50,191,90,162,23,128,2,225,71,7,1,58,+50,191,89,206,7,224,38,1,224,36,0,1,58,50,191,106,224,151,1,7,+118,55,46,48,92,49,48,38,86,146,0,50,191,88,3,95,50,53,50,64,+4,95,51,0,50,191,51,3,95,50,53,52,67,117,0,48,143,12,128,6,+0,51,96,5,0,48,227,134,0,0,58,96,51,128,45,2,51,32,58,64,+50,128,145,0,58,64,15,128,10,65,142,0,53,99,245,254,154,3,0,54,+192,67,127,210,179,105,77,147,128,85,208,227,64,60,148,221,0,50,94,85,+0,58,64,73,128,25,111,198,66,138,129,244,129,219,0,64,126,94,195,239,+96,30,229,200,2,160,35,96,17,192,11,128,110,210,141,90,49,127,78,128,+60,0,58,96,123,146,167,81,66,93,107,1,58,50,222,45,1,50,52,82,+18,64,201,145,181,225,99,1,5,115,116,100,111,117,116,65,253,0,58,96,+51,145,50,128,21,1,32,58,96,50,248,86,0,148,173,131,218,241,156,35,+178,91,69,129,96,195,189,69,64,38,216,219,96,28,181,243,120,100,2,52,+49,32,117,197,2,66,32,95,120,10,93,80,64,38,129,170,0,73,64,154,+194,167,4,97,108,108,111,99,64,16,176,55,0,51,65,222,189,100,244,182,+8,1,95,50,93,22,67,39,93,16,98,44,1,64,58,65,50,128,145,2,+95,50,49,64,227,128,207,64,33,0,58,96,47,96,153,227,174,0,1,95,+50,125,157,64,13,129,128,97,246,0,58,96,47,80,252,1,112,117,118,41,+189,99,246,41,0,65,120,246,41,6,189,102,1,75,50,244,4,0,189,65,+84,42,243,70,0,189,36,88,11,0,66,187,151,0,90,160,7,128,9,160,+10,245,235,5,247,227,6,225,7,6,177,36,0,50,91,168,92,36,132,59,+101,87,93,69,113,247,228,35,3,3,66,97,100,32,181,176,2,109,111,100,+197,137,248,128,1,64,166,213,78,100,151,120,175,85,113,244,206,6,134,19,+1,50,50,152,40,97,67,116,139,228,170,5,189,240,1,95,55,87,129,189,+239,5,102,112,50,112,32,58,96,57,64,26,94,154,150,115,224,5,3,70,+136,0,39,128,7,0,67,149,48,97,161,65,196,224,6,13,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,191,109,129,161,0,58,96,6,227,156,2,116,73,65,90,0,54,+66,182,190,242,96,24,67,65,83,210,64,22,0,54,224,22,1,103,22,190,+198,136,48,0,50,179,223,88,6,0,58,96,32,228,107,0,0,50,91,75,+128,142,0,58,96,38,3,10,65,32,82,161,95,0,58,96,28,160,138,0,+89,228,232,0,92,107,102,165,64,32,129,208,225,145,5,0,58,96,179,96,+55,0,85,131,148,126,228,118,28,0,58,66,154,64,27,151,55,230,43,2,+0,58,96,37,183,184,167,105,0,58,98,238,224,129,2,251,41,2,0,80,+96,90,125,92,150,118,231,61,4,128,160,135,92,2,64,64,64,99,78,0,+58,68,5,194,100,1,95,50,85,117,161,121,93,226,64,30,129,52,7,115,+101,113,117,97,108,32,58,96,33,64,46,232,25,0,1,49,49,227,59,2,+5,77,72,83,68,73,82,99,50,71,123,93,198,226,239,2,1,58,50,189,+235,224,19,0,230,116,2,0,58,96,45,253,32,9,118,34,1,95,50,92,+93,245,179,21,253,120,6,0,50,100,240,245,185,11,190,78,3,95,50,48,+57,64,208,129,151,13,112,101,101,107,67,65,83,116,114,105,110,103,32,58,+64,26,96,35,1,57,51,103,89,0,58,96,102,227,139,0,165,246,70,151,+73,107,64,133,152,126,128,6,129,64,96,159,0,58,96,6,121,37,1,73,+110,70,102,189,60,91,99,2,101,110,118,64,16,167,171,233,106,3,225,2,+6,233,100,0,166,152,225,81,1,1,95,50,157,204,1,58,50,189,101,232,+241,8,3,116,97,105,108,97,143,122,39,253,107,0,1,95,50,65,238,92,+126,64,67,99,47,188,246,70,112,188,167,2,95,51,48,98,198,92,23,2,+95,49,57,156,207,0,54,97,123,139,225,121,126,192,11,67,84,96,11,0,+58,96,6,97,230,0,50,72,93,1,52,50,64,67,128,61,1,51,54,224,+155,2,6,101,114,114,111,114,58,32,203,3,0,48,192,38,0,58,96,6,+96,128,2,49,32,75,64,21,0,55,72,56,235,35,3,8,67,111,110,116,+114,111,108,46,69,64,66,64,64,224,26,1,96,18,2,67,97,108,128,246,+134,88,96,194,108,127,163,11,198,85,64,7,133,183,71,159,166,42,69,222,+138,111,97,109,127,4,103,218,168,159,169,29,92,252,64,0,92,0,96,99,+218,253,166,225,96,32,97,109,232,254,8,163,140,232,241,2,0,58,100,137,+96,162,0,85,225,195,7,16,109,100,53,67,111,109,98,105,110,101,58,32,+101,109,112,116,121,134,147,64,145,68,120,68,48,160,171,122,167,222,184,3,+66,32,95,56,65,127,65,205,1,64,89,96,127,64,151,103,31,68,56,228,+27,1,196,190,233,127,2,224,255,3,96,19,96,54,72,221,0,49,124,131,+104,190,0,49,158,132,1,64,95,90,30,1,95,49,91,254,192,0,0,58,+97,54,66,233,9,109,100,53,65,114,114,97,121,32,58,96,57,130,126,194,+237,0,55,74,97,64,160,1,95,49,159,138,102,212,231,189,2,253,159,4,+1,49,57,66,35,224,46,2,163,138,251,85,1,123,206,249,193,5,189,4,+64,145,226,225,0,96,20,186,175,65,0,137,60,67,107,0,53,238,97,0,+141,215,153,100,224,106,0,225,58,3,192,25,168,147,140,249,64,67,1,52,+55,205,144,2,49,49,53,129,34,2,95,49,56,132,73,128,0,229,150,3,+133,191,192,69,232,62,1,64,51,110,160,224,44,2,96,95,0,66,165,229,+0,52,161,125,106,61,133,43,193,190,232,100,3,224,43,10,194,134,229,28,+2,96,16,0,58,65,96,130,195,105,168,236,221,5,0,58,96,143,99,215,+0,48,65,182,93,214,226,3,0,129,253,0,35,103,194,78,248,0,58,97,+160,7,10,65,32,35,49,54,32,58,96,28,128,57,0,52,67,6,76,74,+162,58,96,69,0,49,69,5,2,95,49,48,67,231,64,16,64,11,69,207,+160,11,0,49,65,246,160,11,0,56,67,122,192,11,0,51,96,104,0,54,+131,56,135,7,169,33,137,36,66,62,160,2,225,73,6,97,185,128,50,161,+252,165,210,0,64,71,161,64,242,1,95,49,70,144,162,77,126,151,0,85,+95,108,224,23,0,199,120,1,32,95,78,71,224,29,7,224,53,16,4,64,+64,83,32,73,95,165,129,86,192,68,224,151,0,67,139,0,83,162,93,128,+69,113,44,224,69,5,128,161,99,132,66,98,224,31,7,130,109,162,247,140,+148,67,37,224,40,9,64,0,128,16,96,52,73,38,65,96,162,2,240,254,+4,96,29,100,159,130,246,113,202,128,163,162,246,78,183,227,53,1,203,15,+64,34,1,64,95,77,204,167,53,68,82,1,55,57,228,222,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,50,56,58,49,242,18,0,103,234,98,+15,96,223,0,85,192,187,192,18,239,29,0,128,5,0,50,244,61,2,224,+60,3,161,70,0,64,69,25,228,5,0,69,226,64,169,128,197,144,236,99,+83,99,91,66,162,82,3,171,217,1,67,32,130,187,128,18,227,84,1,3,+64,95,52,52,131,234,0,58,98,160,108,227,0,58,96,113,77,196,64,10,+202,33,0,58,64,140,165,17,71,144,0,49,95,121,71,75,74,49,65,36,+196,174,191,164,199,144,80,63,1,95,49,80,105,167,144,224,56,0,67,28,+192,11,97,104,104,132,96,6,128,102,79,211,226,5,2,95,183,64,31,0,+54,160,31,0,85,193,166,94,222,133,243,0,80,128,47,131,18,96,47,224,+15,8,64,65,242,115,3,167,116,64,28,174,79,133,214,169,50,64,147,98,+186,65,58,192,73,115,124,224,21,2,128,159,147,162,169,187,198,144,137,224,+0,49,127,199,0,58,96,169,97,27,0,56,65,40,129,101,0,90,64,200,+0,58,96,40,161,126,180,128,65,76,243,223,0,0,73,64,35,179,213,105,+216,237,207,6,224,14,5,192,189,255,109,1,137,232,128,207,0,58,96,6,+203,72,160,42,69,37,106,32,224,42,0,115,188,96,6,192,42,83,110,1,+95,49,115,184,96,43,4,10,65,32,47,61,64,165,163,110,71,103,0,57,+64,130,205,240,204,88,0,75,64,80,141,87,129,169,102,31,0,85,224,20,+1,99,124,235,251,5,176,176,80,4,64,147,149,18,196,248,96,176,160,77,+96,175,192,17,0,58,96,6,167,46,233,41,3,64,9,192,59,237,232,2,+0,58,96,60,101,238,1,54,48,64,202,226,239,1,179,67,181,19,160,141,+233,216,3,9,110,111,32,109,97,116,99,104,32,97,213,193,96,32,96,7,+79,179,194,245,106,45,96,11,0,58,96,6,234,45,29,8,120,99,101,112,+116,105,111,110,46,68,102,2,114,110,97,106,35,224,39,1,2,80,97,116,+64,22,0,77,64,128,0,70,203,56,162,204,179,179,134,87,177,108,0,49,+112,121,96,197,98,152,78,27,224,15,4,66,0,248,9,2,201,101,145,75,+0,51,64,34,243,127,13,170,85,98,160,69,86,97,50,1,53,53,130,177,+180,11,2,85,32,58,64,18,226,202,2,179,232,161,92,77,44,162,136,81,+106,0,35,97,244,215,45,1,53,32,128,15,99,113,138,43,97,102,68,232,+71,156,96,134,224,39,3,161,135,225,43,1,6,39,92,57,50,38,39,39,+165,151,193,156,169,126,224,99,0,100,30,138,123,224,17,3,139,111,233,51,+3,224,168,1,0,64,160,35,134,62,64,156,164,146,98,6,128,158,130,163,+247,247,8,64,146,70,49,160,148,64,0,0,58,96,147,226,187,0,175,48,+231,109,6,166,166,1,95,49,83,88,160,108,0,54,85,103,74,49,129,145,+205,244,65,186,165,70,181,26,179,20,112,220,208,218,0,90,65,11,102,68,+166,21,224,163,5,224,160,0,2,67,32,79,249,171,1,67,226,138,9,114,+196,225,22,7,96,0,5,79,32,80,32,35,55,244,214,3,64,79,0,97,+96,79,96,27,0,56,224,27,7,0,98,224,27,1,71,242,224,28,5,0,+102,224,28,2,0,48,224,28,7,0,110,224,28,2,245,73,4,64,28,109,+116,128,28,0,57,224,27,7,117,100,160,56,0,49,224,28,7,0,118,224,+56,2,224,143,8,64,3,227,116,1,225,193,0,132,77,69,198,182,105,102,+76,66,152,5,95,49,52,48,32,35,97,135,65,45,85,11,0,35,67,48,+64,53,196,106,3,52,53,32,58,97,163,195,27,174,146,193,189,90,11,132,+79,96,17,0,58,96,6,154,172,72,16,235,205,0,207,130,0,49,118,93,+69,207,144,81,96,19,121,249,112,11,96,30,64,69,131,183,64,67,226,230,+2,249,172,1,192,64,149,153,226,96,8,64,69,104,118,203,106,192,40,226,+52,3,224,10,1,96,50,106,41,235,237,1,96,250,129,28,128,74,70,153,+224,74,4,0,58,96,102,5,10,65,32,111,114,100,65,36,132,78,2,99,+104,114,64,12,216,54,248,191,4,0,58,64,193,64,23,78,115,192,175,67,+254,134,40,182,170,225,159,6,111,80,225,159,0,123,142,64,43,129,203,0,+60,70,237,182,196,198,189,0,58,96,60,161,243,64,16,97,186,0,51,76,+73,182,122,131,203,65,52,82,244,238,187,2,0,58,96,145,140,107,0,50,+64,47,177,95,103,150,64,136,1,95,49,79,37,0,58,99,84,199,108,182,+119,0,61,96,11,160,194,128,196,81,142,67,205,81,131,131,248,130,46,231,+57,0,149,211,96,15,0,58,96,6,201,103,105,163,85,194,0,58,96,35,+147,197,156,138,82,81,96,26,96,43,199,216,194,70,110,176,160,10,231,144,+0,199,186,224,32,0,236,59,0,228,203,0,244,142,1,97,20,224,65,4,+224,64,5,184,159,180,178,129,214,181,98,171,186,224,169,2,123,43,96,246,+240,220,4,181,94,73,190,73,170,0,58,97,33,180,150,216,235,97,61,204,+75,128,36,240,1,0,240,174,0,119,156,103,16,115,233,208,113,1,95,49,+151,172,0,58,103,85,176,72,211,159,96,27,248,170,1,105,66,85,68,176,+62,64,222,160,26,117,203,112,21,89,93,96,78,161,140,128,39,1,95,49,+85,98,64,214,192,31,181,140,2,110,101,119,212,15,4,76,101,110,32,58,+96,39,224,223,7,181,138,75,212,181,71,173,54,109,82,0,58,109,155,245,+216,4,239,77,3,181,74,220,79,160,49,129,32,253,187,5,229,13,0,0,+58,109,182,160,52,64,13,229,14,0,128,2,70,206,65,248,111,210,84,195,+0,58,79,59,160,48,239,209,11,180,231,233,206,3,84,161,84,44,79,129,+224,27,11,96,120,180,213,252,229,0,128,188,180,220,4,114,101,109,32,58,+109,47,161,47,224,1,1,113,47,64,0,224,20,11,224,17,8,224,14,5,+224,11,2,192,8,96,239,128,122,225,76,1,225,55,12,180,249,0,79,64,+152,170,156,1,56,53,74,46,114,180,192,7,1,95,56,68,37,115,48,1,+95,57,71,121,160,10,66,148,160,10,118,102,128,10,100,223,84,235,0,58,+96,17,123,16,3,111,107,101,87,133,76,181,4,0,94,86,89,128,18,180,+213,171,169,0,95,84,47,1,64,95,120,128,180,158,193,78,130,61,180,79,+224,46,0,111,217,128,46,129,103,65,5,86,161,100,136,69,150,0,95,116,+170,0,58,180,73,182,114,179,135,6,116,111,80,116,114,32,58,179,130,225,+184,5,179,24,175,216,129,239,79,182,64,96,68,153,1,64,95,82,23,221,+212,134,230,109,132,106,161,179,75,240,48,7,178,74,201,109,0,95,82,15,+65,181,128,63,1,67,32,96,65,0,95,109,196,1,64,58,178,89,230,108,+7,178,67,79,104,114,85,72,222,0,58,178,75,5,113,117,111,116,32,58,+177,252,226,58,1,226,62,2,226,101,72,177,26,97,30,165,116,243,175,1,+0,95,112,144,132,128,224,20,0,164,133,244,160,6,243,158,3,0,58,177,+87,85,173,68,171,70,248,0,58,176,55,6,94,102,114,101,101,32,58,64,+23,227,229,0,224,91,5,85,64,149,126,210,244,245,61,4,190,144,80,101,+224,116,3,0,58,176,129,227,218,1,64,165,134,63,96,244,0,39,79,225,+244,29,1,186,76,160,99,244,183,1,166,63,193,64,224,120,3,1,64,95,+80,190,128,164,134,80,80,155,244,175,3,137,80,0,58,177,1,3,85,32,+75,51,227,181,5,0,58,240,255,1,176,254,130,180,66,225,176,207,76,88,+0,83,100,244,189,128,128,188,76,248,144,152,64,218,224,122,11,96,121,176,+244,229,106,3,229,24,0,176,206,4,115,101,113,32,58,176,198,96,225,72,+167,162,197,214,252,226,202,7,208,143,247,195,5,8,117,110,100,101,102,105,+110,101,100,74,222,0,58,176,166,229,229,15,176,183,0,95,74,166,99,215,+71,176,99,55,0,95,73,175,234,152,12,78,47,234,148,2,157,106,2,67,+32,95,80,132,224,37,1,234,117,2,64,37,96,19,96,10,0,95,81,21,+0,58,177,37,0,85,231,88,0,0,53,80,111,64,32,210,212,161,65,0,+80,96,12,97,123,230,121,1,132,29,96,175,1,53,32,179,23,64,70,153,+100,132,197,64,30,131,56,224,35,1,224,55,11,193,10,177,172,83,150,132,+1,113,47,224,13,0,105,208,225,105,5,180,65,14,58,32,117,110,115,117,+112,112,111,114,116,101,100,32,119,69,128,2,115,105,122,159,206,3,35,51,+50,55,96,102,8,35,50,49,52,55,52,56,51,54,75,36,0,58,178,10,+244,16,2,235,183,0,64,117,244,219,1,66,246,212,3,81,179,129,20,65,+146,0,51,225,33,0,129,143,0,54,148,9,98,111,178,32,0,105,91,246,+178,1,0,115,75,105,177,245,74,124,177,244,230,197,15,177,134,227,43,0,+165,37,209,109,1,52,56,183,89,78,242,0,95,80,13,0,95,80,32,0,+95,80,48,117,157,1,95,53,82,112,129,238,65,65,64,9,0,58,64,5,+176,216,241,219,3,87,48,89,13,240,136,0,177,186,224,29,1,224,49,1,+224,39,4,177,141,227,208,10,177,66,3,62,61,32,58,176,212,2,62,32,+58,176,205,76,5,176,205,2,60,32,58,176,201,5,105,99,109,112,32,58,+175,192,107,193,77,212,0,95,78,4,0,58,174,20,75,190,174,20,65,64,+173,244,2,80,32,58,173,240,196,155,164,216,193,74,224,20,11,224,17,8,+224,14,5,224,11,2,192,8,230,24,0,174,49,233,100,13,174,8,4,110,+101,103,32,58,173,110,2,42,32,58,173,107,2,45,32,58,173,104,2,43,+32,58,173,90,224,156,68,0,58,173,146,224,155,2,193,143,173,128,171,9,+2,66,32,95,77,18,0,95,113,102,0,66,107,14,102,140,1,64,58,173,+156,117,97,173,151,2,73,32,58,173,150,64,54,96,42,3,54,32,64,58,+173,156,64,29,128,232,64,9,128,232,8,94,109,97,108,108,111,99,32,58,+173,119,13,73,79,46,112,101,114,102,111,114,109,73,79,32,58,173,128,224,+187,2,0,58,173,135,2,85,32,58,237,85,0,224,227,12,0,58,173,93,+64,19,0,95,76,166,1,64,95,76,203,0,58,173,95,131,75,136,231,172,+227,6,114,97,105,115,101,32,58,172,210,94,240,128,172,7,65,46,114,101,+97,100,32,58,172,201,13,73,79,46,103,101,116,65,114,103,82,101,102,32,+58,172,202,0,95,71,19,101,15,68,120,99,108,64,107,128,190,6,73,79,+46,62,62,32,58,172,176,0,95,80,100,98,175,108,205,252,144,0,71,36,+99,131,0,49,95,131,96,9,0,50,71,212,99,141,172,216,186,22,111,70,+174,120,151,243,96,35,233,89,0,73,87,64,32,116,140,192,32,0,95,144,+197,165,56,0,55,88,101,224,47,12,108,253,96,155,143,143,225,14,0,236,+202,0,226,202,6,0,58,236,206,0,108,31,228,171,0,130,87,164,140,172,+192,233,246,0,70,38,224,11,2,96,210,101,33,0,58,236,202,1,0,50,+174,66,166,246,0,51,97,221,109,197,130,135,74,128,129,75,75,106,96,36,+180,183,0,95,68,213,65,237,240,46,0,227,137,0,70,206,96,11,2,66,+32,58,162,140,9,79,46,114,101,116,117,114,110,32,58,225,225,0,0,62,+68,141,128,201,2,80,32,58,227,127,7,227,107,37,0,58,128,208,226,167,+15,235,38,1,194,143,64,202,2,95,49,57,101,135,224,0,255,224,0,255,+224,0,255,224,0,255,224,0,255,224,0,255,224,0,255,224,0,103,1,32,+125,+};+unsigned char *combexpr = data;+int combexprlen = 95221; #include "mhsffi.h" static struct ffi_entry table[] = { { 0,0 }
ghc/Compat.hs view
@@ -11,6 +11,11 @@ import System.Environment import System.IO +------- List --------++takeWhileEnd :: forall a . (a -> Bool) -> [a] -> [a]+takeWhileEnd p = reverse . takeWhile p . reverse+ ------- IO -------- openFileM :: FilePath -> IOMode -> IO (Maybe Handle)
+ ghc/MHSPrelude.hs view
@@ -0,0 +1,2 @@+module MHSPrelude(module Prelude) where+import Prelude
lib/AllOfLib.hs view
@@ -3,17 +3,22 @@ module AllOfLib(main) where -- Only used to save the compilation cache. import Control.Applicative+import Control.Category import Control.DeepSeq import Control.Error import Control.Exception import Control.Exception.Internal import Control.Monad import Control.Monad.Fail+import Control.Monad.IO.Class import Control.Monad.ST import Control.Monad.ST_Type import Data.Bits import Data.Bool import Data.Bool_Type+import Data.Bifoldable+import Data.Bifunctor+import Data.Bitraversable import Data.Bounded import Data.ByteString import Data.Char@@ -24,14 +29,22 @@ import Data.Either import Data.Enum import Data.Eq+import Data.Fixed import Data.FloatW import Data.Floating import Data.Foldable+import Data.Foldable1 import Data.Fractional import Data.Function import Data.Functor+import Data.Functor.Classes+import Data.Functor.Compose import Data.Functor.Const+import Data.Functor.Contravariant import Data.Functor.Identity+import Data.Functor.Product+import Data.Functor.Sum+import Data.Hashable import Data.IOArray import Data.IORef import Data.Int@@ -41,13 +54,16 @@ import Data.Integer_Type import Data.Integral import Data.Ix+import Data.Kind import Data.List import Data.List_Type import Data.Maybe import Data.Maybe_Type import Data.Monoid+import Data.Monoid.Internal import Data.Num import Data.Ord+import Data.Orphans import Data.Ordering_Type import Data.Proxy import Data.Ratio@@ -62,6 +78,7 @@ import Data.Text import Data.Traversable import Data.Tuple+import Data.Tuple.Instances import Data.Typeable import Data.TypeLits import Data.Version@@ -69,11 +86,16 @@ import Data.Word import Data.ZipList import Debug.Trace+import Foreign+import Foreign.C+import Foreign.C.Error import Foreign.C.String import Foreign.C.Types import Foreign.ForeignPtr+import Foreign.Marshal import Foreign.Marshal.Alloc import Foreign.Marshal.Array+import Foreign.Marshal.Error import Foreign.Marshal.Utils import Foreign.Ptr import Foreign.Storable@@ -84,12 +106,15 @@ import Numeric.Natural import Prelude import Primitives+import System.Compress+import System.Console.GetOpt --import System.Console.SimpleReadline import System.Directory import System.Environment import System.Exit import System.IO import System.IO_Handle+import System.IO.Error import System.IO.MD5 import System.IO.PrintOrRun import System.IO.Serialize
lib/Control/Applicative.hs view
@@ -4,6 +4,7 @@ liftA, liftA3, Alternative(..), guard, asum, optional,+ module Data.Functor.Const_Type, ) where import Prelude() -- do not import Prelude import Primitives -- for fixity@@ -12,6 +13,7 @@ import Data.Function import Data.List_Type import Data.Maybe_Type+import Data.Functor.Const_Type infixl 4 <*>, *>, <*, <**>
+ lib/Control/Category.hs view
@@ -0,0 +1,21 @@+module Control.Category(module Control.Category) where+import Prelude()+import Primitives+import qualified Data.Function as F++infixr 9 .+infixr 1 >>>, <<<++class Category cat where+ id :: cat a a+ (.) :: cat b c -> cat a b -> cat a c++instance Category (->) where+ id = F.id+ (.) = (F..)++(<<<) :: Category cat => cat b c -> cat a b -> cat a c+(<<<) = (.)++(>>>) :: Category cat => cat a b -> cat b c -> cat a c+f >>> g = g . f
lib/Control/DeepSeq.hs view
@@ -8,12 +8,29 @@ rnfNoErr, rnfErr, ) where+import Prelude() import Primitives(primRnfErr, primRnfNoErr)+import Control.Applicative+import Control.Monad+import Data.Bool+import Data.Char import Data.Complex+import Data.Double+import Data.Either+import Data.Fixed+import Data.Float+import Data.Function import Data.Int-import Data.Word+import Data.Integer+import Data.List+import Data.List.NonEmpty+import Data.Maybe+import Data.Ord+import Data.Proxy import Data.Ratio+import Data.Real import Data.Tuple+import Data.Word rnfNoErr :: forall a . a -> () rnfNoErr = primRnfNoErr@@ -65,20 +82,29 @@ instance NFData Word64 instance NFData (Proxy a) where rnf Proxy = ()+ instance NFData a => NFData (Ratio a) where rnf x = rnf (numerator x, denominator x) -instance (NFData a) => NFData (Complex a) where- rnf (x :+ y) = rnf x `seq` rnf y `seq` () instance NFData a => NFData (Maybe a) where rnf Nothing = () rnf (Just a) = rnf a+ instance NFData a => NFData [a] where rnf = foldr (\ x r -> rnf x `seq` r) () instance (NFData a, NFData b) => NFData (Either a b) where rnf (Left a) = rnf a rnf (Right b) = rnf b++instance (NFData a) => NFData (Complex a) where+ rnf (x :+ y) = rnf x `seq` rnf y++instance NFData a => NFData (NonEmpty a) where+ rnf = rnf . toList++instance NFData (Fixed a)+-- rnf = rnf {- -- | @since 1.4.3.0
lib/Control/Error.hs view
@@ -1,6 +1,6 @@ -- Copyright 2023 Lennart Augustsson -- See LICENSE file for full license.-module Control.Error(error, undefined, ErrorCall(..)) where+module Control.Error(error, errorWithoutStackTrace, undefined, ErrorCall(..)) where import Prelude() -- do not import Prelude import Data.Char_Type import Data.List_Type@@ -21,3 +21,7 @@ undefined :: forall a . a undefined = error "undefined"++-- GHC compatibility+errorWithoutStackTrace :: forall a . String -> a+errorWithoutStackTrace s = throw (ErrorCall s)
lib/Control/Exception.hs view
@@ -20,6 +20,7 @@ -- ArithException(..), ) where+import Prelude(); import MiniPrelude import Control.Exception.Internal import {-# SOURCE #-} Data.Typeable import System.IO.Unsafe
lib/Control/Monad.hs view
@@ -41,9 +41,9 @@ import Data.Bool import Data.Char_Type import Data.Function-import Data.Functor+import Data.Functor hiding(unzip) import Data.List-import Data.Monoid+import Data.Monoid.Internal import Data.Ord --import Data.Maybe @@ -211,9 +211,11 @@ Just a >>= f = f a -} -class (Monad m) => MonadPlus m where+class (Alternative m, Monad m) => MonadPlus m where mzero :: forall a . m a+ mzero = empty mplus :: forall a . m a -> m a -> m a+ mplus = (<|>) instance MonadPlus [] where mzero = []
+ lib/Control/Monad/Fix.hs view
@@ -0,0 +1,74 @@+module Control.Monad.Fix(+ MonadFix(..),+ fix,+ ) where+import Control.Monad+import Data.Function(fix)+import Data.List.NonEmpty(NonEmpty(..))+import Data.Monoid.Internal+import Data.Tuple++class (Monad m) => MonadFix m where+ mfix :: (a -> m a) -> m a++{-+instance MonadFix Solo where+ mfix f = let a = f (unSolo a) in a+ where unSolo (MkSolo x) = x+-}+instance MonadFix Maybe where+ mfix f = let a = f (unJust a) in a+ where unJust (Just x) = x+ unJust Nothing = error "mfix Maybe: Nothing"++instance MonadFix [] where+ mfix f = case fix (f . head) of+ [] -> []+ (x:_) -> x : mfix (drop 1 . f)++instance MonadFix NonEmpty where+ mfix f = case fix (f . neHead) of+ ~(x :| _) -> x :| mfix (neTail . f)+ where+ neHead ~(a :| _) = a+ neTail ~(_ :| as) = as++--instance MonadFix IO where+-- mfix = fixIO++instance MonadFix ((->) r) where+ mfix f = \ r -> let a = f a r 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++instance MonadFix Dual where+ mfix f = Dual (fix (getDual . f))++instance MonadFix Sum where+ mfix f = Sum (fix (getSum . f))++instance MonadFix Product where+ mfix f = Product (fix (getProduct . f))++instance MonadFix First where+ mfix f = First (mfix (getFirst . f))++instance MonadFix Last where+ mfix f = Last (mfix (getLast . f))++instance MonadFix f => MonadFix (Alt f) where+ mfix f = Alt (mfix (getAlt . f))++instance MonadFix f => MonadFix (Ap f) where+ mfix f = Ap (mfix (getAp . f))++instance MonadFix Down where+ mfix f = Down (fix (getDown . f))+-}
+ lib/Control/Monad/IO/Class.hs view
@@ -0,0 +1,12 @@+module Control.Monad.IO.Class (MonadIO(..)) where+import Prelude()+import Data.Char+import Control.Applicative+import Control.Monad+import System.IO++class (Monad m) => MonadIO m where+ liftIO :: IO a -> m a++instance MonadIO IO where+ liftIO io = io
lib/Control/Monad/ST.hs view
@@ -2,7 +2,7 @@ ST, runST, ) where-import Prelude+import Prelude(); import MiniPrelude import Primitives(primPerformIO) import Control.Monad.ST_Type
lib/Control/Monad/ST_Type.hs view
@@ -4,8 +4,11 @@ ) where import Prelude() -- do not import Prelude import Primitives(IO)+import {-# SOURCE #-} Data.Typeable -- The ST monad is implemented with the IO monad. newtype ST s a = ST (IO a)+ deriving (Typeable)+ unST :: forall s a . ST s a -> IO a unST (ST io) = io
+ lib/Control/Monad/Zip.hs view
@@ -0,0 +1,136 @@+{-# LANGUAGE Safe #-}+{-# LANGUAGE TypeOperators #-}++-----------------------------------------------------------------------------+-- |+-- Module : Control.Monad.Zip+-- Copyright : (c) Nils Schweinsberg 2011,+-- (c) George Giorgidze 2011+-- (c) University Tuebingen 2011+-- License : BSD-style (see the file libraries/base/LICENSE)+-- Maintainer : libraries@haskell.org+-- Stability : stable+-- Portability : portable+--+-- Monadic zipping (used for monad comprehensions)+--+-----------------------------------------------------------------------------++module Control.Monad.Zip where+import Control.Monad+import Data.Functor.Identity+import Data.Monoid.Internal+import qualified Data.List.NonEmpty as NE+--import Data.Tuple++-- | Instances should satisfy the laws:+--+-- [Naturality]+--+-- @'liftM' (f 'Control.Arrow.***' g) ('mzip' ma mb)+-- = 'mzip' ('liftM' f ma) ('liftM' g mb)@+--+-- [Information Preservation]+--+-- @'liftM' ('Prelude.const' ()) ma = 'liftM' ('Prelude.const' ()) mb@+-- implies+-- @'munzip' ('mzip' ma mb) = (ma, mb)@+--+class Monad m => MonadZip m where+ {-# MINIMAL mzip | mzipWith #-}++ mzip :: m a -> m b -> m (a,b)+ mzip = mzipWith (,)++ mzipWith :: (a -> b -> c) -> m a -> m b -> m c+ mzipWith f ma mb = liftM (uncurry f) (mzip ma mb)++ munzip :: m (a,b) -> (m a, m b)+ munzip mab = (liftM fst mab, liftM 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++-- | @since 4.3.1.0+instance MonadZip [] where+ mzip = zip+ mzipWith = zipWith+ munzip = unzip++-- | @since 4.9.0.0+instance MonadZip NE.NonEmpty where+ mzip = NE.zip+ mzipWith = NE.zipWith+-- munzip = GHC.Internal.Data.Functor.unzip++-- | @since 4.8.0.0+instance MonadZip Identity where+ mzipWith = liftM2+ munzip (Identity (a, b)) = (Identity a, Identity b)++{-+-- | @since 4.15.0.0+instance MonadZip Solo where+ mzipWith = liftM2+ munzip (MkSolo (a, b)) = (MkSolo a, MkSolo b)++-- | @since 4.8.0.0+instance MonadZip Dual where+ -- Cannot use coerce, it's unsafe+ mzipWith = liftM2++-- | @since 4.8.0.0+instance MonadZip Sum where+ mzipWith = liftM2++-- | @since 4.8.0.0+instance MonadZip Product where+ mzipWith = liftM2++-- | @since 4.8.0.0+instance MonadZip Maybe where+ mzipWith = liftM2++-- | @since 4.8.0.0+instance MonadZip First where+ mzipWith = liftM2++-- | @since 4.8.0.0+instance MonadZip Last where+ mzipWith = liftM2++-- | @since 4.8.0.0+instance MonadZip f => MonadZip (Alt f) where+ mzipWith f (Alt ma) (Alt mb) = Alt (mzipWith f ma mb)++-- | @since 4.9.0.0+instance MonadZip Proxy where+ mzipWith _ _ _ = Proxy++-- Instances for GHC.Generics+-- | @since 4.9.0.0+instance MonadZip U1 where+ mzipWith _ _ _ = U1++-- | @since 4.9.0.0+instance MonadZip Par1 where+ mzipWith = liftM2++-- | @since 4.9.0.0+instance MonadZip f => MonadZip (Rec1 f) where+ mzipWith f (Rec1 fa) (Rec1 fb) = Rec1 (mzipWith f fa fb)++-- | @since 4.9.0.0+instance MonadZip f => MonadZip (M1 i c f) where+ mzipWith f (M1 fa) (M1 fb) = M1 (mzipWith f fa fb)++-- | @since 4.9.0.0+instance (MonadZip f, MonadZip g) => MonadZip (f :*: g) where+ mzipWith f (x1 :*: y1) (x2 :*: y2) = mzipWith f x1 x2 :*: mzipWith f y1 y2++-- instances for GHC.Internal.Data.Ord++-- | @since 4.12.0.0+instance MonadZip Down where+ mzipWith = liftM2+-}
lib/Data/Array.hs view
@@ -13,9 +13,23 @@ accum, ixmap, ) where+import Prelude() import Primitives(primPerformIO, primArrCopy, primArrEQ)+import Control.Error+import Control.Monad+import Data.Bool+import Data.Char+import Data.Enum+import Data.Eq+import Data.Function+import Data.Functor+import Data.Int import Data.Ix import Data.IOArray+import Data.List+import Data.Num+import Data.Ord+import System.IO import Text.Show data Array i a@@ -111,7 +125,7 @@ where i' = index (l,u) i badSafeIndex :: Int -> Int -> a-badSafeIndex i n = error $ "Error in array index; " ++ show i ++ " not in range [0.." ++ show n ++ ")"+badSafeIndex i n = error $ ("Error in array index; "::String) ++ show i ++ (" not in range [0.."::String) ++ show n ++ (")"::String) safeRangeSize :: Ix i => (i, i) -> Int safeRangeSize b =
+ lib/Data/Bifoldable.hs view
@@ -0,0 +1,1039 @@+{-# LANGUAGE Safe #-}+{-# LANGUAGE ScopedTypeVariables #-}++-----------------------------------------------------------------------------+-- |+-- Module : Data.Bifoldable+-- Copyright : (C) 2011-2016 Edward Kmett+-- License : BSD-style (see the file LICENSE)+--+-- Maintainer : libraries@haskell.org+-- Stability : provisional+-- Portability : portable+--+-- @since 4.10.0.0+----------------------------------------------------------------------------+module Data.Bifoldable+ ( Bifoldable(..)+ , bifoldr'+ , bifoldr1+ , bifoldrM+ , bifoldl'+ , bifoldl1+ , bifoldlM+ , bitraverse_+ , bifor_+ , bimapM_+ , biforM_+ , bimsum+ , bisequenceA_+ , bisequence_+ , biasum+ , biList+ , binull+ , bilength+ , bielem+ , bimaximum+ , biminimum+ , bisum+ , biproduct+ , biconcat+ , biconcatMap+ , biand+ , bior+ , biany+ , biall+ , bimaximumBy+ , biminimumBy+ , binotElem+ , bifind+ ) where+import Control.Applicative+import Data.Foldable.Internal+import Data.Functor.Const+import Data.Maybe(fromMaybe)+import Data.Monoid+import Data.Monoid.Internal hiding (Max(..), Min(..))++-- $setup+-- >>> import Prelude+-- >>> import Data.Char+-- >>> import GHC.Internal.Data.Monoid (Product (..), Sum (..))+-- >>> data BiList a b = BiList [a] [b]+-- >>> instance Bifoldable BiList where bifoldr f g z (BiList as bs) = foldr f (foldr g z bs) as++-- | 'Bifoldable' identifies foldable structures with two different varieties+-- of elements (as opposed to 'Foldable', which has one variety of element).+-- Common examples are 'Either' and @(,)@:+--+-- > instance Bifoldable Either where+-- > bifoldMap f _ (Left a) = f a+-- > bifoldMap _ g (Right b) = g b+-- >+-- > instance Bifoldable (,) where+-- > bifoldr f g z (a, b) = f a (g b z)+--+-- Some examples below also use the following BiList to showcase empty+-- Bifoldable behaviors when relevant ('Either' and '(,)' containing always exactly+-- resp. 1 and 2 elements):+--+-- > data BiList a b = BiList [a] [b]+-- >+-- > instance Bifoldable BiList where+-- > bifoldr f g z (BiList as bs) = foldr f (foldr g z bs) as+--+-- A minimal 'Bifoldable' definition consists of either 'bifoldMap' or+-- 'bifoldr'. When defining more than this minimal set, one should ensure+-- that the following identities hold:+--+-- @+-- 'bifold' ≡ 'bifoldMap' 'id' 'id'+-- 'bifoldMap' f g ≡ 'bifoldr' ('mappend' . f) ('mappend' . g) 'mempty'+-- 'bifoldr' f g z t ≡ 'appEndo' ('bifoldMap' (Endo . f) (Endo . g) t) z+-- @+--+-- If the type is also an instance of 'Foldable', then+-- it must satisfy (up to laziness):+--+-- @+-- 'bifoldl' 'const' ≡ 'foldl'+-- 'bifoldr' ('flip' 'const') ≡ 'foldr'+-- 'bifoldMap' ('const' 'mempty') ≡ 'foldMap'+-- @+--+-- If the type is also a 'Data.Bifunctor.Bifunctor' instance, it should satisfy:+--+-- @+-- 'bifoldMap' f g ≡ 'bifold' . 'Data.Bifunctor.bimap' f g+-- @+--+-- which implies that+--+-- @+-- 'bifoldMap' f g . 'Data.Bifunctor.bimap' h i ≡ 'bifoldMap' (f . h) (g . i)+-- @+--+-- @since 4.10.0.0+class Bifoldable p where+ {-# MINIMAL bifoldr | bifoldMap #-}++ -- | Combines the elements of a structure using a monoid.+ --+ -- @'bifold' ≡ 'bifoldMap' 'id' 'id'@+ --+ -- ==== __Examples__+ --+ -- Basic usage:+ --+ -- >>> bifold (Right [1, 2, 3])+ -- [1,2,3]+ --+ -- >>> bifold (Left [5, 6])+ -- [5,6]+ --+ -- >>> bifold ([1, 2, 3], [4, 5])+ -- [1,2,3,4,5]+ --+ -- >>> bifold (Product 6, Product 7)+ -- Product {getProduct = 42}+ --+ -- >>> bifold (Sum 6, Sum 7)+ -- Sum {getSum = 13}+ --+ -- @since 4.10.0.0+ bifold :: Monoid m => p m m -> m+ bifold = bifoldMap id id++ -- | Combines the elements of a structure, given ways of mapping them to a+ -- common monoid.+ --+ -- @'bifoldMap' f g ≡ 'bifoldr' ('mappend' . f) ('mappend' . g) 'mempty'@+ --+ -- ==== __Examples__+ --+ -- Basic usage:+ --+ -- >>> bifoldMap (take 3) (fmap digitToInt) ([1..], "89")+ -- [1,2,3,8,9]+ --+ -- >>> bifoldMap (take 3) (fmap digitToInt) (Left [1..])+ -- [1,2,3]+ --+ -- >>> bifoldMap (take 3) (fmap digitToInt) (Right "89")+ -- [8,9]+ --+ -- @since 4.10.0.0+ bifoldMap :: Monoid m => (a -> m) -> (b -> m) -> p a b -> m+ bifoldMap f g = bifoldr (mappend . f) (mappend . g) mempty++ -- | Combines the elements of a structure in a right associative manner.+ -- Given a hypothetical function @toEitherList :: p a b -> [Either a b]@+ -- yielding a list of all elements of a structure in order, the following+ -- would hold:+ --+ -- @'bifoldr' f g z ≡ 'foldr' ('either' f g) z . toEitherList@+ --+ -- ==== __Examples__+ --+ -- Basic usage:+ --+ -- @+ -- > bifoldr (+) (*) 3 (5, 7)+ -- 26 -- 5 + (7 * 3)+ --+ -- > bifoldr (+) (*) 3 (7, 5)+ -- 22 -- 7 + (5 * 3)+ --+ -- > bifoldr (+) (*) 3 (Right 5)+ -- 15 -- 5 * 3+ --+ -- > bifoldr (+) (*) 3 (Left 5)+ -- 8 -- 5 + 3+ -- @+ --+ -- @since 4.10.0.0+ bifoldr :: (a -> c -> c) -> (b -> c -> c) -> c -> p a b -> c+ bifoldr f g z t = appEndo (bifoldMap (Endo . f) (Endo . g) t) z++ -- | Combines the elements of a structure in a left associative manner. Given+ -- a hypothetical function @toEitherList :: p a b -> [Either a b]@ yielding a+ -- list of all elements of a structure in order, the following would hold:+ --+ -- @'bifoldl' f g z+ -- ≡ 'foldl' (\acc -> 'either' (f acc) (g acc)) z . toEitherList@+ --+ -- Note that if you want an efficient left-fold, you probably want to use+ -- 'bifoldl'' instead of 'bifoldl'. The reason is that the latter does not+ -- force the "inner" results, resulting in a thunk chain which then must be+ -- evaluated from the outside-in.+ --+ -- ==== __Examples__+ --+ -- Basic usage:+ --+ -- @+ -- > bifoldl (+) (*) 3 (5, 7)+ -- 56 -- (5 + 3) * 7+ --+ -- > bifoldl (+) (*) 3 (7, 5)+ -- 50 -- (7 + 3) * 5+ --+ -- > bifoldl (+) (*) 3 (Right 5)+ -- 15 -- 5 * 3+ --+ -- > bifoldl (+) (*) 3 (Left 5)+ -- 8 -- 5 + 3+ -- @+ --+ -- @since 4.10.0.0+ bifoldl :: (c -> a -> c) -> (c -> b -> c) -> c -> p a b -> c+ bifoldl f g z t = appEndo (getDual (bifoldMap (Dual . Endo . flip f)+ (Dual . Endo . flip g) t)) z++-- | Class laws for tuples hold only up to laziness. The+-- Bifoldable methods are lazier than their Foldable counterparts.+-- For example the law @'bifoldr' ('flip' 'const') ≡ 'foldr'@ does+-- not hold for tuples if laziness is exploited:+--+-- >>> bifoldr (flip const) (:) [] (undefined :: (Int, Word)) `seq` ()+-- ()+-- >>> foldr (:) [] (undefined :: (Int, Word)) `seq` ()+-- *** Exception: Prelude.undefined+--+-- @since 4.10.0.0+instance Bifoldable (,) where+ bifoldMap f g ~(a, b) = f a `mappend` g b++-- | @since 4.10.0.0+instance Bifoldable Const where+ bifoldMap f _ (Const a) = f a++{-+-- | @since 4.10.0.0+instance Bifoldable (K1 i) where+ bifoldMap f _ (K1 c) = f c+-}++-- | @since 4.10.0.0+instance Bifoldable ((,,) x) where+ bifoldMap f g ~(_,a,b) = f a `mappend` g b++-- | @since 4.10.0.0+instance Bifoldable ((,,,) x y) where+ bifoldMap f g ~(_,_,a,b) = f a `mappend` g b++-- | @since 4.10.0.0+instance Bifoldable ((,,,,) x y z) where+ bifoldMap f g ~(_,_,_,a,b) = f a `mappend` g b++-- | @since 4.10.0.0+instance Bifoldable ((,,,,,) x y z w) where+ bifoldMap f g ~(_,_,_,_,a,b) = f a `mappend` g b++-- | @since 4.10.0.0+instance Bifoldable ((,,,,,,) x y z w v) where+ bifoldMap f g ~(_,_,_,_,_,a,b) = f a `mappend` g b++-- | @since 4.10.0.0+instance Bifoldable Either where+ bifoldMap f _ (Left a) = f a+ bifoldMap _ g (Right b) = g b++-- | As 'bifoldr', but strict in the result of the reduction functions at each+-- step.+--+-- @since 4.10.0.0+bifoldr' :: Bifoldable t => (a -> c -> c) -> (b -> c -> c) -> c -> t a b -> c+bifoldr' f g z0 xs = bifoldl f' g' id xs z0 where+ f' k x z = k $! f x z+ g' k x z = k $! g x z++-- | A variant of 'bifoldr' that has no base case,+-- and thus may only be applied to non-empty structures.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> bifoldr1 (+) (5, 7)+-- 12+--+-- >>> bifoldr1 (+) (Right 7)+-- 7+--+-- >>> bifoldr1 (+) (Left 5)+-- 5+--+-- @+-- > bifoldr1 (+) (BiList [1, 2] [3, 4])+-- 10 -- 1 + (2 + (3 + 4))+-- @+--+-- >>> bifoldr1 (+) (BiList [1, 2] [])+-- 3+--+-- On empty structures, this function throws an exception:+--+-- >>> bifoldr1 (+) (BiList [] [])+-- *** Exception: bifoldr1: empty structure+-- ...+--+-- @since 4.10.0.0+bifoldr1 :: Bifoldable t => (a -> a -> a) -> t a a -> a+bifoldr1 f xs = fromMaybe (error "bifoldr1: empty structure")+ (bifoldr mbf mbf Nothing xs)+ where+ mbf x m = Just (case m of+ Nothing -> x+ Just y -> f x y)++-- | Right associative monadic bifold over a structure.+--+-- @since 4.10.0.0+bifoldrM :: (Bifoldable t, Monad m)+ => (a -> c -> m c) -> (b -> c -> m c) -> c -> t a b -> m c+bifoldrM f g z0 xs = bifoldl f' g' return xs z0 where+ f' k x z = f x z >>= k+ g' k x z = g x z >>= k++-- | As 'bifoldl', but strict in the result of the reduction functions at each+-- step.+--+-- This ensures that each step of the bifold is forced to weak head normal form+-- before being applied, avoiding the collection of thunks that would otherwise+-- occur. This is often what you want to strictly reduce a finite structure to+-- a single, monolithic result (e.g., 'bilength').+--+-- @since 4.10.0.0+bifoldl':: Bifoldable t => (a -> b -> a) -> (a -> c -> a) -> a -> t b c -> a+bifoldl' f g z0 xs = bifoldr f' g' id xs z0 where+ f' x k z = k $! f z x+ g' x k z = k $! g z x++-- | A variant of 'bifoldl' that has no base case,+-- and thus may only be applied to non-empty structures.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> bifoldl1 (+) (5, 7)+-- 12+--+-- >>> bifoldl1 (+) (Right 7)+-- 7+--+-- >>> bifoldl1 (+) (Left 5)+-- 5+--+-- @+-- > bifoldl1 (+) (BiList [1, 2] [3, 4])+-- 10 -- ((1 + 2) + 3) + 4+-- @+--+-- >>> bifoldl1 (+) (BiList [1, 2] [])+-- 3+--+-- On empty structures, this function throws an exception:+--+-- >>> bifoldl1 (+) (BiList [] [])+-- *** Exception: bifoldl1: empty structure+-- ...+--+-- @since 4.10.0.0+bifoldl1 :: Bifoldable t => (a -> a -> a) -> t a a -> a+bifoldl1 f xs = fromMaybe (error "bifoldl1: empty structure")+ (bifoldl mbf mbf Nothing xs)+ where+ mbf m y = Just (case m of+ Nothing -> y+ Just x -> f x y)++-- | Left associative monadic bifold over a structure.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> bifoldlM (\a b -> print b >> pure a) (\a c -> print (show c) >> pure a) 42 ("Hello", True)+-- "Hello"+-- "True"+-- 42+--+-- >>> bifoldlM (\a b -> print b >> pure a) (\a c -> print (show c) >> pure a) 42 (Right True)+-- "True"+-- 42+--+-- >>> bifoldlM (\a b -> print b >> pure a) (\a c -> print (show c) >> pure a) 42 (Left "Hello")+-- "Hello"+-- 42+--+-- @since 4.10.0.0+bifoldlM :: (Bifoldable t, Monad m)+ => (a -> b -> m a) -> (a -> c -> m a) -> a -> t b c -> m a+bifoldlM f g z0 xs = bifoldr f' g' return xs z0 where+ f' x k z = f z x >>= k+ g' x k z = g z x >>= k++-- | Map each element of a structure using one of two actions, evaluate these+-- actions from left to right, and ignore the results. For a version that+-- doesn't ignore the results, see 'Data.Bitraversable.bitraverse'.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> bitraverse_ print (print . show) ("Hello", True)+-- "Hello"+-- "True"+--+-- >>> bitraverse_ print (print . show) (Right True)+-- "True"+--+-- >>> bitraverse_ print (print . show) (Left "Hello")+-- "Hello"+--+-- @since 4.10.0.0+bitraverse_ :: (Bifoldable t, Applicative f)+ => (a -> f c) -> (b -> f d) -> t a b -> f ()+bitraverse_ f g = bifoldr ((*>) . f) ((*>) . g) (pure ())++-- | As 'bitraverse_', but with the structure as the primary argument. For a+-- version that doesn't ignore the results, see 'Data.Bitraversable.bifor'.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> bifor_ ("Hello", True) print (print . show)+-- "Hello"+-- "True"+--+-- >>> bifor_ (Right True) print (print . show)+-- "True"+--+-- >>> bifor_ (Left "Hello") print (print . show)+-- "Hello"+--+-- @since 4.10.0.0+bifor_ :: (Bifoldable t, Applicative f)+ => t a b -> (a -> f c) -> (b -> f d) -> f ()+bifor_ t f g = bitraverse_ f g t++-- | Alias for 'bitraverse_'.+--+-- @since 4.10.0.0+bimapM_ :: (Bifoldable t, Applicative f)+ => (a -> f c) -> (b -> f d) -> t a b -> f ()+bimapM_ = bitraverse_++-- | Alias for 'bifor_'.+--+-- @since 4.10.0.0+biforM_ :: (Bifoldable t, Applicative f)+ => t a b -> (a -> f c) -> (b -> f d) -> f ()+biforM_ = bifor_++-- | Alias for 'bisequence_'.+--+-- @since 4.10.0.0+bisequenceA_ :: (Bifoldable t, Applicative f) => t (f a) (f b) -> f ()+bisequenceA_ = bisequence_++-- | Evaluate each action in the structure from left to right, and ignore the+-- results. For a version that doesn't ignore the results, see+-- 'Data.Bitraversable.bisequence'.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> bisequence_ (print "Hello", print "World")+-- "Hello"+-- "World"+--+-- >>> bisequence_ (Left (print "Hello"))+-- "Hello"+--+-- >>> bisequence_ (Right (print "World"))+-- "World"+--+-- @since 4.10.0.0+bisequence_ :: (Bifoldable t, Applicative f) => t (f a) (f b) -> f ()+bisequence_ = bifoldr (*>) (*>) (pure ())++-- | The sum of a collection of actions, generalizing 'biconcat'.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> biasum (Nothing, Nothing)+-- Nothing+--+-- >>> biasum (Nothing, Just 42)+-- Just 42+--+-- >>> biasum (Just 18, Nothing)+-- Just 18+--+-- >>> biasum (Just 18, Just 42)+-- Just 18+--+-- @since 4.10.0.0+biasum :: (Bifoldable t, Alternative f) => t (f a) (f a) -> f a+biasum = bifoldr (<|>) (<|>) empty++-- | Alias for 'biasum'.+--+-- @since 4.10.0.0+bimsum :: (Bifoldable t, Alternative f) => t (f a) (f a) -> f a+bimsum = biasum++-- | Collects the list of elements of a structure, from left to right.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> biList (18, 42)+-- [18,42]+--+-- >>> biList (Left 18)+-- [18]+--+-- @since 4.10.0.0+biList :: Bifoldable t => t a a -> [a]+biList = bifoldr (:) (:) []++-- | Test whether the structure is empty.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> binull (18, 42)+-- False+--+-- >>> binull (Right 42)+-- False+--+-- >>> binull (BiList [] [])+-- True+--+-- @since 4.10.0.0+binull :: Bifoldable t => t a b -> Bool+binull = bifoldr (\_ _ -> False) (\_ _ -> False) True++-- | Returns the size/length of a finite structure as an 'Int'.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> bilength (True, 42)+-- 2+--+-- >>> bilength (Right 42)+-- 1+--+-- >>> bilength (BiList [1,2,3] [4,5])+-- 5+--+-- >>> bilength (BiList [] [])+-- 0+--+-- On infinite structures, this function hangs:+--+-- @+-- > bilength (BiList [1..] [])+-- * Hangs forever *+-- @+--+-- @since 4.10.0.0+bilength :: Bifoldable t => t a b -> Int+bilength = bifoldl' (\c _ -> c+1) (\c _ -> c+1) 0++-- | Does the element occur in the structure?+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> bielem 42 (17, 42)+-- True+--+-- >>> bielem 42 (17, 43)+-- False+--+-- >>> bielem 42 (Left 42)+-- True+--+-- >>> bielem 42 (Right 13)+-- False+--+-- >>> bielem 42 (BiList [1..5] [1..100])+-- True+--+-- >>> bielem 42 (BiList [1..5] [1..41])+-- False+--+-- @since 4.10.0.0+bielem :: (Bifoldable t, Eq a) => a -> t a a -> Bool+bielem x = biany (== x) (== x)++-- | Reduces a structure of lists to the concatenation of those lists.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> biconcat ([1, 2, 3], [4, 5])+-- [1,2,3,4,5]+--+-- >>> biconcat (Left [1, 2, 3])+-- [1,2,3]+--+-- >>> biconcat (BiList [[1, 2, 3, 4, 5], [6, 7, 8]] [[9]])+-- [1,2,3,4,5,6,7,8,9]+--+-- @since 4.10.0.0+biconcat :: Bifoldable t => t [a] [a] -> [a]+biconcat = bifold++-- | The largest element of a non-empty structure.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> bimaximum (42, 17)+-- 42+--+-- >>> bimaximum (Right 42)+-- 42+--+-- >>> bimaximum (BiList [13, 29, 4] [18, 1, 7])+-- 29+--+-- >>> bimaximum (BiList [13, 29, 4] [])+-- 29+--+-- On empty structures, this function throws an exception:+--+-- >>> bimaximum (BiList [] [])+-- *** Exception: bimaximum: empty structure+-- ...+--+-- @since 4.10.0.0+bimaximum :: forall t a. (Bifoldable t, Ord a) => t a a -> a+bimaximum = fromMaybe (error "bimaximum: empty structure") .+ getMax . bifoldMap (Max . Just) (Max . Just)++-- | The least element of a non-empty structure.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> biminimum (42, 17)+-- 17+--+-- >>> biminimum (Right 42)+-- 42+--+-- >>> biminimum (BiList [13, 29, 4] [18, 1, 7])+-- 1+--+-- >>> biminimum (BiList [13, 29, 4] [])+-- 4+--+-- On empty structures, this function throws an exception:+--+-- >>> biminimum (BiList [] [])+-- *** Exception: biminimum: empty structure+-- ...+--+-- @since 4.10.0.0+biminimum :: forall t a. (Bifoldable t, Ord a) => t a a -> a+biminimum = fromMaybe (error "biminimum: empty structure") .+ getMin . bifoldMap (Min . Just) (Min . Just)++-- | The 'bisum' function computes the sum of the numbers of a structure.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> bisum (42, 17)+-- 59+--+-- >>> bisum (Right 42)+-- 42+--+-- >>> bisum (BiList [13, 29, 4] [18, 1, 7])+-- 72+--+-- >>> bisum (BiList [13, 29, 4] [])+-- 46+--+-- >>> bisum (BiList [] [])+-- 0+--+-- @since 4.10.0.0+bisum :: (Bifoldable t, Num a) => t a a -> a+bisum = getSum . bifoldMap Sum Sum++-- | The 'biproduct' function computes the product of the numbers of a+-- structure.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> biproduct (42, 17)+-- 714+--+-- >>> biproduct (Right 42)+-- 42+--+-- >>> biproduct (BiList [13, 29, 4] [18, 1, 7])+-- 190008+--+-- >>> biproduct (BiList [13, 29, 4] [])+-- 1508+--+-- >>> biproduct (BiList [] [])+-- 1+--+-- @since 4.10.0.0+biproduct :: (Bifoldable t, Num a) => t a a -> a+biproduct = getProduct . bifoldMap Product Product++-- | Given a means of mapping the elements of a structure to lists, computes the+-- concatenation of all such lists in order.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> biconcatMap (take 3) (fmap digitToInt) ([1..], "89")+-- [1,2,3,8,9]+--+-- >>> biconcatMap (take 3) (fmap digitToInt) (Left [1..])+-- [1,2,3]+--+-- >>> biconcatMap (take 3) (fmap digitToInt) (Right "89")+-- [8,9]+--+-- @since 4.10.0.0+biconcatMap :: Bifoldable t => (a -> [c]) -> (b -> [c]) -> t a b -> [c]+biconcatMap = bifoldMap++-- | 'biand' returns the conjunction of a container of Bools. For the+-- result to be 'True', the container must be finite; 'False', however,+-- results from a 'False' value finitely far from the left end.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> biand (True, False)+-- False+--+-- >>> biand (True, True)+-- True+--+-- >>> biand (Left True)+-- True+--+-- Empty structures yield 'True':+--+-- >>> biand (BiList [] [])+-- True+--+-- A 'False' value finitely far from the left end yields 'False' (short circuit):+--+-- >>> biand (BiList [True, True, False, True] (repeat True))+-- False+--+-- A 'False' value infinitely far from the left end hangs:+--+-- @+-- > biand (BiList (repeat True) [False])+-- * Hangs forever *+-- @+--+-- An infinitely 'True' value hangs:+--+-- @+-- > biand (BiList (repeat True) [])+-- * Hangs forever *+-- @+--+-- @since 4.10.0.0+biand :: Bifoldable t => t Bool Bool -> Bool+biand = getAll . bifoldMap All All++-- | 'bior' returns the disjunction of a container of Bools. For the+-- result to be 'False', the container must be finite; 'True', however,+-- results from a 'True' value finitely far from the left end.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> bior (True, False)+-- True+--+-- >>> bior (False, False)+-- False+--+-- >>> bior (Left True)+-- True+--+-- Empty structures yield 'False':+--+-- >>> bior (BiList [] [])+-- False+--+-- A 'True' value finitely far from the left end yields 'True' (short circuit):+--+-- >>> bior (BiList [False, False, True, False] (repeat False))+-- True+--+-- A 'True' value infinitely far from the left end hangs:+--+-- @+-- > bior (BiList (repeat False) [True])+-- * Hangs forever *+-- @+--+-- An infinitely 'False' value hangs:+--+-- @+-- > bior (BiList (repeat False) [])+-- * Hangs forever *+-- @+--+-- @since 4.10.0.0+bior :: Bifoldable t => t Bool Bool -> Bool+bior = getAny . bifoldMap Any Any++-- | Determines whether any element of the structure satisfies its appropriate+-- predicate argument. Empty structures yield 'False'.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> biany even isDigit (27, 't')+-- False+--+-- >>> biany even isDigit (27, '8')+-- True+--+-- >>> biany even isDigit (26, 't')+-- True+--+-- >>> biany even isDigit (Left 27)+-- False+--+-- >>> biany even isDigit (Left 26)+-- True+--+-- >>> biany even isDigit (BiList [27, 53] ['t', '8'])+-- True+--+-- Empty structures yield 'False':+--+-- >>> biany even isDigit (BiList [] [])+-- False+--+-- @since 4.10.0.0+biany :: Bifoldable t => (a -> Bool) -> (b -> Bool) -> t a b -> Bool+biany p q = getAny . bifoldMap (Any . p) (Any . q)++-- | Determines whether all elements of the structure satisfy their appropriate+-- predicate argument. Empty structures yield 'True'.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> biall even isDigit (27, 't')+-- False+--+-- >>> biall even isDigit (26, '8')+-- True+--+-- >>> biall even isDigit (Left 27)+-- False+--+-- >>> biall even isDigit (Left 26)+-- True+--+-- >>> biall even isDigit (BiList [26, 52] ['3', '8'])+-- True+--+-- Empty structures yield 'True':+--+-- >>> biall even isDigit (BiList [] [])+-- True+--+-- @since 4.10.0.0+biall :: Bifoldable t => (a -> Bool) -> (b -> Bool) -> t a b -> Bool+biall p q = getAll . bifoldMap (All . p) (All . q)++-- | The largest element of a non-empty structure with respect to the+-- given comparison function.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> bimaximumBy compare (42, 17)+-- 42+--+-- >>> bimaximumBy compare (Left 17)+-- 17+--+-- >>> bimaximumBy compare (BiList [42, 17, 23] [-5, 18])+-- 42+--+-- On empty structures, this function throws an exception:+--+-- >>> bimaximumBy compare (BiList [] [])+-- *** Exception: bifoldr1: empty structure+-- ...+--+-- @since 4.10.0.0+bimaximumBy :: Bifoldable t => (a -> a -> Ordering) -> t a a -> a+bimaximumBy cmp = bifoldr1 max'+ where max' x y = case cmp x y of+ GT -> x+ _ -> y++-- | The least element of a non-empty structure with respect to the+-- given comparison function.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> biminimumBy compare (42, 17)+-- 17+--+-- >>> biminimumBy compare (Left 17)+-- 17+--+-- >>> biminimumBy compare (BiList [42, 17, 23] [-5, 18])+-- -5+--+-- On empty structures, this function throws an exception:+--+-- >>> biminimumBy compare (BiList [] [])+-- *** Exception: bifoldr1: empty structure+-- ...+--+-- @since 4.10.0.0+biminimumBy :: Bifoldable t => (a -> a -> Ordering) -> t a a -> a+biminimumBy cmp = bifoldr1 min'+ where min' x y = case cmp x y of+ GT -> y+ _ -> x++-- | 'binotElem' is the negation of 'bielem'.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> binotElem 42 (17, 42)+-- False+--+-- >>> binotElem 42 (17, 43)+-- True+--+-- >>> binotElem 42 (Left 42)+-- False+--+-- >>> binotElem 42 (Right 13)+-- True+--+-- >>> binotElem 42 (BiList [1..5] [1..100])+-- False+--+-- >>> binotElem 42 (BiList [1..5] [1..41])+-- True+--+-- @since 4.10.0.0+binotElem :: (Bifoldable t, Eq a) => a -> t a a-> Bool+binotElem x = not . bielem x++-- | The 'bifind' function takes a predicate and a structure and returns+-- the leftmost element of the structure matching the predicate, or+-- 'Nothing' if there is no such element.+--+-- ==== __Examples__+--+-- Basic usage:+--+-- >>> bifind even (27, 53)+-- Nothing+--+-- >>> bifind even (27, 52)+-- Just 52+--+-- >>> bifind even (26, 52)+-- Just 26+--+-- Empty structures always yield 'Nothing':+--+-- >>> bifind even (BiList [] [])+-- Nothing+--+-- @since 4.10.0.0+bifind :: Bifoldable t => (a -> Bool) -> t a a -> Maybe a+bifind p = getFirst . bifoldMap finder finder+ where finder x = First (if p x then Just x else Nothing)
+ lib/Data/Bifunctor.hs view
@@ -0,0 +1,176 @@+{-# LANGUAGE QuantifiedConstraints #-}+{-# LANGUAGE Safe #-}++-----------------------------------------------------------------------------+-- |+-- Module : Data.Bifunctor+-- Copyright : (C) 2008-2014 Edward Kmett,+-- License : BSD-style (see the file LICENSE)+--+-- Maintainer : libraries@haskell.org+-- Stability : provisional+-- Portability : portable+--+-- @since 4.8.0.0+----------------------------------------------------------------------------+module Data.Bifunctor+ ( Bifunctor(..)+ ) where+import Control.Applicative ( Const(..) )++-- $setup+-- >>> import Prelude+-- >>> import Data.Char (toUpper)++-- | A bifunctor is a type constructor that takes+-- two type arguments and is a functor in /both/ arguments. That+-- is, unlike with 'Functor', a type constructor such as 'Either'+-- does not need to be partially applied for a 'Bifunctor'+-- instance, and the methods in this class permit mapping+-- functions over the 'Left' value or the 'Right' value,+-- or both at the same time.+--+-- Formally, the class 'Bifunctor' represents a bifunctor+-- from @Hask@ -> @Hask@.+--+-- Intuitively it is a bifunctor where both the first and second+-- arguments are covariant.+--+-- The class definition of a 'Bifunctor' @p@ uses the+-- [QuantifiedConstraints](https://downloads.haskell.org/ghc/latest/docs/users_guide/exts/quantified_constraints.html)+-- language extension to quantify over the first type+-- argument @a@ in its context. The context requires that @p a@+-- must be a 'Functor' for all @a@. In other words a partially+-- applied 'Bifunctor' must be a 'Functor'. This makes 'Functor' a+-- superclass of 'Bifunctor' such that a function with a+-- 'Bifunctor' constraint may use 'fmap' in its implementation.+-- 'Functor' has been a quantified superclass of+-- 'Bifunctor' since base-4.18.0.0.+--+-- You can define a 'Bifunctor' by either defining 'bimap' or by+-- defining both 'first' and 'second'. The 'second' method must+-- agree with 'fmap':+--+-- @'second' ≡ 'fmap'@+--+-- From this it follows that:+--+-- @'second' 'id' ≡ 'id'@+--+-- If you supply 'bimap', you should ensure that:+--+-- @'bimap' 'id' 'id' ≡ 'id'@+--+-- If you supply 'first' and 'second', ensure:+--+-- @+-- 'first' 'id' ≡ 'id'+-- 'second' 'id' ≡ 'id'+-- @+--+-- If you supply both, you should also ensure:+--+-- @'bimap' f g ≡ 'first' f '.' 'second' g@+--+-- These ensure by parametricity:+--+-- @+-- 'bimap' (f '.' g) (h '.' i) ≡ 'bimap' f h '.' 'bimap' g i+-- 'first' (f '.' g) ≡ 'first' f '.' 'first' g+-- 'second' (f '.' g) ≡ 'second' f '.' 'second' g+-- @+--+-- @since 4.8.0.0+class (forall a. Functor (p a)) => Bifunctor p where+ {-# MINIMAL bimap | first, second #-}++ -- | Map over both arguments at the same time.+ --+ -- @'bimap' f g ≡ 'first' f '.' 'second' g@+ --+ -- ==== __Examples__+ -- >>> bimap toUpper (+1) ('j', 3)+ -- ('J',4)+ --+ -- >>> bimap toUpper (+1) (Left 'j')+ -- Left 'J'+ --+ -- >>> bimap toUpper (+1) (Right 3)+ -- Right 4+ bimap :: (a -> b) -> (c -> d) -> p a c -> p b d+ bimap f g = first f . second g+++ -- | Map covariantly over the first argument.+ --+ -- @'first' f ≡ 'bimap' f 'id'@+ --+ -- ==== __Examples__+ -- >>> first toUpper ('j', 3)+ -- ('J',3)+ --+ -- >>> first toUpper (Left 'j')+ -- Left 'J'+ first :: (a -> b) -> p a c -> p b c+ first f = bimap f id+++ -- | Map covariantly over the second argument.+ --+ -- @'second' ≡ 'bimap' 'id'@+ --+ -- ==== __Examples__+ -- >>> second (+1) ('j', 3)+ -- ('j',4)+ --+ -- >>> second (+1) (Right 3)+ -- Right 4+ second :: (b -> c) -> p a b -> p a c+ second = bimap id+++-- | Class laws for tuples hold only up to laziness. Both+-- 'first' 'id' and 'second' 'id' are lazier than 'id' (and 'fmap' 'id'):+--+-- >>> first id (undefined :: (Int, Word)) `seq` ()+-- ()+-- >>> second id (undefined :: (Int, Word)) `seq` ()+-- ()+-- >>> id (undefined :: (Int, Word)) `seq` ()+-- *** Exception: Prelude.undefined+--+-- @since 4.8.0.0++{-+instance Bifunctor (,) where+ bimap f g ~(a, b) = (f a, g b)++-- | @since 4.8.0.0+instance Bifunctor ((,,) x1) where+ bimap f g ~(x1, a, b) = (x1, f a, g b)++-- | @since 4.8.0.0+instance Bifunctor ((,,,) x1 x2) where+ bimap f g ~(x1, x2, a, b) = (x1, x2, f a, g b)++-- | @since 4.8.0.0+instance Bifunctor ((,,,,) x1 x2 x3) where+ bimap f g ~(x1, x2, x3, a, b) = (x1, x2, x3, f a, g b)++-- | @since 4.8.0.0+instance Bifunctor ((,,,,,) x1 x2 x3 x4) where+ bimap f g ~(x1, x2, x3, x4, a, b) = (x1, x2, x3, x4, f a, g b)++-- | @since 4.8.0.0+instance Bifunctor ((,,,,,,) x1 x2 x3 x4 x5) where+ bimap f g ~(x1, x2, x3, x4, x5, a, b) = (x1, x2, x3, x4, x5, f a, g b)+-}++-- | @since 4.8.0.0+instance Bifunctor Either where+ bimap f _ (Left a) = Left (f a)+ bimap _ g (Right b) = Right (g b)++-- | @since 4.8.0.0+instance Bifunctor Const where+ bimap f _ (Const a) = Const (f a)
+ lib/Data/Bitraversable.hs view
@@ -0,0 +1,105 @@+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE ScopedTypeVariables #-}++-----------------------------------------------------------------------------+-- |+-- Module : Data.Bitraversable+-- Copyright : (C) 2011-2016 Edward Kmett+-- License : BSD-style (see the file LICENSE)+--+-- Maintainer : libraries@haskell.org+-- Stability : provisional+-- Portability : portable+--+-- @since 4.10.0.0+----------------------------------------------------------------------------+module Data.Bitraversable+ ( Bitraversable(..)+ , bisequenceA+ , bisequence+ , bimapM+ , bifor+ , biforM+ , bimapAccumL+ , bimapAccumR+-- , bimapDefault+-- , bifoldMapDefault+ ) where++import Control.Applicative+import Data.Bifunctor+import Data.Bifoldable+-- Data.Coerce+import Data.Functor.Identity(Identity(..))+import Data.Foldable.Internal(StateL(..), runStateL, StateR(..), runStateR)++class (Bifunctor t, Bifoldable t) => Bitraversable t where+ bitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> t a b -> f (t c d)++bisequenceA :: (Bitraversable t, Applicative f) => t (f a) (f b) -> f (t a b)+bisequenceA = bisequence++bimapM :: (Bitraversable t, Applicative f)+ => (a -> f c) -> (b -> f d) -> t a b -> f (t c d)+bimapM = bitraverse++bisequence :: (Bitraversable t, Applicative f) => t (f a) (f b) -> f (t a b)+bisequence = bitraverse id id++{-+instance Bitraversable (,) where+ bitraverse f g ~(a, b) = liftA2 (,) (f a) (g b)++instance Bitraversable ((,,) x) where+ bitraverse f g ~(x, a, b) = liftA2 ((,,) x) (f a) (g b)++instance Bitraversable ((,,,) x y) where+ bitraverse f g ~(x, y, a, b) = liftA2 ((,,,) x y) (f a) (g b)++instance Bitraversable ((,,,,) x y z) where+ bitraverse f g ~(x, y, z, a, b) = liftA2 ((,,,,) x y z) (f a) (g b)++instance Bitraversable ((,,,,,) x y z w) where+ bitraverse f g ~(x, y, z, w, a, b) = liftA2 ((,,,,,) x y z w) (f a) (g b)++instance Bitraversable ((,,,,,,) x y z w v) where+ bitraverse f g ~(x, y, z, w, v, a, b) =+ liftA2 ((,,,,,,) x y z w v) (f a) (g b)+-}++instance Bitraversable Either where+ bitraverse f _ (Left a) = Left <$> f a+ bitraverse _ g (Right b) = Right <$> g b++instance Bitraversable Const where+ bitraverse f _ (Const a) = Const <$> f a++bifor :: (Bitraversable t, Applicative f)+ => t a b -> (a -> f c) -> (b -> f d) -> f (t c d)+bifor t f g = bitraverse f g t++biforM :: (Bitraversable t, Applicative f)+ => t a b -> (a -> f c) -> (b -> f d) -> f (t c d)+biforM = bifor++bimapAccumL :: Bitraversable t => (a -> b -> (a, c)) -> (a -> d -> (a, e))+ -> a -> t b d -> (a, t c e)+bimapAccumL f g s t+ = runStateL (bitraverse (StateL . flip f) (StateL . flip g) t) s++bimapAccumR :: Bitraversable t => (a -> b -> (a, c)) -> (a -> d -> (a, e))+ -> a -> t b d -> (a, t c e)+bimapAccumR f g s t+ = runStateR (bitraverse (StateR . flip f) (StateR . flip g) t) s++{-+bimapDefault = coerce+ (bitraverse :: (a -> Identity b)+ -> (c -> Identity d) -> t a c -> Identity (t b d))++bifoldMapDefault :: forall t m a b . (Bitraversable t, Monoid m)+ => (a -> m) -> (b -> m) -> t a b -> m+bifoldMapDefault = coerce+ (bitraverse :: (a -> Const m ())+ -> (b -> Const m ()) -> t a b -> Const m (t () ()))+-}
lib/Data/Bits.hs view
@@ -4,7 +4,7 @@ import Control.Error import Data.Bool import Data.Eq-import Data.Int()+import Data.Int import Data.Maybe import Data.Ord import Data.Num@@ -92,3 +92,18 @@ | otherwise = go (i + 1) w = finiteBitSize x++instance Bits Int where+ (.&.) = primIntAnd+ (.|.) = primIntOr+ xor = primIntXor+ complement = primIntInv+ shiftL = primIntShl+ shiftR = primIntShr+ bitSizeMaybe _ = Just _wordSize+ bitSize _ = _wordSize+ bit n = primIntShl 1 n+ zeroBits = 0++instance FiniteBits Int where+ finiteBitSize _ = _wordSize
lib/Data/ByteString.hs view
@@ -159,7 +159,7 @@ import qualified Data.List as P import Data.List.NonEmpty(NonEmpty, fromList) import Data.Bits-import Data.Monoid+import Data.Monoid.Internal import Data.Semigroup import Data.String import Data.Word(Word8)
lib/Data/ByteString/Internal.hs view
@@ -1,5 +1,5 @@ module Data.ByteString.Internal(module Data.ByteString.Internal) where-import Prelude hiding(length)+import Prelude(); import MiniPrelude hiding(length) import Data.Word(Word8) data ByteString -- primitive type
− lib/Data/ByteStringX.hs
@@ -1,652 +0,0 @@-module Data.ByteString(-- ByteString,- StrictByteString,-- -- * Introducing and eliminating 'ByteString's- empty, singleton, pack, unpack,- fromStrict, toStrict,- fromFilePath, toFilePath,-- -- * Basic interface- cons, snoc, append, head, uncons, unsnoc,- last, tail, init,- null, length,-- -- * Transforming ByteStrings- map,- reverse,- intersperse,- intercalate,- transpose,-- -- * Reducing 'ByteString's (folds)- foldl, foldl', foldl1, foldl1',-- foldr, foldr', foldr1, foldr1',-- -- ** Special folds- concat,- concatMap,- any,- all,- maximum,- minimum,-- -- * Building ByteStrings- -- ** Scans- scanl, scanl1, scanr, scanr1,-- -- ** Accumulating maps- mapAccumL, mapAccumR,-- -- ** Generating and unfolding ByteStrings- replicate,- unfoldr,- unfoldrN,-- -- * Substrings-- -- ** Breaking strings- take,- takeEnd,- drop,- dropEnd,- splitAt,- takeWhile,- takeWhileEnd,- dropWhile,- dropWhileEnd,- span,- spanEnd,- break,- breakEnd,- group,- groupBy,- inits,- tails,- initsNE,- tailsNE,- stripPrefix,- stripSuffix,-- -- ** Breaking into many substrings- split,- splitWith,-- -- * Predicates- isPrefixOf,- isSuffixOf,- isInfixOf,-- -- ** Encoding validation- isValidUtf8,-- -- ** Search for arbitrary substrings- breakSubstring,-- -- * Searching ByteStrings-- -- ** Searching by equality- elem,- notElem,-- -- ** Searching with a predicate- find,- filter,- partition,-- -- * Indexing ByteStrings- index,- indexMaybe,- (!?),- elemIndex,- elemIndices,- elemIndexEnd,- findIndex,- findIndices,- findIndexEnd,- count,-- -- * Zipping and unzipping ByteStrings- zip,- zipWith,- packZipWith,- unzip,-- -- * Ordered ByteStrings- sort,-- -- * Low level conversions- -- ** Copying ByteStrings- copy,-- -- ** Packing 'CString's and pointers- packCString,- packCStringLen,-- -- ** Using ByteStrings as 'CString's- useAsCString,- useAsCStringLen,-- -- * I\/O with 'ByteString's- - -- ** Standard input and output- getLine,- getContents,- putStr,- interact,-- -- ** Files- readFile,- writeFile,- appendFile,-- -- ** I\/O with Handles- hGetLine,- hGetContents,- hGet,- hGetSome,- hGetNonBlocking,- hPut,- 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 Data.List as P-import Data.List.NonEmpty(NonEmpty, fromList)-import Data.Bits-import Data.Monoid-import Data.Semigroup-import Data.String-import Data.Word(Word8)-import Foreign.C.String(CString, CStringLen)-import System.IO(Handle, IOMode(..), stdin, stdout)-import qualified System.IO as P-import Foreign.ForeignPtr--data ByteString -- primitive type-type StrictByteString = ByteString--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-primBSNE = primitive "bs/="-primBSLT :: ByteString -> ByteString -> Bool-primBSLT = primitive "bs<"-primBSLE :: ByteString -> ByteString -> Bool-primBSLE = primitive "bs<="-primBSGT :: ByteString -> ByteString -> Bool-primBSGT = primitive "bs>"-primBSGE :: ByteString -> ByteString -> Bool-primBSGE = primitive "bs>="-primBScmp :: ByteString -> ByteString -> Ordering-primBScmp = primitive "bscmp"-primBSpack :: [Word8] -> ByteString-primBSpack = primitive "bspack"-primBSunpack :: ByteString -> [Word8]-primBSunpack = primitive "bsunpack"-primBSlength :: ByteString -> Int-primBSlength = primitive "bslength"-primBSsubstr :: ByteString -> Int -> Int -> ByteString-primBSsubstr = primitive "bssubstr"-primBS2FPtr :: ByteString -> ForeignPtr Char-primBS2FPtr = primitive "I" -- same representation---------------------------------------------instance Eq ByteString where- (==) = primBSEQ- (/=) = primBSNE--instance Ord ByteString where- compare = primBScmp- (<) = primBSLT- (<=) = primBSLE- (>) = primBSGT- (>=) = primBSGE--instance Show ByteString where- showsPrec p bs = showsPrec p (toString bs)--instance IsString ByteString where- fromString = pack . P.map (toEnum . fromEnum)--instance Semigroup ByteString where- (<>) = append--instance Monoid ByteString where- mempty = empty--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"- | otherwise = primBSsubstr bs offs len- where sz = length bs--bsError :: String -> a-bsError s = P.error $ "Data.ByteString." P.++ s--bsUnimp :: String -> a-bsUnimp s = P.error $ "Data.ByteString." P.++ s P.++ " unimplemented"--toString :: ByteString -> String-toString = P.map (toEnum . fromEnum) . unpack---------------------------------------------empty :: ByteString-empty = pack []--singleton :: Word8 -> ByteString-singleton c = pack [c]--pack :: [Word8] -> ByteString-pack = primBSpack--unpack :: ByteString -> [Word8]-unpack = primBSunpack--fromStrict = bsUnimp "fromStrict"-toStrict = bsUnimp "toStrict"--fromFilePath :: FilePath -> IO ByteString-fromFilePath = return . fromString--toFilePath :: ByteString -> IO FilePath-toFilePath = return . toString--infixr 5 `cons` --same as list (:)-infixl 5 `snoc`--cons :: Word8 -> ByteString -> ByteString-cons c bs = append (pack [c]) bs--snoc :: ByteString -> Word8 -> ByteString-snoc bs c = append bs (pack [c])--head :: ByteString -> Word8-head = P.head . unpack--tail :: ByteString -> ByteString-tail bs | sz == 0 = bsError "tail: empty"- | otherwise = substr bs 1 (sz - 1)- where sz = length bs--uncons :: ByteString -> Maybe (Word8, ByteString)-uncons bs | null bs = Nothing- | otherwise = Just (head bs, tail bs)--last :: ByteString -> Word8-last = P.last . unpack--init :: ByteString -> ByteString-init bs | sz == 0 = bsError "init: empty"- | otherwise = substr bs 0 (sz - 1)- where sz = length bs--unsnoc :: ByteString -> Maybe (ByteString, Word8)-unsnoc bs | null bs = Nothing- | otherwise = Just (init bs, last bs)--null :: ByteString -> Bool-null bs = length bs == 0--length :: ByteString -> Int-length = primBSlength--append :: ByteString -> ByteString -> ByteString-append = primBSappend--map :: (Word8 -> Word8) -> ByteString -> ByteString-map f = pack . P.map f . unpack--reverse :: ByteString -> ByteString-reverse = pack . P.reverse . unpack--intersperse :: Word8 -> ByteString -> ByteString-intersperse x = pack . P.intersperse x . unpack--transpose :: [ByteString] -> [ByteString]-transpose = P.map pack . P.transpose . P.map unpack--foldl :: (a -> Word8 -> a) -> a -> ByteString -> a-foldl f z = P.foldl f z . unpack--foldl' :: (a -> Word8 -> a) -> a -> ByteString -> a-foldl' f z = P.foldl' f z . unpack--foldr :: (Word8 -> a -> a) -> a -> ByteString -> a-foldr k z = P.foldr k z . unpack--foldr' :: (Word8 -> a -> a) -> a -> ByteString -> a-foldr' k z = P.foldr' k z . unpack--foldl1 :: (Word8 -> Word8 -> Word8) -> ByteString -> Word8-foldl1 f = P.foldl1 f . unpack--foldl1' :: (Word8 -> Word8 -> Word8) -> ByteString -> Word8-foldl1' f = P.foldl1' f . unpack--foldr1 :: (Word8 -> Word8 -> Word8) -> ByteString -> Word8-foldr1 f = P.foldr1 f . unpack--foldr1' :: (Word8 -> Word8 -> Word8) -> ByteString -> Word8-foldr1' f = P.foldr1' f . unpack--concat :: [ByteString] -> ByteString-concat = P.foldr append empty--concatMap :: (Word8 -> ByteString) -> ByteString -> ByteString-concatMap f = concat . P.map f . unpack--any :: (Word8 -> Bool) -> ByteString -> Bool-any f = P.any f . unpack--all :: (Word8 -> Bool) -> ByteString -> Bool-all f = P.all f . unpack--maximum :: ByteString -> Word8-maximum = P.maximum . unpack--minimum :: ByteString -> Word8-minimum = P.minimum . unpack--mapAccumL :: (acc -> Word8 -> (acc, Word8)) -> acc -> ByteString -> (acc, ByteString)-mapAccumL f acc bs = (acc', pack ws)- where (acc', ws) = P.mapAccumL f acc (unpack bs)--mapAccumR :: (acc -> Word8 -> (acc, Word8)) -> acc -> ByteString -> (acc, ByteString)-mapAccumR f acc bs = (acc', pack ws)- where (acc', ws) = P.mapAccumR f acc (unpack bs)--scanl- :: (Word8 -> Word8 -> Word8)- -- ^ accumulator -> element -> new accumulator- -> Word8- -- ^ starting value of accumulator- -> ByteString- -- ^ input of length n- -> ByteString- -- ^ output of length n+1-scanl f v = pack . P.scanl f v . unpack--scanl1 :: (Word8 -> Word8 -> Word8) -> ByteString -> ByteString-scanl1 f = pack . P.scanl1 f . unpack--scanr- :: (Word8 -> Word8 -> Word8)- -- ^ element -> accumulator -> new accumulator- -> Word8- -- ^ starting value of accumulator- -> ByteString- -- ^ input of length n- -> ByteString- -- ^ output of length n+1-scanr f v = pack . P.scanr f v . unpack--scanr1 :: (Word8 -> Word8 -> Word8) -> ByteString -> ByteString-scanr1 f = pack . P.scanr1 f . unpack--replicate :: Int -> Word8 -> ByteString-replicate w = pack . P.replicate w--unfoldr :: (a -> Maybe (Word8, a)) -> a -> ByteString-unfoldr f = pack . P.unfoldr f--unfoldrN :: Int -> (a -> Maybe (Word8, a)) -> a -> (ByteString, Maybe a)-unfoldrN i f = loop [] i- where loop ws i x | i <= 0 = (pack (P.reverse ws), Just x)- | Just (w, x') <- f x = loop (w:ws) (i-1) x'- | otherwise = (pack (P.reverse ws), Nothing)--take :: Int -> ByteString -> ByteString-take n bs- | n <= 0 = empty- | n >= l = bs- | otherwise = substr bs 0 n- where l = length bs--takeEnd :: Int -> ByteString -> ByteString-takeEnd n bs- | n <= 0 = empty- | n >= l = bs- | otherwise = substr bs (l - n) n- where l = length bs--drop :: Int -> ByteString -> ByteString-drop n bs- | n <= 0 = bs- | n >= l = empty- | otherwise = substr bs n (l - n)- where l = length bs--dropEnd :: Int -> ByteString -> ByteString-dropEnd n bs- | n <= 0 = bs- | n >= l = empty- | otherwise = substr bs 0 (l - n)- where l = length bs--splitAt :: Int -> ByteString -> (ByteString, ByteString)-splitAt n bs = (take n bs, drop n bs)--takeWhile :: (Word8 -> Bool) -> ByteString -> ByteString-takeWhile f = pack . P.takeWhile f . unpack--takeWhileEnd :: (Word8 -> Bool) -> ByteString -> ByteString-takeWhileEnd f = pack . P.takeWhileEnd f . unpack--dropWhile :: (Word8 -> Bool) -> ByteString -> ByteString-dropWhile f = pack . P.dropWhile f . unpack--dropWhileEnd :: (Word8 -> Bool) -> ByteString -> ByteString-dropWhileEnd f = pack . P.dropWhileEnd f . unpack--break :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)-break p bs = (takeWhile p bs, dropWhile p bs)--breakEnd :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)-breakEnd p bs = (takeWhileEnd p bs, dropWhileEnd p bs)--span :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)-span p = break (not . p)--spanEnd :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)-spanEnd p = breakEnd (not . p)--splitWith :: (Word8 -> Bool) -> ByteString -> [ByteString]-splitWith w = P.map pack . P.splitWith w . unpack--split :: Word8 -> ByteString -> [ByteString]-split w = splitWith (w ==)--group :: ByteString -> [ByteString]-group = P.map pack . P.group . unpack--groupBy :: (Word8 -> Word8 -> Bool) -> ByteString -> [ByteString]-groupBy q = P.map pack . P.groupBy q . unpack--intercalate :: ByteString -> [ByteString] -> ByteString-intercalate s = pack . P.intercalate (unpack s) . P.map unpack--index :: ByteString -> Int -> Word8-index bs n = unpack bs !! n--indexMaybe :: ByteString -> Int -> Maybe Word8-indexMaybe bs n = unpack bs P.!? n--(!?) :: ByteString -> Int -> Maybe Word8-(!?) = indexMaybe--elemIndex :: Word8 -> ByteString -> Maybe Int-elemIndex c = P.elemIndex c . unpack--elemIndexEnd :: Word8 -> ByteString -> Maybe Int-elemIndexEnd c bs = fmap (l -) . P.elemIndex c . P.reverse . unpack $ bs- where l = length bs - 1--elemIndices :: Word8 -> ByteString -> [Int]-elemIndices w = P.elemIndices w . unpack--count :: Word8 -> ByteString -> Int-count w = P.length . elemIndices w--findIndex :: (Word8 -> Bool) -> ByteString -> Maybe Int-findIndex k = P.findIndex k . unpack--findIndexEnd :: (Word8 -> Bool) -> ByteString -> Maybe Int-findIndexEnd c bs = fmap (l -) . P.findIndex c . P.reverse . unpack $ bs- where l = length bs - 1--findIndices :: (Word8 -> Bool) -> ByteString -> [Int]-findIndices p = P.findIndices p . unpack--elem :: Word8 -> ByteString -> Bool-elem c ps = case elemIndex c ps of Nothing -> False ; _ -> True--notElem :: Word8 -> ByteString -> Bool-notElem c ps = not (c `elem` ps)--filter :: (Word8 -> Bool) -> ByteString -> ByteString-filter p = pack . P.filter p . unpack--find :: (Word8 -> Bool) -> ByteString -> Maybe Word8-find p = P.find p . unpack--partition :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)-partition f bs = (pack a, pack b) where (a, b) = P.partition f (unpack bs)--isPrefixOf :: ByteString -> ByteString -> Bool-isPrefixOf s = P.isPrefixOf (unpack s) . unpack--stripPrefix :: ByteString -> ByteString -> Maybe ByteString-stripPrefix s = fmap pack . P.stripPrefix (unpack s) . unpack--isSuffixOf :: ByteString -> ByteString -> Bool-isSuffixOf a = P.isSuffixOf (unpack a) . unpack--stripSuffix :: ByteString -> ByteString -> Maybe ByteString-stripSuffix s = fmap pack . P.stripSuffix (unpack s) . unpack--isInfixOf :: ByteString -> ByteString -> Bool-isInfixOf a = P.isInfixOf (unpack a) . unpack--isValidUtf8 :: ByteString -> Bool-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- mask :: Word8 -> Word8 -> Word8 -> Bool- mask x m b = x .&. m == b- mask80 :: Word8 -> Bool- mask80 x = mask x 0xc0 0x80--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"--zip :: ByteString -> ByteString -> [(Word8,Word8)]-zip ps qs = P.zip (unpack ps) (unpack qs)--zipWith :: (Word8 -> Word8 -> a) -> ByteString -> ByteString -> [a]-zipWith f ps qs = P.zipWith f (unpack ps) (unpack qs)--packZipWith :: (Word8 -> Word8 -> Word8) -> ByteString -> ByteString -> ByteString-packZipWith f ps qs = pack $ zipWith f ps qs--unzip :: [(Word8,Word8)] -> (ByteString,ByteString)-unzip ls = (pack (P.map fst ls), pack (P.map snd ls))--inits :: ByteString -> [ByteString]-inits = P.map pack . P.inits . unpack--initsNE :: ByteString -> NonEmpty ByteString-initsNE = fromList . inits--tails :: ByteString -> [ByteString]-tails = P.map pack . P.tails . unpack--tailsNE :: ByteString -> NonEmpty ByteString-tailsNE = fromList . tails--sort :: ByteString -> ByteString-sort = pack . P.sort . unpack--useAsCString :: ByteString -> (CString -> IO a) -> IO a-useAsCString bs act =- withForeignPtr (primBS2FPtr bs) act--useAsCStringLen :: ByteString -> (CStringLen -> IO a) -> IO a-useAsCStringLen bs act =- withForeignPtr (primBS2FPtr bs) $ \ p -> act (p, length bs)--packCString :: CString -> IO ByteString-packCString cstr = bsUnimp "packCString"--packCStringLen :: CStringLen -> IO ByteString-packCStringLen = bsUnimp "packCStringLen"--copy :: ByteString -> ByteString-copy = append empty--getLine :: IO ByteString-getLine = hGetLine stdin--hGetLine :: Handle -> IO ByteString-hGetLine = fmap fromString . P.hGetLine--hPut :: Handle -> ByteString -> IO ()-hPut h = P.hPutStr h . toString--hPutNonBlocking :: Handle -> ByteString -> IO ByteString-hPutNonBlocking = bsUnimp "hPutNonBlocking"--hPutStr :: Handle -> ByteString -> IO ()-hPutStr = hPut--putStr :: ByteString -> IO ()-putStr = hPut stdout--hGet :: Handle -> Int -> IO ByteString-hGet h i = bsUnimp "hGet"--hGetNonBlocking :: Handle -> Int -> IO ByteString-hGetNonBlocking h i = bsUnimp "hGetNonBlocking"--hGetSome :: Handle -> Int -> IO ByteString-hGetSome h i = bsUnimp "hGetSome"--hGetContents :: Handle -> IO ByteString-hGetContents = fmap fromString . P.hGetContents--getContents :: IO ByteString-getContents = hGetContents stdin--interact :: (ByteString -> ByteString) -> IO ()-interact transformer = getContents >>= putStr . transformer--readFile :: FilePath -> IO ByteString-readFile = fmap fromString . P.readFile--writeFile :: FilePath -> ByteString -> IO ()-writeFile f = P.writeFile f . toString--appendFile :: FilePath -> ByteString -> IO ()-appendFile f = P.appendFile f . toString--main :: IO (); main = return ()
lib/Data/Char.hs view
@@ -73,7 +73,7 @@ isOctDigit c = (primCharLE '0' c) && (primCharLE c '7') isHexDigit :: Char -> Bool-isHexDigit c = isDigit c || (primCharLE 'a' c && primCharLE c 'f') || (primCharLE 'F' c && primCharLE c 'F') +isHexDigit c = isDigit c || (primCharLE 'a' c && primCharLE c 'f') || (primCharLE 'A' c && primCharLE c 'F') isAlphaNum :: Char -> Bool isAlphaNum c = isAlpha c || isDigit c
lib/Data/Double.hs view
@@ -13,7 +13,6 @@ import Data.Real import Data.RealFloat import Data.RealFrac-import Text.Read import Text.Show -- XXX I should really implement newtype deriving...@@ -57,8 +56,10 @@ instance Show Double where showsPrec p = showsPrec p . unD +{- in Text.Read.Internal instance Read Double where readsPrec p = map (\ (x, s) -> (D x, s)) . readsPrec p+-} instance Real Double where toRational = toRational . unD
lib/Data/Either.hs view
@@ -3,6 +3,8 @@ module Data.Either(module Data.Either) where import Prelude() -- do not import Prelude import Primitives+import Control.Applicative+import Control.Monad import Data.Bool import Data.Eq import Data.Function@@ -33,3 +35,13 @@ instance forall a . Functor (Either a) where fmap _ (Left a) = Left a fmap f (Right b) = Right (f b)++instance forall a . Applicative (Either a) where+ pure b = Right b+ Right f <*> Right x = Right (f x)+ Right _ <*> Left a = Left a+ Left a <*> _ = Left a++instance forall a . Monad (Either a) where+ Right b >>= k = k b+ Left a >>= _ = Left a
+ lib/Data/Fixed.hs view
@@ -0,0 +1,225 @@+-----------------------------------------------------------------------------+-- |+-- Module : Data.Fixed+-- Copyright : (c) Ashley Yakeley 2005, 2006, 2009+-- License : BSD-style (see the file libraries/base/LICENSE)+--+-- Maintainer : Ashley Yakeley <ashley@semantic.org>+-- Stability : stable+-- Portability : portable+-----------------------------------------------------------------------------++module Data.Fixed+( -- * The Fixed Type+ Fixed(..), HasResolution(..),+ showFixed,+ -- ** 1\/1+ E0,Uni,+ -- ** 1\/10+ E1,Deci,+ -- ** 1\/100+ E2,Centi,+ -- ** 1\/1 000+ E3,Milli,+ -- ** 1\/1 000 000+ E6,Micro,+ -- ** 1\/1 000 000 000+ E9,Nano,+ -- ** 1\/1 000 000 000 000+ E12,Pico,+ -- * Generalized Functions on Real's+ div',+ mod',+ divMod'+) where+import Prelude()+import MiniPrelude+import Data.TypeLits (KnownNat, natVal)+import Text.Read.Internal+import Text.ParserCombinators.ReadPrec+import Text.Read.Lex+import Data.Double+import Data.Floating+import Data.Fractional+import Data.Integer+import Data.Real+import Data.RealFrac+import Data.Typeable++default () -- avoid any defaulting shenanigans++div' :: (Real a,Integral b) => a -> a -> b+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+ f = div' n d++mod' :: (Real a) => a -> a -> a+mod' n d = n - (fromInteger f) * d where+ f = div' n d++type Fixed :: forall k . k -> Type+newtype Fixed a = MkFixed Integer+ deriving ( Eq -- ^ @since 2.01+ , Ord -- ^ @since 2.01+ )++{-+tyFixed :: DataType+tyFixed = mkDataType "Data.Fixed.Fixed" [conMkFixed]++conMkFixed :: Constr+conMkFixed = mkConstr tyFixed "MkFixed" [] Prefix++-- | @since 4.1.0.0+instance (Typeable k,Typeable a) => Data (Fixed (a :: k)) where+ gfoldl k z (MkFixed a) = k (z MkFixed) a+ gunfold k z _ = k (z MkFixed)+ dataTypeOf _ = tyFixed+ toConstr _ = conMkFixed+-}++type HasResolution :: forall k . k -> Constraint+class HasResolution a where+ resolution :: p a -> Integer++instance forall n . KnownNat n => HasResolution n where+ resolution _ = natVal (Proxy :: Proxy n)++withType :: (Proxy a -> f a) -> f a+withType foo = foo Proxy++withResolution :: (HasResolution a) => (Integer -> f a) -> f a+withResolution foo = withType (foo . resolution)++instance Enum (Fixed a) where+ succ (MkFixed a) = MkFixed (succ a)+ 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)++instance (HasResolution a) => Num (Fixed a) where+ (MkFixed a) + (MkFixed b) = MkFixed (a + b)+ (MkFixed a) - (MkFixed b) = MkFixed (a - b)+ fa@(MkFixed a) * (MkFixed b) = MkFixed (div (a * b) (resolution fa))+ negate (MkFixed a) = MkFixed (negate a)+ abs (MkFixed a) = MkFixed (abs a)+ signum (MkFixed a) = fromInteger (signum a)+ fromInteger i = withResolution (\res -> MkFixed (i * res))++instance (HasResolution a) => Real (Fixed a) where+ 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)+ recip fa@(MkFixed a) = MkFixed (div (res * res) a) where+ res = resolution fa+ fromRational r = withResolution (\res -> MkFixed (floor (r * (toRational res))))++instance (HasResolution a) => RealFrac (Fixed a) where+ properFraction a = (i,a - (fromIntegral i)) where+ i = truncate a+ truncate f = truncate (toRational f)+ round f = round (toRational f)+ ceiling f = ceiling (toRational f)+ floor f = floor (toRational f)++chopZeros :: Integer -> String+chopZeros 0 = ""+chopZeros a | mod a 10 == 0 = chopZeros (div a 10)+chopZeros a = show a++showIntegerZeros :: Bool -> Int -> Integer -> String+showIntegerZeros True _ 0 = ""+showIntegerZeros chopTrailingZeros digits a = replicate (digits - length s) '0' ++ s' where+ s = show a+ s' = if chopTrailingZeros then chopZeros a else s++withDot :: String -> String+withDot "" = ""+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+ res = resolution fa+ (i,d) = divMod a res+ -- enough digits to be unambiguous+ digits = ceiling (logBase 10 (fromInteger res) :: Double)+ maxnum = 10 ^ digits+ -- read floors, so show must ceil for `read . show = id` to hold. See #9240+ fracNum = divCeil (d * maxnum) res+ divCeil x y = (x + y - 1) `div` y++instance (HasResolution a) => Show (Fixed a) where+ showsPrec p n = showParen (p > 6 && n < 0) $ showString $ showFixed False n++instance (HasResolution a) => Read (Fixed a) where+ readPrec = readNumber convertFixed+ readListPrec = readListPrecDefault+ readList = readListDefault++convertFixed :: forall a . HasResolution a => Lexeme -> ReadPrec (Fixed a)+convertFixed (Number n)+ | Just (i, f) <- numberToFixed e n =+ return (fromInteger i + (fromInteger f / (10 ^ e)))+ where r = resolution (Proxy :: Proxy a)+ -- round 'e' up to help make the 'read . show == id' property+ -- possible also for cases where 'resolution' is not a+ -- power-of-10, such as e.g. when 'resolution = 128'+ e = ceiling (logBase 10 (fromInteger r) :: Double)+convertFixed _ = pfail++data E0++instance HasResolution E0 where+ resolution _ = 1++type Uni = Fixed E0++data E1++instance HasResolution E1 where+ resolution _ = 10++type Deci = Fixed E1++data E2++instance HasResolution E2 where+ resolution _ = 100++type Centi = Fixed E2++data E3++instance HasResolution E3 where+ resolution _ = 1000++type Milli = Fixed E3++data E6++instance HasResolution E6 where+ resolution _ = 1000000++type Micro = Fixed E6++data E9++instance HasResolution E9 where+ resolution _ = 1000000000++type Nano = Fixed E9++data E12++instance HasResolution E12 where+ resolution _ = 1000000000000++type Pico = Fixed E12
lib/Data/Float.hs view
@@ -13,7 +13,6 @@ import Data.Real import Data.RealFloat import Data.RealFrac-import Text.Read import Text.Show -- XXX I should really implement newtype deriving...@@ -57,8 +56,10 @@ instance Show Float where showsPrec p = showsPrec p . unD +{- in Text.Read.Internal instance Read Float where readsPrec p = map (\ (x, s) -> (D x, s)) . readsPrec p+-} instance Real Float where toRational = toRational . unD
lib/Data/FloatW.hs view
@@ -12,6 +12,7 @@ import Data.Fractional import Data.Function import Data.Integer+import Data.Integral import Data.List import Data.Ord import Data.Ratio@@ -20,8 +21,6 @@ import Data.RealFrac import Data.Num import Data.Word-import Text.Read-import Text.Read.Numeric import Text.Show --@@ -66,8 +65,10 @@ instance Show FloatW where show = primFloatWShow +{- in Text.Read.Internal instance Read FloatW where readsPrec _ = readSigned $ \ r -> [ (primFloatWRead s, t) | (s@(c:_), t) <- lex r, isDigit c ]+-} instance Real FloatW where toRational x | isNaN x = rationalNaN@@ -77,7 +78,12 @@ (m, e) -> toRational m * 2^^e instance RealFrac FloatW where- properFraction _ = error "FloatW.properFraction not implemented"+ properFraction x =+ case decodeFloat x of+ (m, e) -> -- x = m * 2^e+ let m' | e < 0 = m `quot` 2^(-e)+ | otherwise = m * 2^e+ in (fromInteger m', x - fromInteger m') instance Floating FloatW where pi = 3.141592653589793
lib/Data/Foldable.hs view
@@ -49,6 +49,7 @@ import Data.Bool import Data.Either import Data.Eq+import Data.Foldable.Internal import Data.Function import Data.Functor.Const import Data.Functor.Identity@@ -56,43 +57,11 @@ import qualified Data.List as List import Data.Maybe import Data.Monoid+import Data.Monoid.Internal hiding (Max(..), Min(..)) import Data.Num import Data.Ord import Data.Proxy-import Data.Semigroup -newtype MMax a = MMax (Maybe a)-getMMax :: forall a . MMax a -> Maybe a-getMMax (MMax ma) = ma--newtype MMin a = MMin (Maybe a)-getMMin :: forall a . MMin a -> Maybe a-getMMin (MMin ma) = ma--instance forall a . Ord a => Semigroup (MMax a) where- m <> MMax Nothing = m- MMax Nothing <> n = n- (MMax m@(Just x)) <> (MMax n@(Just y))- | x >= y = MMax m- | otherwise = MMax n--instance forall a . Ord a => Monoid (MMax a) where- mempty = MMax Nothing- mconcat = List.foldl' (<>) mempty--instance forall a . Ord a => Semigroup (MMin a) where- m <> MMin Nothing = m- MMin Nothing <> n = n- (MMin m@(Just x)) <> (MMin n@(Just y))- | x <= y = MMin m- | otherwise = MMin n--instance forall a . Ord a => Monoid (MMin a) where- mempty = MMin Nothing- mconcat = List.foldl' (<>) mempty---------------------------------- infix 4 `elem`, `notElem` class Foldable (t :: Type -> Type) where@@ -155,11 +124,11 @@ maximum :: forall a . Ord a => t a -> a maximum = fromMaybe (error "maximum: empty structure") .- getMMax . foldMap' (MMax . Just)+ getMax . foldMap' (Max . Just) minimum :: forall a . Ord a => t a -> a minimum = fromMaybe (error "minimum: empty structure") .- getMMin . foldMap' (MMin . Just)+ getMin . foldMap' (Min . Just) sum :: forall a . Num a => t a -> a sum = getSum . foldMap' Sum@@ -329,6 +298,9 @@ -- | @since 4.12.0.0 instance (Foldable f) => Foldable (Ap f) where foldMap f = foldMap f . getAp++instance Foldable (Arg a) where+ foldMap f (Arg _ a) = f a -- Instances for GHC.Generics -- | @since 4.9.0.0
+ lib/Data/Foldable/Internal.hs view
@@ -0,0 +1,88 @@+module Data.Foldable.Internal(module Data.Foldable.Internal) where+import Prelude()+import Control.Applicative+import Control.Monad+import Data.Bool+import Data.Function+import Data.Functor+import Data.Maybe_Type+import Data.Monoid.Internal hiding (Max(..), Min(..))+import Data.List+import Data.Ord++newtype Max a = Max (Maybe a)+getMax :: forall a . Max a -> Maybe a+getMax (Max ma) = ma++newtype Min a = Min (Maybe a)+getMin :: forall a . Min a -> Maybe a+getMin (Min ma) = ma++instance forall a . Ord a => Semigroup (Max a) where+ m <> Max Nothing = m+ Max Nothing <> n = n+ (Max m@(Just x)) <> (Max n@(Just y))+ | x >= y = Max m+ | otherwise = Max n++instance forall a . Ord a => Monoid (Max a) where+ mempty = Max Nothing+ mconcat = foldl' (<>) mempty++instance forall a . Ord a => Semigroup (Min a) where+ m <> Min Nothing = m+ Min Nothing <> n = n+ (Min m@(Just x)) <> (Min n@(Just y))+ | x <= y = Min m+ | otherwise = Min n++instance forall a . Ord a => Monoid (Min a) where+ mempty = Min Nothing+ mconcat = foldl' (<>) mempty++newtype StateL s a = StateL (s -> (s, a))+runStateL :: StateL s a -> s -> (s, a)+runStateL (StateL f) = f++instance Functor (StateL s) where+ fmap f (StateL k) = StateL $ \ s -> let (s', v) = k s in (s', f v)++instance Applicative (StateL s) where+ pure x = StateL (\ s -> (s, x))+ StateL kf <*> StateL kv = StateL $ \ s ->+ let (s', f) = kf s+ (s'', v) = kv s'+ in (s'', f v)++newtype StateR s a = StateR (s -> (s, a))+runStateR :: StateR s a -> s -> (s, a)+runStateR (StateR f) = f++instance Functor (StateR s) where+ fmap f (StateR k) = StateR $ \ s -> let (s', v) = k s in (s', f v)++instance Applicative (StateR s) where+ pure x = StateR (\ s -> (s, x))+ StateR kf <*> StateR kv = StateR $ \ s ->+ let (s', v) = kv s+ (s'', f) = kf s'+ in (s'', f v)++newtype StateT s m a = StateT (s -> m (s, a))+runStateT :: StateT s m a -> s -> m (s, a)+runStateT (StateT f) = f++instance Monad m => Functor (StateT s m) where+ fmap = liftM++instance Monad m => Applicative (StateT s m) where+ pure a = StateT $ \ s -> return (s, a)+ StateT mf <*> StateT mx = StateT $ \ s -> do+ (s', f) <- mf s+ (s'', x) <- mx s'+ return (s'', f x)++instance (Monad m) => Monad (StateT s m) where+ m >>= k = StateT $ \ s -> do+ (s', a) <- runStateT m s+ runStateT (k a) s'
+ lib/Data/Foldable1.hs view
@@ -0,0 +1,571 @@+-- |+-- Copyright: Edward Kmett, Oleg Grenrus+-- License: BSD-3-Clause+--+-- A class of non-empty data structures that can be folded to a summary value.+--+-- @since 4.18.0.0++{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE TypeOperators #-}++module Data.Foldable1 (+ Foldable1(..),+ foldr1, foldr1',+ foldl1, foldl1',+ intercalate1,+ foldrM1,+ foldlM1,+ foldrMapM1,+ foldlMapM1,+ maximumBy,+ minimumBy,+ ) where+import Data.Foldable (Foldable, foldlM, foldr)+import Data.List ([](..), foldl, foldl')+import Data.List.NonEmpty (NonEmpty (..))+import Data.Maybe+import Data.Semigroup+import Data.Tuple (Solo (..))+import Prelude+ (Maybe (..), Monad (..), Ord, Ordering (..), id, seq, ($!), ($), (.),+ (=<<), flip, const, error)++import qualified Data.List.NonEmpty as NE++import Data.Complex (Complex (..))++import Data.Ord (Down (..))++import qualified Data.Monoid as Mon++-- Instances+import Data.Functor.Compose (Compose (..))+import Data.Functor.Identity (Identity (..))++import qualified Data.Functor.Product as Functor+import qualified Data.Functor.Sum as Functor++-- coerce+--import GHC.Internal.Data.Coerce (Coercible, coerce)++-- $setup+-- >>> import Prelude hiding (foldr1, foldl1, head, last, minimum, maximum)++-------------------------------------------------------------------------------+-- Foldable1 type class+-------------------------------------------------------------------------------++-- | Non-empty data structures that can be folded.+--+-- @since 4.18.0.0+class Foldable t => Foldable1 t where+ {-# MINIMAL foldMap1 | foldrMap1 #-}++ -- At some point during design it was possible to define this class using+ -- only 'toNonEmpty'. But it seems a bad idea in general.+ --+ -- So currently we require either foldMap1 or foldrMap1+ --+ -- * foldMap1 defined using foldrMap1+ -- * foldrMap1 defined using foldMap1+ --+ -- One can always define an instance using the following pattern:+ --+ -- toNonEmpty = ...+ -- foldMap f = foldMap f . toNonEmpty+ -- foldrMap1 f g = foldrMap1 f g . toNonEmpty++ -- | Given a structure with elements whose type is a 'Semigroup', combine+ -- them via the semigroup's @('<>')@ operator. This fold is+ -- right-associative and lazy in the accumulator. When you need a strict+ -- left-associative fold, use 'foldMap1'' instead, with 'id' as the map.+ --+ -- @since 4.18.0.0+ fold1 :: Semigroup m => t m -> m+ fold1 = foldMap1 id++ -- | Map each element of the structure to a semigroup, and combine the+ -- results with @('<>')@. This fold is right-associative and lazy in the+ -- accumulator. For strict left-associative folds consider 'foldMap1''+ -- instead.+ --+ -- >>> foldMap1 (:[]) (1 :| [2, 3, 4])+ -- [1,2,3,4]+ --+ -- @since 4.18.0.0+ foldMap1 :: Semigroup m => (a -> m) -> t a -> m+ foldMap1 f = foldrMap1 f (\a m -> f a <> m)++ -- | A left-associative variant of 'foldMap1' that is strict in the+ -- accumulator. Use this for strict reduction when partial results are+ -- merged via @('<>')@.+ --+ -- >>> foldMap1' Sum (1 :| [2, 3, 4])+ -- Sum {getSum = 10}+ --+ -- @since 4.18.0.0+ foldMap1' :: Semigroup m => (a -> m) -> t a -> m+ foldMap1' f = foldlMap1' f (\m a -> m <> f a)++ -- | 'NonEmpty' list of elements of a structure, from left to right.+ --+ -- >>> toNonEmpty (Identity 2)+ -- 2 :| []+ --+ -- @since 4.18.0.0+ toNonEmpty :: t a -> NonEmpty a+ toNonEmpty = runNonEmptyDList . foldMap1 singleton++ -- | The largest element of a non-empty structure.+ --+ -- >>> maximum (32 :| [64, 8, 128, 16])+ -- 128+ --+ -- @since 4.18.0.0+ maximum :: Ord a => t a -> a+ maximum = getMax . foldMap1' Max++ -- | The least element of a non-empty structure.+ --+ -- >>> minimum (32 :| [64, 8, 128, 16])+ -- 8+ --+ -- @since 4.18.0.0+ minimum :: Ord a => t a -> a+ minimum = getMin . foldMap1' Min++ -- | The first element of a non-empty structure.+ --+ -- >>> head (1 :| [2, 3, 4])+ -- 1+ --+ -- @since 4.18.0.0+ head :: t a -> a+ head = getFirst . foldMap1 First++ -- | The last element of a non-empty structure.+ --+ -- >>> last (1 :| [2, 3, 4])+ -- 4+ --+ -- @since 4.18.0.0+ last :: t a -> a+ last = getLast . foldMap1 Last++ -- | Right-associative fold of a structure, lazy in the accumulator.+ --+ -- In case of 'NonEmpty' lists, 'foldrMap1', when given a function @f@, a+ -- binary operator @g@, and a list, reduces the list using @g@ from right to+ -- left applying @f@ to the rightmost element:+ --+ -- > foldrMap1 f g (x1 :| [x2, ..., xn1, xn]) == x1 `g` (x2 `g` ... (xn1 `g` (f xn))...)+ --+ -- Note that since the head of the resulting expression is produced by+ -- an application of @g@ to the first element of the list, if @g@ is lazy+ -- in its right argument, 'foldrMap1' can produce a terminating expression+ -- from an unbounded list.+ --+ -- For a general 'Foldable1' structure this should be semantically identical+ -- to:+ --+ -- @foldrMap1 f g = foldrMap1 f g . 'toNonEmpty'@+ --+ -- @since 4.18.0.0+ foldrMap1 :: (a -> b) -> (a -> b -> b) -> t a -> b+ foldrMap1 f g xs =+ appFromMaybe (foldMap1 (FromMaybe . h) xs) Nothing+ where+ h a Nothing = f a+ h a (Just b) = g a b++ -- | Left-associative fold of a structure but with strict application of the+ -- operator.+ --+ -- This ensures that each step of the fold is forced to Weak Head Normal+ -- Form before being applied, avoiding the collection of thunks that would+ -- otherwise occur. This is often what you want to strictly reduce a+ -- finite structure to a single strict result.+ --+ -- For a general 'Foldable1' structure this should be semantically identical+ -- to:+ --+ -- @foldlMap1' f z = foldlMap1' f z . 'toNonEmpty'@+ --+ -- @since 4.18.0.0+ foldlMap1' :: (a -> b) -> (b -> a -> b) -> t a -> b+ foldlMap1' f g xs =+ foldrMap1 f' g' xs SNothing+ where+ -- f' :: a -> SMaybe b -> b+ f' a SNothing = f a+ f' a (SJust b) = g b a++ -- g' :: a -> (SMaybe b -> b) -> SMaybe b -> b+ g' a x SNothing = x $! SJust (f a)+ g' a x (SJust b) = x $! SJust (g b a)++ -- | Left-associative fold of a structure, lazy in the accumulator. This is+ -- rarely what you want, but can work well for structures with efficient+ -- right-to-left sequencing and an operator that is lazy in its left+ -- argument.+ --+ -- In case of 'NonEmpty' lists, 'foldlMap1', when given a function @f@, a+ -- binary operator @g@, and a list, reduces the list using @g@ from left to+ -- right applying @f@ to the leftmost element:+ --+ -- > foldlMap1 f g (x1 :| [x2, ..., xn]) == (...(((f x1) `g` x2) `g`...) `g` xn+ --+ -- Note that to produce the outermost application of the operator the entire+ -- input list must be traversed. This means that 'foldlMap1' will diverge if+ -- given an infinite list.+ --+ -- If you want an efficient strict left-fold, you probably want to use+ -- 'foldlMap1'' instead of 'foldlMap1'. The reason for this is that the+ -- latter does not force the /inner/ results (e.g. @(f x1) \`g\` x2@ in the+ -- above example) before applying them to the operator (e.g. to+ -- @(\`g\` x3)@). This results in a thunk chain \(O(n)\) elements long,+ -- which then must be evaluated from the outside-in.+ --+ -- For a general 'Foldable1' structure this should be semantically identical+ -- to:+ --+ -- @foldlMap1 f g = foldlMap1 f g . 'toNonEmpty'@+ --+ -- @since 4.18.0.0+ foldlMap1 :: (a -> b) -> (b -> a -> b) -> t a -> b+ foldlMap1 f g xs =+ appFromMaybe (getDual (foldMap1 ((Dual . FromMaybe) . h) xs)) Nothing+ where+ h a Nothing = f a+ h a (Just b) = g b a++ -- | 'foldrMap1'' is a variant of 'foldrMap1' that performs strict reduction+ -- from right to left, i.e. starting with the right-most element. The input+ -- structure /must/ be finite, otherwise 'foldrMap1'' runs out of space+ -- (/diverges/).+ --+ -- If you want a strict right fold in constant space, you need a structure+ -- that supports faster than \(O(n)\) access to the right-most element.+ --+ -- This method does not run in constant space for structures such as+ -- 'NonEmpty' lists that don't support efficient right-to-left iteration and+ -- so require \(O(n)\) space to perform right-to-left reduction. Use of this+ -- method with such a structure is a hint that the chosen structure may be a+ -- poor fit for the task at hand. If the order in which the elements are+ -- combined is not important, use 'foldlMap1'' instead.+ --+ -- @since 4.18.0.0+ foldrMap1' :: (a -> b) -> (a -> b -> b) -> t a -> b+ foldrMap1' f g xs =+ foldlMap1 f' g' xs SNothing+ where+ f' a SNothing = f a+ f' a (SJust b) = g a b++ g' bb a SNothing = bb $! SJust (f a)+ g' bb a (SJust b) = bb $! SJust (g a b)++-------------------------------------------------------------------------------+-- Combinators+-------------------------------------------------------------------------------++-- | A variant of 'foldrMap1' where the rightmost element maps to itself.+--+-- @since 4.18.0.0+foldr1 :: Foldable1 t => (a -> a -> a) -> t a -> a+foldr1 = foldrMap1 id+{-# INLINE foldr1 #-}++-- | A variant of 'foldrMap1'' where the rightmost element maps to itself.+--+-- @since 4.18.0.0+foldr1' :: Foldable1 t => (a -> a -> a) -> t a -> a+foldr1' = foldrMap1' id+{-# INLINE foldr1' #-}++-- | A variant of 'foldlMap1' where the leftmost element maps to itself.+--+-- @since 4.18.0.0+foldl1 :: Foldable1 t => (a -> a -> a) -> t a -> a+foldl1 = foldlMap1 id+{-# INLINE foldl1 #-}++-- | A variant of 'foldlMap1'' where the leftmost element maps to itself.+--+-- @since 4.18.0.0+foldl1' :: Foldable1 t => (a -> a -> a) -> t a -> a+foldl1' = foldlMap1' id+{-# INLINE foldl1' #-}++-- | Insert an @m@ between each pair of @t m@.+--+-- >>> intercalate1 ", " $ "hello" :| ["how", "are", "you"]+-- "hello, how, are, you"+--+-- >>> intercalate1 ", " $ "hello" :| []+-- "hello"+--+-- >>> intercalate1 mempty $ "I" :| ["Am", "Fine", "You?"]+-- "IAmFineYou?"+--+-- @since 4.18.0.0+intercalate1 :: (Foldable1 t, Semigroup m) => m -> t m -> m+intercalate1 = flip intercalateMap1 id++intercalateMap1 :: (Foldable1 t, Semigroup m) => m -> (a -> m) -> t a -> m+intercalateMap1 j f = flip joinee j . foldMap1 (JoinWith . const . f)++-- | Monadic fold over the elements of a non-empty structure,+-- associating to the right, i.e. from right to left.+--+-- @since 4.18.0.0+foldrM1 :: (Foldable1 t, Monad m) => (a -> a -> m a) -> t a -> m a+foldrM1 = foldrMapM1 return++-- | Map variant of 'foldrM1'.+--+-- @since 4.18.0.0+foldrMapM1 :: (Foldable1 t, Monad m) => (a -> m b) -> (a -> b -> m b) -> t a -> m b+foldrMapM1 g f = go . toNonEmpty+ where+ go (e:|es) =+ case es of+ [] -> g e+ x:xs -> f e =<< go (x:|xs)++-- | Monadic fold over the elements of a non-empty structure,+-- associating to the left, i.e. from left to right.+--+-- @since 4.18.0.0+foldlM1 :: (Foldable1 t, Monad m) => (a -> a -> m a) -> t a -> m a+foldlM1 = foldlMapM1 return++-- | Map variant of 'foldlM1'.+--+-- @since 4.18.0.0+foldlMapM1 :: (Foldable1 t, Monad m) => (a -> m b) -> (b -> a -> m b) -> t a -> m b+foldlMapM1 g f t = g x >>= \y -> foldlM f y xs+ where x:|xs = toNonEmpty t++-- | The largest element of a non-empty structure with respect to the+-- given comparison function.+--+-- @since 4.18.0.0+maximumBy :: Foldable1 t => (a -> a -> Ordering) -> t a -> a+maximumBy cmp = foldl1' max'+ where max' x y = case cmp x y of+ GT -> x+ _ -> y++-- | The least element of a non-empty structure with respect to the+-- given comparison function.+--+-- @since 4.18.0.0+minimumBy :: Foldable1 t => (a -> a -> Ordering) -> t a -> a+minimumBy cmp = foldl1' min'+ where min' x y = case cmp x y of+ GT -> y+ _ -> x++-------------------------------------------------------------------------------+-- Auxiliary types+-------------------------------------------------------------------------------++-- | Used for default toNonEmpty implementation.+newtype NonEmptyDList a = NEDL { unNEDL :: [a] -> NonEmpty a }++instance Semigroup (NonEmptyDList a) where+ xs <> ys = NEDL (unNEDL xs . NE.toList . unNEDL ys)+ {-# INLINE (<>) #-}++-- | Create dlist with a single element+singleton :: a -> NonEmptyDList a+singleton = NEDL . (:|)++-- | Convert a dlist to a non-empty list+runNonEmptyDList :: NonEmptyDList a -> NonEmpty a+runNonEmptyDList = ($ []) . unNEDL+{-# INLINE runNonEmptyDList #-}++-- | Used for foldrMap1 and foldlMap1 definitions+newtype FromMaybe b = FromMaybe { appFromMaybe :: Maybe b -> b }++instance Semigroup (FromMaybe b) where+ FromMaybe f <> FromMaybe g = FromMaybe (f . Just . g)++-- | Strict maybe, used to implement default foldlMap1' etc.+data SMaybe a = SNothing | SJust !a++-- | Used to implement intercalate1/Map+newtype JoinWith a = JoinWith {joinee :: (a -> a)}++instance Semigroup a => Semigroup (JoinWith a) where+ JoinWith a <> JoinWith b = JoinWith $ \j -> a j <> j <> b j++-------------------------------------------------------------------------------+-- Instances for misc base types+-------------------------------------------------------------------------------++-- | @since 4.18.0.0+instance Foldable1 NonEmpty where+ foldMap1 f (x :| xs) = go (f x) xs where+ go y [] = y+ go y (z : zs) = y <> go (f z) zs++ foldMap1' f (x :| xs) = foldl' (\m y -> m <> f y) (f x) xs++ toNonEmpty = id++ foldrMap1 g f (x :| xs) = go x xs where+ go y [] = g y+ go y (z : zs) = f y (go z zs)++ foldlMap1 g f (x :| xs) = foldl f (g x) xs+ foldlMap1' g f (x :| xs) = let gx = g x in gx `seq` foldl' f gx xs++ head = NE.head+ last = NE.last++{-+-- | @since 4.18.0.0+instance Foldable1 Down where+ foldMap1 = coerce++-- | @since 4.18.0.0+instance Foldable1 Complex where+ foldMap1 f (x :+ y) = f x <> f y++ toNonEmpty (x :+ y) = x :| y : []++-------------------------------------------------------------------------------+-- Instances for tuples+-------------------------------------------------------------------------------++-- 3+ tuples are not Foldable/Traversable++-- | @since 4.18.0.0+instance Foldable1 Solo where+ foldMap1 f (MkSolo y) = f y+ toNonEmpty (MkSolo x) = x :| []+ minimum (MkSolo x) = x+ maximum (MkSolo x) = x+ head (MkSolo x) = x+ last (MkSolo x) = x++-- | @since 4.18.0.0+instance Foldable1 ((,) a) where+ foldMap1 f (_, y) = f y+ toNonEmpty (_, x) = x :| []+ minimum (_, x) = x+ maximum (_, x) = x+ head (_, x) = x+ last (_, x) = x+-}++-------------------------------------------------------------------------------+-- Monoid / Semigroup instances+-------------------------------------------------------------------------------++{-+-- | @since 4.18.0.0+instance Foldable1 Dual where+ foldMap1 = coerce++-- | @since 4.18.0.0+instance Foldable1 Sum where+ foldMap1 = coerce++-- | @since 4.18.0.0+instance Foldable1 Product where+ foldMap1 = coerce++-- | @since 4.18.0.0+instance Foldable1 Min where+ foldMap1 = coerce++-- | @since 4.18.0.0+instance Foldable1 Max where+ foldMap1 = coerce++-- | @since 4.18.0.0+instance Foldable1 First where+ foldMap1 = coerce++-- | @since 4.18.0.0+instance Foldable1 Last where+ foldMap1 = coerce++-- | @since 4.18.0.0+deriving instance (Foldable1 f) => Foldable1 (Mon.Alt f)++-- | @since 4.18.0.0+deriving instance (Foldable1 f) => Foldable1 (Mon.Ap f)+-}++-------------------------------------------------------------------------------+-- Extra instances+-------------------------------------------------------------------------------++{-+-- | @since 4.18.0.0+instance Foldable1 Identity where+ foldMap1 = coerce++ foldrMap1 g _ = coerce g+ foldrMap1' g _ = coerce g+ foldlMap1 g _ = coerce g+ foldlMap1' g _ = coerce g++ toNonEmpty (Identity x) = x :| []++ last = coerce+ head = coerce+ minimum = coerce+ maximum = coerce+-}++-- | It would be enough for either half of a product to be 'Foldable1'.+-- Other could be 'Foldable'.+instance (Foldable1 f, Foldable1 g) => Foldable1 (Functor.Product f g) where+ foldMap1 f (Functor.Pair x y) = foldMap1 f x <> foldMap1 f y+ foldrMap1 g f (Functor.Pair x y) = foldr f (foldrMap1 g f y) x++ head (Functor.Pair x _) = head x+ last (Functor.Pair _ y) = last y++-- | @since 4.18.0.0+instance (Foldable1 f, Foldable1 g) => Foldable1 (Functor.Sum f g) where+ foldMap1 f (Functor.InL x) = foldMap1 f x+ foldMap1 f (Functor.InR y) = foldMap1 f y++ foldrMap1 g f (Functor.InL x) = foldrMap1 g f x+ foldrMap1 g f (Functor.InR y) = foldrMap1 g f y++ toNonEmpty (Functor.InL x) = toNonEmpty x+ toNonEmpty (Functor.InR y) = toNonEmpty y++ head (Functor.InL x) = head x+ head (Functor.InR y) = head y+ last (Functor.InL x) = last x+ last (Functor.InR y) = last y++ minimum (Functor.InL x) = minimum x+ minimum (Functor.InR y) = minimum y+ maximum (Functor.InL x) = maximum x+ maximum (Functor.InR y) = maximum y++-- | @since 4.18.0.0+instance (Foldable1 f, Foldable1 g) => Foldable1 (Compose f g) where+ foldMap1 f = foldMap1 (foldMap1 f) . getCompose++ foldrMap1 f g = foldrMap1 (foldrMap1 f g) (\xs x -> foldr g x xs) . getCompose++ head = head . head . getCompose+ last = last . last . getCompose
lib/Data/Functor.hs view
@@ -1,4 +1,11 @@-module Data.Functor(module Data.Functor) where+module Data.Functor(+ Functor(..),+ ($>),+ (<$>),+ (<&>),+ unzip,+ void,+ ) where import Prelude() -- do not import Prelude import Primitives -- for fixity import Data.Function@@ -11,6 +18,18 @@ infixl 4 <$> (<$>) :: forall f a b . Functor f => (a -> b) -> f a -> f b (<$>) = fmap++infixl 1 <&>+(<&>) :: Functor f => f a -> (a -> b) -> f b+(<&>) = flip (<$>)++infixl 4 $>+($>) :: Functor f => f a -> b -> f b+($>) = flip (<$)++unzip :: Functor f => f (a, b) -> (f a, f b)+unzip xs = ( (\(a,_)->a) <$> xs,+ (\(_,b)->b) <$> xs ) void :: forall f a . Functor f => f a -> f () void = fmap (const ())
+ lib/Data/Functor/Classes.hs view
@@ -0,0 +1,559 @@+module Data.Functor.Classes (+ -- * Liftings of Prelude classes+ -- ** For unary constructors+ Eq1(..), eq1,+ Ord1(..), compare1,+ Read1(..), readsPrec1, readPrec1,+ liftReadListDefault, liftReadListPrecDefault,+ Show1(..), showsPrec1,+ -- ** For binary constructors+ Eq2(..), eq2,+ Ord2(..), compare2,+ Read2(..), readsPrec2, readPrec2,+ liftReadList2Default, liftReadListPrec2Default,+ Show2(..), showsPrec2,+ -- * Helper functions+ readsData, readData,+ readsUnaryWith, readUnaryWith,+ readsBinaryWith, readBinaryWith,+ showsUnaryWith,+ showsBinaryWith,+ ) where++import Control.Applicative (Alternative((<|>)), Const(Const))+import Data.Functor.Identity (Identity(Identity))+import Data.Proxy (Proxy(Proxy))+import Data.List.NonEmpty (NonEmpty(..))+--import Data.Ord (Down(Down))+import Data.Complex (Complex((:+)))+import Data.Tuple (Solo (..))++import Text.Read+import Text.Read.Internal+import Text.Show (showListWith)++class Eq1 f where+ liftEq :: (a -> b -> Bool) -> f a -> f b -> Bool++eq1 :: (Eq1 f, Eq a) => f a -> f a -> Bool+eq1 = liftEq (==)++class (Eq1 f) => Ord1 f where+ liftCompare :: (a -> b -> Ordering) -> f a -> f b -> Ordering++compare1 :: (Ord1 f, Ord a) => f a -> f a -> Ordering+compare1 = liftCompare compare++class Read1 f where+ liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (f a)+ liftReadsPrec rp rl = readPrec_to_S $+ liftReadPrec (readS_to_Prec rp) (readS_to_Prec (const rl))++ liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [f a]+ liftReadList rp rl = readPrec_to_S+ (list $ liftReadPrec (readS_to_Prec rp) (readS_to_Prec (const rl))) 0++ liftReadPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec (f a)+ liftReadPrec rp rl = readS_to_Prec $+ liftReadsPrec (readPrec_to_S rp) (readPrec_to_S rl 0)++ liftReadListPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec [f a]+ liftReadListPrec rp rl = readS_to_Prec $ \_ ->+ liftReadList (readPrec_to_S rp) (readPrec_to_S rl 0)++readsPrec1 :: (Read1 f, Read a) => Int -> ReadS (f a)+readsPrec1 = liftReadsPrec readsPrec readList++readPrec1 :: (Read1 f, Read a) => ReadPrec (f a)+readPrec1 = liftReadPrec readPrec readListPrec++liftReadListDefault :: Read1 f => (Int -> ReadS a) -> ReadS [a] -> ReadS [f a]+liftReadListDefault rp rl = readPrec_to_S+ (liftReadListPrec (readS_to_Prec rp) (readS_to_Prec (const rl))) 0++liftReadListPrecDefault :: Read1 f => ReadPrec a -> ReadPrec [a]+ -> ReadPrec [f a]+liftReadListPrecDefault rp rl = list (liftReadPrec rp rl)++class Show1 f where+ liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) ->+ Int -> f a -> ShowS+ liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) ->+ [f a] -> ShowS+ liftShowList sp sl = showListWith (liftShowsPrec sp sl 0)++showsPrec1 :: (Show1 f, Show a) => Int -> f a -> ShowS+showsPrec1 = liftShowsPrec showsPrec showList++class Eq2 f where+ liftEq2 :: (a -> b -> Bool) -> (c -> d -> Bool) -> f a c -> f b d -> Bool++eq2 :: (Eq2 f, Eq a, Eq b) => f a b -> f a b -> Bool+eq2 = liftEq2 (==) (==)++class (Eq2 f) => Ord2 f where+ liftCompare2 :: (a -> b -> Ordering) -> (c -> d -> Ordering) ->+ f a c -> f b d -> Ordering++compare2 :: (Ord2 f, Ord a, Ord b) => f a b -> f a b -> Ordering+compare2 = liftCompare2 compare compare++class Read2 f where+ liftReadsPrec2 :: (Int -> ReadS a) -> ReadS [a] ->+ (Int -> ReadS b) -> ReadS [b] -> Int -> ReadS (f a b)+ liftReadsPrec2 rp1 rl1 rp2 rl2 = readPrec_to_S $+ liftReadPrec2 (readS_to_Prec rp1) (readS_to_Prec (const rl1))+ (readS_to_Prec rp2) (readS_to_Prec (const rl2))++ liftReadList2 :: (Int -> ReadS a) -> ReadS [a] ->+ (Int -> ReadS b) -> ReadS [b] -> ReadS [f a b]+ liftReadList2 rp1 rl1 rp2 rl2 = readPrec_to_S+ (list $ liftReadPrec2 (readS_to_Prec rp1) (readS_to_Prec (const rl1))+ (readS_to_Prec rp2) (readS_to_Prec (const rl2))) 0++ liftReadPrec2 :: ReadPrec a -> ReadPrec [a] ->+ ReadPrec b -> ReadPrec [b] -> ReadPrec (f a b)+ liftReadPrec2 rp1 rl1 rp2 rl2 = readS_to_Prec $+ liftReadsPrec2 (readPrec_to_S rp1) (readPrec_to_S rl1 0)+ (readPrec_to_S rp2) (readPrec_to_S rl2 0)++ liftReadListPrec2 :: ReadPrec a -> ReadPrec [a] ->+ ReadPrec b -> ReadPrec [b] -> ReadPrec [f a b]+ liftReadListPrec2 rp1 rl1 rp2 rl2 = readS_to_Prec $ \_ ->+ liftReadList2 (readPrec_to_S rp1) (readPrec_to_S rl1 0)+ (readPrec_to_S rp2) (readPrec_to_S rl2 0)++readsPrec2 :: (Read2 f, Read a, Read b) => Int -> ReadS (f a b)+readsPrec2 = liftReadsPrec2 readsPrec readList readsPrec readList++readPrec2 :: (Read2 f, Read a, Read b) => ReadPrec (f a b)+readPrec2 = liftReadPrec2 readPrec readListPrec readPrec readListPrec++liftReadList2Default :: Read2 f => (Int -> ReadS a) -> ReadS [a] ->+ (Int -> ReadS b) -> ReadS [b] ->ReadS [f a b]+liftReadList2Default rp1 rl1 rp2 rl2 = readPrec_to_S+ (liftReadListPrec2 (readS_to_Prec rp1) (readS_to_Prec (const rl1))+ (readS_to_Prec rp2) (readS_to_Prec (const rl2))) 0++liftReadListPrec2Default :: Read2 f => ReadPrec a -> ReadPrec [a] ->+ ReadPrec b -> ReadPrec [b] -> ReadPrec [f a b]+liftReadListPrec2Default rp1 rl1 rp2 rl2 = list (liftReadPrec2 rp1 rl1 rp2 rl2)++class Show2 f where+ liftShowsPrec2 :: (Int -> a -> ShowS) -> ([a] -> ShowS) ->+ (Int -> b -> ShowS) -> ([b] -> ShowS) -> Int -> f a b -> ShowS++ liftShowList2 :: (Int -> a -> ShowS) -> ([a] -> ShowS) ->+ (Int -> b -> ShowS) -> ([b] -> ShowS) -> [f a b] -> ShowS+ liftShowList2 sp1 sl1 sp2 sl2 =+ showListWith (liftShowsPrec2 sp1 sl1 sp2 sl2 0)++showsPrec2 :: (Show2 f, Show a, Show b) => Int -> f a b -> ShowS+showsPrec2 = liftShowsPrec2 showsPrec showList showsPrec showList++instance Eq1 Maybe where+ liftEq _ Nothing Nothing = True+ liftEq _ Nothing (Just _) = False+ liftEq _ (Just _) Nothing = False+ liftEq eq (Just x) (Just y) = eq x y++instance Ord1 Maybe where+ liftCompare _ Nothing Nothing = EQ+ liftCompare _ Nothing (Just _) = LT+ liftCompare _ (Just _) Nothing = GT+ liftCompare comp (Just x) (Just y) = comp x y++instance Read1 Maybe where+ liftReadPrec rp _ =+ parens (expectP (Ident "Nothing") *> pure Nothing)+ <|>+ readData (readUnaryWith rp "Just" Just)++ liftReadListPrec = liftReadListPrecDefault+ liftReadList = liftReadListDefault++instance Show1 Maybe where+ liftShowsPrec _ _ _ Nothing = showString "Nothing"+ liftShowsPrec sp _ d (Just x) = showsUnaryWith sp "Just" d x++instance Eq1 [] where+ liftEq _ [] [] = True+ liftEq _ [] (_:_) = False+ liftEq _ (_:_) [] = False+ liftEq eq (x:xs) (y:ys) = eq x y && liftEq eq xs ys++instance Ord1 [] where+ liftCompare _ [] [] = EQ+ liftCompare _ [] (_:_) = LT+ liftCompare _ (_:_) [] = GT+ liftCompare comp (x:xs) (y:ys) = comp x y `mappend` liftCompare comp xs ys++instance Read1 [] where+ liftReadPrec _ rl = rl+ liftReadListPrec = liftReadListPrecDefault+ liftReadList = liftReadListDefault++instance Show1 [] where+ liftShowsPrec _ sl _ = sl++instance Eq1 NonEmpty where+ liftEq eq (a :| as) (b :| bs) = eq a b && liftEq eq as bs++instance Ord1 NonEmpty where+ liftCompare cmp (a :| as) (b :| bs) = cmp a b `mappend` liftCompare cmp as bs++instance Read1 NonEmpty where+ liftReadsPrec rdP rdL p s = readParen (p > 5) (\s' -> do+ (a, s'') <- rdP 6 s'+ (":|", s''') <- lex s''+ (as, s'''') <- rdL s'''+ return (a :| as, s'''')) s++instance Show1 NonEmpty where+ liftShowsPrec shwP shwL p (a :| as) = showParen (p > 5) $+ shwP 6 a . showString " :| " . shwL as++instance Eq2 (,) where+ liftEq2 e1 e2 (x1, y1) (x2, y2) = e1 x1 x2 && e2 y1 y2++instance Ord2 (,) where+ liftCompare2 comp1 comp2 (x1, y1) (x2, y2) =+ comp1 x1 x2 `mappend` comp2 y1 y2++instance Read2 (,) where+ liftReadPrec2 rp1 _ rp2 _ = parens $ paren $ do+ x <- rp1+ expectP (Punc ",")+ y <- rp2+ return (x,y)++ liftReadListPrec2 = liftReadListPrec2Default+ liftReadList2 = liftReadList2Default++instance Show2 (,) where+ liftShowsPrec2 sp1 _ sp2 _ _ (x, y) =+ showChar '(' . sp1 0 x . showChar ',' . sp2 0 y . showChar ')'++instance Eq1 Solo where+ liftEq eq (MkSolo a) (MkSolo b) = a `eq` b++instance (Eq a) => Eq1 ((,) a) where+ liftEq = liftEq2 (==)++instance Ord1 Solo where+ liftCompare cmp (MkSolo a) (MkSolo b) = cmp a b++instance (Ord a) => Ord1 ((,) a) where+ liftCompare = liftCompare2 compare++instance Read1 Solo where+ liftReadPrec rp _ = readData (readUnaryWith rp "Solo" MkSolo)++ liftReadListPrec = liftReadListPrecDefault+ liftReadList = liftReadListDefault++instance (Read a) => Read1 ((,) a) where+ liftReadPrec = liftReadPrec2 readPrec readListPrec++ liftReadListPrec = liftReadListPrecDefault+ liftReadList = liftReadListDefault++instance Show1 Solo where+ liftShowsPrec sp _ d (MkSolo x) = showsUnaryWith sp "MkSolo" d x++instance (Show a) => Show1 ((,) a) where+ liftShowsPrec = liftShowsPrec2 showsPrec showList++instance Eq a => Eq2 ((,,) a) where+ liftEq2 e1 e2 (u1, x1, y1) (v1, x2, y2) =+ u1 == v1 &&+ e1 x1 x2 && e2 y1 y2++instance Ord a => Ord2 ((,,) a) where+ liftCompare2 comp1 comp2 (u1, x1, y1) (v1, x2, y2) =+ compare u1 v1 `mappend`+ comp1 x1 x2 `mappend` comp2 y1 y2++instance Read a => Read2 ((,,) a) where+ liftReadPrec2 rp1 _ rp2 _ = parens $ paren $ do+ x1 <- readPrec+ expectP (Punc ",")+ y1 <- rp1+ expectP (Punc ",")+ y2 <- rp2+ return (x1,y1,y2)++ liftReadListPrec2 = liftReadListPrec2Default+ liftReadList2 = liftReadList2Default++instance Show a => Show2 ((,,) a) where+ liftShowsPrec2 sp1 _ sp2 _ _ (x1,y1,y2)+ = showChar '(' . showsPrec 0 x1+ . showChar ',' . sp1 0 y1+ . showChar ',' . sp2 0 y2+ . showChar ')'++instance (Eq a, Eq b) => Eq1 ((,,) a b) where+ liftEq = liftEq2 (==)++instance (Ord a, Ord b) => Ord1 ((,,) a b) where+ liftCompare = liftCompare2 compare++instance (Read a, Read b) => Read1 ((,,) a b) where+ liftReadPrec = liftReadPrec2 readPrec readListPrec++ liftReadListPrec = liftReadListPrecDefault+ liftReadList = liftReadListDefault++instance (Show a, Show b) => Show1 ((,,) a b) where+ liftShowsPrec = liftShowsPrec2 showsPrec showList++instance (Eq a, Eq b) => Eq2 ((,,,) a b) where+ liftEq2 e1 e2 (u1, u2, x1, y1) (v1, v2, x2, y2) =+ u1 == v1 &&+ u2 == v2 &&+ e1 x1 x2 && e2 y1 y2++instance (Ord a, Ord b) => Ord2 ((,,,) a b) where+ liftCompare2 comp1 comp2 (u1, u2, x1, y1) (v1, v2, x2, y2) =+ compare u1 v1 `mappend`+ compare u2 v2 `mappend`+ comp1 x1 x2 `mappend` comp2 y1 y2++instance (Read a, Read b) => Read2 ((,,,) a b) where+ liftReadPrec2 rp1 _ rp2 _ = parens $ paren $ do+ x1 <- readPrec+ expectP (Punc ",")+ x2 <- readPrec+ expectP (Punc ",")+ y1 <- rp1+ expectP (Punc ",")+ y2 <- rp2+ return (x1,x2,y1,y2)++ liftReadListPrec2 = liftReadListPrec2Default+ liftReadList2 = liftReadList2Default++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 ',' . sp1 0 y1+ . showChar ',' . sp2 0 y2+ . showChar ')'++instance (Eq a, Eq b, Eq c) => Eq1 ((,,,) a b c) where+ liftEq = liftEq2 (==)++instance (Ord a, Ord b, Ord c) => Ord1 ((,,,) a b c) where+ liftCompare = liftCompare2 compare++instance (Read a, Read b, Read c) => Read1 ((,,,) a b c) where+ liftReadPrec = liftReadPrec2 readPrec readListPrec++ liftReadListPrec = liftReadListPrecDefault+ liftReadList = liftReadListDefault++instance (Show a, Show b, Show c) => Show1 ((,,,) a b c) where+ liftShowsPrec = liftShowsPrec2 showsPrec showList++{-+instance (Generic1 f, Eq1 (Rep1 f)) => Eq1 (Generically1 f) where+ liftEq :: (a1 -> a2 -> Bool) -> (Generically1 f a1 -> Generically1 f a2 -> Bool)+ liftEq (===) (Generically1 as1) (Generically1 as2) = liftEq (===) (from1 as1) (from1 as2)++instance (Generic1 f, Ord1 (Rep1 f)) => Ord1 (Generically1 f) where+ liftCompare :: (a1 -> a2 -> Ordering) -> (Generically1 f a1 -> Generically1 f a2 -> Ordering)+ liftCompare cmp (Generically1 as1) (Generically1 as2) = liftCompare cmp (from1 as1) (from1 as2)+-}++instance Eq2 Either where+ liftEq2 e1 _ (Left x) (Left y) = e1 x y+ liftEq2 _ _ (Left _) (Right _) = False+ liftEq2 _ _ (Right _) (Left _) = False+ liftEq2 _ e2 (Right x) (Right y) = e2 x y++instance Ord2 Either where+ liftCompare2 comp1 _ (Left x) (Left y) = comp1 x y+ liftCompare2 _ _ (Left _) (Right _) = LT+ liftCompare2 _ _ (Right _) (Left _) = GT+ liftCompare2 _ comp2 (Right x) (Right y) = comp2 x y++instance Read2 Either where+ liftReadPrec2 rp1 _ rp2 _ = readData $+ readUnaryWith rp1 "Left" Left <|>+ readUnaryWith rp2 "Right" Right++ liftReadListPrec2 = liftReadListPrec2Default+ liftReadList2 = liftReadList2Default++instance Show2 Either where+ liftShowsPrec2 sp1 _ _ _ d (Left x) = showsUnaryWith sp1 "Left" d x+ liftShowsPrec2 _ _ sp2 _ d (Right x) = showsUnaryWith sp2 "Right" d x++instance (Eq a) => Eq1 (Either a) where+ liftEq = liftEq2 (==)++instance (Ord a) => Ord1 (Either a) where+ liftCompare = liftCompare2 compare++instance (Read a) => Read1 (Either a) where+ liftReadPrec = liftReadPrec2 readPrec readListPrec++ liftReadListPrec = liftReadListPrecDefault+ liftReadList = liftReadListDefault++instance (Show a) => Show1 (Either a) where+ liftShowsPrec = liftShowsPrec2 showsPrec showList++instance Eq1 Identity where+ liftEq eq (Identity x) (Identity y) = eq x y++instance Ord1 Identity where+ liftCompare comp (Identity x) (Identity y) = comp x y++{-+instance Read1 Identity where+ liftReadPrec rp _ = readData $+ readUnaryWith rp "Identity" Identity++ liftReadListPrec = liftReadListPrecDefault+ liftReadList = liftReadListDefault+-}++instance Show1 Identity where+ liftShowsPrec sp _ d (Identity x) = showsUnaryWith sp "Identity" d x++instance Eq2 Const where+ liftEq2 eq _ (Const x) (Const y) = eq x y++instance Ord2 Const where+ liftCompare2 comp _ (Const x) (Const y) = comp x y++{-+instance Read2 Const where+ liftReadPrec2 rp _ _ _ = readData $+ readUnaryWith rp "Const" Const++ liftReadListPrec2 = liftReadListPrec2Default+ liftReadList2 = liftReadList2Default+-}++instance Show2 Const where+ liftShowsPrec2 sp _ _ _ d (Const x) = showsUnaryWith sp "Const" d x++instance (Eq a) => Eq1 (Const a) where+ liftEq = liftEq2 (==)++instance (Ord a) => Ord1 (Const a) where+ liftCompare = liftCompare2 compare++{-+instance (Read a) => Read1 (Const a) where+ liftReadPrec = liftReadPrec2 readPrec readListPrec++ liftReadListPrec = liftReadListPrecDefault+ liftReadList = liftReadListDefault+-}++instance (Show a) => Show1 (Const a) where+ liftShowsPrec = liftShowsPrec2 showsPrec showList++instance Eq1 Proxy where+ liftEq _ _ _ = True++instance Ord1 Proxy where+ liftCompare _ _ _ = EQ++instance Show1 Proxy where+ liftShowsPrec _ _ _ _ = showString "Proxy"++{-+instance Read1 Proxy where+ liftReadPrec _ _ = parens (expectP (Ident "Proxy") *> pure Proxy)++ liftReadListPrec = liftReadListPrecDefault+ liftReadList = liftReadListDefault+-}++{-+instance Eq1 Down where+ liftEq eq (Down x) (Down y) = eq x y++instance Ord1 Down where+ liftCompare comp (Down x) (Down y) = case comp x y of+ LT -> GT+ EQ -> EQ+ GT -> LT++{-+instance Read1 Down where+ liftReadsPrec rp _ = readsData $+ readsUnaryWith rp "Down" Down+-}++instance Show1 Down where+ liftShowsPrec sp _ d (Down x) = showsUnaryWith sp "Down" d x+-}++instance Eq1 Complex where+ liftEq eq (x :+ y) (u :+ v) = eq x u && eq y v++{-+instance Read1 Complex where+ liftReadPrec rp _ = parens $ prec complexPrec $ do+ x <- step rp+ expectP (Symbol ":+")+ y <- step rp+ return (x :+ y)+ where+ complexPrec = 6++ liftReadListPrec = liftReadListPrecDefault+ liftReadList = liftReadListDefault+-}++instance Show1 Complex where+ liftShowsPrec sp _ d (x :+ y) = showParen (d > complexPrec) $+ sp (complexPrec+1) x . showString " :+ " . sp (complexPrec+1) y+ where+ complexPrec = 6++readsData :: (String -> ReadS a) -> Int -> ReadS a+readsData reader d =+ readParen (d > 10) $ \ r -> [res | (kw,s) <- lex r, res <- reader kw s]++readData :: ReadPrec a -> ReadPrec a+readData reader = parens $ prec 10 reader++readsUnaryWith :: (Int -> ReadS a) -> String -> (a -> t) -> String -> ReadS t+readsUnaryWith rp name cons kw s =+ [(cons x,t) | kw == name, (x,t) <- rp 11 s]++readUnaryWith :: ReadPrec a -> String -> (a -> t) -> ReadPrec t+readUnaryWith rp name cons = do+ expectP $ Ident name+ x <- step rp+ return $ cons x++readsBinaryWith :: (Int -> ReadS a) -> (Int -> ReadS b) ->+ String -> (a -> b -> t) -> String -> ReadS t+readsBinaryWith rp1 rp2 name cons kw s =+ [(cons x y,u) | kw == name, (x,t) <- rp1 11 s, (y,u) <- rp2 11 t]++readBinaryWith :: ReadPrec a -> ReadPrec b ->+ String -> (a -> b -> t) -> ReadPrec t+readBinaryWith rp1 rp2 name cons = do+ expectP $ Ident name+ x <- step rp1+ y <- step rp2+ return $ cons x y++showsUnaryWith :: (Int -> a -> ShowS) -> String -> Int -> a -> ShowS+showsUnaryWith sp name d x = showParen (d > 10) $+ showString name . showChar ' ' . sp 11 x++showsBinaryWith :: (Int -> a -> ShowS) -> (Int -> b -> ShowS) ->+ String -> Int -> a -> b -> ShowS+showsBinaryWith sp1 sp2 name d x y = showParen (d > 10) $+ showString name . showChar ' ' . sp1 11 x . showChar ' ' . sp2 11 y
+ lib/Data/Functor/Compose.hs view
@@ -0,0 +1,170 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE StandaloneDeriving #-}++-----------------------------------------------------------------------------+-- |+-- Module : Data.Functor.Compose+-- Copyright : (c) Ross Paterson 2010+-- License : BSD-style (see the file LICENSE)+--+-- Maintainer : libraries@haskell.org+-- Stability : stable+-- Portability : portable+--+-- Composition of functors.+--+-- @since 4.9.0.0+-----------------------------------------------------------------------------++module Data.Functor.Compose (+ Compose(..),+ ) where+import Prelude hiding(foldr, foldl, null, length, elem, maximum, minimum, sum, product)+import Control.Applicative+--import Data.Coerce (coerce)+import Data.Data (Data)+import Data.Foldable (Foldable(..))+import Data.Functor.Classes+import Data.Monoid.Internal+import Data.Traversable+--import Data.Type.Equality (TestEquality(..), (:~:)(..))+--import GHC.Generics (Generic, Generic1)+import Text.Read.Internal(Read(..), ReadPrec, readListDefault, readListPrecDefault)++infixr 9 `Compose`++newtype Compose f g a = Compose { getCompose :: f (g a) }+{-+ deriving ( Data -- ^ @since 4.9.0.0+ , Generic -- ^ @since 4.9.0.0+ , Generic1 -- ^ @since 4.9.0.0+ , Semigroup -- ^ @since 4.16.0.0+ , Monoid -- ^ @since 4.16.0.0+ )++deriving instance Eq (f (g a)) => Eq (Compose f g a)+deriving instance Ord (f (g a)) => Ord (Compose f g a)++instance Read (f (g a)) => Read (Compose f g a) where+ readPrec = liftReadPrecCompose readPrec++ readListPrec = readListPrecDefault+ readList = readListDefault+-}+instance Eq (f (g a)) => Eq (Compose f g a) where+ Compose x == Compose y = x == y++instance Ord (f (g a)) => Ord (Compose f g a) where+ Compose x `compare` Compose y = x `compare` y++instance Show (f (g a)) => Show (Compose f g a) where+ showsPrec = liftShowsPrecCompose showsPrec++instance (Eq1 f, Eq1 g) => Eq1 (Compose f g) where+ liftEq eq (Compose x) (Compose y) = liftEq (liftEq eq) x y++instance (Ord1 f, Ord1 g) => Ord1 (Compose f g) where+ liftCompare comp (Compose x) (Compose y) =+ liftCompare (liftCompare comp) x y++{-+instance (Read1 f, Read1 g) => Read1 (Compose f g) where+ liftReadPrec rp rl =+ liftReadPrecCompose (liftReadPrec rp' rl')+ where+ rp' = liftReadPrec rp rl+ rl' = liftReadListPrec rp rl++ liftReadListPrec = liftReadListPrecDefault+ liftReadList = liftReadListDefault+-}++instance (Show1 f, Show1 g) => Show1 (Compose f g) where+ liftShowsPrec sp sl =+ liftShowsPrecCompose (liftShowsPrec sp' sl')+ where+ sp' = liftShowsPrec sp sl+ sl' = liftShowList sp sl++{-+-- The workhorse for Compose's Read and Read1 instances.+liftReadPrecCompose :: ReadPrec (f (g a)) -> ReadPrec (Compose f g a)+liftReadPrecCompose rp = readData $ readUnaryWith rp "Compose" Compose+-}++-- The workhorse for Compose's Show and Show1 instances.+liftShowsPrecCompose :: (Int -> f (g a) -> ShowS) -> Int -> Compose f g a -> ShowS+liftShowsPrecCompose sp d (Compose x) = showsUnaryWith sp "Compose" d x++instance (Functor f, Functor g) => Functor (Compose f g) where+ fmap f (Compose x) = Compose (fmap (fmap f) x)+ a <$ (Compose x) = Compose (fmap (a <$) x)++instance (Foldable f, Foldable g) => Foldable (Compose f g) where+ fold (Compose t) = foldMap fold t+ foldMap f (Compose t) = foldMap (foldMap f) t+ foldMap' f (Compose t) = foldMap' (foldMap' f) t+ foldr f b (Compose fga) = foldr (\ga acc -> foldr f acc ga) b fga+ foldr' f b (Compose fga) = foldr' (\ga acc -> foldr' f acc ga) b fga+ foldl f b (Compose fga) = foldl (\acc ga -> foldl f acc ga) b fga+ foldl' f b (Compose fga) = foldl' (\acc ga -> foldl' f acc ga) b fga++ null (Compose t) = null t || getAll (foldMap (All . null) t)+ length (Compose t) = getSum (foldMap' (Sum . length) t)+ elem x (Compose t) = getAny (foldMap (Any . elem x) t)++ minimum (Compose fga) = minimum $ map minimum $ filter (not . null) $ toList fga+ maximum (Compose fga) = maximum $ map maximum $ filter (not . null) $ toList fga++ sum (Compose t) = getSum (foldMap' (Sum . sum) t)+ product (Compose t) = getProduct (foldMap' (Product . product) t)++instance (Traversable f, Traversable g) => Traversable (Compose f g) where+ traverse f (Compose t) = Compose <$> traverse (traverse f) t++instance (Applicative f, Applicative g) => Applicative (Compose f g) where+ pure x = Compose (pure (pure x))+ Compose f <*> Compose x = Compose (liftA2 (<*>) f x)+ liftA2 f (Compose x) (Compose y) =+ Compose (liftA2 (liftA2 f) x y)++-- | @since 4.9.0.0+instance (Alternative f, Applicative g) => Alternative (Compose f g) where+ empty = Compose empty+ Compose x <|> Compose y = Compose (x <|> y)++{-+-- | The deduction (via generativity) that if @g x :~: g y@ then @x :~: y@.+--+-- @since 4.14.0.0+instance (TestEquality f) => TestEquality (Compose f g) where+ testEquality (Compose x) (Compose y) =+ case testEquality x y of -- :: Maybe (g x :~: g y)+ Just Refl -> Just Refl -- :: Maybe (x :~: y)+ Nothing -> Nothing++-- | @since 4.19.0.0+deriving instance Enum (f (g a)) => Enum (Compose f g a)+-- | @since 4.19.0.0+deriving instance Bounded (f (g a)) => Bounded (Compose f g a)+-- | @since 4.19.0.0+deriving instance Num (f (g a)) => Num (Compose f g a)+-- | @since 4.19.0.0+deriving instance Real (f (g a)) => Real (Compose f g a)+-- | @since 4.19.0.0+deriving instance Integral (f (g a)) => Integral (Compose f g a)+-- | @since 4.20.0.0+deriving instance Fractional (f (g a)) => Fractional (Compose f g a)+-- | @since 4.20.0.0+deriving instance RealFrac (f (g a)) => RealFrac (Compose f g a)+-- | @since 4.20.0.0+deriving instance Floating (f (g a)) => Floating (Compose f g a)+-- | @since 4.20.0.0+deriving instance RealFloat (f (g a)) => RealFloat (Compose f g a)+-}
lib/Data/Functor/Const.hs view
@@ -9,17 +9,11 @@ import Data.Eq import Data.Function import Data.Functor+import Data.Functor.Const_Type import Data.Int-import Data.Monoid+import Data.Monoid.Internal import Data.Ord import Text.Show--type Const :: forall k . Type -> k -> Type-newtype Const a b = Const a- deriving (Eq, Ord, Show)--getConst :: forall a b . Const a b -> a-getConst (Const a) = a instance forall a . Functor (Const a) where fmap _ (Const a) = Const a
+ lib/Data/Functor/Const_Type.hs view
@@ -0,0 +1,19 @@+-- 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 Primitives+import Data.Bool+import Data.Eq+import Data.Function+import Data.Functor+import Data.Int+import Data.Ord+import Text.Show++type Const :: forall k . Type -> k -> Type+newtype Const a b = Const a+ deriving (Eq, Ord, Show)++getConst :: forall a b . Const a b -> a+getConst (Const a) = a
+ lib/Data/Functor/Contravariant.hs view
@@ -0,0 +1,383 @@+{-# LANGUAGE DerivingVia #-}+{-# LANGUAGE EmptyCase #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE InstanceSigs #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE TypeOperators #-}++-----------------------------------------------------------------------------+-- |+-- Module : Data.Functor.Contravariant+-- Copyright : (C) 2007-2015 Edward Kmett+-- License : BSD-style (see the file LICENSE)+--+-- Maintainer : libraries@haskell.org+-- Stability : provisional+-- Portability : portable+--+-- 'Contravariant' functors, sometimes referred to colloquially as @Cofunctor@,+-- even though the dual of a 'Functor' is just a 'Functor'. As with 'Functor'+-- the definition of 'Contravariant' for a given ADT is unambiguous.+--+-- @since 4.12.0.0+----------------------------------------------------------------------------++module Data.Functor.Contravariant (+ -- * Contravariant Functors+ Contravariant(..)+ , phantom++ -- * Operators+ , (>$<), (>$$<), ($<)++{-+ -- * Predicates+ , Predicate(..)++ -- * Comparisons+ , Comparison(..)+ , defaultComparison++ -- * Equivalence Relations+ , Equivalence(..)+ , defaultEquivalence+ , comparisonEquivalence++ -- * Dual arrows+ , Op(..)+-}+ ) where++import Control.Applicative+import Control.Category+import Data.Function (on)++import Data.Functor.Product+import Data.Functor.Sum+import Data.Functor.Compose++import Data.Monoid.Internal (Alt(..), All(..))+import Data.Proxy++import Prelude hiding ((.), id)++-- | The class of contravariant functors.+--+-- Whereas in Haskell, one can think of a 'Functor' as containing or producing+-- values, a contravariant functor is a functor that can be thought of as+-- /consuming/ values.+--+-- As an example, consider the type of predicate functions @a -> Bool@. One+-- such predicate might be @negative x = x < 0@, which+-- classifies integers as to whether they are negative. However, given this+-- predicate, we can re-use it in other situations, providing we have a way to+-- map values /to/ integers. For instance, we can use the @negative@ predicate+-- on a person's bank balance to work out if they are currently overdrawn:+--+-- @+-- newtype Predicate a = Predicate { getPredicate :: a -> Bool }+--+-- instance Contravariant Predicate where+-- contramap :: (a' -> a) -> (Predicate a -> Predicate a')+-- contramap f (Predicate p) = Predicate (p . f)+-- | `- First, map the input...+-- `----- then apply the predicate.+--+-- overdrawn :: Predicate Person+-- overdrawn = contramap personBankBalance negative+-- @+--+-- Any instance should be subject to the following laws:+--+-- [Identity] @'contramap' 'id' = 'id'@+-- [Composition] @'contramap' (g . f) = 'contramap' f . 'contramap' g@+--+-- Note, that the second law follows from the free theorem of the type of+-- 'contramap' and the first law, so you need only check that the former+-- condition holds.++class Contravariant f where+ contramap :: (a' -> a) -> (f a -> f a')++ -- | Replace all locations in the output with the same value.+ -- The default definition is @'contramap' . 'const'@, but this may be+ -- overridden with a more efficient version.+ (>$) :: b -> f b -> f a+ (>$) = contramap . const++-- | If @f@ is both 'Functor' and 'Contravariant' then by the time you factor+-- in the laws of each of those classes, it can't actually use its argument in+-- any meaningful capacity.+--+-- This method is surprisingly useful. Where both instances exist and are+-- lawful we have the following laws:+--+-- @+-- 'fmap' f ≡ 'phantom'+-- 'contramap' f ≡ 'phantom'+-- @+phantom :: (Functor f, Contravariant f) => f a -> f b+phantom x = () <$ x $< ()++infixl 4 >$, $<, >$<, >$$<++-- | This is '>$' with its arguments flipped.+($<) :: Contravariant f => f b -> b -> f a+($<) = flip (>$)++-- | This is an infix alias for 'contramap'.+(>$<) :: Contravariant f => (a -> b) -> (f b -> f a)+(>$<) = contramap++-- | This is an infix version of 'contramap' with the arguments flipped.+(>$$<) :: Contravariant f => f b -> (a -> b) -> f a+(>$$<) = flip contramap++{-+deriving newtype instance Contravariant f => Contravariant (Alt f)+deriving newtype instance Contravariant f => Contravariant (Rec1 f)+deriving newtype instance Contravariant f => Contravariant (M1 i c f)++instance Contravariant V1 where+ contramap :: (a' -> a) -> (V1 a -> V1 a')+ contramap _ x = case x of++instance Contravariant U1 where+ contramap :: (a' -> a) -> (U1 a -> U1 a')+ contramap _ _ = U1++instance Contravariant (K1 i c) where+ contramap :: (a' -> a) -> (K1 i c a -> K1 i c a')+ contramap _ (K1 c) = K1 c++instance (Contravariant f, Contravariant g) => Contravariant (f :*: g) where+ contramap :: (a' -> a) -> ((f :*: g) a -> (f :*: g) a')+ contramap f (xs :*: ys) = contramap f xs :*: contramap f ys++instance (Functor f, Contravariant g) => Contravariant (f :.: g) where+ contramap :: (a' -> a) -> ((f :.: g) a -> (f :.: g) a')+ contramap f (Comp1 fg) = Comp1 (fmap (contramap f) fg)++instance (Contravariant f, Contravariant g) => Contravariant (f :+: g) where+ contramap :: (a' -> a) -> ((f :+: g) a -> (f :+: g) a')+ contramap f (L1 xs) = L1 (contramap f xs)+ contramap f (R1 ys) = R1 (contramap f ys)+-}++instance (Contravariant f, Contravariant g) => Contravariant (Sum f g) where+-- contramap :: (a' -> a) -> (Sum f g a -> Sum f g a')+ contramap f (InL xs) = InL (contramap f xs)+ contramap f (InR ys) = InR (contramap f ys)++instance (Contravariant f, Contravariant g)+ => Contravariant (Product f g) where+-- contramap :: (a' -> a) -> (Product f g a -> Product f g a')+ contramap f (Pair a b) = Pair (contramap f a) (contramap f b)++instance Contravariant (Const a) where+-- contramap :: (b' -> b) -> (Const a b -> Const a b')+ contramap _ (Const a) = Const a++instance (Functor f, Contravariant g) => Contravariant (Compose f g) where+-- contramap :: (a' -> a) -> (Compose f g a -> Compose f g a')+ contramap f (Compose fga) = Compose (fmap (contramap f) fga)++instance Contravariant Proxy where+-- contramap :: (a' -> a) -> (Proxy a -> Proxy a')+ contramap _ _ = Proxy++{-+newtype Predicate a = Predicate { getPredicate :: a -> Bool }+ deriving+ ( -- | @('<>')@ on predicates uses logical conjunction @('&&')@ on+ -- the results. Without newtypes this equals @'liftA2' (&&)@.+ --+ -- @+ -- (<>) :: Predicate a -> Predicate a -> Predicate a+ -- Predicate pred <> Predicate pred' = Predicate \a ->+ -- pred a && pred' a+ -- @+ Semigroup+ , -- | @'mempty'@ on predicates always returns @True@. Without+ -- newtypes this equals @'pure' True@.+ --+ -- @+ -- mempty :: Predicate a+ -- mempty = \_ -> True+ -- @+ Monoid+ )+ via a -> All++ deriving+ ( -- | A 'Predicate' is a 'Contravariant' 'Functor', because+ -- 'contramap' can apply its function argument to the input of+ -- the predicate.+ --+ -- Without newtypes @'contramap' f@ equals precomposing with @f@+ -- (= @(. f)@).+ --+ -- @+ -- contramap :: (a' -> a) -> (Predicate a -> Predicate a')+ -- contramap f (Predicate g) = Predicate (g . f)+ -- @+ Contravariant+ )+ via Op Bool++-- | Defines a total ordering on a type as per 'compare'.+--+-- This condition is not checked by the types. You must ensure that the+-- supplied values are valid total orderings yourself.+newtype Comparison a = Comparison { getComparison :: a -> a -> Ordering }+ deriving+ newtype+ ( -- | @('<>')@ on comparisons combines results with @('<>')+ -- \@Ordering@. Without newtypes this equals @'liftA2' ('liftA2'+ -- ('<>'))@.+ --+ -- @+ -- (<>) :: Comparison a -> Comparison a -> Comparison a+ -- Comparison cmp <> Comparison cmp' = Comparison \a a' ->+ -- cmp a a' <> cmp a a'+ -- @+ Semigroup+ , -- | @'mempty'@ on comparisons always returns @EQ@. Without+ -- newtypes this equals @'pure' ('pure' EQ)@.+ --+ -- @+ -- mempty :: Comparison a+ -- mempty = Comparison \_ _ -> EQ+ -- @+ Monoid+ )++-- | A 'Comparison' is a 'Contravariant' 'Functor', because 'contramap' can+-- apply its function argument to each input of the comparison function.+instance Contravariant Comparison where+ contramap :: (a' -> a) -> (Comparison a -> Comparison a')+ contramap f (Comparison g) = Comparison (on g f)++-- | Compare using 'compare'.+defaultComparison :: Ord a => Comparison a+defaultComparison = Comparison compare++-- | This data type represents an equivalence relation.+--+-- Equivalence relations are expected to satisfy three laws:+--+-- [Reflexivity]: @'getEquivalence' f a a = True@+-- [Symmetry]: @'getEquivalence' f a b = 'getEquivalence' f b a@+-- [Transitivity]:+-- If @'getEquivalence' f a b@ and @'getEquivalence' f b c@ are both 'True'+-- then so is @'getEquivalence' f a c@.+--+-- The types alone do not enforce these laws, so you'll have to check them+-- yourself.+newtype Equivalence a = Equivalence { getEquivalence :: a -> a -> Bool }+ deriving+ ( -- | @('<>')@ on equivalences uses logical conjunction @('&&')@+ -- on the results. Without newtypes this equals @'liftA2'+ -- ('liftA2' (&&))@.+ --+ -- @+ -- (<>) :: Equivalence a -> Equivalence a -> Equivalence a+ -- Equivalence equiv <> Equivalence equiv' = Equivalence \a b ->+ -- equiv a b && equiv' a b+ -- @+ Semigroup+ , -- | @'mempty'@ on equivalences always returns @True@. Without+ -- newtypes this equals @'pure' ('pure' True)@.+ --+ -- @+ -- mempty :: Equivalence a+ -- mempty = Equivalence \_ _ -> True+ -- @+ Monoid+ )+ via a -> a -> All++-- | Equivalence relations are 'Contravariant', because you can+-- apply the contramapped function to each input to the equivalence+-- relation.+instance Contravariant Equivalence where+ contramap :: (a' -> a) -> (Equivalence a -> Equivalence a')+ contramap f (Equivalence g) = Equivalence (on g f)++-- | Check for equivalence with '=='.+--+-- Note: The instances for 'Double' and 'Float' violate reflexivity for @NaN@.+defaultEquivalence :: Eq a => Equivalence a+defaultEquivalence = Equivalence (==)++comparisonEquivalence :: Comparison a -> Equivalence a+comparisonEquivalence (Comparison p) = Equivalence $ \a b -> p a b == EQ++-- | Dual function arrows.+newtype Op a b = Op { getOp :: b -> a }+ deriving+ newtype+ ( -- | @('<>') \@(Op a b)@ without newtypes is @('<>') \@(b->a)@ =+ -- @liftA2 ('<>')@. This lifts the 'Semigroup' operation+ -- @('<>')@ over the output of @a@.+ --+ -- @+ -- (<>) :: Op a b -> Op a b -> Op a b+ -- Op f <> Op g = Op \a -> f a <> g a+ -- @+ Semigroup+ , -- | @'mempty' \@(Op a b)@ without newtypes is @mempty \@(b->a)@+ -- = @\_ -> mempty@.+ --+ -- @+ -- mempty :: Op a b+ -- mempty = Op \_ -> mempty+ -- @+ Monoid+ )++instance Category Op where+ id :: Op a a+ id = Op id++ (.) :: Op b c -> Op a b -> Op a c+ Op f . Op g = Op (g . f)++instance Contravariant (Op a) where+ contramap :: (b' -> b) -> (Op a b -> Op a b')+ contramap f g = Op (getOp g . f)++instance Num a => Num (Op a b) where+ Op f + Op g = Op $ \a -> f a + g a+ Op f * Op g = Op $ \a -> f a * g a+ Op f - Op g = Op $ \a -> f a - g a+ abs (Op f) = Op $ abs . f+ signum (Op f) = Op $ signum . f+ fromInteger = Op . const . fromInteger++instance Fractional a => Fractional (Op a b) where+ Op f / Op g = Op $ \a -> f a / g a+ recip (Op f) = Op $ recip . f+ fromRational = Op . const . fromRational++instance Floating a => Floating (Op a b) where+ pi = Op $ const pi+ exp (Op f) = Op $ exp . f+ sqrt (Op f) = Op $ sqrt . f+ log (Op f) = Op $ log . f+ sin (Op f) = Op $ sin . f+ tan (Op f) = Op $ tan . f+ cos (Op f) = Op $ cos . f+ asin (Op f) = Op $ asin . f+ atan (Op f) = Op $ atan . f+ acos (Op f) = Op $ acos . f+ sinh (Op f) = Op $ sinh . f+ tanh (Op f) = Op $ tanh . f+ cosh (Op f) = Op $ cosh . f+ asinh (Op f) = Op $ asinh . f+ atanh (Op f) = Op $ atanh . f+ acosh (Op f) = Op $ acosh . f+ Op f ** Op g = Op $ \a -> f a ** g a+ logBase (Op f) (Op g) = Op $ \a -> logBase (f a) (g a)+-}
lib/Data/Functor/Identity.hs view
@@ -1,6 +1,6 @@ -- Copyright 2023 Lennart Augustsson -- See LICENSE file for full license.-module Data.Functor.Identity(Identity(..), runIdentity) where+module Data.Functor.Identity(Identity(..)) where import Prelude() -- do not import Prelude import Primitives import Control.Applicative@@ -11,13 +11,11 @@ import Data.Functor import Data.Int import Data.Ord+import Data.Records -- needed since we don't import Mhs.Builtin import Text.Show -newtype Identity a = Identity a+newtype Identity a = Identity { runIdentity :: a } deriving (Eq, Ord, Show)--runIdentity :: forall a . Identity a -> a-runIdentity (Identity a) = a instance Functor Identity where fmap f (Identity a) = Identity (f a)
+ lib/Data/Functor/Product.hs view
@@ -0,0 +1,115 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE Safe #-}+{-# LANGUAGE StandaloneDeriving #-}+-----------------------------------------------------------------------------+-- |+-- Module : Data.Functor.Product+-- Copyright : (c) Ross Paterson 2010+-- License : BSD-style (see the file LICENSE)+--+-- Maintainer : libraries@haskell.org+-- Stability : stable+-- Portability : portable+--+-- Products, lifted to functors.+--+-- @since 4.9.0.0+-----------------------------------------------------------------------------++module Data.Functor.Product (+ Product(..),+ ) where++import Control.Applicative+import Control.Monad+import Control.Monad.Fix+import Control.Monad.Zip+--import Data.Data (Data)+import Data.Foldable+import Data.Functor.Classes+import Data.Monoid(Monoid(..))+import Data.Traversable+--import GHC.Generics (Generic, Generic1)++data Product f g a = Pair (f a) (g a)+{-+ deriving ( Data -- ^ @since 4.9.0.0+ , Generic -- ^ @since 4.9.0.0+ , Generic1 -- ^ @since 4.9.0.0+ )++-- | @since 4.18.0.0+deriving instance (Eq (f a), Eq (g a)) => Eq (Product f g a)+-- | @since 4.18.0.0+deriving instance (Ord (f a), Ord (g a)) => Ord (Product f g a)+-- | @since 4.18.0.0+deriving instance (Read (f a), Read (g a)) => Read (Product f g a)+-- | @since 4.18.0.0+deriving instance (Show (f a), Show (g a)) => Show (Product f g a)+-}++instance (Eq1 f, Eq1 g) => Eq1 (Product f g) where+ liftEq eq (Pair x1 y1) (Pair x2 y2) = liftEq eq x1 x2 && liftEq eq y1 y2++instance (Ord1 f, Ord1 g) => Ord1 (Product f g) where+ liftCompare comp (Pair x1 y1) (Pair x2 y2) =+ liftCompare comp x1 x2 `mappend` liftCompare comp y1 y2++{-+instance (Read1 f, Read1 g) => Read1 (Product f g) where+ liftReadPrec rp rl = readData $+ readBinaryWith (liftReadPrec rp rl) (liftReadPrec rp rl) "Pair" Pair++ liftReadListPrec = liftReadListPrecDefault+ liftReadList = liftReadListDefault+-}++instance (Show1 f, Show1 g) => Show1 (Product f g) where+ liftShowsPrec sp sl d (Pair x y) =+ showsBinaryWith (liftShowsPrec sp sl) (liftShowsPrec sp sl) "Pair" d x y++instance (Functor f, Functor g) => Functor (Product f g) where+ fmap f (Pair x y) = Pair (fmap f x) (fmap f y)+ a <$ (Pair x y) = Pair (a <$ x) (a <$ y)++instance (Foldable f, Foldable g) => Foldable (Product f g) where+ foldMap f (Pair x y) = foldMap f x `mappend` foldMap f y++instance (Traversable f, Traversable g) => Traversable (Product f g) where+ traverse f (Pair x y) = liftA2 Pair (traverse f x) (traverse f y)++instance (Applicative f, Applicative g) => Applicative (Product f g) where+ pure x = Pair (pure x) (pure x)+ Pair f g <*> Pair x y = Pair (f <*> x) (g <*> y)+ liftA2 f (Pair a b) (Pair x y) = Pair (liftA2 f a x) (liftA2 f b y)++instance (Alternative f, Alternative g) => Alternative (Product f g) where+ empty = Pair empty empty+ Pair x1 y1 <|> Pair x2 y2 = Pair (x1 <|> x2) (y1 <|> y2)++instance (Monad f, Monad g) => Monad (Product f g) where+ Pair m n >>= f = Pair (m >>= fstP . f) (n >>= sndP . f)+ where+ fstP (Pair a _) = a+ sndP (Pair _ b) = b++instance (MonadPlus f, MonadPlus g) => MonadPlus (Product f g) where+ mzero = Pair mzero mzero+ Pair x1 y1 `mplus` Pair x2 y2 = Pair (x1 `mplus` x2) (y1 `mplus` y2)++instance (MonadFix f, MonadFix g) => MonadFix (Product f g) where+ mfix f = Pair (mfix (fstP . f)) (mfix (sndP . f))+ where+ fstP (Pair a _) = a+ sndP (Pair _ b) = b++instance (MonadZip f, MonadZip g) => MonadZip (Product f g) where+ mzipWith f (Pair x1 y1) (Pair x2 y2) = Pair (mzipWith f x1 x2) (mzipWith f y1 y2)++instance (Semigroup (f a), Semigroup (g a)) => Semigroup (Product f g a) where+ Pair x1 y1 <> Pair x2 y2 = Pair (x1 <> x2) (y1 <> y2)++instance (Monoid (f a), Monoid (g a)) => Monoid (Product f g a) where+ mempty = Pair mempty mempty
+ lib/Data/Functor/Sum.hs view
@@ -0,0 +1,103 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE Safe #-}+{-# LANGUAGE StandaloneDeriving #-}+-----------------------------------------------------------------------------+-- |+-- Module : Data.Functor.Sum+-- Copyright : (c) Ross Paterson 2014+-- License : BSD-style (see the file LICENSE)+--+-- Maintainer : libraries@haskell.org+-- Stability : stable+-- Portability : portable+--+-- Sums, lifted to functors.+--+-- @since 4.9.0.0+-----------------------------------------------------------------------------++module Data.Functor.Sum (+ Sum(..),+ ) where+import Control.Applicative ((<|>))+--import Data.Data (Data)+import Data.Foldable+import Data.Functor.Classes+import Data.Traversable+--import GHC.Generics (Generic, Generic1)++-- | Lifted sum of functors.+--+-- ==== __Examples__+--+-- >>> fmap (+1) (InL (Just 1)) :: Sum Maybe [] Int+-- InL (Just 2)+--+-- >>> fmap (+1) (InR [1, 2, 3]) :: Sum Maybe [] Int+-- InR [2,3,4]+data Sum f g a = InL (f a) | InR (g a)+{-+ deriving ( Data -- ^ @since 4.9.0.0+ , Generic -- ^ @since 4.9.0.0+ , Generic1 -- ^ @since 4.9.0.0+ )++-- | @since 4.18.0.0+deriving instance (Eq (f a), Eq (g a)) => Eq (Sum f g a)+-- | @since 4.18.0.0+deriving instance (Ord (f a), Ord (g a)) => Ord (Sum f g a)+-- | @since 4.18.0.0+deriving instance (Read (f a), Read (g a)) => Read (Sum f g a)+-- | @since 4.18.0.0+deriving instance (Show (f a), Show (g a)) => Show (Sum f g a)+-}++-- | @since 4.9.0.0+instance (Eq1 f, Eq1 g) => Eq1 (Sum f g) where+ liftEq eq (InL x1) (InL x2) = liftEq eq x1 x2+ liftEq _ (InL _) (InR _) = False+ liftEq _ (InR _) (InL _) = False+ liftEq eq (InR y1) (InR y2) = liftEq eq y1 y2++-- | @since 4.9.0.0+instance (Ord1 f, Ord1 g) => Ord1 (Sum f g) where+ liftCompare comp (InL x1) (InL x2) = liftCompare comp x1 x2+ liftCompare _ (InL _) (InR _) = LT+ liftCompare _ (InR _) (InL _) = GT+ liftCompare comp (InR y1) (InR y2) = liftCompare comp y1 y2++-- | @since 4.9.0.0+instance (Read1 f, Read1 g) => Read1 (Sum f g) where+ liftReadPrec rp rl = readData $+ readUnaryWith (liftReadPrec rp rl) "InL" InL <|>+ readUnaryWith (liftReadPrec rp rl) "InR" InR++ liftReadListPrec = liftReadListPrecDefault+ liftReadList = liftReadListDefault++-- | @since 4.9.0.0+instance (Show1 f, Show1 g) => Show1 (Sum f g) where+ liftShowsPrec sp sl d (InL x) =+ showsUnaryWith (liftShowsPrec sp sl) "InL" d x+ liftShowsPrec sp sl d (InR y) =+ showsUnaryWith (liftShowsPrec sp sl) "InR" d y++-- | @since 4.9.0.0+instance (Functor f, Functor g) => Functor (Sum f g) where+ fmap f (InL x) = InL (fmap f x)+ fmap f (InR y) = InR (fmap f y)++ a <$ (InL x) = InL (a <$ x)+ a <$ (InR y) = InR (a <$ y)++-- | @since 4.9.0.0+instance (Foldable f, Foldable g) => Foldable (Sum f g) where+ foldMap f (InL x) = foldMap f x+ foldMap f (InR y) = foldMap f y++-- | @since 4.9.0.0+instance (Traversable f, Traversable g) => Traversable (Sum f g) where+ traverse f (InL x) = InL <$> traverse f x+ traverse f (InR y) = InR <$> traverse f y
+ lib/Data/Hashable.hs view
@@ -0,0 +1,190 @@+-- Simplified Hashable, just to have something++module Data.Hashable(+ Hashable(..),+ ) where++--import Data.Bits+import qualified Data.ByteString as B+import Data.Complex+import Data.Fixed+import Data.Int+import Data.Integer(_integerToIntList)+import Data.List(foldl')+import Data.Ratio+import qualified Data.Text as T+import Data.Word++type Salt = Int++infixl 0 `hashWithSalt`++class Hashable a where+ hashWithSalt :: Salt -> a -> Int++ hash :: a -> Int+ hash = hashWithSalt defaultSalt++defaultSalt :: Salt+defaultSalt = 0x087fc72c++hashUsing :: (Hashable b) => (a -> b) -> Salt -> a -> Int+hashUsing f salt x = hashWithSalt salt (f x)++defaultHashWithSalt :: Hashable a => Int -> a -> Int+defaultHashWithSalt salt x = salt `hashInt` hash x++-----------------++instance Hashable Int where+ hash = id+ hashWithSalt = hashInt++instance Hashable Int8 where+ hash = fromIntegral+ hashWithSalt = defaultHashWithSalt++instance Hashable Int16 where+ hash = fromIntegral+ hashWithSalt = defaultHashWithSalt++instance Hashable Int32 where+ hash = fromIntegral+ hashWithSalt = defaultHashWithSalt++instance Hashable Int64 where+ hash = fromIntegral+ hashWithSalt = defaultHashWithSalt++instance Hashable Word where+ hash = fromIntegral+ hashWithSalt = defaultHashWithSalt++instance Hashable Word8 where+ hash = fromIntegral+ hashWithSalt = defaultHashWithSalt++instance Hashable Word16 where+ hash = fromIntegral+ hashWithSalt = defaultHashWithSalt++instance Hashable Word32 where+ hash = fromIntegral+ hashWithSalt = defaultHashWithSalt++instance Hashable Word64 where+ hash = fromIntegral+ hashWithSalt = defaultHashWithSalt++instance Hashable () where+ hash _ = 0+ hashWithSalt = defaultHashWithSalt++instance Hashable Bool where+ hash = fromEnum+ hashWithSalt = defaultHashWithSalt++instance Hashable Ordering where+ hash = fromEnum+ hashWithSalt = defaultHashWithSalt++instance Hashable Char where+ hash = fromEnum+ hashWithSalt = defaultHashWithSalt++instance Hashable Float where+ hash = hash . show+ hashWithSalt = defaultHashWithSalt++instance Hashable Double where+ hash = hash . show+ hashWithSalt = defaultHashWithSalt++instance Hashable Integer where+ hashWithSalt s = hashWithSalt s . _integerToIntList++instance Hashable B.ByteString where+ hashWithSalt s = hashWithSalt s . B.unpack++instance Hashable T.Text where+ hashWithSalt s = hashWithSalt s . T.unpack++distinguisher :: Int+distinguisher = fromIntegral $ (maxBound :: Word) `quot` 3++instance Hashable a => Hashable (Maybe a) where+ hash Nothing = 0+ hash (Just a) = distinguisher `hashWithSalt` a+ hashWithSalt = defaultHashWithSalt++instance Hashable a => Hashable [a] where+ hashWithSalt = foldl' hashWithSalt++instance (Hashable a, Hashable b) => Hashable (Either a b) where+ hash (Left a) = 0 `hashWithSalt` a+ hash (Right b) = distinguisher `hashWithSalt` b+ hashWithSalt = defaultHashWithSalt++instance Hashable a => Hashable (Complex a) where+ hashWithSalt s (r :+ i) = s `hashWithSalt` r `hashWithSalt` i++instance Hashable a => Hashable (Ratio a) where+ hashWithSalt s r = s `hashWithSalt` numerator r `hashWithSalt` denominator r++instance HasResolution a => Hashable (Fixed a) where+ hashWithSalt s = hashWithSalt s . toRational++instance (Hashable a1, Hashable a2) => Hashable (a1, a2) where+ hashWithSalt s (a1, a2) = s `hashWithSalt` a1 `hashWithSalt` a2++instance (Hashable a1, Hashable a2, Hashable a3) => Hashable (a1, a2, a3) where+ hashWithSalt s (a1, a2, a3) = s `hashWithSalt` a1 `hashWithSalt` a2 `hashWithSalt` a3++instance (Hashable a1, Hashable a2, Hashable a3, Hashable a4) => Hashable (a1, a2, a3, a4) where+ hashWithSalt s (a1, a2, a3, a4) = s `hashWithSalt` a1 `hashWithSalt` a2 `hashWithSalt` a3 `hashWithSalt` a4++------------++-- XXX This needs work+hashInt :: Salt -> Int -> Salt+hashInt s x = s * 33 + x++{-+-- This is what we'd like, but it uses primitives byteSwap# and timesWord2#++hashInt :: Salt -> Int -> Salt+hashInt s x = fromIntegral (mixHash (fromIntegral s) (fromIntegral x))++mulFold :: Word -> Word -> Word+mulFold (W# x) (W# y) = case timesWord2# x y of+ (# hi, lo #) -> W# (xor# hi lo)++byteSwap :: Word -> Word+byteSwap (W# w) = W# (byteSwap# w)++avalanche :: Word -> Word+avalanche z0 =+#if WORD_SIZE_IN_BITS == 64+ -- MurmurHash3Mixer+ let z1 = shiftXorMultiply 33 0xff51afd7ed558ccd z0+ z2 = shiftXorMultiply 33 0xc4ceb9fe1a85ec53 z1+ z3 = shiftXor 33 z2+ in z3+#else+ -- MurmurHash3Mixer 32bit+ let z1 = shiftXorMultiply 16 0x85ebca6b z0+ z2 = shiftXorMultiply 13 0xc2b2ae35 z1+ z3 = shiftXor 16 z2+ in z3+#endif++shiftXor :: Int -> Word -> Word+shiftXor n w = w `xor` (w `unsafeShiftR` n)++shiftXorMultiply :: Int -> Word -> Word -> Word+shiftXorMultiply n k w = shiftXor n w * k++-- | Mix hash is inspired by how xxh3 works on small (<=16byte) inputs.+mixHash :: Word -> Word -> Word+mixHash hi lo = avalanche (byteSwap lo + hi + mulFold hi lo)+-}
lib/Data/IORef.hs view
@@ -8,9 +8,11 @@ import Prelude() -- do not import Prelude import Primitives import Data.Eq+import {-# SOURCE #-} Data.Typeable -- An IORef is represented as an IOArray with a single element. newtype IORef a = R (IOArray a)+ deriving (Typeable) instance forall a . Eq (IORef a) where R x == R y = primArrEQ x y
lib/Data/Int/Instances.hs view
@@ -16,8 +16,7 @@ import Data.Ord import Data.Ratio_Type import Data.Real-import Numeric-import Text.Read+import Numeric.Show import Text.Show --------------------------------------------------------------------------------@@ -34,7 +33,7 @@ bini8 :: (Int -> Int -> Int) -> (Int8 -> Int -> Int8) bini8 op (I8 x) y = i8 (x `op` y) -cmp8 :: (Int -> Int -> Bool) -> (Int8 -> Int8 -> Bool)+cmp8 :: (Int -> Int -> a) -> (Int8 -> Int8 -> a) cmp8 op (I8 x) (I8 y) = x `op` y una8 :: (Int -> Int) -> (Int8 -> Int8)@@ -63,8 +62,10 @@ instance Show Int8 where showsPrec = showIntegral +{- in Text.Read.Internal instance Read Int8 where readsPrec = readIntegral+-} instance Enum Int8 where succ x = x + 1@@ -87,6 +88,7 @@ (/=) = cmp8 primIntNE instance Ord Int8 where+ compare = cmp8 primIntCompare (<) = cmp8 primIntLT (<=) = cmp8 primIntLE (>) = cmp8 primIntGT@@ -121,7 +123,7 @@ bini16 :: (Int -> Int -> Int) -> (Int16 -> Int -> Int16) bini16 op (I16 x) y = i16 (x `op` y) -cmp16 :: (Int -> Int -> Bool) -> (Int16 -> Int16 -> Bool)+cmp16 :: (Int -> Int -> a) -> (Int16 -> Int16 -> a) cmp16 op (I16 x) (I16 y) = x `op` y una16 :: (Int -> Int) -> (Int16 -> Int16)@@ -150,8 +152,10 @@ instance Show Int16 where showsPrec = showIntegral +{- in Text.Read.Internal instance Read Int16 where readsPrec = readIntegral+-} instance Enum Int16 where succ x = x + 1@@ -174,6 +178,7 @@ (/=) = cmp16 primIntNE instance Ord Int16 where+ compare = cmp16 primIntCompare (<) = cmp16 primIntLT (<=) = cmp16 primIntLE (>) = cmp16 primIntGT@@ -208,7 +213,7 @@ bini32 :: (Int -> Int -> Int) -> (Int32 -> Int -> Int32) bini32 op (I32 x) y = i32 (x `op` y) -cmp32 :: (Int -> Int -> Bool) -> (Int32 -> Int32 -> Bool)+cmp32 :: (Int -> Int -> a) -> (Int32 -> Int32 -> a) cmp32 op (I32 x) (I32 y) = x `op` y una32 :: (Int -> Int) -> (Int32 -> Int32)@@ -237,8 +242,10 @@ instance Show Int32 where showsPrec = showIntegral +{- in Text.Read.Internal instance Read Int32 where readsPrec = readIntegral+-} instance Enum Int32 where succ x = x + 1@@ -261,6 +268,7 @@ (/=) = cmp32 primIntNE instance Ord Int32 where+ compare = cmp32 primIntCompare (<) = cmp32 primIntLT (<=) = cmp32 primIntLE (>) = cmp32 primIntGT@@ -293,7 +301,7 @@ bini64 :: (Int -> Int -> Int) -> (Int64 -> Int -> Int64) bini64 op (I64 x) y = i64 (x `op` y) -cmp64 :: (Int -> Int -> Bool) -> (Int64 -> Int64 -> Bool)+cmp64 :: (Int -> Int -> a) -> (Int64 -> Int64 -> a) cmp64 op (I64 x) (I64 y) = x `op` y una64 :: (Int -> Int) -> (Int64 -> Int64)@@ -322,8 +330,10 @@ instance Show Int64 where showsPrec = showIntegral +{- in Text.Read.Internal instance Read Int64 where readsPrec = readIntegral+-} instance Enum Int64 where succ x = x + 1@@ -346,6 +356,7 @@ (/=) = cmp64 primIntNE instance Ord Int64 where+ compare = cmp64 primIntCompare (<) = cmp64 primIntLT (<=) = cmp64 primIntLE (>) = cmp64 primIntGT
lib/Data/Integer.hs view
@@ -27,8 +27,7 @@ import Data.Ord import Data.Ratio_Type import Data.Real-import Numeric-import Text.Read+import Numeric.Show import Text.Show --@@ -64,8 +63,10 @@ instance Show Integer where showsPrec = showIntegral +{- in Text.Read.Internal instance Read Integer where readsPrec = readIntegral+-} instance Num Integer where (+) = addI
+ lib/Data/Kind.hs view
@@ -0,0 +1,3 @@+module Data.Kind(Type, Constraint) where+import Prelude()+import Primitives
lib/Data/List.hs view
@@ -10,7 +10,7 @@ mapAccumL, mapAccumR, iterate, iterate', repeat, replicate, cycle, unfoldr,- take, drop, splitAt, takeWhile, takeWhileEnd, dropWhile, dropWhileEnd, span, break, splitWith,+ take, drop, splitAt, takeWhile, takeWhileEnd, dropWhile, dropWhileEnd, span, spanUntil, break, splitWith, stripPrefix, stripSuffix, group, inits, tails, isPrefixOf, isSuffixOf, isInfixOf, isSubsequenceOf, elem, notElem, lookup,@@ -34,15 +34,14 @@ import Data.Char import Data.Eq import Data.Function-import Data.Functor+import Data.Functor hiding(unzip) import Data.Int import Data.Integral import Data.List_Type import Data.Maybe_Type-import Data.Monoid+import Data.Monoid.Internal import Data.Num import Data.Ord-import Data.Semigroup import Data.Tuple --import Text.Read import Text.Show
lib/Data/List/NonEmpty.hs view
@@ -98,39 +98,43 @@ , nonEmpty -- :: [a] -> Maybe (NonEmpty a) , xor -- :: NonEmpty Bool -> Bool ) where---import Prelude hiding (break, cycle, drop, dropWhile,- filter, foldl, foldr, head, init, iterate,- last, length, map, repeat, reverse,- scanl, scanl1, scanr, scanr1, span,- splitAt, tail, take, takeWhile,- unzip, zip, zipWith, (!!), Applicative(..))-import qualified Prelude--import Control.Applicative (Applicative (..), Alternative (many))+import Prelude() -{- Original from base-4.20.0.1-import GHC.Internal.Data.Foldable hiding (length, toList)-import qualified GHC.Internal.Data.Foldable as Foldable-import GHC.Internal.Data.Function (on)-import qualified GHC.Internal.Data.List as List-import GHC.Internal.Data.Ord (comparing)-import GHC.Internal.Base (NonEmpty(..))-import GHC.Internal.Stack.Types (HasCallStack)--}------ MHS replacement-import Control.Monad(ap, liftM2)-import Data.Ord(comparing)-import Data.Function(on)+import Control.Applicative+import Control.Error+import Control.Monad+import Data.Bool+import Data.Eq+import Data.Foldable hiding (length, toList)+import qualified Data.Foldable as Foldable+import Data.Function+import Data.Functor hiding(unzip)+import Data.Int import qualified Data.List as List+import Data.List_Type+import Data.List.NonEmpty_Type+import Data.Num+import Data.Maybe+import Data.Monoid.Internal+import Data.Ord+import Data.Traversable+import Data.Tuple import GHC.Stack(HasCallStack)+import Text.Show +{- In Data.List.NonEmpty_Type infixr 5 :| data NonEmpty a = a :| [a] deriving (Eq, Ord)+-} +instance (Eq a) => Eq (NonEmpty a) where+ (x :| xs) == (y :| ys) = x == y && xs == ys++instance (Ord a) => Ord (NonEmpty a) where+ compare (x :| xs) (y :| ys) = compare x y <> compare xs ys+ instance Semigroup (NonEmpty a) where (a :| as) <> ~(b :| bs) = a :| (as ++ b : bs) @@ -152,6 +156,14 @@ --instance Traversable NonEmpty -- Defined in Data.Traversable --instance Read a => Read (NonEmpty a) -- Defined in GHC.Read --instance Show a => Show (NonEmpty a) -- Defined in GHC.Show++instance Show a => Show (NonEmpty a) where+ showsPrec p = showsPrec p . toList+instance Foldable NonEmpty where+ foldr f z = foldr f z . toList+--instance Traversable NonEmpty where+-- traverse f = fromList . traverse f . toList+ ----- End MHS replacement infixr 5 <|@@ -161,7 +173,7 @@ -- | Number of elements in 'NonEmpty' list. length :: NonEmpty a -> Int-length (_ :| xs) = 1 + Prelude.length xs+length (_ :| xs) = 1 + List.length xs -- | Compute n-ary logic exclusive OR operation on 'NonEmpty' list. xor :: NonEmpty Bool -> Bool@@ -283,10 +295,10 @@ -- /Beware/: If the provided function returns an empty list, -- this will raise an error. -- XXX not yet---lift :: Foldable f => ([a] -> [b]) -> f a -> NonEmpty b---lift f = fromList . f . Foldable.toList-lift :: ([a] -> [b]) -> [a] -> NonEmpty b-lift f = fromList . f+lift :: Foldable f => ([a] -> [b]) -> f a -> NonEmpty b+lift f = fromList . f . Foldable.toList+--lift :: ([a] -> [b]) -> [a] -> NonEmpty b+--lift f = fromList . f -- | Map a function over a 'NonEmpty' stream. map :: (a -> b) -> NonEmpty a -> NonEmpty b@@ -301,10 +313,10 @@ -- > inits [1] == [] :| [[1]] -- > inits [] == [] :| [] -- XXX---inits :: Foldable f => f a -> NonEmpty [a]---inits = fromList . List.inits . Foldable.toList-inits :: [a] -> NonEmpty [a]-inits = fromList . List.inits+inits :: Foldable f => f a -> NonEmpty [a]+inits = fromList . List.inits . Foldable.toList+--inits :: [a] -> NonEmpty [a]+--inits = fromList . List.inits -- | The 'inits1' function takes a 'NonEmpty' stream @xs@ and returns all the -- 'NonEmpty' finite prefixes of @xs@, starting with the shortest.@@ -322,8 +334,8 @@ -- * The only empty element of `inits xs` is the first one (by the definition of `inits`) -- * Therefore, if we take all but the first element of `inits xs` i.e. -- `tail (inits xs)`, we have a nonempty list of nonempty lists--- fromList . Prelude.map fromList . List.drop 1 . List.inits . Foldable.toList- fromList . Prelude.map fromList . List.drop 1 . List.inits . toList+ fromList . List.map fromList . List.drop 1 . List.inits . Foldable.toList+-- fromList . List.map fromList . List.drop 1 . List.inits . toList -- | The 'tails' function takes a stream @xs@ and returns all the -- suffixes of @xs@, starting with the longest. The result is 'NonEmpty'@@ -333,10 +345,10 @@ -- > tails [1] == [1] :| [[]] -- > tails [] == [] :| [] -- XXX---tails :: Foldable f => f a -> NonEmpty [a]---tails = fromList . List.tails . Foldable.toList-tails :: [a] -> NonEmpty [a]-tails = fromList . List.tails+tails :: Foldable f => f a -> NonEmpty [a]+tails = fromList . List.tails . Foldable.toList+--tails :: [a] -> NonEmpty [a]+--tails = fromList . List.tails -- | The 'tails1' function takes a 'NonEmpty' stream @xs@ and returns all the -- non-empty suffixes of @xs@, starting with the longest.@@ -354,16 +366,16 @@ -- * The only empty element of `tails xs` is the last one (by the definition of `tails`) -- * Therefore, if we take all but the last element of `tails xs` i.e. -- `init (tails xs)`, we have a nonempty list of nonempty lists--- fromList . Prelude.map fromList . List.init . List.tails . Foldable.toList- fromList . Prelude.map fromList . List.init . List.tails . toList+-- fromList . List.map fromList . List.init . List.tails . Foldable.toList+ fromList . List.map fromList . List.init . List.tails . toList -- | @'insert' x xs@ inserts @x@ into the last position in @xs@ where it -- is still less than or equal to the next element. In particular, if the -- list is sorted beforehand, the result will also be sorted.---insert :: (Foldable f, Ord a) => a -> f a -> NonEmpty a---insert a = fromList . List.insert a . Foldable.toList-insert :: (Ord a) => a -> [a] -> NonEmpty a-insert a = fromList . List.insert a+insert :: (Foldable f, Ord a) => a -> f a -> NonEmpty a+insert a = fromList . List.insert a . Foldable.toList+--insert :: (Ord a) => a -> [a] -> NonEmpty a+--insert a = fromList . List.insert a -- | @'some1' x@ sequences @x@ one or more times. some1 :: Alternative f => f a -> f (NonEmpty a)@@ -377,19 +389,19 @@ -- Note that -- -- > last (scanl f z xs) == foldl f z xs.---scanl :: Foldable f => (b -> a -> b) -> b -> f a -> NonEmpty b---scanl f z = fromList . List.scanl f z . Foldable.toList-scanl :: (b -> a -> b) -> b -> [a] -> NonEmpty b-scanl f z = fromList . List.scanl f z+scanl :: Foldable f => (b -> a -> b) -> b -> f a -> NonEmpty b+scanl f z = fromList . List.scanl f z . Foldable.toList+--scanl :: (b -> a -> b) -> b -> [a] -> NonEmpty b+--scanl f z = fromList . List.scanl f z -- | 'scanr' is the right-to-left dual of 'scanl'. -- Note that -- -- > head (scanr f z xs) == foldr f z xs.---scanr :: Foldable f => (a -> b -> b) -> b -> f a -> NonEmpty b---scanr f z = fromList . List.scanr f z . Foldable.toList-scanr :: (a -> b -> b) -> b -> [a] -> NonEmpty b-scanr f z = fromList . List.scanr f z+scanr :: Foldable f => (a -> b -> b) -> b -> f a -> NonEmpty b+scanr f z = fromList . List.scanr f z . Foldable.toList+--scanr :: (a -> b -> b) -> b -> [a] -> NonEmpty b+--scanr f z = fromList . List.scanr f z -- | 'scanl1' is a variant of 'scanl' that has no starting value argument: --@@ -492,16 +504,16 @@ -- -- >>> group "Mississippi" -- ["M", "i", "ss", "i", "ss", "i", "pp", "i"]---group :: (Foldable f, Eq a) => f a -> [NonEmpty a]-group :: (Eq a) => [a] -> [NonEmpty a]+group :: (Foldable f, Eq a) => f a -> [NonEmpty a]+--group :: (Eq a) => [a] -> [NonEmpty a] group = groupBy (==) -- | 'groupBy' operates like 'group', but uses the provided equality -- predicate instead of `==`.---groupBy :: Foldable f => (a -> a -> Bool) -> f a -> [NonEmpty a]---groupBy eq0 = go eq0 . Foldable.toList-groupBy :: (a -> a -> Bool) -> [a] -> [NonEmpty a]-groupBy eq0 = go eq0+groupBy :: Foldable f => (a -> a -> Bool) -> f a -> [NonEmpty a]+groupBy eq0 = go eq0 . Foldable.toList+--groupBy :: (a -> a -> Bool) -> [a] -> [NonEmpty a]+--groupBy eq0 = go eq0 where go _ [] = [] go eq (x : xs) = (x :| ys) : groupBy eq zs@@ -509,8 +521,8 @@ -- | 'groupWith' operates like 'group', but uses the provided projection when -- comparing for equality---groupWith :: (Foldable f, Eq b) => (a -> b) -> f a -> [NonEmpty a]-groupWith :: (Eq b) => (a -> b) -> [a] -> [NonEmpty a]+groupWith :: (Foldable f, Eq b) => (a -> b) -> f a -> [NonEmpty a]+--groupWith :: (Eq b) => (a -> b) -> [a] -> [NonEmpty a] groupWith f = groupBy ((==) `on` f) -- | 'groupAllWith' operates like 'groupWith', but sorts the list
+ lib/Data/List/NonEmpty_Type.hs view
@@ -0,0 +1,6 @@+module Data.List.NonEmpty_Type(module Data.List.NonEmpty_Type) where+import Prelude()++infixr 5 :|++data NonEmpty a = a :| [a]
lib/Data/Maybe.hs view
@@ -15,9 +15,8 @@ import Data.Int import Data.List import Data.Maybe_Type-import Data.Monoid+import Data.Monoid.Internal import Data.Ord-import Data.Semigroup import Text.Show instance forall a . Eq a => Eq (Maybe a) where
lib/Data/Monoid.hs view
@@ -1,133 +1,25 @@-module Data.Monoid(module Data.Monoid, module Data.Semigroup) where-import Prelude() -- do not import Prelude-import Primitives-import Control.Applicative-import Data.Bool-import Data.Bounded-import Data.Function-import Data.Functor-import Data.List_Type-import Data.Ord+module Data.Monoid(+ Monoid(..),+ Endo(..),+ Dual(..),+ Sum(..),+ Product(..),+ All(..),+ Any(..),+ Arg(..),+ Alt(..),+ First(..),+ Last(..),+ ) where+import Prelude() import Data.Maybe_Type-import Data.Num-import Data.Semigroup--class Semigroup a => Monoid a where- mempty :: a- mappend :: a -> a -> a- mappend = (<>)- mconcat :: [a] -> a- mconcat [] = mempty- mconcat (a:as) = a <> mconcat as-------------------------newtype Endo a = Endo (a -> a)-appEndo :: forall a . Endo a -> (a -> a)-appEndo (Endo f) = f--instance forall a . Semigroup (Endo a) where- Endo f <> Endo g = Endo (f . g)--instance forall a . Monoid (Endo a) where- mempty = Endo id-------------------------newtype Dual a = Dual a-getDual :: forall a . Dual a -> a-getDual (Dual a) = a--instance forall a . Semigroup a => Semigroup (Dual a) where- Dual a <> Dual b = Dual (b <> a)--instance forall a . Monoid a => Monoid (Dual a) where- mempty = Dual mempty--instance Functor Dual where- fmap f (Dual a) = Dual (f a)--instance Applicative Dual where- pure = Dual- Dual f <*> Dual b = Dual (f b)-------------------------newtype Max a = Max a-getMax :: forall a . Max a -> a-getMax (Max a) = a--instance forall a . Ord a => Semigroup (Max a) where- Max a <> Max b = Max (a `max` b)--instance forall a . (Ord a, Bounded a) => Monoid (Max a) where- mempty = Max minBound-------------------------newtype Min a = Min a-getMin :: forall a . Min a -> a-getMin (Min a) = a--instance forall a . Ord a => Semigroup (Min a) where- Min a <> Min b = Min (a `min` b)--instance forall a . (Ord a, Bounded a) => Monoid (Min a) where- mempty = Min maxBound-------------------------newtype Sum a = Sum a-getSum :: forall a . Sum a -> a-getSum (Sum a) = a--instance forall a . Num a => Semigroup (Sum a) where- Sum a <> Sum b = Sum (a + b)--instance forall a . (Num a) => Monoid (Sum a) where- mempty = Sum 0-------------------------newtype Product a = Product a-getProduct :: forall a . Product a -> a-getProduct (Product a) = a--instance forall a . Num a => Semigroup (Product a) where- Product a <> Product b = Product (a * b)--instance forall a . (Num a) => Monoid (Product a) where- mempty = Product 1-------------------------newtype All = All Bool-getAll :: All -> Bool-getAll (All a) = a--instance Semigroup All where- All a <> All b = All (a && b)--instance Monoid All where- mempty = All True-------------------------newtype Any = Any Bool-getAny :: Any -> Bool-getAny (Any a) = a--instance Semigroup Any where- Any a <> Any b = Any (a || b)--instance Monoid Any where- mempty = Any False+import Data.Monoid.Internal+import Data.Records ----------------------+-- First and Last are different in Monoid and Semigroup,+-- so put them here. -newtype First a = First (Maybe a)-getFirst :: forall a . First a -> Maybe a-getFirst (First a) = a+newtype First a = First { getFirst :: Maybe a } instance forall a . Semigroup (First a) where a@(First (Just _)) <> _ = a@@ -136,11 +28,8 @@ instance forall a . Monoid (First a) where mempty = First Nothing ---------------------- -newtype Last a = Last (Maybe a)-getLast :: forall a . Last a -> Maybe a-getLast (Last a) = a+newtype Last a = Last { getLast :: Maybe a } instance forall a . Semigroup (Last a) where _ <> a@(Last (Just _)) = a@@ -148,13 +37,3 @@ instance forall a . Monoid (Last a) where mempty = Last Nothing-------------------------instance Semigroup Ordering where- LT <> _ = LT- EQ <> o = o- GT <> _ = GT--instance Monoid Ordering where- mempty = EQ
+ lib/Data/Monoid/Internal.hs view
@@ -0,0 +1,251 @@+module Data.Monoid.Internal(module Data.Monoid.Internal) where+import Prelude() -- do not import Prelude+import Primitives+import Control.Applicative+import Control.Error+import Data.Bool+import Data.Bounded+import Data.Eq+import Data.Function+import Data.Functor+import Data.Int+import Data.Integral+import Data.List_Type+import Data.List.NonEmpty_Type+import Data.Ord+import Data.Maybe_Type+import Data.Num+import Data.Records+import Text.Show++class Semigroup a => Monoid a where+ mempty :: a+ mappend :: a -> a -> a+ mappend = (<>)+ mconcat :: [a] -> a+ mconcat [] = mempty+ mconcat (a:as) = a <> mconcat as++---------------------++instance (Monoid b) => Monoid (a -> b) where+ mempty _ = mempty++instance (Semigroup b) => Semigroup (a -> b) where+ f <> g = \ x -> f x <> g x++---------------------++newtype Endo a = Endo { appEndo :: a -> a }++instance forall a . Semigroup (Endo a) where+ Endo f <> Endo g = Endo (f . g)++instance forall a . Monoid (Endo a) where+ mempty = Endo id++---------------------++newtype Dual a = Dual { getDual :: a }+ deriving (Bounded, Eq, Ord, Show)++instance forall a . Semigroup a => Semigroup (Dual a) where+ Dual a <> Dual b = Dual (b <> a)++instance forall a . Monoid a => Monoid (Dual a) where+ mempty = Dual mempty++instance Functor Dual where+ fmap f (Dual a) = Dual (f a)++instance Applicative Dual where+ pure = Dual+ Dual f <*> Dual b = Dual (f b)++---------------------++newtype Max a = Max { getMax :: a }+ deriving (Bounded, Eq, Ord, Show)++instance forall a . Ord a => Semigroup (Max a) where+ Max a <> Max b = Max (a `max` b)+ stimes = stimesIdempotent++instance forall a . (Ord a, Bounded a) => Monoid (Max a) where+ mempty = Max minBound++---------------------++newtype Min a = Min { getMin :: a }+ deriving (Bounded, Eq, Ord, Show)++instance forall a . Ord a => Semigroup (Min a) where+ Min a <> Min b = Min (a `min` b)+ stimes = stimesIdempotent++instance forall a . (Ord a, Bounded a) => Monoid (Min a) where+ mempty = Min maxBound++---------------------++newtype Sum a = Sum { getSum :: a }+ deriving (Bounded, Eq, Ord, Show)++instance forall a . Num a => Semigroup (Sum a) where+ Sum a <> Sum b = Sum (a + b)++instance forall a . (Num a) => Monoid (Sum a) where+ mempty = Sum 0++---------------------++newtype Product a = Product { getProduct :: a }+ deriving (Bounded, Eq, Ord, Show)++instance forall a . Num a => Semigroup (Product a) where+ Product a <> Product b = Product (a * b)++instance forall a . (Num a) => Monoid (Product a) where+ mempty = Product 1++---------------------++newtype All = All { getAll :: Bool }+ deriving (Bounded, Eq, Ord, Show)++instance Semigroup All where+ All a <> All b = All (a && b)++instance Monoid All where+ mempty = All True++---------------------++newtype Any = Any { getAny :: Bool }+ deriving (Bounded, Eq, Ord, Show)++instance Semigroup Any where+ Any a <> Any b = Any (a || b)++instance Monoid Any where+ mempty = Any False++---------------------++instance Semigroup Ordering where+ LT <> _ = LT+ EQ <> o = o+ GT <> _ = GT++instance Monoid Ordering where+ mempty = EQ++----------------------++data Arg a b = Arg a b+ deriving(Show)++type ArgMin a b = Min (Arg a b)++type ArgMax a b = Max (Arg a b)++instance Functor (Arg a) where+ fmap f (Arg x a) = Arg x (f a)++instance Eq a => Eq (Arg a b) where+ Arg a _ == Arg b _ = a == b++instance Ord a => Ord (Arg a b) where+ Arg a _ `compare` Arg b _ = compare a b+ min x@(Arg a _) y@(Arg b _)+ | a <= b = x+ | otherwise = y+ max x@(Arg a _) y@(Arg b _)+ | a >= b = x+ | otherwise = y++----------------------++newtype Alt f a = Alt (f a)+-- deriving (Show)+getAlt :: Alt f a -> f a+getAlt (Alt x) = x+{-+ deriving ( Generic -- ^ @since base-4.8.0.0+ , Generic1 -- ^ @since base-4.8.0.0+ , Read -- ^ @since base-4.8.0.0+ , Show -- ^ @since base-4.8.0.0+ , Eq -- ^ @since base-4.8.0.0+ , Ord -- ^ @since base-4.8.0.0+ , Num -- ^ @since base-4.8.0.0+ , Enum -- ^ @since base-4.8.0.0+ , Monad -- ^ @since base-4.8.0.0+ , MonadPlus -- ^ @since base-4.8.0.0+ , Applicative -- ^ @since base-4.8.0.0+ , Alternative -- ^ @since base-4.8.0.0+ , Functor -- ^ @since base-4.8.0.0+ )+-}++instance Alternative f => Semigroup (Alt f a) where+ Alt x <> Alt y = Alt (x <|> y)+ stimes = stimesMonoid++instance Alternative f => Monoid (Alt f a) where+ mempty = Alt empty++----------------------++-- This really belongs in Data.Semigroup,+-- but some functions have Monoid as in the context.++infixr 6 <>+class Semigroup a where+ (<>) :: a -> a -> a+ sconcat :: NonEmpty a -> a+ stimes :: (Integral b, Ord b) => b -> a -> a++ sconcat (a :| as) = go a as+ where go b (c:cs) = b <> go c cs+ go b [] = b++ stimes y0 x0+ | y0 <= 0 = error "stimes: positive multiplier expected"+ | otherwise = f x0 y0+ where+ f x y+ | y `rem` 2 == 0 = 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+ | y == 1 = x <> z+ | otherwise = g (x <> x) (y `quot` 2) (x <> z)++stimesIdempotent :: (Integral b, Ord b) => b -> a -> a+stimesIdempotent n x =+ if n <= 0 then error "stimesIdempotent: positive multiplier expected"+ else x++stimesIdempotentMonoid :: (Ord b, Integral b, Monoid a) => b -> a -> a+stimesIdempotentMonoid n x = case compare n 0 of+ LT -> error "stimesIdempotentMonoid: negative multiplier"+ EQ -> mempty+ GT -> x++stimesMonoid :: (Ord b, Integral b, Monoid a) => b -> a -> a+stimesMonoid n x0 = case compare n 0 of+ LT -> error "stimesMonoid: negative multiplier"+ EQ -> mempty+ GT -> f x0 n+ where+ f x y+ | even y = f (x `mappend` x) (y `quot` 2)+ | y == 1 = x+ | otherwise = g (x `mappend` x) (y `quot` 2) x+ g x y z+ | even y = g (x `mappend` x) (y `quot` 2) z+ | y == 1 = x `mappend` z+ | otherwise = g (x `mappend` x) (y `quot` 2) (x `mappend` z)++---------------------
lib/Data/Ord.hs view
@@ -6,6 +6,7 @@ import Primitives import Data.Bool_Type import Data.Bounded+import Data.Functor import Data.Ordering_Type import Data.Eq import Text.Show@@ -50,3 +51,62 @@ comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering comparing f x y = compare (f x) (f y)++{-+newtype Down a = Down+ { getDown :: a -- ^ @since 4.14.0.0+ }+ deriving+ ( Eq -- ^ @since 4.6.0.0+ , Num -- ^ @since 4.11.0.0+ , Semigroup -- ^ @since 4.11.0.0+ , Monoid -- ^ @since 4.11.0.0+ , Bits -- ^ @since 4.14.0.0+ , FiniteBits -- ^ @since 4.14.0.0+ , Floating -- ^ @since 4.14.0.0+ , Fractional -- ^ @since 4.14.0.0+ , Ix -- ^ @since 4.14.0.0+ , Real -- ^ @since 4.14.0.0+ , RealFrac -- ^ @since 4.14.0.0+ , RealFloat -- ^ @since 4.14.0.0+ , Storable -- ^ @since 4.14.0.0+ )+-}++newtype Down a = Down a++getDown :: Down a -> a+getDown (Down a) = a++{-+instance (Read a) => Read (Down a) where+ readsPrec d = readParen (d > 10) $ \ r ->+ [(Down x,t) | ("Down",s) <- lex r, (x,t) <- readsPrec 11 s]+-}+{- In Data.Orphans+instance (Show a) => Show (Down a) where+-}++instance Eq a => Eq (Down a) where+ Down x == Down y = x == y++instance Ord a => Ord (Down a) where+ compare (Down x) (Down y) = y `compare` x++instance Bounded a => Bounded (Down a) where+ minBound = Down maxBound+ maxBound = Down minBound++instance Functor Down where+ fmap f (Down a) = Down (f a)++{-+-- | @since 4.11.0.0+instance Applicative Down where+ pure = Down+ (<*>) = coerce++-- | @since 4.11.0.0+instance Monad Down where+ Down a >>= k = k a+-}
+ lib/Data/Orphans.hs view
@@ -0,0 +1,8 @@+-- Instance declarations that can't be put where+-- due to import cycles.+module Data.Orphans where+import Prelude(); import MiniPrelude++instance (Show a) => Show (Down a) where+ showsPrec d (Down x) = showParen (d > 10) $+ showString "Down " . showsPrec 11 x
lib/Data/Ratio.hs view
@@ -2,6 +2,7 @@ Ratio, Rational, (%), numerator, denominator,+ approxRational, rationalInfinity, rationalNaN, rationalMinusZero,@@ -17,6 +18,7 @@ import Data.Ord import Data.Ratio_Type import Data.Real+import Data.RealFrac import Text.Show {- in Data.Ratio_Type@@ -98,3 +100,43 @@ denominator :: forall a . Ratio a -> a denominator (_ :% y) = y++instance (Ord a, Integral a) => RealFrac (Ratio a) where+ properFraction (x:%y) = (fromInteger (toInteger q), r:%y)+ where (q, r) = quotRem x y+ round r =+ let+ (n, f) = properFraction r+ x = if r < 0 then -1 else 1+ in case (compare (abs f) 0.5, odd n) of+ (LT, _) -> n+ (EQ, False) -> n+ (EQ, True) -> n + x+ (GT, _) -> n + x++approxRational :: (RealFrac a) => a -> a -> Rational+approxRational rat eps =+ simplest (toRational rat - toRational eps) (toRational rat + toRational eps)+ where+ simplest x y+ | y < x = simplest y x+ | x == y = xr+ | x > 0 = simplest' n d n' d'+ | y < 0 = - simplest' (-n') d' (-n) d+ | otherwise = 0 :% 1+ where xr = toRational x+ n = numerator xr+ d = denominator xr+ nd' = toRational y+ n' = numerator nd'+ d' = denominator nd'++ simplest' n d n' d' -- assumes 0 < n%d < n'%d'+ | r == 0 = q :% 1+ | q /= q' = (q+1) :% 1+ | otherwise = (q*n''+d'') :% n''+ where (q,r) = quotRem n d+ (q',r') = quotRem n' d'+ nd'' = simplest' d' r' d r+ n'' = numerator nd''+ d'' = denominator nd''
lib/Data/Records.hs view
@@ -9,7 +9,6 @@ import Primitives import Data.Function import Data.Proxy-import Data.Tuple type Get r a = r -> a type Set r a = r -> a -> r@@ -30,27 +29,3 @@ composeSet gs1 b_to_c_to_b a c = case gs1 a of (b, b_to_a) -> b_to_a (b_to_c_to_b b c)---------------------------------------- Virtual fields for tuples.--instance forall a b . HasField "_1" (a, b) a where getField _ (a, b) = a-instance forall a b . SetField "_1" (a, b) a where setField _ (a, b) = \ a -> (a, b)-instance forall a b . HasField "_2" (a, b) b where getField _ (a, b) = b-instance forall a b . SetField "_2" (a, b) b where setField _ (a, b) = \ b -> (a, b)--instance forall a b c . HasField "_1" (a, b, c) a where getField _ (a, b, c) = a-instance forall a b c . SetField "_1" (a, b, c) a where setField _ (a, b, c) = \ a -> (a, b, c)-instance forall a b c . HasField "_2" (a, b, c) b where getField _ (a, b, c) = b-instance forall a b c . SetField "_2" (a, b, c) b where setField _ (a, b, c) = \ b -> (a, b, c)-instance forall a b c . HasField "_3" (a, b, c) c where getField _ (a, b, c) = c-instance forall a b c . SetField "_3" (a, b, c) c where setField _ (a, b, c) = \ c -> (a, b, c)--instance forall a b c d . HasField "_1" (a, b, c, d) a where getField _ (a, b, c, d) = a-instance forall a b c d . SetField "_1" (a, b, c, d) a where setField _ (a, b, c, d) = \ a -> (a, b, c, d)-instance forall a b c d . HasField "_2" (a, b, c, d) b where getField _ (a, b, c, d) = b-instance forall a b c d . SetField "_2" (a, b, c, d) b where setField _ (a, b, c, d) = \ b -> (a, b, c, d)-instance forall a b c d . HasField "_3" (a, b, c, d) c where getField _ (a, b, c, d) = c-instance forall a b c d . SetField "_3" (a, b, c, d) c where setField _ (a, b, c, d) = \ c -> (a, b, c, d)-instance forall a b c d . HasField "_4" (a, b, c, d) d where getField _ (a, b, c, d) = d-instance forall a b c d . SetField "_4" (a, b, c, d) d where setField _ (a, b, c, d) = \ d -> (a, b, c, d)
lib/Data/STRef.hs view
@@ -2,11 +2,13 @@ STRef, newSTRef, readSTRef, writeSTRef, modifySTRef, ) where-import Prelude+import Prelude(); import MiniPrelude import Control.Monad.ST_Type import Data.IORef+import {-# SOURCE #-} Data.Typeable newtype STRef s a = R (IORef a)+ deriving (Typeable) newSTRef :: forall s a . a -> ST s (STRef s a) newSTRef a = ST (R <$> newIORef a)
lib/Data/Semigroup.hs view
@@ -1,7 +1,158 @@-module Data.Semigroup(module Data.Semigroup) where+module Data.Semigroup(+ Semigroup(..),+ Endo(..),+ Dual(..),+ Max(..),+ Min(..),+ Sum(..),+ Product(..),+ All(..),+ Any(..),+ Arg(..), ArgMin, ArgMax,+ Alt(..),+ First(..),+ Last(..),+ stimesIdempotent, stimesIdempotentMonoid, stimesMonoid,+ diff, cycle1,+ ) where import Prelude() -- do not import Prelude-import Primitives+import Data.Bool+import Data.Bounded+import Data.Eq+import Data.Function+import Data.List.NonEmpty_Type+import Data.Ord+import Data.Monoid.Internal+import Data.Records+import Text.Show -infixr 6 <>-class Semigroup a where- (<>) :: a -> a -> a+{-+newtype First a = First { getFirst :: a }+ deriving ( Bounded -- ^ @since 4.9.0.0+ , Eq -- ^ @since 4.9.0.0+ , Ord -- ^ @since 4.9.0.0+ , Show -- ^ @since 4.9.0.0+ , Read -- ^ @since 4.9.0.0+ , Data -- ^ @since 4.9.0.0+ , Generic -- ^ @since 4.9.0.0+ , Generic1 -- ^ @since 4.9.0.0+ )++instance Enum a => Enum (First a) where+ succ (First a) = First (succ a)+ pred (First a) = First (pred a)+ toEnum = First . toEnum+ fromEnum = fromEnum . getFirst+ enumFrom (First a) = First `fmap` enumFrom a+ enumFromThen (First a) (First b) = First `fmap` enumFromThen a b+ enumFromTo (First a) (First b) = First `fmap` enumFromTo a b+ enumFromThenTo (First a) (First b) (First c) = First `fmap` enumFromThenTo a b c+-}++newtype First a = First { getFirst :: a }+ deriving(Eq, Ord, Show, Bounded)++instance Semigroup (First a) where+ a <> _ = a+ stimes = stimesIdempotent+ sconcat (x :| _) = x++{-+-- | @since 4.9.0.0+instance Functor First where+ fmap f (First x) = First (f x)++-- | @since 4.9.0.0+instance Foldable First where+ foldMap f (First a) = f a++-- | @since 4.9.0.0+instance Traversable First where+ traverse f (First a) = First `fmap` f a++-- | @since 4.9.0.0+instance Applicative First where+ pure x = First x+ a <* _ = a+ _ *> a = a+ (<*>) = coerce+ liftA2 = coerce++-- | @since 4.9.0.0+instance Monad First where+ (>>) = (*>)+ First a >>= f = f a++-- | @since 4.9.0.0+instance MonadFix First where+ mfix f = fix (f . getFirst)+-}++{-+newtype Last a = Last { getLast :: a }+ deriving ( Bounded -- ^ @since 4.9.0.0+ , Eq -- ^ @since 4.9.0.0+ , Ord -- ^ @since 4.9.0.0+ , Show -- ^ @since 4.9.0.0+ , Read -- ^ @since 4.9.0.0+ , Data -- ^ @since 4.9.0.0+ , Generic -- ^ @since 4.9.0.0+ , Generic1 -- ^ @since 4.9.0.0+ )++-- | @since 4.9.0.0+instance Enum a => Enum (Last a) where+ succ (Last a) = Last (succ a)+ pred (Last a) = Last (pred a)+ toEnum = Last . toEnum+ fromEnum = fromEnum . getLast+ enumFrom (Last a) = Last `fmap` enumFrom a+ enumFromThen (Last a) (Last b) = Last `fmap` enumFromThen a b+ enumFromTo (Last a) (Last b) = Last `fmap` enumFromTo a b+ enumFromThenTo (Last a) (Last b) (Last c) = Last `fmap` enumFromThenTo a b c+-}++newtype Last a = Last { getLast :: a }+ deriving(Eq, Ord, Show, Bounded)++instance Semigroup (Last a) where+ _ <> b = b+ stimes = stimesIdempotent++{-+-- | @since 4.9.0.0+instance Functor Last where+ fmap f (Last x) = Last (f x)+ a <$ _ = Last a++-- | @since 4.9.0.0+instance Foldable Last where+ foldMap f (Last a) = f a++-- | @since 4.9.0.0+instance Traversable Last where+ traverse f (Last a) = Last `fmap` f a++-- | @since 4.9.0.0+instance Applicative Last where+ pure = Last+ a <* _ = a+ _ *> a = a+ (<*>) = coerce+ liftA2 = coerce++-- | @since 4.9.0.0+instance Monad Last where+ (>>) = (*>)+ Last a >>= f = f a++-- | @since 4.9.0.0+instance MonadFix Last where+ mfix f = fix (f . getLast)+-}++diff :: Semigroup m => m -> Endo m+diff = Endo . (<>)++cycle1 :: Semigroup m => m -> m+cycle1 xs = xs' where xs' = xs <> xs'
lib/Data/Text.hs view
@@ -5,9 +5,8 @@ append, head, ) where-import Prelude hiding(head)-import Data.Monoid-import Data.Semigroup+import Prelude(); import MiniPrelude hiding(head)+import Data.Monoid.Internal import Data.String import qualified Data.ByteString.Internal as BS
lib/Data/Traversable.hs view
@@ -19,7 +19,6 @@ -- * Utility functions for, forM,-{- forAccumM, mapAccumL, mapAccumR,@@ -27,24 +26,24 @@ -- * General definitions for superclass methods fmapDefault, foldMapDefault,--} ) where import Prelude() -- do not import Prelude import Primitives import Control.Applicative-import Control.Monad(Monad(..), MonadPlus(..))+import Control.Error+import Control.Monad(Monad(..), MonadPlus(..), liftM) --import Data.Coerce import Data.Either import Data.Foldable+import Data.Foldable.Internal(StateL(..), runStateL, StateR(..), runStateR, StateT(..), runStateT) import Data.Function import Data.Functor import Data.Functor.Const import Data.Functor.Identity---import Data.Functor.Utils ( StateL(..), StateR(..), StateT(..), (#.) ) import Data.List_Type import qualified Data.List as List import Data.Maybe-import Data.Monoid+import Data.Monoid.Internal import Data.Proxy --import Data.Ord ( Down(..) ) --import Data.Proxy ( Proxy(..) )@@ -143,6 +142,8 @@ instance Traversable ZipList where traverse f (ZipList x) = ZipList <$> traverse f x +instance Traversable (Arg a) where+ traverse f (Arg x a) = Arg x `fmap` f a -- Instances for GHC.Generics -- | @since 4.9.0.0@@ -212,28 +213,31 @@ forM :: forall (t :: Type -> Type) (m :: Type -> Type) a b . (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b) forM = flip mapM -{- mapAccumL :: forall t s a b. Traversable t => (s -> a -> (s, b)) -> s -> t a -> (s, t b)-mapAccumL f s t = coerce (traverse @t @(StateL s) @a @b) (flip f) t s+mapAccumL f s t =+ runStateL (traverse (StateL . flip f) t) s+ --coerce (traverse @t @(StateL s) @a @b) (flip f) t s mapAccumR :: forall t s a b. Traversable t => (s -> a -> (s, b)) -> s -> t a -> (s, t b)-mapAccumR f s t = coerce (traverse @t @(StateR s) @a @b) (flip f) t s+mapAccumR f s t =+ runStateR (traverse (StateR . flip f) t) s+ --coerce (traverse @t @(StateR s) @a @b) (flip f) t s mapAccumM :: forall m t s a b. (Monad m, Traversable t) => (s -> a -> m (s, b)) -> s -> t a -> m (s, t b)-mapAccumM f s t = coerce (mapM @t @(StateT s m) @a @b) (StateT #. flip f) t s+mapAccumM f s t =+ runStateT (traverse (StateT . flip f) t) s+ -- coerce (mapM @t @(StateT s m) @a @b) (StateT #. flip f) t s forAccumM :: (Monad m, Traversable t) => s -> t a -> (s -> a -> m (s, b)) -> m (s, t b) forAccumM s t f = mapAccumM f s t --}- fmapDefault :: forall t a b . Traversable t => (a -> b) -> t a -> t b fmapDefault f = runIdentity . traverse (Identity . f)@@ -241,3 +245,6 @@ foldMapDefault :: forall t m a . (Traversable t, Monoid m) => (a -> m) -> t a -> m foldMapDefault f = getConst . traverse (Const . f)++-----------------------+
lib/Data/Tuple.hs view
@@ -11,9 +11,9 @@ import Data.Eq import Data.Function import Data.Int-import Data.Monoid+import Data.Monoid.Internal+import Data.Records import Data.Ord-import Data.Semigroup import Text.Show --data (a,b) = (a,b) -- all tuples are built in@@ -142,3 +142,28 @@ instance forall a b c d . (Monoid a, Monoid b, Monoid c, Monoid d) => Monoid (a, b, c, d) where mempty = (mempty, mempty, mempty, mempty)+++-----------------------------------+-- Virtual fields for tuples.++instance forall a b . HasField "_1" (a, b) a where getField _ (a, b) = a+instance forall a b . SetField "_1" (a, b) a where setField _ (a, b) = \ a -> (a, b)+instance forall a b . HasField "_2" (a, b) b where getField _ (a, b) = b+instance forall a b . SetField "_2" (a, b) b where setField _ (a, b) = \ b -> (a, b)++instance forall a b c . HasField "_1" (a, b, c) a where getField _ (a, b, c) = a+instance forall a b c . SetField "_1" (a, b, c) a where setField _ (a, b, c) = \ a -> (a, b, c)+instance forall a b c . HasField "_2" (a, b, c) b where getField _ (a, b, c) = b+instance forall a b c . SetField "_2" (a, b, c) b where setField _ (a, b, c) = \ b -> (a, b, c)+instance forall a b c . HasField "_3" (a, b, c) c where getField _ (a, b, c) = c+instance forall a b c . SetField "_3" (a, b, c) c where setField _ (a, b, c) = \ c -> (a, b, c)++instance forall a b c d . HasField "_1" (a, b, c, d) a where getField _ (a, b, c, d) = a+instance forall a b c d . SetField "_1" (a, b, c, d) a where setField _ (a, b, c, d) = \ a -> (a, b, c, d)+instance forall a b c d . HasField "_2" (a, b, c, d) b where getField _ (a, b, c, d) = b+instance forall a b c d . SetField "_2" (a, b, c, d) b where setField _ (a, b, c, d) = \ b -> (a, b, c, d)+instance forall a b c d . HasField "_3" (a, b, c, d) c where getField _ (a, b, c, d) = c+instance forall a b c d . SetField "_3" (a, b, c, d) c where setField _ (a, b, c, d) = \ c -> (a, b, c, d)+instance forall a b c d . HasField "_4" (a, b, c, d) d where getField _ (a, b, c, d) = d+instance forall a b c d . SetField "_4" (a, b, c, d) d where setField _ (a, b, c, d) = \ d -> (a, b, c, d)
+ lib/Data/Tuple/Instances.hs view
@@ -0,0 +1,33 @@+module Data.Tuple.Instances where++-- Dubious instances for tuples++instance Functor ((,) a1) where+ fmap f (a1, a) = (a1, f a)++instance Functor ((,,) a1 a2) where+ fmap f (a1, a2, a) = (a1, a2, f a)++instance Functor ((,,,) a1 a2 a3) where+ fmap f (a1, a2, a3, a) = (a1, a2, a3, f a)++instance (Monoid a1) => Applicative ((,) a1) where+ pure a = (mempty, a)+ (a1, f) <*> (a1', a) = (a1 <> a1', f a)++instance (Monoid a1, Monoid a2) => Applicative ((,,) a1 a2) where+ pure a = (mempty, mempty, a)+ (a1, a2, f) <*> (a1', a2', a) = (a1 <> a1', a2 <> a2', f a)++instance (Monoid a1, Monoid a2, Monoid a3) => Applicative ((,,,) a1 a2 a3) where+ pure a = (mempty, mempty, mempty, a)+ (a1, a2, a3, f) <*> (a1', a2', a3', a) = (a1 <> a1', a2 <> a2', a3 <> a3', f a)++instance Monoid a1 => Monad ((,) a1) where+ (a1, a) >>= k = case k a of (a1', b) -> (a1 <> a1', b)++instance (Monoid a1, Monoid a2) => Monad ((,,) a1 a2) where+ (a1, a2, a) >>= k = case k a of (a1', a2', b) -> (a1 <> a1', a2 <> a2', b)++instance (Monoid a1, Monoid a2, Monoid a3) => Monad ((,,,) a1 a2 a3) where+ (a1, a2, a3, a) >>= k = case k a of (a1', a2', a3', b) -> (a1 <> a1', a2 <> a2', a3 <> a3', b)
lib/Data/Type/Equality.hs view
@@ -1,5 +1,5 @@ module Data.Type.Equality(module Data.Type.Equality) where-import Prelude+import Prelude(); import MiniPrelude type (:~:) :: forall k . k -> k -> Type data a :~: b = (a ~ b) => Refl
lib/Data/TypeLits.hs view
@@ -4,8 +4,10 @@ KnownNat(..), KnownSymbol(..), ) where+import Prelude() import Primitives-import Prelude+import Data.Char_Type+import Data.Integer class KnownNat (n :: Nat) where natVal :: forall (proxy :: Nat -> Type) . proxy n -> Integer
lib/Data/Typeable.hs view
@@ -17,13 +17,12 @@ typeRepTyCon, typeRepArgs, ) where+import Prelude(); import MiniPrelude import Primitives-import Prelude-import Control.Monad.ST-import Data.IORef+import Data.Double+import Data.Integer import Data.Proxy import Data.Ratio-import Data.STRef import Data.Type.Equality import Data.Void import Data.Word@@ -157,8 +156,9 @@ instance Typeable IO where typeRep = prim "IO" instance Typeable Ptr where typeRep = prim "Ptr"+instance Typeable FunPtr where typeRep = prim "FunPtr"+instance Typeable ForeignPtr where typeRep = prim "ForeignPtr" instance Typeable IOArray where typeRep = prim "IOArray"-instance Typeable IORef where typeRep = nullary "Data.IORef" "IORef" instance Typeable [] where typeRep = nullary "Data.List_Type" "[]" instance Typeable Maybe where typeRep = nullary "Data.Maybe_Type" "Maybe"@@ -171,8 +171,6 @@ instance Typeable (,) where typeRep = nullary "Data.Tuple" "," instance Typeable (->) where typeRep = prim "->" instance Typeable Either where typeRep = nullary "Data.Either" "Either"-instance Typeable ST where typeRep = nullary "Control.Monad.ST" "ST"-instance Typeable STRef where typeRep = nullary "Data.STRef" "STRef" instance Typeable (,,) where typeRep = nullary "Data.Tuple" ",," instance Typeable (,,,) where typeRep = nullary "Data.Tuple" ",,,"
+ lib/Data/Typeable/Internal.hs view
@@ -0,0 +1,26 @@+module Data.Typeable.Internal(module Data.Typeable.Internal) where+import Prelude()+import Data.Char_Type+import Data.List_Type+import System.IO.MD5++type Typeable :: forall k . k -> Constraint+class Typeable a where+ typeRep :: forall proxy . proxy a -> TypeRep++data TypeRep = TypeRep MD5CheckSum TyCon [TypeRep]++trMd5 :: TypeRep -> MD5CheckSum+trMd5 (TypeRep md5 _ _) = md5++mkTyConApp :: TyCon -> [TypeRep] -> TypeRep+mkTyConApp tc@(TyCon cmd5 _ _) trs = TypeRep md5 tc trs+ where md5 = md5Combine (cmd5 : f trs)+ f [] = []+ f (x:xs) = trMd5 x : f xs++data TyCon = TyCon MD5CheckSum String String++mkTyCon :: String -> String -> TyCon+mkTyCon m n = TyCon md5 m n+ where md5 = md5String (m ++ ("."::String) ++ n)
lib/Data/Version.hs view
@@ -3,6 +3,7 @@ showVersion, makeVersion ) where+import Prelude(); import MiniPrelude import Data.List(intercalate) data Version = Version { versionBranch :: [Int] }
lib/Data/Void.hs view
@@ -1,5 +1,5 @@ module Data.Void(module Data.Void) where-import Prelude+import Prelude(); import MiniPrelude data Void
lib/Data/Word.hs view
@@ -19,8 +19,7 @@ import Data.Num import Data.Ord import Data.Real-import Numeric-import Text.Read+import Numeric.Show import Text.Show instance Num Word where@@ -46,8 +45,10 @@ instance Show Word where showsPrec = showIntegral +{- in Text.Read.Internal instance Read Word where readsPrec = readIntegral+-} -------------------------------- @@ -74,6 +75,7 @@ (/=) = primWordNE instance Ord Word where+ compare = primWordCompare (<) = primWordLT (<=) = primWordLE (>) = primWordGT@@ -93,6 +95,10 @@ bit n = primWordShl 1 n zeroBits = 0 ++instance FiniteBits Word where+ finiteBitSize _ = _wordSize+ -------------------------------------------------------------------------------- ---- Word8 @@ -109,7 +115,7 @@ bini8 :: (Word -> Int -> Word) -> (Word8 -> Int -> Word8) bini8 op (W8 x) y = w8 (x `op` y) -cmp8 :: (Word -> Word -> Bool) -> (Word8 -> Word8 -> Bool)+cmp8 :: (Word -> Word -> a) -> (Word8 -> Word8 -> a) cmp8 op (W8 x) (W8 y) = x `op` y una8 :: (Word -> Word) -> (Word8 -> Word8)@@ -138,8 +144,10 @@ instance Show Word8 where showsPrec = showIntegral +{- in Text.Read.Internal instance Read Word8 where readsPrec = readIntegral+-} instance Enum Word8 where succ x = x + 1@@ -162,6 +170,7 @@ (/=) = cmp8 primWordNE instance Ord Word8 where+ compare = cmp8 primWordCompare (<) = cmp8 primWordLT (<=) = cmp8 primWordLE (>) = cmp8 primWordGT@@ -179,6 +188,9 @@ bit n = w8 (primWordShl 1 n) zeroBits = 0 +instance FiniteBits Word8 where+ finiteBitSize _ = 8+ -------------------------------------------------------------------------------- ---- Word16 @@ -195,7 +207,7 @@ bini16 :: (Word -> Int -> Word) -> (Word16 -> Int -> Word16) bini16 op (W16 x) y = w16 (x `op` y) -cmp16 :: (Word -> Word -> Bool) -> (Word16 -> Word16 -> Bool)+cmp16 :: (Word -> Word -> a) -> (Word16 -> Word16 -> a) cmp16 op (W16 x) (W16 y) = x `op` y una16 :: (Word -> Word) -> (Word16 -> Word16)@@ -224,8 +236,10 @@ instance Show Word16 where showsPrec = showIntegral +{- in Text.Read.Internal instance Read Word16 where readsPrec = readIntegral+-} instance Enum Word16 where succ x = x + 1@@ -248,6 +262,7 @@ (/=) = cmp16 primWordNE instance Ord Word16 where+ compare = cmp16 primWordCompare (<) = cmp16 primWordLT (<=) = cmp16 primWordLE (>) = cmp16 primWordGT@@ -265,6 +280,9 @@ bit n = w16 (primWordShl 1 n) zeroBits = 0 +instance FiniteBits Word16 where+ finiteBitSize _ = 16+ -------------------------------------------------------------------------------- ---- Word32 @@ -281,7 +299,7 @@ bini32 :: (Word -> Int -> Word) -> (Word32 -> Int -> Word32) bini32 op (W32 x) y = w32 (x `op` y) -cmp32 :: (Word -> Word -> Bool) -> (Word32 -> Word32 -> Bool)+cmp32 :: (Word -> Word -> a) -> (Word32 -> Word32 -> a) cmp32 op (W32 x) (W32 y) = x `op` y una32 :: (Word -> Word) -> (Word32 -> Word32)@@ -310,8 +328,10 @@ instance Show Word32 where showsPrec = showIntegral +{- in Text.Read.Internal instance Read Word32 where readsPrec = readIntegral+-} instance Enum Word32 where succ x = x + 1@@ -334,6 +354,7 @@ (/=) = cmp32 primWordNE instance Ord Word32 where+ compare = cmp32 primWordCompare (<) = cmp32 primWordLT (<=) = cmp32 primWordLE (>) = cmp32 primWordGT@@ -351,6 +372,9 @@ bit n = w32 (primWordShl 1 n) zeroBits = 0 +instance FiniteBits Word32 where+ finiteBitSize _ = 32+ -------------------------------------------------------------------------------- ---- Word64 @@ -367,7 +391,7 @@ bini64 :: (Word -> Int -> Word) -> (Word64 -> Int -> Word64) bini64 op (W64 x) y = w64 (x `op` y) -cmp64 :: (Word -> Word -> Bool) -> (Word64 -> Word64 -> Bool)+cmp64 :: (Word -> Word -> a) -> (Word64 -> Word64 -> a) cmp64 op (W64 x) (W64 y) = x `op` y una64 :: (Word -> Word) -> (Word64 -> Word64)@@ -396,8 +420,10 @@ instance Show Word64 where showsPrec = showIntegral +{- in Text.Read.Internal instance Read Word64 where readsPrec = readIntegral+-} instance Enum Word64 where succ x = x + 1@@ -420,6 +446,7 @@ (/=) = cmp64 primWordNE instance Ord Word64 where+ compare = cmp64 primWordCompare (<) = cmp64 primWordLT (<=) = cmp64 primWordLE (>) = cmp64 primWordGT@@ -436,3 +463,6 @@ bitSize _ = 64 bit n = w64 (primWordShl 1 n) zeroBits = 0++instance FiniteBits Word64 where+ finiteBitSize _ = 64
lib/Debug/Trace.hs view
@@ -1,5 +1,5 @@ module Debug.Trace(module Debug.Trace) where-import Prelude+import Prelude(); import MiniPrelude import Primitives trace :: forall a . String -> a -> a
+ lib/Foreign.hs view
@@ -0,0 +1,19 @@+module Foreign+ ( module Data.Bits+ , module Data.Int+ , module Data.Word+ , module Foreign.Ptr+ , module Foreign.ForeignPtr+-- , module Foreign.StablePtr+ , module Foreign.Storable+ , module Foreign.Marshal+ ) where++import Data.Bits+import Data.Int+import Data.Word+import Foreign.Ptr+import Foreign.ForeignPtr+--import Foreign.StablePtr+import Foreign.Storable+import Foreign.Marshal
+ lib/Foreign/C.hs view
@@ -0,0 +1,9 @@+module Foreign.C(+ module Foreign.C.Types,+ module Foreign.C.String,+ module Foreign.C.Error+ ) where++import Foreign.C.Types+import Foreign.C.String+import Foreign.C.Error
+ lib/Foreign/C/Error.hs view
@@ -0,0 +1,490 @@+-----------------------------------------------------------------------------+-- |+-- Module : GHC.Internal.Foreign.C.Error+-- Copyright : (c) The FFI task force 2001+-- License : BSD-style (see the file libraries/base/LICENSE)+--+-- Maintainer : ffi@haskell.org+-- Stability : provisional+-- Portability : portable+--+-- C-specific Marshalling support: Handling of C \"errno\" error codes.+--+-----------------------------------------------------------------------------++module Foreign.C.Error (+ -- * Haskell representations of @errno@ values++ Errno(..),++ eAGAIN, eINTR, eWOULDBLOCK,+{-+ -- ** Common @errno@ symbols+ -- | Different operating systems and\/or C libraries often support+ -- different values of @errno@. This module defines the common values,+ -- but due to the open definition of 'Errno' users may add definitions+ -- which are not predefined.+ eOK, e2BIG, eACCES, eADDRINUSE, eADDRNOTAVAIL, eADV, eAFNOSUPPORT, eAGAIN,+ eALREADY, eBADF, eBADMSG, eBADRPC, eBUSY, eCHILD, eCOMM, eCONNABORTED,+ eCONNREFUSED, eCONNRESET, eDEADLK, eDESTADDRREQ, eDIRTY, eDOM, eDQUOT,+ eEXIST, eFAULT, eFBIG, eFTYPE, eHOSTDOWN, eHOSTUNREACH, eIDRM, eILSEQ,+ eINPROGRESS, eINTR, eINVAL, eIO, eISCONN, eISDIR, eLOOP, eMFILE, eMLINK,+ eMSGSIZE, eMULTIHOP, eNAMETOOLONG, eNETDOWN, eNETRESET, eNETUNREACH,+ eNFILE, eNOBUFS, eNODATA, eNODEV, eNOENT, eNOEXEC, eNOLCK, eNOLINK,+ eNOMEM, eNOMSG, eNONET, eNOPROTOOPT, eNOSPC, eNOSR, eNOSTR, eNOSYS,+ eNOTBLK, eNOTCONN, eNOTDIR, eNOTEMPTY, eNOTSOCK, eNOTSUP, eNOTTY, eNXIO,+ eOPNOTSUPP, ePERM, ePFNOSUPPORT, ePIPE, ePROCLIM, ePROCUNAVAIL,+ ePROGMISMATCH, ePROGUNAVAIL, ePROTO, ePROTONOSUPPORT, ePROTOTYPE,+ eRANGE, eREMCHG, eREMOTE, eROFS, eRPCMISMATCH, eRREMOTE, eSHUTDOWN,+ eSOCKTNOSUPPORT, eSPIPE, eSRCH, eSRMNT, eSTALE, eTIME, eTIMEDOUT,+ eTOOMANYREFS, eTXTBSY, eUSERS, eWOULDBLOCK, eXDEV,+-}+ -- ** 'Errno' functions+ isValidErrno,++ -- access to the current thread's "errno" value+ --+ getErrno,+ resetErrno,++ -- conversion of an "errno" value into IO error+ --+ errnoToIOError,++ -- throw current "errno" value+ --+ throwErrno,++ -- ** Guards for IO operations that may fail++ throwErrnoIf,+ throwErrnoIf_,+ throwErrnoIfRetry,+ throwErrnoIfRetry_,+ throwErrnoIfMinus1,+ throwErrnoIfMinus1_,+ throwErrnoIfMinus1Retry,+ throwErrnoIfMinus1Retry_,+ throwErrnoIfNull,+ throwErrnoIfNullRetry,++ throwErrnoIfRetryMayBlock,+ throwErrnoIfRetryMayBlock_,+ throwErrnoIfMinus1RetryMayBlock,+ throwErrnoIfMinus1RetryMayBlock_,+ throwErrnoIfNullRetryMayBlock,++ throwErrnoPath,+ throwErrnoPathIf,+ throwErrnoPathIf_,+ throwErrnoPathIfNull,+ throwErrnoPathIfMinus1,+ throwErrnoPathIfMinus1_,+) where+import Prelude(); import MiniPrelude++import Foreign.Ptr+import Foreign.Marshal.Alloc+import Foreign.C.Types+import Foreign.C.String+import Foreign.Storable+import Data.Functor(void)+import Data.Maybe+import System.IO(Handle)+import System.IO.Error+import System.IO.Unsafe(unsafePerformIO)++{-+import GHC.Internal.IO+import GHC.Internal.IO.Exception+import GHC.Internal.IO.Handle.Types+import GHC.Internal.Num+import GHC.Internal.Base+-}++newtype Errno = Errno Int++instance Eq Errno where+ errno1@(Errno no1) == errno2@(Errno no2)+ | isValidErrno errno1 && isValidErrno errno2 = no1 == no2+ | otherwise = False++{-+eOK, e2BIG, eACCES, eADDRINUSE, eADDRNOTAVAIL, eADV, eAFNOSUPPORT, eAGAIN,+ eALREADY, eBADF, eBADMSG, eBADRPC, eBUSY, eCHILD, eCOMM, eCONNABORTED,+ eCONNREFUSED, eCONNRESET, eDEADLK, eDESTADDRREQ, eDIRTY, eDOM, eDQUOT,+ eEXIST, eFAULT, eFBIG, eFTYPE, eHOSTDOWN, eHOSTUNREACH, eIDRM, eILSEQ,+ eINPROGRESS, eINTR, eINVAL, eIO, eISCONN, eISDIR, eLOOP, eMFILE, eMLINK,+ eMSGSIZE, eMULTIHOP, eNAMETOOLONG, eNETDOWN, eNETRESET, eNETUNREACH,+ eNFILE, eNOBUFS, eNODATA, eNODEV, eNOENT, eNOEXEC, eNOLCK, eNOLINK,+ eNOMEM, eNOMSG, eNONET, eNOPROTOOPT, eNOSPC, eNOSR, eNOSTR, eNOSYS,+ eNOTBLK, eNOTCONN, eNOTDIR, eNOTEMPTY, eNOTSOCK, eNOTSUP, eNOTTY, eNXIO,+ eOPNOTSUPP, ePERM, ePFNOSUPPORT, ePIPE, ePROCLIM, ePROCUNAVAIL,+ ePROGMISMATCH, ePROGUNAVAIL, ePROTO, ePROTONOSUPPORT, ePROTOTYPE,+ eRANGE, eREMCHG, eREMOTE, eROFS, eRPCMISMATCH, eRREMOTE, eSHUTDOWN,+ eSOCKTNOSUPPORT, eSPIPE, eSRCH, eSRMNT, eSTALE, eTIME, eTIMEDOUT,+ eTOOMANYREFS, eTXTBSY, eUSERS, eWOULDBLOCK, eXDEV :: Errno++eOK = Errno 0+e2BIG = Errno (CONST_E2BIG)+eACCES = Errno (CONST_EACCES)+eADDRINUSE = Errno (CONST_EADDRINUSE)+eADDRNOTAVAIL = Errno (CONST_EADDRNOTAVAIL)+eADV = Errno (CONST_EADV)+eAFNOSUPPORT = Errno (CONST_EAFNOSUPPORT)+eAGAIN = Errno (CONST_EAGAIN)+eALREADY = Errno (CONST_EALREADY)+eBADF = Errno (CONST_EBADF)+eBADMSG = Errno (CONST_EBADMSG)+eBADRPC = Errno (CONST_EBADRPC)+eBUSY = Errno (CONST_EBUSY)+eCHILD = Errno (CONST_ECHILD)+eCOMM = Errno (CONST_ECOMM)+eCONNABORTED = Errno (CONST_ECONNABORTED)+eCONNREFUSED = Errno (CONST_ECONNREFUSED)+eCONNRESET = Errno (CONST_ECONNRESET)+eDEADLK = Errno (CONST_EDEADLK)+eDESTADDRREQ = Errno (CONST_EDESTADDRREQ)+eDIRTY = Errno (CONST_EDIRTY)+eDOM = Errno (CONST_EDOM)+eDQUOT = Errno (CONST_EDQUOT)+eEXIST = Errno (CONST_EEXIST)+eFAULT = Errno (CONST_EFAULT)+eFBIG = Errno (CONST_EFBIG)+eFTYPE = Errno (CONST_EFTYPE)+eHOSTDOWN = Errno (CONST_EHOSTDOWN)+eHOSTUNREACH = Errno (CONST_EHOSTUNREACH)+eIDRM = Errno (CONST_EIDRM)+eILSEQ = Errno (CONST_EILSEQ)+eINPROGRESS = Errno (CONST_EINPROGRESS)+eINTR = Errno (CONST_EINTR)+eINVAL = Errno (CONST_EINVAL)+eIO = Errno (CONST_EIO)+eISCONN = Errno (CONST_EISCONN)+eISDIR = Errno (CONST_EISDIR)+eLOOP = Errno (CONST_ELOOP)+eMFILE = Errno (CONST_EMFILE)+eMLINK = Errno (CONST_EMLINK)+eMSGSIZE = Errno (CONST_EMSGSIZE)+eMULTIHOP = Errno (CONST_EMULTIHOP)+eNAMETOOLONG = Errno (CONST_ENAMETOOLONG)+eNETDOWN = Errno (CONST_ENETDOWN)+eNETRESET = Errno (CONST_ENETRESET)+eNETUNREACH = Errno (CONST_ENETUNREACH)+eNFILE = Errno (CONST_ENFILE)+eNOBUFS = Errno (CONST_ENOBUFS)+eNODATA = Errno (CONST_ENODATA)+eNODEV = Errno (CONST_ENODEV)+eNOENT = Errno (CONST_ENOENT)+eNOEXEC = Errno (CONST_ENOEXEC)+eNOLCK = Errno (CONST_ENOLCK)+eNOLINK = Errno (CONST_ENOLINK)+eNOMEM = Errno (CONST_ENOMEM)+eNOMSG = Errno (CONST_ENOMSG)+eNONET = Errno (CONST_ENONET)+eNOPROTOOPT = Errno (CONST_ENOPROTOOPT)+eNOSPC = Errno (CONST_ENOSPC)+eNOSR = Errno (CONST_ENOSR)+eNOSTR = Errno (CONST_ENOSTR)+eNOSYS = Errno (CONST_ENOSYS)+eNOTBLK = Errno (CONST_ENOTBLK)+eNOTCONN = Errno (CONST_ENOTCONN)+eNOTDIR = Errno (CONST_ENOTDIR)+eNOTEMPTY = Errno (CONST_ENOTEMPTY)+eNOTSOCK = Errno (CONST_ENOTSOCK)+eNOTSUP = Errno (CONST_ENOTSUP)+-- ^ @since base-4.7.0.0+eNOTTY = Errno (CONST_ENOTTY)+eNXIO = Errno (CONST_ENXIO)+eOPNOTSUPP = Errno (CONST_EOPNOTSUPP)+ePERM = Errno (CONST_EPERM)+ePFNOSUPPORT = Errno (CONST_EPFNOSUPPORT)+ePIPE = Errno (CONST_EPIPE)+ePROCLIM = Errno (CONST_EPROCLIM)+ePROCUNAVAIL = Errno (CONST_EPROCUNAVAIL)+ePROGMISMATCH = Errno (CONST_EPROGMISMATCH)+ePROGUNAVAIL = Errno (CONST_EPROGUNAVAIL)+ePROTO = Errno (CONST_EPROTO)+ePROTONOSUPPORT = Errno (CONST_EPROTONOSUPPORT)+ePROTOTYPE = Errno (CONST_EPROTOTYPE)+eRANGE = Errno (CONST_ERANGE)+eREMCHG = Errno (CONST_EREMCHG)+eREMOTE = Errno (CONST_EREMOTE)+eROFS = Errno (CONST_EROFS)+eRPCMISMATCH = Errno (CONST_ERPCMISMATCH)+eRREMOTE = Errno (CONST_ERREMOTE)+eSHUTDOWN = Errno (CONST_ESHUTDOWN)+eSOCKTNOSUPPORT = Errno (CONST_ESOCKTNOSUPPORT)+eSPIPE = Errno (CONST_ESPIPE)+eSRCH = Errno (CONST_ESRCH)+eSRMNT = Errno (CONST_ESRMNT)+eSTALE = Errno (CONST_ESTALE)+eTIME = Errno (CONST_ETIME)+eTIMEDOUT = Errno (CONST_ETIMEDOUT)+eTOOMANYREFS = Errno (CONST_ETOOMANYREFS)+eTXTBSY = Errno (CONST_ETXTBSY)+eUSERS = Errno (CONST_EUSERS)+eWOULDBLOCK = Errno (CONST_EWOULDBLOCK)+eXDEV = Errno (CONST_EXDEV)+-}++eINTR :: Errno+eAGAIN = Errno cAGAIN; foreign import capi "value EAGAIN" cAGAIN :: Int+eINTR = Errno cINTR; foreign import capi "value EINTR" cINTR :: Int+eWOULDBLOCK = Errno cWOULDBLOCK; foreign import capi "value EWOULDBLOCK" cWOULDBLOCK :: Int++isValidErrno :: Errno -> Bool+isValidErrno (Errno errno) = errno /= -1++foreign import ccall unsafe "sys/errno.h &errno" c_errno_ptr :: IO (Ptr Int)++getErrno :: IO Errno+getErrno = do+ p <- c_errno_ptr+ e <- peek p+ return (Errno e)++resetErrno :: IO ()+resetErrno = do+ p <- c_errno_ptr+ poke p 0+ return ()++throwErrno :: String -> IO a+throwErrno loc = do+ errno <- getErrno+ ioError (errnoToIOError loc errno Nothing Nothing)++throwErrnoIf :: (a -> Bool) -- ^ predicate to apply to the result value+ -- of the 'IO' operation+ -> String -- ^ textual description of the location+ -> IO a -- ^ the 'IO' operation to be executed+ -> IO a+throwErrnoIf pred loc f =+ do+ res <- f+ if pred res then throwErrno loc else return res++throwErrnoIf_ :: (a -> Bool) -> String -> IO a -> IO ()+throwErrnoIf_ pred loc f = void $ throwErrnoIf pred loc f++throwErrnoIfRetry :: (a -> Bool) -> String -> IO a -> IO a+throwErrnoIfRetry pred loc f =+ do+ res <- f+ if pred res+ then do+ err <- getErrno+ if err == eINTR+ then throwErrnoIfRetry pred loc f+ else throwErrno loc+ else return res++throwErrnoIfRetryMayBlock+ :: (a -> Bool) -- ^ predicate to apply to the result value+ -- of the 'IO' operation+ -> String -- ^ textual description of the location+ -> IO a -- ^ the 'IO' operation to be executed+ -> IO b -- ^ action to execute before retrying if+ -- an immediate retry would block+ -> IO a+throwErrnoIfRetryMayBlock pred loc f on_block =+ do+ res <- f+ if pred res+ then do+ err <- getErrno+ if err == eINTR+ then throwErrnoIfRetryMayBlock pred loc f on_block+ else if err == eWOULDBLOCK || err == eAGAIN+ then do _ <- on_block+ throwErrnoIfRetryMayBlock pred loc f on_block+ else throwErrno loc+ else return res++throwErrnoIfRetry_ :: (a -> Bool) -> String -> IO a -> IO ()+throwErrnoIfRetry_ pred loc f = void $ throwErrnoIfRetry pred loc f++throwErrnoIfRetryMayBlock_ :: (a -> Bool) -> String -> IO a -> IO b -> IO ()+throwErrnoIfRetryMayBlock_ pred loc f on_block+ = void $ throwErrnoIfRetryMayBlock pred loc f on_block++throwErrnoIfMinus1 :: (Eq a, Num a) => String -> IO a -> IO a+throwErrnoIfMinus1 = throwErrnoIf (== (-1))++throwErrnoIfMinus1_ :: (Eq a, Num a) => String -> IO a -> IO ()+throwErrnoIfMinus1_ = throwErrnoIf_ (== (-1))++throwErrnoIfMinus1Retry :: (Eq a, Num a) => String -> IO a -> IO a+throwErrnoIfMinus1Retry = throwErrnoIfRetry (== (-1))++throwErrnoIfMinus1Retry_ :: (Eq a, Num a) => String -> IO a -> IO ()+throwErrnoIfMinus1Retry_ = throwErrnoIfRetry_ (== (-1))++throwErrnoIfMinus1RetryMayBlock :: (Eq a, Num a)+ => String -> IO a -> IO b -> IO a+throwErrnoIfMinus1RetryMayBlock = throwErrnoIfRetryMayBlock (== (-1))++throwErrnoIfMinus1RetryMayBlock_ :: (Eq a, Num a)+ => String -> IO a -> IO b -> IO ()+throwErrnoIfMinus1RetryMayBlock_ = throwErrnoIfRetryMayBlock_ (== (-1))++throwErrnoIfNull :: String -> IO (Ptr a) -> IO (Ptr a)+throwErrnoIfNull = throwErrnoIf (== nullPtr)++throwErrnoIfNullRetry :: String -> IO (Ptr a) -> IO (Ptr a)+throwErrnoIfNullRetry = throwErrnoIfRetry (== nullPtr)++throwErrnoIfNullRetryMayBlock :: String -> IO (Ptr a) -> IO b -> IO (Ptr a)+throwErrnoIfNullRetryMayBlock = throwErrnoIfRetryMayBlock (== nullPtr)++throwErrnoPath :: String -> FilePath -> IO a+throwErrnoPath loc path =+ do+ errno <- getErrno+ ioError (errnoToIOError loc errno Nothing (Just path))++throwErrnoPathIf :: (a -> Bool) -> String -> FilePath -> IO a -> IO a+throwErrnoPathIf pred loc path f =+ do+ res <- f+ if pred res then throwErrnoPath loc path else return res++throwErrnoPathIf_ :: (a -> Bool) -> String -> FilePath -> IO a -> IO ()+throwErrnoPathIf_ pred loc path f = void $ throwErrnoPathIf pred loc path f++throwErrnoPathIfNull :: String -> FilePath -> IO (Ptr a) -> IO (Ptr a)+throwErrnoPathIfNull = throwErrnoPathIf (== nullPtr)++throwErrnoPathIfMinus1 :: (Eq a, Num a) => String -> FilePath -> IO a -> IO a+throwErrnoPathIfMinus1 = throwErrnoPathIf (== (-1))++throwErrnoPathIfMinus1_ :: (Eq a, Num a) => String -> FilePath -> IO a -> IO ()+throwErrnoPathIfMinus1_ = throwErrnoPathIf_ (== (-1))+++foreign import ccall "string.h strerror_r"+ c_strerror_r :: Int -> Ptr Char -> CSize -> IO Int++errnoToString :: Errno -> IO String+errnoToString (Errno errno) =+ allocaBytes 512 $ \ ptr -> do+ ret <- c_strerror_r errno ptr (CSize 512)+ if ret /= 0+ then return "errnoToString failed"+ else peekCString ptr+ where len = 512::Int++errnoToIOError :: String -- ^ the location where the error occurred+ -> Errno -- ^ the error number+ -> Maybe Handle -- ^ optional handle associated with the error+ -> Maybe String -- ^ optional filename associated with the error+ -> IOError+errnoToIOError loc errno@(Errno errno') maybeHdl maybeName = unsafePerformIO $ do+ str <- errnoToString errno+ return (IOError maybeHdl errType loc str (Just errno') maybeName)+ where+ errType = OtherError+{-+ errType =+ | errno == eOK = OtherError+ | errno == e2BIG = ResourceExhausted+ | errno == eACCES = PermissionDenied+ | errno == eADDRINUSE = ResourceBusy+ | errno == eADDRNOTAVAIL = UnsupportedOperation+ | errno == eADV = OtherError+ | errno == eAFNOSUPPORT = UnsupportedOperation+ | errno == eAGAIN = ResourceExhausted+ | errno == eALREADY = AlreadyExists+ | errno == eBADF = InvalidArgument+ | errno == eBADMSG = InappropriateType+ | errno == eBADRPC = OtherError+ | errno == eBUSY = ResourceBusy+ | errno == eCHILD = NoSuchThing+ | errno == eCOMM = ResourceVanished+ | errno == eCONNABORTED = OtherError+ | errno == eCONNREFUSED = NoSuchThing+ | errno == eCONNRESET = ResourceVanished+ | errno == eDEADLK = ResourceBusy+ | errno == eDESTADDRREQ = InvalidArgument+ | errno == eDIRTY = UnsatisfiedConstraints+ | errno == eDOM = InvalidArgument+ | errno == eDQUOT = PermissionDenied+ | errno == eEXIST = AlreadyExists+ | errno == eFAULT = OtherError+ | errno == eFBIG = PermissionDenied+ | errno == eFTYPE = InappropriateType+ | errno == eHOSTDOWN = NoSuchThing+ | errno == eHOSTUNREACH = NoSuchThing+ | errno == eIDRM = ResourceVanished+ | errno == eILSEQ = InvalidArgument+ | errno == eINPROGRESS = AlreadyExists+ | errno == eINTR = Interrupted+ | errno == eINVAL = InvalidArgument+ | errno == eIO = HardwareFault+ | errno == eISCONN = AlreadyExists+ | errno == eISDIR = InappropriateType+ | errno == eLOOP = InvalidArgument+ | errno == eMFILE = ResourceExhausted+ | errno == eMLINK = ResourceExhausted+ | errno == eMSGSIZE = ResourceExhausted+ | errno == eMULTIHOP = UnsupportedOperation+ | errno == eNAMETOOLONG = InvalidArgument+ | errno == eNETDOWN = ResourceVanished+ | errno == eNETRESET = ResourceVanished+ | errno == eNETUNREACH = NoSuchThing+ | errno == eNFILE = ResourceExhausted+ | errno == eNOBUFS = ResourceExhausted+ | errno == eNODATA = NoSuchThing+ | errno == eNODEV = UnsupportedOperation+ | errno == eNOENT = NoSuchThing+ | errno == eNOEXEC = InvalidArgument+ | errno == eNOLCK = ResourceExhausted+ | errno == eNOLINK = ResourceVanished+ | errno == eNOMEM = ResourceExhausted+ | errno == eNOMSG = NoSuchThing+ | errno == eNONET = NoSuchThing+ | errno == eNOPROTOOPT = UnsupportedOperation+ | errno == eNOSPC = ResourceExhausted+ | errno == eNOSR = ResourceExhausted+ | errno == eNOSTR = InvalidArgument+ | errno == eNOSYS = UnsupportedOperation+ | errno == eNOTBLK = InvalidArgument+ | errno == eNOTCONN = InvalidArgument+ | errno == eNOTDIR = InappropriateType+ | errno == eNOTEMPTY = UnsatisfiedConstraints+ | errno == eNOTSOCK = InvalidArgument+ | errno == eNOTTY = IllegalOperation+ | errno == eNXIO = NoSuchThing+ | errno == eOPNOTSUPP = UnsupportedOperation+ | errno == ePERM = PermissionDenied+ | errno == ePFNOSUPPORT = UnsupportedOperation+ | errno == ePIPE = ResourceVanished+ | errno == ePROCLIM = PermissionDenied+ | errno == ePROCUNAVAIL = UnsupportedOperation+ | errno == ePROGMISMATCH = ProtocolError+ | errno == ePROGUNAVAIL = UnsupportedOperation+ | errno == ePROTO = ProtocolError+ | errno == ePROTONOSUPPORT = ProtocolError+ | errno == ePROTOTYPE = ProtocolError+ | errno == eRANGE = UnsupportedOperation+ | errno == eREMCHG = ResourceVanished+ | errno == eREMOTE = IllegalOperation+ | errno == eROFS = PermissionDenied+ | errno == eRPCMISMATCH = ProtocolError+ | errno == eRREMOTE = IllegalOperation+ | errno == eSHUTDOWN = IllegalOperation+ | errno == eSOCKTNOSUPPORT = UnsupportedOperation+ | errno == eSPIPE = UnsupportedOperation+ | errno == eSRCH = NoSuchThing+ | errno == eSRMNT = UnsatisfiedConstraints+ | errno == eSTALE = ResourceVanished+ | errno == eTIME = TimeExpired+ | errno == eTIMEDOUT = TimeExpired+ | errno == eTOOMANYREFS = ResourceExhausted+ | errno == eTXTBSY = ResourceBusy+ | errno == eUSERS = ResourceExhausted+ | errno == eWOULDBLOCK = OtherError+ | errno == eXDEV = UnsupportedOperation+ | otherwise = OtherError+-}
lib/Foreign/C/String.hs view
@@ -1,8 +1,9 @@ module Foreign.C.String(- CChar, CString, CStringLen,+ CString, CStringLen, newCAString, newCAStringLen, peekCAString, peekCAStringLen, withCAString,+ peekCString, ) where import Prelude() -- do not import Prelude import Primitives@@ -31,3 +32,8 @@ peekCAStringLen :: CStringLen -> IO String peekCAStringLen (p, i) = primPeekCAStringLen p i++-- Not quite right+peekCString :: CString -> IO String+peekCString = primPeekCAString+
lib/Foreign/C/Types.hs view
@@ -9,34 +9,80 @@ CLLong(..), CULLong(..), CIntPtr(..), CUIntPtr(..), CFloat(..), CDouble(..),+ CTime(..), intToCSize, cSizeToInt, ) where import Prelude() import Primitives+import Data.Bool+import Data.Eq+import Data.Int+import Data.Integral+import Data.Num+import Data.Ord import Data.Word+import Data.FloatW -- The MicroHs Word type is the "natural" architecture word size; -- it is the same as the pointer difference type. -- And Int is the natural signed word size. newtype CChar = CChar Char+ deriving (Eq, Ord) newtype CSChar = CSChar Int+ deriving (Eq, Ord) newtype CUChar = CUChar Word+ deriving (Eq, Ord) newtype CShort = CShort Int+ deriving (Eq, Ord) newtype CUShort = CUShort Word+ deriving (Eq, Ord) newtype CInt = CInt Int+ deriving (Eq, Ord) newtype CUInt = CUInt Word+ deriving (Eq, Ord) newtype CLong = CLong Int+ deriving (Eq, Ord) newtype CULong = CULong Word+ deriving (Eq, Ord) newtype CPtrdiff = CPtrdiff Word+ deriving (Eq, Ord) newtype CSize = CSize Word+ deriving (Eq, Ord) newtype CSSize = CSSize Int+ deriving (Eq, Ord) newtype CLLong = CLLong Int+ deriving (Eq, Ord) newtype CULLong = CULLong Word+ deriving (Eq, Ord) newtype CIntPtr = CIntPtr Int+ deriving (Eq, Ord) newtype CUIntPtr = CUIntPtr Word+ deriving (Eq, Ord) +-- XXX This is really platform specific+newtype CTime = CTime Int+ deriving (Eq, Ord)++-- XXX We really need GND+instance Num CInt where+ CInt x + CInt y = CInt (x + y)+ CInt x - CInt y = CInt (x - y)+ CInt x * CInt y = CInt (x * y)+ fromInteger x = CInt (fromInteger x)+instance Num CLong where+ CLong x + CLong y = CLong (x + y)+ CLong x - CLong y = CLong (x - y)+ CLong x * CLong y = CLong (x * y)+ fromInteger x = CLong (fromInteger x)+instance Integral CLong where+ quotRem (CLong x) (CLong y) = (CLong q, CLong r) where (q, r) = quotRem q r+ toInteger (CLong x) = toInteger x++-- XXX only one of these is actually correct newtype CFloat = CFloat FloatW+ deriving (Eq, Ord) newtype CDouble = CDouble FloatW+ deriving (Eq, Ord) -- Temporary conversion functions. intToCSize :: Int -> CSize
lib/Foreign/ForeignPtr.hs view
@@ -14,6 +14,7 @@ mallocForeignPtrArray, mallocForeignPtrArray0, ) where+import Prelude(); import MiniPrelude import Primitives import Foreign.Ptr import Foreign.Storable@@ -30,7 +31,7 @@ showsPrec p f = showsPrec p (unsafeForeignPtrToPtr f) unsafeForeignPtrToPtr :: ForeignPtr a -> Ptr a-unsafeForeignPtrToPtr = primitive "fp2p"+unsafeForeignPtrToPtr = primForeignPtrToPtr type FinalizerPtr a = FunPtr (Ptr a -> IO ()) @@ -60,7 +61,7 @@ newForeignPtr c_freefun ptr addForeignPtrFinalizer :: FinalizerPtr a -> ForeignPtr a -> IO ()-addForeignPtrFinalizer = primitive "fpfin"+addForeignPtrFinalizer = primAddFinalizer newForeignPtr :: FinalizerPtr a -> Ptr a -> IO (ForeignPtr a) newForeignPtr f p = do@@ -69,7 +70,7 @@ return fp newForeignPtr_ :: Ptr a -> IO (ForeignPtr a)-newForeignPtr_ = primitive "fpnew"+newForeignPtr_ = primNewForeignPtr withForeignPtr :: ForeignPtr a -> (Ptr a -> IO b) -> IO b withForeignPtr fp io = do
+ lib/Foreign/Marshal.hs view
@@ -0,0 +1,13 @@+module Foreign.Marshal(+ module Foreign.Marshal.Alloc,+ module Foreign.Marshal.Array,+ module Foreign.Marshal.Error,+-- module Foreign.Marshal.Pool,+ module Foreign.Marshal.Utils+ ) where++import Foreign.Marshal.Alloc+import Foreign.Marshal.Array+import Foreign.Marshal.Error+--import Foreign.Marshal.Pool+import Foreign.Marshal.Utils
lib/Foreign/Marshal/Array.hs view
@@ -1,5 +1,5 @@ module Foreign.Marshal.Array(module Foreign.Marshal.Array) where-import Prelude+import Prelude(); import MiniPrelude import Foreign.Ptr import Foreign.Storable import Foreign.Marshal.Alloc
+ lib/Foreign/Marshal/Error.hs view
@@ -0,0 +1,28 @@+module Foreign.Marshal.Error (+ throwIf,+ throwIf_,+ throwIfNeg,+ throwIfNeg_,+ throwIfNull,+) where+import Prelude(); import MiniPrelude+import Data.Functor(void)+import Foreign.Ptr+import System.IO.Error(ioError, userError)++throwIf :: (a -> Bool) -> (a -> String) -> IO a -> IO a+throwIf pred msgfct act = do+ res <- act+ (if pred res then ioError . userError . msgfct else return) res++throwIf_ :: (a -> Bool) -> (a -> String) -> IO a -> IO ()+throwIf_ pred msgfct act = void $ throwIf pred msgfct act++throwIfNeg :: (Ord a, Num a) => (a -> String) -> IO a -> IO a+throwIfNeg = throwIf (< 0)++throwIfNeg_ :: (Ord a, Num a) => (a -> String) -> IO a -> IO ()+throwIfNeg_ = throwIf_ (< 0)++throwIfNull :: String -> IO (Ptr a) -> IO (Ptr a)+throwIfNull = throwIf (== nullPtr) . const
lib/Foreign/Marshal/Utils.hs view
@@ -1,5 +1,5 @@ module Foreign.Marshal.Utils(module Foreign.Marshal.Utils) where-import Prelude+import Prelude(); import MiniPrelude import Foreign.Marshal.Alloc import Foreign.C.Types import Foreign.Ptr
lib/Foreign/Ptr.hs view
@@ -9,7 +9,7 @@ import Data.Eq import Data.Function import Data.Ord-import Numeric(showHex)+import Numeric.Show(showHex) import Text.Show instance forall a . Eq (Ptr a) where
+ lib/Mhs/Builtin.hs view
@@ -0,0 +1,31 @@+module Mhs.Builtin(+ module Control.Monad,+ module Data.Bool,+ module Data.Enum,+ module Data.Eq,+ module Data.Fractional,+ module Data.Function,+ module Data.Ord,+ module Data.Num,+ module Data.Records,+ module Data.Typeable,+ module Data.Semigroup,+ module Data.String,+ module Text.Show,+ ) where+import Prelude()+import Control.Monad(Monad(..))+import Control.Monad.Fail(MonadFail(..))+import Data.Bool((&&), Bool(..))+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.Proxy(Proxy(..))+import Data.Semigroup(Semigroup(..))+import Data.String(IsString(..))+import Data.Records(HasField(..), SetField(..), composeSet)+import {-# SOURCE #-} Data.Typeable(Typeable(..), mkTyConApp, mkTyCon)+import Text.Show(Show(..), showString, showParen)
+ lib/MiniPrelude.hs view
@@ -0,0 +1,62 @@+module MiniPrelude(+ module Control.Applicative,+ module Control.Error,+ module Control.Monad,+ module Data.Bool,+ module Data.Char,+ module Data.Enum,+ module Data.Eq,+ module Data.Either,+ module Data.Function,+ module Data.Functor,+ module Data.Ord,+ module Data.Int,+ module Data.Integral,+ module Data.List,+ module Data.Maybe,+ module Data.Monoid.Internal,+ module Data.Num,+ module Data.Records,+ module Data.String,+ module Data.Tuple,+ module System.IO,+ module Text.Show,+ usingMhs, _wordSize, _isWindows,+ ) where+import Prelude()+import Control.Applicative(Applicative(..))+import Control.Error+import Control.Monad+import Data.Bool+import Data.Char+import Data.Enum+import Data.Eq+import Data.Either+import Data.Function+import Data.Functor+import Data.Ord+import Data.Int+import Data.Integral+import Data.List([](..), map, (++), filter, head, last, tail, init, null, length, (!!),+ reverse, foldl, foldl1, foldr, foldr1, and, or, any, all,+ sum, product, concat, concatMap, maximum, minimum,+ scanl, scanl1, scanr, scanr1, iterate, repeat, replicate, cycle,+ take, drop, splitAt, takeWhile, dropWhile, span, break,+ elem, notElem, lookup, zip, zip3, zipWith, zipWith3, unzip, unzip3,+ lines, words, unlines, unwords)+import Data.Maybe+import Data.Monoid.Internal+import Data.Num+import Data.Records+import Data.String+import Data.Tuple+import System.IO(IO, putChar, putStr, putStrLn, print, getLine, getContents, interact,+ FilePath, readFile, writeFile, appendFile,+ cprint, cuprint)+import Text.Show(Show(..), ShowS, shows, showChar, showString, showParen)+import Text.Show+import Primitives(_wordSize, _isWindows)++-- So we can detect mhs vs ghc+usingMhs :: Bool+usingMhs = True
lib/Numeric.hs view
@@ -1,11 +1,5 @@ module Numeric(- showSigned,- showIntAtBase,- showInt,- showBin,- showHex,- showOct,- showIntegral,+ module Numeric.Show, readSigned, readInt,@@ -16,63 +10,5 @@ readIntegral, ) where import Prelude() -- do not import Prelude-import Primitives-import Control.Error-import Data.Bool-import Data.Char-import Data.Eq-import Data.Function-import Data.Integral-import Data.List-import Data.Num-import Data.Ord-import Text.Read.Numeric-import Text.Show(ShowS, showChar)--showSigned :: forall a . (Ord a, Integral a) => (a -> ShowS) -> Int -> a -> ShowS-showSigned showPos p n r- | n < 0 =- if p > (6::Int) then- '(' : '-' : showPos (-n) (')' : r)- else- '-' : showPos (-n) r- | otherwise = showPos n r---- | Shows a /non-negative/ 'Integral' number using the base specified by the--- first argument, and the character representation specified by the second.--- If the argument, n, is <0 and -n == n (i.e., n == minBound) it will--- return the string for (abs n).-showIntAtBase :: forall a . (Ord a, Integral a) => a -> (Int -> Char) -> a -> ShowS-showIntAtBase base toChr an- | base <= 1 = error "Numeric.showIntAtBase: unsupported base"- | an < 0 =- if -an < 0 then- -- We are at minBound- showPos (- quot an base) . showPos (- rem an base)- else- error "Numeric.showIntAtBase: negative argument"- | otherwise = showPos an- where- showPos n r =- let- c = toChr (fromIntegral (rem n base))- in c `seq`- if n < base then- c : r- else- showPos (quot n base) (c : r)--showInt :: forall a . (Ord a, Integral a) => a -> ShowS-showInt = showIntAtBase 10 intToDigit--showHex :: forall a . (Ord a, Integral a) => a -> ShowS-showHex = showIntAtBase 16 intToDigit--showOct :: forall a . (Ord a, Integral a) => a -> ShowS-showOct = showIntAtBase 8 intToDigit--showBin :: forall a . (Ord a, Integral a) => a -> ShowS-showBin = showIntAtBase 2 intToDigit--showIntegral :: forall a . (Ord a, Integral a) => Int -> a -> ShowS-showIntegral = showSigned showInt+import Numeric.Read+import Numeric.Show
lib/Numeric/FormatFloat.hs view
@@ -10,7 +10,7 @@ ) where import Data.Char-import Numeric+import Numeric.Show --showFloat :: (RealFloat a) => a -> ShowS --showFloat x = showString (formatRealFloat FFGeneric Nothing x)
lib/Numeric/Natural.hs view
@@ -2,6 +2,9 @@ ( Natural , minusNaturalMaybe ) where+import Prelude(); import MiniPrelude+import Data.Integer+import Data.Real import Control.Exception newtype Natural = N Integer
+ lib/Numeric/Read.hs view
@@ -0,0 +1,83 @@+module Numeric.Read(+ readParen,+ readSigned,+ readInt,+ readBin,+ readDec,+ readOct,+ readHex,+ readIntegral,+ readBoundedEnum,+ ) where+import Prelude() -- do not import Prelude+import Primitives+import Data.Bool+import Data.Bounded+import Data.Char+import Data.Eq+import Data.Enum+import Data.Function+import Data.Integral+import Data.List+import Data.Maybe_Type+import Data.Num+import Data.Ord+import Data.String+import {-# SOURCE #-} Text.Read.Internal(lex)+import Text.Show++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, + (")",u) <- lex t ]++--------------------------------------------------------++readInt :: forall a . Num a => a -> (Char -> Bool) -> (Char -> Int) -> ReadS a+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 _ _ _ _ = [] ++readBin :: forall a . (Num a) => ReadS a+readBin = readInt 2 isBinDigit digitToInt++isBinDigit :: Char -> Bool+isBinDigit c = c == '0' || c == '1'++readOct :: forall a . (Num a) => ReadS a+readOct = readInt 8 isOctDigit digitToInt++readDec :: forall a . (Num a) => ReadS a+readDec = readInt 10 isDigit digitToInt++readHex :: forall a . (Num a) => ReadS a+readHex = readInt 16 isHexDigit digitToInt++readSigned :: forall a . (Num a) => ReadS a -> ReadS a+readSigned readPos = readParen False read'+ where+ read' :: ReadS a+ read' r = readPos r +++ [ (- x, t) | ("-", s) <- lex r, (x, t) <- readPos s ]++readIntegral :: forall a . (Integral a) => Int -> ReadS a+readIntegral _ = readSigned (readAny . dropSpace)+ where readAny ('0':'x':cs) = readHex cs+ readAny ('0':'X':cs) = readHex cs+ readAny ('0':'o':cs) = readOct cs+ readAny ('0':'O':cs) = readOct cs+ readAny ('0':'b':cs) = readBin cs+ readAny ('0':'B':cs) = readBin cs+ readAny cs = readDec cs++readBoundedEnum :: forall a . (Enum a, Bounded a, Show a) => ReadS a+readBoundedEnum = \ r -> [ (e, t) | (s, t) <- lex r, Just e <- [lookup s table] ]+ where table = [ (show e, e) | e <- [ minBound .. maxBound ] ]++dropSpace :: String -> String+dropSpace = dropWhile isSpace
+ lib/Numeric/Show.hs view
@@ -0,0 +1,69 @@+module Numeric.Show(+ showSigned,+ showIntAtBase,+ showInt,+ showBin,+ showHex,+ showOct,+ showIntegral,+ ) where+import Prelude() -- do not import Prelude+import Primitives+import Control.Error+import Data.Bool+import Data.Char+import Data.Eq+import Data.Function+import Data.Integral+import Data.List+import Data.Num+import Data.Ord+import Text.Show(ShowS, showChar)++showSigned :: forall a . (Ord a, Integral a) => (a -> ShowS) -> Int -> a -> ShowS+showSigned showPos p n r+ | n < 0 =+ if p > (6::Int) then+ '(' : '-' : showPos (-n) (')' : r)+ else+ '-' : showPos (-n) r+ | otherwise = showPos n r++-- | Shows a /non-negative/ 'Integral' number using the base specified by the+-- first argument, and the character representation specified by the second.+-- If the argument, n, is <0 and -n == n (i.e., n == minBound) it will+-- return the string for (abs n).+showIntAtBase :: forall a . (Ord a, Integral a) => a -> (Int -> Char) -> a -> ShowS+showIntAtBase base toChr an+ | base <= 1 = error "Numeric.showIntAtBase: unsupported base"+ | an < 0 =+ if -an < 0 then+ -- We are at minBound+ showPos (- quot an base) . showPos (- rem an base)+ else+ error "Numeric.showIntAtBase: negative argument"+ | otherwise = showPos an+ where+ showPos n r =+ let+ c = toChr (fromIntegral (rem n base))+ in c `seq`+ if n < base then+ c : r+ else+ showPos (quot n base) (c : r)++showInt :: forall a . (Ord a, Integral a) => a -> ShowS+showInt = showIntAtBase 10 intToDigit++showHex :: forall a . (Ord a, Integral a) => a -> ShowS+showHex = showIntAtBase 16 intToDigit++showOct :: forall a . (Ord a, Integral a) => a -> ShowS+showOct = showIntAtBase 8 intToDigit++showBin :: forall a . (Ord a, Integral a) => a -> ShowS+showBin = showIntAtBase 2 intToDigit++showIntegral :: forall a . (Ord a, Integral a) => Int -> a -> ShowS+showIntegral = showSigned showInt
lib/Prelude.hs view
@@ -87,6 +87,8 @@ import Text.Show(Show(..), ShowS, shows, showChar, showString, showParen) import Primitives(_wordSize, _isWindows) +import Data.Orphans() -- Extra instances+ -- So we can detect mhs vs ghc usingMhs :: Bool usingMhs = True
lib/Primitives.hs view
@@ -123,10 +123,19 @@ primWordToFloatWRaw = primitive "toDbl" primWordFromFloatWRaw :: FloatW -> Word primWordFromFloatWRaw = primitive "toInt"++primIntAnd :: Int -> Int -> Int+primIntAnd = primitive "and"+primIntOr :: Int -> Int -> Int+primIntOr = primitive "or"+primIntXor :: Int -> Int -> Int+primIntXor = primitive "xor" primIntShl :: Int -> Int -> Int primIntShl = primitive "shl" primIntShr :: Int -> Int -> Int primIntShr = primitive "ashr"+primIntInv :: Int -> Int+primIntInv = primitive "inv" primWordEQ :: Word -> Word -> Bool primWordEQ = primitive "=="@@ -176,6 +185,8 @@ primIntCompare = primitive "icmp" primCharCompare :: forall a . Char -> Char -> Ordering primCharCompare = primitive "icmp"+primWordCompare :: forall a . Word -> Word -> Ordering+primWordCompare = primitive "ucmp" primStringEQ :: [Char] -> [Char] -> Bool primStringEQ = primitive "sequal"@@ -272,3 +283,13 @@ primGC :: IO () primGC = primitive "IO.gc"++primForeignPtrToPtr :: ForeignPtr a -> Ptr a+primForeignPtrToPtr = primitive "fp2p"++primNewForeignPtr :: Ptr a -> IO (ForeignPtr a)+primNewForeignPtr = primitive "fpnew"++primAddFinalizer :: FunPtr (Ptr a -> IO ()) -> ForeignPtr a -> IO ()+primAddFinalizer = primitive "fpfin"+
lib/System/Cmd.hs view
@@ -1,4 +1,5 @@ module System.Cmd(system) where+import Prelude(); import MiniPrelude import Foreign.C.String import System.Exit
lib/System/Compress.hs view
@@ -1,22 +1,101 @@-module System.Compress(compress) where+module System.Compress(compress, decompress) where+import Prelude(); import MiniPrelude+import Data.Function+import Foreign.Ptr 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 -foreign import ccall "lz77c" c_lz77c :: CString -> CSize -> Ptr CString -> IO CSize+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 "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 (Ptr Char) -> Ptr Int -> IO ()+foreign import ccall "closeb" c_close :: PBFILE -> IO ()+foreign import ccall "flushb" c_flush :: PBFILE -> IO () --- This really ought to be [Word8] -> [Word8]-compress :: String -> String-compress file = unsafePerformIO $ do- (iptr, ilen) <- newCAStringLen file- pptr <- new nullPtr- olen <- c_lz77c iptr (intToCSize ilen) pptr- optr <- peek pptr- res <- peekCAStringLen (optr, cSizeToInt olen)- free iptr- free optr- return res+withPutTransducer :: Transducer -> [Char] -> [Char]+withPutTransducer trans file = unsafePerformIO $ do+ bf <- c_openb_wr_buf -- create a buffer+ cbf <- trans bf -- and add transducer (e.g., a compressor)+ mapM_ (flip c_putb cbf . ord) file -- copy all the bytes+ c_flush cbf -- do compression and write to buffer+ 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+ c_close cbf -- and close everything+ return res++withGetTransducer :: Transducer -> [Char] -> [Char]+withGetTransducer trans file = unsafePerformIO $ do+ (ptr, len) <- newCAStringLen file -- make memory buffer+ 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+ cs <- hGetContents h -- get contents+ seq (length cs) (return ()) -- force it all so ptr is no longer in use+ hClose h+ return cs++compress :: [Char] -> [Char]+compress = withPutTransducer c_add_lz77_compressor++decompress :: [Char] -> [Char]+decompress = withGetTransducer c_add_lz77_decompressor++compressRLE :: [Char] -> [Char]+compressRLE = withPutTransducer c_add_rle_compressor++decompressRLE :: [Char] -> [Char]+decompressRLE = withGetTransducer c_add_rle_decompressor++compressBWT :: [Char] -> [Char]+compressBWT = withPutTransducer c_add_bwt_compressor++decompressBWT :: [Char] -> [Char]+decompressBWT = withGetTransducer c_add_bwt_decompressor++compressBWTRLE :: [Char] -> [Char]+compressBWTRLE = withPutTransducer (c_add_bwt_compressor <=< c_add_rle_compressor <=< c_add_lz77_compressor)++decompressBWTRLE :: [Char] -> [Char]+decompressBWTRLE = withGetTransducer (c_add_bwt_decompressor <=< c_add_rle_decompressor <=< c_add_lz77_decompressor)++{-+main :: IO ()+main = do+ putStrLn "compress"+ haa <- openBinaryFile "aa" ReadMode+ aa <- hGetContents haa+ let bb = compressBWTRLE aa+ hbb <- openBinaryFile "bb" WriteMode+ hPutStr hbb bb+ hClose hbb+ hClose haa+ putStrLn "decompress"+ hbb' <- openBinaryFile "bb" ReadMode+ bb' <- hGetContents hbb'+ let aa' = decompressBWTRLE bb'+ hcc <- openBinaryFile "cc" WriteMode+ hPutStr hcc aa'+ hClose hbb'+ hClose hcc+-}
+ lib/System/Console/GetOpt.hs view
@@ -0,0 +1,409 @@+{-# LANGUAGE Safe #-}++-----------------------------------------------------------------------------+-- |+-- Module : System.Console.GetOpt+-- Copyright : (c) Sven Panne 2002-2005+-- License : BSD-style (see the file libraries/base/LICENSE)+--+-- Maintainer : libraries@haskell.org+-- Stability : stable+-- Portability : portable+--+-- This module provides facilities for parsing the command-line options+-- in a standalone program. It is essentially a Haskell port of the GNU+-- @getopt@ library.+--+-----------------------------------------------------------------------------++{-+Sven Panne <Sven.Panne@informatik.uni-muenchen.de> Oct. 1996 (small+changes Dec. 1997)++Two rather obscure features are missing: The Bash 2.0 non-option hack+(if you don't already know it, you probably don't want to hear about+it...) and the recognition of long options with a single dash+(e.g. '-help' is recognised as '--help', as long as there is no short+option 'h').++Other differences between GNU's getopt and this implementation:++* To enforce a coherent description of options and arguments, there+ are explanation fields in the option/argument descriptor.++* Error messages are now more informative, but no longer POSIX+ compliant... :-(++And a final Haskell advertisement: The GNU C implementation uses well+over 1100 lines, we need only 195 here, including a 46 line example!+:-)+-}++module System.Console.GetOpt (+ -- * GetOpt+ getOpt, getOpt',+ usageInfo,+ ArgOrder(..),+ OptDescr(..),+ ArgDescr(..),++ -- * Examples++ -- |To hopefully illuminate the role of the different data structures,+ -- here are the command-line options for a (very simple) compiler,+ -- done in two different ways.+ -- The difference arises because the type of 'getOpt' is+ -- parameterized by the type of values derived from flags.++ -- ** Interpreting flags as concrete values+ -- $example1++ -- ** Interpreting flags as transformations of an options record+ -- $example2+) where++import Data.List ( isPrefixOf, find )++-- |What to do with options following non-options+data ArgOrder a+ = RequireOrder -- ^ no option processing after first non-option+ | Permute -- ^ freely intersperse options and non-options+ | ReturnInOrder (String -> a) -- ^ wrap non-options into options++{-|+Each 'OptDescr' describes a single option.++The arguments to 'Option' are:++* list of short option characters++* list of long option strings (without \"--\")++* argument descriptor++* explanation of option for user+-}+data OptDescr a = -- description of a single options:+ Option [Char] -- list of short option characters+ [String] -- list of long option strings (without "--")+ (ArgDescr a) -- argument descriptor+ String -- explanation of option for user++-- |Describes whether an option takes an argument or not, and if so+-- how the argument is injected into a value of type @a@.+data ArgDescr a+ = NoArg a -- ^ no argument expected+ | ReqArg (String -> a) String -- ^ option requires argument+ | OptArg (Maybe String -> a) String -- ^ optional argument++-- | @since 4.7.0.0+instance Functor ArgOrder where+ fmap _ RequireOrder = RequireOrder+ fmap _ Permute = Permute+ fmap f (ReturnInOrder g) = ReturnInOrder (f . g)++-- | @since 4.7.0.0+instance Functor OptDescr where+ fmap f (Option a b argDescr c) = Option a b (fmap f argDescr) c++-- | @since 4.7.0.0+instance Functor ArgDescr where+ fmap f (NoArg a) = NoArg (f a)+ fmap f (ReqArg g s) = ReqArg (f . g) s+ fmap f (OptArg g s) = OptArg (f . g) s++data OptKind a -- kind of cmd line arg (internal use only):+ = Opt a -- an option+ | UnreqOpt String -- an un-recognized option+ | NonOpt String -- a non-option+ | EndOfOpts -- end-of-options marker (i.e. "--")+ | OptErr String -- something went wrong...++-- | Return a string describing the usage of a command, derived from+-- the header (first argument) and the options described by the+-- second argument.+usageInfo :: String -- header+ -> [OptDescr a] -- option descriptors+ -> String -- nicely formatted description of options+usageInfo header optDescr = unlines (header:table)+ where (ss,ls,ds) = (unzip3 . concatMap fmtOpt) optDescr+ table = zipWith3 paste (sameLen ss) (sameLen ls) ds+ paste x y z = " " ++ x ++ " " ++ y ++ " " ++ z+ sameLen xs = flushLeft ((maximum . map length) xs) xs+ flushLeft n xs = [ take n (x ++ repeat ' ') | x <- xs ]++fmtOpt :: OptDescr a -> [(String,String,String)]+fmtOpt (Option sos los ad descr) =+ case lines descr of+ [] -> [(sosFmt,losFmt,"")]+ (d:ds) -> (sosFmt,losFmt,d) : [ ("","",d') | d' <- ds ]+ where sepBy _ [] = ""+ sepBy _ [x] = x+ sepBy ch (x:xs) = x ++ ch:' ':sepBy ch xs+ sosFmt = sepBy ',' (map (fmtShort ad) sos)+ losFmt = sepBy ',' (map (fmtLong ad) los)++fmtShort :: ArgDescr a -> Char -> String+fmtShort (NoArg _ ) so = "-" ++ [so]+fmtShort (ReqArg _ ad) so = "-" ++ [so] ++ " " ++ ad+fmtShort (OptArg _ ad) so = "-" ++ [so] ++ "[" ++ ad ++ "]"++fmtLong :: ArgDescr a -> String -> String+fmtLong (NoArg _ ) lo = "--" ++ lo+fmtLong (ReqArg _ ad) lo = "--" ++ lo ++ "=" ++ ad+fmtLong (OptArg _ ad) lo = "--" ++ lo ++ "[=" ++ ad ++ "]"++{-|+Process the command-line, and return the list of values that matched+(and those that didn\'t). The arguments are:++* The order requirements (see 'ArgOrder')++* The option descriptions (see 'OptDescr')++* The actual command line arguments (presumably got from+ 'GHC.Internal.System.Environment.getArgs').++'getOpt' returns a triple consisting of the option arguments, a list+of non-options, and a list of error messages.+-}+getOpt :: ArgOrder a -- non-option handling+ -> [OptDescr a] -- option descriptors+ -> [String] -- the command-line arguments+ -> ([a],[String],[String]) -- (options,non-options,error messages)+getOpt ordering optDescr args = (os,xs,es ++ map errUnrec us)+ where (os,xs,us,es) = getOpt' ordering optDescr args++{-|+This is almost the same as 'getOpt', but returns a quadruple+consisting of the option arguments, a list of non-options, a list of+unrecognized options, and a list of error messages.+-}+getOpt' :: ArgOrder a -- non-option handling+ -> [OptDescr a] -- option descriptors+ -> [String] -- the command-line arguments+ -> ([a],[String], [String] ,[String]) -- (options,non-options,unrecognized,error messages)+getOpt' _ _ [] = ([],[],[],[])+getOpt' ordering optDescr (arg:args) = procNextOpt opt ordering+ where procNextOpt (Opt o) _ = (o:os,xs,us,es)+ procNextOpt (UnreqOpt u) _ = (os,xs,u:us,es)+ procNextOpt (NonOpt x) RequireOrder = ([],x:rest,[],[])+ procNextOpt (NonOpt x) Permute = (os,x:xs,us,es)+ procNextOpt (NonOpt x) (ReturnInOrder f) = (f x :os, xs,us,es)+ procNextOpt EndOfOpts RequireOrder = ([],rest,[],[])+ procNextOpt EndOfOpts Permute = ([],rest,[],[])+ procNextOpt EndOfOpts (ReturnInOrder f) = (map f rest,[],[],[])+ procNextOpt (OptErr e) _ = (os,xs,us,e:es)++ (opt,rest) = getNext arg args optDescr+ (os,xs,us,es) = getOpt' ordering optDescr rest++-- take a look at the next cmd line arg and decide what to do with it+getNext :: String -> [String] -> [OptDescr a] -> (OptKind a,[String])+getNext ('-':'-':[]) rest _ = (EndOfOpts,rest)+getNext ('-':'-':xs) rest optDescr = longOpt xs rest optDescr+getNext ('-': x :xs) rest optDescr = shortOpt x xs rest optDescr+getNext a rest _ = (NonOpt a,rest)++-- handle long option+longOpt :: String -> [String] -> [OptDescr a] -> (OptKind a,[String])+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 ]+ exact = getWith (==)+ options = if null exact then getWith isPrefixOf else exact+ ads = [ ad | Option _ _ ad _ <- options ]+ optStr = ("--"++opt)++ long (_:_:_) _ rest = (errAmbig options optStr,rest)+ long [NoArg a ] [] rest = (Opt a,rest)+ long [NoArg _ ] ('=':_) rest = (errNoArg optStr,rest)+ long [ReqArg _ d] [] [] = (errReq d optStr,[])+ long [ReqArg f _] [] (r:rest) = (Opt (f r),rest)+ long [ReqArg f _] ('=':xs) rest = (Opt (f xs),rest)+ long [OptArg f _] [] rest = (Opt (f Nothing),rest)+ long [OptArg f _] ('=':xs) rest = (Opt (f (Just xs)),rest)+ long _ _ rest = (UnreqOpt ("--"++ls),rest)++-- handle short option+shortOpt :: Char -> String -> [String] -> [OptDescr a] -> (OptKind a,[String])+shortOpt y ys rs optDescr = short ads ys rs+ where options = [ o | o@(Option ss _ _ _) <- optDescr, s <- ss, y == s ]+ ads = [ ad | Option _ _ ad _ <- options ]+ optStr = '-':[y]++ short (_:_:_) _ rest = (errAmbig options optStr,rest)+ short (NoArg a :_) [] rest = (Opt a,rest)+ short (NoArg a :_) xs rest = (Opt a,('-':xs):rest)+ short (ReqArg _ d:_) [] [] = (errReq d optStr,[])+ short (ReqArg f _:_) [] (r:rest) = (Opt (f r),rest)+ short (ReqArg f _:_) xs rest = (Opt (f xs),rest)+ short (OptArg f _:_) [] rest = (Opt (f Nothing),rest)+ short (OptArg f _:_) xs rest = (Opt (f (Just xs)),rest)+ short [] [] rest = (UnreqOpt optStr,rest)+ short [] xs rest = (UnreqOpt optStr,('-':xs):rest)++-- miscellaneous error formatting++errAmbig :: [OptDescr a] -> String -> OptKind a+errAmbig ods optStr = OptErr (usageInfo header ods)+ where header = "option `" ++ optStr ++ "' is ambiguous; could be one of:"++errReq :: String -> String -> OptKind a+errReq d optStr = OptErr ("option `" ++ optStr ++ "' requires an argument " ++ d ++ "\n")++errUnrec :: String -> String+errUnrec optStr = "unrecognized option `" ++ optStr ++ "'\n"++errNoArg :: String -> OptKind a+errNoArg optStr = OptErr ("option `" ++ optStr ++ "' doesn't allow an argument\n")++{-+-----------------------------------------------------------------------------------------+-- and here a small and hopefully enlightening example:++data Flag = Verbose | Version | Name String | Output String | Arg String deriving Show++options :: [OptDescr Flag]+options =+ [Option ['v'] ["verbose"] (NoArg Verbose) "verbosely list files",+ Option ['V','?'] ["version","release"] (NoArg Version) "show version info",+ Option ['o'] ["output"] (OptArg out "FILE") "use FILE for dump",+ Option ['n'] ["name"] (ReqArg Name "USER") "only dump USER's files"]++out :: Maybe String -> Flag+out Nothing = Output "stdout"+out (Just o) = Output o++test :: ArgOrder Flag -> [String] -> String+test order cmdline = case getOpt order options cmdline of+ (o,n,[] ) -> "options=" ++ show o ++ " args=" ++ show n ++ "\n"+ (_,_,errs) -> concat errs ++ usageInfo header options+ where header = "Usage: foobar [OPTION...] files..."++-- example runs:+-- putStr (test RequireOrder ["foo","-v"])+-- ==> options=[] args=["foo", "-v"]+-- putStr (test Permute ["foo","-v"])+-- ==> options=[Verbose] args=["foo"]+-- putStr (test (ReturnInOrder Arg) ["foo","-v"])+-- ==> options=[Arg "foo", Verbose] args=[]+-- putStr (test Permute ["foo","--","-v"])+-- ==> options=[] args=["foo", "-v"]+-- putStr (test Permute ["-?o","--name","bar","--na=baz"])+-- ==> options=[Version, Output "stdout", Name "bar", Name "baz"] args=[]+-- putStr (test Permute ["--ver","foo"])+-- ==> option `--ver' is ambiguous; could be one of:+-- -v --verbose verbosely list files+-- -V, -? --version, --release show version info+-- Usage: foobar [OPTION...] files...+-- -v --verbose verbosely list files+-- -V, -? --version, --release show version info+-- -o[FILE] --output[=FILE] use FILE for dump+-- -n USER --name=USER only dump USER's files+-----------------------------------------------------------------------------------------+-}++{- $example1++A simple choice for the type associated with flags is to define a type+@Flag@ as an algebraic type representing the possible flags and their+arguments:++> module Opts1 where+>+> import System.Console.GetOpt+> import GHC.Internal.Data.Maybe ( fromMaybe )+>+> data Flag+> = Verbose | Version+> | Input String | Output String | LibDir String+> deriving Show+>+> options :: [OptDescr Flag]+> options =+> [ Option ['v'] ["verbose"] (NoArg Verbose) "chatty output on stderr"+> , Option ['V','?'] ["version"] (NoArg Version) "show version number"+> , Option ['o'] ["output"] (OptArg outp "FILE") "output FILE"+> , Option ['c'] [] (OptArg inp "FILE") "input FILE"+> , Option ['L'] ["libdir"] (ReqArg LibDir "DIR") "library directory"+> ]+>+> inp,outp :: Maybe String -> Flag+> outp = Output . fromMaybe "stdout"+> inp = Input . fromMaybe "stdin"+>+> compilerOpts :: [String] -> IO ([Flag], [String])+> compilerOpts argv =+> case getOpt Permute options argv of+> (o,n,[] ) -> return (o,n)+> (_,_,errs) -> ioError (userError (concat errs ++ usageInfo header options))+> where header = "Usage: ic [OPTION...] files..."++Then the rest of the program will use the constructed list of flags+to determine it\'s behaviour.++-}++{- $example2++A different approach is to group the option values in a record of type+@Options@, and have each flag yield a function of type+@Options -> Options@ transforming this record.++> module Opts2 where+>+> import System.Console.GetOpt+> import GHC.Internal.Data.Maybe ( fromMaybe )+>+> data Options = Options+> { optVerbose :: Bool+> , optShowVersion :: Bool+> , optOutput :: Maybe FilePath+> , optInput :: Maybe FilePath+> , optLibDirs :: [FilePath]+> } deriving Show+>+> defaultOptions = Options+> { optVerbose = False+> , optShowVersion = False+> , optOutput = Nothing+> , optInput = Nothing+> , optLibDirs = []+> }+>+> options :: [OptDescr (Options -> Options)]+> options =+> [ Option ['v'] ["verbose"]+> (NoArg (\ opts -> opts { optVerbose = True }))+> "chatty output on stderr"+> , Option ['V','?'] ["version"]+> (NoArg (\ opts -> opts { optShowVersion = True }))+> "show version number"+> , Option ['o'] ["output"]+> (OptArg ((\ f opts -> opts { optOutput = Just f }) . fromMaybe "output")+> "FILE")+> "output FILE"+> , Option ['c'] []+> (OptArg ((\ f opts -> opts { optInput = Just f }) . fromMaybe "input")+> "FILE")+> "input FILE"+> , Option ['L'] ["libdir"]+> (ReqArg (\ d opts -> opts { optLibDirs = optLibDirs opts ++ [d] }) "DIR")+> "library directory"+> ]+>+> compilerOpts :: [String] -> IO (Options, [String])+> compilerOpts argv =+> case getOpt Permute options argv of+> (o,n,[] ) -> return (foldl (flip id) defaultOptions o, n)+> (_,_,errs) -> ioError (userError (concat errs ++ usageInfo header options))+> where header = "Usage: ic [OPTION...] files..."++Similarly, each flag could yield a monadic function transforming a record,+of type @Options -> IO Options@ (or any other monad), allowing option+processing to perform actions of the chosen monad, e.g. printing help or+version messages, checking that file arguments exist, etc.++-}
lib/System/Directory.hs view
@@ -12,7 +12,7 @@ copyFile, getHomeDirectory, ) where-import Prelude+import Prelude(); import MiniPrelude import Control.Exception(bracket) import Control.Monad(when) import Foreign.C.String
lib/System/Environment.hs view
@@ -7,10 +7,11 @@ lookupEnv, getEnv, ) where-import Prelude+import Prelude(); import MiniPrelude import Primitives import Foreign.C.String import Foreign.Ptr+import System.IO -- primArgRef returns an array containing a list of strings. -- The first element is the program name, the rest are the arguments.
lib/System/Exit.hs view
@@ -5,6 +5,7 @@ exitSuccess, die, ) where+import Prelude(); import MiniPrelude import Control.Exception import Data.Typeable import System.IO
lib/System/IO.hs view
@@ -21,7 +21,7 @@ mkTextEncoding, hSetEncoding, utf8, - openTmpFile, openTempFile,+ openTmpFile, openTempFile, openBinaryTempFile, withFile, ) where@@ -47,17 +47,17 @@ import Foreign.Marshal.Alloc import Foreign.Ptr import System.IO.Unsafe-import System.IO_Handle+import System.IO.Internal data FILE primHPrint :: forall a . Ptr BFILE -> a -> IO () primHPrint = primitive "IO.print"-primStdin :: Ptr BFILE+primStdin :: ForeignPtr BFILE primStdin = primitive "IO.stdin"-primStdout :: Ptr BFILE+primStdout :: ForeignPtr BFILE primStdout = primitive "IO.stdout"-primStderr :: Ptr BFILE+primStderr :: ForeignPtr BFILE primStderr = primitive "IO.stderr" foreign import ccall "fopen" c_fopen :: CString -> CString -> IO (Ptr FILE)@@ -72,45 +72,45 @@ ---------------------------------------------------------- instance Eq Handle where- Handle p == Handle q = p == q+ h == h' =+ unsafePerformIO $+ withHandleAny h $ \ p ->+ withHandleAny h' $ \ p' ->+ pure (p == p') instance Show Handle where- show (Handle p) = "Handle-" ++ show p+ show h = unsafePerformIO $+ withHandleAny h $ \ p ->+ return $ "Handle-" ++ show p type FilePath = String -data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode--instance Functor IO where- fmap f ioa = ioa `primBind` \ a -> primReturn (f a)-instance Applicative IO where- pure = primReturn- (<*>) = ap-instance Monad IO where- (>>=) = primBind- (>>) = primThen- return = primReturn-instance MonadFail IO where- fail = error- stdin :: Handle-stdin = Handle primStdin+stdin = unsafeHandle primStdin HRead "stdin" stdout :: Handle-stdout = Handle primStdout+stdout = unsafeHandle primStdout HWrite "stdout" stderr :: Handle-stderr = Handle primStderr+stderr = unsafeHandle primStderr HWrite "stderr" --bFILE :: Ptr FILE -> Handle --bFILE = Handle . primPerformIO . (c_add_utf8 <=< c_add_FILE) hClose :: Handle -> IO ()-hClose (Handle p) = c_closeb p+hClose h = do+ m <- getHandleState h+ case m of+ HClosed -> error "Handle already closed"+ HSemiClosed -> return ()+ _ -> do+ killHandle h+ withHandleAny h c_closeb+ setHandleState h HClosed hFlush :: Handle -> IO ()-hFlush (Handle p) = c_flushb p+hFlush h = withHandleWr h c_flushb hGetChar :: Handle -> IO Char-hGetChar (Handle p) = do+hGetChar h = withHandleRd h $ \ p -> do c <- c_getb p if c == (-1::Int) then error "hGetChar: EOF"@@ -118,13 +118,13 @@ return (chr c) hLookAhead :: Handle -> IO Char-hLookAhead h@(Handle p) = do+hLookAhead h = withHandleRd h $ \ p -> do c <- hGetChar h c_ungetb (ord c) p return c hPutChar :: Handle -> Char -> IO ()-hPutChar (Handle p) c = c_putb (ord c) p+hPutChar h c = withHandleWr h $ c_putb (ord c) openFILEM :: FilePath -> IOMode -> IO (Maybe (Ptr FILE)) openFILEM p m = do@@ -141,11 +141,11 @@ return (Just h) openFileM :: FilePath -> IOMode -> IO (Maybe Handle)-openFileM p m = do- mf <- openFILEM p m+openFileM fn m = do+ mf <- openFILEM fn m case mf of Nothing -> return Nothing- Just p -> do { q <- c_add_utf8 =<< c_add_FILE p; return (Just (Handle q)) }+ Just p -> do { q <- c_add_utf8 =<< c_add_FILE p; Just <$> mkHandle fn q (ioModeToHMode m) } openFile :: String -> IOMode -> IO Handle openFile p m = do@@ -161,12 +161,10 @@ getChar = hGetChar stdin cprint :: forall a . a -> IO ()-cprint a = primRnfNoErr a `seq` primHPrint p a- where Handle p = stdout+cprint a = withHandleWr stdout $ \ p -> primRnfNoErr a `seq` primHPrint p a cuprint :: forall a . a -> IO ()-cuprint = primHPrint p- where Handle p = stdout+cuprint a = withHandleWr stdout $ \ p -> primHPrint p a print :: forall a . (Show a) => a -> IO () print a = putStrLn (show a)@@ -230,10 +228,11 @@ -- Lazy hGetContents hGetContents :: Handle -> IO String-hGetContents h@(Handle p) = do+hGetContents h = withHandleRd h $ \ p -> do c <- c_getb p if c == (-1::Int) then do- hClose h -- EOF, so close the handle+ hClose h -- EOF, so close the handle+ setHandleState h HSemiClosed -- but still allow a regular close return "" else do cs <- unsafeInterleaveIO (hGetContents h)@@ -246,11 +245,11 @@ interact f = getContents >>= putStr . f openBinaryFile :: String -> IOMode -> IO Handle-openBinaryFile p m = do- mf <- openFILEM p m+openBinaryFile fn m = do+ mf <- openFILEM fn m case mf of- Nothing -> error $ "openBinaryFile: cannot open " ++ show p- Just p -> do { q <- c_add_FILE p; return (Handle q) }+ Nothing -> error $ "openBinaryFile: cannot open " ++ show fn+ Just p -> do { q <- c_add_FILE p; mkHandle fn q (ioModeToHMode m) } -------- -- For compatibility@@ -301,8 +300,8 @@ return (tmp, h) -- Sloppy implementation of openTempFile-openTempFile :: FilePath -> String -> IO (String, Handle)-openTempFile tmp tmplt = do+openTempFile' :: (FilePath -> IOMode -> IO Handle) -> FilePath -> String -> IO (String, Handle)+openTempFile' open tmp tmplt = do let (pre, suf) = splitTmp tmplt loop n = do let fn = tmp ++ "/" ++ pre ++ show n ++ suf@@ -312,6 +311,12 @@ hClose h loop (n+1 :: Int) Nothing -> do- h <- openFile fn ReadWriteMode+ h <- open fn ReadWriteMode return (fn, h) loop 0++openTempFile :: FilePath -> String -> IO (String, Handle)+openTempFile = openTempFile' openFile++openBinaryTempFile :: FilePath -> String -> IO (String, Handle)+openBinaryTempFile = openTempFile' openBinaryFile
+ lib/System/IO/Error.hs view
@@ -0,0 +1,335 @@+module System.IO.Error (+ IOException(..),++ -- * I\/O errors+ IOError,+ IOErrorType(..),++ userError,++ mkIOError,++ annotateIOError,++ -- ** Classifying I\/O errors+ isAlreadyExistsError,+ isDoesNotExistError,+ isAlreadyInUseError,+ isFullError,+ isEOFError,+ isIllegalOperation,+ isPermissionError,+ isUserError,+ isResourceVanishedError,++ -- ** Attributes of I\/O errors+ ioeGetErrorType,+ ioeGetLocation,+ ioeGetErrorString,+ ioeGetHandle,+ ioeGetFileName,++ ioeSetErrorType,+ ioeSetErrorString,+ ioeSetLocation,+ ioeSetHandle,+ ioeSetFileName,++ -- * Types of I\/O error+ IOErrorType, -- abstract++ alreadyExistsErrorType,+ doesNotExistErrorType,+ alreadyInUseErrorType,+ fullErrorType,+ eofErrorType,+ illegalOperationErrorType,+ permissionErrorType,+ userErrorType,+ resourceVanishedErrorType,++ -- ** 'IOErrorType' predicates+ isAlreadyExistsErrorType,+ isDoesNotExistErrorType,+ isAlreadyInUseErrorType,+ isFullErrorType,+ isEOFErrorType,+ isIllegalOperationErrorType,+ isPermissionErrorType,+ isUserErrorType,+ isResourceVanishedErrorType,++ -- * Throwing and catching I\/O errors++ ioError,++ catchIOError,+ tryIOError,++ modifyIOError,+ ) where+import Prelude()+import Control.Exception.Internal+import Control.Monad+import Data.Bool+import Data.Char_Type+import Data.Either+import Data.Eq+import Data.Function+import Data.Int+import Data.List+import Data.Maybe+import Data.Records -- needed since we don't import Mhs.Builtin+import Data.String+import Data.Typeable+import System.IO+import Text.Show+++ioException :: IOException -> IO a+ioException err = throw err++ioError :: IOError -> IO a+ioError = ioException++type IOError = IOException++data IOException+ = IOError {+ ioe_handle :: Maybe Handle, -- ^ the handle used by the action flagging+ -- the error.+ ioe_type :: IOErrorType, -- ^ what it was.+ ioe_location :: String, -- ^ location.+ ioe_description :: String, -- ^ error type specific information.+ ioe_errno :: Maybe Int, -- ^ errno leading to this error, if any.+ ioe_filename :: Maybe FilePath -- ^ filename the error is related to+ -- (some libraries may assume different encodings+ -- when constructing this field from e.g. 'ByteString'+ -- or other types)+ }+ deriving (Typeable)++instance Exception IOException++instance Eq IOException where+ (IOError h1 e1 loc1 str1 en1 fn1) == (IOError h2 e2 loc2 str2 en2 fn2) =+ e1==e2 && str1==str2 && h1==h2 && loc1==loc2 && en1==en2 && fn1==fn2++-- | An abstract type that contains a value for each variant of 'IOError'.+data IOErrorType+ -- Haskell 2010:+ = AlreadyExists+ | NoSuchThing+ | ResourceBusy+ | ResourceExhausted+ | EOF+ | IllegalOperation+ | PermissionDenied+ | UserError+ -- GHC only:+ | UnsatisfiedConstraints+ | SystemError+ | ProtocolError+ | OtherError+ | InvalidArgument+ | InappropriateType+ | HardwareFault+ | UnsupportedOperation+ | TimeExpired+ | ResourceVanished+ | Interrupted+ deriving (Eq)++instance Show IOErrorType where+ showsPrec _ e =+ showString $+ case e of+ AlreadyExists -> "already exists"+ NoSuchThing -> "does not exist"+ ResourceBusy -> "resource busy"+ ResourceExhausted -> "resource exhausted"+ EOF -> "end of file"+ IllegalOperation -> "illegal operation"+ PermissionDenied -> "permission denied"+ UserError -> "user error"+ HardwareFault -> "hardware fault"+ InappropriateType -> "inappropriate type"+ Interrupted -> "interrupted"+ InvalidArgument -> "invalid argument"+ OtherError -> "failed"+ ProtocolError -> "protocol error"+ ResourceVanished -> "resource vanished"+ SystemError -> "system error"+ TimeExpired -> "timeout"+ UnsatisfiedConstraints -> "unsatisfied constraints" -- ultra-precise!+ UnsupportedOperation -> "unsupported operation"++userError :: String -> IOError+userError str = IOError Nothing UserError "" str Nothing Nothing++instance Show IOException where+ showsPrec p (IOError hdl iot loc s _ fn) =+ (case fn of+ Nothing -> case hdl of+ Nothing -> id+ Just h -> showsPrec p h . showString ": "+ Just name -> showString name . showString ": ") .+ (case loc of+ "" -> id+ _ -> showString loc . showString ": ") .+ showsPrec p iot .+ (case s of+ "" -> id+ _ -> showString " (" . showString s . showString ")")++-----------++tryIOError :: IO a -> IO (Either IOError a)+tryIOError f = catch (do r <- f+ return (Right r))+ (return . Left)++mkIOError :: IOErrorType -> String -> Maybe Handle -> Maybe FilePath -> IOError+mkIOError t location maybe_hdl maybe_filename =+ IOError{ ioe_type = t,+ ioe_location = location,+ ioe_description = "",+ ioe_errno = Nothing,+ ioe_handle = maybe_hdl,+ ioe_filename = maybe_filename+ }++isAlreadyExistsError :: IOError -> Bool+isAlreadyExistsError = isAlreadyExistsErrorType . ioeGetErrorType++isDoesNotExistError :: IOError -> Bool+isDoesNotExistError = isDoesNotExistErrorType . ioeGetErrorType++isAlreadyInUseError :: IOError -> Bool+isAlreadyInUseError = isAlreadyInUseErrorType . ioeGetErrorType++isFullError :: IOError -> Bool+isFullError = isFullErrorType . ioeGetErrorType++isEOFError :: IOError -> Bool+isEOFError = isEOFErrorType . ioeGetErrorType++isIllegalOperation :: IOError -> Bool+isIllegalOperation = isIllegalOperationErrorType . ioeGetErrorType++isPermissionError :: IOError -> Bool+isPermissionError = isPermissionErrorType . ioeGetErrorType++isUserError :: IOError -> Bool+isUserError = isUserErrorType . ioeGetErrorType++isResourceVanishedError :: IOError -> Bool+isResourceVanishedError = isResourceVanishedErrorType . ioeGetErrorType++alreadyExistsErrorType :: IOErrorType+alreadyExistsErrorType = AlreadyExists++doesNotExistErrorType :: IOErrorType+doesNotExistErrorType = NoSuchThing++alreadyInUseErrorType :: IOErrorType+alreadyInUseErrorType = ResourceBusy++fullErrorType :: IOErrorType+fullErrorType = ResourceExhausted++eofErrorType :: IOErrorType+eofErrorType = EOF++illegalOperationErrorType :: IOErrorType+illegalOperationErrorType = IllegalOperation++permissionErrorType :: IOErrorType+permissionErrorType = PermissionDenied++userErrorType :: IOErrorType+userErrorType = UserError++resourceVanishedErrorType :: IOErrorType+resourceVanishedErrorType = ResourceVanished++isAlreadyExistsErrorType :: IOErrorType -> Bool+isAlreadyExistsErrorType AlreadyExists = True+isAlreadyExistsErrorType _ = False++isDoesNotExistErrorType :: IOErrorType -> Bool+isDoesNotExistErrorType NoSuchThing = True+isDoesNotExistErrorType _ = False++isAlreadyInUseErrorType :: IOErrorType -> Bool+isAlreadyInUseErrorType ResourceBusy = True+isAlreadyInUseErrorType _ = False++isFullErrorType :: IOErrorType -> Bool+isFullErrorType ResourceExhausted = True+isFullErrorType _ = False++isEOFErrorType :: IOErrorType -> Bool+isEOFErrorType EOF = True+isEOFErrorType _ = False++isIllegalOperationErrorType :: IOErrorType -> Bool+isIllegalOperationErrorType IllegalOperation = True+isIllegalOperationErrorType _ = False++isPermissionErrorType :: IOErrorType -> Bool+isPermissionErrorType PermissionDenied = True+isPermissionErrorType _ = False++isUserErrorType :: IOErrorType -> Bool+isUserErrorType UserError = True+isUserErrorType _ = False++isResourceVanishedErrorType :: IOErrorType -> Bool+isResourceVanishedErrorType ResourceVanished = True+isResourceVanishedErrorType _ = False++ioeGetErrorType :: IOError -> IOErrorType+ioeGetErrorString :: IOError -> String+ioeGetLocation :: IOError -> String+ioeGetHandle :: IOError -> Maybe Handle+ioeGetFileName :: IOError -> Maybe FilePath++ioeGetErrorType ioe = ioe_type ioe++ioeGetErrorString ioe+ | isUserErrorType (ioe_type ioe) = ioe_description ioe+ | otherwise = show (ioe_type ioe)++ioeGetLocation ioe = ioe_location ioe++ioeGetHandle ioe = ioe_handle ioe++ioeGetFileName ioe = ioe_filename ioe++ioeSetErrorType :: IOError -> IOErrorType -> IOError+ioeSetErrorString :: IOError -> String -> IOError+ioeSetLocation :: IOError -> String -> IOError+ioeSetHandle :: IOError -> Handle -> IOError+ioeSetFileName :: IOError -> FilePath -> IOError++ioeSetErrorType ioe errtype = ioe{ ioe_type = errtype }+ioeSetErrorString ioe str = ioe{ ioe_description = str }+ioeSetLocation ioe str = ioe{ ioe_location = str }+ioeSetHandle ioe hdl = ioe{ ioe_handle = Just hdl }+ioeSetFileName ioe filename = ioe{ ioe_filename = Just filename }++modifyIOError :: (IOError -> IOError) -> IO a -> IO a+modifyIOError f io = catch io (\e -> ioError (f e))++annotateIOError :: IOError+ -> String+ -> Maybe Handle+ -> Maybe FilePath+ -> IOError+annotateIOError ioe loc hdl path =+ ioe{ ioe_handle = hdl `mplus` ioe_handle ioe,+ ioe_location = loc, ioe_filename = path `mplus` ioe_filename ioe }++catchIOError :: IO a -> (IOError -> IO a) -> IO a+catchIOError = catch
+ lib/System/IO/Internal.hs view
@@ -0,0 +1,113 @@+module System.IO.Internal(+ BFILE,+ Handle, HandleState(..),+ IOMode(..), ioModeToHMode,+ mkHandle, unsafeHandle,+ withHandleRd, withHandleWr, withHandleAny,+ getHandleState, setHandleState,+ killHandle,+ addTransducer) where+import Prelude()+import Primitives+import Control.Applicative+import Control.Error+import Control.Monad+import Control.Monad.Fail+import Data.Bool+import Data.Char+import Data.Eq+import Data.Function+import Data.IORef+import Data.List+--import Foreign.ForeignPtr causes import cycle+import System.IO_Handle+import System.IO.Unsafe++data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode+ deriving (Eq)++ioModeToHMode :: IOMode -> HandleState+ioModeToHMode ReadMode = HRead+ioModeToHMode WriteMode = HWrite+ioModeToHMode AppendMode = HWrite+ioModeToHMode ReadWriteMode = HReadWrite++unsafeHandle :: ForeignPtr BFILE -> HandleState -> String -> Handle+unsafeHandle fp m desc = unsafePerformIO $ do+ st <- newIORef m+ return (Handle fp st desc)++withHandle :: Handle -> (Ptr BFILE -> IO a) -> IO a+withHandle (Handle fp _ _) io = do+ a <- io (primForeignPtrToPtr fp)+ seq fp (return a) -- hold on to fp so it's not gc():ed++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")+ withHandle h io++withHandleRd :: Handle -> (Ptr BFILE -> IO a) -> IO a+withHandleRd = withHandleM [HRead, HReadWrite]++withHandleWr :: Handle -> (Ptr BFILE -> IO a) -> IO a+withHandleWr = withHandleM [HWrite, HReadWrite]++withHandleAny :: Handle -> (Ptr BFILE -> IO a) -> IO a+withHandleAny = withHandle++getHandleState :: Handle -> IO HandleState+getHandleState (Handle _ st _) = readIORef st++setHandleState :: Handle -> HandleState -> IO ()+setHandleState (Handle _ st _) m = writeIORef st m++foreign import ccall "&closeb" c_close :: FunPtr (Ptr BFILE -> IO ())++{-+primSetDesc :: [Char] -> ForeignPtr BFILE -> IO ()+primSetDesc = primitive "fpstr"+-}++-- Create a Handle with the appropriate finalizer.+mkHandle :: [Char] -> Ptr BFILE -> HandleState -> IO Handle+mkHandle desc p mode = do+ fp <- primNewForeignPtr p+ primAddFinalizer c_close fp+{-+ primSetDesc desc fp+-}+ rmode <- newIORef mode+ return (Handle fp rmode desc)++-- When a handle is closed, we must remove the c_close finalizer.+killHandle :: Handle -> IO ()+killHandle (Handle fp _ _) =+ primAddFinalizer (primIntToFunPtr (0::Int)) fp++addTransducer :: (Ptr BFILE -> IO (Ptr BFILE)) -> Handle -> IO Handle+addTransducer trans h@(Handle _ st desc) =+ withHandle h $ \ p -> do -- unwrap handle+ p' <- trans p -- add transducer+ mode <- readIORef st+ killHandle h -- old handle should not be finalized,+ mkHandle desc p' mode -- because the new handle will do that++----------------------------------------++instance Functor IO where+ fmap f ioa = ioa `primBind` \ a -> primReturn (f a)++instance Applicative IO where+ pure = primReturn+ (<*>) = ap++instance Monad IO where+ (>>=) = primBind+ (>>) = primThen+ return = primReturn++instance MonadFail IO where+ fail = error+
lib/System/IO/MD5.hs view
@@ -1,16 +1,17 @@ -- 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 Primitives(primPerformIO)-import Prelude import Data.Word import Foreign.C.String import Foreign.Marshal.Alloc import Foreign.Marshal.Array import Foreign.Ptr import System.IO+import System.IO.Internal -foreign import ccall "md5BFILE" c_md5BFILE :: Handle -> Ptr Word -> IO ()+foreign import ccall "md5BFILE" c_md5BFILE :: Ptr BFILE -> Ptr Word -> IO () foreign import ccall "md5String" c_md5String :: CString -> Ptr Word -> IO () foreign import ccall "md5Array" c_md5Array :: Ptr Word -> Ptr Word -> Int -> IO () @@ -43,7 +44,7 @@ md5String s = primPerformIO $ withCAString s $ chksum . c_md5String md5Handle :: Handle -> IO MD5CheckSum-md5Handle h = chksum $ c_md5BFILE h+md5Handle h = withHandleRd h $ chksum . c_md5BFILE md5File :: FilePath -> IO (Maybe MD5CheckSum) md5File fn = do
lib/System/IO/Serialize.hs view
@@ -5,9 +5,10 @@ writeSerialized, writeSerializedCompressed, readSerialized, ) where+import Prelude(); import MiniPrelude import Primitives(Ptr)-import System.IO_Handle import System.IO+import System.IO.Internal primHSerialize :: forall a . Ptr BFILE -> a -> IO () primHSerialize = primitive "IO.serialize"@@ -15,10 +16,10 @@ primHDeserialize = primitive "IO.deserialize" hSerialize :: forall a . Handle -> a -> IO ()-hSerialize (Handle p) = primHSerialize p+hSerialize h a = withHandleWr h $ \ p -> primHSerialize p a hDeserialize :: forall a . Handle -> IO a-hDeserialize (Handle p) = primHDeserialize p+hDeserialize h = withHandleRd h primHDeserialize writeSerialized :: forall a . FilePath -> a -> IO () writeSerialized p s = do@@ -31,20 +32,20 @@ writeSerializedCompressed :: forall a . FilePath -> a -> IO () writeSerializedCompressed p s = do- h@(Handle p) <- openBinaryFile p WriteMode+ h <- openBinaryFile p WriteMode hPutChar h 'z' -- indicate compressed- h' <- Handle <$> c_add_lz77_compressor p+ h' <- addTransducer c_add_lz77_compressor h hSerialize h' s hClose h' -- Read compressed or uncompressed readSerialized :: forall a . FilePath -> IO a readSerialized p = do- h@(Handle p) <- openBinaryFile p ReadMode+ h <- openBinaryFile p ReadMode c <- hLookAhead h h' <- if c == 'z' then do -- compressed? hGetChar h -- get rid of the 'z'- Handle <$> c_add_lz77_decompressor p+ addTransducer c_add_lz77_decompressor h else return h a <- hDeserialize h'
lib/System/IO/TimeMilli.hs view
@@ -1,4 +1,5 @@ module System.IO.TimeMilli(getTimeMilli) where+import Prelude(); import MiniPrelude foreign import ccall "GETTIMEMILLI" c_getTimeMilli :: IO Int
lib/System/IO_Handle.hs view
@@ -1,6 +1,17 @@-module System.IO_Handle(BFILE, Handle(..)) where+module System.IO_Handle(BFILE, Handle(..), HandleState(..)) where import Prelude() import Primitives+import Data.Bool+import Data.Eq+import Data.IORef -data BFILE-newtype Handle = Handle (Ptr BFILE)+-- A handle is a ForeignPtr to a C BFILE transducer.+-- It needs to be a ForeignPtr so it can have a finalizer+-- that closes the underlying BFILE when the Handle is gc():ed.++data BFILE -- tag used for C pointers to BFILE structs++data Handle = Handle (ForeignPtr BFILE) (IORef HandleState) [Char]++data HandleState = HRead | HWrite | HReadWrite | HSemiClosed | HClosed+ deriving (Eq)
lib/System/Process.hs view
@@ -1,5 +1,5 @@ module System.Process(callCommand) where-import Prelude+import Prelude(); import MiniPrelude import Control.Monad(when) import Foreign.C.String
lib/Text/ParserCombinators/ReadP.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE DeriveFunctor #-}+ ----------------------------------------------------------------------------- -- |--- Module : Text.ParserCombinators.ReadP+-- Module : GHC.Internal.Text.ParserCombinators.ReadP -- Copyright : (c) The University of Glasgow 2002 -- License : BSD-style (see the file libraries/base/LICENSE) --@@ -65,20 +71,25 @@ -- $properties ) where--import Control.Applicative-import Control.Alternative+import Prelude()+import Primitives+import Control.Applicative hiding (optional, many) import Control.Error import Control.Monad+import Control.Monad.Fail import Data.Bool import Data.Char import Data.Eq import Data.Function+import Data.Functor import Data.Int-import Data.List import Data.Num-import Data.Tuple+import Data.List+import Data.List.NonEmpty+import Data.Monoid.Internal +default (Int)+ infixr 5 +++, <++ ------------------------------------------------------------------------@@ -100,34 +111,39 @@ | Look (String -> P a) | Fail | Result a (P a)- | Final [(a,String)]--- deriving Functor -- ^ @since 4.8.0.0+ | Final (NonEmpty (a,String))+-- deriving Functor -- ^ @since base-4.8.0.0+ instance Functor P where- fmap f (Get p) = Get (\ c -> fmap f (p c))+ fmap f (Get g) = Get (fmap f . g)+ fmap f (Look g) = Look (fmap f . g)+ fmap _ Fail = Fail+ fmap f (Result a pa) = Result (f a) (fmap f pa)+ fmap f (Final xs) = Final (fmap (\ (a, s) -> (f a, s)) xs) -- Monad, MonadPlus --- | @since 4.5.0.0+-- | @since base-4.5.0.0 instance Applicative P where pure x = Result x Fail (<*>) = ap --- | @since 2.01+-- | @since base-2.01 instance MonadPlus P --- | @since 2.01+-- | @since base-2.01 instance Monad P where (Get f) >>= k = Get (\c -> f c >>= k) (Look f) >>= k = Look (\s -> f s >>= 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 4.9.0.0+-- | @since base-4.9.0.0 instance MonadFail P where fail _ = Fail --- | @since 4.5.0.0+-- | @since base-4.5.0.0 instance Alternative P where empty = Fail @@ -145,11 +161,15 @@ -- two finals are combined -- final + look becomes one look and one final (=optimization) -- final + sthg else becomes one look and one final- Final r <|> Final t = Final (r ++ t)- Final (r:rs) <|> Look f = Look (\s -> Final (r:(rs ++ run (f s) s)))- Final (r:rs) <|> p = Look (\s -> Final (r:(rs ++ run p s)))- Look f <|> Final r = Look (\s -> Final (run (f s) s ++ r))- p <|> Final r = Look (\s -> Final (run p s ++ r))+ Final r <|> Final t = Final (r <> t)+ Final (r:|rs) <|> Look f = Look (\s -> Final (r:|(rs ++ run (f s) s)))+ Final (r:|rs) <|> p = Look (\s -> Final (r:|(rs ++ run p s)))+ Look f <|> Final r = Look (\s -> Final (case run (f s) s of+ [] -> r+ (x:xs) -> (x:|xs) <> r))+ p <|> Final r = Look (\s -> Final (case run p s of+ [] -> r+ (x:xs) -> (x:|xs) <> r)) -- two looks are combined (=optimization) -- look + sthg else floats upwards@@ -162,44 +182,44 @@ newtype ReadP a = R (forall b . (a -> P b) -> P b) --- | @since 2.01+-- | @since base-2.01 instance Functor ReadP where fmap h (R f) = R (\k -> f (k . h)) --- | @since 4.6.0.0+-- | @since base-4.6.0.0 instance Applicative ReadP where pure x = R (\k -> k x) (<*>) = ap -- liftA2 = liftM2 --- | @since 2.01+-- | @since base-2.01 instance Monad ReadP where- R m >>= f = R (\k -> m (\a -> let { R m' = f a } in m' k))+ R m >>= f = R (\k -> m (\a -> let R m' = f a in m' k)) --- | @since 4.9.0.0+-- | @since base-4.9.0.0 instance MonadFail ReadP where fail _ = R (\_ -> Fail) --- | @since 4.6.0.0+-- | @since base-4.6.0.0 instance Alternative ReadP where empty = pfail (<|>) = (+++) --- | @since 2.01+-- | @since base-2.01 instance MonadPlus ReadP -- --------------------------------------------------------------------------- -- Operations over P -final :: forall a . [(a,String)] -> P a-final [] = Fail-final rs = Final rs+final :: [(a,String)] -> P a+final [] = Fail+final (r:rs) = Final (r:|rs) -run :: forall a . P a -> ReadS a+run :: P a -> ReadS a 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 rs) _ = rs+run (Final (r:|rs)) _ = (r:rs) run _ _ = [] -- ---------------------------------------------------------------------------@@ -215,11 +235,11 @@ -- consuming it. look = R Look -pfail :: forall a . ReadP a+pfail :: ReadP a -- ^ Always fails. pfail = R (\_ -> Fail) -(+++) :: forall a . ReadP a -> ReadP a -> ReadP a+(+++) :: ReadP a -> ReadP a -> ReadP a -- ^ Symmetric choice. R f1 +++ R f2 = R (\k -> f1 k <|> f2 k) @@ -227,32 +247,35 @@ -- ^ Local, exclusive, left-biased choice: If left parser -- locally produces any result at all, then right parser is -- not used.-R f0 <++ q =+(<++) (R f0) q = do s <- look- probe (f0 return) s (0::Int)+ probe (f0 return) s 0 where- probe (Get f) (c:s) n = probe (f c) s (n + (1::Int))+ probe :: P a -> [Char] -> Int -> ReadP a+ probe (Get f) (c:s) n = probe (f c) s (n + 1) probe (Look f) s n = probe (f s) s n probe p@(Result _ _) _ n = discard n >> R (p >>=) probe (Final r) _ _ = R (Final r >>=) probe _ _ _ = q - discard n = if n == 0::Int then return () else get >> discard (n - (1::Int))+ discard 0 = return ()+ discard n = get >> discard (n - 1) -gather :: forall a . ReadP a -> ReadP (String, a)+gather :: ReadP a -> ReadP (String, a) -- ^ Transforms a parser into one that does the same, but -- in addition returns the exact characters read. -- IMPORTANT NOTE: 'gather' gives a runtime error if its first argument -- is built using any occurrences of readS_to_P. gather (R m) = R (\k -> gath id (m (\a -> return (\s -> k (s,a)))))+ where- gath :: forall b . (String -> String) -> P (String -> P b) -> P b+ 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 (Result k p) = k (l []) <|> gath l p- gath _ (Final _) = error "do not use readS_to_P in gather!"+ gath _ (Final _) = errorWithoutStackTrace "do not use readS_to_P in gather!" -- --------------------------------------------------------------------------- -- Derived operations@@ -300,7 +323,7 @@ if p c then do s <- munch p; return (c:s) else pfail -choice :: forall a . [ReadP a] -> ReadP a+choice :: [ReadP a] -> ReadP a -- ^ Combines all parsers in the specified list. choice [] = pfail choice [p] = p@@ -315,12 +338,12 @@ skip (c:s) | isSpace c = do _ <- get; skip s skip _ = return () -count :: forall a . Int -> ReadP a -> ReadP [a]+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) -between :: forall a open close . ReadP open -> ReadP close -> ReadP a -> ReadP a+between :: ReadP open -> ReadP close -> ReadP a -> ReadP a -- ^ @between open close p@ parses @open@, followed by @p@ and finally -- @close@. Only the value of @p@ is returned. between open close p = do _ <- open@@ -328,66 +351,66 @@ _ <- close return x -option :: forall a . a -> ReadP a -> ReadP a+option :: a -> ReadP a -> ReadP a -- ^ @option x p@ will either parse @p@ or return @x@ without consuming -- any input. option x p = p +++ return x -optional :: forall a . ReadP a -> ReadP ()+optional :: ReadP a -> ReadP () -- ^ @optional p@ optionally parses @p@ and always returns @()@. optional p = (p >> return ()) +++ return () -many :: forall a . ReadP a -> ReadP [a]+many :: ReadP a -> ReadP [a] -- ^ Parses zero or more occurrences of the given parser. many p = return [] +++ many1 p -many1 :: forall a . ReadP a -> ReadP [a]+many1 :: ReadP a -> ReadP [a] -- ^ Parses one or more occurrences of the given parser. many1 p = liftM2 (:) p (many p) -skipMany :: forall a . ReadP a -> ReadP ()+skipMany :: ReadP a -> ReadP () -- ^ Like 'many', but discards the result. skipMany p = many p >> return () -skipMany1 :: forall a . ReadP a -> ReadP ()+skipMany1 :: ReadP a -> ReadP () -- ^ Like 'many1', but discards the result. skipMany1 p = p >> skipMany p -sepBy :: forall a sep . ReadP a -> ReadP sep -> ReadP [a]+sepBy :: ReadP a -> ReadP sep -> ReadP [a] -- ^ @sepBy p sep@ parses zero or more occurrences of @p@, separated by @sep@. -- Returns a list of values returned by @p@. sepBy p sep = sepBy1 p sep +++ return [] -sepBy1 :: forall a sep . ReadP a -> ReadP sep -> ReadP [a]+sepBy1 :: ReadP a -> ReadP sep -> ReadP [a] -- ^ @sepBy1 p sep@ parses one or more occurrences of @p@, separated by @sep@. -- Returns a list of values returned by @p@. sepBy1 p sep = liftM2 (:) p (many (sep >> p)) -endBy :: forall a sep . ReadP a -> ReadP sep -> ReadP [a]+endBy :: ReadP a -> ReadP sep -> ReadP [a] -- ^ @endBy p sep@ parses zero or more occurrences of @p@, separated and ended -- by @sep@.-endBy p sep = many (do { x <- p ; _ <- sep ; return x})+endBy p sep = many (do x <- p ; _ <- sep ; return x) -endBy1 :: forall a sep . ReadP a -> ReadP sep -> ReadP [a]+endBy1 :: ReadP a -> ReadP sep -> ReadP [a] -- ^ @endBy p sep@ parses one or more occurrences of @p@, separated and ended -- by @sep@.-endBy1 p sep = many1 (do { x <- p ; _ <- sep ; return x})+endBy1 p sep = many1 (do x <- p ; _ <- sep ; return x) -chainr :: forall a . ReadP a -> ReadP (a -> a -> a) -> a -> ReadP a+chainr :: ReadP a -> ReadP (a -> a -> a) -> a -> ReadP a -- ^ @chainr p op x@ parses zero or more occurrences of @p@, separated by @op@. -- Returns a value produced by a /right/ associative application of all -- functions returned by @op@. If there are no occurrences of @p@, @x@ is -- returned. chainr p op x = chainr1 p op +++ return x -chainl :: forall a . ReadP a -> ReadP (a -> a -> a) -> a -> ReadP a+chainl :: ReadP a -> ReadP (a -> a -> a) -> a -> ReadP a -- ^ @chainl p op x@ parses zero or more occurrences of @p@, separated by @op@. -- Returns a value produced by a /left/ associative application of all -- functions returned by @op@. If there are no occurrences of @p@, @x@ is -- returned. chainl p op x = chainl1 p op +++ return x -chainr1 :: forall a . ReadP a -> ReadP (a -> a -> a) -> ReadP a+chainr1 :: ReadP a -> ReadP (a -> a -> a) -> ReadP a -- ^ Like 'chainr', but parses one or more occurrences of @p@. chainr1 p op = scan where scan = p >>= rest@@ -396,7 +419,7 @@ return (f x y) +++ return x -chainl1 :: forall a . ReadP a -> ReadP (a -> a -> a) -> ReadP a+chainl1 :: ReadP a -> ReadP (a -> a -> a) -> ReadP a -- ^ Like 'chainl', but parses one or more occurrences of @p@. chainl1 p op = p >>= rest where rest x = do f <- op@@ -404,7 +427,7 @@ rest (f x y) +++ return x -manyTill :: forall a end . ReadP a -> ReadP end -> ReadP [a]+manyTill :: ReadP a -> ReadP end -> ReadP [a] -- ^ @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@@ -413,16 +436,17 @@ -- --------------------------------------------------------------------------- -- Converting between ReadP and Read -readP_to_S :: forall a . ReadP a -> ReadS a+readP_to_S :: ReadP a -> ReadS a -- ^ Converts a parser into a Haskell ReadS-style function. -- This is the main way in which you can \"run\" a 'ReadP' parser: -- the expanded type is -- @ readP_to_S :: ReadP a -> String -> [(a,String)] @ readP_to_S (R f) = run (f return) -readS_to_P :: forall a . ReadS a -> ReadP a+readS_to_P :: ReadS a -> ReadP a -- ^ Converts a Haskell ReadS-style function into a parser. -- Warning: This introduces local backtracking in the resulting -- 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
@@ -1,6 +1,9 @@+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE NoImplicitPrelude #-}+ ----------------------------------------------------------------------------- -- |--- Module : Text.ParserCombinators.ReadPrec+-- Module : GHC.Internal.Text.ParserCombinators.ReadPrec -- Copyright : (c) The University of Glasgow 2002 -- License : BSD-style (see the file libraries/base/LICENSE) --@@ -42,31 +45,20 @@ readS_to_Prec, ) where---import Text.ParserCombinators.ReadP- ( ReadP- , ReadS- , readP_to_S- , readS_to_P- )--import qualified Text.ParserCombinators.ReadP as ReadP- ( get- , look- , (+++), (<++)- , pfail- )-+import Prelude() import Control.Applicative-import Control.Alternative import Control.Monad+import Control.Monad.Fail import Data.Char import Data.Int-import Data.List import Data.Num+import Data.List import Data.Ord+import Text.ParserCombinators.ReadP(ReadP, ReadS, readP_to_S, readS_to_P)+import qualified Text.ParserCombinators.ReadP as ReadP(get, look, (+++), (<++), pfail) +default (Int)+ -- --------------------------------------------------------------------------- -- The readPrec type @@ -74,28 +66,22 @@ -- Functor, Monad, MonadPlus --- | @since 2.01 instance Functor ReadPrec where fmap h (P f) = P (\n -> fmap h (f n)) --- | @since 4.6.0.0 instance Applicative ReadPrec where pure x = P (\_ -> pure x) (<*>) = ap liftA2 = liftM2 --- | @since 2.01 instance Monad ReadPrec where- P f >>= k = P (\n -> do {a <- f n; let {P f' = k a}; f' n})+ P f >>= k = P (\n -> do a <- f n; let {P f' = k a}; f' n) --- | @since 4.9.0.0 instance MonadFail ReadPrec where fail s = P (\_ -> fail s) --- | @since 2.01 instance MonadPlus ReadPrec --- | @since 4.6.0.0 instance Alternative ReadPrec where empty = pfail (<|>) = (+++)@@ -109,19 +95,19 @@ -- --------------------------------------------------------------------------- -- Operations over ReadPrec -lift :: forall a . ReadP a -> ReadPrec a+lift :: ReadP a -> ReadPrec a -- ^ Lift a precedence-insensitive 'ReadP' to a 'ReadPrec'. lift m = P (\_ -> m) -step :: forall a . ReadPrec a -> ReadPrec a+step :: ReadPrec a -> ReadPrec a -- ^ Increases the precedence context by one. step (P f) = P (\n -> f (n+1)) -reset :: forall a . ReadPrec a -> ReadPrec a+reset :: ReadPrec a -> ReadPrec a -- ^ Resets the precedence context to zero. reset (P f) = P (\_ -> f minPrec) -prec :: forall a . Prec -> ReadPrec a -> ReadPrec a+prec :: Prec -> ReadPrec a -> ReadPrec a -- ^ @(prec n p)@ checks whether the precedence context is -- less than or equal to @n@, and --@@ -143,35 +129,35 @@ -- consuming it. look = lift ReadP.look -(+++) :: forall a . ReadPrec a -> ReadPrec a -> ReadPrec a+(+++) :: ReadPrec a -> ReadPrec a -> ReadPrec a -- ^ Symmetric choice. P f1 +++ P f2 = P (\n -> f1 n ReadP.+++ f2 n) -(<++) :: forall a . ReadPrec a -> ReadPrec a -> ReadPrec a+(<++) :: ReadPrec a -> ReadPrec a -> ReadPrec a -- ^ Local, exclusive, left-biased choice: If left parser -- locally produces any result at all, then right parser is -- not used. P f1 <++ P f2 = P (\n -> f1 n ReadP.<++ f2 n) -pfail :: forall a . ReadPrec a+pfail :: ReadPrec a -- ^ Always fails. pfail = lift ReadP.pfail -choice :: forall a . [ReadPrec a] -> ReadPrec a+choice :: [ReadPrec a] -> ReadPrec a -- ^ Combines all parsers in the specified list. choice ps = foldr (+++) pfail ps -- --------------------------------------------------------------------------- -- Converting between ReadPrec and Read -readPrec_to_P :: forall a . ReadPrec a -> (Int -> ReadP a)+readPrec_to_P :: ReadPrec a -> (Int -> ReadP a) readPrec_to_P (P f) = f -readP_to_Prec :: forall a . (Int -> ReadP a) -> ReadPrec a+readP_to_Prec :: (Int -> ReadP a) -> ReadPrec a readP_to_Prec f = P f -readPrec_to_S :: forall a . ReadPrec a -> (Int -> ReadS a)+readPrec_to_S :: ReadPrec a -> (Int -> ReadS a) readPrec_to_S (P f) n = readP_to_S (f n) -readS_to_Prec :: forall a . (Int -> ReadS a) -> ReadPrec a+readS_to_Prec :: (Int -> ReadS a) -> ReadPrec a readS_to_Prec f = P (\n -> readS_to_P (f n))
lib/Text/Printf.hs view
@@ -96,7 +96,7 @@ import Data.Int import Data.List (stripPrefix) import Data.Word-import Numeric+import Numeric.Show import Numeric.FormatFloat(showEFloat, showFFloat, showGFloat, showFFloatAlt, showGFloatAlt) import Numeric.Natural import System.IO
lib/Text/Read.hs view
@@ -1,132 +1,113 @@--- Copyright 2023,2024 Lennart Augustsson--- See LICENSE file for full license.--- Temporary Read class-module Text.Read(- ReadS,- Read(..),- read,- reads,- readMaybe,- readParen,- lex,- ) where-import Prelude() -- do not import Prelude-import Primitives+{-# LANGUAGE Safe #-}++-- |+--+-- Module : Text.Read+-- Copyright : (c) The University of Glasgow 2001+-- License : BSD-style (see the file libraries/base/LICENSE)+--+-- Maintainer : libraries@haskell.org+-- Stability : provisional+-- Portability : non-portable (uses Text.ParserCombinators.ReadP)+--+-- Converting strings to values.+--+-- The "Text.Read" module is the canonical place to import for+-- 'Read'-class facilities. For GHC only, it offers an extended and much+-- improved 'Read' class, which constitutes a proposed alternative to the+-- Haskell 2010 'Read'. In particular, writing parsers is easier, and+-- the parsers are much more efficient.+--++module Text.Read+ (-- * The 'Read' class+ Read(..),+ ReadS,+ -- * Haskell 2010 functions+ reads,+ read,+ readParen,+ lex,+ -- * New parsing functions+ module Text.ParserCombinators.ReadPrec,+ Lexeme(..),+ lexP,+ parens,+ readListDefault,+ readListPrecDefault,+ readEither,+ readMaybe+ ) where+import Prelude() import Control.Error-import Data.Char+import Control.Monad import Data.Bool+import Data.Char import Data.Either import Data.Eq import Data.Function-import Data.Int import Data.List-import Data.Maybe_Type-import Data.Num-import Data.Ord+import Data.Maybe import Data.String-import Text.Read.Numeric-import Text.Read.Lex--type ReadS a = String -> [(a, String)]--class Read a where- readsPrec :: Int -> ReadS a- readList :: ReadS [a]-- readList = readParen False (\r -> [ pr- | ("[",s) <- lex r- , pr <- readl s])- where readl s = [([],t) | ("]",t) <- lex s] ++- [(x:xs,u) | (x,t) <- reads s,- (xs,u) <- readl' t]- readl' s = [([],t) | ("]",t) <- lex s] ++- [(x:xs,v) | (",",t) <- lex s,- (x,u) <- reads t,- (xs,v) <- readl' u]--reads :: forall a . Read a => ReadS a-reads = readsPrec 0--read :: forall a . Read a => String -> a-read s =- case readMaybe s of- Just a -> a- Nothing -> error "read: failed"--readMaybe :: forall a . Read a => String -> Maybe a-readMaybe s =- case readsPrec 0 s of- [(a, ss)] | [] <- dropSpace ss -> Just a- _ -> Nothing------------------------------------------------------------ To avoid circular imports, some instances go here.--instance Read Int where- readsPrec = readIntegral--instance forall a . Read a => Read [a] where- readsPrec _ = readList--instance Read Bool where- readsPrec _ = readBoundedEnum--instance Read Ordering where- readsPrec _ = readBoundedEnum--instance forall a . Read a => Read (Maybe a) where- readsPrec p u = [ (Nothing :: Maybe a, t) | ("Nothing", t) <- lex u ] ++- readParen (p > 10) ( \ r ->- [ (Just a, t) | ("Just", s) <- lex r, (a, t) <- readsPrec 11 s ]- ) u--instance forall a b . (Read a, Read b) => Read (Either a b) where- readsPrec p = readParen (p > 10) $ \ r ->- [ (Left a, t) | ("Left", s) <- lex r, (a, t) <- readsPrec 11 s ] ++- [ (Right b, t) | ("Right", s) <- lex r, (b, t) <- readsPrec 11 s ]+import Text.Read.Internal+import Text.Read.Lex(Lexeme(..))+import Text.ParserCombinators.ReadPrec+import qualified Text.ParserCombinators.ReadP as P -instance Read () where- readsPrec p = readParen False $- \ r -> [((),t) | ("(",s) <- lex r,- (")",t) <- lex s ]+------------------------------------------------------------------------+-- utility functions -instance forall a b . (Read a, Read b) => Read (a,b) where- readsPrec p = readParen True $- \ r -> [((a, b), u) | (a, s) <- reads r,- (",", t) <- lex s,- (b, u) <- reads t ]+-- | equivalent to 'readsPrec' with a precedence of 0.+reads :: Read a => ReadS a+reads = readsPrec minPrec -instance Read Char where- readsPrec p = readParen False $- \ r -> [(c,t) | ('\'':s,t)<- lex r,- (c,"\'") <- readLitChar s]- - readList = readParen False $ \ r -> [(l,t) | ('"':s, t) <- lex r,- (l,_) <- readl s ]- where readl ('"':s) = [("",s)]- readl ('\\':'&':s) = readl s- readl s = [(c:cs,u) | (c ,t) <- readLitChar s,- (cs,u) <- readl t ]+-- | Parse a string using the 'Read' instance.+-- Succeeds if there is exactly one valid result.+-- A 'Left' value indicates a parse error.+--+-- >>> readEither "123" :: Either String Int+-- Right 123+--+-- >>> readEither "hello" :: Either String Int+-- Left "Prelude.read: no parse"+--+-- @since base-4.6.0.0+readEither :: Read a => String -> Either String a+readEither s =+ case [ x | (x,"") <- readPrec_to_S read' minPrec s ] of+ [x] -> Right x+ [] -> Left "Prelude.read: no parse"+ _ -> Left "Prelude.read: ambiguous parse"+ where+ read' =+ do x <- readPrec+ lift P.skipSpaces+ return x -readLitChar :: ReadS Char-readLitChar ('\\':s) = readEsc s-readLitChar (c:s) = [(c, s)]+-- | Parse a string using the 'Read' instance.+-- Succeeds if there is exactly one valid result.+--+-- >>> readMaybe "123" :: Maybe Int+-- Just 123+--+-- >>> readMaybe "hello" :: Maybe Int+-- Nothing+--+-- @since base-4.6.0.0+readMaybe :: Read a => String -> Maybe a+readMaybe s = case readEither s of+ Left _ -> Nothing+ Right a -> Just a -readEsc :: ReadS Char-readEsc ('a':s) = [('\a',s)]-readEsc ('b':s) = [('\b',s)]-readEsc ('f':s) = [('\f',s)]-readEsc ('n':s) = [('\n',s)]-readEsc ('r':s) = [('\r',s)]-readEsc ('t':s) = [('\t',s)]-readEsc ('v':s) = [('\v',s)]-readEsc ('\\':s) = [('\\',s)]-readEsc ('"':s) = [('"',s)]-readEsc ('\'':s) = [('\'',s)]-readEsc ('^':c:s) | c >= '@' && c <= '_'- = [(chr (ord c - ord '@'), s)]-readEsc s@(d:_) | isDigit d- = [(chr n, t) | (n,t) <- readDec s]-readEsc ('o':s) = [(chr n, t) | (n,t) <- readOct s]-readEsc ('x':s) = [(chr n, t) | (n,t) <- readHex s]-readEsc _ = []+-- | The 'read' function reads input from a string, which must be+-- completely consumed by the input process. 'read' fails with an 'error' if the+-- parse is unsuccessful, and it is therefore discouraged from being used in+-- real applications. Use 'readMaybe' or 'readEither' for safe alternatives.+--+-- >>> read "123" :: Int+-- 123+--+-- >>> read "hello" :: Int+-- *** Exception: Prelude.read: no parse+read :: Read a => String -> a+read s = either errorWithoutStackTrace id (readEither s)
+ lib/Text/Read/Internal.hs view
@@ -0,0 +1,799 @@+-----------------------------------------------------------------------------+-- |+-- Module : GHC.Internal.Read+-- Copyright : (c) The University of Glasgow, 1994-2002+-- License : see libraries/base/LICENSE+--+-- Maintainer : ghc-devs@haskell.org+-- Stability : internal+-- Portability : non-portable (GHC Extensions)+--+-- The 'Read' class and instances for basic data types.+--+-----------------------------------------------------------------------------++module Text.Read.Internal+ ( Read(..) -- class++ -- ReadS type+ , ReadS+ , ReadPrec++ -- H2010 compatibility+ , lex+ , lexLitChar+ , readLitChar+ , lexDigits++ -- defining readers+ , lexP, expectP+ , paren+ , parens+ , list+ , choose+ , readListDefault, readListPrecDefault+ , readNumber+ , readField+ , readFieldHash+ , readSymField++ -- Temporary+ , readParen+ )+ where+import Prelude()++import Control.Applicative+import Control.Error+import Control.Monad+import Control.Monad.Fail+import Data.Array+import Data.Bool+import Data.Char+import Data.Double+import Data.Either+import Data.Eq+import Data.Float+import Data.Fractional+import Data.Function+import Data.Maybe+import Data.Int+import Data.Integer+import Data.Integral+import Data.Ix+import Data.List+import Data.Num+import Data.Ord+import Data.Ratio+import Data.Real+import Data.RealFloat+import Data.String+import Data.Tuple+import Data.Word+import Numeric.Natural+import qualified Text.ParserCombinators.ReadP as P+import Text.ParserCombinators.ReadP(ReadS, readP_to_S)+import Text.ParserCombinators.ReadPrec+import qualified Text.Read.Lex as L+import Text.Show(appPrec)++ratioPrec :: Int+ratioPrec = 7++-- | @'readParen' 'True' p@ parses what @p@ parses, but surrounded with+-- parentheses.+--+-- @'readParen' 'False' p@ parses what @p@ parses, but optionally+-- surrounded with parentheses.+readParen :: Bool -> ReadS a -> ReadS a+-- A Haskell 2010 function+readParen b g = if b then mandatory else optional+ where optional r = g r ++ mandatory r+ mandatory r = do+ ("(",s) <- lex r+ (x,t) <- optional s+ (")",u) <- lex t+ return (x,u)++-- | Parsing of 'String's, producing values.+--+-- Derived instances of 'Read' make the following assumptions, which+-- derived instances of 'Text.Show.Show' obey:+--+-- * If the constructor is defined to be an infix operator, then the+-- derived 'Read' instance will parse only infix applications of+-- the constructor (not the prefix form).+--+-- * Associativity is not used to reduce the occurrence of parentheses,+-- although precedence may be.+--+-- * If the constructor is defined using record syntax, the derived 'Read'+-- will parse only the record-syntax form, and furthermore, the fields+-- must be given in the same order as the original declaration.+--+-- * The derived 'Read' instance allows arbitrary Haskell whitespace+-- between tokens of the input string. Extra parentheses are also+-- allowed.+--+-- For example, given the declarations+--+-- > infixr 5 :^:+-- > data Tree a = Leaf a | Tree a :^: Tree a+--+-- the derived instance of 'Read' in Haskell 2010 is equivalent to+--+-- > instance (Read a) => Read (Tree a) where+-- >+-- > readsPrec d r = readParen (d > app_prec)+-- > (\r -> [(Leaf m,t) |+-- > ("Leaf",s) <- lex r,+-- > (m,t) <- readsPrec (app_prec+1) s]) r+-- >+-- > ++ readParen (d > up_prec)+-- > (\r -> [(u:^:v,w) |+-- > (u,s) <- readsPrec (up_prec+1) r,+-- > (":^:",t) <- lex s,+-- > (v,w) <- readsPrec (up_prec+1) t]) r+-- >+-- > where app_prec = 10+-- > up_prec = 5+--+-- Note that right-associativity of @:^:@ is unused.+--+-- The derived instance in GHC is equivalent to+--+-- > instance (Read a) => Read (Tree a) where+-- >+-- > readPrec = parens $ (prec app_prec $ do+-- > Ident "Leaf" <- lexP+-- > m <- step readPrec+-- > return (Leaf m))+-- >+-- > +++ (prec up_prec $ do+-- > u <- step readPrec+-- > Symbol ":^:" <- lexP+-- > v <- step readPrec+-- > return (u :^: v))+-- >+-- > where app_prec = 10+-- > up_prec = 5+-- >+-- > readListPrec = readListPrecDefault+--+-- Why do both 'readsPrec' and 'readPrec' exist, and why does GHC opt to+-- implement 'readPrec' in derived 'Read' instances instead of 'readsPrec'?+-- The reason is that 'readsPrec' is based on the 'ReadS' type, and although+-- 'ReadS' is mentioned in the Haskell 2010 Report, it is not a very efficient+-- parser data structure.+--+-- 'readPrec', on the other hand, is based on a much more efficient 'ReadPrec'+-- datatype (a.k.a \"new-style parsers\"), but its definition relies on the use+-- of the @RankNTypes@ language extension. Therefore, 'readPrec' (and its+-- cousin, 'readListPrec') are marked as GHC-only. Nevertheless, it is+-- recommended to use 'readPrec' instead of 'readsPrec' whenever possible+-- for the efficiency improvements it brings.+--+-- As mentioned above, derived 'Read' instances in GHC will implement+-- 'readPrec' instead of 'readsPrec'. The default implementations of+-- 'readsPrec' (and its cousin, 'readList') will simply use 'readPrec' under+-- the hood. If you are writing a 'Read' instance by hand, it is recommended+-- to write it like so:+--+-- @+-- instance 'Read' T where+-- 'readPrec' = ...+-- 'readListPrec' = 'readListPrecDefault'+-- @++class Read a where+ {-# MINIMAL readsPrec | readPrec #-}++ -- | attempts to parse a value from the front of the string, returning+ -- a list of (parsed value, remaining string) pairs. If there is no+ -- successful parse, the returned list is empty.+ --+ -- Derived instances of 'Read' and 'Text.Show.Show' satisfy the following:+ --+ -- * @(x,\"\")@ is an element of+ -- @('readsPrec' d ('GHC.Internal.Text.Show.showsPrec' d x \"\"))@.+ --+ -- That is, 'readsPrec' parses the string produced by+ -- 'GHC.Internal.Text.Show.showsPrec', and delivers the value that+ -- 'GHC.Internal.Text.Show.showsPrec' started with.++ readsPrec :: Int -- ^ the operator precedence of the enclosing+ -- context (a number from @0@ to @11@).+ -- Function application has precedence @10@.+ -> ReadS a++ -- | The method 'readList' is provided to allow the programmer to+ -- give a specialised way of parsing lists of values.+ -- For example, this is used by the predefined 'Read' instance of+ -- the 'Char' type, where values of type 'String' are expected to+ -- use double quotes, rather than square brackets.+ readList :: ReadS [a]++ -- | Proposed replacement for 'readsPrec' using new-style parsers (GHC only).+ readPrec :: ReadPrec a++ -- | Proposed replacement for 'readList' using new-style parsers (GHC only).+ -- The default definition uses 'readList'. Instances that define 'readPrec'+ -- should also define 'readListPrec' as 'readListPrecDefault'.+ readListPrec :: ReadPrec [a]++ -- default definitions+ readsPrec = readPrec_to_S readPrec+ readList = readPrec_to_S (list readPrec) 0+ readPrec = readS_to_Prec readsPrec+ readListPrec = readS_to_Prec (\_ -> readList)++readListDefault :: Read a => ReadS [a]+-- ^ A possible replacement definition for the 'readList' method (GHC only).+-- This is only needed for GHC, and even then only for 'Read' instances+-- where 'readListPrec' isn't defined as 'readListPrecDefault'.+readListDefault = readPrec_to_S readListPrec 0++readListPrecDefault :: Read a => ReadPrec [a]+-- ^ A possible replacement definition for the 'readListPrec' method,+-- defined using 'readPrec' (GHC only).+readListPrecDefault = list readPrec++------------------------------------------------------------------------+-- H2010 compatibility++-- | The 'lex' function reads a single lexeme from the input, discarding+-- initial white space, and returning the characters that constitute the+-- lexeme. If the input string contains only white space, 'lex' returns a+-- single successful \`lexeme\' consisting of the empty string. (Thus+-- @'lex' \"\" = [(\"\",\"\")]@.) If there is no legal lexeme at the+-- beginning of the input string, 'lex' fails (i.e. returns @[]@).+--+-- This lexer is not completely faithful to the Haskell lexical syntax+-- in the following respects:+--+-- * Qualified names are not handled properly+--+-- * Octal and hexadecimal numerics are not recognized as a single token+--+-- * Comments are not treated properly+lex :: ReadS String -- As defined by H2010+lex s = readP_to_S L.hsLex s++-- | Read a string representation of a character, using Haskell+-- source-language escape conventions. For example:+--+-- > lexLitChar "\\nHello" = [("\\n", "Hello")]+--+lexLitChar :: ReadS String -- As defined by H2010+lexLitChar = readP_to_S (do { (s, _) <- P.gather L.lexChar ;+ let { s' = removeNulls s } ;+ return s' })+ where+ -- remove nulls from end of the character if they exist+ removeNulls [] = []+ removeNulls ('\\':'&':xs) = removeNulls xs+ removeNulls (first:rest) = first : removeNulls rest+ -- There was a skipSpaces before the P.gather L.lexChar,+ -- but that seems inconsistent with readLitChar++-- | Read a string representation of a character, using Haskell+-- source-language escape conventions, and convert it to the character+-- that it encodes. For example:+--+-- > readLitChar "\\nHello" = [('\n', "Hello")]+--+readLitChar :: ReadS Char -- As defined by H2010+readLitChar = readP_to_S L.lexChar++-- | Reads a non-empty string of decimal digits.+lexDigits :: ReadS String+lexDigits = readP_to_S (P.munch1 isDigit)++------------------------------------------------------------------------+-- utility parsers++lexP :: ReadPrec L.Lexeme+-- ^ Parse a single lexeme+lexP = lift L.lex++expectP :: L.Lexeme -> ReadPrec ()+expectP lexeme = lift (L.expect lexeme)++expectCharP :: Char -> ReadPrec a -> ReadPrec a+expectCharP c a = do+ q <- get+ if q == c+ then a+ else pfail+{-# INLINE expectCharP #-}++skipSpacesThenP :: ReadPrec a -> ReadPrec a+skipSpacesThenP m =+ do s <- look+ skip s+ where+ skip (c:s) | isSpace c = get *> skip s+ skip _ = m++paren :: ReadPrec a -> ReadPrec a+-- ^ @(paren p)@ parses \"(P0)\"+-- where @p@ parses \"P0\" in precedence context zero+paren p = skipSpacesThenP (paren' p)++paren' :: ReadPrec a -> ReadPrec a+paren' p = expectCharP '(' $ reset p >>= \x ->+ skipSpacesThenP (expectCharP ')' (pure x))++parens :: ReadPrec a -> ReadPrec a+-- ^ @(parens p)@ parses \"P\", \"(P0)\", \"((P0))\", etc,+-- where @p@ parses \"P\" in the current precedence context+-- and parses \"P0\" in precedence context zero+parens p = optional+ where+ optional = skipSpacesThenP (p +++ mandatory)+ mandatory = paren' optional++list :: ReadPrec a -> ReadPrec [a]+-- ^ @(list p)@ parses a list of things parsed by @p@,+-- using the usual square-bracket syntax.+list readx =+ parens+ ( do expectP (L.Punc "[")+ (listRest False +++ listNext)+ )+ where+ listRest started =+ do L.Punc c <- lexP+ case c of+ "]" -> return []+ "," | started -> listNext+ _ -> pfail++ listNext =+ do x <- reset readx+ xs <- listRest True+ return (x:xs)++choose :: [(String, ReadPrec a)] -> ReadPrec a+-- ^ Parse the specified lexeme and continue as specified.+-- Esp useful for nullary constructors; e.g.+-- @choose [(\"A\", return A), (\"B\", return B)]@+-- We match both Ident and Symbol because the constructor+-- might be an operator eg @(:~:)@+choose sps = foldr ((+++) . try_one) pfail sps+ where+ try_one (s,p) = do { token <- lexP ;+ case token of+ L.Ident s' | s==s' -> p+ L.Symbol s' | s==s' -> p+ _other -> pfail }++-- See Note [Why readField]++-- | 'Read' parser for a record field, of the form @fieldName=value@. The+-- @fieldName@ must be an alphanumeric identifier; for symbols (operator-style)+-- field names, e.g. @(#)@, use 'readSymField'). The second argument is a+-- parser for the field value.+readField :: String -> ReadPrec a -> ReadPrec a+readField fieldName readVal = do+ expectP (L.Ident fieldName)+ expectP (L.Punc "=")+ readVal+{-# NOINLINE readField #-}++-- See Note [Why readField]++-- | 'Read' parser for a record field, of the form @fieldName#=value@. That is,+-- an alphanumeric identifier @fieldName@ followed by the symbol @#@. The+-- second argument is a parser for the field value.+--+-- Note that 'readField' does not suffice for this purpose due to+-- <https://gitlab.haskell.org/ghc/ghc/issues/5041 #5041>.+readFieldHash :: String -> ReadPrec a -> ReadPrec a+readFieldHash fieldName readVal = do+ expectP (L.Ident fieldName)+ expectP (L.Symbol "#")+ expectP (L.Punc "=")+ readVal+{-# NOINLINE readFieldHash #-}++-- See Note [Why readField]++-- | 'Read' parser for a symbol record field, of the form @(###)=value@ (where+-- @###@ is the field name). The field name must be a symbol (operator-style),+-- e.g. @(#)@. For regular (alphanumeric) field names, use 'readField'. The+-- second argument is a parser for the field value.+readSymField :: String -> ReadPrec a -> ReadPrec a+readSymField fieldName readVal = do+ expectP (L.Punc "(")+ expectP (L.Symbol fieldName)+ expectP (L.Punc ")")+ expectP (L.Punc "=")+ readVal+{-# NOINLINE readSymField #-}+++-- Note [Why readField]+-- ~~~~~~~~~~~~~~~~~~~~+-- Previously, the code for automatically deriving Read instance (in+-- typecheck/GHC.Tc.Deriv.Generate.hs) would generate inline code for parsing fields;+-- this, however, turned out to produce massive amounts of intermediate code,+-- and produced a considerable performance hit in the code generator.+-- Since Read instances are not generally supposed to be performance critical,+-- the readField and readSymField functions have been factored out, and the+-- code generator now just generates calls rather than manually inlining the+-- parsers. For large record types (e.g. 500 fields), this produces a+-- significant performance boost.+--+-- See also #14364.+++--------------------------------------------------------------+-- Simple instances of Read+--------------------------------------------------------------++-- | @since base-2.01+instance Read Char where+ readPrec =+ parens+ ( do L.Char c <- lexP+ return c+ )++ readListPrec =+ parens+ ( do L.String s <- lexP -- Looks for "foo"+ return s+ ++++ readListPrecDefault -- Looks for ['f','o','o']+ ) -- (more generous than H2010 spec)++ readList = readListDefault++-- | @since base-2.01+instance Read Bool where+ readPrec =+ parens+ ( do L.Ident s <- lexP+ case s of+ "True" -> return True+ "False" -> return False+ _ -> pfail+ )++ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-2.01+instance Read Ordering where+ readPrec =+ parens+ ( do L.Ident s <- lexP+ case s of+ "LT" -> return LT+ "EQ" -> return EQ+ "GT" -> return GT+ _ -> pfail+ )++ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-4.11.0.0+-- deriving instance Read a => Read (NonEmpty a)+-- XXX++--------------------------------------------------------------+-- Structure instances of Read: Maybe, List etc+--------------------------------------------------------------++{-+For structured instances of Read we start using the precedences. The+idea is then that 'parens (prec k p)' will fail immediately when trying+to parse it in a context with a higher precedence level than k. But if+there is one parenthesis parsed, then the required precedence level+drops to 0 again, and parsing inside p may succeed.++'appPrec' is just the precedence level of function application. So,+if we are parsing function application, we'd better require the+precedence level to be at least 'appPrec'. Otherwise, we have to put+parentheses around it.++'step' is used to increase the precedence levels inside a+parser, and can be used to express left- or right- associativity. For+example, % is defined to be left associative, so we only increase+precedence on the right hand side.++Note how step is used in for example the Maybe parser to increase the+precedence beyond appPrec, so that basically only literals and+parenthesis-like objects such as (...) and [...] can be an argument to+'Just'.+-}++-- | @since base-2.01+instance Read a => Read (Maybe a) where+ readPrec =+ parens+ (do expectP (L.Ident "Nothing")+ return Nothing+ ++++ prec appPrec (+ do expectP (L.Ident "Just")+ x <- step readPrec+ return (Just x))+ )++ readListPrec = readListPrecDefault+ readList = readListDefault++instance (Read a, Read b) => Read (Either a b) where+ readPrec =+ parens+ (prec appPrec (+ do expectP (L.Ident "Left")+ x <- step readPrec+ return (Left x))+ ++++ prec appPrec (+ do expectP (L.Ident "Right")+ x <- step readPrec+ return (Right x))+ )+ + readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-2.01+instance Read a => Read [a] where+ {-# SPECIALISE instance Read [String] #-}+ {-# SPECIALISE instance Read [Char] #-}+ {-# SPECIALISE instance Read [Int] #-}+ readPrec = readListPrec+ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-2.01+instance (Ix a, Read a, Read b) => Read (Array a b) where+ readPrec = parens $ prec appPrec $+ do expectP (L.Ident "array")+ theBounds <- step readPrec+ vals <- step readPrec+ return (array theBounds vals)++ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-2.01+instance Read L.Lexeme where+ readPrec = lexP+ readListPrec = readListPrecDefault+ readList = readListDefault++--------------------------------------------------------------+-- GHC.Internal.Numeric instances of Read+--------------------------------------------------------------++readNumber :: Num a => (L.Lexeme -> ReadPrec a) -> ReadPrec a+-- Read a signed number+readNumber convert =+ parens+ ( do x <- lexP+ case x of+ L.Symbol "-" -> do y <- lexP+ n <- convert y+ return (negate n)++ _ -> convert x+ )+++convertInt :: Num a => L.Lexeme -> ReadPrec a+convertInt (L.Number n)+ | Just i <- L.numberToInteger n = return (fromInteger i)+convertInt _ = pfail++convertFrac :: forall a . RealFloat a => L.Lexeme -> ReadPrec a+convertFrac (L.Ident "NaN") = return (0 / 0)+convertFrac (L.Ident "Infinity") = return (1 / 0)+convertFrac (L.Number n) = let resRange = floatRange (undefined :: a)+ in case L.numberToRangedRational resRange n of+ Nothing -> return (1 / 0)+ Just rat -> return $ fromRational rat+convertFrac _ = pfail++-- | @since base-2.01+instance Read Int where+ readPrec = readNumber convertInt+ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-4.5.0.0+instance Read Word where+ readsPrec p s = [(fromInteger x, r) | (x, r) <- readsPrec p s]++-- | @since base-2.01+instance Read Word8 where+ readsPrec p s = [(fromIntegral (x::Int), r) | (x, r) <- readsPrec p s]++-- | @since base-2.01+instance Read Word16 where+ readsPrec p s = [(fromIntegral (x::Int), r) | (x, r) <- readsPrec p s]++-- | @since base-2.01+instance Read Word32 where+ readsPrec p s = [(fromInteger x, r) | (x, r) <- readsPrec p s]++-- | @since base-2.01+instance Read Word64 where+ readsPrec p s = [(fromInteger x, r) | (x, r) <- readsPrec p s]++-- | @since base-2.01+instance Read Integer where+ readPrec = readNumber convertInt+ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-4.8.0.0+instance Read Natural where+ readsPrec d = map (\(n, s) -> (fromInteger n, s))+ . filter ((>= 0) . (\(x,_)->x)) . readsPrec d+ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-2.01+instance Read Float where+ readPrec = readNumber convertFrac+ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-2.01+instance Read Double where+ readPrec = readNumber convertFrac+ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-2.01+instance (Integral a, Ord a, Read a) => Read (Ratio a) where+ readPrec =+ parens+ ( prec ratioPrec+ ( do x <- step readPrec+ expectP (L.Symbol "%")+ y <- step readPrec+ return (x % y)+ )+ )++ readListPrec = readListPrecDefault+ readList = readListDefault+++------------------------------------------------------------------------+-- Tuple instances of Read, up to size 15+------------------------------------------------------------------------++-- | Reading a 'Void' value is always a parse error, considering+-- 'Void' as a data type with no constructors.+--+-- @since base-4.8.0.0+-- deriving instance Read Void+-- XXX++-- | @since base-2.01+instance Read () where+ readPrec =+ parens+ ( paren+ ( return ()+ )+ )++ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-4.15+-- deriving instance Read a => Read (Solo a)+-- XXX++-- | @since base-2.01+instance (Read a, Read b) => Read (a,b) where+ readPrec = wrap_tup read_tup2+ readListPrec = readListPrecDefault+ readList = readListDefault++wrap_tup :: ReadPrec a -> ReadPrec a+wrap_tup p = parens (paren p)++read_comma :: ReadPrec ()+read_comma = expectP (L.Punc ",")++read_tup2 :: (Read a, Read b) => ReadPrec (a,b)+-- Reads "a , b" no parens!+read_tup2 = do x <- readPrec+ read_comma+ y <- readPrec+ return (x,y)++read_tup4 :: (Read a, Read b, Read c, Read d) => ReadPrec (a,b,c,d)+read_tup4 = do (a,b) <- read_tup2+ read_comma+ (c,d) <- read_tup2+ return (a,b,c,d)+++read_tup8 :: (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h)+ => ReadPrec (a,b,c,d,e,f,g,h)+read_tup8 = do (a,b,c,d) <- read_tup4+ read_comma+ (e,f,g,h) <- read_tup4+ return (a,b,c,d,e,f,g,h)+++-- | @since base-2.01+instance (Read a, Read b, Read c) => Read (a, b, c) where+ readPrec = wrap_tup (do { (a,b) <- read_tup2; read_comma+ ; c <- readPrec+ ; return (a,b,c) })+ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-2.01+instance (Read a, Read b, Read c, Read d) => Read (a, b, c, d) where+ readPrec = wrap_tup read_tup4+ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-2.01+instance (Read a, Read b, Read c, Read d, Read e) => Read (a, b, c, d, e) where+ readPrec = wrap_tup (do { (a,b,c,d) <- read_tup4; read_comma+ ; e <- readPrec+ ; return (a,b,c,d,e) })+ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-2.01+instance (Read a, Read b, Read c, Read d, Read e, Read f)+ => Read (a, b, c, d, e, f) where+ readPrec = wrap_tup (do { (a,b,c,d) <- read_tup4; read_comma+ ; (e,f) <- read_tup2+ ; return (a,b,c,d,e,f) })+ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-2.01+instance (Read a, Read b, Read c, Read d, Read e, Read f, Read g)+ => Read (a, b, c, d, e, f, g) where+ readPrec = wrap_tup (do { (a,b,c,d) <- read_tup4; read_comma+ ; (e,f) <- read_tup2; read_comma+ ; g <- readPrec+ ; return (a,b,c,d,e,f,g) })+ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-2.01+instance (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h)+ => Read (a, b, c, d, e, f, g, h) where+ readPrec = wrap_tup read_tup8+ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-2.01+instance (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h,+ Read i)+ => Read (a, b, c, d, e, f, g, h, i) where+ readPrec = wrap_tup (do { (a,b,c,d,e,f,g,h) <- read_tup8; read_comma+ ; i <- readPrec+ ; return (a,b,c,d,e,f,g,h,i) })+ readListPrec = readListPrecDefault+ readList = readListDefault++-- | @since base-2.01+instance (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h,+ Read i, Read j)+ => Read (a, b, c, d, e, f, g, h, i, j) where+ readPrec = wrap_tup (do { (a,b,c,d,e,f,g,h) <- read_tup8; read_comma+ ; (i,j) <- read_tup2+ ; return (a,b,c,d,e,f,g,h,i,j) })+ readListPrec = readListPrecDefault+ readList = readListDefault+
+ lib/Text/Read/Internal.hs-boot view
@@ -0,0 +1,5 @@+module Text.Read.Internal where+import Prelude()+import Data.Char_Type++lex :: String -> [(String, String)]
lib/Text/Read/Lex.hs view
@@ -1,71 +1,602 @@-module Text.Read.Lex(lex, dropSpace) where-import Prelude() -- do not import Prelude-import Primitives-import Data.Bool+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE NoImplicitPrelude #-}++-----------------------------------------------------------------------------+-- |+-- Module : GHC.Internal.Text.Read.Lex+-- Copyright : (c) The University of Glasgow 2002+-- License : BSD-style (see the file libraries/base/LICENSE)+--+-- Maintainer : libraries@haskell.org+-- Stability : provisional+-- Portability : non-portable (uses Text.ParserCombinators.ReadP)+--+-- The cut-down Haskell lexer, used by GHC.Internal.Text.Read+--+-----------------------------------------------------------------------------++module Text.Read.Lex+ -- lexing types+ ( Lexeme(..), Number++ , numberToInteger, numberToFixed, numberToRational, numberToRangedRational++ -- lexer+ , lex, expect+ , hsLex+ , lexChar++ , readBinP+ , readIntP+ , readOctP+ , readDecP+ , readHexP++ , isSymbolChar+ )+ where+import Prelude()+import Control.Error+import Control.Monad import Data.Char+import Data.Bool+import Data.Bounded import Data.Eq+import Data.Function+import Data.Int+import Data.Integer+import Data.Integral import Data.List+import Data.Maybe+import Data.Num import Data.Ord+import Data.Ratio+import Data.Tuple+import Text.Show+import Text.ParserCombinators.ReadP+{-+import Control.Monad+import Data.Enum+import Data.List+import Data.Maybe+import Data.Real+-}+-- -----------------------------------------------------------------------------+-- Lexing types -type ReadS a = String -> [(a, String)]+-- ^ Haskell lexemes.+data Lexeme+ = Char Char -- ^ Character literal+ | String String -- ^ String literal, with escapes interpreted+ | Punc String -- ^ Punctuation or reserved symbol, e.g. @(@, @::@+ | Ident String -- ^ Haskell identifier, e.g. @foo@, @Baz@+ | Symbol String -- ^ Haskell symbol, e.g. @>>@, @:%@+ | Number Number -- ^ @since base-4.6.0.0+ | EOF+ deriving ( Eq -- ^ @since base-2.01+ , Show -- ^ @since base-2.01+ ) -lex :: ReadS String-lex [] = [([],[])]-lex ('\'':s) = [('\'':ch++"'", t) | (ch,'\'':t) <- lexLitChar s,- ch /= "'" ]-lex ('"':s) = [('"':str, t) | (str,t) <- lexString s]+-- | @since base-4.6.0.0+data Number = MkNumber Int -- Base+ Digits -- Integral part+ | MkDecimal Digits -- Integral part+ (Maybe Digits) -- Fractional part+ (Maybe Integer) -- Exponent+ deriving ( Eq -- ^ @since base-4.6.0.0+ , Show -- ^ @since base-4.6.0.0+ )++-- | @since base-4.5.1.0+numberToInteger :: Number -> Maybe Integer+numberToInteger (MkNumber base iPart) = Just (val (fromIntegral base) iPart)+numberToInteger (MkDecimal iPart Nothing Nothing) = Just (val 10 iPart)+numberToInteger _ = Nothing++-- | @since base-4.7.0.0+numberToFixed :: Integer -> Number -> Maybe (Integer, Integer)+numberToFixed _ (MkNumber base iPart) = Just (val (fromIntegral base) iPart, 0)+numberToFixed _ (MkDecimal iPart Nothing Nothing) = Just (val 10 iPart, 0)+numberToFixed p (MkDecimal iPart (Just fPart) Nothing)+ = let i = val 10 iPart+ f = val 10 (integerTake p (fPart ++ repeat 0))+ -- Sigh, we really want genericTake, but that's above us in+ -- the hierarchy, so we define our own version here (actually+ -- specialised to Integer)+ integerTake :: Integer -> [a] -> [a]+ integerTake n _ | n <= 0 = []+ integerTake _ [] = []+ integerTake n (x:xs) = x : integerTake (n-1) xs+ in Just (i, f)+numberToFixed _ _ = Nothing++-- This takes a floatRange, and if the Rational would be outside of+-- the floatRange then it may return Nothing. Not that it will not+-- /necessarily/ return Nothing, but it is good enough to fix the+-- space problems in #5688+-- Ways this is conservative:+-- * the floatRange is in base 2, but we pretend it is in base 10+-- * we pad the floatRange a bit, just in case it is very small+-- and we would otherwise hit an edge case+-- * We only worry about numbers that have an exponent. If they don't+-- have an exponent then the Rational won't be much larger than the+-- Number, so there is no problem+-- | @since base-4.5.1.0+numberToRangedRational :: (Int, Int) -> Number+ -> Maybe Rational -- Nothing = Inf+numberToRangedRational (neg, pos) n@(MkDecimal iPart mFPart (Just exp))+ -- Calculate amount to increase/decrease the exponent, based on (non+ -- leading zero) places in the iPart, or leading zeros in the fPart.+ -- If iPart and fPart are all zeros, return Nothing.+ = let mFirstDigit = case dropWhile (0 ==) iPart of+ iPart'@(_ : _) -> Just (length iPart')+ [] -> case mFPart of+ Nothing -> Nothing+ Just fPart ->+ case span (0 ==) fPart of+ (_, []) -> Nothing+ (zeroes, _) ->+ Just (negate (length zeroes))+ in case mFirstDigit of+ Nothing -> Just 0+ Just firstDigit ->+ -- compare exp to bounds as Integer to avoid over/underflow+ let firstDigit' = toInteger firstDigit + exp+ in if firstDigit' > toInteger (pos + 3)+ then Nothing+ else if firstDigit' < toInteger (neg - 3)+ then Just 0+ else Just (numberToRational n)+numberToRangedRational _ n = Just (numberToRational n)++-- | @since base-4.6.0.0+numberToRational :: Number -> Rational+numberToRational (MkNumber base iPart) = val (fromIntegral base) iPart % 1+numberToRational (MkDecimal iPart mFPart mExp)+ = let i = val 10 iPart+ in case (mFPart, mExp) of+ (Nothing, Nothing) -> i % 1+ (Nothing, Just exp)+ | exp >= 0 -> (i * (10 ^ exp)) % 1+ | otherwise -> i % (10 ^ (- exp))+ (Just fPart, Nothing) -> fracExp 0 i fPart+ (Just fPart, Just exp) -> fracExp exp i fPart+ -- fracExp is a bit more efficient in calculating the Rational.+ -- Instead of calculating the fractional part alone, then+ -- adding the integral part and finally multiplying with+ -- 10 ^ exp if an exponent was given, do it all at once.++-- -----------------------------------------------------------------------------+-- Lexing++lex :: ReadP Lexeme+lex = skipSpaces >> lexToken++-- | @since base-4.7.0.0+expect :: Lexeme -> ReadP ()+expect lexeme = do { skipSpaces+ ; thing <- lexToken+ ; if thing == lexeme then return () else pfail }++hsLex :: ReadP String+-- ^ Haskell lexer: returns the lexed string, rather than the lexeme+hsLex = do skipSpaces+ (s,_) <- gather lexToken+ return s++lexToken :: ReadP Lexeme+lexToken = lexEOF ++++ lexLitChar ++++ lexString ++++ lexPunc ++++ lexSymbol ++++ lexId ++++ lexNumber+++-- ----------------------------------------------------------------------+-- End of file+lexEOF :: ReadP Lexeme+lexEOF = do s <- look+ guard (null s)+ return EOF++-- ---------------------------------------------------------------------------+-- Single character lexemes++lexPunc :: ReadP Lexeme+lexPunc =+ do c <- satisfy isPuncChar+ return (Punc [c])++-- | The @special@ character class as defined in the Haskell Report.+isPuncChar :: Char -> Bool+isPuncChar c = c `elem` ",;()[]{}`"++-- ----------------------------------------------------------------------+-- Symbols++lexSymbol :: ReadP Lexeme+lexSymbol =+ do s <- munch1 isSymbolChar+ if s `elem` reserved_ops then+ return (Punc s) -- Reserved-ops count as punctuation+ else+ return (Symbol s) where- lexString ('"':s) = [("\""::String, s)]- lexString s = [(ch++str, u)- | (ch,t) <- lexStrItem s,- (str,u) <- lexString t ]+ reserved_ops = ["..", "::", "=", "\\", "|", "<-", "->", "@", "~", "=>"] :: [String] - lexStrItem ('\\':'&':s) = [("\\&"::String,s)]- lexStrItem ('\\':c:s) | isSpace c = [("\\&"::String,t) |- '\\':t <- [dropSpace s]]- lexStrItem s = lexLitChar s+{-+isSymbolChar :: Char -> Bool+isSymbolChar c = not (isPuncChar c) && case generalCategory c of+ MathSymbol -> True+ CurrencySymbol -> True+ ModifierSymbol -> True+ OtherSymbol -> True+ DashPunctuation -> True+ OtherPunctuation -> not (c `elem` "'\"")+ ConnectorPunctuation -> c /= '_'+ _ -> False+-}+isSymbolChar :: Char -> Bool+isSymbolChar c = c `elem` ("!@#$%&?+./<=>?\\^|:-~"::String) -lex (c:s) | isSpace c = lex s- | isSingle c = [([c],s)]- | isSym c = [(c:sym,t) | (sym,t) <- [span isSym s]]- | isAlpha c = [(c:nam,t) | (nam,t) <- [span isIdChar s]]- | isDigit c = [(c:ds++fe,t) | (ds,s) <- [span isDigit s],- (fe,t) <- lexFracExp s ]- | otherwise = [] -- bad character - where - isSingle c = c `elem` (",;()[]{}_`"::String)- isSym c = c `elem` ("!@#$%&?+./<=>?\\^|:-~"::String)- isIdChar c = isAlphaNum c || c == '_' || c == '\''+-- ----------------------------------------------------------------------+-- identifiers - lexFracExp ('.':c:cs) | isDigit c- = [('.':ds++e,u) | (ds,t) <- lexDigits (c:cs),- (e,u) <- lexExp t]- lexFracExp s = lexExp s- - lexExp (e:s) | e == 'e' || e == 'E'- = [(e:c:ds,u) | (c:t) <- [s], c == '-' || c == '+',- (ds,u) <- lexDigits t] ++- [(e:ds,t) | (ds,t) <- lexDigits s]- lexExp s = [([],s)]+lexId :: ReadP Lexeme+lexId = do c <- satisfy isIdsChar+ s <- munch isIdfChar+ return (Ident (c:s))+ where+ -- Identifiers can start with a '_'+ isIdsChar c = isAlpha c || c == '_'+ isIdfChar c = isAlphaNum c || c `elem` "_'" -lexDigits :: ReadS String-lexDigits s = [(cs, t) | (cs@(_:_), t) <- [span isDigit s]]+-- ---------------------------------------------------------------------------+-- Lexing character literals -lexLitChar :: ReadS String-lexLitChar ('\\':s) = [ prefix '\\' c | c <- lexEsc s ]+lexLitChar :: ReadP Lexeme+lexLitChar =+ do _ <- char '\''+ (c,esc) <- lexCharE+ guard (esc || c /= '\'') -- Eliminate '' possibility+ _ <- char '\''+ return (Char c)++lexChar :: ReadP Char+lexChar = do { (c,_) <- lexCharE; consumeEmpties; return c }+ where+ -- Consumes the string "\&" repeatedly and greedily (will only produce one match)+ consumeEmpties :: ReadP ()+ consumeEmpties = do+ rest <- look+ case rest of+ ('\\':'&':_) -> string "\\&" >> consumeEmpties+ _ -> return ()+++lexCharE :: ReadP (Char, Bool) -- "escaped or not"?+lexCharE =+ do c1 <- get+ if c1 == '\\'+ then do c2 <- lexEsc; return (c2, True)+ else return (c1, False)+ where+ lexEsc =+ lexEscChar+ +++ lexNumeric+ +++ lexCntrlChar+ +++ lexAscii++ lexEscChar =+ do c <- get+ case c of+ 'a' -> return '\a'+ 'b' -> return '\b'+ 'f' -> return '\f'+ 'n' -> return '\n'+ 'r' -> return '\r'+ 't' -> return '\t'+ 'v' -> return '\v'+ '\\' -> return '\\'+ '\"' -> return '\"'+ '\'' -> return '\''+ _ -> pfail++ lexNumeric =+ do base <- lexBaseChar <++ return 10+ n <- lexInteger base+ guard (n <= toInteger (ord maxBound))+ return (chr (fromInteger n))++ lexCntrlChar =+ do _ <- char '^'+ c <- get+ case c of+ '@' -> return '\^@'+ 'A' -> return '\^A'+ 'B' -> return '\^B'+ 'C' -> return '\^C'+ 'D' -> return '\^D'+ 'E' -> return '\^E'+ 'F' -> return '\^F'+ 'G' -> return '\^G'+ 'H' -> return '\^H'+ 'I' -> return '\^I'+ 'J' -> return '\^J'+ 'K' -> return '\^K'+ 'L' -> return '\^L'+ 'M' -> return '\^M'+ 'N' -> return '\^N'+ 'O' -> return '\^O'+ 'P' -> return '\^P'+ 'Q' -> return '\^Q'+ 'R' -> return '\^R'+ 'S' -> return '\^S'+ 'T' -> return '\^T'+ 'U' -> return '\^U'+ 'V' -> return '\^V'+ 'W' -> return '\^W'+ 'X' -> return '\^X'+ 'Y' -> return '\^Y'+ 'Z' -> return '\^Z'+ '[' -> return '\^['+ '\\' -> return '\^\'+ ']' -> return '\^]'+ '^' -> return '\^^'+ '_' -> return '\^_'+ _ -> pfail++ lexAscii =+ choice+ [ (string "SOH" >> return '\SOH') <+++ (string "SO" >> return '\SO')+ -- \SO and \SOH need maximal-munch treatment+ -- See the Haskell report Sect 2.6++ , string "NUL" >> return '\NUL'+ , string "STX" >> return '\STX'+ , string "ETX" >> return '\ETX'+ , string "EOT" >> return '\EOT'+ , string "ENQ" >> return '\ENQ'+ , string "ACK" >> return '\ACK'+ , string "BEL" >> return '\BEL'+ , string "BS" >> return '\BS'+ , string "HT" >> return '\HT'+ , string "LF" >> return '\LF'+ , string "VT" >> return '\VT'+ , string "FF" >> return '\FF'+ , string "CR" >> return '\CR'+ , string "SI" >> return '\SI'+ , string "DLE" >> return '\DLE'+ , string "DC1" >> return '\DC1'+ , string "DC2" >> return '\DC2'+ , string "DC3" >> return '\DC3'+ , string "DC4" >> return '\DC4'+ , string "NAK" >> return '\NAK'+ , string "SYN" >> return '\SYN'+ , string "ETB" >> return '\ETB'+ , string "CAN" >> return '\CAN'+ , string "EM" >> return '\EM'+ , string "SUB" >> return '\SUB'+ , string "ESC" >> return '\ESC'+ , string "FS" >> return '\FS'+ , string "GS" >> return '\GS'+ , string "RS" >> return '\RS'+ , string "US" >> return '\US'+ , string "SP" >> return '\SP'+ , string "DEL" >> return '\DEL'+ ]+++-- ---------------------------------------------------------------------------+-- string literal++lexString :: ReadP Lexeme+lexString =+ do _ <- char '"'+ body id+ where+ body f =+ do (c,esc) <- lexStrItem+ if c /= '"' || esc+ then body (f.(c:))+ else let s = f "" in+ return (String s)++ lexStrItem = (lexEmpty >> lexStrItem)+ +++ lexCharE++ lexEmpty =+ do _ <- char '\\'+ c <- get+ case c of+ '&' -> return ()+ _ | isSpace c -> do skipSpaces; _ <- char '\\'; return ()+ _ -> pfail++-- ---------------------------------------------------------------------------+-- Lexing numbers++type Base = Int+type Digits = [Int]++lexNumber :: ReadP Lexeme+lexNumber+ = lexHexOct <++ -- First try for hex or octal 0x, 0o etc+ -- If that fails, try for a decimal number+ lexDecNumber -- Start with ordinary digits++lexHexOct :: ReadP Lexeme+lexHexOct+ = do _ <- char '0'+ base <- lexBaseChar+ digits <- lexDigits base+ return (Number (MkNumber base digits))++lexBaseChar :: ReadP Int+-- Lex a single character indicating the base; fail if not there+lexBaseChar = do+ c <- get+ case c of+ 'b' -> return 2+ 'B' -> return 2+ 'o' -> return 8+ 'O' -> return 8+ 'x' -> return 16+ 'X' -> return 16+ _ -> pfail++lexDecNumber :: ReadP Lexeme+lexDecNumber =+ do xs <- lexDigits 10+ mFrac <- lexFrac <++ return Nothing+ mExp <- lexExp <++ return Nothing+ return (Number (MkDecimal xs mFrac mExp))++lexFrac :: ReadP (Maybe Digits)+-- Read the fractional part; fail if it doesn't+-- start ".d" where d is a digit+lexFrac = do _ <- char '.'+ fraction <- lexDigits 10+ return (Just fraction)++lexExp :: ReadP (Maybe Integer)+lexExp = do _ <- char 'e' +++ char 'E'+ exp <- signedExp +++ lexInteger 10+ return (Just exp)+ where+ signedExp+ = do c <- char '-' +++ char '+'+ n <- lexInteger 10+ return (if c == '-' then -n else n)++lexDigits :: Int -> ReadP Digits+-- Lex a non-empty sequence of digits in specified base+lexDigits base =+ do s <- look+ xs <- scan s id+ guard (not (null xs))+ return xs+ where+ scan (c:cs) f = case valDig base c of+ Just n -> do _ <- get; scan cs (f.(n:))+ Nothing -> return (f [])+ scan [] f = return (f [])++lexInteger :: Base -> ReadP Integer+lexInteger base =+ do xs <- lexDigits base+ return (val (fromIntegral base) xs)++val :: Num a => a -> Digits -> a+val = valSimple+{-# RULES+"val/Integer" val = valInteger+ #-}+{-# INLINE [1] val #-}++-- The following algorithm is only linear for types whose Num operations+-- are in constant time.+valSimple :: (Num a, Integral d) => a -> [d] -> a+valSimple base = go 0 where- lexEsc (c:s) | c `elem` ("abfnrtv\\\"'"::String) = [([c],s)]- lexEsc ('^':c:s) | c >= '@' && c <= '_' = [(['^',c],s)]- lexEsc ('o':s) = [prefix 'o' (span isOctDigit s)]- lexEsc ('x':s) = [prefix 'x' (span isHexDigit s)]- lexEsc s@(d:_) | isDigit d = [span isDigit s]- lexEsc _ = []+ go r [] = r+ go r (d : ds) = r' `seq` go r' ds+ where+ r' = r * base + fromIntegral d+{-# INLINE valSimple #-} - prefix c (t,s) = (c:t, s)-lexLitChar (c:cs) = [([c], cs)]-lexLitChar [] = []+-- A sub-quadratic algorithm for Integer. Pairs of adjacent radix b+-- digits are combined into a single radix b^2 digit. This process is+-- repeated until we are left with a single digit. This algorithm+-- performs well only on large inputs, so we use the simple algorithm+-- for smaller inputs.+valInteger :: Integer -> Digits -> Integer+valInteger b0 ds0 = go b0 (length ds0) $ map fromIntegral ds0+ where+ go _ _ [] = 0+ go _ _ [d] = d+ go b l ds+ | l > 40 = b' `seq` go b' l' (combine b ds')+ | otherwise = valSimple b ds+ where+ -- ensure that we have an even number of digits+ -- before we call combine:+ ds' = if even l then ds else 0 : ds+ b' = b * b+ l' = (l + 1) `quot` 2+ combine b (d1 : d2 : ds) = d `seq` (d : combine b ds)+ where+ d = d1 * b + d2+ combine _ [] = []+ combine _ [_] = errorWithoutStackTrace "this should not happen" -dropSpace :: String -> String-dropSpace [] = []-dropSpace ccs@(c:cs) | isSpace c = dropSpace cs- | True = ccs+-- Calculate a Rational from the exponent [of 10 to multiply with],+-- the integral part of the mantissa and the digits of the fractional+-- part. Leaving the calculation of the power of 10 until the end,+-- when we know the effective exponent, saves multiplications.+-- More importantly, this way we need at most one gcd instead of three.+--+-- frac was never used with anything but Integer and base 10, so+-- those are hardcoded now (trivial to change if necessary).+fracExp :: Integer -> Integer -> Digits -> Rational+fracExp exp mant []+ | exp < 0 = mant % (10 ^ (-exp))+ | otherwise = fromInteger (mant * 10 ^ exp)+fracExp exp mant (d:ds) = exp' `seq` mant' `seq` fracExp exp' mant' ds+ where+ exp' = exp - 1+ mant' = mant * 10 + fromIntegral d++valDig :: (Eq a, Num a) => a -> Char -> Maybe Int+valDig 2 c+ | '0' <= c && c <= '1' = Just (ord c - ord '0')+ | otherwise = Nothing++valDig 8 c+ | '0' <= c && c <= '7' = Just (ord c - ord '0')+ | otherwise = Nothing++valDig 10 c = valDecDig c++valDig 16 c+ | '0' <= c && c <= '9' = 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++valDig _ _ = errorWithoutStackTrace "valDig: Bad base"++valDecDig :: Char -> Maybe Int+valDecDig c+ | '0' <= c && c <= '9' = Just (ord c - ord '0')+ | otherwise = Nothing++-- ----------------------------------------------------------------------+-- other numeric lexing functions++readIntP :: Num a => a -> (Char -> Bool) -> (Char -> Int) -> ReadP a+readIntP base isDigit valDigit =+ do s <- munch1 isDigit+ return (val base (map valDigit s))+{-# SPECIALISE readIntP+ :: Integer -> (Char -> Bool) -> (Char -> Int) -> ReadP Integer #-}++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)+{-# SPECIALISE readIntP' :: Integer -> ReadP Integer #-}++readBinP, readOctP, readDecP, readHexP :: (Eq a, Num a) => ReadP a+readBinP = readIntP' 2+readOctP = readIntP' 8+readDecP = readIntP' 10+readHexP = readIntP' 16+{-# SPECIALISE readBinP :: ReadP Integer #-}+{-# SPECIALISE readOctP :: ReadP Integer #-}+{-# SPECIALISE readDecP :: ReadP Integer #-}+{-# SPECIALISE readHexP :: ReadP Integer #-}
− lib/Text/Read/Numeric.hs
@@ -1,81 +0,0 @@-module Text.Read.Numeric(- readParen,- --- readSigned,- readInt,- readBin,- readDec,- readOct,- readHex,- readIntegral,- readBoundedEnum,- ) where-import Prelude() -- do not import Prelude-import Primitives-import Data.Bool-import Data.Bounded-import Data.Char-import Data.Eq-import Data.Enum-import Data.Function-import Data.Integral-import Data.List-import Data.Maybe_Type-import Data.Num-import Data.Ord-import Data.String-import Text.Read.Lex(lex, dropSpace)-import Text.Show--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, - (")",u) <- lex t ]------------------------------------------------------------readInt :: forall a . Num a => a -> (Char -> Bool) -> (Char -> Int) -> ReadS a-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 _ _ _ _ = [] --readBin :: forall a . (Num a) => ReadS a-readBin = readInt 2 isBinDigit digitToInt--isBinDigit :: Char -> Bool-isBinDigit c = c == '0' || c == '1'--readOct :: forall a . (Num a) => ReadS a-readOct = readInt 8 isOctDigit digitToInt--readDec :: forall a . (Num a) => ReadS a-readDec = readInt 10 isDigit digitToInt--readHex :: forall a . (Num a) => ReadS a-readHex = readInt 16 isHexDigit digitToInt--readSigned :: forall a . (Num a) => ReadS a -> ReadS a-readSigned readPos = readParen False read'- where- read' :: ReadS a- read' r = readPos r ++- [ (- x, t) | ("-", s) <- lex r, (x, t) <- readPos s ]--readIntegral :: forall a . (Integral a) => Int -> ReadS a-readIntegral _ = readSigned (readAny . dropSpace)- where readAny ('0':'x':cs) = readHex cs- readAny ('0':'X':cs) = readHex cs- readAny ('0':'o':cs) = readOct cs- readAny ('0':'O':cs) = readOct cs- readAny ('0':'b':cs) = readBin cs- readAny ('0':'B':cs) = readBin cs- readAny cs = readDec cs--readBoundedEnum :: forall a . (Enum a, Bounded a, Show a) => ReadS a-readBoundedEnum = \ r -> [ (e, t) | (s, t) <- lex r, Just e <- [lookup s table] ]- where table = [ (show e, e) | e <- [ minBound .. maxBound ] ]
+ mhs/MHSPrelude.hs view
@@ -0,0 +1,77 @@+module MHSPrelude(+ module Control.Applicative,+ module Control.Error,+ module Control.Monad,+ module Control.Monad.Fail,+ module Data.Bool,+ module Data.Bounded,+ module Data.Char,+ module Data.Double,+ module Data.Either,+ module Data.Enum,+ module Data.Eq,+ module Data.Fractional,+ module Data.Function,+ module Data.Functor,+ module Data.Int,+ module Data.Integer,+ module Data.Integral,+ module Data.List,+ module Data.Maybe,+ module Data.Monoid,+ module Data.Num,+ module Data.Ord,+ module Data.Ratio,+ module Data.Real,+ module Data.Records,+ module Data.String,+ module Data.Tuple,+ module System.IO,+ module Text.Show,+ usingMhs, _wordSize, _isWindows,+ ) where+import Prelude()+import Control.Applicative(Applicative(..))+import Control.Error(error, undefined)+import Control.Monad(Monad(..), mapM, mapM_, sequence, sequence_, (=<<))+import Control.Monad.Fail(MonadFail(..))+import Data.Bool(Bool(..), (&&), (||), not, otherwise)+import Data.Bounded(Bounded(..))+import Data.Char(Char, String)+import Data.Double(Double)+import Data.Either(Either(..), either)+import Data.Enum(Enum(..))+import Data.Eq(Eq(..))+import Data.Fractional(Fractional(..), (^^))+import Data.Function(id, const, (.), flip, ($), seq, ($!), until, asTypeOf)+import Data.Functor(Functor(..), (<$>))+import Data.Int(Int)+import Data.Int.Instances+import Data.Integer(Integer)+import Data.Integral(Integral(..), fromIntegral, gcd, lcm, even, odd, (^))+import Data.List([](..), map, (++), filter, head, last, tail, init, null, length, (!!),+ reverse, foldl, foldl1, foldr, foldr1, and, or, any, all,+ sum, product, concat, concatMap, maximum, minimum,+ scanl, scanl1, scanr, scanr1, iterate, repeat, replicate, cycle,+ take, drop, splitAt, takeWhile, dropWhile, span, break,+ elem, notElem, lookup, zip, zip3, zipWith, zipWith3, unzip, unzip3,+ lines, words, unlines, unwords)+import Data.Maybe(Maybe(..), maybe)+import Data.Monoid(Monoid(..))+import Data.Num(Num(..), subtract)+import Data.Ord(Ord(..), Ordering(..))+import Data.Ratio(Rational)+import Data.Real(Real(..), realToFrac)+import Data.Records -- needed for data types with fields+import Data.String(IsString(..), lines, unlines, words, unwords)+import Data.Tuple(()(..), fst, snd, curry, uncurry)+import Data.Word(Word)+import System.IO(IO, putChar, putStr, putStrLn, print, getLine, getContents, interact,+ FilePath, readFile, writeFile, appendFile,+ cprint, cuprint)+import Text.Show(Show(..), ShowS, shows, showChar, showString, showParen)+import Primitives(_wordSize, _isWindows)++-- So we can detect mhs vs ghc+usingMhs :: Bool+usingMhs = True
mhs/System/Console/SimpleReadline.hs view
@@ -8,7 +8,7 @@ getInputLineHist, getInputLineHistComp, ) where-import Prelude+import Prelude(); import MiniPrelude import Control.Monad import Data.Char import System.IO
paths/Paths_MicroHs.hs view
@@ -3,10 +3,11 @@ version, getDataDir, ) where+import Prelude(); import MHSPrelude import Data.Version getDataDir :: IO FilePath getDataDir = return "." version :: Version-version = makeVersion [0,9,18,0]+version = makeVersion [0,10,3,0]
src/MicroHs/Abstract.hs view
@@ -2,6 +2,7 @@ compileOpt, -- reduce, ) where+import Prelude(); import MHSPrelude import MicroHs.Ident import MicroHs.Exp import MicroHs.Expr(Lit(..))@@ -27,8 +28,8 @@ -- O x y z w = w x y A -- K2 x y z = x * -- K3 x y z w = x *--- K4 x y z w v = x *--- C'B x y z w = x z (y w)+-- K4 x y z w v = x *+-- C'B x y z w = x z (y w) A -- data MaybeApp = NotApp | IsApp Exp Exp
src/MicroHs/Compile.hs view
@@ -10,7 +10,9 @@ moduleToFile, packageDir, packageSuffix, packageTxtSuffix, mhsVersion,+ getMhsDir, ) where+import Prelude(); import MHSPrelude import Data.Char import Data.List import Data.Maybe@@ -23,6 +25,7 @@ import System.IO.TimeMilli import System.Process import MicroHs.Abstract+import MicroHs.Builtin import MicroHs.CompileCache import MicroHs.Desugar import MicroHs.Exp@@ -38,7 +41,7 @@ import MicroHs.TypeCheck import Compat import MicroHs.Instances() -- for ghc-import Paths_MicroHs(version)+import Paths_MicroHs(version, getDataDir) mhsVersion :: String mhsVersion = showVersion version@@ -104,7 +107,7 @@ ((cm, syms, t), ch) <- runStateIO comp ach when (verbosityGT flags 0) $ putStrLn $ "total import time " ++ padLeft 6 (show t) ++ "ms"- return ((tModuleName cm, concatMap bindingsOf $ cachedModules ch), syms, ch)+ return ((tModuleName cm, concatMap tBindingsOf $ cachedModules ch), syms, ch) -- Compile a module with the given name. -- If the module has already been compiled, return the cached result.@@ -118,8 +121,10 @@ case impt of ImpBoot -> compileBootModule flags mn ImpNormal -> do- when (verbosityGT flags 1) $- liftIO $ putStrLn $ "importing " ++ showIdent mn+ when (verbosityGT flags 1) $ do+ ms <- gets getWorking+ putStrLnInd $ "[from " ++ head (map showIdent ms ++ ["-"]) ++ "]"+ putStrLnInd $ "importing " ++ showIdent mn mres <- liftIO (readModulePath flags ".hs" mn) case mres of Nothing -> findPkgModule flags mn@@ -128,16 +133,21 @@ compileModule flags ImpNormal mn pathfn file Just tm -> do when (verbosityGT flags 1) $- liftIO $ putStrLn $ "importing cached " ++ showIdent mn+ putStrLnInd $ "importing cached " ++ showIdent mn return (tm, noSymbols, 0) +putStrLnInd :: String -> StateIO Cache ()+putStrLnInd msg = do+ ms <- gets getWorking+ liftIO $ putStrLn $ map (const ' ') ms ++ msg+ noSymbols :: Symbols noSymbols = (stEmpty, stEmpty) compileBootModule :: Flags -> IdentModule -> StateIO Cache (TModule [LDef], Symbols, Time) compileBootModule flags mn = do when (verbosityGT flags 0) $- liftIO $ putStrLn $ "importing boot " ++ showIdent mn+ putStrLnInd $ "importing boot " ++ showIdent mn mres <- liftIO (readModulePath flags ".hs-boot" mn) case mres of Nothing -> error $ "boot module not found: " ++ showIdent mn@@ -154,6 +164,8 @@ let pmdl = parseDie pTop pathfn file mdl@(EModule mnn _ defs) = addPreludeImport pmdl when (verbosityGT flags 4) $+ liftIO $ putStrLn $ "parsing: " ++ pathfn+ when (verbosityGT flags 4) $ liftIO $ putStrLn $ "parsed:\n" ++ show pmdl -- liftIO $ putStrLn $ showEModule mdl@@ -168,18 +180,20 @@ (impMdls, _, tImps) <- fmap unzip3 $ mapM (uncurry $ compileModuleCached flags) imported t3 <- liftIO getTimeMilli+ glob <- gets getCacheTables let- (tmdl, syms) = typeCheck impt (zip specs impMdls) mdl+ (tmdl, glob', syms) = typeCheck glob impt (zip specs impMdls) mdl+ modify $ setCacheTables glob' when (verbosityGT flags 3) $ liftIO $ putStrLn $ "type checked:\n" ++ showTModule showEDefs tmdl ++ "-----\n" let dmdl = desugar flags tmdl- () <- return $ rnfErr $ bindingsOf dmdl+ () <- return $ rnfErr $ tBindingsOf dmdl t4 <- liftIO getTimeMilli let- cmdl = setBindings [ (i, compileOpt e) | (i, e) <- bindingsOf dmdl ] dmdl- () <- return $ rnfErr $ bindingsOf cmdl -- This makes execution slower, but speeds up GC+ 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 t5 <- liftIO getTimeMilli @@ -192,7 +206,7 @@ when (verbosityGT flags 4) $ (liftIO $ putStrLn $ "desugared:\n" ++ showTModule showLDefs dmdl) when (verbosityGT flags 0) $- liftIO $ putStrLn $ "importing done " ++ showIdent mn ++ ", " ++ show tThis +++ putStrLnInd $ "importing done " ++ showIdent mn ++ ", " ++ show tThis ++ "ms (" ++ show tParse ++ " + " ++ show tTCDesug ++ " + " ++ show tAbstract ++ ")" when (loading flags && mn /= mkIdent "Interactive" && not (verbosityGT flags 0)) $ liftIO $ putStrLn $ "loaded " ++ showIdent mn@@ -211,11 +225,15 @@ 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 ps' = case ps of- [] -> [Import $ ImportSpec ImpNormal False idPrelude Nothing Nothing] -- no Prelude imports, so add 'import Prelude'- [Import (ImportSpec ImpNormal False _ Nothing (Just (False, [])))] -> [] -- exactly 'import Prelude()', so import nothing- _ -> ps -- keep the given Prelude imports+ [] -> [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 : ps -- keep the given Prelude imports, add Builtin ------------------------------------------- @@ -264,7 +282,7 @@ -- Is the module name actually a file name? getFileName :: IdentModule -> Maybe String getFileName m | ".hs" `isSuffixOf` s = Just s- | otherwise = Nothing+ | otherwise = Nothing where s = unIdent m readModulePath :: Flags -> String -> IdentModule -> IO (Maybe (FilePath, String))@@ -274,10 +292,14 @@ Nothing -> errorMessage (getSLoc mn) $ "File not found: " ++ show fn Just h -> readRest fn h - | otherwise = do+ | otherwise = do mh <- findModulePath flags suf mn case mh of- Nothing -> return Nothing+ Nothing -> do+ mhc <- findModulePath flags (suf ++ "c") mn -- look for hsc file+ case mhc of+ Nothing -> return Nothing+ Just (_fn, _h) -> undefined Just (fn, h) -> readRest fn h where readRest fn h = do hasCPP <- hasLangCPP fn@@ -334,16 +356,18 @@ mhsDefines :: [String] mhsDefines =- [ "'-DMIN_VERSION_base(x,y,z)=(x<=4||y<=14)'" -- Pretend we have base version 4.14- , "-D__MHS__" -- We are MHS+ [ "-D__MHS__" -- We are MHS ] runCPP :: Flags -> FilePath -> FilePath -> IO () runCPP flags infile outfile = do mcpphs <- lookupEnv "MHSCPPHS"+ datadir <- getMhsDir let cpphs = fromMaybe "cpphs" mcpphs- args = mhsDefines ++ cppArgs flags- cmd = cpphs ++ " --noline --strip " ++ unwords args ++ " " ++ infile ++ " -O" ++ outfile+ mhsIncludes = ["-I" ++ datadir ++ "/src/runtime"]+ args = mhsDefines ++ mhsIncludes ++ map quote (cppArgs flags)+ cmd = cpphs ++ " --strip " ++ unwords args ++ " " ++ infile ++ " -O" ++ outfile+ quote s = "'" ++ s ++ "'" when (verbosityGT flags 1) $ putStrLn $ "Run cpphs: " ++ show cmd callCommand cmd@@ -386,7 +410,7 @@ pkg <- liftIO $ readSerialized fn when (pkgCompiler pkg /= mhsVersion) $ error $ "Package compile version mismatch: package=" ++ pkgCompiler pkg ++ ", compiler=" ++ mhsVersion- modify $ addPackage pkg+ modify $ addPackage fn pkg -- XXX add function to find&load package from package name @@ -411,3 +435,10 @@ Just (pfn, hdl) -> do liftIO $ hClose hdl loadPkg flags pfn++getMhsDir :: IO FilePath+getMhsDir = do+ md <- lookupEnv "MHSDIR"+ case md of+ Just d -> return d+ Nothing -> getDataDir
src/MicroHs/CompileCache.hs view
@@ -1,16 +1,18 @@ module MicroHs.CompileCache( CModule,- Cache, addWorking, emptyCache, deleteFromCache, workToDone, addBoot, getBoots,+ Cache, addWorking, getWorking, emptyCache, deleteFromCache, workToDone, addBoot, getBoots, cachedModules, lookupCache, lookupCacheChksum, getImportDeps,- addPackage, getCompMdls, getPkgs,+ addPackage, getCompMdls, getPathPkgs, getPkgs,+ getCacheTables, setCacheTables, saveCache, loadCached, ) where+import Prelude(); import MHSPrelude import MicroHs.Desugar(LDef) import MicroHs.Expr(IdentModule) import MicroHs.Ident(showIdent) import qualified MicroHs.IdentMap as M import MicroHs.Package-import MicroHs.TypeCheck(TModule, tModuleName)+import MicroHs.TypeCheck(TModule, tModuleName, GlobTables, emptyGlobTables, mergeGlobTables) import System.IO import System.IO.Serialize import System.IO.MD5(MD5CheckSum)@@ -39,12 +41,20 @@ working :: [IdentModule], -- modules currently being processed (used to detected circular imports) boots :: [IdentModule], -- modules where only the boot version has been compiled cache :: M.Map CacheEntry, -- cached compiled modules- pkgs :: [Package] -- loaded packages+ pkgs :: [(FilePath, Package)], -- loaded packages+ tables :: GlobTables } -- deriving (Show) +getCacheTables :: Cache -> GlobTables+getCacheTables = tables++setCacheTables :: GlobTables -> Cache -> Cache+setCacheTables ct c = c{ tables = ct }+ emptyCache :: Cache-emptyCache = Cache { working = [], boots = [], cache = M.empty, pkgs = [] }+emptyCache =+ Cache { working = [], boots = [], cache = M.empty, pkgs = [], tables = emptyGlobTables } deleteFromCache :: IdentModule -> Cache -> Cache deleteFromCache mn c = c{ cache = M.delete mn (cache c) }@@ -55,6 +65,9 @@ getBoots :: Cache -> [IdentModule] getBoots = boots +getWorking :: Cache -> [IdentModule]+getWorking = working+ addWorking :: IdentModule -> Cache -> Cache addWorking mn c = let ws = working c@@ -83,11 +96,18 @@ getCompMdls :: Cache -> [TModule [LDef]] getCompMdls cash = [ tm | CompMdl tm _ _ <- M.elems (cache cash) ] +getPathPkgs :: Cache -> [(FilePath, Package)]+getPathPkgs = pkgs+ getPkgs :: Cache -> [Package]-getPkgs = pkgs+getPkgs = map snd . pkgs -addPackage :: Package -> Cache -> Cache-addPackage p c = c{ pkgs = p : pkgs c, cache = foldr ins (cache c) (pkgExported p ++ pkgOther p) }+addPackage :: FilePath -> Package -> Cache -> Cache+addPackage f p c = c{+ pkgs = (f, p) : pkgs c,+ cache = foldr ins (cache c) (pkgExported p ++ pkgOther p),+ tables = mergeGlobTables (pkgTables p) (tables c)+ } where ins t = M.insert (tModuleName t) (PkgMdl t) saveCache :: FilePath -> Cache -> IO ()
src/MicroHs/Deriving.hs view
@@ -1,14 +1,24 @@ module MicroHs.Deriving(expandField, doDeriving, mkGetName) where-import Prelude+import Prelude(); import MHSPrelude --import Control.Monad import Data.Char import Data.Function import Data.List+import MicroHs.Builtin import MicroHs.Expr import MicroHs.Ident import MicroHs.TCMonad import Debug.Trace +-- Deriving runs when types level names are resolved, but not value level names.+-- To get access to names that might not be in scope, the module Mhs.Builtin+-- re-exports all names needed here. This module is automagically imported as B@+-- Generated names should be like+-- type/class names fully qualified+-- method names (on lhs) unqualified+-- constructor names in the derived type unqualified+-- all other names should be qualified with B@+ doDeriving :: EDef -> T [EDef] doDeriving def@(Data lhs cs ds) = (def:) . concat <$> mapM (derive lhs cs) ds doDeriving def@(Newtype lhs c ds) = (def:) . concat <$> mapM (derive lhs [c]) ds@@ -25,7 +35,7 @@ ,("Data.Ix.Ix", derNotYet) ,("Data.Ord.Ord", derOrd) ,("Data.Typeable.Typeable", derTypeable)- ,("Text.Read.Read", derNotYet)+ ,("Text.Read.Internal.Read",derNotYet) ,("Text.Show.Show", derShow) ] @@ -64,8 +74,8 @@ undef = mkExn loc ufld "recSelError" iHasField = mkIdentSLoc loc nameHasField iSetField = mkIdentSLoc loc nameSetField- igetField = mkQIdent loc nameDataRecords namegetField- isetField = mkQIdent loc nameDataRecords namesetField+ igetField = mkIdentSLoc loc namegetField+ isetField = mkIdentSLoc loc namesetField hdrGet = eForall iks $ eApp3 (EVar iHasField) (ELit loc (LStr ufld)) (eApps (EVar qtycon) (map (EVar . idKindIdent) iks))@@ -93,10 +103,10 @@ ] nameHasField :: String-nameHasField = nameDataRecords ++ ".HasField"+nameHasField = "Data.Records.HasField" nameSetField :: String-nameSetField = nameDataRecords ++ ".SetField"+nameSetField = "Data.Records.SetField" namegetField :: String namegetField = "getField"@@ -104,48 +114,26 @@ namesetField :: String namesetField = "setField" -nameDataRecords :: String-nameDataRecords = "Data.Records"- mkGetName :: Ident -> Ident -> Ident mkGetName tycon fld = qualIdent (mkIdent "get") $ qualIdent tycon fld -------------------------------------------- -eApp2 :: Expr -> Expr -> Expr -> Expr-eApp2 a b c = EApp (EApp a b) c--eApp3 :: Expr -> Expr -> Expr -> Expr -> Expr-eApp3 a b c d = EApp (eApp2 a b c) d---- MicroHs currently has no way of using the original name,--- so we just ignore the qualification part for now.-mkQIdent :: SLoc -> String -> String -> Ident-mkQIdent loc _qual name = mkIdentSLoc loc name----------------------------------------------- derTypeable :: Deriver derTypeable (i, _) _ etyp = do mn <- gets moduleName let loc = getSLoc i- itypeRep = mkQIdent loc nameDataTypeable "typeRep"- imkTyConApp = mkQIdent loc nameDataTypeable "mkTyConApp"- imkTyCon = mkQIdent loc nameDataTypeable "mkTyCon"+ itypeRep = mkIdentSLoc loc "typeRep"+ imkTyConApp = mkBuiltin loc "mkTyConApp"+ imkTyCon = mkBuiltin loc "mkTyCon" hdr = EApp etyp (EVar $ qualIdent mn i) mdl = ELit loc $ LStr $ unIdent mn nam = ELit loc $ LStr $ unIdent i- eqns = eEqns [eDummy] $ eApp2 (EVar imkTyConApp) (eApp2 (EVar imkTyCon) mdl nam) (EVar (mkQIdent loc nameDataListType "[]"))+ eqns = eEqns [eDummy] $ eApp2 (EVar imkTyConApp) (eApp2 (EVar imkTyCon) mdl nam) (EListish (LList [])) inst = Instance hdr [BFcn itypeRep eqns] return [inst] -nameDataTypeable :: String-nameDataTypeable = "Data.Tyeable"--nameDataListType :: String-nameDataListType = "Data.List_Type"- -------------------------------------------- getConstrTyVars :: Constr -> [Ident]@@ -180,25 +168,16 @@ (yp, ys) = mkPat c "y" in eEqn [xp, yp] $ if null xs then eTrue else foldr1 eAnd $ zipWith eEq xs ys eqns = map mkEqn cs ++ [eEqn [eDummy, eDummy] eFalse]- iEq = mkQIdent loc nameDataEq "=="- eEq = EApp . EApp (EVar iEq)- eAnd = EApp . EApp (EVar $ mkQIdent loc nameDataBool "&&")- eTrue = EVar $ mkQIdent loc nameDataBoolType "True"- eFalse = EVar $ mkQIdent loc nameDataBoolType "False"+ iEq = mkIdentSLoc loc "=="+ eEq = EApp . EApp (EVar $ mkBuiltin loc "==")+ eAnd = EApp . EApp (EVar $ mkBuiltin loc "&&")+ eTrue = EVar $ mkBuiltin loc "True"+ eFalse = EVar $ mkBuiltin loc "False" inst = Instance hdr [BFcn iEq eqns] -- traceM $ showEDefs [inst] return [inst] derEq (c, _) _ e = cannotDerive "Eq" c e -nameDataBoolType :: String-nameDataBoolType = nameDataBool ++ "_Type"--nameDataBool :: String-nameDataBool = "Data.Bool"--nameDataEq :: String-nameDataEq = "Data.Eq"- -------------------------------------------- derOrd :: Deriver@@ -212,26 +191,19 @@ ,eEqn [xp, eDummy] $ eLT ,eEqn [eDummy, yp] $ eGT] eqns = concatMap mkEqn cs- iCompare = mkQIdent loc nameDataOrd "compare"- eCompare = EApp . EApp (EVar iCompare)- eComb = EApp . EApp (EVar $ mkIdentSLoc loc "<>")- eEQ = EVar $ mkQIdent loc nameDataOrderingType "EQ"- eLT = EVar $ mkQIdent loc nameDataOrderingType "LT"- eGT = EVar $ mkQIdent loc nameDataOrderingType "GT"+ iCompare = mkIdentSLoc loc "compare"+ eCompare = EApp . EApp (EVar $ mkBuiltin loc "compare")+ eComb = EApp . EApp (EVar $ mkBuiltin loc "<>")+ eEQ = EVar $ mkBuiltin loc "EQ"+ eLT = EVar $ mkBuiltin loc "LT"+ eGT = EVar $ mkBuiltin loc "GT" inst = Instance hdr [BFcn iCompare eqns] -- traceM $ showEDefs [inst] return [inst] derOrd (c, _) _ e = cannotDerive "Ord" c e -nameDataOrd :: String-nameDataOrd = "Data.Ord"--nameDataOrderingType :: String-nameDataOrderingType = "Data.Ordering_Type"- -------------------------------------------- --- XXX should use mkQIdent derBounded :: Deriver derBounded lhs cs@(c0:_) ebnd = do hdr <- mkHdr lhs cs ebnd@@ -241,9 +213,8 @@ let n = either length length flds in eEqn [] $ tApps c (replicate n (EVar bnd)) - ident = mkIdentSLoc loc- iMinBound = ident "minBound"- iMaxBound = ident "maxBound"+ iMinBound = mkIdentSLoc loc "minBound"+ iMaxBound = mkIdentSLoc loc "maxBound" minEqn = mkEqn iMinBound c0 maxEqn = mkEqn iMaxBound (last cs) inst = Instance hdr [BFcn iMinBound [minEqn], BFcn iMaxBound [maxEqn]]@@ -256,7 +227,6 @@ -------------------------------------------- --- XXX should use mkQIdent derEnum :: Deriver derEnum lhs cs@(_:_) enm | all isNullary cs = do hdr <- mkHdr lhs cs enm@@ -267,9 +237,8 @@ mkTo (Constr _ _ c _) i = eEqn [ELit loc (LInt i)] $ EVar c - ident = mkIdentSLoc loc- iFromEnum = ident "fromEnum"- iToEnum = ident "toEnum"+ iFromEnum = mkIdentSLoc loc "fromEnum"+ iToEnum = mkIdentSLoc loc "toEnum" fromEqns = zipWith mkFrom cs [0..] toEqns = zipWith mkTo cs [0..] inst = Instance hdr [BFcn iFromEnum fromEqns, BFcn iToEnum toEqns]@@ -282,7 +251,6 @@ -------------------------------------------- --- XXX should use mkQIdent derShow :: Deriver derShow lhs cs@(_:_) eshow = do hdr <- mkHdr lhs cs eshow@@ -291,13 +259,12 @@ let (xp, xs) = mkPat c "x" in eEqn [varp, xp] $ showRHS nm xs flds - ident = mkIdentSLoc loc- var = EVar . ident- varp = var "p"+ var = EVar . mkBuiltin loc+ varp = EVar $ mkIdent "p" lit = ELit loc - iShowsPrec = ident "showsPrec"- eShowsPrec n = eApp2 (EVar iShowsPrec) (lit (LInt n))+ iShowsPrec = mkIdentSLoc loc "showsPrec"+ eShowsPrec n = eApp2 (var "showsPrec") (lit (LInt n)) eShowString s = EApp (var "showString") (lit (LStr s)) eParen n = eApp2 (var "showParen") (eApp2 (var ">") varp (lit (LInt n))) eShowL s = foldr1 ejoin . intersperse (eShowString s)
src/MicroHs/Desugar.hs view
@@ -6,6 +6,7 @@ LDef, showLDefs, encodeInteger, ) where+import Prelude(); import MHSPrelude import Data.Char import Data.Function import Data.Integer(_integerToIntList)@@ -28,10 +29,8 @@ type LDef = (Ident, Exp) desugar :: Flags -> TModule [EDef] -> TModule [LDef]-desugar flags atm =- case atm of- TModule mn fxs tys syns clss insts vals ds ->- TModule mn fxs tys syns clss insts vals $ map lazier $ checkDup $ concatMap (dsDef flags mn) ds+desugar flags tm =+ setBindings tm (map lazier $ checkDup $ concatMap (dsDef flags (tModuleName tm)) (tBindingsOf tm)) dsDef :: Flags -> IdentModule -> EDef -> [LDef] dsDef flags mn adef =@@ -51,7 +50,13 @@ Sign _ _ -> [] KindSign _ _ -> [] Import _ -> []- ForImp ie i t -> [(i, Lit $ LForImp (fromMaybe (unIdent (unQualIdent i)) ie) (CType t))]+ ForImp ie i t -> [(i, if isIO t then frgn else App perf frgn)]+ where frgn = Lit $ LForImp (fromMaybe (unIdent (unQualIdent i)) ie) cty+ cty = CType t+ perf = Lit $ LPrim "IO.performIO"+ isIO x | Just (_, r) <- getArrow x = isIO r+ isIO (EApp (EVar io) _) = io == mkIdent "Primitives.IO"+ isIO _ = False Infix _ _ -> [] Class ctx (c, _) _ bs -> let f = mkIdent "$f"
src/MicroHs/EncodeData.hs view
@@ -6,6 +6,7 @@ encIf, encList, ) where+import Prelude(); import MHSPrelude import Data.List import MicroHs.Exp import MicroHs.Expr(Con(..), Lit(..))@@ -137,6 +138,16 @@ [] -> dflt [(i, xs, e)] | hi - lo == 1 -> match tup xs e | otherwise -> encIf (eqInt n i) (match tup xs e) dflt+{-+ -- Strangely, this slows things down.+ -- Why? A 3-way branch should be better than a 2-way.+ [(i, xs, e), (_, xs', e')]+ | hi - lo == 2 -> encIf (eqInt n i) (match tup xs e) (match tup xs' e')+ let !(pesl, (i, xs, e) : pesh) = splitAt (length pes `quot` 2) pes+ in encTri (cmpInt n i) (caseTree n tup lo i pesl dflt)+ (match tup xs e)+ (caseTree n tup (i+1) hi pesh dflt)+-} _ -> let !(pesl, pesh@((i, _, _):_)) = splitAt (length pes `quot` 2) pes in encIf (ltInt n i) (caseTree n tup lo i pesl dflt) (caseTree n tup i hi pesh dflt)@@ -147,6 +158,11 @@ ltInt x i = app2 (Lit (LPrim "<")) x (Lit (LInt i)) match :: Exp -> [Ident] -> Exp -> Exp match e is rhs = App e $ lams is rhs+{-+ cmpInt :: Exp -> Int -> Exp+ cmpInt x i = app2 (Lit (LPrim "icmp")) x (Lit (LInt i))+ encTri o l e h = app3 o l e h+-} conNo :: Con -> Int conNo (ConData cks i _) = length $ takeWhile ((/= i) . fst) cks
src/MicroHs/Exp.hs view
@@ -10,7 +10,7 @@ allVarsExp, freeVars, lams, apps, ) where-import Prelude hiding((<>))+import Prelude(); import MHSPrelude hiding((<>)) import Data.Char import Data.List import MicroHs.Ident
src/MicroHs/ExpPrint.hs view
@@ -1,4 +1,5 @@ module MicroHs.ExpPrint(toStringCMdl, toStringP, encodeString, combVersion) where+import Prelude(); import MHSPrelude import Data.Char(ord, chr) import qualified MicroHs.IdentMap as M import Data.Maybe
src/MicroHs/Expr.hs view
@@ -30,7 +30,7 @@ Con(..), conIdent, conArity, conFields, tupleConstr, getTupleConstr, mkTupleSel,- eApps,+ eApp2, eApp3, eApps, lhsToType, subst, allVarsExpr, allVarsBind, allVarsEqns,@@ -39,7 +39,7 @@ Assoc(..), Fixity, getBindsVars, HasLoc(..),- eForall,+ eForall, eForall', eDummy, impossible, impossibleShow, getArrow, getArrows,@@ -48,7 +48,7 @@ getAppM, TyVar, freeTyVars, ) where-import Prelude hiding ((<>))+import Prelude(); import MHSPrelude hiding ((<>)) import Control.Arrow(first) import Data.List import Data.Maybe@@ -109,11 +109,13 @@ | ECase Expr [ECaseArm] | ELet [EBind] Expr | ETuple [Expr]+ | EParen Expr | EListish Listish | EDo (Maybe Ident) [EStmt] | ESectL Expr Ident | ESectR Ident Expr | EIf Expr Expr Expr+ | EMultiIf EAlts | ESign Expr EType | ENegApp Expr | EUpdate Expr [EField]@@ -123,7 +125,7 @@ | EViewPat Expr EPat | ELazy Bool EPat -- True indicates ~p, False indicates !p -- only in types- | EForall [IdKind] EType+ | EForall Bool [IdKind] EType -- True indicates explicit forall in the code -- only while type checking | EUVar Int -- only after type checking@@ -246,6 +248,7 @@ EOper p1 ips -> patVars p1 ++ concatMap (\ (i, p2) -> i `add` patVars p2) ips ELit _ _ -> [] ETuple ps -> concatMap patVars ps+ EParen p -> patVars p EListish (LList ps) -> concatMap patVars ps ESign p _ -> patVars p EAt i p -> i `add` patVars p@@ -315,6 +318,12 @@ mkTupleSel i n = eLam [ETuple [ EVar $ if k == i then x else dummyIdent | k <- [0 .. n - 1] ]] (EVar x) where x = mkIdent "$x" +eApp2 :: Expr -> Expr -> Expr -> Expr+eApp2 a b c = EApp (EApp a b) c++eApp3 :: Expr -> Expr -> Expr -> Expr -> Expr+eApp3 a b c d = EApp (eApp2 a b c) d+ eApps :: Expr -> [Expr] -> Expr eApps = foldl EApp @@ -340,12 +349,14 @@ getSLoc (ECase e _) = getSLoc e getSLoc (ELet bs _) = getSLoc bs getSLoc (ETuple es) = getSLoc es+ getSLoc (EParen e) = getSLoc e getSLoc (EListish l) = getSLoc l getSLoc (EDo (Just i) _) = getSLoc i getSLoc (EDo _ ss) = getSLoc ss getSLoc (ESectL e _) = getSLoc e getSLoc (ESectR i _) = getSLoc i getSLoc (EIf e _ _) = getSLoc e+ getSLoc (EMultiIf e) = getSLoc e getSLoc (ESign e _) = getSLoc e getSLoc (ENegApp e) = getSLoc e getSLoc (EUpdate e _) = getSLoc e@@ -355,8 +366,8 @@ getSLoc (ELazy _ e) = getSLoc e getSLoc (EUVar _) = error "getSLoc EUVar" getSLoc (ECon c) = getSLoc c- getSLoc (EForall [] e) = getSLoc e- getSLoc (EForall iks _) = getSLoc iks+ getSLoc (EForall _ [] e) = getSLoc e+ getSLoc (EForall _ iks _) = getSLoc iks instance forall a . HasLoc a => HasLoc [a] where getSLoc [] = noSLoc -- XXX shouldn't happen@@ -420,7 +431,7 @@ EApp f a -> EApp (sub f) (sub a) ESign e t -> ESign (sub e) t EUVar _ -> ae- EForall iks t -> EForall iks $ subst [ x | x@(i, _) <- s, not (elem i is) ] t+ EForall b iks t -> EForall b iks $ subst [ x | x@(i, _) <- s, not (elem i is) ] t where is = map idKindIdent iks ELit _ _ -> ae _ -> error "subst unimplemented"@@ -493,11 +504,13 @@ ECase e as -> allVarsExpr' e . composeMap allVarsCaseArm as ELet bs e -> composeMap allVarsBind' bs . allVarsExpr' e ETuple es -> composeMap allVarsExpr' es+ EParen e -> allVarsExpr' e EListish (LList es) -> composeMap allVarsExpr' es EDo mi ss -> maybe id (:) mi . composeMap allVarsStmt ss ESectL e i -> (i :) . allVarsExpr' e ESectR i e -> (i :) . allVarsExpr' e EIf e1 e2 e3 -> allVarsExpr' e1 . allVarsExpr' e2 . allVarsExpr' e3+ EMultiIf e -> allVarsAlts e EListish l -> allVarsListish l ESign e _ -> allVarsExpr' e ENegApp e -> allVarsExpr' e@@ -508,7 +521,7 @@ ELazy _ p -> allVarsExpr' p EUVar _ -> id ECon c -> (conIdent c :)- EForall iks e -> (map (\ (IdKind i _) -> i) iks ++) . allVarsExpr' e+ EForall _ iks e -> (map (\ (IdKind i _) -> i) iks ++) . allVarsExpr' e where field (EField _ e) = allVarsExpr' e field (EFieldPun is) = (last is :) field EFieldWild = impossible@@ -694,10 +707,12 @@ ECase e as -> text "case" <+> ppE e <+> text "of" $$ nest 2 (vcat (map ppCaseArm as)) ELet bs e -> text "let" $$ nest 2 (vcat (map ppEBind bs)) $$ text "in" <+> ppE e ETuple es -> parens $ hsep $ punctuate (text ",") (map ppE es)+ EParen e -> parens (ppE e) EDo mn ss -> maybe (text "do") (\ n -> ppIdent n <> text ".do") mn $$ nest 2 (vcat (map ppEStmt ss)) ESectL e i -> parens $ ppE e <+> ppIdent i ESectR i e -> parens $ ppIdent i <+> ppE e EIf e1 e2 e3 -> parens $ sep [text "if" <+> ppE e1, text "then" <+> ppE e2, text "else" <+> ppE e3]+ EMultiIf e -> text "if" <+> ppAlts (text "->") e EListish l -> ppListish l ESign e t -> parens $ ppE e <+> text "::" <+> ppEType t ENegApp e -> text "-" <+> ppE e@@ -709,14 +724,15 @@ ELazy False p -> text "!" <> ppE p EUVar i -> text ("_a" ++ show i) ECon c -> ppCon c- EForall iks e -> ppForall iks <+> ppEType e+ EForall _ iks e -> ppForall iks <+> ppEType e ppApp :: [Expr] -> Expr -> Doc ppApp as (EApp f a) = ppApp (a:as) f ppApp as f | raw = ppApply f as ppApp as (EVar i) | isOperChar cop, [a, b] <- as = parens $ ppE a <+> text op <+> ppExpr b | isOperChar cop, [a] <- as = parens $ ppE a <+> text op- | cop == ',' = ppE (ETuple as)+ | cop == ',' && length op + 1 == length as+ = ppE (ETuple as) | op == "[]", length as == 1 = ppE (EListish (LList as)) where op = unIdent (unQualIdent i) cop = head op@@ -810,9 +826,12 @@ getBindsVars = concatMap getBindVars eForall :: [IdKind] -> EType -> EType-eForall [] t = t-eForall vs t = EForall vs t+eForall = eForall' True +eForall' :: Bool -> [IdKind] -> EType -> EType+eForall' _ [] t = t+eForall' b vs t = EForall b vs t+ eDummy :: Expr eDummy = EVar dummyIdent @@ -871,7 +890,7 @@ | elem tv acc = acc | isConIdent tv = acc | otherwise = tv : acc- go bound (EForall tvs ty) acc = go (map idKindIdent tvs ++ bound) ty acc+ go bound (EForall _ tvs ty) acc = go (map idKindIdent tvs ++ bound) ty acc go bound (EApp fun arg) acc = go bound fun (go bound arg acc) go _bound (EUVar _) acc = acc go _bound (ECon _) acc = acc@@ -880,6 +899,7 @@ go bound (ESign e _) acc = go bound e acc 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 _ x _ = error ("freeTyVars: " ++ show x) -- impossibleShow x goList bound es acc = foldr (go bound) acc es
src/MicroHs/FFI.hs view
@@ -1,7 +1,7 @@ module MicroHs.FFI(makeFFI) where+import Prelude(); import MHSPrelude import Data.Function import Data.List-import Data.Maybe import MicroHs.Desugar(LDef) import MicroHs.Exp import MicroHs.Expr@@ -10,56 +10,64 @@ makeFFI :: Flags -> [LDef] -> String makeFFI _ ds =- let ffiImports = [ (parseImpEnt (getSLoc t) f, t) | (_, Lit (LForImp f (CType t))) <- ds ]+ let ffiImports = [ (parseImpEnt i f, t) | (i, d) <- ds, Lit (LForImp f (CType t)) <- [get d] ]+ where get (App _ a) = a -- if there is no IO type, we have (App primPerform (LForImp ...))+ get a = a wrappers = [ t | (ImpWrapper, t) <- ffiImports] dynamics = [ t | (ImpDynamic, t) <- ffiImports]- includes = "mhsffi.h" : catMaybes [ inc | (ImpStatic inc _addr _name, _) <- ffiImports ]- addrs = [ (name, t) | (ImpStatic _inc True name, t) <- ffiImports, name `notElem` runtimeFFI ]- funcs = [ (name, t) | (ImpStatic _inc False name, t) <- ffiImports, name `notElem` runtimeFFI ]- funcs' = uniqFst funcs- addrs' = uniqFst addrs+ imps = uniqName $ filter ((`notElem` runtimeFFI) . impName) ffiImports+ includes = "mhsffi.h" : nub [ inc | (ImpStatic _ (Just inc) _ _, _) <- imps ] in if not (null wrappers) || not (null dynamics) then error "Unimplemented FFI feature" else unlines $ map (\ fn -> "#include \"" ++ fn ++ "\"") includes ++- map mkStatic funcs' ++- map mkAddr addrs' +++ map mkHdr imps ++ ["static struct ffi_entry table[] = {"] ++- map (mkFuncEntry . fst) funcs' ++- map (mkAddrEntry . fst) addrs' +++ map (mkEntry . fst) imps ++ ["{ 0,0 }", "};", "struct ffi_entry *xffi_table = table;" ] -uniqFst :: [(String, EType)] -> [(String, EType)]-uniqFst = map head . groupBy ((==) `on` fst) . sortBy (compare `on` fst)+uniqName :: [(ImpEnt, EType)] -> [(ImpEnt, EType)]+uniqName = map head . groupBy ((==) `on` impName) . sortBy (compare `on` impName) -data ImpEnt = ImpStatic (Maybe String) Bool String | ImpDynamic | ImpWrapper+data ImpEnt = ImpStatic Ident (Maybe String) Imp String | ImpDynamic | ImpWrapper+-- deriving (Show) +impName :: (ImpEnt, EType) -> String+impName (ImpStatic i _ Value _, _) = unIdent' i+impName (ImpStatic _ _ _ s, _) = s+impName _ = undefined++data Imp = Ptr | Value | Func+-- deriving (Show)+ -- "[static] [name.h] [&] [name]" -- "dynamic" -- "wrapper"-parseImpEnt :: SLoc -> String -> ImpEnt-parseImpEnt loc s =+parseImpEnt :: Ident -> String -> ImpEnt+parseImpEnt i s = case words s of ["dynamic"] -> ImpDynamic ["wrapper"] -> ImpWrapper "static" : r -> rest r r -> rest r- where rest (inc : r) | isSuffixOf ".h" inc = rest' (ImpStatic (Just inc)) r- rest r = rest' (ImpStatic Nothing) r- rest' c ("&" : r) = rest'' (c True) r- rest' c ['&' : r] = rest'' (c True) [r]- rest' c r = rest'' (c False) r+ where rest (inc : r) | isSuffixOf ".h" 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]+ rest' c r = rest'' (c Func) r rest'' c [n] = c n rest'' _ _ = errorMessage loc $ "bad foreign import " ++ show s--mkFuncEntry :: String -> String-mkFuncEntry f = "{ \"" ++ f ++ "\", mhs_" ++ f ++ "},"+ loc = getSLoc i -mkAddrEntry :: String -> String-mkAddrEntry f = "{ \"&" ++ f ++ "\", mhs_addr_" ++ f ++ "},"+mkEntry :: ImpEnt -> String+mkEntry (ImpStatic _ _ Func f) = "{ \"" ++ f ++ "\", mhs_" ++ f ++ "},"+mkEntry (ImpStatic _ _ Ptr f) = "{ \"&" ++ f ++ "\", mhs_addr_" ++ f ++ "},"+mkEntry (ImpStatic i _ Value _) = "{ \"" ++ f ++ "\", mhs_" ++ f ++ "}," where f = unIdent' i+mkEntry _ = undefined iIO :: Ident iIO = mkIdent "Primitives.IO"@@ -73,26 +81,13 @@ iFunPtr :: Ident iFunPtr = mkIdent "Primitives.FunPtr" -mkStatic :: (String, EType) -> String-mkStatic (fn, t) =- let !(as, ior) = getArrows t- r = checkIO ior- n = length as- call = fn ++ "(" ++ intercalate ", " (zipWith mkArg as [0..]) ++ ")"- fcall =- if isUnit r then- call ++ "; mhs_from_Unit(s, " ++ show n ++ ")"- else- mkRet r n call- in mkMhsFun fn fcall- mkMhsFun :: String -> String -> String mkMhsFun fn body = "void mhs_" ++ fn ++ "(int s) { " ++ body ++ "; }" checkIO :: EType -> EType checkIO iot = case getApp iIO iot of- Nothing -> errorMessage (getSLoc iot) $ "foreign return type must be IO: " ++ showEType iot+ Nothing -> iot -- errorMessage (getSLoc iot) $ "foreign return type must be IO: " ++ showEType iot Just t -> t getApp :: Ident -> EType -> Maybe EType@@ -109,8 +104,8 @@ mkArg :: EType -> Int -> String mkArg t i = "mhs_to_" ++ cTypeName t ++ "(s, " ++ show i ++ ")" -mkAddr :: (String, EType) -> String-mkAddr (fn, iot) =+mkHdr :: (ImpEnt, EType) -> String+mkHdr (ImpStatic _ _ Ptr fn, iot) = let r = checkIO iot (s, _) = case getApp iPtr r of@@ -121,7 +116,26 @@ 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) =+ let !(as, ior) = getArrows t+ r = checkIO ior+ n = length as+ call = fn ++ "(" ++ intercalate ", " (zipWith mkArg as [0..]) ++ ")"+ fcall =+ if isUnit r then+ call ++ "; mhs_from_Unit(s, " ++ show n ++ ")"+ else+ mkRet r n call+ in mkMhsFun fn fcall+mkHdr (ImpStatic i _ Value val, iot) =+ let r = checkIO iot+ body = mkRet r 0 val+ in mkMhsFun (unIdent' i) body+mkHdr _ = undefined +unIdent' :: Ident -> String+unIdent' = unIdent . unQualIdent+ cTypeName :: EType -> String cTypeName (EApp (EVar ptr) _t) | ptr == iPtr = "Ptr" | ptr == iFunPtr = "FunPtr"@@ -151,18 +165,21 @@ "CSize", "CSSize", "CLLong",- "CULLong"+ "CULLong",+ "CTime" ] -- These are already in the runtime runtimeFFI :: [String] runtimeFFI = [ "GETRAW", "GETTIMEMILLI", "acos", "add_FILE", "add_utf8", "asin", "atan", "atan2", "calloc", "closeb",- "cos", "exp", "flushb", "fopen", "free", "getb", "getenv", "iswindows", "log", "lz77c", "malloc",+ "cos", "exp", "flushb", "fopen", "free", "getb", "getenv", "iswindows", "log", "malloc", "md5Array", "md5BFILE", "md5String", "memcpy", "memmove", "putb", "sin", "sqrt", "system", "tan", "tmpname", "ungetb", "unlink", "peekPtr", "pokePtr", "pokeWord", "peekWord", "add_lz77_compressor", "add_lz77_decompressor",+ "add_rle_compressor", "add_rle_decompressor",+ "add_bwt_compressor", "add_bwt_decompressor", "peek_uint8", "poke_uint8", "peek_uint16", "poke_uint16", "peek_uint32", "poke_uint32", "peek_uint64", "poke_uint64", "peek_int8", "poke_int8", "peek_int16", "poke_int16", "peek_int32", "poke_int32", "peek_int64", "poke_int64", "peek_ushort", "poke_ushort", "peek_short", "poke_short",@@ -171,5 +188,6 @@ "peek_ullong", "poke_ullong", "peek_llong", "poke_llong", "peek_flt", "poke_flt", "sizeof_int", "sizeof_long", "sizeof_llong",- "opendir", "closedir", "readdir", "c_d_name", "chdir", "mkdir", "getcwd"+ "opendir", "closedir", "readdir", "c_d_name", "chdir", "mkdir", "getcwd",+ "get_buf", "openb_rd_buf", "openb_wr_buf" ]
src/MicroHs/Fixity.hs view
@@ -1,4 +1,5 @@ module MicroHs.Fixity(resolveFixity) where+import Prelude(); import MHSPrelude import MicroHs.Expr import MicroHs.Ident
src/MicroHs/Flags.hs view
@@ -1,4 +1,5 @@ module MicroHs.Flags(Flags(..), verbosityGT, defaultFlags) where+import Prelude(); import MHSPrelude data Flags = Flags { verbose :: Int, -- verbosity level@@ -12,6 +13,7 @@ useTicks :: Bool, -- emit ticks doCPP :: Bool, -- run ccphs on input files cppArgs :: [String], -- flags for CPP+ cArgs :: [String], -- arguments for C compiler compress :: Bool, -- compress generated combinators buildPkg :: Maybe FilePath, -- build a package listPkg :: Maybe FilePath, -- list package contents@@ -37,6 +39,7 @@ useTicks = False, doCPP = False, cppArgs = [],+ cArgs = [], compress = False, buildPkg = Nothing, listPkg = Nothing,
src/MicroHs/Graph.hs view
@@ -12,6 +12,7 @@ stronglyConnComp, SCC(..) ) where+import Prelude(); import MHSPrelude import Data.List import Data.Maybe import qualified MicroHs.IntSet as IS
src/MicroHs/Ident.hs view
@@ -18,7 +18,7 @@ SLoc(..), noSLoc, showSLoc, ) where-import Prelude hiding(head)+import Prelude(); import MHSPrelude hiding(head) import Data.Char import Text.PrettyPrint.HughesPJLite import GHC.Stack@@ -130,13 +130,35 @@ isConIdent :: Ident -> Bool isConIdent i@(Ident _ t) = let c = headIdent i- in isUpper c || c == ':' || c == ',' || t == pack "[]" || t == pack "()"+ in isUpper c || c == ':' || c == ',' || t == pack "[]" || t == pack "()" || t == pack "->" isOperChar :: Char -> Bool-isOperChar c = elem c operChars- where operChars :: String- operChars = "@\\=+-:<>.!#$%^&*/|~?\x2237\x21d2\x2192\x2190\x2200"--- :: => -> <- forall+isOperChar '@' = True+isOperChar '\\' = True+isOperChar '=' = True+isOperChar '+' = True+isOperChar '-' = True+isOperChar ':' = True+isOperChar '<' = True+isOperChar '>' = True+isOperChar '.' = True+isOperChar '!' = True+isOperChar '#' = True+isOperChar '$' = True+isOperChar '%' = True+isOperChar '^' = True+isOperChar '&' = True+isOperChar '*' = True+isOperChar '/' = True+isOperChar '|' = True+isOperChar '~' = True+isOperChar '?' = True+isOperChar '\x2237' = True -- ::+isOperChar '\x21d2' = True -- =>+isOperChar '\x2192' = True -- ->+isOperChar '\x2190' = True -- <-+isOperChar '\x2200' = True -- forall+isOperChar _ = False isIdentChar :: Char -> Bool isIdentChar c = isLower_ c || isUpper c || isDigit c || c == '\''
src/MicroHs/IdentMap.hs view
@@ -11,11 +11,13 @@ fromListWith, fromList, delete, lookup,+ null, size, toList, elems, keys,+ merge, mapM, ) where-import Prelude hiding(lookup, mapM)+import Prelude(); import MHSPrelude hiding(lookup, mapM, null) import MicroHs.Ident data Map a@@ -69,6 +71,10 @@ size (One _ _) = 1 size (Node _ s _ _ _) = s +null :: forall a . Map a -> Bool+null Nil = True+null _ = False+ node :: forall a . Map a -> Ident -> a -> Map a -> Map a node Nil key val Nil = One key val node left key val right = Node left (size left + 1 + size right) key val right@@ -78,9 +84,10 @@ where look Nil = Nothing look (One key val) =- case compare k key of- EQ -> Just val- _ -> Nothing+ if k == key then+ Just val+ else+ Nothing look (Node left _ key val right) = case k `compare` key of LT -> look left@@ -181,3 +188,8 @@ doubleR (Node ll _ lk lv (Node lrl _ lrk lrv lrr)) k v r = node (node ll lk lv lrl) lrk lrv (node lrr k v r) doubleR (Node ll _ lk lv (One lrk lrv )) k v r = node (node ll lk lv Nil) lrk lrv (node Nil k v r) doubleR _ _ _ _ = undefined++-- Merge two maps. There is no guarantee which side "wins"+merge :: Map a -> Map a -> Map a+merge m1 m2 | size m1 <= size m2 = foldr (uncurry insert) m2 (toList m1)+ | otherwise = merge m2 m1
src/MicroHs/Instances.hs view
@@ -2,6 +2,7 @@ -- 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
src/MicroHs/IntMap.hs view
@@ -4,7 +4,7 @@ IntMap, empty, lookup, insert, fromList, toList, insertWith, (!), keys ) where-import Prelude hiding(lookup)+import Prelude(); import MHSPrelude hiding(lookup) data IntMap a = Empty@@ -12,6 +12,7 @@ | Node (IntMap a) (IntMap a) (IntMap a) (IntMap a) --Xderiving (Show) +{- -- This works for y>0 divModX :: Int -> Int -> (Int, Int) divModX x y =@@ -23,7 +24,13 @@ (q, r) else (q - 1, r + y)+-} +div4 :: Int -> Int+div4 i = {-if i < 0 then error "div4" else-} i `quot` 4+mod4 :: Int -> Int+mod4 i = {-if i < 0 then error "mod4" else-} i `rem` 4+ empty :: forall a . IntMap a empty = Empty @@ -34,10 +41,11 @@ Leaf i a -> if k == i then Just a else Nothing Node m0 m1 m2 m3 -> let- (d, m) = divModX k 4- in if m == 0 then lookup d m0- else if m == 1 then lookup d m1- else if m == 2 then lookup d m2+ d = div4 k+ m = mod4 k+ in if 0 == m then lookup d m0+ else if 1 == m then lookup d m1+ else if 2 == m then lookup d m2 else lookup d m3 insert :: forall a . Int -> a -> IntMap a -> IntMap a@@ -85,12 +93,24 @@ if k == i then Leaf k (comb a b) else- ins k $ insert i b $ Node Empty Empty Empty Empty+ ins k $ single i b Node m0 m1 m2 m3 -> let- (d, m) = divModX k 4- in if m == 0 then Node (ins d m0) m1 m2 m3- else if m == 1 then Node m0 (ins d m1) m2 m3- else if m == 2 then Node m0 m1 (ins d m2) m3+ d = div4 k+ m = mod4 k+ in if 0 == m then Node (ins d m0) m1 m2 m3+ else if 1 == m then Node m0 (ins d m1) m2 m3+ else if 2 == m then Node m0 m1 (ins d m2) m3 else Node m0 m1 m2 (ins d m3) in ins ak++single :: Int -> a -> IntMap a+single k a = --insert k a $ Node Empty Empty Empty Empty+ let+ m = mod4 k+ d = div4 k+ l = Leaf d a+ in if 0 == m then Node l Empty Empty Empty+ else if 1 == m then Node Empty l Empty Empty+ else if 2 == m then Node Empty Empty l Empty+ else Node Empty Empty Empty l
src/MicroHs/IntSet.hs view
@@ -4,6 +4,7 @@ IntSet, empty, member, insert, fromList, toList ) where+import Prelude(); import MHSPrelude import qualified MicroHs.IntMap as M newtype IntSet = I (M.IntMap ())
src/MicroHs/Interactive.hs view
@@ -1,4 +1,5 @@ module MicroHs.Interactive(module MicroHs.Interactive) where+import Prelude(); import MHSPrelude import Data.List import Data.Maybe import Data.Version@@ -270,15 +271,11 @@ getTypeInCache :: Cache -> Ident -> EType getTypeInCache cash i =- case getCModule cash of- TModule _ _ _ _ _ _ vals _ ->- head $ [ t | ValueExport i' (Entry _ t) <- vals, i == i' ] ++ [undefined]+ head $ [ t | ValueExport i' (Entry _ t) <- tValueExps (getCModule cash), i == i' ] ++ [undefined] getKindInCache :: Cache -> Ident -> EType getKindInCache cash i =- case getCModule cash of- TModule _ _ tys _ _ _ _ _ ->- head $ [ k | TypeExport i' (Entry _ k) _ <- tys, i == i' ] ++ [undefined]+ head $ [ k | TypeExport i' (Entry _ k) _ <- tTypeExps (getCModule cash), i == i' ] ++ [undefined] -- This could be smarter: -- ":a" should complete with commands
src/MicroHs/Lex.hs view
@@ -2,9 +2,10 @@ Token(..), showToken, tokensLoc, LexState, lexTopLS,- popLayout, lex+ popLayout, lex,+ readInt, ) where-import Prelude hiding(lex)+import Prelude(); import MHSPrelude hiding(lex) import Data.Char import Data.List import MicroHs.Ident@@ -26,7 +27,7 @@ | TBrace SLoc -- {n} in the Haskell report | TIndent SLoc -- <n> in the Haskell report | TPragma SLoc String -- a {-# PRAGMA #-}- | TEnd+ | TEnd SLoc | TRaw [Token] deriving (Show) @@ -43,7 +44,7 @@ showToken (TBrace _) = "TBrace" showToken (TIndent _) = "TIndent" showToken (TPragma _ s) = "{-# " ++ s ++ " #-}"-showToken TEnd = "EOF"+showToken (TEnd _) = "EOF" showToken (TRaw _) = "TRaw" incrLine :: SLoc -> SLoc@@ -85,8 +86,20 @@ lex loc cs@(d:_) | isDigit d = number loc cs lex loc ('.':cs@(d:_)) | isLower_ d = TSpec loc '.' : lex (addCol loc 1) cs-lex loc (c:cs@(d:_)) | (c == '!' || c == '~') && (d == '(' || d == '[' || isIdentChar d) = -- XXX hacky way to make ~ a TSpec- TSpec loc c : lex (addCol loc 1) cs+-- Recognize #line 123 "file/name.hs"+lex loc ('#':xcs) | (SLoc _ _ 1) <- loc, Just cs <- stripPrefix "line " xcs =+ 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 '"' + loc' = SLoc file (readInt (ws!!0) - 1) 1+ in lex loc' rs+lex loc ('!':' ':cs) = -- ! followed by a space is always an operator+ TIdent loc [] "!" : lex (addCol loc 2) cs+lex loc (c:cs@(d:_)) | isSpecSing c && not (isOperChar d) = -- handle reserved+ TSpec loc c :+ let ts = lex (addCol loc 1) cs+ in if c == '\\' then tLam ts else ts lex loc (d:cs) | isOperChar d = case span isOperChar cs of (ds, rs) -> TIdent loc [] (d:ds) : lex (addCol loc $ 1 + length ds) rs@@ -100,7 +113,7 @@ in case takeChars loc tchar '\'' (addCol loc 1) [] cs of -- XXX head of (t, loc', rs) -> t : lex loc' rs lex loc (d:_) = [TError loc $ "Unrecognized input: " ++ show d]-lex _ [] = []+lex loc [] = [TEnd loc] nested :: SLoc -> [Char] -> [Token] nested loc ('#':cs) = pragma loc cs@@ -126,13 +139,13 @@ number loc cs = case span isDigit cs of (ds, rs) | null rs || not (head rs == '.') || (take 2 rs) == ".." ->- let i = read ds- in TInt loc i : lex (addCol loc $ length ds) rs+ case expo rs of+ Nothing -> TInt loc (readBase 10 ds) : lex (addCol loc $ length ds) rs+ Just (es, rs') -> mkD (ds ++ es) rs' | otherwise -> case span isDigit (tail rs) of (ns, rs') -> let s = ds ++ '.':ns- mkD x r = TRat loc (readRational x) : lex (addCol loc $ length x) r in case expo rs' of Nothing -> mkD s rs' Just (es, rs'') -> mkD (s ++ es) rs''@@ -141,6 +154,7 @@ expo (e:'+':xs@(d:_)) | toLower e == 'e' && isDigit d = Just ('e':'+':as, bs) where (as, bs) = span isDigit xs expo (e: xs@(d:_)) | toLower e == 'e' && isDigit d = Just ('e': as, bs) where (as, bs) = span isDigit xs expo _ = Nothing+ mkD x r = TRat loc (readRational x) : lex (addCol loc $ length x) r -- Skip a {- -} style comment skipNest :: SLoc -> Int -> String -> [Token]@@ -219,11 +233,30 @@ conv b k r (c:ds) | isHexDigit c, let { n = digitToInt c }, n < b = conv b (k+1) (r * b + n) ds conv _ k r ds = (chr r, k, ds) +-- These characters are single characters token, no matter what. isSpec :: Char -> Bool-isSpec c = elem c specChars- where specChars :: String- specChars = "()[],{}`;"+isSpec '(' = True+isSpec ')' = True+isSpec '[' = True+isSpec ']' = True+isSpec '{' = True+isSpec '}' = True+isSpec ',' = True+isSpec ';' = True+isSpec '`' = True+isSpec _ = False +-- These characters are single characters token,+-- if not part of an operator.+isSpecSing :: Char -> Bool+isSpecSing '=' = True+isSpecSing '|' = True+isSpecSing '\\' = True+isSpecSing '@' = True+isSpecSing '!' = True+isSpecSing '~' = True+isSpecSing _ = False+ upperIdent :: SLoc -> SLoc -> [String] -> String -> [Token] --upperIdent l c qs acs | trace (show (l, c, qs, acs)) False = undefined upperIdent loc sloc qs acs =@@ -240,17 +273,27 @@ } _ -> TIdent sloc (reverse qs) ds : lex (addCol loc $ length ds) rs +-- For LambdaCase+tLam :: [Token] -> [Token]+tLam (t@(TIdent _ [] "case") : ts) = t : tBrace ts+tLam ts = ts+ tIdent :: SLoc -> [String] -> String -> [Token] -> [Token] tIdent loc qs kw ats | elem kw ["let", "where", "do", "of"]+ || kw == "if" && isBar ats -- For MultiWayIf = ti : tBrace ats | otherwise = ti : ats where+ isBar (TSpec _ '|' : _) = True+ isBar _ = False+ ti = TIdent loc qs kw - tBrace ts@(TSpec _ '{' : _) = ts- tBrace ts@(TIndent _ : TSpec _ '{' : _) = ts- tBrace (TIndent _ : ts) = TBrace (tokensLoc ts) : ts- tBrace ts = TBrace (tokensLoc ts) : ts+tBrace :: [Token] -> [Token]+tBrace ts@(TSpec _ '{' : _) = ts+tBrace ts@(TIndent _ : TSpec _ '{' : _) = ts+tBrace (TIndent _ : ts) = TBrace (tokensLoc ts) : ts+tBrace ts = TBrace (tokensLoc ts) : ts tokensLoc :: [Token] -> SLoc tokensLoc (TIdent loc _ _:_) = loc@@ -263,11 +306,15 @@ tokensLoc (TBrace loc :_) = loc tokensLoc (TIndent loc :_) = loc tokensLoc (TPragma loc _ :_) = loc+tokensLoc (TEnd loc :_) = loc tokensLoc _ = mkLocEOF readBase :: Integer -> String -> Integer readBase b = foldl (\ r c -> r * b + toInteger (digitToInt c)) 0 +readInt :: String -> Int+readInt = fromInteger . readBase 10+ -- XXX This is a pretty hacky recognition of pragmas. pragma :: SLoc -> [Char] -> [Token] pragma loc cs =@@ -298,8 +345,9 @@ layoutLS ts ms Raw = (TRaw ts, LS $ layoutLS ts ms ) layoutLS ts mms Pop = case (mms, ts) of - (m:ms,_:_) | m/=0 -> ( TEnd, LS $ layoutLS ts ms )+ (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 layoutLS tts@(TIndent x : ts) mms@(m : ms) _ | n == m = (TSpec (tokensLoc ts) ';', LS $ layoutLS ts mms ) | n < m = (TSpec (tokensLoc ts) '>', LS $ layoutLS tts ms ) where {n = getCol x} layoutLS (TIndent _ : ts) ms _ = layoutLS ts ms Next@@ -309,9 +357,10 @@ layoutLS (t@(TSpec _ '}') : ts) (0 : ms) _ = ( t, LS $ layoutLS ts ms ) layoutLS ( (TSpec l '}') : _) _ _ = (TError l "layout error }",LS $ layoutLS [] [] ) layoutLS (t@(TSpec _ '{') : ts) ms _ = ( t, LS $ layoutLS ts (0:ms))+layoutLS ts@(t@(TEnd _) : _) [] _ = ( t, LS $ layoutLS ts [] ) -- repeat the TEnd token+layoutLS ts@(TEnd l : _) (_ : ms) _ = (TSpec l '>' , LS $ layoutLS ts ms ) -- insert '>' and try again layoutLS (t : ts) ms _ = ( t, LS $ layoutLS ts ms )-layoutLS [] (_ : ms) _ = (TSpec mkLocEOF '>' , LS $ layoutLS [] ms )-layoutLS [] [] _ = (TEnd , LS $ layoutLS [] [] )+layoutLS [] _ _ = error "layoutLS" instance TokenMachine LexState Token where tmNextToken (LS f) = f Next@@ -336,6 +385,7 @@ lexTopLS :: FilePath -> String -> LexState lexTopLS f s = LS $ layoutLS (lexStart $ lex (SLoc f 1 1) s) []+ -- error $ show $ map showToken $ lex (SLoc f 1 1) s ----------- @@ -350,16 +400,16 @@ (ds1, cr1) | ('.':r1) <- cr1 -> rat2 f1 r1 | (c:r1) <- cr1, toLower c == 'e' -> rat3 f1 r1 | otherwise -> f1- where f1 = toRational (read ds1 :: Integer)+ where f1 = toRational (readBase 10 ds1) rat2 f1 s2 = case span isDigit s2 of (ds2, cr2) | (c:r2) <- cr2, toLower c == 'e' -> rat3 f2 r2 | otherwise -> f2- where f2 = f1 + toRational (read ds2 :: Integer) * 10 ^^ (negate $ length ds2)+ where f2 = f1 + toRational (readBase 10 ds2) * 10 ^^ (negate $ length ds2) rat3 f2 ('+':s) = f2 * expo s rat3 f2 ('-':s) = f2 / expo s rat3 f2 s = f2 * expo s - expo s = 10 ^ (read s :: Int)+ expo s = 10 ^ (readBase 10 s)
src/MicroHs/List.hs view
@@ -1,6 +1,7 @@ -- Copyright 2023 Lennart Augustsson -- See LICENSE file for full license. module MicroHs.List where+import Prelude(); import MHSPrelude import Data.List -- Various useful list functions.
src/MicroHs/Main.hs view
@@ -2,6 +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 Data.Char import Data.List import Data.Version@@ -15,6 +16,7 @@ import MicroHs.FFI import MicroHs.Flags import MicroHs.Ident+import MicroHs.Lex(readInt) import MicroHs.List import MicroHs.Package import MicroHs.Translate@@ -53,7 +55,7 @@ Nothing -> if installPkg flags then mainInstallPackage flags mdls else withArgs rargs $ do- when (verbosityGT flags 0) $+ when (verbosityGT flags 1) $ putStrLn $ "flags = " ++ show flags case mdls of [] -> mainInteractive flags@@ -61,7 +63,7 @@ _ -> error usage usage :: String-usage = "Usage: mhs [--version] [--numeric-version] [-v] [-q] [-l] [-r] [-C[R|W]] [-XCPP] [-Ddef] [-T] [-z] [-iPATH] [-oFILE] [-a[PATH]] [-LPATH] [-PPKG] [-Q PKG [DIR]] [-tTARGET] [ModuleName...]"+usage = "Usage: mhs [--version] [--numeric-version] [-v] [-q] [-l] [-r] [-C[R|W]] [-XCPP] [-Ddef] [-IPATH] [-T] [-z] [-iPATH] [-oFILE] [-a[PATH]] [-LPATH] [-PPKG] [-Q PKG [DIR]] [-tTARGET] [ModuleName...]" -- Drop trailing '/foo' dropTrailing :: Int -> FilePath -> FilePath@@ -86,6 +88,8 @@ "-Q" -> decodeArgs f{installPkg = True} mdls args '-':'i':[] -> decodeArgs f{paths = []} mdls args '-':'i':s -> decodeArgs f{paths = paths f ++ [s]} mdls args+ '-':'o':[] | s : args' <- args+ -> decodeArgs f{output = s} mdls args' '-':'o':s -> decodeArgs f{output = s} mdls args '-':'t':s -> decodeArgs f{target = s} mdls args '-':'D':_ -> decodeArgs f{cppArgs = cppArgs f ++ [arg]} mdls args@@ -95,7 +99,10 @@ '-':'a':s -> decodeArgs f{pkgPath = s : pkgPath f} mdls args '-':'L':s -> decodeArgs f{listPkg = Just s} mdls args '-':_ -> error $ "Unknown flag: " ++ arg ++ "\n" ++ usage- _ -> decodeArgs f (mdls ++ [arg]) args+ _ | ".c" `isSuffixOf` arg || ".o" `isSuffixOf` arg || ".a" `isSuffixOf` arg+ -> decodeArgs f{cArgs = cArgs f ++ [arg]} mdls args+ | otherwise+ -> decodeArgs f (mdls ++ [arg]) args readTargets :: Flags -> FilePath -> IO [Target]@@ -108,7 +115,7 @@ tgFile <- readFile tgFilePath case parseTargets tgFilePath tgFile of Left e -> do- putStrLn $ "Can't read " ++ tgFilePath+ putStrLn $ "Cannot parse " ++ tgFilePath when (verbose flags > 0) $ putStrLn e return []@@ -154,22 +161,32 @@ pkg = Package { pkgName = mkIdent name, pkgVersion = ver , pkgCompiler = mhsVersion , pkgExported = exported, pkgOther = other+ , pkgTables = getCacheTables cash , pkgDepends = pkgDeps } --print (map tModuleName $ pkgOther pkg)+ t1 <- getTimeMilli when (verbose flags > 0) $ putStrLn $ "Writing package " ++ namever ++ " to " ++ output flags writeSerializedCompressed (output flags) pkg+ t2 <- getTimeMilli+ when (verbose flags > 0) $+ putStrLn $ "Compression time " ++ show (t2 - t1) ++ " ms" splitNameVer :: String -> (String, Version) splitNameVer s = case span (\ c -> isDigit c || c == '.') (reverse s) of (rver, '-':rname) | is@(_:_) <- readVersion (reverse rver) -> (reverse rname, makeVersion is) _ -> error $ "package name not of the form name-version:" ++ show s- where readVersion = map read . words . map (\ c -> if c == '.' then ' ' else c)+ where readVersion = map readInt . words . map (\ c -> if c == '.' then ' ' else c) mainListPkg :: Flags -> FilePath -> IO () mainListPkg _flags pkgfn = do pkg <- readSerialized pkgfn+ putStrLn $ "name: " ++ showIdent (pkgName pkg)+ putStrLn $ "version: " ++ showVersion (pkgVersion pkg)+ putStrLn $ "compiler: mhs-" ++ pkgCompiler pkg+ putStrLn $ "depends: " ++ unwords (map (\ (i, v) -> showIdent i ++ "-" ++ showVersion v) (pkgDepends pkg))+ let list = mapM_ (putStrLn . (" " ++) . showIdent . tModuleName) putStrLn "exposed-modules:" list (pkgExported pkg)@@ -178,11 +195,11 @@ mainCompile :: Flags -> Ident -> IO () mainCompile flags mn = do- (rmn, allDefs) <- do+ (cash, (rmn, allDefs)) <- do cash <- getCached flags (rds, _, cash') <- compileCacheTop flags mn cash maybeSaveCache flags cash'- return rds+ return (cash', rds) t1 <- getTimeMilli let@@ -225,8 +242,20 @@ ct1 <- getTimeMilli mcc <- lookupEnv "MHSCC" let dir = mhsdir flags+ ppkgs = map fst $ getPathPkgs cash+ incDirs = map (convertToInclude "/include") ppkgs+ cDirs = map (convertToInclude "/cbits") ppkgs+ incDirs' <- filterM doesDirectoryExist incDirs+ cDirs' <- filterM doesDirectoryExist cDirs+ --print (map fst $ getPathPkgs cash, incDirs, incDirs')+ let incs = unwords $ map ("-I" ++) incDirs' TTarget _ compiler conf <- readTarget flags dir- let cc = fromMaybe (compiler ++ " -w -Wall -O3 -I" ++ dir ++ "/src/runtime " ++ dir ++ "/src/runtime/eval-" ++ conf ++ ".c " ++ " $IN -lm -o $OUT") mcc+ let dcc = compiler ++ " -w -Wall -O3 -I" ++ dir ++ "/src/runtime " +++ incs ++ " " ++ dir ++ "/src/runtime/eval-" ++ conf ++ ".c " +++ unwords (cArgs flags) +++ unwords (map (++ "/*.c") cDirs') +++ " $IN -lm -o $OUT"+ cc = fromMaybe dcc mcc cmd = substString "$IN" fn $ substString "$OUT" outFile cc when (verbosityGT flags 0) $ putStrLn $ "Execute: " ++ show cmd@@ -261,11 +290,14 @@ first:_ -> mainInstallPackage flags [pkgfn, first] mainInstallPackage _ _ = error usage --------------------getMhsDir :: IO FilePath-getMhsDir = do- md <- lookupEnv "MHSDIR"- case md of- Just d -> return d- Nothing -> getDataDir+-- Convert something like+-- .../.mcabal/mhs-0.10.3.0/packages/base-0.10.3.0.pkg+-- into+-- .../.mcabal/mhs-0.10.3.0/data/base-0.10.3.0/include+convertToInclude :: String -> FilePath -> FilePath+convertToInclude inc pkgPath =+ let path1 = init $ dropWhileEnd (/= '/') pkgPath -- .../.mcabal/mhs-0.10.3.0/packages+ base1 = takeWhileEnd (/= '/') pkgPath -- base-0.10.3.0.pkg+ base2 = init $ dropWhileEnd (/= '.') base1 -- base-0.10.3.0+ path2 = dropWhileEnd (/= '/') path1 -- .../.mcabal/mhs-0.10.3.0/+ in path2 ++ "data/" ++ base2 ++ inc -- .../.mcabal/mhs-0.10.3.0/data/base-0.10.3.0/include
src/MicroHs/MakeCArray.hs view
@@ -1,6 +1,7 @@ -- Copyright 2023 Lennart Augustsson -- See LICENSE file for full license. module MicroHs.MakeCArray(makeCArray) where+import Prelude(); import MHSPrelude import Data.Char import MicroHs.Flags import qualified System.Compress as C
src/MicroHs/Package.hs view
@@ -2,10 +2,11 @@ IdentPackage, Package(..), ) where+import Prelude(); import MHSPrelude import Data.Version import MicroHs.Desugar(LDef) import MicroHs.Ident(Ident)-import MicroHs.TypeCheck(TModule)+import MicroHs.TypeCheck(TModule, GlobTables) -- -- Packages are organized as follows:@@ -30,6 +31,7 @@ pkgCompiler :: String, -- compiler version that created the package pkgExported :: [TModule [LDef]], -- exported modules pkgOther :: [TModule [LDef]], -- non-exported modules+ pkgTables :: GlobTables, -- global tables pkgDepends :: [(IdentPackage, Version)] -- used packages } -- deriving (Show)
src/MicroHs/Parse.hs view
@@ -2,6 +2,7 @@ -- 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) where+import Prelude(); import MHSPrelude import Control.Applicative import Control.Monad import Data.Char@@ -43,8 +44,8 @@ eof = do t <- nextToken case t of- TEnd -> pure ()- _ -> fail "eof"+ TEnd _ -> pure ()+ _ -> fail "eof" pTop :: P EModule pTop = (pModule <|< pModuleEmpty) <* eof@@ -170,6 +171,8 @@ pQSymOper = do let is (TIdent loc qs s) | not (isAlpha_ (head s)) && not (elem s reservedOps) = Just (qualName loc qs s)+ is (TSpec loc '!') = Just (mkIdentSLoc loc "!")+ is (TSpec loc '~') = Just (mkIdentSLoc loc "~") is _ = Nothing satisfyM "QSymOper" is @@ -177,6 +180,7 @@ pSymOper = do let is (TIdent loc [] s) | not (isAlpha_ (head s)) && not (elem s reservedOps) = Just (mkIdentSLoc loc s)+ is (TSpec loc '!') = Just (mkIdentSLoc loc "!") is _ = Nothing satisfyM "SymOper" is @@ -209,7 +213,7 @@ pLSymOper = guardM pSymOper (not . isUOper) reservedOps :: [String]-reservedOps = ["=", "|", "::", "<-", "@", "..", "->",+reservedOps = ["::", "<-", "..", "->", "\x2237", "\x2192"] -- :: and -> pUQIdentSym :: P Ident@@ -278,9 +282,9 @@ as <- p pSpec '}' pure as- <|>+ <|< do- pSpec '<'+ pSpec '<' -- synthetic '{' (i.e., layout) as <- p -- If we are at a '>' token (i.e., synthetic '}') then -- all is well, if not then there is a parse error and we try@@ -301,12 +305,13 @@ pDef :: P EDef pDef = uncurry Data <$> (pKeyword "data" *> pData) <*> pDeriving- <|< Newtype <$> (pKeyword "newtype" *> pLHS) <*> (pSymbol "=" *> (Constr [] [] <$> pUIdentSym <*> pField)) <*> pDeriving- <|< Type <$> (pKeyword "type" *> pLHS) <*> (pSymbol "=" *> pType)+ <|< Newtype <$> (pKeyword "newtype" *> pLHS) <*> (pSpec '=' *> (Constr [] [] <$> pUIdentSym <*> pField)) <*> pDeriving+ <|< Type <$> (pKeyword "type" *> pLHS) <*> (pSpec '=' *> pType) <|< uncurry Fcn <$> pEqns <|< Sign <$> ((esepBy1 pLIdentSym (pSpec ',')) <* dcolon) <*> pType <|< Import <$> (pKeyword "import" *> pImportSpec)- <|< ForImp <$> (pKeyword "foreign" *> pKeyword "import" *> pKeyword "ccall" *> eoptional pString) <*> pLIdent <*> (pSymbol "::" *> pType)+ <|< ForImp <$> (pKeyword "foreign" *> pKeyword "import" *> (pKeyword "ccall" <|> pKeyword "capi")+ *> eoptional (pKeyword "unsafe") *> eoptional pString) <*> pLIdent <*> (pSymbol "::" *> pType) <|< Infix <$> ((,) <$> pAssoc <*> pPrec) <*> esepBy1 pTypeOper (pSpec ',') <|< Class <$> (pKeyword "class" *> pContext) <*> pLHS <*> pFunDeps <*> pWhere pClsBind <|< Instance <$> (pKeyword "instance" *> pType) <*> pWhere pInstBind@@ -320,12 +325,12 @@ dig _ = Nothing pPrec = satisfyM "digit" dig - pFunDeps = (pSymbol "|" *> esepBy1 pFunDep (pSpec ',')) <|< pure []+ pFunDeps = (pSpec '|' *> esepBy1 pFunDep (pSpec ',')) <|< pure [] pFunDep = (,) <$> esome pLIdent <*> (pSRArrow *> esome pLIdent) pField = guardM pFields ((== 1) . either length length) dcolon = pSymbol "::" <|< pSymbol "\x2237" - pPatternDef = (pSymbol "=" *> pPatAndExp) <|< (pSymbol "<-" *> pPat)+ pPatternDef = (pSpec '=' *> pPatAndExp) <|< (pSymbol "<-" *> pPat) pPatAndExp = do p <- pPat; guard (isExp p); pure p -- Is a pattern also an expression?@@ -340,7 +345,7 @@ pData :: P (LHS, [Constr]) pData = do lhs <- pLHS- let pConstrs = pSymbol "=" *> esepBy1 pConstr (pSymbol "|")+ let pConstrs = pSpec '=' *> esepBy1 pConstr (pSpec '|') ((,) lhs <$> pConstrs) <|< pGADT lhs <|< pure (lhs, [])@@ -393,20 +398,26 @@ pConstr :: P Constr pConstr = (Constr <$> pForall <*> pContext <*> pUIdentSym <*> pFields)- <|< ((\ vs ct t1 c t2 -> Constr vs ct c (Left [t1, t2])) <$>- pForall <*> pContext <*> pSAType <*> pUSymOper <*> pSAType)+ <|> ((\ vs ct t1 c t2 -> Constr vs ct c (Left [t1, t2])) <$> -- <|> needed+ pForall <*> pContext <*> pSTypeApp <*> pUSymOper <*> pSTypeApp) + 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 ',') <* pSymbol "::") <*> pSType) (pSpec ',') <* pSpec '}')) where flat (is, t) = [ (i, t) | i <- is ] +-- XXX This is a mess. pSAType :: P (Bool, EType) pSAType = (,) <$> pStrict <*> pAType pSType :: P (Bool, EType) pSType = (,) <$> pStrict <*> pType pSTypeApp :: P (Bool, EType)-pSTypeApp = (,) <$> pStrict <*> pTypeApp+pSTypeApp = do+ s <- pStrict+ t <- if s then pAType else pTypeApp+ pure (s, t) pStrict :: P Bool pStrict = (True <$ pSpec '!') <|< pure False @@ -421,7 +432,7 @@ 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 ',')))@@ -437,7 +448,7 @@ pConList :: P (Maybe [Ident]) pConList = (Nothing <$ pSymbol "..")- <|< (Just <$> esepBy1 (pQIdent <|> pParens pSymOper) (pSpec ','))+ <|< (Just <$> esepBy (pQIdent <|< pParens pSymOper) (pSpec ',')) -------- -- Types@@ -458,7 +469,7 @@ pType = do vs <- pForall t <- pTypeOp- pure $ if null vs then t else EForall vs t+ pure $ if null vs then t else EForall True vs t pForall :: P [IdKind] pForall = (forallKW *> esome pIdKind <* pSymbol ".") <|< pure []@@ -477,10 +488,7 @@ pTypeApp = do f <- pAType as <- emany pAType- mt <- eoptional (pSymbol "::" *> pType)- let- r = foldl EApp f as- pure $ maybe r (ESign r) mt+ pure $ foldl EApp f as pAType :: P Expr pAType =@@ -502,7 +510,7 @@ pAPat = (do i <- pLIdentSym- (EAt i <$> (pSymbol "@" *> pAPat)) <|< pure (EVar i)+ (EAt i <$> (pSpec '@' *> pAPat)) <|< pure (EVar i) ) <|< (evar <$> pUQIdentSym <*> optional pUpdate) <|< pLit@@ -528,10 +536,7 @@ f <- pAPat as <- emany pAPat guard (null as || isPConApp f)- mt <- eoptional (pSymbol "::" *> pType)- let- r = foldl EApp f as- pure $ maybe r (ESign r) mt+ pure $ foldl EApp f as pPatNotVar :: P EPat pPatNotVar = guardM pPat isPConApp@@ -552,7 +557,7 @@ pEqn :: (Ident -> Int -> Bool) -> P (Ident, Eqn) pEqn test = do (name, pats) <- pEqnLHS- alts <- pAlts (pSymbol "=")+ alts <- pAlts (pSpec '=') guard (test name (length pats)) pure (name, Eqn pats alts) @@ -575,9 +580,12 @@ pAltsL :: P () -> P [EAlt] pAltsL sep =- esome ((,) <$> (pSymbol "|" *> esepBy1 pStmt (pSpec ',')) <*> (sep *> pExpr))+ esome (pAlt sep) <|< ((\ e -> [([], e)]) <$> (sep *> pExpr)) +pAlt :: P () -> P EAlt+pAlt sep = (,) <$> (pSpec '|' *> esepBy1 pStmt (pSpec ',')) <*> (sep *> pExpr)+ pWhere :: P EBind -> P [EBind] pWhere pb = (pKeyword "where" *> pBlock pb)@@ -605,14 +613,18 @@ pExprApp = do f <- pAExpr as <- emany pAExpr- mt <- eoptional (pSymbol "::" *> pType)- let- r = foldl EApp f as- pure $ maybe r (ESign r) mt+ pure $ foldl EApp f as pLam :: P Expr-pLam = eLam <$> (pSymbol "\\" *> esome pAPat) <*> (pSRArrow *> pExpr)+pLam =+ pSpec '\\' *>+ ( eLam <$> esome pAPat <*> (pSRArrow *> pExpr)+ <|< eLamCase <$> (pKeyword "case" *> pBlock pCaseArm)+ ) +eLamCase :: [ECaseArm] -> Expr+eLamCase as = ELam [ Eqn [p] a | (p, a) <- as ]+ pCase :: P Expr pCase = ECase <$> (pKeyword "case" *> pExpr) <*> (pKeyword "of" *> pBlock pCaseArm) @@ -623,10 +635,17 @@ pLet = ELet <$> (pKeyword "let" *> pBlock pBind) <*> (pKeyword "in" *> pExpr) pDo :: P Expr-pDo = EDo <$> ((Just <$> pQualDo) <|< (Nothing <$ pKeyword "do")) <*> pBlock pStmt+pDo = 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) <*> (pKeyword "then" *> pExpr) <*> (eoptional (pSpec ';') *> pKeyword "else" *> pExpr)+pIf = EIf <$> (pKeyword "if" *> pExpr) <*>+ (eoptional (pSpec ';') *> pKeyword "then" *> pExpr) <*>+ (eoptional (pSpec ';') *> pKeyword "else" *> pExpr)+ <|< EMultiIf <$> (EAlts <$> (pKeyword "if" *> pBlock (pAlt (pSymbol "->"))) <*> pure []) pQualDo :: P Ident pQualDo = do@@ -659,7 +678,7 @@ where pEField = do fs <- (:) <$> pLIdentSym <*> many pSelect- EField fs <$> (pSymbol "=" *> pExpr) <|< pure (EFieldPun fs)+ EField fs <$> (pSpec '=' *> pExpr) <|< pure (EFieldPun fs) <|< (EFieldWild <$ pSymbol "..") @@ -673,8 +692,8 @@ <|< pLit <|< (eTuple <$> (pSpec '(' *> esepBy1 pExpr (pSpec ',') <* pSpec ')')) <|< EListish <$> (pSpec '[' *> pListish <* pSpec ']')- <|< (ESectL <$> (pSpec '(' *> pExprArg) <*> (pOperComma <* pSpec ')'))- <|< (ESectR <$> (pSpec '(' *> pOperCommaNoMinus) <*> (pExprArg <* pSpec ')'))+ <|< (ESectL <$> (pSpec '(' *> pExprOp) <*> (pOperComma <* pSpec ')'))+ <|< (ESectR <$> (pSpec '(' *> pOperCommaNoMinus) <*> (pExprOp <* pSpec ')')) <|< (ESelect <$> (pSpec '(' *> esome pSelect <* pSpec ')')) <|< (ELit noSLoc . LPrim <$> (pKeyword "primitive" *> pString)) )@@ -692,7 +711,7 @@ <|< (LFromThen e1 e2 <$ pSymbol "..") <|< pure (LList [e1,e2]) (pSpec ',' *> pMore)- <|< (LCompr e1 <$> (pSymbol "|" *> esepBy1 pStmt (pSpec ',')))+ <|< (LCompr e1 <$> (pSpec '|' *> esepBy1 pStmt (pSpec ','))) <|< (LFromTo e1 <$> (pSymbol ".." *> pExpr)) <|< (LFrom e1 <$ pSymbol "..") <|< pure (LList [e1])@@ -704,7 +723,13 @@ pExprArgNeg = (pSymbol "-" *> (ENegApp <$> pExprArg)) <|< pExprArg pOperators :: P Ident -> P Expr -> P Expr-pOperators oper one = eOper <$> one <*> emany ((,) <$> oper <*> one)+pOperators oper one = do+ r <- pOperators' oper one+ mt <- eoptional (pSymbol "::" *> pType)+ pure $ maybe r (ESign r) mt++pOperators' :: P Ident -> P Expr -> P Expr+pOperators' oper one = eOper <$> one <*> emany ((,) <$> oper <*> one) where eOper e [] | notNeg e = e eOper e ies = EOper e ies notNeg (ENegApp _) = False@@ -715,7 +740,8 @@ pBind :: P EBind pBind = - BPat <$> (pPatNotVar <* pSymbol "=") <*> pExpr+ BPat <$> pPatNotVar <*> ((pSpec '=' *> pExpr)+ <|< (EMultiIf <$> pAlts (pSpec '='))) <|< pClsBind pClsBind :: P EBind@@ -733,7 +759,7 @@ eTuple :: [Expr] -> Expr eTuple [] = error "eTuple"-eTuple [e] = e+eTuple [e] = EParen e eTuple es = ETuple es isAlpha_ :: Char -> Bool
src/MicroHs/State.hs view
@@ -1,6 +1,7 @@ module MicroHs.State( module MicroHs.State, ) where+import Prelude(); import MHSPrelude import Control.Monad --import Control.Monad.Fail
src/MicroHs/StateIO.hs view
@@ -8,6 +8,7 @@ module Control.Monad, module Data.Functor, ) where+import Prelude(); import MHSPrelude import Control.Applicative import Control.Monad import Data.Functor hiding(unzip)
src/MicroHs/SymTab.hs view
@@ -12,10 +12,12 @@ stInsertLcl, mapMSymTab, ) where+import Prelude(); import MHSPrelude import Control.Applicative import Data.List+import MicroHs.Builtin(builtinMdl) import MicroHs.Expr(Expr(..), EType, conIdent)-import MicroHs.Ident(Ident, showIdent)+import MicroHs.Ident(Ident, showIdent, unIdent, mkIdentSLoc, slocIdent) import MicroHs.List import qualified MicroHs.IdentMap as M @@ -82,12 +84,19 @@ case lookup i l of Just e -> Right e Nothing ->- case M.lookup i ug <|> M.lookup i qg of+ case M.lookup i ug <|> M.lookup i qg <|> M.lookup (hackBuiltin i) ug of Just [e] -> Right e Just es -> Left $ "ambiguous " ++ msg ++ ": " ++ showIdent i ++ " " ++ showListS showIdent [ getIdent e | Entry e _ <- es ] Nothing -> Left $ "undefined " ++ msg ++ ": " ++ showIdent i -- ++ "\n" ++ show lenv ++ "\n" ++ show genv++-- When a module uses 'import 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 | Just ('.':s) <- stripPrefix builtinMdl (unIdent i) = mkIdentSLoc (slocIdent i) s+hackBuiltin i = i stFromList :: [(Ident, [Entry])] -> [(Ident, [Entry])] -> SymTab stFromList us qs = SymTab [] (M.fromListWith union us) (M.fromListWith union qs)
src/MicroHs/TCMonad.hs view
@@ -3,6 +3,7 @@ module MicroHs.TCMonad, get, put, gets, modify, ) where+import Prelude(); import MHSPrelude import Data.Functor.Identity import GHC.Stack import Control.Applicative@@ -14,6 +15,7 @@ import qualified MicroHs.IntMap as IM import MicroHs.State import MicroHs.SymTab+import Debug.Trace ----------------------------------------------- -- TC@@ -30,6 +32,13 @@ instance MonadFail Identity where fail = error +tcTrace :: String -> TC s ()+--tcTrace _ = return ()+tcTrace msg = do+ s <- get+ let s' = trace msg s+ seq s' (put s')+ ----------------------------------------------- -- Tables @@ -73,7 +82,7 @@ -- All known type equalities, contains the transitive&commutative closure. type TypeEqTable = [(EType, EType)] -type ClassInfo = ([IdKind], [EConstraint], EKind, [Ident], [IFunDep]) -- class tyvars, superclasses, class kind, methods, fundeps+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 -----------------------------------------------
src/MicroHs/TargetConfig.hs view
@@ -5,10 +5,8 @@ , parseTargets , findTarget ) where--import Prelude hiding(lex)+import Prelude(); import MHSPrelude hiding(lex) import Control.Applicative-import Control.Monad import Data.List import Text.ParserComb import MicroHs.Ident@@ -43,7 +41,7 @@ type Parser = Prsr [Token] Token instance TokenMachine [Token] Token where- tmNextToken [] = (TEnd, [])+ tmNextToken [] = (TEnd noSLoc, []) tmNextToken (x:xs) = (x,xs) tmRawTokens = id@@ -53,8 +51,8 @@ eof = do t <- nextToken case t of- TEnd -> pure ()- _ -> fail "eof"+ TEnd _ -> pure ()+ _ -> fail "eof" nl :: Parser [Token] nl = many $ satisfy "\\n" isWhite@@ -71,12 +69,6 @@ where is (TIdent _ _ x) = Just x is _ = Nothing -keyword :: String -> Parser ()-keyword s = do- s' <- ident- guard (s == s')- pure ()- key :: Parser String key = ident @@ -89,7 +81,7 @@ targetName = spec '[' *> key <* spec ']' keyValue :: Parser (String, String)-keyValue = (,) <$> key <*> (keyword "=" *> value)+keyValue = (,) <$> key <*> (spec '=' *> value) keyValues :: Parser [(String,String)] keyValues = keyValue `esepBy` nl
src/MicroHs/Translate.hs view
@@ -3,6 +3,7 @@ module MicroHs.Translate( translate, translateAndRun ) where+import Prelude(); import MHSPrelude import Data.Maybe import qualified MicroHs.IdentMap as M import Unsafe.Coerce@@ -151,5 +152,9 @@ ("bslength", primitive "bslength"), ("bssubstr", primitive "bssubstr"), ("fromUTF8", primitive "fromUTF8"),- ("toUTF8", primitive "toUTF8")+ ("toUTF8", primitive "toUTF8"),+ ("fp+", primitive "fp+"),+ ("fp2p", primitive "fp2p"),+ ("fpnew", primitive "fpnew"),+ ("fpfin", primitive "fpfin") ]
src/MicroHs/TypeCheck.hs view
@@ -4,17 +4,18 @@ {-# LANGUAGE FlexibleContexts #-} module MicroHs.TypeCheck( typeCheck,- TModule(..), showTModule, tModuleName,+ TModule(..), showTModule,+ GlobTables, emptyGlobTables, mergeGlobTables, impossible, impossibleShow, mkClassConstructor, mkSuperSel,- bindingsOf, setBindings, boolPrefix, listPrefix, ValueExport(..), TypeExport(..), Symbols, ) where+import Prelude(); import MHSPrelude import Control.Applicative import Control.Arrow(first) import Control.Monad@@ -22,6 +23,7 @@ import Data.Function import Data.List import Data.Maybe+import MicroHs.Builtin import MicroHs.Deriving import MicroHs.Expr import MicroHs.Fixity@@ -112,28 +114,36 @@ ---------------------- -type Symbols = (SymTab, SymTab)+-- Certain data structures persist during the entire compilation+-- session. The information is needed beyond the scope where it was defined.+data GlobTables = GlobTables {+ gSynTable :: SynTable, -- type synonyms are needed for expansion+ gClassTable :: ClassTable, -- classes are neede for superclass expansion+ gInstInfo :: InstTable -- instances are implicitely global+ } -data TModule a = TModule- IdentModule -- module names- [FixDef] -- all fixities, exported or not- [TypeExport] -- exported types- [SynDef] -- all type synonyms, exported or not- [ClsDef] -- all classes- [InstDef] -- all instances- [ValueExport] -- exported values (including from T(..))- a -- bindings--- deriving (Show)+emptyGlobTables :: GlobTables+emptyGlobTables = GlobTables { gSynTable = M.empty, gClassTable = M.empty, gInstInfo = M.empty } -tModuleName :: forall a . TModule a -> IdentModule-tModuleName (TModule a _ _ _ _ _ _ _) = a+mergeGlobTables :: GlobTables -> GlobTables -> GlobTables+mergeGlobTables g1 g2 = GlobTables { gSynTable = M.merge (gSynTable g1) (gSynTable g2),+ gClassTable = M.merge (gClassTable g1) (gClassTable g2),+ gInstInfo = M.merge (gInstInfo g1) (gInstInfo g2) } -bindingsOf :: forall a . TModule a -> a-bindingsOf (TModule _ _ _ _ _ _ _ a) = a+type Symbols = (SymTab, SymTab) -setBindings :: forall a . a -> TModule a -> TModule a-setBindings a (TModule x1 x2 x3 x4 x5 x6 x7 _) = TModule x1 x2 x3 x4 x5 x6 x7 a+data TModule a = TModule {+ tModuleName :: IdentModule, -- module names+ tFixDefs :: [FixDef], -- all fixities, exported or not+ tTypeExps :: [TypeExport], -- exported types+ tValueExps :: [ValueExport], -- exported values (including from T(..))+ tBindingsOf :: a -- bindings+ }+-- deriving (Show) +setBindings :: TModule b -> a -> TModule a+setBindings (TModule x y z w _) a = TModule x y z w a+ data TypeExport = TypeExport Ident -- unqualified name Entry -- symbol table entry@@ -150,42 +160,40 @@ --instance Show ValueExport where show (ValueExport i _) = showIdent i type FixDef = (Ident, Fixity)-type SynDef = (Ident, EType)-type ClsDef = (Ident, ClassInfo)-type InstDef= (Ident, InstInfo) type Sigma = EType---type Tau = EType type Rho = EType -typeCheck :: forall a . ImpType -> [(ImportSpec, TModule a)] -> EModule -> (TModule [EDef], Symbols)-typeCheck impt aimps (EModule mn exps defs) =+typeCheck :: forall a . GlobTables -> ImpType -> [(ImportSpec, TModule a)] -> EModule -> (TModule [EDef], GlobTables, Symbols)+typeCheck globs impt aimps (EModule mn exps defs) = -- trace (unlines $ map (showTModuleExps . snd) aimps) $ let imps = map filterImports aimps- (fs, ts, ss, cs, is, vs, as) = mkTables imps- in case tcRun (tcDefs impt defs) (initTC mn fs ts ss cs is vs as) of+ tc = mkTCState mn globs imps+ in case tcRun (tcDefs impt defs) tc of (tds, tcs) -> let thisMdl = (mn, mkTModule impt tds tcs) impMdls = [(fromMaybe m mm, tm) | (ImportSpec _ _ m mm _, tm) <- imps] impMap = M.fromList [(i, m) | (i, m) <- thisMdl : impMdls]- (texps, cexps, vexps) =- unzip3 $ map (getTVExps impMap (typeTable tcs) (valueTable tcs) (assocTable tcs) (classTable tcs)) exps- fexps = [ fe | TModule _ fe _ _ _ _ _ _ <- M.elems impMap ]- sexps = M.toList (synTable tcs)- iexps = M.toList (instTable tcs)- in ( tModule mn (nubBy ((==) `on` fst) (concat fexps)) (concat texps) sexps (concat cexps) iexps (concat vexps) tds+ (texps, vexps) =+ unzip $ map (getTVExps impMap (typeTable tcs) (valueTable tcs) (assocTable tcs)) exps+ fexps = map tFixDefs (M.elems impMap)+ sexps = synTable tcs+ iexps = instTable tcs+ ctbl = classTable tcs+ in ( tModule mn (nubBy ((==) `on` fst) (concat fexps)) (concat texps) (concat vexps) tds+ , GlobTables { gSynTable = sexps, gClassTable = ctbl, gInstInfo = iexps } , (typeTable tcs, valueTable tcs) ) -- A hack to force evaluation of errors. -- This should be redone to all happen in the T monad.-tModule :: IdentModule -> [FixDef] -> [TypeExport] -> [SynDef] -> [ClsDef] -> [InstDef] -> [ValueExport] -> [EDef] ->+tModule :: IdentModule -> [FixDef] -> [TypeExport] -> [ValueExport] -> [EDef] -> TModule [EDef]-tModule mn fs ts ss cs is vs ds =+tModule mn fs ts vs ds = -- trace ("tmodule " ++ showIdent mn ++ ":\n" ++ show vs) $- tseq ts `seq` vseq vs `seq` TModule mn fs ts ss cs is vs ds+ tseq ts `seq` vseq vs `seq` TModule mn fs ts vs ds where tseq [] = () tseq (TypeExport _ e _:xs) = e `seq` tseq xs@@ -194,15 +202,15 @@ filterImports :: forall a . (ImportSpec, TModule a) -> (ImportSpec, TModule a) filterImports it@(ImportSpec _ _ _ _ Nothing, _) = it-filterImports (imp@(ImportSpec _ _ _ _ (Just (hide, is))), TModule mn fx ts ss cs ins vs a) =+filterImports (imp@(ImportSpec _ _ _ _ (Just (hide, is))), TModule mn fx ts vs a) = let keep x xs = elem x xs /= hide- ivs = [ i | ImpValue i <- is ]- vs' = filter (\ (ValueExport i _) -> keep i ivs) vs--- cts = [ i | ImpTypeAll i <- is ] ++ [ i | ImpTypeSome i (_:_) <- is ] -- XXX--- its = [ i | ImpTypeSome i [] <- is ] ++ cts+ ivs = [ i | ImpValue i <- is ]+ vs' = filter (\ (ValueExport i _) -> keep i ivs) vs +++ if hide then []+ else [ ve | TypeExport _ _ ves <- ts, ve@(ValueExport i _) <- ves, i `elem` ivs ] aits = [ i | ImpTypeAll i <- is ] -- all T(..) imports- its = [ i | ImpTypeSome i _ <- is ] ++ aits+ its = [ i | ImpTypeSome i _ <- is ] ++ aits -- XXX This isn't quite right, hiding T() should hide T, but not the constructors ts' = if hide then@@ -224,7 +232,7 @@ checkBad msg (ivs \\ allVs) . checkBad msg (its \\ allTs)) --trace (show (ts, vs)) $- (imp, TModule mn fx ts' ss cs ins vs' a)+ (imp, TModule mn fx ts' vs' a) checkBad :: forall a . String -> [Ident] -> a -> a checkBad _ [] a = a@@ -232,29 +240,26 @@ errorMessage (getSLoc i) $ msg ++ ": " ++ showIdent i -- Type and value exports-getTVExps :: forall a . M.Map (TModule a) -> TypeTable -> ValueTable -> AssocTable -> ClassTable -> ExportItem ->- ([TypeExport], [ClsDef], [ValueExport])-getTVExps impMap _ _ _ _ (ExpModule m) =+getTVExps :: forall a . M.Map (TModule a) -> TypeTable -> ValueTable -> AssocTable -> ExportItem ->+ ([TypeExport], [ValueExport])+getTVExps impMap _ _ _ (ExpModule m) = case M.lookup m impMap of- Just (TModule _ _ te _ ce _ ve _) -> (te, ce, ve)+ Just (TModule _ _ te ve _) -> (te, ve) _ -> errorMessage (getSLoc m) $ "undefined module: " ++ showIdent m-getTVExps _ tys vals ast cls (ExpTypeSome i is) = getTypeExp tys vals ast cls i (`elem` is)-getTVExps _ tys vals ast cls (ExpTypeAll i ) = getTypeExp tys vals ast cls i (const True)-getTVExps _ _ vals _ _ (ExpValue i) =- ([], [], [ValueExport i (expLookup i vals)])+getTVExps _ tys vals ast (ExpTypeSome i is) = getTypeExp tys vals ast i (`elem` is)+getTVExps _ tys vals ast (ExpTypeAll i ) = getTypeExp tys vals ast i (const True)+getTVExps _ _ vals _ (ExpValue i) =+ ([], [ValueExport i (expLookup i vals)]) -- Export a type, filter exported values by p.-getTypeExp :: TypeTable -> ValueTable -> AssocTable -> ClassTable -> Ident -> (Ident -> Bool) ->- ([TypeExport], [ClsDef], [ValueExport])-getTypeExp tys vals ast cls ti p =+getTypeExp :: TypeTable -> ValueTable -> AssocTable -> Ident -> (Ident -> Bool) ->+ ([TypeExport], [ValueExport])+getTypeExp tys vals ast ti p = let e = expLookup ti tys qi = tyQIdent e ves = filter (\ (ValueExport i _) -> p i) $ getAssocs vals ast qi- cl = case M.lookup qi cls of- Just ci -> [(qi, ci)]- Nothing -> []- in ([TypeExport ti e ves], cl, [])+ in ([TypeExport ti e ves], []) expLookup :: Ident -> SymTab -> Entry expLookup i m = either (errorMessage (getSLoc i)) id $ stLookup "export" i m@@ -279,8 +284,6 @@ tt = typeTable tcs at = assocTable tcs vt = valueTable tcs- ct = classTable tcs- it = instTable tcs -- Find the Entry for a type. tentry i =@@ -304,19 +307,10 @@ [ TypeExport i (tentry i) (assoc i) | Class _ (i, _) _ _ <- tds ] ++ [ TypeExport i (tentry i) [] | Type (i, _) _ <- tds ] - -- All type synonym definitions.- ses = [ (qualIdent mn i, EForall vs t) | Type (i, vs) t <- tds ]- -- All fixity declaration. fes = [ (qualIdent mn i, fx) | Infix fx is <- tds, i <- is ] - -- All classes- -- XXX only export the locally defined classes- ces = M.toList ct-- -- All instances- ies = M.toList it- in TModule mn fes tes ses ces ies ves impossible+ in TModule mn fes tes ves impossible -- Find all value Entry for names associated with a type. getAssocs :: (HasCallStack) => ValueTable -> AssocTable -> Ident -> [ValueExport]@@ -327,22 +321,21 @@ _ -> impossible in map (\ qi -> ValueExport (unQualIdent qi) (val qi)) qis -mkTables :: forall a . [(ImportSpec, TModule a)] ->- (FixTable, TypeTable, SynTable, ClassTable, InstTable, ValueTable, AssocTable)-mkTables mdls =+mkTCState :: IdentModule -> GlobTables -> [(ImportSpec, TModule a)] -> TCState+mkTCState mdlName globs mdls = let allValues :: ValueTable allValues = let- usyms (ImportSpec _ qual _ _ _, TModule _ _ tes _ _ _ ves _) =+ usyms (ImportSpec _ qual _ _ _, TModule _ _ tes ves _) = if qual then [] else [ (i, [e]) | ValueExport i e <- ves, not (isInstId i) ] ++ [ (i, [e]) | TypeExport _ _ cs <- tes, ValueExport i e <- cs, not (isDefaultMethodId i) ]- qsyms (ImportSpec _ _ _ mas _, TModule mn _ tes _ cls _ ves _) =+ qsyms (ImportSpec _ _ _ mas _, TModule mn _ tes ves _) = let m = fromMaybe mn mas in [ (v, [e]) | ValueExport i e <- ves, let { v = qualIdent m i } ] ++ [ (v, [e]) | TypeExport _ _ cs <- tes, ValueExport i e <- cs, let { v = qualIdentD e m i } ] ++- [ (v, [Entry (EVar v) t]) | (i, (_, _, t, _, _)) <- cls, let { v = mkClassConstructor i } ]+ [ (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 = @@ -350,43 +343,40 @@ EVar qi -> qi _ -> undefined in stFromList (concatMap usyms mdls) (concatMap qsyms mdls)- allSyns =- let- syns (_, TModule _ _ _ ses _ _ _ _) = ses- in M.fromList (concatMap syns mdls) allTypes :: TypeTable allTypes = let- usyms (ImportSpec _ qual _ _ _, TModule _ _ tes _ _ _ _ _) =+ usyms (ImportSpec _ qual _ _ _, TModule _ _ tes _ _) = if qual then [] else [ (i, [e]) | TypeExport i e _ <- tes ]- qsyms (ImportSpec _ _ _ mas _, TModule mn _ tes _ _ _ _ _) =+ qsyms (ImportSpec _ _ _ mas _, TModule mn _ tes _ _) = let m = fromMaybe mn mas in [ (qualIdent m i, [e]) | TypeExport i e _ <- tes ] in stFromList (concatMap usyms mdls) (concatMap qsyms mdls)- allFixes =- let- fixes (_, TModule _ fes _ _ _ _ _ _) = fes- in M.fromList (concatMap fixes mdls)++ allFixes :: FixTable+ allFixes = M.fromList (concatMap (tFixDefs . snd) mdls) allAssocs :: AssocTable allAssocs = let- assocs (ImportSpec _ _ _ mas _, TModule mn _ tes _ _ _ _ _) =+ assocs (ImportSpec _ _ _ mas _, TModule mn _ tes _ _) = let m = fromMaybe mn mas in [ (qualIdent m i, [qualIdent m a | ValueExport a _ <- cs]) | TypeExport i _ cs <- tes ] in M.fromList $ concatMap assocs mdls- allClasses :: ClassTable- allClasses =- let- clss (_, TModule _ _ _ _ ces _ _ _) = ces- in --(\ m -> trace ("allClasses: " ++ showListS showIdentClassInfo (M.toList m)) m) $- M.fromList $ concatMap clss mdls- allInsts :: InstTable- allInsts =- let- insts (_, TModule _ _ _ _ _ ies _ _) = ies- in M.fromListWith mergeInstInfo $ concatMap insts mdls- in (allFixes, allTypes, allSyns, allClasses, allInsts, allValues, allAssocs)+ in TC { moduleName = mdlName,+ unique = 1,+ fixTable = addPrimFixs allFixes,+ typeTable = foldr (uncurry stInsertGlbU) allTypes primTypes,+ synTable = gSynTable globs,+ valueTable = foldr (uncurry stInsertGlbU) allValues primValues,+ assocTable = allAssocs,+ uvarSubst = IM.empty,+ tcMode = TCExpr,+ classTable = gClassTable globs,+ ctxTables = (gInstInfo globs, [], [], []),+ constraints = [],+ defaults = stdDefaults+ } mergeInstInfo :: InstInfo -> InstInfo -> InstInfo mergeInstInfo (InstInfo m1 l1 fds) (InstInfo m2 l2 _) =@@ -441,6 +431,7 @@ addInstTable :: [InstDictC] -> T () addInstTable ics = do+-- tcTrace $ "addInstTable: " ++ show ics let -- Change type variable to unique unification variables. -- These unification variables will never leak, but as an extra caution@@ -462,7 +453,7 @@ addConstraint :: Ident -> EConstraint -> T () addConstraint d ctx = do--- traceM $ "addConstraint: " ++ showIdent d ++ " :: " ++ showEType ctx+-- tcTrace $ "addConstraint: " ++ showIdent d ++ " :: " ++ showEType ctx ctx' <- expandSyn ctx modify $ \ ts -> ts{ constraints = (d, ctx') : constraints ts } @@ -476,12 +467,12 @@ withDict :: forall a . HasCallStack => Ident -> EConstraint -> T a -> T a withDict i c ta = do--- traceM $ "+++ withDict enter " ++ show (i, c)+-- tcTrace $ "+++ withDict enter " ++ show (i, c) ct <- gets ctxTables addDict (i, c) a <- ta putCtxTables ct--- traceM $ "--- withDict leave " ++ show (i, c)+-- tcTrace $ "--- withDict leave " ++ show (i, c) return a addDict :: (Ident, EConstraint) -> T ()@@ -506,7 +497,7 @@ addEqDict :: Ident -> EType -> EType -> T () addEqDict _i t1 t2 = do is <- gets typeEqTable--- traceM ("withEqDict: " ++ show (is, (t1,t2), (addTypeEq t1 t2 is)))+-- tcTrace ("withEqDict: " ++ show (is, (t1,t2), (addTypeEq t1 t2 is))) putTypeEqTable (addTypeEq t1 t2 is) addMetaDict :: HasCallStack => Ident -> EConstraint -> T ()@@ -519,17 +510,6 @@ ads <- gets argDicts putArgDicts ((i,c) : ads) -initTC :: IdentModule -> FixTable -> TypeTable -> SynTable -> ClassTable -> InstTable -> ValueTable -> AssocTable -> TCState-initTC mn fs ts ss cs is vs as =--- trace ("**** initTC " ++ showIdent mn ++ ": " ++ showListS (showPairS showIdent showEType) (M.toList ss)) $- let- xts = foldr (uncurry stInsertGlbU) ts primTypes- xvs = foldr (uncurry stInsertGlbU) vs primValues- in TC { moduleName = mn, unique = 1, fixTable = addPrimFixs fs, typeTable = xts,- synTable = ss, valueTable = xvs, assocTable = as, uvarSubst = IM.empty,- tcMode = TCExpr, classTable = cs, ctxTables = (is,[],[],[]), constraints = [],- defaults = stdDefaults }- stdDefaults :: [EType] stdDefaults = [EVar identInteger, EVar identFloatW, EApp (EVar identList) (EVar identChar)] @@ -609,8 +589,8 @@ tuple n = let i = tupleConstr builtinLoc n- in (i, [entry i $ EForall [kk] $ foldr kArrow kv (replicate n kv)])- kImplies = EForall [kk] $ kConstraint `kArrow` (kv `kArrow` kv)+ in (i, [entry i $ EForall True [kk] $ foldr kArrow kv (replicate n kv)])+ kImplies = EForall True [kk] $ kConstraint `kArrow` (kv `kArrow` kv) in [ -- The function arrow et al are bothersome to define in Primitives, so keep them here.@@ -640,7 +620,7 @@ vks = [IdKind (mkIdent ("a" ++ show i)) kType | i <- enumFromTo 1 n] ts = map tVarK vks r = tApps c ts- in (c, [Entry (ECon $ ConData [(c, n)] c []) $ EForall vks $ foldr tArrow r ts ])+ in (c, [Entry (ECon $ ConData [(c, n)] c []) $ EForall True vks $ EForall True [] $ foldr tArrow r ts ]) in map tuple (enumFromTo 2 10) kArrow :: EKind -> EKind -> EKind@@ -654,14 +634,6 @@ if isIdent "=>" n || isIdent "Primitives.=>" n then Just (a, b) else Nothing getImplies _ = Nothing -{--getTuple :: Int -> EType -> Maybe [EType]-getTuple n t = loop t []- where loop (EVar i) r | isTupleConstr n i && length r == n = Just (reverse r)- loop (EApp f a) r = loop f (a:r)- loop _ _ = Nothing--}- setUVar :: TRef -> EType -> T () setUVar i t = modify $ \ ts -> ts{ uvarSubst = IM.insert i t (uvarSubst ts) } @@ -686,9 +658,7 @@ syns <- gets synTable case M.lookup i syns of Nothing -> return $ eApps t ts- Just (EForall vks tt) ->--- if length vks /= length ts then tcError (getSLoc i) $ "bad synonym use"--- else expandSyn $ subst (zip (map idKindIdent vks) ts) tt+ Just (EForall _ vks tt) -> let s = zip (map idKindIdent vks) ts lvks = length vks lts = length ts@@ -696,11 +666,10 @@ LT -> expandSyn $ eApps (subst s tt) (drop lvks ts) EQ -> expandSyn $ subst s tt GT -> tcError (getSLoc i) $ "bad synonym use"- --EForall (drop lts vks) (subst s tt) Just _ -> impossible EUVar _ -> return $ eApps t ts ESign a _ -> expandSyn a -- Throw away signatures, they don't affect unification- EForall iks tt | null ts -> EForall iks <$> expandSyn tt+ EForall b iks tt | null ts -> EForall b iks <$> expandSyn tt ELit _ (LStr _) -> return t ELit _ (LInteger _) -> return t _ -> impossible@@ -711,7 +680,7 @@ where rec (EApp f a) = EApp (rec f) (rec a) rec (ESign t k) = ESign (rec t) k- rec (EForall iks t) = EForall iks (rec t)+ rec (EForall b iks t) = EForall b iks (rec t) rec t = fn t derefUVar :: EType -> T EType@@ -731,7 +700,7 @@ return t' EVar _ -> return at ESign t k -> flip ESign k <$> derefUVar t- EForall iks t -> EForall iks <$> derefUVar t+ EForall b iks t -> EForall b iks <$> derefUVar t ELit _ (LStr _) -> return at ELit _ (LInteger _) -> return at _ -> impossible@@ -781,7 +750,7 @@ SLoc -> TRef -> EType -> T () unifyVar loc r t = do mt <- getUVar r--- traceM $ "unifyVar: " ++ show (r,t)+-- tcTrace $ "unifyVar: " ++ show (r,t) case mt of Nothing -> unifyUnboundVar loc r t Just t' -> unify loc t' t@@ -825,10 +794,10 @@ Left e -> do {- tcm <- gets tcMode- traceM ("TCMode=" ++ show tcm)- traceM ("Value table:\n" ++ show env)+ tcTrace ("TCMode=" ++ show tcm)+ tcTrace ("Value table:\n" ++ show env) tenv <- gets typeTable- traceM ("Type table:\n" ++ show tenv)+ tcTrace ("Type table:\n" ++ show tenv) -} tcError (getSLoc i) e @@ -839,11 +808,11 @@ tLookup (msgTCMode tcm) i tInst :: HasCallStack => Expr -> EType -> T (Expr, EType)-tInst ae (EForall vks t) = do+tInst ae (EForall _ vks t) = do t' <- tInstForall vks t tInst ae t' tInst ae at | Just (ctx, t) <- getImplies at = do- --traceM $ "tInst: addConstraint: " ++ show ae ++ ", " ++ show d ++ " :: " ++ show ctx+ --tcTrace $ "tInst: addConstraint: " ++ show ae ++ ", " ++ show d ++ " :: " ++ show ctx if eqExpr ae eCannotHappen then -- XXX Gruesome hack. This avoid adding constraints in cases like -- (C a => a) -> T `subsCheck` b@@ -864,7 +833,7 @@ return (subst (zip vs us) t) tInst' :: EType -> T EType-tInst' (EForall vks t) = tInstForall vks t+tInst' (EForall _ vks t) = tInstForall vks t tInst' t = return t extValE :: HasCallStack =>@@ -947,13 +916,13 @@ tcDefs :: ImpType -> [EDef] -> T [EDef] tcDefs impt ds = do--- traceM ("tcDefs 1:\n" ++ showEDefs ds)+-- tcTrace ("tcDefs 1:\n" ++ showEDefs ds) mapM_ tcAddInfix ds dst <- tcDefsType ds--- traceM ("tcDefs 2:\n" ++ showEDefs dst)+-- tcTrace ("tcDefs 2:\n" ++ showEDefs dst) mapM_ addTypeSyn dst dst' <- tcExpand impt dst--- traceM ("tcDefs 3:\n" ++ showEDefs dst')+-- tcTrace ("tcDefs 3:\n" ++ showEDefs dst') case impt of ImpNormal -> do setDefault dst'@@ -980,14 +949,14 @@ mapM_ (addTypeKind kindSigs) ds -- Add the kind of each type to the environment dst <- mapM tcDefType ds -- Kind check all top level type expressions -- vars <- gets uvarSubst--- traceM $ show vars+-- 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 vt' <- mapMSymTab ent vt putValueTable vt'--- traceM $ "tcDefType value table:\n" ++ show vt'+-- tcTrace $ "tcDefType value table:\n" ++ show vt' return dst -- Get all kind signatures, and do sort checking of them.@@ -1004,9 +973,9 @@ tcExpand impt dst = withTypeTable $ do dsc <- concat <$> mapM (expandClass impt) dst -- Expand all class definitions dsf <- concat <$> mapM expandField dsc -- Add HasField instances--- traceM $ showEDefs dsf+-- tcTrace $ showEDefs dsf dsd <- concat <$> mapM doDeriving dsf -- Add derived instances--- traceM $ showEDefs dsd+-- tcTrace $ showEDefs dsd dsi <- concat <$> mapM expandInst dsd -- Expand all instance definitions return dsi @@ -1018,13 +987,27 @@ expect = case tcm of { TCType -> sKind; TCKind -> rSort; _ -> undefined } loop r [] = fun (reverse r) loop r (IdKind i mk : iks) = do- k' <-- case mk of- EVar d | d == dummyIdent -> newUVar- _ -> withTypeTable $ tcExpr (Check expect) mk -- bump to next level- withExtVal i k' $ loop (IdKind i k' : r) iks+ -- When we have 'forall k (a :: k) . t' the k is a kind.+ -- Instead we have have to write 'forall (k :: Kind) (a :: k) . t' and then+ -- we have to guess that k needs sort checking.+ -- This doesn't work if there is not exactly 'Kind' (e.g., 'Primitives.Kind')+ -- This sucks.+ if tcm == TCType && guessIsKind mk then do+ s <- withTypeTable $ withTypeTable $ tcExpr (Check rSort) mk+ let ik = IdKind i s+ withExtTyps [ik] $ loop (ik : r) iks+ else do+ k' <- case mk of+ EVar d | d == dummyIdent -> newUVar+ _ -> withTypeTable $ tcExpr (Check expect) mk -- bump to next level+ withExtVal i k' $ loop (IdKind i k' : r) iks loop [] vks +guessIsKind :: EType -> Bool+guessIsKind (EVar i) = i == mkIdent "Kind"+guessIsKind t | Just (f, a) <- getArrow t = guessIsKind f || guessIsKind a+guessIsKind _ = False+ -- Add symbol a table entry (with kind) for each top level typeish definition. -- If there is a kind signature, use it. If not, use a kind variable. addTypeKind :: M.Map EKind -> EDef -> T ()@@ -1063,7 +1046,7 @@ addTypeSyn adef = case adef of Type (i, vs) t -> do- let t' = EForall vs t+ let t' = EForall True vs t extSyn i t' mn <- gets moduleName extSyn (qualIdent mn i) t'@@ -1169,21 +1152,19 @@ mdflts = [ (i, eqns) | BFcn i eqns <- ms ] dflttys = [ (i, t) | BDfltSign i t <- ms ] tCtx = tApps (qualIdent mn iCls) (map (EVar . idKindIdent) vks)- mkDflt (BSign methId t) = [ Sign [iDflt] $ EForall vks $ tCtx `tImplies` ty, def $ lookup methId mdflts ]+ mkDflt (BSign methId t) = [ 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 (Just eqns) = Fcn iDflt eqns iDflt = mkDefaultMethodId methId- -- XXX This isn't right, "Prelude._nodefault" might not be in scope noDflt = mkExn (getSLoc methId) (unIdent methId) "noMethodError"--- EApp noDefaultE (mkEStr (getSLoc iCls) (unIdent iCls ++ "." ++ unIdent methId))---noDefaultE :: Expr---noDefaultE = ELit noSLoc $ LExn "Control.Exception.Internal.noMethodError" mkDflt _ = impossible dDflts = case impt of ImpNormal -> concatMap mkDflt meths ImpBoot -> []- addClassTable (qualIdent mn iCls) (vks, ctx, EUVar 0, methIds, mkIFunDeps (map idKindIdent vks) fds) -- Initial entry, no type needed.+ -- 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] @@ -1209,7 +1190,7 @@ defaultSuffix = uniqIdentSep ++ "dflt" splitInst :: EConstraint -> ([IdKind], [EConstraint], EConstraint)-splitInst (EForall iks t) =+splitInst (EForall _ iks t) = case splitInst t of (iks', ctx, ct) -> (iks ++ iks', ctx, ct) splitInst act | Just (ctx, ct) <- getImplies act =@@ -1224,11 +1205,11 @@ qiCls = getAppCon cc let iInst = mkInstId loc cc sign = Sign [iInst] act--- traceM ("expandInst " ++ show iInst)+-- tcTrace ("expandInst " ++ show iInst) -- (e, _) <- tLookupV iCls ct <- gets classTable -- let qiCls = getAppCon e- (_, supers, _, mis, fds) <-+ (ClassInfo _ supers _ mis fds) <- case M.lookup qiCls ct of Nothing -> tcError loc $ "not a class " ++ showIdent qiCls Just x -> return x@@ -1255,7 +1236,7 @@ tcDefsValue :: [EDef] -> T [EDef] tcDefsValue defs = do--- traceM $ "tcDefsValue: ------------ start"+-- tcTrace $ "tcDefsValue: ------------ start" -- Gather up all type signatures, and put them in the environment. mapM_ addValueType defs let smap = M.fromList [ (i, ()) | Sign is _ <- defs, i <- is ]@@ -1273,7 +1254,7 @@ -- return inferred Sign signDefs <- mapM tcSCC sccs -- type check all definitions (the inferred ones will be rechecked)--- traceM $ "tcDefsValue: ------------ check"+-- tcTrace $ "tcDefsValue: ------------ check" defs' <- mapM (\ d -> do { tcReset; tcDefValue d}) defs return $ concat signDefs ++ defs' @@ -1283,7 +1264,7 @@ tcReset -- Invent type variables for the definitions xts <- mapM (\ (Fcn i _) -> (,) i <$> newUVar) fcns- --traceM $ "tInferDefs: " ++ show (map fst xts)+ --tcTrace $ "tInferDefs: " ++ show (map fst xts) -- Temporarily extend the local environment with the type variables withExtVals xts $ do -- Infer types for all the Fcns, ignore the new bodies.@@ -1301,7 +1282,7 @@ t'' = addConstraints ctx' t' vs' = metaTvs [t''] t''' <- quantify vs' t''- --traceM $ "tInferDefs: " ++ showIdent i ++ " :: " ++ showEType t'''+ --tcTrace $ "tInferDefs: " ++ showIdent i ++ " :: " ++ showEType t''' extValQTop i t''' return $ Sign [i] t''' mapM genTop xts@@ -1317,7 +1298,7 @@ addValueType :: EDef -> T () addValueType adef = do mn <- gets moduleName- -- traceM ("addValueType: " ++ showEDefs [adef])+ -- tcTrace ("addValueType: " ++ showEDefs [adef]) let addConFields _ (Constr _ _ _ (Left _)) = return () addConFields tycon (Constr _ _ _ (Right fs)) = mapM_ addField fs where addField (fld, _) = do@@ -1331,7 +1312,7 @@ tret = tApps (qualIdent mn tycon) (map tVarK vks) addCon (Constr evks ectx c ets) = do let ts = either id (map snd) ets- cty = EForall vks $ EForall evks $ addConstraints ectx $ foldr (tArrow . snd) tret ts+ cty = EForall True vks $ EForall True evks $ addConstraints ectx $ foldr (tArrow . snd) tret ts fs = either (const []) (map fst) ets extValETop c cty (ECon $ ConData cti (qualIdent mn c) fs) mapM_ addCon cs@@ -1341,7 +1322,7 @@ t = snd $ head $ either id (map snd) ets tret = tApps (qualIdent mn tycon) (map tVarK vks) fs = either (const []) (map fst) ets- extValETop c (EForall vks $ EForall [] $ tArrow t tret) (ECon $ ConNew (qualIdent mn c) fs)+ extValETop c (EForall True vks $ EForall True [] $ tArrow t tret) (ECon $ ConNew (qualIdent mn c) fs) addConFields tycon con ForImp _ i t -> extValQTop i t Class ctx (i, vks) fds ms -> addValueClass ctx i vks fds ms@@ -1361,14 +1342,14 @@ tret = tApps qiCls (map tVarK vks) cti = [ (qualIdent mn iCon, length targs) ] iCon = mkClassConstructor iCls- iConTy = EForall vks $ foldr tArrow tret targs+ iConTy = EForall True vks $ foldr tArrow tret targs extValETop iCon iConTy (ECon $ ConData cti (qualIdent mn iCon) [])- let addMethod (BSign i t) = extValETop i (EForall vks $ tApps qiCls (map (EVar . idKindIdent) vks) `tImplies` t) (EVar $ qualIdent mn i)+ let addMethod (BSign i t) = extValETop i (EForall True vks $ tApps qiCls (map (EVar . idKindIdent) vks) `tImplies` t) (EVar $ qualIdent mn i) addMethod _ = impossible--- traceM ("addValueClass " ++ showEType (ETuple ctx))+-- tcTrace ("addValueClass " ++ showEType (ETuple ctx)) mapM_ addMethod meths -- Update class table, now with actual constructor type.- addClassTable qiCls (vks, ctx, iConTy, methIds, mkIFunDeps (map idKindIdent vks) fds)+ addClassTable qiCls (ClassInfo vks ctx iConTy methIds (mkIFunDeps (map idKindIdent vks) fds)) mkClassConstructor :: Ident -> Ident mkClassConstructor i = addIdentSuffix i "$C"@@ -1381,15 +1362,16 @@ Fcn i eqns -> do (_, t) <- tLookup "type signature" i t' <- expandSyn t--- traceM $ "tcDefValue: " ++ showIdent i ++ " :: " ++ showExpr t'--- traceM $ "tcDefValue: " ++ showEDefs [adef]+-- tcTrace $ "tcDefValue: ------- start " ++ showIdent i+-- tcTrace $ "tcDefValue: " ++ showIdent i ++ " :: " ++ showExpr t'+-- tcTrace $ "tcDefValue: " ++ showEDefs [adef] teqns <- tcEqns True t' eqns--- traceM ("tcDefValue: after\n" ++ showEDefs [adef, Fcn i teqns])+-- tcTrace ("tcDefValue: after\n" ++ showEDefs [adef, Fcn i teqns]) -- cs <- gets constraints--- traceM $ "tcDefValue: constraints: " ++ show cs+-- tcTrace $ "tcDefValue: constraints: " ++ show cs checkConstraints mn <- gets moduleName--- traceM $ "tcDefValue: " ++ showIdent i ++ " done"+-- tcTrace $ "tcDefValue: " ++ showIdent i ++ " done" return $ Fcn (qualIdent mn i) teqns ForImp ie i t -> do mn <- gets moduleName@@ -1399,14 +1381,14 @@ -- Add implicit forall and type check. tCheckTypeTImpl :: HasCallStack => EType -> EType -> T EType-tCheckTypeTImpl tchk t@(EForall _ _) = tCheckTypeT tchk t+tCheckTypeTImpl tchk t@(EForall _ _ _) = tCheckTypeT tchk t tCheckTypeTImpl tchk 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)) $ traceM ("tCheckTypeTImpl: " ++ show (t, eForall iks t))- tCheckTypeT tchk (eForall iks t)+ --when (not (null iks)) $ tcTrace ("tCheckTypeTImpl: " ++ show (t, eForall iks t))+ tCheckTypeT tchk (eForall' False iks t) tCheckTypeT :: HasCallStack => EType -> EType -> T EType tCheckTypeT = tCheck tcTypeT@@ -1465,7 +1447,7 @@ tCheckExpr :: HasCallStack => EType -> Expr -> T Expr tCheckExpr t e | Just (ctx, t') <- getImplies t = do--- traceM $ "tCheckExpr: " ++ show (e, ctx, t')+-- tcTrace $ "tCheckExpr: " ++ show (e, ctx, t') d <- newADictIdent (getSLoc e) e' <- withDict d ctx $ tCheckExprAndSolve t' e return $ eLam [EVar d] e'@@ -1497,9 +1479,9 @@ tcExpr :: HasCallStack => Expected -> Expr -> T Expr tcExpr mt ae = do--- traceM ("tcExpr enter: " ++ showExpr ae)+-- tcTrace ("tcExpr enter: " ++ showExpr ae) r <- tcExprR mt ae--- traceM ("tcExpr exit: " ++ showExpr r)+-- tcTrace ("tcExpr exit: " ++ showExpr r) return r tcExprR :: HasCallStack => Expected -> Expr -> T Expr@@ -1526,15 +1508,15 @@ case t of EUVar r -> fmap (fromMaybe t) (getUVar r) _ -> return t- --traceM $ "EVar: " ++ showIdent i ++ " :: " ++ showExpr t ++ " = " ++ showExpr t' ++ " mt=" ++ show mt+ --tcTrace $ "EVar: " ++ showIdent i ++ " :: " ++ showExpr t ++ " = " ++ showExpr t' ++ " mt=" ++ show mt instSigma loc e t' mt EApp f a -> do--- traceM $ "txExpr(0) EApp: expr=" ++ show ae ++ ":: " ++ show mt+-- tcTrace $ "txExpr(0) EApp: expr=" ++ show ae ++ ":: " ++ show mt (f', ft) <- tInferExpr f--- traceM $ "tcExpr(1) EApp: f=" ++ show f ++ "; f'=" ++ show f' ++ " :: " ++ show ft+-- tcTrace $ "tcExpr(1) EApp: f=" ++ show f ++ "; f'=" ++ show f' ++ " :: " ++ show ft (at, rt) <- unArrow loc ft--- traceM $ "tcExpr(2) EApp: f=" ++ show f ++ " :: " ++ show ft ++ ", arg=" ++ show a ++ " :: " ++ show at ++ " retty=" ++ show rt+-- tcTrace $ "tcExpr(2) EApp: f=" ++ show f ++ " :: " ++ show ft ++ ", arg=" ++ show a ++ " :: " ++ show at ++ " retty=" ++ show rt -- We want to do the unification of rt ant mt before checking the argument to -- have more type information. See tests/Eq1.hs. -- But instSigma may transform the input expression, so we have to be careful.@@ -1542,13 +1524,13 @@ ugly = -1::Int etmp' <- instSigma loc etmp rt mt a' <- checkSigma a at--- traceM $ "tcExpr(3) EApp: f = " ++ show f ++ " :: " ++ show ft ++ ", arg=" ++ show a' ++ " :: " ++ show at ++ " retty=" ++ show rt ++ " mt = " ++ show mt+-- tcTrace $ "tcExpr(3) EApp: f = " ++ show f ++ " :: " ++ show ft ++ ", arg=" ++ show a' ++ " :: " ++ show at ++ " retty=" ++ show rt ++ " mt = " ++ show mt let res = EApp f' a' case etmp' of EUVar _ -> return res -- instSigma did nothing, this is the common case _ -> return $ substEUVar [(ugly, res)] etmp' - EOper e ies -> do e' <- tcOper e ies; tcExpr mt e'+ EOper e ies -> tcOper e ies >>= tcExpr mt ELam qs -> tcExprLam mt qs ELit _ lit -> do tcm <- gets tcMode@@ -1572,7 +1554,7 @@ | v == identFloatW -> tcLit mt loc (LDouble (fromInteger i)) | v == identInteger -> tcLit mt loc lit _ -> do- (f, ft) <- tInferExpr (EVar (mkIdentSLoc loc "fromInteger")) -- XXX should have this qualified somehow+ (f, ft) <- tInferExpr (EVar (mkBuiltin loc "fromInteger")) (_at, rt) <- unArrow loc ft -- We don't need to check that _at is Integer, it's part of the fromInteger type. instSigma loc (EApp f ae) rt mt@@ -1581,7 +1563,7 @@ case mex of Just (EVar v) | v == mkIdent nameFloatW -> tcLit mt loc (LDouble (fromRational r)) _ -> do- (f, ft) <- tInferExpr (EVar (mkIdentSLoc loc "fromRational")) -- XXX should have this qualified somehow+ (f, ft) <- tInferExpr (EVar (mkBuiltin loc "fromRational")) (_at, rt) <- unArrow loc ft -- We don't need to check that _at is Rational, it's part of the fromRational type. instSigma loc (EApp f ae) rt mt@@ -1592,10 +1574,10 @@ Just (EApp (EVar lst) (EVar c)) | lst == identList, c == identChar -> tcLit mt loc lit _ -> do- (f, ft) <- tInferExpr (EVar (mkIdentSLoc loc $ "fromString")) -- XXX should have this qualified somehow+ (f, ft) <- tInferExpr (EVar (mkBuiltin loc "fromString")) (_at, rt) <- unArrow loc ft -- We don't need to check that _at is String, it's part of the fromString type.- --traceM ("LStr " ++ show (loc, r))+ --tcTrace ("LStr " ++ show (loc, r)) instSigma loc (EApp f ae) rt mt -- Not LInteger, LRat, LStr _ -> tcLit mt loc lit@@ -1616,6 +1598,7 @@ 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 [] -> impossible@@ -1628,12 +1611,11 @@ SBind p a -> do nofail <- failureFree p let- -- XXX this wrong, it should be >>= from Monad- ibind = mkIdentSLoc loc ">>="+ ibind = mkBuiltin loc ">>=" sbind = maybe ibind (\ mn -> qualIdent mn ibind) mmn x = eVarI loc "$b" patAlt = [(p, simpleAlts $ EDo mmn ss)]- failMsg s = EApp (EVar (mkIdentSLoc loc "fail")) (ELit loc (LStr s))+ failMsg s = EApp (EVar (mkBuiltin loc "fail")) (ELit loc (LStr s)) failAlt = if nofail then [] else [(EVar dummyIdent, simpleAlts $ failMsg "bind")]@@ -1641,17 +1623,15 @@ (eLam [x] (ECase x (patAlt ++ failAlt)))) SThen a -> do let- ithen = mkIdentSLoc loc ">>"+ 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)) - ESectL e i -> tcExpr mt (EApp (EVar i) e)- ESectR i e -> do- let x = eVarI loc "$x"- tcExpr mt (eLam [x] (EApp (EApp (EVar i) x) e))+ ESectL e i -> tcLSect e i >>= tcExpr mt+ ESectR i e -> tcRSect i e >>= tcExpr mt EIf e1 e2 e3 -> do e1' <- tCheckExpr (tBool (getSLoc e1)) e1 case mt of@@ -1667,6 +1647,11 @@ tSetRefType loc ref t2 return (EIf e1' e2'' e3'') + -- Translate (if | a1; | a2 ...) into+ -- (case [] of _ | a1; | a2 ...)+ EMultiIf a ->+ tcExpr mt $ ECase (EListish (LList [])) [(EVar (mkIdent "_"), a)]+ EListish (LList es) -> do te <- newUVar munify loc mt (tApp (tList loc) te)@@ -1706,11 +1691,11 @@ e' <- instSigma loc e t' mt checkSigma e' t' -- Only happens in type&kind checking mode.- EForall vks t ->+ EForall b vks t -> -- assertTCMode (==TCType) $ withVks vks $ \ vks' -> do tt <- tcExpr mt t- return (EForall vks' tt)+ return (EForall b vks' tt) EUpdate e flds -> do ises <- concat <$> mapM (dsEField e) flds me <- dsUpdate unsetField e ises@@ -1734,6 +1719,7 @@ failureFree (ELazy True _) = return True failureFree (ELazy False p) = failureFree p failureFree (EViewPat _ p) = failureFree p+failureFree (EParen p) = failureFree p failureFree _ = return False failureFreeAp :: [Bool] -> EPat -> T Bool@@ -1753,7 +1739,7 @@ eSetFields :: EField -> Expr -> Expr eSetFields (EField is e) r = let loc = getSLoc is- eCompose = EVar $ mkIdentSLoc loc "composeSet"+ eCompose = EVar $ mkBuiltin loc "composeSet" has = map eHasField $ init is set1 = eSetField (last is) set = foldr (EApp . EApp eCompose) set1 has@@ -1762,19 +1748,19 @@ eHasField :: Ident -> Expr eHasField i = EApp (EVar ihas) (eProxy i)- where ihas = mkIdentSLoc (getSLoc i) "hasField"+ where ihas = mkBuiltin (getSLoc i) "hasField" eSetField :: Ident -> Expr eSetField i = EApp (EVar iset) (eProxy i)- where iset = mkIdentSLoc (getSLoc i) "setField"+ where iset = mkBuiltin (getSLoc i) "setField" eGetField :: Ident -> Expr eGetField i = EApp (EVar iget) (eProxy i)- where iget = mkIdentSLoc (getSLoc i) "getField"+ where iget = mkBuiltin (getSLoc i) "getField" eProxy :: Ident -> Expr eProxy i = ESign proxy (EApp proxy (ELit loc (LStr (unIdent i))))- where proxy = EVar $ mkIdentSLoc loc "Proxy"+ where proxy = EVar $ mkBuiltin loc "Proxy" loc = getSLoc i dsEField :: Expr -> EField -> T [EField]@@ -1802,6 +1788,7 @@ ELazy z p -> ELazy z <$> dsEFields p ECon _ -> return apat EUpdate c fs -> EUpdate c . concat <$> mapM (dsEField c) fs+ EParen p -> dsEFields p ENegApp _ -> return apat _ -> error $ "dsEFields " ++ show apat @@ -1829,7 +1816,7 @@ _ -> return Nothing enum :: SLoc -> String -> [Expr] -> Expr-enum loc f = eApps (EVar (mkIdentSLoc loc ("enum" ++ f)))+enum loc f = eApps (EVar (mkBuiltin loc ("enum" ++ f))) tcLit :: HasCallStack => Expected -> SLoc -> Lit -> T Expr tcLit mt loc l@(LPrim _) = newUVar >>= tcLit' mt loc l@@ -1866,6 +1853,29 @@ Left (loc, err) -> tcError loc err Right e -> return e +tcLSect :: Expr -> Ident -> T Expr+tcLSect (EOper e ies) op = do+ let x = eVarI loc "$x"+ loc = getSLoc op+ e' <- tcOper e (ies ++ [(op, x)])+ case e' of+ EApp f x' | x' `eqExpr` x -> return f+ _ -> tcError loc "Bad section fixity"+tcLSect e op =+ return (EApp (EVar op) e)++tcRSect :: Ident -> Expr -> T Expr+tcRSect op (EOper e ies) = do+ let x = eVarI loc "$x"+ loc = getSLoc op+ e' <- tcOper x ((op, e):ies)+ case e' of+ EApp (EApp _ x') _ | x `eqExpr` x' -> return (eLam [x] e')+ _ -> tcError loc "Bad section fixity"+tcRSect op e = do+ let x = eVarI (getSLoc op) "$x"+ return (eLam [x] (EApp (EApp (EVar op) x) e))+ unArrow :: HasCallStack => SLoc -> EType -> T (EType, EType) unArrow loc t = do@@ -1904,7 +1914,8 @@ tcEqns :: Bool -> EType -> [Eqn] -> T [Eqn] --tcEqns _ t eqns | trace ("tcEqns: " ++ showEBind (BFcn dummyIdent eqns) ++ " :: " ++ show t) False = undefined-tcEqns top (EForall iks t) eqns = withExtTyps iks $ tcEqns top t eqns+tcEqns top (EForall expl iks t) eqns | expl = withExtTyps iks $ tcEqns top t eqns+ | otherwise = tcEqns top t eqns tcEqns top t eqns | Just (ctx, t') <- getImplies t = do let loc = getSLoc eqns d <- newADictIdent loc@@ -1920,7 +1931,7 @@ let loc = getSLoc eqns f <- newIdent loc "fcnS" (eqns', ds) <- solveAndDefault top $ mapM (tcEqn t) eqns--- traceM $ "tcEqns done: " ++ showEBind (BFcn dummyIdent eqns')+-- tcTrace $ "tcEqns done: " ++ showEBind (BFcn dummyIdent eqns') case ds of [] -> return eqns' _ -> do@@ -1934,7 +1945,7 @@ tcEqn t eqn = case eqn of Eqn ps alts -> tcPats t ps $ \ t' ps' -> do--- traceM $ "tcEqn " ++ show ps ++ " ---> " ++ show ps'+-- tcTrace $ "tcEqn " ++ show ps ++ " ---> " ++ show ps' alts' <- tcAlts t' alts return (Eqn ps' alts') @@ -1950,7 +1961,7 @@ tcAlts t (EAlts alts bs) = -- trace ("tcAlts: bs in " ++ showEBinds bs) $ tcBinds bs $ \ bs' -> do--- traceM ("tcAlts: bs out " ++ showEBinds bbs)+-- tcTrace ("tcAlts: bs out " ++ showEBinds bbs) alts' <- mapM (tcAlt t) alts return (EAlts alts' bs') @@ -2017,17 +2028,17 @@ tCheckPatC t p@(EVar v) ta | not (isConIdent v) = do -- simple special case withExtVals [(v, t)] $ ta p tCheckPatC t app ta = do--- traceM $ "tCheckPatC: " ++ show app ++ " :: " ++ show t+-- tcTrace $ "tCheckPatC: " ++ show app ++ " :: " ++ show t app' <- dsEFields app let vs = patVars app' multCheck vs env <- mapM (\ v -> (,) v <$> newUVar) vs withExtVals env $ do (_sks, ds, pp) <- tCheckPat t app'--- traceM ("tCheckPatC: " ++ show pp)+-- tcTrace ("tCheckPatC: " ++ show pp) () <- checkArity 0 pp -- xt <- derefUVar t--- traceM ("tCheckPatC ds=" ++ show ds ++ "t=" ++ show xt)+-- tcTrace ("tCheckPatC ds=" ++ show ds ++ "t=" ++ show xt) -- XXX must check for leaking skolems withDicts ds $ ta pp@@ -2043,7 +2054,7 @@ tcPat :: Expected -> EPat -> T EPatRet tcPat mt ae = let loc = getSLoc ae- lit = tcPat mt (EViewPat (EApp (EVar (mkIdentSLoc loc "==")) ae) (EVar (mkIdentSLoc loc "True")))+ lit = tcPat mt (EViewPat (EApp (EVar (mkBuiltin loc "==")) ae) (EVar (mkBuiltin loc "True"))) isNeg (EVar i) = i == mkIdent "negate" isNeg _ = False in@@ -2055,12 +2066,12 @@ | isConIdent i -> do (con, xpt) <- tLookupV i--- traceM (show ipt)+-- tcTrace (show ipt) case xpt of -- Sanity check- EForall _ (EForall _ _) -> return ()- _ -> undefined- EForall avs apt <- tInst' xpt+ EForall _ _ (EForall _ _ _) -> return ()+ _ -> impossibleShow i+ EForall _ avs apt <- tInst' xpt (sks, spt) <- shallowSkolemise avs apt (d, p, pt) <- case getImplies spt of@@ -2091,9 +2102,9 @@ | isNeg f -> lit -- if it's (negate e) it must have been a negative literal | otherwise -> do ((skf, df, f'), ft) <- tInferPat f--- traceM $ "tcPat: EApp f=" ++ showExpr f ++ "; e'=" ++ showExpr f' ++ " :: " ++ showEType ft+-- tcTrace $ "tcPat: EApp f=" ++ showExpr f ++ "; e'=" ++ showExpr f' ++ " :: " ++ showEType ft (at, rt) <- unArrow loc ft--- traceM ("tcPat EApp: " ++ showExpr f ++ " :: " ++ showEType ft)+-- tcTrace ("tcPat EApp: " ++ showExpr f ++ " :: " ++ showEType ft) (ska, da, a') <- tCheckPat at a instPatSigma loc rt mt return (skf ++ ska, df ++ da, EApp f' a')@@ -2108,6 +2119,8 @@ munify loc mt ttup return (concat sks, concat ds, ETuple ees) + EParen e -> tcPat mt e+ EListish (LList es) -> do te <- newUVar munify loc mt (tApp (tList loc) te)@@ -2236,8 +2249,9 @@ EOper t ies -> EOper (dsType t) [(i, dsType e) | (i, e) <- ies] EListish (LList [t]) -> tApp (tList (getSLoc at)) (dsType t) ETuple ts -> tApps (tupleConstr (getSLoc at) (length ts)) (map dsType ts)+ EParen t -> dsType t ESign t k -> ESign (dsType t) k- EForall iks t -> EForall iks (dsType t)+ EForall b iks t -> EForall b iks (dsType t) ELit _ (LStr _) -> at ELit _ (LInteger _) -> at _ -> impossible@@ -2252,9 +2266,7 @@ tBool loc = tConI loc $ boolPrefix ++ "Bool" showTModule :: forall a . (a -> String) -> TModule a -> String-showTModule sh amdl =- case amdl of- TModule mn _ _ _ _ _ _ a -> "Tmodule " ++ showIdent mn ++ "\n" ++ sh a ++ "\n"+showTModule sh amdl = "Tmodule " ++ showIdent (tModuleName amdl) ++ "\n" ++ sh (tBindingsOf amdl) ++ "\n" ----------------------------------------------------- @@ -2284,7 +2296,7 @@ zipWithM_ (\ tv n -> setUVar tv (EVar n)) tvs newVars ty' <- derefUVar ty putUvarSubst osubst -- reset the setUVar we did above- return (EForall newVarsK ty')+ return (EForall False newVarsK ty') allBinders :: [Ident] -- a,b,..z, a1, b1,... z1, a2, b2,... allBinders = [ mkIdent [x] | x <- ['a' .. 'z'] ] ++@@ -2300,7 +2312,7 @@ Sigma -> T ([TyVar], Rho) -- Performs deep skolemisation, returning the -- skolem constants and the skolemised type.-skolemise (EForall tvs ty) = do -- Rule PRPOLY+skolemise (EForall _ tvs ty) = do -- Rule PRPOLY (sks1, ty') <- shallowSkolemise tvs ty (sks2, ty'') <- skolemise ty' return (sks1 ++ sks2, ty'')@@ -2328,7 +2340,7 @@ | elem tv acc = acc | otherwise = tv : acc go (EVar _) acc = acc- go (EForall _ ty) acc = go ty acc+ go (EForall _ _ ty) acc = go ty acc go (EApp fun arg) acc = go fun (go arg acc) go (ELit _ _) acc = acc go _ _ = impossible@@ -2349,7 +2361,7 @@ checkSigma expr sigma = do (skol_tvs, rho) <- skolemise sigma -- sigma' <- derefUVar sigma--- traceM $ "**** checkSigma: " ++ show expr ++ " :: " ++ show sigma ++ " = " ++ show sigma' ++ " " ++ show skol_tvs+-- tcTrace $ "**** checkSigma: " ++ show expr ++ " :: " ++ show sigma ++ " = " ++ show sigma' ++ " " ++ show skol_tvs expr' <- tCheckExpr rho expr if null skol_tvs then -- Fast special case@@ -2365,7 +2377,7 @@ subsCheckRho :: HasCallStack => SLoc -> Expr -> Sigma -> Rho -> T Expr --subsCheckRho _ e1 t1 t2 | trace ("subsCheckRho: " ++ show e1 ++ " :: " ++ show t1 ++ " = " ++ show t2) False = undefined-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@@ -2378,7 +2390,7 @@ (a2,r2) <- unArrow loc rho2 subsCheckFun loc exp1 a1 r1 a2 r2 subsCheckRho loc exp1 tau1 tau2 = do -- Rule MONO--- traceM $ "subsCheckRho: MONO " ++ show (tau1, tau2)+-- tcTrace $ "subsCheckRho: MONO " ++ show (tau1, tau2) unify loc tau1 tau2 -- Revert to ordinary unification return exp1 @@ -2391,11 +2403,11 @@ instSigma :: HasCallStack => SLoc -> Expr -> Sigma -> Expected -> T Expr instSigma loc e1 t1 (Check t2) = do--- traceM ("instSigma: Check " ++ showEType t1 ++ " = " ++ showEType t2)+-- tcTrace ("instSigma: Check " ++ showEType t1 ++ " = " ++ showEType t2) subsCheckRho loc e1 t1 t2 instSigma loc e1 t1 (Infer r) = do (e1', t1') <- tInst e1 t1- --traceM ("instSigma: Infer " ++ showEType t1 ++ " ==> " ++ showEType t1')+ --tcTrace ("instSigma: Infer " ++ showEType t1 ++ " ==> " ++ showEType t1') tSetRefType loc r t1' return e1' @@ -2431,7 +2443,7 @@ -- XXX it seems we can get here, e.g., Control.Monad.Fail without Applicative import error ("expandDict: " ++ show iCls) return [(edict, vks, ctx, cc, [])]- Just (iks, sups, _, _, fds) -> do+ Just (ClassInfo iks sups _ _ fds) -> do let vs = map idKindIdent iks sub = zip vs args@@ -2466,7 +2478,7 @@ ds <- solveConstraints cs <- gets constraints vs <- getMetaTyVars (map snd cs) -- These are the type variables that need defaulting--- traceM $ "solveAndDefault: meta=" ++ show vs+-- tcTrace $ "solveAndDefault: meta=" ++ show vs -- XXX may have to iterate this with fundeps ds' <- concat <$> mapM defaultOneTyVar vs return (a, ds ++ ds')@@ -2485,20 +2497,23 @@ let tryDefaults [] = return [] tryDefaults (ty:tys) = do ok <- checkDefaultTypes ty ourcs- --traceM ("checkDefaultTypes: " ++ show (tv, ty, ourcs, ok))+-- tcTrace ("checkDefaultTypes: " ++ show (EUVar tv, ty, ourcs, ok)) if not ok then tryDefaults tys -- don't default else do+-- tcTrace $ "defaultOneTyVar: " ++ show (EUVar tv) ++ ":=" ++ showEType ty setUVar tv ty putConstraints ourcs ds <- solveConstraints rcs <- gets constraints if null rcs then do -- Success, the type variable is gone+-- tcTrace $ "defaultOneTyVar success: " ++ show (EUVar tv) putConstraints othercs -- put back the other constraints return ds else do -- Not solved, try with the nest type+-- tcTrace $ "defaultOneTyVar failed: " ++ show rcs put old -- restore solver state tryDefaults tys -- and try with next type tryDefaults (defaults old)@@ -2514,7 +2529,7 @@ ct <- gets classTable case M.lookup i ct of Nothing -> return Nothing- Just (_, supers, _, _, _) -> return $ Just $ map (fst . getApp) supers+ Just (ClassInfo _ supers _ _ _) -> return $ Just $ map (fst . getApp) supers checkDefaultTypes :: EType -> Constraints -> T Bool checkDefaultTypes ty cs = do@@ -2576,13 +2591,13 @@ return [] else do addMetaDicts- --traceM "------------------------------------------\nsolveConstraints"+-- tcTrace "------------------------------------------\nsolveConstraints" cs' <- mapM (\ (i,t) -> do { t' <- derefUVar t; return (i,t') }) cs- --traceM ("constraints:\n" ++ unlines (map showConstraint cs'))+-- tcTrace ("constraints:\n" ++ unlines (map showConstraint cs')) (unsolved, solved, improves) <- solveMany cs' [] [] [] putConstraints unsolved- --traceM ("solved:\n" ++ unlines [ showIdent i ++ " = " ++ showExpr e | (i, e) <- solved ])- --traceM ("unsolved:\n" ++ unlines [ showIdent i ++ " :: " ++ showEType t | (i, t) <- unsolved ])+-- tcTrace ("solved:\n" ++ unlines [ showIdent i ++ " = " ++ showExpr e | (i, e) <- solved ])+-- tcTrace ("unsolved:\n" ++ unlines [ showIdent i ++ " :: " ++ showEType t | (i, t) <- unsolved ]) if null improves then return solved else do@@ -2602,8 +2617,8 @@ solvers = [ (isJust . getTupleConstr, solveTuple) -- handle tuple constraints, i.e. (C1 t1, C2 t2, ...) , ((== mkIdent nameTypeEq), solveTypeEq) -- handle equality constraints, i.e. (t1 ~ t2)- , ((== mkIdent nameKnownNat), solveKnownNat) -- KnownNat 999 constraints- , ((== mkIdent nameKnownSymbol), solveKnownSymbol) -- KnownNat 999 constraints+ , ((== mkIdent nameKnownNat), solveKnownNat) -- KnownNat 123 constraints+ , ((== mkIdent nameKnownSymbol), solveKnownSymbol) -- KnownSymbol "abc" constraints , (const True, solveInst) -- handle constraints with instances ] @@ -2612,16 +2627,16 @@ solveMany [] uns sol imp = return (uns, sol, imp) -- Need to handle ct of the form C => T, and forall a . T solveMany (cns@(di, ct) : cnss) uns sol imp = do--- traceM ("trying " ++ showEType ct)+-- tcTrace ("trying " ++ showEType ct) let loc = getSLoc di !(iCls, cts) = getApp ct solver = head [ s | (p, s) <- solvers, p iCls ] ads <- gets argDicts -- Check if we have an exact match among the arguments dictionaries.- -- This is importand to find tupled dictionaries in recursive calls.+ -- This is important to find tupled dictionaries in recursive calls. case [ ai | (ai, act) <- ads, ct `eqEType` act ] of ai : _ -> do- --traceM $ "solve with arg " ++ show ct+ --tcTrace $ "solve with arg " ++ show ct solveMany cnss uns ((di, EVar ai) : sol) imp [] -> do msol <- solver loc iCls cts@@ -2632,25 +2647,31 @@ solveInst :: SolveOne solveInst loc iCls cts = do it <- gets instTable--- traceM ("instances:\n" ++ unlines (map showInstDef (M.toList it)))+-- tcTrace ("instances:\n" ++ unlines (map showInstDef (M.toList it))) case M.lookup iCls it of Nothing -> return Nothing -- no instances, so no chance- Just (InstInfo atomMap insts fds) ->+ Just (InstInfo atomMap insts fds) -> do+ -- tcTrace $ "solveInst: " ++ showIdent iCls ++ " atomMap size=" ++ show (M.size atomMap) case cts of [EVar i] -> do case M.lookup i atomMap of -- If the goal is just (C T) and there is an instance, the solution is simple Just e -> return $ Just (e, [], []) -- Not found, but there might be a generic instance- Nothing -> solveGen fds insts loc iCls cts- _ -> solveGen fds insts loc iCls cts+ Nothing -> solveGen (M.null atomMap) fds insts loc iCls cts+ _ -> solveGen (M.null atomMap) fds insts loc iCls cts -solveGen :: [IFunDep] -> [InstDict] -> SolveOne-solveGen fds insts loc iCls cts = do--- traceM ("solveGen " ++ show (iCls, cts))- let matches = getBestMatches $ findMatches loc fds insts cts--- traceM ("matches " ++ showListS show (findMatches loc fds insts cts))--- traceM ("matches " ++ showListS showMatch matches)+-- When matching constraint (C _a) against an instance of the form+-- instance (C b) then we don't want to match if the+-- _a is later instantiated and it turns out we should+-- have matched a (C T) instead.+solveGen :: Bool -> [IFunDep] -> [InstDict] -> SolveOne+solveGen noAtoms fds insts loc iCls cts = do+-- tcTrace ("solveGen: " ++ show (iCls, cts))+-- tcTrace ("solveGen: insts=" ++ show insts)+ let matches = getBestMatches $ findMatches noAtoms loc fds insts cts+-- tcTrace ("solveGen: matches allMatches =" ++ showListS show (findMatches noAtoms loc fds insts cts))+-- tcTrace ("solveGen: matches bestMatches=" ++ showListS showMatch matches) case matches of [] -> return Nothing [(de, ctx, is)] ->@@ -2658,7 +2679,7 @@ return $ Just (de, [], is) else do d <- newDictIdent loc--- traceM ("constraint " ++ showIdent di ++ " :: " ++ showEType ct ++ "\n" +++-- tcTrace ("constraint " ++ showIdent di ++ " :: " ++ showEType ct ++ "\n" ++ -- " turns into " ++ showIdent d ++ " :: " ++ showEType (tupleConstraints ctx) ++ ", " ++ -- showIdent di ++ " = " ++ showExpr (EApp de (EVar d))) return $ Just (EApp de (EVar d), [(d, tupleConstraints ctx)], is)@@ -2677,7 +2698,7 @@ solveTypeEq loc _iCls [t1, t2] | isEUVar t1 || isEUVar t2 = return $ Just (ETuple [], [], [(loc, t1, t2)]) | otherwise = do eqs <- gets typeEqTable- --traceM ("solveTypeEq eqs=" ++ show eqs)+ --tcTrace ("solveTypeEq eqs=" ++ show eqs) case solveEq eqs t1 t2 of Nothing -> return Nothing Just (de, tts) -> do@@ -2712,8 +2733,9 @@ -- For each matching instance return: (subst-size, (dict-expression, new-constraints)) -- The subst-size is the size of the substitution that made the input instance match. -- It is a measure of how exact the match is.-findMatches :: SLoc -> [IFunDep] -> [InstDict] -> [EType] -> [(Int, (Expr, [EConstraint], [Improve]))]-findMatches loc fds ds its =+findMatches :: Bool -> SLoc -> [IFunDep] -> [InstDict] -> [EType] -> [(Int, (Expr, [EConstraint], [Improve]))]+findMatches False _ _ _ [EUVar _] = []+findMatches _ loc fds ds its = let rrr = [ (length s, (de, map (substEUVar s) ctx, imp)) | (de, ctx, ts) <- ds, Just (s, imp) <- [matchTypes loc ts its fds] ]@@ -2728,7 +2750,7 @@ substEUVar _ t@(ELit _ _) = t substEUVar s (EApp f a) = EApp (substEUVar s f) (substEUVar s a) substEUVar s t@(EUVar i) = fromMaybe t $ lookup i s-substEUVar s (EForall iks t) = EForall iks (substEUVar s t)+substEUVar s (EForall b iks t) = EForall b iks (substEUVar s t) substEUVar _ _ = impossible -- Length of lists match, because of kind correctness.@@ -2755,7 +2777,7 @@ -- We don't allow output FDs to have tyvars that are not instantiated let outImpTvs = metaTvs [ t | (_,t,_) <- imp ] outTvs = metaTvs [ t | (True, t) <- zip ins ts' ] -- these tyvars were present in input positions in ts--- traceM $ "matchTypesFD: " ++ show (ts, ts') ++ show (ins, outs) ++ show (tm, imp) ++ show (outTvs, outImpTvs)+-- tcTrace $ "matchTypesFD: " ++ show (ts, ts') ++ show (ins, outs) ++ show (tm, imp) ++ show (outTvs, outImpTvs) when (not (null (outImpTvs \\ outTvs))) $ errorMessage loc $ "free type variable in output fundep" pure (tm, imp)@@ -2769,6 +2791,7 @@ match r (EApp f a) (EApp f' a') = do r' <- match r f f' match r' a a'+-- match _ _ (EUVar _) = Nothing match r (EUVar i) t' = -- For a variable, check that any previous match is the same. case lookup i r of@@ -2812,7 +2835,7 @@ (i, t) : _ -> do t' <- derefUVar t -- is <- gets instTable--- traceM $ "Cannot satisfy constraint: " ++ unlines (map (\ (i, ii) -> show i ++ ":\n" ++ showInstInfo ii) (M.toList is))+-- tcTrace $ "Cannot satisfy constraint: " ++ unlines (map (\ (i, ii) -> show i ++ ":\n" ++ showInstInfo ii) (M.toList is)) tcError (getSLoc i) $ "Cannot satisfy constraint: " ++ show t' -- Add a type equality constraint.
src/Text/ParserComb.hs view
@@ -19,8 +19,7 @@ TokenMachine(..), mapTokenState, ) where---Ximport Prelude()-import Prelude+import Prelude(); import MHSPrelude import Control.Applicative import Control.Monad
src/Text/PrettyPrint/HughesPJLite.hs view
@@ -17,7 +17,7 @@ Style, render, renderStyle, ) where-import Prelude hiding ((<>))+import Prelude(); import MHSPrelude hiding ((<>)) infixl 6 <>, <+> infixl 5 $$, $+$
+ src/runtime/MachDeps.h view
@@ -0,0 +1,2 @@+#define WORD_SIZE_IN_BITS 64+#undef WORDS_BIGENDIAN
src/runtime/bfile.c view
@@ -1,13 +1,67 @@ /***************** BFILE *******************/ /*- * BFILE is used to access files.- * It allows various "transducers" to be added- * to the processing.+ * BFILE is a family of stream objects.+ * There are two kinds: endpoints (source/sink) and transducers.+ * The streams are typically bytes.+ *+ * FILE source/sink for stdio FILE handles, handles+ * buf source/sink where the read/write uses a memory buffer.+ *+ * lz77 transducer for LZ77 compression+ * put - compresses a byte+ * get - returns an decompressed byte+ * rle transducer for Run Length Encoding+ * put - compresses an ASCII character+ * get - returns a decompressed ASCII+ * bwt transducer for Burrows-Wheeler Transform+ * put - transforms a byte+ * get - untransforms a byte+ * utf8 transducer for UTF8 encoding+ * put - encodes a Unicode code point (int) to bytes+ * get - decodes a Unicode code point */ +/**** Buffers for collecting data. */++struct bfbuffer {+ size_t size; /* total size of buffer */+ size_t pos; /* current index into buffer */+ uint8_t *buf; /* actual data */+};++void+bfbuffer_init(struct bfbuffer *bf, size_t size)+{+ bf->size = size;+ bf->pos = 0;+ bf->buf = MALLOC(size);+ if (!bf->buf)+ ERR("bfbuffer_init");+}++void+bfbuffer_snoc(struct bfbuffer *bf, int byte)+{+ if (bf->pos >= bf->size) {+ bf->size *= 2;+ bf->buf = REALLOC(bf->buf, bf->size);+ if (!bf->buf)+ ERR("bfbuffer_snoc");+ }+ bf->buf[bf->pos++] = byte;+}++void+bfbuffer_free(struct bfbuffer *bf)+{+ FREE(bf->buf);+}++/*********************************/+ /* Sanity checking */-#define CHECKBFILE(p, f) do { if (p->getb != f) ERR("CHECKBFILE"); } while(0)+#define CHECKBFILE(p, f) do { if (p->getb != f) { ERR("CHECKBFILE"); } } while(0) /* BFILE will have different implementations, they all have these methods */ typedef struct BFILE {@@ -92,7 +146,26 @@ } } -/***************** BFILE from static buffer *******************/+void+putint32(value_t n, BFILE *p)+{+ putb(n % 256, p); n /= 256;+ putb(n % 256, p); n /= 256;+ putb(n % 256, p); n /= 256;+ putb(n % 256, p);+}++value_t+getint32(BFILE *p)+{+ value_t b0 = getb(p);+ value_t b1 = getb(p);+ value_t b2 = getb(p);+ value_t b3 = getb(p);+ return ((((b3 * 256) + b2) * 256) + b1) * 256 + b0;+}++/***************** BFILE from/to memory buffer *******************/ struct BFILE_buffer { BFILE mets; size_t b_size;@@ -111,6 +184,20 @@ } void+putb_buf(int c, BFILE *bp)+{+ 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;+}++void ungetb_buf(int c, BFILE *bp) { struct BFILE_buffer *p = (struct BFILE_buffer *)bp;@@ -121,30 +208,77 @@ } void-closeb_buf(BFILE *bp)+closeb_rd_buf(BFILE *bp) { CHECKBFILE(bp, getb_buf); FREE(bp); } -/* There is no open(). Only used with statically allocated buffers. */+void+closeb_wr_buf(BFILE *bp)+{+ CHECKBFILE(bp, getb_buf);+ FREE(bp);+}++void+flushb_buf(BFILE *bp)+{+ CHECKBFILE(bp, getb_buf);+}+ struct BFILE*-openb_buf(uint8_t *buf, size_t len)+openb_rd_buf(uint8_t *buf, size_t len) {- struct BFILE_buffer *p = MALLOC(sizeof(struct BFILE_buffer));;+ struct BFILE_buffer *p = MALLOC(sizeof(struct BFILE_buffer)); if (!p) memerr(); p->mets.getb = getb_buf; p->mets.ungetb = ungetb_buf; p->mets.putb = 0; p->mets.flushb = 0;- p->mets.closeb = closeb_buf;+ p->mets.closeb = closeb_rd_buf; p->b_size = len; p->b_pos = 0; p->b_buffer = buf; return (struct BFILE*)p; } +struct BFILE*+openb_wr_buf(void)+{+ struct BFILE_buffer *p = MALLOC(sizeof(struct BFILE_buffer));+ if (!p)+ memerr();+ p->mets.getb = getb_buf; /* Just to make CHECKFILE happy */+ p->mets.ungetb = 0;+ 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");+ 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.+ * The caller of openb_wr_buf() and get_buf() owns+ * the memory and must free it.+ */+void+get_buf(struct BFILE *bp, uint8_t **bufp, size_t *lenp)+{+ struct BFILE_buffer *p = (struct BFILE_buffer *)bp;+ CHECKBFILE(bp, getb_buf);+ *bufp = p->b_buffer;+ *lenp = p->b_pos;+}+ #if WANT_STDIO /***************** BFILE via FILE *******************/ struct BFILE_file {@@ -223,10 +357,9 @@ struct BFILE_lz77 { BFILE mets; BFILE *bfile; /* underlying BFILE */- uint8_t *buf;- size_t len;- size_t pos;+ struct bfbuffer bf; int read;+ int numflush; }; int@@ -234,9 +367,9 @@ { struct BFILE_lz77 *p = (struct BFILE_lz77*)bp; CHECKBFILE(bp, getb_lz77);- if (p->pos >= p->len)+ if (p->bf.pos >= p->bf.size) return -1;- return p->buf[p->pos++];+ return p->bf.buf[p->bf.pos++]; } void@@ -244,7 +377,7 @@ { struct BFILE_lz77 *p = (struct BFILE_lz77*)bp; CHECKBFILE(bp, getb_lz77);- p->pos--;+ p->bf.pos--; } void@@ -253,13 +386,29 @@ struct BFILE_lz77 *p = (struct BFILE_lz77*)bp; CHECKBFILE(bp, getb_lz77); - if (p->pos >= p->len) {- p->len *= 2;- p->buf = realloc(p->buf, p->len);- if (!p->buf)- memerr();+ bfbuffer_snoc(&p->bf, b);+}++/* Compress and write to output BFILE */+void+flushb_lz77(BFILE *bp)+{+ struct BFILE_lz77 *p = (struct BFILE_lz77*)bp;+ CHECKBFILE(bp, getb_lz77);++ /* If we have had a flush, and there is no new data then do nothing */+ if (p->numflush++ && !p->bf.pos)+ return;+ uint8_t *obuf;+ size_t olen = lz77c(p->bf.buf, p->bf.pos, &obuf);+ putsb("LZ1", p->bfile); /* Version no */+ putint32(olen, p->bfile); /* 32 bit length */+ for (size_t i = 0; i < olen; i++) {+ putb(obuf[i], p->bfile); /* and the data */ }- p->buf[p->pos++] = b;+ free(obuf);+ p->bf.pos = 0;+ flushb(p->bfile); } void@@ -270,25 +419,14 @@ if (!p->read) { /* We are in write mode, so compress and push it down */- uint8_t *obuf;- size_t olen = lz77c(p->buf, p->pos, &obuf);- FREE(p->buf);- for (size_t i = 0; i < olen; i++) {- putb(obuf[i], p->bfile);- }- FREE(obuf);+ flushb_lz77(bp);+ bfbuffer_free(&p->bf); } closeb(p->bfile); FREE(p); } -void-flushb_lz77(BFILE *bp)-{- /* There is nothing we can do */-}- BFILE * add_lz77_decompressor(BFILE *file) {@@ -304,27 +442,22 @@ p->mets.closeb = closeb_lz77; p->read = 1; p->bfile = file;+ p->numflush = 0; - size_t size = 25000;- uint8_t *buf = MALLOC(size);- size_t i;+ /* First check version */+ if (getb(file) != 'L' || getb(file) != 'Z' || getb(file) != '1')+ ERR("Bad LZ77 signature");++ size_t size = getint32(file); /* then read size */+ uint8_t *buf = MALLOC(size); /* temporary buffer for input */ if (!buf) memerr();- for(i = 0;;) {- int b = getb(file);- if (b < 0)- break;- if (i >= size) {- size *= 2;- buf = realloc(buf, size);- if (!buf)- memerr();- }- buf[i++] = b;+ for(size_t i = 0; i < size; i++) {+ buf[i] = getb(file); /* and read data */ }- p->len = lz77d(buf, i, &p->buf);+ p->bf.size = lz77d(buf, size, &p->bf.buf); /* decompress */ FREE(buf);- p->pos = 0;+ p->bf.pos = 0; return (BFILE*)p; } @@ -343,16 +476,431 @@ p->mets.closeb = closeb_lz77; p->read = 0; p->bfile = file;+ p->numflush = 0; - p->len = 25000;- p->buf = MALLOC(p->len);- if (!p->buf)- memerr();- p->pos = 0;+ bfbuffer_init(&p->bf, 25000); return (BFILE*)p; } #endif /* WANT_LZ77 */++#if WANT_RLE+/***************** BFILE via RLE decompression *******************/+/*+ * 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+ * ... for longer run lengths+ * Non-ASCII (i.e., >= 128) have very poor encoding:+ * 0x81 c-0x80+ */++struct BFILE_rle {+ BFILE mets;+ BFILE *bfile; /* underlying BFILE */+ size_t count;+ int byte;+ int unget;+ int read;+};++int+get_rep(BFILE *in)+{+ size_t n = 0;+ for(;;) {+ int c = getb(in);+ //fprintf(stderr,"get_rep %02x\n", c);+ if (c < 0)+ return -1;+ if (c < 128) {+ ungetb(c, in);+ return n;+ }+ n = n * 128 + c - 128;+ }+}++int+getb_rle(BFILE *bp)+{+ struct BFILE_rle *p = (struct BFILE_rle*)bp;+ CHECKBFILE(bp, getb_rle);+ if (p->unget >= 0) {+ int c = p->unget;+ p->unget = -1;+ return c;+ }+ if (p->count) {+ p->count--;+ return p->byte;+ } else {+ int n = get_rep(p->bfile);+ if (n < 0) {+ return -1;+ } else if (n == 1) {+ /* repetition count == 1 means a non-ASCII byte */+ return getb(p->bfile) | 0x80;+ } else {+ p->count = n;+ p->byte = getb(p->bfile);+ return p->byte;+ }+ }+}++void+ungetb_rle(int c, BFILE *bp)+{+ struct BFILE_rle *p = (struct BFILE_rle*)bp;+ CHECKBFILE(bp, getb_rle);+ p->unget = c;+}++void+put_rep(BFILE *out, size_t n)+{+ if (n > 127)+ put_rep(out, n / 128);+ putb(n % 128 + 128, out);+}++void+out_rle(struct BFILE_rle *p)+{+ if (p->count > 2) {+ /* More than 2 repeating chars, it's worth compressing */+ put_rep(p->bfile, p->count - 1);+ putb(p->byte, p->bfile);+ } else {+ while(p->count-- > 0)+ putb(p->byte, p->bfile);+ }+}++void+putb_rle(int b, BFILE *bp)+{+ struct BFILE_rle *p = (struct BFILE_rle*)bp;+ CHECKBFILE(bp, getb_rle);++ if (b & 0x80) {+ /* Encode non-ASCII as repetition count 1, followed by the byte with MSB removed */+ out_rle(p);+ put_rep(p->bfile, 1);+ putb(b & 0x7f, p->bfile);+ p->count = 0;+ p->byte = -1;+ } else if (b == p->byte) {+ p->count++;+ } else {+ out_rle(p);+ p->count = 1;+ p->byte = b;+ }+}++void+closeb_rle(BFILE *bp)+{+ struct BFILE_rle *p = (struct BFILE_rle*)bp;+ CHECKBFILE(bp, getb_rle);++ if (!p->read)+ flushb(bp);++ closeb(p->bfile);+}++void+flushb_rle(BFILE *bp)+{+ struct BFILE_rle *p = (struct BFILE_rle*)bp;+ CHECKBFILE(bp, getb_rle);++ /* output last byte(s) */+ out_rle(p);+ p->count = 0;+ flushb(p->bfile);+}++BFILE *+add_rle_decompressor(BFILE *file)+{+ struct BFILE_rle *p = MALLOC(sizeof(struct BFILE_rle));++ if (!p)+ memerr();+ p->mets.getb = getb_rle;+ p->mets.ungetb = ungetb_rle;+ p->mets.putb = 0;+ p->mets.flushb = 0;+ p->mets.closeb = closeb_rle;+ p->count = 0;+ p->unget = -1;+ p->bfile = file;+ p->read = 1;++ return (BFILE*)p;+}++BFILE *+add_rle_compressor(BFILE *file)+{+ struct BFILE_rle *p = MALLOC(sizeof(struct BFILE_rle));++ if (!p)+ memerr();+ p->mets.getb = getb_rle;+ p->mets.ungetb = 0;+ p->mets.putb = putb_rle;+ p->mets.flushb = flushb_rle;+ p->mets.closeb = closeb_rle;+ p->count = 0;+ p->byte = -1;+ p->bfile = file;+ p->read = 0;++ return (BFILE*)p;+}++#endif /* WANT_RLE */++#if WANT_BWT+/***************** BFILE via Burrows-Wheeler Transform *******************/+/*+ */++struct BFILE_bwt {+ BFILE mets;+ BFILE *bfile; /* underlying BFILE */+ size_t count;+ struct bfbuffer bf;+ int read;+ int numflush;+};++int+getb_bwt(BFILE *bp)+{+ 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++];+}++void+ungetb_bwt(int c, BFILE *bp)+{+ struct BFILE_bwt *p = (struct BFILE_bwt*)bp;+ CHECKBFILE(bp, getb_bwt);+ p->bf.pos--;+}++void+putb_bwt(int b, BFILE *bp)+{+ struct BFILE_bwt *p = (struct BFILE_bwt*)bp;+ CHECKBFILE(bp, getb_bwt);++ bfbuffer_snoc(&p->bf, b);+}++void+closeb_bwt(BFILE *bp)+{+ struct BFILE_bwt *p = (struct BFILE_bwt*)bp;+ CHECKBFILE(bp, getb_bwt);++ if (!p->read)+ flushb(bp);++ closeb(p->bfile);+}++/* Sort all rotations of buf, and the indices of the sorted strings in res. */+/*+ * |.......................................|+ * ^ ^+ * a b+ * <- n ->+ * <- m ->+ * <- o ->+ */+static uint8_t *compar_arg;+static size_t compar_len;+int compar(const void *pa, const void *pb)+{+ uint32_t a = *(uint32_t*)pa;+ uint32_t b = *(uint32_t*)pb;+ int r;+ if (a == b)+ return 0;+ if (a < b) {+ size_t n = compar_len - b; /* bytes until end of buffer */+ r = memcmp(compar_arg + a, compar_arg + b, n);+ if (r)+ return r;+ size_t m = b - a;+ r = memcmp(compar_arg + a + n, compar_arg, m);+ if (r)+ return r;+ size_t o = a;+ return memcmp(compar_arg, compar_arg + m, o);+ } else {+ size_t n = compar_len - a; /* bytes until end of buffer */+ r = memcmp(compar_arg + a, compar_arg + b, n);+ if (r)+ return r;+ size_t m = a - b;+ r = memcmp(compar_arg, compar_arg + b + n, m);+ if (r)+ return r;+ size_t o = a;+ return memcmp(compar_arg + m, compar_arg, o);+ + }+ return 0;+}++void+sort_buffer(uint8_t *buf, size_t buflen, uint32_t *res)+{+ for(size_t i = 0; i < buflen; i++)+ res[i] = i;+ compar_arg = buf;+ compar_len = buflen;+ qsort(res, buflen, sizeof(uint32_t), compar);+}++uint32_t+encode_bwt(uint8_t *data, size_t len, uint8_t *last)+{+ uint32_t *res = malloc(len * sizeof(uint32_t));+ if (!res)+ ERR("encode_bwt");+ sort_buffer(data, len, res);+ uint32_t zero = 0;+ for(size_t i = 0; i < len; i++) {+ uint32_t offs = res[i];+ last[i] = data[(offs + len - 1) % len];+ if (offs == 0)+ zero = i;+ }+ return zero;+}++void+flushb_bwt(BFILE *bp)+{+ struct BFILE_bwt *p = (struct BFILE_bwt*)bp;+ CHECKBFILE(bp, getb_bwt);++ /* If we have had a flush, and there is no new data then do nothing */+ if (p->numflush++ && !p->bf.pos)+ return;+ putsb("BW1", p->bfile); /* version no */+ putint32(p->bf.pos, p->bfile); /* 32 bit length */+ uint8_t *last = malloc(p->bf.pos);+ if (!last)+ ERR("flushb_bwt");+ size_t zero = encode_bwt(p->bf.buf, p->bf.pos, last);+ putint32(zero, p->bfile);+ for(size_t i = 0; i < p->bf.pos; i++)+ putb(last[i], p->bfile);+ FREE(last);+ p->bf.pos = 0;+ flushb(p->bfile);+}++#define MAXBYTE 256++void+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));+ for(size_t i = 0; i < MAXBYTE; i++) {+ count[i] = 0;+ }+ for(size_t i = 0; i < len; i++) {+ pred[i] = count[data[i]]++;+ }+ size_t sum = 0;+ for(size_t i = 0; i < MAXBYTE; i++) {+ size_t s = count[i];+ count[i] = sum;+ sum += s;+ }+ size_t i = zero;+ for(size_t j = len; j > 0; j--) {+ odata[j - 1] = data[i];+ i = pred[i] + count[data[i]];+ }+}++BFILE *+add_bwt_decompressor(BFILE *file)+{+ struct BFILE_bwt *p = MALLOC(sizeof(struct BFILE_bwt));++ if (!p)+ memerr();+ memset(p, 0, sizeof(struct BFILE_bwt));+ p->mets.getb = getb_bwt;+ p->mets.ungetb = ungetb_bwt;+ p->mets.putb = 0;+ p->mets.flushb = 0;+ p->mets.closeb = closeb_bwt;+ p->read = 1;+ p->bfile = file;+ p->numflush = 0;++ /* First check version */+ if (getb(file) != 'B' || getb(file) != 'W' || getb(file) != '1')+ ERR("Bad BWT signature");++ size_t size = getint32(file); /* then read size */+ uint32_t zero = getint32(file);++ uint8_t *buf = MALLOC(size); /* temporary buffer for input */+ if (!buf)+ memerr();+ for(size_t i = 0; i < size; i++) {+ buf[i] = getb(file); /* and read data */+ }+ bfbuffer_init(&p->bf, size);+ decode_bwt(buf, size, p->bf.buf, zero); /* decode */+ FREE(buf);++ return (BFILE*)p;+}++BFILE *+add_bwt_compressor(BFILE *file)+{+ struct BFILE_bwt *p = MALLOC(sizeof(struct BFILE_bwt));++ if (!p)+ memerr();+ p->mets.getb = getb_bwt;+ p->mets.ungetb = 0;+ p->mets.putb = putb_bwt;+ p->mets.flushb = flushb_bwt;+ p->mets.closeb = closeb_bwt;+ p->read = 0;+ p->bfile = file;+ p->numflush = 0;++ bfbuffer_init(&p->bf, 25000);+ return (BFILE*)p;+}++#endif /* WANT_BWT */+ /***************** BFILE with UTF8 encode/decode *******************/ struct BFILE_utf8 {
src/runtime/config-unix-32.h view
@@ -4,4 +4,7 @@ //#define WORD_SIZE 32 #undef FFS+#if _POSIX_VERSION >= 200112L #define FFS ffs+#endif+
src/runtime/config-unix-64.h view
@@ -39,17 +39,32 @@ #define WANT_DIR 1 /*+ * Include time_t type+ */+#define WANT_TIME 1++/* * Number of bits in a word. Only 32 and 64 are supported. */ //#define WORD_SIZE 64 /* * Find First Set- * This macro must be defined.+ * This macro should be defined. * It returns the number of the least significant bit that is set. * Numberings starts from 1. If no bit is set, it should return 0. */+#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)+#define FFS __builtin_ffsl+#endif+ /* * This is the character used for comma-separation in printf.
src/runtime/eval.c view
@@ -19,6 +19,9 @@ #include <sys/stat.h> #include <sys/types.h> #endif /* WANT_DIR */+#if WANT_TIME+#include <time.h>+#endif #if WANT_MD5 #include "md5.h"@@ -28,6 +31,14 @@ #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);@@ -172,8 +183,8 @@ 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_EQ, T_NE, T_LT, T_LE, T_GT, T_GE, T_ULT, T_ULE, T_UGT, T_UGE,- T_FPADD, T_FP2P, T_FPNEW, T_FPFIN,+ 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,@@ -248,7 +259,7 @@ void *uuptr; HsFunPtr uufunptr; struct ioarray *uuarray;- struct forptr *uuforptr;+ struct forptr *uuforptr; /* foreign pointers and byte arrays */ } uarg; } node; typedef struct node* NODEPTR;@@ -328,9 +339,10 @@ * The size field is non-zero only for bytestrings. */ struct forptr {- struct forptr *next; /* the next ForeignPtr that shares the same finilizer */+ 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 */ @@ -564,11 +576,9 @@ heapoffs_t pos; NODEPTR n; -#if 1 /* This can happen if we run out of memory when parsing. */ if (num_free <= 0) ERR("alloc_node");-#endif for(;;) { heapoffs_t word = free_map[i];@@ -713,12 +723,14 @@ { "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_COMPARE },+ { "icmp", T_ICMP },+ { "ucmp", T_UCMP }, { "rnf", T_RNF }, { "fromUTF8", T_BSFROMUTF8 }, { "toUTF8", T_BSTOUTF8 },@@ -760,7 +772,26 @@ 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;+}+#endif++void init_nodes(void) { enum node_tag t;@@ -803,9 +834,9 @@ case T_BINBS1: combBINBS1 = n; break; case T_BINBS2: combBINBS2 = n; break; #if WANT_STDIO- case T_IO_STDIN: comb_stdin = n; SETTAG(n, T_PTR); PTR(n) = add_utf8(add_FILE(stdin)); break;- case T_IO_STDOUT: comb_stdout = n; SETTAG(n, T_PTR); PTR(n) = add_utf8(add_FILE(stdout)); break;- case T_IO_STDERR: comb_stderr = n; SETTAG(n, T_PTR); PTR(n) = add_utf8(add_FILE(stderr)); break;+ 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;@@ -837,9 +868,9 @@ case T_BINBS1: combBINBS1 = n; break; case T_BINBS2: combBINBS2 = n; break; #if WANT_STDIO- case T_IO_STDIN: comb_stdin = n; SETTAG(n, T_PTR); PTR(n) = add_utf8(add_FILE(stdin)); break;- case T_IO_STDOUT: comb_stdout = n; SETTAG(n, T_PTR); PTR(n) = add_utf8(add_FILE(stdout)); break;- case T_IO_STDERR: comb_stderr = n; SETTAG(n, T_PTR); PTR(n) = add_utf8(add_FILE(stderr)); break;+ 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;@@ -1122,6 +1153,8 @@ 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);@@ -1129,12 +1162,17 @@ 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();@@ -1145,6 +1183,16 @@ //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. */@@ -1847,7 +1895,7 @@ } size_t strNodes(size_t len);-NODEPTR mkStringC(const char *str);+NODEPTR mkStringC(char *str); #if WANT_STDIO void@@ -2024,6 +2072,16 @@ } 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)@@ -2031,18 +2089,8 @@ else if (n == comb_stderr) putsb("IO.stderr", f); else {- 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: ERR("Cannot serialize foreign pointers");+ } break; case T_BSTR: print_string(f, FORPTR(n)->payload);@@ -2124,10 +2172,13 @@ 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;@@ -2169,7 +2220,8 @@ default: ERR("print tag"); } if (!prefix) {- putb(' ', f);+ if (GETTAG(n) != T_AP)+ putb(' ', f); if (share) { putb(':', f); putdecb((value_t)LABEL(n), f);@@ -2214,15 +2266,15 @@ freeb_file(bf); } +#if 0 void ppmsg(const char *msg, NODEPTR n) {-#if 0 printf("%s", msg); pp(stdout, n); printf("\n");-#endif }+#endif void dump(const char *msg, NODEPTR at)@@ -2312,6 +2364,7 @@ fp->next = 0; fp->payload = bs; fp->finalizer = fin;+ // fp->desc = 0; return fp; } @@ -2368,16 +2421,18 @@ return len; } -/* Turn a C string into a combinator string */+/* Turn a C string into a combinator string.+ * Does NOT do UTF decoding.+ */ NODEPTR-mkString(const char *astr, size_t len)+mkString(struct bytestring bs) { NODEPTR n, nc; size_t i;- const unsigned char *str = (unsigned char*)astr; /* no sign bits, please */+ const unsigned char *str = bs.string; /* no sign bits, please */ n = mkNil();- for(i = len; i > 0; i--) {+ for(i = bs.size; i > 0; i--) { nc = mkInt(str[i-1]); n = mkCons(nc, n); }@@ -2385,15 +2440,16 @@ } NODEPTR-mkStringC(const char *str)+mkStringC(char *str) {- return mkString(str, strlen(str));+ struct bytestring bs = { strlen(str), str };+ return mkString(bs); } NODEPTR mkStringU(struct bytestring bs) {- BFILE *ubuf = add_utf8(openb_buf(bs.string, bs.size));+ 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);@@ -2562,23 +2618,24 @@ /* 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. */+/* Does UTF-8 encoding */ struct bytestring evalstring(NODEPTR n) { size_t sz = 100;- char *name = MALLOC(sz);+ char *buf = MALLOC(sz); size_t offs; uvalue_t c; NODEPTR x; struct bytestring bs; - if (!name)+ if (!buf) memerr(); for (offs = 0;;) { if (offs >= sz - 4) { sz *= 2;- name = REALLOC(name, sz);- if (!name)+ buf = REALLOC(buf, sz);+ if (!buf) memerr(); } n = evali(n);@@ -2586,23 +2643,23 @@ 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 = (uvalue_t)evalint(ARG(x));+ c = evalint(ARG(x)); n = POPTOP(); /* XXX Encode as UTF8 */ if (c < 0x80) {- name[offs++] = (char)c;+ buf[offs++] = (char)c; } else if (c < 0x800) {- name[offs++] = ((c >> 6 ) ) | 0xc0;- name[offs++] = ((c ) & 0x3f) | 0x80;+ buf[offs++] = ((c >> 6 ) ) | 0xc0;+ buf[offs++] = ((c ) & 0x3f) | 0x80; } else if (c < 0x10000) {- name[offs++] = ((c >> 12) ) | 0xe0;- name[offs++] = ((c >> 6 ) & 0x3f) | 0x80;- name[offs++] = ((c ) & 0x3f) | 0x80;+ buf[offs++] = ((c >> 12) ) | 0xe0;+ buf[offs++] = ((c >> 6 ) & 0x3f) | 0x80;+ buf[offs++] = ((c ) & 0x3f) | 0x80; } else if (c < 0x110000) {- name[offs++] = ((c >> 18) ) | 0xf0;- name[offs++] = ((c >> 12) & 0x3f) | 0x80;- name[offs++] = ((c >> 6 ) & 0x3f) | 0x80;- name[offs++] = ((c ) & 0x3f) | 0x80;+ 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"); }@@ -2611,12 +2668,13 @@ ERR("evalstring not Nil/Cons"); } }- name[offs] = 0;+ buf[offs] = 0; /* in case we use it as a C string */ bs.size = offs;- bs.string = name;+ bs.string = buf; return bs; } +/* Does not do UTF-8 encoding */ struct bytestring evalbytestring(NODEPTR n) {@@ -2630,7 +2688,7 @@ if (!buf) memerr(); for (offs = 0;;) {- if (offs >= sz) {+ if (offs >= sz - 1) { sz *= 2; buf = REALLOC(buf, sz); if (!buf)@@ -2641,14 +2699,15 @@ 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 = (uvalue_t)evalint(ARG(x));+ c = evalint(ARG(x)); n = POPTOP();- buf[offs++] = (char)c;+ 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;@@ -2999,6 +3058,59 @@ * 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:@@ -3020,10 +3132,12 @@ 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) {@@ -3283,6 +3397,7 @@ case T_ARR_WRITE: case T_FPNEW: case T_FPFIN:+ // case T_FPSTR: case T_IO_GC: RET; @@ -3371,10 +3486,12 @@ 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))));@@ -3621,7 +3738,7 @@ return; } /* not done, it must be a C'BIND */- GCCHECK(1);+ 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);@@ -3728,7 +3845,7 @@ case T_NEWCASTRINGLEN: { CHECKIO(1);- struct bytestring bs = evalstring(ARG(TOP(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;@@ -3742,7 +3859,8 @@ name = evalptr(ARG(TOP(1))); size = strlen(name); GCCHECK(strNodes(size));- RETIO(mkString(name, size));+ struct bytestring bs = { size, name };+ RETIO(mkString(bs)); } case T_PEEKCASTRINGLEN:@@ -3752,7 +3870,8 @@ size = evalint(ARG(TOP(2))); name = evalptr(ARG(TOP(1))); GCCHECK(strNodes(size));- RETIO(mkString(name, size));+ struct bytestring bs = { size, name };+ RETIO(mkString(bs)); } case T_ARR_ALLOC:@@ -3838,6 +3957,20 @@ 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");@@ -3959,9 +4092,9 @@ /* No GC checks, the heap is empty. */ n = mkNil(); for(int i = gargc-1; i >= 0; i--) {- n = mkCons(mkString(gargv[i], strlen(gargv[i])), n);+ n = mkCons(mkStringC(gargv[i]), n); }- n = mkCons(mkString(progname, strlen(progname)), 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 */ }@@ -3969,7 +4102,7 @@ if (combexpr) { int c;- BFILE *bf = openb_buf(combexpr, combexprlen);+ 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') {@@ -4018,22 +4151,22 @@ execio(&TOP(0)); prog = TOP(0); POP(1);- gc(); /* Run finalizers */ #if SANITY if (GETTAG(prog) != T_AP || GETTAG(FUN(prog)) != T_IO_RETURN) ERR("main execio");-#endif-#if WANT_STDIO NODEPTR res = evali(ARG(prog));-#else- (void)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("\nmain returns ");- pp(stdout, res); 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 */@@ -4116,6 +4249,9 @@ 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);@@ -4149,6 +4285,9 @@ 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);@@ -4189,11 +4328,15 @@ 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))); }@@ -4211,6 +4354,16 @@ 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); }@@ -4298,11 +4451,15 @@ { "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},@@ -4319,6 +4476,16 @@ { "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},
src/runtime/lz77.c view
@@ -2,6 +2,7 @@ #include <stdlib.h> #if 0 #include <stdio.h>+#define INLINE #endif #define MAX(x,y) ((x) > (y) ? (x) : (y))@@ -11,6 +12,7 @@ #define MAXLEN (9 + 255) #define MINMATCH 3 #define MINOFFS 1+#define MAXLIT 32 /* * Encoding inspired by FastLZ@@ -31,7 +33,6 @@ } #define PUT(x) put(&outbuf, &outsize, &outoffs, (x)) -/* dst must be big enough to hold the decompressed result */ size_t lz77d(uint8_t *src, size_t srclen, uint8_t **bufp) {@@ -71,6 +72,27 @@ return outoffs; } +#define HASHBITS 11+#define HASHSIZE (1 << HASHBITS)+typedef size_t lzhash_t;+static INLINE lzhash_t+lz77hash(uint8_t *b, size_t n)+{+#if 0+ n = MIN(n, MINMATCH);+ size_t h = 0;+ for (size_t i = 0; i < n; i++)+ h = h * 256 + b[i];+ return ((h * 99999989) >> 15) & (HASHSIZE - 1);+#else+ n = MIN(n, 4);+ size_t h = 5381;+ for (size_t i = 0; i < n; i++)+ h = h * 33 + b[i];+ return h & (HASHSIZE - 1);+#endif+}+ static INLINE size_t match(uint8_t *src, uint8_t *win, uint8_t *end) {@@ -81,7 +103,60 @@ return n; } -/* XXX finding the match really needs some clever speedup */+typedef size_t lzoffs_t;+#define NUMPREV 16++/* Find the longest match within the match window */+static INLINE size_t+find_longest_match(uint8_t *src, uint8_t *cur, uint8_t *end, size_t *match_offs_p, lzoffs_t lzhashes[][NUMPREV])+{+ size_t win_end = cur - src + 1;+ size_t win_len = MIN(win_end, MAXWIN);++ lzhash_t h = lz77hash(cur, end - cur);+ lzoffs_t *offsets = lzhashes[h];++ size_t m_len = 0;+ size_t m_offs = 0;+#if 0+ for (size_t offs = MINOFFS; offs < win_len; offs++) {+ size_t n = match(cur, cur - offs, end);+ if (n > m_len) {+ m_len = n;+ m_offs = offs;+ }+ }+#else+ for (size_t i = 0; i < NUMPREV; i++) {+ lzoffs_t o = offsets[i];+ if (o == ~0)+ break; /* unused slot */+ size_t offs = (cur - src) - o;+ if (offs >= win_len || offs < MINOFFS)+ break; /* offset is not in range */+ size_t n = match(cur, cur - offs, end);+ if (n > m_len) {+ m_len = n;+ m_offs = offs;+ }+ }+#endif+ *match_offs_p = m_offs;+ return m_len;+}++static INLINE void+lzupdatehash(uint8_t *src, uint8_t *cur, uint8_t *end, lzoffs_t lzhashes[][NUMPREV])+{+ lzhash_t h = lz77hash(cur, end - cur);+ lzoffs_t offs = cur - src;++ for(size_t k = NUMPREV-1; k > 0; k--)+ lzhashes[h][k] = lzhashes[h][k-1];+ lzhashes[h][0] = offs;+}++ size_t lz77c(uint8_t *src, size_t srclen, uint8_t **bufp) {@@ -91,45 +166,53 @@ uint8_t *outbuf = malloc(outsize); size_t outoffs = 0; + lzoffs_t lzhashes[HASHSIZE][NUMPREV];++ for(size_t i = 0; i < HASHSIZE; i++) {+ for(size_t k = 0; k < NUMPREV; k++)+ lzhashes[i][k] = ~0;+ }+ for (cur = src; cur < end; ) {- size_t win_end = cur - src;- size_t win_len = MIN(win_end, MAXWIN);- //size_t max_len = MIN(MAXLEN, end - cur);- /* Inefficient match loop */- size_t match_len = MINMATCH-1; size_t match_offs = 0;- /* Compression is slow, since we use brute force to find a match. */- for (size_t offs = MINOFFS; offs < win_len; offs++) {- size_t n = match(cur, cur - offs, end);- if (n > match_len) {- match_len = n;- match_offs = offs;+ size_t match_len = 0;+ size_t len;+ /* Start from the current position and look for a match in the window. */+ /* If the is no match, try the next position, and so on. */+ for (len = 0; len < end - cur; len++) {+ match_len = find_longest_match(src, cur + len, end, &match_offs, lzhashes);+ if (match_len >= MINMATCH) /* Stop when we find a match. */+ break;+ lzupdatehash(src, cur + len, end, lzhashes);+ }+ /* As we exit the loop, we have len bytes that did not match anywhere+ * in the window, so they need to be emitted as a literal. */+ while (len) {+ /* Chunk up the literal into maximum sized pieces. */+ size_t n = MIN(len, MAXLIT);+ PUT(n - 1); /* Chunk length - 1 */+ for (size_t i = 0; i < n; i++) {+ PUT(*cur++); /* and spit out the chunk. */ }+ len -= n; } if (match_len >= MINMATCH) {- //printf("match cur=%d offs=%d len=%d str=%.*s\n", (int)(cur-src), (int)match_offs, (int)match_len, (int)match_len, cur);- //printf("match cur=%d offs=%d len=%d\n", (int)(cur-src), (int)match_offs, (int)match_len);- /* found a match */- cur += match_len;+ /* If we actually had a match, output it. */+ //cur += match_len; /* skip over the matched positions */+ for(size_t i = 0; i < match_len; i++) {+ lzupdatehash(src, cur++, end, lzhashes);+ } match_offs -= MINOFFS; match_len -= 2; int hi = match_offs >> 8; int lo = match_offs & 0xff;- if (match_len < 7) {+ if (match_len < 7) { /* encode as 2 or 3 bytes */ PUT((match_len << 5) + hi); PUT(lo); } else { PUT((7 << 5) + hi); PUT(lo); PUT(match_len - 7);- }- } else {- /* generate a literal */- /* how long should it be? 3 seems to be a sweet spot */- size_t len = MIN(3, end - cur);- PUT(len - 1);- for (size_t i = 0; i < len; i++) {- PUT(*cur++); } } }
src/runtime/mhsffi.h view
@@ -1,5 +1,6 @@ #include <inttypes.h> #include <stdlib.h>+#include <time.h> #if INTPTR_MAX == 0x7fff #define WORD_SIZE 16@@ -39,15 +40,16 @@ void mhs_from_CChar(intptr_t, int, char); void mhs_from_CSChar(intptr_t, int, signed char); void mhs_from_CUChar(intptr_t, int, unsigned char);-void mhs_from_CSHORT(intptr_t, int, short);-void mhs_from_CUSHORT(intptr_t, int, unsigned short);-void mhs_from_CINT(intptr_t, int, int);-void mhs_from_CUINT(intptr_t, int, unsigned int);-void mhs_from_CLONG(intptr_t, int, long);-void mhs_from_CULONG(intptr_t, int, unsigned long);-void mhs_from_CLLONG(intptr_t, int, long long);-void mhs_from_CULLONG(intptr_t, int, unsigned long long);+void mhs_from_CShort(intptr_t, int, short);+void mhs_from_CUShort(intptr_t, int, unsigned short);+void mhs_from_CInt(intptr_t, int, int);+void mhs_from_CUInt(intptr_t, int, unsigned int);+void mhs_from_CLong(intptr_t, int, long);+void mhs_from_CULong(intptr_t, int, unsigned long);+void mhs_from_CLLong(intptr_t, int, long long);+void mhs_from_CULLong(intptr_t, int, unsigned long long); void mhs_from_CSize(intptr_t, int, size_t);+void mhs_from_CTime(intptr_t, int, time_t); /* XXX wrong */ // not on MacOS void mhs_from_CSSize(intptr_t, int, ssize_t); void mhs_from_CIntPtr(intptr_t, int, intptr_t); void mhs_from_CUIntPtr(intptr_t, int, uintptr_t);@@ -62,15 +64,16 @@ char mhs_to_CChar(intptr_t, int); signed char mhs_to_CSChar(intptr_t, int); unsigned char mhs_to_CUChar(intptr_t, int);-short mhs_to_CSHORT(intptr_t, int);-unsigned short mhs_to_CUSHORT(intptr_t, int);-int mhs_to_CINT(intptr_t, int);-unsigned int mhs_to_CUINT(intptr_t, int);-long mhs_to_CLONG(intptr_t, int);-unsigned long mhs_to_CULONG(intptr_t, int);-long long mhs_to_CLLONG(intptr_t, int);-unsigned long long mhs_to_CULLONG(intptr_t, int);+short mhs_to_CShort(intptr_t, int);+unsigned short mhs_to_CUShort(intptr_t, int);+int mhs_to_CInt(intptr_t, int);+unsigned int mhs_to_CUInt(intptr_t, int);+long mhs_to_CLong(intptr_t, int);+unsigned long mhs_to_CULong(intptr_t, int);+long long mhs_to_CLLong(intptr_t, int);+unsigned long long mhs_to_CULLong(intptr_t, int); size_t mhs_to_CSize(intptr_t, int);+time_t mhs_to_CTime(intptr_t, int); /* XXX wrong */ // ssize_t mhs_to_CSSize(intptr_t, int); intptr_t mhs_to_CIntPtr(intptr_t, int); uintptr_t mhs_to_CUIntPtr(intptr_t, int);
+ src/runtime/rle.c view
@@ -0,0 +1,4 @@+#include <inttypes.h>+#include <stdlib.h>++
tests/Arith.hs view
@@ -1,8 +1,12 @@ module Arith(module Arith) where import Prelude +vals :: [Int]+vals = [-5, -2, -1, 0, 1, 2, 5]+ main :: IO () main = do- putStrLn $ show [ op x y | x <- [0 - 5,0 - 2,0 - 1,0,1,2,5]::[Int], y <- [0 - 5,0 - 2,0 - 1,0,1,2,5::Int], op <- [(+),( - ),(*)] ]- putStrLn $ show [ op x y | x <- [0 - 5,0 - 2,0 - 1,0,1,2,5]::[Int], y <- [0 - 5,0 - 2,0 - 1,1,2,5::Int], op <- [quot, rem] ]- putStrLn $ show [ op x y | x <- [0 - 5,0 - 2,0 - 1,0,1,2,5]::[Int], y <- [0 - 5,0 - 2,0 - 1,0,1,2,5::Int], op <- [(==),(/=),(<),(<=),(>),(>=)] ]+ 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 ]
tests/Arith.ref view
@@ -1,3 +1,4 @@ [-10,0,25,-7,-3,10,-6,-4,5,-5,-5,0,-4,-6,-5,-3,-7,-10,0,-10,-25,-7,3,10,-4,0,4,-3,-1,2,-2,-2,0,-1,-3,-2,0,-4,-4,3,-7,-10,-6,4,5,-3,1,2,-2,0,1,-1,-1,0,0,-2,-1,1,-3,-2,4,-6,-5,-5,5,0,-2,2,0,-1,1,0,0,0,0,1,-1,0,2,-2,0,5,-5,0,-4,6,-5,-1,3,-2,0,2,-1,1,1,0,2,0,1,3,-1,2,6,-4,5,-3,7,-10,0,4,-4,1,3,-2,2,2,0,3,1,2,4,0,4,7,-3,10,0,10,-25,3,7,-10,4,6,-5,5,5,0,6,4,5,7,3,10,10,0,25] [1,0,2,-1,5,0,-5,0,-2,-1,-1,0,0,-2,1,0,2,0,-2,0,-1,0,0,-2,0,-1,0,-1,1,0,-1,0,0,-1,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,-1,0,1,0,0,1,0,1,0,2,-1,0,-2,0,2,0,1,0,0,2,-1,0,-2,1,-5,0,5,0,2,1,1,0] [True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True]+[EQ,LT,LT,LT,LT,LT,LT,GT,EQ,LT,LT,LT,LT,LT,GT,GT,EQ,LT,LT,LT,LT,GT,GT,GT,EQ,LT,LT,LT,GT,GT,GT,GT,EQ,LT,LT,GT,GT,GT,GT,GT,EQ,LT,GT,GT,GT,GT,GT,GT,EQ]
+ tests/Bang.hs view
@@ -0,0 +1,17 @@+module Bang where++(!) :: Int -> Int -> Int+x ! y = x - y++f :: Int -> Int+f !x = x+1++main = do+ let !a = 1+2+ print a+ print (2 ! 3)+ print (2! 3)+ print (2 !3)+ print (2!3)+ print (f 1)+
+ tests/Bang.ref view
@@ -0,0 +1,6 @@+3+-1+-1+-1+-1+2
− tests/Foreign.hs
@@ -1,19 +0,0 @@-module Foreign(main) where-import Prelude-import Foreign.C.Types-import Foreign.Ptr-import Foreign.Storable--foreign import ccall "llabs" iabs :: Int -> IO Int-foreign import ccall "sys/errno.h &errno" cerrno :: IO (Ptr CInt)-foreign import ccall "&llabs" pabs :: IO (FunPtr (Int -> IO Int))--main :: IO ()-main = do- x1 <- iabs (3 - 8)- putStrLn $ show x1- x2 <- iabs (10 - 8)- putStrLn $ show x2- p <- cerrno- CInt e <- peek p- print e
− tests/Foreign.ref
@@ -1,2 +0,0 @@-5-2
+ tests/ForeignC.hs view
@@ -0,0 +1,19 @@+module ForeignC(main) where+import Prelude+import Foreign.C.Types+import Foreign.Ptr+import Foreign.Storable++foreign import ccall "llabs" iabs :: Int -> IO Int+foreign import ccall "sys/errno.h &errno" cerrno :: IO (Ptr CInt)+foreign import ccall "&llabs" pabs :: IO (FunPtr (Int -> IO Int))++main :: IO ()+main = do+ x1 <- iabs (3 - 8)+ putStrLn $ show x1+ x2 <- iabs (10 - 8)+ putStrLn $ show x2+ p <- cerrno+ CInt e <- peek p+ print e
+ tests/ForeignC.ref view
@@ -0,0 +1,2 @@+5+2
+ tests/ImpMet.hs view
@@ -0,0 +1,5 @@+module ImpMet where+import Prelude(pure, IO, (), putStrLn)++main :: IO ()+main = putStrLn "ok"
+ tests/ImpMet.ref view
@@ -0,0 +1,1 @@+ok
+ tests/LameCase.hs view
@@ -0,0 +1,10 @@+module LameCase where++f :: Int -> Int+f = \case+ 1 -> 2+ 2 -> 3+ n -> n++main :: IO ()+main = mapM_ (print . f) [1,2,3,4]
+ tests/LameCase.ref view
@@ -0,0 +1,4 @@+2+3+3+4
tests/Makefile view
@@ -29,7 +29,7 @@ $(TMHS) Word && $(EVAL) > Word.out && diff Word.ref Word.out $(TMHS) Integer && $(EVAL) > Integer.out && diff Integer.ref Integer.out $(TMHS) Enum && $(EVAL) > Enum.out && diff Enum.ref Enum.out-# $(TMHS) Foreign && $(EVAL) > Foreign.out && diff Foreign.ref Foreign.out+# $(TMHS) ForeignC && $(EVAL) > ForeignC.out && diff ForeignC.ref ForeignC.out $(TMHS) MutRec && $(EVAL) > MutRec.out && diff MutRec.ref MutRec.out $(TMHS) LocalPoly && $(EVAL) > LocalPoly.out && diff LocalPoly.ref LocalPoly.out $(TMHS) Rank2 && $(EVAL) > Rank2.out && diff Rank2.ref Rank2.out@@ -70,6 +70,11 @@ $(TMHS) DfltSig && $(EVAL) > DfltSig.out && diff DfltSig.ref DfltSig.out $(TMHS) Bytestring && $(EVAL) > Bytestring.out && diff Bytestring.ref Bytestring.out $(TMHS) Text && $(EVAL) > Text.out && diff Text.ref Text.out+ $(TMHS) ImpMet && $(EVAL) > ImpMet.out && diff ImpMet.ref ImpMet.out+ $(TMHS) MultiIf && $(EVAL) > MultiIf.out && diff MultiIf.ref MultiIf.out+ $(TMHS) LameCase && $(EVAL) > LameCase.out && diff LameCase.ref LameCase.out+ $(TMHS) NoForall && $(EVAL) > NoForall.out && diff NoForall.ref NoForall.out+ $(TMHS) Bang && $(EVAL) > Bang.out && diff Bang.ref Bang.out errtest: sh errtester.sh $(MHS) < errmsg.test
+ tests/MultiIf.hs view
@@ -0,0 +1,33 @@+module MultiIf where++f :: Int -> Int+f x =+ let (a, b) | x == 0 = (2,3)+ | otherwise = (3, 4)+ (c, d) = (10, 11)+ in a*c + b*d++g :: Int -> Int+g x =+ if { | x < 0 -> -1+ ; | x == 0 -> 0+ ; | x > 0 -> 1 }++h :: Int -> Int+h x =+ if | x < 0 -> if | x < -10 -> -2+ | otherwise -> -1+ | x == 0 -> 0+ | x > 0 -> 1++main :: IO ()+main = do+ print (f 0)+ print (f 1)+ print (g 100)+ print (g 0)+ print (g (-5))+ print (h (-100))+ print (h (-2))+ print (h 0)+ print (h 100)
+ tests/MultiIf.ref view
@@ -0,0 +1,9 @@+53+74+1+0+-1+-2+-1+0+1
+ tests/NoForall.hs view
@@ -0,0 +1,11 @@+module NoForall where++-- Without an explicit forall the 'a' is not bound in the body.+f :: a -> ((a,a),(a,a))+f x =+ let g :: a -> (a,a)+ g a = (a,a)+ in g (x,x)++main :: IO ()+main = print (f True)
+ tests/NoForall.ref view
@@ -0,0 +1,1 @@+((True,True),(True,True))
tests/Word.hs view
@@ -2,10 +2,17 @@ import Prelude import Data.Word +vals :: [Word16]+vals = [0xfff0, 0xfffe, 0xffff, 0, 1, 2, 5]++maxw :: Word+maxw = if _wordSize == 32 then 0x7fff::Word else 0x7fffffff::Word+ main :: IO () main = do putStrLn $ show (1000::Word) putStrLn $ show $ maxw*maxw > 0--maxw :: Word-maxw = if _wordSize == 32 then 0x7fff::Word else 0x7fffffff::Word+ 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 ]
tests/Word.ref view
@@ -1,2 +1,6 @@ 1000 True+[65504,0,256,65518,65522,32,65519,65521,16,65520,65520,0,65521,65519,65520,65522,65518,65504,65525,65515,65456,65518,14,32,65532,0,4,65533,65535,2,65534,65534,0,65535,65533,65534,0,65532,65532,3,65529,65526,65519,15,16,65533,1,2,65534,0,1,65535,65535,0,0,65534,65535,1,65533,65534,4,65530,65531,65520,16,0,65534,2,0,65535,1,0,0,0,0,1,65535,0,2,65534,0,5,65531,0,65521,17,65520,65535,3,65534,0,2,65535,1,1,0,2,0,1,3,65535,2,6,65532,5,65522,18,65504,0,4,65532,1,3,65534,2,2,0,3,1,2,4,0,4,7,65533,10,65525,21,65456,3,7,65526,4,6,65531,5,5,0,6,4,5,7,3,10,10,0,25]+[1,0,0,65520,0,65520,65520,0,32760,0,13104,0,1,14,1,0,0,65534,65534,0,32767,0,13106,4,1,15,1,1,1,0,65535,0,32767,1,13107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,2,0,2,0,2,2,0,1,0,0,2,0,5,0,5,0,5,5,0,2,1,1,0]+[True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True]+[EQ,LT,LT,GT,GT,GT,GT,GT,EQ,LT,GT,GT,GT,GT,GT,GT,EQ,GT,GT,GT,GT,LT,LT,LT,EQ,LT,LT,LT,LT,LT,LT,GT,EQ,LT,LT,LT,LT,LT,GT,GT,EQ,LT,LT,LT,LT,GT,GT,GT,EQ]