diff --git a/Agda.cabal b/Agda.cabal
--- a/Agda.cabal
+++ b/Agda.cabal
@@ -1,6 +1,6 @@
 name:            Agda
-version:         2.2.10
-cabal-version:   >= 1.8 && < 2
+version:         2.3.0
+cabal-version:   >= 1.8
 build-type:      Simple
 license:         OtherLicense
 license-file:    LICENSE
@@ -34,7 +34,7 @@
   Note also that this library does not follow the package versioning
   policy, because the library is only intended to be used by the Emacs
   mode and the Agda-executable package.
-tested-with:        GHC == 6.12.1, GHC == 6.12.3, GHC == 7.0.1
+tested-with:        GHC == 7.2.2
 extra-source-files: src/full/Agda/undefined.h
                     README
                     doc/release-notes/*.txt
@@ -52,7 +52,7 @@
 source-repository this
   type:     darcs
   location: http://code.haskell.org/Agda/
-  tag:      2.2.10
+  tag:      2.3.0
 
 flag use-locale
   description:
@@ -69,30 +69,32 @@
 library
   hs-source-dirs:   src/full
   if flag(use-locale)
-    build-depends:  base >= 4.2 && < 4.4
+    build-depends:  base >= 4.2 && < 4.5
   else
     build-depends:  base == 4.1.*,
                     utf8-string == 0.3.*
   if flag(epic)
-    build-depends:  epic >= 0.1.7 && < 0.2
+    build-depends:  epic >= 0.1.13 && < 0.2
   build-depends:    mtl == 2.0.*,
                     QuickCheck >= 2.3 && < 2.5,
-                    haskell-src-exts >= 1.9.6 && < 1.10,
-                    containers >= 0.1.0 && < 1,
-                    pretty >= 1 && < 2,
+                    haskell-src-exts >= 1.9.6 && < 1.12,
+                    containers >= 0.1 && < 0.5,
+                    pretty >= 1.0 && < 1.2,
                     directory >= 1.0 && < 1.2,
-                    old-time >= 1 && < 2,
-                    bytestring >= 0.9.0.1 && < 1,
-                    array >= 0.1 && < 1,
+                    old-time == 1.0.*,
+                    bytestring >= 0.9.0.1 && < 0.10,
+                    array >= 0.1 && < 0.4,
                     binary >= 0.4.4 && < 0.6,
-                    zlib >= 0.4.0.1 && < 1,
-                    filepath >= 1.1 && < 2,
-                    process >= 1.0.1.0 && < 2,
+                    zlib >= 0.4.0.1 && < 0.6,
+                    filepath >= 1.1 && < 1.3,
+                    process >= 1.0.1.0 && < 1.2,
                     haskeline >= 0.6.3.2 && < 0.7,
                     xhtml == 3000.2.*,
-                    syb >= 0.1 && < 0.3
+                    hashable == 1.1.*,
+                    hashtables == 1.0.*,
+                    syb >= 0.1 && < 0.4
   build-tools:      happy >= 1.15 && < 2,
-                    alex >= 2.0.1 && < 3
+                    alex >= 2.3.1 && < 3.1
   extensions:       CPP
   exposed-modules:  Agda.Main
                     Agda.ImpossibleTest
@@ -100,16 +102,26 @@
                     Agda.Interaction.GhciTop
                     Agda.Compiler.HaskellTypes
                     Agda.Compiler.Epic.AuxAST
+                    Agda.Compiler.Epic.CaseOpts
                     Agda.Compiler.Epic.Compiler
                     Agda.Compiler.Epic.CompileState
-                    Agda.Compiler.Epic.ConstructorIrrelevancy
-                    Agda.Compiler.Epic.Erasure
                     Agda.Compiler.Epic.Epic
+                    Agda.Compiler.Epic.Erasure
+                    Agda.Compiler.Epic.ForceConstrs
                     Agda.Compiler.Epic.Forcing
                     Agda.Compiler.Epic.FromAgda
-                    Agda.Compiler.Epic.LambdaLift
+                    Agda.Compiler.Epic.Injection
+                    Agda.Compiler.Epic.Interface
                     Agda.Compiler.Epic.NatDetection
                     Agda.Compiler.Epic.Primitive
+                    Agda.Compiler.Epic.Smashing
+                    Agda.Compiler.Epic.Static
+                    Agda.Compiler.JS.Case
+                    Agda.Compiler.JS.Compiler
+                    Agda.Compiler.JS.Syntax
+                    Agda.Compiler.JS.Substitution
+                    Agda.Compiler.JS.Parser
+                    Agda.Compiler.JS.Pretty
                     Agda.Compiler.MAlonzo.Compiler
                     Agda.Compiler.MAlonzo.Encode
                     Agda.Compiler.MAlonzo.Misc
@@ -120,8 +132,10 @@
                     Agda.Packaging.Monad
                     Agda.Packaging.Types
                     Agda.Interaction.CommandLine.CommandLine
+                    Agda.Interaction.EmacsCommand
                     Agda.Interaction.Exceptions
                     Agda.Interaction.FindFile
+                    Agda.Interaction.Highlighting.Dot
                     Agda.Interaction.Highlighting.Emacs
                     Agda.Interaction.Highlighting.Generate
                     Agda.Interaction.Highlighting.HTML
@@ -179,6 +193,7 @@
                     Agda.TypeChecker
                     Agda.TypeChecking.Abstract
                     Agda.TypeChecking.CompiledClause
+                    Agda.TypeChecking.CompiledClause.Compile
                     Agda.TypeChecking.CompiledClause.Match
                     Agda.TypeChecking.Constraints
                     Agda.TypeChecking.Conversion
@@ -186,6 +201,7 @@
                     Agda.TypeChecking.Coverage.Match
                     Agda.TypeChecking.Datatypes
                     Agda.TypeChecking.DisplayForm
+                    Agda.TypeChecking.Eliminators
                     Agda.TypeChecking.Empty
                     Agda.TypeChecking.EtaContract
                     Agda.TypeChecking.Errors
@@ -193,8 +209,11 @@
                     Agda.TypeChecking.Forcing
                     Agda.TypeChecking.Implicit
                     Agda.TypeChecking.Injectivity
+                    Agda.TypeChecking.Irrelevance
                     Agda.TypeChecking.Level
+                    Agda.TypeChecking.LevelConstraints
                     Agda.TypeChecking.MetaVars
+                    Agda.TypeChecking.MetaVars.Mention
                     Agda.TypeChecking.MetaVars.Occurs
                     Agda.TypeChecking.Monad.Base
                     Agda.TypeChecking.Monad.Builtin
@@ -246,6 +265,7 @@
                     Agda.TypeChecking.Tests
                     Agda.TypeChecking.UniversePolymorphism
                     Agda.TypeChecking.With
+                    Agda.Utils.VarSet
                     Agda.Utils.Char
                     Agda.Utils.Either
                     Agda.Utils.FileName
@@ -286,7 +306,7 @@
                     Agda.Auto.CaseSplit
   other-modules:    Paths_Agda
   if true
-    ghc-options:    -w -Werror
+    ghc-options:    -w
                     -fwarn-deprecated-flags
                     -fwarn-dodgy-foreign-imports
                     -fwarn-dodgy-imports
@@ -297,9 +317,14 @@
                     -fwarn-missing-methods
                     -fwarn-overlapping-patterns
                     -fwarn-warnings-deprecations
+  -- The Cabal-generated module Paths_Agda triggers a warning under
+  -- GHC 7.2.1/7.2.2 (at least when certain versions of Cabal are
+  -- used).
   if impl(ghc >= 6.12)
     ghc-options:    -fwarn-dodgy-exports
                     -fwarn-wrong-do-bind
+  if impl(ghc >= 7.2)
+    ghc-options:    -fwarn-identities
   ghc-prof-options: -auto-all
 
 executable agda-mode
@@ -307,10 +332,10 @@
   main-is:          Main.hs
   other-modules:    Paths_Agda
   if flag(use-locale)
-    build-depends:  base >= 4.2 && < 4.4
+    build-depends:  base >= 4.2 && < 4.5
   else
     build-depends:  base == 4.1.*,
                     utf8-string == 0.3.*
-  build-depends:    filepath >= 1.1 && < 2,
-                    process >= 1.0.1.0 && < 2,
+  build-depends:    filepath >= 1.1 && < 1.3,
+                    process >= 1.0.1.0 && < 1.2,
                     directory >= 1.0 && < 1.2
diff --git a/README b/README
--- a/README
+++ b/README
@@ -160,10 +160,7 @@
 * When installing using a source tar ball, following the instructions
   in 2b) above:
 
-    make CABAL_OPTIONS="--global -fepic" install
-
-  (The Makefile specifies CABAL_OPTIONS=--global by default; feel free
-  to omit --global.)
+    make CABAL_OPTIONS=-fepic install
 
 You can also install Epic directly:
 
diff --git a/dist/build/Agda/Syntax/Parser/Lexer.hs b/dist/build/Agda/Syntax/Parser/Lexer.hs
--- a/dist/build/Agda/Syntax/Parser/Lexer.hs
+++ b/dist/build/Agda/Syntax/Parser/Lexer.hs
@@ -1,7 +1,8 @@
-{-# OPTIONS -fglasgow-exts -cpp #-}
+{-# LANGUAGE CPP,MagicHash #-}
 {-# LINE 1 "src/full/Agda/Syntax/Parser/Lexer.x" #-}
 
 {-# OPTIONS_GHC -fno-warn-deprecated-flags #-}
+{-# LANGUAGE BangPatterns #-}
 {-| The lexer is generated by Alex (<http://www.haskell.org/alex>) and is an
     adaptation of GHC's lexer. The main lexing function 'lexer' is called by
     the "Agda.Syntax.Parser.Parser" to get the next token from the input.
@@ -49,19 +50,19 @@
 import GlaExts
 #endif
 alex_base :: AlexAddr
-alex_base = AlexA# "\xf7\xff\xff\xff\x6c\x00\x00\x00\xc8\x00\x00\x00\x3c\x01\x00\x00\x40\x01\x00\x00\x44\x01\x00\x00\x4b\x01\x00\x00\x70\x00\x00\x00\x74\x00\x00\x00\x78\x00\x00\x00\x7c\x00\x00\x00\x7d\x00\x00\x00\x81\x00\x00\x00\x48\x01\x00\x00\x49\x01\x00\x00\x4f\x01\x00\x00\x50\x01\x00\x00\x53\x01\x00\x00\x51\x01\x00\x00\x54\x01\x00\x00\x55\x01\x00\x00\x57\x01\x00\x00\xfb\xff\xff\xff\x00\x00\x00\x00\xfc\xff\xff\xff\xfd\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\xff\xff\xff\x9b\xff\xff\xff\xa6\xff\xff\xff\x90\xff\xff\xff\xa9\xff\xff\xff\x9e\xff\xff\xff\xaa\xff\xff\xff\xab\xff\xff\xff\x92\xff\xff\xff\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x00\x00\xee\xff\xff\xff\x9a\x00\x00\x00\xa0\x00\x00\x00\xa6\x00\x00\x00\xab\x00\x00\x00\xb8\x00\x00\x00\x69\x01\x00\x00\x6f\x01\x00\x00\x75\x01\x00\x00\x7b\x01\x00\x00\x99\x01\x00\x00\x9e\x01\x00\x00\xcc\x01\x00\x00\xd1\x01\x00\x00\xde\x01\x00\x00\xe9\x01\x00\x00\xee\x01\x00\x00\xf6\x01\x00\x00\xfb\x01\x00\x00\x07\x02\x00\x00\x13\x02\x00\x00\x1f\x02\x00\x00\x24\x02\x00\x00\x3c\x02\x00\x00\x48\x02\x00\x00\x4d\x02\x00\x00\x59\x02\x00\x00\x65\x02\x00\x00\x6b\x02\x00\x00\x71\x02\x00\x00\x77\x02\x00\x00\x83\x02\x00\x00\x90\x02\x00\x00\x95\x02\x00\x00\xad\x02\x00\x00\xb4\x02\x00\x00\xbc\x02\x00\x00\xce\x02\x00\x00\xd4\x02\x00\x00\xdc\x02\x00\x00\xe6\x02\x00\x00\xee\x02\x00\x00\xf4\x02\x00\x00\xfe\x02\x00\x00\x0d\x03\x00\x00\x16\x03\x00\x00\x1b\x03\x00\x00\x33\x03\x00\x00\x38\x03\x00\x00\x43\x03\x00\x00\x55\x03\x00\x00\x5d\x03\x00\x00\x66\x03\x00\x00\x6e\x03\x00\x00\x75\x03\x00\x00\x80\x03\x00\x00\x86\x03\x00\x00\x8e\x03\x00\x00\x98\x03\x00\x00\x9e\x03\x00\x00\xb0\x03\x00\x00\xb6\x03\x00\x00\x00\x00\x00\x00\xe5\xff\xff\xff\x09\x00\x00\x00\xcd\x03\x00\x00\x0a\x00\x00\x00\x3e\x04\x00\x00\xaf\x04\x00\x00\x20\x05\x00\x00\x91\x05\x00\x00\x02\x06\x00\x00\x5e\x06\x00\x00\xe8\xff\xff\xff\xba\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x07\x00\x00\x72\x07\x00\x00\xce\x07\x00\x00\x2a\x08\x00\x00\x86\x08\x00\x00\xe2\x08\x00\x00\x3e\x09\x00\x00\x9a\x09\x00\x00\xf6\x09\x00\x00\x52\x0a\x00\x00\xae\x0a\x00\x00\x0a\x0b\x00\x00\x66\x0b\x00\x00\xc2\x0b\x00\x00\x1e\x0c\x00\x00\x7a\x0c\x00\x00\xd6\x0c\x00\x00\x32\x0d\x00\x00\x8e\x0d\x00\x00\xea\x0d\x00\x00\x46\x0e\x00\x00\xa2\x0e\x00\x00\xfe\x0e\x00\x00\x5a\x0f\x00\x00\xb6\x0f\x00\x00\x12\x10\x00\x00\x6e\x10\x00\x00\xca\x10\x00\x00\x26\x11\x00\x00\x82\x11\x00\x00\xde\x11\x00\x00\x3a\x12\x00\x00\x96\x12\x00\x00\xf2\x12\x00\x00\x4e\x13\x00\x00\xaa\x13\x00\x00\x06\x14\x00\x00\x62\x14\x00\x00\xbe\x14\x00\x00\x1a\x15\x00\x00\x76\x15\x00\x00\xd2\x15\x00\x00\x2e\x16\x00\x00\x8a\x16\x00\x00\xe6\x16\x00\x00\x42\x17\x00\x00\x9e\x17\x00\x00\xfa\x17\x00\x00\x56\x18\x00\x00\xb2\x18\x00\x00\x0e\x19\x00\x00\x6a\x19\x00\x00\xc6\x19\x00\x00\x22\x1a\x00\x00\x7e\x1a\x00\x00\xda\x1a\x00\x00\x36\x1b\x00\x00\x92\x1b\x00\x00\xee\x1b\x00\x00\x4a\x1c\x00\x00\xa6\x1c\x00\x00\x02\x1d\x00\x00\x5e\x1d\x00\x00\xba\x1d\x00\x00\x16\x1e\x00\x00\x72\x1e\x00\x00\xce\x1e\x00\x00\x2a\x1f\x00\x00\x86\x1f\x00\x00\xe2\x1f\x00\x00\x3e\x20\x00\x00\x9a\x20\x00\x00\xf6\x20\x00\x00\x52\x21\x00\x00\xae\x21\x00\x00\x0a\x22\x00\x00\x66\x22\x00\x00\xc2\x22\x00\x00\x1e\x23\x00\x00\x7a\x23\x00\x00\xd6\x23\x00\x00\x32\x24\x00\x00\x8e\x24\x00\x00\xea\x24\x00\x00\x46\x25\x00\x00\xa2\x25\x00\x00\xfe\x25\x00\x00\x5a\x26\x00\x00\xb6\x26\x00\x00\x12\x27\x00\x00\x6e\x27\x00\x00\xca\x27\x00\x00\x26\x28\x00\x00\x82\x28\x00\x00\xde\x28\x00\x00\x3a\x29\x00\x00\x96\x29\x00\x00\xf2\x29\x00\x00\x4e\x2a\x00\x00\xaa\x2a\x00\x00\x06\x2b\x00\x00\x62\x2b\x00\x00\xbe\x2b\x00\x00\x1a\x2c\x00\x00\x76\x2c\x00\x00\xd2\x2c\x00\x00\x2e\x2d\x00\x00\x8a\x2d\x00\x00\xe6\x2d\x00\x00\x42\x2e\x00\x00\x9e\x2e\x00\x00\xfa\x2e\x00\x00\x56\x2f\x00\x00\xb2\x2f\x00\x00\x0e\x30\x00\x00\x6a\x30\x00\x00\xc6\x30\x00\x00\x22\x31\x00\x00\x7e\x31\x00\x00\xda\x31\x00\x00\x36\x32\x00\x00\x92\x32\x00\x00\xee\x32\x00\x00\x4a\x33\x00\x00\xa6\x33\x00\x00\x02\x34\x00\x00\x5e\x34\x00\x00\xba\x34\x00\x00\x16\x35\x00\x00\x72\x35\x00\x00\xce\x35\x00\x00\x2a\x36\x00\x00\x86\x36\x00\x00\xe2\x36\x00\x00\x3e\x37\x00\x00\x9a\x37\x00\x00\xf6\x37\x00\x00\x52\x38\x00\x00\xae\x38\x00\x00\x0a\x39\x00\x00\x66\x39\x00\x00\xc2\x39\x00\x00\x1e\x3a\x00\x00\x7a\x3a\x00\x00\xd6\x3a\x00\x00\x32\x3b\x00\x00\x8e\x3b\x00\x00\xea\x3b\x00\x00\x46\x3c\x00\x00\xa2\x3c\x00\x00\x00\x00\x00\x00\xa7\xff\xff\xff\xfe\x3c\x00\x00\x5a\x3d\x00\x00\xb6\x3d\x00\x00\x12\x3e\x00\x00\x6e\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x00\x00\x00\x65\x00\x00\x00\x00\x00\x00\x00\xca\x3e\x00\x00\x26\x3f\x00\x00\x82\x3f\x00\x00\xde\x3f\x00\x00\x3a\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x40\x00\x00\xf2\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x41\x00\x00\xaa\x41\x00\x00\x06\x42\x00\x00\x62\x42\x00\x00\xbe\x42\x00\x00\x1a\x43\x00\x00\x76\x43\x00\x00\xd2\x43\x00\x00\x2e\x44\x00\x00\x8a\x44\x00\x00\xe6\x44\x00\x00\x42\x45\x00\x00\x9e\x45\x00\x00\xfa\x45\x00\x00\x56\x46\x00\x00\xb2\x46\x00\x00\x0e\x47\x00\x00\x6a\x47\x00\x00\xc6\x47\x00\x00\x22\x48\x00\x00\x7e\x48\x00\x00\xda\x48\x00\x00\x36\x49\x00\x00\x92\x49\x00\x00\xee\x49\x00\x00\x4a\x4a\x00\x00\xa6\x4a\x00\x00\x02\x4b\x00\x00\x5e\x4b\x00\x00\xba\x4b\x00\x00\x16\x4c\x00\x00\x72\x4c\x00\x00\xce\x4c\x00\x00\x2a\x4d\x00\x00\x86\x4d\x00\x00"#
+alex_base = AlexA# "\xf7\xff\xff\xff\x6c\x00\x00\x00\xc8\x00\x00\x00\x3c\x01\x00\x00\x40\x01\x00\x00\x44\x01\x00\x00\x4b\x01\x00\x00\x70\x00\x00\x00\x74\x00\x00\x00\x78\x00\x00\x00\x7c\x00\x00\x00\x7d\x00\x00\x00\x81\x00\x00\x00\x48\x01\x00\x00\x49\x01\x00\x00\x4f\x01\x00\x00\x50\x01\x00\x00\x53\x01\x00\x00\x51\x01\x00\x00\x54\x01\x00\x00\x55\x01\x00\x00\x57\x01\x00\x00\xfb\xff\xff\xff\x00\x00\x00\x00\xfc\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\xff\xff\x9a\xff\xff\xff\xa5\xff\xff\xff\x8f\xff\xff\xff\xa8\xff\xff\xff\x9d\xff\xff\xff\xa9\xff\xff\xff\xaa\xff\xff\xff\x91\xff\xff\xff\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x01\x00\x00\xed\xff\xff\xff\x9a\x00\x00\x00\xa0\x00\x00\x00\xa6\x00\x00\x00\xab\x00\x00\x00\xb8\x00\x00\x00\x6b\x01\x00\x00\x71\x01\x00\x00\x78\x01\x00\x00\x7d\x01\x00\x00\x99\x01\x00\x00\x9e\x01\x00\x00\xc3\x01\x00\x00\xcc\x01\x00\x00\xd1\x01\x00\x00\xe9\x01\x00\x00\xee\x01\x00\x00\xf3\x01\x00\x00\xf8\x01\x00\x00\x10\x02\x00\x00\x18\x02\x00\x00\x1d\x02\x00\x00\x22\x02\x00\x00\x28\x02\x00\x00\x3a\x02\x00\x00\x44\x02\x00\x00\x49\x02\x00\x00\x52\x02\x00\x00\x61\x02\x00\x00\x6e\x02\x00\x00\x73\x02\x00\x00\x79\x02\x00\x00\x91\x02\x00\x00\x96\x02\x00\x00\x9e\x02\x00\x00\xa3\x02\x00\x00\xbf\x02\x00\x00\xc6\x02\x00\x00\xcf\x02\x00\x00\xd7\x02\x00\x00\xdf\x02\x00\x00\xe7\x02\x00\x00\xf7\x02\x00\x00\x09\x03\x00\x00\x0f\x03\x00\x00\x14\x03\x00\x00\x19\x03\x00\x00\x31\x03\x00\x00\x36\x03\x00\x00\x3b\x03\x00\x00\x40\x03\x00\x00\x58\x03\x00\x00\x60\x03\x00\x00\x66\x03\x00\x00\x70\x03\x00\x00\x7e\x03\x00\x00\x88\x03\x00\x00\x8d\x03\x00\x00\x96\x03\x00\x00\xae\x03\x00\x00\xb3\x03\x00\x00\xbb\x03\x00\x00\xcb\x03\x00\x00\xd8\x03\x00\x00\xdd\x03\x00\x00\xe8\x03\x00\x00\xf8\x03\x00\x00\x00\x04\x00\x00\x05\x04\x00\x00\x0a\x04\x00\x00\x00\x00\x00\x00\xe4\xff\xff\xff\x08\x00\x00\x00\x2c\x04\x00\x00\x09\x00\x00\x00\x9d\x04\x00\x00\x0e\x05\x00\x00\x7f\x05\x00\x00\xf0\x05\x00\x00\x61\x06\x00\x00\xbd\x06\x00\x00\xe7\xff\xff\xff\x19\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x07\x00\x00\xd1\x07\x00\x00\x2d\x08\x00\x00\x89\x08\x00\x00\xe5\x08\x00\x00\x41\x09\x00\x00\x9d\x09\x00\x00\xf9\x09\x00\x00\x55\x0a\x00\x00\xb1\x0a\x00\x00\x0d\x0b\x00\x00\x69\x0b\x00\x00\xc5\x0b\x00\x00\x21\x0c\x00\x00\x7d\x0c\x00\x00\xd9\x0c\x00\x00\x35\x0d\x00\x00\x91\x0d\x00\x00\xed\x0d\x00\x00\x49\x0e\x00\x00\xa5\x0e\x00\x00\x01\x0f\x00\x00\x5d\x0f\x00\x00\xb9\x0f\x00\x00\x15\x10\x00\x00\x71\x10\x00\x00\xcd\x10\x00\x00\x29\x11\x00\x00\x85\x11\x00\x00\xe1\x11\x00\x00\x3d\x12\x00\x00\x99\x12\x00\x00\xf5\x12\x00\x00\x51\x13\x00\x00\xad\x13\x00\x00\x09\x14\x00\x00\x65\x14\x00\x00\xc1\x14\x00\x00\x1d\x15\x00\x00\x79\x15\x00\x00\xd5\x15\x00\x00\x31\x16\x00\x00\x8d\x16\x00\x00\xe9\x16\x00\x00\x45\x17\x00\x00\xa1\x17\x00\x00\xfd\x17\x00\x00\x59\x18\x00\x00\xb5\x18\x00\x00\x11\x19\x00\x00\x6d\x19\x00\x00\xc9\x19\x00\x00\x25\x1a\x00\x00\x81\x1a\x00\x00\xdd\x1a\x00\x00\x39\x1b\x00\x00\x95\x1b\x00\x00\xf1\x1b\x00\x00\x4d\x1c\x00\x00\xa9\x1c\x00\x00\x05\x1d\x00\x00\x61\x1d\x00\x00\xbd\x1d\x00\x00\x19\x1e\x00\x00\x75\x1e\x00\x00\xd1\x1e\x00\x00\x2d\x1f\x00\x00\x89\x1f\x00\x00\xe5\x1f\x00\x00\x41\x20\x00\x00\x9d\x20\x00\x00\xf9\x20\x00\x00\x55\x21\x00\x00\xb1\x21\x00\x00\x0d\x22\x00\x00\x69\x22\x00\x00\xc5\x22\x00\x00\x21\x23\x00\x00\x7d\x23\x00\x00\xd9\x23\x00\x00\x35\x24\x00\x00\x91\x24\x00\x00\xed\x24\x00\x00\x49\x25\x00\x00\xa5\x25\x00\x00\x01\x26\x00\x00\x5d\x26\x00\x00\xb9\x26\x00\x00\x15\x27\x00\x00\x71\x27\x00\x00\xcd\x27\x00\x00\x29\x28\x00\x00\x85\x28\x00\x00\xe1\x28\x00\x00\x3d\x29\x00\x00\x99\x29\x00\x00\xf5\x29\x00\x00\x51\x2a\x00\x00\xad\x2a\x00\x00\x09\x2b\x00\x00\x65\x2b\x00\x00\xc1\x2b\x00\x00\x1d\x2c\x00\x00\x79\x2c\x00\x00\xd5\x2c\x00\x00\x31\x2d\x00\x00\x8d\x2d\x00\x00\xe9\x2d\x00\x00\x45\x2e\x00\x00\xa1\x2e\x00\x00\xfd\x2e\x00\x00\x59\x2f\x00\x00\xb5\x2f\x00\x00\x11\x30\x00\x00\x6d\x30\x00\x00\xc9\x30\x00\x00\x25\x31\x00\x00\x81\x31\x00\x00\xdd\x31\x00\x00\x39\x32\x00\x00\x95\x32\x00\x00\xf1\x32\x00\x00\x4d\x33\x00\x00\xa9\x33\x00\x00\x05\x34\x00\x00\x61\x34\x00\x00\xbd\x34\x00\x00\x19\x35\x00\x00\x75\x35\x00\x00\xd1\x35\x00\x00\x2d\x36\x00\x00\x89\x36\x00\x00\xe5\x36\x00\x00\x41\x37\x00\x00\x9d\x37\x00\x00\xf9\x37\x00\x00\x55\x38\x00\x00\xb1\x38\x00\x00\x0d\x39\x00\x00\x69\x39\x00\x00\xc5\x39\x00\x00\x21\x3a\x00\x00\x7d\x3a\x00\x00\xd9\x3a\x00\x00\x35\x3b\x00\x00\x91\x3b\x00\x00\xed\x3b\x00\x00\x49\x3c\x00\x00\xa5\x3c\x00\x00\x01\x3d\x00\x00\x5d\x3d\x00\x00\xb9\x3d\x00\x00\x15\x3e\x00\x00\x71\x3e\x00\x00\xcd\x3e\x00\x00\x29\x3f\x00\x00\x85\x3f\x00\x00\xe1\x3f\x00\x00\x3d\x40\x00\x00\x99\x40\x00\x00\x00\x00\x00\x00\xa6\xff\xff\xff\xf5\x40\x00\x00\x51\x41\x00\x00\xad\x41\x00\x00\x09\x42\x00\x00\x65\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\xff\xff\xff\x63\x00\x00\x00\x00\x00\x00\x00\xc1\x42\x00\x00\x1d\x43\x00\x00\x79\x43\x00\x00\xd5\x43\x00\x00\x31\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x44\x00\x00\xe9\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x45\x00\x00\xa1\x45\x00\x00\xfd\x45\x00\x00\x59\x46\x00\x00\xb5\x46\x00\x00\x11\x47\x00\x00\x6d\x47\x00\x00\xc9\x47\x00\x00\x25\x48\x00\x00\x81\x48\x00\x00\xdd\x48\x00\x00\x39\x49\x00\x00\x95\x49\x00\x00\xf1\x49\x00\x00\x4d\x4a\x00\x00\xa9\x4a\x00\x00\x05\x4b\x00\x00\x61\x4b\x00\x00\xbd\x4b\x00\x00\x19\x4c\x00\x00\x75\x4c\x00\x00\xd1\x4c\x00\x00\x2d\x4d\x00\x00\x89\x4d\x00\x00\xe5\x4d\x00\x00\x41\x4e\x00\x00\x9d\x4e\x00\x00\xf9\x4e\x00\x00\x55\x4f\x00\x00\xb1\x4f\x00\x00\x0d\x50\x00\x00\x69\x50\x00\x00\xc5\x50\x00\x00\x21\x51\x00\x00\x7d\x51\x00\x00"#
 
 alex_table :: AlexAddr
-alex_table = AlexA# "\x00\x00\x75\x00\x26\x00\x26\x00\x26\x00\x17\x00\xff\xff\x1a\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x1c\x00\x25\x00\x28\x00\x68\x00\xff\xff\xff\xff\x6a\x00\x0e\x01\x26\x00\x44\x01\x26\x01\x44\x01\x44\x01\x44\x01\x44\x01\x25\x01\x1f\x01\x20\x01\x44\x01\x44\x01\x44\x01\x74\x00\x17\x01\x44\x01\x27\x01\x28\x01\x28\x01\x28\x01\x28\x01\x28\x01\x28\x01\x28\x01\x28\x01\x28\x01\x1a\x01\x19\x01\x44\x01\x1b\x01\x44\x01\x1d\x01\x23\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\xe4\x00\x44\x01\x44\x01\xe0\x00\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x22\x01\x44\x01\x44\x01\x1c\x01\x44\x01\xd9\x00\x44\x01\xba\x00\xb4\x00\x44\x01\x86\x00\x44\x01\x07\x01\x7c\x00\x44\x01\x44\x01\x7a\x00\xb0\x00\x44\x01\xa5\x00\x99\x00\xf6\x00\x90\x00\xfc\x00\x44\x01\x01\x01\x44\x01\x81\x00\x44\x01\x44\x01\x44\x01\x29\x00\x1e\x01\x24\x01\x44\x01\x76\x00\x26\x00\x26\x00\x26\x00\x1b\x00\x0b\x00\x0b\x00\x0b\x00\xff\xff\x09\x00\x09\x00\x09\x00\xff\xff\x09\x00\x09\x00\x09\x00\xff\xff\xff\xff\x0b\x00\x0b\x00\x0b\x00\xff\xff\x26\x00\x26\x00\x26\x00\x26\x00\x0b\x00\x18\x01\x15\x01\x16\x01\x09\x00\x00\x00\x00\x00\x00\x00\x09\x00\x73\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x1d\x00\x2b\x00\x00\x00\xff\xff\x0a\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x00\x26\x00\x26\x00\x26\x00\x00\x00\x00\x00\xff\xff\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x0d\x00\x69\x00\x26\x00\x44\x01\x26\x01\x44\x01\x44\x01\x44\x01\x44\x01\x25\x01\x1f\x01\x20\x01\x44\x01\x44\x01\x44\x01\x74\x00\x17\x01\x44\x01\x27\x01\x28\x01\x28\x01\x28\x01\x28\x01\x28\x01\x28\x01\x28\x01\x28\x01\x28\x01\x1a\x01\x19\x01\x44\x01\x1b\x01\x44\x01\x1d\x01\x23\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\xe4\x00\x44\x01\x44\x01\xe0\x00\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x22\x01\x44\x01\x44\x01\x1c\x01\x44\x01\xd9\x00\x44\x01\xba\x00\xb4\x00\x44\x01\x86\x00\x44\x01\x07\x01\x7c\x00\x44\x01\x44\x01\x7a\x00\xb0\x00\x44\x01\xa5\x00\x99\x00\xf6\x00\x90\x00\xfc\x00\x44\x01\x01\x01\x44\x01\x81\x00\x44\x01\x44\x01\x44\x01\x29\x00\x1e\x01\x24\x01\x44\x01\x26\x00\x26\x00\x26\x00\x75\x00\x26\x00\x26\x00\x26\x00\x77\x00\x26\x00\x26\x00\x26\x00\xff\xff\xff\xff\xff\xff\x27\x00\x27\x00\x27\x00\x27\x00\xff\xff\xff\xff\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\x26\x00\xff\xff\x00\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x27\x00\x00\x00\x73\x00\x2f\x00\x00\x00\x00\x00\x73\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x39\x00\x40\x00\xff\xff\x61\x00\x00\x00\x00\x00\x00\x00\x55\x00\xff\xff\x00\x00\x64\x00\x00\x00\x00\x00\x32\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x0f\x01\x00\x00\x12\x00\x69\x00\x14\x00\xff\xff\x15\x00\x69\x00\x00\x00\x10\x00\xff\xff\x69\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x00\xff\xff\x00\x00\x00\x00\x3c\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x42\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x44\x00\xff\xff\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x4d\x00\x00\x00\xff\xff\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4f\x00\x4e\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x52\x00\xff\xff\x00\x00\x53\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x58\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x59\x00\x5b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x54\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x5d\x00\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x5f\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x62\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x00\x00\x00\x6e\x00\x00\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x63\x00\x00\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x70\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x00\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x00\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\xff\xff\x6e\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x00\x00\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x00\x00\x00\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x70\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x00\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x00\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\xff\xff\x6e\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x00\x00\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x00\x00\x00\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x70\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x00\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x00\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\xff\xff\x6e\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x00\x00\x00\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x70\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x00\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x00\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\xff\xff\x6f\x00\x00\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x00\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x00\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x00\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x00\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x71\x00\x6d\x00\x6d\x00\x72\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\xff\xff\x6d\x00\x00\x00\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x00\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x00\x00\x00\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x00\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x00\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x00\x00\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x6f\x00\x6d\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x00\x00\x00\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x00\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x00\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x00\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x6f\x00\x00\x00\x6f\x00\x45\x01\x6f\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x6b\x00\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x21\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x78\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x79\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xca\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xaa\x00\x7b\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x7d\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x7e\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x7f\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x80\x00\x89\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x82\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x83\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x84\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x85\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xe9\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x87\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x88\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x8a\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x8b\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x8c\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x8d\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xbe\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x0d\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x8e\x00\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x8f\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x91\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x92\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x93\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x94\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x95\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x96\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x97\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x98\x00\x45\x01\x45\x01\xa1\x00\x45\x01\x45\x01\x14\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x9a\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x9b\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x9c\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x9d\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x9e\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x9f\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xdd\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xa0\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xa2\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xa3\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xa4\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xa6\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xa7\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xa8\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xa9\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xab\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xac\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xad\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xae\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xaf\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xd1\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xb1\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xb2\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xb3\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xb5\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xb6\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xb7\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xb8\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xc7\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xb9\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xbb\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xbc\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xbd\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xbf\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xc0\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xc1\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xc2\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xc3\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xc4\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xc5\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xc6\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xcb\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xcc\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xc8\x00\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xc9\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xcd\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xce\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xcf\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xd0\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xd2\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xd3\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xd4\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xd5\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xd6\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xd7\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xd8\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xda\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xdb\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xdc\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\xea\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xde\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xdf\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xe1\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xe2\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xe3\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xe5\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xe6\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xe7\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xe8\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xed\x00\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xee\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xef\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xf0\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xf1\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xf2\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xf3\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xf4\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xf5\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xf7\x00\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xf8\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xf9\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xfa\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xfb\x00\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xfd\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xfe\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\xff\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x02\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x03\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x04\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x05\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x06\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x08\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x09\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x0a\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x0b\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x0c\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x10\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x11\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x12\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x13\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x46\x01\x45\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x00\x00\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x46\x01\x45\x01\x46\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x44\x01\x45\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x44\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x01\x45\x01\x44\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x3c\x01\x45\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x41\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x41\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x2e\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x3c\x01\x45\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x41\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x41\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x3c\x01\x45\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x41\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x41\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x3c\x01\x45\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2c\x01\x2d\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2c\x01\x2d\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x43\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x3c\x01\x45\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2c\x01\x2d\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2c\x01\x2d\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x42\x01\x45\x01\x42\x01\x3c\x01\x45\x01\x2a\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2c\x01\x2d\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2c\x01\x2d\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x3c\x01\x45\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2c\x01\x2d\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2c\x01\x2d\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x3e\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x3e\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x3d\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x3e\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x3e\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x3e\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x3e\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x3f\x01\x45\x01\x3f\x01\x47\x01\x45\x01\x33\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x35\x01\x35\x01\x35\x01\x35\x01\x32\x01\x35\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x35\x01\x35\x01\x35\x01\x35\x01\x32\x01\x35\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x35\x01\x35\x01\x35\x01\x35\x01\x32\x01\x35\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x35\x01\x35\x01\x35\x01\x35\x01\x32\x01\x35\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x40\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x35\x01\x35\x01\x35\x01\x35\x01\x32\x01\x35\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x35\x01\x35\x01\x35\x01\x35\x01\x32\x01\x35\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x35\x01\x35\x01\x35\x01\x35\x01\x32\x01\x35\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x35\x01\x35\x01\x35\x01\x35\x01\x32\x01\x35\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x40\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x43\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x44\x01\x45\x01\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x00\x00\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x44\x01\x2f\x01\x30\x01\x30\x01\x30\x01\x30\x01\x30\x01\x30\x01\x30\x01\x30\x01\x30\x01\x44\x01\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x48\x01\x44\x01\x44\x01\x49\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x44\x01\x45\x01\x44\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x3f\x01\x45\x01\x3f\x01\x47\x01\x45\x01\x36\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x36\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x38\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x42\x01\x45\x01\x42\x01\x47\x01\x45\x01\x39\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x39\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x3a\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x47\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x00\x00\x45\x01\x46\x01\x45\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x00\x00\x46\x01\x46\x01\x46\x01\x46\x01\x47\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x46\x01\x44\x01\x46\x01\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x00\x00\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x48\x01\x44\x01\x44\x01\x49\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x01\x44\x01\x44\x01\x44\x01\x00\x00\x44\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x01\x46\x01\x44\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x00\x00\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x46\x01\x00\x00\x46\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+alex_table = AlexA# "\x00\x00\x7b\x00\x24\x00\x24\x00\x24\x00\x17\x00\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x1a\x00\x23\x00\x26\x00\x6e\x00\xff\xff\xff\xff\x70\x00\x1e\x01\x28\x01\x24\x00\x57\x01\x39\x01\x57\x01\x57\x01\x57\x01\x57\x01\x38\x01\x2f\x01\x30\x01\x57\x01\x57\x01\x57\x01\x7a\x00\x27\x01\x57\x01\x3a\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x2a\x01\x29\x01\x57\x01\x2b\x01\x57\x01\x2d\x01\x33\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\xea\x00\x57\x01\x57\x01\xe6\x00\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x32\x01\x57\x01\x57\x01\x2c\x01\x57\x01\xdf\x00\x57\x01\xc0\x00\xba\x00\x57\x01\x8c\x00\x57\x01\x17\x01\x82\x00\x57\x01\x57\x01\x80\x00\xb6\x00\x57\x01\xab\x00\x9f\x00\xfc\x00\x96\x00\x0d\x01\x57\x01\x07\x01\x57\x01\x87\x00\x57\x01\x57\x01\x57\x01\x27\x00\x2e\x01\x37\x01\x57\x01\x7c\x00\x24\x00\x24\x00\x24\x00\x19\x00\x0b\x00\x0b\x00\x0b\x00\xff\xff\x09\x00\x09\x00\x09\x00\xff\xff\x09\x00\x09\x00\x09\x00\xff\xff\xff\xff\x0b\x00\x0b\x00\x0b\x00\xff\xff\x24\x00\x24\x00\x24\x00\x24\x00\x0b\x00\x26\x01\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\xff\xff\x09\x00\x79\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x1b\x00\x29\x00\x00\x00\xff\xff\x0a\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x00\x24\x00\x24\x00\x24\x00\x00\x00\x00\x00\xff\xff\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x0d\x00\x6f\x00\x24\x00\x57\x01\x39\x01\x57\x01\x57\x01\x57\x01\x57\x01\x38\x01\x2f\x01\x30\x01\x57\x01\x57\x01\x57\x01\x7a\x00\x27\x01\x57\x01\x3a\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x3b\x01\x2a\x01\x29\x01\x57\x01\x2b\x01\x57\x01\x2d\x01\x33\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\xea\x00\x57\x01\x57\x01\xe6\x00\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x32\x01\x57\x01\x57\x01\x2c\x01\x57\x01\xdf\x00\x57\x01\xc0\x00\xba\x00\x57\x01\x8c\x00\x57\x01\x17\x01\x82\x00\x57\x01\x57\x01\x80\x00\xb6\x00\x57\x01\xab\x00\x9f\x00\xfc\x00\x96\x00\x0d\x01\x57\x01\x07\x01\x57\x01\x87\x00\x57\x01\x57\x01\x57\x01\x27\x00\x2e\x01\x37\x01\x57\x01\x24\x00\x24\x00\x24\x00\x7b\x00\x24\x00\x24\x00\x24\x00\x7d\x00\x24\x00\x24\x00\x24\x00\xff\xff\xff\xff\xff\xff\x25\x00\x25\x00\x25\x00\x25\x00\xff\xff\xff\xff\xff\xff\x24\x00\xff\xff\xff\xff\xff\xff\x24\x00\xff\xff\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x25\x01\x00\x00\x79\x00\x00\x00\x25\x00\x00\x00\x79\x00\x2d\x00\x00\x00\x00\x00\x79\x00\x00\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x37\x00\x3e\x00\x00\x00\x67\x00\xff\xff\x00\x00\x00\x00\x5b\x00\x00\x00\x00\x00\x6a\x00\xff\xff\x00\x00\x30\x00\x00\x00\x00\x00\xff\xff\x55\x00\x00\x00\x1b\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x1f\x01\x00\x00\x12\x00\x6f\x00\x14\x00\xff\xff\x15\x00\x6f\x00\x00\x00\x10\x00\xff\xff\x6f\x00\x13\x00\x34\x01\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x00\x00\x31\x00\x00\x00\x00\x00\x11\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x00\x00\x00\x00\x08\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x33\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\xff\xff\x34\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x35\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x2f\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x39\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x38\x00\x3a\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x3c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x36\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x3f\x00\xff\xff\x00\x00\x00\x00\x40\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x41\x00\x00\x00\x00\x00\x42\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x43\x00\x00\x00\x44\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x45\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x47\x00\x4f\x00\x00\x00\x48\x00\x00\x00\x00\x00\x53\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x46\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x3d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\x51\x00\xff\xff\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x57\x00\xff\xff\x52\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\x00\x59\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x5c\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x5f\x00\x61\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x63\x00\x62\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x65\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x00\x00\x00\x00\x00\x74\x00\x6c\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x76\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\xff\xff\x74\x00\x00\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x00\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x76\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\xff\xff\x74\x00\x00\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x00\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x76\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\xff\xff\x74\x00\x00\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x76\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\xff\xff\x75\x00\x00\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x77\x00\x73\x00\x73\x00\x78\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\xff\xff\x73\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x75\x00\x73\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x75\x00\x58\x01\x75\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x71\x00\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x31\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x7e\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x7f\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xd0\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xb0\x00\x81\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x83\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x84\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x85\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x86\x00\x8f\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x88\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x89\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x8a\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x8b\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xef\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x8d\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x8e\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x90\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x91\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x92\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x93\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xc4\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x1d\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x94\x00\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x95\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x97\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x98\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x99\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x9a\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x9b\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x9c\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x9d\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x9e\x00\x58\x01\x58\x01\xa7\x00\x58\x01\x58\x01\x24\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xa0\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xa1\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xa2\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xa3\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xa4\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xa5\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xe3\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xa6\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xa8\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xa9\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xaa\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xac\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xad\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xae\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xaf\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xb1\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xb2\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xb3\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xb4\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xb5\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xd7\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xb7\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xb8\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xb9\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xbb\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xbc\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xbd\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xbe\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xcd\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xbf\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xc1\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xc2\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xc3\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xc5\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xc6\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xc7\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xc8\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xc9\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xca\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xcb\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xcc\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xd1\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xd2\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xce\x00\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xcf\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xd3\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xd4\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xd5\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xd6\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xd8\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xd9\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xda\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xdb\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xdc\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xdd\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xde\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xe0\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xe1\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xe2\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\xf0\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xe4\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xe5\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xe7\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xe8\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xe9\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xeb\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xec\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xed\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xee\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xf3\x00\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xf4\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xf5\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xf6\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xf7\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xf8\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xf9\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xfa\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xfb\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xfd\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xfe\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xff\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x01\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x02\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x03\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x04\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x05\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x06\x01\x58\x01\x58\x01\x58\x01\x58\x01\x11\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x08\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x09\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x0a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x0b\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x0c\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x0e\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x0f\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x10\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x12\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x13\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x14\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x15\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x16\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x18\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x19\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x1a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x1b\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x1c\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x20\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x21\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x22\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x23\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x59\x01\x58\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x00\x00\x00\x00\x59\x01\x59\x01\x59\x01\x59\x01\x00\x00\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x00\x00\x59\x01\x59\x01\x59\x01\x59\x01\x00\x00\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x00\x00\x59\x01\x58\x01\x59\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x57\x01\x58\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x01\x58\x01\x57\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x4f\x01\x58\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x54\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x54\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x41\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x4f\x01\x58\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x54\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x54\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x4f\x01\x58\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x3c\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x54\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x54\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x4f\x01\x58\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x40\x01\x40\x01\x40\x01\x40\x01\x3f\x01\x40\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x40\x01\x40\x01\x40\x01\x40\x01\x3f\x01\x40\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x56\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x4f\x01\x58\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x40\x01\x40\x01\x40\x01\x40\x01\x3f\x01\x40\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x40\x01\x40\x01\x40\x01\x40\x01\x3f\x01\x40\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x55\x01\x58\x01\x55\x01\x4f\x01\x58\x01\x3d\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x40\x01\x40\x01\x40\x01\x40\x01\x3f\x01\x40\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x40\x01\x40\x01\x40\x01\x40\x01\x3f\x01\x40\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x4f\x01\x58\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x40\x01\x40\x01\x40\x01\x40\x01\x3f\x01\x40\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x40\x01\x40\x01\x40\x01\x40\x01\x3f\x01\x40\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x40\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x51\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x51\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x50\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x51\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x51\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x51\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x51\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x52\x01\x58\x01\x52\x01\x5a\x01\x58\x01\x46\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x48\x01\x48\x01\x48\x01\x48\x01\x45\x01\x48\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x48\x01\x48\x01\x48\x01\x48\x01\x45\x01\x48\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x48\x01\x48\x01\x48\x01\x48\x01\x45\x01\x48\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x48\x01\x48\x01\x48\x01\x48\x01\x45\x01\x48\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x53\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x47\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x48\x01\x48\x01\x48\x01\x48\x01\x45\x01\x48\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x48\x01\x48\x01\x48\x01\x48\x01\x45\x01\x48\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x48\x01\x48\x01\x48\x01\x48\x01\x45\x01\x48\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x48\x01\x48\x01\x48\x01\x48\x01\x45\x01\x48\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x53\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x56\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x57\x01\x58\x01\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x00\x00\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x42\x01\x43\x01\x43\x01\x43\x01\x43\x01\x43\x01\x43\x01\x43\x01\x43\x01\x43\x01\x57\x01\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x5b\x01\x57\x01\x57\x01\x5c\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x58\x01\x57\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x48\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x52\x01\x58\x01\x52\x01\x5a\x01\x58\x01\x49\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x49\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x4a\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x4b\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x55\x01\x58\x01\x55\x01\x5a\x01\x58\x01\x4c\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x4c\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x4d\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x00\x00\x58\x01\x59\x01\x58\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x00\x00\x00\x00\x59\x01\x59\x01\x59\x01\x59\x01\x5a\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x00\x00\x59\x01\x59\x01\x59\x01\x59\x01\x00\x00\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x00\x00\x59\x01\x57\x01\x59\x01\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x00\x00\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x5b\x01\x57\x01\x57\x01\x5c\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x57\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x01\x59\x01\x57\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x00\x00\x00\x00\x59\x01\x59\x01\x59\x01\x59\x01\x00\x00\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x00\x00\x59\x01\x59\x01\x59\x01\x59\x01\x00\x00\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x00\x00\x59\x01\x00\x00\x59\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
 
 alex_check :: AlexAddr
-alex_check = AlexA# "\xff\xff\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x0a\x00\x65\x00\x6e\x00\x64\x00\x7b\x00\x63\x00\x6f\x00\x64\x00\x7d\x00\x65\x00\x23\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x6f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x20\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\x2e\x00\x21\x00\x2e\x00\x20\x00\xff\xff\xff\xff\xff\xff\x20\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x20\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\x5c\x00\x23\x00\xff\xff\x20\x00\x5c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x62\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x65\x00\x7b\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x0a\x00\x20\x00\x0a\x00\x0a\x00\x0a\x00\x20\x00\x0a\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\x2d\x00\x23\x00\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x42\x00\x43\x00\x20\x00\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x20\x00\xff\xff\x4c\x00\xff\xff\xff\xff\x4f\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x67\x00\xff\xff\xff\xff\x69\x00\xff\xff\x74\x00\xff\xff\x63\x00\x7b\x00\x64\x00\x20\x00\x65\x00\x7b\x00\xff\xff\x6e\x00\x20\x00\x7b\x00\x6f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\x7b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\xff\xff\xff\xff\xff\xff\x54\x00\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\x4f\x00\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x4e\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x53\x00\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\x20\x00\xff\xff\xff\xff\x4c\x00\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\x00\x49\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x4f\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x4d\x00\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x20\x00\x50\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x44\x00\x45\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x41\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x54\x00\xff\xff\x20\x00\xff\xff\xff\xff\x5f\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x41\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x54\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x50\x00\x59\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\x20\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x50\x00\x20\x00\xff\xff\x49\x00\xff\xff\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\x4f\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x52\x00\x53\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x20\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\x54\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x20\x00\x53\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x49\x00\x42\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x54\x00\xff\xff\x20\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x45\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x0a\x00\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x0a\x00\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x0a\x00\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x0a\x00\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x0a\x00\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+alex_check = AlexA# "\xff\xff\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x65\x00\x6e\x00\x64\x00\x7b\x00\x63\x00\x6f\x00\x64\x00\x7d\x00\x65\x00\x23\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x6f\x00\x2e\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x20\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\x2e\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x21\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\x5c\x00\x23\x00\xff\xff\x20\x00\x5c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x62\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x65\x00\x7b\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x0a\x00\x20\x00\x0a\x00\x0a\x00\x0a\x00\x20\x00\x0a\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x21\x00\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\x2d\x00\x23\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\x42\x00\x43\x00\xff\xff\x45\x00\x20\x00\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\x4c\x00\x20\x00\xff\xff\x4f\x00\xff\xff\xff\xff\x20\x00\x53\x00\xff\xff\x5c\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x67\x00\xff\xff\xff\xff\x69\x00\xff\xff\x74\x00\xff\xff\x63\x00\x7b\x00\x64\x00\x20\x00\x65\x00\x7b\x00\xff\xff\x6e\x00\x20\x00\x7b\x00\x6f\x00\x7b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\xff\xff\x50\x00\xff\xff\xff\xff\x7b\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x54\x00\xff\xff\xff\xff\x7d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x49\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\xff\xff\xff\xff\xff\xff\x20\x00\x4f\x00\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x4e\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x53\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x49\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x55\x00\x4c\x00\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x54\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x49\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x4e\x00\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x4f\x00\x20\x00\xff\xff\xff\xff\x4d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\x49\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x4c\x00\xff\xff\x45\x00\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x44\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x44\x00\x45\x00\xff\xff\x41\x00\xff\xff\xff\xff\x4a\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x54\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x5f\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x54\x00\x20\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x59\x00\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x50\x00\x49\x00\x20\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x41\x00\x20\x00\x53\x00\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x54\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x43\x00\x49\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x54\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4f\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x52\x00\x53\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x54\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x49\x00\x53\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x42\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x4c\x00\x45\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x54\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\x21\x00\x4e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x0a\x00\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x0a\x00\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x0a\x00\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x0a\x00\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x0a\x00\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
 
 alex_deflt :: AlexAddr
-alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\xff\xff\xff\xff\x18\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\xff\xff\xff\xff\x6c\x00\x6c\x00\x6c\x00\x6c\x00\x6c\x00\x6c\x00\x6c\x00\x6c\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6d\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\xff\xff\xff\xff\x18\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\xff\xff\xff\xff\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
 
-alex_accept = listArray (0::Int,329) [[],[(AlexAccPred  (alex_action_26) ( not' eof ))],[],[(AlexAcc (alex_action_29))],[],[(AlexAcc (alex_action_28))],[],[(AlexAccPred  (alex_action_1) (alexRightContext 25))],[(AlexAccPred  (alex_action_0) (alexRightContext 22)),(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[(AlexAccPred  (alex_action_0) (alexRightContext 22)),(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_1) (alexRightContext 25)),(AlexAcc (alex_action_2))],[],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccPred  (alex_action_4) ( inState code ))],[],[],[],[],[],[],[],[],[],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_77))],[(AlexAccPred  (alex_action_21) ( not' (followedBy '#') ))],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_11))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_12))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_16))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_18))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAccPred  (alex_action_21) ( not' (followedBy '#') ))],[],[(AlexAccPred  (alex_action_22) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof ))],[(AlexAccPred  (alex_action_22) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof )),(AlexAcc (alex_action_83))],[(AlexAccPred  (alex_action_22) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof ))],[(AlexAccPred  (alex_action_22) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof )),(AlexAcc (alex_action_83))],[(AlexAccPred  (alex_action_22) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof )),(AlexAcc (alex_action_83))],[(AlexAccPred  (alex_action_22) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof )),(AlexAcc (alex_action_83))],[(AlexAccPred  (alex_action_22) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof ))],[(AlexAccPred  (alex_action_22) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof ))],[(AlexAccPred  (alex_action_22) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof ))],[],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_24))],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_30))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_31))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_32))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_33))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_34))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_35))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_36))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_37))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_38))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_39))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_40))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_41))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_42))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_43))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_44))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_45))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_46))],[(AlexAcc (alex_action_47))],[(AlexAcc (alex_action_48))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_49))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_50))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_51))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_52))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_53))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_54))],[(AlexAcc (alex_action_54))],[(AlexAcc (alex_action_54))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_55))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_56))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_57))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_58))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_59))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_60))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_61))],[],[(AlexAcc (alex_action_62))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_63))],[(AlexAcc (alex_action_64))],[(AlexAcc (alex_action_65))],[],[(AlexAcc (alex_action_66))],[(AlexAcc (alex_action_67))],[(AlexAcc (alex_action_68))],[(AlexAcc (alex_action_69))],[(AlexAcc (alex_action_70))],[(AlexAcc (alex_action_71))],[(AlexAcc (alex_action_72))],[(AlexAcc (alex_action_73))],[(AlexAcc (alex_action_74))],[(AlexAcc (alex_action_75))],[(AlexAcc (alex_action_76))],[(AlexAcc (alex_action_78))],[(AlexAcc (alex_action_79))],[(AlexAcc (alex_action_80))],[(AlexAcc (alex_action_81))],[(AlexAcc (alex_action_81))],[(AlexAcc (alex_action_81))],[(AlexAcc (alex_action_81))],[(AlexAcc (alex_action_81))],[(AlexAcc (alex_action_81))],[(AlexAcc (alex_action_81))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_82))],[(AlexAcc (alex_action_82))],[(AlexAcc (alex_action_82))],[(AlexAcc (alex_action_82))],[(AlexAcc (alex_action_82))],[(AlexAcc (alex_action_82))],[(AlexAcc (alex_action_82))],[(AlexAcc (alex_action_82))],[(AlexAcc (alex_action_82))],[(AlexAcc (alex_action_82))],[(AlexAcc (alex_action_82))],[(AlexAcc (alex_action_82))],[(AlexAcc (alex_action_82))],[],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_83))],[],[],[]]
-{-# LINE 193 "src/full/Agda/Syntax/Parser/Lexer.x" #-}
+alex_accept = listArray (0::Int,348) [[],[(AlexAccPred  (alex_action_29) ( not' eof ))],[],[(AlexAcc (alex_action_32))],[],[(AlexAcc (alex_action_31))],[],[(AlexAccPred  (alex_action_4) ( eof ))],[(AlexAccPred  (alex_action_0) (alexRightContext 22)),(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred  (alex_action_0) (alexRightContext 22)),(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccPred  (alex_action_5) ( inState code ))],[],[],[],[],[],[],[],[],[],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_84))],[(AlexAccPred  (alex_action_24) ( not' (followedBy '#') ))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_11))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_12))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_16))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_18))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_22))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAccPred  (alex_action_24) ( not' (followedBy '#') ))],[],[(AlexAccPred  (alex_action_25) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof ))],[(AlexAccPred  (alex_action_25) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof )),(AlexAcc (alex_action_90))],[(AlexAccPred  (alex_action_25) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof ))],[(AlexAccPred  (alex_action_25) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof )),(AlexAcc (alex_action_90))],[(AlexAccPred  (alex_action_25) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof )),(AlexAcc (alex_action_90))],[(AlexAccPred  (alex_action_25) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof )),(AlexAcc (alex_action_90))],[(AlexAccPred  (alex_action_25) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof ))],[(AlexAccPred  (alex_action_25) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof ))],[(AlexAccPred  (alex_action_25) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred  ( followedBy '\n' .||. eof ))],[],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_27))],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_33))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_34))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_35))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_36))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_37))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_38))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_39))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_40))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_41))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_42))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_43))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_44))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_45))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_46))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_47))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_48))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_49))],[(AlexAcc (alex_action_50))],[(AlexAcc (alex_action_51))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_52))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_53))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_54))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_55))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_56))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_57))],[(AlexAcc (alex_action_57))],[(AlexAcc (alex_action_57))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_58))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_59))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_60))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_61))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_62))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_63))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_64))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_65))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_66))],[],[(AlexAcc (alex_action_67))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_68))],[(AlexAcc (alex_action_69))],[(AlexAcc (alex_action_71))],[(AlexAcc (alex_action_70))],[(AlexAcc (alex_action_72))],[(AlexAcc (alex_action_73))],[(AlexAcc (alex_action_74))],[(AlexAcc (alex_action_75))],[(AlexAcc (alex_action_76))],[(AlexAcc (alex_action_77))],[(AlexAcc (alex_action_78))],[(AlexAcc (alex_action_79))],[(AlexAcc (alex_action_80))],[(AlexAcc (alex_action_81))],[(AlexAcc (alex_action_82))],[(AlexAccPred  (alex_action_83) (alexRightContext 309))],[],[(AlexAccSkip)],[(AlexAcc (alex_action_85))],[(AlexAcc (alex_action_86))],[(AlexAcc (alex_action_87))],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[],[],[]]
+{-# LINE 208 "src/full/Agda/Syntax/Parser/Lexer.x" #-}
 
 
 -- | This is the initial state for parsing a literate file. Code blocks
@@ -147,82 +148,88 @@
 tex = 7
 alex_action_0 =  end_ 
 alex_action_1 =  withInterval TokTeX 
-alex_action_2 =  withInterval TokTeX 
-alex_action_4 =  begin_ tex 
-alex_action_7 =  begin pragma 
-alex_action_8 =  symbol SymOpenPragma 
-alex_action_9 =  endWith $ symbol SymClosePragma 
-alex_action_10 =  keyword KwOPTIONS 
-alex_action_11 =  keyword KwBUILTIN 
-alex_action_12 =  keyword KwCOMPILED_DATA 
-alex_action_13 =  keyword KwCOMPILED_TYPE 
-alex_action_14 =  keyword KwCOMPILED 
-alex_action_15 =  keyword KwCOMPILED_EPIC 
-alex_action_16 =  keyword KwIMPORT 
-alex_action_17 =  keyword KwIMPOSSIBLE 
-alex_action_18 =  keyword KwETA 
-alex_action_19 =  keyword KwLINE 
-alex_action_20 =  withInterval $ TokString 
-alex_action_21 =  nestedComment 
-alex_action_22 =  withInterval TokComment 
-alex_action_24 =  begin bol_ 
-alex_action_26 =  offsideRule 
-alex_action_28 =  endWith newLayoutContext 
-alex_action_29 =  emptyLayout 
-alex_action_30 =  keyword KwLet 
-alex_action_31 =  keyword KwIn 
-alex_action_32 =  keyword KwWhere 
-alex_action_33 =  keyword KwField 
-alex_action_34 =  keyword KwWith 
-alex_action_35 =  keyword KwRewrite 
-alex_action_36 =  keyword KwPostulate 
-alex_action_37 =  keyword KwPrimitive 
-alex_action_38 =  keyword KwOpen 
-alex_action_39 =  keyword KwImport 
-alex_action_40 =  keyword KwModule 
-alex_action_41 =  keyword KwData 
-alex_action_42 =  keyword KwCoData 
-alex_action_43 =  keyword KwRecord 
-alex_action_44 =  keyword KwConstructor 
-alex_action_45 =  keyword KwInfix 
-alex_action_46 =  keyword KwInfixL 
-alex_action_47 =  keyword KwInfixR 
-alex_action_48 =  keyword KwMutual 
-alex_action_49 =  keyword KwAbstract 
-alex_action_50 =  keyword KwPrivate 
-alex_action_51 =  keyword KwSet 
-alex_action_52 =  keyword KwProp 
-alex_action_53 =  keyword KwForall 
-alex_action_54 =  withInterval' (read . drop 3) TokSetN 
-alex_action_55 =  keyword KwQuoteGoal 
-alex_action_56 =  keyword KwQuote 
-alex_action_57 =  keyword KwSyntax 
-alex_action_58 =  keyword KwUsing 
-alex_action_59 =  keyword KwHiding 
-alex_action_60 =  keyword KwRenaming 
-alex_action_61 =  endWith $ keyword KwTo 
-alex_action_62 =  keyword KwPublic 
-alex_action_63 =  hole 
-alex_action_64 =  symbol SymEllipsis 
-alex_action_65 =  symbol SymDot 
-alex_action_66 =  symbol SymSemi 
-alex_action_67 =  symbol SymColon 
-alex_action_68 =  symbol SymEqual 
-alex_action_69 =  symbol SymUnderscore 
-alex_action_70 =  symbol SymQuestionMark 
-alex_action_71 =  symbol SymBar 
-alex_action_72 =  symbol SymOpenParen 
-alex_action_73 =  symbol SymCloseParen 
-alex_action_74 =  symbol SymArrow 
-alex_action_75 =  symbol SymLambda 
-alex_action_76 =  symbol SymAs 
-alex_action_77 =  symbol SymOpenBrace 
-alex_action_78 =  symbol SymCloseBrace 
-alex_action_79 =  litChar 
-alex_action_80 =  litString 
-alex_action_81 =  literal LitInt 
-alex_action_82 =  literal LitFloat 
-alex_action_83 =  identifier 
+alex_action_4 =  end_ 
+alex_action_5 =  begin_ tex 
+alex_action_8 =  begin pragma 
+alex_action_9 =  symbol SymOpenPragma 
+alex_action_10 =  endWith $ symbol SymClosePragma 
+alex_action_11 =  keyword KwOPTIONS 
+alex_action_12 =  keyword KwBUILTIN 
+alex_action_13 =  keyword KwCOMPILED_DATA 
+alex_action_14 =  keyword KwCOMPILED_TYPE 
+alex_action_15 =  keyword KwCOMPILED 
+alex_action_16 =  keyword KwCOMPILED_EPIC 
+alex_action_17 =  keyword KwCOMPILED_JS 
+alex_action_18 =  keyword KwSTATIC 
+alex_action_19 =  keyword KwIMPORT 
+alex_action_20 =  keyword KwIMPOSSIBLE 
+alex_action_21 =  keyword KwETA 
+alex_action_22 =  keyword KwLINE 
+alex_action_23 =  withInterval $ TokString 
+alex_action_24 =  nestedComment 
+alex_action_25 =  withInterval TokComment 
+alex_action_27 =  begin bol_ 
+alex_action_29 =  offsideRule 
+alex_action_31 =  endWith newLayoutContext 
+alex_action_32 =  emptyLayout 
+alex_action_33 =  keyword KwLet 
+alex_action_34 =  keyword KwIn 
+alex_action_35 =  keyword KwWhere 
+alex_action_36 =  keyword KwField 
+alex_action_37 =  keyword KwWith 
+alex_action_38 =  keyword KwRewrite 
+alex_action_39 =  keyword KwPostulate 
+alex_action_40 =  keyword KwPrimitive 
+alex_action_41 =  keyword KwOpen 
+alex_action_42 =  keyword KwImport 
+alex_action_43 =  keyword KwModule 
+alex_action_44 =  keyword KwData 
+alex_action_45 =  keyword KwCoData 
+alex_action_46 =  keyword KwRecord 
+alex_action_47 =  keyword KwConstructor 
+alex_action_48 =  keyword KwInfix 
+alex_action_49 =  keyword KwInfixL 
+alex_action_50 =  keyword KwInfixR 
+alex_action_51 =  keyword KwMutual 
+alex_action_52 =  keyword KwAbstract 
+alex_action_53 =  keyword KwPrivate 
+alex_action_54 =  keyword KwSet 
+alex_action_55 =  keyword KwProp 
+alex_action_56 =  keyword KwForall 
+alex_action_57 =  withInterval' (read . drop 3) TokSetN 
+alex_action_58 =  keyword KwQuoteGoal 
+alex_action_59 =  keyword KwQuote 
+alex_action_60 =  keyword KwQuoteTerm 
+alex_action_61 =  keyword KwUnquote 
+alex_action_62 =  keyword KwSyntax 
+alex_action_63 =  keyword KwUsing 
+alex_action_64 =  keyword KwHiding 
+alex_action_65 =  keyword KwRenaming 
+alex_action_66 =  endWith $ keyword KwTo 
+alex_action_67 =  keyword KwPublic 
+alex_action_68 =  hole 
+alex_action_69 =  symbol SymEllipsis 
+alex_action_70 =  symbol SymDotDot 
+alex_action_71 =  symbol SymDot 
+alex_action_72 =  symbol SymSemi 
+alex_action_73 =  symbol SymColon 
+alex_action_74 =  symbol SymEqual 
+alex_action_75 =  symbol SymUnderscore 
+alex_action_76 =  symbol SymQuestionMark 
+alex_action_77 =  symbol SymBar 
+alex_action_78 =  symbol SymOpenParen 
+alex_action_79 =  symbol SymCloseParen 
+alex_action_80 =  symbol SymArrow 
+alex_action_81 =  symbol SymLambda 
+alex_action_82 =  symbol SymAs 
+alex_action_83 =  symbol SymDoubleOpenBrace 
+alex_action_84 =  symbol SymOpenBrace 
+alex_action_85 =  symbol SymCloseBrace 
+alex_action_86 =  litChar 
+alex_action_87 =  litString 
+alex_action_88 =  literal LitInt 
+alex_action_89 =  literal LitFloat 
+alex_action_90 =  identifier 
 {-# LINE 1 "templates/GenericTemplate.hs" #-}
 {-# LINE 1 "templates/GenericTemplate.hs" #-}
 {-# LINE 1 "<built-in>" #-}
@@ -253,10 +260,10 @@
 #ifdef WORDS_BIGENDIAN
   narrow16Int# i
   where
-	i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)
-	high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
-	low  = int2Word# (ord# (indexCharOffAddr# arr off'))
-	off' = off *# 2#
+        i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)
+        high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
+        low  = int2Word# (ord# (indexCharOffAddr# arr off'))
+        off' = off *# 2#
 #else
   indexInt16OffAddr# arr off
 #endif
@@ -353,12 +360,12 @@
 
 
 	let
-		!(base) = alexIndexInt32OffAddr alex_base s
-		!((I# (ord_c))) = ord c
-		!(offset) = (base +# ord_c)
-		!(check)  = alexIndexInt16OffAddr alex_check offset
+		(base) = alexIndexInt32OffAddr alex_base s
+		((I# (ord_c))) = ord c
+		(offset) = (base +# ord_c)
+		(check)  = alexIndexInt16OffAddr alex_check offset
 		
-		!(new_s) = if (offset >=# 0#) && (check ==# ord_c)
+		(new_s) = if (offset >=# 0#) && (check ==# ord_c)
 			  then alexIndexInt16OffAddr alex_table offset
 			  else alexIndexInt16OffAddr alex_deflt s
 	in
diff --git a/dist/build/Agda/Syntax/Parser/Parser.hs b/dist/build/Agda/Syntax/Parser/Parser.hs
--- a/dist/build/Agda/Syntax/Parser/Parser.hs
+++ b/dist/build/Agda/Syntax/Parser/Parser.hs
@@ -1,4200 +1,4996 @@
-{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}
-{-# OPTIONS -fglasgow-exts -cpp #-}
-{-# OPTIONS_GHC -fno-warn-incomplete-patterns
-                -fno-warn-deprecated-flags #-}
-{-| The parser is generated by Happy (<http://www.haskell.org/happy>).
--}
-module Agda.Syntax.Parser.Parser (
-      moduleParser
-    , exprParser
-    , tokensParser
-    , tests
-    ) where
-
-import Control.Arrow
-import Control.Monad
-import Control.Monad.State
-import Data.Char
-import Data.List
-import Data.Maybe
-import qualified Data.Traversable as T
-
-import Agda.Syntax.Position hiding (tests)
-import Agda.Syntax.Parser.Monad
-import Agda.Syntax.Parser.Lexer
-import Agda.Syntax.Parser.Tokens
-import Agda.Syntax.Concrete
-import Agda.Syntax.Concrete.Name
-import Agda.Syntax.Concrete.Pretty
-import Agda.Syntax.Common
-import Agda.Syntax.Fixity
-import Agda.Syntax.Notation
-import Agda.Syntax.Literal
-
-import Agda.Utils.Monad
-import Agda.Utils.QuickCheck
-import Agda.Utils.TestHelpers
-import qualified Data.Array as Happy_Data_Array
-import qualified GHC.Exts as Happy_GHC_Exts
-
--- parser produced by Happy Version 1.18.5
-
-newtype HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63 = HappyAbsSyn HappyAny
-#if __GLASGOW_HASKELL__ >= 607
-type HappyAny = Happy_GHC_Exts.Any
-#else
-type HappyAny = forall a . a
-#endif
-happyIn6 :: ([Token]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn6 #-}
-happyOut6 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Token])
-happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut6 #-}
-happyIn7 :: ([Token]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn7 #-}
-happyOut7 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Token])
-happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut7 #-}
-happyIn8 :: (Token) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn8 #-}
-happyOut8 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Token)
-happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut8 #-}
-happyIn9 :: (()) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn9 #-}
-happyOut9 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (())
-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut9 #-}
-happyIn10 :: (([Pragma], [Declaration])) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn10 #-}
-happyOut10 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (([Pragma], [Declaration]))
-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut10 #-}
-happyIn11 :: t11 -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn11 #-}
-happyOut11 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> t11
-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut11 #-}
-happyIn12 :: t12 -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn12 #-}
-happyOut12 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> t12
-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut12 #-}
-happyIn13 :: t13 -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn13 #-}
-happyOut13 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> t13
-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut13 #-}
-happyIn14 :: (()) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn14 #-}
-happyOut14 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (())
-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut14 #-}
-happyIn15 :: (Integer) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn15 #-}
-happyOut15 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Integer)
-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut15 #-}
-happyIn16 :: (Name) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn16 #-}
-happyOut16 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Name)
-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut16 #-}
-happyIn17 :: ([Name]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn17 #-}
-happyOut17 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Name])
-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut17 #-}
-happyIn18 :: (Arg Name) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn18 #-}
-happyOut18 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Arg Name)
-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut18 #-}
-happyIn19 :: ([Arg Name]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn19 #-}
-happyOut19 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Arg Name])
-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut19 #-}
-happyIn20 :: ([Arg Name]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn20 #-}
-happyOut20 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Arg Name])
-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut20 #-}
-happyIn21 :: (QName) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn21 #-}
-happyOut21 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (QName)
-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut21 #-}
-happyIn22 :: (QName) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn22 #-}
-happyOut22 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (QName)
-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut22 #-}
-happyIn23 :: (Name) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn23 #-}
-happyOut23 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Name)
-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut23 #-}
-happyIn24 :: ([Name]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn24 #-}
-happyOut24 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Name])
-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut24 #-}
-happyIn25 :: ([Name]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn25 #-}
-happyOut25 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Name])
-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut25 #-}
-happyIn26 :: ([String]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn26 #-}
-happyOut26 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([String])
-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut26 #-}
-happyIn27 :: (QName) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn27 #-}
-happyOut27 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (QName)
-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut27 #-}
-happyIn28 :: (Expr) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn28 #-}
-happyOut28 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Expr)
-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut28 #-}
-happyIn29 :: t29 -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn29 #-}
-happyOut29 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> t29
-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut29 #-}
-happyIn30 :: ([Expr]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn30 #-}
-happyOut30 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Expr])
-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut30 #-}
-happyIn31 :: ([Expr]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn31 #-}
-happyOut31 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Expr])
-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut31 #-}
-happyIn32 :: t32 -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn32 #-}
-happyOut32 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> t32
-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut32 #-}
-happyIn33 :: ([Expr]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn33 #-}
-happyOut33 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Expr])
-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut33 #-}
-happyIn34 :: t34 -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn34 #-}
-happyOut34 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> t34
-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut34 #-}
-happyIn35 :: ([(Name, Expr)]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn35 #-}
-happyOut35 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([(Name, Expr)])
-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut35 #-}
-happyIn36 :: ([(Name, Expr)]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn36 #-}
-happyOut36 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([(Name, Expr)])
-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut36 #-}
-happyIn37 :: ((Name, Expr)) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn37 #-}
-happyOut37 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ((Name, Expr))
-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut37 #-}
-happyIn38 :: t38 -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn38 #-}
-happyOut38 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> t38
-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut38 #-}
-happyIn39 :: t39 -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn39 #-}
-happyOut39 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> t39
-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut39 #-}
-happyIn40 :: ([TypedBindings]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn40 #-}
-happyOut40 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([TypedBindings])
-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut40 #-}
-happyIn41 :: (TypedBindings) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn41 #-}
-happyOut41 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (TypedBindings)
-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut41 #-}
-happyIn42 :: ([TypedBinding]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn42 #-}
-happyOut42 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([TypedBinding])
-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut42 #-}
-happyIn43 :: ([TypedBinding]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn43 #-}
-happyOut43 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([TypedBinding])
-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut43 #-}
-happyIn44 :: (TypedBinding) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn44 #-}
-happyOut44 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (TypedBinding)
-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut44 #-}
-happyIn45 :: ([LamBinding]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn45 #-}
-happyOut45 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([LamBinding])
-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut45 #-}
-happyIn46 :: (([LamBinding], Hiding)) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn46 #-}
-happyOut46 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (([LamBinding], Hiding))
-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut46 #-}
-happyIn47 :: ([Either Hiding LamBinding]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn47 #-}
-happyOut47 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Either Hiding LamBinding])
-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut47 #-}
-happyIn48 :: ([LamBinding]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn48 #-}
-happyOut48 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([LamBinding])
-happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut48 #-}
-happyIn49 :: ([LamBinding]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn49 #-}
-happyOut49 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([LamBinding])
-happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut49 #-}
-happyIn50 :: ([LamBinding]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn50 #-}
-happyOut50 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([LamBinding])
-happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut50 #-}
-happyIn51 :: ([LamBinding]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn51 #-}
-happyOut51 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([LamBinding])
-happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut51 #-}
-happyIn52 :: ((Maybe AsName, ImportDirective)) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn52 #-}
-happyOut52 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ((Maybe AsName, ImportDirective))
-happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut52 #-}
-happyIn53 :: (ImportDirective) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn53 #-}
-happyOut53 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (ImportDirective)
-happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut53 #-}
-happyIn54 :: (ImportDirective) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn54 #-}
-happyOut54 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (ImportDirective)
-happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut54 #-}
-happyIn55 :: (ImportDirective) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn55 #-}
-happyOut55 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (ImportDirective)
-happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut55 #-}
-happyIn56 :: ((UsingOrHiding , Range)) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn56 #-}
-happyOut56 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ((UsingOrHiding , Range))
-happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut56 #-}
-happyIn57 :: (([Renaming] , Range)) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn57 #-}
-happyOut57 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (([Renaming] , Range))
-happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut57 #-}
-happyIn58 :: ([Renaming]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn58 #-}
-happyOut58 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Renaming])
-happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut58 #-}
-happyIn59 :: (Renaming) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn59 #-}
-happyOut59 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Renaming)
-happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut59 #-}
-happyIn60 :: (ImportedName) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn60 #-}
-happyOut60 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (ImportedName)
-happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut60 #-}
-happyIn61 :: (ImportedName) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn61 #-}
-happyOut61 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (ImportedName)
-happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut61 #-}
-happyIn62 :: ([ImportedName]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn62 #-}
-happyOut62 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([ImportedName])
-happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut62 #-}
-happyIn63 :: t63 -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn63 #-}
-happyOut63 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> t63
-happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut63 #-}
-happyIn64 :: (LHS) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn64 #-}
-happyOut64 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (LHS)
-happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut64 #-}
-happyIn65 :: ([Pattern]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn65 #-}
-happyOut65 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Pattern])
-happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut65 #-}
-happyIn66 :: ([Expr]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn66 #-}
-happyOut66 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Expr])
-happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut66 #-}
-happyIn67 :: ([Expr]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn67 #-}
-happyOut67 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Expr])
-happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut67 #-}
-happyIn68 :: (WhereClause) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn68 #-}
-happyOut68 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (WhereClause)
-happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut68 #-}
-happyIn69 :: ([Declaration]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn69 #-}
-happyOut69 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Declaration])
-happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut69 #-}
-happyIn70 :: ([Declaration]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn70 #-}
-happyOut70 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Declaration])
-happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut70 #-}
-happyIn71 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn71 #-}
-happyOut71 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut71 #-}
-happyIn72 :: ([Declaration]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn72 #-}
-happyOut72 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Declaration])
-happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut72 #-}
-happyIn73 :: ([Arg Declaration]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn73 #-}
-happyOut73 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Arg Declaration])
-happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut73 #-}
-happyIn74 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn74 #-}
-happyOut74 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut74 #-}
-happyIn75 :: (RHS) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn75 #-}
-happyOut75 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (RHS)
-happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut75 #-}
-happyIn76 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn76 #-}
-happyOut76 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut76 #-}
-happyIn77 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn77 #-}
-happyOut77 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut77 #-}
-happyIn78 :: (Name) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn78 #-}
-happyOut78 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Name)
-happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut78 #-}
-happyIn79 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn79 #-}
-happyOut79 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut79 #-}
-happyIn80 :: ([Declaration]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn80 #-}
-happyOut80 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Declaration])
-happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut80 #-}
-happyIn81 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn81 #-}
-happyOut81 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut81 #-}
-happyIn82 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn82 #-}
-happyOut82 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut82 #-}
-happyIn83 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn83 #-}
-happyOut83 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut83 #-}
-happyIn84 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn84 #-}
-happyOut84 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut84 #-}
-happyIn85 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn85 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn85 #-}
-happyOut85 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut85 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut85 #-}
-happyIn86 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn86 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn86 #-}
-happyOut86 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut86 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut86 #-}
-happyIn87 :: ([String]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn87 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn87 #-}
-happyOut87 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([String])
-happyOut87 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut87 #-}
-happyIn88 :: ([HoleName]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn88 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn88 #-}
-happyOut88 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([HoleName])
-happyOut88 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut88 #-}
-happyIn89 :: (HoleName) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn89 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn89 #-}
-happyOut89 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (HoleName)
-happyOut89 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut89 #-}
-happyIn90 :: (String) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn90 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn90 #-}
-happyOut90 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (String)
-happyOut90 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut90 #-}
-happyIn91 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn91 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn91 #-}
-happyOut91 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut91 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut91 #-}
-happyIn92 :: ([Expr]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn92 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn92 #-}
-happyOut92 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Expr])
-happyOut92 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut92 #-}
-happyIn93 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn93 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn93 #-}
-happyOut93 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut93 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut93 #-}
-happyIn94 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn94 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn94 #-}
-happyOut94 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut94 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut94 #-}
-happyIn95 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn95 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn95 #-}
-happyOut95 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut95 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut95 #-}
-happyIn96 :: ([Declaration]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn96 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn96 #-}
-happyOut96 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Declaration])
-happyOut96 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut96 #-}
-happyIn97 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn97 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn97 #-}
-happyOut97 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut97 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut97 #-}
-happyIn98 :: (Declaration) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn98 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn98 #-}
-happyOut98 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Declaration)
-happyOut98 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut98 #-}
-happyIn99 :: (Pragma) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn99 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn99 #-}
-happyOut99 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Pragma)
-happyOut99 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut99 #-}
-happyIn100 :: (Pragma) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn100 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn100 #-}
-happyOut100 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Pragma)
-happyOut100 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut100 #-}
-happyIn101 :: (Pragma) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn101 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn101 #-}
-happyOut101 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Pragma)
-happyOut101 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut101 #-}
-happyIn102 :: (Pragma) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn102 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn102 #-}
-happyOut102 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Pragma)
-happyOut102 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut102 #-}
-happyIn103 :: (Pragma) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn103 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn103 #-}
-happyOut103 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Pragma)
-happyOut103 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut103 #-}
-happyIn104 :: (Pragma) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn104 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn104 #-}
-happyOut104 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Pragma)
-happyOut104 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut104 #-}
-happyIn105 :: (Pragma) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn105 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn105 #-}
-happyOut105 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Pragma)
-happyOut105 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut105 #-}
-happyIn106 :: (Pragma) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn106 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn106 #-}
-happyOut106 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Pragma)
-happyOut106 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut106 #-}
-happyIn107 :: (Pragma) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn107 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn107 #-}
-happyOut107 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Pragma)
-happyOut107 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut107 #-}
-happyIn108 :: (Pragma) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn108 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn108 #-}
-happyOut108 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Pragma)
-happyOut108 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut108 #-}
-happyIn109 :: (Pragma) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn109 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn109 #-}
-happyOut109 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Pragma)
-happyOut109 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut109 #-}
-happyIn110 :: ([TypeSignature]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn110 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn110 #-}
-happyOut110 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([TypeSignature])
-happyOut110 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut110 #-}
-happyIn111 :: ([TypeSignature]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn111 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn111 #-}
-happyOut111 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([TypeSignature])
-happyOut111 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut111 #-}
-happyIn112 :: ([TypeSignature]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn112 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn112 #-}
-happyOut112 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([TypeSignature])
-happyOut112 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut112 #-}
-happyIn113 :: ([TypeSignature]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn113 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn113 #-}
-happyOut113 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([TypeSignature])
-happyOut113 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut113 #-}
-happyIn114 :: ([Arg TypeSignature]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn114 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn114 #-}
-happyOut114 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Arg TypeSignature])
-happyOut114 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut114 #-}
-happyIn115 :: ([Arg TypeSignature]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn115 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn115 #-}
-happyOut115 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Arg TypeSignature])
-happyOut115 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut115 #-}
-happyIn116 :: ([Constructor]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn116 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn116 #-}
-happyOut116 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Constructor])
-happyOut116 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut116 #-}
-happyIn117 :: ((Maybe Name, [Declaration])) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn117 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn117 #-}
-happyOut117 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ((Maybe Name, [Declaration]))
-happyOut117 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut117 #-}
-happyIn118 :: ([Declaration]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn118 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn118 #-}
-happyOut118 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Declaration])
-happyOut118 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut118 #-}
-happyIn119 :: ([Declaration]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn119 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn119 #-}
-happyOut119 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Declaration])
-happyOut119 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut119 #-}
-happyIn120 :: ([Declaration]) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyIn120 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn120 #-}
-happyOut120 :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> ([Declaration])
-happyOut120 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut120 #-}
-happyInTok :: (Token) -> (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63)
-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyInTok #-}
-happyOutTok :: (HappyAbsSyn t11 t12 t13 t29 t32 t34 t38 t39 t63) -> (Token)
-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOutTok #-}
-
-
-happyActOffsets :: HappyAddr
-happyActOffsets = HappyA# "\x00\x00\xaf\x03\xe9\x04\x00\x00\x5d\x02\xaf\x00\xd7\x04\xe7\x04\x00\x00\xe7\x04\xdd\x04\x00\x00\xcc\x04\x00\x00\x00\x00\x00\x00\x00\x00\x48\x01\x31\x03\xaf\x03\xdc\x04\x00\x00\x91\x01\xe4\x04\xce\x04\x00\x00\x00\x00\x42\x04\xc6\x04\x00\x00\x00\x00\x08\x01\x00\x00\x00\x00\xc3\x03\x0f\x03\xed\x02\x00\x00\x00\x00\x00\x00\x99\x04\x7b\x01\xcf\x04\xb8\x04\xc2\x04\xaf\x04\xae\x04\x00\x00\x90\x04\x8f\x04\x00\x00\x00\x00\x00\x00\xc3\x03\xaf\x03\x00\x00\x84\x04\xc3\x03\x00\x00\x85\x03\x70\x03\x00\x00\xcb\x02\xa7\x00\xb7\x04\xfb\x02\x5b\x03\x83\x04\xfb\x02\xc4\x03\xc4\x03\x75\x04\x73\x04\xa3\x04\x00\x00\xc4\x03\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x03\xc4\x03\x08\x01\x00\x00\x00\x00\x77\x04\x77\x04\x00\x00\x77\x04\x00\x00\xfa\xff\xf9\x02\xf9\x02\x82\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x04\x00\x00\x00\x00\xfb\x02\x96\x00\x08\x01\xf9\x02\x00\x00\x3c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x61\x04\x00\x00\x00\x00\xc4\x03\x5b\x03\x6c\x04\x6d\x04\x5b\x04\x00\x00\x66\x04\xe8\xff\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x03\x00\x00\x00\x00\x5b\x03\x5b\x03\x58\x04\x00\x00\x62\x04\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x04\x00\x00\x5b\x03\xa1\x02\xf9\xff\x00\x00\x96\x00\x08\x01\xd0\x03\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x04\x00\x00\x53\x04\x50\x04\x4f\x04\x0e\x03\x45\x04\xfb\x02\x7c\x04\xfb\x02\x3e\x04\x35\x04\x00\x00\x00\x00\x00\x00\x52\x04\x00\x00\xd0\x03\x00\x00\x67\x04\x52\x00\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x4e\x04\x00\x00\xc5\x01\x70\x04\x3b\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x04\x40\x04\xc9\x00\x29\x04\x29\x04\x29\x04\x86\x01\x37\x04\x1d\x04\x1d\x04\x1d\x04\x34\x04\x34\x04\x34\x04\x10\x04\x26\x04\x08\x01\x7d\x06\x00\x00\x00\x00\x5b\x03\x00\x00\x00\x00\x1b\x04\x18\x04\x1a\x04\x16\x04\x16\x04\x16\x04\x16\x04\x16\x04\xfd\x00\x4b\x04\x08\x01\x8d\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\xc3\x00\xc3\x00\x0b\x04\x00\x00\xfb\x02\xfb\x02\xfb\x02\xfb\x02\x0e\x04\x0a\x04\x00\x00\x08\x04\x00\x00\x4a\x00\x5b\x03\x3f\x04\x5b\x03\x5b\x03\xa1\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x04\x06\x04\x00\x00\x01\x04\x05\x04\xfc\x03\xfb\x03\x04\x04\x25\x04\x00\x00\x00\x00\xee\x03\x00\x00\x00\x00\xfe\x03\xe6\x03\xe6\x03\x17\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x03\x00\x00\x00\x00\xfa\x03\xe2\x03\xf5\x03\xf5\x03\xfb\x02\x10\x00\xf2\x03\xf1\x03\xe7\x03\xeb\x03\xc3\x00\x00\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x00\x00\xe0\x03\x00\x00\xd6\x03\x08\x01\xff\x03\x5b\x03\xbe\x03\x00\x00\xbe\x03\xbd\x03\xb5\x03\xb4\x03\x00\x00\xab\x03\xac\x03\xaa\x03\x00\x00\x00\x00\xa8\x03\xa0\x03\xa6\x03\xa5\x03\x00\x00\x00\x00\x00\x00\x83\x03\x00\x00\x83\x03\x00\x00\xfe\x00\xf9\xff\x5b\x03\x5b\x03\x5b\x03\x97\x03\x5b\x03\x8f\x03\x7b\x03\xf9\xff\x0f\x00\xf9\xff\xb8\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x02\x00\x00\x8e\x03\x1d\x00\x8e\x03\x00\x00\x0f\x00\x86\x03\x00\x00\x74\x03\x1d\x00\x81\x03\x68\x03\x77\x03\x00\x00\x5b\x03\xd0\x03\x00\x00\xa3\x03\xa1\x03\x98\x03\x1d\x00\x6b\x03\xfe\x00\x64\x03\x00\x00\x2a\x01\x0f\x00\x4e\x03\x00\x00\x5e\x03\x00\x00\x00\x00\x51\x03\x00\x00\x00\x00\x00\x00\x49\x03\x00\x00\x4d\x03\x00\x00\x39\x03\x5b\x03\x00\x00\xfe\x00\x00\x00\x5c\x03\x5c\x03\x5c\x03\x00\x00\xd0\x03\x5b\x03\x00\x00\x2d\x03\x00\x00\x5b\x03\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x03\x00\x00\x00\x00\x00\x00\x30\x03\x00\x00\x00\x00\x00\x00\x2c\x03\xfe\x00\x28\x03\x00\x00\x00\x00\xfe\x00\x3f\x03\x3f\x03\x12\x00\xd4\x01\xf9\xff\x00\x00\x1d\x00\x00\x00\xf9\xff\x1d\x03\x00\x00\x00\x00\x1d\x00\x32\x03\x00\x00\xf9\xff\x00\x00\x1d\x00\x00\x00\x00\x00"#
-
-happyGotoOffsets :: HappyAddr
-happyGotoOffsets = HappyA# "\xef\x02\x79\x06\x11\x00\x56\x03\x52\x03\xf5\x01\x00\x00\x4f\x03\x00\x00\x4b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x03\x64\x06\x00\x00\x00\x00\x8b\x02\x0e\x00\x00\x00\x00\x00\x00\x00\x6d\x01\x3b\x03\x00\x00\x00\x00\x0f\x01\x00\x00\x00\x00\x1f\x00\x4d\x04\x32\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x02\x4f\x06\x00\x00\x00\x00\xe7\x01\x00\x00\x8a\x04\x76\x04\x00\x00\x3a\x06\x25\x06\x00\x00\x13\x03\x10\x06\x00\x00\x2c\x02\x68\x04\x3c\x03\x2c\x00\x00\x00\x00\x00\x00\x00\xf8\x02\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x05\x65\x03\xd4\x00\x00\x00\x00\x00\x30\x00\x08\x00\x00\x00\x2f\x00\x00\x00\xb6\x02\x30\x02\x14\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x03\x00\x00\x00\x00\xce\x02\xa2\x04\x36\x00\xcf\x01\x00\x00\x9f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x03\xe6\x05\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x04\x00\x00\x00\x00\xbc\x05\xa7\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x01\x00\x00\x92\x05\x6c\x01\xa8\x02\x00\x00\x8d\x04\x35\x00\xcb\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x02\x35\x03\x9b\x02\x00\x00\xfa\x01\x00\x00\x15\x03\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\xb6\x04\x00\x00\xfa\x00\xd6\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x03\x23\x03\x00\x00\x00\x00\xd6\x02\xde\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x06\x00\x37\x01\x04\x03\xfc\x02\xf7\x02\xf2\x02\x16\x00\xe9\x02\xdb\x02\xd8\x02\x0d\x00\x0c\x00\x0b\x00\xcd\x02\x9a\x02\xb1\x00\x00\x00\x00\x00\x00\x00\xf8\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x02\xad\x02\x9f\x02\x91\x02\x47\x02\x00\x00\x18\x02\x6e\x01\x7e\x02\x00\x00\x00\x00\x00\x00\x83\x01\x00\x00\x70\x01\x57\x01\x00\x00\x00\x00\xef\x01\xb5\x01\x82\x01\x6f\x01\x2f\x02\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x01\x7d\x05\xdb\x01\x68\x05\x53\x05\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x02\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\xfb\x01\xec\x01\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x05\x00\x00\x00\x00\x0a\x00\xe9\x01\x04\x00\x1e\x00\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\xdb\x00\x00\x00\x00\x00\x00\x00\x50\x02\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x01\x44\x01\x81\x01\x29\x05\xa0\x01\x00\x00\x90\x01\x00\x00\x85\x01\x00\x00\x00\x00\x00\x00\x79\x01\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x93\x00\x00\x00\x21\x00\x42\x02\x14\x05\xff\x04\xea\x04\x05\x00\xd5\x04\x00\x00\xb2\x00\x35\x02\x84\x00\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x09\x00\x50\x01\x40\x01\x00\x00\x6f\x03\x00\x00\x00\x00\x12\x01\x00\x01\xf5\x00\xcc\x01\x00\x00\x00\x00\xc0\x04\x9e\x03\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x00\xd0\x00\xd0\x02\x00\x00\x00\x00\xb7\x00\xb7\x02\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\xff\x00\x00\x00\x00\x00\x00\x4c\x00\xab\x04\x00\x00\x20\x00\x00\x00\x03\x00\x18\x00\x17\x00\x00\x00\xba\x02\x91\x04\x00\x00\x15\x00\x00\x00\x87\x01\x00\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x01\x00\x00\x00\x00\x00\x00\x9f\x00\xff\xff\x1b\x00\x1c\x00\x4e\x00\xbb\x01\x00\x00\x66\x00\x00\x00\x88\x01\x44\x00\x00\x00\x00\x00\x3d\x00\xfe\xff\x00\x00\x37\x00\x00\x00\x33\x00\x00\x00\x00\x00"#
-
-happyDefActions :: HappyAddr
-happyDefActions = HappyA# "\xfa\xff\x00\x00\xb5\xff\x00\x00\xfc\xff\x00\x00\x00\x00\xb5\xff\xb2\xff\xb5\xff\x9c\xff\x82\xff\x00\x00\x8f\xff\x8e\xff\x8c\xff\x8b\xff\x00\x00\x86\xff\x00\x00\x00\x00\x6c\xff\x6a\xff\xb5\xff\x00\x00\x7e\xff\x7d\xff\x00\x00\x00\x00\x7c\xff\x7b\xff\x00\x00\x7f\xff\x80\xff\x00\x00\x00\x00\x00\x00\xaa\xff\x9d\xff\x81\xff\x00\x00\x9c\xff\x00\x00\x00\x00\x8c\xff\x00\x00\x67\xff\x77\xff\x00\x00\x00\x00\x76\xff\x9a\xff\x51\xff\x5c\xff\x00\x00\x88\xff\x60\xff\x5d\xff\x99\xff\x00\x00\x00\x00\x74\xff\x00\x00\x00\x00\x00\x00\x55\xff\x00\x00\x00\x00\x56\xff\x00\x00\x00\x00\x72\xff\x00\x00\x00\x00\x6b\xff\x00\x00\x6d\xff\x92\xff\x8a\xff\x83\xff\x00\x00\x00\x00\x00\x00\xb4\xff\xb3\xff\xb5\xff\xb5\xff\xf7\xfe\xb5\xff\xf2\xfe\x00\x00\x00\x00\x00\x00\x00\x00\xfb\xff\xf9\xff\xf8\xff\xf7\xff\xf6\xff\xf5\xff\xf4\xff\xf3\xff\xf2\xff\xf1\xff\xf0\xff\xef\xff\xee\xff\xed\xff\xec\xff\xeb\xff\xea\xff\xe9\xff\xe8\xff\xe7\xff\xe6\xff\xe5\xff\xe4\xff\xe3\xff\xe2\xff\xe1\xff\xe0\xff\xdf\xff\xde\xff\xdd\xff\xdc\xff\xdb\xff\xda\xff\xd9\xff\xd4\xff\xd3\xff\xd8\xff\xd7\xff\xd6\xff\xd5\xff\xd2\xff\xd1\xff\xd0\xff\xcf\xff\xce\xff\xcd\xff\xcc\xff\xcb\xff\xca\xff\xc9\xff\xc8\xff\xc7\xff\xc6\xff\xc5\xff\xc4\xff\xc3\xff\xc2\xff\xc1\xff\xc0\xff\xbf\xff\xbe\xff\xbd\xff\xbc\xff\xbb\xff\xba\xff\xb9\xff\xb8\xff\xb7\xff\xb6\xff\x95\xff\x9c\xff\x9b\xff\x52\xff\x47\xff\xfe\xfe\x00\x00\xb1\xff\x00\x00\xf6\xfe\xf5\xfe\x75\xff\x8d\xff\x00\x00\x90\xff\x96\xff\x86\xff\x00\x00\xb5\xff\x00\x00\x00\x00\x71\xff\x70\xff\x00\x00\x58\xff\x59\xff\x91\xff\x57\xff\x00\x00\x5a\xff\x5b\xff\x5f\xff\x61\xff\x89\xff\x5e\xff\x69\xff\x78\xff\x00\x00\x68\xff\x7a\xff\x00\x00\x00\x00\x00\x00\x62\xff\x63\xff\x65\xff\x66\xff\x85\xff\x50\xff\x00\x00\x73\xff\x00\x00\x00\x00\xb5\xff\x87\xff\x47\xff\xfe\xfe\x47\xff\xfa\xfe\x4f\xff\x4d\xff\x4b\xff\x48\xff\x49\xff\x00\x00\x00\x00\x00\x00\x47\xff\x00\x00\x52\xff\x00\x00\x52\xff\x00\x00\x95\xff\x94\xff\xe9\xfe\x54\xff\xb5\xff\x53\xff\x47\xff\x4c\xff\xac\xff\x00\x00\x3c\xff\x4a\xff\xff\xfe\xfd\xfe\xf9\xfe\x00\x00\xb5\xff\xae\xff\x9c\xff\x32\xff\x15\xff\xcd\xfe\x2d\xff\x2b\xff\x2a\xff\x29\xff\x28\xff\x2c\xff\x27\xff\x26\xff\x25\xff\x24\xff\x23\xff\x1d\xff\x22\xff\x20\xff\x21\xff\x1f\xff\x1e\xff\xf3\xfe\xf1\xfe\xf0\xfe\xee\xfe\xef\xfe\xed\xfe\xea\xfe\xec\xfe\xeb\xfe\xb5\xff\xb5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\xff\x00\x00\x00\x00\x00\x00\xb5\xff\xb5\xff\xb5\xff\x00\x00\x36\xff\x00\x00\x00\x00\x6e\xff\x6f\xff\x00\x00\x79\xff\x64\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\xff\x32\xff\x00\x00\x00\x00\x0a\xff\x0b\xff\x0c\xff\x00\x00\xab\xff\x00\x00\x00\x00\x00\x00\x0d\xff\x52\xff\x52\xff\x52\xff\x52\xff\x00\x00\x00\x00\x08\xff\x00\x00\x09\xff\x30\xff\x00\x00\x34\xff\x00\x00\x00\x00\x00\x00\xd1\xfe\xaf\xff\xb0\xff\xad\xff\x3e\xff\x3a\xff\x00\x00\x3b\xff\x00\x00\x00\x00\x00\x00\x00\x00\x42\xff\x00\x00\xac\xff\x4e\xff\x00\x00\xcf\xfe\xf4\xfe\xb5\xff\x00\x00\x00\x00\xac\xff\x44\xff\x40\xff\x45\xff\x3d\xff\x46\xff\x00\x00\xce\xfe\x1a\xff\x31\xff\x38\xff\x00\x00\x16\xff\x17\xff\xb5\xff\x00\x00\xb5\xff\xb5\xff\x52\xff\x00\x00\x00\x00\x00\x00\x00\x00\xb5\xff\x97\xff\x10\xff\x0f\xff\x0e\xff\x00\x00\x04\xff\x02\xff\x00\x00\x00\xff\x36\xff\x84\xff\x34\xff\x00\x00\x95\xff\x93\xff\x95\xff\x00\x00\x95\xff\x00\x00\xe1\xfe\x00\x00\x00\x00\x00\x00\xe2\xfe\xe3\xfe\x00\x00\x95\xff\x00\x00\x00\x00\x1b\xff\x37\xff\x35\xff\x00\x00\x03\xff\x00\x00\x98\xff\x00\x00\xb5\xff\x00\x00\x00\x00\x00\x00\xb5\xff\x00\x00\x00\x00\x00\x00\xb5\xff\x00\x00\xb5\xff\x00\x00\x2f\xff\x33\xff\x39\xff\x43\xff\x41\xff\x3f\xff\x00\x00\xd0\xfe\xb5\xff\x00\x00\xb5\xff\xa6\xff\xa4\xff\x00\x00\xdb\xfe\x00\x00\x00\x00\xb5\xff\xa8\xff\x00\x00\xde\xfe\x00\x00\x47\xff\xf8\xfe\x00\x00\x00\x00\x00\x00\x00\x00\xb5\xff\xa2\xff\x00\x00\xd8\xfe\x00\x00\x00\x00\x07\xff\x06\xff\x00\x00\xe4\xfe\xe6\xfe\x00\x00\xe7\xfe\xe8\xfe\xe5\xfe\x00\x00\x05\xff\x00\x00\xa7\xff\x00\x00\x00\x00\xa3\xff\x00\x00\xda\xfe\xb5\xff\xb5\xff\xb5\xff\xfc\xfe\x47\xff\x00\x00\xa9\xff\x00\x00\xe0\xfe\x00\x00\xa5\xff\x00\x00\xdd\xfe\x2e\xff\xdc\xfe\x19\xff\xdf\xfe\x1c\xff\xfb\xfe\x00\x00\xd6\xfe\x14\xff\x13\xff\x00\x00\x12\xff\xd9\xfe\x18\xff\x00\x00\xa0\xff\x00\x00\x01\xff\xa1\xff\x9e\xff\xb5\xff\xb5\xff\x00\x00\x00\x00\xb5\xff\x9f\xff\x00\x00\xd5\xfe\xb5\xff\x00\x00\xd7\xfe\x11\xff\x00\x00\xb5\xff\xd2\xfe\xb5\xff\xd4\xfe\x00\x00\xd3\xfe"#
-
-happyCheck :: HappyAddr
-happyCheck = HappyA# "\xff\xff\x03\x00\x03\x00\x09\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x00\x00\x03\x00\x03\x00\x04\x00\x05\x00\x03\x00\x30\x00\x03\x00\x03\x00\x03\x00\x03\x00\x00\x00\x03\x00\x0a\x00\x0b\x00\x03\x00\x06\x00\x3b\x00\x2b\x00\x54\x00\x0a\x00\x0b\x00\x2f\x00\x0a\x00\x0a\x00\x0a\x00\x0c\x00\x0c\x00\x0e\x00\x0e\x00\x11\x00\x0a\x00\x03\x00\x03\x00\x05\x00\x0a\x00\x0a\x00\x0c\x00\x0d\x00\x06\x00\x03\x00\x41\x00\x42\x00\x2e\x00\x07\x00\x0a\x00\x0a\x00\x31\x00\x23\x00\x06\x00\x0f\x00\x0f\x00\x27\x00\x28\x00\x29\x00\x1d\x00\x1e\x00\x1f\x00\x2d\x00\x03\x00\x0a\x00\x3d\x00\x41\x00\x1c\x00\x1c\x00\x41\x00\x06\x00\x40\x00\x0a\x00\x0b\x00\x0a\x00\x0f\x00\x3d\x00\x3e\x00\x40\x00\x0f\x00\x37\x00\x38\x00\x39\x00\x0f\x00\x5a\x00\x43\x00\x43\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x5a\x00\x06\x00\x42\x00\x68\x00\x6b\x00\x72\x00\x72\x00\x6f\x00\x72\x00\x72\x00\x70\x00\x71\x00\x70\x00\x71\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x68\x00\x68\x00\x6d\x00\x6c\x00\x6a\x00\x69\x00\x6e\x00\x6e\x00\x69\x00\x3a\x00\x5a\x00\x5a\x00\x56\x00\x56\x00\x3f\x00\x0a\x00\x41\x00\x0c\x00\x0d\x00\x44\x00\x41\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x54\x00\x0a\x00\x0b\x00\x0c\x00\x55\x00\x0e\x00\x57\x00\x58\x00\x59\x00\x01\x00\x0a\x00\x5c\x00\x0c\x00\x5e\x00\x0e\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x06\x00\x08\x00\x09\x00\x12\x00\x0a\x00\x0a\x00\x0a\x00\x0b\x00\x0f\x00\x0f\x00\x0f\x00\x0a\x00\x1b\x00\x1c\x00\x1d\x00\x38\x00\x42\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1c\x00\x41\x00\x28\x00\x29\x00\x2a\x00\x09\x00\x03\x00\x0a\x00\x2e\x00\x31\x00\x41\x00\x0f\x00\x32\x00\x33\x00\x06\x00\x35\x00\x38\x00\x0a\x00\x38\x00\x0a\x00\x3a\x00\x3b\x00\x0f\x00\x51\x00\x0a\x00\x41\x00\x54\x00\x41\x00\x42\x00\x3a\x00\x44\x00\x11\x00\x12\x00\x3f\x00\x3f\x00\x1c\x00\x41\x00\x40\x00\x08\x00\x44\x00\x32\x00\x46\x00\x47\x00\x03\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x37\x00\x08\x00\x39\x00\x41\x00\x55\x00\x06\x00\x57\x00\x58\x00\x59\x00\x41\x00\x42\x00\x5c\x00\x37\x00\x5e\x00\x39\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x0a\x00\x0a\x00\x12\x00\x0a\x00\x0a\x00\x0f\x00\x0f\x00\x34\x00\x35\x00\x36\x00\x11\x00\x1b\x00\x1c\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1c\x00\x2e\x00\x30\x00\x34\x00\x35\x00\x36\x00\x29\x00\x2a\x00\x36\x00\x23\x00\x0a\x00\x2e\x00\x0c\x00\x3a\x00\x0e\x00\x32\x00\x33\x00\x0a\x00\x2c\x00\x2d\x00\x41\x00\x38\x00\x0a\x00\x3a\x00\x03\x00\x08\x00\x09\x00\x0f\x00\x10\x00\x3a\x00\x41\x00\x42\x00\x0f\x00\x44\x00\x3f\x00\x0a\x00\x41\x00\x1e\x00\x1f\x00\x44\x00\x0f\x00\x46\x00\x47\x00\x06\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x1b\x00\x1c\x00\x0a\x00\x14\x00\x55\x00\x3a\x00\x57\x00\x58\x00\x59\x00\x11\x00\x12\x00\x5c\x00\x41\x00\x5e\x00\x54\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0f\x00\x34\x00\x0f\x00\x11\x00\x37\x00\x11\x00\x11\x00\x12\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1b\x00\x1c\x00\x03\x00\x0a\x00\x0a\x00\x15\x00\x07\x00\x23\x00\x0a\x00\x23\x00\x11\x00\x11\x00\x12\x00\x0f\x00\x2a\x00\x2b\x00\x14\x00\x2d\x00\x2c\x00\x2d\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x14\x00\x23\x00\x3a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x3f\x00\x31\x00\x41\x00\x2c\x00\x2d\x00\x44\x00\x36\x00\x46\x00\x47\x00\x14\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x3c\x00\x03\x00\x0a\x00\x3a\x00\x55\x00\x07\x00\x57\x00\x58\x00\x59\x00\x11\x00\x41\x00\x5c\x00\x38\x00\x5e\x00\x3a\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x00\x00\x01\x00\x0a\x00\x0b\x00\x23\x00\x0a\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0f\x00\x10\x00\x3b\x00\x2c\x00\x2d\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x0a\x00\x1e\x00\x0a\x00\x55\x00\x30\x00\x0a\x00\x58\x00\x11\x00\x0a\x00\x5b\x00\x36\x00\x28\x00\x29\x00\x2a\x00\x03\x00\x11\x00\x2d\x00\x2e\x00\x07\x00\x0a\x00\x0a\x00\x32\x00\x33\x00\x08\x00\x35\x00\x23\x00\x11\x00\x38\x00\x0a\x00\x3a\x00\x0a\x00\x29\x00\x3d\x00\x23\x00\x3f\x00\x2d\x00\x41\x00\x42\x00\x3c\x00\x44\x00\x00\x00\x01\x00\x2c\x00\x2d\x00\x23\x00\x0a\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0f\x00\x10\x00\x0a\x00\x2c\x00\x2d\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x11\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x0a\x00\x1e\x00\x03\x00\x0a\x00\x0a\x00\x3e\x00\x07\x00\x11\x00\x23\x00\x0f\x00\x10\x00\x28\x00\x29\x00\x2a\x00\x29\x00\x03\x00\x2d\x00\x2e\x00\x2d\x00\x07\x00\x55\x00\x32\x00\x33\x00\x58\x00\x35\x00\x23\x00\x5b\x00\x38\x00\x5d\x00\x3a\x00\x5f\x00\x3d\x00\x3d\x00\x2b\x00\x3f\x00\x2d\x00\x41\x00\x42\x00\x15\x00\x44\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x01\x00\x53\x00\x54\x00\x0a\x00\x15\x00\x06\x00\x07\x00\x08\x00\x09\x00\x03\x00\x11\x00\x22\x00\x23\x00\x07\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x15\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x23\x00\x1e\x00\x0a\x00\x0a\x00\x15\x00\x0c\x00\x0d\x00\x0f\x00\x10\x00\x2c\x00\x2d\x00\x28\x00\x29\x00\x2a\x00\x01\x00\x15\x00\x2d\x00\x2e\x00\x52\x00\x53\x00\x54\x00\x32\x00\x33\x00\x3b\x00\x35\x00\x0a\x00\x0a\x00\x38\x00\x0a\x00\x3a\x00\x0c\x00\x12\x00\x0e\x00\x11\x00\x3f\x00\x09\x00\x41\x00\x42\x00\x09\x00\x44\x00\x1b\x00\x1c\x00\x1d\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x01\x00\x00\x00\x01\x00\x23\x00\x09\x00\x28\x00\x29\x00\x2a\x00\x31\x00\x32\x00\x33\x00\x2e\x00\x2c\x00\x2d\x00\x0a\x00\x32\x00\x33\x00\x12\x00\x35\x00\x0a\x00\x0a\x00\x38\x00\x39\x00\x3a\x00\x0a\x00\x0f\x00\x1b\x00\x1c\x00\x1d\x00\x13\x00\x41\x00\x42\x00\x0a\x00\x44\x00\x01\x00\x19\x00\x1a\x00\x3d\x00\x1c\x00\x28\x00\x29\x00\x2a\x00\x0a\x00\x0b\x00\x0c\x00\x2e\x00\x24\x00\x0a\x00\x26\x00\x32\x00\x33\x00\x12\x00\x35\x00\x45\x00\x11\x00\x38\x00\x03\x00\x3a\x00\x3b\x00\x14\x00\x1b\x00\x1c\x00\x1d\x00\x32\x00\x41\x00\x42\x00\x06\x00\x44\x00\x01\x00\x38\x00\x33\x00\x3a\x00\x23\x00\x28\x00\x29\x00\x2a\x00\x41\x00\x42\x00\x41\x00\x2e\x00\x2b\x00\x0a\x00\x2d\x00\x32\x00\x33\x00\x12\x00\x35\x00\x0a\x00\x0a\x00\x38\x00\x39\x00\x3a\x00\x14\x00\x0f\x00\x1b\x00\x1c\x00\x03\x00\x13\x00\x41\x00\x42\x00\x03\x00\x44\x00\x02\x00\x19\x00\x1a\x00\x01\x00\x1c\x00\x28\x00\x29\x00\x2a\x00\x01\x00\x2b\x00\x41\x00\x2e\x00\x24\x00\x39\x00\x26\x00\x32\x00\x33\x00\x34\x00\x35\x00\x3b\x00\x37\x00\x38\x00\x2b\x00\x3a\x00\x3c\x00\x12\x00\x41\x00\x0a\x00\x3c\x00\x01\x00\x41\x00\x42\x00\x0f\x00\x44\x00\x1b\x00\x1c\x00\x1d\x00\x0a\x00\x41\x00\x0c\x00\x0d\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x12\x00\x28\x00\x29\x00\x2a\x00\x01\x00\x2b\x00\x3b\x00\x2e\x00\x41\x00\x1b\x00\x1c\x00\x32\x00\x33\x00\x41\x00\x35\x00\x40\x00\x34\x00\x38\x00\x30\x00\x3a\x00\x2b\x00\x12\x00\x28\x00\x29\x00\x2a\x00\x03\x00\x41\x00\x42\x00\x2e\x00\x44\x00\x1b\x00\x1c\x00\x32\x00\x33\x00\x03\x00\x35\x00\x03\x00\x30\x00\x38\x00\x41\x00\x3a\x00\x3b\x00\x2b\x00\x28\x00\x29\x00\x2a\x00\x01\x00\x41\x00\x42\x00\x2e\x00\x44\x00\x41\x00\x30\x00\x32\x00\x33\x00\x2b\x00\x35\x00\x03\x00\x41\x00\x38\x00\x39\x00\x3a\x00\x31\x00\x12\x00\x2b\x00\x0a\x00\x41\x00\x01\x00\x41\x00\x42\x00\x0f\x00\x44\x00\x1b\x00\x1c\x00\x1d\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x12\x00\x28\x00\x29\x00\x2a\x00\x0a\x00\x0b\x00\x0c\x00\x2e\x00\x0e\x00\x1b\x00\x1c\x00\x32\x00\x33\x00\x43\x00\x35\x00\x40\x00\x40\x00\x38\x00\x40\x00\x3a\x00\x40\x00\x40\x00\x28\x00\x29\x00\x2a\x00\x43\x00\x41\x00\x42\x00\x2e\x00\x44\x00\x40\x00\x32\x00\x32\x00\x33\x00\x43\x00\x35\x00\x0a\x00\x38\x00\x38\x00\x3a\x00\x3a\x00\x0f\x00\x43\x00\x43\x00\x0a\x00\x04\x00\x41\x00\x41\x00\x42\x00\x0f\x00\x44\x00\x19\x00\x1a\x00\x13\x00\x1c\x00\x37\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x35\x00\x2b\x00\x30\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x0a\x00\x2b\x00\x30\x00\x30\x00\x41\x00\x0f\x00\x2b\x00\x0f\x00\x41\x00\x13\x00\x2b\x00\x3c\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x0d\x00\x2f\x00\x39\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x0a\x00\x41\x00\x39\x00\x39\x00\x2f\x00\x0f\x00\x41\x00\x04\x00\x3c\x00\x13\x00\x3c\x00\x3c\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x41\x00\x05\x00\x41\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x0a\x00\x26\x00\x43\x00\x40\x00\x43\x00\x0f\x00\x37\x00\x43\x00\x2b\x00\x13\x00\x44\x00\x2b\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x41\x00\x2b\x00\x31\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x0a\x00\x26\x00\x32\x00\x05\x00\x0f\x00\x0f\x00\x43\x00\x2b\x00\x38\x00\x13\x00\x3a\x00\x2b\x00\x40\x00\x03\x00\x0a\x00\x19\x00\x1a\x00\x41\x00\x1c\x00\x0f\x00\x41\x00\x38\x00\x38\x00\x13\x00\x0c\x00\x38\x00\x24\x00\x41\x00\x26\x00\x19\x00\x1a\x00\x2f\x00\x1c\x00\x3b\x00\x0a\x00\x2f\x00\x3b\x00\x2b\x00\x37\x00\x0f\x00\x24\x00\x0a\x00\x26\x00\x13\x00\x31\x00\x43\x00\x0f\x00\x1f\x00\x2b\x00\x19\x00\x1a\x00\x02\x00\x1c\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x24\x00\x3c\x00\x26\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0a\x00\x41\x00\x34\x00\x34\x00\x02\x00\x0f\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x39\x00\x39\x00\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x2f\x00\x45\x00\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x3b\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x30\x00\x3b\x00\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x30\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x41\x00\x3a\x00\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\x2b\x00\x34\x00\x45\x00\x2b\x00\x36\x00\x2b\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x45\x00\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x0a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
-
-happyTable :: HappyAddr
-happyTable = HappyA# "\x00\x00\xd7\x00\x0e\x02\xaa\x00\xbc\x01\xd7\x00\x01\x02\xb3\x01\x67\x01\x4d\x01\x67\x01\xab\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x59\x01\xaf\x01\x05\x00\x06\x00\x07\x00\xa9\x01\xcc\x00\x46\x01\xfd\x01\xfd\x01\x4f\x01\x59\x01\x0d\x02\xc8\x01\xc9\x01\xb1\x01\x15\x02\xd4\x00\x0a\x00\x07\x02\xc8\x01\xc9\x01\xfe\x00\x33\x00\xc1\x01\xc1\x01\xd3\x01\xd3\x01\xd4\x01\xd4\x01\x34\x00\x5b\x01\x05\x00\xab\x00\xaa\x00\xc1\x01\xb6\x00\xc2\x01\xc3\x01\x1d\x02\x1c\x02\x26\x00\x27\x00\xc6\x01\xfc\x00\x0a\x00\x0a\x00\xb0\x01\x35\x00\x1b\x02\x0b\x00\x0b\x00\x36\x00\x37\x00\x38\x00\xb7\x00\xb8\x00\xb9\x00\x39\x00\x7c\x01\x16\x02\x5a\x01\x26\x00\xdb\x00\xdb\x00\x26\x00\x12\x02\xfa\x01\xc8\x01\x05\x02\xfe\x00\x7d\x01\x5a\x01\x5b\x01\xca\x01\x0b\x00\x5c\x01\x5d\x01\x5e\x01\x60\x01\xac\x00\x03\x02\xd5\x01\xff\x00\x0e\x00\x0f\x00\x10\x00\xb0\x00\x12\x00\x08\x00\x19\x02\xf8\x01\x4e\x01\xb4\x01\x1a\x02\x0f\x02\x02\x02\xd8\x00\xd8\x00\x68\x01\xcd\x01\x68\x01\x69\x01\xf7\x01\xb6\x01\x3f\x01\x40\x01\x41\x01\x49\x00\xfe\x01\xfe\x01\xaa\x01\x47\x01\x50\x01\xb2\x01\xff\x01\x00\x02\xb2\x01\x00\x01\x08\x00\xad\x00\xf9\x00\xdc\x00\x01\x01\xc1\x01\x02\x01\xc2\x01\xc3\x01\x03\x01\x26\x00\x04\x01\x05\x01\x13\x02\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\xe2\x01\xe4\x00\xe5\x00\xe6\x00\x0e\x01\xe7\x00\x0f\x01\x10\x01\x11\x01\x18\x00\xc1\x01\x12\x01\xd3\x01\x13\x01\x10\x02\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\xbd\x01\x5b\x00\x5c\x00\x19\x00\xfe\x00\x3b\x01\xc8\x01\xc9\x01\x5d\x00\x0b\x00\x0b\x00\xe4\x01\x1a\x00\x1b\x00\x1c\x00\x8d\x01\xc4\x01\xff\x00\x0e\x00\x0f\x00\x10\x00\xb0\x00\x12\x00\x3d\x00\x8e\x01\x1d\x00\x1e\x00\x1f\x00\xaa\x00\xe8\x01\x5b\x01\x20\x00\xa8\x01\xe8\x00\x4d\x01\x21\x00\x22\x00\xe9\x01\x23\x00\x8d\x01\x0a\x00\x24\x00\x5b\x01\x25\x00\x30\x00\x0b\x00\xd8\x01\x33\x00\x8e\x01\xd9\x01\x26\x00\x27\x00\x00\x01\x28\x00\x85\x01\xa8\x01\x5e\x00\x01\x01\xae\x00\x02\x01\xca\x01\x61\x01\x03\x01\x3b\x00\x04\x01\x05\x01\xf1\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x5c\x01\x61\x01\xb8\x01\x26\x00\x0e\x01\xf2\x01\x0f\x01\x10\x01\x11\x01\x26\x00\x27\x00\x12\x01\x5c\x01\x13\x01\x60\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\xfe\x00\x0a\x00\x19\x00\x33\x00\xe4\x01\x0b\x00\x0b\x00\xb9\x01\x63\x01\x64\x01\x34\x00\x1a\x00\x1b\x00\xff\x00\x0e\x00\x0f\x00\x10\x00\xb0\x00\x12\x00\x3d\x00\xd7\x01\x92\x01\x62\x01\x63\x01\x64\x01\x1e\x00\x1f\x00\x53\x00\xe8\x00\xc1\x01\x20\x00\xd3\x01\xd8\x01\x09\x02\x21\x00\x22\x00\xb6\x00\xb0\x01\xea\x00\x26\x00\x3f\x00\xa4\x00\x40\x00\xf5\x01\x5b\x00\x5c\x00\xa5\x00\xa8\x00\x00\x01\x26\x00\x27\x00\x5d\x00\x28\x00\x74\x01\x0a\x00\x02\x01\x2f\x01\xb9\x00\x03\x01\x0b\x00\x04\x01\x05\x01\xf6\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x4f\x00\x8f\x01\x33\x00\xdd\x01\x0e\x01\xe6\x01\x0f\x01\x10\x01\x11\x01\x85\x01\x86\x01\x12\x01\x26\x00\x13\x01\xda\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\xfe\x00\x33\x00\x0a\x00\x33\x00\x33\x00\x0b\x00\x51\x00\x0b\x00\x34\x00\x52\x00\x34\x00\x85\x01\x87\x01\xff\x00\x0e\x00\x0f\x00\x10\x00\xb0\x00\x12\x00\x8e\x01\x8f\x01\x17\x02\x33\x00\x33\x00\x9b\x01\x18\x02\x41\x00\x0a\x00\xe8\x00\x34\x00\x85\x01\x88\x01\x0b\x00\x42\x00\x43\x00\x9e\x01\x44\x00\x80\x01\xea\x00\xf9\x01\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\xa0\x01\xe8\x00\x00\x01\x13\x00\x14\x00\x15\x00\x16\x00\x01\x01\xcd\x00\x02\x01\x81\x01\xea\x00\x03\x01\x53\x00\x04\x01\x05\x01\xa1\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\xa3\x01\x11\x02\x33\x00\x48\x00\x0e\x01\xfc\x00\x0f\x01\x10\x01\x11\x01\x34\x00\x26\x00\x12\x01\x46\x00\x13\x01\x4c\x00\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x59\x01\x18\x00\xc8\x01\xf0\x01\xe8\x00\xa4\x00\x1d\x01\x1e\x01\x1f\x01\x5c\x00\xa5\x00\xda\x00\xa4\x01\x82\x01\xea\x00\x20\x01\x21\x01\x22\x01\x23\x01\x15\x02\x24\x01\x25\x01\x26\x01\x27\x01\x28\x01\x29\x01\x2a\x01\x1a\x00\x1b\x00\x33\x00\x2b\x01\xb5\x01\x55\x00\x56\x01\xba\x01\x56\x00\x34\x00\x33\x00\x57\x00\x53\x00\x1d\x00\x1e\x00\x1f\x00\xbf\x01\x34\x00\x2c\x01\x2d\x01\xc0\x01\x33\x00\xbb\x01\x21\x00\x22\x00\x6b\x01\x23\x00\x35\x00\x34\x00\x3f\x00\x6f\x01\x40\x00\x71\x01\xc2\x00\x5a\x01\xe8\x00\x2e\x01\x39\x00\x26\x00\x27\x00\x77\x01\x28\x00\x59\x01\x18\x00\x83\x01\xea\x00\xe8\x00\xa4\x00\x1d\x01\x1e\x01\x1f\x01\x5c\x00\xa5\x00\xa6\x00\x33\x00\xef\x00\xea\x00\x20\x01\x21\x01\x22\x01\x23\x01\x34\x00\x24\x01\x25\x01\x26\x01\x27\x01\x28\x01\x29\x01\x2a\x01\x1a\x00\x1b\x00\x33\x00\x2b\x01\xc6\x01\x7f\x01\xa4\x00\x7a\x01\xc7\x01\x34\x00\x35\x00\xa5\x00\xa7\x00\x1d\x00\x1e\x00\x1f\x00\xc5\x00\xd1\x01\x2c\x01\x2d\x01\x39\x00\xd2\x01\x55\x00\x21\x00\x22\x00\x56\x00\x23\x00\x41\x00\x57\x00\x3f\x00\x58\x00\x40\x00\x59\x00\x90\x01\x5a\x01\xbb\x00\x2e\x01\x44\x00\x26\x00\x27\x00\x92\x01\x28\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\x18\x00\xa6\x01\x8b\x01\x33\x00\x94\x01\x1d\x01\x1e\x01\x1f\x01\x5c\x00\xfb\x00\x34\x00\x4a\x00\x16\x00\xfc\x00\x20\x01\x21\x01\x22\x01\x23\x01\x95\x01\x24\x01\x25\x01\x26\x01\x27\x01\x28\x01\x29\x01\x2a\x01\x1a\x00\x1b\x00\xe8\x00\x2b\x01\xa4\x00\xc1\x01\x96\x01\xc2\x01\xe3\x01\xa5\x00\xa8\x00\xf1\x00\xea\x00\x1d\x00\x1e\x00\x1f\x00\x18\x00\x97\x01\x2c\x01\x2d\x01\x89\x01\x8a\x01\x8b\x01\x21\x00\x22\x00\x3c\x01\x23\x00\x3e\x01\x33\x00\x3f\x00\xc1\x01\x40\x00\xd3\x01\x19\x00\xe7\x01\x34\x00\x2e\x01\x42\x01\x26\x00\x27\x00\x44\x01\x28\x00\x1a\x00\x1b\x00\x1c\x00\xfc\x01\xdf\x00\xe0\x00\xe1\x00\xe2\x00\x18\x00\x28\x00\x04\x00\xe8\x00\x45\x01\x1d\x00\x1e\x00\x1f\x00\xf3\x00\xe1\x00\xe2\x00\x20\x00\xe9\x00\xea\x00\x48\x01\x21\x00\x22\x00\x19\x00\x23\x00\x49\x01\x0a\x00\x24\x00\x33\x00\x25\x00\x4a\x01\x0b\x00\x1a\x00\x1b\x00\x1c\x00\x2a\x00\x26\x00\x27\x00\x4b\x01\x28\x00\x18\x00\xb2\x00\x10\x00\x53\x01\xb3\x00\x1d\x00\x1e\x00\x1f\x00\xe4\x00\xe5\x00\xe6\x00\x20\x00\x2d\x00\x33\x00\x2e\x00\x21\x00\x22\x00\x19\x00\x23\x00\x51\x01\x34\x00\x24\x00\x56\x01\x25\x00\x30\x00\xed\x00\x1a\x00\x1b\x00\x1c\x00\x3b\x00\x26\x00\x27\x00\x57\x01\x28\x00\x18\x00\x46\x00\xf7\x00\x47\x00\x41\x00\x1d\x00\x1e\x00\x1f\x00\x26\x00\x27\x00\x26\x00\x20\x00\xbe\x00\xf2\x00\x44\x00\x21\x00\x22\x00\x19\x00\x23\x00\x40\x00\x0a\x00\x24\x00\x33\x00\x25\x00\xeb\x00\x0b\x00\x1a\x00\x1b\x00\x53\x00\xba\x00\x26\x00\x27\x00\x54\x00\x28\x00\x5e\x00\xb2\x00\x10\x00\x04\x00\xb3\x00\x1d\x00\x1e\x00\x1f\x00\x18\x00\x0a\x00\x26\x00\x20\x00\x2d\x00\x09\x02\x2e\x00\x21\x00\x22\x00\x84\xff\x23\x00\x0b\x02\x84\xff\x3f\x00\x0a\x00\x40\x00\x0c\x02\x19\x00\x26\x00\x0a\x00\x0d\x02\x18\x00\x26\x00\x27\x00\x0b\x00\x28\x00\x1a\x00\x1b\x00\x1c\x00\xc1\x01\x26\x00\xc2\x01\xf4\x01\xaf\x00\x0f\x00\x10\x00\xb0\x00\x12\x00\x19\x00\x1d\x00\x1e\x00\x1f\x00\x18\x00\x0a\x00\x07\x02\x20\x00\x8e\x01\x1a\x00\x1b\x00\x21\x00\x22\x00\x8e\x01\x23\x00\xe1\x01\xe2\x01\x24\x00\xe7\x01\x25\x00\x0a\x00\x19\x00\x1d\x00\x1e\x00\x1f\x00\xeb\x01\x26\x00\x27\x00\x20\x00\x28\x00\x1a\x00\x1b\x00\x21\x00\x22\x00\xec\x01\x23\x00\xed\x01\xf0\x01\x3f\x00\x26\x00\x40\x00\xc1\x00\x0a\x00\x1d\x00\x1e\x00\x1f\x00\x18\x00\x26\x00\x27\x00\x20\x00\x28\x00\x26\x00\xf4\x01\x21\x00\x22\x00\x0a\x00\x23\x00\xbf\x01\x26\x00\x3f\x00\xc2\x00\x40\x00\xcc\x01\x19\x00\x0a\x00\x0a\x00\x8e\x01\x18\x00\x26\x00\x27\x00\x0b\x00\x28\x00\x1a\x00\x1b\x00\x1c\x00\xed\x01\xdf\x00\xe0\x00\xe1\x00\xe2\x00\x4e\x00\x10\x00\x4f\x00\x12\x00\x19\x00\x1d\x00\x1e\x00\x1f\x00\xe4\x00\xe5\x00\xe6\x00\x20\x00\xe7\x00\x1a\x00\x1b\x00\x21\x00\x22\x00\xed\x00\x23\x00\xdc\x01\xdd\x01\x24\x00\xdf\x01\x25\x00\xe0\x01\x9d\x01\x1d\x00\x1e\x00\x1f\x00\x94\x01\x26\x00\x27\x00\x20\x00\x28\x00\x9e\x01\x3b\x00\x21\x00\x22\x00\xed\x00\x23\x00\x0a\x00\x3c\x00\x3f\x00\x3d\x00\x40\x00\x0b\x00\xa0\x01\xed\x00\x0a\x00\x79\x01\x26\x00\x26\x00\x27\x00\x0b\x00\x28\x00\x4e\x00\x10\x00\x2a\x00\xb3\x00\x3e\x01\xcf\x00\x0d\x00\x0e\x00\x2c\x00\x10\x00\x11\x00\x12\x00\xa6\x01\x0a\x00\xac\x01\x13\x00\x14\x00\x15\x00\x16\x00\xd0\x00\x32\x01\x2e\x00\x0a\x00\x0a\x00\xad\x01\xae\x01\x26\x00\x0b\x00\x0a\x00\x66\x01\x26\x00\x2a\x00\x0a\x00\x6b\x01\xcf\x00\x0d\x00\x0e\x00\x2c\x00\x10\x00\x11\x00\x12\x00\x6d\x01\x6e\x01\x6f\x01\x13\x00\x14\x00\x15\x00\x16\x00\xd0\x00\xd1\x00\x2e\x00\x29\x00\x26\x00\x71\x01\x73\x01\x74\x01\x0b\x00\x26\x00\x79\x01\x7e\x01\x2a\x00\x7f\x01\x85\x01\x2b\x00\x0d\x00\x0e\x00\x2c\x00\x10\x00\x11\x00\x12\x00\x26\x00\x55\x01\x26\x00\x13\x00\x14\x00\x15\x00\x16\x00\x2d\x00\x0a\x00\x2e\x00\x94\x01\x99\x01\x9a\x01\x0b\x00\x3e\x01\x9b\x01\x0a\x00\x2a\x00\x44\x01\x0a\x00\x30\x00\x0d\x00\x0e\x00\x2c\x00\x10\x00\x11\x00\x12\x00\x26\x00\x0a\x00\x53\x01\x13\x00\x14\x00\x15\x00\x16\x00\x31\x00\x0a\x00\x2e\x00\x3b\x00\x55\x01\x66\x01\x0b\x00\xed\x00\x0a\x00\x46\x00\x2a\x00\x47\x00\x0a\x00\xef\x00\xf1\x00\x0a\x00\xb2\x00\x10\x00\x26\x00\xb3\x00\x0b\x00\x26\x00\xf5\x00\xf6\x00\xba\x00\xe6\x00\xf7\x00\x31\x00\x26\x00\x2e\x00\xb2\x00\x10\x00\x31\x01\xb3\x00\x32\x01\x0a\x00\xd5\x00\xd6\x00\x0a\x00\x52\x00\x0b\x00\x2d\x00\x0a\x00\x2e\x00\x2a\x00\xd7\x00\xed\x00\x0b\x00\xa4\x00\x0a\x00\xb2\x00\x10\x00\xb5\x00\xb3\x00\xfb\x01\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x31\x00\xb6\x00\x2e\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0a\x00\x26\x00\xbd\x00\xc4\x00\xc0\x00\x0b\x00\xfa\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\x04\x02\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\xc7\x00\xc8\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xee\x01\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\xc9\x00\xff\xff\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x66\x01\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xca\x00\xcc\x01\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x96\xff\xcb\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\xf8\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xcc\x00\xce\x01\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x26\x00\x48\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x0a\x00\x4d\x00\xff\xff\x0a\x00\x53\x00\x0a\x00\xcf\x01\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\xff\xff\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x01\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x01\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x01\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x01\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x01\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x01\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x29\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x00\x00\x13\x00\x14\x00\x15\x00\x16\x00\x34\x01\x35\x01\x36\x01\x37\x01\x38\x01\x39\x01\x3a\x01\x3b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
-
-happyReduceArr = Happy_Data_Array.array (3, 306) [
-	(3 , happyReduce_3),
-	(4 , happyReduce_4),
-	(5 , happyReduce_5),
-	(6 , happyReduce_6),
-	(7 , happyReduce_7),
-	(8 , happyReduce_8),
-	(9 , happyReduce_9),
-	(10 , happyReduce_10),
-	(11 , happyReduce_11),
-	(12 , happyReduce_12),
-	(13 , happyReduce_13),
-	(14 , happyReduce_14),
-	(15 , happyReduce_15),
-	(16 , happyReduce_16),
-	(17 , happyReduce_17),
-	(18 , happyReduce_18),
-	(19 , happyReduce_19),
-	(20 , happyReduce_20),
-	(21 , happyReduce_21),
-	(22 , happyReduce_22),
-	(23 , happyReduce_23),
-	(24 , happyReduce_24),
-	(25 , happyReduce_25),
-	(26 , happyReduce_26),
-	(27 , happyReduce_27),
-	(28 , happyReduce_28),
-	(29 , happyReduce_29),
-	(30 , happyReduce_30),
-	(31 , happyReduce_31),
-	(32 , happyReduce_32),
-	(33 , happyReduce_33),
-	(34 , happyReduce_34),
-	(35 , happyReduce_35),
-	(36 , happyReduce_36),
-	(37 , happyReduce_37),
-	(38 , happyReduce_38),
-	(39 , happyReduce_39),
-	(40 , happyReduce_40),
-	(41 , happyReduce_41),
-	(42 , happyReduce_42),
-	(43 , happyReduce_43),
-	(44 , happyReduce_44),
-	(45 , happyReduce_45),
-	(46 , happyReduce_46),
-	(47 , happyReduce_47),
-	(48 , happyReduce_48),
-	(49 , happyReduce_49),
-	(50 , happyReduce_50),
-	(51 , happyReduce_51),
-	(52 , happyReduce_52),
-	(53 , happyReduce_53),
-	(54 , happyReduce_54),
-	(55 , happyReduce_55),
-	(56 , happyReduce_56),
-	(57 , happyReduce_57),
-	(58 , happyReduce_58),
-	(59 , happyReduce_59),
-	(60 , happyReduce_60),
-	(61 , happyReduce_61),
-	(62 , happyReduce_62),
-	(63 , happyReduce_63),
-	(64 , happyReduce_64),
-	(65 , happyReduce_65),
-	(66 , happyReduce_66),
-	(67 , happyReduce_67),
-	(68 , happyReduce_68),
-	(69 , happyReduce_69),
-	(70 , happyReduce_70),
-	(71 , happyReduce_71),
-	(72 , happyReduce_72),
-	(73 , happyReduce_73),
-	(74 , happyReduce_74),
-	(75 , happyReduce_75),
-	(76 , happyReduce_76),
-	(77 , happyReduce_77),
-	(78 , happyReduce_78),
-	(79 , happyReduce_79),
-	(80 , happyReduce_80),
-	(81 , happyReduce_81),
-	(82 , happyReduce_82),
-	(83 , happyReduce_83),
-	(84 , happyReduce_84),
-	(85 , happyReduce_85),
-	(86 , happyReduce_86),
-	(87 , happyReduce_87),
-	(88 , happyReduce_88),
-	(89 , happyReduce_89),
-	(90 , happyReduce_90),
-	(91 , happyReduce_91),
-	(92 , happyReduce_92),
-	(93 , happyReduce_93),
-	(94 , happyReduce_94),
-	(95 , happyReduce_95),
-	(96 , happyReduce_96),
-	(97 , happyReduce_97),
-	(98 , happyReduce_98),
-	(99 , happyReduce_99),
-	(100 , happyReduce_100),
-	(101 , happyReduce_101),
-	(102 , happyReduce_102),
-	(103 , happyReduce_103),
-	(104 , happyReduce_104),
-	(105 , happyReduce_105),
-	(106 , happyReduce_106),
-	(107 , happyReduce_107),
-	(108 , happyReduce_108),
-	(109 , happyReduce_109),
-	(110 , happyReduce_110),
-	(111 , happyReduce_111),
-	(112 , happyReduce_112),
-	(113 , happyReduce_113),
-	(114 , happyReduce_114),
-	(115 , happyReduce_115),
-	(116 , happyReduce_116),
-	(117 , happyReduce_117),
-	(118 , happyReduce_118),
-	(119 , happyReduce_119),
-	(120 , happyReduce_120),
-	(121 , happyReduce_121),
-	(122 , happyReduce_122),
-	(123 , happyReduce_123),
-	(124 , happyReduce_124),
-	(125 , happyReduce_125),
-	(126 , happyReduce_126),
-	(127 , happyReduce_127),
-	(128 , happyReduce_128),
-	(129 , happyReduce_129),
-	(130 , happyReduce_130),
-	(131 , happyReduce_131),
-	(132 , happyReduce_132),
-	(133 , happyReduce_133),
-	(134 , happyReduce_134),
-	(135 , happyReduce_135),
-	(136 , happyReduce_136),
-	(137 , happyReduce_137),
-	(138 , happyReduce_138),
-	(139 , happyReduce_139),
-	(140 , happyReduce_140),
-	(141 , happyReduce_141),
-	(142 , happyReduce_142),
-	(143 , happyReduce_143),
-	(144 , happyReduce_144),
-	(145 , happyReduce_145),
-	(146 , happyReduce_146),
-	(147 , happyReduce_147),
-	(148 , happyReduce_148),
-	(149 , happyReduce_149),
-	(150 , happyReduce_150),
-	(151 , happyReduce_151),
-	(152 , happyReduce_152),
-	(153 , happyReduce_153),
-	(154 , happyReduce_154),
-	(155 , happyReduce_155),
-	(156 , happyReduce_156),
-	(157 , happyReduce_157),
-	(158 , happyReduce_158),
-	(159 , happyReduce_159),
-	(160 , happyReduce_160),
-	(161 , happyReduce_161),
-	(162 , happyReduce_162),
-	(163 , happyReduce_163),
-	(164 , happyReduce_164),
-	(165 , happyReduce_165),
-	(166 , happyReduce_166),
-	(167 , happyReduce_167),
-	(168 , happyReduce_168),
-	(169 , happyReduce_169),
-	(170 , happyReduce_170),
-	(171 , happyReduce_171),
-	(172 , happyReduce_172),
-	(173 , happyReduce_173),
-	(174 , happyReduce_174),
-	(175 , happyReduce_175),
-	(176 , happyReduce_176),
-	(177 , happyReduce_177),
-	(178 , happyReduce_178),
-	(179 , happyReduce_179),
-	(180 , happyReduce_180),
-	(181 , happyReduce_181),
-	(182 , happyReduce_182),
-	(183 , happyReduce_183),
-	(184 , happyReduce_184),
-	(185 , happyReduce_185),
-	(186 , happyReduce_186),
-	(187 , happyReduce_187),
-	(188 , happyReduce_188),
-	(189 , happyReduce_189),
-	(190 , happyReduce_190),
-	(191 , happyReduce_191),
-	(192 , happyReduce_192),
-	(193 , happyReduce_193),
-	(194 , happyReduce_194),
-	(195 , happyReduce_195),
-	(196 , happyReduce_196),
-	(197 , happyReduce_197),
-	(198 , happyReduce_198),
-	(199 , happyReduce_199),
-	(200 , happyReduce_200),
-	(201 , happyReduce_201),
-	(202 , happyReduce_202),
-	(203 , happyReduce_203),
-	(204 , happyReduce_204),
-	(205 , happyReduce_205),
-	(206 , happyReduce_206),
-	(207 , happyReduce_207),
-	(208 , happyReduce_208),
-	(209 , happyReduce_209),
-	(210 , happyReduce_210),
-	(211 , happyReduce_211),
-	(212 , happyReduce_212),
-	(213 , happyReduce_213),
-	(214 , happyReduce_214),
-	(215 , happyReduce_215),
-	(216 , happyReduce_216),
-	(217 , happyReduce_217),
-	(218 , happyReduce_218),
-	(219 , happyReduce_219),
-	(220 , happyReduce_220),
-	(221 , happyReduce_221),
-	(222 , happyReduce_222),
-	(223 , happyReduce_223),
-	(224 , happyReduce_224),
-	(225 , happyReduce_225),
-	(226 , happyReduce_226),
-	(227 , happyReduce_227),
-	(228 , happyReduce_228),
-	(229 , happyReduce_229),
-	(230 , happyReduce_230),
-	(231 , happyReduce_231),
-	(232 , happyReduce_232),
-	(233 , happyReduce_233),
-	(234 , happyReduce_234),
-	(235 , happyReduce_235),
-	(236 , happyReduce_236),
-	(237 , happyReduce_237),
-	(238 , happyReduce_238),
-	(239 , happyReduce_239),
-	(240 , happyReduce_240),
-	(241 , happyReduce_241),
-	(242 , happyReduce_242),
-	(243 , happyReduce_243),
-	(244 , happyReduce_244),
-	(245 , happyReduce_245),
-	(246 , happyReduce_246),
-	(247 , happyReduce_247),
-	(248 , happyReduce_248),
-	(249 , happyReduce_249),
-	(250 , happyReduce_250),
-	(251 , happyReduce_251),
-	(252 , happyReduce_252),
-	(253 , happyReduce_253),
-	(254 , happyReduce_254),
-	(255 , happyReduce_255),
-	(256 , happyReduce_256),
-	(257 , happyReduce_257),
-	(258 , happyReduce_258),
-	(259 , happyReduce_259),
-	(260 , happyReduce_260),
-	(261 , happyReduce_261),
-	(262 , happyReduce_262),
-	(263 , happyReduce_263),
-	(264 , happyReduce_264),
-	(265 , happyReduce_265),
-	(266 , happyReduce_266),
-	(267 , happyReduce_267),
-	(268 , happyReduce_268),
-	(269 , happyReduce_269),
-	(270 , happyReduce_270),
-	(271 , happyReduce_271),
-	(272 , happyReduce_272),
-	(273 , happyReduce_273),
-	(274 , happyReduce_274),
-	(275 , happyReduce_275),
-	(276 , happyReduce_276),
-	(277 , happyReduce_277),
-	(278 , happyReduce_278),
-	(279 , happyReduce_279),
-	(280 , happyReduce_280),
-	(281 , happyReduce_281),
-	(282 , happyReduce_282),
-	(283 , happyReduce_283),
-	(284 , happyReduce_284),
-	(285 , happyReduce_285),
-	(286 , happyReduce_286),
-	(287 , happyReduce_287),
-	(288 , happyReduce_288),
-	(289 , happyReduce_289),
-	(290 , happyReduce_290),
-	(291 , happyReduce_291),
-	(292 , happyReduce_292),
-	(293 , happyReduce_293),
-	(294 , happyReduce_294),
-	(295 , happyReduce_295),
-	(296 , happyReduce_296),
-	(297 , happyReduce_297),
-	(298 , happyReduce_298),
-	(299 , happyReduce_299),
-	(300 , happyReduce_300),
-	(301 , happyReduce_301),
-	(302 , happyReduce_302),
-	(303 , happyReduce_303),
-	(304 , happyReduce_304),
-	(305 , happyReduce_305),
-	(306 , happyReduce_306)
-	]
-
-happy_n_terms = 70 :: Int
-happy_n_nonterms = 115 :: Int
-
-happyReduce_3 = happySpecReduce_1  0# happyReduction_3
-happyReduction_3 happy_x_1
-	 =  case happyOut7 happy_x_1 of { happy_var_1 -> 
-	happyIn6
-		 (reverse happy_var_1
-	)}
-
-happyReduce_4 = happySpecReduce_2  1# happyReduction_4
-happyReduction_4 happy_x_2
-	happy_x_1
-	 =  case happyOut7 happy_x_1 of { happy_var_1 -> 
-	case happyOut8 happy_x_2 of { happy_var_2 -> 
-	happyIn7
-		 (happy_var_2 : happy_var_1
-	)}}
-
-happyReduce_5 = happySpecReduce_0  1# happyReduction_5
-happyReduction_5  =  happyIn7
-		 ([]
-	)
-
-happyReduce_6 = happySpecReduce_1  2# happyReduction_6
-happyReduction_6 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwLet happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwLet happy_var_1
-	)}
-
-happyReduce_7 = happySpecReduce_1  2# happyReduction_7
-happyReduction_7 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwIn happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwIn happy_var_1
-	)}
-
-happyReduce_8 = happySpecReduce_1  2# happyReduction_8
-happyReduction_8 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwWhere happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwWhere happy_var_1
-	)}
-
-happyReduce_9 = happySpecReduce_1  2# happyReduction_9
-happyReduction_9 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwWith happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwWith happy_var_1
-	)}
-
-happyReduce_10 = happySpecReduce_1  2# happyReduction_10
-happyReduction_10 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwRewrite happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwRewrite happy_var_1
-	)}
-
-happyReduce_11 = happySpecReduce_1  2# happyReduction_11
-happyReduction_11 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwPostulate happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwPostulate happy_var_1
-	)}
-
-happyReduce_12 = happySpecReduce_1  2# happyReduction_12
-happyReduction_12 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwPrimitive happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwPrimitive happy_var_1
-	)}
-
-happyReduce_13 = happySpecReduce_1  2# happyReduction_13
-happyReduction_13 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwOpen happy_var_1
-	)}
-
-happyReduce_14 = happySpecReduce_1  2# happyReduction_14
-happyReduction_14 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwImport happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwImport happy_var_1
-	)}
-
-happyReduce_15 = happySpecReduce_1  2# happyReduction_15
-happyReduction_15 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwUsing happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwUsing happy_var_1
-	)}
-
-happyReduce_16 = happySpecReduce_1  2# happyReduction_16
-happyReduction_16 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwHiding happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwHiding happy_var_1
-	)}
-
-happyReduce_17 = happySpecReduce_1  2# happyReduction_17
-happyReduction_17 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwRenaming happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwRenaming happy_var_1
-	)}
-
-happyReduce_18 = happySpecReduce_1  2# happyReduction_18
-happyReduction_18 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwTo happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwTo happy_var_1
-	)}
-
-happyReduce_19 = happySpecReduce_1  2# happyReduction_19
-happyReduction_19 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwPublic happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwPublic happy_var_1
-	)}
-
-happyReduce_20 = happySpecReduce_1  2# happyReduction_20
-happyReduction_20 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwModule happy_var_1
-	)}
-
-happyReduce_21 = happySpecReduce_1  2# happyReduction_21
-happyReduction_21 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwData happy_var_1
-	)}
-
-happyReduce_22 = happySpecReduce_1  2# happyReduction_22
-happyReduction_22 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwCoData happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwCoData happy_var_1
-	)}
-
-happyReduce_23 = happySpecReduce_1  2# happyReduction_23
-happyReduction_23 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwRecord happy_var_1
-	)}
-
-happyReduce_24 = happySpecReduce_1  2# happyReduction_24
-happyReduction_24 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwConstructor happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwConstructor happy_var_1
-	)}
-
-happyReduce_25 = happySpecReduce_1  2# happyReduction_25
-happyReduction_25 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwField happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwField happy_var_1
-	)}
-
-happyReduce_26 = happySpecReduce_1  2# happyReduction_26
-happyReduction_26 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwInfix happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwInfix happy_var_1
-	)}
-
-happyReduce_27 = happySpecReduce_1  2# happyReduction_27
-happyReduction_27 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwInfixL happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwInfixL happy_var_1
-	)}
-
-happyReduce_28 = happySpecReduce_1  2# happyReduction_28
-happyReduction_28 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwInfixR happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwInfixR happy_var_1
-	)}
-
-happyReduce_29 = happySpecReduce_1  2# happyReduction_29
-happyReduction_29 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwMutual happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwMutual happy_var_1
-	)}
-
-happyReduce_30 = happySpecReduce_1  2# happyReduction_30
-happyReduction_30 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwAbstract happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwAbstract happy_var_1
-	)}
-
-happyReduce_31 = happySpecReduce_1  2# happyReduction_31
-happyReduction_31 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwPrivate happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwPrivate happy_var_1
-	)}
-
-happyReduce_32 = happySpecReduce_1  2# happyReduction_32
-happyReduction_32 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwProp happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwProp happy_var_1
-	)}
-
-happyReduce_33 = happySpecReduce_1  2# happyReduction_33
-happyReduction_33 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwSet happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwSet happy_var_1
-	)}
-
-happyReduce_34 = happySpecReduce_1  2# happyReduction_34
-happyReduction_34 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwForall happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwForall happy_var_1
-	)}
-
-happyReduce_35 = happySpecReduce_1  2# happyReduction_35
-happyReduction_35 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwSyntax happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwSyntax happy_var_1
-	)}
-
-happyReduce_36 = happySpecReduce_1  2# happyReduction_36
-happyReduction_36 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwOPTIONS happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwOPTIONS happy_var_1
-	)}
-
-happyReduce_37 = happySpecReduce_1  2# happyReduction_37
-happyReduction_37 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwBUILTIN happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwBUILTIN happy_var_1
-	)}
-
-happyReduce_38 = happySpecReduce_1  2# happyReduction_38
-happyReduction_38 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwIMPORT happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwIMPORT happy_var_1
-	)}
-
-happyReduce_39 = happySpecReduce_1  2# happyReduction_39
-happyReduction_39 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwCOMPILED happy_var_1
-	)}
-
-happyReduce_40 = happySpecReduce_1  2# happyReduction_40
-happyReduction_40 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_DATA happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwCOMPILED_DATA happy_var_1
-	)}
-
-happyReduce_41 = happySpecReduce_1  2# happyReduction_41
-happyReduction_41 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_TYPE happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwCOMPILED_TYPE happy_var_1
-	)}
-
-happyReduce_42 = happySpecReduce_1  2# happyReduction_42
-happyReduction_42 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_EPIC happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwCOMPILED_EPIC happy_var_1
-	)}
-
-happyReduce_43 = happySpecReduce_1  2# happyReduction_43
-happyReduction_43 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwIMPOSSIBLE happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwIMPOSSIBLE happy_var_1
-	)}
-
-happyReduce_44 = happySpecReduce_1  2# happyReduction_44
-happyReduction_44 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwETA happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwETA happy_var_1
-	)}
-
-happyReduce_45 = happySpecReduce_1  2# happyReduction_45
-happyReduction_45 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwQuoteGoal happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwQuoteGoal happy_var_1
-	)}
-
-happyReduce_46 = happySpecReduce_1  2# happyReduction_46
-happyReduction_46 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwQuote happy_var_1) -> 
-	happyIn8
-		 (TokKeyword KwQuote happy_var_1
-	)}
-
-happyReduce_47 = happySpecReduce_1  2# happyReduction_47
-happyReduction_47 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSetN happy_var_1) -> 
-	happyIn8
-		 (TokSetN happy_var_1
-	)}
-
-happyReduce_48 = happySpecReduce_1  2# happyReduction_48
-happyReduction_48 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokTeX happy_var_1) -> 
-	happyIn8
-		 (TokTeX happy_var_1
-	)}
-
-happyReduce_49 = happySpecReduce_1  2# happyReduction_49
-happyReduction_49 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokComment happy_var_1) -> 
-	happyIn8
-		 (TokComment happy_var_1
-	)}
-
-happyReduce_50 = happySpecReduce_1  2# happyReduction_50
-happyReduction_50 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymEllipsis happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymEllipsis happy_var_1
-	)}
-
-happyReduce_51 = happySpecReduce_1  2# happyReduction_51
-happyReduction_51 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymDot happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymDot happy_var_1
-	)}
-
-happyReduce_52 = happySpecReduce_1  2# happyReduction_52
-happyReduction_52 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymSemi happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymSemi happy_var_1
-	)}
-
-happyReduce_53 = happySpecReduce_1  2# happyReduction_53
-happyReduction_53 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymColon happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymColon happy_var_1
-	)}
-
-happyReduce_54 = happySpecReduce_1  2# happyReduction_54
-happyReduction_54 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymEqual happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymEqual happy_var_1
-	)}
-
-happyReduce_55 = happySpecReduce_1  2# happyReduction_55
-happyReduction_55 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymUnderscore happy_var_1
-	)}
-
-happyReduce_56 = happySpecReduce_1  2# happyReduction_56
-happyReduction_56 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymQuestionMark happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymQuestionMark happy_var_1
-	)}
-
-happyReduce_57 = happySpecReduce_1  2# happyReduction_57
-happyReduction_57 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymArrow happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymArrow happy_var_1
-	)}
-
-happyReduce_58 = happySpecReduce_1  2# happyReduction_58
-happyReduction_58 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymLambda happy_var_1
-	)}
-
-happyReduce_59 = happySpecReduce_1  2# happyReduction_59
-happyReduction_59 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymAs happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymAs happy_var_1
-	)}
-
-happyReduce_60 = happySpecReduce_1  2# happyReduction_60
-happyReduction_60 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymBar happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymBar happy_var_1
-	)}
-
-happyReduce_61 = happySpecReduce_1  2# happyReduction_61
-happyReduction_61 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymOpenParen happy_var_1
-	)}
-
-happyReduce_62 = happySpecReduce_1  2# happyReduction_62
-happyReduction_62 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymCloseParen happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymCloseParen happy_var_1
-	)}
-
-happyReduce_63 = happySpecReduce_1  2# happyReduction_63
-happyReduction_63 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymOpenBrace happy_var_1
-	)}
-
-happyReduce_64 = happySpecReduce_1  2# happyReduction_64
-happyReduction_64 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymCloseBrace happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymCloseBrace happy_var_1
-	)}
-
-happyReduce_65 = happySpecReduce_1  2# happyReduction_65
-happyReduction_65 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenVirtualBrace happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymOpenVirtualBrace happy_var_1
-	)}
-
-happyReduce_66 = happySpecReduce_1  2# happyReduction_66
-happyReduction_66 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymCloseVirtualBrace happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymCloseVirtualBrace happy_var_1
-	)}
-
-happyReduce_67 = happySpecReduce_1  2# happyReduction_67
-happyReduction_67 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymVirtualSemi happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymVirtualSemi happy_var_1
-	)}
-
-happyReduce_68 = happySpecReduce_1  2# happyReduction_68
-happyReduction_68 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymOpenPragma happy_var_1
-	)}
-
-happyReduce_69 = happySpecReduce_1  2# happyReduction_69
-happyReduction_69 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymClosePragma happy_var_1) -> 
-	happyIn8
-		 (TokSymbol SymClosePragma happy_var_1
-	)}
-
-happyReduce_70 = happySpecReduce_1  2# happyReduction_70
-happyReduction_70 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokId happy_var_1) -> 
-	happyIn8
-		 (TokId happy_var_1
-	)}
-
-happyReduce_71 = happySpecReduce_1  2# happyReduction_71
-happyReduction_71 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokQId happy_var_1) -> 
-	happyIn8
-		 (TokQId happy_var_1
-	)}
-
-happyReduce_72 = happySpecReduce_1  2# happyReduction_72
-happyReduction_72 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokString happy_var_1) -> 
-	happyIn8
-		 (TokString happy_var_1
-	)}
-
-happyReduce_73 = happySpecReduce_1  2# happyReduction_73
-happyReduction_73 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> 
-	happyIn8
-		 (TokLiteral happy_var_1
-	)}
-
-happyReduce_74 = happySpecReduce_0  3# happyReduction_74
-happyReduction_74  =  happyIn9
-		 (()
-	)
-
-happyReduce_75 = happySpecReduce_2  3# happyReduction_75
-happyReduction_75 happy_x_2
-	happy_x_1
-	 =  happyIn9
-		 (()
-	)
-
-happyReduce_76 = happySpecReduce_2  4# happyReduction_76
-happyReduction_76 happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	happyIn10
-		 (happy_var_1
-	)}
-
-happyReduce_77 = happySpecReduce_1  5# happyReduction_77
-happyReduction_77 happy_x_1
-	 =  case happyOut96 happy_x_1 of { happy_var_1 -> 
-	happyIn11
-		 (([], happy_var_1)
-	)}
-
-happyReduce_78 = happySpecReduce_3  5# happyReduction_78
-happyReduction_78 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut99 happy_x_2 of { happy_var_2 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn11
-		 (let (ps,m) = happy_var_3 in (happy_var_2 : ps, m)
-	)}}
-
-happyReduce_79 = happySpecReduce_1  6# happyReduction_79
-happyReduction_79 happy_x_1
-	 =  happyIn12
-		 (()
-	)
-
-happyReduce_80 = happyMonadReduce 1# 6# happyReduction_80
-happyReduction_80 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (( popContext)
-	) (\r -> happyReturn (happyIn12 r))
-
-happyReduce_81 = happySpecReduce_1  7# happyReduction_81
-happyReduction_81 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymSemi happy_var_1) -> 
-	happyIn13
-		 (happy_var_1
-	)}
-
-happyReduce_82 = happySpecReduce_2  7# happyReduction_82
-happyReduction_82 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_2 of { (TokSymbol SymVirtualSemi happy_var_2) -> 
-	happyIn13
-		 (happy_var_2
-	)}
-
-happyReduce_83 = happyMonadReduce 0# 8# happyReduction_83
-happyReduction_83 (happyRest) tk
-	 = happyThen (( pushLexState imp_dir)
-	) (\r -> happyReturn (happyIn14 r))
-
-happyReduce_84 = happyMonadReduce 1# 9# happyReduction_84
-happyReduction_84 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> 
-	( case happy_var_1 of {
-		     LitInt _ n	-> return $ fromIntegral n;
-		     _		-> fail $ "Expected integer"
-		   })}
-	) (\r -> happyReturn (happyIn15 r))
-
-happyReduce_85 = happyMonadReduce 1# 10# happyReduction_85
-happyReduction_85 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (TokId happy_var_1) -> 
-	( mkName happy_var_1)}
-	) (\r -> happyReturn (happyIn16 r))
-
-happyReduce_86 = happySpecReduce_2  11# happyReduction_86
-happyReduction_86 happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	case happyOut17 happy_x_2 of { happy_var_2 -> 
-	happyIn17
-		 (happy_var_1 : happy_var_2
-	)}}
-
-happyReduce_87 = happySpecReduce_1  11# happyReduction_87
-happyReduction_87 happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	happyIn17
-		 ([happy_var_1]
-	)}
-
-happyReduce_88 = happySpecReduce_2  12# happyReduction_88
-happyReduction_88 happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_2 of { happy_var_2 -> 
-	happyIn18
-		 (Arg NotHidden Irrelevant happy_var_2
-	)}
-
-happyReduce_89 = happySpecReduce_1  12# happyReduction_89
-happyReduction_89 happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	happyIn18
-		 (defaultArg happy_var_1
-	)}
-
-happyReduce_90 = happySpecReduce_2  13# happyReduction_90
-happyReduction_90 happy_x_2
-	happy_x_1
-	 =  case happyOut18 happy_x_1 of { happy_var_1 -> 
-	case happyOut19 happy_x_2 of { happy_var_2 -> 
-	happyIn19
-		 (happy_var_1 : happy_var_2
-	)}}
-
-happyReduce_91 = happySpecReduce_1  13# happyReduction_91
-happyReduction_91 happy_x_1
-	 =  case happyOut18 happy_x_1 of { happy_var_1 -> 
-	happyIn19
-		 ([happy_var_1]
-	)}
-
-happyReduce_92 = happySpecReduce_2  14# happyReduction_92
-happyReduction_92 happy_x_2
-	happy_x_1
-	 =  case happyOut18 happy_x_1 of { happy_var_1 -> 
-	case happyOut20 happy_x_2 of { happy_var_2 -> 
-	happyIn20
-		 (happy_var_1 : happy_var_2
-	)}}
-
-happyReduce_93 = happySpecReduce_1  14# happyReduction_93
-happyReduction_93 happy_x_1
-	 =  case happyOut18 happy_x_1 of { happy_var_1 -> 
-	happyIn20
-		 ([happy_var_1]
-	)}
-
-happyReduce_94 = happyReduce 4# 14# happyReduction_94
-happyReduction_94 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut19 happy_x_2 of { happy_var_2 -> 
-	case happyOut20 happy_x_4 of { happy_var_4 -> 
-	happyIn20
-		 (map hide happy_var_2 ++ happy_var_4
-	) `HappyStk` happyRest}}
-
-happyReduce_95 = happySpecReduce_3  14# happyReduction_95
-happyReduction_95 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut19 happy_x_2 of { happy_var_2 -> 
-	happyIn20
-		 (map hide happy_var_2
-	)}
-
-happyReduce_96 = happyReduce 5# 14# happyReduction_96
-happyReduction_96 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut17 happy_x_3 of { happy_var_3 -> 
-	case happyOut20 happy_x_5 of { happy_var_5 -> 
-	happyIn20
-		 (map (Arg Hidden Irrelevant) happy_var_3 ++ happy_var_5
-	) `HappyStk` happyRest}}
-
-happyReduce_97 = happyReduce 4# 14# happyReduction_97
-happyReduction_97 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut17 happy_x_3 of { happy_var_3 -> 
-	happyIn20
-		 (map (Arg Hidden Irrelevant) happy_var_3
-	) `HappyStk` happyRest}
-
-happyReduce_98 = happyMonadReduce 1# 15# happyReduction_98
-happyReduction_98 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (TokQId happy_var_1) -> 
-	( mkQName happy_var_1)}
-	) (\r -> happyReturn (happyIn21 r))
-
-happyReduce_99 = happySpecReduce_1  15# happyReduction_99
-happyReduction_99 happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	happyIn21
-		 (QName happy_var_1
-	)}
-
-happyReduce_100 = happySpecReduce_1  16# happyReduction_100
-happyReduction_100 happy_x_1
-	 =  case happyOut21 happy_x_1 of { happy_var_1 -> 
-	happyIn22
-		 (happy_var_1
-	)}
-
-happyReduce_101 = happySpecReduce_1  17# happyReduction_101
-happyReduction_101 happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	happyIn23
-		 (happy_var_1
-	)}
-
-happyReduce_102 = happySpecReduce_1  17# happyReduction_102
-happyReduction_102 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> 
-	happyIn23
-		 (Name (getRange happy_var_1) [Hole]
-	)}
-
-happyReduce_103 = happySpecReduce_2  18# happyReduction_103
-happyReduction_103 happy_x_2
-	happy_x_1
-	 =  case happyOut23 happy_x_1 of { happy_var_1 -> 
-	case happyOut24 happy_x_2 of { happy_var_2 -> 
-	happyIn24
-		 (happy_var_1 : happy_var_2
-	)}}
-
-happyReduce_104 = happySpecReduce_1  18# happyReduction_104
-happyReduction_104 happy_x_1
-	 =  case happyOut23 happy_x_1 of { happy_var_1 -> 
-	happyIn24
-		 ([happy_var_1]
-	)}
-
-happyReduce_105 = happyMonadReduce 1# 19# happyReduction_105
-happyReduction_105 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut31 happy_x_1 of { happy_var_1 -> 
-	(
-    let getName (Ident (QName x)) = Just x
-	getName (Underscore r _)  = Just (Name r [Hole])
-	getName _		  = Nothing
-    in
-    case partition isJust $ map getName happy_var_1 of
-	(good, []) -> return $ map fromJust good
-	_	   -> fail $ "expected sequence of bound identifiers")}
-	) (\r -> happyReturn (happyIn25 r))
-
-happyReduce_106 = happySpecReduce_0  20# happyReduction_106
-happyReduction_106  =  happyIn26
-		 ([]
-	)
-
-happyReduce_107 = happySpecReduce_2  20# happyReduction_107
-happyReduction_107 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokString happy_var_1) -> 
-	case happyOut26 happy_x_2 of { happy_var_2 -> 
-	happyIn26
-		 (snd happy_var_1 : happy_var_2
-	)}}
-
-happyReduce_108 = happyMonadReduce 1# 21# happyReduction_108
-happyReduction_108 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (TokString happy_var_1) -> 
-	( fmap QName (mkName happy_var_1))}
-	) (\r -> happyReturn (happyIn27 r))
-
-happyReduce_109 = happySpecReduce_2  22# happyReduction_109
-happyReduction_109 happy_x_2
-	happy_x_1
-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut28 happy_x_2 of { happy_var_2 -> 
-	happyIn28
-		 (Pi happy_var_1 happy_var_2
-	)}}
-
-happyReduce_110 = happySpecReduce_3  22# happyReduction_110
-happyReduction_110 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut48 happy_x_2 of { happy_var_2 -> 
-	case happyOut28 happy_x_3 of { happy_var_3 -> 
-	happyIn28
-		 (forallPi happy_var_2 happy_var_3
-	)}}
-
-happyReduce_111 = happySpecReduce_3  22# happyReduction_111
-happyReduction_111 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
-	case happyOut28 happy_x_3 of { happy_var_3 -> 
-	happyIn28
-		 (Fun (fuseRange happy_var_1 happy_var_3) (RawApp (getRange happy_var_1) happy_var_1) happy_var_3
-	)}}
-
-happyReduce_112 = happySpecReduce_1  22# happyReduction_112
-happyReduction_112 happy_x_1
-	 =  case happyOut29 happy_x_1 of { happy_var_1 -> 
-	happyIn28
-		 (happy_var_1
-	)}
-
-happyReduce_113 = happyMonadReduce 1# 23# happyReduction_113
-happyReduction_113 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut30 happy_x_1 of { happy_var_1 -> 
-	( case happy_var_1 of
-		      { [e]    -> return e
-		      ; e : es -> return $ WithApp (fuseRange e es) e es
-		      ; []     -> fail "impossible: empty with expressions"
-		      })}
-	) (\r -> happyReturn (happyIn29 r))
-
-happyReduce_114 = happySpecReduce_3  24# happyReduction_114
-happyReduction_114 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
-	case happyOut30 happy_x_3 of { happy_var_3 -> 
-	happyIn30
-		 (RawApp (getRange happy_var_1) happy_var_1 :  happy_var_3
-	)}}
-
-happyReduce_115 = happySpecReduce_1  24# happyReduction_115
-happyReduction_115 happy_x_1
-	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
-	happyIn30
-		 ([RawApp (getRange happy_var_1) happy_var_1]
-	)}
-
-happyReduce_116 = happySpecReduce_1  25# happyReduction_116
-happyReduction_116 happy_x_1
-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> 
-	happyIn31
-		 ([happy_var_1]
-	)}
-
-happyReduce_117 = happySpecReduce_2  25# happyReduction_117
-happyReduction_117 happy_x_2
-	happy_x_1
-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
-	case happyOut31 happy_x_2 of { happy_var_2 -> 
-	happyIn31
-		 (happy_var_1 : happy_var_2
-	)}}
-
-happyReduce_118 = happySpecReduce_3  26# happyReduction_118
-happyReduction_118 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> 
-	case happyOut45 happy_x_2 of { happy_var_2 -> 
-	case happyOut28 happy_x_3 of { happy_var_3 -> 
-	happyIn32
-		 (Lam (fuseRange happy_var_1 happy_var_3) happy_var_2 happy_var_3
-	)}}}
-
-happyReduce_119 = happySpecReduce_2  26# happyReduction_119
-happyReduction_119 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> 
-	case happyOut46 happy_x_2 of { happy_var_2 -> 
-	happyIn32
-		 (let (bs, h) = happy_var_2; r = fuseRange happy_var_1 bs in
-                                     if null bs then AbsurdLam r h else
-                                     Lam r bs (AbsurdLam r h)
-	)}}
-
-happyReduce_120 = happyReduce 4# 26# happyReduction_120
-happyReduction_120 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwLet happy_var_1) -> 
-	case happyOut118 happy_x_2 of { happy_var_2 -> 
-	case happyOut28 happy_x_4 of { happy_var_4 -> 
-	happyIn32
-		 (Let (fuseRange happy_var_1 happy_var_4) happy_var_2 happy_var_4
-	) `HappyStk` happyRest}}}
-
-happyReduce_121 = happySpecReduce_1  26# happyReduction_121
-happyReduction_121 happy_x_1
-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
-	happyIn32
-		 (happy_var_1
-	)}
-
-happyReduce_122 = happyReduce 4# 26# happyReduction_122
-happyReduction_122 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteGoal happy_var_1) -> 
-	case happyOut16 happy_x_2 of { happy_var_2 -> 
-	case happyOut28 happy_x_4 of { happy_var_4 -> 
-	happyIn32
-		 (QuoteGoal (getRange (happy_var_1,happy_var_4)) happy_var_2 happy_var_4
-	) `HappyStk` happyRest}}}
-
-happyReduce_123 = happySpecReduce_1  27# happyReduction_123
-happyReduction_123 happy_x_1
-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
-	happyIn33
-		 ([happy_var_1]
-	)}
-
-happyReduce_124 = happySpecReduce_2  27# happyReduction_124
-happyReduction_124 happy_x_2
-	happy_x_1
-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
-	case happyOut33 happy_x_2 of { happy_var_2 -> 
-	happyIn33
-		 (happy_var_1 : happy_var_2
-	)}}
-
-happyReduce_125 = happySpecReduce_1  28# happyReduction_125
-happyReduction_125 happy_x_1
-	 =  case happyOut21 happy_x_1 of { happy_var_1 -> 
-	happyIn34
-		 (Ident happy_var_1
-	)}
-
-happyReduce_126 = happySpecReduce_1  28# happyReduction_126
-happyReduction_126 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> 
-	happyIn34
-		 (Lit happy_var_1
-	)}
-
-happyReduce_127 = happySpecReduce_1  28# happyReduction_127
-happyReduction_127 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymQuestionMark happy_var_1) -> 
-	happyIn34
-		 (QuestionMark (getRange happy_var_1) Nothing
-	)}
-
-happyReduce_128 = happySpecReduce_1  28# happyReduction_128
-happyReduction_128 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> 
-	happyIn34
-		 (Underscore (getRange happy_var_1) Nothing
-	)}
-
-happyReduce_129 = happySpecReduce_1  28# happyReduction_129
-happyReduction_129 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwProp happy_var_1) -> 
-	happyIn34
-		 (Prop (getRange happy_var_1)
-	)}
-
-happyReduce_130 = happySpecReduce_1  28# happyReduction_130
-happyReduction_130 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwSet happy_var_1) -> 
-	happyIn34
-		 (Set (getRange happy_var_1)
-	)}
-
-happyReduce_131 = happySpecReduce_1  28# happyReduction_131
-happyReduction_131 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwQuote happy_var_1) -> 
-	happyIn34
-		 (Quote (getRange happy_var_1)
-	)}
-
-happyReduce_132 = happySpecReduce_1  28# happyReduction_132
-happyReduction_132 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSetN happy_var_1) -> 
-	happyIn34
-		 (SetN (getRange (fst happy_var_1)) (snd happy_var_1)
-	)}
-
-happyReduce_133 = happySpecReduce_3  28# happyReduction_133
-happyReduction_133 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> 
-	case happyOut28 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (TokSymbol SymCloseBrace happy_var_3) -> 
-	happyIn34
-		 (HiddenArg (fuseRange happy_var_1 happy_var_3) (unnamed happy_var_2)
-	)}}}
-
-happyReduce_134 = happyReduce 5# 28# happyReduction_134
-happyReduction_134 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> 
-	case happyOut16 happy_x_2 of { happy_var_2 -> 
-	case happyOut28 happy_x_4 of { happy_var_4 -> 
-	case happyOutTok happy_x_5 of { (TokSymbol SymCloseBrace happy_var_5) -> 
-	happyIn34
-		 (HiddenArg (fuseRange happy_var_1 happy_var_5) (named (show happy_var_2) happy_var_4)
-	) `HappyStk` happyRest}}}}
-
-happyReduce_135 = happySpecReduce_3  28# happyReduction_135
-happyReduction_135 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> 
-	case happyOut28 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (TokSymbol SymCloseParen happy_var_3) -> 
-	happyIn34
-		 (Paren (fuseRange happy_var_1 happy_var_3) happy_var_2
-	)}}}
-
-happyReduce_136 = happySpecReduce_2  28# happyReduction_136
-happyReduction_136 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> 
-	case happyOutTok happy_x_2 of { (TokSymbol SymCloseBrace happy_var_2) -> 
-	happyIn34
-		 (let r = fuseRange happy_var_1 happy_var_2 in HiddenArg r $ unnamed $ Absurd r
-	)}}
-
-happyReduce_137 = happySpecReduce_2  28# happyReduction_137
-happyReduction_137 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> 
-	case happyOutTok happy_x_2 of { (TokSymbol SymCloseParen happy_var_2) -> 
-	happyIn34
-		 (Absurd (fuseRange happy_var_1 happy_var_2)
-	)}}
-
-happyReduce_138 = happySpecReduce_3  28# happyReduction_138
-happyReduction_138 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	case happyOut34 happy_x_3 of { happy_var_3 -> 
-	happyIn34
-		 (As (fuseRange happy_var_1 happy_var_3) happy_var_1 happy_var_3
-	)}}
-
-happyReduce_139 = happySpecReduce_2  28# happyReduction_139
-happyReduction_139 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymDot happy_var_1) -> 
-	case happyOut34 happy_x_2 of { happy_var_2 -> 
-	happyIn34
-		 (Dot (fuseRange happy_var_1 happy_var_2) happy_var_2
-	)}}
-
-happyReduce_140 = happyReduce 4# 28# happyReduction_140
-happyReduction_140 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> 
-	case happyOut35 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> 
-	happyIn34
-		 (Rec (getRange (happy_var_1,happy_var_4)) happy_var_3
-	) `HappyStk` happyRest}}}
-
-happyReduce_141 = happySpecReduce_0  29# happyReduction_141
-happyReduction_141  =  happyIn35
-		 ([]
-	)
-
-happyReduce_142 = happySpecReduce_1  29# happyReduction_142
-happyReduction_142 happy_x_1
-	 =  case happyOut36 happy_x_1 of { happy_var_1 -> 
-	happyIn35
-		 (happy_var_1
-	)}
-
-happyReduce_143 = happySpecReduce_1  30# happyReduction_143
-happyReduction_143 happy_x_1
-	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
-	happyIn36
-		 ([happy_var_1]
-	)}
-
-happyReduce_144 = happySpecReduce_3  30# happyReduction_144
-happyReduction_144 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
-	case happyOut36 happy_x_3 of { happy_var_3 -> 
-	happyIn36
-		 (happy_var_1 : happy_var_3
-	)}}
-
-happyReduce_145 = happySpecReduce_3  31# happyReduction_145
-happyReduction_145 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	case happyOut28 happy_x_3 of { happy_var_3 -> 
-	happyIn37
-		 ((happy_var_1, happy_var_3)
-	)}}
-
-happyReduce_146 = happySpecReduce_2  32# happyReduction_146
-happyReduction_146 happy_x_2
-	happy_x_1
-	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
-	happyIn38
-		 (happy_var_1
-	)}
-
-happyReduce_147 = happySpecReduce_1  33# happyReduction_147
-happyReduction_147 happy_x_1
-	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
-	happyIn39
-		 ({-TeleBind-} happy_var_1
-	)}
-
-happyReduce_148 = happySpecReduce_2  34# happyReduction_148
-happyReduction_148 happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOut40 happy_x_2 of { happy_var_2 -> 
-	happyIn40
-		 (happy_var_1 : happy_var_2
-	)}}
-
-happyReduce_149 = happySpecReduce_1  34# happyReduction_149
-happyReduction_149 happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	happyIn40
-		 ([happy_var_1]
-	)}
-
-happyReduce_150 = happySpecReduce_3  35# happyReduction_150
-happyReduction_150 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> 
-	case happyOut42 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (TokSymbol SymCloseParen happy_var_3) -> 
-	happyIn41
-		 (TypedBindings (fuseRange happy_var_1 happy_var_3) (Arg NotHidden Relevant happy_var_2)
-	)}}}
-
-happyReduce_151 = happySpecReduce_3  35# happyReduction_151
-happyReduction_151 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> 
-	case happyOut42 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (TokSymbol SymCloseBrace happy_var_3) -> 
-	happyIn41
-		 (TypedBindings (fuseRange happy_var_1 happy_var_3) (Arg Hidden    Relevant happy_var_2)
-	)}}}
-
-happyReduce_152 = happySpecReduce_1  36# happyReduction_152
-happyReduction_152 happy_x_1
-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
-	happyIn42
-		 ([happy_var_1]
-	)}
-
-happyReduce_153 = happySpecReduce_3  36# happyReduction_153
-happyReduction_153 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
-	case happyOut43 happy_x_3 of { happy_var_3 -> 
-	happyIn42
-		 (happy_var_1 : happy_var_3
-	)}}
-
-happyReduce_154 = happySpecReduce_1  37# happyReduction_154
-happyReduction_154 happy_x_1
-	 =  case happyOut42 happy_x_1 of { happy_var_1 -> 
-	happyIn43
-		 (happy_var_1
-	)}
-
-happyReduce_155 = happySpecReduce_3  37# happyReduction_155
-happyReduction_155 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut28 happy_x_1 of { happy_var_1 -> 
-	case happyOut43 happy_x_3 of { happy_var_3 -> 
-	happyIn43
-		 (TNoBind happy_var_1 : happy_var_3
-	)}}
-
-happyReduce_156 = happySpecReduce_1  37# happyReduction_156
-happyReduction_156 happy_x_1
-	 =  case happyOut28 happy_x_1 of { happy_var_1 -> 
-	happyIn43
-		 ([TNoBind happy_var_1]
-	)}
-
-happyReduce_157 = happySpecReduce_3  38# happyReduction_157
-happyReduction_157 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut25 happy_x_1 of { happy_var_1 -> 
-	case happyOut28 happy_x_3 of { happy_var_3 -> 
-	happyIn44
-		 (TBind (fuseRange happy_var_1 happy_var_3) (map mkBoundName_ happy_var_1) happy_var_3
-	)}}
-
-happyReduce_158 = happyMonadReduce 2# 39# happyReduction_158
-happyReduction_158 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut47 happy_x_1 of { happy_var_1 -> 
-	(
-      case last happy_var_1 of
-        Left _  -> parseError "Absurd lambda cannot have a body."
-        _       -> return [ b | Right b <- happy_var_1 ])}
-	) (\r -> happyReturn (happyIn45 r))
-
-happyReduce_159 = happyMonadReduce 1# 40# happyReduction_159
-happyReduction_159 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut47 happy_x_1 of { happy_var_1 -> 
-	(
-    case last happy_var_1 of
-      Right _ -> parseError "Missing body for lambda"
-      Left h  -> return ([ b | Right b <- init happy_var_1], h))}
-	) (\r -> happyReturn (happyIn46 r))
-
-happyReduce_160 = happySpecReduce_2  41# happyReduction_160
-happyReduction_160 happy_x_2
-	happy_x_1
-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
-	case happyOut47 happy_x_2 of { happy_var_2 -> 
-	happyIn47
-		 (map Right happy_var_1 ++ happy_var_2
-	)}}
-
-happyReduce_161 = happySpecReduce_2  41# happyReduction_161
-happyReduction_161 happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOut47 happy_x_2 of { happy_var_2 -> 
-	happyIn47
-		 (Right (DomainFull happy_var_1) : happy_var_2
-	)}}
-
-happyReduce_162 = happySpecReduce_1  41# happyReduction_162
-happyReduction_162 happy_x_1
-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
-	happyIn47
-		 (map Right happy_var_1
-	)}
-
-happyReduce_163 = happySpecReduce_1  41# happyReduction_163
-happyReduction_163 happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	happyIn47
-		 ([Right $ DomainFull happy_var_1]
-	)}
-
-happyReduce_164 = happySpecReduce_2  41# happyReduction_164
-happyReduction_164 happy_x_2
-	happy_x_1
-	 =  happyIn47
-		 ([Left NotHidden]
-	)
-
-happyReduce_165 = happySpecReduce_2  41# happyReduction_165
-happyReduction_165 happy_x_2
-	happy_x_1
-	 =  happyIn47
-		 ([Left Hidden]
-	)
-
-happyReduce_166 = happySpecReduce_2  42# happyReduction_166
-happyReduction_166 happy_x_2
-	happy_x_1
-	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
-	happyIn48
-		 (happy_var_1
-	)}
-
-happyReduce_167 = happySpecReduce_2  43# happyReduction_167
-happyReduction_167 happy_x_2
-	happy_x_1
-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
-	case happyOut49 happy_x_2 of { happy_var_2 -> 
-	happyIn49
-		 (happy_var_1 ++ happy_var_2
-	)}}
-
-happyReduce_168 = happySpecReduce_2  43# happyReduction_168
-happyReduction_168 happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOut49 happy_x_2 of { happy_var_2 -> 
-	happyIn49
-		 (DomainFull happy_var_1 : happy_var_2
-	)}}
-
-happyReduce_169 = happySpecReduce_1  43# happyReduction_169
-happyReduction_169 happy_x_1
-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
-	happyIn49
-		 (happy_var_1
-	)}
-
-happyReduce_170 = happySpecReduce_1  43# happyReduction_170
-happyReduction_170 happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	happyIn49
-		 ([DomainFull happy_var_1]
-	)}
-
-happyReduce_171 = happySpecReduce_2  44# happyReduction_171
-happyReduction_171 happy_x_2
-	happy_x_1
-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
-	case happyOut50 happy_x_2 of { happy_var_2 -> 
-	happyIn50
-		 (happy_var_1 ++ happy_var_2
-	)}}
-
-happyReduce_172 = happySpecReduce_2  44# happyReduction_172
-happyReduction_172 happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOut50 happy_x_2 of { happy_var_2 -> 
-	happyIn50
-		 (DomainFull happy_var_1 : happy_var_2
-	)}}
-
-happyReduce_173 = happySpecReduce_0  44# happyReduction_173
-happyReduction_173  =  happyIn50
-		 ([]
-	)
-
-happyReduce_174 = happySpecReduce_1  45# happyReduction_174
-happyReduction_174 happy_x_1
-	 =  case happyOut23 happy_x_1 of { happy_var_1 -> 
-	happyIn51
-		 ([DomainFree NotHidden $ mkBoundName_ happy_var_1]
-	)}
-
-happyReduce_175 = happySpecReduce_3  45# happyReduction_175
-happyReduction_175 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut25 happy_x_2 of { happy_var_2 -> 
-	happyIn51
-		 (map (DomainFree Hidden . mkBoundName_) happy_var_2
-	)}
-
-happyReduce_176 = happySpecReduce_1  46# happyReduction_176
-happyReduction_176 happy_x_1
-	 =  case happyOut53 happy_x_1 of { happy_var_1 -> 
-	happyIn52
-		 ((Nothing, happy_var_1)
-	)}
-
-happyReduce_177 = happyMonadReduce 3# 46# happyReduction_177
-happyReduction_177 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (TokId happy_var_1) -> 
-	case happyOut16 happy_x_2 of { happy_var_2 -> 
-	case happyOut53 happy_x_3 of { happy_var_3 -> 
-	( isName "as" happy_var_1 >>
-                               return (Just (AsName happy_var_2 (getRange (fst happy_var_1))), happy_var_3))}}}
-	) (\r -> happyReturn (happyIn52 r))
-
-happyReduce_178 = happyMonadReduce 1# 47# happyReduction_178
-happyReduction_178 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut54 happy_x_1 of { happy_var_1 -> 
-	( verifyImportDirective happy_var_1)}
-	) (\r -> happyReturn (happyIn53 r))
-
-happyReduce_179 = happySpecReduce_2  48# happyReduction_179
-happyReduction_179 happy_x_2
-	happy_x_1
-	 =  case happyOut55 happy_x_2 of { happy_var_2 -> 
-	happyIn54
-		 (happy_var_2 { publicOpen = True }
-	)}
-
-happyReduce_180 = happySpecReduce_1  48# happyReduction_180
-happyReduction_180 happy_x_1
-	 =  case happyOut55 happy_x_1 of { happy_var_1 -> 
-	happyIn54
-		 (happy_var_1
-	)}
-
-happyReduce_181 = happySpecReduce_2  49# happyReduction_181
-happyReduction_181 happy_x_2
-	happy_x_1
-	 =  case happyOut56 happy_x_1 of { happy_var_1 -> 
-	case happyOut57 happy_x_2 of { happy_var_2 -> 
-	happyIn55
-		 (ImportDirective (fuseRange (snd happy_var_1) (snd happy_var_2)) (fst happy_var_1) (fst happy_var_2) False
-	)}}
-
-happyReduce_182 = happySpecReduce_1  49# happyReduction_182
-happyReduction_182 happy_x_1
-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
-	happyIn55
-		 (ImportDirective (getRange (snd happy_var_1)) (Hiding []) (fst happy_var_1) False
-	)}
-
-happyReduce_183 = happySpecReduce_1  49# happyReduction_183
-happyReduction_183 happy_x_1
-	 =  case happyOut56 happy_x_1 of { happy_var_1 -> 
-	happyIn55
-		 (ImportDirective (getRange (snd happy_var_1)) (fst happy_var_1) [] False
-	)}
-
-happyReduce_184 = happySpecReduce_0  49# happyReduction_184
-happyReduction_184  =  happyIn55
-		 (ImportDirective noRange (Hiding []) [] False
-	)
-
-happyReduce_185 = happyReduce 4# 50# happyReduction_185
-happyReduction_185 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwUsing happy_var_1) -> 
-	case happyOut62 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> 
-	happyIn56
-		 ((Using happy_var_3 , fuseRange happy_var_1 happy_var_4)
-	) `HappyStk` happyRest}}}
-
-happyReduce_186 = happyReduce 4# 50# happyReduction_186
-happyReduction_186 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwHiding happy_var_1) -> 
-	case happyOut63 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> 
-	happyIn56
-		 ((Hiding happy_var_3 , fuseRange happy_var_1 happy_var_4)
-	) `HappyStk` happyRest}}}
-
-happyReduce_187 = happyReduce 4# 51# happyReduction_187
-happyReduction_187 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwRenaming happy_var_1) -> 
-	case happyOut58 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> 
-	happyIn57
-		 ((happy_var_3 , fuseRange happy_var_1 happy_var_4)
-	) `HappyStk` happyRest}}}
-
-happyReduce_188 = happySpecReduce_3  52# happyReduction_188
-happyReduction_188 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut59 happy_x_1 of { happy_var_1 -> 
-	case happyOut58 happy_x_3 of { happy_var_3 -> 
-	happyIn58
-		 (happy_var_1 : happy_var_3
-	)}}
-
-happyReduce_189 = happySpecReduce_1  52# happyReduction_189
-happyReduction_189 happy_x_1
-	 =  case happyOut59 happy_x_1 of { happy_var_1 -> 
-	happyIn58
-		 ([happy_var_1]
-	)}
-
-happyReduce_190 = happySpecReduce_3  53# happyReduction_190
-happyReduction_190 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut60 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (TokKeyword KwTo happy_var_2) -> 
-	case happyOut16 happy_x_3 of { happy_var_3 -> 
-	happyIn59
-		 (Renaming happy_var_1 happy_var_3 (getRange happy_var_2)
-	)}}}
-
-happyReduce_191 = happySpecReduce_2  54# happyReduction_191
-happyReduction_191 happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_2 of { happy_var_2 -> 
-	happyIn60
-		 (ImportedName happy_var_2
-	)}
-
-happyReduce_192 = happySpecReduce_3  54# happyReduction_192
-happyReduction_192 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_3 of { happy_var_3 -> 
-	happyIn60
-		 (ImportedModule happy_var_3
-	)}
-
-happyReduce_193 = happySpecReduce_1  55# happyReduction_193
-happyReduction_193 happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	happyIn61
-		 (ImportedName happy_var_1
-	)}
-
-happyReduce_194 = happySpecReduce_2  55# happyReduction_194
-happyReduction_194 happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_2 of { happy_var_2 -> 
-	happyIn61
-		 (ImportedModule happy_var_2
-	)}
-
-happyReduce_195 = happySpecReduce_0  56# happyReduction_195
-happyReduction_195  =  happyIn62
-		 ([]
-	)
-
-happyReduce_196 = happySpecReduce_1  56# happyReduction_196
-happyReduction_196 happy_x_1
-	 =  case happyOut63 happy_x_1 of { happy_var_1 -> 
-	happyIn62
-		 (happy_var_1
-	)}
-
-happyReduce_197 = happySpecReduce_1  57# happyReduction_197
-happyReduction_197 happy_x_1
-	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
-	happyIn63
-		 ([happy_var_1]
-	)}
-
-happyReduce_198 = happySpecReduce_3  57# happyReduction_198
-happyReduction_198 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
-	case happyOut63 happy_x_3 of { happy_var_3 -> 
-	happyIn63
-		 (happy_var_1 : happy_var_3
-	)}}
-
-happyReduce_199 = happyMonadReduce 3# 58# happyReduction_199
-happyReduction_199 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut29 happy_x_1 of { happy_var_1 -> 
-	case happyOut67 happy_x_2 of { happy_var_2 -> 
-	case happyOut66 happy_x_3 of { happy_var_3 -> 
-	( exprToLHS happy_var_1 >>= \p -> return (p happy_var_2 happy_var_3))}}}
-	) (\r -> happyReturn (happyIn64 r))
-
-happyReduce_200 = happyReduce 4# 58# happyReduction_200
-happyReduction_200 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokSymbol SymEllipsis happy_var_1) -> 
-	case happyOut65 happy_x_2 of { happy_var_2 -> 
-	case happyOut67 happy_x_3 of { happy_var_3 -> 
-	case happyOut66 happy_x_4 of { happy_var_4 -> 
-	happyIn64
-		 (Ellipsis (fuseRange happy_var_1 happy_var_3) happy_var_2 happy_var_3 happy_var_4
-	) `HappyStk` happyRest}}}}
-
-happyReduce_201 = happySpecReduce_0  59# happyReduction_201
-happyReduction_201  =  happyIn65
-		 ([]
-	)
-
-happyReduce_202 = happyMonadReduce 3# 59# happyReduction_202
-happyReduction_202 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut33 happy_x_2 of { happy_var_2 -> 
-	case happyOut65 happy_x_3 of { happy_var_3 -> 
-	( exprToPattern (RawApp (getRange happy_var_2) happy_var_2) >>= \p ->
-		   return (p : happy_var_3))}}
-	) (\r -> happyReturn (happyIn65 r))
-
-happyReduce_203 = happySpecReduce_0  60# happyReduction_203
-happyReduction_203  =  happyIn66
-		 ([]
-	)
-
-happyReduce_204 = happySpecReduce_2  60# happyReduction_204
-happyReduction_204 happy_x_2
-	happy_x_1
-	 =  case happyOut28 happy_x_2 of { happy_var_2 -> 
-	happyIn66
-		 (case happy_var_2 of { WithApp _ e es -> e : es; e -> [e] }
-	)}
-
-happyReduce_205 = happySpecReduce_0  61# happyReduction_205
-happyReduction_205  =  happyIn67
-		 ([]
-	)
-
-happyReduce_206 = happySpecReduce_2  61# happyReduction_206
-happyReduction_206 happy_x_2
-	happy_x_1
-	 =  case happyOut28 happy_x_2 of { happy_var_2 -> 
-	happyIn67
-		 (case happy_var_2 of { WithApp _ e es -> e : es; e -> [e] }
-	)}
-
-happyReduce_207 = happySpecReduce_0  62# happyReduction_207
-happyReduction_207  =  happyIn68
-		 (NoWhere
-	)
-
-happyReduce_208 = happySpecReduce_2  62# happyReduction_208
-happyReduction_208 happy_x_2
-	happy_x_1
-	 =  case happyOut118 happy_x_2 of { happy_var_2 -> 
-	happyIn68
-		 (AnyWhere happy_var_2
-	)}
-
-happyReduce_209 = happyReduce 4# 62# happyReduction_209
-happyReduction_209 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut16 happy_x_2 of { happy_var_2 -> 
-	case happyOut118 happy_x_4 of { happy_var_4 -> 
-	happyIn68
-		 (SomeWhere happy_var_2 happy_var_4
-	) `HappyStk` happyRest}}
-
-happyReduce_210 = happySpecReduce_1  63# happyReduction_210
-happyReduction_210 happy_x_1
-	 =  case happyOut71 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_211 = happySpecReduce_1  63# happyReduction_211
-happyReduction_211 happy_x_1
-	 =  case happyOut80 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 (happy_var_1
-	)}
-
-happyReduce_212 = happySpecReduce_1  63# happyReduction_212
-happyReduction_212 happy_x_1
-	 =  case happyOut74 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_213 = happySpecReduce_1  63# happyReduction_213
-happyReduction_213 happy_x_1
-	 =  case happyOut76 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_214 = happySpecReduce_1  63# happyReduction_214
-happyReduction_214 happy_x_1
-	 =  case happyOut77 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_215 = happySpecReduce_1  63# happyReduction_215
-happyReduction_215 happy_x_1
-	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_216 = happySpecReduce_1  63# happyReduction_216
-happyReduction_216 happy_x_1
-	 =  case happyOut81 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_217 = happySpecReduce_1  63# happyReduction_217
-happyReduction_217 happy_x_1
-	 =  case happyOut82 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_218 = happySpecReduce_1  63# happyReduction_218
-happyReduction_218 happy_x_1
-	 =  case happyOut83 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_219 = happySpecReduce_1  63# happyReduction_219
-happyReduction_219 happy_x_1
-	 =  case happyOut84 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_220 = happySpecReduce_1  63# happyReduction_220
-happyReduction_220 happy_x_1
-	 =  case happyOut85 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_221 = happySpecReduce_1  63# happyReduction_221
-happyReduction_221 happy_x_1
-	 =  case happyOut91 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_222 = happySpecReduce_1  63# happyReduction_222
-happyReduction_222 happy_x_1
-	 =  case happyOut94 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_223 = happySpecReduce_1  63# happyReduction_223
-happyReduction_223 happy_x_1
-	 =  case happyOut93 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_224 = happySpecReduce_1  63# happyReduction_224
-happyReduction_224 happy_x_1
-	 =  case happyOut95 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_225 = happySpecReduce_1  63# happyReduction_225
-happyReduction_225 happy_x_1
-	 =  case happyOut98 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_226 = happySpecReduce_1  63# happyReduction_226
-happyReduction_226 happy_x_1
-	 =  case happyOut86 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_227 = happySpecReduce_3  64# happyReduction_227
-happyReduction_227 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut17 happy_x_1 of { happy_var_1 -> 
-	case happyOut28 happy_x_3 of { happy_var_3 -> 
-	happyIn70
-		 (map (flip (TypeSig Relevant) happy_var_3) happy_var_1
-	)}}
-
-happyReduce_228 = happyReduce 4# 65# happyReduction_228
-happyReduction_228 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut16 happy_x_2 of { happy_var_2 -> 
-	case happyOut28 happy_x_4 of { happy_var_4 -> 
-	happyIn71
-		 (TypeSig Irrelevant happy_var_2 happy_var_4
-	) `HappyStk` happyRest}}
-
-happyReduce_229 = happySpecReduce_3  65# happyReduction_229
-happyReduction_229 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	case happyOut28 happy_x_3 of { happy_var_3 -> 
-	happyIn71
-		 (TypeSig Relevant happy_var_1 happy_var_3
-	)}}
-
-happyReduce_230 = happySpecReduce_3  66# happyReduction_230
-happyReduction_230 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut19 happy_x_1 of { happy_var_1 -> 
-	case happyOut28 happy_x_3 of { happy_var_3 -> 
-	happyIn72
-		 (map (\ (Arg _ rel x) -> TypeSig rel x happy_var_3) happy_var_1
-	)}}
-
-happyReduce_231 = happySpecReduce_3  67# happyReduction_231
-happyReduction_231 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut20 happy_x_1 of { happy_var_1 -> 
-	case happyOut28 happy_x_3 of { happy_var_3 -> 
-	happyIn73
-		 (map (fmap (flip (TypeSig Relevant) happy_var_3)) happy_var_1
-	)}}
-
-happyReduce_232 = happySpecReduce_3  68# happyReduction_232
-happyReduction_232 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut64 happy_x_1 of { happy_var_1 -> 
-	case happyOut75 happy_x_2 of { happy_var_2 -> 
-	case happyOut68 happy_x_3 of { happy_var_3 -> 
-	happyIn74
-		 (FunClause happy_var_1 happy_var_2 happy_var_3
-	)}}}
-
-happyReduce_233 = happySpecReduce_2  69# happyReduction_233
-happyReduction_233 happy_x_2
-	happy_x_1
-	 =  case happyOut28 happy_x_2 of { happy_var_2 -> 
-	happyIn75
-		 (RHS happy_var_2
-	)}
-
-happyReduce_234 = happySpecReduce_0  69# happyReduction_234
-happyReduction_234  =  happyIn75
-		 (AbsurdRHS
-	)
-
-happyReduce_235 = happyReduce 7# 70# happyReduction_235
-happyReduction_235 (happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> 
-	case happyOut16 happy_x_2 of { happy_var_2 -> 
-	case happyOut50 happy_x_3 of { happy_var_3 -> 
-	case happyOut28 happy_x_5 of { happy_var_5 -> 
-	case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> 
-	case happyOut116 happy_x_7 of { happy_var_7 -> 
-	happyIn76
-		 (Data (getRange (happy_var_1, happy_var_6, happy_var_7)) Inductive happy_var_2 (map addType happy_var_3) happy_var_5 happy_var_7
-	) `HappyStk` happyRest}}}}}}
-
-happyReduce_236 = happyReduce 7# 70# happyReduction_236
-happyReduction_236 (happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwCoData happy_var_1) -> 
-	case happyOut16 happy_x_2 of { happy_var_2 -> 
-	case happyOut50 happy_x_3 of { happy_var_3 -> 
-	case happyOut28 happy_x_5 of { happy_var_5 -> 
-	case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> 
-	case happyOut116 happy_x_7 of { happy_var_7 -> 
-	happyIn76
-		 (Data (getRange (happy_var_1, happy_var_6, happy_var_7)) CoInductive happy_var_2 (map addType happy_var_3) happy_var_5 happy_var_7
-	) `HappyStk` happyRest}}}}}}
-
-happyReduce_237 = happyReduce 7# 71# happyReduction_237
-happyReduction_237 (happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> 
-	case happyOut16 happy_x_2 of { happy_var_2 -> 
-	case happyOut50 happy_x_3 of { happy_var_3 -> 
-	case happyOut28 happy_x_5 of { happy_var_5 -> 
-	case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> 
-	case happyOut117 happy_x_7 of { happy_var_7 -> 
-	happyIn77
-		 (Record (getRange (happy_var_1, happy_var_6, happy_var_7)) happy_var_2 (fst happy_var_7) (map addType happy_var_3) happy_var_5 (snd happy_var_7)
-	) `HappyStk` happyRest}}}}}}
-
-happyReduce_238 = happySpecReduce_2  72# happyReduction_238
-happyReduction_238 happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_2 of { happy_var_2 -> 
-	happyIn78
-		 (happy_var_2
-	)}
-
-happyReduce_239 = happySpecReduce_3  73# happyReduction_239
-happyReduction_239 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwInfix happy_var_1) -> 
-	case happyOut15 happy_x_2 of { happy_var_2 -> 
-	case happyOut24 happy_x_3 of { happy_var_3 -> 
-	happyIn79
-		 (Infix (NonAssoc (fuseRange happy_var_1 happy_var_3) happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_240 = happySpecReduce_3  73# happyReduction_240
-happyReduction_240 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwInfixL happy_var_1) -> 
-	case happyOut15 happy_x_2 of { happy_var_2 -> 
-	case happyOut24 happy_x_3 of { happy_var_3 -> 
-	happyIn79
-		 (Infix (LeftAssoc (fuseRange happy_var_1 happy_var_3) happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_241 = happySpecReduce_3  73# happyReduction_241
-happyReduction_241 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwInfixR happy_var_1) -> 
-	case happyOut15 happy_x_2 of { happy_var_2 -> 
-	case happyOut24 happy_x_3 of { happy_var_3 -> 
-	happyIn79
-		 (Infix (RightAssoc (fuseRange happy_var_1 happy_var_3) happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_242 = happySpecReduce_2  74# happyReduction_242
-happyReduction_242 happy_x_2
-	happy_x_1
-	 =  case happyOut114 happy_x_2 of { happy_var_2 -> 
-	happyIn80
-		 (let toField (Arg h rel (TypeSig _ x t)) = Field x (Arg h rel t) in map toField happy_var_2
-	)}
-
-happyReduce_243 = happySpecReduce_2  75# happyReduction_243
-happyReduction_243 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwMutual happy_var_1) -> 
-	case happyOut118 happy_x_2 of { happy_var_2 -> 
-	happyIn81
-		 (Mutual (fuseRange happy_var_1 happy_var_2) happy_var_2
-	)}}
-
-happyReduce_244 = happySpecReduce_2  76# happyReduction_244
-happyReduction_244 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwAbstract happy_var_1) -> 
-	case happyOut118 happy_x_2 of { happy_var_2 -> 
-	happyIn82
-		 (Abstract (fuseRange happy_var_1 happy_var_2) happy_var_2
-	)}}
-
-happyReduce_245 = happySpecReduce_2  77# happyReduction_245
-happyReduction_245 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwPrivate happy_var_1) -> 
-	case happyOut118 happy_x_2 of { happy_var_2 -> 
-	happyIn83
-		 (Private (fuseRange happy_var_1 happy_var_2) happy_var_2
-	)}}
-
-happyReduce_246 = happySpecReduce_2  78# happyReduction_246
-happyReduction_246 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwPostulate happy_var_1) -> 
-	case happyOut112 happy_x_2 of { happy_var_2 -> 
-	happyIn84
-		 (Postulate (fuseRange happy_var_1 happy_var_2) happy_var_2
-	)}}
-
-happyReduce_247 = happySpecReduce_2  79# happyReduction_247
-happyReduction_247 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwPrimitive happy_var_1) -> 
-	case happyOut110 happy_x_2 of { happy_var_2 -> 
-	happyIn85
-		 (Primitive (fuseRange happy_var_1 happy_var_2) happy_var_2
-	)}}
-
-happyReduce_248 = happyMonadReduce 5# 80# happyReduction_248
-happyReduction_248 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut16 happy_x_2 of { happy_var_2 -> 
-	case happyOut88 happy_x_3 of { happy_var_3 -> 
-	case happyOut87 happy_x_5 of { happy_var_5 -> 
-	(
-  case happy_var_2 of
-    Name _ [_] -> case mkNotation happy_var_3 happy_var_5 of
-      Left err -> parseError $ "malformed syntax declaration: " ++ err
-      Right n -> return $ Syntax happy_var_2 n
-    _ -> parseError "syntax declarations are allowed only for simple names (without holes)")}}}
-	) (\r -> happyReturn (happyIn86 r))
-
-happyReduce_249 = happySpecReduce_1  81# happyReduction_249
-happyReduction_249 happy_x_1
-	 =  case happyOut90 happy_x_1 of { happy_var_1 -> 
-	happyIn87
-		 ([happy_var_1]
-	)}
-
-happyReduce_250 = happySpecReduce_2  81# happyReduction_250
-happyReduction_250 happy_x_2
-	happy_x_1
-	 =  case happyOut87 happy_x_1 of { happy_var_1 -> 
-	case happyOut90 happy_x_2 of { happy_var_2 -> 
-	happyIn87
-		 (happy_var_1 ++ [happy_var_2]
-	)}}
-
-happyReduce_251 = happySpecReduce_1  82# happyReduction_251
-happyReduction_251 happy_x_1
-	 =  case happyOut89 happy_x_1 of { happy_var_1 -> 
-	happyIn88
-		 ([happy_var_1]
-	)}
-
-happyReduce_252 = happySpecReduce_2  82# happyReduction_252
-happyReduction_252 happy_x_2
-	happy_x_1
-	 =  case happyOut88 happy_x_1 of { happy_var_1 -> 
-	case happyOut89 happy_x_2 of { happy_var_2 -> 
-	happyIn88
-		 (happy_var_1 ++ [happy_var_2]
-	)}}
-
-happyReduce_253 = happySpecReduce_1  83# happyReduction_253
-happyReduction_253 happy_x_1
-	 =  case happyOut90 happy_x_1 of { happy_var_1 -> 
-	happyIn89
-		 (ExprHole happy_var_1
-	)}
-
-happyReduce_254 = happyReduce 6# 83# happyReduction_254
-happyReduction_254 (happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut90 happy_x_3 of { happy_var_3 -> 
-	case happyOut90 happy_x_5 of { happy_var_5 -> 
-	happyIn89
-		 (LambdaHole happy_var_3 happy_var_5
-	) `HappyStk` happyRest}}
-
-happyReduce_255 = happySpecReduce_1  84# happyReduction_255
-happyReduction_255 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokId happy_var_1) -> 
-	happyIn90
-		 (snd happy_var_1
-	)}
-
-happyReduce_256 = happyReduce 4# 85# happyReduction_256
-happyReduction_256 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> 
-	case happyOut22 happy_x_2 of { happy_var_2 -> 
-	case happyOut92 happy_x_3 of { happy_var_3 -> 
-	case happyOut53 happy_x_4 of { happy_var_4 -> 
-	happyIn91
-		 (let
-    { m   = happy_var_2
-    ; es  = happy_var_3
-    ; dir = happy_var_4
-    ; r   = getRange (happy_var_1, m, es, dir)
-    } in
-    case es of
-    { []  -> Open r m dir
-    ; _   -> Private r [ ModuleMacro r (noName $ beginningOf $ getRange happy_var_2) []
-                           (RawApp (fuseRange m es) (Ident m : es)) DoOpen dir
-                       ]
-    }
-	) `HappyStk` happyRest}}}}
-
-happyReduce_257 = happySpecReduce_0  86# happyReduction_257
-happyReduction_257  =  happyIn92
-		 ([]
-	)
-
-happyReduce_258 = happySpecReduce_2  86# happyReduction_258
-happyReduction_258 happy_x_2
-	happy_x_1
-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
-	case happyOut92 happy_x_2 of { happy_var_2 -> 
-	happyIn92
-		 (happy_var_1 : happy_var_2
-	)}}
-
-happyReduce_259 = happyReduce 6# 87# happyReduction_259
-happyReduction_259 (happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> 
-	case happyOut16 happy_x_2 of { happy_var_2 -> 
-	case happyOut50 happy_x_3 of { happy_var_3 -> 
-	case happyOut28 happy_x_5 of { happy_var_5 -> 
-	case happyOut53 happy_x_6 of { happy_var_6 -> 
-	happyIn93
-		 (ModuleMacro (getRange (happy_var_1, happy_var_5, happy_var_6)) happy_var_2 (map addType happy_var_3) happy_var_5 DontOpen happy_var_6
-	) `HappyStk` happyRest}}}}}
-
-happyReduce_260 = happyReduce 7# 87# happyReduction_260
-happyReduction_260 (happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> 
-	case happyOut16 happy_x_3 of { happy_var_3 -> 
-	case happyOut50 happy_x_4 of { happy_var_4 -> 
-	case happyOut28 happy_x_6 of { happy_var_6 -> 
-	case happyOut53 happy_x_7 of { happy_var_7 -> 
-	happyIn93
-		 (ModuleMacro (getRange (happy_var_1, happy_var_6, happy_var_7)) happy_var_3 (map addType happy_var_4) happy_var_6 DoOpen happy_var_7
-	) `HappyStk` happyRest}}}}}
-
-happyReduce_261 = happySpecReduce_3  88# happyReduction_261
-happyReduction_261 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokKeyword KwImport happy_var_1) -> 
-	case happyOut22 happy_x_2 of { happy_var_2 -> 
-	case happyOut52 happy_x_3 of { happy_var_3 -> 
-	happyIn94
-		 (Import (getRange (happy_var_1,happy_var_2,snd happy_var_3)) happy_var_2 (fst happy_var_3) DontOpen (snd happy_var_3)
-	)}}}
-
-happyReduce_262 = happyReduce 4# 88# happyReduction_262
-happyReduction_262 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> 
-	case happyOut22 happy_x_3 of { happy_var_3 -> 
-	case happyOut52 happy_x_4 of { happy_var_4 -> 
-	happyIn94
-		 (Import (getRange (happy_var_1,happy_var_3,snd happy_var_4)) happy_var_3 (fst happy_var_4) DoOpen (snd happy_var_4)
-	) `HappyStk` happyRest}}}
-
-happyReduce_263 = happyReduce 5# 89# happyReduction_263
-happyReduction_263 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> 
-	case happyOut16 happy_x_2 of { happy_var_2 -> 
-	case happyOut50 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> 
-	case happyOut119 happy_x_5 of { happy_var_5 -> 
-	happyIn95
-		 (Module (getRange (happy_var_1,happy_var_4,happy_var_5)) (QName happy_var_2) (map addType happy_var_3) happy_var_5
-	) `HappyStk` happyRest}}}}}
-
-happyReduce_264 = happySpecReduce_2  90# happyReduction_264
-happyReduction_264 happy_x_2
-	happy_x_1
-	 =  case happyOut97 happy_x_2 of { happy_var_2 -> 
-	happyIn96
-		 ([happy_var_2]
-	)}
-
-happyReduce_265 = happySpecReduce_3  90# happyReduction_265
-happyReduction_265 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut94 happy_x_2 of { happy_var_2 -> 
-	case happyOut96 happy_x_3 of { happy_var_3 -> 
-	happyIn96
-		 (happy_var_2 : happy_var_3
-	)}}
-
-happyReduce_266 = happySpecReduce_3  90# happyReduction_266
-happyReduction_266 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut91 happy_x_2 of { happy_var_2 -> 
-	case happyOut96 happy_x_3 of { happy_var_3 -> 
-	happyIn96
-		 (happy_var_2 : happy_var_3
-	)}}
-
-happyReduce_267 = happyReduce 5# 91# happyReduction_267
-happyReduction_267 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> 
-	case happyOut22 happy_x_2 of { happy_var_2 -> 
-	case happyOut50 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> 
-	case happyOut119 happy_x_5 of { happy_var_5 -> 
-	happyIn97
-		 (Module (getRange (happy_var_1,happy_var_4,happy_var_5)) happy_var_2 (map addType happy_var_3) happy_var_5
-	) `HappyStk` happyRest}}}}}
-
-happyReduce_268 = happySpecReduce_1  92# happyReduction_268
-happyReduction_268 happy_x_1
-	 =  case happyOut100 happy_x_1 of { happy_var_1 -> 
-	happyIn98
-		 (Pragma happy_var_1
-	)}
-
-happyReduce_269 = happySpecReduce_1  93# happyReduction_269
-happyReduction_269 happy_x_1
-	 =  case happyOut101 happy_x_1 of { happy_var_1 -> 
-	happyIn99
-		 (happy_var_1
-	)}
-
-happyReduce_270 = happySpecReduce_1  94# happyReduction_270
-happyReduction_270 happy_x_1
-	 =  case happyOut102 happy_x_1 of { happy_var_1 -> 
-	happyIn100
-		 (happy_var_1
-	)}
-
-happyReduce_271 = happySpecReduce_1  94# happyReduction_271
-happyReduction_271 happy_x_1
-	 =  case happyOut103 happy_x_1 of { happy_var_1 -> 
-	happyIn100
-		 (happy_var_1
-	)}
-
-happyReduce_272 = happySpecReduce_1  94# happyReduction_272
-happyReduction_272 happy_x_1
-	 =  case happyOut105 happy_x_1 of { happy_var_1 -> 
-	happyIn100
-		 (happy_var_1
-	)}
-
-happyReduce_273 = happySpecReduce_1  94# happyReduction_273
-happyReduction_273 happy_x_1
-	 =  case happyOut104 happy_x_1 of { happy_var_1 -> 
-	happyIn100
-		 (happy_var_1
-	)}
-
-happyReduce_274 = happySpecReduce_1  94# happyReduction_274
-happyReduction_274 happy_x_1
-	 =  case happyOut106 happy_x_1 of { happy_var_1 -> 
-	happyIn100
-		 (happy_var_1
-	)}
-
-happyReduce_275 = happySpecReduce_1  94# happyReduction_275
-happyReduction_275 happy_x_1
-	 =  case happyOut108 happy_x_1 of { happy_var_1 -> 
-	happyIn100
-		 (happy_var_1
-	)}
-
-happyReduce_276 = happySpecReduce_1  94# happyReduction_276
-happyReduction_276 happy_x_1
-	 =  case happyOut109 happy_x_1 of { happy_var_1 -> 
-	happyIn100
-		 (happy_var_1
-	)}
-
-happyReduce_277 = happySpecReduce_1  94# happyReduction_277
-happyReduction_277 happy_x_1
-	 =  case happyOut107 happy_x_1 of { happy_var_1 -> 
-	happyIn100
-		 (happy_var_1
-	)}
-
-happyReduce_278 = happyReduce 4# 95# happyReduction_278
-happyReduction_278 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
-	case happyOut26 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> 
-	happyIn101
-		 (OptionsPragma (fuseRange happy_var_1 happy_var_4) happy_var_3
-	) `HappyStk` happyRest}}}
-
-happyReduce_279 = happyReduce 5# 96# happyReduction_279
-happyReduction_279 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
-	case happyOutTok happy_x_3 of { (TokString happy_var_3) -> 
-	case happyOut27 happy_x_4 of { happy_var_4 -> 
-	case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> 
-	happyIn102
-		 (BuiltinPragma (fuseRange happy_var_1 happy_var_5) (snd happy_var_3) (Ident happy_var_4)
-	) `HappyStk` happyRest}}}}
-
-happyReduce_280 = happyReduce 5# 97# happyReduction_280
-happyReduction_280 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
-	case happyOut27 happy_x_3 of { happy_var_3 -> 
-	case happyOut26 happy_x_4 of { happy_var_4 -> 
-	case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> 
-	happyIn103
-		 (CompiledPragma (fuseRange happy_var_1 happy_var_5) happy_var_3 (unwords happy_var_4)
-	) `HappyStk` happyRest}}}}
-
-happyReduce_281 = happyReduce 5# 98# happyReduction_281
-happyReduction_281 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
-	case happyOut27 happy_x_3 of { happy_var_3 -> 
-	case happyOut26 happy_x_4 of { happy_var_4 -> 
-	case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> 
-	happyIn104
-		 (CompiledTypePragma (fuseRange happy_var_1 happy_var_5) happy_var_3 (unwords happy_var_4)
-	) `HappyStk` happyRest}}}}
-
-happyReduce_282 = happyReduce 6# 99# happyReduction_282
-happyReduction_282 (happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
-	case happyOut27 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { (TokString happy_var_4) -> 
-	case happyOut26 happy_x_5 of { happy_var_5 -> 
-	case happyOutTok happy_x_6 of { (TokSymbol SymClosePragma happy_var_6) -> 
-	happyIn105
-		 (CompiledDataPragma (fuseRange happy_var_1 happy_var_6) happy_var_3 (snd happy_var_4) happy_var_5
-	) `HappyStk` happyRest}}}}}
-
-happyReduce_283 = happyReduce 5# 100# happyReduction_283
-happyReduction_283 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
-	case happyOut27 happy_x_3 of { happy_var_3 -> 
-	case happyOut26 happy_x_4 of { happy_var_4 -> 
-	case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> 
-	happyIn106
-		 (CompiledEpicPragma (fuseRange happy_var_1 happy_var_5) happy_var_3 (unwords happy_var_4)
-	) `HappyStk` happyRest}}}}
-
-happyReduce_284 = happyReduce 4# 101# happyReduction_284
-happyReduction_284 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
-	case happyOut27 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> 
-	happyIn107
-		 (EtaPragma (fuseRange happy_var_1 happy_var_4) happy_var_3
-	) `HappyStk` happyRest}}}
-
-happyReduce_285 = happyMonadReduce 4# 102# happyReduction_285
-happyReduction_285 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
-	case happyOutTok happy_x_3 of { (TokString happy_var_3) -> 
-	case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> 
-	( let s = snd happy_var_3 in
-       if validHaskellModuleName s
-       then return $ ImportPragma (fuseRange happy_var_1 happy_var_4) s
-       else parseError $ "Malformed module name: " ++ s ++ ".")}}}
-	) (\r -> happyReturn (happyIn108 r))
-
-happyReduce_286 = happySpecReduce_3  103# happyReduction_286
-happyReduction_286 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
-	case happyOutTok happy_x_3 of { (TokSymbol SymClosePragma happy_var_3) -> 
-	happyIn109
-		 (ImpossiblePragma (fuseRange happy_var_1 happy_var_3)
-	)}}
-
-happyReduce_287 = happyReduce 5# 104# happyReduction_287
-happyReduction_287 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut111 happy_x_3 of { happy_var_3 -> 
-	happyIn110
-		 (reverse happy_var_3
-	) `HappyStk` happyRest}
-
-happyReduce_288 = happyReduce 4# 105# happyReduction_288
-happyReduction_288 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut111 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_4 of { happy_var_4 -> 
-	happyIn111
-		 (reverse happy_var_4 ++ happy_var_1
-	) `HappyStk` happyRest}}
-
-happyReduce_289 = happySpecReduce_2  105# happyReduction_289
-happyReduction_289 happy_x_2
-	happy_x_1
-	 =  case happyOut70 happy_x_2 of { happy_var_2 -> 
-	happyIn111
-		 (reverse happy_var_2
-	)}
-
-happyReduce_290 = happyReduce 5# 106# happyReduction_290
-happyReduction_290 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut113 happy_x_3 of { happy_var_3 -> 
-	happyIn112
-		 (reverse happy_var_3
-	) `HappyStk` happyRest}
-
-happyReduce_291 = happyReduce 4# 107# happyReduction_291
-happyReduction_291 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut113 happy_x_1 of { happy_var_1 -> 
-	case happyOut72 happy_x_4 of { happy_var_4 -> 
-	happyIn113
-		 (reverse happy_var_4 ++ happy_var_1
-	) `HappyStk` happyRest}}
-
-happyReduce_292 = happySpecReduce_2  107# happyReduction_292
-happyReduction_292 happy_x_2
-	happy_x_1
-	 =  case happyOut72 happy_x_2 of { happy_var_2 -> 
-	happyIn113
-		 (reverse happy_var_2
-	)}
-
-happyReduce_293 = happyReduce 5# 108# happyReduction_293
-happyReduction_293 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut115 happy_x_3 of { happy_var_3 -> 
-	happyIn114
-		 (reverse happy_var_3
-	) `HappyStk` happyRest}
-
-happyReduce_294 = happyReduce 4# 109# happyReduction_294
-happyReduction_294 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut115 happy_x_1 of { happy_var_1 -> 
-	case happyOut73 happy_x_4 of { happy_var_4 -> 
-	happyIn115
-		 (reverse happy_var_4 ++ happy_var_1
-	) `HappyStk` happyRest}}
-
-happyReduce_295 = happySpecReduce_2  109# happyReduction_295
-happyReduction_295 happy_x_2
-	happy_x_1
-	 =  case happyOut73 happy_x_2 of { happy_var_2 -> 
-	happyIn115
-		 (reverse happy_var_2
-	)}
-
-happyReduce_296 = happyReduce 4# 110# happyReduction_296
-happyReduction_296 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = happyIn116
-		 ([]
-	) `HappyStk` happyRest
-
-happyReduce_297 = happySpecReduce_1  110# happyReduction_297
-happyReduction_297 happy_x_1
-	 =  case happyOut110 happy_x_1 of { happy_var_1 -> 
-	happyIn116
-		 (happy_var_1
-	)}
-
-happyReduce_298 = happyReduce 4# 111# happyReduction_298
-happyReduction_298 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = happyIn117
-		 ((Nothing, [])
-	) `HappyStk` happyRest
-
-happyReduce_299 = happyReduce 6# 111# happyReduction_299
-happyReduction_299 (happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut78 happy_x_4 of { happy_var_4 -> 
-	happyIn117
-		 ((Just happy_var_4, [])
-	) `HappyStk` happyRest}
-
-happyReduce_300 = happyReduce 8# 111# happyReduction_300
-happyReduction_300 (happy_x_8 `HappyStk`
-	happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut78 happy_x_4 of { happy_var_4 -> 
-	case happyOut120 happy_x_6 of { happy_var_6 -> 
-	happyIn117
-		 ((Just happy_var_4, reverse happy_var_6)
-	) `HappyStk` happyRest}}
-
-happyReduce_301 = happyReduce 5# 111# happyReduction_301
-happyReduction_301 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut120 happy_x_3 of { happy_var_3 -> 
-	happyIn117
-		 ((Nothing, reverse happy_var_3)
-	) `HappyStk` happyRest}
-
-happyReduce_302 = happyReduce 5# 112# happyReduction_302
-happyReduction_302 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut120 happy_x_3 of { happy_var_3 -> 
-	happyIn118
-		 (reverse happy_var_3
-	) `HappyStk` happyRest}
-
-happyReduce_303 = happyReduce 4# 113# happyReduction_303
-happyReduction_303 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = happyIn119
-		 ([]
-	) `HappyStk` happyRest
-
-happyReduce_304 = happySpecReduce_1  113# happyReduction_304
-happyReduction_304 happy_x_1
-	 =  case happyOut118 happy_x_1 of { happy_var_1 -> 
-	happyIn119
-		 (happy_var_1
-	)}
-
-happyReduce_305 = happyReduce 4# 114# happyReduction_305
-happyReduction_305 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut120 happy_x_1 of { happy_var_1 -> 
-	case happyOut69 happy_x_4 of { happy_var_4 -> 
-	happyIn120
-		 (reverse happy_var_4 ++ happy_var_1
-	) `HappyStk` happyRest}}
-
-happyReduce_306 = happySpecReduce_2  114# happyReduction_306
-happyReduction_306 happy_x_2
-	happy_x_1
-	 =  case happyOut69 happy_x_2 of { happy_var_2 -> 
-	happyIn120
-		 (reverse happy_var_2
-	)}
-
-happyNewToken action sts stk
-	= lexer(\tk -> 
-	let cont i = happyDoAction i tk action sts stk in
-	case tk of {
-	TokEOF -> happyDoAction 69# tk action sts stk;
-	TokKeyword KwLet happy_dollar_dollar -> cont 1#;
-	TokKeyword KwIn happy_dollar_dollar -> cont 2#;
-	TokKeyword KwWhere happy_dollar_dollar -> cont 3#;
-	TokKeyword KwWith happy_dollar_dollar -> cont 4#;
-	TokKeyword KwRewrite happy_dollar_dollar -> cont 5#;
-	TokKeyword KwPostulate happy_dollar_dollar -> cont 6#;
-	TokKeyword KwPrimitive happy_dollar_dollar -> cont 7#;
-	TokKeyword KwOpen happy_dollar_dollar -> cont 8#;
-	TokKeyword KwImport happy_dollar_dollar -> cont 9#;
-	TokKeyword KwUsing happy_dollar_dollar -> cont 10#;
-	TokKeyword KwHiding happy_dollar_dollar -> cont 11#;
-	TokKeyword KwRenaming happy_dollar_dollar -> cont 12#;
-	TokKeyword KwTo happy_dollar_dollar -> cont 13#;
-	TokKeyword KwPublic happy_dollar_dollar -> cont 14#;
-	TokKeyword KwModule happy_dollar_dollar -> cont 15#;
-	TokKeyword KwData happy_dollar_dollar -> cont 16#;
-	TokKeyword KwCoData happy_dollar_dollar -> cont 17#;
-	TokKeyword KwRecord happy_dollar_dollar -> cont 18#;
-	TokKeyword KwConstructor happy_dollar_dollar -> cont 19#;
-	TokKeyword KwField happy_dollar_dollar -> cont 20#;
-	TokKeyword KwInfix happy_dollar_dollar -> cont 21#;
-	TokKeyword KwInfixL happy_dollar_dollar -> cont 22#;
-	TokKeyword KwInfixR happy_dollar_dollar -> cont 23#;
-	TokKeyword KwMutual happy_dollar_dollar -> cont 24#;
-	TokKeyword KwAbstract happy_dollar_dollar -> cont 25#;
-	TokKeyword KwPrivate happy_dollar_dollar -> cont 26#;
-	TokKeyword KwProp happy_dollar_dollar -> cont 27#;
-	TokKeyword KwSet happy_dollar_dollar -> cont 28#;
-	TokKeyword KwForall happy_dollar_dollar -> cont 29#;
-	TokKeyword KwSyntax happy_dollar_dollar -> cont 30#;
-	TokKeyword KwOPTIONS happy_dollar_dollar -> cont 31#;
-	TokKeyword KwBUILTIN happy_dollar_dollar -> cont 32#;
-	TokKeyword KwIMPORT happy_dollar_dollar -> cont 33#;
-	TokKeyword KwIMPOSSIBLE happy_dollar_dollar -> cont 34#;
-	TokKeyword KwETA happy_dollar_dollar -> cont 35#;
-	TokKeyword KwCOMPILED happy_dollar_dollar -> cont 36#;
-	TokKeyword KwCOMPILED_DATA happy_dollar_dollar -> cont 37#;
-	TokKeyword KwCOMPILED_TYPE happy_dollar_dollar -> cont 38#;
-	TokKeyword KwCOMPILED_EPIC happy_dollar_dollar -> cont 39#;
-	TokKeyword KwQuoteGoal happy_dollar_dollar -> cont 40#;
-	TokKeyword KwQuote happy_dollar_dollar -> cont 41#;
-	TokSetN happy_dollar_dollar -> cont 42#;
-	TokTeX happy_dollar_dollar -> cont 43#;
-	TokComment happy_dollar_dollar -> cont 44#;
-	TokSymbol SymEllipsis happy_dollar_dollar -> cont 45#;
-	TokSymbol SymDot happy_dollar_dollar -> cont 46#;
-	TokSymbol SymSemi happy_dollar_dollar -> cont 47#;
-	TokSymbol SymColon happy_dollar_dollar -> cont 48#;
-	TokSymbol SymEqual happy_dollar_dollar -> cont 49#;
-	TokSymbol SymUnderscore happy_dollar_dollar -> cont 50#;
-	TokSymbol SymQuestionMark happy_dollar_dollar -> cont 51#;
-	TokSymbol SymArrow happy_dollar_dollar -> cont 52#;
-	TokSymbol SymLambda happy_dollar_dollar -> cont 53#;
-	TokSymbol SymAs happy_dollar_dollar -> cont 54#;
-	TokSymbol SymBar happy_dollar_dollar -> cont 55#;
-	TokSymbol SymOpenParen happy_dollar_dollar -> cont 56#;
-	TokSymbol SymCloseParen happy_dollar_dollar -> cont 57#;
-	TokSymbol SymOpenBrace happy_dollar_dollar -> cont 58#;
-	TokSymbol SymCloseBrace happy_dollar_dollar -> cont 59#;
-	TokSymbol SymOpenVirtualBrace happy_dollar_dollar -> cont 60#;
-	TokSymbol SymCloseVirtualBrace happy_dollar_dollar -> cont 61#;
-	TokSymbol SymVirtualSemi happy_dollar_dollar -> cont 62#;
-	TokSymbol SymOpenPragma happy_dollar_dollar -> cont 63#;
-	TokSymbol SymClosePragma happy_dollar_dollar -> cont 64#;
-	TokId happy_dollar_dollar -> cont 65#;
-	TokQId happy_dollar_dollar -> cont 66#;
-	TokString happy_dollar_dollar -> cont 67#;
-	TokLiteral happy_dollar_dollar -> cont 68#;
-	_ -> happyError' tk
-	})
-
-happyError_ tk = happyError' tk
-
-happyThen :: () => Parser a -> (a -> Parser b) -> Parser b
-happyThen = (>>=)
-happyReturn :: () => a -> Parser a
-happyReturn = (return)
-happyThen1 = happyThen
-happyReturn1 :: () => a -> Parser a
-happyReturn1 = happyReturn
-happyError' :: () => (Token) -> Parser a
-happyError' tk = (\token -> happyError) tk
-
-tokensParser = happySomeParser where
-  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut6 x))
-
-exprParser = happySomeParser where
-  happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut28 x))
-
-moduleParser = happySomeParser where
-  happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut10 x))
-
-happySeq = happyDontSeq
-
-
-{--------------------------------------------------------------------------
-    Parsers
- --------------------------------------------------------------------------}
-
--- | Parse the token stream. Used by the TeX compiler.
-tokensParser :: Parser [Token]
-
--- | Parse an expression. Could be used in interactions.
-exprParser :: Parser Expr
-
--- | Parse a module.
-moduleParser :: Parser Module
-
-
-{--------------------------------------------------------------------------
-    Happy stuff
- --------------------------------------------------------------------------}
-
--- | Required by Happy.
-happyError :: Parser a
-happyError = parseError "Parse error"
-
-
-{--------------------------------------------------------------------------
-    Utility functions
- --------------------------------------------------------------------------}
-
--- | Create a name from a string.
-
-mkName :: (Interval, String) -> Parser Name
-mkName (i, s) = do
-    let xs = parts s
-    mapM_ isValidId xs
-    unless (alternating xs) $ fail $ "a name cannot contain two consecutive underscores"
-    return $ Name (getRange i) xs
-    where
-        parts :: String -> [NamePart]
-        parts ""        = []
-        parts ('_' : s) = Hole : parts s
-        parts s         = Id x : parts s'
-          where (x, s') = break (== '_') s
-
-	isValidId Hole   = return ()
-	isValidId (Id x) = case parse defaultParseFlags [0] (lexer return) x of
-	    ParseOk _ (TokId _) -> return ()
-	    _			-> fail $ "in the name " ++ s ++ ", the part " ++ x ++ " is not valid"
-
-	-- we know that there are no two Ids in a row
-	alternating (Hole : Hole : _) = False
-	alternating (_ : xs)	      = alternating xs
-	alternating []		      = True
-
--- | Create a qualified name from a list of strings
-mkQName :: [(Interval, String)] -> Parser QName
-mkQName ss = do
-    xs <- mapM mkName ss
-    return $ foldr Qual (QName $ last xs) (init xs)
-
--- | Match a particular name.
-isName :: String -> (Interval, String) -> Parser ()
-isName s (_,s')
-    | s == s'	= return ()
-    | otherwise	= fail $ "expected " ++ s ++ ", found " ++ s'
-
--- | Build a forall pi (forall x y z -> ...)
-forallPi :: [LamBinding] -> Expr -> Expr
-forallPi bs e = Pi (map addType bs) e
-
--- | Converts lambda bindings to typed bindings.
-addType :: LamBinding -> TypedBindings
-addType (DomainFull b)	 = b
-addType (DomainFree h x) = TypedBindings r $ Arg h Relevant [TBind r [x] $ Underscore r Nothing]
-  where r = getRange x
-
--- | Check that an import directive doesn't contain repeated names
-verifyImportDirective :: ImportDirective -> Parser ImportDirective
-verifyImportDirective i =
-    case filter ((>1) . length)
-	 $ group
-	 $ sort xs
-    of
-	[]  -> return i
-	yss -> let Just pos = rStart $ getRange $ head $ concat yss in
-               parseErrorAt pos $
-		"repeated name" ++ s ++ " in import directive: " ++
-		concat (intersperse ", " $ map (show . head) yss)
-	    where
-		s = case yss of
-			[_] -> ""
-			_   -> "s"
-    where
-	xs = names (usingOrHiding i) ++ map renFrom (renaming i)
-	names (Using xs)    = xs
-	names (Hiding xs)   = xs
-
--- | Breaks up a string into substrings. Returns every maximal
--- subsequence of zero or more characters distinct from @'.'@.
---
--- > splitOnDots ""         == [""]
--- > splitOnDots "foo.bar"  == ["foo", "bar"]
--- > splitOnDots ".foo.bar" == ["", "foo", "bar"]
--- > splitOnDots "foo.bar." == ["foo", "bar", ""]
--- > splitOnDots "foo..bar" == ["foo", "", "bar"]
-splitOnDots :: String -> [String]
-splitOnDots ""        = [""]
-splitOnDots ('.' : s) = [] : splitOnDots s
-splitOnDots (c   : s) = case splitOnDots s of
-  p : ps -> (c : p) : ps
-
-prop_splitOnDots = and
-  [ splitOnDots ""         == [""]
-  , splitOnDots "foo.bar"  == ["foo", "bar"]
-  , splitOnDots ".foo.bar" == ["", "foo", "bar"]
-  , splitOnDots "foo.bar." == ["foo", "bar", ""]
-  , splitOnDots "foo..bar" == ["foo", "", "bar"]
-  ]
-
--- | Returns 'True' iff the name is a valid Haskell (hierarchical)
--- module name.
-validHaskellModuleName :: String -> Bool
-validHaskellModuleName = all ok . splitOnDots
-  where
-  -- Checks if a dot-less module name is well-formed.
-  ok :: String -> Bool
-  ok []      = False
-  ok (c : s) =
-    isUpper c &&
-    all (\c -> isLower c || c == '_' ||
-               isUpper c ||
-               generalCategory c == DecimalNumber ||
-               c == '\'')
-        s
-
-{--------------------------------------------------------------------------
-    Patterns
- --------------------------------------------------------------------------}
-
--- | Turn an expression into a left hand side.
-exprToLHS :: Expr -> Parser ([Expr] -> [Expr] -> LHS)
-exprToLHS e = case e of
-  WithApp r e es -> LHS <$> exprToPattern e <*> mapM exprToPattern es
-  _		 -> LHS <$> exprToPattern e <*> return []
-
--- | Turn an expression into a pattern. Fails if the expression is not a
---   valid pattern.
-exprToPattern :: Expr -> Parser Pattern
-exprToPattern e =
-    case e of
-	Ident x			-> return $ IdentP x
-	App _ e1 e2		-> AppP <$> exprToPattern e1
-					<*> T.mapM (T.mapM exprToPattern) e2
-	Paren r e		-> ParenP r
-					<$> exprToPattern e
-	Underscore r _		-> return $ WildP r
-	Absurd r		-> return $ AbsurdP r
-	As r x e		-> AsP r x <$> exprToPattern e
-	Dot r (HiddenArg _ e)	-> return $ HiddenP r $ fmap (DotP r) e
-	Dot r e			-> return $ DotP r e
-	Lit l			-> return $ LitP l
-	HiddenArg r e		-> HiddenP r <$> T.mapM exprToPattern e
-	RawApp r es		-> RawAppP r <$> mapM exprToPattern es
-	OpApp r x es		-> OpAppP r x <$> mapM exprToPattern es
-	_			->
-          let Just pos = rStart $ getRange e in
-          parseErrorAt pos $ "Not a valid pattern: " ++ show e
-
-{--------------------------------------------------------------------------
-    Tests
- --------------------------------------------------------------------------}
-
--- | Test suite.
-tests :: IO Bool
-tests = runTests "Agda.Syntax.Parser.Parser"
-  [ quickCheck' prop_splitOnDots
-  ]
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "<built-in>" #-}
-{-# LINE 1 "<command-line>" #-}
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp 
-
-{-# LINE 30 "templates/GenericTemplate.hs" #-}
-
-
-data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList
-
-
-
-
-
-{-# LINE 51 "templates/GenericTemplate.hs" #-}
-
-{-# LINE 61 "templates/GenericTemplate.hs" #-}
-
-{-# LINE 70 "templates/GenericTemplate.hs" #-}
-
-infixr 9 `HappyStk`
-data HappyStk a = HappyStk a (HappyStk a)
-
------------------------------------------------------------------------------
--- starting the parse
-
-happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll
-
------------------------------------------------------------------------------
--- Accepting the parse
-
--- If the current token is 0#, it means we've just accepted a partial
--- parse (a %partial parser).  We must ignore the saved token on the top of
--- the stack in this case.
-happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =
-	happyReturn1 ans
-happyAccept j tk st sts (HappyStk ans _) = 
-	(happyTcHack j (happyTcHack st)) (happyReturn1 ans)
-
------------------------------------------------------------------------------
--- Arrays only: do the next action
-
-
-
-happyDoAction i tk st
-	= {- nothing -}
-
-
-	  case action of
-		0#		  -> {- nothing -}
-				     happyFail i tk st
-		-1# 	  -> {- nothing -}
-				     happyAccept i tk st
-		n | (n Happy_GHC_Exts.<# (0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}
-
-				     (happyReduceArr Happy_Data_Array.! rule) i tk st
-				     where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))
-		n		  -> {- nothing -}
-
-
-				     happyShift new_state i tk st
-				     where !(new_state) = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))
-   where !(off)    = indexShortOffAddr happyActOffsets st
-         !(off_i)  = (off Happy_GHC_Exts.+# i)
-	 check  = if (off_i Happy_GHC_Exts.>=# (0# :: Happy_GHC_Exts.Int#))
-			then (indexShortOffAddr happyCheck off_i Happy_GHC_Exts.==#  i)
-			else False
-         !(action)
-          | check     = indexShortOffAddr happyTable off_i
-          | otherwise = indexShortOffAddr happyDefActions st
-
-{-# LINE 130 "templates/GenericTemplate.hs" #-}
-
-
-indexShortOffAddr (HappyA# arr) off =
-	Happy_GHC_Exts.narrow16Int# i
-  where
-	!i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)
-	!high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))
-	!low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))
-	!off' = off Happy_GHC_Exts.*# 2#
-
-
-
-
-
-data HappyAddr = HappyA# Happy_GHC_Exts.Addr#
-
-
-
-
------------------------------------------------------------------------------
--- HappyState data type (not arrays)
-
-{-# LINE 163 "templates/GenericTemplate.hs" #-}
-
------------------------------------------------------------------------------
--- Shifting a token
-
-happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =
-     let !(i) = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
---     trace "shifting the error token" $
-     happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)
-
-happyShift new_state i tk st sts stk =
-     happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)
-
--- happyReduce is specialised for the common cases.
-
-happySpecReduce_0 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_0 nt fn j tk st@((action)) sts stk
-     = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)
-
-happySpecReduce_1 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')
-     = let r = fn v1 in
-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
-
-happySpecReduce_2 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')
-     = let r = fn v1 v2 in
-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
-
-happySpecReduce_3 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')
-     = let r = fn v1 v2 v3 in
-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
-
-happyReduce k i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happyReduce k nt fn j tk st sts stk
-     = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of
-	 sts1@((HappyCons (st1@(action)) (_))) ->
-        	let r = fn stk in  -- it doesn't hurt to always seq here...
-       		happyDoSeq r (happyGoto nt j tk st1 sts1 r)
-
-happyMonadReduce k nt fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happyMonadReduce k nt fn j tk st sts stk =
-        happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))
-       where !(sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))
-             drop_stk = happyDropStk k stk
-
-happyMonad2Reduce k nt fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happyMonad2Reduce k nt fn j tk st sts stk =
-       happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))
-       where !(sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))
-             drop_stk = happyDropStk k stk
-
-             !(off) = indexShortOffAddr happyGotoOffsets st1
-             !(off_i) = (off Happy_GHC_Exts.+# nt)
-             !(new_state) = indexShortOffAddr happyTable off_i
-
-
-
-
-happyDrop 0# l = l
-happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t
-
-happyDropStk 0# l = l
-happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs
-
------------------------------------------------------------------------------
--- Moving to a new state after a reduction
-
-
-happyGoto nt j tk st = 
-   {- nothing -}
-   happyDoAction j tk new_state
-   where !(off) = indexShortOffAddr happyGotoOffsets st
-         !(off_i) = (off Happy_GHC_Exts.+# nt)
-         !(new_state) = indexShortOffAddr happyTable off_i
-
-
-
-
------------------------------------------------------------------------------
--- Error recovery (0# is the error token)
-
--- parse error if we are in recovery and we fail again
-happyFail  0# tk old_st _ stk =
---	trace "failing" $ 
-    	happyError_ tk
-
-{-  We don't need state discarding for our restricted implementation of
-    "error".  In fact, it can cause some bogus parses, so I've disabled it
-    for now --SDM
-
--- discard a state
-happyFail  0# tk old_st (HappyCons ((action)) (sts)) 
-						(saved_tok `HappyStk` _ `HappyStk` stk) =
---	trace ("discarding state, depth " ++ show (length stk))  $
-	happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))
--}
-
--- Enter error recovery: generate an error token,
---                       save the old token and carry on.
-happyFail  i tk (action) sts stk =
---      trace "entering error recovery" $
-	happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)
-
--- Internal happy errors:
-
+{-# OPTIONS_GHC -w #-}
+{-# OPTIONS -fglasgow-exts -cpp #-}
+{-# OPTIONS_GHC -fno-warn-incomplete-patterns
+                -fno-warn-deprecated-flags #-}
+{-# LANGUAGE BangPatterns #-}
+{-| The parser is generated by Happy (<http://www.haskell.org/happy>).
+-}
+module Agda.Syntax.Parser.Parser (
+      moduleParser
+    , exprParser
+    , tokensParser
+    , tests
+    ) where
+
+import Control.Arrow
+import Control.Monad
+import Control.Monad.State
+import Data.Char
+import Data.List
+import Data.Maybe
+import qualified Data.Traversable as T
+
+import Agda.Syntax.Position hiding (tests)
+import Agda.Syntax.Parser.Monad
+import Agda.Syntax.Parser.Lexer
+import Agda.Syntax.Parser.Tokens
+import Agda.Syntax.Concrete
+import Agda.Syntax.Concrete.Name
+import Agda.Syntax.Concrete.Pretty
+import Agda.Syntax.Common
+import Agda.Syntax.Fixity
+import Agda.Syntax.Notation
+import Agda.Syntax.Literal
+
+import Agda.Utils.Monad
+import Agda.Utils.QuickCheck
+import Agda.Utils.TestHelpers
+import qualified Data.Array as Happy_Data_Array
+import qualified GHC.Exts as Happy_GHC_Exts
+
+-- parser produced by Happy Version 1.18.6
+
+newtype HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70 = HappyAbsSyn HappyAny
+#if __GLASGOW_HASKELL__ >= 607
+type HappyAny = Happy_GHC_Exts.Any
+#else
+type HappyAny = forall a . a
+#endif
+happyIn6 :: ([Token]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn6 #-}
+happyOut6 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Token])
+happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut6 #-}
+happyIn7 :: ([Token]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn7 #-}
+happyOut7 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Token])
+happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut7 #-}
+happyIn8 :: (Token) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn8 #-}
+happyOut8 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Token)
+happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut8 #-}
+happyIn9 :: (([Pragma], [Declaration])) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn9 #-}
+happyOut9 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (([Pragma], [Declaration]))
+happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut9 #-}
+happyIn10 :: t10 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn10 #-}
+happyOut10 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t10
+happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut10 #-}
+happyIn11 :: t11 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn11 #-}
+happyOut11 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t11
+happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut11 #-}
+happyIn12 :: t12 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn12 #-}
+happyOut12 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t12
+happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut12 #-}
+happyIn13 :: (()) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn13 #-}
+happyOut13 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (())
+happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut13 #-}
+happyIn14 :: (Integer) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn14 #-}
+happyOut14 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Integer)
+happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut14 #-}
+happyIn15 :: (Name) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn15 #-}
+happyOut15 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Name)
+happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut15 #-}
+happyIn16 :: ([Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn16 #-}
+happyOut16 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Name])
+happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut16 #-}
+happyIn17 :: (Range) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn17 #-}
+happyOut17 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Range)
+happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut17 #-}
+happyIn18 :: (Arg Name) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn18 #-}
+happyOut18 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Arg Name)
+happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut18 #-}
+happyIn19 :: ([Arg Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn19 #-}
+happyOut19 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Arg Name])
+happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut19 #-}
+happyIn20 :: ([Arg Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn20 #-}
+happyOut20 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Arg Name])
+happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut20 #-}
+happyIn21 :: (QName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn21 #-}
+happyOut21 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (QName)
+happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut21 #-}
+happyIn22 :: (QName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn22 #-}
+happyOut22 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (QName)
+happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut22 #-}
+happyIn23 :: (Name) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn23 #-}
+happyOut23 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Name)
+happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut23 #-}
+happyIn24 :: ([Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn24 #-}
+happyOut24 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Name])
+happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut24 #-}
+happyIn25 :: ([Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn25 #-}
+happyOut25 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Name])
+happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut25 #-}
+happyIn26 :: (Either [Name] [Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn26 #-}
+happyOut26 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Either [Name] [Expr])
+happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut26 #-}
+happyIn27 :: ([String]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn27 #-}
+happyOut27 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([String])
+happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut27 #-}
+happyIn28 :: (QName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn28 #-}
+happyOut28 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (QName)
+happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut28 #-}
+happyIn29 :: (Expr) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn29 #-}
+happyOut29 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Expr)
+happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut29 #-}
+happyIn30 :: t30 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn30 #-}
+happyOut30 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t30
+happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut30 #-}
+happyIn31 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn31 #-}
+happyOut31 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Expr])
+happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut31 #-}
+happyIn32 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn32 #-}
+happyOut32 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Expr])
+happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut32 #-}
+happyIn33 :: t33 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn33 #-}
+happyOut33 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t33
+happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut33 #-}
+happyIn34 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn34 #-}
+happyOut34 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Expr])
+happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut34 #-}
+happyIn35 :: t35 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn35 #-}
+happyOut35 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t35
+happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut35 #-}
+happyIn36 :: t36 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn36 #-}
+happyOut36 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t36
+happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut36 #-}
+happyIn37 :: t37 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn37 #-}
+happyOut37 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t37
+happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut37 #-}
+happyIn38 :: ([(Name, Expr)]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn38 #-}
+happyOut38 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([(Name, Expr)])
+happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut38 #-}
+happyIn39 :: ([(Name, Expr)]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn39 #-}
+happyOut39 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([(Name, Expr)])
+happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut39 #-}
+happyIn40 :: ((Name, Expr)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn40 #-}
+happyOut40 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ((Name, Expr))
+happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut40 #-}
+happyIn41 :: t41 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn41 #-}
+happyOut41 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t41
+happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut41 #-}
+happyIn42 :: t42 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn42 #-}
+happyOut42 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t42
+happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut42 #-}
+happyIn43 :: ([TypedBindings]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn43 #-}
+happyOut43 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([TypedBindings])
+happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut43 #-}
+happyIn44 :: (TypedBindings) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn44 #-}
+happyOut44 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (TypedBindings)
+happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut44 #-}
+happyIn45 :: (TypedBinding) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn45 #-}
+happyOut45 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (TypedBinding)
+happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut45 #-}
+happyIn46 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn46 #-}
+happyOut46 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([LamBinding])
+happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut46 #-}
+happyIn47 :: (Either ([LamBinding], Hiding) [Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn47 #-}
+happyOut47 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Either ([LamBinding], Hiding) [Expr])
+happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut47 #-}
+happyIn48 :: ([Either Hiding LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn48 #-}
+happyOut48 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Either Hiding LamBinding])
+happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut48 #-}
+happyIn49 :: (Either [Either Hiding LamBinding] [Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn49 #-}
+happyOut49 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Either [Either Hiding LamBinding] [Expr])
+happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut49 #-}
+happyIn50 :: ((LHS,RHS,WhereClause)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn50 #-}
+happyOut50 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ((LHS,RHS,WhereClause))
+happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut50 #-}
+happyIn51 :: ((LHS,RHS,WhereClause)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn51 #-}
+happyOut51 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ((LHS,RHS,WhereClause))
+happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut51 #-}
+happyIn52 :: ((LHS,RHS,WhereClause)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn52 #-}
+happyOut52 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ((LHS,RHS,WhereClause))
+happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut52 #-}
+happyIn53 :: ([(LHS,RHS,WhereClause)]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn53 #-}
+happyOut53 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([(LHS,RHS,WhereClause)])
+happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut53 #-}
+happyIn54 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn54 #-}
+happyOut54 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([LamBinding])
+happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut54 #-}
+happyIn55 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn55 #-}
+happyOut55 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([LamBinding])
+happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut55 #-}
+happyIn56 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn56 #-}
+happyOut56 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([LamBinding])
+happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut56 #-}
+happyIn57 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn57 #-}
+happyOut57 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([LamBinding])
+happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut57 #-}
+happyIn58 :: (Either [LamBinding] [Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn58 #-}
+happyOut58 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Either [LamBinding] [Expr])
+happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut58 #-}
+happyIn59 :: ((Maybe AsName, ImportDirective)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn59 #-}
+happyOut59 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ((Maybe AsName, ImportDirective))
+happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut59 #-}
+happyIn60 :: (ImportDirective) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn60 #-}
+happyOut60 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (ImportDirective)
+happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut60 #-}
+happyIn61 :: (ImportDirective) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn61 #-}
+happyOut61 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (ImportDirective)
+happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut61 #-}
+happyIn62 :: (ImportDirective) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn62 #-}
+happyOut62 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (ImportDirective)
+happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut62 #-}
+happyIn63 :: ((UsingOrHiding , Range)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn63 #-}
+happyOut63 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ((UsingOrHiding , Range))
+happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut63 #-}
+happyIn64 :: (([Renaming] , Range)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn64 #-}
+happyOut64 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (([Renaming] , Range))
+happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut64 #-}
+happyIn65 :: ([Renaming]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn65 #-}
+happyOut65 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Renaming])
+happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut65 #-}
+happyIn66 :: (Renaming) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn66 #-}
+happyOut66 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Renaming)
+happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut66 #-}
+happyIn67 :: (ImportedName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn67 #-}
+happyOut67 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (ImportedName)
+happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut67 #-}
+happyIn68 :: (ImportedName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn68 #-}
+happyOut68 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (ImportedName)
+happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut68 #-}
+happyIn69 :: ([ImportedName]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn69 #-}
+happyOut69 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([ImportedName])
+happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut69 #-}
+happyIn70 :: t70 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn70 #-}
+happyOut70 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t70
+happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut70 #-}
+happyIn71 :: (LHS) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn71 #-}
+happyOut71 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (LHS)
+happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut71 #-}
+happyIn72 :: ([Pattern]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn72 #-}
+happyOut72 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Pattern])
+happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut72 #-}
+happyIn73 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn73 #-}
+happyOut73 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Expr])
+happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut73 #-}
+happyIn74 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn74 #-}
+happyOut74 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Expr])
+happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut74 #-}
+happyIn75 :: (WhereClause) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn75 #-}
+happyOut75 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (WhereClause)
+happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut75 #-}
+happyIn76 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn76 #-}
+happyOut76 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])
+happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut76 #-}
+happyIn77 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn77 #-}
+happyOut77 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])
+happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut77 #-}
+happyIn78 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn78 #-}
+happyOut78 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut78 #-}
+happyIn79 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn79 #-}
+happyOut79 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])
+happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut79 #-}
+happyIn80 :: ([Arg Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn80 #-}
+happyOut80 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Arg Declaration])
+happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut80 #-}
+happyIn81 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn81 #-}
+happyOut81 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut81 #-}
+happyIn82 :: (RHS) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn82 #-}
+happyOut82 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (RHS)
+happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut82 #-}
+happyIn83 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn83 #-}
+happyOut83 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut83 #-}
+happyIn84 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn84 #-}
+happyOut84 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut84 #-}
+happyIn85 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn85 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn85 #-}
+happyOut85 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut85 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut85 #-}
+happyIn86 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn86 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn86 #-}
+happyOut86 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut86 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut86 #-}
+happyIn87 :: (Name) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn87 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn87 #-}
+happyOut87 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Name)
+happyOut87 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut87 #-}
+happyIn88 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn88 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn88 #-}
+happyOut88 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut88 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut88 #-}
+happyIn89 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn89 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn89 #-}
+happyOut89 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])
+happyOut89 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut89 #-}
+happyIn90 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn90 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn90 #-}
+happyOut90 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut90 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut90 #-}
+happyIn91 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn91 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn91 #-}
+happyOut91 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut91 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut91 #-}
+happyIn92 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn92 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn92 #-}
+happyOut92 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut92 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut92 #-}
+happyIn93 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn93 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn93 #-}
+happyOut93 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut93 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut93 #-}
+happyIn94 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn94 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn94 #-}
+happyOut94 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut94 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut94 #-}
+happyIn95 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn95 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn95 #-}
+happyOut95 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut95 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut95 #-}
+happyIn96 :: ([String]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn96 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn96 #-}
+happyOut96 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([String])
+happyOut96 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut96 #-}
+happyIn97 :: ([HoleName]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn97 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn97 #-}
+happyOut97 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([HoleName])
+happyOut97 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut97 #-}
+happyIn98 :: (HoleName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn98 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn98 #-}
+happyOut98 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (HoleName)
+happyOut98 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut98 #-}
+happyIn99 :: (String) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn99 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn99 #-}
+happyOut99 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (String)
+happyOut99 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut99 #-}
+happyIn100 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn100 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn100 #-}
+happyOut100 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut100 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut100 #-}
+happyIn101 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn101 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn101 #-}
+happyOut101 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Expr])
+happyOut101 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut101 #-}
+happyIn102 :: ([TypedBindings] -> Parser ModuleApplication) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn102 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn102 #-}
+happyOut102 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([TypedBindings] -> Parser ModuleApplication)
+happyOut102 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut102 #-}
+happyIn103 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn103 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn103 #-}
+happyOut103 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut103 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut103 #-}
+happyIn104 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn104 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn104 #-}
+happyOut104 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut104 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut104 #-}
+happyIn105 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn105 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn105 #-}
+happyOut105 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut105 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut105 #-}
+happyIn106 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn106 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn106 #-}
+happyOut106 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])
+happyOut106 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut106 #-}
+happyIn107 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn107 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn107 #-}
+happyOut107 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut107 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut107 #-}
+happyIn108 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn108 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn108 #-}
+happyOut108 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)
+happyOut108 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut108 #-}
+happyIn109 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn109 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn109 #-}
+happyOut109 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)
+happyOut109 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut109 #-}
+happyIn110 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn110 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn110 #-}
+happyOut110 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)
+happyOut110 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut110 #-}
+happyIn111 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn111 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn111 #-}
+happyOut111 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)
+happyOut111 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut111 #-}
+happyIn112 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn112 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn112 #-}
+happyOut112 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)
+happyOut112 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut112 #-}
+happyIn113 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn113 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn113 #-}
+happyOut113 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)
+happyOut113 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut113 #-}
+happyIn114 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn114 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn114 #-}
+happyOut114 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)
+happyOut114 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut114 #-}
+happyIn115 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn115 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn115 #-}
+happyOut115 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)
+happyOut115 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut115 #-}
+happyIn116 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn116 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn116 #-}
+happyOut116 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)
+happyOut116 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut116 #-}
+happyIn117 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn117 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn117 #-}
+happyOut117 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)
+happyOut117 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut117 #-}
+happyIn118 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn118 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn118 #-}
+happyOut118 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)
+happyOut118 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut118 #-}
+happyIn119 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn119 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn119 #-}
+happyOut119 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)
+happyOut119 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut119 #-}
+happyIn120 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn120 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn120 #-}
+happyOut120 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)
+happyOut120 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut120 #-}
+happyIn121 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn121 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn121 #-}
+happyOut121 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)
+happyOut121 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut121 #-}
+happyIn122 :: ([TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn122 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn122 #-}
+happyOut122 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([TypeSignature])
+happyOut122 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut122 #-}
+happyIn123 :: ([TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn123 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn123 #-}
+happyOut123 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([TypeSignature])
+happyOut123 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut123 #-}
+happyIn124 :: ([TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn124 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn124 #-}
+happyOut124 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([TypeSignature])
+happyOut124 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut124 #-}
+happyIn125 :: ([TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn125 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn125 #-}
+happyOut125 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([TypeSignature])
+happyOut125 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut125 #-}
+happyIn126 :: ([Arg TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn126 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn126 #-}
+happyOut126 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Arg TypeSignature])
+happyOut126 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut126 #-}
+happyIn127 :: ([Arg TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn127 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn127 #-}
+happyOut127 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Arg TypeSignature])
+happyOut127 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut127 #-}
+happyIn128 :: ([Constructor]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn128 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn128 #-}
+happyOut128 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Constructor])
+happyOut128 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut128 #-}
+happyIn129 :: ((Maybe Name, [Declaration])) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn129 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn129 #-}
+happyOut129 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ((Maybe Name, [Declaration]))
+happyOut129 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut129 #-}
+happyIn130 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn130 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn130 #-}
+happyOut130 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])
+happyOut130 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut130 #-}
+happyIn131 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn131 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn131 #-}
+happyOut131 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])
+happyOut131 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut131 #-}
+happyIn132 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyIn132 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn132 #-}
+happyOut132 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])
+happyOut132 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut132 #-}
+happyInTok :: (Token) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)
+happyInTok x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyInTok #-}
+happyOutTok :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Token)
+happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOutTok #-}
+
+
+happyActOffsets :: HappyAddr
+happyActOffsets = HappyA# "\x00\x00\xd9\x05\x1f\x00\x00\x00\xb8\x02\x34\x05\x00\x00\x4d\x02\x4d\x02\x00\x00\x00\x00\x1f\x00\x00\x00\x58\x00\xc7\x03\xc7\x03\x59\x05\x3a\x05\x00\x00\x2a\x05\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\xa8\x05\x81\x05\x35\x05\x00\x00\xff\x00\x2c\x05\x9a\x07\x00\x00\x00\x00\x66\x07\x2b\x05\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x02\x73\x07\x00\x00\x00\x00\x3f\x07\xaa\x04\x90\x03\x77\x04\x00\x00\x00\x00\x00\x00\x24\x05\xe5\x00\x38\x05\x00\x00\x27\x05\xd4\x01\x25\x05\x00\x00\xe1\x00\x00\x00\x69\x01\x69\x01\x00\x00\x23\x05\x26\x05\x1c\x05\x00\x00\x00\x00\x00\x00\xa4\x01\x81\x05\x00\x00\x20\x05\x00\x00\x18\x07\x39\x01\x6c\x02\x20\x02\x00\x00\x89\x06\x50\x05\x58\x06\x00\x00\x4c\x07\x50\x04\x90\x03\x1d\x04\xb0\x06\xb0\x06\xb0\x06\x4e\x05\xf1\x06\x29\x05\x1f\x05\xf1\x06\x00\x00\xb0\x06\xb0\x06\xb0\x06\x11\x05\xf6\x03\x90\x03\x06\x05\x4a\x05\x03\x03\x00\x00\x60\x01\xb0\x06\xb0\x06\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x03\x29\x05\xb0\x06\x4c\x07\x03\x05\x00\x00\x00\x00\xf1\x06\x35\x00\x25\x07\xc7\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\xfe\x06\x36\x02\x5d\x03\x00\x00\x00\x00\x00\x00\x00\x00\x36\x05\x00\x00\x02\x05\x01\x05\xff\x04\x71\x03\xee\x04\xf1\x06\x31\x05\xf1\x06\xec\x04\xe7\x04\x00\x00\x00\x00\xed\x04\x00\x00\x00\x00\xb0\x06\xb0\x06\xb0\x06\xb0\x06\xd2\x01\x22\x05\xeb\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\xdc\x04\xda\x04\x9f\x00\xc9\x04\xc9\x04\xc9\x04\xd7\x06\xd8\x04\xcc\x04\xcc\x04\xcc\x04\xd2\x04\xd2\x04\xd2\x04\xc4\x04\xc6\x04\xa7\x01\xc7\x0c\x29\x05\xbe\x04\xb8\x04\x00\x00\xbc\x04\xb0\x04\xb4\x04\xcf\xff\x00\x00\x00\x00\x00\x00\x00\x00\x29\x05\xa8\x04\x69\x01\xb1\x04\xa4\x04\x69\x01\x9c\x04\xca\x00\xac\x04\x00\x00\x73\x00\xe8\xff\xa7\x04\xa6\x04\xa5\x04\x00\x00\xb0\x06\xb0\x06\x00\x00\xb0\x06\xb0\x06\xca\x06\xa2\x04\xca\x06\x31\x06\xf8\x04\x00\x06\x00\x00\x00\x00\xa0\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x04\x00\x00\x00\x00\xd1\x04\xd1\x04\x91\x04\x00\x00\x69\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\xcf\xff\x64\x00\xcf\xff\xb0\x06\x00\x00\x00\x00\x00\x00\xb0\x06\xd1\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x04\x86\x04\x00\x00\xd1\x04\x00\x00\x7e\x04\x7a\x04\x7c\x04\x74\x04\x74\x04\x74\x04\x74\x04\x74\x04\x74\x04\x74\x04\xcc\x00\xb5\x04\xa7\x01\xc5\x00\x00\x00\x00\x00\x00\x00\x6e\x00\x00\x00\x6e\x00\x6e\x00\x00\x00\xce\x04\xaa\x03\xaf\x06\xaf\x06\xaf\x06\x6d\x04\x00\x00\x6d\x04\x00\x00\xed\xff\x00\x00\x03\x03\x00\x00\x00\x00\xdf\x00\xd1\x04\xae\x04\xd1\x04\xd1\x04\x00\x00\x00\x00\x00\x00\x70\x04\x00\x00\x36\x02\x00\x00\xa1\x04\x14\x00\x14\x00\x00\x00\x69\x01\x00\x00\x00\x00\x00\x00\x36\x02\x00\x00\x6b\x04\x6f\x04\x00\x00\x5f\x04\x6e\x04\x5e\x04\x60\x04\x69\x04\x8d\x04\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x02\x00\x00\x00\x00\x00\x00\xd1\x04\x00\x00\x00\x00\x59\x04\x4f\x04\x00\x00\x00\x00\xed\xff\x61\x04\x00\x00\x59\x00\x4d\x04\x4d\x04\x5b\x04\x00\x00\x59\x00\xaf\x06\x7f\x00\xac\x00\x9c\x00\x09\x00\xce\x04\x57\x04\x00\x00\x59\x00\x0e\x01\xc9\x01\xed\xff\xed\xff\x6e\x00\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x51\x04\x00\x00\x45\x04\xa7\x01\x6a\x04\xd1\x04\x39\x04\x00\x00\x20\x04\x20\x04\x20\x04\x1f\x04\x1a\x04\x38\x04\x00\x00\x32\x04\x16\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x04\x00\x00\x00\x00\x12\x04\x13\x04\x11\x04\x0f\x04\x0c\x04\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x04\x00\x00\x0a\x04\x00\x00\x0b\x04\x49\x01\x00\x00\x04\x04\x04\x04\x04\x04\x04\x04\x00\x00\xce\x04\xd1\x04\x00\x00\x02\x04\xd1\x04\x01\x04\xd1\x04\x01\x04\xd1\x04\x00\x04\xc7\x03\x06\x04\x00\x00\xf3\x03\xd1\x04\x00\x00\x00\x00\xed\xff\xd1\x04\x00\x00\x2f\x04\x00\x00\x00\x00\x00\x00\xe9\x03\xe9\x03\x27\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x03\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x03\x3c\x01\x36\x02\x00\x00\x24\x04\x00\x00\x00\x00\x13\x00\x23\x04\x00\x00\x22\x04\x00\x00\x21\x02\x00\x00\x00\x00\xdd\x03\x49\x01\xd2\x03\x49\x01\xce\x04\xce\x04\xc2\x03\x00\x00\xcd\x03\x00\x00\x00\x00\x00\x00\xbc\x03\x00\x00\x00\x00\x00\x00\xb7\x03\x00\x00\x00\x00\x00\x00\xce\x04\xce\x04\xce\x04\xce\x04\x00\x00\x59\x00\x59\x00\xab\x03\xb5\x03\xa5\x03\x00\x00\xa5\x03\x00\x00\x00\x00\x2a\x03\x36\x02\x00\x00\x00\x00\x49\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00\x00\x00\x00\x00\xac\x03\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00"#
+
+happyGotoOffsets :: HappyAddr
+happyGotoOffsets = HappyA# "\xbf\x03\xc0\x0c\x1a\x00\xe5\x03\xd8\x03\x00\x00\x00\x00\x01\x03\xc2\x02\x00\x00\x00\x00\x2e\x00\x00\x00\x81\x02\x68\x02\x1c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x03\xa8\x0c\x00\x00\x00\x00\x8b\x03\x5b\x03\xf4\x00\x00\x00\x00\x00\x17\x05\xcb\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x05\x00\x00\x00\x00\x1d\x02\x7d\x08\x19\x08\x64\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x03\xba\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x05\x90\x0c\x00\x00\x00\x00\x00\x00\x70\x05\x00\x00\x0d\x01\x22\x00\x00\x00\x51\x0a\xb3\x08\xdb\x07\x00\x00\x40\x05\x4b\x08\xfa\x07\x32\x08\x3a\x0a\x23\x0a\x0c\x0a\x00\x00\xb8\x07\x78\x0c\x00\x00\x76\x06\x00\x00\xf5\x09\xde\x09\xc7\x09\x00\x00\x60\x0c\x68\x0a\xf3\x00\x00\x00\x42\x01\x00\x00\x00\x00\xb0\x09\x99\x09\x00\x00\x00\x00\x00\x00\x00\x00\x48\x0c\x30\x0c\x65\x03\x0f\x05\xb9\x03\x00\x00\x00\x00\x1e\x06\x44\x0a\xdc\x00\xae\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x07\x8d\x00\x7b\x08\x68\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x92\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x03\xaf\x03\xc6\x05\x00\x00\x6e\x05\x00\x00\x86\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x04\x82\x09\x6b\x09\x54\x09\x00\x00\x5c\x03\x4d\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x03\x1c\x03\xf4\x02\x43\x01\x57\x03\x4a\x03\x3f\x03\xda\x00\xc7\x02\x2f\x03\x24\x03\x22\x03\xac\x02\x9a\x02\x92\x02\xae\x02\x70\x02\xe8\x04\x00\x00\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\x9d\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x9b\x02\x00\x00\x00\x00\x94\x02\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x02\x75\x02\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x09\x26\x09\x00\x00\x0f\x09\xf8\x08\xff\x02\x00\x00\x69\x02\xe1\x08\x9c\x08\xca\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x0b\x00\x00\x00\x00\xd0\x0b\xb8\x0b\x00\x00\x00\x00\x6e\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x02\x00\x00\x59\x02\x58\x04\x00\x00\x00\x00\x00\x00\xfe\x03\xa0\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x88\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x44\x02\x3d\x02\x28\x02\x19\x02\x17\x02\xf6\x01\xf3\x01\x00\x00\xba\x01\xb2\x01\xaa\x02\x00\x00\x00\x00\x00\x00\xd9\x01\x00\x00\x95\x01\x6e\x01\x00\x00\x16\x00\x97\x04\x3d\x04\xe3\x03\xb0\x03\xf0\x01\x00\x00\x1c\x00\x00\x00\xfd\xff\x00\x00\xad\x01\x00\x00\x00\x00\xaf\x01\x70\x0b\xb3\x01\x58\x0b\x40\x0b\x00\x00\x00\x00\x00\x00\x2d\x03\x00\x00\xba\x07\x00\x00\xce\x00\xc0\x00\xf9\xff\x00\x00\xd1\x01\x00\x00\x00\x00\x00\x00\x9f\x06\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00\xd7\x01\x00\x00\x00\x00\x00\x00\xc6\x01\x00\x00\x00\x00\x00\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x28\x0b\x00\x00\x00\x00\x48\x01\xb6\x01\x00\x00\x00\x00\x64\x03\x00\x00\x00\x00\x9e\x03\xb1\x01\x6d\x03\x00\x00\x00\x00\x87\x03\x5a\x02\x00\x00\x00\x00\x00\x00\x00\x00\x34\x04\x00\x00\x00\x00\x80\x03\x00\x00\xb1\x01\x2c\x03\x89\x02\x08\x01\x00\x00\x00\x00\x00\x00\xfd\x02\x00\x00\x00\x00\x00\x00\x00\x00\x76\x01\x47\x01\x3b\x01\x10\x0b\x00\x00\x00\x00\x7e\x01\x79\x01\x6d\x01\x00\x00\x67\x01\x00\x00\x00\x00\x00\x00\x5f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x14\x01\x00\x00\x00\x00\x4e\x01\x00\x00\x19\x03\xa6\x02\x98\x02\x66\x02\x00\x00\x28\x00\xf8\x0a\x00\x00\xd9\x00\xe0\x0a\x7d\x01\xc8\x0a\x73\x01\xb0\x0a\xcd\x01\x67\x00\x00\x00\x00\x00\x32\x00\x98\x0a\x00\x00\x00\x00\xbf\x00\x80\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x01\x1a\x01\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x85\x00\x75\x06\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xff\x00\x00\x00\x00\x00\x00\x00\x00\xfc\xff\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\xa8\x00\xf0\x03\xbd\x03\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\xff\x00\x00\x00\x00\x00\x00\x8a\x03\x41\x03\x35\x03\x04\x00\x00\x00\x1e\x02\xd3\x01\x31\x00\xb1\xff\x28\x01\x00\x00\x12\x01\x00\x00\x00\x00\x68\x0a\x1d\x06\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00"#
+
+happyDefActions :: HappyAddr
+happyDefActions = HappyA# "\xfa\xff\x00\x00\x00\x00\x00\x00\xfc\xff\x00\x00\xae\xff\x00\x00\x00\x00\xad\xff\xbb\xfe\x00\x00\xb6\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xff\x6e\xff\x00\x00\x7f\xff\x7e\xff\x7c\xff\x7b\xff\x00\x00\x5b\xff\x5a\xff\x75\xff\x00\x00\x00\x00\x53\xff\x51\xff\x00\x00\x00\x00\x6a\xff\x69\xff\x00\x00\x00\x00\x68\xff\x67\xff\x66\xff\x65\xff\x00\x00\x00\x00\x6b\xff\x6c\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa5\xff\x8e\xff\x6d\xff\x00\x00\x8d\xff\x00\x00\x87\xff\x00\x00\x86\xff\x00\x00\x6f\xff\x8d\xff\x60\xff\x00\x00\x00\x00\xa2\xff\x00\x00\x00\x00\x00\x00\x61\xff\x8b\xff\x26\xff\x3a\xff\x00\x00\x77\xff\x00\x00\x45\xff\x42\xff\x3b\xff\x00\x00\x00\x00\x8a\xff\x00\x00\x00\x00\x00\x00\x5e\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\xff\x00\x00\x00\x00\x2c\xff\x27\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xff\x00\x00\x00\x00\x52\xff\x00\x00\x00\x00\x00\x00\x54\xff\x82\xff\x7a\xff\x72\xff\x00\x00\x00\x00\x00\x00\x00\x00\x85\xff\x8d\xff\x8c\xff\x28\xff\x15\xff\xc4\xfe\x00\x00\xac\xff\xba\xfe\xb9\xfe\xfb\xff\xf9\xff\xf8\xff\xf7\xff\xf6\xff\xf5\xff\xf4\xff\xf3\xff\xf2\xff\xf1\xff\xf0\xff\xef\xff\xee\xff\xed\xff\xec\xff\xeb\xff\xea\xff\xe9\xff\xe8\xff\xe7\xff\xe6\xff\xe5\xff\xe4\xff\xe3\xff\xe2\xff\xe1\xff\xe0\xff\xdf\xff\xde\xff\xdd\xff\xdc\xff\xdb\xff\xda\xff\xd9\xff\xd2\xff\xd1\xff\xd8\xff\xd7\xff\xd6\xff\xd5\xff\xd4\xff\xd3\xff\xd0\xff\xcf\xff\xce\xff\xcd\xff\xcc\xff\xcb\xff\xca\xff\xc9\xff\xc8\xff\xc7\xff\xc6\xff\xc5\xff\xc4\xff\xc3\xff\xc2\xff\xc1\xff\xc0\xff\xbf\xff\xbe\xff\xbd\xff\xbc\xff\xbb\xff\xba\xff\xb9\xff\xb8\xff\xb7\xff\xb6\xff\xb5\xff\xb4\xff\xb3\xff\xb2\xff\xb1\xff\xb0\xff\xaf\xff\x15\xff\xc4\xfe\x15\xff\x00\x00\xbe\xfe\x1d\xff\x1b\xff\x19\xff\x16\xff\x17\xff\x00\x00\x00\x00\x00\x00\x15\xff\x00\x00\x28\xff\x00\x00\x28\xff\x00\x00\x85\xff\x5f\xff\x7d\xff\x00\x00\x80\xff\x86\xff\x75\xff\x00\x00\x00\x00\x00\x00\x8d\xff\x00\xff\xe1\xfe\x8d\xfe\xfb\xfe\xf9\xfe\xf8\xfe\xf7\xfe\xf6\xfe\xf5\xfe\xf4\xfe\xfa\xfe\xf3\xfe\xf2\xfe\xf1\xfe\xf0\xfe\xef\xfe\xe9\xfe\xee\xfe\xec\xfe\xed\xfe\xeb\xfe\xea\xfe\xb7\xfe\xb5\xfe\xb4\xfe\xb2\xfe\xb3\xfe\xb1\xfe\xb0\xfe\xaf\xfe\xac\xfe\xae\xfe\xad\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xff\x57\xff\x59\xff\x87\xff\x00\x00\x2e\xff\x2f\xff\x81\xff\x2d\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\xff\x00\x00\x30\xff\x00\x00\x00\x00\x38\xff\x37\xff\x39\xff\x25\xff\x00\x00\x00\x00\x24\xff\x00\x00\x00\x00\x41\xff\x3d\xff\x42\xff\x00\x00\x00\x00\x00\x00\x46\xff\x79\xff\x3c\xff\x4a\xff\x62\xff\xa1\xff\x49\xff\x64\xff\x00\x00\x48\xff\x71\xff\x00\x00\x00\x00\x00\x00\x47\xff\x00\x00\x3f\xff\x3e\xff\x40\xff\x44\xff\x43\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\xff\x78\xff\xa8\xff\x00\x00\x00\x00\x50\xff\x4e\xff\x4f\xff\x4d\xff\x4b\xff\x4c\xff\x74\xff\x22\xff\x23\xff\x00\x00\x00\x00\x5d\xff\x00\x00\x76\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xff\x00\xff\x00\x00\x00\x00\xd1\xfe\xd2\xfe\xd3\xfe\x00\x00\xa6\xff\x00\x00\x00\x00\xd4\xfe\x00\x00\x28\xff\x28\xff\x28\xff\x28\xff\x00\x00\xcf\xfe\x00\x00\xd0\xfe\x00\x00\x91\xfe\x00\x00\xaa\xff\xab\xff\xfe\xfe\x00\x00\x02\xff\x00\x00\x00\x00\x84\xff\xab\xfe\x2a\xff\x00\x00\x29\xff\x15\xff\x1a\xff\xa7\xff\x00\x00\x0a\xff\x18\xff\x00\x00\xc6\xfe\xc3\xfe\xbd\xfe\x15\xff\x0c\xff\x08\xff\x00\x00\x09\xff\x00\x00\x00\x00\x00\x00\x00\x00\x10\xff\x00\x00\xa7\xff\x1c\xff\x8f\xfe\xb8\xfe\x00\x00\xe6\xfe\xff\xfe\x06\xff\x00\x00\xe2\xfe\xe3\xfe\x00\x00\x00\x00\x8e\xfe\x9f\xff\x9d\xff\x00\x00\x9b\xfe\x00\x00\x00\x00\xa3\xff\x00\x00\x9e\xfe\x00\x00\x28\xff\x00\x00\x00\x00\x00\x00\x00\x00\x9b\xff\x00\x00\x98\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\xff\xd7\xfe\xd6\xfe\xd5\xfe\x00\x00\xcb\xfe\xc9\xfe\x00\x00\xc7\xfe\x04\xff\x73\xff\x02\xff\x00\x00\x00\x00\x83\xff\x85\xff\x85\xff\x85\xff\x00\x00\x85\xff\x00\x00\xa1\xfe\x00\x00\x00\x00\x55\xff\x56\xff\x5c\xff\x36\xff\x35\xff\x34\xff\x33\xff\x31\xff\x32\xff\x20\xff\x21\xff\x1e\xff\x1f\xff\x63\xff\x70\xff\x00\x00\xa2\xfe\xa3\xfe\x00\x00\x85\xff\x00\x00\x00\x00\x00\x00\xa4\xfe\xe7\xfe\x05\xff\x03\xff\x00\x00\xca\xfe\x00\x00\x89\xff\x00\x00\x00\x00\xa0\xff\x00\x00\x00\x00\x00\x00\x00\x00\x9a\xfe\x00\x00\x00\x00\x9c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\xfe\x00\x00\x00\x00\xa4\xff\x9d\xfe\x00\x00\x00\x00\x9e\xff\x00\x00\xfd\xfe\x01\xff\x90\xfe\x00\x00\x00\x00\xa7\xff\x12\xff\x0e\xff\x13\xff\x0b\xff\x14\xff\x00\x00\xc5\xfe\x07\xff\x11\xff\x0f\xff\x0d\xff\x00\x00\xe5\xfe\x9c\xfe\xe8\xfe\x9f\xfe\x00\x00\xc4\xfe\x15\xff\xbc\xfe\xdc\xfe\x96\xfe\xde\xfe\x00\x00\x00\x00\xdd\xfe\xd9\xfe\xda\xfe\x00\x00\xe4\xfe\x99\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x99\xff\x97\xff\xce\xfe\xcd\xfe\x00\x00\xa5\xfe\xa6\xfe\xa8\xfe\x00\x00\xa9\xfe\xaa\xfe\xa7\xfe\x00\x00\xcc\xfe\x98\xff\x9a\xff\x93\xff\x95\xff\x8f\xff\x91\xff\x95\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\xfe\x00\x00\xc0\xfe\xc1\xfe\x00\x00\x15\xff\xfc\xfe\xbf\xfe\x00\x00\xe0\xfe\xdf\xfe\xdb\xfe\xd8\xfe\x92\xfe\x94\xfe\x00\x00\x92\xff\x90\xff\x96\xff\x94\xff\x00\x00\xc8\xfe\x00\x00\xc2\xfe\x93\xfe"#
+
+happyCheck :: HappyAddr
+happyCheck = HappyA# "\xff\xff\x05\x00\x09\x00\x05\x00\x35\x00\x09\x00\x09\x00\x09\x00\x0a\x00\x0c\x00\x0d\x00\x0f\x00\x03\x00\x09\x00\x0b\x00\x40\x00\x0c\x00\x42\x00\x0e\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x34\x00\x03\x00\x04\x00\x09\x00\x33\x00\x09\x00\x0c\x00\x0f\x00\x0e\x00\x09\x00\x0a\x00\x08\x00\x09\x00\x09\x00\x42\x00\x09\x00\x7b\x00\x45\x00\x0f\x00\x0f\x00\x10\x00\x09\x00\x04\x00\x11\x00\x0c\x00\x48\x00\x0e\x00\x3e\x00\x3f\x00\x40\x00\x09\x00\x09\x00\x0a\x00\x41\x00\x35\x00\x0a\x00\x0b\x00\x0c\x00\x46\x00\x0e\x00\x48\x00\x47\x00\x49\x00\x4b\x00\x5d\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x3e\x00\x44\x00\x40\x00\x00\x00\x5e\x00\x48\x00\x48\x00\x61\x00\x62\x00\x63\x00\x4a\x00\x09\x00\x66\x00\x47\x00\x68\x00\x46\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x09\x00\x05\x00\x4a\x00\x75\x00\x77\x00\x09\x00\x0f\x00\x10\x00\x5e\x00\x47\x00\x7e\x00\x0f\x00\x62\x00\x48\x00\x64\x00\x65\x00\x60\x00\x67\x00\x03\x00\x69\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x5e\x00\x34\x00\x09\x00\x79\x00\x62\x00\x75\x00\x64\x00\x65\x00\x0f\x00\x67\x00\x09\x00\x69\x00\x09\x00\x35\x00\x05\x00\x06\x00\x0f\x00\x44\x00\x45\x00\x03\x00\x48\x00\x49\x00\x1d\x00\x1e\x00\x1f\x00\x37\x00\x42\x00\x34\x00\x09\x00\x5d\x00\x1d\x00\x1e\x00\x1f\x00\x41\x00\x0f\x00\x03\x00\x21\x00\x22\x00\x46\x00\x0b\x00\x48\x00\x36\x00\x48\x00\x4b\x00\x45\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x0b\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x35\x00\x60\x00\x09\x00\x09\x00\x5e\x00\x0c\x00\x0d\x00\x61\x00\x62\x00\x63\x00\x07\x00\x35\x00\x66\x00\x42\x00\x68\x00\x07\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x09\x00\x35\x00\x03\x00\x09\x00\x5f\x00\x09\x00\x0f\x00\x48\x00\x49\x00\x0f\x00\x7e\x00\x0f\x00\x5f\x00\x7c\x00\x0f\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x09\x00\x1e\x00\x1d\x00\x1e\x00\x1f\x00\x09\x00\x09\x00\x3e\x00\x35\x00\x40\x00\x35\x00\x3d\x00\x0f\x00\x3b\x00\x3c\x00\x3d\x00\x3b\x00\x49\x00\x3b\x00\x3c\x00\x3d\x00\x42\x00\x48\x00\x20\x00\x21\x00\x22\x00\x09\x00\x1e\x00\x20\x00\x21\x00\x22\x00\x09\x00\x36\x00\x41\x00\x11\x00\x12\x00\x36\x00\x3b\x00\x46\x00\x11\x00\x48\x00\x3b\x00\x36\x00\x4b\x00\x09\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x3d\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x32\x00\x33\x00\x48\x00\x39\x00\x5e\x00\x09\x00\x3c\x00\x61\x00\x62\x00\x63\x00\x5f\x00\x3d\x00\x66\x00\x3f\x00\x68\x00\x41\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x09\x00\x09\x00\x3f\x00\x12\x00\x41\x00\x09\x00\x0f\x00\x0f\x00\x10\x00\x7b\x00\x7e\x00\x0f\x00\x1b\x00\x1c\x00\x0b\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x5d\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x32\x00\x33\x00\x15\x00\x5a\x00\x33\x00\x37\x00\x5d\x00\x39\x00\x37\x00\x38\x00\x16\x00\x3d\x00\x09\x00\x3f\x00\x3d\x00\x41\x00\x3f\x00\x15\x00\x41\x00\x43\x00\x11\x00\x12\x00\x48\x00\x15\x00\x41\x00\x48\x00\x49\x00\x74\x00\x4b\x00\x46\x00\x40\x00\x48\x00\x42\x00\x7a\x00\x4b\x00\x15\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x15\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x74\x00\x3d\x00\x09\x00\x3f\x00\x5e\x00\x41\x00\x7a\x00\x61\x00\x62\x00\x63\x00\x11\x00\x12\x00\x66\x00\x40\x00\x68\x00\x42\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x09\x00\x09\x00\x42\x00\x12\x00\x09\x00\x09\x00\x0f\x00\x0f\x00\x10\x00\x09\x00\x7e\x00\x0f\x00\x1b\x00\x1c\x00\x7c\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x07\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x32\x00\x33\x00\x05\x00\x06\x00\x33\x00\x37\x00\x0b\x00\x39\x00\x37\x00\x38\x00\x09\x00\x3d\x00\x09\x00\x3f\x00\x3d\x00\x41\x00\x3f\x00\x74\x00\x41\x00\x09\x00\x11\x00\x12\x00\x48\x00\x7a\x00\x41\x00\x48\x00\x49\x00\x74\x00\x4b\x00\x46\x00\x45\x00\x48\x00\x43\x00\x7a\x00\x4b\x00\x09\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x44\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x35\x00\x3f\x00\x16\x00\x41\x00\x5e\x00\x16\x00\x3b\x00\x61\x00\x62\x00\x63\x00\x48\x00\x3e\x00\x66\x00\x40\x00\x68\x00\x42\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x00\x00\x01\x00\x05\x00\x06\x00\x09\x00\x09\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0f\x00\x10\x00\x16\x00\x11\x00\x16\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x16\x00\x1e\x00\x0a\x00\x0b\x00\x0c\x00\x26\x00\x0e\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x7c\x00\x7d\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x33\x00\x34\x00\x31\x00\x16\x00\x33\x00\x08\x00\x09\x00\x37\x00\x37\x00\x38\x00\x16\x00\x3a\x00\x0f\x00\x3d\x00\x3d\x00\x3f\x00\x3f\x00\x41\x00\x41\x00\x09\x00\x0b\x00\x44\x00\x0b\x00\x46\x00\x48\x00\x48\x00\x49\x00\x11\x00\x4b\x00\x00\x00\x01\x00\x09\x00\x0a\x00\x09\x00\x09\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0f\x00\x10\x00\x0b\x00\x11\x00\x06\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x26\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x09\x00\x1e\x00\x32\x00\x33\x00\x34\x00\x26\x00\x0f\x00\x10\x00\x09\x00\x2a\x00\x06\x00\x0c\x00\x0d\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x33\x00\x34\x00\x31\x00\x0b\x00\x33\x00\x09\x00\x0a\x00\x37\x00\x37\x00\x38\x00\x0b\x00\x3a\x00\x0b\x00\x3d\x00\x3d\x00\x3f\x00\x3f\x00\x41\x00\x41\x00\x09\x00\x0a\x00\x44\x00\x42\x00\x46\x00\x48\x00\x48\x00\x49\x00\x09\x00\x4b\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x01\x00\x5b\x00\x5c\x00\x5d\x00\x09\x00\x06\x00\x07\x00\x08\x00\x09\x00\x3d\x00\x7c\x00\x3f\x00\x11\x00\x41\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x7c\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x5e\x00\x1e\x00\x09\x00\x0a\x00\x62\x00\x26\x00\x64\x00\x65\x00\x7c\x00\x2a\x00\x08\x00\x01\x00\x08\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x33\x00\x34\x00\x31\x00\x09\x00\x33\x00\x08\x00\x0c\x00\x0d\x00\x37\x00\x38\x00\x12\x00\x3a\x00\x09\x00\x78\x00\x3d\x00\x0c\x00\x3f\x00\x0e\x00\x41\x00\x1b\x00\x1c\x00\x1d\x00\x09\x00\x46\x00\x09\x00\x48\x00\x49\x00\x0c\x00\x4b\x00\x0e\x00\x38\x00\x39\x00\x3a\x00\x09\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x5c\x00\x5d\x00\x31\x00\x32\x00\x33\x00\x01\x00\x5e\x00\x09\x00\x37\x00\x38\x00\x62\x00\x3a\x00\x64\x00\x65\x00\x3d\x00\x74\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x09\x00\x09\x00\x12\x00\x0c\x00\x0d\x00\x48\x00\x49\x00\x0f\x00\x4b\x00\x09\x00\x0a\x00\x1b\x00\x1c\x00\x1d\x00\x0a\x00\x0b\x00\x0c\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x05\x00\x06\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x05\x00\x06\x00\x31\x00\x32\x00\x33\x00\x01\x00\x76\x00\x09\x00\x37\x00\x38\x00\x0c\x00\x3a\x00\x0e\x00\x4c\x00\x3d\x00\x15\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x44\x00\x09\x00\x12\x00\x05\x00\x06\x00\x48\x00\x49\x00\x0f\x00\x4b\x00\x7c\x00\x7d\x00\x1b\x00\x1c\x00\x1d\x00\x05\x00\x06\x00\x25\x00\x26\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x09\x00\x09\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x00\x00\x01\x00\x11\x00\x32\x00\x33\x00\x01\x00\x0b\x00\x09\x00\x37\x00\x38\x00\x0c\x00\x3a\x00\x0e\x00\x3a\x00\x3d\x00\x15\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x0b\x00\x09\x00\x12\x00\x26\x00\x7c\x00\x48\x00\x49\x00\x02\x00\x4b\x00\x32\x00\x33\x00\x1b\x00\x1c\x00\x1d\x00\x37\x00\x32\x00\x33\x00\x34\x00\x3b\x00\x01\x00\x3d\x00\x43\x00\x3f\x00\x3e\x00\x41\x00\x09\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x48\x00\x48\x00\x11\x00\x32\x00\x33\x00\x01\x00\x43\x00\x09\x00\x37\x00\x38\x00\x0c\x00\x3a\x00\x0e\x00\x48\x00\x3d\x00\x43\x00\x3f\x00\x47\x00\x41\x00\x42\x00\x39\x00\x09\x00\x12\x00\x26\x00\x48\x00\x48\x00\x49\x00\x0f\x00\x4b\x00\x48\x00\x49\x00\x1b\x00\x1c\x00\x1d\x00\x42\x00\x32\x00\x33\x00\x34\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x01\x00\x42\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x03\x00\x03\x00\x03\x00\x32\x00\x33\x00\x2c\x00\x2d\x00\x2e\x00\x37\x00\x38\x00\x12\x00\x3a\x00\x48\x00\x03\x00\x3d\x00\x3e\x00\x3f\x00\x0f\x00\x41\x00\x1b\x00\x1c\x00\x1d\x00\x48\x00\x36\x00\x09\x00\x48\x00\x49\x00\x0c\x00\x4b\x00\x0e\x00\x43\x00\x43\x00\x43\x00\x09\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x48\x00\x42\x00\x11\x00\x32\x00\x33\x00\x01\x00\x48\x00\x47\x00\x37\x00\x38\x00\x47\x00\x3a\x00\x47\x00\x47\x00\x3d\x00\x47\x00\x3f\x00\x4a\x00\x41\x00\x42\x00\x4a\x00\x09\x00\x12\x00\x26\x00\x4a\x00\x48\x00\x49\x00\x0f\x00\x4b\x00\x4a\x00\x4a\x00\x1b\x00\x1c\x00\x1d\x00\x04\x00\x32\x00\x33\x00\x34\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x01\x00\x47\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x47\x00\x47\x00\x3c\x00\x32\x00\x33\x00\x2c\x00\x2d\x00\x2e\x00\x37\x00\x38\x00\x12\x00\x3a\x00\x3a\x00\x35\x00\x3d\x00\x3e\x00\x3f\x00\x35\x00\x41\x00\x1b\x00\x1c\x00\x1d\x00\x48\x00\x35\x00\x48\x00\x48\x00\x49\x00\x0d\x00\x4b\x00\x43\x00\x34\x00\x3e\x00\x34\x00\x09\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x48\x00\x48\x00\x11\x00\x32\x00\x33\x00\x01\x00\x3e\x00\x3e\x00\x37\x00\x38\x00\x0f\x00\x3a\x00\x04\x00\x43\x00\x3d\x00\x48\x00\x3f\x00\x42\x00\x41\x00\x42\x00\x05\x00\x09\x00\x12\x00\x26\x00\x4a\x00\x48\x00\x49\x00\x0f\x00\x4b\x00\x47\x00\x4a\x00\x1b\x00\x1c\x00\x1d\x00\x4a\x00\x32\x00\x33\x00\x34\x00\x1a\x00\x1b\x00\x48\x00\x1d\x00\x1e\x00\x1f\x00\x01\x00\x42\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x39\x00\x3e\x00\x39\x00\x32\x00\x33\x00\x39\x00\x39\x00\x39\x00\x37\x00\x38\x00\x12\x00\x3a\x00\x39\x00\x42\x00\x3d\x00\x3e\x00\x3f\x00\x42\x00\x41\x00\x1b\x00\x1c\x00\x1d\x00\x3e\x00\x34\x00\x09\x00\x48\x00\x49\x00\x36\x00\x4b\x00\x42\x00\x0f\x00\x48\x00\x01\x00\x42\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x32\x00\x33\x00\x3c\x00\x32\x00\x33\x00\x1d\x00\x1e\x00\x1f\x00\x37\x00\x38\x00\x12\x00\x3a\x00\x48\x00\x3f\x00\x3d\x00\x41\x00\x3f\x00\x48\x00\x41\x00\x1b\x00\x1c\x00\x43\x00\x48\x00\x4b\x00\x09\x00\x48\x00\x49\x00\x43\x00\x4b\x00\x43\x00\x0f\x00\x43\x00\x09\x00\x36\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x05\x00\x11\x00\x3c\x00\x01\x00\x33\x00\x1d\x00\x1e\x00\x1f\x00\x37\x00\x38\x00\x4a\x00\x3a\x00\x47\x00\x03\x00\x3d\x00\x48\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x12\x00\x3d\x00\x26\x00\x3d\x00\x3d\x00\x48\x00\x49\x00\x0c\x00\x4b\x00\x1b\x00\x1c\x00\x1d\x00\x30\x00\x31\x00\x09\x00\x33\x00\x34\x00\x02\x00\x4a\x00\x48\x00\x0f\x00\x02\x00\x01\x00\x41\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x39\x00\x39\x00\x3e\x00\x32\x00\x33\x00\x1d\x00\x1e\x00\x1f\x00\x37\x00\x38\x00\x12\x00\x3a\x00\x3e\x00\x42\x00\x3d\x00\x42\x00\x3f\x00\x42\x00\x41\x00\x1b\x00\x1c\x00\x35\x00\x39\x00\x43\x00\x4c\x00\x48\x00\x49\x00\x48\x00\x4b\x00\x3b\x00\x4c\x00\x09\x00\x1f\x00\x09\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x11\x00\x4c\x00\x11\x00\x01\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x12\x00\x26\x00\xff\xff\x26\x00\xff\xff\x48\x00\x49\x00\x2a\x00\x4b\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x32\x00\x33\x00\x34\x00\x33\x00\x34\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\x09\x00\xff\xff\x09\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x11\x00\xff\xff\x11\x00\x01\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x12\x00\x26\x00\xff\xff\x26\x00\xff\xff\x48\x00\x49\x00\x2a\x00\x4b\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x32\x00\x33\x00\x34\x00\x33\x00\x34\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\x09\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x11\x00\xff\xff\xff\xff\x01\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x12\x00\x26\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x01\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\x09\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x11\x00\xff\xff\xff\xff\x01\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x12\x00\x26\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\x1b\x00\x1c\x00\xff\xff\x31\x00\xff\xff\x33\x00\x34\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x01\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\xff\xff\x32\x00\x33\x00\x33\x00\xff\xff\xff\xff\x37\x00\x37\x00\x38\x00\x12\x00\x3a\x00\xff\xff\x3d\x00\x3d\x00\x3f\x00\x3f\x00\x41\x00\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\x48\x00\x48\x00\x49\x00\xff\xff\x4b\x00\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x33\x00\x41\x00\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\xff\xff\x48\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x33\x00\x41\x00\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\xff\xff\x48\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x33\x00\x41\x00\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\xff\xff\x48\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x33\x00\x41\x00\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\xff\xff\x48\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x33\x00\x41\x00\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\xff\xff\x48\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\x09\x00\xff\xff\xff\xff\xff\xff\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x11\x00\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x09\x00\x4b\x00\xff\xff\xff\xff\xff\xff\x31\x00\x0f\x00\x33\x00\x34\x00\xff\xff\x13\x00\x14\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x27\x00\x09\x00\xff\xff\x0b\x00\xff\xff\x2c\x00\x2d\x00\x0f\x00\x2f\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\x09\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\x09\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\x09\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\x09\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+
+happyTable :: HappyAddr
+happyTable = HappyA# "\x00\x00\x6d\x02\xad\x01\x73\x02\x53\x01\xeb\x00\xc5\x01\xcb\x01\xcc\x01\xc6\x01\xc7\x01\x12\x00\x1f\x02\xc5\x01\x8a\x02\x42\x00\xd4\x01\x43\x00\x83\x02\x97\x01\xec\x00\x15\x00\x16\x00\x17\x00\xe4\x00\x19\x00\x1a\x00\x1b\x00\x62\x01\x05\x00\x06\x00\xc5\x01\xcb\x01\xad\x01\xd4\x01\xb2\x01\xd5\x01\xcb\x01\xcc\x01\x0e\x00\x0f\x00\x79\x00\x63\x01\x46\x00\x7e\x02\x64\x01\x10\x00\x7a\x00\x47\x02\xc5\x01\x7f\x00\x3b\x01\xd4\x01\x33\x00\xd5\x01\xae\x01\xaf\x01\xb0\x01\x7f\x02\xcb\x01\xcc\x01\xed\x00\x20\x02\xd9\x00\xda\x00\xdb\x00\xee\x00\xdc\x00\xef\x00\xcd\x01\xc8\x01\xf0\x00\x87\x02\xf1\x00\xf2\x00\xf3\x00\xf4\x00\x6e\x02\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xae\x01\x98\x01\x3d\x02\x97\x01\xfd\x00\x33\x00\x33\x00\xfe\x00\xff\x00\x00\x01\xd6\x01\x7f\x00\x01\x01\xcd\x01\x02\x01\x11\x00\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x79\x00\x32\x02\x54\x02\xce\x01\xc9\x01\xeb\x00\x7a\x00\x47\x02\x07\x00\x45\x02\x6f\x02\x12\x00\x08\x00\xdd\x00\x09\x00\x0a\x00\x78\x02\x0b\x00\x25\x02\x0c\x00\xec\x00\x15\x00\x16\x00\x17\x00\xe4\x00\x19\x00\x1a\x00\x1b\x00\x07\x00\x62\x01\x11\x00\xd7\x01\x08\x00\xce\x01\x09\x00\x0a\x00\x12\x00\x0b\x00\x11\x00\x0c\x00\x21\x01\x53\x01\x8b\x02\x95\x01\x12\x00\x98\x01\x64\x01\x21\x02\x33\x00\x34\x00\x19\x00\x1a\x00\xcf\x00\x52\x00\xff\x01\x62\x01\x7f\x00\x66\x02\x19\x00\x1a\x00\xcf\x00\xed\x00\x90\x01\x23\x02\xf5\x01\x24\x01\xee\x00\x69\x02\xef\x00\x26\x02\x33\x00\xf0\x00\x64\x01\xf1\x00\xf2\x00\xf3\x00\xf4\x00\x6b\x02\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\x53\x01\x48\x02\xc5\x01\xad\x01\xfd\x00\xc6\x01\xc7\x01\xfe\x00\xff\x00\x00\x01\xb3\x01\x22\x02\x01\x01\x01\x02\x02\x01\xb3\x01\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\xeb\x00\x24\x02\xc3\x01\x8b\x01\x76\x02\x11\x00\x12\x00\x33\x00\x34\x00\x12\x00\x0d\x01\x12\x00\xaa\x01\x79\x02\xc4\x01\xec\x00\x15\x00\x16\x00\x17\x00\xe4\x00\x19\x00\x1a\x00\x1b\x00\x21\x01\x66\x00\x19\x00\x1a\x00\xcf\x00\x21\x01\x11\x00\xae\x01\x86\xff\xb2\x01\xe9\x01\xe4\x01\x12\x00\x3e\x02\xb5\x01\xb6\x01\x78\x00\x43\x02\xb4\x01\xb5\x01\xb6\x01\x86\xff\xe5\x01\x6f\x01\x23\x01\x24\x01\x46\x00\x66\x00\x22\x01\x23\x01\x24\x01\x46\x00\x50\x01\xed\x00\xdc\x01\x12\x02\x54\x01\x78\x00\xee\x00\x3e\x01\xef\x00\x78\x00\x12\x02\xf0\x00\x3f\x02\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xe4\x01\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\x2b\x00\x6e\x00\xe5\x01\x76\x00\xfd\x00\x40\x02\x77\x00\xfe\x00\xff\x00\x00\x01\xd0\x00\x64\x00\x01\x01\x6f\x00\x02\x01\x70\x00\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\xeb\x00\x79\x00\x19\x02\x22\x00\x1a\x02\x11\x00\x12\x00\x7a\x00\x7d\x00\x51\x02\x89\x02\x12\x00\x23\x00\x24\x00\x59\x02\xec\x00\x15\x00\x16\x00\x17\x00\xe4\x00\x19\x00\x1a\x00\x1b\x00\x5d\x02\x73\x00\x19\x00\x1a\x00\xe6\x01\x27\x00\x28\x00\x29\x00\x2a\x00\x27\xff\x27\xff\x61\x02\x5b\x02\x57\x00\x27\xff\x5c\x02\x27\xff\x2d\x00\x2e\x00\x03\x02\x27\xff\x46\x00\x27\xff\x68\x00\x27\xff\x78\x02\x06\x02\x75\x00\x0d\x02\xdc\x01\xdd\x01\x27\xff\x08\x02\xed\x00\x33\x00\x34\x00\x4b\x02\x35\x00\xee\x00\x42\x00\xef\x00\x43\x00\x7c\x02\xf0\x00\x09\x02\xf1\x00\xf2\x00\xf3\x00\xf4\x00\x0a\x02\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\x4b\x02\xe9\x00\x46\x00\xea\x00\xfd\x00\xeb\x00\x7d\x02\xfe\x00\xff\x00\x00\x01\xdc\x01\xde\x01\x01\x01\x42\x00\x02\x01\x43\x00\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\xeb\x00\x79\x00\x0e\x02\x22\x00\x15\x02\x11\x00\x12\x00\x7a\x00\xce\x00\x2f\x02\x0d\x01\x12\x00\x23\x00\x24\x00\x30\x02\xec\x00\x15\x00\x16\x00\x17\x00\xe4\x00\x19\x00\x1a\x00\x1b\x00\x33\x02\xe5\x01\x19\x00\x1a\x00\xe6\x01\x27\x00\x28\x00\x29\x00\x2a\x00\x50\x00\x51\x00\x80\x02\x95\x01\x57\x00\x52\x00\xac\x01\x41\xff\x2d\x00\x2e\x00\x37\x02\x45\x01\x46\x00\x46\x01\x68\x00\x47\x01\x69\x00\x4b\x02\x75\x00\x39\x02\xdc\x01\xdf\x01\x33\x00\x4c\x02\xed\x00\x33\x00\x34\x00\x4b\x02\x35\x00\xc4\x01\xc1\x01\xef\x00\xbe\x01\x4f\x02\xf0\x00\xcf\x01\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xe7\x01\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\x9d\x01\x17\x02\xe9\x01\x18\x02\xfd\x00\xeb\x01\x78\x00\xfe\x00\xff\x00\x00\x01\x33\x00\x7c\xff\x01\x01\x7c\xff\x02\x01\x7c\xff\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x97\x01\x21\x00\x81\x02\x82\x02\x79\x00\x46\x00\x0f\x01\x10\x01\x11\x01\x0f\x00\x7a\x00\x7b\x00\xec\x01\x47\x00\xed\x01\x12\x01\x13\x01\x14\x01\x15\x01\x71\x02\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x23\x00\x24\x00\xee\x01\x1d\x01\xd9\x00\xda\x00\xdb\x00\x48\x00\xdc\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\xb9\x01\x49\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x4d\x00\x4e\x00\x1e\x01\xef\x01\x1f\x01\x0e\x00\x0f\x00\x52\x00\x2d\x00\x2e\x00\xf0\x01\x2f\x00\x10\x00\xe9\x00\x68\x00\x3d\x01\x69\x00\x3e\x01\x75\x00\x46\x00\xfd\x01\x98\x01\xff\x01\x20\x01\x33\x00\x33\x00\x34\x00\x47\x00\x35\x00\x97\x01\x21\x00\xcb\x01\x55\x02\x79\x00\x46\x00\x0f\x01\x10\x01\x11\x01\x0f\x00\x7a\x00\x7c\x00\x01\x02\x47\x00\x60\x01\x12\x01\x13\x01\x14\x01\x15\x01\xdd\x00\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x23\x00\x24\x00\x79\x00\x1d\x01\x26\x02\xdf\x00\x62\x00\x41\x01\x7a\x00\x7d\x00\xc5\x01\x5a\x01\x64\x01\xc6\x01\x13\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x43\x01\x62\x00\x1e\x01\x67\x01\x1f\x01\xcb\x01\x56\x02\x52\x00\x2d\x00\x2e\x00\x6a\x01\x2f\x00\x6d\x01\x5b\x00\x68\x00\x40\x01\x69\x00\x41\x01\x75\x00\xcb\x01\x57\x02\x98\x01\x7f\x01\x20\x01\x33\x00\x33\x00\x34\x00\x81\x01\x35\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\x21\x00\xe0\x01\xe1\x01\xe2\x01\x46\x00\x0f\x01\x10\x01\x11\x01\x0f\x00\x5b\x00\x82\x01\x5c\x00\x47\x00\x5d\x00\x12\x01\x13\x01\x14\x01\x15\x01\x83\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x23\x00\x24\x00\x07\x00\x1d\x01\xcb\x01\x58\x02\x08\x00\x41\x01\x80\x00\x0a\x00\x84\x01\x5b\x01\x85\x01\x21\x00\x87\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x43\x01\x62\x00\x1e\x01\xc5\x01\x1f\x01\x88\x01\xc6\x01\x14\x02\x2d\x00\x2e\x00\x22\x00\x2f\x00\xc5\x01\x89\x01\x68\x00\xd4\x01\x69\x00\x84\x02\x75\x00\x23\x00\x24\x00\x25\x00\x8c\x01\x20\x01\xc5\x01\x33\x00\x34\x00\xd4\x01\x35\x00\x85\x02\xa3\x01\xd6\x00\xd7\x00\x8d\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x10\x02\xe2\x01\x7c\x02\x2b\x00\x2c\x00\x21\x00\x07\x00\x8e\x01\x2d\x00\x2e\x00\x08\x00\x2f\x00\x81\x00\x0a\x00\x30\x00\x90\x01\x31\x00\x42\x00\x32\x00\x43\x00\xc5\x01\x11\x00\x22\x00\xc6\x01\x2e\x02\x33\x00\x34\x00\x12\x00\x35\x00\xcb\x01\x2a\x02\x23\x00\x24\x00\x25\x00\xd9\x00\xda\x00\xdb\x00\xe3\x00\x16\x00\x17\x00\xe4\x00\x19\x00\x1a\x00\x1b\x00\x1a\x02\x1b\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x27\x02\x28\x02\xa9\x01\x2b\x00\x2c\x00\x21\x00\x92\x01\xc5\x01\x2d\x00\x2e\x00\xd4\x01\x2f\x00\x86\x02\x98\x01\x30\x00\x9d\x01\x31\x00\x42\x00\x32\x00\x43\x00\x9a\x01\x11\x00\x22\x00\x2b\x02\x2c\x02\x33\x00\x34\x00\x12\x00\x35\x00\xb9\x01\xba\x01\x23\x00\x24\x00\x25\x00\x94\x01\x95\x01\x6c\x00\x1f\x00\x72\x00\x17\x00\x73\x00\x19\x00\x1a\x00\x1b\x00\xa2\x01\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x35\x00\x04\x00\x47\x00\x2b\x00\x2c\x00\x21\x00\x4d\x01\xc5\x01\x2d\x00\x2e\x00\xd4\x01\x2f\x00\x67\x02\xa7\x01\x30\x00\xe0\x00\x31\x00\x42\x00\x32\x00\x43\x00\x4e\x01\x5d\x00\x22\x00\xdd\x00\x6a\x00\x33\x00\x34\x00\x82\x00\x35\x00\x50\x00\x51\x00\x23\x00\x24\x00\x25\x00\x52\x00\xd0\x01\xdf\x00\x62\x00\x78\x00\x04\x00\x64\x00\x4e\x02\x65\x00\x89\x02\x66\x00\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x33\x00\x33\x00\x47\x00\x2b\x00\x2c\x00\x21\x00\x53\x02\xc5\x01\x2d\x00\x2e\x00\xd4\x01\x2f\x00\x68\x02\xe5\x01\x30\x00\x6c\x00\x31\x00\x65\x02\x32\x00\x3d\x00\x66\x02\x11\x00\x22\x00\xdd\x00\xe5\x01\x33\x00\x34\x00\x12\x00\x35\x00\x33\x00\x34\x00\x23\x00\x24\x00\x25\x00\x6b\x02\xd1\x01\xdf\x00\x62\x00\xf8\x01\x17\x00\x34\x01\x19\x00\x1a\x00\x1b\x00\x21\x00\x6d\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x72\x02\x73\x02\x75\x02\x2b\x00\x2c\x00\xf9\x01\xfa\x01\xfb\x01\x2d\x00\x2e\x00\x22\x00\x2f\x00\x33\x00\x42\x02\x30\x00\x46\x00\x31\x00\xb8\x01\x32\x00\x23\x00\x24\x00\x25\x00\x33\x00\x47\x02\xc5\x01\x33\x00\x34\x00\xd4\x01\x35\x00\x1d\x02\xbc\x01\x4e\x02\x53\x02\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x33\x00\x5b\x02\x47\x00\x2b\x00\x2c\x00\x21\x00\xe5\x01\x5f\x02\x2d\x00\x2e\x00\x60\x02\x2f\x00\x61\x02\x63\x02\x30\x00\x64\x02\x31\x00\xe2\x00\x32\x00\x3d\x00\xeb\x01\x11\x00\x22\x00\xdd\x00\xe2\x00\x33\x00\x34\x00\x12\x00\x35\x00\x08\x02\xe2\x00\x23\x00\x24\x00\x25\x00\xc0\x01\xd2\x01\xdf\x00\x62\x00\xf8\x01\x17\x00\x34\x01\x19\x00\x1a\x00\x1b\x00\x21\x00\x05\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x06\x02\x0c\x02\x81\x01\x2b\x00\x2c\x00\xf9\x01\xfa\x01\xfc\x01\x2d\x00\x2e\x00\x22\x00\x2f\x00\x10\x02\x1d\x02\x30\x00\x46\x00\x31\x00\x2a\x02\x32\x00\x23\x00\x24\x00\x25\x00\x33\x00\x2e\x02\x33\x00\x33\x00\x34\x00\x35\x02\x35\x00\x6c\x00\x36\x02\x37\x02\x3c\x02\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x33\x00\x33\x00\x47\x00\x2b\x00\x2c\x00\x21\x00\x39\x02\x3b\x02\x2d\x00\x2e\x00\xb8\x01\x2f\x00\xc0\x01\xbc\x01\x30\x00\x33\x00\x31\x00\xf7\x01\x32\x00\x3d\x00\x9c\x01\x11\x00\x22\x00\xdd\x00\xeb\x01\x33\x00\x34\x00\x12\x00\x35\x00\xf2\x01\xf3\x01\x23\x00\x24\x00\x25\x00\xf4\x01\xd3\x01\xdf\x00\x62\x00\x72\x00\x17\x00\x33\x00\x19\x00\x1a\x00\xe7\x00\x21\x00\x03\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x43\xff\x67\x01\x44\xff\x2b\x00\x2c\x00\x40\xff\x3e\xff\x3f\xff\x2d\x00\x2e\x00\x22\x00\x2f\x00\x66\x01\x69\x01\x30\x00\x46\x00\x31\x00\x6c\x01\x32\x00\x23\x00\x24\x00\x25\x00\x6a\x01\x71\x01\x7e\x01\x33\x00\x34\x00\x73\x01\x35\x00\x6f\x01\x12\x00\x33\x00\x21\x00\x72\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xd9\x01\xda\x01\x81\x01\x2b\x00\x2c\x00\x19\x00\x1a\x00\x55\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x33\x00\xdb\x01\x30\x00\xdc\x01\x31\x00\x33\x00\x32\x00\x23\x00\x24\x00\x6c\x00\x33\x00\x87\x01\x11\x00\x33\x00\x34\x00\x8b\x01\x35\x00\x92\x01\x12\x00\x94\x01\x46\x00\x9a\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x9c\x01\x47\x00\x77\x00\x21\x00\x57\x00\x19\x00\x1a\x00\xe2\x00\x2d\x00\x2e\x00\xe2\x00\x2f\x00\x9f\x01\xa1\x01\x68\x00\x33\x00\x69\x00\x42\x00\x75\x00\x43\x00\x22\x00\xa5\x01\x5e\x00\xa6\x01\xa7\x01\x33\x00\x34\x00\xdb\x00\x35\x00\x23\x00\x24\x00\x25\x00\x5f\x00\x60\x00\x11\x00\x61\x00\x62\x00\x21\x01\xe2\x00\x33\x00\x12\x00\x2d\x01\x21\x00\x26\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2a\x01\x48\x01\x4b\x01\x2b\x00\x2c\x00\x19\x00\x1a\x00\x55\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x4c\x01\x4d\x01\x30\x00\x51\x01\x31\x00\x52\x01\x32\x00\x23\x00\x24\x00\x53\x01\x71\x00\x6c\x00\xff\xff\x33\x00\x34\x00\x33\x00\x35\x00\x78\x00\xff\xff\x46\x00\x79\x00\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x47\x00\xff\xff\x47\x00\x21\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x2f\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x42\x00\x75\x00\x43\x00\x22\x00\xdd\x00\x00\x00\x41\x01\x00\x00\x33\x00\x34\x00\x42\x01\x35\x00\x23\x00\x24\x00\x25\x00\x00\x00\x9f\x01\xdf\x00\x62\x00\x43\x01\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x00\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x32\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x00\x00\x00\x00\x46\x00\x00\x00\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x47\x00\x00\x00\x47\x00\x21\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x73\xff\x2f\x00\x00\x00\x73\xff\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x00\x00\x22\x00\xdd\x00\x00\x00\x41\x01\x00\x00\x33\x00\x34\x00\x49\x01\x35\x00\x23\x00\x24\x00\x25\x00\x00\x00\xa1\x01\xdf\x00\x62\x00\x43\x01\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x00\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x32\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x47\x00\x00\x00\x00\x00\x21\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x2f\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x58\x01\x22\x00\xdd\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x23\x00\x24\x00\x00\x00\x00\x00\xde\x00\xdf\x00\x62\x00\x7a\x02\xd4\x00\xd5\x00\xd6\x00\xd7\x00\x00\x00\x21\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x00\x00\x00\x00\x68\x00\x5a\x01\x69\x00\x00\x00\x75\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x47\x00\x00\x00\x00\x00\x21\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x2f\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x39\x01\x22\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x23\x00\x24\x00\x00\x00\x28\x01\x00\x00\x61\x00\x62\x00\x75\x02\xd4\x00\xd5\x00\xd6\x00\xd7\x00\x00\x00\x21\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x00\x00\x00\x00\x68\x00\x3b\x01\x69\x00\x00\x00\x75\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x3c\x02\xd4\x00\xd5\x00\xd6\x00\xd7\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x50\x00\x51\x00\x57\x00\x00\x00\x00\x00\x52\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x00\x00\x64\x00\x68\x00\x65\x00\x69\x00\x66\x00\x75\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x34\x00\x00\x00\x35\x00\x50\x00\x51\x00\x00\x00\x00\x00\x00\x00\x52\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x45\x01\x00\x00\x46\x01\x57\x00\x47\x01\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x00\x00\x33\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x6a\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x50\x00\x51\x00\x00\x00\x00\x00\x00\x00\x52\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x64\x00\x00\x00\x65\x00\x57\x00\x66\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x00\x00\x33\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x50\x00\x51\x00\x00\x00\x00\x00\x00\x00\x52\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x45\x01\x00\x00\x46\x01\x57\x00\x47\x01\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x00\x00\x33\x00\x00\x00\x68\x00\x00\x00\xd2\x00\x00\x00\x75\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x50\x00\x51\x00\x00\x00\x00\x00\x00\x00\x52\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x53\x00\x00\x00\x54\x00\x57\x00\x55\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x00\x00\x33\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x50\x00\x51\x00\x00\x00\x00\x00\x00\x00\x52\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x64\x00\x00\x00\x65\x00\x57\x00\x66\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x00\x00\x33\x00\x00\x00\x58\x00\x00\x00\x59\x00\x00\x00\x5a\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x47\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x11\x00\x35\x00\x00\x00\x00\x00\x00\x00\x2b\x01\x12\x00\x61\x00\x62\x00\x00\x00\x37\x00\x26\x01\xb8\x01\xd4\x00\xd5\x00\xd6\x00\xd7\x00\x33\x01\x17\x00\x34\x01\x19\x00\x1a\x00\x1b\x00\xab\x01\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\x00\x00\x3b\x00\x3d\x00\x00\x00\x3e\x00\x00\x00\x35\x01\x36\x01\x12\x00\x37\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x3f\x00\x14\x00\x15\x00\x3a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x31\x01\x3d\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x3f\x00\x14\x00\x15\x00\x3a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x36\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x40\x00\x12\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x39\x00\x14\x00\x15\x00\x3a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x11\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x30\x01\x12\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x43\x00\x14\x00\x15\x00\x3a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x36\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x32\x01\x12\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x39\x00\x14\x00\x15\x00\x3a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x11\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x3b\x00\x12\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x43\x00\x14\x00\x15\x00\x3a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x44\x00\x11\x00\x00\x00\x58\x01\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x27\x01\x38\x00\xa9\x01\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x39\x01\x00\x00\x00\x00\x00\x00\x12\x00\x40\x00\x00\x00\x00\x00\x27\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x40\x00\x00\x00\x00\x00\x37\x00\x26\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x3b\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x44\x00\x00\x00\x00\x00\x5c\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x2d\x01\x00\x00\x00\x00\x5d\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x2e\x01\x00\x00\x00\x00\x5e\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x30\x01\x00\x00\x00\x00\x5f\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x31\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x30\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x31\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x32\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x3b\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x40\x00\x00\x00\x00\x00\x37\x00\x26\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x3b\x00\x00\x00\x00\x00\x27\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x40\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x44\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x2d\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x2e\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x2f\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x3d\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x44\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\x3f\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x36\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x75\x01\x76\x01\x77\x01\x78\x01\x79\x01\x7a\x01\x7b\x01\x7c\x01\x7d\x01\x7e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+
+happyReduceArr = Happy_Data_Array.array (3, 370) [
+	(3 , happyReduce_3),
+	(4 , happyReduce_4),
+	(5 , happyReduce_5),
+	(6 , happyReduce_6),
+	(7 , happyReduce_7),
+	(8 , happyReduce_8),
+	(9 , happyReduce_9),
+	(10 , happyReduce_10),
+	(11 , happyReduce_11),
+	(12 , happyReduce_12),
+	(13 , happyReduce_13),
+	(14 , happyReduce_14),
+	(15 , happyReduce_15),
+	(16 , happyReduce_16),
+	(17 , happyReduce_17),
+	(18 , happyReduce_18),
+	(19 , happyReduce_19),
+	(20 , happyReduce_20),
+	(21 , happyReduce_21),
+	(22 , happyReduce_22),
+	(23 , happyReduce_23),
+	(24 , happyReduce_24),
+	(25 , happyReduce_25),
+	(26 , happyReduce_26),
+	(27 , happyReduce_27),
+	(28 , happyReduce_28),
+	(29 , happyReduce_29),
+	(30 , happyReduce_30),
+	(31 , happyReduce_31),
+	(32 , happyReduce_32),
+	(33 , happyReduce_33),
+	(34 , happyReduce_34),
+	(35 , happyReduce_35),
+	(36 , happyReduce_36),
+	(37 , happyReduce_37),
+	(38 , happyReduce_38),
+	(39 , happyReduce_39),
+	(40 , happyReduce_40),
+	(41 , happyReduce_41),
+	(42 , happyReduce_42),
+	(43 , happyReduce_43),
+	(44 , happyReduce_44),
+	(45 , happyReduce_45),
+	(46 , happyReduce_46),
+	(47 , happyReduce_47),
+	(48 , happyReduce_48),
+	(49 , happyReduce_49),
+	(50 , happyReduce_50),
+	(51 , happyReduce_51),
+	(52 , happyReduce_52),
+	(53 , happyReduce_53),
+	(54 , happyReduce_54),
+	(55 , happyReduce_55),
+	(56 , happyReduce_56),
+	(57 , happyReduce_57),
+	(58 , happyReduce_58),
+	(59 , happyReduce_59),
+	(60 , happyReduce_60),
+	(61 , happyReduce_61),
+	(62 , happyReduce_62),
+	(63 , happyReduce_63),
+	(64 , happyReduce_64),
+	(65 , happyReduce_65),
+	(66 , happyReduce_66),
+	(67 , happyReduce_67),
+	(68 , happyReduce_68),
+	(69 , happyReduce_69),
+	(70 , happyReduce_70),
+	(71 , happyReduce_71),
+	(72 , happyReduce_72),
+	(73 , happyReduce_73),
+	(74 , happyReduce_74),
+	(75 , happyReduce_75),
+	(76 , happyReduce_76),
+	(77 , happyReduce_77),
+	(78 , happyReduce_78),
+	(79 , happyReduce_79),
+	(80 , happyReduce_80),
+	(81 , happyReduce_81),
+	(82 , happyReduce_82),
+	(83 , happyReduce_83),
+	(84 , happyReduce_84),
+	(85 , happyReduce_85),
+	(86 , happyReduce_86),
+	(87 , happyReduce_87),
+	(88 , happyReduce_88),
+	(89 , happyReduce_89),
+	(90 , happyReduce_90),
+	(91 , happyReduce_91),
+	(92 , happyReduce_92),
+	(93 , happyReduce_93),
+	(94 , happyReduce_94),
+	(95 , happyReduce_95),
+	(96 , happyReduce_96),
+	(97 , happyReduce_97),
+	(98 , happyReduce_98),
+	(99 , happyReduce_99),
+	(100 , happyReduce_100),
+	(101 , happyReduce_101),
+	(102 , happyReduce_102),
+	(103 , happyReduce_103),
+	(104 , happyReduce_104),
+	(105 , happyReduce_105),
+	(106 , happyReduce_106),
+	(107 , happyReduce_107),
+	(108 , happyReduce_108),
+	(109 , happyReduce_109),
+	(110 , happyReduce_110),
+	(111 , happyReduce_111),
+	(112 , happyReduce_112),
+	(113 , happyReduce_113),
+	(114 , happyReduce_114),
+	(115 , happyReduce_115),
+	(116 , happyReduce_116),
+	(117 , happyReduce_117),
+	(118 , happyReduce_118),
+	(119 , happyReduce_119),
+	(120 , happyReduce_120),
+	(121 , happyReduce_121),
+	(122 , happyReduce_122),
+	(123 , happyReduce_123),
+	(124 , happyReduce_124),
+	(125 , happyReduce_125),
+	(126 , happyReduce_126),
+	(127 , happyReduce_127),
+	(128 , happyReduce_128),
+	(129 , happyReduce_129),
+	(130 , happyReduce_130),
+	(131 , happyReduce_131),
+	(132 , happyReduce_132),
+	(133 , happyReduce_133),
+	(134 , happyReduce_134),
+	(135 , happyReduce_135),
+	(136 , happyReduce_136),
+	(137 , happyReduce_137),
+	(138 , happyReduce_138),
+	(139 , happyReduce_139),
+	(140 , happyReduce_140),
+	(141 , happyReduce_141),
+	(142 , happyReduce_142),
+	(143 , happyReduce_143),
+	(144 , happyReduce_144),
+	(145 , happyReduce_145),
+	(146 , happyReduce_146),
+	(147 , happyReduce_147),
+	(148 , happyReduce_148),
+	(149 , happyReduce_149),
+	(150 , happyReduce_150),
+	(151 , happyReduce_151),
+	(152 , happyReduce_152),
+	(153 , happyReduce_153),
+	(154 , happyReduce_154),
+	(155 , happyReduce_155),
+	(156 , happyReduce_156),
+	(157 , happyReduce_157),
+	(158 , happyReduce_158),
+	(159 , happyReduce_159),
+	(160 , happyReduce_160),
+	(161 , happyReduce_161),
+	(162 , happyReduce_162),
+	(163 , happyReduce_163),
+	(164 , happyReduce_164),
+	(165 , happyReduce_165),
+	(166 , happyReduce_166),
+	(167 , happyReduce_167),
+	(168 , happyReduce_168),
+	(169 , happyReduce_169),
+	(170 , happyReduce_170),
+	(171 , happyReduce_171),
+	(172 , happyReduce_172),
+	(173 , happyReduce_173),
+	(174 , happyReduce_174),
+	(175 , happyReduce_175),
+	(176 , happyReduce_176),
+	(177 , happyReduce_177),
+	(178 , happyReduce_178),
+	(179 , happyReduce_179),
+	(180 , happyReduce_180),
+	(181 , happyReduce_181),
+	(182 , happyReduce_182),
+	(183 , happyReduce_183),
+	(184 , happyReduce_184),
+	(185 , happyReduce_185),
+	(186 , happyReduce_186),
+	(187 , happyReduce_187),
+	(188 , happyReduce_188),
+	(189 , happyReduce_189),
+	(190 , happyReduce_190),
+	(191 , happyReduce_191),
+	(192 , happyReduce_192),
+	(193 , happyReduce_193),
+	(194 , happyReduce_194),
+	(195 , happyReduce_195),
+	(196 , happyReduce_196),
+	(197 , happyReduce_197),
+	(198 , happyReduce_198),
+	(199 , happyReduce_199),
+	(200 , happyReduce_200),
+	(201 , happyReduce_201),
+	(202 , happyReduce_202),
+	(203 , happyReduce_203),
+	(204 , happyReduce_204),
+	(205 , happyReduce_205),
+	(206 , happyReduce_206),
+	(207 , happyReduce_207),
+	(208 , happyReduce_208),
+	(209 , happyReduce_209),
+	(210 , happyReduce_210),
+	(211 , happyReduce_211),
+	(212 , happyReduce_212),
+	(213 , happyReduce_213),
+	(214 , happyReduce_214),
+	(215 , happyReduce_215),
+	(216 , happyReduce_216),
+	(217 , happyReduce_217),
+	(218 , happyReduce_218),
+	(219 , happyReduce_219),
+	(220 , happyReduce_220),
+	(221 , happyReduce_221),
+	(222 , happyReduce_222),
+	(223 , happyReduce_223),
+	(224 , happyReduce_224),
+	(225 , happyReduce_225),
+	(226 , happyReduce_226),
+	(227 , happyReduce_227),
+	(228 , happyReduce_228),
+	(229 , happyReduce_229),
+	(230 , happyReduce_230),
+	(231 , happyReduce_231),
+	(232 , happyReduce_232),
+	(233 , happyReduce_233),
+	(234 , happyReduce_234),
+	(235 , happyReduce_235),
+	(236 , happyReduce_236),
+	(237 , happyReduce_237),
+	(238 , happyReduce_238),
+	(239 , happyReduce_239),
+	(240 , happyReduce_240),
+	(241 , happyReduce_241),
+	(242 , happyReduce_242),
+	(243 , happyReduce_243),
+	(244 , happyReduce_244),
+	(245 , happyReduce_245),
+	(246 , happyReduce_246),
+	(247 , happyReduce_247),
+	(248 , happyReduce_248),
+	(249 , happyReduce_249),
+	(250 , happyReduce_250),
+	(251 , happyReduce_251),
+	(252 , happyReduce_252),
+	(253 , happyReduce_253),
+	(254 , happyReduce_254),
+	(255 , happyReduce_255),
+	(256 , happyReduce_256),
+	(257 , happyReduce_257),
+	(258 , happyReduce_258),
+	(259 , happyReduce_259),
+	(260 , happyReduce_260),
+	(261 , happyReduce_261),
+	(262 , happyReduce_262),
+	(263 , happyReduce_263),
+	(264 , happyReduce_264),
+	(265 , happyReduce_265),
+	(266 , happyReduce_266),
+	(267 , happyReduce_267),
+	(268 , happyReduce_268),
+	(269 , happyReduce_269),
+	(270 , happyReduce_270),
+	(271 , happyReduce_271),
+	(272 , happyReduce_272),
+	(273 , happyReduce_273),
+	(274 , happyReduce_274),
+	(275 , happyReduce_275),
+	(276 , happyReduce_276),
+	(277 , happyReduce_277),
+	(278 , happyReduce_278),
+	(279 , happyReduce_279),
+	(280 , happyReduce_280),
+	(281 , happyReduce_281),
+	(282 , happyReduce_282),
+	(283 , happyReduce_283),
+	(284 , happyReduce_284),
+	(285 , happyReduce_285),
+	(286 , happyReduce_286),
+	(287 , happyReduce_287),
+	(288 , happyReduce_288),
+	(289 , happyReduce_289),
+	(290 , happyReduce_290),
+	(291 , happyReduce_291),
+	(292 , happyReduce_292),
+	(293 , happyReduce_293),
+	(294 , happyReduce_294),
+	(295 , happyReduce_295),
+	(296 , happyReduce_296),
+	(297 , happyReduce_297),
+	(298 , happyReduce_298),
+	(299 , happyReduce_299),
+	(300 , happyReduce_300),
+	(301 , happyReduce_301),
+	(302 , happyReduce_302),
+	(303 , happyReduce_303),
+	(304 , happyReduce_304),
+	(305 , happyReduce_305),
+	(306 , happyReduce_306),
+	(307 , happyReduce_307),
+	(308 , happyReduce_308),
+	(309 , happyReduce_309),
+	(310 , happyReduce_310),
+	(311 , happyReduce_311),
+	(312 , happyReduce_312),
+	(313 , happyReduce_313),
+	(314 , happyReduce_314),
+	(315 , happyReduce_315),
+	(316 , happyReduce_316),
+	(317 , happyReduce_317),
+	(318 , happyReduce_318),
+	(319 , happyReduce_319),
+	(320 , happyReduce_320),
+	(321 , happyReduce_321),
+	(322 , happyReduce_322),
+	(323 , happyReduce_323),
+	(324 , happyReduce_324),
+	(325 , happyReduce_325),
+	(326 , happyReduce_326),
+	(327 , happyReduce_327),
+	(328 , happyReduce_328),
+	(329 , happyReduce_329),
+	(330 , happyReduce_330),
+	(331 , happyReduce_331),
+	(332 , happyReduce_332),
+	(333 , happyReduce_333),
+	(334 , happyReduce_334),
+	(335 , happyReduce_335),
+	(336 , happyReduce_336),
+	(337 , happyReduce_337),
+	(338 , happyReduce_338),
+	(339 , happyReduce_339),
+	(340 , happyReduce_340),
+	(341 , happyReduce_341),
+	(342 , happyReduce_342),
+	(343 , happyReduce_343),
+	(344 , happyReduce_344),
+	(345 , happyReduce_345),
+	(346 , happyReduce_346),
+	(347 , happyReduce_347),
+	(348 , happyReduce_348),
+	(349 , happyReduce_349),
+	(350 , happyReduce_350),
+	(351 , happyReduce_351),
+	(352 , happyReduce_352),
+	(353 , happyReduce_353),
+	(354 , happyReduce_354),
+	(355 , happyReduce_355),
+	(356 , happyReduce_356),
+	(357 , happyReduce_357),
+	(358 , happyReduce_358),
+	(359 , happyReduce_359),
+	(360 , happyReduce_360),
+	(361 , happyReduce_361),
+	(362 , happyReduce_362),
+	(363 , happyReduce_363),
+	(364 , happyReduce_364),
+	(365 , happyReduce_365),
+	(366 , happyReduce_366),
+	(367 , happyReduce_367),
+	(368 , happyReduce_368),
+	(369 , happyReduce_369),
+	(370 , happyReduce_370)
+	]
+
+happy_n_terms = 77 :: Int
+happy_n_nonterms = 127 :: Int
+
+happyReduce_3 = happySpecReduce_1  0# happyReduction_3
+happyReduction_3 happy_x_1
+	 =  case happyOut7 happy_x_1 of { happy_var_1 -> 
+	happyIn6
+		 (reverse happy_var_1
+	)}
+
+happyReduce_4 = happySpecReduce_2  1# happyReduction_4
+happyReduction_4 happy_x_2
+	happy_x_1
+	 =  case happyOut7 happy_x_1 of { happy_var_1 -> 
+	case happyOut8 happy_x_2 of { happy_var_2 -> 
+	happyIn7
+		 (happy_var_2 : happy_var_1
+	)}}
+
+happyReduce_5 = happySpecReduce_0  1# happyReduction_5
+happyReduction_5  =  happyIn7
+		 ([]
+	)
+
+happyReduce_6 = happySpecReduce_1  2# happyReduction_6
+happyReduction_6 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwLet happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwLet happy_var_1
+	)}
+
+happyReduce_7 = happySpecReduce_1  2# happyReduction_7
+happyReduction_7 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwIn happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwIn happy_var_1
+	)}
+
+happyReduce_8 = happySpecReduce_1  2# happyReduction_8
+happyReduction_8 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwWhere happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwWhere happy_var_1
+	)}
+
+happyReduce_9 = happySpecReduce_1  2# happyReduction_9
+happyReduction_9 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwWith happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwWith happy_var_1
+	)}
+
+happyReduce_10 = happySpecReduce_1  2# happyReduction_10
+happyReduction_10 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwRewrite happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwRewrite happy_var_1
+	)}
+
+happyReduce_11 = happySpecReduce_1  2# happyReduction_11
+happyReduction_11 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwPostulate happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwPostulate happy_var_1
+	)}
+
+happyReduce_12 = happySpecReduce_1  2# happyReduction_12
+happyReduction_12 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwPrimitive happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwPrimitive happy_var_1
+	)}
+
+happyReduce_13 = happySpecReduce_1  2# happyReduction_13
+happyReduction_13 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwOpen happy_var_1
+	)}
+
+happyReduce_14 = happySpecReduce_1  2# happyReduction_14
+happyReduction_14 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwImport happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwImport happy_var_1
+	)}
+
+happyReduce_15 = happySpecReduce_1  2# happyReduction_15
+happyReduction_15 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwUsing happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwUsing happy_var_1
+	)}
+
+happyReduce_16 = happySpecReduce_1  2# happyReduction_16
+happyReduction_16 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwHiding happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwHiding happy_var_1
+	)}
+
+happyReduce_17 = happySpecReduce_1  2# happyReduction_17
+happyReduction_17 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwRenaming happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwRenaming happy_var_1
+	)}
+
+happyReduce_18 = happySpecReduce_1  2# happyReduction_18
+happyReduction_18 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwTo happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwTo happy_var_1
+	)}
+
+happyReduce_19 = happySpecReduce_1  2# happyReduction_19
+happyReduction_19 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwPublic happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwPublic happy_var_1
+	)}
+
+happyReduce_20 = happySpecReduce_1  2# happyReduction_20
+happyReduction_20 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwModule happy_var_1
+	)}
+
+happyReduce_21 = happySpecReduce_1  2# happyReduction_21
+happyReduction_21 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwData happy_var_1
+	)}
+
+happyReduce_22 = happySpecReduce_1  2# happyReduction_22
+happyReduction_22 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwCoData happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwCoData happy_var_1
+	)}
+
+happyReduce_23 = happySpecReduce_1  2# happyReduction_23
+happyReduction_23 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwRecord happy_var_1
+	)}
+
+happyReduce_24 = happySpecReduce_1  2# happyReduction_24
+happyReduction_24 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwConstructor happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwConstructor happy_var_1
+	)}
+
+happyReduce_25 = happySpecReduce_1  2# happyReduction_25
+happyReduction_25 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwField happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwField happy_var_1
+	)}
+
+happyReduce_26 = happySpecReduce_1  2# happyReduction_26
+happyReduction_26 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwInfix happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwInfix happy_var_1
+	)}
+
+happyReduce_27 = happySpecReduce_1  2# happyReduction_27
+happyReduction_27 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwInfixL happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwInfixL happy_var_1
+	)}
+
+happyReduce_28 = happySpecReduce_1  2# happyReduction_28
+happyReduction_28 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwInfixR happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwInfixR happy_var_1
+	)}
+
+happyReduce_29 = happySpecReduce_1  2# happyReduction_29
+happyReduction_29 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwMutual happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwMutual happy_var_1
+	)}
+
+happyReduce_30 = happySpecReduce_1  2# happyReduction_30
+happyReduction_30 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwAbstract happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwAbstract happy_var_1
+	)}
+
+happyReduce_31 = happySpecReduce_1  2# happyReduction_31
+happyReduction_31 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwPrivate happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwPrivate happy_var_1
+	)}
+
+happyReduce_32 = happySpecReduce_1  2# happyReduction_32
+happyReduction_32 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwProp happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwProp happy_var_1
+	)}
+
+happyReduce_33 = happySpecReduce_1  2# happyReduction_33
+happyReduction_33 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwSet happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwSet happy_var_1
+	)}
+
+happyReduce_34 = happySpecReduce_1  2# happyReduction_34
+happyReduction_34 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwForall happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwForall happy_var_1
+	)}
+
+happyReduce_35 = happySpecReduce_1  2# happyReduction_35
+happyReduction_35 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwSyntax happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwSyntax happy_var_1
+	)}
+
+happyReduce_36 = happySpecReduce_1  2# happyReduction_36
+happyReduction_36 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwOPTIONS happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwOPTIONS happy_var_1
+	)}
+
+happyReduce_37 = happySpecReduce_1  2# happyReduction_37
+happyReduction_37 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwBUILTIN happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwBUILTIN happy_var_1
+	)}
+
+happyReduce_38 = happySpecReduce_1  2# happyReduction_38
+happyReduction_38 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwIMPORT happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwIMPORT happy_var_1
+	)}
+
+happyReduce_39 = happySpecReduce_1  2# happyReduction_39
+happyReduction_39 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwCOMPILED happy_var_1
+	)}
+
+happyReduce_40 = happySpecReduce_1  2# happyReduction_40
+happyReduction_40 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_DATA happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwCOMPILED_DATA happy_var_1
+	)}
+
+happyReduce_41 = happySpecReduce_1  2# happyReduction_41
+happyReduction_41 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_TYPE happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwCOMPILED_TYPE happy_var_1
+	)}
+
+happyReduce_42 = happySpecReduce_1  2# happyReduction_42
+happyReduction_42 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_EPIC happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwCOMPILED_EPIC happy_var_1
+	)}
+
+happyReduce_43 = happySpecReduce_1  2# happyReduction_43
+happyReduction_43 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_JS happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwCOMPILED_JS happy_var_1
+	)}
+
+happyReduce_44 = happySpecReduce_1  2# happyReduction_44
+happyReduction_44 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwSTATIC happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwSTATIC happy_var_1
+	)}
+
+happyReduce_45 = happySpecReduce_1  2# happyReduction_45
+happyReduction_45 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwIMPOSSIBLE happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwIMPOSSIBLE happy_var_1
+	)}
+
+happyReduce_46 = happySpecReduce_1  2# happyReduction_46
+happyReduction_46 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwETA happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwETA happy_var_1
+	)}
+
+happyReduce_47 = happySpecReduce_1  2# happyReduction_47
+happyReduction_47 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwQuoteGoal happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwQuoteGoal happy_var_1
+	)}
+
+happyReduce_48 = happySpecReduce_1  2# happyReduction_48
+happyReduction_48 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwQuote happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwQuote happy_var_1
+	)}
+
+happyReduce_49 = happySpecReduce_1  2# happyReduction_49
+happyReduction_49 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwQuoteTerm happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwQuoteTerm happy_var_1
+	)}
+
+happyReduce_50 = happySpecReduce_1  2# happyReduction_50
+happyReduction_50 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwUnquote happy_var_1) -> 
+	happyIn8
+		 (TokKeyword KwUnquote happy_var_1
+	)}
+
+happyReduce_51 = happySpecReduce_1  2# happyReduction_51
+happyReduction_51 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSetN happy_var_1) -> 
+	happyIn8
+		 (TokSetN happy_var_1
+	)}
+
+happyReduce_52 = happySpecReduce_1  2# happyReduction_52
+happyReduction_52 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokTeX happy_var_1) -> 
+	happyIn8
+		 (TokTeX happy_var_1
+	)}
+
+happyReduce_53 = happySpecReduce_1  2# happyReduction_53
+happyReduction_53 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokComment happy_var_1) -> 
+	happyIn8
+		 (TokComment happy_var_1
+	)}
+
+happyReduce_54 = happySpecReduce_1  2# happyReduction_54
+happyReduction_54 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymEllipsis happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymEllipsis happy_var_1
+	)}
+
+happyReduce_55 = happySpecReduce_1  2# happyReduction_55
+happyReduction_55 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymDotDot happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymDotDot happy_var_1
+	)}
+
+happyReduce_56 = happySpecReduce_1  2# happyReduction_56
+happyReduction_56 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymDot happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymDot happy_var_1
+	)}
+
+happyReduce_57 = happySpecReduce_1  2# happyReduction_57
+happyReduction_57 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymSemi happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymSemi happy_var_1
+	)}
+
+happyReduce_58 = happySpecReduce_1  2# happyReduction_58
+happyReduction_58 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymColon happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymColon happy_var_1
+	)}
+
+happyReduce_59 = happySpecReduce_1  2# happyReduction_59
+happyReduction_59 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymEqual happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymEqual happy_var_1
+	)}
+
+happyReduce_60 = happySpecReduce_1  2# happyReduction_60
+happyReduction_60 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymUnderscore happy_var_1
+	)}
+
+happyReduce_61 = happySpecReduce_1  2# happyReduction_61
+happyReduction_61 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymQuestionMark happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymQuestionMark happy_var_1
+	)}
+
+happyReduce_62 = happySpecReduce_1  2# happyReduction_62
+happyReduction_62 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymArrow happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymArrow happy_var_1
+	)}
+
+happyReduce_63 = happySpecReduce_1  2# happyReduction_63
+happyReduction_63 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymLambda happy_var_1
+	)}
+
+happyReduce_64 = happySpecReduce_1  2# happyReduction_64
+happyReduction_64 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymAs happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymAs happy_var_1
+	)}
+
+happyReduce_65 = happySpecReduce_1  2# happyReduction_65
+happyReduction_65 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymBar happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymBar happy_var_1
+	)}
+
+happyReduce_66 = happySpecReduce_1  2# happyReduction_66
+happyReduction_66 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymOpenParen happy_var_1
+	)}
+
+happyReduce_67 = happySpecReduce_1  2# happyReduction_67
+happyReduction_67 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymCloseParen happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymCloseParen happy_var_1
+	)}
+
+happyReduce_68 = happySpecReduce_1  2# happyReduction_68
+happyReduction_68 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymDoubleOpenBrace happy_var_1
+	)}
+
+happyReduce_69 = happySpecReduce_1  2# happyReduction_69
+happyReduction_69 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymDoubleCloseBrace happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymDoubleCloseBrace happy_var_1
+	)}
+
+happyReduce_70 = happySpecReduce_1  2# happyReduction_70
+happyReduction_70 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymOpenBrace happy_var_1
+	)}
+
+happyReduce_71 = happySpecReduce_1  2# happyReduction_71
+happyReduction_71 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymCloseBrace happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymCloseBrace happy_var_1
+	)}
+
+happyReduce_72 = happySpecReduce_1  2# happyReduction_72
+happyReduction_72 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenVirtualBrace happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymOpenVirtualBrace happy_var_1
+	)}
+
+happyReduce_73 = happySpecReduce_1  2# happyReduction_73
+happyReduction_73 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymCloseVirtualBrace happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymCloseVirtualBrace happy_var_1
+	)}
+
+happyReduce_74 = happySpecReduce_1  2# happyReduction_74
+happyReduction_74 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymVirtualSemi happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymVirtualSemi happy_var_1
+	)}
+
+happyReduce_75 = happySpecReduce_1  2# happyReduction_75
+happyReduction_75 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymOpenPragma happy_var_1
+	)}
+
+happyReduce_76 = happySpecReduce_1  2# happyReduction_76
+happyReduction_76 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymClosePragma happy_var_1) -> 
+	happyIn8
+		 (TokSymbol SymClosePragma happy_var_1
+	)}
+
+happyReduce_77 = happySpecReduce_1  2# happyReduction_77
+happyReduction_77 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokId happy_var_1) -> 
+	happyIn8
+		 (TokId happy_var_1
+	)}
+
+happyReduce_78 = happySpecReduce_1  2# happyReduction_78
+happyReduction_78 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokQId happy_var_1) -> 
+	happyIn8
+		 (TokQId happy_var_1
+	)}
+
+happyReduce_79 = happySpecReduce_1  2# happyReduction_79
+happyReduction_79 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokString happy_var_1) -> 
+	happyIn8
+		 (TokString happy_var_1
+	)}
+
+happyReduce_80 = happySpecReduce_1  2# happyReduction_80
+happyReduction_80 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> 
+	happyIn8
+		 (TokLiteral happy_var_1
+	)}
+
+happyReduce_81 = happySpecReduce_1  3# happyReduction_81
+happyReduction_81 happy_x_1
+	 =  case happyOut10 happy_x_1 of { happy_var_1 -> 
+	happyIn9
+		 (happy_var_1
+	)}
+
+happyReduce_82 = happySpecReduce_1  4# happyReduction_82
+happyReduction_82 happy_x_1
+	 =  case happyOut106 happy_x_1 of { happy_var_1 -> 
+	happyIn10
+		 (([], happy_var_1)
+	)}
+
+happyReduce_83 = happySpecReduce_2  4# happyReduction_83
+happyReduction_83 happy_x_2
+	happy_x_1
+	 =  case happyOut109 happy_x_1 of { happy_var_1 -> 
+	case happyOut10 happy_x_2 of { happy_var_2 -> 
+	happyIn10
+		 (let (ps,m) = happy_var_2 in (happy_var_1 : ps, m)
+	)}}
+
+happyReduce_84 = happySpecReduce_1  5# happyReduction_84
+happyReduction_84 happy_x_1
+	 =  happyIn11
+		 (()
+	)
+
+happyReduce_85 = happyMonadReduce 1# 5# happyReduction_85
+happyReduction_85 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (( popContext)
+	) (\r -> happyReturn (happyIn11 r))
+
+happyReduce_86 = happySpecReduce_1  6# happyReduction_86
+happyReduction_86 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymSemi happy_var_1) -> 
+	happyIn12
+		 (happy_var_1
+	)}
+
+happyReduce_87 = happySpecReduce_1  6# happyReduction_87
+happyReduction_87 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymVirtualSemi happy_var_1) -> 
+	happyIn12
+		 (happy_var_1
+	)}
+
+happyReduce_88 = happyMonadReduce 0# 7# happyReduction_88
+happyReduction_88 (happyRest) tk
+	 = happyThen (( pushLexState imp_dir)
+	) (\r -> happyReturn (happyIn13 r))
+
+happyReduce_89 = happyMonadReduce 1# 8# happyReduction_89
+happyReduction_89 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> 
+	( case happy_var_1 of {
+		     LitInt _ n	-> return n;
+		     _		-> fail $ "Expected integer"
+		   })}
+	) (\r -> happyReturn (happyIn14 r))
+
+happyReduce_90 = happyMonadReduce 1# 9# happyReduction_90
+happyReduction_90 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (TokId happy_var_1) -> 
+	( mkName happy_var_1)}
+	) (\r -> happyReturn (happyIn15 r))
+
+happyReduce_91 = happySpecReduce_2  10# happyReduction_91
+happyReduction_91 happy_x_2
+	happy_x_1
+	 =  case happyOut15 happy_x_1 of { happy_var_1 -> 
+	case happyOut16 happy_x_2 of { happy_var_2 -> 
+	happyIn16
+		 (happy_var_1 : happy_var_2
+	)}}
+
+happyReduce_92 = happySpecReduce_1  10# happyReduction_92
+happyReduction_92 happy_x_1
+	 =  case happyOut15 happy_x_1 of { happy_var_1 -> 
+	happyIn16
+		 ([happy_var_1]
+	)}
+
+happyReduce_93 = happySpecReduce_1  11# happyReduction_93
+happyReduction_93 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymDoubleCloseBrace happy_var_1) -> 
+	happyIn17
+		 (getRange happy_var_1
+	)}
+
+happyReduce_94 = happyMonadReduce 2# 11# happyReduction_94
+happyReduction_94 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymCloseBrace happy_var_1) -> 
+	case happyOutTok happy_x_2 of { (TokSymbol SymCloseBrace happy_var_2) -> 
+	(
+      if posPos (fromJust (rEnd (getRange happy_var_2))) -
+	 posPos (fromJust (rStart (getRange happy_var_1))) > 2
+      then parseErrorAt (fromJust (rStart (getRange happy_var_2)))
+	 "Expecting '}}', found separated '}'s."
+      else return $ fuseRange (getRange happy_var_1) (getRange (happy_var_2)))}}
+	) (\r -> happyReturn (happyIn17 r))
+
+happyReduce_95 = happySpecReduce_2  12# happyReduction_95
+happyReduction_95 happy_x_2
+	happy_x_1
+	 =  case happyOut15 happy_x_2 of { happy_var_2 -> 
+	happyIn18
+		 (Arg NotHidden Irrelevant happy_var_2
+	)}
+
+happyReduce_96 = happySpecReduce_1  12# happyReduction_96
+happyReduction_96 happy_x_1
+	 =  case happyOut15 happy_x_1 of { happy_var_1 -> 
+	happyIn18
+		 (defaultArg happy_var_1
+	)}
+
+happyReduce_97 = happySpecReduce_2  13# happyReduction_97
+happyReduction_97 happy_x_2
+	happy_x_1
+	 =  case happyOut18 happy_x_1 of { happy_var_1 -> 
+	case happyOut19 happy_x_2 of { happy_var_2 -> 
+	happyIn19
+		 (happy_var_1 : happy_var_2
+	)}}
+
+happyReduce_98 = happySpecReduce_1  13# happyReduction_98
+happyReduction_98 happy_x_1
+	 =  case happyOut18 happy_x_1 of { happy_var_1 -> 
+	happyIn19
+		 ([happy_var_1]
+	)}
+
+happyReduce_99 = happySpecReduce_2  14# happyReduction_99
+happyReduction_99 happy_x_2
+	happy_x_1
+	 =  case happyOut18 happy_x_1 of { happy_var_1 -> 
+	case happyOut20 happy_x_2 of { happy_var_2 -> 
+	happyIn20
+		 (happy_var_1 : happy_var_2
+	)}}
+
+happyReduce_100 = happySpecReduce_1  14# happyReduction_100
+happyReduction_100 happy_x_1
+	 =  case happyOut18 happy_x_1 of { happy_var_1 -> 
+	happyIn20
+		 ([happy_var_1]
+	)}
+
+happyReduce_101 = happyReduce 4# 14# happyReduction_101
+happyReduction_101 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut19 happy_x_2 of { happy_var_2 -> 
+	case happyOut20 happy_x_4 of { happy_var_4 -> 
+	happyIn20
+		 (map makeInstance happy_var_2 ++ happy_var_4
+	) `HappyStk` happyRest}}
+
+happyReduce_102 = happySpecReduce_3  14# happyReduction_102
+happyReduction_102 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut19 happy_x_2 of { happy_var_2 -> 
+	happyIn20
+		 (map makeInstance happy_var_2
+	)}
+
+happyReduce_103 = happyReduce 4# 14# happyReduction_103
+happyReduction_103 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut19 happy_x_2 of { happy_var_2 -> 
+	case happyOut20 happy_x_4 of { happy_var_4 -> 
+	happyIn20
+		 (map hide happy_var_2 ++ happy_var_4
+	) `HappyStk` happyRest}}
+
+happyReduce_104 = happySpecReduce_3  14# happyReduction_104
+happyReduction_104 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut19 happy_x_2 of { happy_var_2 -> 
+	happyIn20
+		 (map hide happy_var_2
+	)}
+
+happyReduce_105 = happyReduce 5# 14# happyReduction_105
+happyReduction_105 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut16 happy_x_3 of { happy_var_3 -> 
+	case happyOut20 happy_x_5 of { happy_var_5 -> 
+	happyIn20
+		 (map (Arg Hidden Irrelevant) happy_var_3 ++ happy_var_5
+	) `HappyStk` happyRest}}
+
+happyReduce_106 = happyReduce 4# 14# happyReduction_106
+happyReduction_106 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut16 happy_x_3 of { happy_var_3 -> 
+	happyIn20
+		 (map (Arg Hidden Irrelevant) happy_var_3
+	) `HappyStk` happyRest}
+
+happyReduce_107 = happyReduce 5# 14# happyReduction_107
+happyReduction_107 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut16 happy_x_3 of { happy_var_3 -> 
+	case happyOut20 happy_x_5 of { happy_var_5 -> 
+	happyIn20
+		 (map (Arg Instance Irrelevant) happy_var_3 ++ happy_var_5
+	) `HappyStk` happyRest}}
+
+happyReduce_108 = happyReduce 4# 14# happyReduction_108
+happyReduction_108 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut16 happy_x_3 of { happy_var_3 -> 
+	happyIn20
+		 (map (Arg Instance Irrelevant) happy_var_3
+	) `HappyStk` happyRest}
+
+happyReduce_109 = happyReduce 5# 14# happyReduction_109
+happyReduction_109 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut16 happy_x_3 of { happy_var_3 -> 
+	case happyOut20 happy_x_5 of { happy_var_5 -> 
+	happyIn20
+		 (map (Arg Hidden NonStrict) happy_var_3 ++ happy_var_5
+	) `HappyStk` happyRest}}
+
+happyReduce_110 = happyReduce 4# 14# happyReduction_110
+happyReduction_110 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut16 happy_x_3 of { happy_var_3 -> 
+	happyIn20
+		 (map (Arg Hidden NonStrict) happy_var_3
+	) `HappyStk` happyRest}
+
+happyReduce_111 = happyReduce 5# 14# happyReduction_111
+happyReduction_111 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut16 happy_x_3 of { happy_var_3 -> 
+	case happyOut20 happy_x_5 of { happy_var_5 -> 
+	happyIn20
+		 (map (Arg Instance NonStrict) happy_var_3 ++ happy_var_5
+	) `HappyStk` happyRest}}
+
+happyReduce_112 = happyReduce 4# 14# happyReduction_112
+happyReduction_112 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut16 happy_x_3 of { happy_var_3 -> 
+	happyIn20
+		 (map (Arg Instance NonStrict) happy_var_3
+	) `HappyStk` happyRest}
+
+happyReduce_113 = happyMonadReduce 1# 15# happyReduction_113
+happyReduction_113 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (TokQId happy_var_1) -> 
+	( mkQName happy_var_1)}
+	) (\r -> happyReturn (happyIn21 r))
+
+happyReduce_114 = happySpecReduce_1  15# happyReduction_114
+happyReduction_114 happy_x_1
+	 =  case happyOut15 happy_x_1 of { happy_var_1 -> 
+	happyIn21
+		 (QName happy_var_1
+	)}
+
+happyReduce_115 = happySpecReduce_1  16# happyReduction_115
+happyReduction_115 happy_x_1
+	 =  case happyOut21 happy_x_1 of { happy_var_1 -> 
+	happyIn22
+		 (happy_var_1
+	)}
+
+happyReduce_116 = happySpecReduce_1  17# happyReduction_116
+happyReduction_116 happy_x_1
+	 =  case happyOut15 happy_x_1 of { happy_var_1 -> 
+	happyIn23
+		 (happy_var_1
+	)}
+
+happyReduce_117 = happySpecReduce_1  17# happyReduction_117
+happyReduction_117 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> 
+	happyIn23
+		 (Name (getRange happy_var_1) [Hole]
+	)}
+
+happyReduce_118 = happySpecReduce_2  18# happyReduction_118
+happyReduction_118 happy_x_2
+	happy_x_1
+	 =  case happyOut23 happy_x_1 of { happy_var_1 -> 
+	case happyOut24 happy_x_2 of { happy_var_2 -> 
+	happyIn24
+		 (happy_var_1 : happy_var_2
+	)}}
+
+happyReduce_119 = happySpecReduce_1  18# happyReduction_119
+happyReduction_119 happy_x_1
+	 =  case happyOut23 happy_x_1 of { happy_var_1 -> 
+	happyIn24
+		 ([happy_var_1]
+	)}
+
+happyReduce_120 = happySpecReduce_1  19# happyReduction_120
+happyReduction_120 happy_x_1
+	 =  case happyOut26 happy_x_1 of { happy_var_1 -> 
+	happyIn25
+		 (case happy_var_1 of
+      Left ns -> ns
+      Right _ -> fail $ "expected sequence of bound identifiers, not absurd pattern"
+	)}
+
+happyReduce_121 = happyMonadReduce 1# 20# happyReduction_121
+happyReduction_121 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut32 happy_x_1 of { happy_var_1 -> 
+	(
+    let getName (Ident (QName x)) = Just x
+	getName (Underscore r _)  = Just (Name r [Hole])
+	getName _		  = Nothing
+
+        containsAbsurd (Absurd _) = True
+        containsAbsurd (HiddenArg _ (Named _ e)) = containsAbsurd e
+        containsAbsurd (InstanceArg _ (Named _ e)) = containsAbsurd e
+        containsAbsurd (Paren _ expr)    = containsAbsurd expr
+        containsAbsurd (RawApp _ exprs)    = any containsAbsurd exprs
+        containsAbsurd _          = False
+    in
+    if isJust $ find containsAbsurd happy_var_1 then return $ Right happy_var_1 else
+    case partition isJust $ map getName happy_var_1 of
+	(good, []) -> return $ Left $ map fromJust good
+	_	   -> fail $ "expected sequence of bound identifiers")}
+	) (\r -> happyReturn (happyIn26 r))
+
+happyReduce_122 = happySpecReduce_0  21# happyReduction_122
+happyReduction_122  =  happyIn27
+		 ([]
+	)
+
+happyReduce_123 = happySpecReduce_2  21# happyReduction_123
+happyReduction_123 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokString happy_var_1) -> 
+	case happyOut27 happy_x_2 of { happy_var_2 -> 
+	happyIn27
+		 (snd happy_var_1 : happy_var_2
+	)}}
+
+happyReduce_124 = happyMonadReduce 1# 22# happyReduction_124
+happyReduction_124 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (TokString happy_var_1) -> 
+	( fmap QName (mkName happy_var_1))}
+	) (\r -> happyReturn (happyIn28 r))
+
+happyReduce_125 = happySpecReduce_2  23# happyReduction_125
+happyReduction_125 happy_x_2
+	happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	case happyOut29 happy_x_2 of { happy_var_2 -> 
+	happyIn29
+		 (Pi happy_var_1 happy_var_2
+	)}}
+
+happyReduce_126 = happySpecReduce_3  23# happyReduction_126
+happyReduction_126 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut54 happy_x_2 of { happy_var_2 -> 
+	case happyOut29 happy_x_3 of { happy_var_3 -> 
+	happyIn29
+		 (forallPi happy_var_2 happy_var_3
+	)}}
+
+happyReduce_127 = happySpecReduce_3  23# happyReduction_127
+happyReduction_127 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
+	case happyOut29 happy_x_3 of { happy_var_3 -> 
+	happyIn29
+		 (Fun (fuseRange happy_var_1 happy_var_3) (RawApp (getRange happy_var_1) happy_var_1) happy_var_3
+	)}}
+
+happyReduce_128 = happySpecReduce_1  23# happyReduction_128
+happyReduction_128 happy_x_1
+	 =  case happyOut30 happy_x_1 of { happy_var_1 -> 
+	happyIn29
+		 (happy_var_1
+	)}
+
+happyReduce_129 = happyMonadReduce 1# 24# happyReduction_129
+happyReduction_129 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut31 happy_x_1 of { happy_var_1 -> 
+	( case happy_var_1 of
+		      { [e]    -> return e
+		      ; e : es -> return $ WithApp (fuseRange e es) e es
+		      ; []     -> fail "impossible: empty with expressions"
+		      })}
+	) (\r -> happyReturn (happyIn30 r))
+
+happyReduce_130 = happySpecReduce_3  25# happyReduction_130
+happyReduction_130 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn31
+		 (RawApp (getRange happy_var_1) happy_var_1 :  happy_var_3
+	)}}
+
+happyReduce_131 = happySpecReduce_1  25# happyReduction_131
+happyReduction_131 happy_x_1
+	 =  case happyOut32 happy_x_1 of { happy_var_1 -> 
+	happyIn31
+		 ([RawApp (getRange happy_var_1) happy_var_1]
+	)}
+
+happyReduce_132 = happySpecReduce_1  26# happyReduction_132
+happyReduction_132 happy_x_1
+	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
+	happyIn32
+		 ([happy_var_1]
+	)}
+
+happyReduce_133 = happySpecReduce_2  26# happyReduction_133
+happyReduction_133 happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut32 happy_x_2 of { happy_var_2 -> 
+	happyIn32
+		 (happy_var_1 : happy_var_2
+	)}}
+
+happyReduce_134 = happySpecReduce_3  27# happyReduction_134
+happyReduction_134 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> 
+	case happyOut46 happy_x_2 of { happy_var_2 -> 
+	case happyOut29 happy_x_3 of { happy_var_3 -> 
+	happyIn33
+		 (Lam (fuseRange happy_var_1 happy_var_3) happy_var_2 happy_var_3
+	)}}}
+
+happyReduce_135 = happyReduce 4# 27# happyReduction_135
+happyReduction_135 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> 
+	case happyOutTok happy_x_2 of { (TokSymbol SymOpenBrace happy_var_2) -> 
+	case happyOut53 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> 
+	happyIn33
+		 (ExtendedLam (fuseRange happy_var_1 (fuseRange happy_var_2 happy_var_4)) (reverse happy_var_3)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_136 = happyMonadReduce 2# 27# happyReduction_136
+happyReduction_136 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> 
+	case happyOut47 happy_x_2 of { happy_var_2 -> 
+	( case happy_var_2 of
+                                       Left (bs, h) -> if null bs then return $ AbsurdLam r h else
+                                                       return $ Lam r bs (AbsurdLam r h)
+                                                         where r = fuseRange happy_var_1 bs
+    				       Right es -> do -- it is of the form @\ { p1 ... () }@
+                                                     p <- exprToLHS (RawApp (getRange es) es);
+                                                     return $ ExtendedLam (fuseRange happy_var_1 es)
+                                                                     [(p [] [], AbsurdRHS, NoWhere)])}}
+	) (\r -> happyReturn (happyIn33 r))
+
+happyReduce_137 = happyReduce 4# 27# happyReduction_137
+happyReduction_137 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwLet happy_var_1) -> 
+	case happyOut130 happy_x_2 of { happy_var_2 -> 
+	case happyOut29 happy_x_4 of { happy_var_4 -> 
+	happyIn33
+		 (Let (fuseRange happy_var_1 happy_var_4) happy_var_2 happy_var_4
+	) `HappyStk` happyRest}}}
+
+happyReduce_138 = happySpecReduce_1  27# happyReduction_138
+happyReduction_138 happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	happyIn33
+		 (happy_var_1
+	)}
+
+happyReduce_139 = happyReduce 4# 27# happyReduction_139
+happyReduction_139 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteGoal happy_var_1) -> 
+	case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut29 happy_x_4 of { happy_var_4 -> 
+	happyIn33
+		 (QuoteGoal (getRange (happy_var_1,happy_var_4)) happy_var_2 happy_var_4
+	) `HappyStk` happyRest}}}
+
+happyReduce_140 = happySpecReduce_1  28# happyReduction_140
+happyReduction_140 happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	happyIn34
+		 ([happy_var_1]
+	)}
+
+happyReduce_141 = happySpecReduce_2  28# happyReduction_141
+happyReduction_141 happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut34 happy_x_2 of { happy_var_2 -> 
+	happyIn34
+		 (happy_var_1 : happy_var_2
+	)}}
+
+happyReduce_142 = happySpecReduce_3  29# happyReduction_142
+happyReduction_142 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> 
+	case happyOut29 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (TokSymbol SymCloseBrace happy_var_3) -> 
+	happyIn35
+		 (HiddenArg (fuseRange happy_var_1 happy_var_3) (unnamed happy_var_2)
+	)}}}
+
+happyReduce_143 = happyReduce 5# 29# happyReduction_143
+happyReduction_143 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> 
+	case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut29 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { (TokSymbol SymCloseBrace happy_var_5) -> 
+	happyIn35
+		 (HiddenArg (fuseRange happy_var_1 happy_var_5) (named (show happy_var_2) happy_var_4)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_144 = happySpecReduce_2  29# happyReduction_144
+happyReduction_144 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> 
+	case happyOutTok happy_x_2 of { (TokSymbol SymCloseBrace happy_var_2) -> 
+	happyIn35
+		 (let r = fuseRange happy_var_1 happy_var_2 in HiddenArg r $ unnamed $ Absurd r
+	)}}
+
+happyReduce_145 = happySpecReduce_1  30# happyReduction_145
+happyReduction_145 happy_x_1
+	 =  case happyOut21 happy_x_1 of { happy_var_1 -> 
+	happyIn36
+		 (Ident happy_var_1
+	)}
+
+happyReduce_146 = happySpecReduce_1  30# happyReduction_146
+happyReduction_146 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> 
+	happyIn36
+		 (Lit happy_var_1
+	)}
+
+happyReduce_147 = happySpecReduce_1  30# happyReduction_147
+happyReduction_147 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymQuestionMark happy_var_1) -> 
+	happyIn36
+		 (QuestionMark (getRange happy_var_1) Nothing
+	)}
+
+happyReduce_148 = happySpecReduce_1  30# happyReduction_148
+happyReduction_148 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> 
+	happyIn36
+		 (Underscore (getRange happy_var_1) Nothing
+	)}
+
+happyReduce_149 = happySpecReduce_1  30# happyReduction_149
+happyReduction_149 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwProp happy_var_1) -> 
+	happyIn36
+		 (Prop (getRange happy_var_1)
+	)}
+
+happyReduce_150 = happySpecReduce_1  30# happyReduction_150
+happyReduction_150 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwSet happy_var_1) -> 
+	happyIn36
+		 (Set (getRange happy_var_1)
+	)}
+
+happyReduce_151 = happySpecReduce_1  30# happyReduction_151
+happyReduction_151 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwQuote happy_var_1) -> 
+	happyIn36
+		 (Quote (getRange happy_var_1)
+	)}
+
+happyReduce_152 = happySpecReduce_1  30# happyReduction_152
+happyReduction_152 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwQuoteTerm happy_var_1) -> 
+	happyIn36
+		 (QuoteTerm (getRange happy_var_1)
+	)}
+
+happyReduce_153 = happySpecReduce_1  30# happyReduction_153
+happyReduction_153 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwUnquote happy_var_1) -> 
+	happyIn36
+		 (Unquote (getRange happy_var_1)
+	)}
+
+happyReduce_154 = happySpecReduce_1  30# happyReduction_154
+happyReduction_154 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSetN happy_var_1) -> 
+	happyIn36
+		 (SetN (getRange (fst happy_var_1)) (snd happy_var_1)
+	)}
+
+happyReduce_155 = happySpecReduce_3  30# happyReduction_155
+happyReduction_155 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> 
+	case happyOut29 happy_x_2 of { happy_var_2 -> 
+	case happyOut17 happy_x_3 of { happy_var_3 -> 
+	happyIn36
+		 (InstanceArg (fuseRange happy_var_1 happy_var_3) (unnamed happy_var_2)
+	)}}}
+
+happyReduce_156 = happyReduce 5# 30# happyReduction_156
+happyReduction_156 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> 
+	case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut29 happy_x_4 of { happy_var_4 -> 
+	case happyOut17 happy_x_5 of { happy_var_5 -> 
+	happyIn36
+		 (InstanceArg (fuseRange happy_var_1 happy_var_5) (named (show happy_var_2) happy_var_4)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_157 = happySpecReduce_3  30# happyReduction_157
+happyReduction_157 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> 
+	case happyOut29 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (TokSymbol SymCloseParen happy_var_3) -> 
+	happyIn36
+		 (Paren (fuseRange happy_var_1 happy_var_3) happy_var_2
+	)}}}
+
+happyReduce_158 = happySpecReduce_2  30# happyReduction_158
+happyReduction_158 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> 
+	case happyOutTok happy_x_2 of { (TokSymbol SymCloseParen happy_var_2) -> 
+	happyIn36
+		 (Absurd (fuseRange happy_var_1 happy_var_2)
+	)}}
+
+happyReduce_159 = happySpecReduce_2  30# happyReduction_159
+happyReduction_159 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> 
+	case happyOut17 happy_x_2 of { happy_var_2 -> 
+	happyIn36
+		 (let r = fuseRange happy_var_1 happy_var_2 in InstanceArg r $ unnamed $ Absurd r
+	)}}
+
+happyReduce_160 = happySpecReduce_3  30# happyReduction_160
+happyReduction_160 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut15 happy_x_1 of { happy_var_1 -> 
+	case happyOut37 happy_x_3 of { happy_var_3 -> 
+	happyIn36
+		 (As (fuseRange happy_var_1 happy_var_3) happy_var_1 happy_var_3
+	)}}
+
+happyReduce_161 = happySpecReduce_2  30# happyReduction_161
+happyReduction_161 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymDot happy_var_1) -> 
+	case happyOut37 happy_x_2 of { happy_var_2 -> 
+	happyIn36
+		 (Dot (fuseRange happy_var_1 happy_var_2) happy_var_2
+	)}}
+
+happyReduce_162 = happyReduce 4# 30# happyReduction_162
+happyReduction_162 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> 
+	case happyOut38 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> 
+	happyIn36
+		 (Rec (getRange (happy_var_1,happy_var_4)) happy_var_3
+	) `HappyStk` happyRest}}}
+
+happyReduce_163 = happyReduce 5# 30# happyReduction_163
+happyReduction_163 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> 
+	case happyOut36 happy_x_2 of { happy_var_2 -> 
+	case happyOut38 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { (TokSymbol SymCloseBrace happy_var_5) -> 
+	happyIn36
+		 (RecUpdate (getRange (happy_var_1,happy_var_5)) happy_var_2 happy_var_4
+	) `HappyStk` happyRest}}}}
+
+happyReduce_164 = happySpecReduce_1  31# happyReduction_164
+happyReduction_164 happy_x_1
+	 =  case happyOut35 happy_x_1 of { happy_var_1 -> 
+	happyIn37
+		 (happy_var_1
+	)}
+
+happyReduce_165 = happySpecReduce_1  31# happyReduction_165
+happyReduction_165 happy_x_1
+	 =  case happyOut36 happy_x_1 of { happy_var_1 -> 
+	happyIn37
+		 (happy_var_1
+	)}
+
+happyReduce_166 = happySpecReduce_0  32# happyReduction_166
+happyReduction_166  =  happyIn38
+		 ([]
+	)
+
+happyReduce_167 = happySpecReduce_1  32# happyReduction_167
+happyReduction_167 happy_x_1
+	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
+	happyIn38
+		 (happy_var_1
+	)}
+
+happyReduce_168 = happySpecReduce_1  33# happyReduction_168
+happyReduction_168 happy_x_1
+	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
+	happyIn39
+		 ([happy_var_1]
+	)}
+
+happyReduce_169 = happySpecReduce_3  33# happyReduction_169
+happyReduction_169 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
+	case happyOut39 happy_x_3 of { happy_var_3 -> 
+	happyIn39
+		 (happy_var_1 : happy_var_3
+	)}}
+
+happyReduce_170 = happySpecReduce_3  34# happyReduction_170
+happyReduction_170 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut15 happy_x_1 of { happy_var_1 -> 
+	case happyOut29 happy_x_3 of { happy_var_3 -> 
+	happyIn40
+		 ((happy_var_1, happy_var_3)
+	)}}
+
+happyReduce_171 = happySpecReduce_2  35# happyReduction_171
+happyReduction_171 happy_x_2
+	happy_x_1
+	 =  case happyOut42 happy_x_1 of { happy_var_1 -> 
+	happyIn41
+		 (happy_var_1
+	)}
+
+happyReduce_172 = happySpecReduce_1  36# happyReduction_172
+happyReduction_172 happy_x_1
+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
+	happyIn42
+		 ({-TeleBind-} happy_var_1
+	)}
+
+happyReduce_173 = happySpecReduce_2  37# happyReduction_173
+happyReduction_173 happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut43 happy_x_2 of { happy_var_2 -> 
+	happyIn43
+		 (happy_var_1 : happy_var_2
+	)}}
+
+happyReduce_174 = happySpecReduce_1  37# happyReduction_174
+happyReduction_174 happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	happyIn43
+		 ([happy_var_1]
+	)}
+
+happyReduce_175 = happyReduce 4# 38# happyReduction_175
+happyReduction_175 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> 
+	case happyOut45 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> 
+	happyIn44
+		 (TypedBindings (fuseRange happy_var_2 happy_var_4) (Arg NotHidden         Irrelevant happy_var_3)
+	) `HappyStk` happyRest}}}
+
+happyReduce_176 = happyReduce 4# 38# happyReduction_176
+happyReduction_176 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_2 of { (TokSymbol SymOpenBrace happy_var_2) -> 
+	case happyOut45 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> 
+	happyIn44
+		 (TypedBindings (fuseRange happy_var_2 happy_var_4) (Arg Hidden            Irrelevant happy_var_3)
+	) `HappyStk` happyRest}}}
+
+happyReduce_177 = happyReduce 4# 38# happyReduction_177
+happyReduction_177 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymDot happy_var_1) -> 
+	case happyOut45 happy_x_3 of { happy_var_3 -> 
+	happyIn44
+		 (TypedBindings (fuseRange happy_var_1 happy_var_3) (Arg Instance Irrelevant happy_var_3)
+	) `HappyStk` happyRest}}
+
+happyReduce_178 = happyReduce 4# 38# happyReduction_178
+happyReduction_178 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> 
+	case happyOut45 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> 
+	happyIn44
+		 (TypedBindings (fuseRange happy_var_2 happy_var_4) (Arg NotHidden         NonStrict happy_var_3)
+	) `HappyStk` happyRest}}}
+
+happyReduce_179 = happyReduce 4# 38# happyReduction_179
+happyReduction_179 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_2 of { (TokSymbol SymOpenBrace happy_var_2) -> 
+	case happyOut45 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> 
+	happyIn44
+		 (TypedBindings (fuseRange happy_var_2 happy_var_4) (Arg Hidden            NonStrict happy_var_3)
+	) `HappyStk` happyRest}}}
+
+happyReduce_180 = happyReduce 4# 38# happyReduction_180
+happyReduction_180 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymDotDot happy_var_1) -> 
+	case happyOut45 happy_x_3 of { happy_var_3 -> 
+	happyIn44
+		 (TypedBindings (fuseRange happy_var_1 happy_var_3) (Arg Instance NonStrict happy_var_3)
+	) `HappyStk` happyRest}}
+
+happyReduce_181 = happySpecReduce_3  38# happyReduction_181
+happyReduction_181 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> 
+	case happyOut45 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (TokSymbol SymCloseParen happy_var_3) -> 
+	happyIn44
+		 (TypedBindings (fuseRange happy_var_1 happy_var_3) (Arg NotHidden         Relevant happy_var_2)
+	)}}}
+
+happyReduce_182 = happySpecReduce_3  38# happyReduction_182
+happyReduction_182 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> 
+	case happyOut45 happy_x_2 of { happy_var_2 -> 
+	case happyOut17 happy_x_3 of { happy_var_3 -> 
+	happyIn44
+		 (TypedBindings (fuseRange happy_var_1 happy_var_3) (Arg Instance Relevant happy_var_2)
+	)}}}
+
+happyReduce_183 = happySpecReduce_3  38# happyReduction_183
+happyReduction_183 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> 
+	case happyOut45 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (TokSymbol SymCloseBrace happy_var_3) -> 
+	happyIn44
+		 (TypedBindings (fuseRange happy_var_1 happy_var_3) (Arg Hidden            Relevant happy_var_2)
+	)}}}
+
+happyReduce_184 = happySpecReduce_3  39# happyReduction_184
+happyReduction_184 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut25 happy_x_1 of { happy_var_1 -> 
+	case happyOut29 happy_x_3 of { happy_var_3 -> 
+	happyIn45
+		 (TBind (fuseRange happy_var_1 happy_var_3) (map mkBoundName_ happy_var_1) happy_var_3
+	)}}
+
+happyReduce_185 = happyMonadReduce 2# 40# happyReduction_185
+happyReduction_185 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut48 happy_x_1 of { happy_var_1 -> 
+	(
+      case reverse happy_var_1 of
+        Left _ : _ -> parseError "Absurd lambda cannot have a body."
+	_ : _      -> return [ b | Right b <- happy_var_1 ]
+        []         -> parsePanic "Empty LamBinds")}
+	) (\r -> happyReturn (happyIn46 r))
+
+happyReduce_186 = happyMonadReduce 1# 41# happyReduction_186
+happyReduction_186 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut49 happy_x_1 of { happy_var_1 -> 
+	(
+    case happy_var_1 of
+      Left lb -> case reverse lb of
+                   Right _ : _ -> parseError "Missing body for lambda"
+                   Left h  : _ -> return $ Left ([ b | Right b <- init lb], h)
+                   _           -> parsePanic "Empty LamBindsAbsurd"
+      Right es -> return $ Right es)}
+	) (\r -> happyReturn (happyIn47 r))
+
+happyReduce_187 = happySpecReduce_2  42# happyReduction_187
+happyReduction_187 happy_x_2
+	happy_x_1
+	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
+	case happyOut48 happy_x_2 of { happy_var_2 -> 
+	happyIn48
+		 (map Right happy_var_1 ++ happy_var_2
+	)}}
+
+happyReduce_188 = happySpecReduce_2  42# happyReduction_188
+happyReduction_188 happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut48 happy_x_2 of { happy_var_2 -> 
+	happyIn48
+		 (Right (DomainFull happy_var_1) : happy_var_2
+	)}}
+
+happyReduce_189 = happySpecReduce_1  42# happyReduction_189
+happyReduction_189 happy_x_1
+	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
+	happyIn48
+		 (map Right happy_var_1
+	)}
+
+happyReduce_190 = happySpecReduce_1  42# happyReduction_190
+happyReduction_190 happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	happyIn48
+		 ([Right $ DomainFull happy_var_1]
+	)}
+
+happyReduce_191 = happySpecReduce_2  42# happyReduction_191
+happyReduction_191 happy_x_2
+	happy_x_1
+	 =  happyIn48
+		 ([Left NotHidden]
+	)
+
+happyReduce_192 = happySpecReduce_2  42# happyReduction_192
+happyReduction_192 happy_x_2
+	happy_x_1
+	 =  happyIn48
+		 ([Left Hidden]
+	)
+
+happyReduce_193 = happySpecReduce_2  42# happyReduction_193
+happyReduction_193 happy_x_2
+	happy_x_1
+	 =  happyIn48
+		 ([Left Instance]
+	)
+
+happyReduce_194 = happySpecReduce_2  43# happyReduction_194
+happyReduction_194 happy_x_2
+	happy_x_1
+	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
+	case happyOut48 happy_x_2 of { happy_var_2 -> 
+	happyIn49
+		 (Left $ map Right happy_var_1 ++ happy_var_2
+	)}}
+
+happyReduce_195 = happySpecReduce_2  43# happyReduction_195
+happyReduction_195 happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut48 happy_x_2 of { happy_var_2 -> 
+	happyIn49
+		 (Left $ Right (DomainFull happy_var_1) : happy_var_2
+	)}}
+
+happyReduce_196 = happySpecReduce_1  43# happyReduction_196
+happyReduction_196 happy_x_1
+	 =  case happyOut58 happy_x_1 of { happy_var_1 -> 
+	happyIn49
+		 (case happy_var_1 of
+                                    Left lb -> Left $ map Right lb
+                                    Right es -> Right es
+	)}
+
+happyReduce_197 = happySpecReduce_1  43# happyReduction_197
+happyReduction_197 happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	happyIn49
+		 (Left [Right $ DomainFull happy_var_1]
+	)}
+
+happyReduce_198 = happySpecReduce_2  43# happyReduction_198
+happyReduction_198 happy_x_2
+	happy_x_1
+	 =  happyIn49
+		 (Left [Left NotHidden]
+	)
+
+happyReduce_199 = happySpecReduce_2  43# happyReduction_199
+happyReduction_199 happy_x_2
+	happy_x_1
+	 =  happyIn49
+		 (Left [Left Hidden]
+	)
+
+happyReduce_200 = happySpecReduce_2  43# happyReduction_200
+happyReduction_200 happy_x_2
+	happy_x_1
+	 =  happyIn49
+		 (Left [Left Instance]
+	)
+
+happyReduce_201 = happyMonadReduce 3# 44# happyReduction_201
+happyReduction_201 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut34 happy_x_1 of { happy_var_1 -> 
+	case happyOut29 happy_x_3 of { happy_var_3 -> 
+	( do
+      p <- exprToLHS (RawApp (getRange happy_var_1) happy_var_1) ;
+      return (p [] [], RHS happy_var_3, NoWhere))}}
+	) (\r -> happyReturn (happyIn50 r))
+
+happyReduce_202 = happyMonadReduce 1# 45# happyReduction_202
+happyReduction_202 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut32 happy_x_1 of { happy_var_1 -> 
+	( do
+      p <- exprToLHS (RawApp (getRange happy_var_1) happy_var_1);
+      return (p [] [], AbsurdRHS, NoWhere))}
+	) (\r -> happyReturn (happyIn51 r))
+
+happyReduce_203 = happySpecReduce_1  46# happyReduction_203
+happyReduction_203 happy_x_1
+	 =  case happyOut50 happy_x_1 of { happy_var_1 -> 
+	happyIn52
+		 (happy_var_1
+	)}
+
+happyReduce_204 = happySpecReduce_1  46# happyReduction_204
+happyReduction_204 happy_x_1
+	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
+	happyIn52
+		 (happy_var_1
+	)}
+
+happyReduce_205 = happySpecReduce_3  47# happyReduction_205
+happyReduction_205 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut53 happy_x_1 of { happy_var_1 -> 
+	case happyOut52 happy_x_3 of { happy_var_3 -> 
+	happyIn53
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_206 = happySpecReduce_3  47# happyReduction_206
+happyReduction_206 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
+	case happyOut52 happy_x_3 of { happy_var_3 -> 
+	happyIn53
+		 ([happy_var_3, happy_var_1]
+	)}}
+
+happyReduce_207 = happySpecReduce_1  47# happyReduction_207
+happyReduction_207 happy_x_1
+	 =  case happyOut50 happy_x_1 of { happy_var_1 -> 
+	happyIn53
+		 ([happy_var_1]
+	)}
+
+happyReduce_208 = happySpecReduce_2  48# happyReduction_208
+happyReduction_208 happy_x_2
+	happy_x_1
+	 =  case happyOut55 happy_x_1 of { happy_var_1 -> 
+	happyIn54
+		 (happy_var_1
+	)}
+
+happyReduce_209 = happySpecReduce_2  49# happyReduction_209
+happyReduction_209 happy_x_2
+	happy_x_1
+	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
+	case happyOut55 happy_x_2 of { happy_var_2 -> 
+	happyIn55
+		 (happy_var_1 ++ happy_var_2
+	)}}
+
+happyReduce_210 = happySpecReduce_2  49# happyReduction_210
+happyReduction_210 happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut55 happy_x_2 of { happy_var_2 -> 
+	happyIn55
+		 (DomainFull happy_var_1 : happy_var_2
+	)}}
+
+happyReduce_211 = happySpecReduce_1  49# happyReduction_211
+happyReduction_211 happy_x_1
+	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
+	happyIn55
+		 (happy_var_1
+	)}
+
+happyReduce_212 = happySpecReduce_1  49# happyReduction_212
+happyReduction_212 happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	happyIn55
+		 ([DomainFull happy_var_1]
+	)}
+
+happyReduce_213 = happySpecReduce_2  50# happyReduction_213
+happyReduction_213 happy_x_2
+	happy_x_1
+	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
+	case happyOut56 happy_x_2 of { happy_var_2 -> 
+	happyIn56
+		 (happy_var_1 ++ happy_var_2
+	)}}
+
+happyReduce_214 = happySpecReduce_2  50# happyReduction_214
+happyReduction_214 happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut56 happy_x_2 of { happy_var_2 -> 
+	happyIn56
+		 (DomainFull happy_var_1 : happy_var_2
+	)}}
+
+happyReduce_215 = happySpecReduce_0  50# happyReduction_215
+happyReduction_215  =  happyIn56
+		 ([]
+	)
+
+happyReduce_216 = happySpecReduce_1  51# happyReduction_216
+happyReduction_216 happy_x_1
+	 =  case happyOut58 happy_x_1 of { happy_var_1 -> 
+	happyIn57
+		 (case happy_var_1 of
+                             Left lbs -> lbs
+                             Right _ -> fail "expected sequence of bound identifiers, not absurd pattern"
+	)}
+
+happyReduce_217 = happySpecReduce_1  52# happyReduction_217
+happyReduction_217 happy_x_1
+	 =  case happyOut23 happy_x_1 of { happy_var_1 -> 
+	happyIn58
+		 (Left [DomainFree NotHidden Relevant $ mkBoundName_ happy_var_1]
+	)}
+
+happyReduce_218 = happySpecReduce_2  52# happyReduction_218
+happyReduction_218 happy_x_2
+	happy_x_1
+	 =  case happyOut23 happy_x_2 of { happy_var_2 -> 
+	happyIn58
+		 (Left [DomainFree NotHidden Irrelevant $ mkBoundName_ happy_var_2]
+	)}
+
+happyReduce_219 = happySpecReduce_2  52# happyReduction_219
+happyReduction_219 happy_x_2
+	happy_x_1
+	 =  case happyOut23 happy_x_2 of { happy_var_2 -> 
+	happyIn58
+		 (Left [DomainFree NotHidden NonStrict $ mkBoundName_ happy_var_2]
+	)}
+
+happyReduce_220 = happySpecReduce_3  52# happyReduction_220
+happyReduction_220 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut26 happy_x_2 of { happy_var_2 -> 
+	happyIn58
+		 (either (Left . map (DomainFree Hidden Relevant . mkBoundName_)) Right happy_var_2
+	)}
+
+happyReduce_221 = happySpecReduce_3  52# happyReduction_221
+happyReduction_221 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut25 happy_x_2 of { happy_var_2 -> 
+	happyIn58
+		 (Left $ map (DomainFree Instance Relevant . mkBoundName_) happy_var_2
+	)}
+
+happyReduce_222 = happyReduce 4# 52# happyReduction_222
+happyReduction_222 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut25 happy_x_3 of { happy_var_3 -> 
+	happyIn58
+		 (Left $ map (DomainFree Hidden Irrelevant . mkBoundName_) happy_var_3
+	) `HappyStk` happyRest}
+
+happyReduce_223 = happyReduce 4# 52# happyReduction_223
+happyReduction_223 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut25 happy_x_3 of { happy_var_3 -> 
+	happyIn58
+		 (Left $ map (DomainFree Instance Irrelevant . mkBoundName_) happy_var_3
+	) `HappyStk` happyRest}
+
+happyReduce_224 = happyReduce 4# 52# happyReduction_224
+happyReduction_224 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut25 happy_x_3 of { happy_var_3 -> 
+	happyIn58
+		 (Left $ map (DomainFree Hidden NonStrict . mkBoundName_) happy_var_3
+	) `HappyStk` happyRest}
+
+happyReduce_225 = happyReduce 4# 52# happyReduction_225
+happyReduction_225 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut25 happy_x_3 of { happy_var_3 -> 
+	happyIn58
+		 (Left $ map (DomainFree Instance NonStrict . mkBoundName_) happy_var_3
+	) `HappyStk` happyRest}
+
+happyReduce_226 = happySpecReduce_1  53# happyReduction_226
+happyReduction_226 happy_x_1
+	 =  case happyOut60 happy_x_1 of { happy_var_1 -> 
+	happyIn59
+		 ((Nothing, happy_var_1)
+	)}
+
+happyReduce_227 = happyMonadReduce 3# 53# happyReduction_227
+happyReduction_227 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (TokId happy_var_1) -> 
+	case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut60 happy_x_3 of { happy_var_3 -> 
+	( isName "as" happy_var_1 >>
+                               return (Just (AsName happy_var_2 (getRange (fst happy_var_1))), happy_var_3))}}}
+	) (\r -> happyReturn (happyIn59 r))
+
+happyReduce_228 = happyMonadReduce 1# 54# happyReduction_228
+happyReduction_228 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	( verifyImportDirective happy_var_1)}
+	) (\r -> happyReturn (happyIn60 r))
+
+happyReduce_229 = happySpecReduce_2  55# happyReduction_229
+happyReduction_229 happy_x_2
+	happy_x_1
+	 =  case happyOut62 happy_x_2 of { happy_var_2 -> 
+	happyIn61
+		 (happy_var_2 { publicOpen = True }
+	)}
+
+happyReduce_230 = happySpecReduce_1  55# happyReduction_230
+happyReduction_230 happy_x_1
+	 =  case happyOut62 happy_x_1 of { happy_var_1 -> 
+	happyIn61
+		 (happy_var_1
+	)}
+
+happyReduce_231 = happySpecReduce_2  56# happyReduction_231
+happyReduction_231 happy_x_2
+	happy_x_1
+	 =  case happyOut63 happy_x_1 of { happy_var_1 -> 
+	case happyOut64 happy_x_2 of { happy_var_2 -> 
+	happyIn62
+		 (ImportDirective (fuseRange (snd happy_var_1) (snd happy_var_2)) (fst happy_var_1) (fst happy_var_2) False
+	)}}
+
+happyReduce_232 = happySpecReduce_1  56# happyReduction_232
+happyReduction_232 happy_x_1
+	 =  case happyOut64 happy_x_1 of { happy_var_1 -> 
+	happyIn62
+		 (ImportDirective (getRange (snd happy_var_1)) (Hiding []) (fst happy_var_1) False
+	)}
+
+happyReduce_233 = happySpecReduce_1  56# happyReduction_233
+happyReduction_233 happy_x_1
+	 =  case happyOut63 happy_x_1 of { happy_var_1 -> 
+	happyIn62
+		 (ImportDirective (getRange (snd happy_var_1)) (fst happy_var_1) [] False
+	)}
+
+happyReduce_234 = happySpecReduce_0  56# happyReduction_234
+happyReduction_234  =  happyIn62
+		 (ImportDirective noRange (Hiding []) [] False
+	)
+
+happyReduce_235 = happyReduce 4# 57# happyReduction_235
+happyReduction_235 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwUsing happy_var_1) -> 
+	case happyOut69 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> 
+	happyIn63
+		 ((Using happy_var_3 , fuseRange happy_var_1 happy_var_4)
+	) `HappyStk` happyRest}}}
+
+happyReduce_236 = happyReduce 4# 57# happyReduction_236
+happyReduction_236 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwHiding happy_var_1) -> 
+	case happyOut70 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> 
+	happyIn63
+		 ((Hiding happy_var_3 , fuseRange happy_var_1 happy_var_4)
+	) `HappyStk` happyRest}}}
+
+happyReduce_237 = happyReduce 4# 58# happyReduction_237
+happyReduction_237 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwRenaming happy_var_1) -> 
+	case happyOut65 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> 
+	happyIn64
+		 ((happy_var_3 , fuseRange happy_var_1 happy_var_4)
+	) `HappyStk` happyRest}}}
+
+happyReduce_238 = happySpecReduce_3  59# happyReduction_238
+happyReduction_238 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut66 happy_x_1 of { happy_var_1 -> 
+	case happyOut65 happy_x_3 of { happy_var_3 -> 
+	happyIn65
+		 (happy_var_1 : happy_var_3
+	)}}
+
+happyReduce_239 = happySpecReduce_1  59# happyReduction_239
+happyReduction_239 happy_x_1
+	 =  case happyOut66 happy_x_1 of { happy_var_1 -> 
+	happyIn65
+		 ([happy_var_1]
+	)}
+
+happyReduce_240 = happySpecReduce_3  60# happyReduction_240
+happyReduction_240 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut67 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { (TokKeyword KwTo happy_var_2) -> 
+	case happyOut15 happy_x_3 of { happy_var_3 -> 
+	happyIn66
+		 (Renaming happy_var_1 happy_var_3 (getRange happy_var_2)
+	)}}}
+
+happyReduce_241 = happySpecReduce_2  61# happyReduction_241
+happyReduction_241 happy_x_2
+	happy_x_1
+	 =  case happyOut15 happy_x_2 of { happy_var_2 -> 
+	happyIn67
+		 (ImportedName happy_var_2
+	)}
+
+happyReduce_242 = happySpecReduce_3  61# happyReduction_242
+happyReduction_242 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut15 happy_x_3 of { happy_var_3 -> 
+	happyIn67
+		 (ImportedModule happy_var_3
+	)}
+
+happyReduce_243 = happySpecReduce_1  62# happyReduction_243
+happyReduction_243 happy_x_1
+	 =  case happyOut15 happy_x_1 of { happy_var_1 -> 
+	happyIn68
+		 (ImportedName happy_var_1
+	)}
+
+happyReduce_244 = happySpecReduce_2  62# happyReduction_244
+happyReduction_244 happy_x_2
+	happy_x_1
+	 =  case happyOut15 happy_x_2 of { happy_var_2 -> 
+	happyIn68
+		 (ImportedModule happy_var_2
+	)}
+
+happyReduce_245 = happySpecReduce_0  63# happyReduction_245
+happyReduction_245  =  happyIn69
+		 ([]
+	)
+
+happyReduce_246 = happySpecReduce_1  63# happyReduction_246
+happyReduction_246 happy_x_1
+	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
+	happyIn69
+		 (happy_var_1
+	)}
+
+happyReduce_247 = happySpecReduce_1  64# happyReduction_247
+happyReduction_247 happy_x_1
+	 =  case happyOut68 happy_x_1 of { happy_var_1 -> 
+	happyIn70
+		 ([happy_var_1]
+	)}
+
+happyReduce_248 = happySpecReduce_3  64# happyReduction_248
+happyReduction_248 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut68 happy_x_1 of { happy_var_1 -> 
+	case happyOut70 happy_x_3 of { happy_var_3 -> 
+	happyIn70
+		 (happy_var_1 : happy_var_3
+	)}}
+
+happyReduce_249 = happyMonadReduce 3# 65# happyReduction_249
+happyReduction_249 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut30 happy_x_1 of { happy_var_1 -> 
+	case happyOut74 happy_x_2 of { happy_var_2 -> 
+	case happyOut73 happy_x_3 of { happy_var_3 -> 
+	( exprToLHS happy_var_1 >>= \p -> return (p happy_var_2 happy_var_3))}}}
+	) (\r -> happyReturn (happyIn71 r))
+
+happyReduce_250 = happyReduce 4# 65# happyReduction_250
+happyReduction_250 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymEllipsis happy_var_1) -> 
+	case happyOut72 happy_x_2 of { happy_var_2 -> 
+	case happyOut74 happy_x_3 of { happy_var_3 -> 
+	case happyOut73 happy_x_4 of { happy_var_4 -> 
+	happyIn71
+		 (Ellipsis (fuseRange happy_var_1 happy_var_3) happy_var_2 happy_var_3 happy_var_4
+	) `HappyStk` happyRest}}}}
+
+happyReduce_251 = happySpecReduce_0  66# happyReduction_251
+happyReduction_251  =  happyIn72
+		 ([]
+	)
+
+happyReduce_252 = happyMonadReduce 3# 66# happyReduction_252
+happyReduction_252 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut34 happy_x_2 of { happy_var_2 -> 
+	case happyOut72 happy_x_3 of { happy_var_3 -> 
+	( exprToPattern (RawApp (getRange happy_var_2) happy_var_2) >>= \p ->
+		   return (p : happy_var_3))}}
+	) (\r -> happyReturn (happyIn72 r))
+
+happyReduce_253 = happySpecReduce_0  67# happyReduction_253
+happyReduction_253  =  happyIn73
+		 ([]
+	)
+
+happyReduce_254 = happySpecReduce_2  67# happyReduction_254
+happyReduction_254 happy_x_2
+	happy_x_1
+	 =  case happyOut29 happy_x_2 of { happy_var_2 -> 
+	happyIn73
+		 (case happy_var_2 of { WithApp _ e es -> e : es; e -> [e] }
+	)}
+
+happyReduce_255 = happySpecReduce_0  68# happyReduction_255
+happyReduction_255  =  happyIn74
+		 ([]
+	)
+
+happyReduce_256 = happySpecReduce_2  68# happyReduction_256
+happyReduction_256 happy_x_2
+	happy_x_1
+	 =  case happyOut29 happy_x_2 of { happy_var_2 -> 
+	happyIn74
+		 (case happy_var_2 of { WithApp _ e es -> e : es; e -> [e] }
+	)}
+
+happyReduce_257 = happySpecReduce_0  69# happyReduction_257
+happyReduction_257  =  happyIn75
+		 (NoWhere
+	)
+
+happyReduce_258 = happySpecReduce_2  69# happyReduction_258
+happyReduction_258 happy_x_2
+	happy_x_1
+	 =  case happyOut130 happy_x_2 of { happy_var_2 -> 
+	happyIn75
+		 (AnyWhere happy_var_2
+	)}
+
+happyReduce_259 = happyReduce 4# 69# happyReduction_259
+happyReduction_259 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut130 happy_x_4 of { happy_var_4 -> 
+	happyIn75
+		 (SomeWhere happy_var_2 happy_var_4
+	) `HappyStk` happyRest}}
+
+happyReduce_260 = happySpecReduce_1  70# happyReduction_260
+happyReduction_260 happy_x_1
+	 =  case happyOut78 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_261 = happySpecReduce_1  70# happyReduction_261
+happyReduction_261 happy_x_1
+	 =  case happyOut89 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 (happy_var_1
+	)}
+
+happyReduce_262 = happySpecReduce_1  70# happyReduction_262
+happyReduction_262 happy_x_1
+	 =  case happyOut81 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_263 = happySpecReduce_1  70# happyReduction_263
+happyReduction_263 happy_x_1
+	 =  case happyOut83 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_264 = happySpecReduce_1  70# happyReduction_264
+happyReduction_264 happy_x_1
+	 =  case happyOut84 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_265 = happySpecReduce_1  70# happyReduction_265
+happyReduction_265 happy_x_1
+	 =  case happyOut85 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_266 = happySpecReduce_1  70# happyReduction_266
+happyReduction_266 happy_x_1
+	 =  case happyOut86 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_267 = happySpecReduce_1  70# happyReduction_267
+happyReduction_267 happy_x_1
+	 =  case happyOut88 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_268 = happySpecReduce_1  70# happyReduction_268
+happyReduction_268 happy_x_1
+	 =  case happyOut90 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_269 = happySpecReduce_1  70# happyReduction_269
+happyReduction_269 happy_x_1
+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_270 = happySpecReduce_1  70# happyReduction_270
+happyReduction_270 happy_x_1
+	 =  case happyOut92 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_271 = happySpecReduce_1  70# happyReduction_271
+happyReduction_271 happy_x_1
+	 =  case happyOut93 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_272 = happySpecReduce_1  70# happyReduction_272
+happyReduction_272 happy_x_1
+	 =  case happyOut94 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_273 = happySpecReduce_1  70# happyReduction_273
+happyReduction_273 happy_x_1
+	 =  case happyOut100 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_274 = happySpecReduce_1  70# happyReduction_274
+happyReduction_274 happy_x_1
+	 =  case happyOut104 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_275 = happySpecReduce_1  70# happyReduction_275
+happyReduction_275 happy_x_1
+	 =  case happyOut103 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_276 = happySpecReduce_1  70# happyReduction_276
+happyReduction_276 happy_x_1
+	 =  case happyOut105 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_277 = happySpecReduce_1  70# happyReduction_277
+happyReduction_277 happy_x_1
+	 =  case happyOut108 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_278 = happySpecReduce_1  70# happyReduction_278
+happyReduction_278 happy_x_1
+	 =  case happyOut95 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 ([happy_var_1]
+	)}
+
+happyReduce_279 = happySpecReduce_3  71# happyReduction_279
+happyReduction_279 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
+	case happyOut29 happy_x_3 of { happy_var_3 -> 
+	happyIn77
+		 (map (flip (TypeSig Relevant) happy_var_3) happy_var_1
+	)}}
+
+happyReduce_280 = happyReduce 4# 72# happyReduction_280
+happyReduction_280 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut29 happy_x_4 of { happy_var_4 -> 
+	happyIn78
+		 (TypeSig Irrelevant happy_var_2 happy_var_4
+	) `HappyStk` happyRest}}
+
+happyReduce_281 = happySpecReduce_3  72# happyReduction_281
+happyReduction_281 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut15 happy_x_1 of { happy_var_1 -> 
+	case happyOut29 happy_x_3 of { happy_var_3 -> 
+	happyIn78
+		 (TypeSig Relevant happy_var_1 happy_var_3
+	)}}
+
+happyReduce_282 = happySpecReduce_3  73# happyReduction_282
+happyReduction_282 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut19 happy_x_1 of { happy_var_1 -> 
+	case happyOut29 happy_x_3 of { happy_var_3 -> 
+	happyIn79
+		 (map (\ (Arg _ rel x) -> TypeSig rel x happy_var_3) happy_var_1
+	)}}
+
+happyReduce_283 = happySpecReduce_3  74# happyReduction_283
+happyReduction_283 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut20 happy_x_1 of { happy_var_1 -> 
+	case happyOut29 happy_x_3 of { happy_var_3 -> 
+	happyIn80
+		 (map (fmap (flip (TypeSig Relevant) happy_var_3)) happy_var_1
+	)}}
+
+happyReduce_284 = happySpecReduce_3  75# happyReduction_284
+happyReduction_284 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut71 happy_x_1 of { happy_var_1 -> 
+	case happyOut82 happy_x_2 of { happy_var_2 -> 
+	case happyOut75 happy_x_3 of { happy_var_3 -> 
+	happyIn81
+		 (FunClause happy_var_1 happy_var_2 happy_var_3
+	)}}}
+
+happyReduce_285 = happySpecReduce_2  76# happyReduction_285
+happyReduction_285 happy_x_2
+	happy_x_1
+	 =  case happyOut29 happy_x_2 of { happy_var_2 -> 
+	happyIn82
+		 (RHS happy_var_2
+	)}
+
+happyReduce_286 = happySpecReduce_0  76# happyReduction_286
+happyReduction_286  =  happyIn82
+		 (AbsurdRHS
+	)
+
+happyReduce_287 = happyReduce 7# 77# happyReduction_287
+happyReduction_287 (happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> 
+	case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut56 happy_x_3 of { happy_var_3 -> 
+	case happyOut29 happy_x_5 of { happy_var_5 -> 
+	case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> 
+	case happyOut128 happy_x_7 of { happy_var_7 -> 
+	happyIn83
+		 (Data (getRange (happy_var_1, happy_var_6, happy_var_7)) Inductive happy_var_2 happy_var_3 (Just happy_var_5) happy_var_7
+	) `HappyStk` happyRest}}}}}}
+
+happyReduce_288 = happyReduce 7# 77# happyReduction_288
+happyReduction_288 (happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwCoData happy_var_1) -> 
+	case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut56 happy_x_3 of { happy_var_3 -> 
+	case happyOut29 happy_x_5 of { happy_var_5 -> 
+	case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> 
+	case happyOut128 happy_x_7 of { happy_var_7 -> 
+	happyIn83
+		 (Data (getRange (happy_var_1, happy_var_6, happy_var_7)) CoInductive happy_var_2 happy_var_3 (Just happy_var_5) happy_var_7
+	) `HappyStk` happyRest}}}}}}
+
+happyReduce_289 = happyReduce 5# 77# happyReduction_289
+happyReduction_289 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> 
+	case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut56 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> 
+	case happyOut128 happy_x_5 of { happy_var_5 -> 
+	happyIn83
+		 (Data (getRange (happy_var_1, happy_var_4, happy_var_5)) Inductive happy_var_2 happy_var_3 Nothing happy_var_5
+	) `HappyStk` happyRest}}}}}
+
+happyReduce_290 = happyReduce 5# 77# happyReduction_290
+happyReduction_290 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwCoData happy_var_1) -> 
+	case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut56 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> 
+	case happyOut128 happy_x_5 of { happy_var_5 -> 
+	happyIn83
+		 (Data (getRange (happy_var_1, happy_var_4, happy_var_5)) CoInductive happy_var_2 happy_var_3 Nothing happy_var_5
+	) `HappyStk` happyRest}}}}}
+
+happyReduce_291 = happyReduce 5# 78# happyReduction_291
+happyReduction_291 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> 
+	case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut56 happy_x_3 of { happy_var_3 -> 
+	case happyOut29 happy_x_5 of { happy_var_5 -> 
+	happyIn84
+		 (DataSig (fuseRange happy_var_1 happy_var_5) Inductive happy_var_2 happy_var_3 happy_var_5
+	) `HappyStk` happyRest}}}}
+
+happyReduce_292 = happyReduce 7# 79# happyReduction_292
+happyReduction_292 (happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> 
+	case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut56 happy_x_3 of { happy_var_3 -> 
+	case happyOut29 happy_x_5 of { happy_var_5 -> 
+	case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> 
+	case happyOut129 happy_x_7 of { happy_var_7 -> 
+	happyIn85
+		 (Record (getRange (happy_var_1, happy_var_6, happy_var_7)) happy_var_2 (fst happy_var_7) happy_var_3 (Just happy_var_5) (snd happy_var_7)
+	) `HappyStk` happyRest}}}}}}
+
+happyReduce_293 = happyReduce 5# 79# happyReduction_293
+happyReduction_293 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> 
+	case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut56 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> 
+	case happyOut129 happy_x_5 of { happy_var_5 -> 
+	happyIn85
+		 (Record (getRange (happy_var_1, happy_var_4, happy_var_5)) happy_var_2 (fst happy_var_5) happy_var_3 Nothing (snd happy_var_5)
+	) `HappyStk` happyRest}}}}}
+
+happyReduce_294 = happyReduce 5# 80# happyReduction_294
+happyReduction_294 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> 
+	case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut56 happy_x_3 of { happy_var_3 -> 
+	case happyOut29 happy_x_5 of { happy_var_5 -> 
+	happyIn86
+		 (RecordSig (fuseRange happy_var_1 happy_var_5) happy_var_2 happy_var_3 happy_var_5
+	) `HappyStk` happyRest}}}}
+
+happyReduce_295 = happySpecReduce_2  81# happyReduction_295
+happyReduction_295 happy_x_2
+	happy_x_1
+	 =  case happyOut15 happy_x_2 of { happy_var_2 -> 
+	happyIn87
+		 (happy_var_2
+	)}
+
+happyReduce_296 = happySpecReduce_3  82# happyReduction_296
+happyReduction_296 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwInfix happy_var_1) -> 
+	case happyOut14 happy_x_2 of { happy_var_2 -> 
+	case happyOut24 happy_x_3 of { happy_var_3 -> 
+	happyIn88
+		 (Infix (NonAssoc (fuseRange happy_var_1 happy_var_3) happy_var_2) happy_var_3
+	)}}}
+
+happyReduce_297 = happySpecReduce_3  82# happyReduction_297
+happyReduction_297 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwInfixL happy_var_1) -> 
+	case happyOut14 happy_x_2 of { happy_var_2 -> 
+	case happyOut24 happy_x_3 of { happy_var_3 -> 
+	happyIn88
+		 (Infix (LeftAssoc (fuseRange happy_var_1 happy_var_3) happy_var_2) happy_var_3
+	)}}}
+
+happyReduce_298 = happySpecReduce_3  82# happyReduction_298
+happyReduction_298 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwInfixR happy_var_1) -> 
+	case happyOut14 happy_x_2 of { happy_var_2 -> 
+	case happyOut24 happy_x_3 of { happy_var_3 -> 
+	happyIn88
+		 (Infix (RightAssoc (fuseRange happy_var_1 happy_var_3) happy_var_2) happy_var_3
+	)}}}
+
+happyReduce_299 = happySpecReduce_2  83# happyReduction_299
+happyReduction_299 happy_x_2
+	happy_x_1
+	 =  case happyOut126 happy_x_2 of { happy_var_2 -> 
+	happyIn89
+		 (let toField (Arg h rel (TypeSig _ x t)) = Field x (Arg h rel t) in map toField happy_var_2
+	)}
+
+happyReduce_300 = happySpecReduce_2  84# happyReduction_300
+happyReduction_300 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwMutual happy_var_1) -> 
+	case happyOut130 happy_x_2 of { happy_var_2 -> 
+	happyIn90
+		 (Mutual (fuseRange happy_var_1 happy_var_2) happy_var_2
+	)}}
+
+happyReduce_301 = happySpecReduce_2  85# happyReduction_301
+happyReduction_301 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwAbstract happy_var_1) -> 
+	case happyOut130 happy_x_2 of { happy_var_2 -> 
+	happyIn91
+		 (Abstract (fuseRange happy_var_1 happy_var_2) happy_var_2
+	)}}
+
+happyReduce_302 = happySpecReduce_2  86# happyReduction_302
+happyReduction_302 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwPrivate happy_var_1) -> 
+	case happyOut130 happy_x_2 of { happy_var_2 -> 
+	happyIn92
+		 (Private (fuseRange happy_var_1 happy_var_2) happy_var_2
+	)}}
+
+happyReduce_303 = happySpecReduce_2  87# happyReduction_303
+happyReduction_303 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwPostulate happy_var_1) -> 
+	case happyOut124 happy_x_2 of { happy_var_2 -> 
+	happyIn93
+		 (Postulate (fuseRange happy_var_1 happy_var_2) happy_var_2
+	)}}
+
+happyReduce_304 = happySpecReduce_2  88# happyReduction_304
+happyReduction_304 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwPrimitive happy_var_1) -> 
+	case happyOut122 happy_x_2 of { happy_var_2 -> 
+	happyIn94
+		 (Primitive (fuseRange happy_var_1 happy_var_2) happy_var_2
+	)}}
+
+happyReduce_305 = happyMonadReduce 5# 89# happyReduction_305
+happyReduction_305 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut97 happy_x_3 of { happy_var_3 -> 
+	case happyOut96 happy_x_5 of { happy_var_5 -> 
+	(
+  case happy_var_2 of
+    Name _ [_] -> case mkNotation happy_var_3 happy_var_5 of
+      Left err -> parseError $ "malformed syntax declaration: " ++ err
+      Right n -> return $ Syntax happy_var_2 n
+    _ -> parseError "syntax declarations are allowed only for simple names (without holes)")}}}
+	) (\r -> happyReturn (happyIn95 r))
+
+happyReduce_306 = happySpecReduce_1  90# happyReduction_306
+happyReduction_306 happy_x_1
+	 =  case happyOut99 happy_x_1 of { happy_var_1 -> 
+	happyIn96
+		 ([happy_var_1]
+	)}
+
+happyReduce_307 = happySpecReduce_2  90# happyReduction_307
+happyReduction_307 happy_x_2
+	happy_x_1
+	 =  case happyOut96 happy_x_1 of { happy_var_1 -> 
+	case happyOut99 happy_x_2 of { happy_var_2 -> 
+	happyIn96
+		 (happy_var_1 ++ [happy_var_2]
+	)}}
+
+happyReduce_308 = happySpecReduce_1  91# happyReduction_308
+happyReduction_308 happy_x_1
+	 =  case happyOut98 happy_x_1 of { happy_var_1 -> 
+	happyIn97
+		 ([happy_var_1]
+	)}
+
+happyReduce_309 = happySpecReduce_2  91# happyReduction_309
+happyReduction_309 happy_x_2
+	happy_x_1
+	 =  case happyOut97 happy_x_1 of { happy_var_1 -> 
+	case happyOut98 happy_x_2 of { happy_var_2 -> 
+	happyIn97
+		 (happy_var_1 ++ [happy_var_2]
+	)}}
+
+happyReduce_310 = happySpecReduce_1  92# happyReduction_310
+happyReduction_310 happy_x_1
+	 =  case happyOut99 happy_x_1 of { happy_var_1 -> 
+	happyIn98
+		 (ExprHole happy_var_1
+	)}
+
+happyReduce_311 = happyReduce 6# 92# happyReduction_311
+happyReduction_311 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut99 happy_x_3 of { happy_var_3 -> 
+	case happyOut99 happy_x_5 of { happy_var_5 -> 
+	happyIn98
+		 (LambdaHole happy_var_3 happy_var_5
+	) `HappyStk` happyRest}}
+
+happyReduce_312 = happySpecReduce_1  93# happyReduction_312
+happyReduction_312 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokId happy_var_1) -> 
+	happyIn99
+		 (snd happy_var_1
+	)}
+
+happyReduce_313 = happyReduce 4# 94# happyReduction_313
+happyReduction_313 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> 
+	case happyOut22 happy_x_2 of { happy_var_2 -> 
+	case happyOut101 happy_x_3 of { happy_var_3 -> 
+	case happyOut60 happy_x_4 of { happy_var_4 -> 
+	happyIn100
+		 (let
+    { m   = happy_var_2
+    ; es  = happy_var_3
+    ; dir = happy_var_4
+    ; r   = getRange (happy_var_1, m, es, dir)
+    } in
+    case es of
+    { []  -> Open r m dir
+	; _   -> Private r [ ModuleMacro r (noName $ beginningOf $ getRange happy_var_2)
+			     (SectionApp (getRange (m , es)) [] (RawApp (fuseRange m es) (Ident m : es)))
+			     DoOpen dir
+                       ]
+    }
+	) `HappyStk` happyRest}}}}
+
+happyReduce_314 = happyReduce 6# 94# happyReduction_314
+happyReduction_314 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> 
+	case happyOut22 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (TokSymbol SymDoubleOpenBrace happy_var_3) -> 
+	case happyOutTok happy_x_4 of { (TokSymbol SymEllipsis happy_var_4) -> 
+	case happyOut60 happy_x_6 of { happy_var_6 -> 
+	happyIn100
+		 (let r = getRange (happy_var_1, happy_var_2, happy_var_3, happy_var_4) in
+    Private r [ ModuleMacro r (noName $ beginningOf $ getRange happy_var_2)
+    	      	(RecordModuleIFS r happy_var_2) DoOpen happy_var_6
+        ]
+	) `HappyStk` happyRest}}}}}
+
+happyReduce_315 = happySpecReduce_0  95# happyReduction_315
+happyReduction_315  =  happyIn101
+		 ([]
+	)
+
+happyReduce_316 = happySpecReduce_2  95# happyReduction_316
+happyReduction_316 happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut101 happy_x_2 of { happy_var_2 -> 
+	happyIn101
+		 (happy_var_1 : happy_var_2
+	)}}
+
+happyReduce_317 = happyReduce 4# 96# happyReduction_317
+happyReduction_317 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut22 happy_x_1 of { happy_var_1 -> 
+	case happyOut17 happy_x_4 of { happy_var_4 -> 
+	happyIn102
+		 ((\ts ->
+		    if null ts then return $ RecordModuleIFS (getRange (happy_var_1, happy_var_4)) happy_var_1
+		    else parseError "No bindings allowed for record module with non-canonical implicits" )
+	) `HappyStk` happyRest}}
+
+happyReduce_318 = happySpecReduce_2  96# happyReduction_318
+happyReduction_318 happy_x_2
+	happy_x_1
+	 =  case happyOut22 happy_x_1 of { happy_var_1 -> 
+	case happyOut101 happy_x_2 of { happy_var_2 -> 
+	happyIn102
+		 ((\ts -> return $ SectionApp (getRange (happy_var_1, happy_var_2)) ts (RawApp (fuseRange happy_var_1 happy_var_2) (Ident happy_var_1 : happy_var_2)) )
+	)}}
+
+happyReduce_319 = happyMonadReduce 6# 97# happyReduction_319
+happyReduction_319 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> 
+	case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut56 happy_x_3 of { happy_var_3 -> 
+	case happyOut102 happy_x_5 of { happy_var_5 -> 
+	case happyOut60 happy_x_6 of { happy_var_6 -> 
+	( do {ma <- happy_var_5 (map addType happy_var_3); return $ ModuleMacro (getRange (happy_var_1, ma, happy_var_6)) happy_var_2 ma DontOpen happy_var_6 })}}}}}
+	) (\r -> happyReturn (happyIn103 r))
+
+happyReduce_320 = happyMonadReduce 7# 97# happyReduction_320
+happyReduction_320 (happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> 
+	case happyOut15 happy_x_3 of { happy_var_3 -> 
+	case happyOut56 happy_x_4 of { happy_var_4 -> 
+	case happyOut102 happy_x_6 of { happy_var_6 -> 
+	case happyOut60 happy_x_7 of { happy_var_7 -> 
+	( do {ma <- happy_var_6 (map addType happy_var_4); return $ ModuleMacro (getRange (happy_var_1, ma, happy_var_7)) happy_var_3 ma DoOpen happy_var_7 })}}}}}
+	) (\r -> happyReturn (happyIn103 r))
+
+happyReduce_321 = happySpecReduce_3  98# happyReduction_321
+happyReduction_321 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokKeyword KwImport happy_var_1) -> 
+	case happyOut22 happy_x_2 of { happy_var_2 -> 
+	case happyOut59 happy_x_3 of { happy_var_3 -> 
+	happyIn104
+		 (Import (getRange (happy_var_1,happy_var_2,snd happy_var_3)) happy_var_2 (fst happy_var_3) DontOpen (snd happy_var_3)
+	)}}}
+
+happyReduce_322 = happyReduce 4# 98# happyReduction_322
+happyReduction_322 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> 
+	case happyOut22 happy_x_3 of { happy_var_3 -> 
+	case happyOut59 happy_x_4 of { happy_var_4 -> 
+	happyIn104
+		 (Import (getRange (happy_var_1,happy_var_3,snd happy_var_4)) happy_var_3 (fst happy_var_4) DoOpen (snd happy_var_4)
+	) `HappyStk` happyRest}}}
+
+happyReduce_323 = happyReduce 5# 99# happyReduction_323
+happyReduction_323 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> 
+	case happyOut15 happy_x_2 of { happy_var_2 -> 
+	case happyOut56 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> 
+	case happyOut131 happy_x_5 of { happy_var_5 -> 
+	happyIn105
+		 (Module (getRange (happy_var_1,happy_var_4,happy_var_5)) (QName happy_var_2) (map addType happy_var_3) happy_var_5
+	) `HappyStk` happyRest}}}}}
+
+happyReduce_324 = happySpecReduce_1  100# happyReduction_324
+happyReduction_324 happy_x_1
+	 =  case happyOut107 happy_x_1 of { happy_var_1 -> 
+	happyIn106
+		 ([happy_var_1]
+	)}
+
+happyReduce_325 = happySpecReduce_2  100# happyReduction_325
+happyReduction_325 happy_x_2
+	happy_x_1
+	 =  case happyOut104 happy_x_1 of { happy_var_1 -> 
+	case happyOut106 happy_x_2 of { happy_var_2 -> 
+	happyIn106
+		 (happy_var_1 : happy_var_2
+	)}}
+
+happyReduce_326 = happySpecReduce_2  100# happyReduction_326
+happyReduction_326 happy_x_2
+	happy_x_1
+	 =  case happyOut100 happy_x_1 of { happy_var_1 -> 
+	case happyOut106 happy_x_2 of { happy_var_2 -> 
+	happyIn106
+		 (happy_var_1 : happy_var_2
+	)}}
+
+happyReduce_327 = happyReduce 5# 101# happyReduction_327
+happyReduction_327 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> 
+	case happyOut22 happy_x_2 of { happy_var_2 -> 
+	case happyOut56 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> 
+	case happyOut131 happy_x_5 of { happy_var_5 -> 
+	happyIn107
+		 (Module (getRange (happy_var_1,happy_var_4,happy_var_5)) happy_var_2 (map addType happy_var_3) happy_var_5
+	) `HappyStk` happyRest}}}}}
+
+happyReduce_328 = happySpecReduce_1  102# happyReduction_328
+happyReduction_328 happy_x_1
+	 =  case happyOut110 happy_x_1 of { happy_var_1 -> 
+	happyIn108
+		 (Pragma happy_var_1
+	)}
+
+happyReduce_329 = happySpecReduce_1  103# happyReduction_329
+happyReduction_329 happy_x_1
+	 =  case happyOut111 happy_x_1 of { happy_var_1 -> 
+	happyIn109
+		 (happy_var_1
+	)}
+
+happyReduce_330 = happySpecReduce_1  104# happyReduction_330
+happyReduction_330 happy_x_1
+	 =  case happyOut112 happy_x_1 of { happy_var_1 -> 
+	happyIn110
+		 (happy_var_1
+	)}
+
+happyReduce_331 = happySpecReduce_1  104# happyReduction_331
+happyReduction_331 happy_x_1
+	 =  case happyOut113 happy_x_1 of { happy_var_1 -> 
+	happyIn110
+		 (happy_var_1
+	)}
+
+happyReduce_332 = happySpecReduce_1  104# happyReduction_332
+happyReduction_332 happy_x_1
+	 =  case happyOut115 happy_x_1 of { happy_var_1 -> 
+	happyIn110
+		 (happy_var_1
+	)}
+
+happyReduce_333 = happySpecReduce_1  104# happyReduction_333
+happyReduction_333 happy_x_1
+	 =  case happyOut114 happy_x_1 of { happy_var_1 -> 
+	happyIn110
+		 (happy_var_1
+	)}
+
+happyReduce_334 = happySpecReduce_1  104# happyReduction_334
+happyReduction_334 happy_x_1
+	 =  case happyOut116 happy_x_1 of { happy_var_1 -> 
+	happyIn110
+		 (happy_var_1
+	)}
+
+happyReduce_335 = happySpecReduce_1  104# happyReduction_335
+happyReduction_335 happy_x_1
+	 =  case happyOut117 happy_x_1 of { happy_var_1 -> 
+	happyIn110
+		 (happy_var_1
+	)}
+
+happyReduce_336 = happySpecReduce_1  104# happyReduction_336
+happyReduction_336 happy_x_1
+	 =  case happyOut118 happy_x_1 of { happy_var_1 -> 
+	happyIn110
+		 (happy_var_1
+	)}
+
+happyReduce_337 = happySpecReduce_1  104# happyReduction_337
+happyReduction_337 happy_x_1
+	 =  case happyOut120 happy_x_1 of { happy_var_1 -> 
+	happyIn110
+		 (happy_var_1
+	)}
+
+happyReduce_338 = happySpecReduce_1  104# happyReduction_338
+happyReduction_338 happy_x_1
+	 =  case happyOut121 happy_x_1 of { happy_var_1 -> 
+	happyIn110
+		 (happy_var_1
+	)}
+
+happyReduce_339 = happySpecReduce_1  104# happyReduction_339
+happyReduction_339 happy_x_1
+	 =  case happyOut119 happy_x_1 of { happy_var_1 -> 
+	happyIn110
+		 (happy_var_1
+	)}
+
+happyReduce_340 = happyReduce 4# 105# happyReduction_340
+happyReduction_340 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
+	case happyOut27 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> 
+	happyIn111
+		 (OptionsPragma (fuseRange happy_var_1 happy_var_4) happy_var_3
+	) `HappyStk` happyRest}}}
+
+happyReduce_341 = happyReduce 5# 106# happyReduction_341
+happyReduction_341 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
+	case happyOutTok happy_x_3 of { (TokString happy_var_3) -> 
+	case happyOut28 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> 
+	happyIn112
+		 (BuiltinPragma (fuseRange happy_var_1 happy_var_5) (snd happy_var_3) (Ident happy_var_4)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_342 = happyReduce 5# 107# happyReduction_342
+happyReduction_342 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
+	case happyOut28 happy_x_3 of { happy_var_3 -> 
+	case happyOut27 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> 
+	happyIn113
+		 (CompiledPragma (fuseRange happy_var_1 happy_var_5) happy_var_3 (unwords happy_var_4)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_343 = happyReduce 5# 108# happyReduction_343
+happyReduction_343 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
+	case happyOut28 happy_x_3 of { happy_var_3 -> 
+	case happyOut27 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> 
+	happyIn114
+		 (CompiledTypePragma (fuseRange happy_var_1 happy_var_5) happy_var_3 (unwords happy_var_4)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_344 = happyReduce 6# 109# happyReduction_344
+happyReduction_344 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
+	case happyOut28 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokString happy_var_4) -> 
+	case happyOut27 happy_x_5 of { happy_var_5 -> 
+	case happyOutTok happy_x_6 of { (TokSymbol SymClosePragma happy_var_6) -> 
+	happyIn115
+		 (CompiledDataPragma (fuseRange happy_var_1 happy_var_6) happy_var_3 (snd happy_var_4) happy_var_5
+	) `HappyStk` happyRest}}}}}
+
+happyReduce_345 = happyReduce 5# 110# happyReduction_345
+happyReduction_345 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
+	case happyOut28 happy_x_3 of { happy_var_3 -> 
+	case happyOut27 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> 
+	happyIn116
+		 (CompiledEpicPragma (fuseRange happy_var_1 happy_var_5) happy_var_3 (unwords happy_var_4)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_346 = happyReduce 5# 111# happyReduction_346
+happyReduction_346 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
+	case happyOut28 happy_x_3 of { happy_var_3 -> 
+	case happyOut27 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> 
+	happyIn117
+		 (CompiledJSPragma (fuseRange happy_var_1 happy_var_5) happy_var_3 (unwords happy_var_4)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_347 = happyReduce 4# 112# happyReduction_347
+happyReduction_347 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
+	case happyOut28 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> 
+	happyIn118
+		 (StaticPragma (fuseRange happy_var_1 happy_var_4) happy_var_3
+	) `HappyStk` happyRest}}}
+
+happyReduce_348 = happyReduce 4# 113# happyReduction_348
+happyReduction_348 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
+	case happyOut28 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> 
+	happyIn119
+		 (EtaPragma (fuseRange happy_var_1 happy_var_4) happy_var_3
+	) `HappyStk` happyRest}}}
+
+happyReduce_349 = happyMonadReduce 4# 114# happyReduction_349
+happyReduction_349 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
+	case happyOutTok happy_x_3 of { (TokString happy_var_3) -> 
+	case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> 
+	( let s = snd happy_var_3 in
+       if validHaskellModuleName s
+       then return $ ImportPragma (fuseRange happy_var_1 happy_var_4) s
+       else parseError $ "Malformed module name: " ++ s ++ ".")}}}
+	) (\r -> happyReturn (happyIn120 r))
+
+happyReduce_350 = happySpecReduce_3  115# happyReduction_350
+happyReduction_350 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> 
+	case happyOutTok happy_x_3 of { (TokSymbol SymClosePragma happy_var_3) -> 
+	happyIn121
+		 (ImpossiblePragma (fuseRange happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_351 = happySpecReduce_3  116# happyReduction_351
+happyReduction_351 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut123 happy_x_2 of { happy_var_2 -> 
+	happyIn122
+		 (reverse happy_var_2
+	)}
+
+happyReduce_352 = happySpecReduce_3  117# happyReduction_352
+happyReduction_352 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut123 happy_x_1 of { happy_var_1 -> 
+	case happyOut77 happy_x_3 of { happy_var_3 -> 
+	happyIn123
+		 (reverse happy_var_3 ++ happy_var_1
+	)}}
+
+happyReduce_353 = happySpecReduce_1  117# happyReduction_353
+happyReduction_353 happy_x_1
+	 =  case happyOut77 happy_x_1 of { happy_var_1 -> 
+	happyIn123
+		 (reverse happy_var_1
+	)}
+
+happyReduce_354 = happySpecReduce_3  118# happyReduction_354
+happyReduction_354 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut125 happy_x_2 of { happy_var_2 -> 
+	happyIn124
+		 (reverse happy_var_2
+	)}
+
+happyReduce_355 = happySpecReduce_3  119# happyReduction_355
+happyReduction_355 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut125 happy_x_1 of { happy_var_1 -> 
+	case happyOut79 happy_x_3 of { happy_var_3 -> 
+	happyIn125
+		 (reverse happy_var_3 ++ happy_var_1
+	)}}
+
+happyReduce_356 = happySpecReduce_1  119# happyReduction_356
+happyReduction_356 happy_x_1
+	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
+	happyIn125
+		 (reverse happy_var_1
+	)}
+
+happyReduce_357 = happySpecReduce_3  120# happyReduction_357
+happyReduction_357 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut127 happy_x_2 of { happy_var_2 -> 
+	happyIn126
+		 (reverse happy_var_2
+	)}
+
+happyReduce_358 = happySpecReduce_3  121# happyReduction_358
+happyReduction_358 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut127 happy_x_1 of { happy_var_1 -> 
+	case happyOut80 happy_x_3 of { happy_var_3 -> 
+	happyIn127
+		 (reverse happy_var_3 ++ happy_var_1
+	)}}
+
+happyReduce_359 = happySpecReduce_1  121# happyReduction_359
+happyReduction_359 happy_x_1
+	 =  case happyOut80 happy_x_1 of { happy_var_1 -> 
+	happyIn127
+		 (reverse happy_var_1
+	)}
+
+happyReduce_360 = happySpecReduce_2  122# happyReduction_360
+happyReduction_360 happy_x_2
+	happy_x_1
+	 =  happyIn128
+		 ([]
+	)
+
+happyReduce_361 = happySpecReduce_1  122# happyReduction_361
+happyReduction_361 happy_x_1
+	 =  case happyOut122 happy_x_1 of { happy_var_1 -> 
+	happyIn128
+		 (happy_var_1
+	)}
+
+happyReduce_362 = happySpecReduce_2  123# happyReduction_362
+happyReduction_362 happy_x_2
+	happy_x_1
+	 =  happyIn129
+		 ((Nothing, [])
+	)
+
+happyReduce_363 = happySpecReduce_3  123# happyReduction_363
+happyReduction_363 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut87 happy_x_2 of { happy_var_2 -> 
+	happyIn129
+		 ((Just happy_var_2, [])
+	)}
+
+happyReduce_364 = happyReduce 5# 123# happyReduction_364
+happyReduction_364 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut87 happy_x_2 of { happy_var_2 -> 
+	case happyOut132 happy_x_4 of { happy_var_4 -> 
+	happyIn129
+		 ((Just happy_var_2, reverse happy_var_4)
+	) `HappyStk` happyRest}}
+
+happyReduce_365 = happySpecReduce_3  123# happyReduction_365
+happyReduction_365 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut132 happy_x_2 of { happy_var_2 -> 
+	happyIn129
+		 ((Nothing, reverse happy_var_2)
+	)}
+
+happyReduce_366 = happySpecReduce_3  124# happyReduction_366
+happyReduction_366 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut132 happy_x_2 of { happy_var_2 -> 
+	happyIn130
+		 (reverse happy_var_2
+	)}
+
+happyReduce_367 = happySpecReduce_2  125# happyReduction_367
+happyReduction_367 happy_x_2
+	happy_x_1
+	 =  happyIn131
+		 ([]
+	)
+
+happyReduce_368 = happySpecReduce_1  125# happyReduction_368
+happyReduction_368 happy_x_1
+	 =  case happyOut130 happy_x_1 of { happy_var_1 -> 
+	happyIn131
+		 (happy_var_1
+	)}
+
+happyReduce_369 = happySpecReduce_3  126# happyReduction_369
+happyReduction_369 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut132 happy_x_1 of { happy_var_1 -> 
+	case happyOut76 happy_x_3 of { happy_var_3 -> 
+	happyIn132
+		 (reverse happy_var_3 ++ happy_var_1
+	)}}
+
+happyReduce_370 = happySpecReduce_1  126# happyReduction_370
+happyReduction_370 happy_x_1
+	 =  case happyOut76 happy_x_1 of { happy_var_1 -> 
+	happyIn132
+		 (reverse happy_var_1
+	)}
+
+happyNewToken action sts stk
+	= lexer(\tk -> 
+	let cont i = happyDoAction i tk action sts stk in
+	case tk of {
+	TokEOF -> happyDoAction 76# tk action sts stk;
+	TokKeyword KwLet happy_dollar_dollar -> cont 1#;
+	TokKeyword KwIn happy_dollar_dollar -> cont 2#;
+	TokKeyword KwWhere happy_dollar_dollar -> cont 3#;
+	TokKeyword KwWith happy_dollar_dollar -> cont 4#;
+	TokKeyword KwRewrite happy_dollar_dollar -> cont 5#;
+	TokKeyword KwPostulate happy_dollar_dollar -> cont 6#;
+	TokKeyword KwPrimitive happy_dollar_dollar -> cont 7#;
+	TokKeyword KwOpen happy_dollar_dollar -> cont 8#;
+	TokKeyword KwImport happy_dollar_dollar -> cont 9#;
+	TokKeyword KwUsing happy_dollar_dollar -> cont 10#;
+	TokKeyword KwHiding happy_dollar_dollar -> cont 11#;
+	TokKeyword KwRenaming happy_dollar_dollar -> cont 12#;
+	TokKeyword KwTo happy_dollar_dollar -> cont 13#;
+	TokKeyword KwPublic happy_dollar_dollar -> cont 14#;
+	TokKeyword KwModule happy_dollar_dollar -> cont 15#;
+	TokKeyword KwData happy_dollar_dollar -> cont 16#;
+	TokKeyword KwCoData happy_dollar_dollar -> cont 17#;
+	TokKeyword KwRecord happy_dollar_dollar -> cont 18#;
+	TokKeyword KwConstructor happy_dollar_dollar -> cont 19#;
+	TokKeyword KwField happy_dollar_dollar -> cont 20#;
+	TokKeyword KwInfix happy_dollar_dollar -> cont 21#;
+	TokKeyword KwInfixL happy_dollar_dollar -> cont 22#;
+	TokKeyword KwInfixR happy_dollar_dollar -> cont 23#;
+	TokKeyword KwMutual happy_dollar_dollar -> cont 24#;
+	TokKeyword KwAbstract happy_dollar_dollar -> cont 25#;
+	TokKeyword KwPrivate happy_dollar_dollar -> cont 26#;
+	TokKeyword KwProp happy_dollar_dollar -> cont 27#;
+	TokKeyword KwSet happy_dollar_dollar -> cont 28#;
+	TokKeyword KwForall happy_dollar_dollar -> cont 29#;
+	TokKeyword KwSyntax happy_dollar_dollar -> cont 30#;
+	TokKeyword KwOPTIONS happy_dollar_dollar -> cont 31#;
+	TokKeyword KwBUILTIN happy_dollar_dollar -> cont 32#;
+	TokKeyword KwIMPORT happy_dollar_dollar -> cont 33#;
+	TokKeyword KwIMPOSSIBLE happy_dollar_dollar -> cont 34#;
+	TokKeyword KwETA happy_dollar_dollar -> cont 35#;
+	TokKeyword KwCOMPILED happy_dollar_dollar -> cont 36#;
+	TokKeyword KwCOMPILED_DATA happy_dollar_dollar -> cont 37#;
+	TokKeyword KwCOMPILED_TYPE happy_dollar_dollar -> cont 38#;
+	TokKeyword KwCOMPILED_EPIC happy_dollar_dollar -> cont 39#;
+	TokKeyword KwCOMPILED_JS happy_dollar_dollar -> cont 40#;
+	TokKeyword KwSTATIC happy_dollar_dollar -> cont 41#;
+	TokKeyword KwQuoteGoal happy_dollar_dollar -> cont 42#;
+	TokKeyword KwQuote happy_dollar_dollar -> cont 43#;
+	TokKeyword KwQuoteTerm happy_dollar_dollar -> cont 44#;
+	TokKeyword KwUnquote happy_dollar_dollar -> cont 45#;
+	TokSetN happy_dollar_dollar -> cont 46#;
+	TokTeX happy_dollar_dollar -> cont 47#;
+	TokComment happy_dollar_dollar -> cont 48#;
+	TokSymbol SymEllipsis happy_dollar_dollar -> cont 49#;
+	TokSymbol SymDotDot happy_dollar_dollar -> cont 50#;
+	TokSymbol SymDot happy_dollar_dollar -> cont 51#;
+	TokSymbol SymSemi happy_dollar_dollar -> cont 52#;
+	TokSymbol SymColon happy_dollar_dollar -> cont 53#;
+	TokSymbol SymEqual happy_dollar_dollar -> cont 54#;
+	TokSymbol SymUnderscore happy_dollar_dollar -> cont 55#;
+	TokSymbol SymQuestionMark happy_dollar_dollar -> cont 56#;
+	TokSymbol SymArrow happy_dollar_dollar -> cont 57#;
+	TokSymbol SymLambda happy_dollar_dollar -> cont 58#;
+	TokSymbol SymAs happy_dollar_dollar -> cont 59#;
+	TokSymbol SymBar happy_dollar_dollar -> cont 60#;
+	TokSymbol SymOpenParen happy_dollar_dollar -> cont 61#;
+	TokSymbol SymCloseParen happy_dollar_dollar -> cont 62#;
+	TokSymbol SymDoubleOpenBrace happy_dollar_dollar -> cont 63#;
+	TokSymbol SymDoubleCloseBrace happy_dollar_dollar -> cont 64#;
+	TokSymbol SymOpenBrace happy_dollar_dollar -> cont 65#;
+	TokSymbol SymCloseBrace happy_dollar_dollar -> cont 66#;
+	TokSymbol SymOpenVirtualBrace happy_dollar_dollar -> cont 67#;
+	TokSymbol SymCloseVirtualBrace happy_dollar_dollar -> cont 68#;
+	TokSymbol SymVirtualSemi happy_dollar_dollar -> cont 69#;
+	TokSymbol SymOpenPragma happy_dollar_dollar -> cont 70#;
+	TokSymbol SymClosePragma happy_dollar_dollar -> cont 71#;
+	TokId happy_dollar_dollar -> cont 72#;
+	TokQId happy_dollar_dollar -> cont 73#;
+	TokString happy_dollar_dollar -> cont 74#;
+	TokLiteral happy_dollar_dollar -> cont 75#;
+	_ -> happyError' tk
+	})
+
+happyError_ tk = happyError' tk
+
+happyThen :: () => Parser a -> (a -> Parser b) -> Parser b
+happyThen = (>>=)
+happyReturn :: () => a -> Parser a
+happyReturn = (return)
+happyThen1 = happyThen
+happyReturn1 :: () => a -> Parser a
+happyReturn1 = happyReturn
+happyError' :: () => (Token) -> Parser a
+happyError' tk = (\token -> happyError) tk
+
+tokensParser = happySomeParser where
+  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut6 x))
+
+exprParser = happySomeParser where
+  happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut29 x))
+
+moduleParser = happySomeParser where
+  happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut9 x))
+
+happySeq = happyDontSeq
+
+
+{--------------------------------------------------------------------------
+    Parsers
+ --------------------------------------------------------------------------}
+
+-- | Parse the token stream. Used by the TeX compiler.
+tokensParser :: Parser [Token]
+
+-- | Parse an expression. Could be used in interactions.
+exprParser :: Parser Expr
+
+-- | Parse a module.
+moduleParser :: Parser Module
+
+
+{--------------------------------------------------------------------------
+    Happy stuff
+ --------------------------------------------------------------------------}
+
+-- | Required by Happy.
+happyError :: Parser a
+happyError = parseError "Parse error"
+
+
+{--------------------------------------------------------------------------
+    Utility functions
+ --------------------------------------------------------------------------}
+
+-- | Create a name from a string.
+
+mkName :: (Interval, String) -> Parser Name
+mkName (i, s) = do
+    let xs = parts s
+    mapM_ isValidId xs
+    unless (alternating xs) $ fail $ "a name cannot contain two consecutive underscores"
+    return $ Name (getRange i) xs
+    where
+        parts :: String -> [NamePart]
+        parts ""        = []
+        parts ('_' : s) = Hole : parts s
+        parts s         = Id x : parts s'
+          where (x, s') = break (== '_') s
+
+	isValidId Hole   = return ()
+	isValidId (Id x) = case parse defaultParseFlags [0] (lexer return) x of
+	    ParseOk _ (TokId _) -> return ()
+	    _			-> fail $ "in the name " ++ s ++ ", the part " ++ x ++ " is not valid"
+
+	-- we know that there are no two Ids in a row
+	alternating (Hole : Hole : _) = False
+	alternating (_ : xs)	      = alternating xs
+	alternating []		      = True
+
+-- | Create a qualified name from a list of strings
+mkQName :: [(Interval, String)] -> Parser QName
+mkQName ss = do
+    xs <- mapM mkName ss
+    return $ foldr Qual (QName $ last xs) (init xs)
+
+-- | Match a particular name.
+isName :: String -> (Interval, String) -> Parser ()
+isName s (_,s')
+    | s == s'	= return ()
+    | otherwise	= fail $ "expected " ++ s ++ ", found " ++ s'
+
+-- | Build a forall pi (forall x y z -> ...)
+forallPi :: [LamBinding] -> Expr -> Expr
+forallPi bs e = Pi (map addType bs) e
+
+-- | Converts lambda bindings to typed bindings.
+addType :: LamBinding -> TypedBindings
+addType (DomainFull b)	 = b
+addType (DomainFree h rel x) = TypedBindings r $ Arg h rel $ TBind r [x] $ Underscore r Nothing
+  where r = getRange x
+
+-- | Check that an import directive doesn't contain repeated names
+verifyImportDirective :: ImportDirective -> Parser ImportDirective
+verifyImportDirective i =
+    case filter ((>1) . length)
+	 $ group
+	 $ sort xs
+    of
+	[]  -> return i
+	yss -> let Just pos = rStart $ getRange $ head $ concat yss in
+               parseErrorAt pos $
+		"repeated name" ++ s ++ " in import directive: " ++
+		concat (intersperse ", " $ map (show . head) yss)
+	    where
+		s = case yss of
+			[_] -> ""
+			_   -> "s"
+    where
+	xs = names (usingOrHiding i) ++ map renFrom (renaming i)
+	names (Using xs)    = xs
+	names (Hiding xs)   = xs
+
+-- | Breaks up a string into substrings. Returns every maximal
+-- subsequence of zero or more characters distinct from @'.'@.
+--
+-- > splitOnDots ""         == [""]
+-- > splitOnDots "foo.bar"  == ["foo", "bar"]
+-- > splitOnDots ".foo.bar" == ["", "foo", "bar"]
+-- > splitOnDots "foo.bar." == ["foo", "bar", ""]
+-- > splitOnDots "foo..bar" == ["foo", "", "bar"]
+splitOnDots :: String -> [String]
+splitOnDots ""        = [""]
+splitOnDots ('.' : s) = [] : splitOnDots s
+splitOnDots (c   : s) = case splitOnDots s of
+  p : ps -> (c : p) : ps
+
+prop_splitOnDots = and
+  [ splitOnDots ""         == [""]
+  , splitOnDots "foo.bar"  == ["foo", "bar"]
+  , splitOnDots ".foo.bar" == ["", "foo", "bar"]
+  , splitOnDots "foo.bar." == ["foo", "bar", ""]
+  , splitOnDots "foo..bar" == ["foo", "", "bar"]
+  ]
+
+-- | Returns 'True' iff the name is a valid Haskell (hierarchical)
+-- module name.
+validHaskellModuleName :: String -> Bool
+validHaskellModuleName = all ok . splitOnDots
+  where
+  -- Checks if a dot-less module name is well-formed.
+  ok :: String -> Bool
+  ok []      = False
+  ok (c : s) =
+    isUpper c &&
+    all (\c -> isLower c || c == '_' ||
+               isUpper c ||
+               generalCategory c == DecimalNumber ||
+               c == '\'')
+        s
+
+{--------------------------------------------------------------------------
+    Patterns
+ --------------------------------------------------------------------------}
+
+-- | Turn an expression into a left hand side.
+exprToLHS :: Expr -> Parser ([Expr] -> [Expr] -> LHS)
+exprToLHS e = case e of
+  WithApp r e es -> LHS <$> exprToPattern e <*> mapM exprToPattern es
+  _		 -> LHS <$> exprToPattern e <*> return []
+
+-- | Turn an expression into a pattern. Fails if the expression is not a
+--   valid pattern.
+exprToPattern :: Expr -> Parser Pattern
+exprToPattern e =
+    case e of
+	Ident x			-> return $ IdentP x
+	App _ e1 e2		-> AppP <$> exprToPattern e1
+					<*> T.mapM (T.mapM exprToPattern) e2
+	Paren r e		-> ParenP r
+					<$> exprToPattern e
+	Underscore r _		-> return $ WildP r
+	Absurd r		-> return $ AbsurdP r
+	As r x e		-> AsP r x <$> exprToPattern e
+	Dot r (HiddenArg _ e)	-> return $ HiddenP r $ fmap (DotP r) e
+	Dot r e			-> return $ DotP r e
+	Lit l			-> return $ LitP l
+	HiddenArg r e		-> HiddenP r <$> T.mapM exprToPattern e
+	InstanceArg r e		-> InstanceP r <$> T.mapM exprToPattern e
+	RawApp r es		-> RawAppP r <$> mapM exprToPattern es
+	OpApp r x es		-> OpAppP r x <$> mapM opAppExprToPattern es
+	_			->
+          let Just pos = rStart $ getRange e in
+          parseErrorAt pos $ "Not a valid pattern: " ++ show e
+
+opAppExprToPattern :: OpApp Expr -> Parser Pattern
+opAppExprToPattern (SyntaxBindingLambda _ _ _) = parseError "syntax binding lambda cannot appear in a pattern"
+opAppExprToPattern (Ordinary e) = exprToPattern e
+
+parsePanic s = parseError $ "Internal parser error: " ++ s ++ ". Please report this as a bug."
+
+{--------------------------------------------------------------------------
+    Tests
+ --------------------------------------------------------------------------}
+
+-- | Test suite.
+tests :: IO Bool
+tests = runTests "Agda.Syntax.Parser.Parser"
+  [ quickCheck' prop_splitOnDots
+  ]
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "<built-in>" #-}
+{-# LINE 1 "<command-line>" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp 
+
+{-# LINE 30 "templates/GenericTemplate.hs" #-}
+
+
+data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList
+
+
+
+
+
+{-# LINE 51 "templates/GenericTemplate.hs" #-}
+
+{-# LINE 61 "templates/GenericTemplate.hs" #-}
+
+{-# LINE 70 "templates/GenericTemplate.hs" #-}
+
+infixr 9 `HappyStk`
+data HappyStk a = HappyStk a (HappyStk a)
+
+-----------------------------------------------------------------------------
+-- starting the parse
+
+happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll
+
+-----------------------------------------------------------------------------
+-- Accepting the parse
+
+-- If the current token is 0#, it means we've just accepted a partial
+-- parse (a %partial parser).  We must ignore the saved token on the top of
+-- the stack in this case.
+happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =
+	happyReturn1 ans
+happyAccept j tk st sts (HappyStk ans _) = 
+	(happyTcHack j (happyTcHack st)) (happyReturn1 ans)
+
+-----------------------------------------------------------------------------
+-- Arrays only: do the next action
+
+
+
+happyDoAction i tk st
+	= {- nothing -}
+
+
+	  case action of
+		0#		  -> {- nothing -}
+				     happyFail i tk st
+		-1# 	  -> {- nothing -}
+				     happyAccept i tk st
+		n | (n Happy_GHC_Exts.<# (0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}
+
+				     (happyReduceArr Happy_Data_Array.! rule) i tk st
+				     where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))
+		n		  -> {- nothing -}
+
+
+				     happyShift new_state i tk st
+				     where (new_state) = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))
+   where (off)    = indexShortOffAddr happyActOffsets st
+         (off_i)  = (off Happy_GHC_Exts.+# i)
+	 check  = if (off_i Happy_GHC_Exts.>=# (0# :: Happy_GHC_Exts.Int#))
+			then (indexShortOffAddr happyCheck off_i Happy_GHC_Exts.==#  i)
+			else False
+         (action)
+          | check     = indexShortOffAddr happyTable off_i
+          | otherwise = indexShortOffAddr happyDefActions st
+
+{-# LINE 130 "templates/GenericTemplate.hs" #-}
+
+
+indexShortOffAddr (HappyA# arr) off =
+	Happy_GHC_Exts.narrow16Int# i
+  where
+        i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)
+        high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))
+        low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))
+        off' = off Happy_GHC_Exts.*# 2#
+
+
+
+
+
+data HappyAddr = HappyA# Happy_GHC_Exts.Addr#
+
+
+
+
+-----------------------------------------------------------------------------
+-- HappyState data type (not arrays)
+
+{-# LINE 163 "templates/GenericTemplate.hs" #-}
+
+-----------------------------------------------------------------------------
+-- Shifting a token
+
+happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =
+     let (i) = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
+--     trace "shifting the error token" $
+     happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)
+
+happyShift new_state i tk st sts stk =
+     happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)
+
+-- happyReduce is specialised for the common cases.
+
+happySpecReduce_0 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_0 nt fn j tk st@((action)) sts stk
+     = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)
+
+happySpecReduce_1 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')
+     = let r = fn v1 in
+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
+
+happySpecReduce_2 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')
+     = let r = fn v1 v2 in
+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
+
+happySpecReduce_3 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')
+     = let r = fn v1 v2 v3 in
+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
+
+happyReduce k i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happyReduce k nt fn j tk st sts stk
+     = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of
+	 sts1@((HappyCons (st1@(action)) (_))) ->
+        	let r = fn stk in  -- it doesn't hurt to always seq here...
+       		happyDoSeq r (happyGoto nt j tk st1 sts1 r)
+
+happyMonadReduce k nt fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happyMonadReduce k nt fn j tk st sts stk =
+        happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))
+       where (sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))
+             drop_stk = happyDropStk k stk
+
+happyMonad2Reduce k nt fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happyMonad2Reduce k nt fn j tk st sts stk =
+       happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))
+       where (sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))
+             drop_stk = happyDropStk k stk
+
+             (off) = indexShortOffAddr happyGotoOffsets st1
+             (off_i) = (off Happy_GHC_Exts.+# nt)
+             (new_state) = indexShortOffAddr happyTable off_i
+
+
+
+
+happyDrop 0# l = l
+happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t
+
+happyDropStk 0# l = l
+happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs
+
+-----------------------------------------------------------------------------
+-- Moving to a new state after a reduction
+
+
+happyGoto nt j tk st = 
+   {- nothing -}
+   happyDoAction j tk new_state
+   where (off) = indexShortOffAddr happyGotoOffsets st
+         (off_i) = (off Happy_GHC_Exts.+# nt)
+         (new_state) = indexShortOffAddr happyTable off_i
+
+
+
+
+-----------------------------------------------------------------------------
+-- Error recovery (0# is the error token)
+
+-- parse error if we are in recovery and we fail again
+happyFail  0# tk old_st _ stk =
+--	trace "failing" $ 
+    	happyError_ tk
+
+{-  We don't need state discarding for our restricted implementation of
+    "error".  In fact, it can cause some bogus parses, so I've disabled it
+    for now --SDM
+
+-- discard a state
+happyFail  0# tk old_st (HappyCons ((action)) (sts)) 
+						(saved_tok `HappyStk` _ `HappyStk` stk) =
+--	trace ("discarding state, depth " ++ show (length stk))  $
+	happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))
+-}
+
+-- Enter error recovery: generate an error token,
+--                       save the old token and carry on.
+happyFail  i tk (action) sts stk =
+--      trace "entering error recovery" $
+	happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)
+
+-- Internal happy errors:
+
+notHappyAtAll :: a
 notHappyAtAll = error "Internal Happy error\n"
 
 -----------------------------------------------------------------------------
diff --git a/doc/release-notes/2-3-0.txt b/doc/release-notes/2-3-0.txt
new file mode 100644
--- /dev/null
+++ b/doc/release-notes/2-3-0.txt
@@ -0,0 +1,1005 @@
+------------------------------------------------------------------------
+-- Release notes for Agda 2 version 2.3.0
+------------------------------------------------------------------------
+
+Important changes since 2.2.10:
+
+Language
+========
+
+* New more liberal syntax for mutually recursive definitions.
+
+  It is no longer necessary to use the 'mutual' keyword to define
+  mutually recursive functions or datatypes. Instead, it is enough to
+  declare things before they are used. Instead of
+
+    mutual
+      f : A
+      f = a[f, g]
+
+      g : B[f]
+      g = b[f, g]
+
+  you can now write
+
+    f : A
+    g : B[f]
+    f = a[f, g]
+    g = b[f, g].
+
+  With the new style you have more freedom in choosing the order in
+  which things are type checked (previously type signatures were
+  always checked before definitions). Furthermore you can mix
+  arbitrary declarations, such as modules and postulates, with
+  mutually recursive definitions.
+
+  For data types and records the following new syntax is used to
+  separate the declaration from the definition:
+
+    -- Declaration.
+    data Vec (A : Set) : Nat → Set  -- Note the absence of 'where'.
+
+    -- Definition.
+    data Vec A where
+      []   : Vec A zero
+      _::_ : {n : Nat} → A → Vec A n → Vec A (suc n)
+
+    -- Declaration.
+    record Sigma (A : Set) (B : A → Set) : Set
+
+    -- Definition.
+    record Sigma A B where
+      constructor _,_
+      field fst : A
+            snd : B fst
+
+  When making separated declarations/definitions private or abstract
+  you should attach the 'private' keyword to the declaration and the
+  'abstract' keyword to the definition. For instance, a private,
+  abstract function can be defined as
+
+    private
+      f : A
+    abstract
+      f = e
+
+  Finally it may be worth noting that the old style of mutually
+  recursive definitions is still supported (it basically desugars into
+  the new style).
+
+* Pattern matching lambdas.
+
+  Anonymous pattern matching functions can be defined using the syntax
+
+    \ { p11 .. p1n -> e1 ; ... ; pm1 .. pmn -> em }
+
+  (where, as usual, \ and -> can be replaced by λ and →). Internally
+  this is translated into a function definition of the following form:
+
+    .extlam p11 .. p1n = e1
+    ...
+    .extlam pm1 .. pmn = em
+
+  This means that anonymous pattern matching functions are generative.
+  For instance, refl will not be accepted as an inhabitant of the type
+
+    (λ { true → true ; false → false }) ≡
+    (λ { true → true ; false → false }),
+
+  because this is equivalent to extlam1 ≡ extlam2 for some distinct
+  fresh names extlam1 and extlam2.
+
+  Currently the 'where' and 'with' constructions are not allowed in
+  (the top-level clauses of) anonymous pattern matching functions.
+
+  Examples:
+
+    and : Bool → Bool → Bool
+    and = λ { true x → x ; false _ → false }
+
+    xor : Bool → Bool → Bool
+    xor = λ { true  true  → false
+            ; false false → false
+            ; _     _     → true
+            }
+
+    fst : {A : Set} {B : A → Set} → Σ A B → A
+    fst = λ { (a , b) → a }
+
+    snd : {A : Set} {B : A → Set} (p : Σ A B) → B (fst p)
+    snd = λ { (a , b) → b }
+
+* Record update syntax.
+
+  Assume that we have a record type and a corresponding value:
+
+    record MyRecord : Set where
+      field
+        a b c : ℕ
+
+    old : MyRecord
+    old = record { a = 1; b = 2; c = 3 }
+
+  Then we can update (some of) the record value's fields in the
+  following way:
+
+    new : MyRecord
+    new = record old { a = 0; c = 5 }
+
+  Here new normalises to record { a = 0; b = 2; c = 5 }. Any
+  expression yielding a value of type MyRecord can be used instead of
+  old.
+
+  Record updating is not allowed to change types: the resulting value
+  must have the same type as the original one, including the record
+  parameters. Thus, the type of a record update can be inferred if the type
+  of the original record can be inferred.
+
+  The record update syntax is expanded before type checking. When the
+  expression
+
+    record old { upd-fields }
+
+  is checked against a record type R, it is expanded to
+
+    let r = old in record { new-fields },
+
+  where old is required to have type R and new-fields is defined as
+  follows: for each field x in R,
+
+    - if x = e is contained in upd-fields then x = e is included in
+      new-fields, and otherwise
+    - if x is an explicit field then x = R.x r is included in
+      new-fields, and
+    - if x is an implicit or instance field, then it is omitted from
+      new-fields.
+
+  (Instance arguments are explained below.) The reason for treating
+  implicit and instance fields specially is to allow code like the
+  following:
+
+    record R : Set where
+      field
+        {length} : ℕ
+        vec      : Vec ℕ length
+        -- More fields…
+
+    xs : R
+    xs = record { vec = 0 ∷ 1 ∷ 2 ∷ [] }
+
+    ys = record xs { vec = 0 ∷ [] }
+
+  Without the special treatment the last expression would need to
+  include a new binding for length (for instance "length = _").
+
+* Record patterns which do not contain data type patterns, but which
+  do contain dot patterns, are no longer rejected.
+
+* When the --without-K flag is used literals are now treated as
+  constructors.
+
+* Under-applied functions can now reduce.
+
+  Consider the following definition:
+
+    id : {A : Set} → A → A
+    id x = x
+
+  Previously the expression id would not reduce. This has been changed
+  so that it now reduces to λ x → x. Usually this makes little
+  difference, but it can be important in conjunction with 'with'. See
+  issue 365 for an example.
+
+* Unused AgdaLight legacy syntax (x y : A; z v : B) for telescopes has
+  been removed.
+
+Universe polymorphism
+---------------------
+
+* Universe polymorphism is now enabled by default.
+  Use --no-universe-polymorphism to disable it.
+
+* Universe levels are no longer defined as a data type.
+
+  The basic level combinators can be introduced in the following way:
+
+  postulate
+    Level : Set
+    zero  : Level
+    suc   : Level → Level
+    max   : Level → Level → Level
+
+  {-# BUILTIN LEVEL     Level #-}
+  {-# BUILTIN LEVELZERO zero  #-}
+  {-# BUILTIN LEVELSUC  suc   #-}
+  {-# BUILTIN LEVELMAX  max   #-}
+
+* The BUILTIN equality is now required to be universe-polymorphic.
+
+* trustMe is now universe-polymorphic.
+
+Meta-variables and unification
+------------------------------
+
+* Unsolved meta-variables are now frozen after every mutual block.
+  This means that they cannot be instantiated by subsequent code. For
+  instance,
+
+    one : Nat
+    one = _
+
+    bla : one ≡ suc zero
+    bla = refl
+
+  leads to an error now, whereas previously it lead to the
+  instantiation of _ with "suc zero". If you want to make use of the
+  old behaviour, put the two definitions in a mutual block.
+
+  All meta-variables are unfrozen during interactive editing, so that
+  the user can fill holes interactively. Note that type-checking of
+  interactively given terms is not perfect: Agda sometimes refuses to
+  load a file, even though no complaints were raised during the
+  interactive construction of the file. This is because certain checks
+  (for instance, positivity) are only invoked when a file is loaded.
+
+* Record types can now be inferred.
+
+  If there is a unique known record type with fields matching the
+  fields in a record expression, then the type of the expression will
+  be inferred to be the record type applied to unknown parameters.
+
+  If there is no known record type with the given fields the type
+  checker will give an error instead of producing lots of unsolved
+  meta-variables.
+
+  Note that "known record type" refers to any record type in any
+  imported module, not just types which are in scope.
+
+* The occurrence checker distinguishes rigid and strongly rigid
+  occurrences [Reed, LFMTP 2009; Abel & Pientka, TLCA 2011].
+
+  The completeness checker now accepts the following code:
+
+    h : (n : Nat) → n ≡ suc n → Nat
+    h n ()
+
+  Internally this generates a constraint _n = suc _n where the
+  meta-variable _n occurs strongly rigidly, i.e. on a constructor path
+  from the root, in its own defining term tree. This is never
+  solvable.
+
+  Weakly rigid recursive occurrences may have a solution [Jason Reed's
+  PhD thesis, page 106]:
+
+    test : (k : Nat) →
+           let X : (Nat → Nat) → Nat
+               X = _
+           in
+           (f : Nat → Nat) → X f ≡ suc (f (X (λ x → k)))
+    test k f = refl
+
+  The constraint _X k f = suc (f (_X k (λ x → k))) has the solution
+  _X k f = suc (f (suc k)), despite the recursive occurrence of _X.
+  Here _X is not strongly rigid, because it occurs under the bound
+  variable f. Previously Agda rejected this code; now it instead
+  complains about an unsolved meta-variable.
+
+* Equation constraints involving the same meta-variable in the head
+  now trigger pruning [Pientka, PhD, Sec. 3.1.2; Abel & Pientka, TLCA
+  2011]. Example:
+
+    same : let X : A → A → A → A × A
+               X = _
+           in {x y z : A} → X x y y ≡ (x , y)
+                          × X x x y ≡ X x y y
+    same = refl , refl
+
+  The second equation implies that X cannot depend on its second
+  argument. After pruning the first equation is linear and can be
+  solved.
+
+* Instance arguments.
+
+  A new type of hidden function arguments has been added: instance
+  arguments. This new feature is based on influences from Scala's
+  implicits and Agda's existing implicit arguments.
+
+  Plain implicit arguments are marked by single braces: {…}. Instance
+  arguments are instead marked by double braces: {{…}}. Example:
+
+    postulate
+      A : Set
+      B : A → Set
+      a : A
+      f : {{a : A}} → B a
+
+  Instead of the double braces you can use the symbols ⦃ and ⦄, but
+  these symbols must in many cases be surrounded by whitespace. (If
+  you are using Emacs and the Agda input method, then you can conjure
+  up the symbols by typing "\{{" and "\}}", respectively.)
+
+  Instance arguments behave as ordinary implicit arguments, except for
+  one important aspect: resolution of arguments which are not provided
+  explicitly. For instance, consider the following code:
+
+    test = f
+
+  Here Agda will notice that f's instance argument was not provided
+  explicitly, and try to infer it. All definitions in scope at f's
+  call site, as well as all variables in the context, are considered.
+  If exactly one of these names has the required type (A), then the
+  instance argument will be instantiated to this name.
+
+  This feature can be used as an alternative to Haskell type classes.
+  If we define
+
+    record Eq (A : Set) : Set where
+      field equal : A → A → Bool,
+
+  then we can define the following projection:
+
+    equal : {A : Set} {{eq : Eq A}} → A → A → Bool
+    equal {{eq}} = Eq.equal eq
+
+  Now consider the following expression:
+
+    equal false false ∨ equal 3 4
+
+  If the following Eq "instances" for Bool and ℕ are in scope, and no
+  others, then the expression is accepted:
+
+    eq-Bool : Eq Bool
+    eq-Bool = record { equal = … }
+
+    eq-ℕ : Eq ℕ
+    eq-ℕ = record { equal = … }
+
+  A shorthand notation is provided to avoid the need to define
+  projection functions manually:
+
+    module Eq-with-implicits = Eq {{...}}
+
+  This notation creates a variant of Eq's record module, where the
+  main Eq argument is an instance argument instead of an explicit one.
+  It is equivalent to the following definition:
+
+    module Eq-with-implicits {A : Set} {{eq : Eq A}} = Eq eq
+
+  Note that the short-hand notation allows you to avoid naming the
+  "-with-implicits" module:
+
+    open Eq {{...}}
+
+
+  Instance argument resolution is not recursive. As an example,
+  consider the following "parametrised instance":
+
+    eq-List : {A : Set} → Eq A → Eq (List A)
+    eq-List {A} eq = record { equal = eq-List-A }
+      where
+      eq-List-A : List A → List A → Bool
+      eq-List-A []       []       = true
+      eq-List-A (a ∷ as) (b ∷ bs) = equal a b ∧ eq-List-A as bs
+      eq-List-A _        _        = false
+
+  Assume that the only Eq instances in scope are eq-List and eq-ℕ.
+  Then the following code does not type-check:
+
+    test = equal (1 ∷ 2 ∷ []) (3 ∷ 4 ∷ [])
+
+  However, we can make the code work by constructing a suitable
+  instance manually:
+
+    test′ = equal (1 ∷ 2 ∷ []) (3 ∷ 4 ∷ [])
+      where eq-List-ℕ = eq-List eq-ℕ
+
+  By restricting the "instance search" to be non-recursive we avoid
+  introducing a new, compile-time-only evaluation model to Agda.
+
+  For more information about instance arguments, see Devriese &
+  Piessens [ICFP 2011]. Some examples are also available in the
+  examples/instance-arguments subdirectory of the Agda distribution.
+
+Irrelevance
+-----------
+
+* Dependent irrelevant function types.
+
+  Some examples illustrating the syntax of dependent irrelevant
+  function types:
+
+    .(x y : A) → B    .{x y z : A} → B
+    ∀ x .y → B        ∀ x .{y} {z} .v → B
+
+  The declaration
+
+    f : .(x : A) → B[x]
+    f x = t[x]
+
+  requires that x is irrelevant both in t[x] and in B[x]. This is
+  possible if, for instance, B[x] = B′ x, with B′ : .A → Set.
+
+  Dependent irrelevance allows us to define the eliminator for the
+  Squash type:
+
+    record Squash (A : Set) : Set where
+      constructor squash
+      field
+        .proof : A
+
+    elim-Squash : {A : Set} (P : Squash A → Set)
+                  (ih : .(a : A) → P (squash a)) →
+                  (a⁻ : Squash A) → P a⁻
+    elim-Squash P ih (squash a) = ih a
+
+  Note that this would not type-check with
+  (ih : (a : A) -> P (squash a)).
+
+* Records with only irrelevant fields.
+
+  The following now works:
+
+    record IsEquivalence {A : Set} (_≈_ : A → A → Set) : Set where
+      field
+        .refl  : Reflexive _≈_
+        .sym   : Symmetric _≈_
+        .trans : Transitive _≈_
+
+    record Setoid : Set₁ where
+      infix 4 _≈_
+      field
+        Carrier        : Set
+        _≈_            : Carrier → Carrier → Set
+        .isEquivalence : IsEquivalence _≈_
+
+      open IsEquivalence isEquivalence public
+
+  Previously Agda complained about the application
+  IsEquivalence isEquivalence, because isEquivalence is irrelevant and
+  the IsEquivalence module expected a relevant argument. Now, when
+  record modules are generated for records consisting solely of
+  irrelevant arguments, the record parameter is made irrelevant:
+
+    module IsEquivalence {A : Set} {_≈_ : A → A → Set}
+                         .(r : IsEquivalence {A = A} _≈_) where
+      …
+
+* Irrelevant things are no longer erased internally. This means that
+  they are printed as ordinary terms, not as "_" as before.
+
+* The new flag --experimental-irrelevance enables irrelevant universe
+  levels and matching on irrelevant data when only one constructor is
+  available. These features are very experimental and likely to change
+  or disappear.
+
+Reflection
+----------
+
+* The reflection API has been extended to mirror features like
+  irrelevance, instance arguments and universe polymorphism, and to
+  give (limited) access to definitions. For completeness all the
+  builtins and primitives are listed below:
+
+    -- Names.
+
+    postulate Name : Set
+
+    {-# BUILTIN QNAME Name #-}
+
+    primitive
+      -- Equality of names.
+      primQNameEquality : Name → Name → Bool
+
+    -- Is the argument visible (explicit), hidden (implicit), or an
+    -- instance argument?
+
+    data Visibility : Set where
+      visible hidden instance : Visibility
+
+    {-# BUILTIN HIDING   Visibility #-}
+    {-# BUILTIN VISIBLE  visible    #-}
+    {-# BUILTIN HIDDEN   hidden     #-}
+    {-# BUILTIN INSTANCE instance   #-}
+
+    -- Arguments can be relevant or irrelevant.
+
+    data Relevance : Set where
+      relevant irrelevant : Relevance
+
+    {-# BUILTIN RELEVANCE  Relevance  #-}
+    {-# BUILTIN RELEVANT   relevant   #-}
+    {-# BUILTIN IRRELEVANT irrelevant #-}
+
+    -- Arguments.
+
+    data Arg A : Set where
+      arg : (v : Visibility) (r : Relevance) (x : A) → Arg A
+
+    {-# BUILTIN ARG    Arg #-}
+    {-# BUILTIN ARGARG arg #-}
+
+    -- Terms.
+
+    mutual
+      data Term : Set where
+        -- Variable applied to arguments.
+        var     : (x : ℕ) (args : List (Arg Term)) → Term
+        -- Constructor applied to arguments.
+        con     : (c : Name) (args : List (Arg Term)) → Term
+        -- Identifier applied to arguments.
+        def     : (f : Name) (args : List (Arg Term)) → Term
+        -- Different kinds of λ-abstraction.
+        lam     : (v : Visibility) (t : Term) → Term
+        -- Pi-type.
+        pi      : (t₁ : Arg Type) (t₂ : Type) → Term
+        -- A sort.
+        sort    : Sort → Term
+        -- Anything else.
+        unknown : Term
+
+      data Type : Set where
+        el : (s : Sort) (t : Term) → Type
+
+      data Sort : Set where
+        -- A Set of a given (possibly neutral) level.
+        set     : (t : Term) → Sort
+        -- A Set of a given concrete level.
+        lit     : (n : ℕ) → Sort
+        -- Anything else.
+        unknown : Sort
+
+    {-# BUILTIN AGDASORT            Sort    #-}
+    {-# BUILTIN AGDATYPE            Type    #-}
+    {-# BUILTIN AGDATERM            Term    #-}
+    {-# BUILTIN AGDATERMVAR         var     #-}
+    {-# BUILTIN AGDATERMCON         con     #-}
+    {-# BUILTIN AGDATERMDEF         def     #-}
+    {-# BUILTIN AGDATERMLAM         lam     #-}
+    {-# BUILTIN AGDATERMPI          pi      #-}
+    {-# BUILTIN AGDATERMSORT        sort    #-}
+    {-# BUILTIN AGDATERMUNSUPPORTED unknown #-}
+    {-# BUILTIN AGDATYPEEL          el      #-}
+    {-# BUILTIN AGDASORTSET         set     #-}
+    {-# BUILTIN AGDASORTLIT         lit     #-}
+    {-# BUILTIN AGDASORTUNSUPPORTED unknown #-}
+
+    postulate
+      -- Function definition.
+      Function  : Set
+      -- Data type definition.
+      Data-type : Set
+      -- Record type definition.
+      Record    : Set
+
+    {-# BUILTIN AGDAFUNDEF    Function  #-}
+    {-# BUILTIN AGDADATADEF   Data-type #-}
+    {-# BUILTIN AGDARECORDDEF Record    #-}
+
+    -- Definitions.
+
+    data Definition : Set where
+      function     : Function  → Definition
+      data-type    : Data-type → Definition
+      record′      : Record    → Definition
+      constructor′ : Definition
+      axiom        : Definition
+      primitive′   : Definition
+
+    {-# BUILTIN AGDADEFINITION                Definition   #-}
+    {-# BUILTIN AGDADEFINITIONFUNDEF          function     #-}
+    {-# BUILTIN AGDADEFINITIONDATADEF         data-type    #-}
+    {-# BUILTIN AGDADEFINITIONRECORDDEF       record′      #-}
+    {-# BUILTIN AGDADEFINITIONDATACONSTRUCTOR constructor′ #-}
+    {-# BUILTIN AGDADEFINITIONPOSTULATE       axiom        #-}
+    {-# BUILTIN AGDADEFINITIONPRIMITIVE       primitive′   #-}
+
+    primitive
+      -- The type of the thing with the given name.
+      primQNameType        : Name → Type
+      -- The definition of the thing with the given name.
+      primQNameDefinition  : Name → Definition
+      -- The constructors of the given data type.
+      primDataConstructors : Data-type → List Name
+
+  As an example the expression
+
+    primQNameType (quote zero)
+
+  is definitionally equal to
+
+    el (lit 0) (def (quote ℕ) [])
+
+  (if zero is a constructor of the data type ℕ).
+
+* New keyword: unquote.
+
+  The construction "unquote t" converts a representation of an Agda term
+  to actual Agda code in the following way:
+
+  1. The argument t must have type Term (see the reflection API above).
+
+  2. The argument is normalised.
+
+  3. The entire construction is replaced by the normal form, which is
+     treated as syntax written by the user and type-checked in the
+     usual way.
+
+  Examples:
+
+    test : unquote (def (quote ℕ) []) ≡ ℕ
+    test = refl
+
+    id : (A : Set) → A → A
+    id = unquote (lam visible (lam visible (var 0 [])))
+
+    id-ok : id ≡ (λ A (x : A) → x)
+    id-ok = refl
+
+* New keyword: quoteTerm.
+
+  The construction "quoteTerm t" is similar to "quote n", but whereas
+  quote is restricted to names n, quoteTerm accepts terms t. The
+  construction is handled in the following way:
+
+  1. The type of t is inferred. The term t must be type-correct.
+
+  2. The term t is normalised.
+
+  3. The construction is replaced by the Term representation (see the
+     reflection API above) of the normal form. Any unsolved metavariables
+     in the term are represented by the "unknown" term constructor.
+
+  Examples:
+
+    test₁ : quoteTerm (λ {A : Set} (x : A) → x) ≡
+            lam hidden (lam visible (var 0 []))
+    test₁ = refl
+
+    -- Local variables are represented as de Bruijn indices.
+    test₂ : (λ {A : Set} (x : A) → quoteTerm x) ≡ (λ x → var 0 [])
+    test₂ = refl
+
+    -- Terms are normalised before being quoted.
+    test₃ : quoteTerm (0 + 0) ≡ con (quote zero) []
+    test₃ = refl
+
+Compiler backends
+=================
+
+MAlonzo
+-------
+
+* The MAlonzo backend's FFI now handles universe polymorphism in a
+  better way.
+
+  The translation of Agda types and kinds into Haskell now supports
+  universe-polymorphic postulates. The core changes are that the
+  translation of function types has been changed from
+
+    T[[ Pi (x : A) B ]] =
+      if A has a Haskell kind then
+        forall x. () -> T[[ B ]]
+      else if x in fv B then
+        undef
+      else
+        T[[ A ]] -> T[[ B ]]
+
+  into
+
+    T[[ Pi (x : A) B ]] =
+      if x in fv B then
+        forall x. T[[ A ]] -> T[[ B ]]  -- Note: T[[A]] not Unit.
+      else
+        T[[ A ]] -> T[[ B ]],
+
+  and that the translation of constants (postulates, constructors and
+  literals) has been changed from
+
+    T[[ k As ]] =
+      if COMPILED_TYPE k T then
+        T T[[ As ]]
+      else
+        undef
+
+  into
+
+    T[[ k As ]] =
+      if COMPILED_TYPE k T then
+        T T[[ As ]]
+      else if COMPILED k E then
+        ()
+      else
+        undef.
+
+  For instance, assuming a Haskell definition
+
+    type AgdaIO a b = IO b,
+
+  we can set up universe-polymorphic IO in the following way:
+
+    postulate
+      IO     : ∀ {ℓ} → Set ℓ → Set ℓ
+      return : ∀ {a} {A : Set a} → A → IO A
+      _>>=_  : ∀ {a b} {A : Set a} {B : Set b} →
+               IO A → (A → IO B) → IO B
+
+    {-# COMPILED_TYPE IO AgdaIO              #-}
+    {-# COMPILED return  (\_ _ -> return)    #-}
+    {-# COMPILED _>>=_   (\_ _ _ _ -> (>>=)) #-}
+
+  This is accepted because (assuming that the universe level type is
+  translated to the Haskell unit type "()")
+
+    (\_ _ -> return)
+      : forall a. () -> forall b. () -> b -> AgdaIO a b
+      = T [[ ∀ {a} {A : Set a} → A → IO A ]]
+
+  and
+
+    (\_ _ _ _ -> (>>=))
+      : forall a. () -> forall b. () ->
+          forall c. () -> forall d. () ->
+            AgdaIO a c -> (c -> AgdaIO b d) -> AgdaIO b d
+      = T [[ ∀ {a b} {A : Set a} {B : Set b} →
+               IO A → (A → IO B) → IO B ]].
+
+Epic
+----
+
+* New Epic backend pragma: STATIC.
+
+  In the Epic backend, functions marked with the STATIC pragma will be
+  normalised before compilation. Example usage:
+
+    {-# STATIC power #-}
+
+    power : ℕ → ℕ → ℕ
+    power 0       x = 1
+    power 1       x = x
+    power (suc n) x = power n x * x
+
+  Occurrences of "power 4 x" will be replaced by "((x * x) * x) * x".
+
+* Some new optimisations have been implemented in the Epic backend:
+
+  - Removal of unused arguments.
+
+  A worker/wrapper transformation is performed so that unused
+  arguments can be removed by Epic's inliner. For instance, the map
+  function is transformed in the following way:
+
+    map_wrap : (A B : Set) → (A → B) → List A → List B
+    map_wrap A B f xs = map_work f xs
+
+    map_work f []       = []
+    map_work f (x ∷ xs) = f x ∷ map_work f xs
+
+  If map_wrap is inlined (which it will be in any saturated call),
+  then A and B disappear in the generated code.
+
+  Unused arguments are found using abstract interpretation. The bodies
+  of all functions in a module are inspected to decide which variables
+  are used. The behaviour of postulates is approximated based on their
+  types. Consider return, for instance:
+
+    postulate return : {A : Set} → A → IO A
+
+  The first argument of return can be removed, because it is of type
+  Set and thus cannot affect the outcome of a program at runtime.
+
+  - Injection detection.
+
+  At runtime many functions may turn out to be inefficient variants of
+  the identity function. This is especially true after forcing.
+  Injection detection replaces some of these functions with more
+  efficient versions. Example:
+
+    inject : {n : ℕ} → Fin n → Fin (1 + n)
+    inject {suc n} zero    = zero
+    inject {suc n} (suc i) = suc (inject {n} i)
+
+  Forcing removes the Fin constructors' ℕ arguments, so this function
+  is an inefficient identity function that can be replaced by the
+  following one:
+
+    inject {_} x = x
+
+  To actually find this function, we make the induction hypothesis
+  that inject is an identity function in its second argument and look
+  at the branches of the function to decide if this holds.
+
+  Injection detection also works over data type barriers. Example:
+
+    forget : {A : Set} {n : ℕ} → Vec A n → List A
+    forget []       = []
+    forget (x ∷ xs) = x ∷ forget xs
+
+  Given that the constructor tags (in the compiled Epic code) for
+  Vec.[] and List.[] are the same, and that the tags for Vec._∷_ and
+  List._∷_ are also the same, this is also an identity function. We
+  can hence replace the definition with the following one:
+
+    forget {_} xs = xs
+
+  To get this to apply as often as possible, constructor tags are
+  chosen /after/ injection detection has been run, in a way to make as
+  many functions as possible injections.
+
+  Constructor tags are chosen once per source file, so it may be
+  advantageous to define conversion functions like forget in the same
+  module as one of the data types. For instance, if Vec.agda imports
+  List.agda, then the forget function should be put in Vec.agda to
+  ensure that vectors and lists get the same tags (unless some other
+  injection function, which puts different constraints on the tags, is
+  prioritised).
+
+  - Smashing.
+
+  This optimisation finds types whose values are inferable at runtime:
+
+    * A data type with only one constructor where all fields are
+      inferable is itself inferable.
+    * Set ℓ is inferable (as it has no runtime representation).
+
+  A function returning an inferable data type can be smashed, which
+  means that it is replaced by a function which simply returns the
+  inferred value.
+
+  An important example of an inferable type is the usual propositional
+  equality type (_≡_). Any function returning a propositional equality
+  can simply return the reflexivity constructor directly without
+  computing anything.
+
+  This optimisation makes more arguments unused. It also makes the
+  Epic code size smaller, which in turn speeds up compilation.
+
+JavaScript
+----------
+
+* ECMAScript compiler backend.
+
+  A new compiler backend is being implemented, targetting ECMAScript
+  (also known as JavaScript), with the goal of allowing Agda programs
+  to be run in browsers or other ECMAScript environments.
+
+  The backend is still at an experimental stage: the core language is
+  implemented, but many features are still missing.
+
+  The ECMAScript compiler can be invoked from the command line using
+  the flag --js:
+
+    agda --js --compile-dir=<DIR> <FILE>.agda
+
+  Each source <FILE>.agda is compiled into an ECMAScript target
+  <DIR>/jAgda.<TOP-LEVEL MODULE NAME>.js. The compiler can also be
+  invoked using the Emacs mode (the variable agda2-backend controls
+  which backend is used).
+
+  Note that ECMAScript is a strict rather than lazy language. Since
+  Agda programs are total, this should not impact program semantics,
+  but it may impact their space or time usage.
+
+  ECMAScript does not support algebraic datatypes or pattern-matching.
+  These features are translated to a use of the visitor pattern. For
+  instance, the standard library's List data type and null function
+  are translated into the following code:
+
+    exports["List"] = {};
+    exports["List"]["[]"] = function (x0) {
+        return x0["[]"]();
+      };
+    exports["List"]["_∷_"] = function (x0) {
+        return function (x1) {
+          return function (x2) {
+            return x2["_∷_"](x0, x1);
+          };
+        };
+      };
+
+    exports["null"] = function (x0) {
+        return function (x1) {
+          return function (x2) {
+            return x2({
+              "[]": function () {
+                return jAgda_Data_Bool["Bool"]["true"];
+              },
+              "_∷_": function (x3, x4) {
+                return jAgda_Data_Bool["Bool"]["false"];
+              }
+            });
+          };
+        };
+      };
+
+  Agda records are translated to ECMAScript objects, preserving field
+  names.
+
+  Top-level Agda modules are translated to ECMAScript modules,
+  following the common.js module specification. A top-level Agda
+  module "Foo.Bar" is translated to an ECMAScript module
+  "jAgda.Foo.Bar".
+
+  The ECMAScript compiler does not compile to Haskell, so the pragmas
+  related to the Haskell FFI (IMPORT, COMPILED_DATA and COMPILED) are
+  not used by the ECMAScript backend. Instead, there is a COMPILED_JS
+  pragma which may be applied to any declaration. For postulates,
+  primitives, functions and values, it gives the ECMAScript code to be
+  emitted by the compiler. For data types, it gives a function which
+  is applied to a value of that type, and a visitor object. For
+  instance, a binding of natural numbers to ECMAScript integers
+  (ignoring overflow errors) is:
+
+    data ℕ : Set where
+      zero : ℕ
+      suc  : ℕ → ℕ
+
+    {-# COMPILED_JS ℕ function (x,v) {
+        if (x < 1) { return v.zero(); } else { return v.suc(x-1); }
+      } #-}
+    {-# COMPILED_JS zero 0 #-}
+    {-# COMPILED_JS suc function (x) { return x+1; } #-}
+
+    _+_ : ℕ → ℕ → ℕ
+    zero  + n = n
+    suc m + n = suc (m + n)
+
+    {-# COMPILED_JS _+_ function (x) { return function (y) {
+                          return x+y; };
+      } #-}
+
+  To allow FFI code to be optimised, the ECMAScript in a COMPILED_JS
+  declaration is parsed, using a simple parser that recognises a pure
+  functional subset of ECMAScript, consisting of functions, function
+  applications, return, if-statements, if-expressions,
+  side-effect-free binary operators (no precedence, left associative),
+  side-effect-free prefix operators, objects (where all member names
+  are quoted), field accesses, and string and integer literals.
+  Modules may be imported using the require("<module-id>") syntax: any
+  impure code, or code outside the supported fragment, can be placed
+  in a module and imported.
+
+Tools
+=====
+
+* New flag --safe, which can be used to type-check untrusted code.
+
+  This flag disables postulates, primTrustMe, and "unsafe" OPTION
+  pragmas, some of which are known to make Agda inconsistent.
+
+  Rejected pragmas:
+
+    --allow-unsolved-metas
+    --experimental-irrelevance
+    --guardedness-preserving-type-construtors
+    --injective-type-constructors
+    --no-coverage-check
+    --no-positivity-check
+    --no-termination-check
+    --sized-types
+    --type-in-type
+
+  Note that, at the moment, it is not possible to define the universe
+  level or coinduction primitives when --safe is used (because they
+  must be introduced as postulates). This can be worked around by
+  type-checking trusted files in a first pass, without using --safe,
+  and then using --safe in a second pass. Modules which have already
+  been type-checked are not re-type-checked just because --safe is
+  used.
+
+* Dependency graphs.
+
+  The new flag --dependency-graph=FILE can be used to generate a DOT
+  file containing a module dependency graph. The generated file (FILE)
+  can be rendered using a tool like dot.
+
+* The --no-unreachable-check flag has been removed.
+
+* Projection functions are highlighted as functions instead of as
+  fields. Field names (in record definitions and record values) are
+  still highlighted as fields.
+
+* Support for jumping to positions mentioned in the information
+  buffer has been added.
+
+* The "make install" command no longer installs Agda globally (by
+  default).
diff --git a/src/data/EpicInclude/AgdaPrelude.e b/src/data/EpicInclude/AgdaPrelude.e
--- a/src/data/EpicInclude/AgdaPrelude.e
+++ b/src/data/EpicInclude/AgdaPrelude.e
@@ -2,11 +2,12 @@
 
 -- IO
 
+{-
 %inline putStr (x:String) -> Unit =
-    foreign Unit "putStr" (x:String)
+    foreign Unit "wputStr" (x:String)
 
 putStrLn (x:String) -> Unit =
-    putStr(append(x,"\n"))
+    putStr(primStringAppend(x,"\n"))
 
 readStr () -> String =
     foreign String "readStr" ()
@@ -19,85 +20,172 @@
 
 printInt (x:Int) -> Unit =
     foreign Unit "printInt" (x:Int)
+-}
 
 ioreturn (a : Any, u : Unit) -> Any = a
-iobind (x : Any, f : Any, u : Unit) -> Any = f (x (u), u)
+iobind (x : Any, f : Any, u : Unit) -> Any = %effect (let v : Any = %effect (x(u)) in f (v, u))
 
 -- String operations
 
-append (x:String, y:String) -> String =
-    foreign String "append" (x:String, y:String)
+-- data String = Con 0 | Con 1 (Char*) String
 
-length (x:String) -> String =
-    foreign Int "strlen" (x:String)
+freadStr (stream : Ptr) -> Data =
+    let isEof : Bool = foreign Int "feof" (stream : Ptr)
+     in if isEof then Con 0 ()
+                 else let str : String = %effect(foreign String "freadStrChunk" (stream : Ptr))
+                       in Con 1 ( str , freadStr (stream))
 
-index (x:String, i:Int) -> Char =
-    foreign Int "strIndex" (x:String, i:Int)
+readStr (u : Unit) -> Data =
+    let isEof : Bool = foreign Int "eofstdin" ()
+     in if isEof then Con 0 ()
+                 else let str : String = %effect(foreign String "readStrChunk" ())
+                       in Con 1 ( str , readStr (u))
 
+primStringAppend (xs : Data, ys : Data) -> Data = case xs of
+  { Con 0 ()                        -> ys
+  | Con 1 (x : String, rest : Data) -> Con 1 (x, primStringAppend (rest, ys))
+  }
+
+length (xs : Data) -> Int = case xs of
+  { Con 0 () -> 0
+  | Con 1 (x : String, rest : Data) -> strlen(x) + length(rest)
+  }
+
+charAt (xs : Data, i : Int) -> Int = case xs of
+  { Con 0 () -> error "index: out of bounds!"
+  | Con 1 (x : String, rest : Data) -> 
+    let len : Int = strlen(x)
+     in (if i < len then foreign Int "strIndex" (x : String, i : Int)
+                    else charAt (rest, i - len))
+  }
+
+mkString (xs : Data) -> String = case xs of
+  { Con 0 () -> ""
+  | Con 1 (s : String , rest : Data) -> 
+    let rs : String = mkString (rest) in
+    {-let rsLen : Int = strlen (rs) in
+    if rsLen == 0 then s else-} foreign String "append" (s : String, rs : String)
+  }
+
+frString( xs : String) -> Data = Con 1 (xs , Con 0 ())
+
+primStringEquality (xs : Data, ys : Data) -> Bool =
+    foreign Int "eqString" (mkString(xs) : String, mkString(ys) : String)
+
+charToString (c : Int) -> Data = 
+    Con 1 (charToStr(c), Con 0 ())
+charToStr (c : Int) -> String = 
+    foreign String "charToStr" (c : Int)
+
+strlen (s : String) -> Int = foreign Int "strlen" (s : String)
+
+-- TODO: toList/fromList could be made slightly more efficient.
+
+primStringToListS (xs : String) -> Data = %effect(
+    let result : Data = primNil ()     in
+    let i      : Int  = strlen (xs) - 1 in
+    %while (i >= 0,
+       let ! result = primCons (foreign Int "strIndex" (xs : String, i : Int), result) in
+       let ! i      = i - 1 in
+       unit) ;
+    result)
+
+primStringToList (xs : Data) -> Data = case xs of
+  { Con 0 () -> primNil ()
+  | Con 1 (str : String, rest : Data) -> primListAppend(primStringToListS(str), primStringToList(rest))
+  }
+
+map (f : Any, l : Any) -> Any = case l of
+  { Con 0 () -> Con 0 ()
+  | Con 1 (x : Any, xs : Any) -> Con 1 (f (x), map (f, xs))
+  }
+
+primStringFromList (l : Data) -> String = map (charToStr, l)
+
+
+strCons(i : Int , s : String) -> String =
+   foreign String "strCons" (i : Int, s : String)
+
+-- Lists
+
+primNil () -> Data = Con 0 ()
+
+primCons(x : Any , xs : Data) -> Data = Con 1 (x, xs)
+
+listElim (op : Any, z : Any, xs : Data) -> Any = case xs of
+  { Con 0 () -> z
+  | Con 1 (y : Any, ys : Data) -> op (y, listElim(op, z, ys))
+  }
+
+primListAppend (xs : Data, ys : Data) -> Data = listElim(primCons, ys, xs)
 -- Big number arithmetic
 
 subBig (x:BigInt, y:BigInt) -> BigInt =
-   foreign BigInt "subBigInt" (x:BigInt, y:BigInt)
+   foreign BigInt "subBig" (x:BigInt, y:BigInt)
 
 gtBig (x:BigInt, y:BigInt) -> Bool =
-   foreign Int "gtBigInt" (x:BigInt, y:BigInt)
+   foreign Int "gtBig" (x:BigInt, y:BigInt)
 
 leBig (x:BigInt, y:BigInt) -> Bool =
-   foreign Int "leBigInt" (x:BigInt, y:BigInt)
+   foreign Int "leBig" (x:BigInt, y:BigInt)
 
 geBig (x:BigInt, y:BigInt) -> Bool =
-   foreign Int "geBigInt" (x:BigInt, y:BigInt)
+   foreign Int "geBig" (x:BigInt, y:BigInt)
 
 printBig (x:BigInt) -> Unit =
-   foreign Unit "printBigInt" (x:BigInt)
+   foreign Unit "printBig" (x:BigInt)
 
-bigIntToStr (x:BigInt) -> String =
-    foreign String "bigIntToStr" (x:BigInt)
+bigToStr (x:BigInt) -> Data =
+    frString(foreign String "bigToStr" (x:BigInt))
 
-strToBigInt (x:String) -> Int =
-    foreign String "strToBigInt" (x:String)
+strToBig (x : Data) -> Any = foreign BigInt "strToBig" (mkString(x) : String)
 
+-- strToBig (x:String) -> Any =
+--    foreign Any "strToBig" (x:String)
+
+bigToInt (x : BigInt) -> Int =
+    foreign Int "bigToInt" (x : BigInt)
+
 -- Unit
 
 %inline primUnit() -> Unit = unit
 
 -- Nats
 
-primNatPlus (x:BigInt, y:BigInt) -> BigInt =
-   foreign BigInt "addBigInt" (x:BigInt, y:BigInt)
+primNatPlus (x:Any, y:Any) -> Any =
+   foreign Any "addBig" (x:Any, y:Any)
 
-primNatTimes (x:BigInt, y:BigInt) -> BigInt =
-   foreign BigInt "mulBigInt" (x:BigInt, y:BigInt)
+primNatTimes (x:Any, y:Any) -> Any =
+   foreign Any "mulBig" (x:Any, y:Any)
 
-primZero() -> BigInt = 0L
+%inline primNatMinus(x : Any, y : Any) -> Any = atLeastZeroBig(subBig(x, y))
 
-primSuc (n : BigInt) -> BigInt = primNatPlus(n, 1L)
 
-primPred(n : BigInt) -> BigInt = subBig(n, 1L)
 
-%inline absBig (x : BigInt) -> BigInt = 
+primZero() -> Any = foreign BigInt "bigZero" ()
+primOne() -> Any  = foreign BigInt "bigOne" ()
+
+primSuc (n : Any) -> Any = primNatPlus(n, primOne())
+
+primPred(n : Any) -> Any = subBig(n, primOne())
+
+%inline atLeastZeroBig (x : Any) -> Any = 
   if primNatLess(x, primZero) 
      then primZero
      else x
 
-%inline primNatMinus(x : BigInt, y : BigInt) -> BigInt = absBig(subBig(x, y))
+primNatModSucAux(k : BigInt, m : BigInt, n : BigInt, j : BigInt) -> BigInt =
+    foreign BigInt "modBig" (n : BigInt, m : BigInt)
 
--- readInt () -> Int = foreign Int "readInt" ()
 
+
 primNatEquality (x:BigInt, y:BigInt) -> Bool =
-    foreign Int "eqBigInt" (x:BigInt, y:BigInt)
+    foreign Int "eqBig" (x:BigInt, y:BigInt)
 
 primNatLess (x:BigInt, y:BigInt) -> Bool =
-    foreign Int "ltBigInt" (x:BigInt, y:BigInt)
+    foreign Int "ltBig" (x:BigInt, y:BigInt)
 
--- Strings
 
--- Cannot call foreign "append" directly, for some reason
-%inline primStringAppend (x : String, y : String) -> String = append(x, y)
-
-primStringEquality (x : String, y : String) -> Bool =
-    foreign Int "eqString" (x : String, y : String)
-
 -- Bools
 
 %inline primTrue  () -> Bool = true
@@ -109,9 +197,33 @@
 printChar (x:Int) -> Unit =
     foreign Unit "printCharRep" (x:Int)
 
-init () -> Unit =
-    foreign Unit "init" ()
+%inline primCharEquality (c1 : Int, c2 : Int) -> Bool = c1 == c2
 
+primCharToNat (c : Int) -> BigInt = foreign BigInt "NEWBIGINTVALI" (c : Int)
+
+
+-- Floats
+floatToStr (x : Float) -> String =
+    foreign String "floatToStr" (x : Float)
+
+strToFloat (s : String) -> Float =
+    foreign Float "strToFloat" (s : String)
+
 -- Coinduction
 
 primSharp (u1 : Any, u2 : Any, x : Any) -> Data = Con 0 (x)
+
+-- RUNTIME
+
+init () -> Unit =
+    foreign Unit "init" ()
+    
+-- Levels
+
+primLevelMax  (x : Any, y : Any) -> Any = 0L -- error "primLevelMax"
+primLevelZero () -> Any = 0L -- error "primLevelZero"
+primLevelSuc  (x : Any) -> Any = primSuc(x) -- error "primLevelSuc"
+
+-- TrustMe
+
+primTrustMe (a : Unit, x : Any, y : Any) -> Any = Con 0 ()
diff --git a/src/data/EpicInclude/stdagda.c b/src/data/EpicInclude/stdagda.c
--- a/src/data/EpicInclude/stdagda.c
+++ b/src/data/EpicInclude/stdagda.c
@@ -6,17 +6,28 @@
 #include <sys/time.h>
 #include <locale.h>
 //#include "closure.h"
-#include "stdfuns.h"
 
+
 #define _UNICODE
 #define UNICODE
 
+void wputStr(char* s) { wprintf(L"%s",s); }
+
 int eqString(char *x, char *y) {
     return strcmp(x, y) == 0;
 }
 
+VAL bigZeroRep;
+VAL bigOneRep;
+
+VAL bigZero() { return bigZeroRep;}
+VAL bigOne() {return bigOneRep;}
+
 void init(void) {
   setlocale(LC_CTYPE, "");
+
+  bigZeroRep = NEWBIGINTVALI(0);
+  bigOneRep  = NEWBIGINTVALI(1);
 }
 
 void printCharRep(int c) {
@@ -24,21 +35,61 @@
   wprintf(L"%lc", c);
 }
 
-int bigToInt(mpz_t* n) {
-  return (int) mpz_get_si(*n);
+int bigToInt(VAL n) {
+  return (int) mpz_get_si(*(GETBIGINT(n)));
 }
 
-mpz_t* intToBig(int n) {
-  mpz_t* answer = EMALLOC(sizeof(mpz_t));
-  mpz_init(*answer);
-  mpz_set_si(*answer, (signed long int)n);
-  return answer; 
+VAL intToBig(int n) {
+  return NEWBIGINTVALI(n);
 } 
 
-VAL getArgBig(mpz_t* num) {
+VAL getArgBig(VAL num) {
   return evm_getArg(bigToInt(num));
 }
 
-mpz_t* numArgsBig(void) { 
-  return intToBig(epic_numArgs());
+VAL numArgsBig(void) { 
+  return NEWBIGINTVALI(epic_numArgs());
+}
+
+char* charToStr(int x)
+{
+    char* buf = EMALLOC(2*sizeof(char));
+    buf[0] = (char)x; buf[1] = '\0';
+    return buf;
+}
+
+int eof() { return EOF; }
+
+int charAtBig(char* str, VAL n)
+{
+    return (int)str[bigToInt(n)];
+}
+
+int charAt(char* str, int n) { return (int)str[n]; }
+
+#define STRING_BUFFER_SIZE 1024
+
+int eofstdin() { return feof(stdin);}
+
+char* readStrChunk() { return freadStrChunk(stdin); }
+
+char* freadStrChunk(FILE* f) {
+  char* in = EMALLOC(sizeof(char)*STRING_BUFFER_SIZE);
+  fgets(in,STRING_BUFFER_SIZE,f);
+  return in;
+}
+
+void** newArray(VAL size)
+{
+  return EMALLOC(sizeof(void*)*bigToInt(size));
+}
+
+void* arrayIndex(void** array, VAL i)
+{
+  return array[bigToInt(i)];
+}
+
+void setArrayIndex(void** array, VAL i, void* val)
+{
+  array[bigToInt(i)] = val;
 }
diff --git a/src/data/EpicInclude/stdagda.h b/src/data/EpicInclude/stdagda.h
--- a/src/data/EpicInclude/stdagda.h
+++ b/src/data/EpicInclude/stdagda.h
@@ -11,11 +11,31 @@
 #include <gc/gc.h>
 #include <gmp.h>
 #include <stdio.h>
+#include "stdfuns.h"
 void init(void);
 int eqString(char *x, char *y);
 void printCharRep(int c);
 
-char* getArgv(mpz_t* n);
-mpz_t* getArgc(void);
+void wputStr(char* s);
+
+int bigToInt(VAL n);
+VAL intToBig(int n);
+
+VAL getArgBig(VAL num);
+
+VAL numArgsBig(void);
+
+FILE* getStdin (void);
+FILE* getStdout(void);
+
+
+char* charToStr(int x);
+int charAt(char* str, int n);
+int charAtBig(char* str, VAL n);
+
+int eof();
+
+char* freadStrChunk(FILE* f);
+// void* freadStrChunk(void* h);
 
 #endif
diff --git a/src/data/emacs-mode/agda-input.el b/src/data/emacs-mode/agda-input.el
--- a/src/data/emacs-mode/agda-input.el
+++ b/src/data/emacs-mode/agda-input.el
@@ -41,6 +41,13 @@
             (list (string c))))
    (string-to-list s)))
 
+(defun agda-input-character-range (from to)
+  "A string consisting of the characters from FROM to TO."
+  (let (seq)
+    (dotimes (i (1+ (- to from)))
+      (setq seq (cons (+ from i) seq)))
+    (concat (nreverse seq))))
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Functions used to tweak translation pairs
 
@@ -383,6 +390,9 @@
   ("d-|"  . ("↧"))  ("dd-" . ("↡"))
   ("ud-|" . ("↨"))
 
+  ("l->" . ("↢"))
+  ("r->" . ("↣"))
+
   ("dz" . ("↯"))
 
   ;; Ellipsis.
@@ -468,8 +478,8 @@
 
   ;; Parentheses.
 
-  ("(" . ,(agda-input-to-string-list "([{⁅⁽₍〈⎴⟦⟨⟪〈《「『【〔〖〚︵︷︹︻︽︿﹁﹃﹙﹛﹝（［｛｢"))
-  (")" . ,(agda-input-to-string-list ")]}⁆⁾₎〉⎵⟧⟩⟫〉》」』】〕〗〛︶︸︺︼︾﹀﹂﹄﹚﹜﹞）］｝｣"))
+  ("(" . ,(agda-input-to-string-list "([{⁅⁽₍〈⎴⟅⟦⟨⟪⦃〈《「『【〔〖〚︵︷︹︻︽︿﹁﹃﹙﹛﹝（［｛｢"))
+  (")" . ,(agda-input-to-string-list ")]}⁆⁾₎〉⎵⟆⟧⟩⟫⦄〉》」』】〕〗〛︶︸︺︼︾﹀﹂﹄﹚﹜﹞）］｝｣"))
 
   ("[[" . ("⟦"))
   ("]]" . ("⟧"))
@@ -477,7 +487,15 @@
   (">"  . ("⟩"))
   ("<<" . ("⟪"))
   (">>" . ("⟫"))
+  ("{{" . ("⦃"))
+  ("}}" . ("⦄"))
 
+  ("(b" . ("⟅"))
+  (")b" . ("⟆"))
+
+  ("lbag" . ("⟅"))
+  ("rbag" . ("⟆"))
+
   ;; Primes.
 
   ("'" . ,(agda-input-to-string-list "′″‴⁗"))
@@ -519,6 +537,29 @@
                                                ⍉⍊⍋⍌⍍⍎⍏⍐⍑⍒⍓⍔⍕⍖⍗⍘⍙⍚⍛
                                                ⍜⍝⍞⍟⍠⍡⍢⍣⍤⍥⍦⍧⍨⍩⍪⍫⍬⍭⍮
                                                ⍯⍰⍱⍲⍳⍴⍵⍶⍷⍸⍹⍺⎕"))
+
+  ;; Some combining characters.
+  ;;
+  ;; The following combining characters also have (other)
+  ;; translations:
+  ;; ̀ ́ ̂ ̃ ̄ ̆ ̇ ̈ ̋ ̌ ̣ ̧ ̱
+
+  ("^--" . ,(agda-input-to-string-list"̅̿"))
+  ("_--" . ,(agda-input-to-string-list"̲̳"))
+  ("^~"  . ,(agda-input-to-string-list"̃͌"))
+  ("_~"  .  (                         "̰"))
+  ("^."  . ,(agda-input-to-string-list"̇̈⃛⃜"))
+  ("_."  . ,(agda-input-to-string-list"̣̤"))
+  ("^l"  . ,(agda-input-to-string-list"⃖⃐⃔"))
+  ("^l-" .  (                         "⃖"))
+  ("^r"  . ,(agda-input-to-string-list"⃗⃑⃕"))
+  ("^r-" .  (                         "⃗"))
+  ("^lr" .  (                         "⃡"))
+  ("_lr" .  (                         "͍"))
+  ("^^"  . ,(agda-input-to-string-list"̂̑͆"))
+  ("_^"  . ,(agda-input-to-string-list"̭̯̪"))
+  ("^v"  . ,(agda-input-to-string-list"̌̆"))
+  ("_v"  . ,(agda-input-to-string-list"̬̮̺"))
 
   ;; Shorter forms of many greek letters plus ƛ.
 
diff --git a/src/data/emacs-mode/agda2-highlight.el b/src/data/emacs-mode/agda2-highlight.el
--- a/src/data/emacs-mode/agda2-highlight.el
+++ b/src/data/emacs-mode/agda2-highlight.el
@@ -356,12 +356,14 @@
   (font-lock-mode 0)
   (setq annotation-bindings agda2-highlight-faces))
 
-(defun agda2-highlight-load (file)
-  "Load syntax highlighting information from FILE."
+(defun agda2-highlight-load (file &optional keep)
+  "Load syntax highlighting information from FILE.
+Old syntax highlighting information is first removed, unless KEEP
+is non-nil."
   (let ((coding-system-for-read 'utf-8)
         ;; Ignore read-only status, otherwise this function may fail.
         (inhibit-read-only t))
-    (annotation-load-file file (lambda (anns) t)
+    (annotation-load-file file (lambda (anns) (not keep))
                           "Click mouse-2 to jump to definition")))
 
 (defun agda2-highlight-clear nil
diff --git a/src/data/emacs-mode/agda2-mode.el b/src/data/emacs-mode/agda2-mode.el
--- a/src/data/emacs-mode/agda2-mode.el
+++ b/src/data/emacs-mode/agda2-mode.el
@@ -10,7 +10,7 @@
 
 ;;; Code:
 
-(defvar agda2-version "2.2.10"
+(defvar agda2-version "2.3.0"
   "The version of the Agda mode.
 Note that, by default, the same version of the underlying Haskell
 library is used (see `agda2-ghci-options').")
@@ -89,7 +89,8 @@
   "MAlonzo"
   "The backend which is used to compile Agda programs."
   :type '(choice (const "MAlonzo")
-                 (const "Epic"))
+                 (const "Epic")
+                 (const "JS"))
   :group 'agda2)
 
 (defcustom agda2-ghci-options
@@ -626,6 +627,22 @@
     (goto-char p1))
   (agda2-load))
 
+(defun agda2-make-case-action-extendlam (newcls)
+  "Replace definition of extended lambda with new clauses NEWCLS and reload."
+  (agda2-forget-all-goals);; we reload later anyway.
+  (let* ((p (+ (re-search-backward "\\({[^!]\\)\\|;") 1))
+         cl)
+    (goto-char p)
+    (delete-region p (- (re-search-forward "\\([^!]}\\)\\|;") 1))
+    (goto-char p)
+    (insert "  ")
+    (goto-char (+ p 1))
+    (while (setq cl (pop newcls))
+      (insert cl)
+      (if newcls (insert " ; ")))
+    (goto-char p))
+  (agda2-load))
+
 (defun agda2-status-action (status)
   "Display the string STATUS in the current buffer's mode line.
 \(precondition: the current buffer has to use the Agda mode as the
@@ -641,6 +658,24 @@
     (insert text)
     (set-syntax-table agda2-mode-syntax-table)
     (set-input-method "Agda")
+
+    ;; Support for jumping to positions mentioned in the text.
+    (set (make-local-variable 'compilation-error-regexp-alist)
+         '(("\\([\\\\/][^[:space:]]*\\):\\([0-9]+\\),\\([0-9]+\\)-\\(\\([0-9]+\\),\\)?\\([0-9]+\\)"
+            1 (2 . 5) (3 . 6))))
+    ;; No support for recompilation. An attempt to recompile via the
+    ;; info buffer (using "g") will (most likely) lead to a (dynamic)
+    ;; type error. (The default is to run "make -k".)
+    (set (make-local-variable 'compile-command)
+         'agda2-does-not-support-compilation-via-the-compilation-minor-mode)
+    (compilation-minor-mode 1)
+
+    ;; The info buffer is read-only. Compilation minor mode introduces
+    ;; the keybindings "g" (recompile) and "q" (bury the buffer), and
+    ;; these keybindings can make it rather awkward to edit the info
+    ;; buffer. To avoid surprises we make the buffer read-only.
+    (setq buffer-read-only t)
+
     (goto-char (point-min))
     (put-text-property 0 (length name) 'face '(:weight bold) name)
     (setq mode-line-buffer-identification name)
@@ -849,6 +884,10 @@
                     (agda2-string-quote highlighting)))
       (delete-file highlighting))))
 
+(defun agda2-literate-p ()
+  "Is the current buffer a literate Agda buffer?"
+  (equal (file-name-extension (buffer-name)) "lagda"))
+
 (defun agda2-goals-action (goals)
   "Annotates the goals in the current buffer with text properties.
 GOALS is a list of the buffer's goal numbers, in the order in
@@ -858,9 +897,10 @@
 ways."
   (agda2-forget-all-goals)
   (agda2-let
-      (stk
+      ((literate (agda2-literate-p))
+       stk
        top)
-      ((delims() (re-search-forward "[?]\\|[{][-!]\\|[-!][}]\\|--" nil t))
+      ((delims() (re-search-forward "[?]\\|[{][-!]\\|[-!][}]\\|--\\|\\\\begin{code}\\|\\\\end{code}" nil t))
        (is-lone-questionmark ()
           (save-excursion
             (save-match-data
@@ -869,24 +909,33 @@
                  "\\(.[{(]\\|.\\s \\)[?]\\(\\s \\|[)};]\\|$\\)"))))
        (make(p)  (agda2-make-goal p (point) (pop goals)))
        (inside-comment() (and stk (null     (car stk))))
-       (inside-goal()    (and stk (integerp (car stk)))))
+       (inside-goal()    (and stk (integerp (car stk))))
+       (outside-code()   (and stk (eq (car stk) 'outside)))
+       (inside-code()    (not (outside-code))))
     (save-excursion
+      ;; In literate mode we should start out in the "outside of code"
+      ;; state.
+      (if literate (push 'outside stk))
       (goto-char (point-min))
       (while (and goals (delims))
         (labels ((c (s) (equal s (match-string 0))))
           (cond
-           ((c "--") (when (not stk)              (end-of-line)))
-           ((c "{-") (when (not (inside-goal))    (push nil           stk)))
-           ((c "{!") (when (not (inside-comment)) (push (- (point) 2) stk)))
-           ((c "-}") (when (inside-comment) (pop stk)))
-           ((c "!}") (when (inside-goal)
-                       (setq top (pop stk))
-                       (unless stk (make top))))
-           ((c "?")  (progn
-                       (when (and (not stk) (is-lone-questionmark))
-                         (delete-char -1)
-                         (insert "{!!}")
-                         (make (- (point) 4)))))))))))
+           ((c "\\begin{code}") (when (outside-code)               (pop stk)))
+           ((c "\\end{code}")   (when (not stk)                    (push 'outside stk)))
+           ((c "--")            (when (not stk)                    (end-of-line)))
+           ((c "{-")            (when (and (inside-code)
+                                           (not (inside-goal)))    (push nil           stk)))
+           ((c "-}")            (when (inside-comment)             (pop stk)))
+           ((c "{!")            (when (and (inside-code)
+                                           (not (inside-comment))) (push (- (point) 2) stk)))
+           ((c "!}")            (when (inside-goal)
+                                  (setq top (pop stk))
+                                  (unless stk (make top))))
+           ((c "?")             (progn
+                                  (when (and (not stk) (is-lone-questionmark))
+                                    (delete-char -1)
+                                    (insert "{!!}")
+                                    (make (- (point) 4)))))))))))
 
 (defun agda2-make-goal (p q n)
   "Make a goal with number N at <P>{!...!}<Q>.  Assume the region is clean."
@@ -982,12 +1031,14 @@
     (append (format "\\x%x\\&" (encode-char c 'ucs)) nil)))
 
 (defun agda2-string-quote (s)
-  "Convert string S into a string representing it in Haskell syntax.
-Escape newlines, double quotes, etc.. in the string S, add
-surrounding double quotes, and convert non-ASCII characters to the \\xNNNN
-notation used in Haskell strings."
-  (let ((pp-escape-newlines t))
-    (mapconcat 'agda2-char-quote (pp-to-string s) "")))
+  "Format S as a Haskell string literal.
+Removes any text properties, escapes newlines, double quotes,
+etc., adds surrounding double quotes, and converts non-ASCII
+characters to the \\xNNNN notation used in Haskell strings."
+  (let ((pp-escape-newlines t)
+        (s2 (copy-sequence s)))
+    (set-text-properties 0 (length s2) nil s2)
+    (mapconcat 'agda2-char-quote (pp-to-string s2) "")))
 
 (defun agda2-list-quote (strings)
   "Convert a list of STRINGS into a string representing it in Haskell syntax."
diff --git a/src/data/emacs-mode/annotation.el b/src/data/emacs-mode/annotation.el
--- a/src/data/emacs-mode/annotation.el
+++ b/src/data/emacs-mode/annotation.el
@@ -82,7 +82,7 @@
   (incf start annotations-offset)
   (incf end annotations-offset)
   (when (and (<= (point-min) start)
-             (<= start end)
+             (< start end)
              (<= end (point-max)))
     (let ((faces (delq nil
                        (mapcar (lambda (ann)
@@ -104,9 +104,16 @@
         (add-to-list 'props 'mouse-face)
         (add-to-list 'props 'help-echo))
       (when props
-        (add-text-properties start end
-                             `(annotation-annotated   t
-                               annotation-annotations ,props))))))
+        (let ((pos start)
+              mid)
+          (while (< pos end)
+            (setq mid (next-single-property-change pos
+                         'annotation-annotations nil end))
+            (let* ((old-props (get-text-property pos 'annotation-annotations))
+                   (all-props (union old-props props)))
+              (add-text-properties pos mid
+                 `(annotation-annotated t annotation-annotations ,all-props))
+              (setq pos mid))))))))
 
 (defmacro annotation-preserve-mod-p-and-undo (&rest code)
   "Run CODE preserving both the undo data and the modification bit."
diff --git a/src/full/Agda/Auto/Auto.hs b/src/full/Agda/Auto/Auto.hs
--- a/src/full/Agda/Auto/Auto.hs
+++ b/src/full/Agda/Auto/Auto.hs
@@ -31,7 +31,6 @@
 import Agda.Syntax.Common
 import Agda.Syntax.Translation.InternalToAbstract
 import Agda.Syntax.Translation.AbstractToConcrete (abstractToConcrete, abstractToConcrete_, makeEnv, runAbsToCon, toConcrete)
-import Agda.Interaction.Monad
 import Agda.Interaction.BasicOps hiding (refine)
 import Agda.Interaction.MakeCase (findClause)
 import Agda.TypeChecking.Reduce (normalise)
@@ -116,10 +115,10 @@
 
                        if listmode then do
                         nsol' <- readIORef nsol
-                        when (nsol' <= 10) $ mapM (\(m, _, _, _) -> frommy (Meta m)) (Map.elems tccons) >>= \trms -> modifyIORef sols (trms :)
+                        when (nsol' <= 10) $ runErrorT (mapM (\(m, _, _, _) -> frommy (Meta m)) (Map.elems tccons)) >>= \trms -> case trms of {Left{} -> writeIORef nsol $! nsol' + 1; Right trms -> modifyIORef sols (trms :)}
                        else do
                         nsol' <- readIORef nsol
-                        when (nsol' == 1) $ mapM (\(m, _, _, _) -> frommy (Meta m)) (Map.elems tccons) >>= \trms -> writeIORef sols [trms]
+                        when (nsol' == 1) $ runErrorT (mapM (\(m, _, _, _) -> frommy (Meta m)) (Map.elems tccons)) >>= \trms -> case trms of {Left{} -> writeIORef nsol $! nsol' + 1; Right trms -> writeIORef sols [trms]}
                ticks <- liftIO $ newIORef 0
                let exsearch initprop recinfo defdfv = liftIO $ System.Timeout.timeout (timeout * 1000000) (
                     let r d = do
@@ -296,19 +295,22 @@
                     in r 0)
                  case sols of
                   Just (cls : _) -> withInteractionId ii $ do
-                   cls' <- liftIO $ mapM frommyClause cls
-                   cls'' <- mapM (\(I.Clause _ tel perm ps body) ->
-                     withCurrentModule (AN.qnameModule def) $ do
-                      -- Normalise the dot patterns
-                      ps <- addCtxTel tel $ normalise ps
-                      body <- etaContractBody body
-                      liftM modifyAbstractClause $ inContext [] $ reify $ NamedClause def $ I.Clause noRange tel perm ps body
-                    ) cls'
-                   pcs <- withInteractionId ii $ mapM prettyA cls''
-                   ticks <- liftIO $ readIORef ticks
+                   cls' <- liftIO $ runErrorT (mapM frommyClause cls)
+                   case cls' of
+                    Left{} -> dispmsg "No solution found"
+                    Right cls' -> do
+                     cls'' <- mapM (\(I.Clause _ tel perm ps body) ->
+                       withCurrentModule (AN.qnameModule def) $ do
+                        -- Normalise the dot patterns
+                        ps <- addCtxTel tel $ normalise ps
+                        body <- etaContractBody body
+                        liftM modifyAbstractClause $ inContext [] $ reify $ NamedClause def $ I.Clause noRange tel perm ps body
+                      ) cls'
+                     pcs <- withInteractionId ii $ mapM prettyA cls''
+                     ticks <- liftIO $ readIORef ticks
 
 
-                   return (Right $ Left (map (insertAbsurdPattern . PP.renderStyle (PP.style { PP.mode = PP.OneLineMode })) pcs), Nothing)
+                     return (Right $ Left (map (insertAbsurdPattern . PP.renderStyle (PP.style { PP.mode = PP.OneLineMode })) pcs), Nothing)
 
                   Just [] -> dispmsg "No solution found" -- case not possible at the moment because case split doesnt care about search exhaustiveness
                   Nothing -> dispmsg $ "No solution found at time out (" ++ show timeout ++ "s)"
diff --git a/src/full/Agda/Auto/CaseSplit.hs b/src/full/Agda/Auto/CaseSplit.hs
--- a/src/full/Agda/Auto/CaseSplit.hs
+++ b/src/full/Agda/Auto/CaseSplit.hs
@@ -181,7 +181,7 @@
                          if elem scrut mblkvar then costCaseSplitLow else (if scrut < length ctx - nscrutavoid && nothid then costCaseSplitHigh else costCaseSplitVeryHigh)
 
                  nothid = let HI hid _ = ctx !! scrut
-                          in case hid of {Hidden -> False; NotHidden -> True}
+                          in case hid of {Hidden -> False; Instance -> False; NotHidden -> True}
 
 
              sols <- rc (depth - cost) (length ctx - 1 - scrut) ctx2 tt2 pats2
diff --git a/src/full/Agda/Auto/Convert.hs b/src/full/Agda/Auto/Convert.hs
--- a/src/full/Agda/Auto/Convert.hs
+++ b/src/full/Agda/Auto/Convert.hs
@@ -5,6 +5,7 @@
 import Agda.Utils.Impossible
 #include "../undefined.h"
 
+import Control.Applicative hiding (getConst, Const(..))
 import Data.IORef
 import Data.Map (Map)
 import qualified Data.Map as Map
@@ -21,11 +22,13 @@
 import Agda.TypeChecking.Monad.Signature (getConstInfo, getDefFreeVars, getImportedSignature)
 import Agda.Utils.Permutation (Permutation(Perm), idP, permute, takeP)
 import Agda.Interaction.BasicOps (rewrite, Rewrite(..))
+import Agda.TypeChecking.Level (reallyUnLevelView)
 import Agda.TypeChecking.Monad.Base (mvJudgement, mvPermutation, getMetaInfo, ctxEntry, envContext, clEnv, Judgement(HasType))
 import Agda.TypeChecking.Monad.MetaVars (lookupMeta, withMetaInfo)
 import Agda.TypeChecking.Monad.Context (getContextArgs)
-import Agda.TypeChecking.Monad.Constraints (lookupConstraint, getConstraints)
+import Agda.TypeChecking.Monad.Constraints (getAllConstraints)
 import Agda.TypeChecking.Substitute (piApply, raise)
+import qualified Agda.TypeChecking.Substitute as I (absBody)
 import Agda.TypeChecking.Reduce (Normalise, normalise, instantiate)
 import Agda.TypeChecking.EtaContract (etaContract)
 import Agda.TypeChecking.Primitive (constructorForm)
@@ -81,12 +84,11 @@
      typ <- lift $ norm typ
      typ' <- tomyType typ
      let clausesToDef clauses = do
-           let clauses' = map I.translatedClause clauses
-           clauses'' <- tomyClauses clauses'
-           let narg = case clauses' of
+           clauses' <- tomyClauses clauses
+           let narg = case clauses of
                         [] -> 0
                         I.Clause {I.clausePats = xs} : _ -> length xs
-           return (Def narg clauses'' Nothing Nothing, [])
+           return (Def narg clauses' Nothing Nothing, [])
      (cont, projfcns2) <- case defn of
       MB.Axiom {} -> return (Postulate, [])
       MB.Function {MB.funClauses = clauses} -> clausesToDef clauses
@@ -96,10 +98,11 @@
        cons2 <- mapM (\con -> getConst True con TMAll) cons
        return (Datatype cons2 [], [])
       MB.Record {MB.recFields = fields, MB.recTel = tel} -> do -- the value of recPars seems unreliable or don't know what it signifies
-       let pars n (I.El _ (I.Pi it (I.Abs _ typ))) = C.Arg (C.argHiding it) (C.argRelevance it) (I.Var n []) : pars (n - 1) typ
+       let pars n (I.El _ (I.Pi it typ)) = C.Arg (C.argHiding it) (C.argRelevance it) (I.Var n []) : pars (n - 1) (I.unAbs typ)
            pars _ (I.El _ _) = []
            contyp npar I.EmptyTel = I.El (I.mkType 0 {- arbitrary -}) (I.Def cn (pars (npar - 1) typ))
            contyp npar (I.ExtendTel it (I.Abs v tel)) = I.El (I.mkType 0 {- arbitrary -}) (I.Pi it (I.Abs v (contyp (npar + 1) tel)))
+           contyp npar (I.ExtendTel it I.NoAbs{})     = __IMPOSSIBLE__
        contyp' <- tomyType $ contyp 0 tel
        cc <- lift $ liftIO $ readIORef c
        let Datatype [con] [] = cdcont cc
@@ -240,10 +243,10 @@
 
 getEqs :: MB.TCM [(Bool, I.Term, I.Term)]
 getEqs = do
- eqs <- getConstraints
+ eqs <- getAllConstraints
  let r = mapM (\eqc -> do
           neqc <- norm eqc
-          case MB.clValue neqc of
+          case MB.clValue $ MB.theConstraint neqc of
            MB.ValueCmp ineq _ i e -> do
             ei <- etaContract i
             ee <- etaContract e
@@ -252,9 +255,7 @@
             I.El _ ei <- etaContract i
             I.El _ ee <- etaContract e
             return [(tomyIneq ineq, ee, ei)]
-           MB.Guarded (MB.UnBlock _) cs -> do
-            eqs' <- r cs
-            return $ concat eqs'
+           MB.Guarded (MB.UnBlock _) pid -> return []
            _ -> return []
          )
  eqs' <- r eqs
@@ -285,7 +286,7 @@
   def <- lift $ getConstInfo n
   cc <- lift $ liftIO $ readIORef c
   let Just npar = fst $ cdorigin cc
-  return $ PatConApp c (replicate (fromIntegral npar) PatExp ++ pats')
+  return $ PatConApp c (replicate npar PatExp ++ pats')
  I.LitP _ -> throwError $ strMsg "Auto: Literals in patterns are not supported"
 
 tomyBody (I.Body t) = do
@@ -297,11 +298,7 @@
  return $ case res of
   Nothing -> Nothing
   Just (b', i) -> Just (b', i + 1)
-tomyBody (I.NoBind b) = do
- res <- tomyBody b
- return $ case res of
-  Nothing -> Nothing
-  Just (b', i) -> Just (weaken i b', i + 1)
+tomyBody (I.Bind (I.NoAbs _ b)) = tomyBody b
 tomyBody I.NoBody = return Nothing
 
 weaken :: Int -> MExp O -> MExp O
@@ -350,14 +347,15 @@
 tomyExp (I.Var v as) = do
  as' <- tomyExps as
  return $ NotM $ App Nothing (NotM OKVal) (Var $ fromIntegral v) as'
-tomyExp (I.Lam hid (I.Abs name b)) = do
- b' <- tomyExp b
- return $ NotM $ Lam (cnvh hid) (Abs (Id name) b')
+tomyExp (I.Lam hid b) = do
+ b' <- tomyExp (I.absBody b)
+ return $ NotM $ Lam (cnvh hid) (Abs (Id $ I.absName b) b')
 tomyExp t@(I.Lit{}) = do
  t <- lift $ constructorForm t
  case t of
   I.Lit{} -> throwError $ strMsg "Auto: Literals in terms are not supported"
   _ -> tomyExp t
+tomyExp (I.Level l) = tomyExp =<< lift (reallyUnLevelView l)
 tomyExp (I.Def name as) = do
  c <- getConst False name TMAll
  as' <- tomyExps as
@@ -369,16 +367,13 @@
  cc <- lift $ liftIO $ readIORef c
  let Just npar = fst $ cdorigin cc
  return $ NotM $ App Nothing (NotM OKVal) (Const c) (foldl (\x _ -> NotM $ ALConPar x) as' [1..npar])
-tomyExp (I.Pi (C.Arg hid _ x) (I.Abs name y)) = do
+tomyExp (I.Pi (C.Arg hid _ x) b) = do
+ let y    = I.absBody b
+     name = I.absName b
  x' <- tomyType x
  y' <- tomyType y
  return $ NotM $ Pi Nothing (cnvh hid) (Agda.TypeChecking.Free.freeIn 0 y) x' (Abs (Id name) y')
-tomyExp (I.Fun (C.Arg hid _ x) y) = do
- x' <- tomyType x
- y' <- tomyType y
- return $ NotM $ Pi Nothing (cnvh hid) False x' (Abs NoId (weaken 0 y'))
-tomyExp (I.Sort (I.Type (I.Lit (I.LitLevel _ l)))) = return $ NotM $ Sort $ Set $ fromIntegral l
-tomyExp (I.Sort (I.MetaS _ _)) = throwError $ strMsg "Auto: Searching for a type of arbitrary set level is not supported"
+tomyExp (I.Sort (I.Type (I.Max [I.ClosedLevel l]))) = return $ NotM $ Sort $ Set $ fromIntegral l
 tomyExp (I.Sort _) = return $ NotM $ Sort UnknownSort
 tomyExp t@I.MetaV{} = do
  t <- lift $ instantiate t
@@ -392,7 +387,7 @@
    m <- getMeta mid
    return $ Meta m
   _ -> tomyExp t
-tomyExp (I.DontCare) = return $ NotM $ dontCare
+tomyExp (I.DontCare _) = return $ NotM $ dontCare
 
 tomyExps [] = return $ NotM ALNil
 tomyExps (C.Arg hid _ a : as) = do
@@ -410,45 +405,57 @@
 
 fmExp :: I.MetaId -> I.Term -> Bool
 fmExp m (I.Var _ as) = fmExps m as
-fmExp m (I.Lam _ (I.Abs _ b)) = fmExp m b
+fmExp m (I.Lam _ b) = fmExp m (I.unAbs b)
 fmExp m (I.Lit _) = False
+fmExp m (I.Level (I.Max as)) = any (fmLevel m) as
 fmExp m (I.Def _ as) = fmExps m as
 fmExp m (I.Con _ as) = fmExps m as
-fmExp m (I.Pi x (I.Abs _ y)) = fmType m (C.unArg x) || fmType m y
-fmExp m (I.Fun x y) = fmType m (C.unArg x) || fmType m y
+fmExp m (I.Pi x y)  = fmType m (C.unArg x) || fmType m (I.unAbs y)
 fmExp m (I.Sort _) = False
 fmExp m (I.MetaV mid _) = mid == m
-fmExp m (I.DontCare) = False
+fmExp m (I.DontCare _) = False
 
 fmExps m [] = False
 fmExps m (a : as) = fmExp m (C.unArg a) || fmExps m as
 
+fmLevel :: I.MetaId -> I.PlusLevel -> Bool
+fmLevel m I.ClosedLevel{} = False
+fmLevel m (I.Plus _ l) = case l of
+  I.MetaLevel m' _   -> m == m'
+  I.NeutralLevel v   -> fmExp m v
+  I.BlockedLevel _ v -> fmExp m v
+  I.UnreducedLevel v -> fmExp m v
+
 -- ---------------------------------------------
 
 cnvh C.NotHidden = NotHidden
+cnvh C.Instance = Instance
 cnvh C.Hidden = Hidden
 icnvh NotHidden = C.NotHidden
+icnvh Instance = C.Instance
 icnvh Hidden = C.Hidden
 
 -- ---------------------------------------------
 
 frommy = frommyExp
 
+frommyType :: MExp O -> ErrorT String IO I.Type
 frommyType e = do
  e' <- frommyExp e
  return $ I.El (I.mkType 0) e'  -- 0 is arbitrary, sort not read by Agda when reifying
-frommyExp :: MExp O -> IO I.Term
+
+frommyExp :: MExp O -> ErrorT String IO I.Term
 frommyExp (Meta m) = do
- bind <- readIORef $ mbind m
+ bind <- lift $ readIORef $ mbind m
  case bind of
-  Nothing -> __IMPOSSIBLE__
+  Nothing -> throwError "meta not bound"
   Just e -> frommyExp (NotM e)
 frommyExp (NotM e) =
  case e of
   App _ _ (Var v) as ->
    frommyExps 0 as (I.Var (fromIntegral v) [])
   App _ _ (Const c) as -> do
-   cdef <- readIORef c
+   cdef <- lift $ readIORef c
    let (iscon, name) = cdorigin cdef
        (ndrop, h) = case iscon of {Just n -> (n, I.Con); Nothing -> (0, I.Def)}
    frommyExps ndrop as (h name [])
@@ -463,18 +470,17 @@
   Sort (Set l) ->
    return $ I.Sort (I.mkType (fromIntegral l))
   Sort Type -> __IMPOSSIBLE__
-  Sort UnknownSort -> return I.DontCare
-  -- Sort UnknownSort -> return $ I.Sort (I.mkType 0) -- hoping that it's thrown away
+  Sort UnknownSort -> return $ I.Sort (I.mkType 0) -- hoping that it's thrown away
 
   AbsurdLambda hid ->
    return $ I.Lam (icnvh hid) (I.Abs abslamvarname (I.Var 0 []))
 
 
-frommyExps :: Nat -> MArgList O -> I.Term -> IO I.Term
+frommyExps :: Nat -> MArgList O -> I.Term -> ErrorT String IO I.Term
 frommyExps ndrop (Meta m) trm = do
- bind <- readIORef $ mbind m
+ bind <- lift $ readIORef $ mbind m
  case bind of
-  Nothing -> __IMPOSSIBLE__
+  Nothing -> throwError "meta not bound"
   Just e -> frommyExps ndrop (NotM e) trm
 frommyExps ndrop (NotM as) trm =
  case as of
@@ -485,11 +491,11 @@
    frommyExps ndrop xs (addend (C.Arg (icnvh hid) C.Relevant x') trm)
 
   ALProj eas idx hid xs -> do
-   idx <- expandbind idx
-   let c = case idx of
-            NotM c -> c
-            Meta{} -> __IMPOSSIBLE__
-   cdef <- readIORef c
+   idx <- lift $ expandbind idx
+   c <- case idx of
+            NotM c -> return c
+            Meta{} -> throwError "meta not bound"
+   cdef <- lift $ readIORef c
    let name = snd $ cdorigin cdef
    trm2 <- frommyExps 0 eas (I.Def name [])
    frommyExps 0 xs (addend (C.Arg (icnvh hid) C.Relevant trm) trm2)
@@ -510,9 +516,10 @@
 modifyAbstractExpr = f
  where
   f (A.App i e1 (C.Arg h r (C.Named n e2))) = A.App i (f e1) (C.Arg h r (C.Named n (f e2)))
-  f (A.Lam i (A.DomainFree h n) _) | show n == abslamvarname = A.AbsurdLam i h
+  f (A.Lam i (A.DomainFree h rel n) _) | show n == abslamvarname = A.AbsurdLam i h
   f (A.Lam i b e) = A.Lam i b (f e)
   f (A.Rec i xs) = A.Rec i (map (\(n, e) -> (n, f e)) xs)
+  f (A.RecUpdate i e xs) = A.RecUpdate i (f e) (map (\(n, e) -> (n, f e)) xs)
   f (A.ScopedExpr i e) = A.ScopedExpr i (f e)
   f e = e
 
@@ -539,7 +546,7 @@
         (ns', ps') <- cnvps ns ps
         cc <- liftIO $ readIORef c2
         let Just npar = fst $ cdorigin cc
-        return (ns', HI hid (CSPatConApp c2 (replicate (fromIntegral npar) (HI Hidden CSOmittedArg) ++ ps')))
+        return (ns', HI hid (CSPatConApp c2 (replicate npar (HI Hidden CSOmittedArg) ++ ps')))
        I.DotP t -> do
         (t2, _) <- runStateT (tomyExp t) (S {sConsts = (cmap, []), sMetas = initMapS, sEqs = initMapS, sCurMeta = Nothing, sMainMeta = mainm})
         return (ns, HI hid (CSPatExp t2))
@@ -548,7 +555,7 @@
  return (reverse names, pats)
 
 
-frommyClause :: (CSCtx O, [CSPat O], Maybe (MExp O)) -> IO I.Clause
+frommyClause :: (CSCtx O, [CSPat O], Maybe (MExp O)) -> ErrorT String IO I.Clause
 frommyClause (ids, pats, mrhs) = do
  let ctel [] = return I.EmptyTel
      ctel (HI hid (mid, t) : ctx) = do
@@ -570,7 +577,7 @@
        --CSPatVar v -> return (length ids + nv - 1 - v : perm, nv)
        CSPatVar v -> return ((length ids - 1 - v, nv) : perm, nv + 1)
        CSPatConApp c ps -> do
-        cdef <- readIORef c
+        cdef <- lift $ readIORef c
         let (Just ndrop, _) = cdorigin cdef
         getperms ndrop ps perm nv
        CSPatExp e -> return (perm, nv + 1)
@@ -593,7 +600,7 @@
       p' <- case p of
        CSPatVar v -> return (I.VarP $ let HI _ (Id n, _) = ids !! v in n)
        CSPatConApp c ps -> do
-        cdef <- readIORef c
+        cdef <- lift $ readIORef c
         let (Just ndrop, name) = cdorigin cdef
         ps' <- cnvps ndrop ps
         return (I.ConP name Nothing ps')
@@ -612,7 +619,7 @@
                r n = I.Bind $ I.Abs "h" $ r (n - 1)
                e'' = r ({-length ids + -}nv)
            return e''
- return $ I.Clause SP.noRange tel (Perm (fromIntegral $ nv{- + length ids-}) (map fromIntegral perm)) ps body
+ return $ I.Clause SP.noRange tel (Perm (nv{- + length ids-}) perm) ps body
 
 contains_constructor :: [CSPat O] -> Bool
 contains_constructor = any f
@@ -625,8 +632,8 @@
 etaContractBody :: I.ClauseBody -> MB.TCM I.ClauseBody
 etaContractBody (I.NoBody) = return I.NoBody
 etaContractBody (I.Body b) = etaContract b >>= \b -> return (I.Body b)
-etaContractBody (I.NoBind b) = etaContractBody b >>= \b -> return (I.NoBind b)
 etaContractBody (I.Bind (I.Abs id b)) = etaContractBody b >>= \b -> return (I.Bind (I.Abs id b))
+etaContractBody (I.Bind (I.NoAbs x b))  = I.Bind . I.NoAbs x <$> etaContractBody b
 
 
 -- ---------------------------------
@@ -672,18 +679,16 @@
   let res = do
         def <- Map.elems $ MB.sigDefinitions sig
         MB.Function{MB.funClauses = cs} <- [MB.theDef def]
-        c <- map I.translatedClause cs
+        c <- cs
         unless (peelbinds False findMeta $ I.clauseBody c) []
         return (MB.defName def, c, peelbinds __IMPOSSIBLE__ toplevel $ I.clauseBody c)
   return $ case res of
     [] -> Nothing
-    [r] -> Just r
-    _ -> __IMPOSSIBLE__
+    r:_ -> Just r   -- TODO: with pattern matching lambdas we might get more than one hit, which to choose?
   where
     peelbinds d f = r
      where r b = case b of
                   I.Bind b -> r $ I.absBody b
-                  I.NoBind b -> r b
                   I.NoBody -> d
                   I.Body e -> f e
     findMeta e =
@@ -691,13 +696,13 @@
       I.Var _ as -> findMetas as
       I.Lam _ b -> findMeta (I.absBody b)
       I.Lit{} -> False
+      I.Level (I.Max as) -> any (fmLevel m) as
       I.Def _ as -> findMetas as
       I.Con _ as -> findMetas as
-      I.Pi it ot -> findMetat (C.unArg it) || findMetat (I.absBody ot)
-      I.Fun it ot -> findMetat (C.unArg it) || findMetat ot
+      I.Pi it ot -> findMetat (C.unArg it) || findMetat (I.unAbs ot)
       I.Sort{} -> False
       I.MetaV m' _  -> m == m'
-      I.DontCare -> False
+      I.DontCare _ -> False
     findMetas = any (findMeta . C.unArg)
     findMetat (I.El _ e) = findMeta e
     toplevel e =
@@ -718,8 +723,8 @@
    case ft 0 0 Just ctyp ttyp of
     Just n -> Just (n, narg)
     Nothing -> case ctyp of
-     I.El _ (I.Pi _ ot) -> tr (narg + 1) (na + 1) (I.absBody ot)
-     I.El _ (I.Fun _ ot) -> tr (narg + 1) na ot
+     I.El _ (I.Pi _ (I.Abs _ ot)) -> tr (narg + 1) (na + 1) ot
+     I.El _ (I.Pi _ (I.NoAbs _ ot)) -> tr (narg + 1) na ot
      _ -> Nothing
    where
     ft nl n c (I.El _ e1) (I.El _ e2) = f nl n c e1 e2
@@ -739,9 +744,6 @@
       (I.Def n1 as1, I.Def n2 as2) | n1 == n2 -> fs nl (n + 1) c as1 as2
       (I.Con n1 as1, I.Con n2 as2) | n1 == n2 -> fs nl (n + 1) c as1 as2
       (I.Pi (C.Arg hid1 rel1 it1) ot1, I.Pi (C.Arg hid2 rel2 it2) ot2) | hid1 == hid2 -> ft nl n (\n -> ft (nl + 1) n c (I.absBody ot1) (I.absBody ot2)) it1 it2
-      (I.Fun (C.Arg hid1 rel1 it1) ot1, I.Fun (C.Arg hid2 rel2 it2) ot2) | hid1 == hid2 -> ft nl n (\n -> ft nl n c ot1 ot2) it1 it2
-      (I.Fun (C.Arg hid1 rel1 it1) ot1, I.Pi (C.Arg hid2 rel2 it2) ot2) | hid1 == hid2 -> ft nl n (\n -> ft (nl + 1) n c (raise 1 ot1) (I.absBody ot2)) it1 it2
-      (I.Pi (C.Arg hid1 rel1 it1) ot1, I.Fun (C.Arg hid2 rel2 it2) ot2) | hid1 == hid2 -> ft nl n (\n -> ft (nl + 1) n c (I.absBody ot1) (raise 1 ot2)) it1 it2
       (I.Sort{}, I.Sort{}) -> c n -- sloppy
       _ -> Nothing
     fs nl n c es1 es2 = case (es1, es2) of
diff --git a/src/full/Agda/Auto/Syntax.hs b/src/full/Agda/Auto/Syntax.hs
--- a/src/full/Agda/Auto/Syntax.hs
+++ b/src/full/Agda/Auto/Syntax.hs
@@ -49,6 +49,7 @@
 
 
 data FMode = Hidden
+           | Instance
            | NotHidden
  deriving Eq
 
diff --git a/src/full/Agda/Compiler/Epic/AuxAST.hs b/src/full/Agda/Compiler/Epic/AuxAST.hs
--- a/src/full/Agda/Compiler/Epic/AuxAST.hs
+++ b/src/full/Agda/Compiler/Epic/AuxAST.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 -- | Intermediate abstract syntax tree used in the compiler. Pretty close to
 --   Epic syntax.
 module Agda.Compiler.Epic.AuxAST where
@@ -7,9 +8,11 @@
 
 import Agda.Syntax.Abstract.Name
 
-type Var = String
-type Tag = Int
+import Agda.Compiler.Epic.Interface
 
+#include "../../undefined.h"
+import Agda.Utils.Impossible
+
 type Comment  = String
 type Inline   = Bool
 
@@ -17,12 +20,14 @@
   = Fun
       { funInline  :: Inline
       , funName    :: Var
+      , funQName   :: Maybe QName
       , funComment :: Comment
       , funArgs    :: [Var]
       , funExpr    :: Expr
       }
   | EpicFun
       { funName     :: Var
+      , funQName    :: Maybe QName
       , funComment  :: Comment
       , funEpicCode :: String --EpicCode
       }
@@ -35,6 +40,7 @@
   | LFloat  Double
   deriving (Show, Ord, Eq)
 
+
 data Expr
   = Var Var
   | Lit Lit
@@ -55,11 +61,58 @@
   | Default {brExpr :: Expr}
   deriving (Show, Ord, Eq)
 
+getBrVars :: Branch -> [Var]
+getBrVars (Branch {brVars = vs}) = vs
+getBrVars _                      = []
+
+--------------------------------------------------------------------------------
+-- * Some smart constructors
+
+-- | Smart constructor for let expressions to avoid unneceessary lets
+lett :: Var -> Expr -> Expr -> Expr
+lett v (Var v') e' = subst v v' e'
+lett v e        e' = if v `elem` fv e' then Let v e e' else e'
+
+-- | Some things are pointless to make lazy
+lazy :: Expr -> Expr
+lazy (Lazy e) = Lazy e
+lazy (Lit l)  = Lit l
+lazy UNIT     = UNIT
+lazy x        = Lazy x
+
+-- | If casing on the same expression in a sub-expression, we know what branch to
+--   pick
+casee :: Expr -> [Branch] -> Expr
+casee x brs = Case x [br{brExpr = casingE br (brExpr br)} | br <- brs]
+  where
+    casingE br expr = let rec = casingE br in case expr of
+      Var v -> Var v
+      Lit l -> Lit l
+      Lam v e -> Lam v (rec e)
+      Con t n es -> Con t n (map rec es)
+      App v es   -> App v (map rec es)
+      Case e brs | expr == e -> case filter (sameCon br) brs of
+        []  -> Case (rec e) [b {brExpr = rec (brExpr b)} | b <- brs]
+        [b] -> substs (getBrVars br `zip` getBrVars b) (brExpr b)
+        _   -> __IMPOSSIBLE__
+                 | otherwise -> Case (rec e) [b {brExpr = rec (brExpr b)} | b <- brs]
+      If e1 e2 e3 -> If (rec e1) (rec e2) (rec e3)
+      Let v e1 e2 -> Let v (rec e1) (rec e2)
+      Lazy e      -> Lazy (rec e)
+      UNIT        -> UNIT
+      IMPOSSIBLE  -> IMPOSSIBLE
+    sameCon (Branch {brTag = t1}) (Branch {brTag = t2}) = t1 == t2
+    sameCon (BrInt  {brInt = i1}) (BrInt  {brInt = i2}) = i1 == i2
+    sameCon _                     _                     = False
+
 -- | Smart constructor for applications to avoid empty applications
 apps :: Var -> [Expr] -> Expr
 apps v [] = Var v
 apps v as = App v as
 
+--------------------------------------------------------------------------------
+-- * Substitution
+
 -- | Substitution
 subst :: Var  -- ^ Substitute this ...
       -> Var  -- ^ with this ...
@@ -83,6 +136,9 @@
     UNIT       -> UNIT
     IMPOSSIBLE -> IMPOSSIBLE
 
+substs :: [(Var, Var)] -> Expr -> Expr
+substs ss e = foldr (uncurry subst) e ss
+
 substBranch :: Var -> Var -> Branch -> Branch
 substBranch x e br = br { brExpr = subst x e (brExpr br) }
 
@@ -109,9 +165,3 @@
       Branch _ _ vs e -> fv' e S.\\ S.fromList vs
       BrInt _ e       -> fv' e
       Default e       -> fv' e
-
--- | Filter a list using a list of Bools specifying what to keep.
-pairwiseFilter :: [Bool] -> [a] -> [a]
-pairwiseFilter (True :bs) (a:as) = a : pairwiseFilter bs as
-pairwiseFilter (False:bs) (_:as) = pairwiseFilter bs as
-pairwiseFilter _           _     = []
diff --git a/src/full/Agda/Compiler/Epic/CaseOpts.hs b/src/full/Agda/Compiler/Epic/CaseOpts.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Compiler/Epic/CaseOpts.hs
@@ -0,0 +1,42 @@
+-- | Perform simple optimisations based on case-laws
+module Agda.Compiler.Epic.CaseOpts where
+
+import Control.Applicative
+import Control.Monad
+
+import Agda.TypeChecking.Monad
+
+import Agda.Compiler.Epic.AuxAST
+import Agda.Compiler.Epic.CompileState
+import Agda.Compiler.Epic.Interface
+
+caseOpts :: [Fun] -> Compile TCM [Fun]
+caseOpts = mapM  $ \ def -> case def of
+  Fun{} -> do
+    e' <- caseOptsExpr (funExpr def)
+    return def { funExpr = e' }
+  _     -> return def
+
+-- | Run the case-opts on an expression
+caseOptsExpr :: Expr -> Compile TCM Expr
+caseOptsExpr expr = case expr of
+  Var v       -> return $ Var v
+  Lit l       -> return $ Lit l
+  Lam v e     -> Lam v <$> caseOptsExpr e
+  Con c n es  -> Con c n <$> mapM caseOptsExpr es
+  App v es    -> apps v <$> mapM caseOptsExpr es
+  -- If there is only one constructor branch, perform a projection to get the result
+  Case e [Branch {brVars = vs, brExpr = eorg}] -> do
+      e' <- caseOptsExpr eorg
+      bindExpr e $ \var ->
+        return $ foldr (\(v, n) -> lett v $ App "proj" [Lit (LInt n), Var var]) e'
+               $ zip vs [0..]
+  -- If there is only a default branch, the case is not necessary
+  Case e [Default{brExpr = e'}] -> caseOptsExpr e'
+  Case e brs  -> Case <$> caseOptsExpr e <*> (mapM (\br -> do e' <- caseOptsExpr (brExpr br)
+                                                              return br {brExpr = e'}) brs)
+  If a b c    -> If <$> caseOptsExpr a <*> caseOptsExpr b <*> caseOptsExpr c
+  Let v e1 e2 -> Let v <$> caseOptsExpr e1 <*> caseOptsExpr e2
+  Lazy e      -> Lazy <$> caseOptsExpr e
+  UNIT        -> return UNIT
+  IMPOSSIBLE  -> return IMPOSSIBLE
diff --git a/src/full/Agda/Compiler/Epic/CompileState.hs b/src/full/Agda/Compiler/Epic/CompileState.hs
--- a/src/full/Agda/Compiler/Epic/CompileState.hs
+++ b/src/full/Agda/Compiler/Epic/CompileState.hs
@@ -6,57 +6,69 @@
 
 import Control.Applicative
 import Control.Monad.State
+import Data.List
 import Data.Map(Map)
 import qualified Data.Map as M
 import Data.Maybe
+import Data.Monoid
 import Data.Set(Set)
 import qualified Data.Set as S
 
-import Agda.Compiler.Epic.AuxAST
+import Agda.Compiler.Epic.AuxAST as AuxAST
+import Agda.Compiler.Epic.Interface
+import Agda.Interaction.Options
 import Agda.Syntax.Internal
+import Agda.Syntax.Concrete(TopLevelModuleName)
 import Agda.Syntax.Common
-import Agda.TypeChecking.Monad (MonadTCM, internalError, defType, theDef, getConstInfo)
-import qualified Agda.TypeChecking.Monad as M
+import Agda.TypeChecking.Monad (TCM, internalError, defType, theDef, getConstInfo, sigDefinitions, stImports, stPersistentOptions, stPersistent)
+import qualified Agda.TypeChecking.Monad as TM
 import Agda.TypeChecking.Reduce
 
 #include "../../undefined.h"
 import Agda.Utils.Impossible
+import Agda.Utils.Monad
 
-type IrrFilter = [Bool]
 
 -- | Stuff we need in our compiler
 data CompileState = CompileState
-    { dataDecls     :: Map QName Tag
-    , nameSupply    :: [Var]
-    , definitions   :: Set Var
-    , defDelayed    :: Map QName Bool
-    , conPars       :: Map QName Int
-    , mainName      :: Maybe QName
-    , irrFilters    :: Map QName IrrFilter
+    { nameSupply      :: [Var]
+    , compiledModules :: Map TopLevelModuleName (EInterface, Set FilePath)
+    , curModule       :: EInterface
+    , importedModules :: EInterface
+    , curFun          :: String
     } deriving Show
 
 -- | The initial (empty) state
 initCompileState :: CompileState
 initCompileState = CompileState
-    { dataDecls     = M.empty
-    , nameSupply    = map (('h':) . show) [0 :: Integer ..]
-    , definitions   = S.fromList primTopBindings
-    , defDelayed    = M.empty
-    , conPars       = M.empty
-    , mainName      = Nothing
-    , irrFilters    = M.empty
+    { nameSupply        = map (('h':) . show) [0 :: Integer ..]
+    , compiledModules   = M.empty
+    , curModule         = mempty
+    , importedModules   = mempty
+    , curFun            = undefined
     }
-  where
-    -- | For the lambda-lifter not to lift known primitive functions.
-    primTopBindings :: [Var]
-    primTopBindings = ["primNatCaseZD", "primNatCaseZS", "primBoolCase", "primUnit", "primSharp"]
 
 -- | Compiler monad
 type Compile = StateT CompileState
 
-epicError :: MonadTCM m => String -> Compile m a
+-- | When normal errors are not enough
+epicError :: String -> Compile TCM a
 epicError = lift . internalError
 
+-- | Modify the state of the current module's Epic Interface
+modifyEI :: (EInterface -> EInterface) -> Compile TCM ()
+modifyEI f = modify $ \s -> s {curModule = f (curModule s)}
+
+-- | Get the state of the current module's Epic Interface
+getsEI :: (EInterface -> a) -> Compile TCM a
+getsEI f = gets (f . curModule)
+
+-- | Returns the type of a definition given its name
+getType :: QName -> Compile TCM Type
+getType q = do
+    map <- lift (gets (sigDefinitions . stImports))
+    return $ maybe __IMPOSSIBLE__ defType (M.lookup q map)
+
 -- | Create a name which can be used in Epic code from a QName.
 unqname :: QName -> Var
 unqname qn = case nameId $ qnameName qn of
@@ -65,70 +77,138 @@
 
 -- * State modifiers
 
-getDelayed :: MonadTCM m => QName -> Compile m Bool
-getDelayed q = fromMaybe False <$> gets (M.lookup q . defDelayed)
+resetNameSupply :: Compile TCM ()
+resetNameSupply = modify $ \s -> s {nameSupply = nameSupply initCompileState}
 
-putDelayed :: Monad m => QName -> Bool -> Compile m ()
-putDelayed q d = modify $ \s -> s {defDelayed = M.insert q d (defDelayed s)}
+getDelayed :: QName -> Compile TCM Bool
+getDelayed q = lookInterface (M.lookup q . defDelayed) (return False)
 
-newName :: Monad m => Compile m Var
+putDelayed :: QName -> Bool -> Compile TCM ()
+putDelayed q d = modifyEI $ \s -> s {defDelayed = M.insert q d (defDelayed s)}
+
+newName :: Compile TCM Var
 newName = do
     n:ns <- gets nameSupply
     modify $ \s -> s { nameSupply = ns}
     return n
 
--- | Add a data declaration by giving a list of its constructors.
---   Tags will be created and saved.
-addDataDecl :: Monad m => [QName] -> Compile m ()
-addDataDecl ts = modify
-    $ \s -> s { dataDecls = M.union (M.fromList $ zip ts [0..]) (dataDecls s)}
+putConstrTag :: QName -> Tag -> Compile TCM ()
+putConstrTag q t = modifyEI $ \s -> s { constrTags = M.insert q t $ constrTags s }
 
-getConstrTag :: Monad m => QName -> Compile m Tag
-getConstrTag con = gets $ fromMaybe __IMPOSSIBLE__
-                        . M.lookup con
-                        . dataDecls
+assignConstrTag :: QName -> Compile TCM Tag
+assignConstrTag constr = assignConstrTag' constr []
 
-addDefName :: Monad m => QName -> Compile m ()
+assignConstrTag' :: QName -> [QName] -> Compile TCM Tag
+assignConstrTag' constr constrs = do
+    constrs <- concat <$> mapM ((getDataCon =<<) . getConData) (constr : constrs)
+    tags    <- catMaybes <$> mapM getConstrTag' constrs
+    let tag =  head $ map Tag [0..] \\ tags
+    putConstrTag constr tag
+    return tag
+
+getConData :: QName -> Compile TCM QName
+getConData con = do
+    lmap <- lift (gets (TM.sigDefinitions . TM.stImports))
+    case M.lookup con lmap of
+        Just def -> case theDef def of
+            c@(TM.Constructor{}) -> return $ TM.conData c
+            _                 -> __IMPOSSIBLE__
+        Nothing -> __IMPOSSIBLE__
+
+getDataCon :: QName -> Compile TCM [QName]
+getDataCon con = do
+    lmap <- lift (gets (TM.sigDefinitions . TM.stImports))
+    case M.lookup con lmap of
+        Just def -> case theDef def of
+            d@(TM.Datatype{}) -> return $ TM.dataCons d
+            r@(TM.Record{})   -> return [ TM.recCon r]
+            _                 -> __IMPOSSIBLE__
+        Nothing -> __IMPOSSIBLE__
+
+getConstrTag :: QName -> Compile TCM Tag
+getConstrTag con = lookInterface (M.lookup con . constrTags)
+                                 (assignConstrTag con)
+
+getConstrTag' :: QName -> Compile TCM (Maybe Tag)
+getConstrTag' con = do
+    cur <- gets curModule
+    case M.lookup con (constrTags cur) of
+        Just x -> return (Just x)
+        Nothing -> do
+            imps <- gets importedModules
+            return $ M.lookup con (constrTags imps)
+
+addDefName :: QName -> Compile TCM ()
 addDefName q = do
-    modify $ \s -> s {definitions = S.insert (unqname q) $ definitions s }
-    when ("main" == show (qnameName q)) (putMain q) -- hax
+    modifyEI $ \s -> s {definitions = S.insert (unqname q) $ definitions s }
 
-topBindings :: Monad m => Compile m (Set Var)
-topBindings = gets definitions
+topBindings :: Compile TCM (Set Var)
+topBindings = S.union <$> gets (definitions . importedModules) <*> gets (definitions . curModule)
 
-getConPar :: MonadTCM m => QName -> Compile m Int
-getConPar n = fromMaybe __IMPOSSIBLE__ <$> M.lookup n <$> gets conPars
+getConArity :: QName -> Compile TCM Int
+getConArity n = lookInterface (M.lookup n . conArity) __IMPOSSIBLE__
 
-putConPar :: Monad m => QName -> Int -> Compile m ()
-putConPar n p = modify $ \s -> s { conPars = M.insert n p (conPars s) }
+putConArity :: QName -> Int -> Compile TCM ()
+putConArity n p = modifyEI $ \s -> s { conArity = M.insert n p (conArity s) }
 
-putMain :: Monad m => QName -> Compile m ()
-putMain m = modify $ \s -> s { mainName = Just m }
+putMain :: QName -> Compile TCM ()
+putMain m = modifyEI $ \s -> s { mainName = Just m }
 
-getMain :: MonadTCM m => Compile m Var
-getMain = maybe (epicError "Where is main? :(") (return . unqname) =<< gets mainName
+getMain :: Compile TCM Var
+getMain = maybe (epicError "Where is main? :(") (return . unqname) =<< getsEI mainName
 
-getIrrFilter :: Monad m => QName -> Compile m IrrFilter
-getIrrFilter q = gets $ fromMaybe __IMPOSSIBLE__
-                      . M.lookup q
-                      . irrFilters
+lookInterface :: (EInterface -> Maybe a) -> Compile TCM a -> Compile TCM a
+lookInterface f def = do
+    cur <- gets curModule
+    case f cur of
+        Just x -> return x
+        Nothing -> do
+            imps <- gets importedModules
+            case f imps of
+                Nothing -> def
+                Just x  -> return x
 
-putIrrFilter :: Monad m => QName -> IrrFilter -> Compile m ()
-putIrrFilter n f = modify $ \s -> s {irrFilters = M.insert n f $ irrFilters s}
+constrInScope :: QName -> Compile TCM Bool
+constrInScope name = do
+    cur <- gets curModule
+    case M.lookup name (constrTags cur) of
+        Just x -> return True
+        Nothing -> do
+            imps <- gets importedModules
+            case M.lookup name (constrTags imps) of
+                Nothing -> return False
+                Just x  -> return True
 
+getForcedArgs :: QName -> Compile TCM ForcedArgs
+getForcedArgs q = lookInterface (M.lookup q . forcedArgs) __IMPOSSIBLE__
+
+putForcedArgs :: QName -> ForcedArgs -> Compile TCM ()
+putForcedArgs n f = do
+  b <- lift $ gets (optForcing . stPersistentOptions . stPersistent)
+  let f' | b = f
+         | otherwise = replicate (length f) NotForced
+  modifyEI $ \s -> s {forcedArgs = M.insert n f' $ forcedArgs s}
+
 replaceAt :: Int -- ^ replace at
           -> [a] -- ^ to replace
           -> [a] -- ^ replace with
           -> [a] -- ^ result?
 replaceAt n xs inserts = let (as, _:bs) = splitAt n xs in as ++ inserts ++ bs
 
-
 -- | Copy pasted from MAlonzo, HAHA!!!
 --   Move somewhere else!
-constructorArity :: (MonadTCM tcm, Num a) => QName -> tcm a
+constructorArity :: Num a => QName -> TCM a
 constructorArity q = do
   def <- getConstInfo q
   a <- normalise $ defType def
   case theDef def of
-    M.Constructor{ M.conPars = np } -> return . fromIntegral $ arity a - np
+    TM.Constructor{ TM.conPars = np } -> return . fromIntegral $ arity a - np
     _ -> internalError $ "constructorArity: non constructor: " ++ show q
+
+-- | Bind an expression to a fresh variable name
+bindExpr :: Expr -> (Var -> Compile TCM Expr) -> Compile TCM Expr
+bindExpr expr f = case expr of
+  AuxAST.Var v -> f v
+  _     -> do
+      v <- newName
+      lett v expr <$> f v
diff --git a/src/full/Agda/Compiler/Epic/Compiler.hs b/src/full/Agda/Compiler/Epic/Compiler.hs
--- a/src/full/Agda/Compiler/Epic/Compiler.hs
+++ b/src/full/Agda/Compiler/Epic/Compiler.hs
@@ -6,100 +6,189 @@
 import Control.Monad
 import Control.Monad.Reader
 import Control.Monad.State
+import qualified Data.ByteString.Lazy as BS
 import qualified Data.Map as M
+import Data.Set(Set)
+import qualified Data.Set as S
 import Data.Maybe
+import Data.Monoid
+import qualified Language.Haskell.Exts.Syntax as Haskell
 import System.Directory
 import System.Exit
 import System.FilePath hiding (normalise)
 import System.Process hiding (env)
 
 import Paths_Agda
+import Agda.Compiler.MAlonzo.Pretty -- TODO: Move shared code to Compiler.*
+import Agda.Compiler.MAlonzo.Primitives (checkTypeOfMain)
 import Agda.Interaction.FindFile
 import Agda.Interaction.Options
+import Agda.Interaction.Imports
 import qualified Agda.Syntax.Concrete.Name as CN
 import Agda.Syntax.Internal hiding (Term(..))
 import Agda.TypeChecking.Monad
 import Agda.TypeChecking.Monad.Builtin
+import Agda.TypeChecking.Serialise
 import Agda.Utils.FileName
 
-import Agda.Compiler.Epic.CompileState hiding (conPars)
-import qualified Agda.Compiler.Epic.ConstructorIrrelevancy as CIrr
+import qualified Agda.TypeChecking.Pretty as P
+
+import Agda.Compiler.Epic.CompileState
+import qualified Agda.Compiler.Epic.CaseOpts     as COpts
+import qualified Agda.Compiler.Epic.ForceConstrs as ForceC
 import Agda.Compiler.Epic.Epic
-import qualified Agda.Compiler.Epic.Erasure as Eras
-import qualified Agda.Compiler.Epic.FromAgda as FAgda
-import qualified Agda.Compiler.Epic.LambdaLift as LL
-import qualified Agda.Compiler.Epic.Primitive  as Prim
+import Agda.Compiler.Epic.Interface
+import qualified Agda.Compiler.Epic.Erasure      as Eras
+import qualified Agda.Compiler.Epic.FromAgda     as FAgda
+import qualified Agda.Compiler.Epic.Forcing      as Forcing
+import qualified Agda.Compiler.Epic.Injection    as ID
+import qualified Agda.Compiler.Epic.NatDetection as ND
+import qualified Agda.Compiler.Epic.Primitive    as Prim
+import qualified Agda.Compiler.Epic.Smashing     as Smash
 
 #include "../../undefined.h"
 import Agda.Utils.Impossible
 
--- | Compile an interface into an Epic/a.out program
---   /actually this is not true, we compile everything so we don't even look at
---   the Interface. This may change in the future.
+compilePrelude :: Compile TCM ()
+compilePrelude = do
+    dataDir <- (</> "EpicInclude") <$> liftIO getDataDir
+    pwd <- liftIO $ getCurrentDirectory
+    liftIO $ setCurrentDirectory dataDir
+    let prelude = "AgdaPrelude"
+    uptodate <- liftIO $ (prelude <.> "ei") `isNewerThan` (prelude <.> "e")
+    when (not uptodate) $ callEpic False [ "-c" , prelude <.> "e" ]
+    liftIO $ setCurrentDirectory pwd
+
+-- | Compile an interface into an executable using Epic
 compilerMain :: Interface -> TCM ()
 compilerMain inter = do
     epic_exist <- liftIO $ rawSystem "ghc-pkg" ["-v0", "field", "epic", "id"]
     case epic_exist of
         ExitSuccess -> flip evalStateT initCompileState $ do
+            compilePrelude
             setEpicDir inter
-            initialAnalysis
-            code <- compileModule =<< lift (gets stImports)
-            case code of
-                Nothing -> __IMPOSSIBLE__
-                Just c  -> runEpic (iModuleName inter) c
+            (_, imports) <- compileModule inter
+            main <- getMain
+            runEpicMain main (S.toList imports) (iModuleName inter)
+
         ExitFailure _ -> internalError $ unlines
            [ "Agda cannot find the Epic compiler."
            , "This can perhaps be fixed by running `cabal install epic'."
            , "See the README for more information."
            ]
 
+outFile :: CN.TopLevelModuleName -> Compile TCM FilePath
+outFile mod = do
+  let (dir, fn) = splitFileName . foldl1 (</>) $ CN.moduleNameParts mod
+      fp  | dir == "./"  = "src" </> fn
+          | otherwise = "src" </> dir </> fn
+  liftIO $ createDirectoryIfMissing True ("src" </> dir)
+  return $ fp
+  where
+  repldot c = map (\c' -> if c' == '.' then c else c')
 
+readEInterface :: FilePath -> Compile TCM EInterface
+readEInterface file = fromMaybe __IMPOSSIBLE__
+                   <$> lift (decode =<< liftTCM (liftIO (BS.readFile file)))
+
+compileModule :: Interface -> Compile TCM (EInterface, Set FilePath)
+compileModule i = do
+    cm <- gets compiledModules
+    let moduleName = toTopLevelModuleName $ iModuleName i
+    file  <- outFile moduleName
+    case M.lookup moduleName cm of
+        Just eifs -> return eifs
+        Nothing  -> do
+            imports <- map miInterface . catMaybes
+                                      <$> mapM (lift . getVisitedModule . toTopLevelModuleName)
+                                               (iImportedModules i)
+            (ifaces, limps) <- mapAndUnzipM compileModule imports
+            let imps = S.unions limps
+            modify $ \s -> s { importedModules = importedModules s `mappend` mconcat ifaces }
+            ifile <- maybe __IMPOSSIBLE__ filePath <$> lift (findInterfaceFile moduleName)
+            let eifFile = file <.> "aei"
+            uptodate <- liftIO $ isNewerThan eifFile ifile
+            (eif, imps') <- case uptodate of
+                True  -> do
+                    lift $ reportSLn "" 1 $
+                        show (iModuleName i) ++ " : no compilation is needed."
+                    eif <- readEInterface eifFile
+                    modify $ \s -> s { curModule = eif }
+                    return (eif, S.insert file imps)
+                False -> do
+                    lift $ reportSLn "" 1 $
+                        "Compiling: " ++ show (iModuleName i)
+                    resetNameSupply
+                    initialAnalysis i
+                    let defns = M.toList $ sigDefinitions $ iSignature i
+                    -- Epic cannot parse files with no definitions
+                    if (not $ null defns) then do
+                        code <- compileDefns defns
+                        runEpic file (S.toList imps) code
+                        eif <- gets curModule
+                        lift $ do
+                            bif <- encode eif
+                            liftIO $ BS.writeFile eifFile bif
+                        return (eif, S.insert file imps)
+                     else
+                        flip (,) imps <$> gets curModule
+            modify $ \s -> s { compiledModules = (M.insert moduleName (eif, imps') (compiledModules s))}
+            return (eif, imps')
+
 -- | Before running the compiler, we need to store some things in the state,
 --   namely constructor tags, constructor irrelevancies and the delayed field
 --   in functions (for coinduction).
-initialAnalysis :: MonadTCM m => Compile m ()
-initialAnalysis = do
-  defs <- M.toList <$> lift (gets (sigDefinitions . stImports))
+initialAnalysis :: Interface -> Compile TCM ()
+initialAnalysis inter = do
+  Prim.initialPrims
+  modify $ \s -> s {curModule = mempty}
+  let defs = M.toList $ sigDefinitions $ iSignature inter
   forM_ defs $ \(q, def) -> do
     addDefName q
     case theDef def of
       d@(Datatype {}) -> do
-        addDataDecl $ dataCons d
+        saker <- ND.isNatish q d
+        case saker of
+            Just (_, [zer, suc]) -> do
+                putConstrTag zer (PrimTag "primZero")
+                putConstrTag suc (PrimTag "primSuc")
+            _ -> return ()
       Constructor {conPars = np} -> do
-        putIrrFilter q . drop (fromIntegral np) . CIrr.irrFilter $ defType def
-        putConPar q =<< lift (constructorArity q)
-      r@(Record{}) -> do
-        addDataDecl [recCon r]
+        putForcedArgs q . drop (fromIntegral np) . ForceC.makeForcedArgs $ defType def
+        putConArity q =<< lift (constructorArity q)
       f@(Function{}) -> do
+        when ("main" == show (qnameName q)) $ do
+            -- lift $ liftTCM $ checkTypeOfMain q (defType def)
+            putMain q
         putDelayed q $ case funDelayed f of
           Delayed -> True
           NotDelayed -> False
+      a@(Axiom {}) -> do
+        case defEpicDef def of
+          Nothing -> putDelayed q True
+          _       -> return ()
       _ -> return ()
 
+idPrint s m x = do
+  -- liftIO $ putStrLn s
+  m x
+
 -- | Perform the chain of compilation stages, from definitions to epic code
-compileDefns :: MonadTCM m => [(QName, Definition)] -> Compile m (Maybe EpicCode)
+compileDefns :: [(QName, Definition)] -> Compile TCM EpicCode
 compileDefns defs = do
     -- We need to handle sharp (coinduction) differently, so we get it here.
     msharp <- lift $ getBuiltin' builtinSharp
-    emits   <- FAgda.fromAgda msharp defs
-               >>= Prim.primitivise
-               >>= irr -- CIrr.constrIrr
-               >>= Eras.erasure
-               >>= LL.lambdaLift
-    if null emits
-       then return Nothing
-       else return . return . unlines . map prettyEpicFun $ emits
-  where
-    irr ds = do
-        f <- lift $ gets (optForcing . stPersistentOptions)
-        if f then CIrr.constrIrr ds
-             else return ds
-
--- | Compile all definitions from a signature
-compileModule :: MonadTCM m => Signature -> Compile m (Maybe EpicCode)
-compileModule sig = do
-    let defs = M.toList $ sigDefinitions sig
-    compileDefns defs
+    emits   <- return defs
+               >>= idPrint "findInjection" ID.findInjection
+               >>= idPrint "fromAgda"   (FAgda.fromAgda msharp)
+               >>= idPrint "forcing"     Forcing.remForced
+               >>= idPrint "irr"         ForceC.forceConstrs
+               >>= idPrint "primitivise" Prim.primitivise
+               >>= idPrint "smash"       Smash.smash'em
+               >>= idPrint "erasure"     Eras.erasure
+               >>= idPrint "caseOpts"    COpts.caseOpts
+               >>= idPrint "done" return
+    unlines <$> mapM prettyEpicFun emits
 
 -- | Change the current directory to Epic folder, create it if it doesn't already
 --   exist.
@@ -107,7 +196,8 @@
 setEpicDir mainI = do
     let tm = toTopLevelModuleName $ iModuleName mainI
     f <- lift $ findFile tm
-    compileDir' <- lift $ gets (fromMaybe (filePath $ CN.projectRoot f tm) . optCompileDir . stPersistentOptions)
+    compileDir' <- lift $ gets (fromMaybe (filePath $ CN.projectRoot f tm) .
+                                  optCompileDir . stPersistentOptions . stPersistent)
     compileDir <- liftIO $ canonicalizePath compileDir'
     liftIO $ setCurrentDirectory compileDir
     liftIO $ createDirectoryIfMissing False "Epic"
@@ -117,30 +207,59 @@
 --
 -- The program is written to the file @../m@, where m is the last
 -- component of the given module name.
-runEpic :: MonadTCM m => ModuleName -> EpicCode -> Compile m ()
-runEpic m code = do
-    nam <- getMain
-    epicflags <- optEpicFlags <$> lift commandLineOptions
-    let code' = "include \"AgdaPrelude.e\"\n" ++ code ++ "main() -> Unit = init() ; " ++ nam ++ "(unit)"
-    dataDir <- liftIO getDataDir
-    curDir  <- liftIO getCurrentDirectory
-    liftIO $ copyFile (dataDir </> "EpicInclude" </> "AgdaPrelude" <.> "e")
-                      (curDir </> "AgdaPrelude" <.> "e")
-    liftIO $ writeFile ("main" <.> "e") code'
+runEpic :: FilePath -> [FilePath] -> EpicCode -> Compile TCM ()
+runEpic fp imports code = do
+    dataDir <- (</> "EpicInclude") <$> liftIO getDataDir
+    let imports' = unlines ["include \"" ++ imp ++ "\""
+                           | imp <- (dataDir </> "AgdaPrelude.ei")
+                                    : map (<.> "ei") imports]
+        code'    = imports' ++ code
+    liftIO $ writeFile (fp <.> "e") code'
+    callEpic True $
+        [ "-c", fp <.> "e" ]
 
+-- | Create the Epic main file, which calls the Agda main function
+runEpicMain :: Var -> [FilePath] -> ModuleName -> Compile TCM ()
+runEpicMain mainName imports m = do
+    dataDir <- (</> "EpicInclude") <$> liftIO getDataDir
+    let imports' = (dataDir </> "AgdaPrelude") : imports
+    let code = unlines ["include \"" ++ imp <.> "ei" ++ "\""
+                       | imp <- imports'
+                       ] ++ "main() -> Unit = init() ; " ++ mainName ++ "(unit)"
+    liftIO $ writeFile ("main" <.> "e") code
     let outputName  = case mnameToList m of
           [] -> __IMPOSSIBLE__
           ms -> last ms
-        epic        = "epic"
+    callEpic'  $ \epic ->
+        [ "main" <.> "e"
+        , "-o", ".." </> show outputName
+        ]
+        ++ epic ++ map (<.> "o") imports'
+
+-- | Call epic, with a given set of flags, if the |Bool| is True then include
+-- the command line flags at the end
+callEpic :: Bool -> [String] -> Compile TCM ()
+callEpic incEFlags flags = callEpic' $ \epicFlags ->
+  flags ++ if incEFlags then epicFlags else []
+
+-- | Call epic with a given set of flags, the argument function receives the flags given
+-- at the command line
+callEpic' :: ([String] -> [String]) -> Compile TCM ()
+callEpic' flags = do
+    epicFlags <- optEpicFlags <$> lift commandLineOptions
+    dataDir   <- (</> "EpicInclude") <$> liftIO getDataDir
+    let epic        = "epic"
         epicCommand =
           [ "-keepc"
-          , "-checking", "0"
+          -- , "-g"
+          -- , "-checking", "0"
           -- , "-trace"
-          , "-i", dataDir </> "EpicInclude" </> "stdagda" <.> "c"
-          , "main" <.> "e"
-          , "-o", ".." </> show outputName
-          ] ++ epicflags
+          , "-i", dataDir </> "stdagda" <.> "c"
+          ] ++ flags epicFlags
     lift $ reportSLn "" 1 $
       "calling: " ++ unwords (epic : epicCommand)
-    _ <- liftIO $ rawSystem epic epicCommand
-    return ()
+    res <- liftIO $ system (unwords (epic : epicCommand))
+                  -- rawSystem epic epicCommand
+    case res of
+        ExitSuccess   -> return ()
+        ExitFailure i -> epicError $ "Epic returned " ++ show res ++ ", which should not happen. Please report this as a bug."
diff --git a/src/full/Agda/Compiler/Epic/ConstructorIrrelevancy.hs b/src/full/Agda/Compiler/Epic/ConstructorIrrelevancy.hs
deleted file mode 100644
--- a/src/full/Agda/Compiler/Epic/ConstructorIrrelevancy.hs
+++ /dev/null
@@ -1,67 +0,0 @@
--- | Remove forced (irrelevant) arguments from constructors.
-module Agda.Compiler.Epic.ConstructorIrrelevancy where
-
-import Control.Applicative
-
-import Agda.Compiler.Epic.AuxAST
-import Agda.Compiler.Epic.CompileState
-
-import Agda.Syntax.Common
-import qualified Agda.Syntax.Internal as T
-import Agda.TypeChecking.Monad.Base (MonadTCM)
-
-
--- | Check which arguments are forced and create an IrrFilter
-irrFilter :: T.Type -> IrrFilter
-irrFilter (T.El _ term) = case term of
-    T.Pi  arg ab  -> isRel arg : irrFilter (T.absBody ab)
-    T.Fun arg typ -> isRel arg : irrFilter typ
-    _ -> []
-  where
-    isRel :: Arg T.Type -> Bool
-    isRel arg = case argRelevance arg of
-      Relevant   -> True
-      Irrelevant -> False
-      Forced     -> False -- It can be inferred
-
--- | Remove irrelevant arguments from constructors and branches
-constrIrr :: MonadTCM m => [Fun] -> Compile m [Fun]
-constrIrr fs = mapM irrFun fs
-
-irrFun :: MonadTCM m => Fun -> Compile m Fun
-irrFun (Fun inline name comment args expr) =
-    Fun inline name comment args <$> irrExpr expr
-irrFun e@(EpicFun{}) = return e
-
--- | Remove all arguments to constructors that we don't need to store in an
---   expression.
-irrExpr :: MonadTCM m => Expr -> Compile m Expr
-irrExpr expr = case expr of
-    Var v        -> return $ Var v
-    Lit l        -> return $ Lit l
-    Lam v e      -> Lam v <$> irrExpr e
-    Con tag q es -> do
-        -- We only need to apply the relevant arguments
-        irrFilt <- getIrrFilter q
-        return $ Con tag q $ pairwiseFilter irrFilt es
-    App v es     -> App v <$> mapM irrExpr es
-    Case e bs    -> Case <$> irrExpr e <*> mapM irrBranch bs
-    Let v e e'   -> Let v <$> irrExpr e <*> irrExpr e'
-    If a b c     -> If <$> irrExpr a <*> irrExpr b <*> irrExpr c
-    Lazy e       -> Lazy <$> irrExpr e
-    UNIT         -> return expr
-    IMPOSSIBLE   -> return expr
-
--- | Remove all the arguments that doesn't need to be stored in the constructor
---   For the branch
-irrBranch :: MonadTCM m => Branch -> Compile m Branch
-irrBranch br = case br of
-    Branch  tag name vars e -> do
-        ir <- getIrrFilter name
-        let vs = pairwiseFilter ir vars
-            -- The removed arguments are substituted for unit
-            subs = pairwiseFilter (map not ir) vars
-            e'   = foldr (\x ex -> subst x "primUnit" ex) e subs
-        Branch tag name vs <$> irrExpr e'
-    BrInt i e -> BrInt i <$> irrExpr e
-    Default e -> Default <$> irrExpr e
diff --git a/src/full/Agda/Compiler/Epic/Epic.hs b/src/full/Agda/Compiler/Epic/Epic.hs
--- a/src/full/Agda/Compiler/Epic/Epic.hs
+++ b/src/full/Agda/Compiler/Epic/Epic.hs
@@ -3,15 +3,28 @@
 -- | Pretty-print the AuxAST to valid Epic code.
 module Agda.Compiler.Epic.Epic
   ( prettyEpicFun
+  , prettyEpic
   ) where
 
+import Control.Monad.State
+
 import Data.Char
 import Data.List
 
+import Data.Map (Map)
+import qualified Data.Map as M
+
+import Agda.TypeChecking.Monad
+import Agda.TypeChecking.Pretty (prettyTCM)
+import Agda.TypeChecking.Reduce
+
 #include "../../undefined.h"
 import Agda.Utils.Impossible
 
+
 import Agda.Compiler.Epic.AuxAST
+import Agda.Compiler.Epic.CompileState
+import Agda.Compiler.Epic.Interface
 
 -- * Some auxilliary pretty-printer functions
 (<+>) :: String -> String -> String
@@ -25,6 +38,10 @@
 many :: [String] -> String
 many vs = paren $ intercalate ", " vs
 
+many' :: [String] -> String
+many' [] = ""
+many' vs = paren $ intercalate ", " vs
+
 paren :: String -> String
 paren s = "(" <+> s <+> ")"
 
@@ -33,46 +50,60 @@
 
 -- * Pretty-printer
 -- | Print a function to an Epic string
-prettyEpicFun :: Fun -> String
-prettyEpicFun (Fun inline name comment vars e) =
-    "--" <+> comment $$
-    (if inline then "%inline " else "") ++ name
-    <+> many (map typVar vars) <+> "-> Any" <+> "=" <+> prettyEpic e
-prettyEpicFun (EpicFun name comment def) =
+prettyEpicFun :: MonadTCM m => Fun -> Compile m String
+prettyEpicFun (Fun inline name mqname comment vars e) = do
+    {-
+    defs <- lift (gets (sigDefinitions . stImports))
+    typ <- case mqname >>= flip M.lookup defs of
+      Nothing -> return "-"
+      Just def -> do
+        doc <- lift $ prettyTCM =<< normalise (defType def)
+        return $ show doc
+    -}
+    return $
+      "--" <+> comment $$
+      -- unlines (map ("-- " <+>) (lines typ)) $$
+      (if inline then "%inline " else "") ++ name
+        <+> many (map typVar vars) <+> "-> Any" <+> "=" <+> prettyEpic e
+
+prettyEpicFun (EpicFun name _mqname comment def) = return $
     "--" <+> comment $$
-    "%inline" <+> name <+> def
+    {-"%inline" <+> -} name <+> def
 
 -- | Print expression to Epic expression
 prettyEpic :: Expr -> String
 prettyEpic expr = case expr of
     Var v -> v
     Lit l -> prettyEpicLit l
-    Lam _ _ -> __IMPOSSIBLE__ -- We have lambda lifted away all λs
-    Con t q args -> curly (show q) <+> paren ("Con" <+> show t <+> many (map prettyEpic args))
+    Lam x e -> paren $ "\\" <+> typVar x <+> "." <+> paren (prettyEpic e)-- __IMPOSSIBLE__ -- We have lambda lifted away all λs
+    Con (Tag t) q args -> curly (show q) <+> paren ("Con" <+> show t <+> many (map prettyEpic args))
     If a b c -> "if" <+> prettyEpic a <+> "then" <+> prettyEpic b <+> "else" <+> prettyEpic c
-    Let v e e' -> "let" <+> typVar v <+> "=" <+> prettyEpic e <+> "in" <+> prettyEpic e'
-    App v es -> v <+> many (map prettyEpic es)
+    Let v e e' -> "let" <+> typVar v <+> "=" <+> prettyEpic (id e) <+> "in" <+> prettyEpic e'
+    App "proj" (Lit (LInt n) : e : es) -> paren (prettyEpic e <+> "!" <+> show n) <+> many' (map prettyEpic es)
+    App v es -> v <+> many' (map (prettyEpic . id) es)
     Case e brs -> "case" <+> prettyEpic e <+> "of {"
                <+> intercalate "\n | " (map prettyEpicBr brs) <+> "}"
     Lazy e -> "lazy" <+> paren (prettyEpic e)
     UNIT -> "unit"
     IMPOSSIBLE -> "impossible"
+    _ -> __IMPOSSIBLE__
 
 prettyEpicBr :: Branch -> String
 prettyEpicBr br = case br of
-    Branch c q vs e ->
+    Branch (Tag c) q vs e ->
        curly (show q)  <+>
        "Con" <+> show c
        <+> many (map typVar vs)
        <+> "->" <+> prettyEpic e
     BrInt n e       ->  show n <+> "->" <+> prettyEpic e
     Default e       -> "Default ->" <+> prettyEpic e
+    _ -> __IMPOSSIBLE__
 
 prettyEpicLit :: Lit -> String
 prettyEpicLit l = case l of
     LInt n    -> show n ++ "L"
     LChar c   -> show (ord c)
-    LString s -> show s
+    LString s -> "Con 1" <+> many [show s, "Con 0 ()"]
     LFloat f  -> show f
 
 typVar :: Var -> String
diff --git a/src/full/Agda/Compiler/Epic/Erasure.hs b/src/full/Agda/Compiler/Epic/Erasure.hs
--- a/src/full/Agda/Compiler/Epic/Erasure.hs
+++ b/src/full/Agda/Compiler/Epic/Erasure.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 -- | Some arguments to functions (types in particular) will not be used in the
 --   body. Wouldn't it be useful if these wasn't passed around at all?
 --   Fear not, we here perform some analysis and try to remove as many of these
@@ -18,65 +19,76 @@
 
 import Agda.Compiler.Epic.AuxAST
 import Agda.Compiler.Epic.CompileState
+import Agda.Compiler.Epic.Interface
 
-import Agda.TypeChecking.Monad.Base (MonadTCM)
+import Agda.TypeChecking.Monad.Base (TCM)
+import qualified Agda.Syntax.Internal as SI
+import qualified Agda.Syntax.Common   as SC
+import Agda.TypeChecking.Monad (MonadTCM, reportSDoc)
+import Agda.TypeChecking.Pretty as P
 
-data Relevancy
-  = Irr
-  | Rel
-  | DontKnow
-  deriving (Eq, Ord, Show)
+#include "../../undefined.h"
+import Agda.Utils.Impossible
 
-isIrr :: Relevancy -> Bool
+isIrr :: Relevance -> Bool
 isIrr Irr      = True
 isIrr Rel      = False
-isIrr DontKnow = True
 
-isRel :: Relevancy -> Bool
+isRel :: Relevance -> Bool
 isRel = not . isIrr
 
--- | Irrelevancy "and"
-(&&-) :: Relevancy -> Relevancy -> Relevancy
-Rel      &&- _        = Rel
-_        &&- Rel      = Rel
-DontKnow &&- a        = a
-a        &&- DontKnow = a
-Irr      &&- Irr      = Irr -- If both arguments are irrelevant, then surely we
-                            -- have something irrelevant.
+-- | Relevance "or"
+(||-) :: Relevance -> Relevance -> Relevance
+Irr      ||- b      = b
+_        ||- _      = Rel
+infixr 2 ||-
 
+-- | Relevance "and"
+(&&-) :: Relevance -> Relevance -> Relevance
+Rel      &&- b      = b
+_        &&- _      = Irr
+infixr 3 &&-
+
 data ErasureState = ErasureState
-  { relevancies :: Map Var [Relevancy]
+  { relevancies :: Map Var [Relevance]
   , funs        :: Map Var Fun
   }
 
 type Erasure = StateT ErasureState
 
 -- | Try to find as many unused variables as possible
-erasure :: MonadTCM m => [Fun] -> Compile m [Fun]
+erasure :: [Fun] -> Compile TCM [Fun]
 erasure fs = do
-    rels <- flip evalStateT (ErasureState M.empty M.empty) $ do
+    orgRel <- gets (relevantArgs . importedModules)
+    (rels, erasureState) <- flip runStateT (ErasureState orgRel M.empty) $ do
         mapM_ initiate fs
         fu <- gets funs
-        M.mapKeys (fromJust . flip M.lookup fu) <$> step
-    fmap concat $ mapM (\f -> check f (M.lookup f rels)) fs
+        M.mapKeys (fromMaybe __IMPOSSIBLE__ . flip M.lookup fu) <$> step 1
+    modifyEI $ \s -> s { relevantArgs = M.mapKeys funName rels }
+    concat <$> mapM (\f -> map (rem (relevancies erasureState)) <$> check f (M.lookup f rels)) fs
   where
+
+    rem rels f@Fun{} = f { funExpr = removeUnused rels (funExpr f) }
+    rem _    f       = f
     -- | Perform the worker//wrapper transform
-    check :: MonadTCM m => Fun -> Maybe [Relevancy] -> Compile m [Fun]
+    check :: Fun -> Maybe [Relevance] -> Compile TCM [Fun]
     -- If the function is already marked as to inline we don't need to create a
     -- new function. Also If all arguments are relevant there is nothing to do.
-    check f (Just rs) | any isIrr rs && not (funInline f) = do
-        f' <- newName
+    check f@Fun{} (Just rs) | any isIrr rs && not (funInline f) = do
+        f' <- (funName f ++) <$> newName
         let args' = pairwiseFilter (map isRel rs) (funArgs f)
             subs  = pairwiseFilter (map isIrr rs) (funArgs f)
             e'    = foldr (\v e -> subst v "primUnit" e) (funExpr f) subs
         return [ Fun { funInline  = True
                      , funName    = funName f
+                     , funQName   = funQName f
                      , funComment = funComment f
                      , funArgs    = funArgs f
                      , funExpr    = App f' $ map Var args'
                      }
                , Fun { funInline  = False
                      , funName    = f'
+                     , funQName   = Nothing
                      , funComment = funComment f ++ " [ERASED]"
                      , funArgs    = args'
                      , funExpr    = e'
@@ -84,20 +96,63 @@
                ]
     check f _ = return [f]
 
--- | Initiate a function's relevancies (all DontKnow)
-initiate :: Monad m => Fun -> Erasure m ()
-initiate f@(Fun _ name _ args _) =
-    modify $ \s -> s { relevancies = M.insert name (replicate (length args) DontKnow) (relevancies s)
+removeUnused :: Map Var [Relevance] -> Expr -> Expr
+removeUnused rels t = let rem = removeUnused rels
+                       in case t of
+    Var _         -> t
+    Lit _         -> t
+    Lam v e       -> Lam v (rem e)
+    Con tag qn es -> Con tag qn (map rem es)
+    App v es      -> case M.lookup v rels of
+       Just re -> App v $ zipWith (\r x -> if isIrr r then UNIT else rem x)
+                                  (re ++ repeat Rel) es
+       Nothing    -> App v $ map rem es
+    Case e brs    -> Case (rem e) (map (\br -> br {brExpr = rem $ brExpr br}) brs)
+    If a b c      -> If (rem a) (rem b) (rem c)
+    Let v e1 e2   -> lett v (rem e1) (rem e2)
+    Lazy e        -> lazy (rem e)
+    UNIT          -> t
+    IMPOSSIBLE    -> t
+
+-- | Initiate a function's relevancies
+initiate :: Fun -> Erasure (Compile TCM) ()
+initiate f@(Fun _ name mqname _ args _) = do
+    let rels = replicate (length args) Irr
+    modify $ \s -> s { relevancies = M.insert name rels (relevancies s)
                      , funs        = M.insert name f (funs s)
                      }
-initiate (EpicFun {})            = return ()
+initiate f@(EpicFun {funName = name, funQName = mqname}) = case mqname of
+    Just qn -> do
+        ty <- lift $ getType qn
+        let rels = initialRels ty Rel
+        return ()
+        modify $ \s -> s { relevancies = M.insert name rels (relevancies s)
+                         , funs        = M.insert name f (funs s)
+                         }
+    Nothing -> return ()
 
+initialRels :: SI.Type -> Relevance -> [Relevance]
+initialRels ty rel =
+    case SI.unEl ty of
+        SI.Pi  a b -> mkRel a : initialRels (SI.unAbs b) rel
+        _       -> []
+  where
+    mkRel :: SC.Arg SI.Type -> Relevance
+    mkRel a | ignoreForced (SC.argRelevance a) = Irr
+    mkRel a = case SI.unEl (SC.unArg a) of
+       SI.Sort _ -> Irr
+       _         -> rel
+
+ignoreForced :: SC.Relevance -> Bool
+ignoreForced SC.Relevant = False
+ignoreForced _           = True
+
 -- | Calculate if a variable is relevant in an expression
-relevant :: (Functor m, Monad m) => Var -> Expr -> Erasure m Relevancy
+relevant :: (Functor m, Monad m) => Var -> Expr -> Erasure m Relevance
 relevant var expr = case expr of
     Var v  | v == var  -> return Rel
            | otherwise -> return Irr
-    Lit _l       -> return Irr
+    Lit _l      -> return Irr
     Lam _ e     -> relevant var e
     Con _ _ es  -> relevants var es
     App v es | v == var  -> return Rel
@@ -106,28 +161,55 @@
                 mvrs <- gets (M.lookup v . relevancies)
                 case mvrs of
                   Nothing  -> relevants var es
-                  Just vrs -> relevants var
-                            $ pairwiseFilter (map isRel vrs ++ repeat True {- Needs ETA expansion -}) es
-    Case e brs  -> (&&-) <$> relevant var e  <*> relevants var (map brExpr brs)
+                  Just vrs ->
+                      relevants var
+                        $ map snd
+                        $ filter ((==) Rel . fst)
+                        $ zip (vrs ++ repeat Rel) es
+                      -- foldr (||-) Irr <$> zipWith (&&-) (vrs ++ repeat Rel) <$> mapM (relevant var) es
+    -- {-
+    Case e [br@Branch{}] -> do
+        cvars <- foldr (||-) Irr <$> mapM (flip relevant $ brExpr br) (brVars br)
+        vare  <- relevant var e
+        varbr <- relevant var (brExpr br)
+        return ((vare &&- cvars) ||- varbr)
+    -- -}
+    Case e brs  -> (||-) <$> relevant var e  <*> relevants var (map brExpr brs)
     If a b c    -> relevants var [a,b,c]
-    Let _ e1 e2 -> (&&-) <$> relevant var e1 <*> relevant var e2
+    Let x e1 e2 -> (||-) <$> ((&&-) <$> relevant var e1 <*> relevant x e2) <*> relevant var e2
     Lazy e      -> relevant var e
     UNIT        -> return Irr
     IMPOSSIBLE  -> return Irr
   where
-    relevants :: (Functor m, Monad m) => Var -> [Expr] -> Erasure m Relevancy
-    relevants v es = foldM (\x y -> return $ x &&- y) Irr =<< mapM (relevant v) es
+    relevants :: (Functor m, Monad m) => Var -> [Expr] -> Erasure m Relevance
+    relevants v [] = return Irr
+    relevants v (e : es) = do
+      r <- relevant v e
+      case r of
+        Rel -> return r
+        _   -> relevants v es
+    -- relevants v es = return . foldr (\x y -> x ||- y) Irr =<< mapM (relevant v) es
 
--- | Try to find a fixpoint for all the functions relevancy.
-step :: (Monad m, Functor m) => Erasure m (Map Var [Relevancy])
-step = do
+-- | Try to find a fixpoint for all the functions relevance.
+step :: Integer -> Erasure (Compile TCM) (Map Var [Relevance])
+step nrOfLoops = do
     s  <- get
-    rels <- forM (M.toList (relevancies s)) $ \(v, _) -> do
-               let f = fromJust $ M.lookup v (funs s)
-               (,) v <$> mapM (flip relevant (funExpr f)) (funArgs f)
-    let relsm = M.fromList rels
+    newRels <- (M.fromList <$>) $ forM (M.toList (funs s)) $ \(v, f) -> ((,) v <$>) $ do
+               let funRels = fromMaybe __IMPOSSIBLE__ $ M.lookup v (relevancies s)
+               case f of
+                  EpicFun{} -> return funRels
+                  Fun{} -> do
+                     forM (zip (funArgs f) (funRels ++ repeat Rel)) $ \ (x, rel) -> case rel of
+                        Rel -> return Rel
+                        Irr -> do
+                          lift $ lift $ reportSDoc "epic.erasure" 10 $ P.text "running erasure:" P.<+> (P.text . show) (funQName f)
+                          relevant x (funExpr f)
+    let relsm = newRels `M.union` relevancies s
     if relevancies s == relsm
-       then return relsm
+       then return newRels
        else do
-           put s {relevancies = relsm}
-           step
+         put s {relevancies = relsm}
+         step (nrOfLoops + 1)
+
+diff :: (Ord k, Eq a) => Map k a -> Map k a -> [(k,(a,a))]
+diff m1 m2 = catMaybes $ zipWith (\(k, x) (_, y) -> if x == y then Nothing else Just (k, (x, y))) (M.toList m1) (M.toList m2)
diff --git a/src/full/Agda/Compiler/Epic/ForceConstrs.hs b/src/full/Agda/Compiler/Epic/ForceConstrs.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Compiler/Epic/ForceConstrs.hs
@@ -0,0 +1,75 @@
+-- | Remove forced arguments from constructors.
+{-# LANGUAGE CPP #-}
+module Agda.Compiler.Epic.ForceConstrs where
+
+import Control.Applicative
+import Control.Monad.Trans
+
+import Agda.Compiler.Epic.AuxAST
+import Agda.Compiler.Epic.CompileState
+import Agda.Compiler.Epic.Interface
+
+import qualified Agda.Syntax.Common   as S
+import qualified Agda.Syntax.Internal as T
+import Agda.TypeChecking.Monad (TCM, reportSDoc)
+import Agda.TypeChecking.Pretty
+
+#include "../../undefined.h"
+import Agda.Utils.Impossible
+
+-- | Check which arguments are forced
+makeForcedArgs :: T.Type -> ForcedArgs
+makeForcedArgs (T.El _ term) = case term of
+    T.Pi  arg ab  -> isRel arg : makeForcedArgs (T.unAbs ab)
+    _ -> []
+  where
+    isRel :: S.Arg T.Type -> Forced
+    isRel arg = case S.argRelevance arg of
+      S.Relevant   -> NotForced
+      S.Irrelevant -> Forced
+      S.NonStrict  -> Forced -- can never be executed
+      S.Forced     -> Forced -- It can be inferred
+
+-- | Remove forced arguments from constructors and branches
+forceConstrs :: [Fun] -> Compile TCM [Fun]
+forceConstrs fs = mapM forceFun fs
+
+forceFun :: Fun -> Compile TCM Fun
+forceFun e@(EpicFun{}) = return e
+forceFun (Fun inline name qname comment args expr) =
+    Fun inline name qname comment args <$> forceExpr expr
+  where
+    -- | Remove all arguments to constructors that we don't need to store in an
+    --   expression.
+    forceExpr :: Expr -> Compile TCM Expr
+    forceExpr expr = case expr of
+        Var v        -> return $ Var v
+        Lit l        -> return $ Lit l
+        Lam v e      -> Lam v <$> forceExpr e
+        Con tag q es -> do
+            -- We only need to apply the non-forced arguments
+            forcArgs <- getForcedArgs q
+            return $ Con tag q $ notForced forcArgs es
+        App v es     -> App v <$> mapM forceExpr es
+        Case e bs    -> Case <$> forceExpr e <*> mapM forceBranch bs
+        Let v e e'   -> lett v <$> forceExpr e <*> forceExpr e'
+        If a b c     -> If <$> forceExpr a <*> forceExpr b <*> forceExpr c
+        Lazy e       -> Lazy <$> forceExpr e
+        UNIT         -> return expr
+        IMPOSSIBLE   -> return expr
+
+    -- | Remove all the arguments that don't need to be stored in the constructor
+    --   For the branch
+    forceBranch :: Branch -> Compile TCM Branch
+    forceBranch br = case br of
+        Branch  tag name vars e -> do
+            ir <- getForcedArgs name
+            let vs = notForced ir vars
+                subs = forced ir vars
+
+            e'' <- if all (`notElem` fv e) subs
+                  then return e
+                  else __IMPOSSIBLE__ -- If so, the removal of forced args has gone wrong
+            Branch tag name vs <$> forceExpr e''
+        BrInt i e -> BrInt i <$> forceExpr e
+        Default e -> Default <$> forceExpr e
diff --git a/src/full/Agda/Compiler/Epic/Forcing.hs b/src/full/Agda/Compiler/Epic/Forcing.hs
--- a/src/full/Agda/Compiler/Epic/Forcing.hs
+++ b/src/full/Agda/Compiler/Epic/Forcing.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE CPP, ScopedTypeVariables #-}
 module Agda.Compiler.Epic.Forcing where
 
 import Control.Applicative
@@ -6,96 +6,66 @@
 import Control.Monad
 import Control.Monad.State
 import Control.Monad.Trans
-import Data.List
+
+import Data.Char
+import Data.List hiding (sort)
 import qualified Data.Map as M
 import Data.Maybe
 
 import Agda.Syntax.Common
-import Agda.Syntax.Internal
-import Agda.TypeChecking.CompiledClause
+import qualified Agda.Syntax.Internal as SI
+import Agda.Syntax.Literal
+import Agda.Syntax.Position(noRange)
+import Agda.Syntax.Internal(Tele(..), Telescope, Term, Abs(..), unAbs, absName, Type, Args, QName, unEl)
 import Agda.TypeChecking.Monad
 import Agda.TypeChecking.Rules.LHS.Unify
-import Agda.TypeChecking.Substitute
-import Agda.TypeChecking.Pretty
+import Agda.TypeChecking.Rules.LHS.Instantiate
+import Agda.TypeChecking.Substitute (raiseFrom, raise, substs, apply, TelV(..))
+import qualified Agda.TypeChecking.Substitute as S
+import Agda.TypeChecking.Pretty as P
 import Agda.TypeChecking.Reduce
 import Agda.TypeChecking.Telescope
 import Agda.Utils.List
+import Agda.Utils.Monad
+import Agda.Utils.Permutation
 import Agda.Utils.Size
 
-import Agda.Compiler.Epic.CompileState hiding (conPars)
-import Agda.Compiler.Epic.AuxAST(pairwiseFilter)
+import Agda.Compiler.Epic.AuxAST
+import Agda.Compiler.Epic.CompileState
+import Agda.Compiler.Epic.Epic
+import Agda.Compiler.Epic.Interface
+import qualified Agda.Compiler.Epic.FromAgda as FA
 
 #include "../../undefined.h"
 import Agda.Utils.Impossible
 
--- | Replace the uses of forced variables in a CompiledClauses with the function
---   arguments that they correspond to.
---   Note that this works on CompiledClauses where the term's variable indexes
---   have been reversed, which means that the case variables match the variables
---   in the term.
-removeForced :: MonadTCM m => CompiledClauses -> Type -> Compile m CompiledClauses
-removeForced cc typ = do
-  TelV tele _ <- lift $ telView typ
-  remForced cc tele
 
--- | Returns the type of a constructor given its name
-constrType :: MonadTCM m => QName -> Compile m Type
-constrType q = do
-    map <- lift (gets (sigDefinitions . stImports))
-    return $ maybe __IMPOSSIBLE__ defType (M.lookup q map)
+-- | Returns how many parameters a datatype has
+dataParameters :: QName -> Compile TCM Nat
+dataParameters = lift . dataParametersTCM
 
 -- | Returns how many parameters a datatype has
-dataParameters :: MonadTCM m => QName -> Compile m Nat
-dataParameters name = do
-    m <- lift (gets (sigDefinitions . stImports))
+dataParametersTCM :: QName -> TCM Nat
+dataParametersTCM name = do
+    m <- (gets (sigDefinitions . stImports))
     return $ maybe __IMPOSSIBLE__ (defnPars . theDef) (M.lookup name m)
   where
     defnPars :: Defn -> Nat
     defnPars (Datatype {dataPars = p}) = p
     defnPars (Record   {recPars  = p}) = p
-    defnPars _                         = 0 -- Not so sure about this.
-
--- | Is variable n used in a CompiledClause?
-isIn :: MonadTCM m => Nat -> CompiledClauses -> Compile m Bool
-n `isIn` Case i brs | n == fromIntegral i = return True
-                    | otherwise = n `isInCase` (fromIntegral i, brs)
-n `isIn` Done _ t = return $ n `isInTerm` t
-n `isIn` Fail     = return $ False
-
-isInCase :: MonadTCM m => Nat -> (Nat, Case CompiledClauses) -> Compile m Bool
-n `isInCase` (i, Branches { conBranches    = cbrs
-                          , litBranches    = lbrs
-                          , catchAllBranch = cabr}) = do
-    cbrs' <- (or <$>) $ forM (M.toList cbrs) $ \ (constr, cc) -> do
-        if i < n
-          then do
-            par <- fromIntegral <$> getConPar constr
-            (n + par - 1) `isIn` cc
-          else n `isIn` cc
-
-    lbrs' <- (or <$>) $ forM (M.toList lbrs) $ \ (_, cc) ->
-        (if i < n
-           then (n - 1)
-           else n) `isIn` cc
-
-    cabr' <- case cabr of
-        Nothing -> return False
-        Just cc -> n `isIn` cc
-    return (cbrs' || lbrs' || cabr')
+    defnPars d                         = 0 -- error (show d) -- __IMPOSSIBLE__ -- Not so sure about this.
 
+report n s = do
+  lift $ reportSDoc "epic.forcing" n s
 
-isInTerm :: Nat -> Term -> Bool
-n `isInTerm` term = let recs = any (isInTerm n . unArg) in case term of
-   Var i as -> i == n || recs as
-   Lam _ ab -> (n+1) `isInTerm` absBody ab
-   Lit _    -> False
-   Def _ as -> recs as
-   Con _ as -> recs as
-   Pi a b   -> n `isInTerm` unEl (unArg a) || (n+1) `isInTerm` unEl (absBody b)
-   Fun a b  -> n `isInTerm` unEl (unArg a) || n `isInTerm` unEl b
-   Sort sor -> False -- ?
-   MetaV meta as -> False -- can't occur?
-   DontCare -> False
+piApplyM' :: Type -> Args -> TCM Type
+piApplyM' t as = do
+ {- reportSDoc "" 10 $ vcat
+    [ text "piApplyM'"
+    , text "type: " <+> prettyTCM t
+    , text "args: " <+> prettyTCM as
+    ]-}
+  piApplyM t as
 
 {- |
 insertTele i xs t tele
@@ -112,287 +82,228 @@
 we raise the type since we have added xs' new bindings before Gamma, and as can
 only bind to Gamma.
 -}
-insertTele :: MonadTCM m
-            => Int        -- ^ ABS `pos` in tele
+insertTele ::(QName, Args) -> Int        -- ^ ABS `pos` in tele
             -> Maybe Type -- ^ If Just, it is the type to insert patterns from
                           --   is nothing if we only want to delete a binding.
             -> Term       -- ^ Term to replace at pos
             -> Telescope  -- ^ The telescope `tele` where everything is at
-            -> Compile m ( Telescope
-                         , ( Type
-                           , Type
+            -> Compile TCM ( Telescope -- Resulting telescope
+                           , ( Telescope
+                             , Type -- The type at pos in tele
+                             , Type -- The return Type of the inserted type
+                             )
                            )
-                         )
-                -- ^ Returns (resulting telescope, the type at pos in tele, the
-                --   return type of the inserted type).
-insertTele 0 ins term (ExtendTel t to) = do
+insertTele x 0 ins term (ExtendTel t to) = do
     t' <- lift $ normalise t
-    let Def st arg = unEl . unArg $ t'
+    report 12 $ vcat
+      [ text "t' :" <+> prettyTCM t'
+      , text "term:" <+> prettyTCM term
+      , text "to:"   <+> prettyTCM (unAbs to)
+      ]
+    (st, arg) <- case SI.unEl . unArg $ t' of
+            SI.Def st arg -> return (st, arg)
+            s          -> do
+              report 10 $ vcat
+                [ text "ERROR!!!"
+                , text "found: " <+> (text . show) s
+                , text "ins"     <+> (prettyTCM . fromMaybe __IMPOSSIBLE__) ins
+                ]
+              return x
     -- Apply the parameters of the type of t
     -- Because: parameters occurs in the type of constructors but are not bound by it.
     pars <- dataParameters st
-    TelV ctele ctyp <- lift $ telView $ maybe (unArg t')
-                            (`apply` take (fromIntegral pars) arg) ins
+    report 10 $ text "apply in insertTele"
+    TelV ctele ctyp <- lift $ telView =<< maybe (return $ unArg t')
+                            (`piApplyM'` take (fromIntegral pars) arg) ins
 
     () <- if length (take (fromIntegral pars) arg) == fromIntegral pars
         then return ()
         else __IMPOSSIBLE__
     -- we deal with absBody to directly since we remove t
-    return ( ctele +:+  (subst term $ raiseFrom 1 (size ctele) (absBody to))
-           , (raise (size ctele) $ unArg t , ctyp)
+    return ( ctele +:+  (S.subst term $ S.raiseFrom 1 (size ctele) (unAbs to))
+           , (ctele, S.raise (size ctele) $ unArg t , ctyp)
            )
   where
     -- Append the telescope, we raise since we add a new binding and all the previous
     -- bindings need to be preserved
     (+:+) :: Telescope -> Telescope -> Telescope
     EmptyTel       +:+ t2 = t2
-    ExtendTel t t1 +:+ t2 = ExtendTel t t1 {absBody = absBody t1 +:+ {-raise 1-} t2 }
+    ExtendTel t t1 +:+ t2 = ExtendTel t (Abs (absName t1) $ unAbs t1 +:+ {-raise 1-} t2 )
 -- This case is impossible since we are trying to split a variable outside the tele
-insertTele n ins term EmptyTel = __IMPOSSIBLE__
-insertTele n ins term (ExtendTel x xs) = do
-    (xs', typ) <- insertTele (n - 1) ins term (absBody xs)
-    return (ExtendTel x xs {absBody = xs'} , typ)
+insertTele x n ins term EmptyTel = __IMPOSSIBLE__
+insertTele er n ins term (ExtendTel x xs) = do
+    (xs', typ) <- insertTele er (n - 1) ins term (unAbs xs)
+    return (ExtendTel x $ Abs (absName xs) xs' , typ)
 
-mkCon c n = Con c [ defaultArg $ Var (fromIntegral i) [] | i <- [n - 1, n - 2 .. 0] ]
+mkCon c n = SI.Con c [ defaultArg $ SI.Var (fromIntegral i) [] | i <- [n - 1, n - 2 .. 0] ]
 
-unifyI :: MonadTCM m => Telescope -> [Nat] -> Type -> Args -> Args -> Compile m [Maybe Term]
+unifyI :: Telescope -> [Nat] -> Type -> Args -> Args -> Compile TCM [Maybe Term]
 unifyI tele flex typ a1 a2 = lift $ addCtxTel tele $ unifyIndices_ flex typ a1 a2
 
 takeTele 0 _ = EmptyTel
-takeTele n (ExtendTel t ts) = ExtendTel t ts {absBody = takeTele (n-1) (absBody ts) }
+takeTele n (ExtendTel t ts) = ExtendTel t $ Abs (absName ts) $ takeTele (n-1) (unAbs ts)
 takeTele _ _ = __IMPOSSIBLE__
 
--- | Remove forced variables cased on in the current top-level case in the CompiledClauses
-remForced :: MonadTCM m
-     => CompiledClauses -- ^ Remove cases on forced variables in this
-     -> Telescope       -- ^ The current context we are in
-     -> Compile m CompiledClauses
-remForced ccOrig tele = case ccOrig of
-    Case n brs -> do
-        -- Get all constructor branches
-        cbs <- forM (M.toList $ conBranches brs) $ \(constr, cc) -> do
-            par             <- getConPar  constr
-            typ             <- constrType constr
-            -- Update tele with the telescope from the constructor's type
-            (tele', (ntyp, ctyp))   <- insertTele n (Just typ) (mkCon constr par) tele
-            ntyp <- lift $ reduce ntyp
-            ctyp <- lift $ reduce ctyp
-            notForced       <- getIrrFilter constr
-            -- Get the variables that are forced, relative to the position after constr
-            forcedVars <- filterM ((`isIn` cc) . (flip subtract (fromIntegral $ n + par - 1)))
-                        $ pairwiseFilter (map not notForced)
-                        $ map fromIntegral [par-1,par-2..0]
-            if null forcedVars
-                then (,) constr <$> remForced cc tele'
-                else do
+-- | Main function for removing pattern matching on forced variables
+remForced :: [Fun] -> Compile TCM [Fun]
+remForced fs = do
+    defs <- lift (gets (sigDefinitions . stImports))
+    forM fs $ \f -> case f of
+        Fun{} -> case funQName f >>= flip M.lookup defs of
+            Nothing -> __IMPOSSIBLE__
+            Just def -> do
+                TelV tele _ <- lift $ telView (defType def)
+                report 10 $ vcat
+                  [ text "compiling fun" <+> (text . show) (funQName f)
+                  ]
+                e <- forcedExpr (funArgs f) tele (funExpr f)
+                report 10 $ vcat
+                  [ text "compilied fun" <+> (text . show) (funQName f)
+                  , text "before:" <+> (text . prettyEpic) (funExpr f)
+                  , text "after:" <+> (text . prettyEpic) e
+                  ]
+                return $ f { funExpr = e}
+        EpicFun{} -> return f
+
+-- | For a given expression, in a certain telescope (the list of Var) is a mapping
+-- of variable name to the telescope.
+forcedExpr :: [Var] -> Telescope -> Expr -> Compile TCM Expr
+forcedExpr vars tele expr = case expr of
+    Var _ -> return expr
+    Lit _ -> return expr
+    Lam x e -> Lam x <$> rec e -- necessary?
+    Con t q es -> Con t q <$> mapM rec es
+    App v es -> App v <$> mapM rec es
+    If a b c -> If <$> rec a <*> rec b <*> rec c
+    Let v e1 e2 -> Let v <$> rec e1 <*> rec e2
+    Lazy e -> Lazy <$> rec e
+    UNIT   -> return expr
+    IMPOSSIBLE -> return expr
+    Case v@(Var x) brs -> do
+        let n = fromMaybe __IMPOSSIBLE__ $ elemIndex x vars
+        (Case v <$>) . forM brs $ \ br -> case br of
+            BrInt i e -> do
+              (tele'', _) <-  insertTele __IMPOSSIBLE__ n Nothing (SI.Lit (LitChar noRange (chr i))) tele
+              BrInt i <$> forcedExpr (replaceAt n vars []) tele'' e
+
+            Default e -> Default <$> rec e
+            Branch t constr as e -> do
+                typ <- getType constr
+                forc <- getForcedArgs constr
+                (tele'', (_, ntyp, ctyp)) <- insertTele __IMPOSSIBLE__ n (Just typ)
+                                                        (mkCon constr (length as)) tele
+                ntyp <- lift $ reduce ntyp
+                ctyp <- lift $ reduce ctyp
+
+                if null (forced forc as)
+                  then Branch t constr as <$> forcedExpr (replaceAt n vars as) tele'' e
+                  else do
+                    -- unify the telescope type with the return type of the constructor
                     unif <- case (unEl ntyp, unEl ctyp) of
-                        (Def st a1, Def st' a2) | st == st' -> do
+                        (SI.Def st a1, SI.Def st' a2) | st == st' -> do
                             typPars <- fromIntegral <$> dataParameters st
-                            setType <- constrType st
-                            {-
-                                We are splitting on C xs
-                                we know that C : ts -> T ss ; for some T
-                                we also know from tele that we are splitting on T as
-                                we want to unify ss with as, but not taking into account
-                                the Data parameters to T.
-                            -}
-                            unifyI (takeTele (n + par) tele')
-                                   (map fromIntegral [0 .. n + par]) -- Don't unify the constructor arguments
+                            setType <- getType st
+                            report 10 $ vcat
+                              [ text "ntyp:" <+> prettyTCM ntyp
+                              , text "ctyp:" <+> prettyTCM ctyp
+                              ]
+                            unifyI (takeTele (n + length as) tele'')
+                                   (map fromIntegral $ [0 .. n + length as])
                                    (setType `apply` take typPars a1)
                                    (drop typPars a1)
                                    (drop typPars a2)
-                        x -> __IMPOSSIBLE__
-                    -- we calculate the new tpos from n (the old one) by adding
-                    -- how many more bindings we have
-                    (,) constr <$> replaceForced (fromIntegral $ n + par, tele')
-                                                 forcedVars
-                                                 (cc, unif)
-
-        lbs <- forM (M.toList $ litBranches brs) $ \(lit, cc) -> do
-            -- We have one less binding
-            (newTele, _) <- insertTele n Nothing (Lit lit) tele
-            (,) lit <$>  remForced cc newTele
-
-        cabs <- case catchAllBranch brs of
-            Nothing -> return Nothing
-            Just cc -> Just <$> remForced cc tele
-
-        return $ Case n brs { conBranches = M.fromList cbs
-                            , litBranches = M.fromList lbs
-                            , catchAllBranch = cabs }
-
-    Done n t   -> return $ Done n t
-    Fail       -> return Fail
-
-data FoldState = FoldState
-  { clauseToFix  :: CompiledClauses
-  , clausesAbove :: CompiledClauses -> CompiledClauses
-  , unification  :: [Maybe Term]
-  , theTelescope :: Telescope
-  , telePos      :: Nat
-  } deriving Show
-
--- Some utility functions
-
-foldM' :: Monad m => a -> [b] -> (a -> b -> m a) -> m a
-foldM' z xs f = foldM f z xs
-
-lift2 :: (MonadTrans t, Monad (t1 m), MonadTrans t1, Monad m) => m a -> t (t1 m) a
-lift2 = lift . lift
-
-modifyM :: (MonadState a m) => (a -> m a) -> m ()
-modifyM f = get >>= f >>= put -- (>>= put) . (get >>=)
-
--- | replaceForced (tpos, tele) forcedVars (cc, unification)
---   For each forceVar dig out the corresponding case and continue to remForced.
-replaceForced :: MonadTCM m
-              => (Nat, Telescope) -> [Nat] -> (CompiledClauses, [Maybe Term])
-              -> Compile m CompiledClauses
-replaceForced (telPos, tele) forcedVars (cc, unif) = do
-    let origSt = FoldState
-                  { clauseToFix  = cc
-                  , clausesAbove = id
-                  , unification  = unif
-                  , theTelescope = tele
-                  , telePos      = telPos
-                  }
-    st <- flip execStateT origSt $ forM forcedVars $ \ forcedVar -> do
-        unif <- gets unification
-        let (caseVar, caseTerm) = findPosition forcedVar unif
-        telPos <- gets telePos
-        termToBranch (telPos - caseVar - 1) caseTerm forcedVar
-    clausesAbove st <$> remForced (clauseToFix st) (theTelescope st)
+                        _ -> __IMPOSSIBLE__
+                    let
+                        lower = map (raise (-1)) . drop 1
+                        isOk t = case t of
+                          SI.Var n xs | n >= 0 -> all (isOk . unArg) xs
+                          SI.Con _ xs -> all (isOk . unArg) xs
+                          SI.Def f xs -> all (isOk . unArg) xs
+                          _ -> error $ show t
+                        subT 0 tel = let ss = [fromMaybe (SI.Var n []) t
+                                              | (n , t) <- zip [0..] (unif ++ repeat Nothing)]
+                                      in (S.substs ss tel, lower ss)
+                        subT n (ExtendTel a t) = let
+                               (tb' , ss) = subT (n - 1) (unAbs t)
+                               a' | all isOk (take 100 ss) = S.substs ss a
+                                  | True    = __IMPOSSIBLE__
+                            in (ExtendTel a $ Abs (absName t) tb', lower ss)
+                        subT _ _ = __IMPOSSIBLE__
+                        (tele'''', _) = subT (n + length as) tele''
+                    report 10 $ nest 2 $ vcat
+                      [ text "remforced"
+                      , text "tele=" <+> prettyTCM tele''
+                      , text "tele'=" <+> prettyTCM tele''''
+                      , text "unif=" <+> (text . show) unif
+                      , text "forced=" <+> (text . show) (forced forc as)
+                      , text "constr" <+> prettyTCM constr
+                      ]
+                    -- replace all forced variables found using the unification
+                    Branch t constr as <$>
+                        replaceForced (replaceAt n vars as, reverse $ take n vars ++ as)
+                                      (tele'''') (forced forc as) unif e
+    _ -> __IMPOSSIBLE__
   where
-    {-
-      In this function the following de Bruijn is:
-        forcedVar : Relative
-        caseVar : Absolute
-        telePos : Absolute
-    -}
-    termToBranch :: MonadTCM m => Nat -> Term -> Nat -> StateT FoldState (Compile m) ()
-    termToBranch caseVar caseTerm forcedVar = case caseTerm of
-        Var i _ | i == forcedVar -> do
-            telPos <- gets telePos
-            let sub = [0..telPos - forcedVar - 2] ++ [caseVar] ++ [telPos - forcedVar..]
-            modifyM $ \ st -> do
-                newClauseToFix <- substCC sub (clauseToFix st)
-                return st
-                    { clauseToFix = newClauseToFix
-                    , unification = substs (map (flip Var []) sub) (unification st)
-                    }
-                -- This is impossible since we have already looked and it should
-                -- be the correct Var
-                | otherwise -> __IMPOSSIBLE__
-        Con c args -> do
-            telPos <- gets telePos
-            let (nextCaseVarInCon, nextCaseTerm) = findPosition forcedVar (map (Just . unArg) args)
-                nextCaseVar = nextCaseVarInCon + caseVar
-                newBinds    = fromIntegral $ length args - 1
-                -- we have added newBinds new bindings and removed one before telePos
-                nextTelePos = telPos + newBinds
-            ctyp <- lift (constrType c)
-
-            modifyM $ \ st -> do
-                (newTele , _) <- lift $ insertTele (fromIntegral caseVar) (Just ctyp)
-                                        (mkCon c (length args)) (theTelescope st)
-                -- We have to update the unifications-list so that we don't try
-                -- to dig out the same again later.
-                let newUnif = raiseFrom (telPos - caseVar) newBinds $
-                        replaceAt (fromIntegral $ telPos - caseVar - 1)
-                                  (unification st)
-                                  (reverse $ map (Just . unArg) args)
-                                  -- The variables in the unification-list is
-                                  -- relative so we need to reverse the args
-                                  -- so they get in the right place.
-                return st
-                    { clauseToFix  = raiseFromCC caseVar newBinds
-                                                 (substCCBody caseVar
-                                                 (Con c $ map (defaultArg . flip Var [])
-                                                              [caseVar .. caseVar + newBinds])
-                                                 (clauseToFix st))
-                    , theTelescope = newTele
-                    , unification  = newUnif
-                    , telePos      = nextTelePos
-                    }
-            st <- get
-            termToBranch nextCaseVar nextCaseTerm forcedVar
-            modify $ \ st -> st
-                { clausesAbove = Case (fromIntegral caseVar) . conCase c . (clausesAbove st)
-                }
-        _ -> __IMPOSSIBLE__
+    rec = forcedExpr vars tele
 
--- Note: Absolute positions
-raiseFromCC :: Nat -> Nat -> CompiledClauses -> CompiledClauses
-raiseFromCC from add  cc = case cc of
-    Case n (Branches cbr lbr cabr) -> Case (fromIntegral $ raiseN from add (fromIntegral n)) $
-                                           Branches (M.map rec cbr)
-                                                    (M.map rec lbr)
-                                                    (fmap  rec cabr)
-    Done i t -> Done (i + fromIntegral add) $ raiseFrom from add t
-    Fail     -> Fail
+-- | replace the forcedVar with pattern matching from the outside.
+replaceForced :: ([Var],[Var]) -> Telescope -> [Var] -> [Maybe SI.Term] -> Expr -> Compile TCM Expr
+replaceForced (vars,_) tele [] _ e = forcedExpr vars tele e
+replaceForced (vars,uvars) tele (fvar : fvars) unif e = do
+    let n = fromMaybe __IMPOSSIBLE__ $ elemIndex fvar uvars
+    mpos <- findPosition (fromIntegral n) unif
+    case mpos of
+        Nothing -> case unif !! n of
+            Nothing | fvar `notElem` fv e ->
+              replaceForced (vars, uvars) tele fvars unif e
+            Nothing -> do
+              report 10 $ vcat
+                [ text "failure comming!"
+                , text "unif" <+> (text . show) unif
+                , text "n" <+> (text . show) n
+                , text "fvar" <+> (text fvar)
+                , text "fv" <+> (text . show) (fv e)
+                ]
+              __IMPOSSIBLE__
+            Just t  -> do
+                v <- newName
+                te <- FA.substTerm uvars t
+                subst fvar v <$> replaceForced (vars, uvars)
+                                               tele fvars unif (Let v te e)
+        Just (pos , term) -> do
+            (build, v) <- buildTerm (uvars !! fromInteger pos) (fromIntegral n) term
+            build . subst fvar v <$> replaceForced (vars, uvars) tele fvars unif
+                                     e
   where
-    rec = raiseFromCC from add
-    raiseN :: Nat -> Nat -> Nat -> Nat
-    raiseN from add n | from <= n = n + add
-                      | otherwise = n
+    sub fvar v = map $ \x -> if x == fvar then v else x
 
--- | Substitute with the Substitution, this will adjust with the new bindings in the
---   CompiledClauses
-substCC :: MonadTCM m => [Nat] -> CompiledClauses -> StateT FoldState (Compile m) CompiledClauses
-substCC ss cc = case cc of
-    Done i t -> do
-        return $ Done i (substs (map (flip Var []) ({-reverse $ take i -} ss)) t)
-    Fail     -> return Fail
-    Case n brs -> do
-        {-
-          In a Case split, if we should change n to m, then all the binders in
-          this pattern should also change from being based on n to be based on m.
-        -}
-        cbs <- forM (M.toList $ conBranches brs) $ \ (c, br) -> do
-            nargs <- lift2 $ constructorArity c
-            let delta = (ss !! n) - fi n
-                ss'   = take n ss
-                      ++ [fi n + delta .. fi n + delta + nargs - 1]
-                      ++ map (+ (nargs - 1)) (drop (n+1) ss)
-            (,) c <$> substCC ss' br
+-- | Given a term containg the forced var, dig out the variable by inserting
+-- the proper case-expressions.
+buildTerm :: Var -> Nat -> Term -> Compile TCM (Expr -> Expr, Var)
+buildTerm var idx (SI.Var i _) | idx == i = return (id, var)
+buildTerm var idx (SI.Con c args) = do
+    vs <- replicateM (length args) newName
+    (pos , arg) <- fromMaybe __IMPOSSIBLE__ <$> findPosition idx (map (Just . unArg) args)
+    (fun' , v) <- buildTerm (vs !! fromInteger pos) idx arg
+    tag <- getConstrTag c
+    let fun e = casee (Var var) [Branch tag c vs e]
+    return (fun . fun' , v)
+buildTerm _ _ _ = __IMPOSSIBLE__
 
-        lbs <- forM (M.toList $ litBranches brs) $ \ (l, br) -> do
-            -- We have one less binder here
-            (,) l <$> substCC (replaceAt n ss []) br
 
-        cabs <- case catchAllBranch brs of
-            Nothing -> return Nothing
-            Just br -> Just <$> substCC ss br
-
-        return $ Case (fromIntegral (ss !! n))
-                  Branches { conBranches    = M.fromList cbs
-                           , litBranches    = M.fromList lbs
-                           , catchAllBranch = cabs
-                           }
-  where
-    fi = fromIntegral
-
--- | Substitute variable n for term t in the body of cc
-substCCBody :: Nat -> Term -> CompiledClauses -> CompiledClauses
-substCCBody n t cc = substsCCBody (vs [0..n - 1] ++ [t] ++ vs [n + 1..]) cc
-  where vs = map (flip Var [])
-
--- | Perform a substitution in the body of cc
-substsCCBody :: [Term] -> CompiledClauses -> CompiledClauses
-substsCCBody ss cc = case cc of
-    Case n brs -> Case n (substsCCBody ss <$> brs)
-    Done i t -> Done i (substs ss t)
-    Fail     -> Fail
-
 -- | Find the location where a certain Variable index is by searching the constructors
 --   aswell. i.e find a term that can be transformed into a pattern that contains the
 --   same value the index. This fails if no such term is present.
-findPosition :: Nat -> [Maybe Term] -> (Nat, Term)
-findPosition var ts = let Just n = findIndex (maybe False pred) ts
-                       in (fromIntegral n , fromJust $ ts !! n)
+findPosition :: Nat -> [Maybe SI.Term] -> Compile TCM (Maybe (Nat, SI.Term))
+findPosition var ts = (listToMaybe . catMaybes <$>) . forM (zip [0..] ts) $ \ (n, mt) -> do
+    ifM (maybe (return False) pred mt)
+        (return (Just (n, fromMaybe __IMPOSSIBLE__ mt)))
+        (return Nothing)
   where
-    pred :: Term -> Bool
+    pred :: Term -> Compile TCM Bool
     pred t = case t of
-      Var i _ | var == i -> True
-      Con _ args         -> any (pred . unArg) args
-      _                  -> False
+      SI.Var i _ | var == i -> return True
+      SI.Con c args         -> do
+          forc <- getForcedArgs c
+          or <$> mapM (pred . unArg) (notForced forc args)
+      _                  -> return False
diff --git a/src/full/Agda/Compiler/Epic/FromAgda.hs b/src/full/Agda/Compiler/Epic/FromAgda.hs
--- a/src/full/Agda/Compiler/Epic/FromAgda.hs
+++ b/src/full/Agda/Compiler/Epic/FromAgda.hs
@@ -18,78 +18,94 @@
 import qualified Agda.Syntax.Literal  as TL
 import qualified Agda.TypeChecking.CompiledClause as CC
 import Agda.TypeChecking.Monad
+import Agda.TypeChecking.Level (reallyUnLevelView)
 import qualified Agda.TypeChecking.Substitute as S
+import Agda.TypeChecking.Pretty
 
 import Agda.Compiler.Epic.AuxAST
-import Agda.Compiler.Epic.CompileState hiding (conPars)
-import Agda.Compiler.Epic.Forcing
+import Agda.Compiler.Epic.CompileState
+import Agda.Compiler.Epic.Interface
+import Agda.Compiler.Epic.Static
 
+import Agda.Compiler.Epic.Epic
+
 #include "../../undefined.h"
 import Agda.Utils.Impossible
 
 -- | Convert from Agda's internal representation to our auxiliary AST.
-fromAgda :: MonadTCM m => Maybe T.Term -> [(QName, Definition)] -> Compile m [Fun]
+fromAgda :: Maybe T.Term -> [(QName, Definition)] -> Compile TCM [Fun]
 fromAgda msharp defs = catMaybes <$> mapM (translateDefn msharp) defs
 
 -- | Translate an Agda definition to an Epic function where applicable
-translateDefn :: MonadTCM m => Maybe T.Term -> (QName, Definition) -> Compile m (Maybe Fun)
-translateDefn msharp (n, defini) = let n' = unqname n in case theDef defini of
+translateDefn :: Maybe T.Term -> (QName, Definition) -> Compile TCM (Maybe Fun)
+translateDefn msharp (n, defini) =
+  let n' = unqname n
+      epDef = compiledEpic $ defCompiledRep defini
+  in case theDef defini of
     d@(Datatype {}) -> do -- become functions returning unit
         vars <- replicateM (fromIntegral $ dataPars d + dataIxs d) newName
-        return . return $ Fun True n' ("datatype: " ++ show n) vars UNIT
+        return . return $ Fun True n' (Just n) ("datatype: " ++ show n) vars UNIT
     f@(Function{}) -> do
-        irrF <- gets irrFilters
-        let len   = length . clausePats . translatedClause . head .  funClauses $ f
+        let projArgs = maybe 0 (pred . snd) (funProjection f)
+        ccs  <- reverseCCBody projArgs <$> normaliseStatic (funCompiled f)
+        let len   = (+ projArgs) . length . clausePats . head .  funClauses $ f
             toEta = fromIntegral (arity (defType defini)) - len
-            ccs   = reverseCCBody $ funCompiled f
-        forcing <- lift $ gets (optForcing . stPersistentOptions)
-        funComp <- if forcing
-                    then removeForced ccs (defType defini)
-                    else return ccs
-        return <$> (etaExpand toEta =<< compileClauses n len funComp)
+        -- forcing <- lift $ gets (optForcing . stPersistentOptions)
+        lift $ reportSDoc "epic.fromagda" 5 $ text "compiling fun:" <+> prettyTCM n
+        lift $ reportSDoc "epic.fromagda" 5 $ text "len:" <+> (text . show) len
+        lift $ reportSDoc "epic.fromagda" 5 $ text "pats:" <+> (text . show) (clausePats
+                    $ head $ funClauses f)
+        modify $ \s -> s {curFun = show n}
+        lift $ reportSDoc "epic.fromagda" 5 $ text "ccs: " <+> (text . show) ccs
+        res <- return <$> (etaExpand toEta =<< compileClauses n len ccs)
+        pres <- case res of
+          Nothing -> return Nothing
+          Just  c -> return <$> prettyEpicFun c
+        lift $ reportSDoc "" 5 $ text $ show pres -- (fmap prettyEpicFun res)
+        return res
     Constructor{} -> do -- become functions returning a constructor with their tag
         arit <- lift $ constructorArity n
         tag   <- getConstrTag n
         -- Sharp has to use the primSharp function from AgdaPrelude.e
         case msharp of
-          Just (T.Def sharp []) | sharp == n -> return <$> mkFun n' "primSharp" 3
+          Just (T.Def sharp []) | sharp == n -> return <$> mkFun n n' "primSharp" 3
           _    -> return <$> mkCon n tag arit
     r@(Record{}) -> do
         vars <- replicateM (fromIntegral $ recPars r) newName
-        return . return $ Fun True n' ("record: " ++ show n) vars UNIT
+        return . return $ Fun True n' (Just n) ("record: " ++ show n) vars UNIT
     a@(Axiom{}) -> do -- Axioms get their code from COMPILED_EPIC pragmas
-        case axEpDef a of
-            Nothing -> return . return $ EpicFun n' ("AXIOM_UNDEFINED: " ++ show n)
+        case epDef of
+            Nothing -> return . return $ EpicFun n' (Just n) ("AXIOM_UNDEFINED: " ++ show n)
                 $ "() -> Any = lazy(error \"Axiom " ++ show n ++ " used but has no computation\")"
-            Just x  -> return . return $ EpicFun n' ("COMPILED_EPIC: " ++ show n) x
+            Just x  -> return . return $ EpicFun n' (Just n) ("COMPILED_EPIC: " ++ show n) x
     p@(Primitive{}) -> do -- Primitives use primitive functions from AgdaPrelude.e of the same name.
                           -- Hopefully they are defined!
       let ar = fromIntegral $ arity $ defType defini
-      return <$> mkFun n' (primName p) ar
+      return <$> mkFun n n' (primName p) ar
   where
-    mkFun = mkFunGen apps ("primitive: " ++)
+    mkFun q = mkFunGen q apps ("primitive: " ++)
     mkCon q tag ari = do
         let name = unqname q
-        mkFunGen (flip Con q) (const $ "constructor: " ++ show q) name tag ari
-    mkFunGen :: Monad m
-            => (name -> [Expr] -> Expr) -- ^ combinator
+        mkFunGen q (flip Con q) (const $ "constructor: " ++ show q) name tag ari
+    mkFunGen :: QName                    -- ^ Original name
+            -> (name -> [Expr] -> Expr) -- ^ combinator
             -> (name -> String)         -- ^ make comment
             -> Var                      -- ^ Name of the function
             -> name                     -- ^ Primitive function name
             -> Int                      -- ^ Arity ofthe function
-            -> Compile m Fun            -- ^ Result?
-    mkFunGen comb sh name primname arit = do
+            -> Compile TCM Fun            -- ^ Result?
+    mkFunGen qn comb sh name primname arit = do
         vars <- replicateM arit newName
-        return $ Fun True name (sh primname) vars (comb primname (map Var vars))
+        return $ Fun True name (Just qn) (sh primname) vars (comb primname (map Var vars))
 
-    etaExpand :: MonadTCM m => Int -> Fun -> Compile m Fun
-    etaExpand num fun = do
-        names <- replicateM num newName
+    etaExpand :: Int -> Fun -> Compile TCM Fun
+    etaExpand num fun = return fun -- do
+{-        names <- replicateM num newName
         return $ fun
             { funExpr = funExpr fun @@ names
             , funArgs = funArgs fun ++ names
             }
-
+-}
     (@@) :: Expr -> [Var] -> Expr
     e @@ [] = e
     e @@ vs = let ts = map Var vs in case e of
@@ -101,7 +117,7 @@
       App var es       -> App var (es ++ ts)
       Case expr bs     -> Case expr (map (flip appBranch vs) bs)
       If ea eb ec      -> If ea (eb @@ vs) (ec @@ vs)
-      Let var el e'    -> Let var el (e' @@ vs)
+      Let var el e'    -> lett var el (e' @@ vs)
       Lazy e'          -> Lazy (e' @@ vs)
       Lit _lit         -> IMPOSSIBLE -- Right?
       UNIT             -> IMPOSSIBLE
@@ -110,12 +126,14 @@
     appBranch :: Branch -> [Var] -> Branch
     appBranch b vs = b {brExpr = brExpr b @@ vs}
 
-reverseCCBody :: CC.CompiledClauses -> CC.CompiledClauses
-reverseCCBody cc = case cc of
-    CC.Case n (CC.Branches cbr lbr cabr) -> CC.Case n $ CC.Branches (M.map reverseCCBody cbr)
-                                                        (M.map reverseCCBody lbr)
-                                                        (fmap  reverseCCBody cabr)
-    CC.Done i t -> CC.Done i (S.substs (map (flip T.Var []) (reverse $ take i [0..])) t)
+reverseCCBody :: Int -> CC.CompiledClauses -> CC.CompiledClauses
+reverseCCBody c cc = case cc of
+    CC.Case n (CC.Branches cbr lbr cabr) -> CC.Case (c+n)
+        $ CC.Branches (M.map (reverseCCBody c) cbr)
+          (M.map (reverseCCBody c) lbr)
+          (fmap  (reverseCCBody c) cabr)
+    CC.Done i t -> CC.Done i (S.substs (map (flip T.Var [])
+                               (reverse $ take (length i) [fromIntegral c..])) t)
     CC.Fail     -> CC.Fail
 
 -- | Translate from Agda's desugared pattern matching (CompiledClauses) to our AuxAST.
@@ -148,31 +166,30 @@
 --   we have to add the catchAllBranch to each inner case (here we are calling
 --   it omniDefault). To avoid code duplication it is first bound by a let
 --   expression.
-compileClauses :: MonadTCM m
-               => QName
+compileClauses :: QName
                -> Int -- ^ Number of arguments in the definition
-               -> CC.CompiledClauses -> Compile m Fun
+               -> CC.CompiledClauses -> Compile TCM Fun
 compileClauses name nargs c = do
     let n' = unqname name
     vars <- replicateM nargs newName
     e    <- compileClauses' vars Nothing c
-    return $ Fun False n' ("function: " ++ show name) vars e
+    return $ Fun False n' (Just name) ("function: " ++ show name) vars e
   where
-    compileClauses' :: MonadTCM m => [Var] -> Maybe Var -> CC.CompiledClauses -> Compile m Expr
+    compileClauses' :: [Var] -> Maybe Var -> CC.CompiledClauses -> Compile TCM Expr
     compileClauses' env omniDefault cc = case cc of
         CC.Case n nc -> case length env <= n of
            True -> __IMPOSSIBLE__
            False -> case CC.catchAllBranch nc of
             Nothing -> Case (Var (env !! n)) <$> compileCase env omniDefault n nc
             Just de -> do
-                var <- newName
                 def <- compileClauses' env omniDefault de
-                Let var (Lazy def) . Case (Var (env !! n)) <$> compileCase env (Just var) n nc
+                bindExpr (lazy def) $ \ var ->
+                  Case (Var (env !! n)) <$> compileCase env (Just var) n nc
         CC.Done _ t -> substTerm ({- reverse -} env) t
         CC.Fail     -> return IMPOSSIBLE
 
-    compileCase :: MonadTCM m => [Var] -> Maybe Var -> Int -> CC.Case CC.CompiledClauses
-                -> Compile m [Branch]
+    compileCase :: [Var] -> Maybe Var -> Int -> CC.Case CC.CompiledClauses
+                -> Compile TCM [Branch]
     compileCase env omniDefault casedvar nc = do
         cb <- if M.null (CC.conBranches nc)
            -- Lit branch
@@ -180,12 +197,13 @@
                cc' <- compileClauses' (replaceAt casedvar env []) omniDefault cc
                case l of
                    TL.LitChar _ cha -> return $ BrInt (ord cha) cc'
-                   _ -> __IMPOSSIBLE__ -- TODO: Handle other literals
+                   -- TODO: Handle other literals
+                   _ -> epicError $ "case on literal not supported: " ++ show l
            -- Con branch
            else forM (M.toList (CC.conBranches nc)) $ \(b, cc) -> do
-               par  <- getConPar b
+               arit  <- getConArity b
                tag  <- getConstrTag b
-               vars <- replicateM par newName
+               vars <- replicateM arit newName
                cc'  <- compileClauses' (replaceAt casedvar env vars) omniDefault cc
                return $ Branch tag b vars cc'
 
@@ -197,19 +215,27 @@
 -- | Translate the actual Agda terms, with an environment of all the bound variables
 --   from patternmatching. Agda terms are in de Bruijn so we just check the new
 --   names in the position.
-substTerm :: MonadTCM m => [Var] -> T.Term -> Compile m Expr
+substTerm :: [Var] -> T.Term -> Compile TCM Expr
 substTerm env term = case term of
     T.Var ind args -> case length env <= fromIntegral ind of
         True  -> __IMPOSSIBLE__
         False -> apps (env !! fromIntegral ind) <$> mapM (substTerm env . unArg) args
-    T.Lam _ te -> do
+    T.Lam _ (Abs _ te) -> do
        name <- newName
-       Lam name <$> substTerm (name : env) (absBody te)
+       Lam name <$> substTerm (name : env) te
+    T.Lam _ (NoAbs _ te) -> do
+       name <- newName
+       Lam name <$> substTerm env te
     T.Lit l -> Lit <$> substLit l
+    T.Level l -> substTerm env =<< lift (reallyUnLevelView l)
     T.Def q args -> do
       let name = unqname q
       del <- getDelayed q
-      f <- apps name <$> mapM (substTerm env . unArg) args
+      def <- theDef <$> lift (getConstInfo q)
+      let nr = case def of
+                Function{funProjection = Just (_ , x)} -> pred x
+                _ -> 0
+      f <- apps name . (replicate nr UNIT ++) <$> mapM (substTerm env . unArg) args
       return $ case del of
         True  -> Lazy f
         False -> f
@@ -217,16 +243,14 @@
         let con = unqname q
         apps con <$> mapM (substTerm env . unArg) args
     T.Pi _ _ -> return UNIT
-    T.Fun _ _ -> return UNIT
     T.Sort _  -> return UNIT
     T.MetaV _ _ -> return UNIT
-    T.DontCare  -> return UNIT
+    T.DontCare _ -> return UNIT
 
 -- | Translate Agda literals to our AUX definition
-substLit :: MonadTCM m => TL.Literal -> Compile m Lit
+substLit :: TL.Literal -> Compile TCM Lit
 substLit lit = case lit of
   TL.LitInt    _ i -> return $ LInt i
-  TL.LitLevel  _ i -> return $ LInt i
   TL.LitString _ s -> return $ LString s
   TL.LitChar   _ c -> return $ LChar c
   TL.LitFloat  _ f -> return $ LFloat f
diff --git a/src/full/Agda/Compiler/Epic/Injection.hs b/src/full/Agda/Compiler/Epic/Injection.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Compiler/Epic/Injection.hs
@@ -0,0 +1,323 @@
+{-# LANGUAGE CPP, TypeOperators, PatternGuards #-}
+module Agda.Compiler.Epic.Injection where
+
+import Control.Monad.State
+
+import Data.Function
+import Data.Ix
+import Data.List
+import Data.Map(Map)
+import qualified Data.Map as M
+import Data.Maybe
+import Data.Set(Set)
+import qualified Data.Set as S
+
+import Agda.Syntax.Common
+import Agda.Syntax.Internal
+import Agda.Syntax.Literal
+import Agda.TypeChecking.CompiledClause
+import Agda.TypeChecking.Monad hiding ((!!!))
+import Agda.TypeChecking.Monad.Builtin
+import Agda.TypeChecking.Pretty
+import Agda.TypeChecking.Reduce
+import Agda.TypeChecking.Substitute
+import Agda.TypeChecking.Telescope
+import Agda.Utils.Monad
+import Agda.Utils.Size
+
+import Agda.Compiler.Epic.CompileState
+import qualified Agda.Compiler.Epic.FromAgda as FA
+import Agda.Compiler.Epic.Interface as Interface
+
+#include "../../undefined.h"
+import Agda.Utils.Impossible
+
+-- | Find potentially injective functions, solve constraints to fix some constructor
+--   tags and make functions whose constraints are fulfilled injections
+findInjection :: [(QName, Definition)] -> Compile TCM [(QName, Definition)]
+findInjection defs = do
+    funs <- forM defs $ \(name, def) -> case theDef def of
+        f@(Function{}) -> isInjective name (funClauses f)
+        _              -> return Nothing
+    newNames <- M.keys <$> gets (Interface.conArity . curModule)
+    injFuns <- solve newNames (catMaybes funs)
+    defs' <- forM defs $ \(q, def) -> case q `isIn` injFuns of
+        Nothing -> return (q, def)
+        Just inj@(InjectiveFun var arity) -> case theDef def of
+            f@(Function{})   -> do
+                modifyEI $ \s -> s { injectiveFuns = M.insert q inj (injectiveFuns s) }
+                let ns = replicate (fromIntegral arity) (Arg NotHidden Relevant "")
+                return $ (,) q $ def {theDef = f { funCompiled = Done ns
+                                                                      (Var (arity - var - 1) []) } }
+            _                -> __IMPOSSIBLE__
+
+    lift $ reportSLn "epic.injection" 10 $ "injfuns: " ++ show injFuns
+    return defs'
+  where
+    q `isIn` funs = case filter (\(nam, _) -> q == nam) funs of
+        []   -> Nothing
+        (_,x):_  -> Just x
+
+replaceFunCC :: QName -> CompiledClauses -> Compile TCM ()
+replaceFunCC name cc = do
+    lift $ modify $ \s ->
+        s { stSignature = (stSignature s) { sigDefinitions = M.adjust replaceDef name (sigDefinitions (stSignature s)) }
+          , stImports   = (stImports   s) { sigDefinitions = M.adjust replaceDef name (sigDefinitions (stImports   s)) }
+          }
+  where
+    replaceDef :: Definition -> Definition
+    replaceDef def = case theDef def of
+        f@(Function{}) -> def {theDef = f { funCompiled = cc } }
+        x                -> __IMPOSSIBLE__
+
+-- | If the pairs of constructor names have the same tags, the function is
+--   injective. If Nothing, the function is not injective.
+type InjConstraints = Maybe [(QName,QName)]
+
+
+isInjective :: QName    -- ^ Name of the function being tested
+            -> [Clause] -- ^ The function's clauses
+            -> Compile TCM (Maybe ((QName, InjectiveFun)
+                                  , [(QName, QName)] -- These construtors should have the same name
+                                  ))
+isInjective nam []  = return Nothing
+isInjective nam cls@(cl : _) = do
+    let total = genericLength . clausePats $ cl
+    (listToMaybe . catMaybes <$>) . forM [0 .. total - 1] $ \i -> do
+        cli <- forM cls $ \ cl -> isInjectiveHere nam i  cl
+        let cli' = catMaybes cli
+        return $ if length cli == length cli'
+             then Just ((nam, InjectiveFun (fromIntegral i) (fromIntegral total)), concat cli')
+             else Nothing
+
+remAbs :: ClauseBody -> Term
+remAbs b = case b of
+    Body t     -> t
+    Bind ab    -> remAbs $ absBody ab
+    NoBody     -> __IMPOSSIBLE__
+
+isNoBody :: ClauseBody -> Bool
+isNoBody b = case b of
+    Body t     -> False
+    Bind ab    -> isNoBody $ absBody ab
+    NoBody     -> True
+
+patternToTerm :: Nat -> Pattern -> Term
+patternToTerm n p = case p of
+    VarP v          -> Var n []
+    DotP t          -> t
+    ConP c typ args -> Con c $ zipWith (\ arg t -> arg {unArg = t}) args
+                             $ snd
+                             $ foldr (\ arg (n, ts) -> (n + nrBinds arg, patternToTerm n arg : ts))
+                                     (n , [])
+                             $ map unArg args
+    LitP l          -> Lit l
+
+nrBinds :: Num i => Pattern -> i
+nrBinds p = case p of
+    VarP v          -> 1
+    DotP t          -> 0
+    ConP c typ args -> sum $ map (nrBinds . unArg) args
+    LitP l          -> 0
+
+substForDot :: [Arg Pattern] -> Substitution
+substForDot ps = map (flip Var []) (makeSubst 0 0 $ reverse $ calcDots ps)
+  where
+    makeSubst i accum [] = [i + accum ..]
+    makeSubst i accum (True  : ps) = makeSubst i (accum +1) ps
+    makeSubst i accum (False : ps) = i + accum : makeSubst (i+1) accum ps
+
+    calcDots = concatMap calcDots' . map unArg
+    calcDots' p = case p of
+        VarP v          -> [False]
+        DotP t          -> [True]
+        ConP c typ args -> calcDots args
+        LitP l          -> [False]
+
+isInjectiveHere :: QName  -- ^ Name of the function being tested
+                -> Int    -- ^ The current argument
+                -> Clause
+                -> Compile TCM InjConstraints
+isInjectiveHere nam idx Clause {clauseBody = body} | isNoBody body = return emptyC
+isInjectiveHere nam idx clause = do
+    let t    = patternToTerm idxR $ unArg $ clausePats clause !! idx
+        t'   = substs (substForDot $ clausePats clause) t
+        idxR = sum . map (nrBinds . unArg) . genericDrop (idx + 1) $ clausePats clause
+        body = remAbs $ clauseBody clause
+    body' <- lift $ reduce body
+    injFs <- gets (injectiveFuns . importedModules)
+    res <- (t' <: body') (M.insert nam (InjectiveFun (fromIntegral idx)
+                                                     (genericLength (clausePats clause))) injFs)
+    lift $ reportSDoc "epic.injection" 20 $ vcat
+      [ text "isInjective:" <+> text (show nam)
+      , text "at Index   :" <+> text (show idx)
+      , nest 2 $ vcat
+          [ text "clause     :" <+> text (show clause)
+          , text "t          :" <+> prettyTCM t
+          , text "idxR       :" <+> (text . show) idxR
+          , text "body'      :" <+> (text . show) body'
+          ]
+      , text "res      :" <+> text (show res)
+      ]
+    return res
+
+litToCon :: Literal -> TCM Term
+litToCon l = case l of
+    LitInt   r n | n > 0     -> do
+        inner <- litToCon (LitInt r (n - 1))
+        suc   <- primSuc
+        return $ suc `apply` [defaultArg inner]
+                 | otherwise -> primZero
+--    LitLevel _ n -> -- Does not really matter
+    lit          -> return $ Lit lit
+
+litCon :: Literal -> Bool
+litCon (LitInt _ _) = True
+litCon _          = False
+
+insertAt :: (Nat,Term) -> Term -> Term
+insertAt (index, ins) = substs [if i == index then ins else Var i [] | i <- [0 .. ]]
+
+
+solve :: [QName] -> [((QName, InjectiveFun), [(QName,QName)])] -> Compile TCM [(QName, InjectiveFun)]
+solve newNames xs = do
+    -- Only primitive lists should be in the current module at this point,
+    -- but we still want them
+    conGraph <- M.union <$> gets (constrTags . curModule) <*> gets (constrTags . importedModules)
+    (funs, mconstr) <- ($ xs) $ flip foldM ([] , Just $ initialTags conGraph newNames) $ \ (xs , prev) (fun , con) -> do
+         m <- foldM solvable prev con
+         return $ case m of
+            Nothing -> (xs, prev)
+            Just next -> (fun : xs, m)
+    case mconstr of
+        Nothing -> __IMPOSSIBLE__
+        Just constr -> updateTags constr
+    return funs
+  where
+    solvable :: Maybe Tags -> (QName, QName)
+             -> Compile TCM (Maybe Tags)
+    solvable Nothing _          = return Nothing
+    solvable (Just st) (c1, c2) = unify c1 c2 st
+
+    updateTags :: Tags -> Compile TCM ()
+    updateTags tags = do
+        let (hasTags, eqs) = M.partition isTag (constrGroup tags)
+            isTag (IsTag _) = True
+            isTag _         = False
+        forM (M.toList hasTags) $ \ (c, tagged) -> case tagged of
+            IsTag tag -> putCon c tag
+            _         -> __IMPOSSIBLE__
+        case M.toList eqs of
+            (c, Same n) : _ -> do
+                let grp = eqGroups tags !!! n
+                tag <- assignConstrTag' c (S.toList grp)
+                updateTags . fromMaybe __IMPOSSIBLE__ =<< setTag n tag tags { constrGroup = eqs }
+            _              -> return ()
+    putCon :: QName -> Tag -> Compile TCM ()
+    putCon con tag = do
+        m <- gets (constrTags . importedModules)
+        case M.lookup con m of
+            Nothing -> putConstrTag con tag
+            Just _  -> return () -- old
+
+emptyC :: InjConstraints
+emptyC = Just []
+
+addConstraint :: QName -> QName -> InjConstraints -> InjConstraints
+addConstraint q1 q2 Nothing   = Nothing
+addConstraint q1 q2 (Just xs) = Just (if q1 == q2 then xs else (q1,q2) : xs)
+
+unionConstraints :: [InjConstraints] -> InjConstraints
+unionConstraints [] = Just []
+unionConstraints (Nothing : _) = Nothing
+unionConstraints (Just c : cs) = do
+    cs' <- unionConstraints cs
+    return (c ++ cs')
+
+-- | Are two terms injectible?
+--   Precondition: t1 is normalised, t2 is in WHNF
+-- When reducing t2, it may become a literal, which makes this not work in some cases...
+(<:) :: Term -> Term -> (QName :-> InjectiveFun) -> Compile TCM InjConstraints
+(Lit l        <:  t1)          injs | litCon l = do
+    l' <- lift $ litToCon l
+    (l' <: t1) injs
+(t1 <: Lit l)                  injs | litCon l = do
+    l' <- lift $ litToCon l
+    (t1 <: l') injs
+(t1           <: Def n2 args2) injs | Just (InjectiveFun argn arit) <- M.lookup n2 injs =
+    if genericLength args2 /= arit
+        then return Nothing
+        else do
+            arg <- lift $ reduce $ unArg $ args2 !! fromIntegral argn
+            (t1 <: arg) injs
+-- (Var n1 []    <: Var n2 [])    nam idx = return $ if n1 == n2 then emptyC else Nothing
+(Var n1 args1 <: Var n2 args2) injs | n1 == n2 && length args1 == length args2 = do
+    args1' <- map unArg <$> mapM (lift . reduce) args1
+    args2' <- map unArg <$> mapM (lift . reduce) args2
+    unionConstraints <$> zipWithM (\a b -> (a <: b) injs) args1' args2'
+(Def q1 args1 <: Def q2 args2) injs | q1 == q2 && length args1 == length args2 = do
+    args1' <- map unArg <$> mapM (lift . reduce) args1
+    args2' <- map unArg <$> mapM (lift . reduce) args2
+    unionConstraints <$> zipWithM (\a b -> (a <: b) injs) args1' args2'
+(Con c1 args1 <: Con c2 args2) injs = do
+    args1' <- map unArg <$> flip notForced args1 <$> getForcedArgs c1
+    args2' <- map unArg <$> (mapM (lift . reduce) =<< flip notForced args2 <$> getForcedArgs c2)
+    if length args1' == length args2'
+        then addConstraint c1 c2 <$> unionConstraints <$> zipWithM (\a b -> (a <: b) injs) args1' args2'
+        else return Nothing
+(_            <: _) _ = return Nothing
+
+data TagEq
+    = Same Int
+    | IsTag Tag
+  deriving Eq
+
+data Tags = Tags
+    { eqGroups    :: Int :-> Set QName
+    , constrGroup :: QName :-> TagEq
+    }
+
+initialTags :: Map QName Tag -> [QName] -> Tags
+initialTags setTags newNames = Tags
+    { eqGroups    = M.fromList $ zip [0..] (map S.singleton newNames)
+    , constrGroup = M.map IsTag setTags `M.union` M.fromList (zip newNames (map Same [0..]))
+    }
+
+unify :: QName -> QName -> Tags -> Compile TCM (Maybe Tags)
+unify c1 c2 ts = do
+    let g1 = constrGroup ts !!! c1
+        g2 = constrGroup ts !!! c2
+    case (g1, g2) of
+        (Same n1, Same n2)   | n1 == n2 -> return $ Just ts
+        (IsTag t1, IsTag t2) | t1 == t2 -> return $ Just ts
+        (Same n1, Same n2)   -> mergeGroups n1 n2 ts
+        (Same n1, IsTag t2)  -> setTag n1 t2 ts
+        (IsTag t1 , Same n2) -> setTag n2 t1 ts
+        _                    -> return $ Nothing
+
+setTag :: Int -> Tag -> Tags -> Compile TCM (Maybe Tags)
+setTag gid tag ts = return $ Just $ ts
+    { constrGroup = foldr (\c -> M.insert c (IsTag tag)) (constrGroup ts) (S.toList $ eqGroups ts !!! gid)}
+
+mergeGroups :: Int -> Int -> Tags -> Compile TCM (Maybe Tags)
+mergeGroups n1 n2 ts = do
+    let g1s = eqGroups ts !!! n1
+        g2s = eqGroups ts !!! n2
+        gs  = S.union g1s g2s
+    ifM (not . and <$> sequence [unifiable e1 e2 | e1 <- S.toList g1s, e2 <- S.toList g2s])
+        (return Nothing) $
+        return $ Just $ ts
+            { eqGroups    = M.delete n2 $ M.insert n1 gs (eqGroups ts)
+            , constrGroup = M.fromList [(e2, Same n1) | e2 <- S.toList g2s] `M.union` constrGroup ts
+            }
+
+unifiable :: QName -> QName -> Compile TCM Bool
+unifiable c1 c2 = do
+    d1 <- getConData c1
+    d2 <- getConData c2
+    return $ d1 /= d2
+
+(!!!) :: Ord k => k :-> v -> k -> v
+m !!!  k = case M.lookup k m of
+    Nothing -> __IMPOSSIBLE__
+    Just x  -> x
diff --git a/src/full/Agda/Compiler/Epic/Interface.hs b/src/full/Agda/Compiler/Epic/Interface.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Compiler/Epic/Interface.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+-- | Epic interface data structure, which is serialisable and stored for each
+--   compiled file
+module Agda.Compiler.Epic.Interface where
+
+import Control.Monad
+
+import Data.Function
+import qualified Data.Map as M
+import Data.Map(Map)
+import Data.Monoid
+import qualified Data.Set as S
+import Data.Set(Set)
+import Data.Typeable
+
+import Agda.Syntax.Common (Nat)
+import Agda.Syntax.Internal
+
+type Var       = String
+data Tag       = Tag Int
+               | PrimTag Var
+  deriving (Show, Eq, Ord, Typeable)
+
+data Forced = NotForced | Forced
+  deriving (Show, Typeable, Eq)
+
+-- | Filter a list using a list of Bools specifying what to keep.
+pairwiseFilter :: [Bool] -> [a] -> [a]
+pairwiseFilter (True :bs) (a:as) = a : pairwiseFilter bs as
+pairwiseFilter (False:bs) (_:as) = pairwiseFilter bs as
+pairwiseFilter _           _     = []
+
+notForced :: ForcedArgs -> [a] -> [a]
+notForced = pairwiseFilter . map (== NotForced)
+
+forced :: ForcedArgs -> [a] -> [a]
+forced = pairwiseFilter . map (== Forced)
+
+data Relevance
+  = Irr
+  | Rel
+  deriving (Eq, Ord, Show, Typeable)
+
+type ForcedArgs   = [Forced]
+type RelevantArgs = [Relevance]
+
+data InjectiveFun = InjectiveFun
+  { injArg     :: Nat
+  , injArity   :: Nat
+  }
+  deriving (Show, Typeable, Eq)
+
+data EInterface = EInterface
+    { constrTags    :: Map QName Tag
+    , definitions   :: Set Var
+    , defDelayed    :: Map QName Bool
+    , conArity      :: Map QName Int
+    , mainName      :: Maybe QName
+    , relevantArgs  :: Map Var   RelevantArgs
+    , forcedArgs    :: Map QName ForcedArgs
+    , injectiveFuns :: Map QName InjectiveFun
+    } deriving (Typeable, Show)
+
+instance Monoid EInterface where
+  mempty = EInterface
+      { constrTags    = mempty
+      , definitions   = mempty
+      , defDelayed    = mempty
+      , conArity      = mempty
+      , mainName      = Nothing
+      , relevantArgs  = mempty
+      , forcedArgs    = mempty
+      , injectiveFuns = mempty
+      }
+  mappend x y = EInterface
+      { constrTags    = comb constrTags
+      , definitions   = comb definitions
+      , defDelayed    = comb defDelayed
+      , conArity      = comb conArity
+      , mainName      = mainName x `mplus` mainName y
+      , relevantArgs  = comb relevantArgs
+      , forcedArgs    = comb forcedArgs
+      , injectiveFuns = comb injectiveFuns
+      }
+    where
+      comb :: Monoid a => (EInterface -> a) -> a
+      comb f = (mappend `on` f) x y
diff --git a/src/full/Agda/Compiler/Epic/LambdaLift.hs b/src/full/Agda/Compiler/Epic/LambdaLift.hs
deleted file mode 100644
--- a/src/full/Agda/Compiler/Epic/LambdaLift.hs
+++ /dev/null
@@ -1,60 +0,0 @@
--- | Lift lambda expressions to top level definitions (Epic does not support
---   lambdas).
-module Agda.Compiler.Epic.LambdaLift where
-
-import Control.Applicative
-import Control.Monad.Trans
-import Control.Monad.Writer
-import qualified Data.Set as S
-
-import Agda.Compiler.Epic.AuxAST
-import Agda.Compiler.Epic.CompileState
-
-import Agda.TypeChecking.Monad.Base (MonadTCM)
-
--- | LL makes it possible to emit new functions when we encounter a lambda
-type LL = WriterT [Fun]
-
--- | lambda lift all the functions
-lambdaLift :: MonadTCM m => [Fun] -> Compile m [Fun]
-lambdaLift fs = do
-  concat <$> sequence
-    [do (f', lifts) <- runWriterT (lambdaLiftFun f)
-        return $ f' : lifts
-    | f <- fs]
-
--- | λ lift a function, this is in a LL (Writer monad)
-lambdaLiftFun :: MonadTCM m => Fun -> LL (Compile m) Fun
-lambdaLiftFun (Fun i name c vs e) = Fun i name c vs <$> lambdaLiftExpr e
-lambdaLiftFun f@(EpicFun _ _ _)   = return f
-
--- | λ lift an expression, put all the new definitions in the writer monad
-lambdaLiftExpr :: MonadTCM m => Expr -> LL (Compile m) Expr
-lambdaLiftExpr expr = case expr of
-    Var _    -> return expr
-    Lit _    -> return expr
-    e1@(Lam _ _) -> do
-      -- This is the only difficult case, get a group of lambda binders,
-      -- lambda lift the body of it, and create a new supercombinator from
-      -- this.
-      let (vs, e2) = collectLam e1
-      topBinding <- lift topBindings
-      let vs' = filter (`S.notMember` topBinding) $ fv e1
-      e3 <- lambdaLiftExpr e2
-      name <- lift newName
-      tell [Fun True name "lambda" (vs' ++ vs) e3]
-      return $ apps name (map Var vs')
-    Con c n es -> Con c n <$> mapM lambdaLiftExpr es
-    App v es -> App v <$> mapM lambdaLiftExpr es
-    Case e brs -> Case <$> lambdaLiftExpr e
-                       <*> mapM (\br -> do lle <- lambdaLiftExpr $ brExpr br; return br {brExpr = lle}) brs
-    If a b c   -> If <$> lambdaLiftExpr a <*> lambdaLiftExpr b <*> lambdaLiftExpr c
-    Let v e e' -> Let v <$> lambdaLiftExpr e <*> lambdaLiftExpr e'
-    Lazy e     -> Lazy <$> lambdaLiftExpr e
-    UNIT       -> return UNIT
-    IMPOSSIBLE -> return IMPOSSIBLE
-  where
-    -- | Collect all the variables in a group of lambdas
-    collectLam :: Expr -> ([Var], Expr)
-    collectLam (Lam v e) = let (vs, e') = collectLam e in (v:vs, e')
-    collectLam e         = ([], e)
diff --git a/src/full/Agda/Compiler/Epic/NatDetection.hs b/src/full/Agda/Compiler/Epic/NatDetection.hs
--- a/src/full/Agda/Compiler/Epic/NatDetection.hs
+++ b/src/full/Agda/Compiler/Epic/NatDetection.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 -- | Detect if a datatype could be represented as a primitive integer.
 --   If it has one constructor with no arguments and one with a recursive
 --   argument this is true. This is done using IrrFilters which filter out
@@ -14,49 +15,61 @@
 
 import Agda.TypeChecking.Monad
 import Agda.Syntax.Internal
+import Agda.TypeChecking.Substitute
 import Agda.Syntax.Common
 
-import Agda.Compiler.Epic.CompileState hiding (conPars)
+import Agda.Compiler.Epic.CompileState
+import Agda.Compiler.Epic.Interface
 
+#include "../../undefined.h"
+import Agda.Utils.Impossible
+
 -- | Get a list of all the datatypes that look like nats. The [QName] is on the
 --   form [zeroConstr, sucConstr]
-getNatish :: MonadTCM m => Compile m [(IrrFilter,[QName])]
+getNatish :: Compile TCM [(ForcedArgs, [QName])]
 getNatish = do
   sig <- lift (gets (sigDefinitions . stImports))
   let defs = M.toList sig
   fmap catMaybes $ forM defs $ \(q, def) ->
     case theDef def of
-      d@(Datatype {}) -> do -- A datatype ...
-          case dataCons d of
-              constrs | length constrs == 2 -> do -- with two constructors ...
-                  z <- zip constrs <$> mapM getIrrFilter constrs
-                  case sortBy (compare `on` nrRel . snd) z of
-                    [(cz,fz), (cs,fs)] -> do
-                      let ts = defType $ sig M.! cs
-                          nr = fromIntegral $ dataPars d
-                      return $ do
-                       guard (nrRel fz == 0) -- where one constructor has zero arguments ...
-                       guard (nrRel fs == 1) -- and the other one one argument ...
-                       guard (isRec ((fromJust $ elemIndex True fs) + nr) ts q) -- which is recursive.
-                       return (fs, [cz, cs]) -- It's natish!
-                    _ -> return Nothing
-              _       -> return Nothing
+      d@(Datatype {}) -> isNatish q d
+
       _ -> return Nothing
 
+isNatish :: QName -> Defn -> Compile TCM (Maybe (ForcedArgs, [QName]))
+isNatish q d = do -- A datatype ...
+    case dataCons d of
+        constrs | length constrs == 2 -> do -- with two constructors ...
+            b <- and <$> mapM constrInScope constrs
+            if b
+              then do
+                z <- zip constrs <$> mapM getForcedArgs constrs
+                case sortBy (compare `on` nrRel . snd) z of
+                  [(cz,fz), (cs,fs)] -> do
+                    sig <- lift (gets (sigDefinitions . stImports))
+                    let ts = defType $ sig M.! cs
+                        nr = fromIntegral $ dataPars d
+                    return $ do
+                     guard (nrRel fz == 0) -- where one constructor has zero arguments ...
+                     guard (nrRel fs == 1) -- and the other one one argument ...
+                     guard (isRec ((fromMaybe __IMPOSSIBLE__ $ elemIndex NotForced fs) + nr) ts q) -- which is recursive.
+                     return (fs, [cz, cs]) -- It's natish!
+                  _ -> return Nothing
+              else return Nothing
+        _       -> return Nothing
+
 -- | Count the number of relevant arguments
-nrRel :: IrrFilter -> Integer
-nrRel = sum . map (const 1) . filter id
+nrRel :: ForcedArgs -> Integer
+nrRel = sum . map (const 1) . filter (== NotForced)
 
 -- | Check if argument n is recursive
 isRec :: Int -> Type -> QName -> Bool
 isRec 0 (El _ t) dat = case t of
-    Fun arg _ -> argIsDef (unArg arg) dat
     Pi  arg _ -> argIsDef (unArg arg) dat
-    _       -> False
+    _         -> False
 isRec n (El _ t) dat = case t of
-    Pi  _ ab  -> isRec (n - 1) (absBody ab) dat
-    Fun _ typ -> isRec (n - 1) typ           dat
-    _           -> False
+    Pi  _ ab  -> isRec (n - 1) (unAbs ab) dat
+    _         -> False
 
 argIsDef :: Type -> QName -> Bool
 argIsDef (El _ t) dat = case t of
diff --git a/src/full/Agda/Compiler/Epic/Primitive.hs b/src/full/Agda/Compiler/Epic/Primitive.hs
--- a/src/full/Agda/Compiler/Epic/Primitive.hs
+++ b/src/full/Agda/Compiler/Epic/Primitive.hs
@@ -18,6 +18,7 @@
 
 import Agda.Compiler.Epic.AuxAST
 import Agda.Compiler.Epic.CompileState
+import Agda.Compiler.Epic.Interface
 import Agda.Compiler.Epic.NatDetection
 
 #include "../../undefined.h"
@@ -30,87 +31,96 @@
   , translateCase :: Expr -> [Branch] -> Expr
   }
 
+prZero, prSuc, prTrue, prFalse, prPred, prNatEquality :: Var
+prZero  = "primZero"
+prSuc   = "primSuc"
+prTrue  = "primTrue"
+prFalse = "primFalse"
+prPred  = "primPred"
+prNatEquality = "primNatEquality"
+
 -- | Change constructors and cases on builtins and natish datatypes to use
 --   primitive data
-primitivise :: MonadTCM m => [Fun] -> Compile m [Fun]
+primitivise :: [Fun] -> Compile TCM [Fun]
 primitivise funs = do
     ptfs   <- getBuiltins
     natish <- getNatish
-    lists  <- primLists
-    (++ lists) <$> mapM (primFun $ ptfs ++ map (uncurry natPrimTF) natish) funs
+    mapM (primFun $ ptfs ++ map (uncurry natPrimTF) natish) funs
 
--- | Create primitive functions if list constructors are marked as builtins
-primLists :: MonadTCM m => Compile m [Fun]
-primLists = do
-    mnil  <- lift $ getBuiltin' builtinNil
-    mcons <- lift $ getBuiltin' builtinCons
-    case (mnil, mcons) of
-      (Just (T.Con nil []), Just (T.Con cons [])) -> do
-          [nilT, consT] <- mapM getConstrTag [nil, cons]
-          let fun s n = Fun
-                   { funInline  = True
-                   , funName    = "prim" ++ s
-                   , funComment = "BUILTIN " ++ s
-                   , funArgs    = []
-                   , funExpr    = Var (unqname n)
-                   }
-          return [ fun "Nil" nil
-                 , fun "Cons" cons
-                 , Fun
-                    { funInline  = False
-                    , funName    = "primListElim"
-                    , funComment = "Eliminator for Lists"
-                    , funArgs    = ["op" , "z" , "xs"]
-                    , funExpr    = Case (Var "xs")
-                        [ Branch nilT nil [] $ Var "z"
-                        , Branch consT cons ["y", "ys"] $
-                            App "op" [ Var "y"
-                                     , App "primListElim" [ Var "op"
-                                                          , Var "z"
-                                                          , Var "ys"
-                                                          ]
-                                     ]
-                        ]
-                    }
-                 ]
-      _                     -> return []
+-- | Map primitive constructors to primitive tags
+initialPrims :: Compile TCM () -- [Fun]
+initialPrims = do
+  -- TODO: Natishness is calculated here and could be stored so it does not have
+  --       to be recalculated in primitivise
+  natish <- getNatish
+  -- This has to be done because injection detection may otherwise flag injections
+  -- between non-primitive and primitive datatypes in the wrong way
+  sequence_ [zipWithM_ putConstrTag [zc, sc] (prim [prZero, prSuc])
+            | (_, [zc, sc]) <- natish]
+  sequence_
+    [ [builtinNil, builtinCons]           ~> tags [0, 1]
+    , [builtinZero, builtinSuc  ]         ~> prim [prZero, prSuc]
+    , [builtinLevelZero, builtinLevelSuc] ~> prim [prZero, prSuc]
+    , [builtinTrue, builtinFalse]         ~> prim [prTrue, prFalse]
+    , [builtinRefl]                       ~> tags [0]
+    ]
+  where
+    prim = map PrimTag
+    tags = map Tag
+    constrs ~> tags = do
+        builtins  <- lift $ mapM getBuiltin' constrs
+        if all isJust builtins
+           then do
+                let names = map (defName . fromMaybe __IMPOSSIBLE__) builtins
+                -- b <- and <$>  mapM constrInScope names
+                -- if b then return $ Just (transf names) else return Nothing
+                zipWithM_ putConstrTag names tags
+           else return ()
+
 -- | Build transforms using the names of builtins
-getBuiltins :: MonadTCM m => Compile m [PrimTransform]
+getBuiltins :: Compile TCM [PrimTransform]
 getBuiltins =
     catMaybes <$> sequence
-      [ [builtinZero, builtinSuc  ]         ~> natPrimTF [True]
-       -- ? is this ok to have [True]
-      , [builtinLevelZero, builtinLevelSuc] ~> natPrimTF [True]
+      [ [builtinZero, builtinSuc  ]         ~> natPrimTF [NotForced]
+       -- ? is this ok to have [NotForced]
+      , [builtinLevelZero, builtinLevelSuc] ~> natPrimTF [NotForced]
       , [builtinTrue, builtinFalse]         ~> boolPrimTF
       ]
   where
     constrs ~> transf = do
-        builtins <- lift $ mapM getBuiltin' constrs
+        builtins  <- lift $ mapM getBuiltin' constrs
         if all isJust builtins
-           then return $ Just (transf (map (defName . fromMaybe __IMPOSSIBLE__) builtins))
+           then do
+                let names = map (defName . fromMaybe __IMPOSSIBLE__) builtins
+                b <- and <$>  mapM constrInScope names
+                if b then return $ Just (transf names) else return Nothing
            else return Nothing
-    defName (T.Def q []) = q
-    defName (T.Con q []) = q
-    defName _            = __IMPOSSIBLE__
 
+defName (T.Def q []) = q
+defName (T.Con q []) = q
+defName _            = __IMPOSSIBLE__
+
+head'' (x:xs) e = x
+head'' _      e = e
+
 -- | Translation to primitive integer functions
-natPrimTF :: IrrFilter -> [QName] -> PrimTransform
+natPrimTF :: ForcedArgs -> [QName] -> PrimTransform
 natPrimTF filt [zero, suc] = PrimTF
-  { mapCon = M.fromList [(zero, "primZero"), (suc, "primSuc")]
+  { mapCon = M.fromList [(zero, prZero), (suc, prSuc)]
   , translateCase = \ce brs -> case brs of
         -- Assuming only the first two branches are relevant when casing on Nats
-        (Branch _ n vs e:Branch _ _n' vs' e':_) ->
+        (Branch _ n vs e:Branch _ _n' vs'' e'':_) ->
             if n == zero
-               then primNatCaseZS ce e  (head (pairwiseFilter filt vs')) e'
-               else primNatCaseZS ce e' (head (pairwiseFilter filt vs )) e
-        (Branch _ n vs e:Default e':_) ->
+               then primNatCaseZS ce e  (head'' vs'' __IMPOSSIBLE__) e''
+               else primNatCaseZS ce e'' (head'' vs __IMPOSSIBLE__) e
+        (Branch _ n vs e:Default e'':_) ->
             if n == zero
-               then primNatCaseZD ce e e' -- zero
-               else primNatCaseZS ce e' (head (pairwiseFilter filt vs )) e -- suc
+               then primNatCaseZD ce e e'' -- zero
+               else primNatCaseZS ce e'' (head'' vs __IMPOSSIBLE__) e -- suc
         [ Branch _ n vs e ] ->
             if n == zero
               then e
-              else Let (head (pairwiseFilter filt vs)) (App "primPred" [ce]) e
+              else lett (head'' vs __IMPOSSIBLE__) (App prPred [ce]) e
         _ -> __IMPOSSIBLE__
   }
 natPrimTF _ _ = __IMPOSSIBLE__
@@ -122,19 +132,19 @@
               -> Expr -- ^ Expression used for suc branch
               -> Expr -- ^ Result?
 primNatCaseZS n zeroBr v sucBr =
-    If (App "primNatEquality" [n, Var "primZero"]) zeroBr (Let v (App "primPred" [n]) sucBr)
+    If (App prNatEquality [n, Var prZero]) zeroBr (lett v (App prPred [n]) sucBr)
 
 -- | Corresponds to a case with a zero and default branch
 primNatCaseZD :: Expr -- ^ Expression that is cased on
               -> Expr -- ^ Zero branch
               -> Expr -- ^ Default branch
               -> Expr -- ^ Result?
-primNatCaseZD n zeroBr defBr = If (App "primNatEquality" [n, Var "primZero"]) zeroBr defBr
+primNatCaseZD n zeroBr defBr = If (App prNatEquality [n, Var prZero]) zeroBr defBr
 
 -- | Translation to primitive bool functions
 boolPrimTF :: [QName] -> PrimTransform
 boolPrimTF [true, false] = PrimTF
-  { mapCon = M.fromList [(true, "primTrue"), (false, "primFalse")]
+  { mapCon = M.fromList [(true, prTrue), (false, prFalse)]
   , translateCase = \ce brs ->
     case brs of
         (Branch _ n _vs e:b':_) ->
@@ -146,22 +156,22 @@
 boolPrimTF _ = __IMPOSSIBLE__
 
 -- | Change all the primitives in the function using the PrimTransform
-primFun :: MonadTCM m => [PrimTransform] -> Fun -> Compile m Fun
-primFun ptfs (Fun i n c args e) =
-    Fun i n c args <$> primExpr ptfs e
+primFun :: [PrimTransform] -> Fun -> Compile TCM Fun
+primFun ptfs (Fun i n qn c args e) =
+    Fun i n qn c args <$> primExpr ptfs e
 primFun _ e@(EpicFun {}) = return e
 
 
 -- | Change all the primitives in an expression using PrimTransform
-primExpr :: MonadTCM m => [PrimTransform] -> Expr -> Compile m Expr
+primExpr :: [PrimTransform] -> Expr -> Compile TCM Expr
 primExpr prim ex = case ex of
     Var{}    -> return ex
     Lit{}    -> return ex
     Lam v e1 -> Lam v <$> primExpr prim e1
     Con c n es -> case testCon prim n of
         Just pn -> do
-            filt <- getIrrFilter n
-            apps pn <$> mapM (primExpr prim) (pairwiseFilter filt es)
+            filt <- getForcedArgs n
+            apps pn <$> mapM (primExpr prim) es
         Nothing -> Con c n <$> mapM (primExpr prim) es
     App v es   -> App v <$> mapM (primExpr prim) es
     Case e brs -> case testBranch prim brs of
@@ -195,7 +205,7 @@
         Default _       -> Nothing
 
     -- | Change all primitives in a branch
-    primBranch :: MonadTCM m => Branch -> Compile m Branch
+    primBranch :: Branch -> Compile TCM Branch
     primBranch br = do
         e' <- primExpr prim (brExpr br)
         return br {brExpr = e'}
diff --git a/src/full/Agda/Compiler/Epic/Smashing.hs b/src/full/Agda/Compiler/Epic/Smashing.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Compiler/Epic/Smashing.hs
@@ -0,0 +1,135 @@
+{-# LANGUAGE CPP #-}
+-- | Smash functions which return something that can be inferred
+--   (something of a type with only one element)
+
+module Agda.Compiler.Epic.Smashing where
+
+import Control.Arrow((&&&))
+import Control.Monad
+import Control.Monad.State
+import Control.Monad.Trans
+
+import Data.List
+import qualified Data.Map as M
+import Data.Map (Map)
+import Data.Maybe
+
+import qualified Data.Set as S
+import Data.Set (Set)
+
+import Agda.Syntax.Common
+import Agda.Syntax.Internal as SI
+import Agda.TypeChecking.Monad
+import Agda.TypeChecking.Substitute
+import Agda.TypeChecking.Telescope
+import Agda.TypeChecking.Pretty
+import Agda.TypeChecking.Reduce
+import Agda.TypeChecking.Rules.LHS.Unify
+
+import Agda.Compiler.Epic.AuxAST as AA
+import Agda.Compiler.Epic.CompileState
+import Agda.Compiler.Epic.Interface
+
+import Agda.Utils.Monad
+import Agda.Utils.Size
+
+#include "../../undefined.h"
+import Agda.Utils.Impossible
+
+defnPars :: Integral n => Defn -> n
+defnPars (Record      {recPars = p}) = fromIntegral p
+defnPars (Constructor {conPars = p}) = fromIntegral p
+defnPars d                           = 0
+
+-- | Main function, smash as much as possible
+smash'em :: [Fun] -> Compile TCM [Fun]
+smash'em funs = do
+    defs <- lift (gets (sigDefinitions . stImports))
+    funs' <- forM funs $ \f -> case f of
+      AA.Fun{} -> case funQName f >>= flip M.lookup defs of
+          Nothing -> do
+              lift $ reportSDoc "epic.smashing" 10 $ vcat
+                [ (text . show) f <+> text " was not found"]
+              return f
+
+          Just def -> do
+              lift $ reportSLn "epic.smashing" 10 $ "running on:" ++ (show (funQName f))
+              minfered <- smashable (length (funArgs f) + defnPars (theDef def)) (defType def)
+              case minfered of
+                  Just infered -> do
+                      lift $ reportSDoc "smashing" 5 $ vcat
+                        [ prettyTCM (defName def) <+> text "is smashable"]
+                      return f { funExpr = infered
+                               , funInline = True
+                               , funComment = funComment f ++ " [SMASHED]"
+                               }
+                  Nothing -> return f
+      _ -> do
+        lift $ reportSLn "epic.smashing" 10 $ "smashing!"
+        return f
+    return funs'
+
+(+++) :: Telescope -> Telescope -> Telescope
+xs +++ ys = unflattenTel names $ map (raise (size ys)) (flattenTel xs) ++ flattenTel ys
+  where names = teleNames xs ++ teleNames ys
+
+-- | Can a datatype be inferred? If so, return the only possible value.
+inferable :: Set QName -> QName -> [Arg Term] ->  Compile TCM (Maybe Expr)
+inferable visited dat args | dat `S.member` visited = return Nothing
+inferable visited dat args = do
+  lift $ reportSLn "epic.smashing" 10 $ "  inferring:" ++ (show dat)
+  defs <- lift (gets (sigDefinitions . stImports))
+  let def = fromMaybe __IMPOSSIBLE__ $ M.lookup dat defs
+  case theDef def of
+      d@Datatype{} -> do
+          case dataCons d of
+            [c] -> inferableArgs c (dataPars d)
+            _   -> return Nothing
+      r@Record{}   -> inferableArgs (recCon r) (recPars r)
+      f@Function{} -> do
+        term <- lift $ normalise $ Def dat args
+        inferableTerm visited' term
+      d -> do
+        lift $ reportSLn "epic.smashing" 10 $ "  failed (inferable): " ++ (show d)
+        return Nothing
+  where
+    inferableArgs c pars = do
+        defs <- lift (gets (sigDefinitions . stImports))
+        let def = fromMaybe __IMPOSSIBLE__ $ M.lookup c defs
+        forc <- getForcedArgs c
+        TelV tel _ <- lift $ telView (defType def `apply` genericTake pars args)
+        tag <- getConstrTag c
+        lift $ reportSDoc "epic.smashing" 10 $ nest 2 $ vcat
+          [ text "inferableArgs!"
+          , text "tele" <+> prettyTCM tel
+          , text "constr:" <+> prettyTCM c
+          ]
+        (AA.Con tag c <$>) <$> sequence <$> forM (notForced forc $ flattenTel tel) (inferableTerm visited' . unEl . unArg)
+    visited' = S.insert dat visited
+
+inferableTerm visited t = case t of
+    Def q as     -> inferable visited q as
+    Pi _   b    -> (AA.Lam "_" <$>) <$> inferableTerm visited (unEl $ unAbs b)
+    Sort {}     -> return . return $ AA.UNIT
+    t           -> do
+      lift $ reportSLn "epic.smashing" 10 $ "  failed to infer: " ++ show t
+      return Nothing
+
+-- | Find the only possible value for a certain type. If we fail return Nothing
+smashable :: Int -> Type -> Compile TCM (Maybe Expr)
+smashable origArity typ = do
+    defs <- lift (gets (sigDefinitions . stImports))
+    TelV tele retType <- lift $ telView typ
+    retType' <- return retType -- lift $ reduce retType
+
+    inf <- inferableTerm S.empty (unEl retType')
+    lift $ reportSDoc "epic.smashing" 10 $ nest 2 $ vcat
+      [ text "Result is"
+      , text "inf: " <+> (text . show) inf
+      , text "type: " <+> prettyTCM retType'
+      ]
+    return $ buildLambda (size tele - origArity) <$> inf
+
+buildLambda :: (Ord n, Num n) => n -> Expr -> Expr
+buildLambda n e | n <= 0    = e
+buildLambda n e | otherwise = AA.Lam "_" (buildLambda (n - 1) e)
diff --git a/src/full/Agda/Compiler/Epic/Static.hs b/src/full/Agda/Compiler/Epic/Static.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Compiler/Epic/Static.hs
@@ -0,0 +1,101 @@
+-- | Find the places where the builtin static is used and do some normalisation
+--   there.
+
+{-# LANGUAGE CPP #-}
+
+module Agda.Compiler.Epic.Static where
+
+import Control.Applicative
+import Control.Monad
+import Control.Monad.State
+import Control.Monad.Trans
+
+import qualified Data.Map as M
+
+import Agda.Syntax.Common
+import Agda.Syntax.Internal
+
+import Agda.TypeChecking.CompiledClause
+import Agda.TypeChecking.Monad.Base
+import Agda.TypeChecking.Monad.Builtin
+import Agda.TypeChecking.Monad.Options
+import Agda.TypeChecking.Reduce
+import Agda.TypeChecking.Substitute
+import Agda.TypeChecking.Pretty
+
+import Agda.Utils.Monad
+
+import Agda.Compiler.Epic.CompileState
+
+#include "../../undefined.h"
+import Agda.Utils.Impossible
+
+normaliseStatic :: CompiledClauses -> Compile TCM CompiledClauses
+normaliseStatic = evaluateCC
+
+evaluateCC :: CompiledClauses -> Compile TCM CompiledClauses
+evaluateCC ccs = case ccs of
+    Case n brs -> do
+        cbrs <- forM (M.toList $ conBranches brs) $ \(c, cc) -> (,) c <$> evaluateCC cc
+        lbrs <- forM (M.toList $ litBranches brs) $ \(l, cc) -> (,) l <$> evaluateCC cc
+        cab <- case catchAllBranch brs of
+            Nothing -> return Nothing
+            Just cc -> Just <$> evaluateCC cc
+        return $ Case n Branches
+            { conBranches    = M.fromList cbrs
+            , litBranches    = M.fromList lbrs
+            , catchAllBranch = cab
+            }
+    Done n t   -> Done n <$> evaluateTerm t
+    Fail       -> return Fail
+
+etaExpand :: Term -> Compile TCM Term
+etaExpand def@(Def n ts) = do
+    defs <- lift (gets (sigDefinitions . stImports))
+    let f   = maybe __IMPOSSIBLE__ theDef (M.lookup n defs)
+        len = length . clausePats . head .  funClauses $ f
+        toEta :: Num a => a
+        toEta = fromIntegral $ len - length ts
+        term  = raise toEta def `apply` [ defaultArg $ Var i [] | i <- [toEta - 1, toEta - 2 .. 0]]
+    return $ foldr (\ v t -> Lam NotHidden (Abs v t)) term $ replicate toEta "staticVar"
+etaExpand x = return x
+
+evaluateTerm :: Term -> Compile TCM Term
+evaluateTerm term = case term of
+    Var x as     -> Var x <$>  evaluateTerms as
+    Lam h ab     -> do
+      ab' <- evaluateTerm (unAbs ab)
+      return $ Lam h $ Abs (absName ab) ab'
+    Lit l        -> return $ Lit l
+    Def n ts -> do
+        ifM (not <$> isStatic n)
+            (Def n <$> evaluateTerms ts) $ do
+                feta <- return term -- etaExpand term
+                f <- lift $ normalise feta
+                lift $ reportSDoc "epic.static" 10 $ vcat
+                  [ text "STATIC pragma fired"
+                  , nest 2 $ vcat
+                    [ text "before :" <+> prettyTCM term
+                    , text "after  :" <+> prettyTCM f
+                    ]
+                  ]
+                return f
+    Con c args   -> Con c <$> evaluateTerms args
+    Pi  arg abs  -> return $ Pi  arg abs
+    Sort s       -> return $ Sort s
+    MetaV i args -> return $ MetaV i args
+    Level l      -> return $ Level l
+    DontCare i   -> return $ DontCare i
+  where
+    evaluateTerms :: Args -> Compile TCM Args
+    evaluateTerms as = forM as $ \x -> do
+      y <- evaluateTerm (unArg x)
+      return x { unArg = y }
+
+    isStatic :: QName -> Compile TCM Bool
+    isStatic q = do
+      defs <- lift (gets (sigDefinitions . stImports))
+      return $ case fmap theDef $ M.lookup q defs of
+          Nothing -> False
+          Just (f@Function{}) -> funStatic f
+          Just _              -> False
diff --git a/src/full/Agda/Compiler/HaskellTypes.hs b/src/full/Agda/Compiler/HaskellTypes.hs
--- a/src/full/Agda/Compiler/HaskellTypes.hs
+++ b/src/full/Agda/Compiler/HaskellTypes.hs
@@ -33,6 +33,9 @@
 hsFun :: HaskellKind -> HaskellKind -> HaskellKind
 hsFun a b = "(" ++ a ++ " -> " ++ b ++ ")"
 
+hsUnit :: HaskellType
+hsUnit = "()"
+
 hsVar :: Name -> HaskellType
 hsVar x = "x" ++ concatMap encode (show x)
   where
@@ -50,40 +53,44 @@
 hsForall :: String -> HaskellType -> HaskellType
 hsForall x a = "(forall " ++ x ++ ". " ++ a ++ ")"
 
-notAHaskellKind :: MonadTCM tcm => Type -> tcm a
+notAHaskellKind :: Type -> TCM a
 notAHaskellKind a = do
   err <- fsep $ pwords "The type" ++ [prettyTCM a] ++
                 pwords "cannot be translated to a Haskell kind."
   typeError $ GenericError $ show err
 
-notAHaskellType :: MonadTCM tcm => Type -> tcm a
+notAHaskellType :: Type -> TCM a
 notAHaskellType a = do
   err <- fsep $ pwords "The type" ++ [prettyTCM a] ++
                 pwords "cannot be translated to a Haskell type."
   typeError $ GenericError $ show err
 
-getHsType :: MonadTCM tcm => QName -> tcm HaskellType
+getHsType :: QName -> TCM HaskellType
 getHsType x = do
-  d <- theDef <$> getConstInfo x
+  d <- compiledHaskell . defCompiledRep <$> getConstInfo x
   case d of
-    Axiom{ axHsDef = Just (HsType t) } -> return t
-    Datatype{ dataHsType = Just t }    -> return t
-    _                                  -> notAHaskellType (El Prop $ Def x [])
+    Just (HsType t)   -> return t
+    Just (HsDefn t c) -> return hsUnit
+    _                 -> notAHaskellType (El Prop $ Def x [])
 
-getHsVar :: MonadTCM tcm => Nat -> tcm HaskellCode
+getHsVar :: Nat -> TCM HaskellCode
 getHsVar i = hsVar <$> nameOfBV i
 
 isHaskellKind :: Type -> TCM Bool
 isHaskellKind a =
   (const True <$> haskellKind a) `catchError` \_ -> return False
 
-haskellKind :: MonadTCM tcm => Type -> tcm HaskellKind
+haskellKind :: Type -> TCM HaskellKind
 haskellKind a = do
   a <- reduce a
   case unEl a of
     Sort _  -> return hsStar
     Pi a b  -> hsKFun <$> haskellKind (unArg a) <*> underAbstraction a b haskellKind
-    Fun a b -> hsKFun <$> haskellKind (unArg a) <*> haskellKind b
+    Def d _ -> do
+      d <- compiledHaskell . defCompiledRep <$> getConstInfo d
+      case d of
+        Just (HsType t) -> return hsStar
+        _               -> notAHaskellKind a
     _       -> notAHaskellKind a
 
 -- | Note that @Inf a b@, where @Inf@ is the INFINITY builtin, is
@@ -93,13 +100,14 @@
 -- Note that if @haskellType@ supported universe polymorphism then the
 -- special treatment of INFINITY might not be needed.
 
-haskellType :: MonadTCM tcm => Type -> tcm HaskellType
+haskellType :: Type -> TCM HaskellType
 haskellType = liftTCM . fromType
   where
     fromArgs = mapM (fromTerm . unArg)
     fromType = fromTerm . unEl
     fromTerm v = do
       v   <- reduce v
+      reportSLn "compile.haskell.type" 50 $ "toHaskellType " ++ show v
       kit <- liftTCM coinductionKit
       let err = notAHaskellType (El Prop v)
       case v of
@@ -109,21 +117,16 @@
             [a, b] -> fromTerm (unArg b)
             _      -> err
         Def d args -> hsApp <$> getHsType d <*> fromArgs args
-        Fun a b    -> hsFun <$> fromType (unArg a) <*> fromType b
         Pi a b ->
-          ifM (isHaskellKind $ unArg a)
-          (underAbstraction a b $ \b -> do
-              x <- getHsVar 0
-              b <- fromType b
-              return $ hsForall x $ hsFun "()" b
-          )
-          (if 0 `freeIn` absBody b
-           then err
-           else hsFun <$> fromType (unArg a) <*> fromType (absApp b __IMPOSSIBLE__)
-          )
-        Con{}      -> err
+          if isBinderUsed b
+          then underAbstraction a b $ \b ->
+            hsForall <$> getHsVar 0 <*>
+              (hsFun <$> fromType (unArg a) <*> fromType b)
+          else hsFun <$> fromType (unArg a) <*> fromType (absApp b __IMPOSSIBLE__)
+        Con c args -> hsApp <$> getHsType c <*> fromArgs args
         Lam{}      -> err
-        Lit{}      -> err
-        Sort{}     -> err
+        Level{}    -> return hsUnit
+        Lit{}      -> return hsUnit
+        Sort{}     -> return hsUnit
         MetaV{}    -> err
-        DontCare   -> err
+        DontCare{} -> err
diff --git a/src/full/Agda/Compiler/JS/Case.hs b/src/full/Agda/Compiler/JS/Case.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Compiler/JS/Case.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE CPP #-}
+
+module Agda.Compiler.JS.Case where
+
+import Prelude hiding ( null )
+import Data.Map ( Map, empty, null, mapWithKey, fromListWith, unionWith )
+import Data.List ( genericLength, genericTake, intercalate )
+
+import Agda.Syntax.Common ( Nat )
+import Agda.Utils.Impossible ( Impossible(Impossible), throwImpossible )
+
+import Agda.Compiler.JS.Pretty ( Pretty, pretty, pretties )
+import Agda.Compiler.JS.Syntax
+  ( Exp(Undefined,Local,Lambda,Object,Apply,Lookup),
+    LocalId(LocalId), MemberId )
+import Agda.Compiler.JS.Substitution ( shiftFrom )
+
+#include "../../undefined.h"
+
+-- ECMAScript doesn't support pattern-mathching case, so
+-- we translate to a visitor pattern.  We use a decision-tree
+-- translation, as that seems to fit visitor objects better.
+
+data Case = Case { pats :: [Patt], body :: Exp }
+  deriving (Show)
+
+instance Pretty Case where
+  pretty n i (Case ps e) =
+    intercalate " " (pretties n i ps) ++ " -> " ++ pretty (n + numVars ps) i e
+
+-- Not handling literal patterns yet
+-- Note that all patterns introduce binders, in depth-first prefix order,
+-- for example Tagged l [ VarPatt , VarPatt ] should be thought
+-- of as "x2 @ l (x1, x0)".
+
+data Patt =
+  VarPatt |
+  Tagged Tag [Patt]
+  deriving (Show)
+
+instance Pretty Patt where
+  pretty n i VarPatt = "x"
+  pretty n i (Tagged (Tag l _ _) ps) =
+    "(" ++ intercalate " " (pretty n i l : pretties n i ps) ++ ")"
+
+-- With each tag, we record its name, and the names of the
+-- other constructors of the datatype (e.g. we'd represent
+-- zero as Tag "zero" ["suc","zero"]).  We also record the
+-- the function which accepts a visitor (by default Apply,
+-- but can be over-ridden by the FFI).
+
+data Tag = Tag MemberId [MemberId] (Exp -> [Exp] ->  Exp)
+
+instance Show Tag where
+  show (Tag i is _) = show i
+
+-- Number of bound variables in a pattern
+
+numVars :: [Patt] -> Nat
+numVars = sum . map numVars'
+
+numVars' :: Patt -> Nat
+numVars' (VarPatt)     = 1
+numVars' (Tagged l ps) = 1 + numVars ps
+
+-- Compile a case statement to a function
+-- in lambda n cs, n is the number of parameters
+
+lambda :: [Case] -> Exp
+lambda []     = Undefined
+lambda (c:cs) = lambda' 0 0 (genericLength (pats c)) (c:cs)
+
+-- In lambda' l m n cs,
+-- l is the number of free variables,
+-- m is the number of already read parameters, with m <= l, and
+-- n is the number of unread parameters.
+-- Each case should be of the form (Case ps e) where ps has length m+n.
+-- e can have (l - m + #bv ps) variables free.
+-- lambda' l m n cs can have l variables free.
+
+lambda' :: Nat -> Nat -> Nat -> [Case] -> Exp
+lambda' l m n []       = Undefined
+lambda' l 0 0 (c : cs) = body c
+lambda' l 0 n cs       = Lambda 1 (lambda' (l+1) 1 (n-1) cs)
+lambda' l m n cs       =
+  case null ts of
+    True -> lambda' l (m-1) n (map pop cs)
+    False -> visit cs (Local (LocalId (m-1))) [Object (mapWithKey (match l (m-1) n cs) ts)]
+  where
+    ts = tags cs
+
+-- Pop cases
+
+pop :: Case -> Case
+pop (Case (VarPatt : ps) e) = (Case ps e)
+pop _                       = __IMPOSSIBLE__
+
+-- Cases which match a given tag/arity
+
+match :: Nat -> Nat -> Nat -> [Case] -> MemberId -> Nat -> Exp
+match l m n cs t x = Lambda x (lambda' (l + x) (m + x) n (concat (map (refine t x) cs)))
+
+-- Refine a case statement by a given tag/arity
+
+refine :: MemberId -> Nat -> Case -> [Case]
+refine t x (Case (VarPatt : qs) e) =
+  [Case (genericTake x (repeat VarPatt) ++ qs) (shiftFrom (numVars qs) x e)]
+refine t x (Case (Tagged (Tag u _ _) ps : qs) e) | t == u =
+  [Case (ps ++ qs) e]
+refine _ _ _ = []
+
+-- Extract the visit function
+
+visit :: [Case] -> Exp -> [Exp] -> Exp
+visit (Case (Tagged (Tag _ _ v) _ : _) _ : _ ) = v
+visit (Case (VarPatt              : _) _ : cs) = visit cs
+visit _                                        = Apply
+
+-- Extract the list of possible tags, and their arity.
+
+tags :: [Case] -> Map MemberId Nat
+tags = foldl (unionWith max) empty . map tag
+
+tag :: Case -> Map MemberId Nat
+tag (Case (Tagged (Tag t us _) ps : qs) e) =
+  fromListWith max ((t, genericLength ps) : [ (u, 0) | u <- us ])
+tag _ = empty
diff --git a/src/full/Agda/Compiler/JS/Compiler.hs b/src/full/Agda/Compiler/JS/Compiler.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Compiler/JS/Compiler.hs
@@ -0,0 +1,448 @@
+{-# LANGUAGE CPP #-}
+
+module Agda.Compiler.JS.Compiler where
+
+import Prelude hiding ( null, writeFile )
+import Control.Monad.Reader ( liftIO )
+import Control.Monad.State ( get, put )
+import Data.List ( intercalate, map, filter, isPrefixOf, concat, genericDrop, genericLength )
+import Data.Set ( Set, empty, null, insert, difference, delete )
+import Data.Map ( Map, fold, singleton, fromList, toList, toAscList, insertWith, elems )
+import System.Directory ( createDirectoryIfMissing )
+import System.FilePath ( pathSeparator, splitFileName, (</>) )
+
+import Agda.Interaction.FindFile ( findFile, findInterfaceFile )
+import Agda.Interaction.Imports ( isNewerThan )
+import Agda.Interaction.Options ( optCompileDir )
+import Agda.Syntax.Common ( Nat, Arg, unArg )
+import Agda.Syntax.Concrete.Name ( projectRoot )
+import Agda.Syntax.Abstract.Name
+  ( ModuleName(MName), QName(QName),
+    mnameToList, qnameName, qnameModule, isInModule, nameId )
+import Agda.Syntax.Internal
+  ( Name, Args, Type,
+    Clause(Clause), Pattern(VarP,DotP,LitP,ConP), Abs(Abs),
+    ClauseBody(Body,NoBody,Bind),
+    Term(Var,Lam,Lit,Level,Def,Con,Pi,Sort,MetaV,DontCare),
+    toTopLevelModuleName, clausePats, clauseBody, arity, unEl, unAbs )
+import Agda.TypeChecking.Substitute ( absBody )
+import Agda.Syntax.Literal ( Literal(LitInt,LitFloat,LitString,LitChar,LitQName) )
+import Agda.TypeChecking.Level ( reallyUnLevelView )
+import Agda.TypeChecking.Monad
+  ( TCM, Definition(Defn), Definitions, Interface,
+    JSCode, Defn(Record,Datatype,Constructor,Primitive,Function,Axiom),
+    iModuleName, iImportedModules, theDef, getConstInfo, typeOfConst,
+    ignoreAbstractMode, miInterface, getVisitedModules,
+    defName, defType, funClauses, funProjection,
+    dataPars, dataIxs, dataClause, dataCons,
+    conPars, conData, conSrcCon,
+    recClause, recCon, recFields, recPars, recNamedCon,
+    primClauses, defJSDef )
+import Agda.TypeChecking.Monad.Options ( setCommandLineOptions, commandLineOptions, reportSLn )
+import Agda.TypeChecking.Reduce ( instantiateFull, normalise )
+import Agda.Utils.FileName ( filePath )
+import Agda.Utils.Function ( iterate' )
+import Agda.Utils.Monad ( (<$>), (<*>), bracket, ifM )
+import Agda.Utils.IO.UTF8 ( writeFile )
+import Agda.Utils.Impossible ( Impossible(Impossible), throwImpossible )
+import Agda.Compiler.MAlonzo.Misc ( curDefs, curIF, curMName, setInterface )
+import Agda.Compiler.MAlonzo.Primitives ( repl )
+
+import Agda.Compiler.JS.Syntax
+  ( Exp(Self,Local,Global,Undefined,String,Char,Integer,Double,Lambda,Object,Apply,Lookup),
+    LocalId(LocalId), GlobalId(GlobalId), MemberId(MemberId), Export(Export), Module(Module),
+    modName, expName, uses )
+import Agda.Compiler.JS.Substitution
+  ( curriedLambda, curriedApply, fix, emp, object, subst, apply )
+import Agda.Compiler.JS.Case ( Tag(Tag), Case(Case), Patt(VarPatt,Tagged), lambda )
+import Agda.Compiler.JS.Pretty ( pretty )
+
+#include "../../undefined.h"
+
+--------------------------------------------------
+-- Entry point into the compiler
+--------------------------------------------------
+
+compilerMain :: Interface -> TCM ()
+compilerMain mainI =
+  -- Preserve the state (the compiler modifies the state).
+  bracket get put $ \_ -> do
+
+    -- Compute the output directory.
+    opts <- commandLineOptions
+    compileDir <- case optCompileDir opts of
+      Just dir -> return dir
+      Nothing  -> do
+        -- The default output directory is the project root.
+        let tm = toTopLevelModuleName $ iModuleName mainI
+        f <- findFile tm
+        return $ filePath $ projectRoot f tm
+    setCommandLineOptions $
+      opts { optCompileDir = Just compileDir }
+
+    ignoreAbstractMode $ do
+      mapM_ (compile . miInterface) =<< (elems <$> getVisitedModules)
+
+compile :: Interface -> TCM ()
+compile i = do
+  setInterface i
+  ifM uptodate noComp $ (yesComp >>) $ do
+    writeModule =<< curModule
+  where
+  uptodate = liftIO =<< (isNewerThan <$> outFile_ <*> ifile)
+  ifile    = maybe __IMPOSSIBLE__ filePath <$>
+               (findInterfaceFile . toTopLevelModuleName =<< curMName)
+  noComp   = reportSLn "" 1 . (++ " : no compilation is needed.").show =<< curMName
+  yesComp  = reportSLn "" 1 . (`repl` "Compiling <<0>> in <<1>> to <<2>>") =<<
+             sequence [show <$> curMName, ifile, outFile_] :: TCM ()
+
+--------------------------------------------------
+-- Naming
+--------------------------------------------------
+
+prefix  = "jAgda"
+
+jsMod :: ModuleName -> GlobalId
+jsMod m = GlobalId (prefix : map show (mnameToList m))
+
+jsFileName :: GlobalId -> String
+jsFileName (GlobalId ms) = intercalate "." ms ++ ".js"
+
+jsMember :: Name -> MemberId
+jsMember n =
+  -- Anonymous fields are used for where clauses,
+  -- and they're all given the concrete name "_",
+  -- so we disambiguate them using their name id.
+  case show n of
+    "_" -> MemberId ("_" ++ show (nameId n))
+    l   -> MemberId l
+
+-- Rather annoyingly, the anonymous construtor of a record R in module M
+-- is given the name M.recCon, but a named constructor C
+-- is given the name M.R.C, sigh. This causes a lot of hoop-jumping
+-- in the map from Agda names to JS names, which we patch by renaming
+-- anonymous constructors to M.R.record.
+
+global' :: QName -> TCM (Exp,[MemberId])
+global' q = do
+  i <- iModuleName <$> curIF
+  is <- filter (isInModule q) <$> map (iModuleName . miInterface) <$> elems <$> getVisitedModules
+  case is of
+    [] -> __IMPOSSIBLE__
+    _ -> let
+        seg = maximum (map (length . mnameToList) is)
+        ms = mnameToList (qnameModule q)
+        m = MName (take seg ms)
+        ls = map jsMember (drop seg ms ++ [qnameName q])
+      in case (m == i) of
+        True -> return (Self, ls)
+        False -> return (Global (jsMod m), ls)
+
+global :: QName -> TCM (Exp,[MemberId])
+global q = do
+  d <- getConstInfo q
+  case d of
+    Defn { theDef = Constructor { conData = p } } -> do
+      e <- getConstInfo p
+      case e of
+        Defn { theDef = Record { recNamedCon = False } } -> do
+          (m,ls) <- global' p
+          return (m, ls ++ [MemberId "record"])
+        _ -> global' (defName d)
+    _ -> global' (defName d)
+
+-- Reorder a list of exports to ensure def-before-use.
+-- Note that this can diverge in the case when there is no such reordering.
+
+reorder :: [Export] -> [Export]
+reorder = reorder' empty
+
+reorder' :: Set [MemberId] -> [Export] -> [Export]
+reorder' defs [] = []
+reorder' defs (e : es) =
+  let us = uses e `difference` defs in
+  case null us of
+    True -> e : (reorder' (insert (expName e) defs) es)
+    False -> reorder' defs (insertAfter us e es)
+
+insertAfter :: Set [MemberId] -> Export -> [Export] -> [Export]
+insertAfter us e []                 = [e]
+insertAfter us e (f:fs) | null us   = e : f : fs
+insertAfter us e (f:fs) | otherwise = f : insertAfter (delete (expName f) us) e fs
+
+--------------------------------------------------
+-- Main compiling clauses
+--------------------------------------------------
+
+curModule :: TCM Module
+curModule = do
+  m <- (jsMod <$> curMName)
+  is <- map jsMod <$> (iImportedModules <$> curIF)
+  es <- mapM definition =<< (toList <$> curDefs)
+  return (Module m (reorder es))
+
+definition :: (QName,Definition) -> TCM Export
+definition (q,d) = do
+  (_,ls) <- global q
+  d <- instantiateFull d
+  e <- defn q ls (defType d) (defJSDef d) (theDef d)
+  return (Export ls e)
+
+defn :: QName -> [MemberId] -> Type -> Maybe JSCode -> Defn -> TCM Exp
+defn q ls t (Just e) Axiom =
+  return e
+defn q ls t Nothing Axiom = do
+  t <- normalise t
+  s <- isSingleton t
+  case s of
+    -- Inline and eta-expand postulates of singleton type
+    Just e ->
+      return (curriedLambda (arity t) e)
+    -- Everything else we leave undefined
+    Nothing ->
+      return Undefined
+defn q ls t (Just e) (Function {}) =
+  return e
+defn q ls t Nothing (Function { funProjection = proj, funClauses = cls }) = do
+  t <- normalise t
+  s <- isSingleton t
+  cs <- mapM clause cls
+  case s of
+    -- Inline and eta-expand expressions of singleton type
+    Just e ->
+      return (curriedLambda (arity t) e)
+    Nothing -> case proj of
+      Just (p,i) -> do
+        d <- getConstInfo p
+        case theDef d of
+          -- For projections from records we use a field lookup
+          Record { recFields = flds } | q `elem` map unArg flds ->
+            return (curriedLambda (numPars cls)
+              (Lookup (Local (LocalId 0)) (last ls)))
+          _ ->
+            -- For anything else we generate code, after adding (i-1) dummy lambdas
+            return (dummyLambda (i-1) (lambda cs))
+      Nothing ->
+        return (lambda cs)
+defn q ls t (Just e) (Primitive {}) =
+  return e
+defn q ls t _ (Primitive {}) =
+  return Undefined
+defn q ls t _ (Datatype {}) =
+  return emp
+defn q ls t (Just e) (Constructor {}) =
+  return e
+defn q ls t _ (Constructor { conData = p, conPars = nc }) = do
+  np <- return (arity t - nc)
+  d <- getConstInfo p
+  case theDef d of
+    Record { recFields = flds } ->
+      return (curriedLambda np (Object (fromList
+        ( (last ls , Lambda 1
+             (Apply (Lookup (Local (LocalId 0)) (last ls))
+               [ Local (LocalId (np - i)) | i <- [0 .. np-1] ]))
+        : (zip [ jsMember (qnameName (unArg fld)) | fld <- flds ]
+             [ Local (LocalId (np - i)) | i <- [1 .. np] ])))))
+    _ ->
+      return (curriedLambda (np + 1)
+        (Apply (Lookup (Local (LocalId 0)) (last ls))
+          [ Local (LocalId (np - i)) | i <- [0 .. np-1] ]))
+defn q ls t _ (Record {}) =
+  return emp
+
+-- Number of params in a function declaration
+
+numPars :: [Clause] -> Nat
+numPars []      = 0
+numPars (c : _) = genericLength (clausePats c)
+
+-- One clause in a function definition
+
+clause :: Clause -> TCM Case
+clause c = do
+  ps <- mapM (pattern . unArg) (clausePats c)
+  (av,bv,es) <- return (mapping (map unArg (clausePats c)))
+  e <- body (clauseBody c)
+  return (Case ps (subst av es e))
+
+-- Mapping from Agda variables to JS variables in a pattern.
+-- If mapping ps = (av,bv,es) then av is the number of Agda variables,
+-- bv is the number of JS variables, and es is a list of expressions,
+-- where es[i] is the JS variable corresponding to Agda variable i.
+
+mapping :: [Pattern] -> (Nat,Nat,[Exp])
+mapping = foldr mapping' (0,0,[])
+
+mapping' :: Pattern -> (Nat,Nat,[Exp]) -> (Nat,Nat,[Exp])
+mapping' (VarP _)      (av,bv,es) = (av+1, bv+1, Local (LocalId bv) : es)
+mapping' (DotP _)      (av,bv,es) = (av+1, bv+1, Local (LocalId bv) : es)
+mapping' (ConP _ _ ps) (av,bv,es) = (av',bv'+1,es') where
+  (av',bv',es') = foldr mapping' (av,bv,es) (map unArg ps)
+mapping' (LitP _)      (av,bv,es) = (av, bv+1, es)
+
+-- Not doing literal patterns yet
+
+pattern :: Pattern -> TCM Patt
+pattern (ConP q _ ps) = do
+  l <- tag q
+  ps <- mapM (pattern . unArg) ps
+  return (Tagged l ps)
+pattern _             = return VarPatt
+
+tag :: QName -> TCM Tag
+tag q = do
+  l <- visitorName q
+  c <- getConstInfo q
+  case theDef c of
+    (Constructor { conData = p }) -> do
+      d <- getConstInfo p
+      case (defJSDef d, theDef d) of
+        (Just e, Datatype { dataCons = qs }) -> do
+          ls <- mapM visitorName qs
+          return (Tag l ls (\ x xs -> apply e (x:xs)))
+        (Nothing, Datatype { dataCons = qs }) -> do
+          ls <- mapM visitorName qs
+          return (Tag l ls Apply)
+        (Just e, Record {}) -> do
+          return (Tag l [l] (\ x xs -> apply e (x:xs)))
+        (Nothing, Record {}) -> do
+          return (Tag l [l] Apply)
+        _ -> __IMPOSSIBLE__
+    _ -> __IMPOSSIBLE__
+
+visitorName :: QName -> TCM MemberId
+visitorName q = do (m,ls) <- global q; return (last ls)
+
+body :: ClauseBody -> TCM Exp
+body (Body e) = term e
+body (Bind b) = body (unAbs b)
+body (NoBody) = return Undefined
+
+term :: Term -> TCM Exp
+term (Var   i as)         = do
+  e <- return (Local (LocalId i))
+  es <- args Nothing as
+  return (curriedApply e es)
+term (Lam   _ at)         = Lambda 1 <$> term (absBody at)
+term (Lit   l)            = return (literal l)
+term (Level l)            = term =<< reallyUnLevelView l
+term (Def q as) = do
+  d <- getConstInfo q
+  case theDef d of
+    -- Datatypes and records are erased
+    Datatype {} -> return (String "*")
+    Record {} -> return (String "*")
+    _ -> case defJSDef d of
+      -- Inline functions with an FFI definition
+      Just e -> do
+        es <- args (defProjection d) as
+        return (curriedApply e es)
+      Nothing -> do
+        t <- normalise (defType d)
+        s <- isSingleton t
+        case s of
+          -- Inline and eta-expand singleton types
+          Just e ->
+            return (curriedLambda (arity t) e)
+          -- Everything else we leave non-inline
+          Nothing -> do
+            e <- qname q
+            es <- args (defProjection d) as
+            return (curriedApply e es)
+term (Con q as) = do
+  d <- getConstInfo q
+  case defJSDef d of
+    -- Inline functions with an FFI definition
+    Just e -> do
+      es <- args Nothing as
+      return (curriedApply e es)
+    -- Everything else we leave non-inline
+    Nothing -> do
+      e <- qname q
+      es <- args Nothing as
+      return (curriedApply e es)
+term (Pi    _ _)          = return (String "*")
+term (Sort  _)            = return (String "*")
+term (MetaV _ _)          = return (Undefined)
+term (DontCare _)         = return (Undefined)
+
+-- Check to see if a type is a singleton, and if so, return its only
+-- member.  Singleton types are of the form T1 -> ... -> Tn -> T where
+-- T is either a record with no fields, a datatype with one
+-- no-argument constructor, a datatype with no constructors,
+-- or (since this is a type-erasing translation) Set.
+
+isSingleton :: Type -> TCM (Maybe Exp)
+isSingleton t = case unEl t of
+  Pi _ b         -> isSingleton (unAbs b)
+  Sort _         -> return (Just (String "*"))
+  Def q as       -> do
+    d <- getConstInfo q
+    case (theDef d) of
+      Datatype { dataPars = np, dataCons = [] } ->
+        return (Just Undefined)
+      Datatype { dataPars = np, dataCons = [p] } -> do
+        c <- getConstInfo p
+        case (arity (defType c) == np) of
+          True -> Just <$> qname p
+          False -> return (Nothing)
+      Record { recCon = p, recFields = [] } ->
+        Just <$> qname p
+      _ -> return (Nothing)
+  _              -> return (Nothing)
+
+defProjection :: Definition -> Maybe (QName, Int)
+defProjection Defn { theDef = Function { funProjection = p } } = p
+defProjection _                                                = Nothing
+
+args :: Maybe(QName, Int) -> Args -> TCM [Exp]
+args Nothing as =
+  mapM (term . unArg) as
+args (Just (q,i)) as = do
+  es <- mapM (term . unArg) as
+  return (replicate (i-1) Undefined ++ es)
+
+qname :: QName -> TCM Exp
+qname q = do
+  (e,ls) <- global q
+  return (foldl Lookup e ls)
+
+literal :: Literal -> Exp
+literal (LitInt    _ x) = Integer x
+literal (LitFloat  _ x) = Double  x
+literal (LitString _ x) = String  x
+literal (LitChar   _ x) = Char    x
+literal (LitQName  _ x) = String  (show x)
+
+dummyLambda :: Int -> Exp -> Exp
+dummyLambda n = iterate' n (Lambda 0)
+
+--------------------------------------------------
+-- Writing out an ECMAScript module
+--------------------------------------------------
+
+writeModule :: Module -> TCM ()
+writeModule m = do
+  out <- outFile (modName m)
+  liftIO (writeFile out (pretty 0 0 m))
+
+compileDir :: TCM FilePath
+compileDir = do
+  mdir <- optCompileDir <$> commandLineOptions
+  case mdir of
+    Just dir -> return dir
+    Nothing  -> __IMPOSSIBLE__
+
+outFile :: GlobalId -> TCM FilePath
+outFile m = do
+  mdir <- compileDir
+  let (fdir, fn) = splitFileName (jsFileName m)
+  let dir = mdir </> fdir
+      fp  = dir </> fn
+  liftIO $ createDirectoryIfMissing True dir
+  return fp
+
+outFile_ :: TCM FilePath
+outFile_ = do
+  m <- curMName
+  outFile (jsMod m)
diff --git a/src/full/Agda/Compiler/JS/Parser.hs b/src/full/Agda/Compiler/JS/Parser.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Compiler/JS/Parser.hs
@@ -0,0 +1,187 @@
+module Agda.Compiler.JS.Parser where
+
+-- This is a simple parser for the ECMAScript FFI, which parses a
+-- subset of ECMAscript expressions. We do this so that we can
+-- optimize code that contains FFI expressions, for example
+-- {-# COMPILED_JS _+_ function (x) { return function (y) { return x+y; }; } #-}
+-- will generate ECMAScript "1 + 2" from Agda "1 + 2".
+
+import Prelude hiding ( exp, lookup )
+import Control.Monad.Identity ( Identity )
+import Data.List ( genericLength )
+import Data.Char ( isSpace, isLetter, isAlphaNum, isDigit )
+import Data.Map ( Map, fromList, union, empty )
+import qualified Data.Map as M
+import qualified Data.Map as M
+
+import Agda.Utils.ReadP
+  ( ReadP, (+++), (<++), between, chainl1, char, choice, look, many, many1,
+    munch, munch1, parse', pfail, satisfy, sepBy, string, skipSpaces )
+
+import Agda.Syntax.Common ( Nat )
+import Agda.Compiler.JS.Syntax
+  ( LocalId(LocalId), GlobalId(GlobalId), MemberId(MemberId),
+    Exp(Self,Local,Global,Undefined,String,Integer,Lambda,Apply,Object,Lookup,If,BinOp,PreOp,Const) )
+
+type Parser = ReadP Char
+
+identifier :: Parser String
+identifier = do
+  c <- satisfy isLetter
+  cs <- munch isAlphaNum
+  skipSpaces
+  return (c : cs)
+
+wordBoundary :: Parser ()
+wordBoundary = do
+  cs <- look
+  case cs of
+    (c:_) | isAlphaNum c -> pfail
+    _                    -> return ()
+
+token :: String -> Parser ()
+token s = string s >> wordBoundary >> skipSpaces
+
+punct :: Char -> Parser ()
+punct c = char c >> skipSpaces
+
+parened :: Parser a -> Parser a
+parened = between (punct '(')  (punct ')')
+
+braced :: Parser a -> Parser a
+braced = between (punct '{')  (punct '}')
+
+bracketed :: Parser a -> Parser a
+bracketed = between (punct '[')  (punct ']')
+
+quoted :: Parser a -> Parser a
+quoted = between (char '"') (punct '"')
+
+stringLit :: Parser Exp
+stringLit = do s <- stringStr; return (String s)
+
+stringStr :: Parser String
+stringStr = quoted (many stringChr)
+
+stringChr :: Parser Char
+stringChr = satisfy (`notElem` "\\\"") +++ escChr
+
+-- Not handling all escape sequences
+escChr :: Parser Char
+escChr = char '\\' >> (
+  (char 'n' >> return '\n') +++
+  (char 'r' >> return '\r') +++
+  (char 't' >> return '\t') +++
+  (char '"' >> return '"') +++
+  (char '\\' >> return '\\')
+ )
+
+-- Not handling all integer constants
+intLit :: Parser Exp
+intLit = do s <- munch1 isDigit; skipSpaces; return (Integer (read s))
+
+undef :: Parser Exp
+undef = token "undefined" >> return Undefined
+
+localid :: (Map String Nat) -> Parser Exp
+localid m = do
+  s <- identifier
+  case M.lookup s m of
+    Nothing -> return (Const s)
+    Just i -> return (Local (LocalId i))
+
+globalid :: Parser Exp
+globalid = do
+  token "require"
+  i <- parened (quoted (sepBy (munch1 isAlphaNum) (char '.')))
+  return (Global (GlobalId i))
+
+preop :: Parser String
+preop = do
+  op <- choice (map string [ "+", "-", "!" ])
+  skipSpaces
+  return op
+
+binop :: Parser String
+binop = do
+  op <- choice (map string [
+      "<", ">", "<=", ">=", "==", "===", "<<", ">>",
+      "<<<", ">>>", "!=", "!==", "+", "-", "*", "%", "/",
+      "&", "&&", "|", "||", "^"
+    ])
+  skipSpaces
+  return op
+
+field :: (Map String Nat) -> Parser (MemberId,Exp)
+field m = do
+  l <- stringStr
+  punct ':'
+  e <- exp m
+  return (MemberId l, e)
+
+object :: (Map String Nat) -> Parser Exp
+object m = do
+  o <- braced (sepBy (field m) (punct ','))
+  return (Object (fromList o))
+
+function :: (Map String Nat) -> Parser Exp
+function m = do
+  token "function"
+  xs <- parened (sepBy identifier (punct ','))
+  n <- return (genericLength xs)
+  m' <- return (union (fromList (zip xs [n-1,n-2..0])) (M.map (+n) m))
+  e <- bracedBlock m'
+  return (Lambda n e)
+
+bracedBlock :: (Map String Nat) -> Parser Exp
+bracedBlock m = braced (returnBlock m +++ ifBlock m +++ bracedBlock m)
+
+returnBlock :: (Map String Nat) -> Parser Exp
+returnBlock m = between (token "return") (punct ';') (exp m)
+
+ifBlock :: (Map String Nat) -> Parser Exp
+ifBlock m = do
+  token "if"
+  e <- parened (exp m)
+  f <- bracedBlock m
+  token "else"
+  g <- (ifBlock m +++ bracedBlock m)
+  return (If e f g)
+
+exp0 :: (Map String Nat) -> Parser Exp
+exp0 m = function m <++ undef <++ globalid <++ localid m <++
+         object m <++ stringLit <++ intLit <++ parened (exp m)
+
+exp1 :: (Map String Nat) -> Parser Exp
+exp1 m =
+  (do op <- preop; e <- exp1 m; return (PreOp op e)) <++
+  (exp0 m)
+
+exp2 :: (Map String Nat) -> Parser Exp
+exp2 m = exp1 m >>= exp2' m
+
+-- Not handling operator fixity or precedence
+exp2' :: (Map String Nat) -> Exp -> Parser Exp
+exp2' m e =
+  (do es <- parened (sepBy (exp m) (punct ',')); exp2' m (Apply e es)) <++
+  (do i <- bracketed stringStr; exp2' m (Lookup e (MemberId i))) <++
+  (do punct '.'; i <- identifier; exp2' m (Lookup e (MemberId i))) <++
+  (do op <- binop; f <- exp0 m; exp2' m (BinOp e op f)) <++
+  (return e)
+
+exp3 :: (Map String Nat) -> Parser Exp
+exp3 m = exp2 m >>= exp3' m
+
+exp3' :: (Map String Nat) -> Exp -> Parser Exp
+exp3' m e =
+  (do punct '?'; f <- exp2 m; punct ':'; g <- exp2 m; return (If e f g)) <++
+  (return e)
+
+exp :: (Map String Nat) -> Parser Exp
+exp = exp3
+
+topLevel :: Parser Exp
+topLevel = skipSpaces >> exp empty
+
+parse :: String -> Either Exp String
+parse = parse' topLevel
diff --git a/src/full/Agda/Compiler/JS/Pretty.hs b/src/full/Agda/Compiler/JS/Pretty.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Compiler/JS/Pretty.hs
@@ -0,0 +1,118 @@
+module Agda.Compiler.JS.Pretty where
+
+import Prelude hiding ( null )
+import Data.List ( intercalate )
+import Data.Set ( Set, toList, singleton, insert, member )
+import Data.Map ( Map, toAscList, empty, null )
+
+import Agda.Syntax.Common ( Nat )
+
+import Agda.Compiler.JS.Syntax
+  ( Exp(Self,Local,Global,Undefined,String,Char,Integer,Double,Lambda,Object,Apply,Lookup,If,BinOp,PreOp,Const),
+    LocalId(LocalId), GlobalId(GlobalId), MemberId(MemberId), Module(Module), Export(Export),
+    globals )
+
+-- Pretty-print a lambda-calculus expression as ECMAScript.
+
+-- Since ECMAScript is C-like rather than Haskell-like, it's easier to
+-- do the pretty-printing directly than use the Pretty library, which
+-- assumes Haskell-like indentation.
+
+br :: Int -> String
+br i = "\n" ++ take (2*i) (repeat ' ')
+
+unescape :: Char -> String
+unescape '"'      = "\\\""
+unescape '\\'     = "\\\\"
+unescape '\n'     = "\\n"
+unescape '\r'     = "\\r"
+unescape '\x2028' = "\\u2028"
+unescape '\x2029' = "\\u2029"
+unescape c        = [c]
+
+unescapes :: String -> String
+unescapes s = concat (map unescape s)
+
+-- pretty n i e pretty-prints e, under n levels of de Bruijn binding,
+-- with i levels of indentation.
+
+class Pretty a where
+    pretty :: Nat -> Int -> a -> String
+
+instance (Pretty a, Pretty b) => Pretty (a,b) where
+  pretty n i (x,y) = pretty n i x ++ ": " ++ pretty n (i+1) y
+
+-- Pretty-print collections
+
+class Pretties a where
+    pretties :: Nat -> Int -> a -> [String]
+
+instance Pretty a => Pretties [a] where
+  pretties n i = map (pretty n i)
+
+instance (Pretty a, Pretty b) => Pretties (Map a b) where
+  pretties n i o = pretties n i (toAscList o)
+
+-- Pretty print identifiers
+
+instance Pretty LocalId where
+  pretty n i (LocalId x) = "x" ++ show (n - x - 1)
+
+instance Pretty GlobalId where
+  pretty n i (GlobalId m) = intercalate "_" m
+
+instance Pretty MemberId where
+  pretty n i (MemberId s) = "\"" ++ unescapes s ++ "\""
+
+-- Pretty print expressions
+
+instance Pretty Exp where
+  pretty n i (Self)                 = "exports"
+  pretty n i (Local x)              = pretty n i x
+  pretty n i (Global m)             = pretty n i m
+  pretty n i (Undefined)            = "undefined"
+  pretty n i (String s)             = "\"" ++ unescapes s ++ "\""
+  pretty n i (Char c)               = "\"" ++ unescape c ++ "\""
+  pretty n i (Integer x)            = show x
+  pretty n i (Double x)             = show x
+  pretty n i (Lambda x e)           =
+    "function (" ++
+      intercalate ", " (pretties (n+x) i (map LocalId [x-1, x-2 .. 0])) ++
+    ") " ++ block (n+x) i e
+  pretty n i (Object o) | null o    = "{}"
+  pretty n i (Object o) | otherwise =
+    "{" ++ br (i+1) ++ intercalate ("," ++ br (i+1)) (pretties n i o) ++ br i ++ "}"
+  pretty n i (Apply f es)           = pretty n i f ++ "(" ++ intercalate ", " (pretties n i es) ++ ")"
+  pretty n i (Lookup e l)           = pretty n i e ++ "[" ++ pretty n i l ++ "]"
+  pretty n i (If e f g)             =
+    "(" ++ pretty n i e ++ "? " ++ pretty n i f ++ ": " ++ pretty n i g ++ ")"
+  pretty n i (PreOp op e)           = "(" ++ op ++ " " ++ pretty n i e ++ ")"
+  pretty n i (BinOp e op f)         = "(" ++ pretty n i e ++ " " ++ op ++ " " ++ pretty n i f ++ ")"
+  pretty n i (Const c)              = c
+
+block :: Nat -> Int -> Exp -> String
+block n i (If e f g) = "{" ++ br (i+1) ++ block' n (i+1) (If e f g) ++ br i ++ "}"
+block n i e          = "{" ++ br (i+1) ++ "return " ++ pretty n (i+1) e ++ ";" ++ br i ++ "}"
+
+block' :: Nat -> Int -> Exp -> String
+block' n i (If e f g) = "if (" ++ pretty n i e ++ ") " ++ block n i f ++ " else " ++ block' n i g
+block' n i e          = block n i e
+
+modname :: GlobalId -> String
+modname (GlobalId ms) = "\"" ++ intercalate "." ms ++ "\""
+
+exports :: Nat -> Int -> Set [MemberId] -> [Export] -> String
+exports n i lss [] = ""
+exports n i lss (Export ls e : es) | member (init ls) lss =
+  "exports[" ++ intercalate "][" (pretties n i ls) ++ "] = " ++ pretty n (i+1) e ++ ";" ++ br i ++
+  exports n i (insert ls lss) es
+exports n i lss (Export ls e : es) | otherwise =
+  exports n i lss (Export (init ls) (Object empty) : Export ls e : es)
+
+instance Pretty Module where
+  pretty n i (Module m es) =
+    "define([" ++ intercalate "," ("\"exports\"" : map modname js) ++ "]," ++
+    "function(" ++ intercalate "," ("exports" : pretties n i js) ++ ") {" ++ br (i+1) ++
+    exports n (i+1) (singleton []) es ++
+    "});" ++ br i
+      where js = toList (globals es)
diff --git a/src/full/Agda/Compiler/JS/Substitution.hs b/src/full/Agda/Compiler/JS/Substitution.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Compiler/JS/Substitution.hs
@@ -0,0 +1,124 @@
+module Agda.Compiler.JS.Substitution where
+
+import Prelude hiding ( map, lookup )
+import Data.Generics ( Data, Typeable )
+import Data.Map ( Map, empty, toList, unionWith, singleton, findWithDefault )
+import qualified Data.Map as M ( map )
+import Data.Map ( Map )
+import Data.List ( genericIndex )
+import qualified Data.List as L ( map )
+
+import Agda.Syntax.Common ( Nat )
+import Agda.Compiler.JS.Syntax
+  ( Exp(Self,Undefined,Local,Lambda,Object,Apply,Lookup,If,BinOp,PreOp),
+    MemberId, LocalId(LocalId), GlobalId(GlobalId) )
+import Agda.Utils.Function ( iterate' )
+
+-- Map for expressions
+
+map :: Nat -> (Nat -> LocalId -> Exp) -> Exp -> Exp
+map m f (Local i)       = f m i
+map m f (Lambda i e)    = Lambda i (map (m + i) f e)
+map m f (Object o)      = Object (M.map (map m f) o)
+map m f (Apply e es)    = Apply (map m f e) (L.map (map m f) es)
+map m f (Lookup e l)    = Lookup (map m f e) l
+map m f (If e e' e'')   = If (map m f e) (map m f e') (map m f e'')
+map m f (PreOp op e)    = PreOp op (map m f e)
+map m f (BinOp e op e') = BinOp (map m f e) op (map m f e')
+map m f e               = e
+
+-- Shifting
+
+shift :: Nat -> Exp -> Exp
+shift = shiftFrom 0
+
+shiftFrom :: Nat -> Nat -> Exp -> Exp
+shiftFrom m 0 e = e
+shiftFrom m n e = map m (shifter n) e
+
+shifter :: Nat -> Nat -> LocalId -> Exp
+shifter n m (LocalId i) | i < m     = Local (LocalId i)
+shifter n m (LocalId i) | otherwise = Local (LocalId (i + n))
+
+-- Substitution
+
+subst :: Nat -> [Exp] -> Exp -> Exp
+subst 0 es e = e
+subst n es e = map 0 (substituter n es) e
+
+substituter :: Nat -> [Exp] -> Nat -> LocalId -> Exp
+substituter n es m (LocalId i) | i < m       = Local (LocalId i)
+substituter n es m (LocalId i) | (i - m) < n = shift m (genericIndex (es ++ repeat Undefined) (n - (i + 1 - m)))
+substituter n es m (LocalId i) | otherwise   = Local (LocalId (i - n))
+
+-- A variant on substitution which performs beta-reduction
+
+map' :: Nat -> (Nat -> LocalId -> Exp) -> Exp -> Exp
+map' m f (Local i)       = f m i
+map' m f (Lambda i e)    = Lambda i (map' (m + i) f e)
+map' m f (Object o)      = Object (M.map (map' m f) o)
+map' m f (Apply e es)    = apply (map' m f e) (L.map (map' m f) es)
+map' m f (Lookup e l)    = lookup (map' m f e) l
+map' m f (If e e' e'')   = If (map' m f e) (map' m f e') (map' m f e'')
+map' m f (PreOp op e)    = PreOp op (map' m f e)
+map' m f (BinOp e op e') = BinOp (map' m f e) op (map' m f e')
+map' m f e               = e
+
+subst' :: Nat -> [Exp] -> Exp -> Exp
+subst' 0 es e = e
+subst' n es e = map' 0 (substituter n es) e
+
+-- Beta-reducing application and field access
+
+apply :: Exp -> [Exp] -> Exp
+apply (Lambda i e) es = subst' i es e
+apply e            es = Apply e es
+
+lookup :: Exp -> MemberId -> Exp
+lookup (Object o) l = findWithDefault Undefined l o
+lookup e          l = Lookup e l
+
+-- Replace any top-level occurrences of self
+-- (needed because JS is a cbv language, so any top-level
+-- recursions would evaluate before the module has been defined,
+-- e.g. exports = { x: 1, y: exports.x } results in an exception,
+-- as exports is undefined at the point that exports.x is evaluated),
+
+self :: Exp -> Exp -> Exp
+self e (Self)         = e
+self e (Object o)     = Object (M.map (self e) o)
+self e (Apply f es)   = case (self e f) of
+  (Lambda n g) -> self e (subst' n es g)
+  g            -> Apply g (L.map (self e) es)
+self e (Lookup f l)   = lookup (self e f) l
+self e (If f g h)     = If (self e f) (self e g) (self e h)
+self e (BinOp f op g) = BinOp (self e f) op (self e g)
+self e (PreOp op f)   = PreOp op (self e f)
+self e f              = f
+
+-- Find the fixed point of an expression, with no top-level occurrences
+-- of self.
+
+fix :: Exp -> Exp
+fix f = e where e = self e f
+
+-- Some helper functions
+
+curriedApply :: Exp -> [Exp] -> Exp
+curriedApply = foldl (\ f e -> apply f [e])
+
+curriedLambda :: Nat -> Exp -> Exp
+curriedLambda n = iterate' n (Lambda 1)
+
+emp :: Exp
+emp = Object (empty)
+
+union :: Exp -> Exp -> Exp
+union (Object o) (Object p) = Object (unionWith union o p)
+union e          f          = e
+
+vine :: [MemberId] -> Exp -> Exp
+vine ls e = foldr (\ l e -> Object (singleton l e)) e ls
+
+object :: [([MemberId],Exp)] -> Exp
+object = foldr (\ (ls,e) -> (union (vine ls e))) emp
diff --git a/src/full/Agda/Compiler/JS/Syntax.hs b/src/full/Agda/Compiler/JS/Syntax.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Compiler/JS/Syntax.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE DeriveDataTypeable
+  #-}
+module Agda.Compiler.JS.Syntax where
+
+import Data.Generics ( Data, Typeable )
+import Data.Map ( Map, fold )
+import Data.Set ( Set, empty, singleton, union )
+
+import Agda.Syntax.Common ( Nat )
+
+-- An untyped lambda calculus with records,
+-- and a special self-binder for recursive declarations
+
+data Exp =
+  Self |
+  Local LocalId |
+  Global GlobalId |
+  Undefined |
+  String String |
+  Char Char |
+  Integer Integer |
+  Double Double |
+  Lambda Nat Exp |
+  Object (Map MemberId Exp) |
+  Apply Exp [Exp] |
+  Lookup Exp MemberId |
+  If Exp Exp Exp |
+  BinOp Exp String Exp |
+  PreOp String Exp |
+  Const String
+  deriving (Typeable, Data, Show)
+
+-- Local identifiers are named by De Bruijn indices.
+-- Global identifiers are named by string lists.
+-- Object members are named by strings.
+
+newtype LocalId = LocalId Nat
+  deriving (Typeable, Data, Eq, Ord, Show)
+
+newtype GlobalId = GlobalId [String]
+  deriving (Typeable, Data, Eq, Ord, Show)
+
+newtype MemberId = MemberId String
+  deriving (Typeable, Data, Eq, Ord, Show)
+
+-- The top-level compilation unit is a module, which names
+-- the GId of its exports, and a list of definitions
+
+data Export = Export { expName :: [MemberId], defn :: Exp }
+  deriving (Typeable, Data, Show)
+
+data Module = Module { modName :: GlobalId, exports :: [Export] }
+  deriving (Typeable, Data, Show)
+
+-- Note that modules are allowed to be recursive, via the Self expression,
+-- which is bound to the exported module.
+
+-- Top-level uses of the form exports.l1....lN.
+
+class Uses a where
+  uses :: a -> Set [MemberId]
+
+instance Uses a => Uses [a] where
+  uses = foldr (union . uses) empty
+
+instance Uses a => Uses (Map k a) where
+  uses = fold (union . uses) empty
+
+instance Uses Exp where
+  uses (Object o)     = fold (union . uses) empty o
+  uses (Apply e es)   = foldr (union . uses) (uses e) es
+  uses (Lookup e l)   = uses' e [l] where
+      uses' Self         ls = singleton ls
+      uses' (Lookup e l) ls = uses' e (l : ls)
+      uses' e            ls = uses e
+  uses (If e f g)     = uses e `union` uses f `union` uses g
+  uses (BinOp e op f) = uses e `union` uses f
+  uses (PreOp op e)   = uses e
+  uses e              = empty
+
+instance Uses Export where
+  uses (Export ls e) = uses e
+
+-- All global ids
+
+class Globals a where
+  globals :: a -> Set GlobalId
+
+instance Globals a => Globals [a] where
+  globals = foldr (union . globals) empty
+
+instance Globals a => Globals (Map k a) where
+  globals = fold (union . globals) empty
+
+instance Globals Exp where
+  globals (Global i) = singleton i
+  globals (Lambda n e) = globals e
+  globals (Object o) = globals o
+  globals (Apply e es) = globals e `union` globals es
+  globals (Lookup e l) = globals e
+  globals (If e f g) = globals e `union` globals f `union` globals g
+  globals (BinOp e op f) = globals e `union` globals f
+  globals (PreOp op e) = globals e
+  globals _ = empty
+
+instance Globals Export where
+  globals (Export ls e) = globals e
+
+instance Globals Module where
+  globals (Module m es) = globals es
diff --git a/src/full/Agda/Compiler/MAlonzo/Compiler.hs b/src/full/Agda/Compiler/MAlonzo/Compiler.hs
--- a/src/full/Agda/Compiler/MAlonzo/Compiler.hs
+++ b/src/full/Agda/Compiler/MAlonzo/Compiler.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE CPP, PatternGuards #-}
 
 module Agda.Compiler.MAlonzo.Compiler where
 
@@ -26,7 +26,6 @@
 import Agda.Compiler.MAlonzo.Primitives
 import Agda.Interaction.FindFile
 import Agda.Interaction.Imports
-import Agda.Interaction.Monad
 import Agda.Interaction.Options
 import Agda.Syntax.Common
 import qualified Agda.Syntax.Concrete.Name as CN
@@ -37,6 +36,8 @@
 import Agda.TypeChecking.Reduce
 import Agda.TypeChecking.Rules.Builtin.Coinduction
 import Agda.TypeChecking.Pretty
+import Agda.TypeChecking.Substitute
+import Agda.TypeChecking.Level (reallyUnLevelView)
 import Agda.Utils.FileName
 import Agda.Utils.Monad
 import qualified Agda.Utils.IO.Locale as LocIO
@@ -116,8 +117,8 @@
 -- @
 --   type Infinity a b = b
 --
---   sharp :: forall a. () -> forall b. () -> b -> b
---   sharp _ _ x = x
+--   sharp :: a -> a
+--   sharp x = x
 --
 --   flat :: forall a. () -> forall b. () -> b -> b
 --   flat _ _ x = x
@@ -125,12 +126,16 @@
 
 definition :: Maybe CoinductionKit -> Definition -> TCM [HS.Decl]
 -- ignore irrelevant definitions
-definition kit (Defn Forced     _ _  _ _ _) = __IMPOSSIBLE__
-definition kit (Defn Irrelevant _ _  _ _ _) = return []
-definition kit (Defn Relevant   q ty _ _ d) = do
+definition kit (Defn Forced     _ _  _ _ _ _) = __IMPOSSIBLE__
+definition kit (Defn NonStrict  _ _  _ _ _ _) = __IMPOSSIBLE__
+definition kit (Defn Irrelevant _ _  _ _ _ _) = return []
+definition kit (Defn Relevant   q ty _ _ compiled d) = do
   checkTypeOfMain q ty
   (infodecl q :) <$> case d of
 
+    _ | Just (HsDefn ty hs) <- compiledHaskell compiled ->
+      return $ fbWithType ty (fakeExp hs)
+
     -- Special treatment of coinductive builtins.
     Datatype{} | Just q == (nameOfInf <$> kit) -> do
       let infT = unqhname "T" q
@@ -151,9 +156,9 @@
           x     = ihname "x" 0
       return $
         [ HS.TypeSig dummy [sharp] $ fakeType $
-            "forall a. () -> forall b. () -> b -> b"
+            "forall a. a -> a"
         , HS.FunBind [HS.Match dummy sharp
-                               [HS.PWildCard, HS.PWildCard, HS.PVar x]
+                               [HS.PVar x]
                                Nothing
                                (HS.UnGuardedRhs (HS.Var (HS.UnQual x)))
                                (HS.BDecls [])]
@@ -171,30 +176,29 @@
                                (HS.BDecls [])]
         ]
 
-    Axiom{ axHsDef = Just (HsDefn ty hs) } -> return $ fbWithType ty (fakeExp hs)
     Axiom{}                                -> return $ fb axiomErr
     Function{ funClauses =        cls } -> function cls
     Primitive{ primClauses = Just cls } -> function cls
     Primitive{ primClauses = Nothing, primName = s } -> fb <$> primBody s
-    Datatype{ dataPars = np, dataIxs = ni, dataClause = cl, dataCons = cs, dataHsType = Just ty } -> do
+    Datatype{ dataPars = np, dataIxs = ni, dataClause = cl, dataCons = cs }
+      | Just (HsType ty) <- compiledHaskell compiled -> do
       ccs <- concat <$> mapM checkConstructorType cs
       cov <- checkCover q ty np cs
       return $ tvaldecl q (dataInduction d) 0 (np + ni) [] (Just __IMPOSSIBLE__) ++ ccs ++ cov
-    Datatype{ dataPars = np, dataIxs = ni, dataClause = cl, dataCons = cs, dataHsType = Nothing } -> do
+    Datatype{ dataPars = np, dataIxs = ni, dataClause = cl, dataCons = cs } -> do
       (ars, cds) <- unzip <$> mapM condecl cs
       return $ tvaldecl q (dataInduction d) (maximum (np:ars) - np) (np + ni) cds cl
     Constructor{} -> return []
     Record{ recClause = cl, recCon = c, recFields = flds } -> do
       let noFields = genericLength flds
-      ar <- arity <$> normalise ty
+      let ar = arity ty
       cd <- snd <$> condecl c
 --       cd <- case c of
 --         Nothing -> return $ cdecl q noFields
 --         Just c  -> snd <$> condecl c
       return $ tvaldecl q Inductive noFields ar [cd] cl
   where
-  function cls = mkwhere <$> mapM (clause q)
-                                  (tag 0 $ L.map translatedClause cls)
+  function cls = mkwhere <$> mapM (clause q) (tag 0 cls)
   tag _ []       = []
   tag i [cl]     = (i, True , cl): []
   tag i (cl:cls) = (i, False, cl): tag (i + 1) cls
@@ -210,7 +214,7 @@
 
 checkConstructorType :: QName -> TCM [HS.Decl]
 checkConstructorType q = do
-  Constructor{ conHsCode = Just (ty, hs) } <- theDef <$> getConstInfo q
+  Just (HsDefn ty hs) <- compiledHaskell . defCompiledRep <$> getConstInfo q
   return [ HS.TypeSig dummy [unqhname "check" q] $ fakeType ty
          , HS.FunBind [HS.Match dummy (unqhname "check" q) [] Nothing
                                 (HS.UnGuardedRhs $ fakeExp hs) (HS.BDecls [])]
@@ -220,8 +224,8 @@
 checkCover q ty n cs = do
   let tvs = [ "a" ++ show i | i <- [1..n] ]
       makeClause c = do
-        a <- constructorArity c
-        Just (_, hsc) <- conHsCode . theDef <$> getConstInfo c
+        (a, _) <- conArityAndPars c
+        Just (HsDefn _ hsc) <- compiledHaskell . defCompiledRep <$> getConstInfo c
         let pat = HS.PApp (HS.UnQual $ HS.Ident hsc) $ genericReplicate a HS.PWildCard
         return $ HS.Alt dummy pat (HS.UnGuardedAlt $ HS.Tuple []) (HS.BDecls [])
   cs <- mapM makeClause cs
@@ -235,13 +239,13 @@
          ]
 
 -- | Move somewhere else!
-constructorArity :: MonadTCM tcm => QName -> tcm Nat
-constructorArity q = do
+conArityAndPars :: QName -> TCM (Nat, Nat)
+conArityAndPars q = do
   def <- getConstInfo q
-  a <- normalise $ defType def
-  case theDef def of
-    Constructor{ conPars = np } -> return $ arity a - np
-    _ -> fail $ "constructorArity: non constructor: " ++ show q
+  TelV tel _ <- telViewM $ defType def
+  let Constructor{ conPars = np } = theDef def
+      n = genericLength (telToList tel)
+  return (n - np, np)
 
 clause :: QName -> (Nat, Bool, Clause) -> TCM HS.Decl
 clause q (i, isLast, Clause{ clausePats = ps, clauseBody = b }) =
@@ -251,14 +255,15 @@
        | isLast                 = []
        | otherwise              = [match (L.map HS.PVar cvs) crhs]
   cvs  = L.map (ihname "v") [0 .. genericLength ps - 1]
-  crhs = hsCast$ foldl HS.App (hsVarUQ $ dsubname q (i + 1)) (L.map hsVarUQ cvs)
-  failrhs = rtmError $ "incomplete pattern matching: " ++ show q
+  crhs = hsCast$ L.foldl HS.App (hsVarUQ $ dsubname q (i + 1)) (L.map hsVarUQ cvs)
+  failrhs = rtmIncompleteMatch q  -- Andreas, 2011-11-16 call to RTE instead of inlined error
+--  failrhs = rtmError $ "incomplete pattern matching: " ++ show q
   match hps rhs = HS.Match dummy (dsubname q i) hps Nothing
                            (HS.UnGuardedRhs rhs) (HS.BDecls [])
-  bvars (Body _)          _ = []
-  bvars (Bind (Abs _ b')) n = HS.PVar (ihname "v" n) : bvars b' (n + 1)
-  bvars (NoBind      b' ) n = HS.PWildCard           : bvars b' n -- WHY NOT: bvars b' n  -- PRODDUCES head [] exception
-  bvars NoBody            _ = repeat HS.PWildCard -- ?
+  bvars (Body _)           _ = []
+  bvars (Bind (Abs _ b'))  n = HS.PVar (ihname "v" n) : bvars b' (n + 1)
+  bvars (Bind (NoAbs _ b)) n = HS.PWildCard : bvars b n
+  bvars NoBody             _ = repeat HS.PWildCard -- ?
 
   isCon (Arg _ _ ConP{}) = True
   isCon _                = False
@@ -304,9 +309,9 @@
 
 clausebody :: ClauseBody -> TCM HS.Exp
 clausebody b0 = runReaderT (go b0) 0 where
-  go (Body   tm       ) = hsCast <$> term tm
-  go (Bind   (Abs _ b)) = local (1+) $ go b
-  go (NoBind b        ) = go b
+  go (Body tm       )   = hsCast <$> term tm
+  go (Bind (Abs _ b))   = local (1+) $ go b
+  go (Bind (NoAbs _ b)) = go b
   go NoBody             = return $ rtmError $ "Impossible Clause Body"
 
 -- | Extract Agda term to Haskell expression.
@@ -320,12 +325,16 @@
                               local (1+) (term $ absBody at)
   Lit   l    -> lift $ literal l
   Def   q as -> (`apps` as) . HS.Var =<< lift (xhqn "d" q)
-  Con   q as -> (`apps` as) . HS.Con =<< lift (conhqn q)
+  Con   q as -> do
+    kit <- lift coinductionKit
+    if Just q == (nameOfSharp <$> kit)
+      then (`apps` as) . HS.Var =<< lift (xhqn "d" q)
+      else (`apps` as) . HS.Con =<< lift (conhqn q)
+  Level l    -> term =<< lift (reallyUnLevelView l)
   Pi    _ _  -> return HS.unit_con
-  Fun   _ _  -> return HS.unit_con
   Sort  _    -> return HS.unit_con
   MetaV _ _  -> mazerror "hit MetaV"
-  DontCare   -> return $ rtmError $ "hit DontCare"
+  DontCare _ -> return $ rtmError $ "hit DontCare"
   where apps =  foldM (\h a -> HS.App h <$> term' a)
 
 -- | Irrelevant arguments are replaced by Haskells' ().
@@ -338,24 +347,32 @@
   LitInt    _ _   -> do toN <- bltQual "NATURAL" mazIntegerToNat
                         return $ HS.Var toN `HS.App` typed "Integer"
   LitFloat  _ _   -> return $ typed "Double"
+  LitQName  _ x   -> litqname x
   _               -> return $ l'
   where l'    = HS.Lit $ hslit l
         typed = HS.ExpTypeSig dummy l' . HS.TyCon . rtmQual
 
 hslit :: Literal -> HS.Literal
 hslit l = case l of LitInt    _ x -> HS.Int    x
-                    LitLevel  _ x -> HS.Int    x
                     LitFloat  _ x -> HS.Frac   (toRational x)
                     LitString _ x -> HS.String x
                     LitChar   _ x -> HS.Char   x
-                    LitQName  _ x -> HS.String (show x)
+                    LitQName  _ x -> __IMPOSSIBLE__
 
+litqname :: QName -> TCM HS.Exp
+litqname x = return $
+  HS.Con (HS.Qual mazRTE $ HS.Ident "QName") `HS.App`
+  HS.Lit (HS.Int n) `HS.App`
+  HS.Lit (HS.Int m) `HS.App`
+  (rtmError "primQNameType: not implemented") `HS.App`
+  (rtmError "primQNameDefinition: not implemented")
+  where
+    NameId n m = nameId $ qnameName x
+
 condecl :: QName -> TCM (Nat, HS.ConDecl)
-condecl q = getConstInfo q >>= \d -> case d of
-  Defn _ _ ty _ _ (Constructor {conPars = np}) -> do
-    ar <- arity <$> normalise ty
-    return $ (ar, cdecl q (ar - np))
-  _ -> mazerror $ "condecl:" ++ gshow' (q, d)
+condecl q = do
+  (ar, np) <- conArityAndPars q
+  return $ (ar + np, cdecl q ar)
 
 cdecl :: QName -> Nat -> HS.ConDecl
 cdecl q n = HS.ConDecl (unqhname "C" q)
@@ -438,6 +455,14 @@
   , "{-# INLINE [1] mazCoerce #-}"
   , "mazCoerce = Unsafe.Coerce.unsafeCoerce"
   , "{-# RULES \"coerce-id\" forall (x :: a) . mazCoerce x = x #-}"
+  , ""
+  , "-- Builtin QNames, the third field is for the type."
+  , "data QName a b = QName { nameId, moduleId :: Integer, qnameType :: a, qnameDefinition :: b }"
+  , "instance Eq (QName a b) where"
+  , "  QName a b _ _ == QName c d _ _ = (a, b) == (c, d)"
+  , ""
+  , "mazIncompleteMatch :: String -> a"
+  , "mazIncompleteMatch s = error (\"MAlonzo Runtime Error: incomplete pattern matching: \" ++ s)"
   ]
   where
     parse = HS.parseWithMode
diff --git a/src/full/Agda/Compiler/MAlonzo/Misc.hs b/src/full/Agda/Compiler/MAlonzo/Misc.hs
--- a/src/full/Agda/Compiler/MAlonzo/Misc.hs
+++ b/src/full/Agda/Compiler/MAlonzo/Misc.hs
@@ -14,7 +14,6 @@
 import System.Time
 
 import Agda.Interaction.Imports
-import Agda.Interaction.Monad
 import Agda.Syntax.Common
 import qualified Agda.Syntax.Concrete.Name as C
 import Agda.Syntax.Internal
@@ -116,10 +115,12 @@
 -- always use the original name for a constructor even when it's redefined.
 conhqn :: QName -> TCM HS.QName
 conhqn q = do
-    cq   <- canonicalName q
-    defn <- theDef <$> getConstInfo cq
-    case defn of Constructor{conHsCode = Just (_, hs)} -> return $ HS.UnQual $ HS.Ident hs
-                 _                                     -> xhqn "C" cq
+    cq  <- canonicalName q
+    def <- getConstInfo cq
+    hsr <- compiledHaskell . defCompiledRep <$> getConstInfo cq
+    case (compiledHaskell (defCompiledRep def), theDef def) of
+      (Just (HsDefn _ hs), Constructor{}) -> return $ HS.UnQual $ HS.Ident hs
+      _                                   -> xhqn "C" cq
 
 -- qualify name s by the module of builtin b
 bltQual :: String -> String -> TCM HS.QName
@@ -144,6 +145,11 @@
 mazerror msg = error $ mazstr ++ ": " ++ msg
 -- mazCoerce = HS.Var $ HS.Qual unsafeCoerceMod (HS.Ident "unsafeCoerce")
 mazCoerce = HS.Var $ HS.Qual mazRTE $ HS.Ident "mazCoerce"
+
+-- Andreas, 2011-11-16: error incomplete match now RTE-call
+mazIncompleteMatch = HS.Var $ HS.Qual mazRTE $ HS.Ident "mazIncompleteMatch"
+rtmIncompleteMatch :: QName -> HS.Exp
+rtmIncompleteMatch q = mazIncompleteMatch `HS.App` hsVarUQ (unqhname "name" q)
 
 mazRTE :: HS.ModuleName
 mazRTE = HS.ModuleName "MAlonzo.RTE"
diff --git a/src/full/Agda/Compiler/MAlonzo/Primitives.hs b/src/full/Agda/Compiler/MAlonzo/Primitives.hs
--- a/src/full/Agda/Compiler/MAlonzo/Primitives.hs
+++ b/src/full/Agda/Compiler/MAlonzo/Primitives.hs
@@ -24,7 +24,7 @@
 checkTypeOfMain q ty
   | show (qnameName q) /= "main" = return ()
   | otherwise = do
-    Def io [] <- primIO
+    Def io _ <- primIO
     ty <- normalise ty
     case unEl ty of
       Def d _ | d == io -> return ()
@@ -183,14 +183,18 @@
   , "primStringEquality" |-> rel "(==)" "String"
   , "primShowString"     |-> return "(show :: String -> String)"
 
-  -- QNames
-  , "primQNameEquality" |-> rel "(==)" "String"
+  -- Reflection
+  , "primQNameEquality"   |-> rel "(==)" "MAlonzo.RTE.QName () ()"
+  , "primQNameType"       |-> return "MAlonzo.RTE.qnameType"
+  , "primQNameDefinition" |-> return "MAlonzo.RTE.qnameDefinition"
 
+  , "primDataConstructors" |-> return "(error \"primDataConstructors: not implemented\")"
+
   -- Trust me
   , ("primTrustMe"       , Right <$> do
        refl <- primRefl
        flip runReaderT 0 $
-         term $ lam "A" (lam "x" (lam "y" refl)))
+         term $ lam "a" (lam "A" (lam "x" (lam "y" refl))))
   ]
   where
   x |-> s = (x, Left <$> s)
@@ -226,18 +230,19 @@
 
 pconName :: String -> TCM String
 pconName s = toS =<< getBuiltin s where
-  toS (Con q _)         = prettyPrint <$> conhqn q
-  toS (Lam _ (Abs _ t)) = toS t
+  toS (Con q _) = prettyPrint <$> conhqn q
+  toS (Lam _ t) = toS (unAbs t)
   toS _ = mazerror $ "pconName" ++ s
 
 hasCompiledData :: [String] -> TCM Bool
 hasCompiledData (s:_) = toB =<< getBuiltin s where
   toB (Con q _)         = do
     def <- getConstInfo =<< ignoreAbstractMode (canonicalName q)
-    return $ case theDef def of Constructor{conHsCode = Just _} -> True
-                                _                               -> False
-  toB (Lam _ (Abs _ t)) = toB t
-  toB _                 = return False
+    return $ case compiledHaskell $ defCompiledRep def of
+      Just{}  -> True
+      Nothing -> False
+  toB (Lam _ t) = toB (unAbs t)
+  toB _         = return False
 hasCompiledData _    = return False
 
 
diff --git a/src/full/Agda/Interaction/BasicOps.hs b/src/full/Agda/Interaction/BasicOps.hs
--- a/src/full/Agda/Interaction/BasicOps.hs
+++ b/src/full/Agda/Interaction/BasicOps.hs
@@ -1,13 +1,10 @@
 {-# LANGUAGE CPP, MultiParamTypeClasses, FlexibleInstances,
-             UndecidableInstances
+             UndecidableInstances, DeriveFunctor
   #-}
 
 module Agda.Interaction.BasicOps where
-{- TODO: The operations in this module should return Expr and not String,
-         for this we need to write a translator from Internal to Abstract syntax.
--}
 
-
+import Control.Applicative
 import Control.Monad.Error
 import Control.Monad.Reader
 import Control.Monad.State
@@ -16,8 +13,6 @@
 import Data.List
 import Data.Maybe
 
-import Agda.Interaction.Monad
-
 import qualified Agda.Syntax.Concrete as C -- ToDo: Remove with instance of ToConcrete
 import Agda.Syntax.Position
 import Agda.Syntax.Abstract as A hiding (Open)
@@ -42,9 +37,12 @@
 import Agda.TypeChecking.EtaContract (etaContract)
 import Agda.TypeChecking.Coverage
 import Agda.TypeChecking.Records
+import Agda.TypeChecking.Irrelevance (wakeIrrelevantVars)
 import Agda.TypeChecking.Pretty (prettyTCM)
+import Agda.TypeChecking.Eliminators (unElim)
 import qualified Agda.TypeChecking.Pretty as TP
 
+import Agda.Utils.List
 import Agda.Utils.Monad
 import Agda.Utils.Pretty
 import Agda.Utils.Permutation
@@ -71,7 +69,7 @@
     concreteToAbstract (clScope mi) e
 
 giveExpr :: MetaId -> Expr -> TCM Expr
--- When translater from internal to abstract is given, this function might return
+-- When translator from internal to abstract is given, this function might return
 -- the expression returned by the type checker.
 giveExpr mi e =
     do  mv <- lookupMeta mi
@@ -84,11 +82,10 @@
 		    let t' = t `piApply` ctx
 		    v	<- checkExpr e t'
 		    case mvInstantiation mv of
-			InstV v' ->
-			  addConstraints =<< equalTerm t' v (v' `apply` ctx)
+			InstV v' -> equalTerm t' v (v' `apply` ctx)
 			_	 -> updateMeta mi v
 		    reify v
-		 IsSort _ -> __IMPOSSIBLE__
+		 IsSort{} -> __IMPOSSIBLE__
 
 give :: InteractionId -> Maybe Range -> Expr -> TCM (Expr,[InteractionId])
 give ii mr e = liftTCM $ do
@@ -115,8 +112,6 @@
 
 
 refine :: InteractionId -> Maybe Range -> Expr -> TCM (Expr,[InteractionId])
--- If constants has a fixed arity, then it might be better to do
--- exact refinement.
 refine ii mr e =
     do  mi <- lookupInteractionId ii
         mv <- lookupMeta mi
@@ -139,47 +134,10 @@
                  --ToDo: The position of metaVar is not correct
                  --ToDo: The fixity of metavars is not correct -- fixed? MT
 
-{-
-refineExact :: InteractionId -> Maybe Range -> Expr -> TCM (Expr,[InteractionId])
-refineExact ii mr e =
-    do  mi <- lookupInteractionId ii
-        mv <- lookupMeta mi
-        let range = maybe (getRange mv) id mr
-        let scope = M.getMetaScope mv
-        (_,t) <- withMetaInfo (getMetaInfo mv) $ inferExpr e
-        let arityt = arity t
-
-        tryRefine 10 range scope e
-  where tryRefine :: Int -> Range -> ScopeInfo -> Expr -> TCM (Expr,[InteractionId])
-        tryRefine nrOfMetas r scope e = try nrOfMetas e
-           where try 0 e = throwError (strMsg "Can not refine")
-                 try n e = give ii (Just r) e `catchError` (\_ -> try (n-1) (appMeta e))
-                 appMeta :: Expr -> Expr
-                 appMeta e =
-                      let metaVar = QuestionMark $ Agda.Syntax.Info.MetaInfo {Agda.Syntax.Info.metaRange = r,
-                                                 Agda.Syntax.Info.metaScope = scope}
-                      in App (ExprRange $ r) NotHidden e metaVar
-                 --ToDo: The position of metaVar is not correct
-
-
-
-
-
-abstract :: InteractionId -> Maybe Range -> TCM (Expr,[InteractionId])
-abstract ii mr
-
-
-refineExact :: InteractionId -> Expr -> TCM (Expr,[InteractionId])
-refineExact ii e =
-    do
--}
-
-
 {-| Evaluate the given expression in the current environment -}
 evalInCurrent :: Expr -> TCM Expr
 evalInCurrent e =
-    do  t <- newTypeMeta_
-	v <- checkExpr e t
+    do  (v, t) <- inferExpr e
 	v' <- {- etaContract =<< -} normalise v
 	reify v'
 
@@ -201,68 +159,62 @@
 rewrite Normalised   t = {- etaContract =<< -} normalise t
 
 
-data OutputForm a b
+data OutputForm a b = OutputForm ProblemId (OutputConstraint a b)
+  deriving (Functor)
+
+data OutputConstraint a b
       = OfType b a | CmpInType Comparison a b b
-                   | CmpTerms [Polarity] a [b] [b]
+                   | CmpElim [Polarity] a [b] [b]
       | JustType b | CmpTypes Comparison b b
                    | CmpLevels Comparison b b
                    | CmpTeles Comparison b b
       | JustSort b | CmpSorts Comparison b b
-      | Guard (OutputForm a b) [OutputForm a b]
+      | Guard (OutputConstraint a b) ProblemId
       | Assign b a | TypedAssign b a a
-      | IsEmptyType a
+      | IsEmptyType a | FindInScopeOF b
+  deriving (Functor)
 
--- | A subset of 'OutputForm'.
+-- | A subset of 'OutputConstraint'.
 
-data OutputForm' a b = OfType' { ofName :: b
-                               , ofExpr :: a
-                               }
+data OutputConstraint' a b = OfType' { ofName :: b
+                                     , ofExpr :: a
+                                     }
 
 outputFormId :: OutputForm a b -> b
-outputFormId o = case o of
-  OfType i _           -> i
-  CmpInType _ _ i _    -> i
-  CmpTerms _ _ (i:_) _ -> i
-  CmpTerms _ _ [] _    -> __IMPOSSIBLE__
-  JustType i           -> i
-  CmpLevels _ i _      -> i
-  CmpTypes _ i _       -> i
-  CmpTeles _ i _       -> i
-  JustSort i           -> i
-  CmpSorts _ i _       -> i
-  Guard o _            -> outputFormId o
-  Assign i _           -> i
-  TypedAssign i _ _    -> i
-  IsEmptyType _        -> __IMPOSSIBLE__   -- Should never be used on IsEmpty constraints
+outputFormId (OutputForm _ o) = out o
+  where
+    out o = case o of
+      OfType i _           -> i
+      CmpInType _ _ i _    -> i
+      CmpElim _ _ (i:_) _  -> i
+      CmpElim _ _ [] _     -> __IMPOSSIBLE__
+      JustType i           -> i
+      CmpLevels _ i _      -> i
+      CmpTypes _ i _       -> i
+      CmpTeles _ i _       -> i
+      JustSort i           -> i
+      CmpSorts _ i _       -> i
+      Guard o _            -> out o
+      Assign i _           -> i
+      TypedAssign i _ _    -> i
+      IsEmptyType _        -> __IMPOSSIBLE__   -- Should never be used on IsEmpty constraints
+      FindInScopeOF _      -> __IMPOSSIBLE__
 
-instance Functor (OutputForm a) where
-    fmap f (OfType e t)           = OfType (f e) t
-    fmap f (JustType e)           = JustType (f e)
-    fmap f (JustSort e)           = JustSort (f e)
-    fmap f (CmpInType cmp t e e') = CmpInType cmp t (f e) (f e')
-    fmap f (CmpTerms cmp t e e')  = CmpTerms cmp t (map f e) (map f e')
-    fmap f (CmpTypes cmp e e')    = CmpTypes cmp (f e) (f e')
-    fmap f (CmpLevels cmp e e')   = CmpLevels cmp (f e) (f e')
-    fmap f (CmpTeles cmp e e')    = CmpTeles cmp (f e) (f e')
-    fmap f (CmpSorts cmp e e')    = CmpSorts cmp (f e) (f e')
-    fmap f (Guard o os)           = Guard (fmap f o) (fmap (fmap f) os)
-    fmap f (Assign m e)           = Assign (f m) e
-    fmap f (TypedAssign m e a)    = TypedAssign (f m) e a
-    fmap f (IsEmptyType a)        = IsEmptyType a
+instance Reify ProblemConstraint (Closure (OutputForm Expr Expr)) where
+  reify (PConstr pid cl) = enterClosure cl $ \c -> buildClosure =<< (OutputForm pid <$> reify c)
 
-instance Reify Constraint (OutputForm Expr Expr) where
+instance Reify Constraint (OutputConstraint Expr Expr) where
     reify (ValueCmp cmp t u v)   = CmpInType cmp <$> reify t <*> reify u <*> reify v
-    reify (ArgsCmp cmp t u v)    = CmpTerms cmp <$> reify t
-                                                <*> mapM (reify . unArg) u
-                                                <*> mapM (reify . unArg) v
+    reify (ElimCmp cmp t v es1 es2) =
+      CmpElim cmp <$> reify t <*> reify es1
+                              <*> reify es2
     reify (LevelCmp cmp t t')    = CmpLevels cmp <$> reify t <*> reify t'
     reify (TypeCmp cmp t t')     = CmpTypes cmp <$> reify t <*> reify t'
-    reify (TelCmp  cmp t t')     = CmpTeles cmp <$> (ETel <$> reify t) <*> (ETel <$> reify t')
+    reify (TelCmp a b cmp t t')  = CmpTeles cmp <$> (ETel <$> reify t) <*> (ETel <$> reify t')
     reify (SortCmp cmp s s')     = CmpSorts cmp <$> reify s <*> reify s'
-    reify (Guarded c cs) = do
+    reify (Guarded c pid) = do
 	o  <- reify c
-	os <- mapM (withConstraint reify) cs
-	return $ Guard o os
+	return $ Guard o pid
     reify (UnBlock m) = do
         mi <- mvInstantiation <$> lookupMeta m
         case mi of
@@ -275,8 +227,12 @@
             m' <- reify (MetaV m [])
             return $ TypedAssign m' e a
           Open{}  -> __IMPOSSIBLE__
+          OpenIFS{}  -> __IMPOSSIBLE__
           InstS{} -> __IMPOSSIBLE__
           InstV{} -> __IMPOSSIBLE__
+    reify (FindInScope m) = do
+      m' <- reify (MetaV m [])
+      return $ FindInScopeOF m' -- IFSTODO
     reify (IsEmpty a) = IsEmptyType <$> reify a
 
 showComparison :: Comparison -> String
@@ -284,30 +240,39 @@
 showComparison CmpLeq = " =< "
 
 instance (Show a,Show b) => Show (OutputForm a b) where
+  show (OutputForm 0   c) = show c
+  show (OutputForm pid c) = "[" ++ show pid ++ "] " ++ show c
+
+instance (Show a,Show b) => Show (OutputConstraint a b) where
     show (OfType e t)           = show e ++ " : " ++ show t
     show (JustType e)           = "Type " ++ show e
     show (JustSort e)           = "Sort " ++ show e
     show (CmpInType cmp t e e') = show e ++ showComparison cmp ++ show e' ++ " : " ++ show t
-    show (CmpTerms cmp t e e')  = show e ++ "~~" ++ show e' ++ " : " ++ show t
+    show (CmpElim cmp t e e')   = show e ++ " == " ++ show e' ++ " : " ++ show t
     show (CmpTypes  cmp t t')   = show t ++ showComparison cmp ++ show t'
     show (CmpLevels cmp t t')   = show t ++ showComparison cmp ++ show t'
     show (CmpTeles  cmp t t')   = show t ++ showComparison cmp ++ show t'
     show (CmpSorts cmp s s')    = show s ++ showComparison cmp ++ show s'
-    show (Guard o os)           = show o ++ "  if  " ++ show os
+    show (Guard o pid)          = show o ++ " [blocked by problem " ++ show pid ++ "]"
     show (Assign m e)           = show m ++ " := " ++ show e
-    show (TypedAssign m e a)    = show m ++ " := " ++ show e ++ " : " ++ show a
+    show (TypedAssign m e a)    = show m ++ " := " ++ show e ++ " :? " ++ show a
     show (IsEmptyType a)        = "Is empty: " ++ show a
+    show (FindInScopeOF s)      = "Find in Scope: " ++ show s
 
 instance (ToConcrete a c, ToConcrete b d) =>
          ToConcrete (OutputForm a b) (OutputForm c d) where
+    toConcrete (OutputForm pid c) = OutputForm pid <$> toConcrete c
+
+instance (ToConcrete a c, ToConcrete b d) =>
+         ToConcrete (OutputConstraint a b) (OutputConstraint c d) where
     toConcrete (OfType e t) = OfType <$> toConcrete e <*> toConcreteCtx TopCtx t
     toConcrete (JustType e) = JustType <$> toConcrete e
     toConcrete (JustSort e) = JustSort <$> toConcrete e
     toConcrete (CmpInType cmp t e e') =
       CmpInType cmp <$> toConcreteCtx TopCtx t <*> toConcreteCtx ArgumentCtx e
                                                <*> toConcreteCtx ArgumentCtx e'
-    toConcrete (CmpTerms cmp t e e') =
-      CmpTerms cmp <$> toConcreteCtx TopCtx t <*> mapM toConcrete e <*> mapM toConcrete e'
+    toConcrete (CmpElim cmp t e e') =
+      CmpElim cmp <$> toConcreteCtx TopCtx t <*> toConcreteCtx TopCtx e <*> toConcreteCtx TopCtx e'
     toConcrete (CmpTypes cmp e e') = CmpTypes cmp <$> toConcreteCtx ArgumentCtx e
                                                   <*> toConcreteCtx ArgumentCtx e'
     toConcrete (CmpLevels cmp e e') = CmpLevels cmp <$> toConcreteCtx ArgumentCtx e
@@ -315,17 +280,18 @@
     toConcrete (CmpTeles cmp e e') = CmpTeles cmp <$> toConcrete e <*> toConcrete e'
     toConcrete (CmpSorts cmp e e') = CmpSorts cmp <$> toConcreteCtx ArgumentCtx e
                                                   <*> toConcreteCtx ArgumentCtx e'
-    toConcrete (Guard o os) = Guard <$> toConcrete o <*> toConcrete os
-    toConcrete (Assign m e) = Assign <$> toConcrete m <*> toConcreteCtx TopCtx e
+    toConcrete (Guard o pid) = Guard <$> toConcrete o <*> pure pid
+    toConcrete (Assign m e) = noTakenNames $ Assign <$> toConcrete m <*> toConcreteCtx TopCtx e
     toConcrete (TypedAssign m e a) = TypedAssign <$> toConcrete m <*> toConcreteCtx TopCtx e
                                                                   <*> toConcreteCtx TopCtx a
     toConcrete (IsEmptyType a) = IsEmptyType <$> toConcreteCtx TopCtx a
+    toConcrete (FindInScopeOF s) = FindInScopeOF <$> toConcrete s
 
-instance (Pretty a, Pretty b) => Pretty (OutputForm' a b) where
+instance (Pretty a, Pretty b) => Pretty (OutputConstraint' a b) where
   pretty (OfType' e t) = pretty e <+> text ":" <+> pretty t
 
 instance (ToConcrete a c, ToConcrete b d) =>
-            ToConcrete (OutputForm' a b) (OutputForm' c d) where
+            ToConcrete (OutputConstraint' a b) (OutputConstraint' c d) where
   toConcrete (OfType' e t) = OfType' <$> toConcrete e <*> toConcreteCtx TopCtx t
 
 --ToDo: Move somewhere else
@@ -334,21 +300,16 @@
 instance ToConcrete MetaId C.Expr where
     toConcrete (MetaId i) = return $ C.Underscore noRange (Just i)
 
-judgToOutputForm :: Judgement a c -> OutputForm a c
+judgToOutputForm :: Judgement a c -> OutputConstraint a c
 judgToOutputForm (HasType e t) = OfType e t
-judgToOutputForm (IsSort s)    = JustSort s
-
---- Printing Operations
-getConstraint :: Int -> TCM (OutputForm Expr Expr)
-getConstraint ci =
-    do  cc <- lookupConstraint ci
-        cc <- reduce cc
-        withConstraint reify cc
-
+judgToOutputForm (IsSort  s t) = JustSort s
 
 getConstraints :: TCM [OutputForm C.Expr C.Expr]
 getConstraints = liftTCM $ do
-    cs <- mapM (withConstraint (abstractToConcrete_ <.> reify)) =<< reduce =<< M.getConstraints
+    cs <- M.getAllConstraints
+    cs <- forM cs $ \c -> do
+            cl <- reify c
+            enterClosure cl abstractToConcrete_
     ss <- mapM toOutputForm =<< getSolvedInteractionPoints
     return $ ss ++ cs
   where
@@ -356,7 +317,7 @@
       mv <- getMetaInfo <$> lookupMeta mi
       withMetaInfo mv $ do
         let m = QuestionMark $ MetaInfo noRange emptyScopeInfo (Just $ fromIntegral ii)
-        abstractToConcrete_ $ Assign m e
+        abstractToConcrete_ $ OutputForm 0 $ Assign m e
 
 getSolvedInteractionPoints :: TCM [(InteractionId, MetaId, Expr)]
 getSolvedInteractionPoints = do
@@ -373,12 +334,13 @@
             unsol = return []
         case mvInstantiation mv of
           InstV{}                        -> sol (MetaV m args)
-          InstS{}                        -> sol (Sort $ MetaS m args)
+          InstS{}                        -> sol (Level $ Max [Plus 0 $ MetaLevel m args])
           Open{}                         -> unsol
+          OpenIFS{}                         -> unsol
           BlockedConst{}                 -> unsol
           PostponedTypeCheckingProblem{} -> unsol
 
-typeOfMetaMI :: Rewrite -> MetaId -> TCM (OutputForm Expr MetaId)
+typeOfMetaMI :: Rewrite -> MetaId -> TCM (OutputConstraint Expr MetaId)
 typeOfMetaMI norm mi =
      do mv <- lookupMeta mi
 	withMetaInfo (getMetaInfo mv) $
@@ -396,20 +358,20 @@
           ]
         ]
       OfType i <$> reify (t `piApply` permute (takeP (size vs) $ mvPermutation mv) vs)
-    rewriteJudg mv (IsSort i) = return $ JustSort i
+    rewriteJudg mv (IsSort i t) = return $ JustSort i
 
 
-typeOfMeta :: Rewrite -> InteractionId -> TCM (OutputForm Expr InteractionId)
+typeOfMeta :: Rewrite -> InteractionId -> TCM (OutputConstraint Expr InteractionId)
 typeOfMeta norm ii =
      do mi <- lookupInteractionId ii
         out <- typeOfMetaMI norm mi
         return $ fmap (\_ -> ii) out
 
-typesOfVisibleMetas :: Rewrite -> TCM [OutputForm Expr InteractionId]
+typesOfVisibleMetas :: Rewrite -> TCM [OutputConstraint Expr InteractionId]
 typesOfVisibleMetas norm =
   liftTCM $ mapM (typeOfMeta norm) =<< getInteractionPoints
 
-typesOfHiddenMetas :: Rewrite -> TCM [OutputForm Expr MetaId]
+typesOfHiddenMetas :: Rewrite -> TCM [OutputConstraint Expr MetaId]
 typesOfHiddenMetas norm = liftTCM $ do
   is    <- getInteractionMetas
   store <- Map.filterWithKey (openAndImplicit is) <$> getMetaStore
@@ -421,7 +383,7 @@
 
 -- Gives a list of names and corresponding types.
 
-contextOfMeta :: InteractionId -> Rewrite -> TCM [OutputForm' Expr Name]
+contextOfMeta :: InteractionId -> Rewrite -> TCM [OutputConstraint' Expr Name]
 contextOfMeta ii norm = do
   info <- getMetaInfo <$> (lookupMeta =<< lookupInteractionId ii)
   let localVars = map ctxEntry . envContext . clEnv $ info
@@ -437,10 +399,12 @@
           return $ OfType x t'
 
 
-{-| Returns the type of the expression in the current environment -}
+-- | Returns the type of the expression in the current environment
+--   We wake up irrelevant variables just in case the user want to
+--   invoke that command in an irrelevant context.
 typeInCurrent :: Rewrite -> Expr -> TCM Expr
 typeInCurrent norm e =
-    do 	(_,t) <- inferExpr e
+    do 	(_,t) <- wakeIrrelevantVars $ inferExpr e
         v <- rewrite norm t
         reify v
 
@@ -538,7 +502,7 @@
 -- of the top-level module.
 
 atTopLevel :: TCM a -> TCM a
-atTopLevel m = do
+atTopLevel m = inConcreteMode $ do
   mCurrent <- stCurrentModule <$> get
   case mCurrent of
     Nothing      -> typeError $
@@ -548,10 +512,13 @@
       case r of
         Nothing -> __IMPOSSIBLE__
         Just mi -> do
+          let scope = iInsideScope $ miInterface mi
           tel <- lookupSection current
           M.withCurrentModule current $
-            withScope_ (iInsideScope $ miInterface mi) $
-              addCtxTel tel $
+            withScope_ scope $
+              addContext (zipWith' (fmap . (,))
+                                   (map snd $ scopeLocals scope)
+                                   (map (fmap snd) $ telToList tel)) $
                 m
 
 -- | Returns the contents of the given module.
diff --git a/src/full/Agda/Interaction/CommandLine/CommandLine.hs b/src/full/Agda/Interaction/CommandLine/CommandLine.hs
--- a/src/full/Agda/Interaction/CommandLine/CommandLine.hs
+++ b/src/full/Agda/Interaction/CommandLine/CommandLine.hs
@@ -77,7 +77,7 @@
 		    Just _ ->
 			do  go =<< liftTCM (eval $ fromJust ms)
 	    `catchError` \e ->
-		do  s <- prettyError e
+		do  s <- liftTCM $ prettyError e
 		    liftIO $ LocIO.putStrLn s
 		    loop
 
@@ -133,11 +133,6 @@
 loadFile _ _ = liftIO $ LocIO.putStrLn ":load file"
 
 showConstraints :: [String] -> TCM ()
-showConstraints [c] =
-    do	i  <- readM c
-	cc <- normalise =<< lookupConstraint i
-	d  <- prettyTCM $ clValue cc
-	liftIO $ LocIO.print d
 showConstraints [] =
     do	cs <- BasicOps.getConstraints
 	liftIO $ LocIO.putStrLn $ unlines (List.map show cs)
@@ -164,8 +159,8 @@
         mapM_ (liftIO . LocIO.putStrLn) =<< mapM showII interactionMetas
 	mapM_ print' hiddenMetas
     where
-	showII o = withInteractionId (outputFormId o) $ showA o
-	showM  o = withMetaId (outputFormId o) $ showA o
+	showII o = withInteractionId (outputFormId $ OutputForm 0 o) $ showA o
+	showM  o = withMetaId (outputFormId $ OutputForm 0 o) $ showA o
 
 	metaId (OfType i _) = i
 	metaId (JustType i) = i
@@ -222,7 +217,7 @@
 
 
 retryConstraints :: TCM ()
-retryConstraints = liftTCM wakeupConstraints
+retryConstraints = liftTCM wakeupConstraints_
 
 
 evalIn :: [String] -> TCM ()
@@ -245,9 +240,8 @@
 	return Continue
     where
 	evalInCurrent e = do
-	  t <- newTypeMeta_
-	  v <- checkExpr e t
-	  v' <- normalise v
+	  (v,t) <- inferExpr e
+	  v'    <- normalise v
 	  return v'
 
 
@@ -261,7 +255,7 @@
 typeIn :: [String] -> TCM ()
 typeIn s@(_:_:_) =
     actOnMeta s $ \i e ->
-    do	e1  <- typeInMeta i Normalised e
+    do	e1 <- typeInMeta i Normalised e
         e2 <- typeInMeta i AsIs e
 	liftIO . LocIO.putStrLn =<< showA e1
 typeIn _ = liftIO $ LocIO.putStrLn ":typeIn meta expr"
diff --git a/src/full/Agda/Interaction/EmacsCommand.hs b/src/full/Agda/Interaction/EmacsCommand.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Interaction/EmacsCommand.hs
@@ -0,0 +1,45 @@
+------------------------------------------------------------------------
+-- | Low-level code for instructing Emacs to do things
+------------------------------------------------------------------------
+
+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
+
+module Agda.Interaction.EmacsCommand
+  ( Lisp(..)
+  , putResponse
+  ) where
+
+import qualified Agda.Utils.IO.Locale as LocIO
+import Agda.Utils.Pretty
+
+-- | Simple Emacs Lisp expressions.
+
+data Lisp a
+  = A a
+    -- ^ Atom.
+  | Cons (Lisp a) (Lisp a)
+    -- Cons cell.
+  | L [Lisp a]
+    -- ^ List.
+  | Q (Lisp a)
+    -- Quoted expression.
+
+instance Pretty a => Pretty (Lisp a) where
+  pretty (A a )     = pretty a
+  pretty (Cons a b) = parens (pretty a <+> text "." <+> pretty b)
+  pretty (L xs)     = parens (hsep (map pretty xs))
+  pretty (Q x)      = text "'" <> pretty x
+
+instance Pretty String where pretty = text
+
+instance Pretty a => Show (Lisp a) where show = show . pretty
+
+-- | Formats a response command.
+
+response :: Lisp String -> String
+response l = show (text "agda2_mode_code" <+> pretty l)
+
+-- | Writes a response command to standard output.
+
+putResponse :: Lisp String -> IO ()
+putResponse = LocIO.putStrLn . response
diff --git a/src/full/Agda/Interaction/GhciTop.hs b/src/full/Agda/Interaction/GhciTop.hs
--- a/src/full/Agda/Interaction/GhciTop.hs
+++ b/src/full/Agda/Interaction/GhciTop.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP, TypeSynonymInstances #-}
+{-# LANGUAGE CPP, TypeSynonymInstances, FlexibleInstances #-}
 {-# OPTIONS -fno-cse #-}
 
 module Agda.Interaction.GhciTop
@@ -42,7 +42,6 @@
 import Agda.Utils.FileName
 import qualified Agda.Utils.Trie as Trie
 import Agda.Utils.Tuple
-import qualified Agda.Utils.IO.Locale as LocIO
 import qualified Agda.Utils.IO.UTF8 as UTF8
 
 import Control.Monad.Error
@@ -63,8 +62,8 @@
 import Agda.TypeChecking.MetaVars
 import Agda.TypeChecking.Reduce
 import Agda.TypeChecking.Errors
-import Agda.TypeChecking.Serialise (encodeFile)
 
+import Agda.Syntax.Fixity
 import Agda.Syntax.Position
 import Agda.Syntax.Parser
 import qualified Agda.Syntax.Parser.Tokens as T
@@ -83,12 +82,12 @@
 import Agda.Syntax.Translation.InternalToAbstract
 import Agda.Syntax.Abstract.Name
 
+import Agda.Interaction.EmacsCommand
 import Agda.Interaction.Exceptions
 import Agda.Interaction.FindFile
 import Agda.Interaction.Options
 import Agda.Interaction.MakeCase
 import qualified Agda.Interaction.BasicOps as B
-import qualified Agda.Interaction.CommandLine.CommandLine as CL
 import Agda.Interaction.Highlighting.Emacs
 import Agda.Interaction.Highlighting.Generate
 import qualified Agda.Interaction.Imports as Imp
@@ -97,6 +96,7 @@
 
 import qualified Agda.Compiler.Epic.Compiler as Epic
 import qualified Agda.Compiler.MAlonzo.Compiler as MAlonzo
+import qualified Agda.Compiler.JS.Compiler as JS
 
 import qualified Agda.Auto.Auto as Auto
 
@@ -173,7 +173,7 @@
     Left err -> do
       Right doc <- runTCM $ prettyTCM err
       putStrLn $ render doc
-      return $ undefined
+      return __IMPOSSIBLE__
 {-
   Right (x, s) <- runTCM $ do
     put $ theTCState tcs
@@ -205,9 +205,7 @@
   current <- absolute current
 
   -- Read the state.
-  State { theTCState     = st
-        , theCurrentFile = f
-        } <- readIORef theState
+  State { theTCState = st } <- readIORef theState
 
   -- Run the computation.
   r <- runTCM $ catchError (do
@@ -227,20 +225,31 @@
            st <- get
            return (Right (x, st))
          ) (\e -> do
-           s <- prettyError e
-           return (Left (s, e))
+           pers <- stPersistent <$> get
+           s    <- prettyError e
+           return (Left (pers, s, e))
          )
 
-  -- Update the state.
+  -- Upon success: update the state. Upon failure: update the
+  -- persistent state, and, for independent commands, the current
+  -- file.
   case r of
     Right (Right (m, st')) ->
       modifyIORef theState $ \s ->
-        s { theTCState   = st'
+        s { theTCState = st'
           }
-    _ | isIndependent cmd ->
+    Right (Left (pers, _, _)) -> do
       modifyIORef theState $ \s ->
-        s { theCurrentFile = Nothing }
-    _ -> return ()
+        s { theTCState = (theTCState s) { stPersistent = pers }
+          }
+    Left _ -> return ()
+  when (isIndependent cmd) $
+    case r of
+      Right (Right _) -> return ()
+      _               ->
+        modifyIORef theState $ \s ->
+          s { theCurrentFile = Nothing
+            }
 
   -- Write out syntax highlighting info.
   case highlightingFile of
@@ -260,8 +269,8 @@
               return ( iHighlighting $ miInterface mi
                      , stModuleToSource st'
                      )
-            Right (Left (s, e)) -> errHi e (Just s)
-            Left e              -> errHi e Nothing
+            Right (Left (_ , s, e)) -> errHi e (Just s)
+            Left e                  -> errHi e Nothing
 
   -- If an error was encountered, display an error message and exit
   -- with an error code; otherwise, inform Emacs about the buffer's
@@ -271,15 +280,15 @@
                              optShowImplicit $ stPragmaOptions st
                          }
   case r of
-    Right (Left (s, e)) -> displayErrorAndExit errStatus (getRange e) s
-    Left e              -> displayErrorAndExit errStatus (getRange e) $
-                             tcErrString e
-    Right (Right _)     -> do
+    Right (Left (_, s, e)) -> displayErrorAndExit errStatus (getRange e) s
+    Left e                 -> displayErrorAndExit errStatus (getRange e) $
+                                tcErrString e
+    Right (Right _)        -> do
       f <- theCurrentFile <$> readIORef theState
       case f of
         Just (f, _) | f === current -> do
           is <- theInteractionPoints <$> liftIO (readIORef theState)
-          liftIO $ LocIO.putStrLn $ response $
+          liftIO $ putResponse $
             L [A "agda2-goals-action", Q $ L $ List.map showNumIId is]
         _ -> return ()
 
@@ -315,7 +324,7 @@
     -- All options (except for the verbosity setting) are reset when a
     -- file is reloaded, including the choice of whether or not to
     -- display implicit arguments. (At this point the include
-    -- directories have already been reset, so they are preserved.)
+    -- directories have already been set, so they are preserved.)
     opts <- commandLineOptions
     setCommandLineOptions $
       defaultOptions { optIncludeDirs   = optIncludeDirs opts
@@ -327,9 +336,9 @@
                      }
 
     -- Reset the state, preserving options and decoded modules. Note
-    -- that Imp.typeCheck resets the decoded modules if the include
-    -- directories have changed.
-    preserveDecodedModules resetState
+    -- that if the include directories have changed, then the decoded
+    -- modules are reset when cmd_load' is run by ioTCM.
+    resetState
 
     ok <- Imp.typeCheck f
 
@@ -352,7 +361,7 @@
 
 -- | Available backends.
 
-data Backend = MAlonzo | Epic
+data Backend = MAlonzo | Epic | JS
 
 -- | @cmd_compile b m includes@ compiles the module in file @m@ using
 -- the backend @b@, using @includes@ as the include directories.
@@ -365,6 +374,7 @@
         case b of
           MAlonzo -> MAlonzo.compilerMain i
           Epic    -> Epic.compilerMain i
+          JS      -> JS.compilerMain i
         display_info "*Compilation result*"
                      "The module was successfully compiled."
       Just w ->
@@ -388,7 +398,7 @@
   hms <- B.typesOfHiddenMetas B.Normalised
   if not $ null ims && null hms
     then do
-      di <- mapM (\i -> B.withInteractionId (B.outputFormId i) (showATop i)) ims
+      di <- mapM (\i -> B.withInteractionId (B.outputFormId $ B.OutputForm 0 i) (showATop i)) ims
       dh <- mapM showA' hms
       display_info "*All Goals*" $ unlines $ di ++ dh
       return Nothing
@@ -405,7 +415,7 @@
     metaId _ = __IMPOSSIBLE__
     showA' m = do
       r <- getMetaRange (metaId m)
-      d <- B.withMetaId (B.outputFormId m) (showATop m)
+      d <- B.withMetaId (B.outputFormId $ B.OutputForm 0 m) (showATop m)
       return $ d ++ "  [ at " ++ show r ++ " ]"
 
 -- | If the range is 'noRange', then the string comes from the
@@ -434,8 +444,7 @@
   liftIO $ modifyIORef theState $ \s ->
              s { theInteractionPoints =
                    replace ii iis (theInteractionPoints s) }
-  liftIO $ LocIO.putStrLn $ response $
-             L [A "agda2-give-action", showNumIId ii, newtxt]
+  liftIO $ putResponse $ L [A "agda2-give-action", showNumIId ii, newtxt]
   command cmd_metas
   return Nothing
   where
@@ -472,7 +481,7 @@
     mapM_ (\(ii, s) -> do
       liftIO $ modifyIORef theState $ \s ->
         s { theInteractionPoints = filter (/= ii) (theInteractionPoints s) }
-      liftIO $ LocIO.putStrLn $ response $ L [A "agda2-give-action", showNumIId ii, A $ quote s]
+      liftIO $ putResponse $ L [A "agda2-give-action", showNumIId ii, A $ quote s]
      ) xs
     case msg of
      Nothing -> command cmd_metas >> return ()
@@ -482,7 +491,7 @@
     case msg of
      Nothing -> return ()
      Just msg -> display_info "*Auto*" msg
-    liftIO $ LocIO.putStrLn $ response $
+    liftIO $ putResponse $
      Cons (A "last")
           (L [ A "agda2-make-case-action",
                Q $ L $ List.map (A . quote) cs
@@ -518,7 +527,7 @@
   es  <- mapM (prettyATop . B.ofExpr) ctx
   ns  <- mapM (showATop   . B.ofName) ctx
   let shuffle = if rev then reverse else id
-  return $ align 10 $ shuffle $ zip ns (map (text ":" <+>) es)
+  return $ align 10 $ filter (not . null. fst) $ shuffle $ zip ns (map (text ":" <+>) es)
 
 cmd_context :: B.Rewrite -> GoalCommand
 cmd_context norm ii _ _ = Interaction Dependent $ do
@@ -655,15 +664,14 @@
 
 displayStatus :: Status -> IO ()
 displayStatus s =
-  LocIO.putStrLn $ response $
-    L [A "agda2-status-action", A (quote $ showStatus s)]
+  putResponse $ L [A "agda2-status-action", A (quote $ showStatus s)]
 
 -- | @display_info' header content@ displays @content@ (with header
 -- @header@) in some suitable way.
 
 display_info' :: String -> String -> IO ()
 display_info' bufname content =
-  LocIO.putStrLn $ response $
+  putResponse $
     L [ A "agda2-info-action"
       , A (quote bufname)
       , A (quote content)
@@ -683,23 +691,6 @@
 display_infoD :: String -> Doc -> TCM ()
 display_infoD bufname content = display_info bufname (render content)
 
--- | Formats a response command.
-
-response :: Lisp String -> String
-response l = show (text "agda2_mode_code" <+> pretty l)
-
-data Lisp a = A a | L [Lisp a] | Q (Lisp a) | Cons (Lisp a) (Lisp a)
-
-instance Pretty a => Pretty (Lisp a) where
-  pretty (A a )     = pretty a
-  pretty (L xs)     = parens (sep (List.map pretty xs))
-  pretty (Q x)      = text "'" <> pretty x
-  pretty (Cons a b) = parens (pretty a <+> text "." <+> pretty b)
-
-instance Pretty String where pretty = text
-
-instance Pretty a => Show (Lisp a) where show = show . pretty
-
 showNumIId = A . tail . show
 
 takenNameStr :: TCM [String]
@@ -722,21 +713,40 @@
 
 cmd_make_case :: GoalCommand
 cmd_make_case ii rng s = Interaction Dependent $ do
-  cs <- makeCase ii rng s
+  (casectxt , cs) <- makeCase ii rng s
   B.withInteractionId ii $ do
-    pcs <- mapM prettyA cs
-    liftIO $ LocIO.putStrLn $ response $
+    hidden <- showImplicitArguments
+    pcs <- mapM prettyA $ List.map (extlam_dropLLifted casectxt hidden) cs
+    liftIO $ putResponse $
       Cons (A "last")
-           (L [ A "agda2-make-case-action"
-              , Q $ L $ List.map (A . quote . render) pcs
+           (L [ A (emacscmd casectxt)
+              , Q $ L $ List.map (A . quote . (extlam_dropName casectxt) . render) pcs
               ])
   return Nothing
-  where render = renderStyle (style { mode = OneLineMode })
+  where
+    render = renderStyle (style { mode = OneLineMode })
+    emacscmd :: CaseContext -> String
+    emacscmd FunctionDef = "agda2-make-case-action"
+    emacscmd (ExtendedLambda _ _) = "agda2-make-case-action-extendlam"
 
+    -- Drops pattern added to extended lambda functions when lambda lifting them
+    extlam_dropLLifted :: CaseContext -> Bool -> SA.Clause -> SA.Clause
+    extlam_dropLLifted FunctionDef _ x = x
+    extlam_dropLLifted (ExtendedLambda h nh) hidden (SA.Clause (SA.LHS info name nps ps) rhs decl)
+      = let n = if hidden then h else nh
+        in
+         (SA.Clause (SA.LHS info name (drop n nps) ps) rhs decl)
+
+    -- very dirty hack, string manipulation by dropping the function name
+    -- and replacing " = " with " -> "
+    extlam_dropName :: CaseContext -> String -> String
+    extlam_dropName FunctionDef x = x
+    extlam_dropName (ExtendedLambda _ _) x = unwords $ map (\ y -> if y == "=" then "→" else y) $ drop 1 $ words x
+
 cmd_solveAll :: Interaction
 cmd_solveAll = Interaction Dependent $ do
   out <- getInsts
-  liftIO $ LocIO.putStrLn $ response $
+  liftIO $ putResponse $
     Cons (A "last")
          (L [ A "agda2-solveAll-action"
             , Q . L $ concatMap prn out
@@ -747,7 +757,7 @@
     where
       lowr (i, m, e) = do
         mi <- getMetaInfo <$> lookupMeta m
-        e <- withMetaInfo mi $ lowerMeta <$> abstractToConcrete_ e
+        e <- withMetaInfo mi $ lowerMeta <$> abstractToConcreteCtx TopCtx e
         return (i, e)
   prn (ii,e)= [showNumIId ii, A $ quote $ show e]
 
@@ -766,6 +776,7 @@
       SC.WithApp r e es	   -> SC.WithApp r (lowerMeta e) (lowerMeta es)
       SC.Lam r bs e1       -> SC.Lam r (lowerMeta bs) (go e1)
       SC.AbsurdLam r h     -> SC.AbsurdLam r h
+      SC.ExtendedLam r cs  -> SC.ExtendedLam r cs
       SC.Fun r ae1 e2      -> SC.Fun r (lowerMeta ae1) (go e2)
       SC.Pi tb e1          -> SC.Pi (lowerMeta tb) (go e1)
       SC.Set _             -> e
@@ -782,12 +793,22 @@
       SC.RawApp r es	-> SC.RawApp r (lowerMeta es)
       SC.OpApp r x es	-> SC.OpApp r x (lowerMeta es)
       SC.Rec r fs	-> SC.Rec r (List.map (id -*- lowerMeta) fs)
+      SC.RecUpdate r e fs -> SC.RecUpdate r (lowerMeta e) (List.map (id -*- lowerMeta) fs)
       SC.HiddenArg r e	-> SC.HiddenArg r (lowerMeta e)
+      SC.InstanceArg r e  -> SC.InstanceArg r (lowerMeta e)
       SC.QuoteGoal r x e  -> SC.QuoteGoal r x (lowerMeta e)
-      SC.Quote r        -> SC.Quote r
+      e@SC.Quote{}      -> e
+      e@SC.QuoteTerm{}  -> e
+      e@SC.Unquote{}    -> e
+      SC.DontCare e     -> SC.DontCare (lowerMeta e)
 
+instance LowerMeta (OpApp SC.Expr) where
+  lowerMeta (Ordinary e) = Ordinary $ lowerMeta e
+  lowerMeta (SyntaxBindingLambda r bs e) = SyntaxBindingLambda r (lowerMeta bs) (lowerMeta e)
+
+
 instance LowerMeta SC.LamBinding where
-  lowerMeta b@(SC.DomainFree _ _) = b
+  lowerMeta b@(SC.DomainFree _ _ _) = b
   lowerMeta (SC.DomainFull tb)    = SC.DomainFull (lowerMeta tb)
 
 instance LowerMeta SC.TypedBindings where
@@ -801,19 +822,27 @@
     lowerMeta (SC.RHS e)    = SC.RHS (lowerMeta e)
     lowerMeta  SC.AbsurdRHS = SC.AbsurdRHS
 
+instance LowerMeta (Maybe SC.Expr) where
+    lowerMeta (Just e) = Just (lowerMeta e)
+    lowerMeta Nothing  = Nothing
+
 instance LowerMeta SC.Declaration where
   lowerMeta = go where
     go d = case d of
       TypeSig rel n e1              -> TypeSig rel n (lowerMeta e1)
       SC.Field n e1                 -> SC.Field n (lowerMeta e1)
       FunClause lhs rhs whcl        -> FunClause lhs (lowerMeta rhs) (lowerMeta whcl)
+      SC.DataSig r ind n tel e1     -> SC.DataSig r ind n
+                                         (lowerMeta tel) (lowerMeta e1)
       Data r ind n tel e1 cs        -> Data r ind n
                                          (lowerMeta tel) (lowerMeta e1) (lowerMeta cs)
+      SC.RecordSig r n tel e1       -> SC.RecordSig r n
+                                         (lowerMeta tel) (lowerMeta e1)
       SC.Record r n c tel e1 cs     -> SC.Record r n c
                                          (lowerMeta tel) (lowerMeta e1) (lowerMeta cs)
       Infix _ _                     -> d
       Syntax _ _                     -> d
-      Mutual r ds                   -> Mutual r (lowerMeta ds)
+      SC.Mutual r ds                -> SC.Mutual r (lowerMeta ds)
       Abstract r ds                 -> Abstract r (lowerMeta ds)
       Private r ds                  -> Private r (lowerMeta ds)
       Postulate r sigs              -> Postulate r (lowerMeta sigs)
@@ -821,10 +850,14 @@
       SC.Open _ _ _                 -> d
       SC.Import _ _ _ _ _           -> d
       SC.Pragma _                   -> d
-      ModuleMacro r n tel e1 op dir -> ModuleMacro r n
-                                         (lowerMeta tel) (lowerMeta e1) op dir
+      ModuleMacro r n modapp op dir -> ModuleMacro r n
+                                         (lowerMeta modapp) op dir
       SC.Module r qn tel ds         -> SC.Module r qn (lowerMeta tel) (lowerMeta ds)
 
+instance LowerMeta SC.ModuleApplication where
+  lowerMeta (SC.SectionApp r tel e) = SC.SectionApp r (lowerMeta tel) (lowerMeta e)
+  lowerMeta (SC.RecordModuleIFS r rec) = SC.RecordModuleIFS r rec
+
 instance LowerMeta SC.WhereClause where
   lowerMeta SC.NoWhere		= SC.NoWhere
   lowerMeta (SC.AnyWhere ds)	= SC.AnyWhere $ lowerMeta ds
@@ -944,7 +977,7 @@
     Nothing                                    -> return ()
     Just (Pn { srcFile = Nothing })            -> return ()
     Just (Pn { srcFile = Just f, posPos = p }) ->
-      LocIO.putStrLn $ response $
+      putResponse $
         L [ A "annotation-goto"
           , Q $ L [A (quote $ filePath f), A ".", A (show p)]
           ]
diff --git a/src/full/Agda/Interaction/Highlighting/Dot.hs b/src/full/Agda/Interaction/Highlighting/Dot.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Interaction/Highlighting/Dot.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE CPP #-}
+module Agda.Interaction.Highlighting.Dot where
+
+import Control.Applicative
+import Control.Monad.State
+
+import qualified Data.Map as M
+import Data.Map(Map)
+import Data.Maybe
+import Data.Monoid
+
+import qualified Data.Set as S
+import Data.Set (Set)
+
+import System.Directory
+import System.FilePath
+
+import qualified Agda.Syntax.Concrete.Name as CN
+import Agda.Interaction.FindFile
+import Agda.Interaction.Options
+import Agda.Syntax.Abstract
+import Agda.Syntax.Abstract.Name
+import Agda.TypeChecking.Monad
+
+import Agda.Utils.FileName
+
+
+#include "../../undefined.h"
+import Agda.Utils.Impossible
+
+data DotState = DotState
+  { dsModules    :: Map ModuleName String
+  , dsNameSupply :: [String]
+  , dsConnection :: Set (String, String)
+  }
+
+initialDotState :: DotState
+initialDotState = DotState
+  { dsModules    = mempty
+  , dsNameSupply = map (('m':) . show) [0..]
+  , dsConnection = mempty
+  }
+
+type DotM = StateT DotState TCM
+
+addModule :: ModuleName -> DotM (String, Bool)
+addModule m = do
+    s <- get
+    case M.lookup m (dsModules s) of
+        Just r  -> return (r, False)
+        Nothing -> do
+            let newName:nameSupply = dsNameSupply s
+            put s
+              { dsModules = M.insert m newName (dsModules s)
+              , dsNameSupply = nameSupply
+              }
+            return (newName, True)
+
+
+addConnection :: String -> String -> DotM ()
+addConnection m1 m2 = modify $ \s -> s {dsConnection = S.insert (m1,m2) (dsConnection s)}
+
+dottify :: Interface -> DotM String
+dottify inter = do
+    let curModule = iModuleName inter
+    (name, continue) <- addModule curModule
+    importsifs <- lift $ map miInterface . catMaybes <$> mapM (getVisitedModule . toTopLevelModuleName) (iImportedModules inter)
+    when continue $ do
+        imports    <- mapM dottify importsifs
+        mapM_ (addConnection name) imports
+    return name
+
+
+generateDot :: Interface -> TCM ()
+generateDot inter = do
+    (top, state) <- flip runStateT initialDotState $ do
+        dottify inter
+    mfile <- optDependencyGraph <$> commandLineOptions
+    case mfile of
+        Nothing -> __IMPOSSIBLE__
+        Just fp -> liftIO $ writeFile fp $ mkDot state
+  where
+    mkDot :: DotState -> String
+    mkDot st = unlines $
+        [ "digraph dependencies {"
+        ] ++ ["   " ++ repr ++ "[label=\"" ++ show modulename ++ "\"];"
+             | (modulename, repr) <- M.toList (dsModules st)]
+          ++ ["   " ++ r1 ++ " -> " ++ r2 ++ ";"
+             | (r1 , r2) <- S.toList (dsConnection st) ]
+          ++ ["}"]
diff --git a/src/full/Agda/Interaction/Highlighting/Emacs.hs b/src/full/Agda/Interaction/Highlighting/Emacs.hs
--- a/src/full/Agda/Interaction/Highlighting/Emacs.hs
+++ b/src/full/Agda/Interaction/Highlighting/Emacs.hs
@@ -10,7 +10,6 @@
 import Agda.Interaction.FindFile
 import Agda.Interaction.Highlighting.Precise
 import Agda.Interaction.Highlighting.Range
-import Agda.Interaction.Highlighting.Generate
 import Agda.Syntax.Abstract (QName)
 import Agda.Syntax.Common
 import qualified Agda.Syntax.Position as P
diff --git a/src/full/Agda/Interaction/Highlighting/Generate.hs b/src/full/Agda/Interaction/Highlighting/Generate.hs
--- a/src/full/Agda/Interaction/Highlighting/Generate.hs
+++ b/src/full/Agda/Interaction/Highlighting/Generate.hs
@@ -37,7 +37,6 @@
 import Control.Monad.State
 import Control.Applicative
 import Data.Monoid
-import Data.Generics
 import Data.Function
 import Agda.Utils.Generics
 import Agda.Utils.FileName
@@ -45,7 +44,7 @@
 import qualified Data.Map as Map
 import Data.Maybe
 import Data.Sequence (Seq, (><))
-import Data.List ((\\))
+import Data.List ((\\), isPrefixOf)
 import qualified Data.Sequence as Seq
 import qualified Data.Foldable as Fold (toList, fold, foldMap)
 
@@ -81,20 +80,17 @@
 -- | Generates syntax highlighting information.
 
 generateSyntaxInfo
-  :: AbsolutePath           -- ^ The module to highlight.
-  -> Maybe TCErr            -- ^ 'Nothing' if the module has been
-                            --   successfully type checked (perhaps
-                            --   with warnings), otherwise the
-                            --   offending error.
-                            --
-                            --   Precondition: The range of the error
-                            --   must match the file name given in the
-                            --   previous argument.
-  -> CA.TopLevelInfo        -- ^ The abstract syntax of the module.
-  -> [([A.QName], [Range])] -- ^ Functions which failed to termination
-                            --   check (grouped if they are mutual),
-                            --   along with ranges for problematic
-                            --   call sites.
+  :: AbsolutePath          -- ^ The module to highlight.
+  -> Maybe TCErr           -- ^ 'Nothing' if the module has been
+                           --   successfully type checked (perhaps
+                           --   with warnings), otherwise the
+                           --   offending error.
+                           --
+                           --   Precondition: The range of the error
+                           --   must match the file name given in the
+                           --   previous argument.
+  -> CA.TopLevelInfo       -- ^ The abstract syntax of the module.
+  -> [M.TerminationError]  -- ^ Termination checking problems.
   -> TCM HighlightingInfo
 generateSyntaxInfo file mErr top termErrs = do
   reportSLn "import.iface.create" 15  $
@@ -151,7 +147,6 @@
       tokenToFile (T.TokKeyword T.KwForall i)      = aToF Symbol (P.getRange i)
       tokenToFile (T.TokKeyword _ i)               = aToF Keyword (P.getRange i)
       tokenToFile (T.TokSymbol  _ i)               = aToF Symbol (P.getRange i)
-      tokenToFile (T.TokLiteral (L.LitLevel  r _)) = aToF Number r
       tokenToFile (T.TokLiteral (L.LitInt    r _)) = aToF Number r
       tokenToFile (T.TokLiteral (L.LitFloat  r _)) = aToF Number r
       tokenToFile (T.TokLiteral (L.LitString r _)) = aToF String r
@@ -169,9 +164,9 @@
       where
       m            = mempty { otherAspects = [TerminationProblem] }
       functionDefs = Fold.foldMap (\x -> several (rToR $ bindingSite x) m) $
-                     concatMap fst termErrs
-      callSites    = Fold.foldMap (\r -> singleton r m) $
-                     concatMap snd termErrs
+                     concatMap M.termErrFunctions termErrs
+      callSites    = Fold.foldMap (\r -> several (rToR r) m) $
+                     concatMap (map M.callInfoRange . M.termErrCalls) termErrs
 
     -- All names mentioned in the syntax tree (not bound variables).
     names = everything' (><) (Seq.empty `mkQ`  getName
@@ -179,8 +174,10 @@
                         decls
       where
       getName :: A.QName -> Seq A.AmbiguousQName
-      getName n = Seq.singleton (A.AmbQ [n])
+      getName n | isPrefixOf extendlambdaname $ show $ A.qnameName n = mempty
+                | otherwise                                          = Seq.singleton (A.AmbQ [n])
 
+
       getAmbiguous :: A.AmbiguousQName -> Seq A.AmbiguousQName
       getAmbiguous = Seq.singleton
 
@@ -228,7 +225,7 @@
       getLet A.LetOpen{}           = mempty
 
       getLam :: A.LamBinding -> File
-      getLam (A.DomainFree _ x) = bound x
+      getLam (A.DomainFree _ _ x) = bound x
       getLam (A.DomainFull {})  = mempty
 
       getTyped :: A.TypedBinding -> File
@@ -243,7 +240,7 @@
                 (mempty { otherAspects = [DottedPattern] })
       getPattern _             = mempty
 
-      getFieldDecl :: A.Definition -> File
+      getFieldDecl :: A.Declaration -> File
       getFieldDecl (A.RecDef _ _ _ _ _ fs) = Fold.foldMap extractField fs
         where
         extractField (A.ScopedDecl _ ds) = Fold.foldMap extractField ds
@@ -288,7 +285,7 @@
     Just _  -> return $
       -- Traverses the syntax tree and constructs a map from qualified
       -- names to name kinds. TODO: Handle open public.
-      everything' union (Map.empty `mkQ` getDef `extQ` getDecl) decls
+      everything' union (Map.empty `mkQ` getDecl) decls
   let merged = Map.union local imported
   return (\n -> Map.lookup n merged)
   where
@@ -305,43 +302,43 @@
     dropPostulates k         _ = k
 
   defnToNameKind :: Defn -> NameKind
-  defnToNameKind (M.Axiom {})                               = Postulate
-  defnToNameKind (M.Function { M.funProjection = Nothing }) = Function
-  defnToNameKind (M.Function { M.funProjection = Just _  }) = Field
-  defnToNameKind (M.Datatype {})                            = Datatype
-  defnToNameKind (M.Record {})                              = Record
-  defnToNameKind (M.Constructor { M.conInd = i })           = Constructor i
-  defnToNameKind (M.Primitive {})                           = Primitive
+  defnToNameKind (M.Axiom {})                     = Postulate
+  defnToNameKind (M.Function {})                  = Function
+  defnToNameKind (M.Datatype {})                  = Datatype
+  defnToNameKind (M.Record {})                    = Record
+  defnToNameKind (M.Constructor { M.conInd = i }) = Constructor i
+  defnToNameKind (M.Primitive {})                 = Primitive
 
   getAxiomName :: A.Declaration -> A.QName
   getAxiomName (A.Axiom _ _ q _) = q
   getAxiomName _                 = __IMPOSSIBLE__
 
-  getDef :: A.Definition -> Map A.QName NameKind
-  getDef (A.FunDef  _ q _)       = Map.singleton q Function
-  getDef (A.DataDef _ q _ cs)    = Map.singleton q Datatype `union`
-                                   (Map.unions $
-                                    map (\q -> Map.singleton q (Constructor SC.Inductive)) $
-                                    map getAxiomName cs)
-  getDef (A.RecDef  _ q c _ _ _) = Map.singleton q Record `union`
-                                   case c of
-                                     Nothing -> Map.empty
-                                     Just (A.Axiom _ _ q _) ->
-                                       Map.singleton q (Constructor SC.Inductive)
-                                     Just _ -> __IMPOSSIBLE__
-  getDef (A.ScopedDef {})        = Map.empty
-
   getDecl :: A.Declaration -> Map A.QName NameKind
   getDecl (A.Axiom _ _ q _)   = Map.singleton q Postulate
-  getDecl (A.Field _ q _)     = Map.singleton q Field
+  getDecl (A.Field _ q _)     = Map.singleton q Function
+    -- Note that the name q can be used both as a field name and as a
+    -- projection function. Highlighting of field names is taken care
+    -- of by "theRest" above, which does not use NameKinds.
   getDecl (A.Primitive _ q _) = Map.singleton q Primitive
-  getDecl (A.Definition {})   = Map.empty
+  getDecl (A.Mutual {})       = Map.empty
   getDecl (A.Section {})      = Map.empty
   getDecl (A.Apply {})        = Map.empty
   getDecl (A.Import {})       = Map.empty
   getDecl (A.Pragma {})       = Map.empty
   getDecl (A.ScopedDecl {})   = Map.empty
   getDecl (A.Open {})         = Map.empty
+  getDecl (A.FunDef  _ q _)       = Map.singleton q Function
+  getDecl (A.DataSig _ q _ _)       = Map.singleton q Datatype
+  getDecl (A.DataDef _ q _ cs)    = Map.singleton q Datatype `union`
+                                   (Map.unions $
+                                    map (\q -> Map.singleton q (Constructor SC.Inductive)) $
+                                    map getAxiomName cs)
+  getDecl (A.RecSig _ q _ _)      = Map.singleton q Record
+  getDecl (A.RecDef _ q c _ _ _)  = Map.singleton q Record `union`
+                                   case c of
+                                     Nothing -> Map.empty
+                                     Just q ->
+                                       Map.singleton q (Constructor SC.Inductive)
 
 -- | Generates syntax highlighting information for all constructors
 -- occurring in patterns and expressions in the given declarations.
@@ -401,11 +398,10 @@
       NotDelayed -> return Seq.empty
 
       Delayed -> do
-        clauses <- R.instantiateFull $ map I.originalClause $
-                     defClauses def
+        clauses <- R.instantiateFull $ defClauses def
         case clauses of
           [I.Clause{ I.clauseBody = body }] -> case getRHS body of
-            Just (I.Def c args) -> do
+            Just (I.Con c args) -> do
               s <- everything' (liftM2 (><)) query args
               return $ Seq.singleton c >< s
 
@@ -418,8 +414,7 @@
     where
       getRHS (I.Body v)   = Just v
       getRHS I.NoBody     = Nothing
-      getRHS (I.Bind b)   = getRHS (I.absBody b)
-      getRHS (I.NoBind b) = getRHS b
+      getRHS (I.Bind b)   = getRHS (I.unAbs b)
 
 -- | Generates syntax highlighting information for unsolved meta
 -- variables.
diff --git a/src/full/Agda/Interaction/Imports.hs b/src/full/Agda/Interaction/Imports.hs
--- a/src/full/Agda/Interaction/Imports.hs
+++ b/src/full/Agda/Interaction/Imports.hs
@@ -6,6 +6,7 @@
 
 import Prelude hiding (catch)
 
+import Control.Arrow
 import Control.Monad.Error
 import Control.Monad.State
 import qualified Control.Exception as E
@@ -52,6 +53,7 @@
 import Agda.Utils.Monad
 import Agda.Utils.IO.Binary
 import Agda.Utils.Pretty
+import Agda.Utils.Fresh
 
 import Agda.Utils.Impossible
 #include "../undefined.h"
@@ -63,7 +65,7 @@
 	builtin = Map.toList $ iBuiltin i
 	prim	= [ x | (_,Prim x) <- builtin ]
 	bi	= Map.fromList [ (x,Builtin t) | (x,Builtin t) <- builtin ]
-    bs <- getBuiltinThings
+    bs <- gets stBuiltinThings
     reportSLn "import.iface.merge" 10 $ "Merging interface"
     reportSLn "import.iface.merge" 20 $
       "  Current builtins " ++ show (Map.keys bs) ++ "\n" ++
@@ -152,7 +154,7 @@
 -- Invariant: The fields are never empty at the same time.
 
 data Warnings = Warnings
-  { terminationProblems   :: [([QName], [R.Range])]
+  { terminationProblems   :: [TerminationError]
     -- ^ Termination checking problems are not reported if
     -- 'optTerminationCheck' is 'False'.
   , unsolvedMetaVariables :: [Range]
@@ -208,7 +210,7 @@
   bracket (stPragmaOptions <$> get)
           (unless includeStateChanges . setPragmaOptions) $ \_ -> do
    -- Forget the pragma options (locally).
-   setCommandLineOptions . stPersistentOptions =<< get
+   setCommandLineOptions . stPersistentOptions . stPersistent =<< get
 
    alreadyVisited x $ addImportCycleCheck x $ do
     file <- findFile x  -- requires source to exist
@@ -330,10 +332,12 @@
             mf       <- stModuleToSource <$> get
             vs       <- getVisitedModules
             ds       <- getDecodedModules
-            opts     <- stPersistentOptions <$> get
+            opts     <- stPersistentOptions . stPersistent <$> get
             isig     <- getImportedSignature
             ibuiltin <- gets stImportedBuiltins
-            -- Every interface is treated in isolation.
+            -- Every interface is treated in isolation. Note: Changes
+            -- to stDecodedModules are not preserved if an error is
+            -- encountered in an imported module.
             r <- liftIO $ runTCM $
                    withImportPath ms $ do
                      setDecodedModules ds
@@ -398,9 +402,9 @@
 
 writeInterface :: FilePath -> Interface -> TCM ClockTime
 writeInterface file i = do
-    reportSLn "import.iface.write" 5  $
-      "Writing interface file " ++ file ++ "."
+    reportSLn "import.iface.write" 5  $ "Writing interface file " ++ file ++ "."
     encodeFile file i
+    reportSLn "import.iface.write" 5 "Wrote interface file."
     liftIO $ getModificationTime file
   `catchError` \e -> do
     reportSLn "" 1 $
@@ -443,14 +447,20 @@
     termErrs <- catchError (do
       -- Type checking.
       checkDecls (topLevelDecls topLevel)
+      unfreezeMetas
 
+      -- Count number of metas
+      verboseS "profile.metas" 10 $ do
+        MetaId n <- fresh
+        tickN "metas" n
+
       -- Termination checking.
       termErrs <- ifM (optTerminationCheck <$> pragmaOptions)
                       (termDecls $ topLevelDecls topLevel)
                       (return [])
       mapM_ (\e -> reportSLn "term.warn.no" 2
-                     (show (fst e) ++
-                      " does NOT pass the termination checker."))
+                     (show (termErrFunctions e) ++
+                      " do(es) NOT pass the termination checker."))
             termErrs
       return termErrs
       ) (\e -> do
@@ -476,6 +486,15 @@
     whenM (optGenerateVimFile <$> commandLineOptions) $
 	withScope_ (insideScope topLevel) $ generateVimFile $ filePath file
 
+    -- Print stats
+    stats <- Map.toList <$> getStatistics
+    case stats of
+      []      -> return ()
+      _       -> reportS "profile" 1 $ unlines $
+        [ "Ticks for " ++ show (pretty mname) ] ++
+        [ "  " ++ s ++ " = " ++ show n
+        | (s, n) <- sortBy (compare `on` snd) stats ]
+
     -- Check if there are unsolved meta-variables...
     unsolvedOK    <- optAllowUnsolved <$> pragmaOptions
     unsolvedMetas <- List.nub <$> (mapM getMetaRange =<< getOpenMetas)
@@ -483,7 +502,7 @@
       typeError $ UnsolvedMetas unsolvedMetas
 
     -- ...or unsolved constraints
-    unsolvedConstraints <- getConstraints
+    unsolvedConstraints <- getAllConstraints
     unless (null unsolvedConstraints || unsolvedOK) $
       typeError $ UnsolvedConstraints unsolvedConstraints
 
diff --git a/src/full/Agda/Interaction/Imports.hs-boot b/src/full/Agda/Interaction/Imports.hs-boot
--- a/src/full/Agda/Interaction/Imports.hs-boot
+++ b/src/full/Agda/Interaction/Imports.hs-boot
@@ -7,4 +7,3 @@
 import Data.Map                     ( Map )
 
 scopeCheckImport :: ModuleName -> TCM (ModuleName, Map ModuleName Scope)
-
diff --git a/src/full/Agda/Interaction/MakeCase.hs b/src/full/Agda/Interaction/MakeCase.hs
--- a/src/full/Agda/Interaction/MakeCase.hs
+++ b/src/full/Agda/Interaction/MakeCase.hs
@@ -24,6 +24,8 @@
 import Agda.TypeChecking.Coverage
 import Agda.TypeChecking.Pretty
 import Agda.TypeChecking.Reduce
+import Agda.TypeChecking.Substitute
+import Agda.TypeChecking.Irrelevance
 import Agda.TypeChecker
 
 import Agda.Interaction.BasicOps
@@ -34,6 +36,8 @@
 #include "../undefined.h"
 import Agda.Utils.Impossible
 
+data CaseContext = FunctionDef | ExtendedLambda Int Int
+                 deriving (Eq)
 -- | Find the clause whose right hand side is the given meta
 -- BY SEARCHING THE WHOLE SIGNATURE. Returns
 -- the original clause, before record patterns have been translated
@@ -44,13 +48,13 @@
 -- thrown away earlier.  (shutter with disgust).
 -- This code fails for record rhs because they have been eta-expanded,
 -- so the MVar is gone.
-findClause :: MetaId -> TCM (QName, Clause)
+findClause :: MetaId -> TCM (CaseContext, QName, Clause)
 findClause m = do
   sig <- getImportedSignature
   let res = do
         def <- Map.elems $ sigDefinitions sig
         Function{funClauses = cs} <- [theDef def]
-        c <- map originalClause cs
+        c <- cs
         unless (rhsIsm $ clauseBody c) []
         return (defName def, c)
   case res of
@@ -62,24 +66,27 @@
         ]
       reportSDoc "interaction.case" 20 $ vcat $ map (text . show) (Map.elems $ sigDefinitions sig)  -- you asked for it!
       typeError $ GenericError "Right hand side must be a single hole when making a case distinction."
-    [r] -> return r
+    [(n,c)] | isPrefixOf extendlambdaname $ show $ A.qnameName n -> do
+                                               Just (h , nh) <- Map.lookup n <$> getExtLambdaTele
+                                               return (ExtendedLambda h nh , n , c)
+            | otherwise                                          -> return (FunctionDef , n , c)
     _   -> __IMPOSSIBLE__
   where
-    rhsIsm (Bind b)   = rhsIsm $ absBody b
-    rhsIsm (NoBind b) = rhsIsm b
+    rhsIsm (Bind b)   = rhsIsm $ unAbs b
     rhsIsm NoBody     = False
     rhsIsm (Body e)   = case e of
       MetaV m' _  -> m == m'
       _           -> False
 
-makeCase :: InteractionId -> Range -> String -> TCM [A.Clause]
+makeCase :: InteractionId -> Range -> String -> TCM (CaseContext , [A.Clause])
 makeCase hole rng s = withInteractionId hole $ do
   meta        <- lookupInteractionId hole
-  (f, clause@(Clause{ clauseTel = tel, clausePerm = perm, clausePats = ps })) <- findClause meta
+  (casectxt, f, clause@(Clause{ clauseTel = tel, clausePerm = perm, clausePats = ps })) <- findClause meta
   reportSDoc "interaction.case" 10 $ vcat
     [ text "splitting clause:"
     , nest 2 $ vcat
-      [ text "context =" <+> (prettyTCM =<< getContextTelescope)
+      [ text "f       =" <+> prettyTCM f
+      , text "context =" <+> (prettyTCM =<< getContextTelescope)
       , text "tel     =" <+> prettyTCM tel
       , text "perm    =" <+> text (show perm)
       , text "ps      =" <+> text (show ps)
@@ -87,10 +94,10 @@
     ]
   var         <- deBruijnIndex =<< parseExprIn hole rng s
   z           <- splitClauseWithAbs clause var
-  case z of
+  (case z of
     Left err        -> typeError . GenericError . show =<< prettyTCM err
-    Right (Left cl) -> (:[]) <$> makeAbsurdClause f cl
-    Right (Right c) -> mapM (makeAbstractClause f) c
+    Right (Left cl) -> ((:[]) <$> makeAbsurdClause f cl)
+    Right (Right c) -> (mapM (makeAbstractClause f) c)) >>= (\ x -> return (casectxt , x))
 
 makeAbsurdClause :: QName -> SplitClause -> TCM A.Clause
 makeAbsurdClause f (SClause tel perm ps _) = do
@@ -121,7 +128,8 @@
 deBruijnIndex :: A.Expr -> TCM Nat
 deBruijnIndex e = do
   (v, _) <- -- Andreas, 2010-09-21 allow splitting on irrelevant (record) vars
-            Context.wakeIrrelevantVars $
+--            Context.wakeIrrelevantVars $
+            applyRelevanceToContext Irrelevant $
               inferExpr e
   case v of
     Var n _ -> return n
diff --git a/src/full/Agda/Interaction/Monad.hs b/src/full/Agda/Interaction/Monad.hs
--- a/src/full/Agda/Interaction/Monad.hs
+++ b/src/full/Agda/Interaction/Monad.hs
@@ -1,4 +1,5 @@
-{-# LANGUAGE TypeSynonymInstances, MultiParamTypeClasses #-}
+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances,
+             MultiParamTypeClasses #-}
 module Agda.Interaction.Monad where
 
 import Agda.TypeChecking.Monad
diff --git a/src/full/Agda/Interaction/Options.hs b/src/full/Agda/Interaction/Options.hs
--- a/src/full/Agda/Interaction/Options.hs
+++ b/src/full/Agda/Interaction/Options.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE StandaloneDeriving, DeriveFunctor #-}
+
 module Agda.Interaction.Options
     ( CommandLineOptions(..)
     , PragmaOptions(..)
@@ -11,6 +13,7 @@
     , defaultOptions
     , defaultVerbosity
     , standardOptions_
+    , unsafePragmaOptions
     , isLiterate
     , mapFlag
     , usage
@@ -19,7 +22,8 @@
 
 import Control.Monad            ( when )
 import Control.Monad.Error	( MonadError(..) )
-import Data.List		( isSuffixOf )
+import Data.Maybe (isJust)
+import Data.List		( isSuffixOf , intercalate )
 import System.Console.GetOpt	(getOpt, usageInfo, ArgOrder(ReturnInOrder)
 				, OptDescr(..), ArgDescr(..)
 				)
@@ -38,13 +42,8 @@
 
 -- OptDescr is a Functor --------------------------------------------------
 
-instance Functor OptDescr where
-    fmap f (Option short long arg descr) = Option short long (fmap f arg) descr
-
-instance Functor ArgDescr where
-    fmap f (NoArg x)	= NoArg (f x)
-    fmap f (ReqArg p s) = ReqArg (f . p) s
-    fmap f (OptArg p s) = OptArg (f . p) s
+deriving instance Functor OptDescr
+deriving instance Functor ArgDescr
 
 type Verbosity = Trie String Int
 
@@ -62,10 +61,12 @@
 	    , optRunTests             :: Bool
 	    , optCompile              :: Bool
 	    , optEpicCompile          :: Bool
+	    , optJSCompile            :: Bool
             , optCompileDir           :: Maybe FilePath
               -- ^ In the absence of a path the project root is used.
 	    , optGenerateVimFile      :: Bool
 	    , optGenerateHTML         :: Bool
+	    , optDependencyGraph      :: Maybe FilePath
 	    , optHTMLDir              :: FilePath
 	    , optCSSFile              :: Maybe FilePath
 	    , optIgnoreInterfaces     :: Bool
@@ -73,7 +74,8 @@
             , optGhcFlags             :: [String]
             , optPragmaOptions        :: PragmaOptions
             , optEpicFlags            :: [String]
-	    }
+            , optSafe                 :: Bool
+            }
     deriving Show
 
 -- | Options which can be set in a pragma.
@@ -87,13 +89,13 @@
   , optTerminationCheck          :: Bool
   , optTerminationDepth          :: Int
   , optCompletenessCheck         :: Bool
-  , optUnreachableCheck          :: Bool
   , optUniverseCheck             :: Bool
   , optSizedTypes                :: Bool
   , optInjectiveTypeConstructors :: Bool
   , optGuardingTypeConstructors  :: Bool
   , optUniversePolymorphism      :: Bool
   , optIrrelevantProjections     :: Bool
+  , optExperimentalIrrelevance   :: Bool  -- ^ irrelevant levels, irrelevant data matching
   , optWithoutK                  :: Bool
   }
   deriving Show
@@ -124,9 +126,11 @@
 	    , optRunTests             = False
 	    , optCompile              = False
 	    , optEpicCompile          = False
+	    , optJSCompile            = False
             , optCompileDir           = Nothing
 	    , optGenerateVimFile      = False
 	    , optGenerateHTML         = False
+	    , optDependencyGraph      = Nothing
 	    , optHTMLDir              = defaultHTMLDir
 	    , optCSSFile              = Nothing
 	    , optIgnoreInterfaces     = False
@@ -134,6 +138,7 @@
             , optGhcFlags             = []
             , optPragmaOptions        = defaultPragmaOptions
             , optEpicFlags            = []
+            , optSafe                 = False
 	    }
 
 defaultPragmaOptions :: PragmaOptions
@@ -141,18 +146,18 @@
   { optShowImplicit              = False
   , optVerbose                   = defaultVerbosity
   , optProofIrrelevance          = False
+  , optExperimentalIrrelevance   = False
   , optIrrelevantProjections     = True
   , optAllowUnsolved             = False
   , optDisablePositivity         = False
   , optTerminationCheck          = True
   , optTerminationDepth          = 0    -- this is the cutoff value
   , optCompletenessCheck         = True
-  , optUnreachableCheck          = True
   , optUniverseCheck             = True
   , optSizedTypes                = False
   , optInjectiveTypeConstructors = False
   , optGuardingTypeConstructors  = False
-  , optUniversePolymorphism      = False
+  , optUniversePolymorphism      = True
   , optWithoutK                  = False
   }
 
@@ -176,10 +181,12 @@
 checkOpts opts
   | not (atMostOne [optAllowUnsolved . p, optCompile]) = Left
       "Unsolved meta variables are not allowed when compiling.\n"
-  | not (atMostOne [optInteractive, optCompile, optEpicCompile]) =
+  | not (atMostOne [optInteractive, optCompile, optEpicCompile, optJSCompile]) =
       Left "Choose at most one: compiler/interactive mode.\n"
   | not (atMostOne [optGenerateHTML, optInteractive]) =
       Left "Choose at most one: HTML generator or interactive mode.\n"
+  | not (atMostOne [isJust . optDependencyGraph, optInteractive]) =
+      Left "Choose at most one: Dependency graph generator or interactive mode.\n"
   | not (atMostOne [ optUniversePolymorphism . p
                    , not . optUniverseCheck . p
                    ]) =
@@ -193,6 +200,30 @@
 
   p = optPragmaOptions
 
+-- Check for unsafe pramas. Gives a list of used unsafe flags.
+
+unsafePragmaOptions :: PragmaOptions -> [String]
+unsafePragmaOptions opts =
+  [ "--allow-unsolved-metas"                     | optAllowUnsolved opts             ] ++
+  [ "--no-positivity-check"                      | optDisablePositivity opts         ] ++
+  [ "--no-termination-check"                     | not (optTerminationCheck opts)    ] ++
+  [ "--no-coverage-check"                        | not (optCompletenessCheck opts)   ] ++
+  [ "--type-in-type"                             | not (optUniverseCheck opts)       ] ++
+  [ "--sized-types"                              | optSizedTypes opts                ] ++
+  [ "--injective-type-constructors"              | optInjectiveTypeConstructors opts ] ++
+  [ "--guardedness-preserving-type-constructors" | optGuardingTypeConstructors opts  ] ++
+  [ "--experimental-irrelevance"                 | optExperimentalIrrelevance opts   ]
+
+-- The default pragma options should be considered safe
+
+defaultPragmaOptionsSafe :: IO Bool
+defaultPragmaOptionsSafe
+    | null unsafe = return True
+    | otherwise   = do putStrLn $ "Following pragmas are default but not safe: "
+                                  ++ intercalate ", " unsafe
+                       return False
+  where unsafe = unsafePragmaOptions defaultPragmaOptions
+
 inputFlag :: FilePath -> Flag CommandLineOptions
 inputFlag f o =
     case optInputFile o of
@@ -201,7 +232,9 @@
 
 versionFlag                  o = return $ o { optShowVersion               = True  }
 helpFlag                     o = return $ o { optShowHelp                  = True  }
+safeFlag                     o = return $ o { optSafe                      = True  }
 proofIrrelevanceFlag         o = return $ o { optProofIrrelevance          = True  }
+experimentalIrrelevanceFlag  o = return $ o { optExperimentalIrrelevance   = True  }
 noIrrelevantProjectionsFlag  o = return $ o { optIrrelevantProjections     = False }
 ignoreInterfacesFlag         o = return $ o { optIgnoreInterfaces          = True  }
 allowUnsolvedFlag            o = return $ o { optAllowUnsolved             = True  }
@@ -211,12 +244,13 @@
 noPositivityFlag             o = return $ o { optDisablePositivity         = True  }
 dontTerminationCheckFlag     o = return $ o { optTerminationCheck          = False }
 dontCompletenessCheckFlag    o = return $ o { optCompletenessCheck         = False }
-noUnreachableCheckFlag       o = return $ o { optUnreachableCheck          = False }
-dontUniverseCheckFlag        o = return $ o { optUniverseCheck             = False }
+dontUniverseCheckFlag        o = return $ o { optUniverseCheck             = False
+                                            , optUniversePolymorphism      = False }
 sizedTypes                   o = return $ o { optSizedTypes                = True  }
 injectiveTypeConstructorFlag o = return $ o { optInjectiveTypeConstructors = True  }
 guardingTypeConstructorFlag  o = return $ o { optGuardingTypeConstructors  = True  }
 universePolymorphismFlag     o = return $ o { optUniversePolymorphism      = True  }
+noUniversePolymorphismFlag   o = return $ o { optUniversePolymorphism      = False }
 noForcingFlag                o = return $ o { optForcing                   = False }
 withoutKFlag                 o = return $ o { optWithoutK                  = True  }
 
@@ -226,11 +260,13 @@
 		                }
 compileFlag      o = return $ o { optCompile    = True }
 compileEpicFlag  o = return $ o { optEpicCompile = True}
+compileJSFlag    o = return $ o { optJSCompile = True}
 compileDirFlag f o = return $ o { optCompileDir = Just f }
 ghcFlag        f o = return $ o { optGhcFlags   = f : optGhcFlags o }
 epicFlagsFlag  s o = return $ o { optEpicFlags  = optEpicFlags o ++ [s]}
 
 htmlFlag      o = return $ o { optGenerateHTML = True }
+dependencyGraphFlag f o = return $ o { optDependencyGraph  = Just f }
 htmlDirFlag d o = return $ o { optHTMLDir      = d }
 cssFlag     f o = return $ o { optCSSFile      = Just f }
 
@@ -268,6 +304,7 @@
     , Option ['c']  ["compile"] (NoArg compileFlag)
                     "compile program using the MAlonzo backend (experimental)"
     , Option []     ["epic"] (NoArg compileEpicFlag) "compile program using the Epic backend"
+    , Option []     ["js"] (NoArg compileJSFlag) "compile program using the JS backend"
     , Option []     ["compile-dir"] (ReqArg compileDirFlag "DIR")
 		    ("directory for compiler output (default: the project root)")
     , Option []     ["ghc-flag"] (ReqArg ghcFlag "GHC-FLAG")
@@ -280,6 +317,8 @@
 		    "generate Vim highlighting files"
     , Option []	    ["html"] (NoArg htmlFlag)
 		    "generate HTML files with highlighted source code"
+    , Option []	    ["dependency-graph"] (ReqArg dependencyGraphFlag "FILE")
+		    "generate a Dot file with a module dependency graph"
     , Option []	    ["html-dir"] (ReqArg htmlDirFlag "DIR")
                     ("directory in which HTML files are placed (default: " ++
                      defaultHTMLDir ++ ")")
@@ -291,6 +330,8 @@
 		    "look for imports in DIR"
     , Option []     ["no-forcing"] (NoArg noForcingFlag)
                     "disable the forcing optimisation"
+    , Option []     ["safe"] (NoArg safeFlag)
+                    "disable postulates, unsafe OPTION pragmas and primTrustMe"
     ] ++ map (fmap lift) pragmaOptions
   where
   lift :: Flag PragmaOptions -> Flag CommandLineOptions
@@ -316,20 +357,22 @@
 		    "allow termination checker to count decrease/increase upto N (default N=1)"
     , Option []	    ["no-coverage-check"] (NoArg dontCompletenessCheckFlag)
 		    "do not warn about possibly incomplete pattern matches"
-    , Option []	    ["no-unreachable-check"] (NoArg noUnreachableCheckFlag)
-		    "do not warn about unreachable function clauses"
     , Option []	    ["type-in-type"] (NoArg dontUniverseCheckFlag)
 		    "ignore universe levels (this makes Agda inconsistent)"
     , Option []     ["sized-types"] (NoArg sizedTypes)
-                    "use sized datatypes"
+                    "use sized types (inconsistent with coinduction)"
     , Option []     ["injective-type-constructors"] (NoArg injectiveTypeConstructorFlag)
                     "enable injective type constructors (makes Agda anti-classical and possibly inconsistent)"
     , Option []     ["guardedness-preserving-type-constructors"] (NoArg guardingTypeConstructorFlag)
                     "treat type constructors as inductive constructors when checking productivity"
+    , Option []     ["no-universe-polymorphism"] (NoArg noUniversePolymorphismFlag)
+                    "disable universe polymorphism"
     , Option []     ["universe-polymorphism"] (NoArg universePolymorphismFlag)
-                    "enable universe polymorphism (experimental feature)"
+                    "enable universe polymorphism (default)"
     , Option []     ["no-irrelevant-projections"] (NoArg noIrrelevantProjectionsFlag)
                     "disable projection of irrelevant record fields"
+    , Option []     ["experimental-irrelevance"] (NoArg experimentalIrrelevanceFlag)
+                    "enable potentially unsound irrelevance features (irrelevant levels, irrelevant data matching)"
     , Option []     ["without-K"] (NoArg withoutKFlag)
                     "disable the K rule (maybe)"
     ]
@@ -405,4 +448,5 @@
 tests :: IO Bool
 tests = runTests "Agda.Interaction.Options"
   [ quickCheck' prop_defaultOptions
+  , defaultPragmaOptionsSafe
   ]
diff --git a/src/full/Agda/Main.hs b/src/full/Agda/Main.hs
--- a/src/full/Agda/Main.hs
+++ b/src/full/Agda/Main.hs
@@ -37,6 +37,7 @@
 import Agda.Interaction.Monad
 import Agda.Interaction.GhciTop ()      -- to make sure it compiles
 import qualified Agda.Interaction.Imports as Imp
+import qualified Agda.Interaction.Highlighting.Dot as Dot
 import Agda.Interaction.Highlighting.HTML
 
 import Agda.TypeChecker
@@ -49,6 +50,7 @@
 
 import Agda.Compiler.MAlonzo.Compiler as MAlonzo
 import Agda.Compiler.Epic.Compiler as Epic
+import Agda.Compiler.JS.Compiler as JS
 
 import Agda.Termination.TermCheck
 
@@ -90,6 +92,7 @@
       i       <- optInteractive <$> liftTCM commandLineOptions
       compile <- optCompile     <$> liftTCM commandLineOptions
       epic    <- optEpicCompile <$> liftTCM commandLineOptions
+      js      <- optJSCompile   <$> liftTCM commandLineOptions
       when i $ liftIO $ LocIO.putStr splashScreen
       let failIfNoInt (Just i) = return i
           -- The allowed combinations of command-line
@@ -100,6 +103,7 @@
           interaction | i         = runIM . interactionLoop
                       | compile   = (MAlonzo.compilerMain =<<) . (failIfNoInt =<<)
                       | epic      = (Epic.compilerMain    =<<) . (failIfNoInt =<<)
+                      | js        = (JS.compilerMain      =<<) . (failIfNoInt =<<)
                       | otherwise = (() <$)
       interaction $ do
         hasFile <- hasInputFile
@@ -121,18 +125,11 @@
             Just _  -> return Nothing
             Nothing -> return $ Just i
 
-          -- Print stats
-          stats <- Map.toList <$> getStatistics
-          case stats of
-            []      -> return ()
-            _       -> liftIO $ do
-              LocIO.putStrLn "Statistics"
-              LocIO.putStrLn "----------"
-              mapM_ (\ (s,n) -> LocIO.putStrLn $ s ++ " : " ++ show n) $
-                sortBy (\x y -> compare (snd x) (snd y)) stats
-
           whenM (optGenerateHTML <$> commandLineOptions) $
             generateHTML $ iModuleName i
+
+          whenM (isJust . optDependencyGraph <$> commandLineOptions) $
+            Dot.generateDot $ i
 
           return result
 
diff --git a/src/full/Agda/Syntax/Abstract.hs b/src/full/Agda/Syntax/Abstract.hs
--- a/src/full/Agda/Syntax/Abstract.hs
+++ b/src/full/Agda/Syntax/Abstract.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE DeriveDataTypeable, CPP #-}
+{-# LANGUAGE DeriveDataTypeable, DeriveFunctor, DeriveFoldable, DeriveTraversable, CPP #-}
 {-| The abstract syntax. This is what you get after desugaring and scope
     analysis of the concrete syntax. The type checker works on abstract syntax,
     producing internal syntax ("Agda.Syntax.Internal").
@@ -21,6 +21,7 @@
 import Agda.Syntax.Concrete.Pretty ()
 import Agda.Syntax.Info
 import Agda.Syntax.Common
+import Agda.Syntax.Fixity
 import Agda.Syntax.Position
 import Agda.Syntax.Abstract.Name
 import Agda.Syntax.Literal
@@ -42,31 +43,63 @@
 	| WithApp ExprInfo Expr [Expr]	     -- ^ with application
         | Lam  ExprInfo LamBinding Expr	     -- ^
         | AbsurdLam ExprInfo Hiding
+        | ExtendedLam ExprInfo DefInfo QName [Clause]
         | Pi   ExprInfo Telescope Expr	     -- ^
 	| Fun  ExprInfo (Arg Expr) Expr	     -- ^ independent function space
-        | Set  ExprInfo Nat		     -- ^
+        | Set  ExprInfo Nat		     -- ^ Set, Set1, Set2, ...
         | Prop ExprInfo			     -- ^
         | Let  ExprInfo [LetBinding] Expr    -- ^
         | ETel Telescope                     -- ^ only used when printing telescopes
 	| Rec  ExprInfo [(C.Name, Expr)]     -- ^ record construction
+	| RecUpdate ExprInfo Expr [(C.Name, Expr)]     -- ^ record update
 	| ScopedExpr ScopeInfo Expr	     -- ^ scope annotation
         | QuoteGoal ExprInfo Name Expr       -- ^
         | Quote ExprInfo                     -- ^
-        | DontCare                           -- ^ for printing DontCare from Syntax.Internal
+        | QuoteTerm ExprInfo                 -- ^
+        | Unquote ExprInfo                   -- ^ The splicing construct: unquote ...
+        | DontCare Expr                      -- ^ for printing DontCare from Syntax.Internal
   deriving (Typeable, Data, Show)
 
 data Declaration
 	= Axiom      DefInfo Relevance QName Expr          -- ^ postulate
 	| Field      DefInfo QName (Arg Expr)		   -- ^ record field
 	| Primitive  DefInfo QName Expr			   -- ^ primitive function
-	| Definition DeclInfo [TypeSignature] [Definition] -- ^ a bunch of mutually recursive definitions
+	| Mutual     DeclInfo [Declaration]                -- ^ a bunch of mutually recursive definitions
 	| Section    ModuleInfo ModuleName [TypedBindings] [Declaration]
-	| Apply	     ModuleInfo ModuleName [TypedBindings] ModuleName [NamedArg Expr] (Map QName QName) (Map ModuleName ModuleName)
+	| Apply	     ModuleInfo ModuleName ModuleApplication (Map QName QName) (Map ModuleName ModuleName)
 	| Import     ModuleInfo ModuleName
 	| Pragma     Range	Pragma
         | Open       ModuleInfo ModuleName
           -- ^ only retained for highlighting purposes
+        | FunDef     DefInfo QName [Clause]
+        | DataSig    DefInfo QName Telescope Expr -- ^ lone data signature
+            -- ^ the 'LamBinding's are 'DomainFree' and binds the parameters of the datatype.
+        | DataDef    DefInfo QName [LamBinding] [Constructor]
+            -- ^ the 'LamBinding's are 'DomainFree' and binds the parameters of the datatype.
+        | RecSig     DefInfo QName Telescope Expr -- ^ lone record signature
+        | RecDef     DefInfo QName (Maybe QName) [LamBinding] Expr [Declaration]
+            -- ^ The 'Expr' gives the constructor type telescope, @(x1 : A1)..(xn : An) -> Prop@,
+            --   and the optional name is the constructor's name.
 	| ScopedDecl ScopeInfo [Declaration]  -- ^ scope annotation
+        deriving (Typeable, Data, Show)
+
+class GetDefInfo a where
+  getDefInfo :: a -> Maybe DefInfo
+
+instance GetDefInfo Declaration where
+  getDefInfo (Axiom i _ _ _) = Just i
+  getDefInfo (Field i _ _) = Just i
+  getDefInfo (Primitive i _ _) = Just i
+  getDefInfo (ScopedDecl _ (d:_)) = getDefInfo d
+  getDefInfo (FunDef i _ _) = Just i
+  getDefInfo (DataSig i _ _ _) = Just i
+  getDefInfo (DataDef i _ _ _) = Just i
+  getDefInfo (RecSig i _ _ _) = Just i
+  getDefInfo (RecDef i _ _ _ _ _) = Just i
+  getDefInfo _ = Nothing
+
+data ModuleApplication = SectionApp [TypedBindings] ModuleName [NamedArg Expr]
+                       | RecordModuleIFS ModuleName
   deriving (Typeable, Data, Show)
 
 data Pragma = OptionsPragma [String]
@@ -75,38 +108,29 @@
             | CompiledTypePragma QName String
             | CompiledDataPragma QName String [String]
             | CompiledEpicPragma QName String
+            | CompiledJSPragma QName String
+            | StaticPragma QName
             | EtaPragma QName
   deriving (Typeable, Data, Show)
 
-data LetBinding = LetBind LetInfo Relevance Name Expr Expr    -- ^ LetBind info name type defn
-                | LetApply ModuleInfo ModuleName [TypedBindings] ModuleName [NamedArg Expr] (Map QName QName) (Map ModuleName ModuleName)
+data LetBinding = LetBind LetInfo Relevance Name Expr Expr    -- ^ LetBind info rel name type defn
+                | LetApply ModuleInfo ModuleName ModuleApplication (Map QName QName) (Map ModuleName ModuleName)
                 | LetOpen ModuleInfo ModuleName     -- ^ only for highlighting and abstractToConcrete
   deriving (Typeable, Data, Show)
 
--- | A definition without its type signature.
-data Definition
-	= FunDef     DefInfo QName [Clause]
-	| DataDef    DefInfo QName [LamBinding] [Constructor]
-	    -- ^ the 'LamBinding's are 'DomainFree' and binds the parameters of the datatype.
-	| RecDef     DefInfo QName (Maybe Constructor) [LamBinding] Expr [Declaration]
-	    -- ^ The 'Expr' gives the constructor type telescope, @(x1 : A1)..(xn : An) -> Prop@,
-            --   and the optional name is the constructor's name.
-        | ScopedDef ScopeInfo Definition
-  deriving (Typeable, Data, Show)
-
 -- | Only 'Axiom's.
 type TypeSignature  = Declaration
 type Constructor    = TypeSignature
 
 -- | A lambda binding is either domain free or typed.
 data LamBinding
-	= DomainFree Hiding Name    -- ^ . @x@ or @{x}@
+	= DomainFree Hiding Relevance Name  -- ^ . @x@ or @{x}@ or @.x@ or @.{x}@
 	| DomainFull TypedBindings  -- ^ . @(xs:e)@ or @{xs:e}@
   deriving (Typeable, Data, Show)
 
 -- | Typed bindings with hiding information.
-data TypedBindings = TypedBindings Range (Arg [TypedBinding])
-	    -- ^ . @(xs:e;..;ys:e')@ or @{xs:e;..;ys:e'}@
+data TypedBindings = TypedBindings Range (Arg TypedBinding)
+	    -- ^ . @(xs : e)@ or @{xs : e}@
   deriving (Typeable, Data, Show)
 
 -- | A typed binding. Appears in dependent function spaces, typed lambdas, and
@@ -148,7 +172,7 @@
 		| AbsurdP PatInfo
 		| LitP Literal
 		| ImplicitP PatInfo	-- ^ generated at type checking for implicit arguments
-  deriving (Typeable, Data, Show)
+  deriving (Typeable, Data, Show, Functor, Foldable, Traversable)
 
 type Pattern = Pattern' Expr
 
@@ -156,48 +180,9 @@
     Instances
  --------------------------------------------------------------------------}
 
-instance Functor Pattern' where
-    fmap f p = case p of
-	VarP x	    -> VarP x
-	ConP i c ps -> ConP i c $ (fmap . fmap . fmap . fmap) f ps
-	DefP i c ps -> DefP i c $ (fmap . fmap . fmap . fmap) f ps
-	LitP l	    -> LitP l
-	AsP i x p   -> AsP i x $ fmap f p
-	DotP i e    -> DotP i (f e)
-	AbsurdP i   -> AbsurdP i
-	WildP i	    -> WildP i
-	ImplicitP i -> ImplicitP i
-
--- foldr should really take its arguments in a different order!
-instance Foldable Pattern' where
-    foldr f z p = case p of
-	VarP _	    -> z
-	ConP _ _ ps -> (foldrF . foldrF . foldrF . foldrF) f ps z
-	DefP _ _ ps -> (foldrF . foldrF . foldrF . foldrF) f ps z
-	LitP _	    -> z
-	AsP _ _ p   -> foldr f z p
-	DotP _ e    -> f e z
-	AbsurdP _   -> z
-	WildP _	    -> z
-	ImplicitP _ -> z
-	where
-	    foldrF f = flip (foldr f)
-
-instance Traversable Pattern' where
-    traverse f p = case p of
-	VarP x	    -> pure $ VarP x
-	ConP i c ps -> ConP i c <$> (traverse . traverse . traverse . traverse) f ps
-	DefP i c ps -> DefP i c <$> (traverse . traverse . traverse . traverse) f ps
-	LitP l	    -> pure $ LitP l
-	AsP i x p   -> AsP i x <$> traverse f p
-	DotP i e    -> DotP i <$> f e
-	AbsurdP i   -> pure $ AbsurdP i
-	WildP i	    -> pure $ WildP i
-	ImplicitP i -> pure $ ImplicitP i
-
 instance HasRange LamBinding where
-    getRange (DomainFree _ x) = getRange x
-    getRange (DomainFull b)   = getRange b
+    getRange (DomainFree _ _ x) = getRange x
+    getRange (DomainFull b)     = getRange b
 
 instance HasRange TypedBindings where
     getRange (TypedBindings r _) = r
@@ -217,35 +202,38 @@
     getRange (WithApp i _ _)	= getRange i
     getRange (Lam i _ _)	= getRange i
     getRange (AbsurdLam i _)    = getRange i
+    getRange (ExtendedLam i _ _ _)  = getRange i
     getRange (Pi i _ _)		= getRange i
     getRange (Fun i _ _)	= getRange i
     getRange (Set i _)		= getRange i
     getRange (Prop i)		= getRange i
     getRange (Let i _ _)	= getRange i
     getRange (Rec i _)		= getRange i
+    getRange (RecUpdate i _ _)  = getRange i
     getRange (ETel tel)         = getRange tel
     getRange (ScopedExpr _ e)	= getRange e
     getRange (QuoteGoal _ _ e)	= getRange e
     getRange (Quote i)  	= getRange i
-    getRange (DontCare)         = noRange
+    getRange (QuoteTerm i)  	= getRange i
+    getRange (Unquote i)  	= getRange i
+    getRange (DontCare{})       = noRange
 
 instance HasRange Declaration where
     getRange (Axiom      i _ _ _       ) = getRange i
     getRange (Field      i _ _         ) = getRange i
-    getRange (Definition i _ _	       ) = getRange i
+    getRange (Mutual     i _           ) = getRange i
     getRange (Section    i _ _ _       ) = getRange i
-    getRange (Apply	 i _ _ _ _ _ _ ) = getRange i
+    getRange (Apply	 i _ _ _ _     ) = getRange i
     getRange (Import     i _	       ) = getRange i
     getRange (Primitive  i _ _	       ) = getRange i
     getRange (Pragma	 i _	       ) = getRange i
     getRange (Open       i _           ) = getRange i
     getRange (ScopedDecl _ d	       ) = getRange d
-
-instance HasRange Definition where
-    getRange (FunDef  i _ _    )   = getRange i
-    getRange (DataDef i _ _ _  )   = getRange i
-    getRange (RecDef  i _ _ _ _ _) = getRange i
-    getRange (ScopedDef _ d)       = getRange d
+    getRange (FunDef  i _ _         ) = getRange i
+    getRange (DataSig i _ _ _       ) = getRange i
+    getRange (DataDef i _ _ _       ) = getRange i
+    getRange (RecSig  i _ _ _       ) = getRange i
+    getRange (RecDef  i _ _ _ _ _   ) = getRange i
 
 instance HasRange (Pattern' e) where
     getRange (VarP x)	   = getRange x
@@ -272,12 +260,12 @@
 
 instance HasRange LetBinding where
     getRange (LetBind  i _ _ _ _     ) = getRange i
-    getRange (LetApply i _ _ _ _ _ _ ) = getRange i
+    getRange (LetApply i _ _ _ _     ) = getRange i
     getRange (LetOpen  i _           ) = getRange i
 
 instance KillRange LamBinding where
-  killRange (DomainFree h x) = killRange1 (DomainFree h) x
-  killRange (DomainFull b)   = killRange1 DomainFull b
+  killRange (DomainFree h r x) = killRange1 (DomainFree h r) x
+  killRange (DomainFull b)     = killRange1 DomainFull b
 
 instance KillRange TypedBindings where
   killRange (TypedBindings r b) = TypedBindings (killRange r) (killRange b)
@@ -297,17 +285,21 @@
   killRange (WithApp i e es) = killRange3 WithApp i e es
   killRange (Lam i b e)      = killRange3 Lam i b e
   killRange (AbsurdLam i h)  = killRange1 AbsurdLam i h
+  killRange (ExtendedLam i name di pes) = killRange4 ExtendedLam i name di pes --(\_ -> ExtendedLam i def {-name di si-}) i pes
   killRange (Pi i a b)       = killRange3 Pi i a b
   killRange (Fun i a b)      = killRange3 Fun i a b
   killRange (Set i n)        = Set (killRange i) n
   killRange (Prop i)         = killRange1 Prop i
   killRange (Let i ds e)     = killRange3 Let i ds e
   killRange (Rec i fs)       = Rec (killRange i) (map (id -*- killRange) fs)
+  killRange (RecUpdate i e fs) = RecUpdate (killRange i) (killRange e) (map (id -*- killRange) fs)
   killRange (ETel tel)       = killRange1 ETel tel
   killRange (ScopedExpr s e) = killRange1 (ScopedExpr s) e
   killRange (QuoteGoal i x e)= killRange3 QuoteGoal i x e
   killRange (Quote i)        = killRange1 Quote i
-  killRange (DontCare)       = DontCare
+  killRange (QuoteTerm i)    = killRange1 QuoteTerm i
+  killRange (Unquote i)      = killRange1 Unquote i
+  killRange (DontCare e)     = DontCare e
 
 instance KillRange Relevance where
   killRange rel = rel -- no range to kill
@@ -315,22 +307,28 @@
 instance KillRange Declaration where
   killRange (Axiom      i rel a b     ) = killRange4 Axiom      i rel a b
   killRange (Field      i a b         ) = killRange3 Field      i a b
-  killRange (Definition i a b         ) = killRange3 Definition i a b
+  killRange (Mutual     i a           ) = killRange2 Mutual     i a
   killRange (Section    i a b c       ) = killRange4 Section    i a b c
-  killRange (Apply      i a b c d e f ) = killRange5 Apply      i a b c d e f
+  killRange (Apply      i a b c d     ) = killRange3 Apply      i a b c d
    -- the last two arguments of Apply are name maps, so nothing to kill
   killRange (Import     i a           ) = killRange2 Import     i a
   killRange (Primitive  i a b         ) = killRange3 Primitive  i a b
   killRange (Pragma     i a           ) = Pragma (killRange i) a
   killRange (Open       i x           ) = killRange2 Open       i x
   killRange (ScopedDecl a d           ) = killRange1 (ScopedDecl a) d
+  killRange (FunDef  i a b       ) = killRange3 FunDef  i a b
+  killRange (DataSig i a b c     ) = killRange3 DataSig i a b c
+  killRange (DataDef i a b c     ) = killRange4 DataDef i a b c
+  killRange (RecSig  i a b c     ) = killRange4 RecSig  i a b c
+  killRange (RecDef  i a b c d e ) = killRange6 RecDef  i a b c d e
 
-instance KillRange Definition where
-  killRange (FunDef  i a b    )   = killRange3 FunDef  i a b
-  killRange (DataDef i a b c)     = killRange4 DataDef i a b c
-  killRange (RecDef  i a b c d e) = killRange6 RecDef  i a b c d e
-  killRange (ScopedDef s a)       = killRange1 (ScopedDef s) a
+instance KillRange ModuleApplication where
+  killRange (SectionApp a b c  ) = killRange3 SectionApp a b c
+  killRange (RecordModuleIFS a ) = killRange1 RecordModuleIFS a
 
+instance KillRange x => KillRange (ThingWithFixity x) where
+  killRange (ThingWithFixity c f) = ThingWithFixity (killRange c) f
+
 instance KillRange e => KillRange (Pattern' e) where
   killRange (VarP x)      = killRange1 VarP x
   killRange (ConP i a b)  = killRange3 ConP i a b
@@ -356,7 +354,7 @@
 
 instance KillRange LetBinding where
   killRange (LetBind  i rel a b c   ) = killRange5 LetBind  i rel a b c
-  killRange (LetApply i a b c d e f ) = killRange5 LetApply i a b c d e f
+  killRange (LetApply i a b c d     ) = killRange3 LetApply i a b c d
   killRange (LetOpen  i x           ) = killRange2 LetOpen  i x
 
 ------------------------------------------------------------------------
@@ -365,32 +363,80 @@
 
 -- | Extracts all the names which are declared in a 'Declaration'.
 -- This does not include open public or let expressions, but it does
--- include local modules and where clauses.
+-- include local modules, where clauses and the names of extended
+-- lambdas.
 
 allNames :: Declaration -> Seq QName
-allNames (Axiom     _ _ q _)   = Seq.singleton q
-allNames (Field     _   q _)   = Seq.singleton q
-allNames (Primitive _   q _)   = Seq.singleton q
-allNames (Definition _ _ defs) = Fold.foldMap allNamesD defs
+allNames (Axiom     _ _ q _)      = Seq.singleton q
+allNames (Field     _   q _)      = Seq.singleton q
+allNames (Primitive _   q _)      = Seq.singleton q
+allNames (Mutual     _ defs)      = Fold.foldMap allNames defs
+allNames (DataSig _ q _ _)        = Seq.singleton q
+allNames (DataDef _ q _ decls)    = q <| Fold.foldMap allNames decls
+allNames (RecSig _ q _ _)         = Seq.singleton q
+allNames (RecDef _ q c _ _ decls) =
+  q <| foldMap Seq.singleton c >< Fold.foldMap allNames decls
+allNames (FunDef _ q cls)         = q <| Fold.foldMap allNamesC cls
   where
-  allNamesD :: Definition -> Seq QName
-  allNamesD (FunDef _ q cls)         = q <| Fold.foldMap allNamesC cls
-  allNamesD (DataDef _ q _ decls)    = q <| Fold.foldMap allNames decls
-  allNamesD (ScopedDef _ def)        = allNamesD def
-  allNamesD (RecDef _ q c _ _ decls) =
-    q <| Fold.foldMap allNames c >< Fold.foldMap allNames decls
-
   allNamesC :: Clause -> Seq QName
   allNamesC (Clause _ rhs decls) = allNamesR rhs ><
                                    Fold.foldMap allNames decls
 
   allNamesR :: RHS -> Seq QName
-  allNamesR RHS {}                = Seq.empty
+  allNamesR (RHS e)               = allNamesE e
   allNamesR AbsurdRHS {}          = Seq.empty
   allNamesR (WithRHS q _ cls)     = q <| Fold.foldMap allNamesC cls
   allNamesR (RewriteRHS qs _ rhs cls) =
     Seq.fromList qs >< allNamesR rhs
                     >< Fold.foldMap allNames cls
+
+  allNamesE :: Expr -> Seq QName
+  allNamesE Var {}                  = Seq.empty
+  allNamesE Def {}                  = Seq.empty
+  allNamesE Con {}                  = Seq.empty
+  allNamesE Lit {}                  = Seq.empty
+  allNamesE QuestionMark {}         = Seq.empty
+  allNamesE Underscore {}           = Seq.empty
+  allNamesE (App _ e1 e2)           = Fold.foldMap allNamesE [e1, namedThing (unArg e2)]
+  allNamesE (WithApp _ e es)        = Fold.foldMap allNamesE (e : es)
+  allNamesE (Lam _ b e)             = allNamesLam b >< allNamesE e
+  allNamesE AbsurdLam {}            = Seq.empty
+  allNamesE (ExtendedLam _ _ q cls) = q <| Fold.foldMap allNamesC cls
+  allNamesE (Pi _ tel e)            = Fold.foldMap allNamesBinds tel ><
+                                                allNamesE e
+  allNamesE (Fun _ (Arg _ _ e1) e2) = Fold.foldMap allNamesE [e1, e2]
+  allNamesE Set {}                  = Seq.empty
+  allNamesE Prop {}                 = Seq.empty
+  allNamesE (Let _ lbs e)           = Fold.foldMap allNamesLet lbs ><
+                                                allNamesE e
+  allNamesE ETel {}                 = __IMPOSSIBLE__
+  allNamesE (Rec _ fields)          = Fold.foldMap allNamesE (map snd fields)
+  allNamesE (RecUpdate _ e fs)      = allNamesE e >< Fold.foldMap allNamesE (map snd fs)
+  allNamesE (ScopedExpr _ e)        = allNamesE e
+  allNamesE (QuoteGoal _ _ e)       = allNamesE e
+  allNamesE Quote {}                = Seq.empty
+  allNamesE QuoteTerm {}            = Seq.empty
+  allNamesE Unquote {}              = Seq.empty
+  allNamesE DontCare {}             = Seq.empty
+
+  allNamesLam :: LamBinding -> Seq QName
+  allNamesLam DomainFree {}      = Seq.empty
+  allNamesLam (DomainFull binds) = allNamesBinds binds
+
+  allNamesBinds :: TypedBindings -> Seq QName
+  allNamesBinds (TypedBindings _ (Arg _ _ (TBind _ _ e))) = allNamesE e
+  allNamesBinds (TypedBindings _ (Arg _ _ (TNoBind e)))   = allNamesE e
+
+  allNamesLet :: LetBinding -> Seq QName
+  allNamesLet (LetBind _ _ _ e1 e2)  = Fold.foldMap allNamesE [e1, e2]
+  allNamesLet (LetApply _ _ app _ _) = allNamesApp app
+  allNamesLet LetOpen {}             = Seq.empty
+
+  allNamesApp :: ModuleApplication -> Seq QName
+  allNamesApp (SectionApp bindss _ es) = Fold.foldMap allNamesBinds bindss ><
+                                         Fold.foldMap allNamesE (map (namedThing . unArg) es)
+  allNamesApp RecordModuleIFS {}       = Seq.empty
+
 allNames (Section _ _ _ decls) = Fold.foldMap allNames decls
 allNames Apply {}              = Seq.empty
 allNames Import {}             = Seq.empty
@@ -405,3 +451,26 @@
 axiomName :: Declaration -> QName
 axiomName (Axiom _ _ q _) = q
 axiomName _             = __IMPOSSIBLE__
+
+-- | Are we in an abstract block?
+--
+--   In that case some definition is abstract.
+class AnyAbstract a where
+  anyAbstract :: a -> Bool
+
+instance AnyAbstract a => AnyAbstract [a] where
+  anyAbstract = Fold.any anyAbstract
+
+instance AnyAbstract Declaration where
+  anyAbstract (Axiom i _ _ _)     = defAbstract i == AbstractDef
+  anyAbstract (Field i _ _)       = defAbstract i == AbstractDef
+  anyAbstract (Mutual     _ ds)   = anyAbstract ds
+  anyAbstract (ScopedDecl _ ds)   = anyAbstract ds
+  anyAbstract (Section _ _ _ ds)  = anyAbstract ds
+  anyAbstract (FunDef i _ _)       = defAbstract i == AbstractDef
+  anyAbstract (DataDef i _ _ _)    = defAbstract i == AbstractDef
+  anyAbstract (RecDef i _ _ _ _ _) = defAbstract i == AbstractDef
+  anyAbstract (DataSig i _ _ _)    = defAbstract i == AbstractDef
+  anyAbstract (RecSig i _ _ _)     = defAbstract i == AbstractDef
+  anyAbstract _                    = __IMPOSSIBLE__
+
diff --git a/src/full/Agda/Syntax/Abstract/Name.hs b/src/full/Agda/Syntax/Abstract/Name.hs
--- a/src/full/Agda/Syntax/Abstract/Name.hs
+++ b/src/full/Agda/Syntax/Abstract/Name.hs
@@ -123,6 +123,9 @@
 qnameToMName :: QName -> ModuleName
 qnameToMName = mnameFromList . qnameToList
 
+mnameToQName :: ModuleName -> QName
+mnameToQName = qnameFromList . mnameToList
+
 showQNameId :: QName -> String
 showQNameId q = show ns ++ "@" ++ show m
   where
diff --git a/src/full/Agda/Syntax/Abstract/Pretty.hs b/src/full/Agda/Syntax/Abstract/Pretty.hs
--- a/src/full/Agda/Syntax/Abstract/Pretty.hs
+++ b/src/full/Agda/Syntax/Abstract/Pretty.hs
@@ -10,18 +10,18 @@
 import Agda.TypeChecking.Monad
 import Agda.Utils.Pretty
 
-showA :: (Show c, ToConcrete a c, MonadTCM tcm) => a -> tcm String
+showA :: (Show c, ToConcrete a c) => a -> TCM String
 showA x = show <$> abstractToConcrete_ x
 
-prettyA :: (Pretty c, ToConcrete a c, MonadTCM tcm) => a -> tcm Doc
+prettyA :: (Pretty c, ToConcrete a c) => a -> TCM Doc
 prettyA x = pretty <$> abstractToConcrete_ x
 
 -- | Variant of 'showA' which does not insert outermost parentheses.
 
-showATop :: (Show c, ToConcrete a c, MonadTCM tcm) => a -> tcm String
+showATop :: (Show c, ToConcrete a c) => a -> TCM String
 showATop x = show <$> abstractToConcreteCtx TopCtx x
 
 -- | Variant of 'prettyA' which does not insert outermost parentheses.
 
-prettyATop :: (Pretty c, ToConcrete a c, MonadTCM tcm) => a -> tcm Doc
+prettyATop :: (Pretty c, ToConcrete a c) => a -> TCM Doc
 prettyATop x = pretty <$> abstractToConcreteCtx TopCtx x
diff --git a/src/full/Agda/Syntax/Abstract/Views.hs b/src/full/Agda/Syntax/Abstract/Views.hs
--- a/src/full/Agda/Syntax/Abstract/Views.hs
+++ b/src/full/Agda/Syntax/Abstract/Views.hs
@@ -6,41 +6,23 @@
 import Agda.Syntax.Abstract
 import Agda.Syntax.Info
 
-data AppView = Application Head [NamedArg Expr]
-	     | NonApplication Expr
-		-- ^ TODO: if we allow beta-redexes (which we currently do) there could be one here.
-
--- | @Head@ of an applicative expression.
-data Head = HeadVar Name     -- ^ A variable.
-	  | HeadDef QName    -- ^ A defined symbol (except constructor).
-	  | HeadCon [QName]  -- ^ A constructor which could belong to any of the data types in the list.
+data AppView = Application Expr [NamedArg Expr]
+	     -- NonApplication Expr
+	     --    -- ^ TODO: if we allow beta-redexes (which we currently do) there could be one here.
+             -- 2011-08-24, Dominique: removed..
 
+-- note: everything is an application, possibly of itself to 0 arguments
 appView :: Expr -> AppView
 appView e =
     case e of
-	Var x	       -> Application (HeadVar x) []
-	Def x	       -> Application (HeadDef x) []
-	Con (AmbQ x)   -> Application (HeadCon x) []
-	App i e1 arg   -> apply i (appView e1) arg
-	ScopedExpr _ e -> appView e
-	_	       -> NonApplication e
+      App i e1 arg        -> apply i (appView e1) arg
+      ScopedExpr _ e      -> appView e
+      _                   -> Application e []
     where
 	apply i v arg =
 	    case v of
 		Application hd es -> Application hd $ es ++ [arg]
-		NonApplication e  -> NonApplication (App i e arg)
 
-headToExpr :: Head -> Expr
-headToExpr (HeadVar x)  = Var x
-headToExpr (HeadDef f)  = Def f
-headToExpr (HeadCon cs) = Con (AmbQ cs)
-
 unAppView :: AppView -> Expr
-unAppView (NonApplication e) = e
 unAppView (Application h es) =
-  foldl (App (ExprRange noRange)) (headToExpr h) es
-
-instance HasRange Head where
-    getRange (HeadVar x) = getRange x
-    getRange (HeadDef x) = getRange x
-    getRange (HeadCon x) = getRange x
+  foldl (App (ExprRange noRange)) h es
diff --git a/src/full/Agda/Syntax/Common.hs b/src/full/Agda/Syntax/Common.hs
--- a/src/full/Agda/Syntax/Common.hs
+++ b/src/full/Agda/Syntax/Common.hs
@@ -1,4 +1,5 @@
-{-# LANGUAGE CPP, FlexibleInstances, DeriveDataTypeable #-}
+{-# LANGUAGE CPP, FlexibleInstances, DeriveDataTypeable,
+             DeriveFunctor, DeriveFoldable, DeriveTraversable #-}
 
 {-| Some common syntactic entities are defined in this module.
 -}
@@ -20,26 +21,39 @@
 data Induction = Inductive | CoInductive
   deriving (Typeable, Data, Show, Eq, Ord)
 
-data Hiding  = Hidden | NotHidden
+data Hiding  = Hidden | Instance | NotHidden
     deriving (Typeable, Data, Show, Eq, Ord)
 
 -- | A function argument can be relevant or irrelevant.
+--   See 'Agda.TypeChecking.Irrelevance'.
 data Relevance
   = Relevant    -- ^ the argument is (possibly) relevant at compile-time
+  | NonStrict   -- ^ the argument may never flow into evaluation position.
+                --   Therefore, it is irrelevant at run-time.
+                --   It is treated relevantly during equality checking.
   | Irrelevant  -- ^ the argument is irrelevant at compile- and runtime
   | Forced      -- ^ the argument can be skipped during equality checking
-    deriving (Typeable, Data, Show, Eq, Ord)
+    deriving (Typeable, Data, Show, Eq)
 
--- | For comparing @Relevance@ ignoring @Forced@.
-ignoreForced :: Relevance -> Relevance
-ignoreForced Forced     = Relevant
-ignoreForced Relevant   = Relevant
-ignoreForced Irrelevant = Irrelevant
+instance Ord Relevance where
+  (<=) = moreRelevant
 
--- | @Relevance@ from @Bool@.
-irrelevant :: Bool -> Relevance
-irrelevant True  = Irrelevant
-irrelevant False = Relevant
+-- | Information ordering.
+-- @Relevant `moreRelevant` Forced `moreRelevant` NonStrict `moreRelevant` Irrelevant@
+moreRelevant :: Relevance -> Relevance -> Bool
+moreRelevant r r' =
+  case (r, r') of
+    -- top
+    (_, Irrelevant) -> True
+    (Irrelevant, _) -> False
+    -- bottom
+    (Relevant, _)   -> True
+    (_, Relevant)   -> False
+    -- second bottom
+    (Forced, _)     -> True
+    (_, Forced)     -> False
+    -- remaining case
+    (NonStrict,NonStrict) -> True
 
 instance KillRange Induction where killRange = id
 instance KillRange Hiding    where killRange = id
@@ -49,11 +63,14 @@
   { argHiding    :: Hiding
   , argRelevance :: Relevance
   , unArg :: e
-  } deriving (Typeable, Data, Ord)
+  } deriving (Typeable, Data, Ord, Functor, Foldable, Traversable)
 
 instance Eq a => Eq (Arg a) where
   Arg h1 _ x1 == Arg h2 _ x2 = (h1, x1) == (h2, x2)
 
+makeInstance :: Arg a -> Arg a
+makeInstance a = a { argHiding = Instance }
+
 hide :: Arg a -> Arg a
 hide a = a { argHiding = Hidden }
 
@@ -61,15 +78,7 @@
 defaultArg = Arg NotHidden Relevant
 
 isHiddenArg :: Arg a -> Bool
-isHiddenArg arg = argHiding arg == Hidden
-
-makeIrrelevant :: Arg a -> Arg a
-makeIrrelevant a = a { argRelevance = Irrelevant }
-
-makeRelevant :: Arg a -> Arg a
-makeRelevant a = if argRelevance a == Irrelevant
-                  then a { argRelevance = Relevant }
-                  else a
+isHiddenArg arg = argHiding arg /= NotHidden
 
 -- | @xs `withArgsFrom` args@ translates @xs@ into a list of 'Arg's,
 -- using the elements in @args@ to fill in the non-'unArg' fields.
@@ -80,15 +89,6 @@
 xs `withArgsFrom` args =
   zipWith (\x arg -> fmap (const x) arg) xs args
 
-instance Functor Arg where
-    fmap f a = a { unArg = f (unArg a) }
-
-instance Foldable Arg where
-    foldr f z a = f (unArg a) z
-
-instance Traversable Arg where
-    traverse f (Arg h r x) = Arg h r <$> f x
-
 instance HasRange a => HasRange (Arg a) where
     getRange = getRange . unArg
 
@@ -103,7 +103,9 @@
       where
         showH Hidden     s = "{" ++ s ++ "}"
         showH NotHidden  s = "(" ++ s ++ ")"
+        showH Instance   s = "{{" ++ s ++ "}}"
         showR Irrelevant s = "." ++ s
+        showR NonStrict  s = "?" ++ s
         showR Forced     s = "!" ++ s
         showR Relevant   s = "r" ++ s -- Andreas: I want to see it explicitly
 
@@ -111,7 +113,7 @@
     Named { nameOf     :: Maybe name
 	  , namedThing :: a
 	  }
-    deriving (Eq, Ord, Typeable, Data)
+    deriving (Eq, Ord, Typeable, Data, Functor, Foldable, Traversable)
 
 unnamed :: a -> Named name a
 unnamed = Named Nothing
@@ -119,15 +121,6 @@
 named :: name -> a -> Named name a
 named = Named . Just
 
-instance Functor (Named name) where
-    fmap f (Named n x) = Named n $ f x
-
-instance Foldable (Named name) where
-    foldr f z (Named _ x) = f x z
-
-instance Traversable (Named name) where
-    traverse f (Named n x) = Named n <$> f x
-
 instance HasRange a => HasRange (Named name a) where
     getRange = getRange . namedThing
 
@@ -151,6 +144,8 @@
 
 -- | Access modifier.
 data Access = PrivateAccess | PublicAccess
+            | OnlyQualified  -- ^ Visible from outside, but not exported when opening the module
+                             --   Used for qualified constructors.
     deriving (Typeable, Data, Show, Eq, Ord)
 
 -- | Abstract or concrete
diff --git a/src/full/Agda/Syntax/Concrete.hs b/src/full/Agda/Syntax/Concrete.hs
--- a/src/full/Agda/Syntax/Concrete.hs
+++ b/src/full/Agda/Syntax/Concrete.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP, DeriveDataTypeable #-}
+{-# LANGUAGE CPP, DeriveDataTypeable, DeriveFunctor, DeriveTraversable, DeriveFoldable #-}
 
 {-| The concrete syntax is a raw representation of the program text
     without any desugaring at all.  This is what the parser produces.
@@ -8,6 +8,7 @@
 module Agda.Syntax.Concrete
     ( -- * Expressions
       Expr(..)
+    , OpApp(..), fromOrdinary
     , module Agda.Syntax.Concrete.Name
     , appView, AppView(..)
       -- * Bindings
@@ -18,6 +19,7 @@
     , Telescope -- (..)
       -- * Declarations
     , Declaration(..)
+    , ModuleApplication(..)
     , TypeSignature
     , Constructor
     , Field
@@ -29,12 +31,16 @@
     , RHS(..), WhereClause(..)
     , Pragma(..)
     , Module
+    , ThingWithFixity(..)
     , topLevelModuleName
+    -- * Pattern tools
+    , patternHead, patternNames
     )
     where
 
 import Data.Generics (Typeable, Data)
-
+import Data.Foldable hiding (concatMap)
+import Data.Traversable
 import Agda.Syntax.Position
 import Agda.Syntax.Common
 import Agda.Syntax.Fixity
@@ -46,6 +52,15 @@
 import Agda.Utils.Impossible
 #include "../undefined.h"
 
+data OpApp e
+        = SyntaxBindingLambda !Range [LamBinding] e -- ^ an abstraction inside a special syntax declaration (see Issue 358 why we introduce this).
+        | Ordinary e
+    deriving (Typeable, Data, Functor)
+
+fromOrdinary :: e -> OpApp e -> e
+fromOrdinary d (Ordinary e) = e
+fromOrdinary d _            = d
+
 -- | Concrete expressions. Should represent exactly what the user wrote.
 data Expr
 	= Ident QName			       -- ^ ex: @x@
@@ -54,17 +69,20 @@
 	| Underscore !Range (Maybe Nat)	       -- ^ ex: @_@
 	| RawApp !Range [Expr]		       -- ^ before parsing operators
 	| App !Range Expr (NamedArg Expr)      -- ^ ex: @e e@, @e {e}@, or @e {x = e}@
-	| OpApp !Range Name [Expr]	       -- ^ ex: @e + e@
+	| OpApp !Range Name [OpApp Expr]       -- ^ ex: @e + e@
         | WithApp !Range Expr [Expr]           -- ^ ex: @e | e1 | .. | en@
 	| HiddenArg !Range (Named String Expr) -- ^ ex: @{e}@ or @{x=e}@
+	| InstanceArg !Range (Named String Expr) -- ^ ex: @{{e}}@ or @{{x=e}}@
 	| Lam !Range [LamBinding] Expr	       -- ^ ex: @\\x {y} -> e@ or @\\(x:A){y:B} -> e@
         | AbsurdLam !Range Hiding              -- ^ ex: @\\ ()@
+        | ExtendedLam !Range [(LHS,RHS,WhereClause)]       -- ^ ex: @\\ { p11 .. p1a -> e1 ; .. ; pn1 .. pnz -> en }@
 	| Fun !Range Expr Expr                 -- ^ ex: @e -> e@ or @.e -> e@ (NYI: @{e} -> e@)
 	| Pi Telescope Expr		       -- ^ ex: @(xs:e) -> e@ or @{xs:e} -> e@
 	| Set !Range			       -- ^ ex: @Set@
 	| Prop !Range			       -- ^ ex: @Prop@
 	| SetN !Range Nat		       -- ^ ex: @Set0, Set1, ..@
 	| Rec !Range [(Name, Expr)]	       -- ^ ex: @record {x = a; y = b}@
+	| RecUpdate !Range Expr [(Name, Expr)] -- ^ ex: @record e {x = a; y = b}@
 	| Let !Range [Declaration] Expr	       -- ^ ex: @let Ds in e@
 	| Paren !Range Expr		       -- ^ ex: @(e)@
 	| Absurd !Range			       -- ^ ex: @()@ or @{}@, only in patterns
@@ -73,6 +91,9 @@
         | ETel Telescope                       -- ^ only used for printing telescopes
         | QuoteGoal !Range Name Expr           -- ^ ex: @quoteGoal x in e@
         | Quote !Range                         -- ^ ex: @quote@, should be applied to a name
+        | QuoteTerm !Range                     -- ^ ex: @quoteTerm@, should be applied to a term
+        | Unquote !Range                       -- ^ ex: @unquote@, should be applied to a term of type @Term@
+        | DontCare Expr                        -- ^ to print irrelevant things
     deriving (Typeable, Data)
 
 
@@ -83,6 +104,7 @@
 	| RawAppP !Range [Pattern]
 	| OpAppP !Range Name [Pattern]
 	| HiddenP !Range (Named String Pattern)
+	| InstanceP !Range (Named String Pattern)
 	| ParenP !Range Pattern
 	| WildP !Range
 	| AbsurdP !Range
@@ -94,15 +116,15 @@
 
 -- | A lambda binding is either domain free or typed.
 data LamBinding
-	= DomainFree Hiding BoundName -- ^ . @x@ or @{x}@
-	| DomainFull TypedBindings    -- ^ . @(xs:e,..,ys:e')@ or @{xs:e,..,ys:e'}@
+	= DomainFree Hiding Relevance BoundName -- ^ . @x@ or @{x}@ or @.x@ or @.{x}@ or @{.x}@
+	| DomainFull TypedBindings              -- ^ . @(xs : e)@ or @{xs : e}@
     deriving (Typeable, Data)
 
 
 -- | A sequence of typed bindings with hiding information. Appears in dependent
 --   function spaces, typed lambdas, and telescopes.
-data TypedBindings = TypedBindings !Range (Arg [TypedBinding])
-	-- ^ . @(xs:e;..;ys:e')@ or @{xs:e;..;ys:e'}@
+data TypedBindings = TypedBindings !Range (Arg TypedBinding)
+	-- ^ . @(xs : e)@ or @{xs : e}@
     deriving (Typeable, Data)
 
 
@@ -132,7 +154,11 @@
 
    We use fixity information to see which name is actually defined.
 -}
-data LHS = LHS Pattern [Pattern] [RewriteEqn] [WithExpr]
+data LHS = LHS { lhsOriginalPattern :: Pattern
+               , lhsWithPattern     :: [Pattern]
+               , lhsRewriteEqn      :: [RewriteEqn]
+               , lhsWithExpr        :: [WithExpr]
+               }
          -- ^ original pattern, with-patterns, rewrite equations and with-expressions
          | Ellipsis Range [Pattern] [RewriteEqn] [WithExpr]
          -- ^ new with-patterns, rewrite equations and with-expressions
@@ -193,7 +219,7 @@
                        -- ^ The range of the \"as\" keyword. Retained
                        --   for highlighting purposes.
                      }
-    deriving (Typeable, Data)
+    deriving (Typeable, Data, Show)
 
 {--------------------------------------------------------------------------
     Declarations
@@ -209,12 +235,15 @@
 {-| The representation type of a declaration. The comments indicate
     which type in the intended family the constructor targets.
 -}
+
 data Declaration
 	= TypeSig Relevance Name Expr -- ^ Axioms and functions can be irrelevant.
         | Field Name (Arg Expr) -- ^ Record field, can be hidden and/or irrelevant.
 	| FunClause LHS RHS WhereClause
-	| Data        !Range Induction Name [TypedBindings] Expr [Constructor]
-	| Record      !Range Name (Maybe Name) [TypedBindings] Expr [Declaration]
+	| DataSig     !Range Induction Name [LamBinding] Expr -- ^ lone data signature in mutual block
+	| Data        !Range Induction Name [LamBinding] (Maybe Expr) [Constructor]
+	| RecordSig   !Range Name [LamBinding] Expr -- ^ lone record signature in mutual block
+	| Record      !Range Name (Maybe Name) [LamBinding] (Maybe Expr) [Declaration]
           -- ^ The optional name is a name for the record constructor.
 	| Infix Fixity [Name]
         | Syntax      Name Notation -- ^ notation declaration for a name
@@ -225,11 +254,15 @@
 	| Primitive   !Range [TypeSignature]
 	| Open        !Range QName ImportDirective
 	| Import      !Range QName (Maybe AsName) OpenShortHand ImportDirective
-	| ModuleMacro !Range  Name [TypedBindings] Expr OpenShortHand ImportDirective
+	| ModuleMacro !Range  Name ModuleApplication OpenShortHand ImportDirective
 	| Module      !Range QName [TypedBindings] [Declaration]
 	| Pragma      Pragma
     deriving (Typeable, Data)
 
+data ModuleApplication = SectionApp Range [TypedBindings] Expr
+                       | RecordModuleIFS Range QName
+    deriving (Typeable, Data)
+
 data OpenShortHand = DoOpen | DontOpen
     deriving (Typeable, Data, Show)
 
@@ -241,6 +274,8 @@
             | CompiledTypePragma !Range QName String
             | CompiledPragma    !Range QName String
             | CompiledEpicPragma !Range QName String
+            | CompiledJSPragma  !Range QName String
+            | StaticPragma      !Range QName
             | ImportPragma      !Range String
               -- ^ Invariant: The string must be a valid Haskell
               -- module name.
@@ -282,9 +317,55 @@
 appView e = AppView e []
 
 {--------------------------------------------------------------------------
+    Patterns
+ --------------------------------------------------------------------------}
+
+-- | Get the leftmost symbol in a pattern.
+patternHead :: Pattern -> Maybe Name
+patternHead p =
+  case p of
+    IdentP x             -> return $ unqualify x
+    AppP p p'            -> patternHead p
+    RawAppP _ []         -> __IMPOSSIBLE__
+    RawAppP _ (p:_)      -> patternHead p
+    OpAppP _ name ps     -> return $ name
+    HiddenP _ (namedPat) -> patternHead (namedThing namedPat)
+    ParenP _ p           -> patternHead p
+    WildP _              -> Nothing
+    AbsurdP _            -> Nothing
+    AsP _ x p            -> patternHead p
+    DotP{}               -> Nothing
+    LitP (LitQName _ x)  -> Nothing -- return $ unqualify x -- does not compile
+    LitP _               -> Nothing
+    InstanceP _ (namedPat) -> patternHead (namedThing namedPat)
+
+
+-- | Get all the identifiers in a pattern in left-to-right order.
+patternNames :: Pattern -> [Name]
+patternNames p =
+  case p of
+    IdentP x             -> [unqualify x]
+    AppP p p'            -> concatMap patternNames [p, namedThing $ unArg p']
+    RawAppP _ ps         -> concatMap patternNames  ps
+    OpAppP _ name ps     -> name : concatMap patternNames ps
+    HiddenP _ (namedPat) -> patternNames (namedThing namedPat)
+    ParenP _ p           -> patternNames p
+    WildP _              -> []
+    AbsurdP _            -> []
+    AsP _ x p            -> patternNames p
+    DotP{}               -> []
+    LitP _               -> []
+    InstanceP _ (namedPat) -> patternNames (namedThing namedPat)
+
+{--------------------------------------------------------------------------
     Instances
  --------------------------------------------------------------------------}
 
+instance HasRange e => HasRange (OpApp e) where
+    getRange e = case e of
+        Ordinary e -> getRange e
+        SyntaxBindingLambda r _ _ -> r
+
 instance HasRange Expr where
     getRange e =
 	case e of
@@ -298,6 +379,7 @@
             WithApp r _ _       -> r
 	    Lam r _ _		-> r
             AbsurdLam r _       -> r
+            ExtendedLam r _       -> r
 	    Fun r _ _		-> r
 	    Pi b e		-> fuseRange b e
 	    Set r		-> r
@@ -309,10 +391,15 @@
 	    Dot r _		-> r
 	    Absurd r		-> r
 	    HiddenArg r _	-> r
+	    InstanceArg r _	-> r
 	    Rec r _		-> r
+	    RecUpdate r _ _	-> r
             ETel tel            -> getRange tel
             QuoteGoal r _ _     -> r
             Quote r             -> r
+            QuoteTerm r         -> r
+            Unquote r           -> r
+            DontCare{}          -> noRange
 
 -- instance HasRange Telescope where
 --     getRange (TeleBind bs) = getRange bs
@@ -326,7 +413,7 @@
     getRange (TNoBind e)   = getRange e
 
 instance HasRange LamBinding where
-    getRange (DomainFree _ x)	= getRange x
+    getRange (DomainFree _ _ x)	= getRange x
     getRange (DomainFull b)	= getRange b
 
 instance HasRange BoundName where
@@ -337,16 +424,22 @@
   getRange (AnyWhere ds)    = getRange ds
   getRange (SomeWhere _ ds) = getRange ds
 
+instance HasRange ModuleApplication where
+  getRange (SectionApp r _ _) = r
+  getRange (RecordModuleIFS r _) = r
+
 instance HasRange Declaration where
     getRange (TypeSig _ x t)	       = fuseRange x t
     getRange (Field x t)               = fuseRange x t
     getRange (FunClause lhs rhs wh)    = fuseRange lhs rhs `fuseRange` wh
+    getRange (DataSig r _ _ _ _)       = r
     getRange (Data r _ _ _ _ _)	       = r
+    getRange (RecordSig r _ _ _)       = r
     getRange (Record r _ _ _ _ _)      = r
     getRange (Mutual r _)	       = r
     getRange (Abstract r _)	       = r
     getRange (Open r _ _)	       = r
-    getRange (ModuleMacro r _ _ _ _ _) = r
+    getRange (ModuleMacro r _ _ _ _)   = r
     getRange (Import r _ _ _ _)	       = r
     getRange (Private r _)	       = r
     getRange (Postulate r _)	       = r
@@ -371,6 +464,8 @@
     getRange (CompiledTypePragma r _ _)   = r
     getRange (CompiledPragma r _ _)       = r
     getRange (CompiledEpicPragma r _ _)   = r
+    getRange (CompiledJSPragma r _ _)     = r
+    getRange (StaticPragma r _)           = r
     getRange (ImportPragma r _)           = r
     getRange (ImpossiblePragma r)         = r
     getRange (EtaPragma r _)              = r
@@ -403,4 +498,5 @@
     getRange (AbsurdP r)	= r
     getRange (LitP l)		= getRange l
     getRange (HiddenP r _)	= r
+    getRange (InstanceP r _)	= r
     getRange (DotP r _)		= r
diff --git a/src/full/Agda/Syntax/Concrete/Definitions.hs b/src/full/Agda/Syntax/Concrete/Definitions.hs
--- a/src/full/Agda/Syntax/Concrete/Definitions.hs
+++ b/src/full/Agda/Syntax/Concrete/Definitions.hs
@@ -2,7 +2,6 @@
 
 module Agda.Syntax.Concrete.Definitions
     ( NiceDeclaration(..)
-    , NiceDefinition(..)
     , NiceConstructor, NiceTypeSignature
     , Clause(..)
     , DeclarationException(..)
@@ -11,15 +10,19 @@
     , notSoNiceDeclarations
     ) where
 
+import Control.Arrow ((***), (&&&))
 import Control.Applicative
-
 import Data.Generics (Typeable, Data)
+import Data.Foldable hiding (concatMap, mapM_, notElem, elem, all)
 import qualified Data.Map as Map
+import Data.Map (Map)
 import Control.Monad.Error
+import Control.Monad.State
 import Data.List
 import Data.Maybe
-import qualified Data.Traversable as Trav
+import Data.Traversable (traverse)
 
+import Debug.Trace (trace)
 import Agda.Syntax.Concrete
 import Agda.Syntax.Common
 import Agda.Syntax.Position
@@ -27,10 +30,18 @@
 import Agda.Syntax.Notation
 import Agda.Syntax.Concrete.Pretty
 import Agda.Utils.Pretty
+import Agda.Utils.List (mhead, isSublistOf)
+import Agda.Utils.Monad
 
 #include "../../undefined.h"
 import Agda.Utils.Impossible
 
+import Control.Applicative
+import Control.Monad.Error
+import Data.Char
+
+import Debug.Trace
+
 {--------------------------------------------------------------------------
     Types
  --------------------------------------------------------------------------}
@@ -41,78 +52,81 @@
     modifiers have been distributed to the individual declarations.
 -}
 data NiceDeclaration
-	= Axiom Range Fixity' Access IsAbstract Relevance Name Expr
+        = Axiom Range Fixity' Access Relevance Name Expr
             -- ^ Axioms and functions can be declared irrelevant.
         | NiceField Range Fixity' Access IsAbstract Name (Arg Expr)
-	| PrimitiveFunction Range Fixity' Access IsAbstract Name Expr
-	| NiceDef Range [Declaration] [NiceTypeSignature] [NiceDefinition]
-	    -- ^ A bunch of mutually recursive functions\/datatypes.
-	    --   The last two lists have the same length. The first list is the
-	    --   concrete declarations these definitions came from.
-	| NiceModule Range Access IsAbstract QName Telescope [Declaration]
-	| NiceModuleMacro Range Access IsAbstract Name Telescope Expr OpenShortHand ImportDirective
-	| NiceOpen Range QName ImportDirective
-	| NiceImport Range QName (Maybe AsName) OpenShortHand ImportDirective
-	| NicePragma Range Pragma
-    deriving (Typeable, Data)
-
--- | A definition without its type signature.
-data NiceDefinition
-	= FunDef  Range [Declaration] Fixity' Access IsAbstract Name [Clause]
-	| DataDef Range Fixity' Access IsAbstract Name [LamBinding] [NiceConstructor]
-	| RecDef Range Fixity' Access IsAbstract Name (Maybe NiceConstructor) [LamBinding] [NiceDeclaration]
-          -- ^ The 'NiceConstructor' has a dummy type field (the
-          --   record constructor type has not been computed yet).
-    deriving (Typeable, Data)
+        | PrimitiveFunction Range Fixity' Access IsAbstract Name Expr
+        | NiceMutual Range [NiceDeclaration]
+        | NiceModule Range Access IsAbstract QName Telescope [Declaration]
+        | NiceModuleMacro Range Access IsAbstract Name ModuleApplication OpenShortHand ImportDirective
+        | NiceOpen Range QName ImportDirective
+        | NiceImport Range QName (Maybe AsName) OpenShortHand ImportDirective
+        | NicePragma Range Pragma
+        | NiceRecSig Range Fixity' Access Name [LamBinding] Expr
+        | NiceDataSig Range Fixity' Access Name [LamBinding] Expr
+        | FunSig Range Fixity' Access Relevance Name Expr
+        | FunDef  Range [Declaration] Fixity' IsAbstract Name [Clause] -- ^ block of function clauses (we have seen the type signature before)
+        | DataDef Range Fixity' IsAbstract Name [LamBinding] [NiceConstructor]
+        | RecDef Range Fixity' IsAbstract Name (Maybe (ThingWithFixity Name)) [LamBinding] [NiceDeclaration]
+    deriving (Typeable, Data, Show)
 
 -- | Only 'Axiom's.
 type NiceConstructor = NiceTypeSignature
 
 -- | Only 'Axiom's.
-type NiceTypeSignature	= NiceDeclaration
+type NiceTypeSignature  = NiceDeclaration
 
 -- | One clause in a function definition. There is no guarantee that the 'LHS'
 --   actually declares the 'Name'. We will have to check that later.
 data Clause = Clause Name LHS RHS WhereClause [Clause]
-    deriving (Typeable, Data)
+    deriving (Typeable, Data, Show)
 
 -- | The exception type.
 data DeclarationException
-	= MultipleFixityDecls [(Name, [Fixity'])]
-	| MissingDefinition Name
+        = MultipleFixityDecls [(Name, [Fixity'])]
+        | MissingDefinition Name
         | MissingWithClauses Name
-	| MissingTypeSignature LHS
-	| NotAllowedInMutual NiceDeclaration
-	| UnknownNamesInFixityDecl [Name]
+        | MissingTypeSignature LHS
+        | MissingDataSignature Name
+        | NotAllowedInMutual NiceDeclaration
+        | UnknownNamesInFixityDecl [Name]
         | Codata Range
-	| DeclarationPanic String
+        | DeclarationPanic String
+        | UselessPrivate Range
+        | UselessAbstract Range
+        | AmbiguousFunClauses LHS [Name] -- ^ in a mutual block, a clause could belong to any of the @[Name]@ type signatures
     deriving (Typeable)
 
 instance HasRange DeclarationException where
-    getRange (MultipleFixityDecls xs)	   = getRange (fst $ head xs)
-    getRange (MissingDefinition x)	   = getRange x
+    getRange (MultipleFixityDecls xs)      = getRange (fst $ head xs)
+    getRange (MissingDefinition x)         = getRange x
     getRange (MissingWithClauses x)        = getRange x
-    getRange (MissingTypeSignature x)	   = getRange x
-    getRange (NotAllowedInMutual x)	   = getRange x
+    getRange (MissingTypeSignature x)      = getRange x
+    getRange (MissingDataSignature x)      = getRange x
+    getRange (AmbiguousFunClauses lhs xs)  = getRange lhs
+    getRange (NotAllowedInMutual x)        = getRange x
     getRange (UnknownNamesInFixityDecl xs) = getRange . head $ xs
     getRange (Codata r)                    = r
-    getRange (DeclarationPanic _)	   = noRange
+    getRange (DeclarationPanic _)          = noRange
+    getRange (UselessPrivate r)            = r
+    getRange (UselessAbstract r)           = r
 
 instance HasRange NiceDeclaration where
-    getRange (Axiom r _ _ _ _ _ _)	       = r
-    getRange (NiceField r _ _ _ _ _)	       = r
-    getRange (NiceDef r _ _ _)		       = r
-    getRange (NiceModule r _ _ _ _ _)	       = r
-    getRange (NiceModuleMacro r _ _ _ _ _ _ _) = r
-    getRange (NiceOpen r _ _)		       = r
-    getRange (NiceImport r _ _ _ _)	       = r
-    getRange (NicePragma r _)		       = r
-    getRange (PrimitiveFunction r _ _ _ _ _)   = r
-
-instance HasRange NiceDefinition where
-  getRange (FunDef r _ _ _ _ _ _)   = r
-  getRange (DataDef r _ _ _ _ _ _)  = r
-  getRange (RecDef r _ _ _ _ _ _ _) = r
+  getRange (Axiom r _ _ _ _ _)             = r
+  getRange (NiceField r _ _ _ _ _)         = r
+  getRange (NiceMutual r _)                = r
+  getRange (NiceModule r _ _ _ _ _)        = r
+  getRange (NiceModuleMacro r _ _ _ _ _ _) = r
+  getRange (NiceOpen r _ _)                = r
+  getRange (NiceImport r _ _ _ _)          = r
+  getRange (NicePragma r _)                = r
+  getRange (PrimitiveFunction r _ _ _ _ _) = r
+  getRange (FunSig r _ _ _ _ _)            = r
+  getRange (FunDef r _ _ _ _ _)            = r
+  getRange (DataDef r _ _ _ _ _)           = r
+  getRange (RecDef r _ _ _ _ _ _)          = r
+  getRange (NiceRecSig r _ _ _ _ _)        = r
+  getRange (NiceDataSig r _ _ _ _ _)       = r
 
 instance Error DeclarationException where
   noMsg  = strMsg ""
@@ -121,30 +135,40 @@
 instance Show DeclarationException where
   show (MultipleFixityDecls xs) = show $
     sep [ fsep $ pwords "Multiple fixity declarations for"
-	, vcat $ map f xs
-	]
+        , vcat $ map f xs
+        ]
       where
-	f (x, fs) = pretty x <> text ":" <+> fsep (map (text . show) fs)
+        f (x, fs) = pretty x <> text ":" <+> fsep (map (text . show) fs)
   show (MissingDefinition x) = show $ fsep $
     pwords "Missing definition for" ++ [pretty x]
   show (MissingWithClauses x) = show $ fsep $
     pwords "Missing with-clauses for function" ++ [pretty x]
   show (MissingTypeSignature x) = show $ fsep $
     pwords "Missing type signature for left hand side" ++ [pretty x]
+  show (MissingDataSignature x) = show $ fsep $
+    pwords "Missing type signature for " ++ [pretty x]
+  show (AmbiguousFunClauses lhs xs) = show $ fsep $
+    pwords "More than one matching type signature for left hand side" ++ [pretty lhs] ++
+    pwords "it could belong to any of:" ++ map pretty xs
   show (UnknownNamesInFixityDecl xs) = show $ fsep $
     pwords "Names out of scope in fixity declarations:" ++ map pretty xs
+  show (UselessPrivate _)      = show $ fsep $
+    pwords "Using private here has no effect. Move it to the type signatures to make the definitions private."
+  show (UselessAbstract _)      = show $ fsep $
+    pwords "Using abstract here has no effect. Move it to the definitions to make them abstract."
   show (NotAllowedInMutual nd) = show $ fsep $
     [text $ decl nd] ++ pwords "are not allowed in mutual blocks"
     where
-      decl (Axiom{})		 = "Postulates"
+      decl (Axiom{})             = "Postulates"
       decl (NiceField{})         = "Fields"
-      decl (NiceDef{})		 = "Record types"
-      decl (NiceModule{})	 = "Modules"
+      decl (NiceMutual{})        = "Mutual blocks"
+      decl (NiceModule{})        = "Modules"
       decl (NiceModuleMacro{})   = "Modules"
-      decl (NiceOpen{})		 = "Open declarations"
-      decl (NiceImport{})	 = "Import statements"
-      decl (NicePragma{})	 = "Pragmas"
+      decl (NiceOpen{})          = "Open declarations"
+      decl (NiceImport{})        = "Import statements"
+      decl (NicePragma{})        = "Pragmas"
       decl (PrimitiveFunction{}) = "Primitive declarations"
+      decl _ = __IMPOSSIBLE__
   show (Codata _) =
     "The codata construction has been removed. " ++
     "Use the INFINITY builtin instead."
@@ -154,304 +178,447 @@
     The niceifier
  --------------------------------------------------------------------------}
 
-type Nice = Either DeclarationException
+data InMutual
+  = InMutual    -- ^ we are nicifying a mutual block
+  | NotInMutual -- ^ we are nicifying decls not in a mutual block
+    deriving (Eq, Show)
 
-runNice :: Nice a -> Either DeclarationException a
-runNice = id
+data DataRecOrFun = DataName | RecName | FunName
+  deriving (Eq, Ord)
 
-niceDeclarations :: [Declaration] -> Nice [NiceDeclaration]
-niceDeclarations ds = do
-      fixs <- fixities ds
-      case Map.keys fixs \\ concatMap declaredNames ds of
-	[]  -> nice fixs ds
-	xs  -> throwError $ UnknownNamesInFixityDecl xs
-    where
+data NiceEnv = NiceEnv
+  { loneSigs :: [(DataRecOrFun, Name)]   -- ^ lone type signatures that wait for their fun.clauses
+  , fixs     :: Map Name Fixity'
+  }
 
-	-- If no fixity is given we return the default fixity.
-	fixity :: Name -> Map.Map Name Fixity' -> Fixity'
-	fixity = Map.findWithDefault defaultFixity'
+initNiceEnv :: NiceEnv
+initNiceEnv = NiceEnv
+  { loneSigs = []
+  , fixs     = Map.empty
+  }
 
-	-- We forget all fixities in recursive calls. This is because
-	-- fixity declarations have to appear at the same level as the
-	-- declaration.
-	fmapNice x = mapM niceDeclarations x
+type Nice = StateT NiceEnv (Either DeclarationException)
 
-	-- Compute the names defined in a declaration
-	declaredNames :: Declaration -> [Name]
-	declaredNames d = case d of
-	  TypeSig _ x _				       -> [x]
-          Field x _                                    -> [x]
-	  FunClause (LHS p [] _ _) _ _
-            | IdentP (QName x) <- noSingletonRawAppP p -> [x]
-	  FunClause{}				       -> []
-	  Data _ _ x _ _ cs			       -> x : concatMap declaredNames cs
-	  Record _ x c _ _ _			       -> x : maybeToList c
-	  Infix _ _				       -> []
-          Syntax _ _                                   -> []
-	  Mutual _ ds				       -> concatMap declaredNames ds
-	  Abstract _ ds				       -> concatMap declaredNames ds
-	  Private _ ds				       -> concatMap declaredNames ds
-	  Postulate _ ds			       -> concatMap declaredNames ds
-	  Primitive _ ds			       -> concatMap declaredNames ds
-	  Open{}				       -> []
-	  Import{}				       -> []
-	  ModuleMacro{}				       -> []
-	  Module{}				       -> []
-	  Pragma{}				       -> []
+localState :: Nice a -> Nice a
+localState m = bracket get put (const m)
 
-        niceFix fixs ds = do
-	  fixs <- plusFixities fixs =<< fixities ds
-          nice fixs ds
+addLoneSig :: DataRecOrFun -> Name -> Nice ()
+addLoneSig k x = modify $ \ niceEnv -> niceEnv { loneSigs = (k, x) : loneSigs niceEnv }
 
-	nice _ []	 = return []
-	nice fixs (d:ds) =
-	    case d of
-		TypeSig rel x t ->
-		    -- After a type signature there should follow a bunch of
-		    -- clauses.
-		    case span (isFunClauseOf x) ds of
-			([], _)	    -> throwError $ MissingDefinition x
-			(ds0,ds1)   -> do
-			  ds1 <- nice fixs ds1
-			  d <- mkFunDef rel fixs x (Just t) ds0
-                          return $ d : ds1
+removeLoneSig :: DataRecOrFun -> Name -> Nice ()
+removeLoneSig k x = modify $ \ niceEnv -> niceEnv { loneSigs = delete (k, x) $ loneSigs niceEnv }
 
-		cl@(FunClause lhs@(LHS p [] _ _) _ _)
-                  | IdentP (QName x) <- noSingletonRawAppP p
-                                  -> do
-		      ds <- nice fixs ds
-		      d <- mkFunDef Relevant fixs x Nothing [cl] -- fun def without type signature is relevant
-                      return $ d : ds
-                FunClause lhs _ _ -> throwError $ MissingTypeSignature lhs
+hasSig :: DataRecOrFun -> Name -> Nice Bool
+hasSig k x = gets $ elem (k, x) . loneSigs
 
-		_   -> liftM2 (++) nds (nice fixs ds)
-		    where
-			nds = case d of
-                            Field x t                     -> return $ niceAxioms fixs [ d ]
-			    Data r CoInductive x tel t cs -> throwError (Codata r)
-			    Data r Inductive   x tel t cs -> dataOrRec DataDef niceAx r x tel t cs
-			    Record r x c tel t cs         -> do
-                              let c' = (\c -> niceAxiom fixs (TypeSig Relevant c t)) <$> c -- constructor is always relevant
-                              dataOrRec (\x1 x2 x3 x4 x5 -> RecDef x1 x2 x3 x4 x5 c')
-                                        (const niceDeclarations) r x tel t cs
-			    Mutual r ds -> do
-			      d <- mkMutual r [d] =<< niceFix fixs ds
-			      return [d]
+noLoneSigs :: Nice Bool
+noLoneSigs = gets $ null . loneSigs
 
-			    Abstract r ds -> do
-			      map mkAbstract <$> niceFix fixs ds
+checkLoneSigs :: Nice ()
+checkLoneSigs = do
+  xs <- gets loneSigs
+  case xs of
+    []       -> return ()
+    (_, x):_ -> throwError $ MissingDefinition x
 
-			    Private _ ds -> do
-			      map mkPrivate <$> niceFix fixs ds
+getFixity :: Name -> Nice Fixity'
+getFixity x = gets $ Map.findWithDefault defaultFixity' x . fixs
 
-			    Postulate _ ds -> return $ niceAxioms fixs ds
+runNice :: Nice a -> Either DeclarationException a
+runNice nice = nice `evalStateT` initNiceEnv
 
-			    Primitive _ ds -> return $ map toPrim $ niceAxioms fixs ds
+data DeclKind = LoneSig DataRecOrFun Name | LoneDef DataRecOrFun Name | OtherDecl
 
-			    Module r x tel ds	-> return
-				[ NiceModule r PublicAccess ConcreteDef x tel ds ]
+declKind (FunSig _ _ _ _ x _)      = LoneSig FunName x
+declKind (NiceRecSig _ _ _ x _ _)  = LoneSig RecName x
+declKind (NiceDataSig _ _ _ x _ _) = LoneSig DataName x
+declKind (FunDef _ _ _ _ x _)      = LoneDef FunName x
+declKind (DataDef _ _ _ x _ _)     = LoneDef DataName x
+declKind (RecDef _ _ _ x _ _ _)    = LoneDef RecName x
+declKind _                         = OtherDecl
 
-			    ModuleMacro r x tel e op is -> return
-				[ NiceModuleMacro r PublicAccess ConcreteDef x tel e op is ]
+niceDeclarations :: [Declaration] -> Nice [NiceDeclaration]
+niceDeclarations ds = do
+  fixs <- fixities ds
+  case Map.keys fixs \\ concatMap declaredNames ds of
+    []  -> localState $ do
+      put $ initNiceEnv { fixs = fixs }
+      ds <- nice ds
+      checkLoneSigs
+      modify $ \s -> s { loneSigs = [] }
+      inferMutualBlocks ds
+    xs  -> throwError $ UnknownNamesInFixityDecl xs
+  where
+    -- Compute the names defined in a declaration
+    declaredNames :: Declaration -> [Name]
+    declaredNames d = case d of
+      TypeSig _ x _                                -> [x]
+      Field x _                                    -> [x]
+      FunClause (LHS p [] _ _) _ _
+        | IdentP (QName x) <- removeSingletonRawAppP p -> [x]
+      FunClause{}                                  -> []
+      DataSig _ _ x _ _                            -> [x]
+      Data _ _ x _ _ cs                            -> x : concatMap declaredNames cs
+      RecordSig _ x _ _                            -> [x]
+      Record _ x c _ _ _                           -> x : foldMap (:[]) c
+      Infix _ _                                    -> []
+      Syntax _ _                                   -> []
+      Mutual _ ds                                  -> concatMap declaredNames ds
+      Abstract _ ds                                -> concatMap declaredNames ds
+      Private _ ds                                 -> concatMap declaredNames ds
+      Postulate _ ds                               -> concatMap declaredNames ds
+      Primitive _ ds                               -> concatMap declaredNames ds
+      Open{}                                       -> []
+      Import{}                                     -> []
+      ModuleMacro{}                                -> []
+      Module{}                                     -> []
+      Pragma{}                                     -> []
 
-			    Infix _ _		-> return []
-			    Syntax _ _		-> return []
-			    Open r x is		-> return [NiceOpen r x is]
-			    Import r x as op is	-> return [NiceImport r x as op is]
+    inferMutualBlocks :: [NiceDeclaration] -> Nice [NiceDeclaration]
+    inferMutualBlocks [] = return []
+    inferMutualBlocks (d : ds) =
+      case declKind d of
+        OtherDecl   -> (d :) <$> inferMutualBlocks ds
+        LoneDef _ x -> __IMPOSSIBLE__
+        LoneSig k x -> do
+          addLoneSig k x
+          (ds0, ds1) <- untilAllDefined ds
+          (NiceMutual (getRange (d : ds0)) (d : ds0) :) <$> inferMutualBlocks ds1
+      where
+        untilAllDefined ds = do
+          done <- noLoneSigs
+          if done then return ([], ds) else
+            case ds of
+              []     -> __IMPOSSIBLE__ <$ checkLoneSigs
+              d : ds -> case declKind d of
+                LoneSig k x -> addLoneSig    k x >> cons d (untilAllDefined ds)
+                LoneDef k x -> removeLoneSig k x >> cons d (untilAllDefined ds)
+                OtherDecl   -> cons d (untilAllDefined ds)
+          where
+            cons d = fmap ((d :) *** id)
 
-			    Pragma p		-> return [NicePragma (getRange p) p]
+    nice :: [Declaration] -> Nice [NiceDeclaration]
+    nice [] = return []
+    nice (d:ds) = do
+      case d of
+        TypeSig rel x t -> do
+           fx <- getFixity x
+           -- register x as lone type signature, to recognize clauses later
+           addLoneSig FunName x
+           ds <- nice ds
+           return $ FunSig (getRange d) fx PublicAccess rel x t : ds
+        cl@(FunClause lhs _ _) -> do
+          xs <- gets $ map snd . filter ((== FunName) . fst) . loneSigs
+          -- for each type signature 'x' waiting for clauses, we try
+          -- if we have some clauses for 'x'
+          fixs <- gets fixs
+          case filter (\ (x,(fits,rest)) -> not $ null fits) $
+                  map (\ x -> (x, span (couldBeFunClauseOf (Map.lookup x fixs) x) $ d : ds)) xs of
+            -- case: clauses match none of the sigs
+            -- treat it as a function clause without a type signature
+            [] -> case lhs of
+              LHS p [] _ _ | IdentP (QName x) <- removeSingletonRawAppP p -> do
+                ds <- nice ds
+                d  <- mkFunDef Relevant x Nothing [cl] -- fun def without type signature is relevant
+                return $ d ++ ds
+              _ -> throwError $ MissingTypeSignature lhs
+            -- case: clauses match exactly one of the sigs
+            [(x,(fits,rest))] -> do
+               removeLoneSig FunName x
+               cs  <- mkClauses x $ expandEllipsis fits
+               ds1 <- nice rest
+               fx  <- getFixity x
+               d   <- return $ FunDef (getRange fits) fits fx ConcreteDef x cs
+               return $ d : ds1
+            -- case: clauses match more than one sigs (ambiguity)
+            l -> throwError $ AmbiguousFunClauses lhs (map fst l) -- "ambiguous function clause; cannot assign it uniquely to one type signature"
 
-			    FunClause _ _ _	-> __IMPOSSIBLE__
-			    TypeSig{}		-> __IMPOSSIBLE__
-			  where
-			    dataOrRec mkDef niceD r x tel t cs = do
-                              ds <- niceD fixs cs
-                              return $
-                                [ NiceDef r [d]
-                                  [ Axiom (fuseRange x t) f PublicAccess ConcreteDef Relevant
-                                          x (Pi tel t)
-                                  ]
-                                  -- Setting the range to the range of t makes sense
-                                  -- since the only errors you get at the level of the
-                                  -- definitions are the type not ending in a sort.
-                                  [ mkDef (getRange t) f PublicAccess ConcreteDef x
-                                          (concatMap binding tel)
-                                          ds
-                                  ]
-                                ]
-                              where
-                                f = fixity x fixs
-                                binding (TypedBindings _ (Arg h rel bs)) =
-                                    concatMap (bind h) bs
-                                bind h (TBind _ xs _) =
-                                    map (DomainFree h) xs
-                                bind h (TNoBind e) =
-                                    [ DomainFree h $ mkBoundName_ (noName (getRange e)) ]
+        Field x t                     -> (++) <$> niceAxioms [ d ] <*> nice ds
+        DataSig r CoInductive x tel t -> throwError (Codata r)
+        Data r CoInductive x tel t cs -> throwError (Codata r)
+        DataSig r Inductive   x tel t -> do
+          addLoneSig DataName x
+          (++) <$> dataOrRec DataDef NiceDataSig niceAxioms r x tel (Just t) Nothing
+               <*> nice ds
+        Data r Inductive x tel t cs -> do
+          t <- defaultTypeSig DataName x t
+          (++) <$> dataOrRec DataDef NiceDataSig niceAxioms r x tel t (Just cs)
+               <*> nice ds
+        RecordSig r x tel t -> do
+          addLoneSig RecName x
+          fx <- getFixity x
+          (NiceRecSig r fx PublicAccess x tel t :) <$> nice ds
+        Record r x c tel t cs -> do
+          t <- defaultTypeSig RecName x t
+          c <- traverse (\c -> ThingWithFixity c <$> getFixity c) c
+          (++) <$> dataOrRec (\x1 x2 x3 x4 -> RecDef x1 x2 x3 x4 c) NiceRecSig
+                             niceDeclarations r x tel t (Just cs)
+               <*> nice ds
+        Mutual r ds' ->
+          (:) <$> (mkOldMutual r =<< nice ds') <*> nice ds
 
+        Abstract r ds' ->
+          (++) <$> (abstractBlock r =<< nice ds') <*> nice ds
 
+        Private r ds' ->
+          (++) <$> (privateBlock r =<< nice ds') <*> nice ds
 
-	-- Translate axioms
-        niceAx fixs ds = return $ niceAxioms fixs ds
+        Postulate _ ds' -> (++) <$> niceAxioms ds' <*> nice ds
 
-	niceAxioms :: Map.Map Name Fixity' -> [TypeSignature] -> [NiceDeclaration]
-	niceAxioms fixs ds = map (niceAxiom fixs) ds
+        Primitive _ ds' -> (++) <$> (map toPrim <$> niceAxioms ds') <*> nice ds
 
-        niceAxiom :: Map.Map Name Fixity' -> TypeSignature -> NiceDeclaration
-        niceAxiom fixs d@(TypeSig rel x t) =
-            Axiom (getRange d) (fixity x fixs) PublicAccess ConcreteDef rel x t
-        niceAxiom fixs d@(Field x argt) =
-            NiceField (getRange d) (fixity x fixs) PublicAccess ConcreteDef x argt
-        niceAxiom _ _ = __IMPOSSIBLE__
+        Module r x tel ds' ->
+          (NiceModule r PublicAccess ConcreteDef x tel ds' :) <$> nice ds
 
-	toPrim :: NiceDeclaration -> NiceDeclaration
-	toPrim (Axiom r f a c rel x t) = PrimitiveFunction r f a c x t
-	toPrim _		       = __IMPOSSIBLE__
+        ModuleMacro r x modapp op is ->
+          (NiceModuleMacro r PublicAccess ConcreteDef x modapp op is :)
+            <$> nice ds
 
-	-- Create a function definition.
-	mkFunDef rel fixs x mt ds0 = do
-          cs <- mkClauses x $ expandEllipsis ds0
-          return $
-	    NiceDef (fuseRange x ds0)
-		    (TypeSig rel x t : ds0)
-		    [ Axiom (fuseRange x t) f PublicAccess ConcreteDef rel x t ]
-		    [ FunDef (getRange ds0) ds0 f PublicAccess ConcreteDef x cs
-		    ]
-	    where
-	      f = fixity x fixs
-	      t = case mt of
-		    Just t  -> t
-		    Nothing -> Underscore (getRange x) Nothing
+        Infix _ _           -> nice ds
+        Syntax _ _          -> nice ds
+        Open r x is         -> (NiceOpen r x is :) <$> nice ds
+        Import r x as op is -> (NiceImport r x as op is :) <$> nice ds
 
+        Pragma p            -> (NicePragma (getRange p) p :) <$> nice ds
 
-        expandEllipsis :: [Declaration] -> [Declaration]
-        expandEllipsis [] = []
-        expandEllipsis (d@(FunClause Ellipsis{} _ _) : ds) =
-          d : expandEllipsis ds
-        expandEllipsis (d@(FunClause lhs@(LHS p ps _ _) _ _) : ds) =
+    -- We could add a default type signature here, but at the moment we can't
+    -- infer the type of a record or datatype, so better to just fail here.
+    defaultTypeSig k x t@Just{} = return t
+    defaultTypeSig k x Nothing  =
+      ifM (hasSig k x)
+          (Nothing <$ removeLoneSig k x)
+          (throwError $ MissingDataSignature x)
+
+    dataOrRec mkDef mkSig niceD r x tel mt mcs = do
+      mds <- traverse niceD mcs
+      f   <- getFixity x
+      return $
+         [mkSig (fuseRange x t) f PublicAccess x tel t | Just t <- [mt] ] ++
+         [mkDef (getRange x) f ConcreteDef x (concatMap dropType tel) ds | Just ds <- [mds] ]
+      where
+        dropType (DomainFull (TypedBindings r (Arg h rel TNoBind{}))) =
+          [DomainFree h rel $ mkBoundName_ $ noName r]
+        dropType (DomainFull (TypedBindings r (Arg h rel (TBind _ xs _)))) =
+          map (DomainFree h rel) xs
+        dropType b@DomainFree{} = [b]
+
+    -- Translate axioms
+    niceAxioms :: [TypeSignature] -> Nice [NiceDeclaration]
+    niceAxioms ds = mapM niceAxiom ds
+
+    niceAxiom :: TypeSignature -> Nice NiceDeclaration
+    niceAxiom d@(TypeSig rel x t) = do
+      fx <- getFixity x
+      return $ Axiom (getRange d) fx PublicAccess rel x t
+    niceAxiom d@(Field x argt) = do
+      fx <- getFixity x
+      return $ NiceField (getRange d) fx PublicAccess ConcreteDef x argt
+    niceAxiom _ = __IMPOSSIBLE__
+
+    toPrim :: NiceDeclaration -> NiceDeclaration
+    toPrim (Axiom r f a rel x t) = PrimitiveFunction r f a ConcreteDef x t
+    toPrim _                     = __IMPOSSIBLE__
+
+    -- Create a function definition.
+    mkFunDef rel x mt ds0 = do
+      cs <- mkClauses x $ expandEllipsis ds0
+      f  <- getFixity x
+      return [ FunSig (fuseRange x t) f PublicAccess rel x t
+             , FunDef (getRange ds0) ds0 f ConcreteDef x cs ]
+        where
+          t = case mt of
+                Just t  -> t
+                Nothing -> underscore (getRange x)
+
+    underscore r = Underscore r Nothing
+
+
+    expandEllipsis :: [Declaration] -> [Declaration]
+    expandEllipsis [] = []
+    expandEllipsis (d@(FunClause Ellipsis{} _ _) : ds) =
+      d : expandEllipsis ds
+    expandEllipsis (d@(FunClause lhs@(LHS p ps _ _) _ _) : ds) =
+      d : expand p ps ds
+      where
+        expand _ _ [] = []
+        expand p ps (FunClause (Ellipsis _ ps' eqs []) rhs wh : ds) =
+          FunClause (LHS p (ps ++ ps') eqs []) rhs wh : expand p ps ds
+        expand p ps (FunClause (Ellipsis _ ps' eqs es) rhs wh : ds) =
+          FunClause (LHS p (ps ++ ps') eqs es) rhs wh : expand p (ps ++ ps') ds
+        expand p ps (d@(FunClause (LHS _ _ _ []) _ _) : ds) =
           d : expand p ps ds
-          where
-            expand _ _ [] = []
-            expand p ps (FunClause (Ellipsis _ ps' eqs []) rhs wh : ds) =
-              FunClause (LHS p (ps ++ ps') eqs []) rhs wh : expand p ps ds
-            expand p ps (FunClause (Ellipsis _ ps' eqs es) rhs wh : ds) =
-              FunClause (LHS p (ps ++ ps') eqs es) rhs wh : expand p (ps ++ ps') ds
-            expand p ps (d@(FunClause (LHS _ _ _ []) _ _) : ds) =
-              d : expand p ps ds
-            expand _ _ (d@(FunClause (LHS p ps _ (_ : _)) _ _) : ds) =
-              d : expand p ps ds
-            expand _ _ (_ : ds) = __IMPOSSIBLE__
-        expandEllipsis (_ : ds) = __IMPOSSIBLE__
+        expand _ _ (d@(FunClause (LHS p ps _ (_ : _)) _ _) : ds) =
+          d : expand p ps ds
+        expand _ _ (_ : ds) = __IMPOSSIBLE__
+    expandEllipsis (_ : ds) = __IMPOSSIBLE__
 
 
-        -- Turn function clauses into nice function clauses.
-        mkClauses :: Name -> [Declaration] -> Nice [Clause]
-        mkClauses _ [] = return []
-        mkClauses x (FunClause lhs@(LHS _ _ _ []) rhs wh : cs) =
-          (Clause x lhs rhs wh [] :) <$> mkClauses x cs
-        mkClauses x (FunClause lhs@(LHS _ ps _ es) rhs wh : cs) = do
-          when (null with) $ throwError $ MissingWithClauses x
-          wcs <- mkClauses x with
-          (Clause x lhs rhs wh wcs :) <$> mkClauses x cs'
-          where
-            (with, cs') = span subClause cs
+    -- Turn function clauses into nice function clauses.
+    mkClauses :: Name -> [Declaration] -> Nice [Clause]
+    mkClauses _ [] = return []
+    mkClauses x (FunClause lhs@(LHS _ _ _ []) rhs wh : cs) =
+      (Clause x lhs rhs wh [] :) <$> mkClauses x cs
+    mkClauses x (FunClause lhs@(LHS _ ps _ es) rhs wh : cs) = do
+      when (null with) $ throwError $ MissingWithClauses x
+      wcs <- mkClauses x with
+      (Clause x lhs rhs wh wcs :) <$> mkClauses x cs'
+      where
+        (with, cs') = span subClause cs
 
-            -- A clause is a subclause if the number of with-patterns is
-            -- greater or equal to the current number of with-patterns plus the
-            -- number of with arguments.
-            subClause (FunClause (LHS _ ps' _ _) _ _)      =
-              length ps' >= length ps + length es
-            subClause (FunClause (Ellipsis _ ps' _ _) _ _) = True
-            subClause _                                  = __IMPOSSIBLE__
-        mkClauses x (FunClause lhs@Ellipsis{} rhs wh : cs) =
-          (Clause x lhs rhs wh [] :) <$> mkClauses x cs   -- Will result in an error later.
-        mkClauses _ _ = __IMPOSSIBLE__
+        -- A clause is a subclause if the number of with-patterns is
+        -- greater or equal to the current number of with-patterns plus the
+        -- number of with arguments.
+        subClause (FunClause (LHS _ ps' _ _) _ _)      =
+          length ps' >= length ps + length es
+        subClause (FunClause (Ellipsis _ ps' _ _) _ _) = True
+        subClause _                                  = __IMPOSSIBLE__
+    mkClauses x (FunClause lhs@Ellipsis{} rhs wh : cs) =
+      (Clause x lhs rhs wh [] :) <$> mkClauses x cs   -- Will result in an error later.
+    mkClauses _ _ = __IMPOSSIBLE__
 
-	noSingletonRawAppP (RawAppP _ [p]) = noSingletonRawAppP p
-	noSingletonRawAppP p		   = p
+    -- for finding clauses for a type sig in mutual blocks
+    couldBeFunClauseOf :: Maybe Fixity' -> Name -> Declaration -> Bool
+    couldBeFunClauseOf mFixity x (FunClause Ellipsis{} _ _) = True
+    couldBeFunClauseOf mFixity x (FunClause (LHS p _ _ _) _ _) =
+      let
+      pns        = patternNames p
+      xStrings   = nameStringParts x
+      patStrings = concatMap nameStringParts pns
+      in
+--          trace ("x = " ++ show x) $
+--          trace ("pns = " ++ show pns) $
+--          trace ("xStrings = " ++ show xStrings) $
+--          trace ("patStrings = " ++ show patStrings) $
+--          trace ("mFixity = " ++ show mFixity) $
+      case (mhead pns, mFixity) of
+        -- first identifier in the patterns is the fun.symbol?
+        (Just y, _) | x == y -> True -- trace ("couldBe since y = " ++ show y) $ True
+        -- are the parts of x contained in p
+        _ | xStrings `isSublistOf` patStrings -> True -- trace ("couldBe since isSublistOf") $ True
+        -- looking for a mixfix fun.symb
+        (_, Just fix) ->  -- also matches in case of a postfix
+           let notStrings = stringParts (theNotation fix)
+           in  -- trace ("notStrings = " ++ show notStrings) $
+               -- trace ("patStrings = " ++ show patStrings) $
+               (not $ null notStrings) && (notStrings `isSublistOf` patStrings)
+        -- not a notation, not first id: give up
+        _ -> False -- trace ("couldBe not (case default)") $ False
+    couldBeFunClauseOf _ _ _ = False -- trace ("couldBe not (fun default)") $ False
 
-        isFunClauseOf x (FunClause Ellipsis{} _ _) = True
-	isFunClauseOf x (FunClause (LHS p _ _ _) _ _) = case noSingletonRawAppP p of
-	    IdentP (QName q)	-> x == q
-	    _			-> True
-		-- more complicated lhss must come with type signatures, so we just assume
-		-- it's part of the current definition
-	isFunClauseOf _ _ = False
+    -- @isFunClauseOf@ is for non-mutual blocks where clauses must follow the
+    -- type sig immediately
+    isFunClauseOf :: Name -> Declaration -> Bool
+    isFunClauseOf x (FunClause Ellipsis{} _ _) = True
+    isFunClauseOf x (FunClause (LHS p _ _ _) _ _) =
+     -- p is the whole left hand side, excluding "with" patterns and clauses
+      case removeSingletonRawAppP p of
+        IdentP (QName q)    -> x == q
+        _                   -> True
+            -- more complicated lhss must come with type signatures, so we just assume
+            -- it's part of the current definition
+    isFunClauseOf _ _ = False
 
-	-- Make a mutual declaration
-	mkMutual :: Range -> [Declaration] -> [NiceDeclaration] -> Nice NiceDeclaration
-	mkMutual r cs ds = do
-            mapM_ checkMutual ds
-            setConcrete cs <$> foldM smash (NiceDef r [] [] []) ds
-	  where
-            setConcrete cs (NiceDef r _ ts ds)  = NiceDef r cs ts ds
-            setConcrete cs d		    = __IMPOSSIBLE__
+    removeSingletonRawAppP :: Pattern -> Pattern
+    removeSingletonRawAppP (RawAppP _ [p]) = removeSingletonRawAppP p
+    removeSingletonRawAppP p               = p
 
-            isRecord RecDef{} = True
-            isRecord _	  = False
+    -- Make an old style mutual block from a list of mutual declarations
+    mkOldMutual :: Range -> [NiceDeclaration] -> Nice NiceDeclaration
+    mkOldMutual r ds = do
+        -- Check that there aren't any missing definitions
+        case filter (`notElem` defNames) sigNames of
+          []       -> return ()
+          (_, x):_ -> throwError $ MissingDefinition x
+        -- Check that there are no declarations that aren't allowed in old style mutual blocks
+        case [ d | (d, OtherDecl) <- zip ds $ map declKind ds ] of
+          []  -> return ()
+          d:_ -> throwError $ NotAllowedInMutual d
+        return $ NiceMutual r $ sigs ++ other
+      where
+        -- Pull type signatures to the top
+        (sigs, other) = partition isTypeSig ds
+        isTypeSig d | LoneSig{} <- declKind d = True
+        isTypeSig _ = False
 
-            checkMutual nd@(NiceDef _ _ _ ds)
-              | any isRecord ds = throwError $ NotAllowedInMutual nd
-              | otherwise       = return ()
-            checkMutual d = throwError $ NotAllowedInMutual d
+        sigNames = [ (k, x) | LoneSig k x <- map declKind ds ]
+        defNames = [ (k, x) | LoneDef k x <- map declKind ds ]
 
-            smash nd@(NiceDef r0 _ ts0 ds0) (NiceDef r1 _ ts1 ds1) =
-              return $ NiceDef (fuseRange r0 r1) [] (ts0 ++ ts1) (ds0 ++ ds1)
-            smash _ _ = __IMPOSSIBLE__
+    abstractBlock _ [] = return []
+    abstractBlock r ds
+        -- hack to avoid failing on inherited abstract blocks in where clauses
+      | r == noRange           = return $ map mkAbstract ds
+      | all uselessAbstract ds = throwError $ UselessAbstract r
+      | otherwise              = return $ map mkAbstract ds
 
-	-- Make a declaration abstract
-	mkAbstract d =
-	    case d of
-		Axiom r f a _ rel x e		    -> Axiom r f a AbstractDef rel x e
-		NiceField r f a _ x e		    -> NiceField r f a AbstractDef x e
-		PrimitiveFunction r f a _ x e	    -> PrimitiveFunction r f a AbstractDef x e
-		NiceDef r cs ts ds		    -> NiceDef r cs (map mkAbstract ts)
-								 (map mkAbstractDef ds)
-		NiceModule r a _ x tel ds	    -> NiceModule r a AbstractDef x tel [ Abstract (getRange ds) ds ]
-		NiceModuleMacro r a _ x tel e op is -> NiceModuleMacro r a AbstractDef x tel e op is
-		NicePragma _ _			    -> d
-		NiceOpen _ _ _			    -> d
-		NiceImport _ _ _ _ _		    -> d
+    uselessAbstract d = case d of
+      FunDef{}  -> False
+      DataDef{} -> False
+      RecDef{}  -> False
+      _         -> True
 
-	mkAbstractDef d =
-	    case d of
-		FunDef r ds f a _ x cs   -> FunDef r ds f a AbstractDef x (map mkAbstractClause cs)
-		DataDef r f a _ x ps cs  -> DataDef r f a AbstractDef x ps $ map mkAbstract cs
-		RecDef r f a _ x c ps cs -> RecDef r f a AbstractDef x (mkAbstract <$> c) ps $ map mkAbstract cs
+    privateBlock _ [] = return []
+    privateBlock r ds
+      | all uselessPrivate ds = throwError $ UselessPrivate r
+      | otherwise             = return $ map mkPrivate ds
 
-	mkAbstractClause (Clause x lhs rhs wh with) =
-	    Clause x lhs rhs (mkAbstractWhere wh) (map mkAbstractClause with)
+    uselessPrivate d = case d of
+      FunDef{}  -> True
+      DataDef{} -> True
+      RecDef{}  -> True
+      _         -> False
 
-	mkAbstractWhere  NoWhere	 = NoWhere
-	mkAbstractWhere (AnyWhere ds)	 = AnyWhere [Abstract (getRange ds) ds]
-	mkAbstractWhere (SomeWhere m ds) = SomeWhere m [Abstract (getRange ds) ds]
+    -- Make a declaration abstract
+    mkAbstract d =
+        case d of
+            NiceField r f a _ x e            -> NiceField r f a AbstractDef x e
+            PrimitiveFunction r f a _ x e    -> PrimitiveFunction r f a AbstractDef x e
+            NiceMutual r ds                  -> NiceMutual r (map mkAbstract ds)
+            NiceModuleMacro r a _ x ma op is -> NiceModuleMacro r a AbstractDef x ma op is
+            FunDef r ds f _ x cs             -> FunDef r ds f AbstractDef x (map mkAbstractClause cs)
+            DataDef r f _ x ps cs            -> DataDef r f AbstractDef x ps $ map mkAbstract cs
+            RecDef r f _ x c ps cs           -> RecDef r f AbstractDef x c ps $ map mkAbstract cs
+            NiceModule{}                     -> d
+            Axiom{}                          -> d
+            NicePragma{}                     -> d
+            NiceOpen{}                       -> d
+            NiceImport{}                     -> d
+            FunSig{}                         -> d
+            NiceRecSig{}                     -> d
+            NiceDataSig{}                    -> d
 
-	-- Make a declaration private
-	mkPrivate d =
-	    case d of
-		Axiom r f _ a rel x e		    -> Axiom r f PrivateAccess a rel x e
-		NiceField r f _ a x e		    -> NiceField r f PrivateAccess a x e
-		PrimitiveFunction r f _ a x e	    -> PrimitiveFunction r f PrivateAccess a x e
-		NiceDef r cs ts ds		    -> NiceDef r cs (map mkPrivate ts)
-								    (map mkPrivateDef ds)
-		NiceModule r _ a x tel ds	    -> NiceModule r PrivateAccess a x tel ds
-		NiceModuleMacro r _ a x tel e op is -> NiceModuleMacro r PrivateAccess a x tel e op is
-		NicePragma _ _			    -> d
-		NiceOpen _ _ _			    -> d
-		NiceImport _ _ _ _ _		    -> d
+    mkAbstractClause (Clause x lhs rhs wh with) =
+        Clause x lhs rhs (mkAbstractWhere wh) (map mkAbstractClause with)
 
-	mkPrivateDef d =
-	    case d of
-		FunDef r ds f _ a x cs   -> FunDef r ds f PrivateAccess a x (map mkPrivateClause cs)
-		DataDef r f _ a x ps cs  -> DataDef r f PrivateAccess a x ps (map mkPrivate cs)
-		RecDef r f _ a x c ps cs -> RecDef r f PrivateAccess a x (mkPrivate <$> c) ps cs
+    mkAbstractWhere  NoWhere         = NoWhere
+    mkAbstractWhere (AnyWhere ds)    = AnyWhere [Abstract noRange ds]
+    mkAbstractWhere (SomeWhere m ds) = SomeWhere m [Abstract noRange ds]
 
-	mkPrivateClause (Clause x lhs rhs wh with) =
-	    Clause x lhs rhs (mkPrivateWhere wh) (map mkPrivateClause with)
+    -- Make a declaration private
+    mkPrivate d =
+        case d of
+            Axiom r f _ rel x e              -> Axiom r f PrivateAccess rel x e
+            NiceField r f _ a x e            -> NiceField r f PrivateAccess a x e
+            PrimitiveFunction r f _ a x e    -> PrimitiveFunction r f PrivateAccess a x e
+            NiceMutual r ds                  -> NiceMutual r (map mkPrivate ds)
+            NiceModule r _ a x tel ds        -> NiceModule r PrivateAccess a x tel ds
+            NiceModuleMacro r _ a x ma op is -> NiceModuleMacro r PrivateAccess a x ma op is
+            FunSig r f _ rel x e           -> FunSig r f PrivateAccess rel x e
+            NiceRecSig r f _ x ls t        -> NiceRecSig r f PrivateAccess x ls t
+            NiceDataSig r f _ x ls t       -> NiceDataSig r f PrivateAccess x ls t
+            NicePragma _ _                   -> d
+            NiceOpen _ _ _                   -> d
+            NiceImport _ _ _ _ _             -> d
+            FunDef{}                         -> d
+            DataDef{}                        -> d
+            RecDef{}                         -> d
 
-	mkPrivateWhere  NoWhere		= NoWhere
-	mkPrivateWhere (AnyWhere ds)	= AnyWhere [Private (getRange ds) ds]
-	mkPrivateWhere (SomeWhere m ds) = SomeWhere m [Private (getRange ds) ds]
+    mkPrivateClause (Clause x lhs rhs wh with) =
+        Clause x lhs rhs (mkPrivateWhere wh) (map mkPrivateClause with)
 
+    mkPrivateWhere  NoWhere         = NoWhere
+    mkPrivateWhere (AnyWhere ds)    = AnyWhere [Private (getRange ds) ds]
+    mkPrivateWhere (SomeWhere m ds) = SomeWhere m [Private (getRange ds) ds]
+
 -- | Add more fixities. Throw an exception for multiple fixity declarations.
 plusFixities :: Map.Map Name Fixity' -> Map.Map Name Fixity' -> Nice (Map.Map Name Fixity')
 plusFixities m1 m2
@@ -464,10 +631,10 @@
                     s | s1 == noNotation = s2
                       | s2 == noNotation = s1
                       | otherwise = __IMPOSSIBLE__
- 	  isect	= [decls x | (x,compat) <- Map.assocs (Map.intersectionWith compatible m1 m2), not compat]
+          isect = [decls x | (x,compat) <- Map.assocs (Map.intersectionWith compatible m1 m2), not compat]
 
-	  decls x = (x, map (Map.findWithDefault __IMPOSSIBLE__ x) [m1,m2])
-				-- cpp doesn't know about primes
+          decls x = (x, map (Map.findWithDefault __IMPOSSIBLE__ x) [m1,m2])
+                                -- cpp doesn't know about primes
           compatible (Fixity' f1 s1) (Fixity' f2 s2) = (f1 == noFixity || f2 == noFixity) &&
                                                        (s1 == noNotation || s2 == noNotation)
 
@@ -477,21 +644,31 @@
 --   declaration.
 fixities :: [Declaration] -> Nice (Map.Map Name Fixity')
 fixities (d:ds) = case d of
-  Syntax x syn -> do fs <- fixities ds
-                     plusFixities fs (Map.singleton x (Fixity' noFixity syn))
-  Infix f xs -> plusFixities (Map.fromList [ (x,Fixity' f noNotation) | x <- xs ]) =<< fixities ds
-  _          -> fixities ds
+  Syntax x syn   -> plusFixities (Map.singleton x (Fixity' noFixity syn)) =<< fixities ds
+  Infix f xs     -> plusFixities (Map.fromList [ (x,Fixity' f noNotation) | x <- xs ]) =<< fixities ds
+  Mutual _ ds'   -> fixities (ds' ++ ds)
+  Abstract _ ds' -> fixities (ds' ++ ds)
+  Private _ ds'  -> fixities (ds' ++ ds)
+  _              -> fixities ds
 fixities [] = return $ Map.empty
 
 notSoNiceDeclarations :: [NiceDeclaration] -> [Declaration]
 notSoNiceDeclarations = concatMap notNice
   where
-    notNice (Axiom _ _ _ _ rel x e)               = [TypeSig rel x e]
-    notNice (NiceField _ _ _ _ x argt)            = [Field x argt]
-    notNice (PrimitiveFunction r _ _ _ x e)       = [Primitive r [TypeSig Relevant x e]]
-    notNice (NiceDef _ ds _ _)                    = ds
-    notNice (NiceModule r _ _ x tel ds)           = [Module r x tel ds]
-    notNice (NiceModuleMacro r _ _ x tel e o dir) = [ModuleMacro r x tel e o dir]
-    notNice (NiceOpen r x dir)                    = [Open r x dir]
-    notNice (NiceImport r x as o dir)             = [Import r x as o dir]
-    notNice (NicePragma _ p)                      = [Pragma p]
+    notNice d = case d of
+      Axiom _ _ _ rel x e              -> [TypeSig rel x e]
+      NiceField _ _ _ _ x argt         -> [Field x argt]
+      PrimitiveFunction r _ _ _ x e    -> [Primitive r [TypeSig Relevant x e]]
+      NiceMutual _ ds                  -> concatMap notNice ds
+      NiceModule r _ _ x tel ds        -> [Module r x tel ds]
+      NiceModuleMacro r _ _ x ma o dir -> [ModuleMacro r x ma o dir]
+      NiceOpen r x dir                 -> [Open r x dir]
+      NiceImport r x as o dir          -> [Import r x as o dir]
+      NicePragma _ p                   -> [Pragma p]
+      NiceRecSig r _ _ x bs e          -> [RecordSig r x bs e]
+      NiceDataSig r _ _ x bs e         -> [DataSig r Inductive x bs e]
+      FunSig _ _ _ rel x e             -> [TypeSig rel x e]
+      FunDef _ ds _ _ _ _              -> ds
+      DataDef r _ _ x bs cs            -> [Data r Inductive x bs Nothing $ concatMap notNice cs]
+      RecDef r _ _ x c bs ds           -> [Record r x (unThing <$> c) bs Nothing $ concatMap notNice ds]
+        where unThing (ThingWithFixity c _) = c
diff --git a/src/full/Agda/Syntax/Concrete/Name.hs b/src/full/Agda/Syntax/Concrete/Name.hs
--- a/src/full/Agda/Syntax/Concrete/Name.hs
+++ b/src/full/Agda/Syntax/Concrete/Name.hs
@@ -49,6 +49,7 @@
 isNoName :: Name -> Bool
 isNoName (NoName _ _)    = True
 isNoName (Name _ [Hole]) = True   -- TODO: Track down where these come from
+isNoName (Name _ [])     = True
 isNoName _               = False
 
 -- | Is the name an operator?
@@ -60,6 +61,9 @@
 nameParts :: Name -> [NamePart]
 nameParts (Name _ ps)  = ps
 nameParts (NoName _ _) = [Hole]
+
+nameStringParts :: Name -> [String]
+nameStringParts n = [ s | Id s <- nameParts n ]
 
 -- | @qualify A.B x == A.B.x@
 qualify :: QName -> Name -> QName
diff --git a/src/full/Agda/Syntax/Concrete/Operators.hs b/src/full/Agda/Syntax/Concrete/Operators.hs
--- a/src/full/Agda/Syntax/Concrete/Operators.hs
+++ b/src/full/Agda/Syntax/Concrete/Operators.hs
@@ -39,10 +39,12 @@
 import Agda.TypeChecking.Monad.Base (typeError, TypeError(..))
 import Agda.TypeChecking.Monad.State (getScope)
 import Agda.TypeChecking.Monad.Options
+import Agda.TypeChecking.Monad.Statistics
 
 import Agda.Utils.ReadP
 import Agda.Utils.Monad
 import Agda.Utils.Tuple
+import Agda.Utils.List
 
 import Debug.Trace
 
@@ -80,7 +82,7 @@
 localNames = do
   defs   <- getDefinedNames [DefName, ConName]
   locals <- scopeLocals <$> getScope
-  return $ split $ nubBy ((==) `on` fst) $ map localOp locals ++ defs
+  return $ split $ uniqBy fst $ map localOp locals ++ defs
   where
     localOp (x, y) = (x, A.nameFixity y)
     split ops = ([ x | Left x <- zs], [ y | Right y <- zs ])
@@ -224,35 +226,48 @@
         App _ e1 e2     -> AppV e1 e2
         OpApp r d es    -> OpAppV d es
         HiddenArg _ e   -> HiddenArgV e
+        InstanceArg _ e -> InstanceArgV e
         Paren _ e       -> ParenV e
         Lam _ bs    e   -> LamV bs e
+        Underscore{}    -> WildV e
         _               -> OtherV e
     unExprView e = case e of
         LocalV x      -> Ident (QName x)
         AppV e1 e2    -> App (fuseRange e1 e2) e1 e2
         OpAppV d es   -> OpApp (fuseRange d es) d es
         HiddenArgV e  -> HiddenArg (getRange e) e
+        InstanceArgV e -> InstanceArg (getRange e) e
         ParenV e      -> Paren (getRange e) e
         LamV bs e     -> Lam (fuseRange bs e) bs e
+        WildV e       -> e
         OtherV e      -> e
 
+
 instance IsExpr Pattern where
     exprView e = case e of
         IdentP (QName x) -> LocalV x
         AppP e1 e2       -> AppV e1 e2
-        OpAppP r d es    -> OpAppV d es
+        OpAppP r d es    -> OpAppV d (map Ordinary es)
         HiddenP _ e      -> HiddenArgV e
+        InstanceP _ e    -> InstanceArgV e
         ParenP _ e       -> ParenV e
+        WildP{}          -> WildV e
         _                -> OtherV e
     unExprView e = case e of
         LocalV x         -> IdentP (QName x)
         AppV e1 e2       -> AppP e1 e2
-        OpAppV d es      -> OpAppP (fuseRange d es) d es
+        OpAppV d es      -> let ess :: [Pattern]
+                                ess = (map (fromOrdinary __IMPOSSIBLE__) es)
+                            in OpAppP (fuseRange d es) d ess
         HiddenArgV e     -> HiddenP (getRange e) e
+        InstanceArgV e   -> InstanceP (getRange e) e
         ParenV e         -> ParenP (getRange e) e
         LamV _ _         -> __IMPOSSIBLE__
+        WildV e          -> e
         OtherV e         -> e
 
+
+
 ---------------------------------------------------------------------------
 -- * Parse functions
 ---------------------------------------------------------------------------
@@ -264,6 +279,7 @@
     RawAppP _ ps     -> fullParen' <$> (parsePattern prs =<< parse prs ps)
     OpAppP r d ps    -> fullParen' . OpAppP r d <$> mapM (parsePattern prs) ps
     HiddenP _ _      -> fail "bad hidden argument"
+    InstanceP _ _    -> fail "bad instance argument"
     AsP r x p        -> AsP r x <$> parsePattern prs p
     DotP r e         -> return $ DotP r e
     ParenP r p       -> fullParen' <$> parsePattern prs p
@@ -309,6 +325,7 @@
             ParenP _ p       -> appView p
             RawAppP _ _      -> __IMPOSSIBLE__
             HiddenP _ _      -> __IMPOSSIBLE__
+            InstanceP _ _    -> __IMPOSSIBLE__
             _                -> [p]
 
 parseApplication :: [Expr] -> ScopeM Expr
@@ -340,15 +357,18 @@
 fullParen' :: IsExpr e => e -> e
 fullParen' e = case exprView e of
     LocalV _     -> e
+    WildV _      -> e
     OtherV _     -> e
     HiddenArgV _ -> e
+    InstanceArgV _ -> e
     ParenV _     -> e
     AppV e1 (Arg h r e2) -> par $ unExprView $ AppV (fullParen' e1) (Arg h r e2')
         where
             e2' = case h of
                 Hidden    -> e2
+                Instance  -> e2
                 NotHidden -> fullParen' <$> e2
-    OpAppV x es -> par $ unExprView $ OpAppV x $ map fullParen' es
+    OpAppV x es -> par $ unExprView $ OpAppV x $ map (fmap fullParen') es
     LamV bs e -> par $ unExprView $ LamV bs (fullParen e)
     where
         par = unExprView . ParenV
@@ -358,10 +378,12 @@
 paren f   e@(OpApp _ op _)     = do fx <- f op; return $ \p -> mparen (opBrackets fx p) e
 paren _   e@(Lam _ _ _)        = return $ \p -> mparen (lamBrackets p) e
 paren _   e@(AbsurdLam _ _)    = return $ \p -> mparen (lamBrackets p) e
+paren _   e@(ExtendedLam _ _)    = return $ \p -> mparen (lamBrackets p) e
 paren _   e@(Fun _ _ _)        = return $ \p -> mparen (lamBrackets p) e
 paren _   e@(Pi _ _)           = return $ \p -> mparen (lamBrackets p) e
 paren _   e@(Let _ _ _)        = return $ \p -> mparen (lamBrackets p) e
 paren _   e@(Rec _ _)          = return $ \p -> mparen (appBrackets p) e
+paren _   e@(RecUpdate _ _ _)  = return $ \p -> mparen (appBrackets p) e
 paren _   e@(WithApp _ _ _)    = return $ \p -> mparen (withAppBrackets p) e
 paren _   e@(Ident _)          = return $ \p -> e
 paren _   e@(Lit _)            = return $ \p -> e
@@ -377,9 +399,12 @@
 paren _   e@(ETel _)           = return $ \p -> e
 paren _   e@(RawApp _ _)       = __IMPOSSIBLE__
 paren _   e@(HiddenArg _ _)    = __IMPOSSIBLE__
+paren _   e@(InstanceArg _ _)  = __IMPOSSIBLE__
 paren _   e@(QuoteGoal _ _ _)  = return $ \p -> mparen (lamBrackets p) e
 paren _   e@(Quote _)          = return $ \p -> e
-
+paren _   e@(QuoteTerm _)      = return $ \p -> e
+paren _   e@(Unquote _)        = return $ \p -> e
+paren _   e@(DontCare _)       = return $ \p -> e
 
 mparen :: Bool -> Expr -> Expr
 mparen True  e = Paren (getRange e) e
diff --git a/src/full/Agda/Syntax/Concrete/Operators/Parser.hs b/src/full/Agda/Syntax/Concrete/Operators/Parser.hs
--- a/src/full/Agda/Syntax/Concrete/Operators/Parser.hs
+++ b/src/full/Agda/Syntax/Concrete/Operators/Parser.hs
@@ -16,10 +16,12 @@
 
 data ExprView e
     = LocalV Name
+    | WildV e
     | OtherV e
     | AppV e (NamedArg e)
-    | OpAppV Name [e]
+    | OpAppV Name [OpApp e]
     | HiddenArgV (Named String e)
+    | InstanceArgV (Named String e)
     | LamV [LamBinding] e
     | ParenV e
 --    deriving (Show)
@@ -112,23 +114,26 @@
 -- | Given a name with a syntax spec, and a list of parsed expressions
 -- fitting it, rebuild the expression.
 -- Note that this function must not parse any input (as guaranteed by the type)
-rebuild :: forall a e. IsExpr e => NewNotation -> Range -> [e] -> ReadP a e
+rebuild :: forall symbol e. IsExpr e => NewNotation -> Range -> [e] -> ReadP symbol e
 rebuild (name,_,syn) r es = do
   exprs <- mapM findExprFor [0..lastHole]
   return $ unExprView $ OpAppV (setRange r name) exprs
   where filledHoles = zip es (filter isAHole syn)
         lastHole = maximum [t | Just t <- map holeTarget syn]
-        findExprFor :: Int -> ReadP a e
-        findExprFor n = case  [ e | (e,NormalHole m) <- filledHoles, m == n] of
+        findExprFor :: Int -> ReadP a (OpApp e)
+        findExprFor n = case [e | (e,NormalHole m) <- filledHoles, m == n] of
                           [] -> fail $ "no expression for hole " ++ show n
-                          [x] -> case [ e | (e,BindHole m) <- filledHoles, m == n] of
-                                   [] -> return x -- no variable to bind
+                          [x] -> case [e | (e,BindHole m) <- filledHoles, m == n] of
+                                   [] -> return (Ordinary x) -- no variable to bind
                                    vars -> do bs <- mapM rebuildBinding $ map exprView vars
-                                              return $ unExprView $ LamV bs x
+                                              return $ SyntaxBindingLambda (fuseRange bs x) bs x
                           _ -> fail $ "more than one expression for hole " ++ show n
 
 rebuildBinding :: ExprView e -> ReadP a LamBinding
-rebuildBinding (LocalV name) = return $ DomainFree NotHidden (mkBoundName_ name)
+  -- Andreas, 2011-04-07 put just 'Relevant' here, is this correct?
+rebuildBinding (LocalV name) = return $ DomainFree NotHidden Relevant (mkBoundName_ name)
+rebuildBinding (WildV e)     =
+  return $ DomainFree NotHidden Relevant (mkBoundName_ $ Name noRange [Hole])
 rebuildBinding _ = fail "variable name expected"
 
 ($$$) :: (e -> ReadP a e) -> ReadP a e -> ReadP a e
@@ -169,20 +174,28 @@
 appP :: IsExpr e => ReadP e e -> ReadP e e -> ReadP e e
 appP top p = do
     h  <- p
-    es <- many (nothidden +++ hidden)
+    es <- many (nothidden +++ hidden +++ instanceH)
     return $ foldl app h es
     where
 
 	app e arg = unExprView $ AppV e arg
 
 	isHidden (HiddenArgV _) = True
-	isHidden _	       = False
+	isHidden _	        = False
 
+	isInstance (InstanceArgV _) = True
+	isInstance _	            = False
+
 	nothidden = Arg NotHidden Relevant . unnamed <$> do
 	    e <- p
 	    case exprView e of
 		HiddenArgV _ -> pfail
+		InstanceArgV _ -> pfail
 		_	     -> return e
+
+	instanceH = do
+	    InstanceArgV e <- exprView <$> satisfy (isInstance . exprView)
+	    return $ Arg Instance Relevant e
 
 	hidden = do
 	    HiddenArgV e <- exprView <$> satisfy (isHidden . exprView)
diff --git a/src/full/Agda/Syntax/Concrete/Pretty.hs b/src/full/Agda/Syntax/Concrete/Pretty.hs
--- a/src/full/Agda/Syntax/Concrete/Pretty.hs
+++ b/src/full/Agda/Syntax/Concrete/Pretty.hs
@@ -32,12 +32,17 @@
   '-':_ -> braces (text " " <> d)
   _     -> braces d
 
+-- double braces...
+dbraces :: Doc -> Doc
+dbraces = braces . braces'
+
 arrow  = text "\x2192"
 lambda = text "\x03bb"
 underscore = text "_"
 
 pHidden :: Pretty a => Hiding -> a -> Doc
 pHidden Hidden	    = braces' . pretty
+pHidden Instance    = dbraces . pretty
 pHidden NotHidden   = pretty
 
 pRelevance :: Pretty a => Relevance -> a -> Doc
@@ -46,6 +51,9 @@
 pRelevance Irrelevant a =
   let d = pretty a
   in  if render d == "_" then d else text "." <> d
+pRelevance NonStrict a =
+  let d = pretty a
+  in  if render d == "_" then d else text ".." <> d
 
 {- UNUSED
 -- | Use for printing non-dependent function types
@@ -53,6 +61,9 @@
 prettyWithRelevance a = pRelevance (argRelevance a) a
 -}
 
+instance Pretty (ThingWithFixity Name) where
+    pretty (ThingWithFixity n _) = pretty n
+
 instance Pretty Name where
     pretty = text . show
 
@@ -60,7 +71,6 @@
     pretty = text . show
 
 instance Pretty Literal where
-    pretty (LitLevel _ n)   = __IMPOSSIBLE__
     pretty (LitInt _ n)	    = text $ show n
     pretty (LitFloat _ x)   = text $ show x
     pretty (LitString _ s)  = text $ showString' s ""
@@ -83,11 +93,16 @@
   pretty Forced     = empty
   pretty Relevant   = empty
   pretty Irrelevant = text "."
+  pretty NonStrict  = text ".."
 
 instance Pretty Induction where
   pretty Inductive = text "data"
   pretty CoInductive = text "codata"
 
+instance Pretty (OpApp Expr) where
+  pretty (Ordinary e) = pretty e
+  pretty (SyntaxBindingLambda r bs e) = pretty (Lam r bs e)
+
 instance Pretty Expr where
     pretty e =
 	case e of
@@ -115,12 +130,21 @@
 	      pretty e : map ((text "|" <+>) . pretty) es
 
 	    HiddenArg _ e -> braces' $ pretty e
+	    InstanceArg _ e -> dbraces $ pretty e
 	    Lam _ bs e ->
 		sep [ lambda <+> fsep (map pretty bs) <+> arrow
 		    , nest 2 $ pretty e
 		    ]
             AbsurdLam _ NotHidden -> lambda <+> text "()"
+            AbsurdLam _ Instance -> lambda <+> text "{{}}"
             AbsurdLam _ Hidden -> lambda <+> text "{}"
+	    ExtendedLam _ pes ->
+		lambda <+> braces (fsep $ punctuate (text ";") (map (\(x,y,z) -> prettyClause x y z) pes))
+                   where prettyClause lhs rhs wh = sep [ pretty lhs
+                                                       , nest 2 $ pretty' rhs
+                                                       ] $$ nest 2 (pretty wh)
+                         pretty' (RHS e)   = arrow <+> pretty e
+                         pretty' AbsurdRHS = empty
 	    Fun _ e1 e2 ->
 		sep [ pretty e1 <+> arrow
 		    , pretty e2
@@ -141,33 +165,41 @@
 	    Dot _ e   -> text "." <> pretty e
 	    Absurd _  -> text "()"
 	    Rec _ xs  -> sep (
-	      [ text "record {" ] ++
-	      punctuate (text ";") (map pr xs)) <+> text "}"
-	      where
-		pr (x, e) = sep [ pretty x <+> text "="
-				, nest 2 $ pretty e
-				]
+	        [ text "record {" ] ++
+	        punctuate (text ";") (map recPr xs)) <+> text "}"
+	    RecUpdate _ e xs ->
+	            sep [ text "record" <+> pretty e <+> text "{" ]
+	        <+> sep (punctuate (text ";") (map recPr xs))
+	        <+> text "}"
             ETel []  -> text "()"
             ETel tel -> fsep $ map pretty tel
             QuoteGoal _ x e -> sep [text "quoteGoal" <+> pretty x <+> text "in",
                                     nest 2 $ pretty e]
             Quote _ -> text "quote"
+            QuoteTerm _ -> text "quoteTerm"
+	    Unquote _ -> text "unquote"
+            -- Andreas, 2011-10-03 print irrelevant things as .(e)
+            DontCare e -> text "." <> parens (pretty e)
+	where
+	  recPr (x, e) = sep [ pretty x <+> text "=" , nest 2 $ pretty e ]
 
 instance Pretty BoundName where
   pretty = pretty . boundName
 
 instance Pretty LamBinding where
-    pretty (DomainFree h x) = pHidden h (pretty x)
-    pretty (DomainFull b)   = pretty b
+    pretty (DomainFree h r x) = pRelevance r $ pHidden h $ pretty x
+    pretty (DomainFull b)     = pretty b
 
 instance Pretty TypedBindings where
-    pretty (TypedBindings _ (Arg h rel bs)) =
-	pRelevance rel $ bracks $ fsep $ punctuate semi $ map pretty bs
+    pretty (TypedBindings _ (Arg h rel b)) =
+	pRelevance rel $ bracks $ pretty b
 	where
 	    bracks = case h of
 			Hidden	    -> braces'
+			Instance    -> dbraces
 			NotHidden   -> parens
 
+
 instance Pretty TypedBinding where
     pretty (TNoBind e) = pretty e
     pretty (TBind _ xs e) =
@@ -176,17 +208,19 @@
 	    ]
 
 smashTel :: Telescope -> Telescope
-smashTel (TypedBindings r (Arg h  rel  [TBind r' xs e]) :
-          TypedBindings _ (Arg h' rel' [TBind _  ys e']) : tel)
+smashTel (TypedBindings r (Arg h  rel  (TBind r' xs e)) :
+          TypedBindings _ (Arg h' rel' (TBind _  ys e')) : tel)
   | h == h' && rel == rel' && show e == show e' =
-    smashTel (TypedBindings r (Arg h rel [TBind r' (xs ++ ys) e]) : tel)
+    smashTel (TypedBindings r (Arg h rel (TBind r' (xs ++ ys) e)) : tel)
 smashTel (b : tel) = b : smashTel tel
 smashTel [] = []
 
+
 instance Pretty RHS where
     pretty (RHS e)   = text "=" <+> pretty e
     pretty AbsurdRHS = empty
 
+instance Show WhereClause where show = show . pretty
 instance Pretty WhereClause where
   pretty  NoWhere = empty
   pretty (AnyWhere [Module _ x [] ds]) | isNoName (unqualify x)
@@ -197,6 +231,7 @@
 	 , nest 2 (vcat $ map pretty ds)
 	 ]
 
+instance Show LHS where show = show . pretty
 instance Pretty LHS where
   pretty lhs = case lhs of
     LHS p ps eqs es  -> pr (pretty p) ps eqs es
@@ -215,6 +250,11 @@
 instance Pretty [Declaration] where
   pretty = vcat . map pretty
 
+instance Show ModuleApplication where show = show . pretty
+instance Pretty ModuleApplication where
+  pretty (SectionApp _ bs e) = fsep (map pretty bs) <+> text "=" <+> pretty e
+  pretty (RecordModuleIFS _ rec) = text "=" <+> pretty rec <+> text "{{...}}"
+
 instance Pretty Declaration where
     pretty d =
 	case d of
@@ -230,7 +270,7 @@
 		sep [ pretty lhs
 		    , nest 2 $ pretty rhs
 		    ] $$ nest 2 (pretty wh)
-	    Data _ ind x tel e cs ->
+	    DataSig _ ind x tel e ->
 		sep [ hsep  [ pretty ind
 			    , pretty x
 			    , fcat (map pretty tel)
@@ -238,10 +278,27 @@
 		    , nest 2 $ hsep
 			    [ text ":"
 			    , pretty e
+			    ]
+		    ]
+	    Data _ ind x tel (Just e) cs ->
+		sep [ hsep  [ pretty ind
+			    , pretty x
+			    , fcat (map pretty tel)
+			    ]
+		    , nest 2 $ hsep
+			    [ text ":"
+			    , pretty e
 			    , text "where"
 			    ]
 		    ] $$ nest 2 (vcat $ map pretty cs)
-	    Record _ x con tel e cs ->
+	    Data _ ind x tel Nothing cs ->
+		sep [ hsep  [ pretty ind
+			    , pretty x
+			    , fcat (map pretty tel)
+			    ]
+		    , nest 2 $ text "where"
+		    ] $$ nest 2 (vcat $ map pretty cs)
+	    RecordSig _ x tel e ->
 		sep [ hsep  [ text "record"
 			    , pretty x
 			    , fcat (map pretty tel)
@@ -249,12 +306,32 @@
 		    , nest 2 $ hsep
 			    [ text ":"
 			    , pretty e
+			    ]
+		    ]
+	    Record _ x con tel (Just e) cs ->
+		sep [ hsep  [ text "record"
+			    , pretty x
+			    , fcat (map pretty tel)
+			    ]
+		    , nest 2 $ hsep
+			    [ text ":"
+			    , pretty e
 			    , text "where"
 			    ]
 		    ] $$ nest 2 (vcat $ maybe [] (\c -> [text "constructor" <+> pretty c])
                                               con ++
                                         map pretty cs)
-	    Infix f xs	->
+	    Record _ x con tel Nothing cs ->
+		sep [ hsep  [ text "record"
+			    , pretty x
+			    , fcat (map pretty tel)
+			    ]
+		    , nest 2 $ text "where"
+		    ] $$ nest 2 (vcat $ maybe [] (\c -> [text "constructor" <+> pretty c])
+                                              con ++
+                                        map pretty cs)
+
+            Infix f xs	->
 		pretty f <+> (fsep $ punctuate comma $ map pretty xs)
             Syntax n xs -> text "syntax" <+> pretty n <+> text "..."
 	    Mutual _ ds	    -> namedBlock "mutual" ds
@@ -268,15 +345,19 @@
 		     , fcat (map pretty tel)
 		     , text "where"
 		     ] $$ nest 2 (vcat $ map pretty ds)
-	    ModuleMacro _ x [] e DoOpen i | isNoName x ->
+	    ModuleMacro _ x (SectionApp _ [] e) DoOpen i | isNoName x ->
 		sep [ pretty DoOpen
                     , nest 2 $ pretty e
                     , nest 4 $ pretty i
                     ]
-	    ModuleMacro _ x tel e open i ->
+	    ModuleMacro _ x (SectionApp _ tel e) open i ->
 		sep [ pretty open <+> text "module" <+> pretty x <+> fcat (map pretty tel)
 		    , nest 2 $ text "=" <+> pretty e <+> pretty i
 		    ]
+	    ModuleMacro _ x (RecordModuleIFS _ rec) open i ->
+		sep [ pretty open <+> text "module" <+> pretty x
+		    , nest 2 $ text "=" <+> pretty rec <+> text "{{...}}"
+		    ]
 	    Open _ x i	-> hsep [ text "open", pretty x, pretty i ]
 	    Import _ x rn open i   ->
 		hsep [ pretty open, text "import", pretty x, as rn, pretty i ]
@@ -305,6 +386,10 @@
       hsep $ [text "COMPILED_DATA", pretty x] ++ map text (hs : hcs)
     pretty (CompiledEpicPragma _ x e) =
       hsep [ text "COMPILED_EPIC", pretty x, text e ]
+    pretty (CompiledJSPragma _ x e) =
+      hsep [ text "COMPILED_JS", pretty x, text e ]
+    pretty (StaticPragma _ i) =
+      hsep $ [text "STATIC", pretty i]
     pretty (ImportPragma _ i) =
       hsep $ [text "IMPORT", text i]
     pretty (ImpossiblePragma _) =
@@ -342,9 +427,10 @@
 		    prOp (Hole : _)  []	      = __IMPOSSIBLE__
 		    prOp (Id x : xs) es       = text x : prOp xs es
 		    prOp []	     []       = []
-		    prOp []	     (_ : _)  = __IMPOSSIBLE__
+		    prOp []	     es       = map pretty es
 	    OpAppP _ (NoName _ _) _ -> __IMPOSSIBLE__
 	    HiddenP _ p	       -> braces' $ pretty p
+	    InstanceP _ p      -> dbraces $ pretty p
 	    ParenP _ p	       -> parens $ pretty p
 	    WildP _	       -> underscore
 	    AsP _ x p	       -> pretty x <> text "@" <> pretty p
diff --git a/src/full/Agda/Syntax/Fixity.hs b/src/full/Agda/Syntax/Fixity.hs
--- a/src/full/Agda/Syntax/Fixity.hs
+++ b/src/full/Agda/Syntax/Fixity.hs
@@ -1,10 +1,12 @@
-{-# LANGUAGE CPP, DeriveDataTypeable #-}
+{-# LANGUAGE CPP, DeriveDataTypeable, DeriveFunctor, DeriveFoldable, DeriveTraversable #-}
 
 {-| Definitions for fixity and precedence levels.
 -}
 module Agda.Syntax.Fixity where
 
 import Data.Generics (Typeable, Data)
+import Data.Foldable
+import Data.Traversable
 
 import Agda.Syntax.Position
 import Agda.Syntax.Common
@@ -18,6 +20,7 @@
      theNotation :: Notation}
   deriving (Typeable, Data, Show, Eq)
 
+data ThingWithFixity x = ThingWithFixity x Fixity' deriving (Functor,Foldable,Traversable,Typeable,Data,Show)
 -- | All the notation information related to a name.
 type NewNotation = (Name, Fixity, Notation)
 
@@ -73,6 +76,7 @@
 hiddenArgumentCtx :: Hiding -> Precedence
 hiddenArgumentCtx NotHidden = ArgumentCtx
 hiddenArgumentCtx Hidden    = TopCtx
+hiddenArgumentCtx Instance  = TopCtx
 
 -- | Do we need to bracket an operator application of the given fixity
 --   in a context with the given precedence.
@@ -92,14 +96,18 @@
 opBrackets _ WithFunCtx             = False
 opBrackets _ _			    = True
 
--- | Does a lambda-like thing (lambda, let or pi) need brackets in the given
---   context. A peculiar thing with lambdas is that they don't need brackets
---   in a right operand context. For instance: @m >>= \x -> m'@ is a valid
---   infix application.
+-- | Does a lambda-like thing (lambda, let or pi) need brackets in the
+-- given context? A peculiar thing with lambdas is that they don't
+-- need brackets in certain right operand contexts. However, we insert
+-- brackets anyway, for the following reasons:
+--
+-- * Clarity.
+--
+-- * Sometimes brackets are needed. Example: @m₁ >>= (λ x → x) >>= m₂@
+--   (here @_>>=_@ is left associative).
 lamBrackets :: Precedence -> Bool
-lamBrackets TopCtx		= False
-lamBrackets (RightOperandCtx _) = False
-lamBrackets _			= True
+lamBrackets TopCtx = False
+lamBrackets _	   = True
 
 -- | Does a function application need brackets?
 appBrackets :: Precedence -> Bool
diff --git a/src/full/Agda/Syntax/Internal.hs b/src/full/Agda/Syntax/Internal.hs
--- a/src/full/Agda/Syntax/Internal.hs
+++ b/src/full/Agda/Syntax/Internal.hs
@@ -1,4 +1,5 @@
-{-# LANGUAGE CPP, DeriveDataTypeable, GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE CPP, DeriveDataTypeable, GeneralizedNewtypeDeriving,
+             DeriveFunctor, DeriveFoldable, DeriveTraversable #-}
 
 module Agda.Syntax.Internal
     ( module Agda.Syntax.Internal
@@ -11,6 +12,7 @@
 import Data.Foldable
 import Data.Traversable
 import Data.Function
+import qualified Data.List as List
 
 import Agda.Syntax.Position
 import Agda.Syntax.Common
@@ -37,50 +39,54 @@
 	  | Def QName Args
 	  | Con QName Args
 	  | Pi (Arg Type) (Abs Type)
-	  | Fun (Arg Type) Type
 	  | Sort Sort
+          | Level Level
 	  | MetaV MetaId Args
-          | DontCare               -- ^ nuked irrelevant and other stuff
-  deriving (Typeable, Data, Eq, Ord, Show)
--- Andreas 2010-09-21: @DontCare@ replaces the hack @Sort Prop@
+          | DontCare Term  -- ^ irrelevant stuff
+  deriving (Typeable, Data, Show)
 
 data Type = El Sort Term
-  deriving (Typeable, Data, Eq, Ord, Show)
+  deriving (Typeable, Data, Show)
 
-data Sort = Type Term   -- A term of type Level
+data Elim = Apply (Arg Term) | Proj QName -- ^ name of a record projection
+  deriving (Show)
+
+-- | Top sort (Set\omega).
+topSort :: Type
+topSort = El Inf (Sort Inf)
+
+data Sort = Type Level
 	  | Prop  -- ignore me
-	  | Lub Sort Sort
-	  | Suc Sort
-	  | MetaS MetaId Args
           | Inf
           | DLub Sort (Abs Sort)
             -- ^ if the free variable occurs in the second sort
             --   the whole thing should reduce to Inf, otherwise
             --   it's the normal Lub
-  deriving (Typeable, Data, Eq, Ord, Show)
+  deriving (Typeable, Data, Show)
 
+newtype Level = Max [PlusLevel]
+  deriving (Show, Typeable, Data)
+
+data PlusLevel = ClosedLevel Integer
+               | Plus Integer LevelAtom
+  deriving (Show, Typeable, Data)
+
+data LevelAtom = MetaLevel MetaId Args
+               | BlockedLevel MetaId Term
+               | NeutralLevel Term
+               | UnreducedLevel Term
+  deriving (Show, Typeable, Data)
+
 -- | Something where a meta variable may block reduction.
 data Blocked t = Blocked MetaId t
                | NotBlocked t
-    deriving (Typeable, Data, Eq, Ord)
+    deriving (Typeable, Data, Eq, Ord, Functor, Foldable, Traversable)
 
 instance Show t => Show (Blocked t) where
   showsPrec p (Blocked m x) = showParen (p > 0) $
     showString "Blocked " . shows m . showString " " . showsPrec 10 x
   showsPrec p (NotBlocked x) = showsPrec p x
 
-instance Functor Blocked where
-  fmap f (Blocked m t) = Blocked m $ f t
-  fmap f (NotBlocked t) = NotBlocked $ f t
-
-instance Foldable Blocked where
-  foldr f z (Blocked _ x) = f x z
-  foldr f z (NotBlocked x) = f x z
-
-instance Traversable Blocked where
-  traverse f (Blocked m t)  = Blocked m <$> f t
-  traverse f (NotBlocked t) = NotBlocked <$> f t
-
 instance Applicative Blocked where
   pure = notBlocked
   Blocked x f  <*> e = Blocked x $ f (ignoreBlocking e)
@@ -88,33 +94,59 @@
 
 instance Sized Term where
   size v = case v of
-    Var _ vs   -> 1 + Prelude.sum (map size vs)
-    Def _ vs   -> 1 + Prelude.sum (map size vs)
-    Con _ vs   -> 1 + Prelude.sum (map size vs)
-    MetaV _ vs -> 1 + Prelude.sum (map size vs)
-    Lam _ f    -> 1 + size f
-    Lit _      -> 1
-    Pi a b     -> 1 + size a + size b
-    Fun a b    -> 1 + size a + size b
-    Sort s     -> 1
-    DontCare   -> 1
+    Var _ vs    -> 1 + Prelude.sum (map size vs)
+    Def _ vs    -> 1 + Prelude.sum (map size vs)
+    Con _ vs    -> 1 + Prelude.sum (map size vs)
+    MetaV _ vs  -> 1 + Prelude.sum (map size vs)
+    Level l     -> size l
+    Lam _ f     -> 1 + size f
+    Lit _       -> 1
+    Pi a b      -> 1 + size a + size b
+    Sort s      -> 1
+    DontCare mv -> size mv
 
 instance Sized Type where
   size = size . unEl
 
+instance Sized Level where
+  size (Max as) = 1 + Prelude.sum (map size as)
+
+instance Sized PlusLevel where
+  size (ClosedLevel _) = 1
+  size (Plus _ a) = size a
+
+instance Sized LevelAtom where
+  size (MetaLevel _ vs) = 1 + Prelude.sum (map size vs)
+  size (BlockedLevel _ v) = size v
+  size (NeutralLevel v) = size v
+  size (UnreducedLevel v) = size v
+
 instance KillRange Term where
   killRange v = case v of
-    Var i vs   -> killRange1 (Var i) vs
-    Def c vs   -> killRange2 Def c vs
-    Con c vs   -> killRange2 Con c vs
-    MetaV m vs -> killRange1 (MetaV m) vs
-    Lam h f    -> killRange2 Lam h f
-    Lit l      -> killRange1 Lit l
-    Pi a b     -> killRange2 Pi a b
-    Fun a b    -> killRange2 Fun a b
-    Sort s     -> killRange1 Sort s
-    DontCare   -> DontCare
+    Var i vs    -> killRange1 (Var i) vs
+    Def c vs    -> killRange2 Def c vs
+    Con c vs    -> killRange2 Con c vs
+    MetaV m vs  -> killRange1 (MetaV m) vs
+    Lam h f     -> killRange2 Lam h f
+    Lit l       -> killRange1 Lit l
+    Level l     -> killRange1 Level l
+    Pi a b      -> killRange2 Pi a b
+    Sort s      -> killRange1 Sort s
+    DontCare mv -> killRange1 DontCare mv
 
+instance KillRange Level where
+  killRange (Max as) = killRange1 Max as
+
+instance KillRange PlusLevel where
+  killRange l@ClosedLevel{} = l
+  killRange (Plus n l) = killRange1 (Plus n) l
+
+instance KillRange LevelAtom where
+  killRange (MetaLevel n as)   = killRange1 (MetaLevel n) as
+  killRange (BlockedLevel m v) = killRange1 (BlockedLevel m) v
+  killRange (NeutralLevel v)   = killRange1 NeutralLevel v
+  killRange (UnreducedLevel v) = killRange1 UnreducedLevel v
+
 instance KillRange Type where
   killRange (El s v) = killRange2 El s v
 
@@ -123,10 +155,7 @@
     Prop       -> Prop
     Inf        -> Inf
     Type a     -> killRange1 Type a
-    Suc s      -> killRange1 Suc s
-    Lub s1 s2  -> killRange2 Lub s1 s2
     DLub s1 s2 -> killRange2 DLub s1 s2
-    MetaS x as -> killRange1 (MetaS x) as
 
 instance KillRange a => KillRange (Tele a) where
   killRange = fmap killRange
@@ -150,82 +179,43 @@
 -- | Sequence of types. An argument of the first type is bound in later types
 --   and so on.
 data Tele a = EmptyTel
-	    | ExtendTel a (Abs (Tele a))
-  deriving (Typeable, Data, Show, Eq, Ord)
+	    | ExtendTel a (Abs (Tele a))  -- ^ Abs is never NoAbs.
+  deriving (Typeable, Data, Show, Functor, Foldable, Traversable)
 
 type Telescope = Tele (Arg Type)
 
-instance Functor Tele where
-  fmap f  EmptyTel         = EmptyTel
-  fmap f (ExtendTel a tel) = ExtendTel (f a) (fmap (fmap f) tel)
-
 instance Sized (Tele a) where
   size  EmptyTel	 = 0
   size (ExtendTel _ tel) = 1 + size tel
 
 -- | The body has (at least) one free variable.
-data Abs a = Abs { absName :: String
-		 , absBody :: a
-		 }
-  deriving (Typeable, Data)
+data Abs a = Abs String a
+           | NoAbs String a
+  deriving (Typeable, Data, Functor, Foldable, Traversable)
 
-instance Eq a => Eq (Abs a) where
-  (==) = (==) `on` absBody
+-- | Danger: doesn't shift variables properly
+unAbs :: Abs a -> a
+unAbs (Abs   _ v) = v
+unAbs (NoAbs _ v) = v
 
-instance Ord a => Ord (Abs a) where
-  compare = compare `on` absBody
+absName :: Abs a -> String
+absName (Abs   x _) = x
+absName (NoAbs x _) = x
 
 instance Show a => Show (Abs a) where
   showsPrec p (Abs x a) = showParen (p > 0) $
     showString "Abs " . shows x . showString " " . showsPrec 10 a
-
-instance Functor Abs where
-  fmap f (Abs x t) = Abs x $ f t
-
-instance Foldable Abs where
-  foldr f z (Abs _ t) = f t z
-
-instance Traversable Abs where
-  traverse f (Abs x t) = Abs x <$> f t
+  showsPrec p (NoAbs x a) = showParen (p > 0) $
+    showString "NoAbs " . shows x . showString " " . showsPrec 10 a
 
 instance Sized a => Sized (Abs a) where
-  size = size . absBody
-
-telFromList :: [Arg (String, Type)] -> Telescope
-telFromList = foldr (\(Arg h r (x, a)) -> ExtendTel (Arg h r a) . Abs x) EmptyTel
-
-telToList :: Telescope -> [Arg (String, Type)]
-telToList EmptyTel = []
-telToList (ExtendTel arg (Abs x tel)) = fmap ((,) x) arg : telToList tel
+  size = size . unAbs
 
 --
 -- Definitions
 --
 
--- | Pairs consisting of original and translated clauses.
-data Clauses = Clauses
-  { maybeOriginalClause :: Maybe Clause
-    -- ^ The original clause, before translation of record patterns.
-    -- 'Nothing' if the translated clause is identical to the original
-    -- one.
-  , translatedClause :: Clause
-    -- ^ The translated clause.
-  }
-  deriving (Typeable, Data, Show)
-
--- | The original clause, before translation of record patterns.
-originalClause :: Clauses -> Clause
-originalClause Clauses{ maybeOriginalClause = Just c } = c
-originalClause Clauses{ maybeOriginalClause = Nothing
-                      , translatedClause    = c      } = c
-
-instance HasRange Clauses where
-  getRange = getRange . translatedClause
-
--- | A clause is a list of patterns and the clause body should @Bind@ or
--- @NoBind@ in the order the variables occur in the patterns. The @NoBind@
--- constructor is an optimisation to avoid substituting for variables that
--- aren't used. (Note: This optimisation has been disabled.)
+-- | A clause is a list of patterns and the clause body should @Bind@.
 --
 --  The telescope contains the types of the pattern variables and the
 --  permutation is how to get from the order the variables occur in
@@ -244,9 +234,7 @@
   deriving (Typeable, Data, Show)
 data ClauseBody = Body Term
 		| Bind (Abs ClauseBody)
-		| NoBind ClauseBody
-		| NoBody    -- ^ for absurd clauses.  A @NoBody@ is never
-                            -- preceded by any @Bind@ or @NoBind@.
+		| NoBody    -- ^ for absurd clauses.
   deriving (Typeable, Data, Show)
 
 instance HasRange Clause where
@@ -276,35 +264,19 @@
 
 -- | Doesn't do any reduction.
 arity :: Type -> Nat
-arity t =
-    case unEl t of
-	Pi  _ (Abs _ b) -> 1 + arity b
-	Fun _	     b	-> 1 + arity b
-	_		-> 0
+arity t = case unEl t of
+  Pi  _ b -> 1 + arity (unAbs b)
+  _       -> 0
 
 -- | Suggest a name for the first argument of a function of the given type.
 argName :: Type -> String
 argName = argN . unEl
     where
 	argN (Pi _ b)  = "." ++ absName b
-	argN (Fun _ _) = ".x"
 	argN _	  = __IMPOSSIBLE__
 
 
 ---------------------------------------------------------------------------
--- * Views
----------------------------------------------------------------------------
-
-data FunView
-	= FunV (Arg Type) Term	-- ^ second arg is the entire type ('Pi' or 'Fun').
-	| NoFunV Term
-
-funView :: Term -> FunView
-funView t@(Pi  arg _) = FunV arg t
-funView t@(Fun arg _) = FunV arg t
-funView t	      = NoFunV t
-
----------------------------------------------------------------------------
 -- * Smart constructors
 ---------------------------------------------------------------------------
 
@@ -322,47 +294,31 @@
 ignoreBlocking (Blocked _ x) = x
 ignoreBlocking (NotBlocked x) = x
 
-set0   = set 0
-set n  = sort $ mkType n
-prop   = sort Prop
-sort s = El (sSuc s) $ Sort s
+set0      = set 0
+set n     = sort $ mkType n
+prop      = sort Prop
+sort s    = El (sSuc s) $ Sort s
+varSort n = Type $ Max [Plus 0 $ NeutralLevel $ Var n []]
 
-mkType n = Type $ Lit $ LitLevel noRange n
+-- | Get the next higher sort.
+sSuc :: Sort -> Sort
+sSuc Prop            = mkType 1
+sSuc Inf             = Inf
+sSuc (DLub a b)      = DLub (sSuc a) (fmap sSuc b)
+sSuc (Type l)        = Type $ levelSuc l
 
-teleLam :: Telescope -> Term -> Term
-teleLam  EmptyTel	  t = t
-teleLam (ExtendTel u tel) t = Lam (argHiding u) $ flip teleLam t <$> tel
+levelSuc (Max []) = Max [ClosedLevel 1]
+levelSuc (Max as) = Max $ map inc as
+  where inc (ClosedLevel n) = ClosedLevel (n + 1)
+        inc (Plus n l)      = Plus (n + 1) l
 
+mkType n = Type $ Max [ClosedLevel n | n > 0]
+
 getSort :: Type -> Sort
 getSort (El s _) = s
 
 unEl :: Type -> Term
 unEl (El _ t) = t
-
--- | Get the next higher sort.
-sSuc :: Sort -> Sort
-sSuc Prop                      = mkType 1
-sSuc (Type (Lit (LitLevel _ n))) = mkType (n + 1)
-sSuc Inf                       = Inf
-sSuc s                         = Suc s
-
-sLub :: Sort -> Sort -> Sort
-sLub (Type (Lit (LitLevel _ 0))) Prop                      = Prop   -- (x:A) -> B prop if A type0, B prop [x:A]
-sLub (Type (Lit (LitLevel _ n))) Prop                      = mkType n
-sLub Prop (Type (Lit (LitLevel _ n)))                      = mkType n
-sLub (Type (Lit (LitLevel _ n))) (Type (Lit (LitLevel _ m))) = mkType $ max n m
-sLub (Suc a) (Suc b) = Suc (sLub a b)
-sLub (Type (Lit (LitLevel _ n))) (Suc a)
-  | n > 0     = sSuc (mkType (n - 1) `sLub` a)
-  | otherwise = Suc a
-sLub (Suc a) (Type (Lit (LitLevel _ n)))
-  | n > 0     = sSuc (a `sLub` mkType (n - 1))
-  | otherwise = Suc a
-sLub Inf _ = Inf
-sLub _ Inf = Inf
-sLub s1 s2
-    | s1 == s2	= s1
-    | otherwise	= Lub s1 s2
 
 impossibleTerm :: String -> Int -> Term
 impossibleTerm file line = Lit $ LitString noRange $ unlines
diff --git a/src/full/Agda/Syntax/Internal/Generic.hs b/src/full/Agda/Syntax/Internal/Generic.hs
--- a/src/full/Agda/Syntax/Internal/Generic.hs
+++ b/src/full/Agda/Syntax/Internal/Generic.hs
@@ -27,6 +27,11 @@
   traverseTermM f = traverse (traverseTermM f)
   foldTerm f = foldMap (foldTerm f)
 
+instance TermLike a => TermLike (Maybe a) where
+  traverseTerm f = fmap (traverseTerm f)
+  traverseTermM f = traverse (traverseTermM f)
+  foldTerm f = foldMap (foldTerm f)
+
 instance (TermLike a, TermLike b) => TermLike (a, b) where
   traverseTerm f (x, y) = (traverseTerm f x, traverseTerm f y)
   traverseTermM f (x, y) = (,) <$> traverseTermM f x <*> traverseTermM f y
@@ -39,40 +44,72 @@
 
 instance TermLike Term where
   traverseTerm f t = case t of
-    Var i xs -> f $ Var i $ traverseTerm f xs
-    Def c xs -> f $ Def c $ traverseTerm f xs
-    Con c xs -> f $ Con c $ traverseTerm f xs
-    Lam h b  -> f $ Lam h $ traverseTerm f b
-    Pi a b   -> f $ uncurry Pi $ traverseTerm f (a, b)
-    Fun a b  -> f $ uncurry Fun $ traverseTerm f (a, b)
-    MetaV m xs -> f $ MetaV m $ traverseTerm f xs
-    Lit _    -> f t
-    Sort _   -> f t
-    DontCare -> f t
+    Var i xs    -> f $ Var i $ traverseTerm f xs
+    Def c xs    -> f $ Def c $ traverseTerm f xs
+    Con c xs    -> f $ Con c $ traverseTerm f xs
+    Lam h b     -> f $ Lam h $ traverseTerm f b
+    Pi a b      -> f $ uncurry Pi $ traverseTerm f (a, b)
+    MetaV m xs  -> f $ MetaV m $ traverseTerm f xs
+    Level l     -> f $ Level $ traverseTerm f l
+    Lit _       -> f t
+    Sort _      -> f t
+    DontCare mv -> f $ DontCare $ traverseTerm f mv
 
   traverseTermM f t = case t of
-    Var i xs -> f =<< Var i <$> traverseTermM f xs
-    Def c xs -> f =<< Def c <$> traverseTermM f xs
-    Con c xs -> f =<< Con c <$> traverseTermM f xs
-    Lam h b  -> f =<< Lam h <$> traverseTermM f b
-    Pi a b   -> f =<< uncurry Pi <$> traverseTermM f (a, b)
-    Fun a b  -> f =<< uncurry Fun <$> traverseTermM f (a, b)
-    MetaV m xs -> f =<< MetaV m <$> traverseTermM f xs
-    Lit _    -> f t
-    Sort _   -> f t
-    DontCare -> f t
+    Var i xs    -> f =<< Var i <$> traverseTermM f xs
+    Def c xs    -> f =<< Def c <$> traverseTermM f xs
+    Con c xs    -> f =<< Con c <$> traverseTermM f xs
+    Lam h b     -> f =<< Lam h <$> traverseTermM f b
+    Pi a b      -> f =<< uncurry Pi <$> traverseTermM f (a, b)
+    MetaV m xs  -> f =<< MetaV m <$> traverseTermM f xs
+    Level l     -> f =<< Level <$> traverseTermM f l
+    Lit _       -> f t
+    Sort _      -> f t
+    DontCare mv -> f =<< DontCare <$> traverseTermM f mv
 
   foldTerm f t = f t `mappend` case t of
-    Var i xs   -> foldTerm f xs
-    Def c xs   -> foldTerm f xs
-    Con c xs   -> foldTerm f xs
-    Lam h b    -> foldTerm f b
-    Pi a b     -> foldTerm f (a, b)
-    Fun a b    -> foldTerm f (a, b)
-    MetaV m xs -> foldTerm f xs
-    Lit _      -> mempty
-    Sort _     -> mempty
-    DontCare   -> mempty
+    Var i xs    -> foldTerm f xs
+    Def c xs    -> foldTerm f xs
+    Con c xs    -> foldTerm f xs
+    Lam h b     -> foldTerm f b
+    Pi a b      -> foldTerm f (a, b)
+    MetaV m xs  -> foldTerm f xs
+    Level l     -> foldTerm f l
+    Lit _       -> mempty
+    Sort _      -> mempty
+    DontCare mv -> foldTerm f mv
+
+instance TermLike Level where
+  traverseTerm f  (Max as) = Max $ traverseTerm f as
+  traverseTermM f (Max as) = Max <$> traverseTermM f as
+  foldTerm f      (Max as) = foldTerm f as
+
+instance TermLike PlusLevel where
+  traverseTerm f l = case l of
+    ClosedLevel{} -> l
+    Plus n l      -> Plus n $ traverseTerm f l
+  traverseTermM f l = case l of
+    ClosedLevel{} -> return l
+    Plus n l      -> Plus n <$> traverseTermM f l
+  foldTerm f ClosedLevel{} = mempty
+  foldTerm f (Plus _ l)    = foldTerm f l
+
+instance TermLike LevelAtom where
+  traverseTerm f l = case l of
+    MetaLevel m vs   -> MetaLevel m $ traverseTerm f vs
+    NeutralLevel v   -> NeutralLevel $ traverseTerm f v
+    BlockedLevel m v -> BlockedLevel m $ traverseTerm f v
+    UnreducedLevel v -> UnreducedLevel $ traverseTerm f v
+  traverseTermM f l = case l of
+    MetaLevel m vs   -> MetaLevel m <$> traverseTermM f vs
+    NeutralLevel v   -> NeutralLevel <$> traverseTermM f v
+    BlockedLevel m v -> BlockedLevel m <$> traverseTermM f v
+    UnreducedLevel v -> UnreducedLevel <$> traverseTermM f v
+  foldTerm f l = case l of
+    MetaLevel m vs   -> foldTerm f vs
+    NeutralLevel v   -> foldTerm f v
+    BlockedLevel _ v -> foldTerm f v
+    UnreducedLevel v -> foldTerm f v
 
 instance TermLike Type where
   traverseTerm f (El s t) = El s $ traverseTerm f t
diff --git a/src/full/Agda/Syntax/Literal.hs b/src/full/Agda/Syntax/Literal.hs
--- a/src/full/Agda/Syntax/Literal.hs
+++ b/src/full/Agda/Syntax/Literal.hs
@@ -6,7 +6,6 @@
 import Agda.Syntax.Abstract.Name
 
 data Literal = LitInt    Range Integer
-             | LitLevel  Range Integer
 	     | LitFloat  Range Double
 	     | LitString Range String
 	     | LitChar   Range Char
@@ -14,7 +13,6 @@
   deriving (Typeable, Data, Show)
 
 instance Eq Literal where
-  LitLevel _ n  == LitLevel _ m  = n == m
   LitInt _ n    == LitInt _ m    = n == m
   LitFloat _ x  == LitFloat _ y  = x == y
   LitString _ s == LitString _ t = s == t
@@ -23,13 +21,10 @@
   _             == _             = False
 
 instance Ord Literal where
-  LitLevel _ n  `compare` LitLevel _ m  = n `compare` m
   LitInt _ n    `compare` LitInt _ m    = n `compare` m
   LitFloat _ x  `compare` LitFloat _ y  = x `compare` y
   LitString _ s `compare` LitString _ t = s `compare` t
   LitChar _ c   `compare` LitChar _ d   = c `compare` d
-  compare LitLevel{}    _ = LT
-  compare _ LitLevel{} = GT
   compare LitInt{}    _ = LT
   compare _ LitInt{} = GT
   compare LitFloat{}  _ = LT
@@ -40,7 +35,6 @@
   compare _ LitQName{}  = GT
 
 instance HasRange Literal where
-  getRange (LitLevel  r _) = r
   getRange (LitInt    r _) = r
   getRange (LitFloat  r _) = r
   getRange (LitString r _) = r
@@ -48,7 +42,6 @@
   getRange (LitQName  r _) = r
 
 instance SetRange Literal where
-  setRange r (LitLevel  _ x) = LitLevel  r x
   setRange r (LitInt    _ x) = LitInt    r x
   setRange r (LitFloat  _ x) = LitFloat  r x
   setRange r (LitString _ x) = LitString r x
@@ -56,7 +49,6 @@
   setRange r (LitQName  _ x) = LitQName  r x
 
 instance KillRange Literal where
-  killRange (LitLevel  r x) = LitLevel  (killRange r) x
   killRange (LitInt    r x) = LitInt    (killRange r) x
   killRange (LitFloat  r x) = LitFloat  (killRange r) x
   killRange (LitString r x) = LitString (killRange r) x
diff --git a/src/full/Agda/Syntax/Notation.hs b/src/full/Agda/Syntax/Notation.hs
--- a/src/full/Agda/Syntax/Notation.hs
+++ b/src/full/Agda/Syntax/Notation.hs
@@ -48,6 +48,10 @@
              | IdPart String
   deriving (Data, Typeable, Show, Eq)
 
+-- | Get a flat list of identifier parts of a notation.
+stringParts :: Notation -> [String]
+stringParts gs = [ x | IdPart x <- gs ]
+
 -- | Target argument position of a part (Nothing if it is not a hole)
 holeTarget (BindHole n) = Just n
 holeTarget (NormalHole n) = Just n
diff --git a/src/full/Agda/Syntax/Parser/Alex.hs b/src/full/Agda/Syntax/Parser/Alex.hs
--- a/src/full/Agda/Syntax/Parser/Alex.hs
+++ b/src/full/Agda/Syntax/Parser/Alex.hs
@@ -6,7 +6,7 @@
     ( -- * Alex requirements
       AlexInput(..)
     , alexInputPrevChar
-    , alexGetChar
+    , alexGetChar, alexGetByte
       -- * Lex actions
     , LexAction, LexPredicate
     , (.&&.), (.||.), not'
@@ -16,7 +16,9 @@
     )
     where
 
+import Control.Arrow
 import Control.Monad.State
+import Data.Word
 
 import Agda.Syntax.Position
 import Agda.Syntax.Parser.Monad
@@ -36,6 +38,8 @@
 alexInputPrevChar = lexPrevChar
 
 -- | Lex a character. No surprises.
+--
+-- This function is used by Alex 2.
 alexGetChar :: AlexInput -> Maybe (Char, AlexInput)
 alexGetChar (AlexInput { lexInput = []  }) = Nothing
 alexGetChar (AlexInput { lexInput = c:s, lexPos = p }) =
@@ -45,6 +49,15 @@
 		 , lexPrevChar	= c
 		 }
 	 )
+
+-- | A variant of 'alexGetChar'.
+--
+-- This function is used by Alex 3.
+alexGetByte :: AlexInput -> Maybe (Word8, AlexInput)
+alexGetByte ai =
+  -- Note that we ensure that every character presented to Alex fits
+  -- in seven bits.
+  (fromIntegral . fromEnum *** id) <$> alexGetChar ai
 
 {--------------------------------------------------------------------------
     Monad operations
diff --git a/src/full/Agda/Syntax/Parser/LexActions.hs b/src/full/Agda/Syntax/Parser/LexActions.hs
--- a/src/full/Agda/Syntax/Parser/LexActions.hs
+++ b/src/full/Agda/Syntax/Parser/LexActions.hs
@@ -75,6 +75,8 @@
 postToken :: Token -> Token
 postToken (TokId (r, "\x03bb")) = TokSymbol SymLambda r
 postToken (TokId (r, "\x2192")) = TokSymbol SymArrow r
+postToken (TokId (r, "\x2983")) = TokSymbol SymDoubleOpenBrace r
+postToken (TokId (r, "\x2984")) = TokSymbol SymDoubleCloseBrace r
 postToken (TokId (r, "\x2200")) = TokKeyword KwForall r
 postToken (TokId (r, s))
   | set == "Set" && all isSub n = TokSetN (r, readSubscript n)
@@ -93,13 +95,13 @@
 	c:s'	-> inp' { lexInput    = s'
 			, lexPrevChar = c
 			}
-	[]	-> __IMPOSSIBLE__
+	[]	-> inp' { lexInput = [] }   -- we do get empty tokens moving between states
 
--- | Alex can't handle unicode characters. To solve this we translate all
---   Unicode (non-ASCII) identifiers to @z@, all Unicode operator
---   characters to @+@, and all whitespace characters (except for @\t@
---   and @\n@) to ' '. It is important that there aren't any keywords
---   containing @z@, @+@ or @ @.
+-- | Alex 2 can't handle unicode characters. To solve this we
+--   translate all Unicode (non-ASCII) identifiers to @z@, all Unicode
+--   operator characters to @+@, and all whitespace characters (except
+--   for @\t@ and @\n@) to ' '. It is important that there aren't any
+--   keywords containing @z@, @+@ or @ @.
 foolAlex :: AlexInput -> AlexInput
 foolAlex inp = inp { lexInput = map fool $ lexInput inp }
     where
diff --git a/src/full/Agda/Syntax/Parser/LexActions.hs-boot b/src/full/Agda/Syntax/Parser/LexActions.hs-boot
--- a/src/full/Agda/Syntax/Parser/LexActions.hs-boot
+++ b/src/full/Agda/Syntax/Parser/LexActions.hs-boot
@@ -27,4 +27,3 @@
 followedBy    :: Char -> LexPredicate
 eof           :: LexPredicate
 inState       :: LexState -> LexPredicate
-
diff --git a/src/full/Agda/Syntax/Parser/Lexer.x b/src/full/Agda/Syntax/Parser/Lexer.x
--- a/src/full/Agda/Syntax/Parser/Lexer.x
+++ b/src/full/Agda/Syntax/Parser/Lexer.x
@@ -1,5 +1,6 @@
 {
 {-# OPTIONS_GHC -fno-warn-deprecated-flags #-}
+{-# LANGUAGE BangPatterns #-}
 {-| The lexer is generated by Alex (<http://www.haskell.org/alex>) and is an
     adaptation of GHC's lexer. The main lexing function 'lexer' is called by
     the "Agda.Syntax.Parser.Parser" to get the next token from the input.
@@ -56,10 +57,11 @@
 tokens :-
 
 -- Lexing literate files
-<tex>	 $white_nonl* \\ "begin{code}" $white_nonl* $ { end_ }
-<tex>	 .* $		            { withInterval TokTeX }
-<tex>	 .+		            { withInterval TokTeX }
+<tex> $white_nonl* \\ "begin{code}" $white_nonl* $ { end_ }
+<tex> .+ / { keepComments } { withInterval TokTeX }
+<tex>	 .+		            ;
 <tex>    \n                         ;
+<tex> () / { eof } { end_ }
 <bol_,layout_>
   \\ "end{code}" / { inState code } { begin_ tex }
   -- \end{code} should only be recognized if the bottom of the stack is <code>
@@ -79,7 +81,9 @@
 <pragma_>   "COMPILED_DATA"	{ keyword KwCOMPILED_DATA }
 <pragma_>   "COMPILED_TYPE"	{ keyword KwCOMPILED_TYPE }
 <pragma_>   "COMPILED"	        { keyword KwCOMPILED }
-<pragma_>   "COMPILED_EPIC" { keyword KwCOMPILED_EPIC }
+<pragma_>   "COMPILED_EPIC"     { keyword KwCOMPILED_EPIC }
+<pragma_>   "COMPILED_JS"       { keyword KwCOMPILED_JS }
+<pragma_>   "STATIC"            { keyword KwSTATIC }
 <pragma_>   "IMPORT"	        { keyword KwIMPORT }
 <pragma_>   "IMPOSSIBLE"	{ keyword KwIMPOSSIBLE }
 <pragma_>   "ETA"               { keyword KwETA }
@@ -150,6 +154,8 @@
 <0,code> Set @number	{ withInterval' (read . drop 3) TokSetN }
 <0,code> quoteGoal	{ keyword KwQuoteGoal }
 <0,code> quote		{ keyword KwQuote }
+<0,code> quoteTerm	{ keyword KwQuoteTerm }
+<0,code> unquote	{ keyword KwUnquote }
 <0,code> syntax         { keyword KwSyntax }
 
 -- The parser is responsible to put the lexer in the imp_dir_ state when it
@@ -166,6 +172,7 @@
 
 -- Special symbols
 <0,code> "..."		{ symbol SymEllipsis }
+<0,code> ".."		{ symbol SymDotDot }
 <0,code> "."		{ symbol SymDot }
 <0,code> ";"		{ symbol SymSemi }
 <0,code> ":"		{ symbol SymColon }
@@ -178,6 +185,14 @@
 <0,code> "->"		{ symbol SymArrow }
 <0,code> "\"		{ symbol SymLambda }
 <0,code> "@"		{ symbol SymAs }
+<0,code> "{{" /[^!]		{ symbol SymDoubleOpenBrace }
+-- We don't lex '}}' into a SymDoubleCloseBrace. Instead, we lex it as
+-- two SymCloseBrace's. When the parser is looking for a double
+-- closing brace, it will also accept two SymCloseBrace's, after
+-- verifying that they are immediately next to each other.
+-- This trick allows us to keep "record { a = record {}}" working
+-- properly.
+-- <0,code> "}}"		{ symbol SymDoubleCloseBrace }
 <0,code> "{"		{ symbol SymOpenBrace }	    -- you can't use braces for layout
 <0,code> "}"		{ symbol SymCloseBrace }
 
diff --git a/src/full/Agda/Syntax/Parser/Parser.y b/src/full/Agda/Syntax/Parser/Parser.y
--- a/src/full/Agda/Syntax/Parser/Parser.y
+++ b/src/full/Agda/Syntax/Parser/Parser.y
@@ -1,6 +1,7 @@
 {
 {-# OPTIONS_GHC -fno-warn-incomplete-patterns
                 -fno-warn-deprecated-flags #-}
+{-# LANGUAGE BangPatterns #-}
 {-| The parser is generated by Happy (<http://www.haskell.org/happy>).
 -}
 module Agda.Syntax.Parser.Parser (
@@ -33,7 +34,6 @@
 import Agda.Utils.Monad
 import Agda.Utils.QuickCheck
 import Agda.Utils.TestHelpers
-
 }
 
 %name tokensParser Tokens
@@ -89,14 +89,19 @@
     'COMPILED_DATA' { TokKeyword KwCOMPILED_DATA $$ }
     'COMPILED_TYPE' { TokKeyword KwCOMPILED_TYPE $$ }
     'COMPILED_EPIC' { TokKeyword KwCOMPILED_EPIC $$ }
+    'COMPILED_JS'   { TokKeyword KwCOMPILED_JS $$ }
+    'STATIC'        { TokKeyword KwSTATIC $$ }
     'quoteGoal'     { TokKeyword KwQuoteGoal $$ }
     'quote'         { TokKeyword KwQuote $$ }
+    'quoteTerm'     { TokKeyword KwQuoteTerm $$ }
+    'unquote'       { TokKeyword KwUnquote $$ }
 
     setN	{ TokSetN $$ }
     tex		{ TokTeX $$ }
     comment	{ TokComment $$ }
 
     '...'	{ TokSymbol SymEllipsis $$ }
+    '..'	{ TokSymbol SymDotDot $$ }
     '.'		{ TokSymbol SymDot $$ }
     ';'		{ TokSymbol SymSemi $$ }
     ':'		{ TokSymbol SymColon $$ }
@@ -109,6 +114,8 @@
     '|'		{ TokSymbol SymBar $$ }
     '('		{ TokSymbol SymOpenParen $$ }
     ')'		{ TokSymbol SymCloseParen $$ }
+    '{{'	{ TokSymbol SymDoubleOpenBrace $$ }
+    '}}'	{ TokSymbol SymDoubleCloseBrace $$ }
     '{'		{ TokSymbol SymOpenBrace $$ }
     '}'		{ TokSymbol SymCloseBrace $$ }
     vopen	{ TokSymbol SymOpenVirtualBrace $$ }
@@ -179,16 +186,21 @@
     | 'COMPILED_DATA'{ TokKeyword KwCOMPILED_DATA $1 }
     | 'COMPILED_TYPE'{ TokKeyword KwCOMPILED_TYPE $1 }
     | 'COMPILED_EPIC'{ TokKeyword KwCOMPILED_EPIC $1 }
+    | 'COMPILED_JS'  { TokKeyword KwCOMPILED_JS $1 }
+    | 'STATIC'       { TokKeyword KwSTATIC $1 }
     | 'IMPOSSIBLE'    { TokKeyword KwIMPOSSIBLE $1 }
     | 'ETA'           { TokKeyword KwETA $1 }
     | 'quoteGoal'     { TokKeyword KwQuoteGoal $1 }
     | 'quote'         { TokKeyword KwQuote $1 }
+    | 'quoteTerm'     { TokKeyword KwQuoteTerm $1 }
+    | 'unquote'       { TokKeyword KwUnquote $1 }
 
     | setN	    { TokSetN $1 }
     | tex	    { TokTeX $1 }
     | comment	    { TokComment $1 }
 
     | '...'	    { TokSymbol SymEllipsis $1 }
+    | '..'	    { TokSymbol SymDotDot $1 }
     | '.'	    { TokSymbol SymDot $1 }
     | ';'	    { TokSymbol SymSemi $1 }
     | ':'	    { TokSymbol SymColon $1 }
@@ -201,6 +213,8 @@
     | '|'	    { TokSymbol SymBar $1 }
     | '('	    { TokSymbol SymOpenParen $1 }
     | ')'	    { TokSymbol SymCloseParen $1 }
+    | '{{'	    { TokSymbol SymDoubleOpenBrace $1 }
+    | '}}'	    { TokSymbol SymDoubleCloseBrace $1 }
     | '{'	    { TokSymbol SymOpenBrace $1 }
     | '}'	    { TokSymbol SymCloseBrace $1 }
     | vopen	    { TokSymbol SymOpenVirtualBrace $1 }
@@ -216,22 +230,14 @@
     | literal	    { TokLiteral $1 }
 
 {--------------------------------------------------------------------------
-    TeX
- --------------------------------------------------------------------------}
-
-TeX :: { () }
-TeX : {- empty -} { () }
-    | tex TeX	  { () }
-
-{--------------------------------------------------------------------------
     Top level
  --------------------------------------------------------------------------}
 
 File :: { ([Pragma], [Declaration]) }
-File : File1 TeX  { $1 }
+File : File1 { $1 }
 
-File1 : TopLevel		 { ([], $1) }
-      | TeX TopLevelPragma File1 { let (ps,m) = $3 in ($2 : ps, m) }
+File1 : TopLevel             { ([], $1) }
+      | TopLevelPragma File1 { let (ps,m) = $2 in ($1 : ps, m) }
 
 
 {--------------------------------------------------------------------------
@@ -258,8 +264,8 @@
 -- brace, so we don't have to distinguish between the two semi colons. You can't
 -- use a virtual semi colon in a block started by a concrete brace, but this is
 -- simply because the lexer will not generate virtual semis in this case.
-semi : ';'	  { $1 }
-     | TeX vsemi  { $2 }
+semi : ';'    { $1 }
+     | vsemi  { $1 }
 
 
 -- Enter the 'imp_dir' lex state, where we can parse the keywords 'using',
@@ -274,7 +280,7 @@
 -- An integer. Used in fixity declarations.
 Int :: { Integer }
 Int : literal	{% case $1 of {
-		     LitInt _ n	-> return $ fromIntegral n;
+		     LitInt _ n	-> return n;
 		     _		-> fail $ "Expected integer"
 		   }
 		}
@@ -295,6 +301,23 @@
     : Id SpaceIds { $1 : $2 }
     | Id	  { [$1] }
 
+-- When looking for a double closed brace, we accept either a single token '}}'
+-- (which is what the unicode character "RIGHT WHITE CURLY BRACKET" is
+-- postprocessed into in LexActions.hs), but also two consecutive tokens '}'
+-- (which a string '}}' is lexed to).  This small hack allows us to keep
+-- "record { a = record { }}" working. In the second case, we check that the two
+-- tokens '}' are immediately consecutive.
+DoubleCloseBrace :: { Range }
+DoubleCloseBrace
+  : '}}' { getRange $1 }
+  | '}' '}' {%
+      if posPos (fromJust (rEnd (getRange $2))) -
+	 posPos (fromJust (rStart (getRange $1))) > 2
+      then parseErrorAt (fromJust (rStart (getRange $2)))
+	 "Expecting '}}', found separated '}'s."
+      else return $ fuseRange (getRange $1) (getRange ($2))
+    }
+
 {- UNUSED
 -- Space separated list of one or more identifiers, some of which may
 -- be surrounded by braces.
@@ -302,6 +325,8 @@
 HiddenIds
     : Id HiddenIds               { defaultArg $1 : $2 }
     | Id	                 { [defaultArg $1] }
+    | '{{' SpaceIds DoubleCloseBrace HiddenIds { map (Arg Instance Relevant) $2 ++ $4 }
+    | '{{' SpaceIds DoubleCloseBrace         { map (Arg Instance Relevant) $2 }
     | '{' SpaceIds '}' HiddenIds { map (Arg Hidden Relevant) $2 ++ $4 }
     | '{' SpaceIds '}'           { map (Arg Hidden Relevant) $2 }
 -}
@@ -322,12 +347,20 @@
 -- be surrounded by braces or dotted.
 ArgIds :: { [Arg Name] }
 ArgIds
-    : MaybeDottedId ArgIds          { $1 : $2 }
-    | MaybeDottedId                 { [$1] }
-    | '{' MaybeDottedIds '}' ArgIds { map hide $2 ++ $4 }
-    | '{' MaybeDottedIds '}'        { map hide $2 }
-    | '.' '{' SpaceIds '}' ArgIds   { map (Arg Hidden Irrelevant) $3 ++ $5 }
-    | '.' '{' SpaceIds '}'          { map (Arg Hidden Irrelevant) $3 }
+    : MaybeDottedId ArgIds            { $1 : $2 }
+    | MaybeDottedId                   { [$1] }
+    | '{{' MaybeDottedIds DoubleCloseBrace ArgIds { map makeInstance $2 ++ $4 }
+    | '{{' MaybeDottedIds DoubleCloseBrace        { map makeInstance $2 }
+    | '{' MaybeDottedIds '}' ArgIds   { map hide $2 ++ $4 }
+    | '{' MaybeDottedIds '}'          { map hide $2 }
+    | '.' '{' SpaceIds '}' ArgIds     { map (Arg Hidden Irrelevant) $3 ++ $5 }
+    | '.' '{' SpaceIds '}'            { map (Arg Hidden Irrelevant) $3 }
+    | '.' '{{' SpaceIds DoubleCloseBrace ArgIds   { map (Arg Instance Irrelevant) $3 ++ $5 }
+    | '.' '{{' SpaceIds DoubleCloseBrace          { map (Arg Instance Irrelevant) $3 }
+    | '..' '{' SpaceIds '}' ArgIds    { map (Arg Hidden NonStrict) $3 ++ $5 }
+    | '..' '{' SpaceIds '}'           { map (Arg Hidden NonStrict) $3 }
+    | '..' '{{' SpaceIds DoubleCloseBrace ArgIds  { map (Arg Instance NonStrict) $3 ++ $5 }
+    | '..' '{{' SpaceIds DoubleCloseBrace         { map (Arg Instance NonStrict) $3 }
 
 QId :: { QName }
 QId : q_id  {% mkQName $1 }
@@ -344,7 +377,16 @@
 BId : Id    { $1 }
     | '_'   { Name (getRange $1) [Hole] }
 
+{- UNUSED
+-- A binding variable. Can be '_'
+MaybeDottedBId :: { (Relevance, Name) }
+MaybeDottedBId
+    : BId        { (Relevant  , $1) }
+    | '.' BId    { (Irrelevant, $2) }
+    | '..' BId   { (NonStrict, $2) }
+-}
 
+
 -- Space separated list of binding identifiers. Used in fixity
 -- declarations infixl 100 + -
 SpaceBIds :: { [Name] }
@@ -352,12 +394,34 @@
     : BId SpaceBIds { $1 : $2 }
     | BId	    { [$1] }
 
+{- DOES PRODUCE REDUCE/REDUCE CONFLICTS!
 -- Space-separated list of binding identifiers. Used in dependent
 -- function spaces: (x y z : Nat) -> ...
 -- (Used to be comma-separated; hence the name)
 -- QUESTION: Should this be replaced by SpaceBIds above?
+--CommaBIds :: { [(Relevance,Name)] }
 CommaBIds :: { [Name] }
-CommaBIds : Application {%
+CommaBIds
+    : CommaBIds BId { $1 ++ [$2] }  -- SWITCHING DOES NOT HELP
+    | BId	    { [$1] }
+-}
+
+-- Space-separated list of binding identifiers. Used in dependent
+-- function spaces: (x y z : Nat) -> ...
+-- (Used to be comma-separated; hence the name)
+-- QUESTION: Should this be replaced by SpaceBIds above?
+-- Andreas, 2011-04-07 the trick avoids reduce/reduce conflicts
+-- when parsing  (x y z : A) -> B
+-- at point (x y  it is not clear whether x y is an application or
+-- a variable list. We could be parsing (x y z) -> B
+-- with ((x y) z) being a type.
+CommaBIds :: { [Name] }
+CommaBIds : CommaBIdAndAbsurds {
+    case $1 of
+      Left ns -> ns
+      Right _ -> fail $ "expected sequence of bound identifiers, not absurd pattern"
+    }
+{-
     let getName (Ident (QName x)) = Just x
 	getName (Underscore r _)  = Just (Name r [Hole])
 	getName _		  = Nothing
@@ -365,6 +429,25 @@
     case partition isJust $ map getName $1 of
 	(good, []) -> return $ map fromJust good
 	_	   -> fail $ "expected sequence of bound identifiers"
+-}
+
+CommaBIdAndAbsurds :: { Either [Name] [Expr] }
+CommaBIdAndAbsurds : Application {%
+    let getName (Ident (QName x)) = Just x
+	getName (Underscore r _)  = Just (Name r [Hole])
+	getName _		  = Nothing
+
+        containsAbsurd (Absurd _) = True
+        containsAbsurd (HiddenArg _ (Named _ e)) = containsAbsurd e
+        containsAbsurd (InstanceArg _ (Named _ e)) = containsAbsurd e
+        containsAbsurd (Paren _ expr)    = containsAbsurd expr
+        containsAbsurd (RawApp _ exprs)    = any containsAbsurd exprs
+        containsAbsurd _          = False
+    in
+    if isJust $ find containsAbsurd $1 then return $ Right $1 else
+    case partition isJust $ map getName $1 of
+	(good, []) -> return $ Left $ map fromJust good
+	_	   -> fail $ "expected sequence of bound identifiers"
     }
 
 
@@ -427,9 +510,15 @@
 -- Level 2: Lambdas and lets
 Expr2
     : '\\' LamBindings Expr	   { Lam (fuseRange $1 $3) $2 $3 }
-    | '\\' AbsurdLamBindings       { let (bs, h) = $2; r = fuseRange $1 bs in
-                                     if null bs then AbsurdLam r h else
-                                     Lam r bs (AbsurdLam r h)
+    | '\\'  '{' LamClauses '}'     { ExtendedLam (fuseRange $1 (fuseRange $2 $4)) (reverse $3) }
+    | '\\' AbsurdLamBindings       {% case $2 of
+                                       Left (bs, h) -> if null bs then return $ AbsurdLam r h else
+                                                       return $ Lam r bs (AbsurdLam r h)
+                                                         where r = fuseRange $1 bs
+    				       Right es -> do -- it is of the form @\ { p1 ... () }@
+                                                     p <- exprToLHS (RawApp (getRange es) es);
+                                                     return $ ExtendedLam (fuseRange $1 es)
+                                                                     [(p [] [], AbsurdRHS, NoWhere)]
                                    }
     | 'let' Declarations 'in' Expr { Let (fuseRange $1 $4) $2 $4 }
     | Expr3			   { $1 }
@@ -441,7 +530,12 @@
     | Expr3 Application3 { $1 : $2 }
 
 -- Level 3: Atoms
-Expr3
+Expr3Curly
+    : '{' Expr '}'			{ HiddenArg (fuseRange $1 $3) (unnamed $2) }
+    | '{' Id '=' Expr '}'		{ HiddenArg (fuseRange $1 $5) (named (show $2) $4) }
+    | '{' '}'				{ let r = fuseRange $1 $2 in HiddenArg r $ unnamed $ Absurd r }
+
+Expr3NoCurly
     : QId				{ Ident $1 }
     | literal				{ Lit $1 }
     | '?'				{ QuestionMark (getRange $1) Nothing }
@@ -449,16 +543,22 @@
     | 'Prop'				{ Prop (getRange $1) }
     | 'Set'				{ Set (getRange $1) }
     | 'quote'                           { Quote (getRange $1) }
+    | 'quoteTerm'                       { QuoteTerm (getRange $1) }
+    | 'unquote'                         { Unquote (getRange $1) }
     | setN				{ SetN (getRange (fst $1)) (snd $1) }
-    | '{' Expr '}'			{ HiddenArg (fuseRange $1 $3) (unnamed $2) }
-    | '{' Id '=' Expr '}'		{ HiddenArg (fuseRange $1 $5) (named (show $2) $4) }
+    | '{{' Expr DoubleCloseBrace			{ InstanceArg (fuseRange $1 $3) (unnamed $2) }
+    | '{{' Id '=' Expr DoubleCloseBrace		{ InstanceArg (fuseRange $1 $5) (named (show $2) $4) }
     | '(' Expr ')'			{ Paren (fuseRange $1 $3) $2 }
-    | '{' '}'				{ let r = fuseRange $1 $2 in HiddenArg r $ unnamed $ Absurd r }
     | '(' ')'				{ Absurd (fuseRange $1 $2) }
+    | '{{' DoubleCloseBrace             { let r = fuseRange $1 $2 in InstanceArg r $ unnamed $ Absurd r }
     | Id '@' Expr3			{ As (fuseRange $1 $3) $1 $3 }
     | '.' Expr3				{ Dot (fuseRange $1 $2) $2 }
     | 'record' '{' FieldAssignments '}' { Rec (getRange ($1,$4)) $3 }
+    | 'record' Expr3NoCurly '{' FieldAssignments '}' { RecUpdate (getRange ($1,$5)) $2 $4 }
 
+Expr3
+    : Expr3Curly			{ $1 }
+    | Expr3NoCurly			{ $1 }
 
 FieldAssignments :: { [(Name, Expr)] }
 FieldAssignments
@@ -490,22 +590,20 @@
     | TypedBindings		   { [$1] }
 
 
--- A typed binding is either (x1 .. xn:A;..;y1 .. ym:B) or {x1 .. xn:A;..;y1 .. ym:B}.
+-- A typed binding is either (x1 .. xn : A) or   {y1 .. ym : B}
+-- Andreas, 2011-04-07: or  .(x1 .. xn : A) or  .{y1 .. ym : B}
+-- Andreas, 2011-04-27: or ..(x1 .. xn : A) or ..{y1 .. ym : B}
 TypedBindings :: { TypedBindings }
 TypedBindings
-    : '(' TBinds ')' { TypedBindings (fuseRange $1 $3) (Arg NotHidden Relevant $2) }
-    | '{' TBinds '}' { TypedBindings (fuseRange $1 $3) (Arg Hidden    Relevant $2) }
-
-
--- A semicolon separated list of TypedBindings
-TBinds :: { [TypedBinding] }
-TBinds : TBind		   { [$1] }
-       | TBind ';' TBinds2 { $1 : $3 }
-
-TBinds2 :: { [TypedBinding] }
-TBinds2 : TBinds	   { $1 }
-	| Expr ';' TBinds2 { TNoBind $1 : $3 }
-	| Expr		   { [TNoBind $1] }
+    : '.' '(' TBind ')'    { TypedBindings (fuseRange $2 $4) (Arg NotHidden         Irrelevant $3) }
+    | '.' '{' TBind '}'    { TypedBindings (fuseRange $2 $4) (Arg Hidden            Irrelevant $3) }
+    | '.' '{{' TBind DoubleCloseBrace  { TypedBindings (fuseRange $1 $3) (Arg Instance Irrelevant $3) }
+    | '..' '(' TBind ')'    { TypedBindings (fuseRange $2 $4) (Arg NotHidden         NonStrict $3) }
+    | '..' '{' TBind '}'    { TypedBindings (fuseRange $2 $4) (Arg Hidden            NonStrict $3) }
+    | '..' '{{' TBind DoubleCloseBrace  { TypedBindings (fuseRange $1 $3) (Arg Instance NonStrict $3) }
+    | '(' TBind ')'        { TypedBindings (fuseRange $1 $3) (Arg NotHidden         Relevant $2) }
+    | '{{' TBind DoubleCloseBrace      { TypedBindings (fuseRange $1 $3) (Arg Instance Relevant $2) }
+    | '{' TBind '}'        { TypedBindings (fuseRange $1 $3) (Arg Hidden            Relevant $2) }
 
 
 -- x1 .. xn:A
@@ -517,30 +615,79 @@
 LamBindings :: { [LamBinding] }
 LamBindings
   : LamBinds '->' {%
-      case last $1 of
-        Left _  -> parseError "Absurd lambda cannot have a body."
-        _       -> return [ b | Right b <- $1 ]
+      case reverse $1 of
+        Left _ : _ -> parseError "Absurd lambda cannot have a body."
+	_ : _      -> return [ b | Right b <- $1 ]
+        []         -> parsePanic "Empty LamBinds"
       }
 
-AbsurdLamBindings :: { ([LamBinding], Hiding) }
+AbsurdLamBindings :: { Either ([LamBinding], Hiding) [Expr] }
 AbsurdLamBindings
-  : LamBinds {%
-    case last $1 of
-      Right _ -> parseError "Missing body for lambda"
-      Left h  -> return ([ b | Right b <- init $1], h)
+  : LamBindsAbsurd {%
+    case $1 of
+      Left lb -> case reverse lb of
+                   Right _ : _ -> parseError "Missing body for lambda"
+                   Left h  : _ -> return $ Left ([ b | Right b <- init lb], h)
+                   _           -> parsePanic "Empty LamBindsAbsurd"
+      Right es -> return $ Right es
     }
 
 -- absurd lambda is represented by Left hiding
 LamBinds :: { [Either Hiding LamBinding] }
 LamBinds
-  : DomainFreeBinding LamBinds	{ map Right $1 ++ $2 }
-  | TypedBindings LamBinds	{ Right (DomainFull $1) : $2 }
-  | DomainFreeBinding		{ map Right $1 }
+  : DomainFreeBinding LamBinds  { map Right $1 ++ $2 }
+  | TypedBindings LamBinds      { Right (DomainFull $1) : $2 }
+  | DomainFreeBinding           { map Right $1 }
   | TypedBindings		{ [Right $ DomainFull $1] }
   | '(' ')'                     { [Left NotHidden] }
   | '{' '}'                     { [Left Hidden] }
+  | '{{' DoubleCloseBrace       { [Left Instance] }
 
+-- Like LamBinds, but could also parse an absurd LHS of an extended lambda @{ p1 ... () }@
+LamBindsAbsurd :: { Either [Either Hiding LamBinding] [Expr] }
+LamBindsAbsurd
+  : DomainFreeBinding LamBinds	{ Left $ map Right $1 ++ $2 }
+  | TypedBindings LamBinds	{ Left $ Right (DomainFull $1) : $2 }
+  | DomainFreeBindingAbsurd   	{ case $1 of
+                                    Left lb -> Left $ map Right lb
+                                    Right es -> Right es }
+  | TypedBindings		{ Left [Right $ DomainFull $1] }
+  | '(' ')'                     { Left [Left NotHidden] }
+  | '{' '}'                     { Left [Left Hidden] }
+  | '{{' DoubleCloseBrace       { Left [Left Instance] }
 
+-- FNF, 2011-05-05: No where clauses in extended lambdas for now
+NonAbsurdLamClause :: { (LHS,RHS,WhereClause) }
+NonAbsurdLamClause
+  : Application3 '->' Expr {% do
+      p <- exprToLHS (RawApp (getRange $1) $1) ;
+      return (p [] [], RHS $3, NoWhere)
+	}
+
+AbsurdLamClause :: { (LHS,RHS,WhereClause) }
+AbsurdLamClause
+-- FNF, 2011-05-09: By being more liberal here, we avoid shift/reduce and reduce/reduce errors.
+-- Later stages such as scope checking will complain if we let something through which we should not
+  : Application {% do
+      p <- exprToLHS (RawApp (getRange $1) $1);
+      return (p [] [], AbsurdRHS, NoWhere)
+	}
+
+LamClause :: { (LHS,RHS,WhereClause) }
+LamClause
+  : NonAbsurdLamClause { $1 }
+  | AbsurdLamClause { $1 }
+
+-- Parses all extended lambda clauses except for a single absurd clause, which is taken care of
+-- in AbsurdLambda
+LamClauses :: { [(LHS,RHS,WhereClause)] }
+LamClauses
+   : LamClauses semi LamClause { $3 : $1 }
+   | AbsurdLamClause semi LamClause { [$3, $1] }
+   | NonAbsurdLamClause { [$1] }
+--   | {- empty -} { [] }
+
+
 ForallBindings :: { [LamBinding] }
 ForallBindings
   : TypedUntypedBindings1 '->' { $1 }
@@ -564,10 +711,37 @@
 -- A domain free binding is either x or {x1 .. xn}
 DomainFreeBinding :: { [LamBinding] }
 DomainFreeBinding
-    : BId		{ [DomainFree NotHidden $ mkBoundName_ $1]  }
-    | '{' CommaBIds '}' { map (DomainFree Hidden . mkBoundName_) $2 }
+  : DomainFreeBindingAbsurd { case $1 of
+                             Left lbs -> lbs
+                             Right _ -> fail "expected sequence of bound identifiers, not absurd pattern"
+                          }
+{-    : BId		{ [DomainFree NotHidden Relevant $ mkBoundName_ $1]  }
+    | '.' BId		{ [DomainFree NotHidden Irrelevant $ mkBoundName_ $2]  }
+    | '..' BId		{ [DomainFree NotHidden NonStrict $ mkBoundName_ $2]  }
+    | '{' CommaBIds '}' { map (DomainFree Hidden Relevant . mkBoundName_) $2 }
+    | '{{' CommaBIds DoubleCloseBrace { map (DomainFree Instance Relevant . mkBoundName_) $2 }
+    | '.' '{' CommaBIds '}' { map (DomainFree Hidden Irrelevant . mkBoundName_) $3 }
+    | '.' '{{' CommaBIds DoubleCloseBrace { map (DomainFree Instance Irrelevant . mkBoundName_) $3 }
+    | '..' '{' CommaBIds '}' { map (DomainFree Hidden NonStrict . mkBoundName_) $3 }
+    | '..' '{{' CommaBIds DoubleCloseBrace { map (DomainFree Instance NonStrict . mkBoundName_) $3 }
+    | '..' '{{' CommaBIds DoubleCloseBrace { map (DomainFree Instance NonStrict . mkBoundName_) $3 }
+  -}
 
+-- A domain free binding is either x or {x1 .. xn}
+DomainFreeBindingAbsurd :: { Either [LamBinding] [Expr]}
+DomainFreeBindingAbsurd
+    : BId		{ Left [DomainFree NotHidden Relevant $ mkBoundName_ $1]  }
+    | '.' BId		{ Left [DomainFree NotHidden Irrelevant $ mkBoundName_ $2]  }
+    | '..' BId		{ Left [DomainFree NotHidden NonStrict $ mkBoundName_ $2]  }
+    | '{' CommaBIdAndAbsurds '}'
+         { either (Left . map (DomainFree Hidden Relevant . mkBoundName_)) Right $2 }
+    | '{{' CommaBIds DoubleCloseBrace { Left $ map (DomainFree Instance Relevant . mkBoundName_) $2 }
+    | '.' '{' CommaBIds '}' { Left $ map (DomainFree Hidden Irrelevant . mkBoundName_) $3 }
+    | '.' '{{' CommaBIds DoubleCloseBrace { Left $ map (DomainFree Instance Irrelevant . mkBoundName_) $3 }
+    | '..' '{' CommaBIds '}' { Left $ map (DomainFree Hidden NonStrict . mkBoundName_) $3 }
+    | '..' '{{' CommaBIds DoubleCloseBrace { Left $ map (DomainFree Instance NonStrict . mkBoundName_) $3 }
 
+
 {--------------------------------------------------------------------------
     Modules and imports
  --------------------------------------------------------------------------}
@@ -687,7 +861,9 @@
     | Fields        { $1   }
     | FunClause	    { [$1] }
     | Data	    { [$1] }
+    | DataSig	    { [$1] }  -- lone data type signature in mutual block
     | Record	    { [$1] }
+    | RecordSig	    { [$1] }  -- lone record signature in mutual block
     | Infix	    { [$1] }
     | Mutual	    { [$1] }
     | Abstract	    { [$1] }
@@ -738,17 +914,35 @@
 -- Data declaration. Can be local.
 Data :: { Declaration }
 Data : 'data' Id TypedUntypedBindings ':' Expr 'where'
-	    Constructors	{ Data (getRange ($1, $6, $7)) Inductive $2 (map addType $3) $5 $7 }
+            Constructors	{ Data (getRange ($1, $6, $7)) Inductive $2 $3 (Just $5) $7 }
      | 'codata' Id TypedUntypedBindings ':' Expr 'where'
-	    Constructors	{ Data (getRange ($1, $6, $7)) CoInductive $2 (map addType $3) $5 $7 }
+            Constructors	{ Data (getRange ($1, $6, $7)) CoInductive $2 $3 (Just $5) $7 }
 
+  -- New cases when we already had a DataSig.  Then one can omit the sort.
+     | 'data' Id TypedUntypedBindings 'where'
+	    Constructors	{ Data (getRange ($1, $4, $5)) Inductive $2 $3 Nothing $5 }
+     | 'codata' Id TypedUntypedBindings 'where'
+	    Constructors	{ Data (getRange ($1, $4, $5)) CoInductive $2 $3 Nothing $5 }
 
+-- Data type signature. Found in mutual blocks.
+DataSig :: { Declaration }
+DataSig : 'data' Id TypedUntypedBindings ':' Expr
+  { DataSig (fuseRange $1 $5) Inductive $2 $3 $5 }
+
 -- Record declarations.
 Record :: { Declaration }
 Record : 'record' Id TypedUntypedBindings ':' Expr 'where'
 	    RecordDeclarations
-         { Record (getRange ($1, $6, $7)) $2 (fst $7) (map addType $3) $5 (snd $7) }
+         { Record (getRange ($1, $6, $7)) $2 (fst $7) $3 (Just $5) (snd $7) }
+       | 'record' Id TypedUntypedBindings 'where'
+	    RecordDeclarations
+         { Record (getRange ($1, $4, $5)) $2 (fst $5) $3 Nothing (snd $5) }
 
+-- Record type signature. In mutual blocks.
+RecordSig :: { Declaration }
+RecordSig : 'record' Id TypedUntypedBindings ':' Expr
+  { RecordSig (fuseRange $1 $5) $2 $3 $5 }
+
 -- Declaration of record constructor name.
 RecordConstructorName :: { Name }
 RecordConstructorName : 'constructor' Id { $2 }
@@ -827,22 +1021,38 @@
     } in
     case es of
     { []  -> Open r m dir
-    ; _   -> Private r [ ModuleMacro r (noName $ beginningOf $ getRange $2) []
-                           (RawApp (fuseRange m es) (Ident m : es)) DoOpen dir
+	; _   -> Private r [ ModuleMacro r (noName $ beginningOf $ getRange $2)
+			     (SectionApp (getRange (m , es)) [] (RawApp (fuseRange m es) (Ident m : es)))
+			     DoOpen dir
                        ]
     }
   }
+  | 'open' ModuleName '{{' '...' DoubleCloseBrace ImportDirective {
+    let r = getRange ($1, $2, $3, $4) in
+    Private r [ ModuleMacro r (noName $ beginningOf $ getRange $2)
+    	      	(RecordModuleIFS r $2) DoOpen $6
+        ]
+  }
 
 OpenArgs :: { [Expr] }
 OpenArgs : {- empty -}    { [] }
          | Expr3 OpenArgs { $1 : $2 }
 
+ModuleApplication :: { [TypedBindings] -> Parser ModuleApplication }
+ModuleApplication : ModuleName '{{' '...' DoubleCloseBrace { (\ts ->
+		    if null ts then return $ RecordModuleIFS (getRange ($1, $4)) $1
+		    else parseError "No bindings allowed for record module with non-canonical implicits" )
+		    }
+		  | ModuleName OpenArgs {
+		    (\ts -> return $ SectionApp (getRange ($1, $2)) ts (RawApp (fuseRange $1 $2) (Ident $1 : $2)) ) }
+
+
 -- Module instantiation
 ModuleMacro :: { Declaration }
-ModuleMacro : 'module' Id TypedUntypedBindings '=' Expr ImportDirective
-		    { ModuleMacro (getRange ($1, $5, $6)) $2 (map addType $3) $5 DontOpen $6 }
-	    | 'open' 'module' Id TypedUntypedBindings '=' Expr ImportDirective
-		    { ModuleMacro (getRange ($1, $6, $7)) $3 (map addType $4) $6 DoOpen $7 }
+ModuleMacro : 'module' Id TypedUntypedBindings '=' ModuleApplication ImportDirective
+		    {% do {ma <- $5 (map addType $3); return $ ModuleMacro (getRange ($1, ma, $6)) $2 ma DontOpen $6 } }
+	    | 'open' 'module' Id TypedUntypedBindings '=' ModuleApplication ImportDirective
+		    {% do {ma <- $6 (map addType $4); return $ ModuleMacro (getRange ($1, ma, $7)) $3 ma DoOpen $7 } }
 
 -- Import
 Import :: { Declaration }
@@ -858,9 +1068,9 @@
 
 -- The top-level consist of a bunch of import and open followed by a top-level module.
 TopLevel :: { [Declaration] }
-TopLevel : TeX TopModule       { [$2] }
-	 | TeX Import TopLevel { $2 : $3 }
-	 | TeX Open   TopLevel { $2 : $3 }
+TopLevel : TopModule       { [$1] }
+	 | Import TopLevel { $1 : $2 }
+	 | Open   TopLevel { $1 : $2 }
 
 -- The top-level module can have a qualified name.
 TopModule :: { Declaration }
@@ -881,6 +1091,8 @@
   | CompiledDataPragma { $1 }
   | CompiledTypePragma { $1 }
   | CompiledEpicPragma { $1 }
+  | CompiledJSPragma   { $1 }
+  | StaticPragma       { $1 }
   | ImportPragma       { $1 }
   | ImpossiblePragma   { $1 }
   | RecordEtaPragma    { $1 }
@@ -913,7 +1125,16 @@
   : '{-#' 'COMPILED_EPIC' PragmaName PragmaStrings '#-}'
     { CompiledEpicPragma (fuseRange $1 $5) $3 (unwords $4) }
 
+CompiledJSPragma :: { Pragma }
+CompiledJSPragma
+  : '{-#' 'COMPILED_JS' PragmaName PragmaStrings '#-}'
+    { CompiledJSPragma (fuseRange $1 $5) $3 (unwords $4) }
 
+StaticPragma :: { Pragma }
+StaticPragma
+  : '{-#' 'STATIC' PragmaName '#-}'
+    { StaticPragma (fuseRange $1 $4) $3 }
+
 RecordEtaPragma :: { Pragma }
 RecordEtaPragma
   : '{-#' 'ETA' PragmaName '#-}'
@@ -939,66 +1160,66 @@
 -- for every signature.
 TypeSignatures :: { [TypeSignature] }
 TypeSignatures
-    : TeX vopen TypeSignatures1 TeX close   { reverse $3 }
+    : vopen TypeSignatures1 close   { reverse $2 }
 
 -- Inside the layout block.
 TypeSignatures1 :: { [TypeSignature] }
 TypeSignatures1
-    : TypeSignatures1 semi TeX TypeSigs { reverse $4 ++ $1 }
-    | TeX TypeSigs			{ reverse $2 }
+    : TypeSignatures1 semi TypeSigs { reverse $3 ++ $1 }
+    | TypeSigs                      { reverse $1 }
 
 -- A variant of TypeSignatures which allows the irrelevance annotation (dot).
 RelTypeSignatures :: { [TypeSignature] }
 RelTypeSignatures
-    : TeX vopen RelTypeSignatures1 TeX close   { reverse $3 }
+    : vopen RelTypeSignatures1 close   { reverse $2 }
 
 -- Inside the layout block.
 RelTypeSignatures1 :: { [TypeSignature] }
 RelTypeSignatures1
-    : RelTypeSignatures1 semi TeX RelTypeSigs { reverse $4 ++ $1 }
-    | TeX RelTypeSigs			      { reverse $2 }
+    : RelTypeSignatures1 semi RelTypeSigs { reverse $3 ++ $1 }
+    | RelTypeSigs                         { reverse $1 }
 
 -- A variant of TypeSignatures which uses ArgTypeSigs instead of
 -- TypeSigs.
 ArgTypeSignatures :: { [Arg TypeSignature] }
 ArgTypeSignatures
-    : TeX vopen ArgTypeSignatures1 TeX close   { reverse $3 }
+    : vopen ArgTypeSignatures1 close   { reverse $2 }
 
 -- Inside the layout block.
 ArgTypeSignatures1 :: { [Arg TypeSignature] }
 ArgTypeSignatures1
-    : ArgTypeSignatures1 semi TeX ArgTypeSigs { reverse $4 ++ $1 }
-    | TeX ArgTypeSigs		              { reverse $2 }
+    : ArgTypeSignatures1 semi ArgTypeSigs { reverse $3 ++ $1 }
+    | ArgTypeSigs                         { reverse $1 }
 
 -- Constructors are type signatures. But constructor lists can be empty.
 Constructors :: { [Constructor] }
 Constructors
-    : TeX vopen TeX close { [] }
-    | TypeSignatures	  { $1 }
+    : vopen close    { [] }
+    | TypeSignatures { $1 }
 
 -- Record declarations, including an optional record constructor name.
 RecordDeclarations :: { (Maybe Name, [Declaration]) }
 RecordDeclarations
-    : TeX vopen                                              TeX close { (Nothing, []) }
-    | TeX vopen TeX RecordConstructorName                    TeX close { (Just $4, []) }
-    | TeX vopen TeX RecordConstructorName semi Declarations1 TeX close { (Just $4, reverse $6) }
-    | TeX vopen                                Declarations1 TeX close { (Nothing, reverse $3) }
+    : vopen                                          close { (Nothing, []) }
+    | vopen RecordConstructorName                    close { (Just $2, []) }
+    | vopen RecordConstructorName semi Declarations1 close { (Just $2, reverse $4) }
+    | vopen                            Declarations1 close { (Nothing, reverse $2) }
 
 -- Arbitrary declarations
 Declarations :: { [Declaration] }
 Declarations
-    : TeX vopen Declarations1 TeX close { reverse $3 }
+    : vopen Declarations1 close { reverse $2 }
 
 -- Arbitrary declarations
 Declarations0 :: { [Declaration] }
 Declarations0
-    : TeX vopen TeX close  { [] }
+    : vopen close  { [] }
     | Declarations { $1 }
 
 Declarations1 :: { [Declaration] }
 Declarations1
-    : Declarations1 semi TeX Declaration { reverse $4 ++ $1 }
-    | TeX Declaration			 { reverse $2 }
+    : Declarations1 semi Declaration { reverse $3 ++ $1 }
+    | Declaration                    { reverse $1 }
 
 
 {
@@ -1074,7 +1295,7 @@
 -- | Converts lambda bindings to typed bindings.
 addType :: LamBinding -> TypedBindings
 addType (DomainFull b)	 = b
-addType (DomainFree h x) = TypedBindings r $ Arg h Relevant [TBind r [x] $ Underscore r Nothing]
+addType (DomainFree h rel x) = TypedBindings r $ Arg h rel $ TBind r [x] $ Underscore r Nothing
   where r = getRange x
 
 -- | Check that an import directive doesn't contain repeated names
@@ -1163,11 +1384,18 @@
 	Dot r e			-> return $ DotP r e
 	Lit l			-> return $ LitP l
 	HiddenArg r e		-> HiddenP r <$> T.mapM exprToPattern e
+	InstanceArg r e		-> InstanceP r <$> T.mapM exprToPattern e
 	RawApp r es		-> RawAppP r <$> mapM exprToPattern es
-	OpApp r x es		-> OpAppP r x <$> mapM exprToPattern es
+	OpApp r x es		-> OpAppP r x <$> mapM opAppExprToPattern es
 	_			->
           let Just pos = rStart $ getRange e in
           parseErrorAt pos $ "Not a valid pattern: " ++ show e
+
+opAppExprToPattern :: OpApp Expr -> Parser Pattern
+opAppExprToPattern (SyntaxBindingLambda _ _ _) = parseError "syntax binding lambda cannot appear in a pattern"
+opAppExprToPattern (Ordinary e) = exprToPattern e
+
+parsePanic s = parseError $ "Internal parser error: " ++ s ++ ". Please report this as a bug."
 
 {--------------------------------------------------------------------------
     Tests
diff --git a/src/full/Agda/Syntax/Parser/Tokens.hs b/src/full/Agda/Syntax/Parser/Tokens.hs
--- a/src/full/Agda/Syntax/Parser/Tokens.hs
+++ b/src/full/Agda/Syntax/Parser/Tokens.hs
@@ -18,8 +18,9 @@
 	| KwSet | KwProp | KwForall | KwRecord | KwConstructor | KwField
 	| KwHiding | KwUsing | KwRenaming | KwTo | KwPublic
 	| KwOPTIONS | KwBUILTIN | KwLINE
-        | KwCOMPILED_DATA | KwCOMPILED_TYPE | KwCOMPILED | KwCOMPILED_EPIC | KwIMPORT
-        | KwIMPOSSIBLE | KwETA | KwQuoteGoal | KwQuote | KwSyntax
+	| KwCOMPILED_DATA | KwCOMPILED_TYPE | KwCOMPILED | KwCOMPILED_EPIC | KwCOMPILED_JS
+	| KwIMPORT | KwIMPOSSIBLE | KwETA | KwSTATIC
+	| KwQuoteGoal | KwQuote | KwQuoteTerm | KwUnquote | KwSyntax
     deriving (Eq, Show)
 
 layoutKeywords :: [Keyword]
@@ -31,9 +32,10 @@
 	| SymColon | SymArrow | SymEqual | SymLambda
 	| SymUnderscore	| SymQuestionMark   | SymAs
 	| SymOpenParen	      | SymCloseParen
+	| SymDoubleOpenBrace  | SymDoubleCloseBrace
 	| SymOpenBrace	      | SymCloseBrace
 	| SymOpenVirtualBrace | SymCloseVirtualBrace
-	| SymOpenPragma	      | SymClosePragma | SymEllipsis
+	| SymOpenPragma	      | SymClosePragma | SymEllipsis | SymDotDot
     deriving (Eq, Show)
 
 data Token
diff --git a/src/full/Agda/Syntax/Position.hs b/src/full/Agda/Syntax/Position.hs
--- a/src/full/Agda/Syntax/Position.hs
+++ b/src/full/Agda/Syntax/Position.hs
@@ -305,7 +305,9 @@
 fuseIntervals x y = Interval { iStart = head ps, iEnd = last ps }
     where ps = sort [iStart x, iStart y, iEnd x, iEnd y]
 
--- | Finds a range which covers the arguments.
+-- | @fuseRanges r r'@ unions the ranges @r@ and @r'@.
+--
+--   Meaning it finds the least range @r0@ that covers @r@ and @r'@.
 fuseRanges :: Range -> Range -> Range
 fuseRanges (Range is) (Range js) = Range (helper is js)
   where
diff --git a/src/full/Agda/Syntax/Scope/Base.hs b/src/full/Agda/Syntax/Scope/Base.hs
--- a/src/full/Agda/Syntax/Scope/Base.hs
+++ b/src/full/Agda/Syntax/Scope/Base.hs
@@ -1,9 +1,10 @@
-{-# LANGUAGE CPP, DeriveDataTypeable, GADTs, ScopedTypeVariables #-}
+{-# LANGUAGE CPP, DeriveDataTypeable, GADTs, ScopedTypeVariables, TupleSections #-}
 
 {-| This module defines the notion of a scope and operations on scopes.
 -}
 module Agda.Syntax.Scope.Base where
 
+import Control.Arrow ((***), (&&&))
 import Control.Applicative
 import Data.Generics (Typeable, Data)
 import Data.List
@@ -20,6 +21,7 @@
   (ImportDirective(..), UsingOrHiding(..), ImportedName(..), Renaming(..))
 import qualified Agda.Utils.Map as Map
 import Agda.Utils.Tuple
+import Agda.Utils.List
 
 #include "../../undefined.h"
 import Agda.Utils.Impossible
@@ -29,30 +31,27 @@
 -- | A scope is a named collection of names partitioned into public and private
 --   names.
 data Scope = Scope
-      { scopeName     :: A.ModuleName
-      , scopeParents  :: [A.ModuleName]
-      , scopePrivate  :: NameSpace
-      , scopePublic   :: NameSpace
-      , scopeImported :: NameSpace -- ^ public opened names
-      , scopeImports  :: Map C.QName A.ModuleName
+      { scopeName          :: A.ModuleName
+      , scopeParents       :: [A.ModuleName]
+      , scopeNameSpaces    :: [(NameSpaceId, NameSpace)]
+      , scopeImports       :: Map C.QName A.ModuleName
       }
   deriving (Typeable, Data)
 
-data NameSpaceId = PrivateNS | PublicNS | ImportedNS
-  deriving (Typeable, Data, Eq)
+data NameSpaceId = PrivateNS | PublicNS | ImportedNS | OnlyQualifiedNS
+  deriving (Typeable, Data, Eq, Bounded, Enum)
 
 localNameSpace :: Access -> NameSpaceId
 localNameSpace PublicAccess  = PublicNS
 localNameSpace PrivateAccess = PrivateNS
+localNameSpace OnlyQualified = OnlyQualifiedNS
 
-importedNameSpace :: Access -> NameSpaceId
-importedNameSpace PublicAccess  = ImportedNS
-importedNameSpace PrivateAccess = PrivateNS
+nameSpaceAccess :: NameSpaceId -> Access
+nameSpaceAccess PrivateNS = PrivateAccess
+nameSpaceAccess _         = PublicAccess
 
 scopeNameSpace :: NameSpaceId -> Scope -> NameSpace
-scopeNameSpace PublicNS   = scopePublic
-scopeNameSpace PrivateNS  = scopePrivate
-scopeNameSpace ImportedNS = scopeImported
+scopeNameSpace ns s = maybe __IMPOSSIBLE__ id $ lookup ns $ scopeNameSpaces s
 
 -- | The complete information about the scope at a particular program point
 --   includes the scope stack, the local variables, and the context precedence.
@@ -92,6 +91,9 @@
   NameTag   -> nsNames
   ModuleTag -> nsModules
 
+instance KillRange ScopeInfo where
+  killRange m = m
+
 instance InScope AbstractName where
   inScopeTag = NameTag
 
@@ -146,13 +148,11 @@
 blockOfLines hd ss = hd : map ("  "++) ss
 
 instance Show Scope where
-  show (Scope { scopeName = name, scopeParents = parents, scopeImports = imps
-              , scopePublic = pub, scopePrivate = pri, scopeImported = imp }) =
+  show (scope @ Scope { scopeName = name, scopeParents = parents, scopeImports = imps }) =
     unlines $
       [ "* scope " ++ show name ] ++ ind (
-         blockOfLines "public"   (lines $ show pub)
-      ++ blockOfLines "imported" (lines $ show imp)
-      ++ blockOfLines "private"  (lines $ show pri)
+        concat [ blockOfLines (show nsid) (lines $ show $ scopeNameSpace nsid scope)
+               | nsid <- [minBound..maxBound] ]
       ++ blockOfLines "imports"  (case Map.keys imps of
                                     [] -> []
                                     ks -> [ show ks ]
@@ -160,6 +160,13 @@
       )
     where ind = map ("  " ++)
 
+instance Show NameSpaceId where
+  show nsid = case nsid of
+    PublicNS        -> "public"
+    PrivateNS       -> "private"
+    ImportedNS      -> "imported"
+    OnlyQualifiedNS -> "only-qualified"
+
 instance Show NameSpace where
   show (NameSpace names mods) =
     unlines $
@@ -185,7 +192,7 @@
 
 -- * Operations on name and module maps.
 
-mergeNames :: InScope a => ThingsInScope a -> ThingsInScope a -> ThingsInScope a
+mergeNames :: Eq a => ThingsInScope a -> ThingsInScope a -> ThingsInScope a
 mergeNames = Map.unionWith union
 
 -- * Operations on name spaces
@@ -227,12 +234,10 @@
 
 -- | The empty scope.
 emptyScope :: Scope
-emptyScope = Scope { scopeName	   = noModuleName
-                   , scopeParents  = []
-		   , scopePublic   = emptyNameSpace
-		   , scopePrivate  = emptyNameSpace
-                   , scopeImported = emptyNameSpace
-                   , scopeImports  = Map.empty
+emptyScope = Scope { scopeName	     = noModuleName
+                   , scopeParents    = []
+		   , scopeNameSpaces = [ (nsid, emptyNameSpace) | nsid <- [minBound..maxBound] ]
+                   , scopeImports    = Map.empty
 		   }
 
 -- | The empty scope info.
@@ -249,10 +254,7 @@
 	    (NameSpaceId -> ModulesInScope -> ModulesInScope) ->
 	    Scope -> Scope
 mapScope fd fm s =
-  s { scopePrivate  = mapNS PrivateNS  $ scopePrivate  s
-    , scopePublic   = mapNS PublicNS   $ scopePublic   s
-    , scopeImported = mapNS ImportedNS $ scopeImported s
-    }
+  s { scopeNameSpaces = [ (nsid, mapNS nsid ns) | (nsid, ns) <- scopeNameSpaces s ] }
   where
     mapNS acc = mapNameSpace (fd acc) (fm acc)
 
@@ -263,21 +265,19 @@
 mapScope_ fd fm = mapScope (const fd) (const fm)
 
 -- | Map monadic functions over the names and modules in a scope.
-mapScopeM :: Monad m =>
+mapScopeM :: (Functor m, Monad m) =>
   (NameSpaceId -> NamesInScope   -> m NamesInScope  ) ->
   (NameSpaceId -> ModulesInScope -> m ModulesInScope) ->
   Scope -> m Scope
 mapScopeM fd fm s = do
-  pri <- mapNS PrivateNS  $ scopePrivate  s
-  pub <- mapNS PublicNS   $ scopePublic   s
-  imp <- mapNS ImportedNS $ scopeImported s
-  return $ s { scopePrivate = pri, scopePublic = pub, scopeImported = imp }
+  nss <- sequence [ (,) nsid <$> mapNS nsid ns | (nsid, ns) <- scopeNameSpaces s ]
+  return $ s { scopeNameSpaces = nss }
   where
     mapNS acc = mapNameSpaceM (fd acc) (fm acc)
 
 -- | Same as 'mapScopeM' but applies the same function to both the public and
 --   private name spaces.
-mapScopeM_ :: Monad m =>
+mapScopeM_ :: (Functor m, Monad m) =>
   (NamesInScope   -> m NamesInScope  ) ->
   (ModulesInScope -> m ModulesInScope) ->
   Scope -> m Scope
@@ -289,12 +289,15 @@
 	    (NameSpaceId -> ModulesInScope -> ModulesInScope -> ModulesInScope) ->
 	    Scope -> Scope -> Scope
 zipScope fd fm s1 s2 =
-  s1 { scopePrivate  = zipNS PrivateNS  (scopePrivate  s1) (scopePrivate  s2)
-     , scopePublic   = zipNS PublicNS   (scopePublic   s1) (scopePublic   s2)
-     , scopeImported = zipNS ImportedNS (scopeImported s1) (scopeImported s2)
+  s1 { scopeNameSpaces = [ (nsid, zipNS nsid ns1 ns2)
+                         | ((nsid, ns1), (nsid', ns2)) <- zipWith' (,) (scopeNameSpaces s1) (scopeNameSpaces s2)
+                         , assert (nsid == nsid')
+                         ]
      , scopeImports  = Map.union (scopeImports s1) (scopeImports s2)
      }
   where
+    assert True  = True
+    assert False = __IMPOSSIBLE__
     zipNS acc = zipNameSpace (fd acc) (fm acc)
 
 -- | Same as 'zipScope' but applies the same function to both the public and
@@ -311,20 +314,25 @@
 
 -- | Return all names in a scope.
 allNamesInScope :: InScope a => Scope -> ThingsInScope a
-allNamesInScope = namesInScope [scopePublic, scopeImported, scopePrivate]
+allNamesInScope = namesInScope [minBound..maxBound]
 
+allNamesInScope' :: InScope a => Scope -> ThingsInScope (a, Access)
+allNamesInScope' s =
+  foldr1 mergeNames [ map (, nameSpaceAccess ns) <$> namesInScope [ns] s
+                    | ns <- [minBound..maxBound] ]
+
 -- | Returns the scope's non-private names.
 exportedNamesInScope :: InScope a => Scope -> ThingsInScope a
-exportedNamesInScope = namesInScope [scopePublic, scopeImported]
+exportedNamesInScope = namesInScope [PublicNS, ImportedNS, OnlyQualifiedNS]
 
-namesInScope :: InScope a => [Scope -> NameSpace] -> Scope -> ThingsInScope a
-namesInScope fs s =
-  foldr1 mergeNames [ inNameSpace (f s) | f <- fs ]
+namesInScope :: InScope a => [NameSpaceId] -> Scope -> ThingsInScope a
+namesInScope ids s =
+  foldr1 mergeNames [ inNameSpace (scopeNameSpace nsid s) | nsid <- ids ]
 
 allThingsInScope :: Scope -> NameSpace
-allThingsInScope = thingsInScope [scopePublic, scopeImported, scopePrivate]
+allThingsInScope = thingsInScope [minBound..maxBound]
 
-thingsInScope :: [Scope -> NameSpace] -> Scope -> NameSpace
+thingsInScope :: [NameSpaceId] -> Scope -> NameSpace
 thingsInScope fs s =
   NameSpace { nsNames   = namesInScope fs s
             , nsModules = namesInScope fs s
@@ -345,15 +353,13 @@
 -- | Move all names in a scope to the given name space (except never move from
 --   Imported to Public).
 setScopeAccess :: NameSpaceId -> Scope -> Scope
-setScopeAccess a s = s { scopeImported = ns ImportedNS
-		       , scopePrivate  = ns PrivateNS
-                       , scopePublic   = ns PublicNS
+setScopeAccess a s = s { scopeNameSpaces = [ (nsid, ns nsid) | (nsid, _) <- scopeNameSpaces s ]
 		       }
   where
     zero  = emptyNameSpace
     one   = allThingsInScope s
-    imp   = thingsInScope [scopeImported] s
-    noimp = thingsInScope [scopePublic, scopePrivate] s
+    imp   = thingsInScope [ImportedNS] s
+    noimp = thingsInScope [PublicNS, PrivateNS, OnlyQualifiedNS] s
 
     ns b = case (a, b) of
       (PublicNS, PublicNS)   -> noimp
@@ -361,12 +367,17 @@
       _ | a == b             -> one
         | otherwise          -> zero
 
+setNameSpace :: NameSpaceId -> NameSpace -> Scope -> Scope
+setNameSpace nsid ns s =
+  s { scopeNameSpaces = [ (nsid', if nsid == nsid' then ns else ns')
+                        | (nsid', ns') <- scopeNameSpaces s ] }
+
 -- | Add names to a scope.
 addNamesToScope :: NameSpaceId -> C.Name -> [AbstractName] -> Scope -> Scope
 addNamesToScope acc x ys s = mergeScope s s1
   where
-    s1 = setScopeAccess acc $ emptyScope
-	 { scopePublic = emptyNameSpace { nsNames = Map.singleton x ys } }
+    s1 = setScopeAccess acc $ setNameSpace PublicNS ns emptyScope
+    ns = emptyNameSpace { nsNames = Map.singleton x ys }
 
 -- | Add a name to a scope.
 addNameToScope :: NameSpaceId -> C.Name -> AbstractName -> Scope -> Scope
@@ -376,8 +387,8 @@
 addModuleToScope :: NameSpaceId -> C.Name -> AbstractModule -> Scope -> Scope
 addModuleToScope acc x m s = mergeScope s s1
   where
-    s1 = setScopeAccess acc $ emptyScope
-	 { scopePublic = emptyNameSpace { nsModules = Map.singleton x [m] } }
+    s1 = setScopeAccess acc $ setNameSpace PublicNS ns emptyScope
+    ns = emptyNameSpace { nsModules = Map.singleton x [m] }
 
 -- | Apply an 'ImportDirective' to a scope.
 applyImportDirective :: ImportDirective -> Scope -> Scope
@@ -431,8 +442,12 @@
 
 -- | Restrict the private name space of a scope
 restrictPrivate :: Scope -> Scope
-restrictPrivate s = s { scopePrivate = emptyNameSpace, scopeImports = Map.empty }
+restrictPrivate s = setNameSpace PrivateNS emptyNameSpace $ s { scopeImports = Map.empty }
 
+-- | Remove names that can only be used qualified (when opening a scope)
+removeOnlyQualified :: Scope -> Scope
+removeOnlyQualified s = setNameSpace OnlyQualifiedNS emptyNameSpace s
+
 -- | Get the public parts of the public modules of a scope
 publicModules :: ScopeInfo -> Map A.ModuleName Scope
 publicModules scope = Map.filterWithKey (\m _ -> reachable m) allMods
@@ -460,8 +475,11 @@
     current = this : parents
 
 -- | Look up a name in the scope
-scopeLookup :: forall a. InScope a => C.QName -> ScopeInfo -> [a]
-scopeLookup q scope = nub $ findName q root ++ imports
+scopeLookup :: InScope a => C.QName -> ScopeInfo -> [a]
+scopeLookup q scope = map fst $ scopeLookup' q scope
+
+scopeLookup' :: forall a. InScope a => C.QName -> ScopeInfo -> [(a, Access)]
+scopeLookup' q scope = nubBy ((==) `on` fst) $ findName q root ++ imports
   where
     this    :: A.ModuleName
     this    = scopeCurrent scope
@@ -480,30 +498,29 @@
       (m, r) <- splitName q
       return (C.Qual x m, r)
 
-    imported :: C.QName -> [A.ModuleName]
-    imported q = maybe [] (:[]) $ Map.lookup q $ scopeImports root
+    imported :: C.QName -> [(A.ModuleName, Access)]
+    imported q = maybe [] ((:[]) . (, PublicAccess)) $ Map.lookup q $ scopeImports root
 
-    topImports :: [a]
+    topImports :: [(a, Access)]
     topImports = case tag of
       NameTag   -> []
-      ModuleTag -> map AbsModule (imported q)
+      ModuleTag -> map (AbsModule *** id) (imported q)
 
-    imports :: [a]
+    imports :: [(a, Access)]
     imports = topImports ++ do
       (m, x) <- splitName q
-      m <- imported m
-      x <- findName x (restrictPrivate $ moduleScope m)
-      return x
+      m <- fst <$> imported m
+      findName x (restrictPrivate $ moduleScope m)
 
     moduleScope :: A.ModuleName -> Scope
     moduleScope name = case Map.lookup name (scopeModules scope) of
       Nothing -> __IMPOSSIBLE__
       Just s  -> s
 
-    lookupName :: forall a. InScope a => C.Name -> Scope -> [a]
-    lookupName x s = maybe [] id $ Map.lookup x (allNamesInScope s)
+    lookupName :: forall a. InScope a => C.Name -> Scope -> [(a, Access)]
+    lookupName x s = maybe [] id $ Map.lookup x (allNamesInScope' s)
 
-    findName :: forall a. InScope a => C.QName -> Scope -> [a]
+    findName :: forall a. InScope a => C.QName -> Scope -> [(a, Access)]
     findName (C.QName x)  s = lookupName x s
     findName (C.Qual x q) s = do
         m <- nub $ mods ++ defs -- record types will appear bot as a mod and a def
@@ -511,9 +528,9 @@
         findName q (restrictPrivate s')
       where
         mods, defs :: [ModuleName]
-        mods = amodName <$> lookupName x s
+        mods = amodName . fst <$> lookupName x s
         -- Qualified constructors are qualified by their datatype rather than a module
-        defs = mnameFromList . qnameToList . anameName <$> lookupName x s
+        defs = mnameFromList . qnameToList . anameName . fst <$> lookupName x s
 
 -- * Inverse look-up
 
diff --git a/src/full/Agda/Syntax/Scope/Monad.hs b/src/full/Agda/Syntax/Scope/Monad.hs
--- a/src/full/Agda/Syntax/Scope/Monad.hs
+++ b/src/full/Agda/Syntax/Scope/Monad.hs
@@ -128,15 +128,11 @@
 modifyCurrentNameSpace :: NameSpaceId -> (NameSpace -> NameSpace) -> ScopeM ()
 modifyCurrentNameSpace acc f = modifyCurrentScope action
   where
-    action s = s { scopePublic   = pub $ scopePublic  s
-                 , scopePrivate  = pri $ scopePrivate s
-                 , scopeImported = imp $ scopeImported s
-                 }
-    (pub, pri, imp) = case acc of
-      PublicNS   -> (f, id, id)
-      PrivateNS  -> (id, f, id)
-      ImportedNS -> (id, id, f)
+    action s = s { scopeNameSpaces = [ (nsid, f' nsid ns) | (nsid, ns) <- scopeNameSpaces s ] }
 
+    f' a | a == acc  = f
+         | otherwise = id
+
 setContextPrecedence :: Precedence -> ScopeM ()
 setContextPrecedence p = modifyScopeInfo $ \s -> s { scopePrecedence = p }
 
@@ -187,7 +183,7 @@
 -- * Resolving names
 
 data ResolvedName = VarName A.Name
-                  | DefinedName AbstractName
+                  | DefinedName Access AbstractName
                   | ConstructorName [AbstractName]
                   | UnknownName
   deriving (Show)
@@ -199,13 +195,13 @@
   let vars = map (C.QName -*- id) $ scopeLocals scope
   case lookup x vars of
     Just y  -> return $ VarName $ y { nameConcrete = unqualify x }
-    Nothing -> case scopeLookup x scope of
+    Nothing -> case scopeLookup' x scope of
       [] -> return UnknownName
-      ds | all ((==ConName) . anameKind) ds ->
+      ds | all ((==ConName) . anameKind . fst) ds ->
         return $ ConstructorName
-               $ map (\d -> updateConcreteName d $ unqualify x) ds
-      [d] -> return $ DefinedName $ updateConcreteName d (unqualify x)
-      ds  -> typeError $ AmbiguousName x (map anameName ds)
+               $ map (\ (d, _) -> updateConcreteName d $ unqualify x) ds
+      [(d, a)] -> return $ DefinedName a $ updateConcreteName d (unqualify x)
+      ds  -> typeError $ AmbiguousName x (map (anameName . fst) ds)
   where
   updateConcreteName :: AbstractName -> C.Name -> AbstractName
   updateConcreteName d@(AbsName { anameName = an@(A.QName { qnameName = qn }) }) x =
@@ -226,7 +222,7 @@
   r <- resolveName x
   case r of
     VarName y          -> return $ nameFixity y
-    DefinedName d      -> return $ nameFixity $ qnameName $ anameName d
+    DefinedName _ d    -> return $ nameFixity $ qnameName $ anameName d
     ConstructorName ds
       | null fs        -> __IMPOSSIBLE__
       | allEqual fs    -> return $ head fs
@@ -248,7 +244,7 @@
 bindName acc kind x y = do
   r  <- resolveName (C.QName x)
   ys <- case r of
-    DefinedName d      -> typeError $ ClashingDefinition (C.QName x) $ anameName d
+    DefinedName _ d    -> typeError $ ClashingDefinition (C.QName x) $ anameName d
     VarName z          -> typeError $ ClashingDefinition (C.QName x) $ A.qualify (mnameFromList []) z
     ConstructorName [] -> __IMPOSSIBLE__
     ConstructorName ds
@@ -301,14 +297,16 @@
     old  = scopeName s
 
     copyM :: NameSpaceId -> ModulesInScope -> WSM ModulesInScope
-    copyM ImportedNS ms = return ms
-    copyM PrivateNS  _  = return Map.empty
-    copyM PublicNS   ms = traverse (mapM $ onMod renMod) ms
+    copyM ImportedNS      ms = return ms
+    copyM PrivateNS       _  = return Map.empty
+    copyM PublicNS        ms = traverse (mapM $ onMod renMod) ms
+    copyM OnlyQualifiedNS ms = traverse (mapM $ onMod renMod) ms
 
     copyD :: NameSpaceId -> NamesInScope -> WSM NamesInScope
-    copyD ImportedNS ds = return ds
-    copyD PrivateNS  _  = return Map.empty
-    copyD PublicNS   ds = traverse (mapM $ onName renName) ds
+    copyD ImportedNS      ds = return ds
+    copyD PrivateNS       _  = return Map.empty
+    copyD PublicNS        ds = traverse (mapM $ onName renName) ds
+    copyD OnlyQualifiedNS ds = traverse (mapM $ onName renName) ds
 
     onMod f m = do
       x <- f $ amodName m
@@ -404,7 +402,7 @@
   m <- amodName <$> resolveModule cm
   let ns = namespace current m
   s <- setScopeAccess ns <$>
-        (applyImportDirectiveM cm dir . restrictPrivate =<< getNamedScope m)
+        (applyImportDirectiveM cm dir . removeOnlyQualified . restrictPrivate =<< getNamedScope m)
   checkForClashes (scopeNameSpace ns s)
   modifyCurrentScope (`mergeScope` s)
   where
diff --git a/src/full/Agda/Syntax/Strict.hs b/src/full/Agda/Syntax/Strict.hs
--- a/src/full/Agda/Syntax/Strict.hs
+++ b/src/full/Agda/Syntax/Strict.hs
@@ -19,16 +19,16 @@
 
 instance Strict Term where
     force t = case t of
-	Var _ ts   -> force ts
-	Def _ ts   -> force ts
-	Con _ ts   -> force ts
-	Lam _ t    -> force t
-	Lit _	   -> 0
-	Pi a b	   -> force (a,b)
-	Fun a b    -> force (a,b)
-	Sort s	   -> force s
-	MetaV _ ts -> force ts
-        DontCare   -> 0
+	Var _ ts    -> force ts
+	Def _ ts    -> force ts
+	Con _ ts    -> force ts
+	Lam _ t     -> force t
+	Lit _	    -> 0
+        Level l     -> force l
+	Pi a b	    -> force (a,b)
+	Sort s	    -> force s
+	MetaV _ ts  -> force ts
+        DontCare mt -> force mt
 
 instance Strict Type where
     force (El s t) = force (s,t)
@@ -37,16 +37,26 @@
     force s = case s of
 	Type n     -> force n
 	Prop       -> 0
-	Lub s1 s2  -> force (s1,s2)
-	Suc s      -> force s
-	MetaS _ as -> force as
         Inf        -> 0
         DLub s1 s2 -> force (s1, s2)
 
+instance Strict Level where
+  force (Max as) = force as
+
+instance Strict PlusLevel where
+  force ClosedLevel{} = 0
+  force (Plus _ l) = force l
+
+instance Strict LevelAtom where
+  force l = case l of
+    MetaLevel _ vs   -> force vs
+    NeutralLevel v   -> force v
+    BlockedLevel _ v -> force v
+    UnreducedLevel v -> force v
+
 instance Strict ClauseBody where
     force (Body t)   = force t
     force (Bind b)   = force b
-    force (NoBind b) = force b
     force  NoBody    = 0
 
 instance Strict C.Expr where
@@ -70,8 +80,11 @@
 instance Strict a => Strict [a] where
     force = sum . map force
 
+instance Strict a => Strict (Maybe a) where
+    force = maybe 0 force
+
 instance Strict a => Strict (Abs a) where
-    force = force . absBody
+    force = force . unAbs
 
 instance Strict Token where
   -- TODO: This is just a dummy instance. Why can't we just use the
diff --git a/src/full/Agda/Syntax/Translation/AbstractToConcrete.hs b/src/full/Agda/Syntax/Translation/AbstractToConcrete.hs
--- a/src/full/Agda/Syntax/Translation/AbstractToConcrete.hs
+++ b/src/full/Agda/Syntax/Translation/AbstractToConcrete.hs
@@ -1,6 +1,5 @@
 {-# LANGUAGE CPP, PatternGuards, MultiParamTypeClasses, FunctionalDependencies,
-             TypeSynonymInstances, FlexibleInstances, UndecidableInstances,
-             OverlappingInstances
+             TypeSynonymInstances, FlexibleInstances, UndecidableInstances
   #-}
 
 {-| The translation of abstract syntax to concrete syntax has two purposes.
@@ -19,7 +18,8 @@
     , withScope
     , makeEnv
     , abstractToConcrete
-    , AbsToCon, TypeAndDef, DontTouchMe, Env
+    , AbsToCon, DontTouchMe, Env
+    , noTakenNames
     ) where
 
 import Control.Applicative
@@ -43,7 +43,7 @@
 import Agda.Syntax.Scope.Base
 
 import Agda.TypeChecking.Monad.State (getScope)
-import Agda.TypeChecking.Monad.Base  (MonadTCM)
+import Agda.TypeChecking.Monad.Base  (TCM)
 
 import Agda.Utils.Maybe
 import Agda.Utils.Monad hiding (bracket)
@@ -84,12 +84,15 @@
 withScope :: ScopeInfo -> AbsToCon a -> AbsToCon a
 withScope scope = local $ \e -> e { currentScope = scope }
 
+noTakenNames :: AbsToCon a -> AbsToCon a
+noTakenNames = local $ \e -> e { takenNames = Set.empty }
+
 -- The Monad --------------------------------------------------------------
 
 -- | We make the translation monadic for modularity purposes.
 type AbsToCon = Reader Env
 
-runAbsToCon :: MonadTCM tcm => AbsToCon a -> tcm a
+runAbsToCon :: AbsToCon a -> TCM a
 runAbsToCon m = do
   scope <- getScope
   return $ runReader m (makeEnv scope)
@@ -97,7 +100,7 @@
 abstractToConcrete :: ToConcrete a c => Env -> a -> c
 abstractToConcrete flags a = runReader (toConcrete a) flags
 
-abstractToConcreteCtx :: (MonadTCM tcm, ToConcrete a c) => Precedence -> a -> tcm c
+abstractToConcreteCtx :: ToConcrete a c => Precedence -> a -> TCM c
 abstractToConcreteCtx ctx x = do
   scope <- getScope
   let scope' = scope { scopePrecedence = ctx }
@@ -105,7 +108,7 @@
   where
     scope = (currentScope defaultEnv) { scopePrecedence = ctx }
 
-abstractToConcrete_ :: (MonadTCM tcm, ToConcrete a c) => a -> tcm c
+abstractToConcrete_ :: ToConcrete a c => a -> TCM c
 abstractToConcrete_ x = do
   scope <- getScope
   return $ abstractToConcrete (makeEnv scope) x
@@ -136,7 +139,9 @@
     do  scope <- asks currentScope
         case inverseScopeLookupName x scope of
             Just y  -> return y
-            Nothing -> return $ C.Qual (C.Name noRange [Id ""]) $ qnameToConcrete x
+            Nothing
+              | show (qnameToConcrete x) == "_" -> return $ qnameToConcrete x
+              | otherwise -> return $ C.Qual (C.Name noRange [Id ""]) $ qnameToConcrete x
                 -- this is what happens for names that are not in scope (private names)
 
 lookupModule :: A.ModuleName -> AbsToCon C.QName
@@ -166,7 +171,9 @@
 
 -- | General bracketing function.
 bracket' ::    (e -> e)             -- ^ the bracketing function
-            -> (Precedence -> Bool) -- ^ do we need brackets
+            -> (Precedence -> Bool) -- ^ Should we bracket things
+                                    --   which have the given
+                                    --   precedence?
             -> e -> AbsToCon e
 bracket' paren needParen e =
     do  p <- currentPrecedence
@@ -263,6 +270,7 @@
 
 instance ToConcrete a c => ToConcrete (Arg a) (Arg c) where
     toConcrete (Arg h@Hidden    r x) = Arg h r <$> toConcreteCtx TopCtx x
+    toConcrete (Arg h@Instance  r x) = Arg h r <$> toConcreteCtx TopCtx x
     toConcrete (Arg h@NotHidden r x) = Arg h r <$> toConcrete x
 
     bindToConcrete (Arg h r x) ret = bindToConcreteCtx (hiddenArgumentCtx h) x $ ret . Arg h r
@@ -327,14 +335,14 @@
         bracket lamBrackets
         $ case lamView e of
             (bs, e) ->
-                bindToConcrete bs $ \bs -> do
+                bindToConcrete (map makeDomainFree bs) $ \bs -> do
                     e  <- toConcreteCtx TopCtx e
                     return $ C.Lam (getRange i) bs e
         where
-            lamView (A.Lam _ b@(A.DomainFree _ _) e) =
+            lamView (A.Lam _ b@(A.DomainFree _ _ _) e) =
                 case lamView e of
                     ([], e)                        -> ([b], e)
-                    (bs@(A.DomainFree _ _ : _), e) -> (b:bs, e)
+                    (bs@(A.DomainFree _ _ _ : _), e) -> (b:bs, e)
                     _                              -> ([b], e)
             lamView (A.Lam _ b@(A.DomainFull _) e) =
                 case lamView e of
@@ -342,7 +350,14 @@
                     (bs@(A.DomainFull _ : _), e)   -> (b:bs, e)
                     _                              -> ([b], e)
             lamView e = ([], e)
-
+    toConcrete (A.ExtendedLam i di qname cs) = do
+          decls <- toConcrete cs
+          let removeApp (C.RawAppP r (lam:es)) = C.RawAppP r es
+              removeApp (C.AppP p np) = namedThing $ unArg np
+              removeApp _ = __IMPOSSIBLE__
+          let decl2clause (C.FunClause lhs rhs wh) = (lhs {lhsOriginalPattern = removeApp $ lhsOriginalPattern lhs},rhs,wh)
+              decl2clause _ = __IMPOSSIBLE__
+          return $ C.ExtendedLam (getRange i) (map decl2clause $ concat decls)
     toConcrete (A.Pi _ [] e) = toConcrete e
     toConcrete t@(A.Pi i _ _)  = case piTel t of
       (tel, e) ->
@@ -356,12 +371,14 @@
 
     toConcrete (A.Fun i a b) =
         bracket piBrackets
-        $ do a' <- toConcreteCtx FunctionSpaceDomainCtx a
+        $ do a' <- toConcreteCtx (if irr then DotPatternCtx else FunctionSpaceDomainCtx) a
              b' <- toConcreteCtx TopCtx b
              return $ C.Fun (getRange i) (addDot a' $ mkArg a') b'
         where
-            addDot a e = if (argRelevance a == Irrelevant) then Dot (getRange a) e else e
+            irr        = argRelevance a == Irrelevant
+            addDot a e = if irr then Dot (getRange a) e else e
             mkArg (Arg Hidden    r e) = HiddenArg (getRange e) (unnamed e)
+            mkArg (Arg Instance  r e) = InstanceArg (getRange e) (unnamed e)
             mkArg (Arg NotHidden r e) = e
 
     toConcrete (A.Set i 0)  = return $ C.Set (getRange i)
@@ -380,6 +397,13 @@
         es <- toConcreteCtx TopCtx es
         return $ C.Rec (getRange i) $ zip xs es
 
+    toConcrete (A.RecUpdate i e fs) =
+      bracket appBrackets $ do
+        let (xs, es) = unzip fs
+        e <- toConcrete e
+        es <- toConcreteCtx TopCtx es
+        return $ C.RecUpdate (getRange i) e $ zip xs es
+
     toConcrete (A.ETel tel) = do
       tel <- toConcrete tel
       return $ C.ETel tel
@@ -392,14 +416,31 @@
             e' <- toConcrete e
             return $ C.QuoteGoal (getRange i) x' e'
     toConcrete (A.Quote i) = return $ C.Quote (getRange i)
+    toConcrete (A.QuoteTerm i) = return $ C.QuoteTerm (getRange i)
+    toConcrete (A.Unquote i) = return $ C.Unquote (getRange i)
 
+    -- Andreas, 2010-10-05 print irrelevant things as ordinary things
+    toConcrete (A.DontCare e) = toConcrete e
+--    toConcrete (A.DontCare e) = C.DontCare <$> toConcreteCtx TopCtx e
+{-
     -- Andreas, 2010-09-21 abuse C.Underscore to print irrelevant things
     toConcrete (A.DontCare) = return $ C.Underscore noRange Nothing
+-}
 
+makeDomainFree :: A.LamBinding -> A.LamBinding
+makeDomainFree b@(A.DomainFull (A.TypedBindings r (Arg h rel (A.TBind _ [x] t)))) =
+  case unScope t of
+    A.Underscore MetaInfo{metaNumber = Nothing} -> A.DomainFree h rel x
+    _ -> b
+  where
+    unScope (A.ScopedExpr _ e) = unScope e
+    unScope e = e
+makeDomainFree b = b
+
 -- Binder instances -------------------------------------------------------
 
 instance ToConcrete A.LamBinding C.LamBinding where
-    bindToConcrete (A.DomainFree h x) ret = bindToConcrete x $ ret . C.DomainFree h . mkBoundName_
+    bindToConcrete (A.DomainFree h rel x) ret = bindToConcrete x $ ret . C.DomainFree h rel . mkBoundName_
     bindToConcrete (A.DomainFull b)   ret = bindToConcrete b $ ret . C.DomainFull
 
 instance ToConcrete A.TypedBindings C.TypedBindings where
@@ -424,18 +465,15 @@
                 , C.FunClause (C.LHS (C.IdentP $ C.QName x) [] [] [])
                               e C.NoWhere
                 ]
-    bindToConcrete (LetApply i x tel y es _ _) ret = do
+    bindToConcrete (LetApply i x modapp _ _) ret = do
       x' <- unqualify <$> toConcrete x
-      y' <- toConcrete y
-      bindToConcrete tel $ \tel -> do
-      es' <- toConcrete es
-      let r = fuseRange y' es'
+      modapp <- toConcrete modapp
+      let r = getRange modapp
           open = maybe DontOpen id $ minfoOpenShort i
           dir  = maybe (ImportDirective r (Hiding []) [] False) id $ minfoDirective i
       -- This is no use since toAbstract LetDefs is in localToAbstract.
       local (openModule' x dir id) $
-        ret [ C.ModuleMacro (getRange i) x' tel
-                  (foldl (C.App r) (C.Ident y') es') open dir ]
+        ret [ C.ModuleMacro (getRange i) x' modapp open dir ]
     bindToConcrete (LetOpen i x) ret = do
       x' <- toConcrete x
       let dir = maybe defaultImportDir id $ minfoDirective i
@@ -447,12 +485,21 @@
 instance ToConcrete AsWhereDecls WhereClause where
   bindToConcrete (AsWhereDecls []) ret = ret C.NoWhere
   bindToConcrete (AsWhereDecls ds@[Section _ am _ _]) ret = do
-    ds' <- toConcrete ds
+    ds' <- declsToConcrete ds
     cm  <- unqualify <$> lookupModule am
     let wh' = (if isNoName cm then AnyWhere else SomeWhere cm) $ ds'
     local (openModule' am defaultImportDir id) $ ret wh'
-  bindToConcrete (AsWhereDecls ds) ret = ret . AnyWhere =<< toConcrete ds
+  bindToConcrete (AsWhereDecls ds) ret =
+    ret . AnyWhere =<< declsToConcrete ds
 
+mergeSigAndDef :: [C.Declaration] -> [C.Declaration]
+mergeSigAndDef (C.RecordSig _ x bs e : C.Record r y c _ Nothing fs : ds)
+  | x == y = C.Record r y c bs (Just e) fs : mergeSigAndDef ds
+mergeSigAndDef (C.DataSig _ _ x bs e : C.Data r i y _ Nothing cs : ds)
+  | x == y = C.Data r i y bs (Just e) cs : mergeSigAndDef ds
+mergeSigAndDef (d : ds) = d : mergeSigAndDef ds
+mergeSigAndDef [] = []
+
 openModule' :: A.ModuleName -> ImportDirective -> (Scope -> Scope) -> Env -> Env
 openModule' x dir restrict env = env{currentScope = sInfo{scopeModules = mods'}}
   where sInfo = currentScope env
@@ -467,8 +514,8 @@
 
 -- Declaration instances --------------------------------------------------
 
-instance ToConcrete [A.Declaration] [C.Declaration] where
-    toConcrete ds = concat <$> mapM toConcrete ds
+declsToConcrete :: [A.Declaration] -> AbsToCon [C.Declaration]
+declsToConcrete ds = mergeSigAndDef . concat <$> toConcrete ds
 
 instance ToConcrete A.RHS (C.RHS, [C.Expr], [C.Expr], [C.Declaration]) where
     toConcrete (A.RHS e) = do
@@ -477,64 +524,32 @@
     toConcrete A.AbsurdRHS = return (C.AbsurdRHS, [], [], [])
     toConcrete (A.WithRHS _ es cs) = do
       es <- toConcrete es
-      cs <- toConcrete cs
-      return (C.AbsurdRHS, [], es, concat cs)
+      cs <- concat <$> toConcrete cs
+      return (C.AbsurdRHS, [], es, cs)
     toConcrete (A.RewriteRHS _ eqs rhs wh) = do
-      wh <- toConcrete wh
+      wh <- declsToConcrete wh
       (rhs, eqs', es, whs) <- toConcrete rhs
       unless (null eqs')
         __IMPOSSIBLE__
       eqs <- toConcrete eqs
       return (rhs, eqs, es, wh ++ whs)
 
-data TypeAndDef = TypeAndDef A.TypeSignature A.Definition
-
-instance ToConcrete TypeAndDef [C.Declaration] where
-  -- We don't do withInfixDecl here. It's done at the declaration level.
-
-  toConcrete (TypeAndDef (ScopedDecl scope [d]) def) =
-    withScope scope $ toConcrete (TypeAndDef d def)
-
-  toConcrete (TypeAndDef d (ScopedDef scope def)) =
-    withScope scope $ toConcrete (TypeAndDef d def)
-
-  toConcrete (TypeAndDef (Axiom _ rel x t) (FunDef i _ cs)) =
-    withAbstractPrivate i $ do
-    t'  <- toConcreteCtx TopCtx t
-    cs' <- toConcrete cs
-    x'  <- unsafeQNameToName <$> toConcrete x
-    return $ TypeSig rel x' t' : concat cs'
-
-  toConcrete (TypeAndDef (Axiom _ _ x t) (DataDef i _ bs cs)) =
-    withAbstractPrivate i $
-    bindToConcrete tel $ \tel' -> do
-      t'       <- toConcreteCtx TopCtx t0
-      (x',cs') <- (unsafeQNameToName -*- id) <$> toConcrete (x, map Constr cs)
-      return [ C.Data (getRange i) Inductive x' tel' t' cs' ]
-    where
-      (tel, t0) = mkTel (length bs) t
-      mkTel n (ScopedExpr _ t) = mkTel n t
-      mkTel 0 t            = ([], t)
-      mkTel n (A.Pi _ b t) = (b++) -*- id $ mkTel (n - 1) t
-      mkTel _ _            = __IMPOSSIBLE__
---      mkTel n t            = error $ "mkTel " ++ show n ++ " " ++ show t
+instance ToConcrete (Maybe A.QName) (Maybe C.Name) where
+  toConcrete Nothing = return Nothing
+  toConcrete (Just x) = do
+    x' <- toConcrete (qnameName x)
+    return $ Just x'
 
-  toConcrete (TypeAndDef (Axiom _ _ x t) (RecDef  i _ c bs _ cs)) =
-    withAbstractPrivate i $
-    bindToConcrete tel $ \tel' -> do
-      t'       <- toConcreteCtx TopCtx t0
-      (x',cs') <- (unsafeQNameToName -*- id) <$> toConcrete (x, map Constr cs)
-      c'       <- Trav.mapM (\d -> unsafeQNameToName <$>
-                                     toConcrete (axiomName d)) c
-      return [ C.Record (getRange i) x' c' tel' t' cs' ]
-    where
-      (tel, t0) = mkTel (length bs) t
-      mkTel n (A.ScopedExpr _ t) = mkTel n t
-      mkTel 0 t                  = ([], t)
-      mkTel n (A.Pi _ b t)       = (b++) -*- id $ mkTel (n - 1) t
-      mkTel _ _                  = __IMPOSSIBLE__
+-- | Helper function used in instance @ToConcrete Definition@.
+telToTypedBindingss :: [C.LamBinding] -> [C.TypedBindings]
+telToTypedBindingss = map lamBindingToTypedBindings where
 
-  toConcrete _ = __IMPOSSIBLE__
+  lamBindingToTypedBindings :: C.LamBinding -> C.TypedBindings
+  lamBindingToTypedBindings b =
+    case b of
+      C.DomainFull t     -> t
+      C.DomainFree h r n -> C.TypedBindings noRange $
+        Arg h r $ C.TBind noRange [n] $ C.Underscore noRange Nothing
 
 instance ToConcrete (Constr A.Constructor) C.Declaration where
   toConcrete (Constr (A.ScopedDecl scope [d])) =
@@ -558,9 +573,20 @@
           -- no code for it, but GHC 7's completeness checker spotted
           -- that the case was not covered.
 
+instance ToConcrete A.ModuleApplication C.ModuleApplication where
+  toConcrete (A.SectionApp tel y es) = do
+    y  <- toConcrete y
+    bindToConcrete tel $ \tel -> do
+    es <- toConcrete es
+    let r = fuseRange y es
+    return $ C.SectionApp r tel (foldl (C.App r) (C.Ident y) es)
+  toConcrete (A.RecordModuleIFS rec) = do
+    rec <- toConcrete rec
+    return $ C.RecordModuleIFS (getRange rec) rec
+
 instance ToConcrete A.Declaration [C.Declaration] where
   toConcrete (ScopedDecl scope ds) =
-    withScope scope $ toConcrete ds
+    withScope scope (declsToConcrete ds)
 
   toConcrete (Axiom i rel x t) = do
     x' <- unsafeQNameToName <$> toConcrete x
@@ -584,39 +610,50 @@
       return [C.Primitive (getRange i) [C.TypeSig Relevant x' t']]
         -- Primitives are always relevant.
 
-  toConcrete (Definition i ts ds) = do
-      ixs' <- map (id -*- unsafeQNameToName) <$> toConcrete (map (DontTouchMe -*- id) ixs)
-      withInfixDecls ixs' $ do
-        ds' <- concat <$> toConcrete (zipWith TypeAndDef ts ds)
-        return [mutual (getRange i) ds']
-      where
-          ixs = map getInfoAndName ts
-          is  = map fst ixs
-          getInfoAndName (A.Axiom i _ x _)        = (i,x)
-          getInfoAndName (A.ScopedDecl scope [d]) = getInfoAndName d
-          getInfoAndName _                        = __IMPOSSIBLE__
+  toConcrete (A.FunDef i _ cs) =
+    withAbstractPrivate i $ concat <$> toConcrete cs
 
-          mutual r [d] = d
-          mutual r ds  = C.Mutual r ds
+  toConcrete (A.DataSig i x bs t) =
+    withAbstractPrivate i $
+    bindToConcrete bs $ \tel' -> do
+      x' <- unsafeQNameToName <$> toConcrete x
+      t' <- toConcreteCtx TopCtx t
+      return [ C.DataSig (getRange i) Inductive x' (map C.DomainFull tel') t' ]
 
+  toConcrete (A.DataDef i x bs cs) =
+    withAbstractPrivate i $
+    bindToConcrete (map makeDomainFree bs) $ \tel' -> do
+      (x',cs') <- (unsafeQNameToName -*- id) <$> toConcrete (x, map Constr cs)
+      return [ C.Data (getRange i) Inductive x' tel' Nothing cs' ]
+
+  toConcrete (A.RecSig i x bs t) =
+    withAbstractPrivate i $
+    bindToConcrete bs $ \tel' -> do
+      x' <- unsafeQNameToName <$> toConcrete x
+      t' <- toConcreteCtx TopCtx t
+      return [ C.RecordSig (getRange i) x' (map C.DomainFull tel') t' ]
+
+  toConcrete (A.RecDef  i x c bs t cs) =
+    withAbstractPrivate i $
+    bindToConcrete (map makeDomainFree bs) $ \tel' -> do
+      (x',cs') <- (unsafeQNameToName -*- id) <$> toConcrete (x, map Constr cs)
+      return [ C.Record (getRange i) x' Nothing tel' Nothing cs' ]
+
+  toConcrete (A.Mutual i ds) = declsToConcrete ds
+
   toConcrete (A.Section i x tel ds) = do
     x <- toConcrete x
     bindToConcrete tel $ \tel -> do
-    ds <- toConcrete ds
+    ds <- declsToConcrete ds
     return [ C.Module (getRange i) x tel ds ]
 
-  toConcrete (A.Apply i x tel y es _ _) = do
+  toConcrete (A.Apply i x modapp _ _) = do
     x  <- unsafeQNameToName <$> toConcrete x
-    y  <- toConcrete y
-    bindToConcrete tel $ \tel -> do
-    es <- toConcrete es
-    let r = fuseRange y es
+    modapp <- toConcrete modapp
+    let r = getRange modapp
         open = maybe DontOpen id $ minfoOpenShort i
         dir  = maybe (ImportDirective r (Hiding []) [] False) id $ minfoDirective i
-    return [ C.ModuleMacro (getRange i) x tel
-                (foldl (C.App r) (C.Ident y) es) open
-                                                 dir
-           ]
+    return [ C.ModuleMacro (getRange i) x modapp open dir ]
 
   toConcrete (A.Import i x) = do
     x <- toConcrete x
@@ -652,6 +689,12 @@
         A.CompiledEpicPragma x e -> do
           x <- toConcrete x
           return $ C.CompiledEpicPragma r x e
+        A.CompiledJSPragma x e -> do
+          x <- toConcrete x
+          return $ C.CompiledJSPragma r x e
+        A.StaticPragma x -> do
+            x <- toConcrete x
+            return $ C.StaticPragma r x
         A.EtaPragma x -> C.EtaPragma r <$> toConcrete x
 
 -- Left hand sides --------------------------------------------------------
@@ -706,17 +749,19 @@
 
 data Hd = HdVar A.Name | HdCon A.QName | HdDef A.QName
 
+cOpApp :: Range -> C.Name -> [C.Expr] -> C.Expr
+cOpApp r n es = C.OpApp r n (map Ordinary es)
+
 tryToRecoverOpApp :: A.Expr -> AbsToCon C.Expr -> AbsToCon C.Expr
-tryToRecoverOpApp e def = recoverOpApp bracket C.OpApp view e def
+tryToRecoverOpApp e def = recoverOpApp bracket cOpApp view e def
   where
     view e = case AV.appView e of
-      NonApplication _   -> Nothing
-      Application h args -> Just (mkHd h, args)
-
-    mkHd (HeadVar x)     = HdVar x
-    mkHd (HeadCon (c:_)) = HdCon c
-    mkHd (HeadCon [])    = __IMPOSSIBLE__
-    mkHd (HeadDef f)     = HdDef f
+      --NonApplication _   -> Nothing
+      Application (Var x) args -> Just (HdVar x, args)
+      Application (Def f) args -> Just (HdDef f, args)
+      Application (Con (AmbQ (c:_))) args -> Just (HdCon c, args)
+      Application (Con (AmbQ [])) args -> __IMPOSSIBLE__
+      _ -> Nothing
 
 tryToRecoverOpAppP :: A.Pattern -> AbsToCon C.Pattern -> AbsToCon C.Pattern
 tryToRecoverOpAppP p def = recoverOpApp bracketP_ C.OpAppP view p def
diff --git a/src/full/Agda/Syntax/Translation/ConcreteToAbstract.hs b/src/full/Agda/Syntax/Translation/ConcreteToAbstract.hs
--- a/src/full/Agda/Syntax/Translation/ConcreteToAbstract.hs
+++ b/src/full/Agda/Syntax/Translation/ConcreteToAbstract.hs
@@ -39,6 +39,7 @@
 import Agda.Syntax.Concrete.Definitions as C
 import Agda.Syntax.Concrete.Operators
 import Agda.Syntax.Concrete.Pretty
+import Agda.Syntax.Abstract.Pretty
 import Agda.Syntax.Fixity
 import Agda.Syntax.Notation
 import Agda.Syntax.Scope.Base
@@ -46,7 +47,7 @@
 import Agda.Syntax.Strict
 
 import Agda.TypeChecking.Monad.Base (TypeError(..), Call(..), typeError,
-                                     TCErr(..), TCErr'(..))
+                                     TCErr(..), TCErr'(..), extendlambdaname)
 import Agda.TypeChecking.Monad.Trace (traceCall, traceCallCPS, setCurrentRange)
 import Agda.TypeChecking.Monad.State
 import Agda.TypeChecking.Monad.Options
@@ -72,12 +73,13 @@
 notAnExpression e           = typeError $ NotAnExpression e
 notAValidLetBinding d       = typeError $ NotAValidLetBinding d
 nothingAppliedToHiddenArg e = typeError $ NothingAppliedToHiddenArg e
+nothingAppliedToInstanceArg e = typeError $ NothingAppliedToInstanceArg e
 
 -- Debugging
 
 printLocals :: Int -> String -> ScopeM ()
 printLocals v s = verboseS "scope.top" v $ do
-  locals <- scopeLocals <$> getScope
+  locals <- getLocalVars
   reportSLn "" 0 $ s ++ " " ++ show locals
 
 printScope :: String -> Int -> String -> ScopeM ()
@@ -112,12 +114,6 @@
   s  <- getScope
   return $ ScopedDecl s ds
 
-annotateDefn :: ScopeM A.Definition -> ScopeM A.Definition
-annotateDefn m = do
-  d <- m
-  s <- getScope
-  return $ ScopedDef s d
-
 annotateExpr :: ScopeM A.Expr -> ScopeM A.Expr
 annotateExpr m = do
   e <- m
@@ -158,19 +154,48 @@
     notField _           = True
 
     build (NiceField r f _ _ x (Arg h rel e) : fs) =
-        C.Pi [C.TypedBindings r $ Arg h rel [C.TBind r [BName x f] e]] $ build fs
+        C.Pi [C.TypedBindings r $ Arg h rel (C.TBind r [BName x f] e)] $ build fs
       where r = getRange x
     build (d : fs)                     = C.Let noRange (notSoNiceDeclarations [d]) $ build fs
     build []                           = C.SetN noRange 0 -- todo: nicer
 
-checkModuleMacro apply r p x tel m args open dir = withLocalVars $ do
-    notPublicWithoutOpen open dir
+checkModuleApplication (C.SectionApp _ tel e) m0 x dir' =
+  withCurrentModule m0 $ do
+    (m, args) <- case appView e of
+      AppView (Ident m) args -> return (m, args)
+      _                      -> notAModuleExpr e
 
     tel' <- toAbstract tel
-    (m0,m1,args') <- toAbstract ( NewModuleName x
-                                , OldModuleName m
-                                , args
-                                )
+    (m1,args') <- toAbstract (OldModuleName m
+                             , args
+                             )
+    s  <- getNamedScope m1
+    -- Drop constructors (OnlyQualified) if there are arguments. The record constructor
+    -- isn't properly in the record module, so copying it will lead to badness.
+    let noRecConstr | null args = id
+                    | otherwise = removeOnlyQualified
+    (s', (renM, renD)) <- copyScope m0 . noRecConstr =<< getNamedScope m1
+    s' <- applyImportDirectiveM (C.QName x) dir' s'
+    modifyCurrentScope $ const s'
+    printScope "mod.inst" 20 "copied source module"
+    reportSLn "scope.mod.inst" 30 $ "renamings:\n  " ++ show renD ++ "\n  " ++ show renM
+    return ((A.SectionApp tel' m1 args'), renD, renM)
+checkModuleApplication (C.RecordModuleIFS _ rec) m0 x dir' =
+  withCurrentModule m0 $ do
+    m1 <- toAbstract $ OldModuleName rec
+    s <- getNamedScope m1
+    (s', (renM, renD)) <- copyScope m0 s
+    s' <- applyImportDirectiveM rec dir' s'
+    modifyCurrentScope $ const s'
+
+    printScope "mod.inst" 20 "copied record module"
+    return ((A.RecordModuleIFS m1), renD, renM)
+
+checkModuleMacro apply r p x modapp open dir = withLocalVars $ do
+    notPublicWithoutOpen open dir
+
+    m0 <- toAbstract (NewModuleName x)
+
     printScope "mod.inst" 20 "module macro"
 
     -- If we're opening, the import directive is applied to the open,
@@ -179,14 +204,7 @@
                 DontOpen  -> dir
                 DoOpen    -> defaultImportDir
 
-    (renD, renM) <- withCurrentModule m0 $ do
-      s  <- getNamedScope m1
-      (s', (renM, renD)) <- copyScope m0 =<< getNamedScope m1
-      s' <- applyImportDirectiveM (C.QName x) dir' s'
-      modifyCurrentScope $ const s'
-      printScope "mod.inst" 20 "copied source module"
-      reportSLn "scope.mod.inst" 30 $ "renamings:\n  " ++ show renD ++ "\n  " ++ show renM
-      return (renD, renM)
+    (modapp', renD, renM) <- checkModuleApplication modapp m0 x dir'
     bindModule p x m0
     printScope "mod.inst.copy.after" 20 "after copying"
     case open of
@@ -195,7 +213,7 @@
     printScope "mod.inst" 20 $ show open
     stripNoNames
     printScope "mod.inst" 10 $ "after stripping"
-    return [ apply info (m0 `withRangesOf` [x]) tel' m1 args' renD renM ]
+    return [ apply info (m0 `withRangesOf` [x]) modapp' renD renM ]
   where
     info = ModuleInfo
              { minfoRange  = r
@@ -309,7 +327,7 @@
     reportSLn "scope.name" 10 $ "resolved " ++ show x ++ ": " ++ show qx
     case qx of
       VarName x'         -> return $ A.Var x'
-      DefinedName d      -> return $ nameExpr d
+      DefinedName _ d    -> return $ nameExpr d
       ConstructorName ds -> return $ A.Con $ AmbQ (map anameName ds)
       UnknownName        -> notInScope x
 
@@ -322,11 +340,11 @@
     rx <- resolveName x
     z  <- case (rx, x) of
       -- TODO: warn about shadowing
-      (VarName y,     C.QName x)                          -> return $ Left x -- typeError $ RepeatedVariableInPattern y x
-      (DefinedName d, C.QName x) | DefName == anameKind d -> return $ Left x
-      (UnknownName,   C.QName x)                          -> return $ Left x
-      (ConstructorName ds, _)                             -> return $ Right ds
-      _                                                   ->
+      (VarName y,       C.QName x)                          -> return $ Left x -- typeError $ RepeatedVariableInPattern y x
+      (DefinedName _ d, C.QName x) | DefName == anameKind d -> return $ Left x
+      (UnknownName,     C.QName x)                          -> return $ Left x
+      (ConstructorName ds, _)                               -> return $ Right ds
+      _                                                     ->
         typeError $ GenericError $
           "Cannot pattern match on " ++ show x ++ ", because it is not a constructor"
     case z of
@@ -344,8 +362,8 @@
   toAbstract (OldName x) = do
     rx <- resolveName (C.QName x)
     case rx of
-      DefinedName d -> return $ anameName d
-      _             -> __IMPOSSIBLE__
+      DefinedName _ d -> return $ anameName d
+      _               -> error $ show x ++ " - " ++ show rx
 
 newtype NewModuleName      = NewModuleName      C.Name
 newtype NewModuleQName     = NewModuleQName     C.QName
@@ -389,11 +407,13 @@
 -- | Peel off 'C.HiddenArg' and represent it as an 'NamedArg'.
 mkNamedArg :: C.Expr -> NamedArg C.Expr
 mkNamedArg (C.HiddenArg _ e) = Arg Hidden    Relevant e
+mkNamedArg (C.InstanceArg _ e) = Arg Instance    Relevant e
 mkNamedArg e                 = Arg NotHidden Relevant $ unnamed e
 
 -- | Peel off 'C.HiddenArg' and represent it as an 'Arg', throwing away any name.
 mkArg' :: Relevance -> C.Expr -> Arg C.Expr
 mkArg' r (C.HiddenArg _ e) = Arg Hidden    r $ namedThing e
+mkArg' r (C.InstanceArg _ e) = Arg Instance    r $ namedThing e
 mkArg' r e                 = Arg NotHidden r e
 
 -- | By default, arguments are @Relevant@.
@@ -422,6 +442,23 @@
         e <- toAbstractCtx prec e
         return (e, False)
 
+toAbstractOpArg :: Precedence -> OpApp C.Expr -> ScopeM A.Expr
+toAbstractOpArg ctx (Ordinary e) = toAbstractCtx ctx e
+toAbstractOpArg ctx (SyntaxBindingLambda r bs e) = toAbstractLam r bs e ctx
+
+toAbstractLam :: Range -> [C.LamBinding] -> C.Expr -> Precedence -> ScopeM A.Expr
+toAbstractLam r bs e ctx = do
+        localToAbstract (map makeDomainFull bs) $ \bs ->
+          case bs of
+            b:bs' -> do
+              e        <- toAbstractCtx ctx e
+              let info = ExprRange r
+              return $ A.Lam info b $ foldr mkLam e bs'
+              where
+                  mkLam b e = A.Lam (ExprRange $ fuseRange b e) b e
+            [] -> __IMPOSSIBLE__
+
+
 instance ToAbstract C.Expr A.Expr where
   toAbstract e =
     traceCall (ScopeCheckExpr e) $ annotateExpr $ case e of
@@ -480,21 +517,43 @@
 
   -- Malplaced hidden argument
       C.HiddenArg _ _ -> nothingAppliedToHiddenArg e
+      C.InstanceArg _ _ -> nothingAppliedToInstanceArg e
 
   -- Lambda
       C.AbsurdLam r h -> return $ A.AbsurdLam (ExprRange r) h
 
-      e0@(C.Lam r bs e) -> do
-        localToAbstract bs $ \bs ->
-          case bs of
-            b:bs' -> do
-              e        <- toAbstractCtx TopCtx e
-              let info = ExprRange r
-              return $ A.Lam info b $ foldr mkLam e bs'
-              where
-                  mkLam b e = A.Lam (ExprRange $ fuseRange b e) b e
-            [] -> __IMPOSSIBLE__
+      C.Lam r bs e -> toAbstractLam r bs e TopCtx
 
+  -- Extended Lambda
+      C.ExtendedLam r cs -> do
+--        m <- getCurrentModule
+        cname <- nextlamname r 0 extendlambdaname
+        name  <- freshAbstractName_ cname
+        reportSLn "toabstract.extendlambda" 10 $ "new extended lambda name: " ++ show name
+        qname <- qualifyName_ name
+        bindName PrivateAccess DefName cname qname
+        let insertApp (C.RawAppP r es) = C.RawAppP r ((IdentP (C.QName cname)) : es)
+            insertApp (C.IdentP q) = C.RawAppP (getRange q) ((IdentP (C.QName cname)) : [C.IdentP q])
+            insertApp _ = __IMPOSSIBLE__
+            insertHead (C.LHS p wps eqs with) = C.LHS (insertApp p) wps eqs with
+            insertHead (C.Ellipsis r wps eqs with) = C.Ellipsis r wps eqs with
+        scdef <- toAbstract (C.FunDef r [] defaultFixity' ConcreteDef cname
+                               (map (\(lhs,rhs,wh) -> -- wh = NoWhere, see parser for more info
+                                      C.Clause cname (insertHead lhs) rhs wh []) cs))
+        case scdef of
+          (A.ScopedDecl si [A.FunDef di qname' cs]) -> do
+            setScope si
+            return $ A.ExtendedLam (ExprRange r) di qname' cs
+          _ -> __IMPOSSIBLE__
+          where
+            nextlamname :: Range -> Int -> String -> ScopeM C.Name
+            nextlamname r i s = do
+              let cname_pre = C.Name r [Id $ s ++ show i]
+              rn <- resolveName (C.QName cname_pre)
+              case rn of
+                UnknownName -> return $ cname_pre
+                _           -> nextlamname r (i+1) s
+
 -- Irrelevant non-dependent function type
 
       C.Fun r e1 e2 -> do
@@ -538,6 +597,13 @@
         es <- toAbstractCtx TopCtx es
         return $ A.Rec (ExprRange r) $ zip xs es
 
+  -- Record update
+      C.RecUpdate r e fs -> do
+        let (xs, es) = unzip fs
+        e <- toAbstract e
+        es <- toAbstractCtx TopCtx es
+        return $ A.RecUpdate (ExprRange r) e $ zip xs es
+
   -- Parenthesis
       C.Paren _ e -> toAbstractCtx TopCtx e
 
@@ -555,11 +621,21 @@
         e' <- toAbstract e
         return $ A.QuoteGoal (ExprRange $ getRange e) x' e'
       C.Quote r -> return $ A.Quote (ExprRange r)
+      C.QuoteTerm r -> return $ A.QuoteTerm (ExprRange r)
+      C.Unquote r -> return $ A.Unquote (ExprRange r)
 
+  -- DontCare
+      C.DontCare e -> A.DontCare <$> toAbstract e
+
 instance ToAbstract C.LamBinding A.LamBinding where
-  toAbstract (C.DomainFree h x) = A.DomainFree h <$> toAbstract (NewName x)
-  toAbstract (C.DomainFull tb)  = A.DomainFull <$> toAbstract tb
+  toAbstract (C.DomainFree h rel x) = A.DomainFree h rel <$> toAbstract (NewName x)
+  toAbstract (C.DomainFull tb)      = A.DomainFull <$> toAbstract tb
 
+makeDomainFull :: C.LamBinding -> C.LamBinding
+makeDomainFull b@C.DomainFull{} = b
+makeDomainFull (C.DomainFree h rel x) =
+  C.DomainFull $ C.TypedBindings r $ Arg h rel $ C.TBind r [x] $ C.Underscore r Nothing
+  where r = getRange x
 instance ToAbstract C.TypedBindings A.TypedBindings where
   toAbstract (C.TypedBindings r bs) = A.TypedBindings r <$> toAbstract bs
 
@@ -581,12 +657,12 @@
     -- pushScope m
     -- qm <- getCurrentModule
     printScope "module" 20 $ "inside module " ++ show x
-    ds <- withLocalVars $ do
-            tel <- toAbstract tel
-            (:[]) . A.Section info (qm `withRangesOfQ` x) tel <$>
-              toAbstract ds
-    scope <- getScope
-    return (scope, ds)
+    withLocalVars $ do
+      tel   <- toAbstract tel
+      ds    <- (:[]) . A.Section info (qm `withRangesOfQ` x) tel <$>
+                 toAbstract ds
+      scope <- getScope
+      return (scope, ds)
 
   -- Binding is done by the caller
   printScope "module" 20 $ "after module " ++ show x
@@ -619,7 +695,7 @@
           return $ TopLevelInfo (ds' ++ ds) scope scope0
         _ -> __IMPOSSIBLE__
 
-
+-- | runs Syntax.Concrete.Definitions.niceDeclarations on main module
 niceDecls :: [C.Declaration] -> ScopeM [NiceDeclaration]
 niceDecls ds = case runNice $ niceDeclarations ds of
   Left e   -> throwError $ TCErr Nothing $ Exception (getRange e) (show e)
@@ -632,17 +708,19 @@
 newtype LetDef = LetDef NiceDeclaration
 
 instance ToAbstract LetDefs [A.LetBinding] where
-    toAbstract (LetDefs ds) =
-        concat <$> (toAbstract =<< map LetDef <$> niceDecls ds)
+  toAbstract (LetDefs ds) =
+    concat <$> (toAbstract =<< map LetDef <$> niceDecls ds)
 
 instance ToAbstract LetDef [A.LetBinding] where
     toAbstract (LetDef d) =
         case d of
-            NiceDef _ c [C.Axiom _ _ _ _ rel x t] [C.FunDef _ _ _ _ _ _ [cl]] ->
-                do  e <- letToAbstract cl
+            NiceMutual _ d@[C.FunSig _ fx _ rel x t, C.FunDef _ _ _ abstract _ [cl]] ->
+                do  when (abstract == AbstractDef) $ do
+                      typeError $ GenericError $ "abstract not allowed in let expressions"
+                    e <- letToAbstract cl
                     t <- toAbstract t
-                    x <- toAbstract (NewName x)
-                    return [ A.LetBind (LetRange $ getRange c) rel x t e ]
+                    x <- toAbstract (NewName $ C.BName x fx)
+                    return [ A.LetBind (LetRange $ getRange d) rel x t e ]
 
             -- You can't open public in a let
             NiceOpen r x dirs | not (C.publicOpen dirs) -> do
@@ -659,9 +737,8 @@
                                 m
                      ]
 
-            NiceModuleMacro r p a x tel e open dir | not (C.publicOpen dir) -> case appView e of
-              AppView (Ident m) args -> checkModuleMacro LetApply r p x tel m args open dir
-              _                      -> notAModuleExpr e
+            NiceModuleMacro r p a x modapp open dir | not (C.publicOpen dir) ->
+              checkModuleMacro LetApply r p x modapp open dir
 
             _   -> notAValidLetBinding d
         where
@@ -673,83 +750,16 @@
             letToAbstract _ = notAValidLetBinding d
 
             -- Named patterns not allowed in let definitions
-            lambda e (Arg h r (Named Nothing (A.VarP x))) = return $ A.Lam i (A.DomainFree h x) e
+            lambda e (Arg h rel (Named Nothing (A.VarP x))) = return $ A.Lam i (A.DomainFree h rel x) e
                 where
                     i = ExprRange (fuseRange x e)
-            lambda e (Arg h r (Named Nothing (A.WildP i))) =
+            lambda e (Arg h rel (Named Nothing (A.WildP i))) =
                 do  x <- freshNoName (getRange i)
-                    return $ A.Lam i' (A.DomainFree h x) e
+                    return $ A.Lam i' (A.DomainFree h rel x) e
                 where
                     i' = ExprRange (fuseRange i e)
             lambda _ _ = notAValidLetBinding d
 
--- instance ToAbstract C.Pragma [A.Pragma]
--- moved higher up to reduce the probability of line number change
--- in C.ImpossiblePragma  (test/fail/Impossible.agda)
-
--- Only constructor names are bound by definitions.
-instance ToAbstract NiceDefinition Definition where
-
-    toAbstract d = annotateDefn $ case d of
-
-    -- Function definitions
-      C.FunDef r ds f p a x cs ->
-        traceCall (ScopeCheckDefinition d) $ do
-          (x',cs') <- toAbstract (OldName x,cs)
-          return $ A.FunDef (mkDefInfo x f p a r) x' cs'
-
-    -- Data definitions
-      C.DataDef r f p a x pars cons ->
-        traceCall (ScopeCheckDefinition d) $
-        withLocalVars $ do
-
-          -- Check for duplicate constructors
-          do let cs   = map conName cons
-                 dups = nub $ cs \\ nub cs
-                 bad  = filter (`elem` dups) cs
-             unless (distinct cs) $
-               setCurrentRange (getRange bad) $
-                  typeError $ DuplicateConstructors dups
-
-          pars <- toAbstract pars
-          x'   <- toAbstract (OldName x)
-          -- Create the module for the qualified constructors
-          checkForModuleClash x -- disallow shadowing previously defined modules
-          let m = mnameFromList $ qnameToList x'
-          createModule m
-          bindModule p x m  -- make it a proper module
-          cons <- toAbstract (map (ConstrDecl m) cons)
-          -- Open the module
-          -- openModule_ (C.QName x) defaultImportDir{ publicOpen = True }
-          printScope "data" 20 $ "Checked data " ++ show x
-          return $ A.DataDef (mkDefInfo x f p a r) x' pars cons
-        where
-          conName (C.Axiom _ _ _ _ _ c _) = c
-          conName _ = __IMPOSSIBLE__
-
-    -- Record definitions (mucho interesting)
-      C.RecDef r f p a x c pars fields ->
-        traceCall (ScopeCheckDefinition d) $
-        withLocalVars $ do
-          -- Check that the generated module doesn't clash with a previously
-          -- defined module
-          checkForModuleClash x
-          pars   <- toAbstract pars
-          x'     <- toAbstract (OldName x)
-          contel <- toAbstract $ recordConstructorType fields
-          m0     <- getCurrentModule
-          let m = A.qualifyM m0 $ mnameFromList $ (:[]) $ last $ qnameToList x'
-          printScope "rec" 15 "before record"
-          createModule m
-          afields <- withCurrentModule m $ do
-            afields <- toAbstract fields
-            printScope "rec" 15 "checked fields"
-            return afields
-          bindModule p x m
-          c' <- mapM (toAbstract . ConstrDecl m) c
-          printScope "rec" 15 "record complete"
-          return $ A.RecDef (mkDefInfo x f p a r) x' c' pars contel afields
-
 -- The only reason why we return a list is that open declarations disappears.
 -- For every other declaration we get a singleton list.
 instance ToAbstract NiceDeclaration A.Declaration where
@@ -759,11 +769,13 @@
     case d of
 
   -- Axiom
-    C.Axiom r f p a rel x t -> do
+    C.Axiom r f p rel x t -> do
+      clo <- commandLineOptions
+      when (optSafe clo) (typeError (SafeFlagPostulate x))
       t' <- toAbstractCtx TopCtx t
       y  <- freshAbstractQName f x
       bindName p DefName x y
-      return [ A.Axiom (mkDefInfo x f p a r) rel y t' ]
+      return [ A.Axiom (mkDefInfo x f p ConcreteDef r) rel y t' ]
 
   -- Fields
     C.NiceField r f p a x t -> do
@@ -785,13 +797,93 @@
       return [ A.Primitive (mkDefInfo x f p a r) y t' ]
 
   -- Definitions (possibly mutual)
-    NiceDef r cs ts ds -> do
-      (ts', ds') <- toAbstract (ts, ds)
-      return [ Definition (DeclInfo C.noName_ r) ts' ds' ]
+    NiceMutual r ds -> do
+      ds' <- toAbstract ds
+      return [ A.Mutual (DeclInfo C.noName_ r) ds' ]
                           -- TODO: what does the info mean here?
 
-  -- TODO: what does an abstract module mean? The syntax doesn't allow it.
-    NiceModule r p a (C.QName name) tel ds -> do
+    C.NiceRecSig r f a x ls t -> withLocalVars $ do
+        let toTypeBinding :: C.LamBinding -> C.TypedBindings
+            toTypeBinding b = case makeDomainFull b of
+               C.DomainFull b -> b
+               _            -> __IMPOSSIBLE__
+        ls' <- toAbstract (map toTypeBinding ls)
+        x'  <- freshAbstractQName f x
+        bindName a DefName x x'
+        t' <- toAbstract t
+        return [ A.RecSig (mkDefInfo x f a ConcreteDef r) x' ls' t' ]
+    C.NiceDataSig r f a x ls t -> withLocalVars $ do
+        printScope "scope.data.sig" 20 ("checking DataSig for " ++ show x)
+        let toTypeBinding :: C.LamBinding -> C.TypedBindings
+            toTypeBinding b = case makeDomainFull b of
+               C.DomainFull b -> b
+               _            -> __IMPOSSIBLE__
+        ls' <- toAbstract (map toTypeBinding ls)
+        x'  <- freshAbstractQName f x
+        bindName a DefName x x'
+        t' <- toAbstract t
+        return [ A.DataSig (mkDefInfo x f a ConcreteDef r) x' ls' t' ]
+  -- Type signatures
+    C.FunSig r f p rel x t -> (:[]) <$> toAbstract (C.Axiom r f p rel x t)
+  -- Function definitions
+    C.FunDef r ds f a x cs -> do
+        printLocals 10 $ "checking def " ++ show x
+        (x',cs') <- toAbstract (OldName x,cs)
+        return [ A.FunDef (mkDefInfo x f PublicAccess a r) x' cs' ]
+
+  -- Data definitions
+    C.DataDef r f a x pars cons -> withLocalVars $ do
+        printScope "scope.data.def" 20 ("checking DataDef for " ++ show x)
+        -- Check for duplicate constructors
+        do let cs   = map conName cons
+               dups = nub $ cs \\ nub cs
+               bad  = filter (`elem` dups) cs
+           unless (distinct cs) $
+             setCurrentRange (getRange bad) $
+                typeError $ DuplicateConstructors dups
+
+        pars <- toAbstract pars
+        DefinedName p ax <- resolveName (C.QName x)
+        let x' = anameName ax
+        -- Create the module for the qualified constructors
+        checkForModuleClash x -- disallow shadowing previously defined modules
+        let m = mnameFromList $ qnameToList x'
+        createModule m
+        bindModule p x m  -- make it a proper module
+        cons <- toAbstract (map (ConstrDecl NoRec m a p) cons)
+        -- Open the module
+        -- openModule_ (C.QName x) defaultImportDir{ publicOpen = True }
+        printScope "data" 20 $ "Checked data " ++ show x
+        return [ A.DataDef (mkDefInfo x f PublicAccess a r) x' pars cons ]
+      where
+        conName (C.Axiom _ _ _ _ c _) = c
+        conName _ = __IMPOSSIBLE__
+
+  -- Record definitions (mucho interesting)
+    C.RecDef r f a x cm pars fields ->
+      withLocalVars $ do
+        -- Check that the generated module doesn't clash with a previously
+        -- defined module
+        checkForModuleClash x
+        pars   <- toAbstract pars
+        DefinedName p ax <- resolveName (C.QName x)
+        let x' = anameName ax
+        contel <- toAbstract $ recordConstructorType fields
+        m0     <- getCurrentModule
+        let m = A.qualifyM m0 $ mnameFromList $ (:[]) $ last $ qnameToList x'
+        printScope "rec" 15 "before record"
+        createModule m
+        afields <- withCurrentModule m $ do
+          afields <- toAbstract fields
+          printScope "rec" 15 "checked fields"
+          return afields
+        bindModule p x m
+        cm' <- mapM (\(ThingWithFixity c f) -> bindConstructorName m c f a p YesRec) cm
+        printScope "rec" 15 "record complete"
+        return [ A.RecDef (mkDefInfo x f PublicAccess a r) x' cm' pars contel afields ]
+
+    NiceModule r p a (C.QName name) tel ds ->
+      traceCall (ScopeCheckDeclaration $ NiceModule r p a (C.QName name) tel []) $ do
       aname <- toAbstract (NewModuleName name)
       x <- snd <$> scopeCheckModule r (C.QName name) aname tel ds
       bindModule p name aname
@@ -799,9 +891,8 @@
 
     NiceModule _ _ _ C.Qual{} _ _ -> __IMPOSSIBLE__
 
-    NiceModuleMacro r p a x tel e open dir -> case appView e of
-      AppView (Ident m) args -> checkModuleMacro Apply r p x tel m args open dir
-      _                      -> notAModuleExpr e
+    NiceModuleMacro r p a x modapp open dir ->
+      checkModuleMacro Apply r p x modapp open dir
 
     NiceOpen r x dir -> do
       m <- toAbstract (OldModuleName x)
@@ -871,26 +962,38 @@
                            })
                         m ]
 
-data ConstrDecl = ConstrDecl A.ModuleName C.NiceDeclaration
 
+data IsRecordCon = YesRec | NoRec
+data ConstrDecl = ConstrDecl IsRecordCon A.ModuleName IsAbstract Access C.NiceDeclaration
+
+bindConstructorName m x f a p rec = do
+  -- The abstract name is the qualified one
+  y <- withCurrentModule m $ freshAbstractQName f x
+  -- Bind it twice, once unqualified and once qualified
+  bindName p' ConName x y
+  withCurrentModule m $ bindName p'' ConName x y
+  return y
+  where
+    -- An abstract constructor is private (abstract constructor means
+    -- abstract datatype, so the constructor should not be exported).
+    p' = case a of
+           AbstractDef -> PrivateAccess
+           _           -> p
+    p'' = case (a, rec) of
+            (AbstractDef, _) -> PrivateAccess
+            (_, YesRec)      -> OnlyQualified   -- record constructors aren't really in the record module
+            _                -> PublicAccess
+
 instance ToAbstract ConstrDecl A.Declaration where
-    toAbstract (ConstrDecl m (C.Axiom r f p a rel x t)) = do -- rel==Relevant
-        t' <- toAbstractCtx TopCtx t
-        -- The abstract name is the qualified one
-        y  <- withCurrentModule m $ freshAbstractQName f x
-        -- Bind it twice, once unqualified and once qualified
-        bindName p' ConName x y
-        withCurrentModule m $ bindName p' ConName x y
-        printScope "con" 15 "bound constructor"
-        return $ A.Axiom (mkDefInfo x f p a r) rel y t'
-        where
-            -- An abstract constructor is private (abstract constructor means
-            -- abstract datatype, so the constructor should not be exported).
-            p' = case (a, p) of
-                    (AbstractDef, _) -> PrivateAccess
-                    (_, p)           -> p
+  toAbstract (ConstrDecl rec m a p (C.Axiom r f _ rel x t)) = do -- rel==Relevant
+    t' <- toAbstractCtx TopCtx t
+    -- The abstract name is the qualified one
+    -- Bind it twice, once unqualified and once qualified
+    y <- bindConstructorName m x f a p rec
+    printScope "con" 15 "bound constructor"
+    return $ A.Axiom (mkDefInfo x f p ConcreteDef r) rel y t'
 
-    toAbstract _ = __IMPOSSIBLE__    -- a constructor is always an axiom
+  toAbstract _ = __IMPOSSIBLE__    -- a constructor is always an axiom
 
 instance ToAbstract C.Pragma [A.Pragma] where
     toAbstract (C.ImpossiblePragma _) = impossibleTest
@@ -916,9 +1019,22 @@
       e <- toAbstract $ OldQName x
       y <- case e of
             A.Def x -> return x
-            -- A.Con _ -> fail "Use COMPILED_DATA_EPIC for constructors" -- TODO
             _       -> __IMPOSSIBLE__
       return [ A.CompiledEpicPragma y ep ]
+    toAbstract (C.CompiledJSPragma _ x ep) = do
+      e <- toAbstract $ OldQName x
+      y <- case e of
+            A.Def x -> return x
+            A.Con (AmbQ [x]) -> return x
+            A.Con x -> fail ("COMPILED_JS used on ambiguous name " ++ show x)
+            _       -> __IMPOSSIBLE__
+      return [ A.CompiledJSPragma y ep ]
+    toAbstract (C.StaticPragma _ x) = do
+        e <- toAbstract $ OldQName x
+        y <- case e of
+            A.Def x -> return x
+            _       -> __IMPOSSIBLE__
+        return [ A.StaticPragma y ]
     toAbstract (C.BuiltinPragma _ b e) = do
         e <- toAbstract e
         return [ A.BuiltinPragma b e ]
@@ -975,11 +1091,15 @@
                  | RHS' A.Expr
                  | RewriteRHS' [A.Expr] AbstractRHS [A.Declaration]
 
+qualifyName_ :: A.Name -> ScopeM A.QName
+qualifyName_ x = do
+  m <- getCurrentModule
+  return $ A.qualify m x
+
 withFunctionName :: String -> ScopeM A.QName
 withFunctionName s = do
-  m <- getCurrentModule
   NameId i _ <- fresh
-  A.qualify m <$> freshName_ (s ++ show i)
+  qualifyName_ =<< freshName_ (s ++ show i)
 
 instance ToAbstract AbstractRHS A.RHS where
   toAbstract AbsurdRHS'            = return A.AbsurdRHS
@@ -1022,7 +1142,7 @@
         p <- parseLHS (Just top) lhs
         printLocals 10 "before lhs:"
         let (x, ps) = lhsArgs p
-        x    <- toAbstract (OldName x)
+        x    <- withLocalVars $ setLocalVars [] >> toAbstract (OldName x)
         args <- toAbstract ps
         wps  <- toAbstract =<< mapM (parseLHS Nothing) wps
         checkPatternLinearity (map (namedThing . unArg) args ++ wps)
@@ -1078,6 +1198,7 @@
 
     -- Removed when parsing
     toAbstract (HiddenP _ _) = __IMPOSSIBLE__
+    toAbstract (InstanceP _ _) = __IMPOSSIBLE__
     toAbstract (RawAppP _ _) = __IMPOSSIBLE__
 
     toAbstract p@(C.WildP r)    = return $ A.WildP (PatSource r $ const p)
@@ -1100,7 +1221,7 @@
 
 -- | Turn an operator application into abstract syntax. Make sure to record the
 -- right precedences for the various arguments.
-toAbstractOpApp :: C.Name -> [C.Expr] -> ScopeM A.Expr
+toAbstractOpApp :: C.Name -> [OpApp C.Expr] -> ScopeM A.Expr
 toAbstractOpApp op@(C.NoName _ _) es = __IMPOSSIBLE__
 toAbstractOpApp op@(C.Name _ _) es = do
     f  <- getFixity (C.QName op)
@@ -1113,7 +1234,7 @@
 
         left f (IdPart _ : xs) es = inside f xs es
         left f (_ : xs) (e : es) = do
-            e  <- toAbstractCtx (LeftOperandCtx f) e
+            e  <- toAbstractOpArg (LeftOperandCtx f) e
             es <- inside f xs es
             return (e : es)
         left f (_  : _)  [] = __IMPOSSIBLE__
@@ -1122,7 +1243,7 @@
         inside f [x]          es       = right f x es
         inside f (IdPart _ : xs) es       = inside f xs es
         inside f (_  : xs) (e : es) = do
-            e  <- toAbstractCtx InsideOperandCtx e
+            e  <- toAbstractOpArg InsideOperandCtx e
             es <- inside f xs es
             return (e : es)
         inside _ (_ : _) [] = __IMPOSSIBLE__
@@ -1130,6 +1251,6 @@
 
         right _ (IdPart _)  [] = return []
         right f _          [e] = do
-            e <- toAbstractCtx (RightOperandCtx f) e
+            e <- toAbstractOpArg (RightOperandCtx f) e
             return [e]
         right _ _     _  = __IMPOSSIBLE__
diff --git a/src/full/Agda/Syntax/Translation/InternalToAbstract.hs b/src/full/Agda/Syntax/Translation/InternalToAbstract.hs
--- a/src/full/Agda/Syntax/Translation/InternalToAbstract.hs
+++ b/src/full/Agda/Syntax/Translation/InternalToAbstract.hs
@@ -16,6 +16,7 @@
 module Agda.Syntax.Translation.InternalToAbstract where
 
 import Prelude hiding (mapM_, mapM)
+import Control.Applicative
 import Control.Arrow
 import Control.Monad.State hiding (mapM_, mapM)
 import Control.Monad.Error hiding (mapM_, mapM)
@@ -47,6 +48,7 @@
 import Agda.TypeChecking.Datatypes
 import Agda.TypeChecking.Free
 import Agda.TypeChecking.Substitute
+import Agda.TypeChecking.Telescope
 
 import Agda.Utils.Monad
 import Agda.Utils.Tuple
@@ -56,7 +58,7 @@
 #include "../../undefined.h"
 import Agda.Utils.Impossible
 
-apps :: MonadTCM tcm => (Expr, [Arg Expr]) -> tcm Expr
+apps :: (Expr, [Arg Expr]) -> TCM Expr
 apps (e, []) = return e
 apps (e, arg : args) | isHiddenArg arg =
     do  showImp <- showImplicitArguments
@@ -68,11 +70,11 @@
 exprInfo :: ExprInfo
 exprInfo = ExprRange noRange
 
-reifyApp :: MonadTCM tcm => Expr -> [Arg Term] -> tcm Expr
+reifyApp :: Expr -> [Arg Term] -> TCM Expr
 reifyApp e vs = curry apps e =<< reify vs
 
 class Reify i a | i -> a where
-    reify :: MonadTCM tcm => i -> tcm a
+    reify :: i -> TCM a
 
 instance Reify MetaId Expr where
     reify x@(MetaId n) = liftTCM $ do
@@ -92,6 +94,9 @@
 instance Reify DisplayTerm Expr where
   reify d = case d of
     DTerm v -> reify v
+    DDot  v -> reify v
+    DCon c vs -> curry apps (A.Con (AmbQ [c])) =<< reify vs
+    DDef f vs -> curry apps (A.Def f) =<< reify vs
     DWithApp us vs -> do
       us <- reify us
       let wapp [e] = e
@@ -99,7 +104,7 @@
           wapp [] = __IMPOSSIBLE__
       reifyApp (wapp us) vs
 
-reifyDisplayForm :: MonadTCM tcm => QName -> Args -> tcm A.Expr -> tcm A.Expr
+reifyDisplayForm :: QName -> Args -> TCM A.Expr -> TCM A.Expr
 reifyDisplayForm x vs fallback = do
   enabled <- displayFormsEnabled
   if enabled
@@ -125,11 +130,19 @@
     okDisplayForm (DWithApp (d : ds) []) =
       okDisplayForm d && all okDisplayTerm ds
     okDisplayForm (DTerm (I.Def f vs)) = all okArg vs
-    okDisplayForm _ = True -- False
+    okDisplayForm (DDef f vs) = all okDArg vs
+    okDisplayForm DDot{} = False
+    okDisplayForm DCon{} = False
+    okDisplayForm DTerm{} = True -- False?
+    okDisplayForm DWithApp{} = True -- False?
 
     okDisplayTerm (DTerm v) = okTerm v
+    okDisplayTerm DDot{} = True
+    okDisplayTerm DCon{} = True
+    okDisplayTerm DDef{} = False
     okDisplayTerm _ = False
 
+    okDArg = okDisplayTerm . unArg
     okArg = okTerm . unArg
 
     okTerm (I.Var _ []) = True
@@ -138,13 +151,11 @@
     okTerm _            = True -- False
 
     flattenWith (DWithApp (d : ds) []) = case flattenWith d of
-      (f, vs, ds') -> (f, vs, ds' ++ map unDTerm ds)
-    flattenWith (DTerm (I.Def f vs)) = (f, vs, [])
+      (f, vs, ds') -> (f, vs, ds' ++ ds)
+    flattenWith (DDef f vs) = (f, vs, [])
+    flattenWith (DTerm (I.Def f vs)) = (f, map (fmap DTerm) vs, [])
     flattenWith _ = __IMPOSSIBLE__
 
-    unDTerm (DTerm v) = v
-    unDTerm _ = __IMPOSSIBLE__
-
     displayLHS ps wps d = case flattenWith d of
       (f, vs, ds) -> do
         ds <- mapM termToPat ds
@@ -154,22 +165,49 @@
         info = PatRange noRange
         argToPat arg = fmap unnamed <$> traverse termToPat arg
 
-        -- TODO: dot variables
-        termToPat (I.Var n []) = return $ ps !! fromIntegral n
-        termToPat (I.Con c vs) = A.ConP info (AmbQ [c]) <$> mapM argToPat vs
-        termToPat (I.Def _ []) = return $ A.WildP info
+        len = genericLength ps
+
+        termToPat :: DisplayTerm -> TCM A.Pattern
+        termToPat (DTerm (I.Var n [])) = return $ ps !! fromIntegral n
+        termToPat (DCon c vs) = A.ConP info (AmbQ [c]) <$> mapM argToPat vs
+        termToPat (DDot v) = A.DotP info <$> termToExpr v
+        termToPat (DDef _ []) = return $ A.WildP info
+        termToPat (DTerm (I.Con c vs)) = A.ConP info (AmbQ [c]) <$> mapM (argToPat . fmap DTerm) vs
+        termToPat (DTerm (I.Def _ [])) = return $ A.WildP info
         termToPat v = A.DotP info <$> reify v -- __IMPOSSIBLE__
 
--- Level literals should be expanded.
+        argsToExpr = mapM (traverse termToExpr)
 
+        -- TODO: restructure this to avoid having to repeat the code for reify
+        termToExpr :: Term -> TCM A.Expr
+        termToExpr (I.Var n [])
+          | n < len = return $ patToTerm $ ps !! fromIntegral n
+        termToExpr (I.Con c vs) =
+          curry apps (A.Con (AmbQ [c])) =<< argsToExpr vs
+        termToExpr (I.Def f vs) =
+          curry apps (A.Def f) =<< argsToExpr vs
+        termToExpr (I.Var n vs) =
+          apps =<< (,) <$> reify (I.Var (n - len) []) <*> argsToExpr vs
+        termToExpr _ = return $ A.Underscore minfo
+
+        minfo = MetaInfo noRange emptyScopeInfo Nothing
+        einfo = ExprRange noRange
+        app = foldl (App einfo)
+
+        patToTerm :: A.Pattern -> A.Expr
+        patToTerm (A.VarP x)      = A.Var x
+        patToTerm (A.ConP _ c ps) =
+          A.Con c `app` map (fmap (fmap patToTerm)) ps
+        patToTerm (A.DefP _ f ps) =
+          A.Def f `app` map (fmap (fmap patToTerm)) ps
+        patToTerm (A.WildP _)     = A.Underscore minfo
+        patToTerm (A.AsP _ _ p)   = patToTerm p
+        patToTerm (A.DotP _ e)    = e
+        patToTerm (A.AbsurdP _)   = A.Underscore minfo  -- TODO: could this happen?
+        patToTerm (A.LitP l)      = A.Lit l
+        patToTerm (A.ImplicitP _) = A.Underscore minfo
+
 instance Reify Literal Expr where
-  reify (LitLevel r n) = do
-    levelZero <- primLevelZero
-    levelSuc  <- levelSucFunction
-    reify $ fold levelSuc levelZero n
-    where
-    fold s z n | n < 0     = __IMPOSSIBLE__
-               | otherwise = foldr (.) id (genericReplicate n s) z
   reify l@(LitInt    {}) = return (A.Lit l)
   reify l@(LitFloat  {}) = return (A.Lit l)
   reify l@(LitString {}) = return (A.Lit l)
@@ -183,9 +221,51 @@
       I.Var n vs   -> do
           x  <- liftTCM $ nameOfBV n `catchError` \_ -> freshName_ ("@" ++ show n)
           reifyApp (A.Var x) vs
-      I.Def x vs   -> reifyDisplayForm x vs $ do
-          n <- getDefFreeVars x
-          reifyApp (A.Def x) $ genericDrop n vs
+      I.Def x@(QName _ name) vs -> reifyDisplayForm x vs $ do
+        mdefn <- liftTCM $ (Just <$> getConstInfo x) `catchError` \_ -> return Nothing
+        (pad, vs) <-
+          case mdefn of
+            Nothing -> (,) [] <$> (flip genericDrop vs <$> getDefFreeVars x)
+            Just defn -> do
+              let def = theDef defn
+              -- This is tricky:
+              --  * getDefFreeVars x tells us how many arguments
+              --    are part of the local context
+              --  * some of those arguments might have been dropped
+              --    due to projection likeness
+              --  * when showImplicits is on we'd like to see the dropped
+              --    projection arguments
+
+              -- We should drop this many arguments from the local context.
+              n <- getDefFreeVars x
+              -- These are the dropped projection arguments
+              pad <- case def of
+                      Function{ funProjection = Just (_, np) } -> do
+                        TelV tel _ <- telView (defType defn)
+                        scope <- getScope
+                        let as       = take (np - 1) $ telToList tel
+                            whocares = A.Underscore (Info.MetaInfo noRange scope Nothing)
+                        return $ map (fmap $ const whocares) as
+                      _ -> return []
+              -- Now pad' ++ vs' = drop n (pad ++ vs)
+              let pad' = genericDrop n pad
+                  vs'  = genericDrop (max 0 (n - size pad)) vs
+              -- If showImplicit then keep the padding otherwise ignore it
+              ifM showImplicitArguments
+                  (return (pad', vs'))
+                  (return ([], vs'))
+        df <- displayFormsEnabled
+        if df && isPrefixOf extendlambdaname (show name)
+          then do
+           reportSLn "int2abs.reifyterm.def" 10 $ "reifying extended lambda with definition: " ++ show x
+           info <- getConstInfo x
+           cls <- mapM (reify . (NamedClause x)) $ defClauses info
+           -- Karim: Currently Abs2Conc does not require a DefInfo thus we
+           -- use __IMPOSSIBLE__.
+           reifyApp (A.ExtendedLam exprInfo __IMPOSSIBLE__ x cls) vs
+          else
+           let apps = foldl (\e a -> A.App exprInfo e (fmap unnamed a)) in
+           reifyApp (A.Def x `apps` pad) vs
       I.Con x vs   -> do
         isR <- isGeneratedRecordConstructor x
         case isR of
@@ -207,18 +287,37 @@
             apps (A.Con (AmbQ [x]), genericDrop n $ us ++ es)
       I.Lam h b    -> do
         (x,e) <- reify b
-        return $ A.Lam exprInfo (DomainFree h x) e
+        return $ A.Lam exprInfo (DomainFree h Relevant x) e
+        -- Andreas, 2011-04-07 we do not need relevance information at internal Lambda
       I.Lit l        -> reify l
-      I.Pi a b       -> do
-        Arg h r a <- reify a
-        (x,b)     <- reify b
-        return $ A.Pi exprInfo [TypedBindings noRange $ Arg h r [TBind noRange [x] a]] b
-      I.Fun a b    -> uncurry (A.Fun $ exprInfo)
-                      <$> reify (a,b)
+      I.Level l      -> reify l
+      I.Pi a b       -> case b of
+        NoAbs _ b -> uncurry (A.Fun $ exprInfo) <$> reify (a,b)
+        b         -> do
+          Arg h r a <- reify a
+          (x, b)    <- reify b
+          return $ A.Pi exprInfo [TypedBindings noRange $ Arg h r (TBind noRange [x] a)] b
       I.Sort s     -> reify s
       I.MetaV x vs -> apps =<< reify (x,vs)
-      I.DontCare   -> return A.DontCare
+      I.DontCare v -> A.DontCare <$> reify v
+{- Andreas: I want to see irrelevant, but not implicit arguments
+        ifM showImplicitArguments
+            (reify v)
+            (return A.DontCare)
+-}
+{- Andreas, 2011-09-09
+      I.DontCare Nothing  -> return A.DontCare
+      I.DontCare (Just v) -> reify v  -- leads to paradox error msg in test/fail/UnifyWithIrrelevantArgument
+-}
 
+instance Reify Elim Expr where
+  reify e = case e of
+    I.Apply v -> appl "apply" <$> reify v
+    I.Proj f  -> appl "proj"  <$> reify (defaultArg $ I.Def f [])
+    where
+      appl :: String -> Arg Expr -> Expr
+      appl s v = A.App exprInfo (A.Lit (LitString noRange s)) $ fmap unnamed v
+
 data NamedClause = NamedClause QName I.Clause
 -- Named clause does not need 'Recursion' flag since I.Clause has it
 -- data NamedClause = NamedClause QName Recursion I.Clause
@@ -226,11 +325,10 @@
 instance Reify ClauseBody RHS where
   reify NoBody     = return AbsurdRHS
   reify (Body v)   = RHS <$> reify v
-  reify (NoBind b) = reify b
   reify (Bind b)   = reify $ absBody b  -- the variables should already be bound
 
-stripImplicits :: MonadTCM tcm => [NamedArg A.Pattern] -> [A.Pattern] ->
-                  tcm ([NamedArg A.Pattern], [A.Pattern])
+stripImplicits :: [NamedArg A.Pattern] -> [A.Pattern] ->
+                  TCM ([NamedArg A.Pattern], [A.Pattern])
 stripImplicits ps wps =
   ifM showImplicitArguments (return (ps, wps)) $ do
   let vars = dotVars (ps, wps)
@@ -305,7 +403,10 @@
         varOrDot A.ImplicitP{} = True
         varOrDot _             = False
 
-
+-- | @dotVars ps@ gives all the variables inside of dot patterns of @ps@
+--   It is only invoked for patternish things. (Ulf O-tone!)
+--   Use it for printing l.h.sides: which of the implicit arguments
+--   have to be made explicit.
 class DotVars a where
   dotVars :: a -> Set Name
 
@@ -321,9 +422,14 @@
 instance (DotVars a, DotVars b) => DotVars (a, b) where
   dotVars (x, y) = Set.union (dotVars x) (dotVars y)
 
+
+instance DotVars A.Clause where
+  dotVars (A.Clause _ rhs []) = dotVars rhs
+  dotVars (A.Clause _ rhs (_:_)) = __IMPOSSIBLE__ -- cannot contain where clauses?
+
 instance DotVars A.Pattern where
   dotVars p = case p of
-    A.VarP _      -> Set.empty
+    A.VarP _      -> Set.empty   -- do not add pattern vars
     A.ConP _ _ ps -> dotVars ps
     A.DefP _ _ ps -> dotVars ps
     A.DotP _ e    -> dotVars e
@@ -333,10 +439,13 @@
     A.ImplicitP _ -> Set.empty
     A.AsP _ _ p   -> dotVars p
 
+-- | Getting all(!) variables of an expression.
+--   It should only get free ones, but it does not matter to include
+--   the bound ones.
 instance DotVars A.Expr where
   dotVars e = case e of
     A.ScopedExpr _ e -> dotVars e
-    A.Var x          -> Set.singleton x
+    A.Var x          -> Set.singleton x -- add any expression variable
     A.Def _          -> Set.empty
     A.Con _          -> Set.empty
     A.Lit _          -> Set.empty
@@ -346,17 +455,27 @@
     A.WithApp _ e es -> dotVars (e, es)
     A.Lam _ _ e      -> dotVars e
     A.AbsurdLam _ _  -> Set.empty
+    A.ExtendedLam _ _ _ cs -> dotVars cs
     A.Pi _ tel e     -> dotVars (tel, e)
     A.Fun _ a b      -> dotVars (a, b)
     A.Set _ _        -> Set.empty
     A.Prop _         -> Set.empty
     A.Let _ _ _      -> __IMPOSSIBLE__
     A.Rec _ es       -> dotVars $ map snd es
+    A.RecUpdate _ e es -> dotVars (e, map snd es)
     A.ETel _         -> __IMPOSSIBLE__
     A.QuoteGoal {}   -> __IMPOSSIBLE__
     A.Quote {}       -> __IMPOSSIBLE__
-    A.DontCare       -> __IMPOSSIBLE__  -- Set.empty
+    A.QuoteTerm {}   -> __IMPOSSIBLE__
+    A.Unquote {}     -> __IMPOSSIBLE__
+    A.DontCare v     -> dotVars v
 
+instance DotVars RHS where
+  dotVars (RHS e) = dotVars e
+  dotVars AbsurdRHS = Set.empty
+  dotVars (WithRHS _ es clauses) = __IMPOSSIBLE__ -- NZ
+  dotVars (RewriteRHS _ es rhs _) = __IMPOSSIBLE__ -- NZ
+
 instance DotVars TypedBindings where
   dotVars (TypedBindings _ bs) = dotVars bs
 
@@ -364,8 +483,7 @@
   dotVars (TBind _ _ e) = dotVars e
   dotVars (TNoBind e)   = dotVars e
 
-reifyPatterns :: MonadTCM tcm =>
-  I.Telescope -> Permutation -> [Arg I.Pattern] -> tcm [NamedArg A.Pattern]
+reifyPatterns :: I.Telescope -> Permutation -> [Arg I.Pattern] -> TCM [NamedArg A.Pattern]
 reifyPatterns tel perm ps = evalStateT (reifyArgs ps) 0
   where
     reifyArgs as = map (fmap unnamed) <$> mapM reifyArg as
@@ -388,8 +506,7 @@
         tick
         if Set.member "()" vars
           then return $ A.DotP i $ A.Underscore mi
-          else lift $ A.DotP i <$> reify v
-      I.LitP (LitLevel {}) -> __IMPOSSIBLE__
+          else return $ A.DotP i t
       I.LitP l             -> return (A.LitP l)
       I.ConP c _ ps -> A.ConP i (AmbQ [c]) <$> reifyArgs ps
       where
@@ -418,46 +535,43 @@
     reify s =
         do  s <- instantiateFull s
             case s of
-                I.Type (I.Lit (LitLevel _ n)) -> return $ A.Set exprInfo n
+                I.Type (I.Max [])                -> return $ A.Set exprInfo 0
+                I.Type (I.Max [I.ClosedLevel n]) -> return $ A.Set exprInfo n
                 I.Type a -> do
                   a <- reify a
                   return $ A.App exprInfo (A.Set exprInfo 0)
                                           (defaultArg (unnamed a))
                 I.Prop       -> return $ A.Prop exprInfo
-                I.MetaS x as -> apps =<< reify (x, as)
-                I.Suc s      ->
-                    do  suc <- freshName_ "suc" -- TODO: hack
-                        e   <- reify s
-                        return $ A.App exprInfo (A.Var suc) (defaultArg $ unnamed e)
                 I.Inf       -> A.Var <$> freshName_ "Setω"
                 I.DLub s1 s2 -> do
                   lub <- freshName_ "dLub" -- TODO: hack
                   (e1,e2) <- reify (s1, I.Lam NotHidden $ fmap Sort s2)
                   let app x y = A.App exprInfo x (defaultArg $ unnamed y)
                   return $ A.Var lub `app` e1 `app` e2
-                I.Lub s1 s2 ->
-                    do  lub <- freshName_ "\\/" -- TODO: hack
-                        (e1,e2) <- reify (s1,s2)
-                        let app x y = A.App exprInfo x (defaultArg $ unnamed y)
-                        return $ A.Var lub `app` e1 `app` e2
 
-instance Reify i a => Reify (Abs i) (Name, a) where
-    reify (Abs s v) =
-        do  x <- freshName_ s
-            e <- addCtx x (defaultArg $ sort I.Prop) -- type doesn't matter
-                 $ reify v
-            return (x,e)
+instance Reify Level Expr where
+  reify l = reify =<< reallyUnLevelView l
 
+instance (Free i, Reify i a) => Reify (Abs i) (Name, a) where
+  reify (NoAbs x v) = (,) <$> freshName_ x <*> reify v
+  reify (Abs s v) = do
+
+    -- If the bound variable is free in the body, then the name "_" is
+    -- replaced by "z".
+    s <- return $ if s == "_" && 0 `freeIn` v then "z" else s
+
+    x <- freshName_ s
+    e <- addCtx x (defaultArg $ sort I.Prop) -- type doesn't matter
+         $ reify v
+    return (x,e)
+
 instance Reify I.Telescope A.Telescope where
   reify EmptyTel = return []
   reify (ExtendTel arg tel) = do
     Arg h rel e <- reify arg
-    (x,bs)  <- reify $ betterName tel
+    (x,bs)  <- reify tel
     let r = getRange e
-    return $ TypedBindings r (Arg h rel [TBind r [x] e]) : bs
-    where
-      betterName (Abs "_" x) = Abs "z" x
-      betterName (Abs s   x) = Abs s   x
+    return $ TypedBindings r (Arg h rel (TBind r [x] e)) : bs
 
 instance Reify i a => Reify (Arg i) (Arg a) where
     reify = traverse reify
@@ -471,4 +585,4 @@
 instance (Reify t t', Reify a a')
          => Reify (Judgement t a) (Judgement t' a') where
     reify (HasType i t) = HasType <$> reify i <*> reify t
-    reify (IsSort i) = IsSort <$> reify i
+    reify (IsSort  i t) = IsSort  <$> reify i <*> reify t
diff --git a/src/full/Agda/Termination/SparseMatrix.hs b/src/full/Agda/Termination/SparseMatrix.hs
--- a/src/full/Agda/Termination/SparseMatrix.hs
+++ b/src/full/Agda/Termination/SparseMatrix.hs
@@ -134,7 +134,7 @@
     showString "Agda.Termination.Matrix.fromLists " . shows (size m) .
     showString " " . shows (toLists m)
 
-instance (Integral i, HasZero b, Pretty b) =>
+instance (Show i, Integral i, HasZero b, Pretty b) =>
          Pretty (Matrix i b) where
   pretty = vcat . map (hsep . map pretty) . toLists
 
@@ -142,7 +142,7 @@
          => Arbitrary (Matrix i b) where
   arbitrary     = matrix =<< arbitrary
 
-instance (Ord i, Integral i, Enum i, CoArbitrary b, HasZero b) => CoArbitrary (Matrix i b) where
+instance (Show i, Ord i, Integral i, Enum i, CoArbitrary b, HasZero b) => CoArbitrary (Matrix i b) where
   coarbitrary m = coarbitrary (toLists m)
 
 
@@ -199,7 +199,7 @@
 
 -- | Converts a sparse matrix to a sparse list of rows
 
-toSparseRows :: (Num i, Enum i) => Matrix i b -> [(i,[(i,b)])]
+toSparseRows :: (Eq i, Num i, Enum i) => Matrix i b -> [(i,[(i,b)])]
 toSparseRows m = aux 1 [] (unM m)
   where aux i' [] []  = []
         aux i' row [] = [(i', reverse row)]
@@ -208,7 +208,7 @@
             | otherwise = (i', reverse row) : aux i [(j,b)] m
 
 -- sparse vectors cannot have two entries in one column
-blowUpSparseVec :: (Ord i, Num i, Enum i) => b -> i -> [(i,b)] -> [b]
+blowUpSparseVec :: (Show i, Ord i, Num i, Enum i) => b -> i -> [(i,b)] -> [b]
 blowUpSparseVec zero n l = aux 1 l
   where aux i [] | i > n = []
                  | otherwise = zero : aux (i+1) []
@@ -219,7 +219,7 @@
 
 -- | Converts a matrix to a list of row lists.
 
-toLists :: (Ord i, Integral i, Enum i, HasZero b) => Matrix i b -> [[b]]
+toLists :: (Show i, Ord i, Integral i, Enum i, HasZero b) => Matrix i b -> [[b]]
 toLists m = blowUpSparseVec emptyRow (rows sz) $
     map (\ (i,r) -> (i, blowUpSparseVec zeroElement (cols sz) r)) $ toSparseRows m
 --            [ [ maybe zeroElement id $ lookup (MIx { row = r, col = c }) (unM m)
@@ -355,7 +355,7 @@
 --
 -- Precondition: @'square' m@.
 
-diagonal :: (Enum i, Num i, Ix i, HasZero b) => Matrix i b -> Array i b
+diagonal :: (Show i, Enum i, Num i, Ix i, HasZero b) => Matrix i b -> Array i b
 diagonal m = listArray (1, rows sz) $ blowUpSparseVec zeroElement (rows sz) $
   map (\ ((MIx i j),b) -> (i,b)) $ filter (\ ((MIx i j),b) -> i==j) (unM m)
   where sz = size m
diff --git a/src/full/Agda/Termination/TermCheck.hs b/src/full/Agda/Termination/TermCheck.hs
--- a/src/full/Agda/Termination/TermCheck.hs
+++ b/src/full/Agda/Termination/TermCheck.hs
@@ -12,6 +12,7 @@
     , Result, DeBruijnPat
     ) where
 
+import Control.Applicative
 import Control.Monad.Error
 import Data.List as List
 import qualified Data.Map as Map
@@ -19,7 +20,6 @@
 import qualified Data.Maybe as Maybe
 import qualified Data.Set as Set
 import Data.Set (Set)
-import Text.PrettyPrint (Doc)
 
 import qualified Agda.Syntax.Abstract as A
 import Agda.Syntax.Internal
@@ -44,6 +44,8 @@
 import Agda.TypeChecking.Monad.Builtin
 import Agda.TypeChecking.Monad.Signature (isProjection)
 import Agda.TypeChecking.Primitive (constructorForm)
+import Agda.TypeChecking.Level (reallyUnLevelView)
+import Agda.TypeChecking.Substitute
 
 import qualified Agda.Interaction.Highlighting.Range as R
 import Agda.Interaction.Options
@@ -54,15 +56,12 @@
 #include "../undefined.h"
 import Agda.Utils.Impossible
 
-type Calls = Term.CallGraph (Set R.Range)
+type Calls = Term.CallGraph (Set CallInfo)
 type MutualNames = [QName]
 
--- | The result of termination checking a module is a list of
--- problematic mutual blocks (represented by the names of the
--- functions in the block), along with the ranges for the problematic
--- call sites (call site paths).
+-- | The result of termination checking a module.
 
-type Result = [([A.QName], [R.Range])]
+type Result = [TerminationError]
 
 -- | Termination check a sequence of declarations.
 termDecls :: [A.Declaration] -> TCM Result
@@ -77,13 +76,13 @@
     A.Axiom {}            -> return []
     A.Field {}            -> return []
     A.Primitive {}        -> return []
-    A.Definition _ _ ds
-      | [A.RecDef _ r _ _ _ rds] <- unscopeDefs ds
+    A.Mutual _ ds
+      | [A.RecSig{}, A.RecDef _ r _ _ _ rds] <- unscopeDefs ds
                           -> do
         let m = mnameFromList $ qnameToList r
         setScopeFromDefs ds
         termSection m rds
-    A.Definition i ts ds  -> termMutual i ts ds
+    A.Mutual i ds  -> termMutual i ds
     A.Section _ x _ ds    -> termSection x ds
     A.Apply {}            -> return []
     A.Import {}           -> return []
@@ -92,15 +91,20 @@
         -- open is just an artifact from the concrete syntax
     A.ScopedDecl{}        -> __IMPOSSIBLE__
         -- taken care of above
+    -- These should all be wrapped in mutual blocks
+    A.FunDef{}  -> __IMPOSSIBLE__
+    A.DataSig{} -> __IMPOSSIBLE__
+    A.DataDef{} -> __IMPOSSIBLE__
+    A.RecSig{}  -> __IMPOSSIBLE__
+    A.RecDef{}  -> __IMPOSSIBLE__
   where
     setScopeFromDefs = mapM_ setScopeFromDef
-    setScopeFromDef (A.ScopedDef scope d) =
-      setScope scope >> setScopeFromDef d
+    setScopeFromDef (A.ScopedDecl scope d) = setScope scope
     setScopeFromDef _ = return ()
 
     unscopeDefs = concatMap unscopeDef
 
-    unscopeDef (A.ScopedDef _ d) = unscopeDef d
+    unscopeDef (A.ScopedDecl _ ds) = unscopeDefs ds
     unscopeDef d = [d]
 
 collectCalls :: (a -> TCM Calls) -> [a] -> TCM Calls
@@ -110,8 +114,8 @@
                              return (c1 `Term.union` c2)
 
 -- | Termination check a bunch of mutually inductive recursive definitions.
-termMutual :: Info.DeclInfo -> [A.TypeSignature] -> [A.Definition] -> TCM Result
-termMutual i ts ds = if names == [] then return [] else
+termMutual :: Info.DeclInfo -> [A.Declaration] -> TCM Result
+termMutual i ds = if names == [] then return [] else
   do -- get list of sets of mutually defined names from the TCM
      -- this includes local and auxiliary functions introduced
      -- during type-checking
@@ -175,24 +179,24 @@
                    ]
                  return $ Term.terminates calls2
      case r of
-       Left  errDesc -> do
-         let callSites = Set.toList errDesc
-         return [(names, callSites)] -- TODO: this could be changed to
-                                     -- [(allNames, callSites)]
+       Left calls -> do
+         return [TerminationError
+                   { termErrFunctions = names
+                     -- TODO: This could be changed to allNames.
+                   , termErrCalls     = Set.toList calls
+                   }
+                ]
        Right _ -> do
          reportSLn "term.warn.yes" 2
                      (show (names) ++ " does termination check")
          return []
   where
   getName (A.FunDef i x cs)       = [x]
-  getName (A.ScopedDef _ d)       = getName d
-  getName (A.RecDef _ _ _ _ _ ds) = concatMap getNameD ds
-  getName _                       = []
-
-  getNameD (A.Definition _ _ ds) = concatMap getName ds
-  getNameD (A.Section _ _ _ ds)  = concatMap getNameD ds
-  getNameD (A.ScopedDecl _ ds)   = concatMap getNameD ds
-  getNameD _                     = []
+  getName (A.RecDef _ _ _ _ _ ds) = concatMap getName ds
+  getName (A.Mutual _ ds)       = concatMap getName ds
+  getName (A.Section _ _ _ ds)  = concatMap getName ds
+  getName (A.ScopedDecl _ ds)   = concatMap getName ds
+  getName _                     = []
 
   -- the mutual names mentioned in the abstract syntax
   names = concatMap getName ds
@@ -225,8 +229,7 @@
 	      ]
         case (theDef def) of
           Function{ funClauses = cls } ->
-            collectCalls (termClause use names name) $
-              map translatedClause cls
+            collectCalls (termClause use names name) cls
           _ -> return Term.empty
 
 
@@ -300,7 +303,7 @@
 termToDBP conf t
   | not $ useDotPatterns conf = return $ unusedVar
   | otherwise                 = do
-    t <- constructorForm t
+    t <- stripProjections =<< constructorForm t
     case t of
       Var i []    -> return $ VarDBP i
       Con c args  -> ConDBP c <$> mapM (termToDBP conf . unArg) args
@@ -335,12 +338,8 @@
 -}
 stripBind :: DBPConf -> Nat -> Pattern -> ClauseBody -> TCM (Maybe (Nat, DeBruijnPat, ClauseBody))
 stripBind _ _ _ NoBody            = return Nothing
-stripBind conf i (VarP x) (NoBind b) = return $ Just (i, unusedVar, b)
 stripBind conf i (VarP x) (Bind b)   = return $ Just (i - 1, VarDBP i, absBody b)
 stripBind conf i (VarP x) (Body b)   = __IMPOSSIBLE__
-stripBind conf i (DotP t) (NoBind b) = do
-  t <- termToDBP conf t
-  return $ Just (i, t, b)
 stripBind conf i (DotP t) (Bind b)   = do
   t <- termToDBP conf t
   return $ Just (i - 1, t, absBody b)
@@ -374,8 +373,9 @@
 termClause use names name (Clause { clauseTel  = tel
                                   , clausePerm = perm
                                   , clausePats = argPats'
-                                  , clauseBody = body }) = do
-    argPats' <- addCtxTel tel $ normalise argPats'
+                                  , clauseBody = body }) =
+  addCtxTel tel $ do
+    argPats' <- normalise argPats'
     -- The termination checker doesn't know about reordered telescopes
     let argPats = substs (renamingR perm) argPats'
     dbs <- stripBinds use (nVars - 1) (map unArg argPats) body
@@ -390,7 +390,6 @@
   where
     nVars = boundVars body
     boundVars (Bind b)   = 1 + boundVars (absBody b)
-    boundVars (NoBind b) = boundVars b
     boundVars NoBody     = 0
     boundVars (Body _)   = 0
 
@@ -416,17 +415,15 @@
        loopSort :: (?cutoff :: Int) => [DeBruijnPat] -> Sort -> TCM Calls
        loopSort pats s = do
          case s of
-           Type t -> loop pats Term.unknown t
+           Type (Max [])              -> return Term.empty
+           Type (Max [ClosedLevel _]) -> return Term.empty
+           Type t -> loop pats Term.unknown (Level t)
            Prop   -> return Term.empty
            Inf    -> return Term.empty
-           Lub s1 s2 -> liftM2 Term.union
-             (loopSort pats s1)
-             (loopSort pats s2)
-           DLub s1 (Abs x s2) -> liftM2 Term.union
+           DLub s1 (NoAbs x s2) -> Term.union <$> loopSort pats s1 <*> loopSort pats s2
+           DLub s1 (Abs x s2)   -> liftM2 Term.union
              (loopSort pats s1)
-             (loopSort (map liftDBP pats) s2)
-           Suc s -> loopSort pats s
-           MetaS _ _ -> return Term.empty  -- see comment on MetaV below
+             (addCtxString x __IMPOSSIBLE__ $ loopSort (map liftDBP pats) s2)
 
        loopType :: (?cutoff :: Int) => [DeBruijnPat] -> Order -> Type -> TCM Calls
        loopType pats guarded (El s t) = liftM2 Term.union
@@ -472,8 +469,8 @@
                args2 <- mapM instantiateFull args1
 
                -- We have to reduce constructors in case they're reexported.
-               let reduceCon t@(Con _ _) = reduce t
-                   reduceCon t           = return t
+               let reduceCon (Con c vs) = (`apply` vs) <$> reduce (Con c [])  -- make sure we don't reduce the arguments
+                   reduceCon t          = return t
                args2 <- mapM reduceCon args2
                args  <- mapM etaContract args2
 
@@ -482,7 +479,7 @@
                isProj <- isProjection g
                let unguards = repeat Term.unknown
                let guards = maybe unguards -- not a proj. ==> unguarded
-                              (\ n -> take (n - 1) unguards ++ guarded : unguards)
+                              (\ _ -> guarded : unguards)
                                 -- proj. => preserve g. of princ. arg. (counting starts with 1)
                               isProj
                -- collect calls in the arguments of this call
@@ -516,30 +513,33 @@
                                <+> hsep (map prettyTCM pats)
                             , nest 2 $ text "to" <+> prettyTCM g <+>
                                         hsep (map (parens . prettyTCM) args)
-                            , nest 2 $ text ("call matrix (with guardeness): " ++ show matrix')
+                            , nest 2 $ text ("call matrix (with guardedness): " ++ show matrix')
                             ])
 
+                     doc <- prettyTCM (Def g args0)
                      return
                        (Term.insert
                          (Term.Call { Term.source = fInd
                                     , Term.target = toInteger gInd'
                                     , Term.cm     = makeCM ncols nrows matrix'
                                     })
-                         -- Note that only the base part of the
-                         -- name is collected here.
-                         (Set.fromList $ fst $ R.getRangesA g)
+                         (Set.singleton
+                            (CallInfo { callInfoRange = getRange g
+                                      , callInfoCall  = show doc
+                                      }))
                          calls)
 
 
          case t of
 
             -- Constructed value.
-            Con c args ->
-              constructor c Inductive $ zip args (repeat True)
+            Con c args
+              | Just c == sharp conf ->
+                constructor c CoInductive $ zip args (repeat True)
+              | otherwise ->
+                constructor c Inductive $ zip args (repeat True)
 
             Def g args0
-              | Just g == sharp conf ->
-                constructor g CoInductive $ zip args0 (repeat True)
               | guardingTypeConstructors conf -> do
                 gDef <- theDef <$> getConstInfo g
                 case gDef of
@@ -550,7 +550,8 @@
               where
               -- Data or record type constructor.
               con occs =
-                constructor g Inductive $
+                constructor g Inductive $   -- guardedness preserving
+                -- constructor g CoInductive $ -- guarding! (Andreas, 2011-04-10) -- does not work, might lead to infinite unfolding in eq. checking (Ripley!)
                   zip args0 (map preserves occs ++ repeat False)
                 where
                 preserves Positive = True
@@ -561,19 +562,25 @@
               fun = function g args0
 
             -- Abstraction. Preserves guardedness.
-            Lam h (Abs x t) -> loop (map liftDBP pats) guarded t
+            Lam h (Abs x t) -> addCtxString x (Arg { argHiding    = h
+                                                   , argRelevance = __IMPOSSIBLE__
+                                                   , unArg        = __IMPOSSIBLE__
+                                                   }) $
+              loop (map liftDBP pats) guarded t
+            Lam h (NoAbs _ t) -> loop pats guarded t
 
             -- Neutral term. Destroys guardedness.
             Var i args -> collectCalls (loop pats Term.unknown) (map unArg args)
 
             -- Dependent function space.
-            Pi a (Abs _ b) ->
+            Pi a (Abs x b) ->
                do g1 <- loopType pats Term.unknown (unArg a)
-                  g2 <- loopType (map liftDBP pats) piArgumentGuarded b
+                  g2 <- addCtxString x a $
+                        loopType (map liftDBP pats) piArgumentGuarded b
                   return $ g1 `Term.union` g2
 
             -- Non-dependent function space.
-            Fun a b ->
+            Pi a (NoAbs _ b) ->
                do g1 <- loopType pats Term.unknown (unArg a)
                   g2 <- loopType pats piArgumentGuarded b
                   return $ g1 `Term.union` g2
@@ -588,15 +595,19 @@
 	    -- will be a warning for them anyway.
             MetaV x args -> return Term.empty
 
-            -- Erased proof.
-            DontCare -> return Term.empty
+            -- Erased and not-yet-erased proof.
+            DontCare t -> loop pats guarded t
 
+            -- Level.
+            Level l -> loop pats guarded =<< reallyUnLevelView l
+
          where
          -- Should function and Π type constructors be treated as
          -- preserving guardedness in their right arguments?
          piArgumentGuarded =
            if guardingTypeConstructors conf then
-             guarded
+             guarded   -- preserving guardedness
+             -- Term.lt      -- guarding! (Andreas, 2011-04-10)  -- SEE ABOVE
             else
              Term.unknown
 
@@ -657,17 +668,61 @@
   LitDBP _    -> []
 
 compareTerm :: (?cutoff :: Int) => Maybe QName -> Term -> DeBruijnPat -> TCM Term.Order
-compareTerm suc t p = compareTerm' suc t p
+compareTerm suc t p = do
+  t <- stripAllProjections t
+  compareTerm' suc t p
+
 {-
 compareTerm t p = Term.supremum $ compareTerm' t p : map cmp (subPatterns p)
   where
     cmp p' = (Term..*.) Term.lt (compareTerm' t p')
 -}
 
+-- | Remove projections until a term is no longer a projection.
+--   Also, remove 'DontCare's.
+stripProjections :: Term -> TCM Term
+stripProjections (DontCare t) = stripProjections t
+stripProjections t@(Def qn ts@(~(r : _))) = do
+  isProj <- isProjection qn
+  case isProj of
+    Just{} | not (null ts) -> stripProjections $ unArg r
+    _ -> return t
+stripProjections t = return t
+
+-- | Remove all projections from an algebraic term (not going under binders).
+class StripAllProjections a where
+  stripAllProjections :: a -> TCM a
+
+instance StripAllProjections a => StripAllProjections (Arg a) where
+  stripAllProjections (Arg h r a) = Arg h r <$> stripAllProjections a
+
+instance StripAllProjections a => StripAllProjections [a] where
+  stripAllProjections = mapM stripAllProjections
+
+instance StripAllProjections Term where
+  stripAllProjections t = do
+    t <- stripProjections t
+    case t of
+      Con c ts -> Con c <$> stripAllProjections ts
+      Def d ts -> Def d <$> stripAllProjections ts
+      _ -> return t
+
+{-
+-- | Remove all projections from an algebraic term (not going under binders).
+stripAllProjections :: Term -> TCM Term
+stripAllProjections t = do
+  t <- stripProjections t
+  case t of
+    Con c ts -> Con c <$> mapM stripAllProjections ts
+    Def d ts -> Def d <$> mapM stripAllProjections ts
+    _ -> return t
+-}
+
 -- | compareTerm t dbpat
 --   Precondition: top meta variable resolved
 compareTerm' :: (?cutoff :: Int) => Maybe QName -> Term -> DeBruijnPat -> TCM Term.Order
-compareTerm' _ (Var i _)  p              = compareVar i p
+compareTerm' _ (Var i _)      p = compareVar i p
+compareTerm' suc (DontCare t) p = compareTerm' suc t p
 compareTerm' _ (Lit l)    (LitDBP l')
   | l == l'   = return Term.le
   | otherwise = return Term.unknown
@@ -676,17 +731,19 @@
   case t of
     Lit _ -> return Term.unknown
     _     -> compareTerm' suc t p
+-- Andreas, 2011-04-19 give subterm priority over matrix order
+compareTerm' _ t@Con{} (ConDBP c ps)
+  | any (isSubTerm t) ps = decreaseFromConstructor c
 compareTerm' suc (Con c ts) (ConDBP c' ps)
   | c == c' = compareConArgs suc ts ps
 compareTerm' suc (Def s ts) (ConDBP s' ps)
   | s == s' && Just s == suc = compareConArgs suc ts ps
-compareTerm' _ t@Con{} (ConDBP c ps)
-  | any (isSubTerm t) ps = decreaseFromConstructor c
 -- new cases for counting constructors / projections
 -- register also increase
 compareTerm' suc (Def s ts) p | Just s == suc = do
     os <- mapM (\ t -> compareTerm' suc (unArg t) p) ts
     return $ decr (-1) .*. infimum os
+{- Andreas 2011-07-07 Projections are now being removed in a preprocess
 -- projections are size preserving
 compareTerm' suc (Def qn ts) p = do
     isProj <- isProjection qn
@@ -696,10 +753,12 @@
         compareTerm' suc (unArg (ts !! (n - 1))) p
       -- not a projection or underapplied:
       _ -> return Term.unknown
+-}
 compareTerm' suc (Con c ts) p = do
     os <- mapM (\ t -> compareTerm' suc (unArg t) p) ts
     oc <- increaseFromConstructor c
     return $ if (null os) then Term.unknown else oc .*. infimum os
+compareTerm' suc t p | isSubTerm t p = return Term.le
 compareTerm' _ _ _ = return Term.unknown
 
 -- TODO: isSubTerm should compute a size difference (Term.Order)
diff --git a/src/full/Agda/TypeChecking/Abstract.hs b/src/full/Agda/TypeChecking/Abstract.hs
--- a/src/full/Agda/TypeChecking/Abstract.hs
+++ b/src/full/Agda/TypeChecking/Abstract.hs
@@ -14,7 +14,7 @@
 piAbstractTerm :: Term -> Type -> Type -> Type
 piAbstractTerm v a b = fun a (abstractTerm v b)
   where
-    fun a b = El s $ Pi (Arg NotHidden Relevant a) $ Abs "w" b
+    fun a b = El s $ Pi (Arg NotHidden Relevant a) $ mkAbs "w" b
       where s = (sLub `on` getSort) a b
 
 class AbstractTerm a where
@@ -29,38 +29,55 @@
     Def c vs    -> Def c $ absT vs
     Con c vs    -> Con c $ absT vs
     Pi a b      -> uncurry Pi $ absT (a, b)
-    Fun a b      -> uncurry Fun $ absT (a, b)
     Lit l       -> Lit l
+    Level l     -> Level $ absT l
     Sort s      -> Sort $ absT s
     MetaV m vs  -> MetaV m $ absT vs
-    DontCare    -> DontCare
+    DontCare mv -> DontCare $ absT mv
     where
       absT x = abstractTerm u x
 
 instance AbstractTerm Type where
-  abstractTerm u (El s v) = El s $ abstractTerm u v
+  abstractTerm u (El s v) = El (abstractTerm u s) (abstractTerm u v)
 
 instance AbstractTerm Sort where
   abstractTerm u s = case s of
     Type n     -> Type $ absS n
     Prop       -> Prop
-    Suc s      -> Suc $ absS s
-    Lub s1 s2  -> Lub (absS s1) (absS s2)
-    MetaS m as -> MetaS m (absS as)
     Inf        -> Inf
     DLub s1 s2 -> DLub (absS s1) (absS s2)
     where absS x = abstractTerm u x
 
+instance AbstractTerm Level where
+  abstractTerm u (Max as) = Max $ abstractTerm u as
+
+instance AbstractTerm PlusLevel where
+  abstractTerm u l@ClosedLevel{} = l
+  abstractTerm u (Plus n l) = Plus n $ abstractTerm u l
+
+instance AbstractTerm LevelAtom where
+  abstractTerm u l = case l of
+    MetaLevel m vs   -> MetaLevel m    $ abstractTerm u vs
+    NeutralLevel v   -> NeutralLevel   $ abstractTerm u v
+    BlockedLevel _ v -> UnreducedLevel $ abstractTerm u v -- abstracting might remove the blockage
+    UnreducedLevel v -> UnreducedLevel $ abstractTerm u v
+
 instance AbstractTerm a => AbstractTerm (Arg a) where
   abstractTerm = fmap . abstractTerm
 
 instance AbstractTerm a => AbstractTerm [a] where
   abstractTerm = fmap . abstractTerm
 
-instance (Subst a, AbstractTerm a) => AbstractTerm (Abs a) where
-  abstractTerm u (Abs x v) = Abs x $ swap $ abstractTerm (raise 1 u) v
+instance AbstractTerm a => AbstractTerm (Maybe a) where
+  abstractTerm = fmap . abstractTerm
+
+instance (Raise a, AbstractTerm a) => AbstractTerm (Abs a) where
+  abstractTerm u (NoAbs x v) = NoAbs x $ abstractTerm u v
+  abstractTerm u (Abs   x v) = Abs x $ rename swap $ abstractTerm (raise 1 u) v
     where
-      swap = substs $ [Var 1 [], Var 0 []] ++ [Var i [] | i <- [2..]]
+      swap 0 = 1
+      swap 1 = 0
+      swap i = i
 
 instance (AbstractTerm a, AbstractTerm b) => AbstractTerm (a, b) where
   abstractTerm u (x, y) = (abstractTerm u x, abstractTerm u y)
diff --git a/src/full/Agda/TypeChecking/CompiledClause.hs b/src/full/Agda/TypeChecking/CompiledClause.hs
--- a/src/full/Agda/TypeChecking/CompiledClause.hs
+++ b/src/full/Agda/TypeChecking/CompiledClause.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE TypeOperators, CPP, DeriveDataTypeable #-}
+{-# LANGUAGE TypeOperators, CPP, DeriveDataTypeable, DeriveFunctor #-}
 module Agda.TypeChecking.CompiledClause where
 
 import qualified Data.Map as Map
@@ -9,80 +9,33 @@
 import Agda.Syntax.Common
 import Agda.Syntax.Internal
 import Agda.Syntax.Literal
-import Agda.Utils.List
 import Agda.Utils.Pretty
 
-import Agda.Utils.Impossible
-#include "../undefined.h"
-
 type key :-> value = Map key value
 
 data Case c = Branches { conBranches    :: QName   :-> c
                        , litBranches    :: Literal :-> c
                        , catchAllBranch :: Maybe c
                        }
-  deriving (Typeable, Data)
+  deriving (Typeable, Data, Functor)
 
 data CompiledClauses
   = Case Int (Case CompiledClauses)
-  | Done Int Term
+    -- ^ @Case n bs@ stands for a match on the @n@-th argument
+    -- (counting from zero) with @bs@ as the case branches.
+  | Done [Arg String] Term
+    -- ^ @Done xs b@ stands for the body @b@ where the @xs@ contains hiding
+    --   and name suggestions for the free variables. This is needed to build
+    --   lambdas on the right hand side for partial applications which can
+    --   still reduce.
   | Fail
+    -- ^ Absurd case.
   deriving (Typeable, Data)
 
--- | Note that it is the /translated/ clauses which are compiled, not
--- the original ones.
-
-compileClauses :: [Clauses] -> CompiledClauses
-compileClauses cs =
-  compile [ (clausePats c, clauseBody c)
-          | Clauses { translatedClause = c } <- cs
-          ]
-
-type Cl  = ([Arg Pattern], ClauseBody)
-type Cls = [Cl]
-
-compile :: Cls -> CompiledClauses
-compile cs = case nextSplit cs of
-  Just n  -> Case n $ fmap compile $ splitOn n cs
-  Nothing -> case map getBody cs of
-    [Just (m, t)] -> Done m t
-    _             -> Fail
-  where
-    getBody (_, b) = body b
-    body (Bind b)   = inc $ body (absBody b)
-    body (NoBind b) = body b
-    body (Body t)   = Just (0, t)
-    body NoBody     = Nothing
-    inc Nothing       = Nothing
-    inc (Just (n, t)) = Just (n + 1, t)
-
-nextSplit :: Cls -> Maybe Int
-nextSplit [] = __IMPOSSIBLE__
-nextSplit ((ps, _):_) = mhead [ n | (a, n) <- zip ps [0..], isPat (unArg a) ]
-  where
-    isPat VarP{} = False
-    isPat DotP{} = False
-    isPat ConP{} = True
-    isPat LitP{} = True
-
-splitOn :: Int -> Cls -> Case Cls
-splitOn n cs = mconcat $ map (fmap (:[]) . splitC n) cs
-
-splitC :: Int -> Cl -> Case Cl
-splitC n (ps, b) = case unArg p of
-  ConP c _ qs -> conCase c (ps0 ++ qs ++ ps1, b)
-  LitP l      -> litCase l (ps0 ++ ps1, b)
-  _           -> catchAll (ps, b)
-  where
-    (ps0, p, ps1) = extractNthElement' n ps
-
 litCase l x = Branches Map.empty (Map.singleton l x) Nothing
 conCase c x = Branches (Map.singleton c x) Map.empty Nothing
 catchAll x  = Branches Map.empty Map.empty (Just x)
 
-instance Functor Case where
-  fmap f (Branches cs ls m) = Branches (fmap f cs) (fmap f ls) (fmap f m)
-
 instance Monoid m => Monoid (Case m) where
   mempty = Branches Map.empty Map.empty Nothing
   mappend (Branches cs  ls  m)
@@ -108,7 +61,7 @@
              | (x, v) <- Map.toList m ]
 
 instance Pretty CompiledClauses where
-  pretty (Done m t)  = text ("done[" ++ show m ++ "]") <+> text (show t)
+  pretty (Done hs t)  = text ("done" ++ show hs) <+> text (show t)
   pretty Fail        = text "fail"
   pretty (Case n bs) =
     sep [ text ("case " ++ show n ++ " of")
diff --git a/src/full/Agda/TypeChecking/CompiledClause/Compile.hs b/src/full/Agda/TypeChecking/CompiledClause/Compile.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/TypeChecking/CompiledClause/Compile.hs
@@ -0,0 +1,124 @@
+{-# LANGUAGE CPP #-}
+module Agda.TypeChecking.CompiledClause.Compile where
+
+import Data.Monoid
+import qualified Data.Map as Map
+import Data.List (genericReplicate, nubBy)
+import Data.Function
+
+import Agda.Syntax.Common
+import Agda.Syntax.Internal
+import Agda.TypeChecking.CompiledClause
+import Agda.TypeChecking.Monad
+import Agda.TypeChecking.RecordPatterns
+import Agda.TypeChecking.Substitute
+import Agda.TypeChecking.Pretty
+import Agda.Utils.List
+
+import Agda.Utils.Impossible
+#include "../../undefined.h"
+
+compileClauses ::
+  Bool -- ^ Translate record patterns?
+  -> [Clause] -> TCM CompiledClauses
+compileClauses translate cs = do
+  cs <- if translate then
+          mapM translateRecordPatterns cs
+         else
+          return cs
+  return $ compile [(clausePats c, clauseBody c) | c <- cs]
+
+type Cl  = ([Arg Pattern], ClauseBody)
+type Cls = [Cl]
+
+compile :: Cls -> CompiledClauses
+compile cs = case nextSplit cs of
+  Just n  -> Case n $ fmap compile $ splitOn n cs
+  Nothing -> case map getBody cs of
+    -- It's possible to get more than one clause here due to
+    -- catch-all expansion.
+    Just t : _  -> Done (map (fmap name) $ fst $ head cs) t
+    Nothing : _ -> Fail
+    []          -> __IMPOSSIBLE__
+  where
+    name (VarP x) = x
+    name (DotP _) = "_"
+    name ConP{} = __IMPOSSIBLE__
+    name LitP{} = __IMPOSSIBLE__
+    getBody (_, b) = body b
+    body (Bind b)   = body (absBody b)
+    body (Body t)   = Just t
+    body NoBody     = Nothing
+
+nextSplit :: Cls -> Maybe Int
+nextSplit [] = __IMPOSSIBLE__
+nextSplit ((ps, _):_) = mhead [ n | (a, n) <- zip ps [0..], isPat (unArg a) ]
+  where
+    isPat VarP{} = False
+    isPat DotP{} = False
+    isPat ConP{} = True
+    isPat LitP{} = True
+
+splitOn :: Int -> Cls -> Case Cls
+splitOn n cs = mconcat $ map (fmap (:[]) . splitC n) $ expandCatchAlls n cs
+
+splitC :: Int -> Cl -> Case Cl
+splitC n (ps, b) = case unArg p of
+  ConP c _ qs -> conCase c (ps0 ++ qs ++ ps1, b)
+  LitP l      -> litCase l (ps0 ++ ps1, b)
+  _           -> catchAll (ps, b)
+  where
+    (ps0, p, ps1) = extractNthElement' n ps
+
+-- Expand catch-alls that appear before actual matches.
+expandCatchAlls :: Int -> Cls -> Cls
+expandCatchAlls n cs = case cs of
+  _            | all (isCatchAll . nth . fst) cs -> cs
+  (ps, b) : cs | not (isCatchAll (nth ps)) -> (ps, b) : expandCatchAlls n cs
+               | otherwise -> map (expand ps b) expansions ++ (ps, b) : expandCatchAlls n cs
+  _ -> __IMPOSSIBLE__
+  where
+    isCatchAll (Arg _ _ ConP{}) = False
+    isCatchAll (Arg _ _ LitP{}) = False
+    isCatchAll _      = True
+    nth qs = p
+      where (_, p, _) = extractNthElement' n qs
+
+    classify (LitP l)     = Left l
+    classify (ConP c _ _) = Right c
+    classify _            = __IMPOSSIBLE__
+
+    -- All non-catch-all patterns following this one (at position n).
+    -- These are the cases the wildcard needs to be expanded into.
+    expansions = nubBy ((==) `on` classify)
+               . map unArg
+               . filter (not . isCatchAll)
+               . map (nth . fst) $ cs
+
+    expand ps b q =
+      case q of
+        ConP c _ qs' -> (ps0 ++ [defaultArg $ ConP c Nothing (genericReplicate m $ defaultArg $ VarP "_")] ++ ps1,
+                         substBody n' m (Con c (map var [m - 1, m - 2..0])) b)
+          where m = fromIntegral $ length qs'
+        LitP l -> (ps0 ++ [defaultArg $ LitP l] ++ ps1, substBody n' 0 (Lit l) b)
+        _ -> __IMPOSSIBLE__
+      where
+        (ps0, _, ps1) = extractNthElement' n ps
+
+        n' = countVars ps0
+        countVars = sum . map (count . unArg)
+        count VarP{}        = 1
+        count (ConP _ _ ps) = countVars ps
+        count DotP{}        = 1   -- dot patterns are treated as variables in the clauses
+        count _             = 0
+
+        var x = defaultArg $ Var x []
+
+substBody :: Int -> Integer -> Term -> ClauseBody -> ClauseBody
+substBody _ _ _ NoBody = NoBody
+substBody 0 m v b = case b of
+  Bind   b -> foldr (.) id (genericReplicate m (Bind . Abs "_")) $ subst v (absBody $ raise m b)
+  _        -> __IMPOSSIBLE__
+substBody n m v b = case b of
+  Bind b   -> Bind $ fmap (substBody (n - 1) m v) b
+  _        -> __IMPOSSIBLE__
diff --git a/src/full/Agda/TypeChecking/CompiledClause/Compile.hs-boot b/src/full/Agda/TypeChecking/CompiledClause/Compile.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/TypeChecking/CompiledClause/Compile.hs-boot
@@ -0,0 +1,7 @@
+module Agda.TypeChecking.CompiledClause.Compile where
+
+import Agda.Syntax.Internal
+import Agda.TypeChecking.CompiledClause
+import Agda.TypeChecking.Monad.Base
+
+compileClauses :: Bool -> [Clause] -> TCM CompiledClauses
diff --git a/src/full/Agda/TypeChecking/CompiledClause/Match.hs b/src/full/Agda/TypeChecking/CompiledClause/Match.hs
--- a/src/full/Agda/TypeChecking/CompiledClause/Match.hs
+++ b/src/full/Agda/TypeChecking/CompiledClause/Match.hs
@@ -4,6 +4,7 @@
 import Control.Applicative
 import qualified Data.Map as Map
 import Data.Traversable
+import Data.List
 
 import Agda.Syntax.Internal
 import Agda.Syntax.Common
@@ -27,46 +28,58 @@
 
 match :: CompiledClauses -> MaybeReducedArgs -> (Args -> Args) -> Stack -> TCM (Reduced (Blocked Args) Term)
 match Fail args patch stack = return $ NoReduction $ NotBlocked (patch $ map ignoreReduced args)
-match (Done _ t) args _ _ =
-  return $ YesReduction $ substs (reverse $ map (unArg . ignoreReduced) args) t
-match (Case n bs) args patch stack = do
-  let (args0, MaybeRed red (Arg h r v0), args1) = extractNthElement' n args
-  w  <- case red of
-          Reduced b  -> return $ fmap (const v0) b
-          NotReduced ->
-            unfoldCorecursion =<< instantiate v0
-  cv <- constructorForm $ ignoreBlocking w
-  let v      = ignoreBlocking w
-      args'  = args0 ++ [MaybeRed red $ Arg h r v] ++ args1
-      stack' = maybe [] (\c -> [(c, args', patch)]) (catchAllBranch bs)
-               ++ stack
-      patchLit args = patch (args0 ++ [Arg h r v] ++ args1)
-        where (args0, args1) = splitAt n args
-      patchCon c m args = patch (args0 ++ [Arg h r $ Con c vs] ++ args1)
-        where (args0, args1') = splitAt n args
-              (vs, args1)     = splitAt m args1'
-  case w of
-    Blocked x _            -> return $ NoReduction $ Blocked x (patch $ map ignoreReduced args')
-    NotBlocked (MetaV x _) -> return $ NoReduction $ Blocked x (patch $ map ignoreReduced args')
-    NotBlocked (Lit l) -> case Map.lookup l (litBranches bs) of
-      Nothing -> match' stack''
-      Just cc -> match cc (args0 ++ args1) patchLit stack''
-      where
-        stack'' = (++ stack') $ case cv of
-          Con c vs -> case Map.lookup c (conBranches bs) of
-            Nothing -> []
-            Just cc -> [(cc, args0 ++ map (MaybeRed red) vs ++ args1, patchCon c (length vs))]
-          _        -> []
-    NotBlocked (Con c vs) -> case Map.lookup c (conBranches bs) of
-      Nothing -> match' stack'
-      Just cc -> match cc (args0 ++ map (MaybeRed red) vs ++ args1)
-                          (patchCon c (length vs)) stack'
-    NotBlocked _ -> return $ NoReduction $ NotBlocked (patch $ map ignoreReduced args')
+match (Done xs t) args _ _
+  | m < n     = return $ YesReduction $ substs (reverse $ toTm args)
+                                      $ foldr lam t (drop m xs)
+  | otherwise = return $ YesReduction $ substs (reverse $ toTm args0) t `apply` map ignoreReduced args1
+  where
+    n              = length xs
+    m              = length args
+    toTm           = map (unArg . ignoreReduced)
+    (args0, args1) = splitAt n args
+    lam x t        = Lam (argHiding x) (Abs (unArg x) t)
+match (Case n bs) args patch stack =
+  case genericSplitAt n args of
+    (_, []) -> return $ NoReduction $ NotBlocked $ patch $ map ignoreReduced args
+    (args0, MaybeRed red (Arg h r v0) : args1) -> do
+      w  <- case red of
+              Reduced b  -> return $ fmap (const v0) b
+              NotReduced ->
+                unfoldCorecursion =<< instantiate v0
+      cv <- constructorForm $ ignoreBlocking w
+      let v      = ignoreBlocking w
+          args'  = args0 ++ [MaybeRed red $ Arg h r v] ++ args1
+          stack' = maybe [] (\c -> [(c, args', patch)]) (catchAllBranch bs)
+                   ++ stack
+          patchLit args = patch (args0 ++ [Arg h r v] ++ args1)
+            where (args0, args1) = splitAt n args
+          patchCon c m args = patch (args0 ++ [Arg h r $ Con c vs] ++ args1)
+            where (args0, args1') = splitAt n args
+                  (vs, args1)     = splitAt m args1'
+      case w of
+        Blocked x _            -> return $ NoReduction $ Blocked x (patch $ map ignoreReduced args')
+        NotBlocked (MetaV x _) -> return $ NoReduction $ Blocked x (patch $ map ignoreReduced args')
+        NotBlocked (Lit l) -> case Map.lookup l (litBranches bs) of
+          Nothing -> match' stack''
+          Just cc -> match cc (args0 ++ args1) patchLit stack''
+          where
+            stack'' = (++ stack') $ case cv of
+              Con c vs -> case Map.lookup c (conBranches bs) of
+                Nothing -> []
+                Just cc -> [(cc, args0 ++ map (MaybeRed red) vs ++ args1, patchCon c (length vs))]
+              _        -> []
+        NotBlocked (Con c vs) -> case Map.lookup c (conBranches bs) of
+          Nothing -> match' stack'
+          Just cc -> match cc (args0 ++ map (MaybeRed red) vs ++ args1)
+                              (patchCon c (length vs)) stack'
+        NotBlocked _ -> return $ NoReduction $ NotBlocked (patch $ map ignoreReduced args')
 
 match' :: Stack -> TCM (Reduced (Blocked Args) Term)
 match' ((c, args, patch):stack) = match c args patch stack
 match' [] = typeError $ GenericError "Incomplete pattern matching"
 
 unfoldCorecursion v = case v of
-  Def f args -> unfoldDefinition True reduceB (Def f []) f args
+  -- Andreas, 2011-10-03 removing DontCare here allow matching on irrelevant things
+  DontCare v -> unfoldCorecursion v
+  Def f args -> unfoldDefinition True unfoldCorecursion (Def f []) f args
   _          -> reduceB v
diff --git a/src/full/Agda/TypeChecking/CompiledClause/Match.hs-boot b/src/full/Agda/TypeChecking/CompiledClause/Match.hs-boot
--- a/src/full/Agda/TypeChecking/CompiledClause/Match.hs-boot
+++ b/src/full/Agda/TypeChecking/CompiledClause/Match.hs-boot
@@ -7,4 +7,3 @@
 import Agda.TypeChecking.CompiledClause
 
 matchCompiled :: CompiledClauses -> MaybeReducedArgs -> TCM (Reduced (Blocked Args) Term)
-
diff --git a/src/full/Agda/TypeChecking/Constraints.hs b/src/full/Agda/TypeChecking/Constraints.hs
--- a/src/full/Agda/TypeChecking/Constraints.hs
+++ b/src/full/Agda/TypeChecking/Constraints.hs
@@ -11,11 +11,16 @@
 import Data.List as List
 import Data.Set as Set
 
+import Agda.Syntax.Common
 import Agda.Syntax.Internal
+import Agda.Syntax.Scope.Base
 import Agda.TypeChecking.Monad
 import Agda.TypeChecking.Errors
 import Agda.TypeChecking.Pretty
 import Agda.TypeChecking.Reduce
+import Agda.TypeChecking.Substitute
+import Agda.TypeChecking.LevelConstraints
+import Agda.TypeChecking.MetaVars.Mention
 
 import {-# SOURCE #-} Agda.TypeChecking.Rules.Term (checkExpr)
 import {-# SOURCE #-} Agda.TypeChecking.Conversion
@@ -25,86 +30,138 @@
 import Agda.TypeChecking.Free
 
 import Agda.Utils.Fresh
+import Agda.Utils.Monad
 
 #include "../undefined.h"
 import Agda.Utils.Impossible
 
--- | Catch pattern violation errors and adds a constraint.
+-- | Catches pattern violation errors and adds a constraint.
 --
-catchConstraint :: MonadTCM tcm => Constraint -> TCM Constraints -> tcm Constraints
+catchConstraint :: Constraint -> TCM () -> TCM ()
 catchConstraint c v = liftTCM $
    catchError_ v $ \err ->
    case errError err of
-       PatternErr s -> put s >> buildConstraint c
+        -- Not putting s (which should really be the what's already there) makes things go
+        -- a lot slower (+20% total time on standard library). How is that possible??
+        -- The problem is most likely that there are internal catchErrors which forgets the
+        -- state. catchError should preserve the state on pattern violations.
+       PatternErr s -> put s >> addConstraint c
        _	    -> throwError err
 
--- | Try to solve the constraints to be added.
-addNewConstraints :: MonadTCM tcm => Constraints -> tcm ()
-addNewConstraints cs = do addConstraints cs; wakeupConstraints
+addConstraint :: Constraint -> TCM ()
+addConstraint c = do
+    pids <- asks envActiveProblems
+    reportSDoc "tc.constr.add" 20 $ hsep
+      [ text "adding constraint"
+      , text (show pids)
+      , prettyTCM c ]
+    -- Need to reduce to reveal possibly blocking metas
+    c <- reduce =<< instantiateFull c
+    c' <- simpl c
+    if (c /= c')
+      then do
+        reportSDoc "tc.constr.add" 20 $ text "  simplified:" <+> prettyTCM c'
+        solveConstraint_ c'
+      else addConstraint' c'
+  where
+    simpl :: Constraint -> TCM Constraint
+    simpl c = do
+      n <- genericLength <$> getContext
+      let isLvl LevelCmp{} = True
+          isLvl _          = False
+      cs <- getAllConstraints
+      lvls <- instantiateFull $ List.filter (isLvl . clValue . theConstraint) cs
+      when (not $ List.null lvls) $ reportSDoc "tc.constr.add" 40 $ text "  simplifying using" <+> prettyTCM lvls
+      return $ simplifyLevelConstraint n c lvls
 
 -- | Don't allow the argument to produce any constraints.
-noConstraints :: MonadTCM tcm => tcm Constraints -> tcm ()
-noConstraints m = do
-    cs <- solveConstraints =<< m
-    unless (List.null cs) $ typeError $ UnsolvedConstraints cs
-    return ()
+noConstraints :: TCM a -> TCM a
+noConstraints problem = liftTCM $ do
+  (pid, x) <- newProblem problem
+  cs <- getConstraintsForProblem pid
+  unless (List.null cs) $ typeError $ UnsolvedConstraints cs
+  return x
 
--- | Guard constraint
-guardConstraint :: MonadTCM tcm => tcm Constraints -> Constraint -> tcm Constraints
-guardConstraint m c = do
-    cs <- solveConstraints =<< m
-    case List.partition isNonBlocking cs of
-	(scs, []) -> (scs ++) <$> solveConstraint c
-	(scs, cs) -> (scs ++) <$> buildConstraint (Guarded c cs)
-    where
-	isNonBlocking = isNB . clValue
-	isNB SortCmp{}        = True
-        isNB LevelCmp{}       = True
-	isNB ValueCmp{}       = False
-        isNB ArgsCmp{}        = False
-	isNB TypeCmp{}        = False
-	isNB TelCmp{}         = False
-	isNB (Guarded c _)    = isNB c
-	isNB UnBlock{}        = False
-        isNB IsEmpty{}        = False
+-- | Create a fresh problem for the given action.
+newProblem :: TCM a -> TCM (ProblemId, a)
+newProblem action = do
+  pid <- fresh
+  -- Don't get distracted by other constraints while working on the problem
+  x <- nowSolvingConstraints $ solvingProblem pid action
+  -- Now we can check any woken constraints
+  solveAwakeConstraints
+  return (pid, x)
 
--- | We ignore the constraint ids and (as in Agda) retry all constraints every time.
---   We probably generate very few constraints.
-wakeupConstraints :: MonadTCM tcm => tcm ()
-wakeupConstraints = do
-    cs <- takeConstraints
-    cs <- solveConstraints cs
-    addConstraints cs
+newProblem_ :: TCM () -> TCM ProblemId
+newProblem_ action = fst <$> newProblem action
 
-solveConstraints :: MonadTCM tcm => Constraints -> tcm Constraints
-solveConstraints [] = return []
-solveConstraints cs = do
-    reportSDoc "tc.constr.solve" 60 $
-      sep [ text "{ solving", nest 2 $ prettyTCM cs ]
-    n  <- length <$> getInstantiatedMetas
-    cs0 <- return cs
-    cs <- concat <$> mapM (withConstraint solveConstraint) cs
-    n' <- length <$> getInstantiatedMetas
-    reportSDoc "tc.constr.solve" 70 $
-      sep [ text "new constraints", nest 2 $ prettyTCM cs
-          , nest 2 $ text $ "progress: " ++ show n' ++ " --> " ++ show n
-          ]
-    cs <- if (n' > n)
-	then solveConstraints cs -- Go again if we made progress
-	else return cs
-    reportSLn "tc.constr.solve" 60 $ "solved constraints }"
-    return cs
+ifNoConstraints :: TCM a -> (a -> TCM b) -> (ProblemId -> a -> TCM b) -> TCM b
+ifNoConstraints check ifNo ifCs = do
+  (pid, x) <- newProblem check
+  ifM (isProblemSolved pid) (ifNo x) (ifCs pid x)
 
-solveConstraint :: MonadTCM tcm => Constraint -> tcm Constraints
-solveConstraint (ValueCmp cmp a u v) = compareTerm cmp a u v
-solveConstraint (ArgsCmp cmp a u v)  = compareArgs cmp a u v
-solveConstraint (TypeCmp cmp a b)    = compareType cmp a b
-solveConstraint (TelCmp cmp a b)     = compareTel  cmp a b
-solveConstraint (SortCmp cmp s1 s2)  = compareSort cmp s1 s2
-solveConstraint (LevelCmp cmp a b)   = compareLevel cmp a b
-solveConstraint (Guarded c cs)       = guardConstraint (return cs) c
-solveConstraint (IsEmpty t)          = isEmptyTypeC t
-solveConstraint (UnBlock m)          = do
+ifNoConstraints_ :: TCM () -> TCM a -> (ProblemId -> TCM a) -> TCM a
+ifNoConstraints_ check ifNo ifCs = ifNoConstraints check (const ifNo) (\pid _ -> ifCs pid)
+
+-- | @guardConstraint cs c@ tries to solve constraints @cs@ first.
+--   If successful, it moves on to solve @c@, otherwise it returns
+--   a @Guarded c cs@.
+guardConstraint :: Constraint -> TCM () -> TCM ()
+guardConstraint c blocker =
+  ifNoConstraints_ blocker (solveConstraint_ c) (addConstraint . Guarded c)
+
+whenConstraints :: TCM () -> TCM () -> TCM ()
+whenConstraints action handler =
+  ifNoConstraints_ action (return ()) $ \pid -> do
+    stealConstraints pid
+    handler
+
+-- | Wake up the constraints depending on the given meta.
+wakeupConstraints :: MetaId -> TCM ()
+wakeupConstraints x = do
+  wakeConstraints (mentionsMeta x)
+  solveAwakeConstraints
+
+-- | Wake up all constraints.
+wakeupConstraints_ :: TCM ()
+wakeupConstraints_ = do
+  wakeConstraints (const True)
+  solveAwakeConstraints
+
+solveAwakeConstraints :: TCM ()
+solveAwakeConstraints = do
+    verboseS "profile.constraints" 10 $ liftTCM $ tickMax "max-open-constraints" . genericLength =<< getAllConstraints
+    unlessM isSolvingConstraints $ nowSolvingConstraints solve
+  where
+    solve = do
+      reportSDoc "tc.constr.solve" 10 $ hsep [ text "Solving awake constraints."
+                                             , text . show . length =<< getAwakeConstraints
+                                             , text "remaining." ]
+      mc <- takeAwakeConstraint
+      flip (maybe $ return ()) mc $ \c -> do
+        withConstraint solveConstraint c
+        solve
+
+solveConstraint :: Constraint -> TCM ()
+solveConstraint c = do
+    verboseS "profile.constraints" 10 $ liftTCM $ tick "attempted-constraints"
+    verboseBracket "tc.constr.solve" 20 "solving constraint" $ do
+      pids <- asks envActiveProblems
+      reportSDoc "tc.constr.solve" 20 $ text (show pids) <+> prettyTCM c
+      solveConstraint_ c
+
+solveConstraint_ (ValueCmp cmp a u v)       = compareTerm cmp a u v
+solveConstraint_ (ElimCmp cmp a e u v)      = compareElims cmp a e u v
+solveConstraint_ (TypeCmp cmp a b)          = compareType cmp a b
+solveConstraint_ (TelCmp a b cmp tela telb) = compareTel a b cmp tela telb
+solveConstraint_ (SortCmp cmp s1 s2)        = compareSort cmp s1 s2
+solveConstraint_ (LevelCmp cmp a b)         = compareLevel cmp a b
+solveConstraint_ c0@(Guarded c pid)         = do
+  ifM (isProblemSolved pid) (solveConstraint_ c)
+                            (addConstraint c0)
+solveConstraint_ (IsEmpty t)                = isEmptyType t
+solveConstraint_ (UnBlock m)                =
+  ifM (isFrozen m) (addConstraint $ UnBlock m) $ do
     inst <- mvInstantiation <$> lookupMeta m
     reportSDoc "tc.constr.unblock" 15 $ text ("unblocking a metavar yields the constraint: " ++ show inst)
     case inst of
@@ -112,21 +169,100 @@
         reportSDoc "tc.constr.blocked" 15 $
           text ("blocked const " ++ show m ++ " :=") <+> prettyTCM t
         assignTerm m t
-        return []
       PostponedTypeCheckingProblem cl -> enterClosure cl $ \(e, t, unblock) -> do
         b <- liftTCM unblock
         if not b
-          then buildConstraint $ UnBlock m
+          then addConstraint $ UnBlock m
           else do
             tel <- getContextTelescope
             v   <- liftTCM $ checkExpr e t
             assignTerm m $ teleLam tel v
-            return []
       -- Andreas, 2009-02-09, the following were IMPOSSIBLE cases
       -- somehow they pop up in the context of sized types
       --
-      -- already solved metavariables: no constraints left (Ulf, is that correct?)
-      InstV{} -> return []
-      InstS{} -> return []
+      -- already solved metavariables: should only happen for size
+      -- metas (not sure why it does, Andreas?)
+      InstV{} -> return ()
+      InstS{} -> return ()
       -- Open (whatever that means)
       Open -> __IMPOSSIBLE__
+      OpenIFS -> __IMPOSSIBLE__
+solveConstraint_ (FindInScope m)      =
+  ifM (isFrozen m) (addConstraint $ FindInScope m) $ do
+    reportSDoc "tc.constr.findInScope" 15 $ text ("findInScope constraint: " ++ show m)
+    mv <- lookupMeta m
+    let j = mvJudgement mv
+    case j of
+      IsSort{} -> __IMPOSSIBLE__
+      HasType _ tj -> do
+        ctx <- getContextVars
+        ctxArgs <- getContextArgs
+        t <- normalise $ tj `piApply` ctxArgs
+        reportSLn "tc.constr.findInScope" 15 $ "findInScope t: " ++ show t
+        let candsP1 = [(term, t) | (term, t, Instance) <- ctx]
+        let candsP2 = [(term, t) | (term, t, h) <- ctx, h /= Instance]
+        let scopeInfo = getMetaScope mv
+        let ns = everythingInScope scopeInfo
+        let nsList = Map.toList $ nsNames ns
+        -- try all abstract names in scope (even ones that you can't refer to
+        --  unambiguously)
+        let candsP3Names = nsList >>= snd
+        candsP3Types <- mapM (typeOfConst . anameName) candsP3Names
+        candsP3FV <- mapM (freeVarsToApply . anameName) candsP3Names
+        let candsP3 = [(Def (anameName an) vs, t) |
+                       (an, t, vs) <- zip3 candsP3Names candsP3Types candsP3FV]
+        let cands = [candsP1, candsP2, candsP3]
+        cands <- mapM (filterM (uncurry $ checkCandidateForMeta m t )) cands
+        let iterCands :: [(Int, [(Term, Type)])] -> TCM ()
+            iterCands [] = do reportSDoc "tc.constr.findInScope" 15 $ text "not a single candidate found..."
+                              typeError $ IFSNoCandidateInScope t
+            iterCands ((p, []) : cs) = do reportSDoc "tc.constr.findInScope" 15 $ text $
+                                            "no candidates found at p=" ++ show p ++ ", trying next p..."
+                                          iterCands cs
+            iterCands ((p, [(term, t')]):_) =
+              do reportSDoc "tc.constr.findInScope" 15 $ text (
+                   "one candidate at p=" ++ show p ++ " found for type '") <+>
+                   prettyTCM t <+> text "': '" <+> prettyTCM term <+>
+                   text "', of type '" <+> prettyTCM t' <+> text "'."
+                 leqType t t'
+                 assignV m ctxArgs term
+            iterCands ((p, cs):_) = do reportSDoc "tc.constr.findInScope" 15 $
+                                         text ("still more than one candidate at p=" ++ show p ++ ": ") <+>
+                                         prettyTCM (List.map fst cs)
+                                       addConstraint $ FindInScope m
+        iterCands [(1,concat cands)]
+      where
+        getContextVars :: TCM [(Term, Type, Hiding)]
+        getContextVars = do
+          ctx <- getContext
+          let ids = [0.. fromIntegral (length ctx) - 1] :: [Nat]
+          types <- mapM typeOfBV ids
+          return $ [ (Var i [], t, h) | (Arg h _ _, i, t) <- zip3 ctx [0..] types ]
+        checkCandidateForMeta :: MetaId -> Type -> Term -> Type -> TCM Bool
+        checkCandidateForMeta m t term t' =
+          liftTCM $ flip catchError (\err -> return False) $ do
+            reportSLn "tc.constr.findInScope" 20 $ "checkCandidateForMeta\n  t: " ++ show t ++ "\n  t':" ++ show t' ++ "\n  term: " ++ show term ++ "."
+            localState $ do
+               -- domi: we assume that nothing below performs direct IO (except
+               -- for logging and such, I guess)
+               leqType t t'
+               tel <- getContextTelescope
+               assignTerm m (teleLam tel term)
+               -- make a pass over constraints, to detect cases where some are made
+               -- unsolvable by the assignment, but don't do this for FindInScope's
+               -- to prevent loops. We currently also ignore UnBlock constraints
+               -- to be on the safe side.
+               wakeConstraints (isSimpleConstraint . clValue . theConstraint)
+               solveAwakeConstraints
+            return True
+        isSimpleConstraint :: Constraint -> Bool
+        isSimpleConstraint FindInScope{} = False
+        isSimpleConstraint UnBlock{}     = False
+        isSimpleConstraint _             = True
+
+localState :: MonadState s m => m a -> m a
+localState m = do
+  s <- get
+  x <- m
+  put s
+  return x
diff --git a/src/full/Agda/TypeChecking/Conversion.hs b/src/full/Agda/TypeChecking/Conversion.hs
--- a/src/full/Agda/TypeChecking/Conversion.hs
+++ b/src/full/Agda/TypeChecking/Conversion.hs
@@ -15,6 +15,7 @@
 import Agda.Syntax.Internal
 import Agda.TypeChecking.Monad
 import Agda.TypeChecking.MetaVars
+import Agda.TypeChecking.MetaVars.Occurs (killArgs,PruneResult(..))
 import Agda.TypeChecking.Substitute
 import Agda.TypeChecking.Reduce
 import Agda.TypeChecking.Constraints
@@ -27,8 +28,10 @@
 import Agda.TypeChecking.SizedTypes
 import Agda.TypeChecking.Monad.Builtin
 import Agda.TypeChecking.Level
+import Agda.TypeChecking.Irrelevance
 import Agda.TypeChecking.EtaContract
-import Agda.TypeChecking.UniversePolymorphism
+import Agda.TypeChecking.Eliminators
+-- import Agda.TypeChecking.UniversePolymorphism
 
 import Agda.Utils.Monad
 
@@ -37,6 +40,9 @@
 #include "../undefined.h"
 import Agda.Utils.Impossible
 
+mlevel :: TCM (Maybe Term)
+mlevel = liftTCM $ (Just <$> primLevel) `catchError` \_ -> return Nothing
+
 nextPolarity []       = (Invariant, [])
 nextPolarity (p : ps) = (p, ps)
 
@@ -48,43 +54,76 @@
 	same (Arg _ _ (Var n [])) (Arg _ _ (Var m [])) = n == m
 	same _ _				       = False
 
-equalTerm :: MonadTCM tcm => Type -> Term -> Term -> tcm Constraints
+-- | @intersectVars us vs@ checks whether all relevant elements in @us@ and @vs@
+--   are variables, and if yes, returns a prune list which says @True@ for
+--   arguments which are different and can be pruned.
+intersectVars :: Args -> Args -> Maybe [Bool]
+intersectVars = zipWithM areVars where
+    -- ignore irrelevant args
+    areVars u v | argRelevance u == Irrelevant        = Just False -- do not prune
+    areVars (Arg _ _ (Var n [])) (Arg _ _ (Var m [])) = Just $ n /= m -- prune different vars
+    areVars _ _                                       = Nothing
+
+equalTerm :: Type -> Term -> Term -> TCM ()
 equalTerm = compareTerm CmpEq
 
-equalAtom :: MonadTCM tcm => Type -> Term -> Term -> tcm Constraints
+equalAtom :: Type -> Term -> Term -> TCM ()
 equalAtom = compareAtom CmpEq
 
-equalArgs :: MonadTCM tcm => Type -> Args -> Args -> tcm Constraints
-equalArgs = compareArgs []
-
-equalType :: MonadTCM tcm => Type -> Type -> tcm Constraints
+equalType :: Type -> Type -> TCM ()
 equalType = compareType CmpEq
 
 -- | Type directed equality on values.
 --
-compareTerm :: MonadTCM tcm => Comparison -> Type -> Term -> Term -> tcm Constraints
-compareTerm cmp a m n =
-  verboseBracket "tc.conv.term" 5 "compareTerm" $
-  catchConstraint (ValueCmp cmp a m n) $ do
-    a'       <- reduce a
-    reportSDoc "tc.conv.term" 10 $ fsep
+compareTerm :: Comparison -> Type -> Term -> Term -> TCM ()
+  -- If one term is a meta, try to instantiate right away. This avoids unnecessary unfolding.
+compareTerm cmp a u v = liftTCM $ do
+  (u, v) <- instantiate (u, v)
+  reportSDoc "tc.conv.term" 10 $ sep [ text "compareTerm"
+                                     , nest 2 $ prettyTCM u <+> prettyTCM cmp <+> prettyTCM v
+                                     , nest 2 $ text ":" <+> prettyTCM a ]
+  let fallback = compareTerm' cmp a u v
+  case (u, v) of
+    (u@(MetaV x us), v@(MetaV y vs))
+      | x /= y    -> solve1 `orelse` solve2 `orelse` compareTerm' cmp a u v
+      | otherwise -> fallback
+      where
+        (solve1, solve2) | x > y     = (assign x us v, assign y vs u)
+                         | otherwise = (assign y vs u, assign x us v)
+    (u@(MetaV x us), v) -> assign x us v `orelse` fallback
+    (u, v@(MetaV y vs)) -> assign y vs u `orelse` fallback
+    _                   -> fallback
+  where
+    assign x us v = do
+      reportSDoc "tc.conv.term" 20 $ sep [ text "attempting shortcut"
+                                         , nest 2 $ prettyTCM (MetaV x us) <+> text ":=" <+> prettyTCM v ]
+      ifM (isInstantiatedMeta x) patternViolation (assignV x us v)
+    -- Should be ok with catchError_ but catchError is much safer since we don't
+    -- rethrow errors.
+    m `orelse` h = m `catchError` \err -> case errError err of
+                    PatternErr s -> put s >> h
+                    _            -> h
+
+compareTerm' :: Comparison -> Type -> Term -> Term -> TCM ()
+compareTerm' cmp a m n =
+  verboseBracket "tc.conv.term" 20 "compareTerm" $ do
+  a' <- reduce a
+  catchConstraint (ValueCmp cmp a' m n) $ do
+    reportSDoc "tc.conv.term" 30 $ fsep
       [ text "compareTerm", prettyTCM m, prettyTCM cmp, prettyTCM n, text ":", prettyTCM a' ]
     proofIrr <- proofIrrelevance
     isSize   <- isSizeType a'
     s        <- reduce $ getSort a'
     mlvl     <- mlevel
     case s of
-      Prop | proofIrr -> return []
+      Prop | proofIrr -> return ()
       _    | isSize   -> compareSizes cmp m n
       _               -> case unEl a' of
-        a | Just a == mlvl -> equalLevel m n
+        a | Just a == mlvl -> do
+          a <- levelView m
+          b <- levelView n
+          equalLevel a b
         Pi a _    -> equalFun (a,a') m n
-        Fun a _   -> equalFun (a,a') m n
-        MetaV x _ -> do
-          (m,n) <- normalise (m,n)
-          if m == n
-            then return []
-            else buildConstraint (ValueCmp cmp a m n)
         Lam _ _   -> __IMPOSSIBLE__
         Def r ps  -> do
           isrec <- isEtaRecord r
@@ -93,13 +132,25 @@
               m <- reduceB m
               n <- reduceB n
               case (m, n) of
-                _ | isMeta m || isMeta n || (isNeutral m && isNeutral n) ->
+                _ | isMeta m || isMeta n ->
                     compareAtom cmp a' (ignoreBlocking m) (ignoreBlocking n)
+
+                _ | isNeutral m && isNeutral n -> do
+                    -- Andreas 2011-03-23: (fixing issue 396)
+                    -- if we are dealing with a singleton record,
+                    -- we can succeed immediately
+                    isSing <- isSingletonRecordModuloRelevance r ps
+                    case isSing of
+                      Right True -> return ()
+                      -- do not eta-expand if comparing two neutrals
+                      _ -> compareAtom cmp a' (ignoreBlocking m) (ignoreBlocking n)
                 _ -> do
                   (tel, m') <- etaExpandRecord r ps $ ignoreBlocking m
                   (_  , n') <- etaExpandRecord r ps $ ignoreBlocking n
                   -- No subtyping on record terms
-                  compareArgs [] (telePi_ tel $ sort Prop) m' n'
+                  c <- getRecordConstructor r
+                  compareArgs [] (telePi_ tel $ sort Prop) (Con c []) m' n'
+
             else compareAtom cmp a' m n
         _ -> compareAtom cmp a' m n
   where
@@ -118,163 +169,194 @@
         p	= fmap (const $ Var 0 []) a
         (m',n') = raise 1 (m,n) `apply` [p]
         t'	= raise 1 t `piApply` [p]
-        suggest (Fun _ _)	 = "x"
-        suggest (Pi _ (Abs x _)) = x
-        suggest _		 = __IMPOSSIBLE__
+        suggest (Pi _ b) = absName b
+        suggest _	 = __IMPOSSIBLE__
 
-compareTel :: MonadTCM tcm => Comparison -> Telescope -> Telescope -> tcm Constraints
-compareTel cmp tel1 tel2 =
-  verboseBracket "tc.conv.tel" 5 "compareTel" $
-  catchConstraint (TelCmp cmp tel1 tel2) $ case (tel1, tel2) of
-    (EmptyTel, EmptyTel) -> return []
+-- | @compareTel t1 t2 cmp tel1 tel1@ checks whether pointwise @tel1 `cmp` tel2@
+--   and complains that @t2 `cmp` t1@ failed if not.
+compareTel :: Type -> Type ->
+  Comparison -> Telescope -> Telescope -> TCM ()
+compareTel t1 t2 cmp tel1 tel2 =
+  verboseBracket "tc.conv.tel" 20 "compareTel" $
+  catchConstraint (TelCmp t1 t2 cmp tel1 tel2) $ case (tel1, tel2) of
+    (EmptyTel, EmptyTel) -> return ()
     (EmptyTel, _)        -> bad
     (_, EmptyTel)        -> bad
     (ExtendTel arg1@(Arg h1 r1 a1) tel1, ExtendTel arg2@(Arg h2 r2 a2) tel2)
       | h1 /= h2 -> bad
+        -- Andreas, 2011-09-11 do not test r1 == r2 because they could differ
+        -- e.g. one could be Forced and the other Relevant (see fail/UncurryMeta)
       | otherwise -> do
           let (tel1', tel2') = raise 1 (tel1, tel2)
               arg            = Var 0 []
           name <- freshName_ (suggest (absName tel1) (absName tel2))
-          cs   <- compareType cmp a1 a2
-          let c = TelCmp cmp (absApp tel1' arg) (absApp tel2' arg)
-
-	  let dependent = 0 `freeIn` absBody tel2
-
-          if dependent
-	    then addCtx name arg1 $ guardConstraint (return cs) c
-	    else do cs' <- addCtx name arg1 $ solveConstraint c
-		    return $ cs ++ cs'
+          let checkArg = escapeContext 1 $ compareType cmp a1 a2
+          let c = TelCmp t1 t2 cmp (absApp tel1' arg) (absApp tel2' arg)
+          let r = max r1 r2  -- take "most irrelevant"
+              dependent = (r /= Irrelevant) && isBinderUsed tel2
+          addCtx name arg1 $
+            if dependent
+	    then guardConstraint c checkArg
+	    else checkArg >> solveConstraint_ c
           where
             suggest "_" y = y
             suggest  x  _ = x
   where
-    bad = typeError $ UnequalTelescopes cmp tel1 tel2
+    -- Andreas, 2011-05-10 better report message about types
+    bad = typeError $ UnequalTypes cmp t2 t1 -- switch t2 and t1 because of contravariance!
+--    bad = typeError $ UnequalTelescopes cmp tel1 tel2
 
 -- | Syntax directed equality on atomic values
 --
-compareAtom :: MonadTCM tcm => Comparison -> Type -> Term -> Term -> tcm Constraints
+compareAtom :: Comparison -> Type -> Term -> Term -> TCM ()
 compareAtom cmp t m n =
-    verboseBracket "tc.conv.atom" 5 "compareAtom" $
+    verboseBracket "tc.conv.atom" 20 "compareAtom" $
+    -- if a PatternErr is thrown, rebuild constraint!
     catchConstraint (ValueCmp cmp t m n) $ do
+      let unLevel (Level l) = reallyUnLevelView l
+          unLevel v = return v
       -- constructorForm changes literal to constructors
       -- Andreas: what happens if I cut out the eta expansion here?
       -- Answer: Triggers issue 245, does not resolve 348
-      mb <- traverse constructorForm =<< etaExpandBlocked =<< reduceB m
-      nb <- traverse constructorForm =<< etaExpandBlocked =<< reduceB n
+      mb <- traverse unLevel =<< traverse constructorForm =<< etaExpandBlocked =<< reduceB m
+      nb <- traverse unLevel =<< traverse constructorForm =<< etaExpandBlocked =<< reduceB n
+
       let m = ignoreBlocking mb
           n = ignoreBlocking nb
-      reportSDoc "tc.conv.atom" 10 $ fsep
-	[ text "compareAtom", prettyTCM mb, prettyTCM cmp, prettyTCM nb, text ":", prettyTCM t ]
+
+          postpone = addConstraint $ ValueCmp cmp t m n
+
+          checkSyntacticEquality = do
+            n <- normalise n    -- is this what we want?
+            m <- normalise m
+            if m == n
+                then return ()	-- Check syntactic equality for blocked terms
+                else postpone
+
+      reportSDoc "tc.conv.atom" 30 $
+	text "compareAtom" <+> fsep [ prettyTCM mb <+> prettyTCM cmp
+                                    , prettyTCM nb
+                                    , text ":" <+> prettyTCM t ]
       case (mb, nb) of
+        -- equate two metas x and y.  if y is the younger meta,
+        -- try first y := x and then x := y
         (NotBlocked (MetaV x xArgs), NotBlocked (MetaV y yArgs))
-            | x == y -> if   sameVars xArgs yArgs
-                        then return []
-                        else do -- Check syntactic equality on meta-variables
+            | x == y ->
+              case intersectVars xArgs yArgs of
+                -- all relevant arguments are variables
+                Just kills -> do
+                  -- kills is a list with 'True' for each different var
+                  killResult <- killArgs kills x
+                  case killResult of
+                    NothingToPrune   -> return ()
+                    PrunedEverything -> return ()
+                    PrunedNothing    -> postpone
+                    PrunedSomething  -> postpone
+                    -- OLD CODE: if killedAll then return () else checkSyntacticEquality
+                -- not all relevant arguments are variables
+                Nothing -> checkSyntacticEquality -- Check syntactic equality on meta-variables
                                 -- (same as for blocked terms)
-                          m <- normalise m
-                          n <- normalise n
-                          if m == n
-                            then return []
-                            else buildConstraint (ValueCmp cmp t m n)
             | otherwise -> do
                 [p1, p2] <- mapM getMetaPriority [x,y]
                 -- instantiate later meta variables first
                 let (solve1, solve2)
                       | (p1,x) > (p2,y) = (l,r)
                       | otherwise	    = (r,l)
-                      where l = assignV t x xArgs n
-                            r = assignV t y yArgs m
-                    try m fallback = do
-                      cs <- m
-                      case cs of
-                        []	-> return []
-                        _	-> fallback cs
+                      where l = assignV x xArgs n
+                            r = assignV y yArgs m
 
+                    try m h = m `catchError_` \err -> case errError err of
+                      PatternErr s -> put s >> h
+                      _            -> throwError err
+
                 -- First try the one with the highest priority. If that doesn't
-                -- work, try the low priority one. If that doesn't work either,
-                -- go with the first version.
-                rollback <- return . put =<< get
-                try solve1 $ \cs -> do
-                  undoRollback <- return . put =<< get
-                  rollback
-                  try solve2 $ \_ -> do
-                    undoRollback
-                    return cs
+                -- work, try the low priority one.
+                try solve1 solve2
 
-	(NotBlocked (MetaV x xArgs), _) -> assignV t x xArgs n
-	(_, NotBlocked (MetaV x xArgs)) -> assignV t x xArgs m
-        (Blocked{}, Blocked{})	-> do
-            n <- normalise n    -- is this what we want?
-            m <- normalise m
-            if m == n
-                then return []	-- Check syntactic equality for blocked terms
-                else buildConstraint $ ValueCmp cmp t m n
+        -- one side a meta, the other an unblocked term
+	(NotBlocked (MetaV x xArgs), _) -> assignV x xArgs n
+	(_, NotBlocked (MetaV x xArgs)) -> assignV x xArgs m
+
+        (Blocked{}, Blocked{})	-> checkSyntacticEquality
         (Blocked{}, _)    -> useInjectivity cmp t m n
         (_,Blocked{})     -> useInjectivity cmp t m n
         _ -> case (m, n) of
-	    _ | f1@(FunV _ _) <- funView m
-	      , f2@(FunV _ _) <- funView n -> equalFun f1 f2
+	    (Pi{}, Pi{}) -> equalFun m n
 
 	    (Sort s1, Sort s2) -> compareSort CmpEq s1 s2
 
-	    (Lit l1, Lit l2) | l1 == l2 -> return []
+	    (Lit l1, Lit l2) | l1 == l2 -> return ()
 	    (Var i iArgs, Var j jArgs) | i == j -> do
 		a <- typeOfBV i
                 -- Variables are invariant in their arguments
-		compareArgs [] a iArgs jArgs
-	    (Def x xArgs, Def y yArgs) | x == y -> do
-                pol <- getPolarity' cmp x
-		reportSDoc "tc.conv.atom" 20 $
-		  text "compareArgs" <+> sep
-                    [ sep [ prettyTCM xArgs
-			  , prettyTCM yArgs
-			  ]
-                    , nest 2 $ text (show pol)
-                    ]
-		a <- defType <$> getConstInfo x
-		compareArgs pol a xArgs yArgs
+		compareArgs [] a (Var i []) iArgs jArgs
+            (Def{}, Def{}) -> do
+              ev1 <- elimView m
+              ev2 <- elimView n
+              case (ev1, ev2) of
+                (VarElim x els1, VarElim y els2) | x == y -> cmpElim (typeOfBV x) (Var x []) els1 els2
+                (ConElim x els1, ConElim y els2) | x == y -> cmpElim (conType x t) (Con x []) els1 els2
+                (DefElim x els1, DefElim y els2) | x == y ->
+                  cmpElim (defType <$> getConstInfo x) (Def x []) els1 els2
+                (MetaElim{}, _) -> __IMPOSSIBLE__   -- projections from metas should have been eta expanded
+                (_, MetaElim{}) -> __IMPOSSIBLE__
+                _ -> typeError $ UnequalTerms cmp m n t
+                where
+                  polarities (Def x _) = getPolarity' cmp x
+                  polarities _         = return []
+                  cmpElim t v els1 els2 = do
+                    a   <- t
+                    pol <- polarities v
+                    reportSDoc "tc.conv.elim" 10 $
+                      text "compareElim" <+> vcat
+                        [ text "a    =" <+> prettyTCM a
+                        , text "v    =" <+> prettyTCM v
+                        , text "els1 =" <+> prettyTCM els1
+                        , text "els2 =" <+> prettyTCM els2
+                        ]
+                    compareElims pol a v els1 els2
 	    (Con x xArgs, Con y yArgs)
 		| x == y -> do
-		    -- The type is a datatype or a record.
-		    Def d args <- reduce $ unEl t
-		    -- Get the number of parameters to the datatype (or record)
-                    npars <- do
-                      def <- theDef <$> getConstInfo d
-                      case def of
-		        Datatype{dataPars = npars} -> return npars
-                        Record{recPars = npars}    -> return npars
-                        _                          -> __IMPOSSIBLE__
-		    -- The type to compare the arguments at is obtained by
-		    -- instantiating the parameters.
-		    a <- defType <$> getConstInfo x
-		    let a' = piApply a (genericTake npars args)
+                    -- Get the type of the constructor instantiated to the datatype parameters.
+                    a' <- conType x t
                     -- Constructors are invariant in their arguments
                     -- (could be covariant).
-                    compareArgs [] a' xArgs yArgs
+                    compareArgs [] a' (Con x []) xArgs yArgs
             _ -> typeError $ UnequalTerms cmp m n t
     where
-	equalFun (FunV arg1@(Arg h1 r1 a1) t1) (FunV (Arg h2 r2 a2) t2)
+        conType c (El _ (Def d args)) = do
+          npars <- do
+            def <- theDef <$> getConstInfo d
+            return $ case def of Datatype{dataPars = n} -> n
+                                 Record{recPars = n}    -> n
+                                 _                      -> __IMPOSSIBLE__
+          a <- defType <$> getConstInfo c
+          return $ piApply a (genericTake npars args)
+        conType _ _ = __IMPOSSIBLE__
+
+	equalFun t1@(Pi arg1@(Arg h1 r1 a1) _) t2@(Pi (Arg h2 r2 a2) _)
 	    | h1 /= h2	= typeError $ UnequalHiding ty1 ty2
             -- Andreas 2010-09-21 compare r1 and r2, but ignore forcing annotations!
 	    | ignoreForced r1 /= ignoreForced r2 = typeError $ UnequalRelevance ty1 ty2
-	    | otherwise = do
-		    let (ty1',ty2') = raise 1 (ty1,ty2)
-			arg	    = Arg h1 r1 (Var 0 [])
-		    name <- freshName_ (suggest t1 t2)
-		    cs   <- compareType cmp a2 a1
-		    let c = TypeCmp cmp (piApply ty1' [arg]) (piApply ty2' [arg])
+	    | otherwise = verboseBracket "tc.conv.fun" 15 "compare function types" $ do
+                reportSDoc "tc.conv.fun" 20 $ nest 2 $ vcat
+                  [ text "t1 =" <+> prettyTCM t1
+                  , text "t2 =" <+> prettyTCM t2 ]
+                let (ty1',ty2') = raise 1 (ty1,ty2)
+                    arg	    = Arg h1 r1 (Var 0 [])
+                name <- freshName_ (suggest t1 t2)
+                let checkArg = escapeContext 1 $ compareType cmp a2 a1
+                    c        = TypeCmp cmp (piApply ty1' [arg]) (piApply ty2' [arg])
 
-		    -- We only need to require a1 == a2 if t2 is a dependent function type.
-		    -- If it's non-dependent it doesn't matter what we add to the context.
-		    let dependent = case t2 of
-					Pi _ _	-> True
-					Fun _ _	-> False
-					_	-> __IMPOSSIBLE__
-		    if dependent
-			then addCtx name arg1 $ guardConstraint (return cs) c
-			else do
-			    cs' <- addCtx name arg1 $ solveConstraint c
-			    return $ cs ++ cs'
+                -- We only need to require a1 == a2 if t2 is a dependent function type.
+                -- If it's non-dependent it doesn't matter what we add to the context.
+                let dependent = case t2 of
+                                    Pi _ b  -> isBinderUsed b
+                                    _       -> __IMPOSSIBLE__
+                addCtx name arg1 $
+                  if dependent
+                  then guardConstraint c checkArg
+                  else checkArg >> solveConstraint_ c
 	    where
 		ty1 = El (getSort a1) t1    -- TODO: wrong (but it doesn't matter)
 		ty2 = El (getSort a2) t2
@@ -282,92 +364,95 @@
 				    []	-> "_"
 				    x:_	-> x
 		    where
-			name (Pi _ (Abs x _)) = [x]
-			name (Fun _ _)	      = []
-			name _		      = __IMPOSSIBLE__
+			name (Pi _ b) = filter (/= "_") [absName b]
+			name _        = __IMPOSSIBLE__
 	equalFun _ _ = __IMPOSSIBLE__
 
+-- | Type-directed equality on eliminator spines
+compareElims :: [Polarity] -> Type -> Term -> [Elim] -> [Elim] -> TCM ()
+compareElims _ _ _ [] [] = return ()
+compareElims _ _ _ [] (_:_) = __IMPOSSIBLE__
+compareElims _ _ _ (_:_) [] = __IMPOSSIBLE__
+compareElims _ _ _ (Apply{} : _) (Proj{} : _) = __IMPOSSIBLE__
+compareElims _ _ _ (Proj{} : _) (Apply{} : _) = __IMPOSSIBLE__
+compareElims pols0 a v els01@(Apply arg1 : els1) els02@(Apply arg2 : els2) =
+  verboseBracket "tc.conv.elim" 20 "compare Apply" $ do
+  reportSDoc "tc.conv.elim" 25 $ nest 2 $ vcat
+    [ text "a    =" <+> prettyTCM a
+    , text "v    =" <+> prettyTCM v
+    , text "els1 =" <+> prettyTCM els01
+    , text "els2 =" <+> prettyTCM els02
+    ]
+  let (pol, pols) = nextPolarity pols0
+  ab <- reduceB a
+  let a = ignoreBlocking ab
+  catchConstraint (ElimCmp pols0 a v els01 els02) $ do
+  case unEl <$> ab of
+    Blocked{}                     -> patternViolation
+    NotBlocked MetaV{}            -> patternViolation
+    NotBlocked (Pi (Arg _ r b) _) -> do
+      let cmp x y = case pol of
+                      Invariant     -> compareTerm CmpEq  b x y
+                      Covariant     -> compareTerm CmpLeq b x y
+                      Contravariant -> compareTerm CmpLeq b y x
+      mlvl <- mlevel
+      let checkArg = case r of
+            Forced     -> return ()
+            Irrelevant -> return () -- Andreas: ignore irr. func. args.
+            _          -> applyRelevanceToContext r $
+                            cmp (unArg arg1) (unArg arg2)
+          dependent = case unEl a of
+            Pi (Arg _ _ (El _ lvl')) c -> 0 `freeInIgnoringSorts` absBody c
+                                          && Just lvl' /= mlvl
+            _ -> False
 
+          theRest = ElimCmp pols (piApply a [arg1]) (apply v [arg1]) els1 els2
 
+      if dependent
+        then guardConstraint theRest checkArg
+        else checkArg >> solveConstraint_ theRest
+
+    _ -> __IMPOSSIBLE__
+compareElims pols a v els01@(Proj f : els1) els02@(Proj f' : els2)
+  | f /= f'   = typeError . GenericError . show =<< prettyTCM f <+> text "/=" <+> prettyTCM f'
+  | otherwise = do
+    a <- reduce a
+    case unEl a of
+      Def r us -> do
+        let (pol, _) = nextPolarity pols
+        ft <- defType <$> getConstInfo f
+        let arg = Arg NotHidden Relevant v  -- TODO: not necessarily relevant?
+        let c = piApply ft (us ++ [arg])
+        (cmp, els1, els2) <- return $ case pol of
+              Invariant     -> (CmpEq, els1, els2)
+              Covariant     -> (CmpLeq, els1, els2)
+              Contravariant -> (CmpLeq, els2, els2)
+        pols' <- getPolarity' cmp f
+        compareElims pols' c (Def f [arg]) els1 els2
+      _ -> __IMPOSSIBLE__
+
 -- | Type-directed equality on argument lists
 --
-compareArgs :: MonadTCM tcm => [Polarity] -> Type -> Args -> Args -> tcm Constraints
-compareArgs _ _ [] [] = return []
-compareArgs _ _ [] (_:_) = __IMPOSSIBLE__
-compareArgs _ _ (_:_) [] = __IMPOSSIBLE__
-compareArgs pols0 a (arg1 : args1) (arg2 : args2) =
-    verboseBracket "tc.conv.args" 5 "compareArgs" $ do
-    let (pol, pols) = nextPolarity pols0
-    a <- reduce a
-    catchConstraint (ArgsCmp pols0 a (arg1 : args1) (arg2 : args2)) $ do
-    reportSDoc "tc.conv.args" 30 $
-      sep [ text "compareArgs"
-          , nest 2 $ sep [ prettyTCM (arg1 : args1)
-                         , prettyTCM (arg2 : args2)
-                         ]
-          , nest 2 $ text ":" <+> prettyTCM a
-          ]
-    case funView (unEl a) of
-	FunV (Arg _ r b) _ -> do
-	    reportSDoc "tc.conv.args" 10 $
-              sep [ text "compareArgs" <+> parens (text $ show pol ++ " " ++ show r)
-                  , nest 2 $ sep [ prettyTCM arg1
-                                 , text "~~" <+> prettyTCM arg2
-                                 , text ":" <+> prettyTCM b
-                                 ]
-                  ]
-            let cmp x y = case pol of
-                            Invariant     -> compareTerm CmpEq b x y
-                            Covariant     -> compareTerm CmpLeq b x y
-                            Contravariant -> compareTerm CmpLeq b y x
-            cs1 <- case r of
-                    Forced     -> return []
-                    Irrelevant -> return [] -- Andreas: ignore irr. func. args.
-                    Relevant   -> cmp (unArg arg1) (unArg arg2)
-            -- mlvl <- mlevel
-	    case (cs1, unEl a) of
-                                -- We can safely ignore sort annotations here
-                                -- (except it's not, we risk leaving unsolved sorts)
-                                -- We're also ignoring levels which isn't quite as
-                                -- safe (it would be if we disallowed matching on levels?)
-		(_:_, Pi (Arg _ _ (El _ lvl')) c) | 0 `freeInIgnoringSorts` absBody c
-                                                  -- && Just lvl' /= mlvl
-		    -> do
-                        reportSDoc "tc.conv.args" 15 $ sep
-                          [ text "aborting compareArgs" <+> parens (text $ show pol)
-                          , nest 2 $ fsep
-                              [ prettyTCM arg1
-                              , text "~~" <+> prettyTCM arg2
-                              , text ":" <+> prettyTCM b
-                              , text "--->" <+> prettyTCM cs1
-                              ]
-                          ]
-                        patternViolation
-		_   -> do
-                    reportSDoc "tc.conv.args" 15 $ sep
-                      [ text "compareArgs" <+> parens (text $ show pol)
-                      , nest 2 $ sep
-                        [ prettyTCM args1
-                        , text "~~" <+> prettyTCM args2
-                        , text ":" <+> prettyTCM (piApply a [arg1])
-                        ]
-                      ]
-		    cs2 <- compareArgs pols (piApply a [arg1]) args1 args2
-		    return $ cs1 ++ cs2
-        _   -> patternViolation
+compareArgs :: [Polarity] -> Type -> Term -> Args -> Args -> TCM ()
+compareArgs pol a v args1 args2 =
+  compareElims pol a v (map Apply args1) (map Apply args2)
 
 -- | Equality on Types
-compareType :: MonadTCM tcm => Comparison -> Type -> Type -> tcm Constraints
+compareType :: Comparison -> Type -> Type -> TCM ()
 compareType cmp ty1@(El s1 a1) ty2@(El s2 a2) =
-    verboseBracket "tc.conv.type" 5 "compareType" $
+    verboseBracket "tc.conv.type" 20 "compareType" $
     catchConstraint (TypeCmp cmp ty1 ty2) $ do
-	reportSDoc "tc.conv.type" 9 $ vcat
-          [ hsep [ text "compareType", prettyTCM ty1, prettyTCM cmp, prettyTCM ty2 ]
+	reportSDoc "tc.conv.type" 50 $ vcat
+          [ text "compareType" <+> sep [ prettyTCM ty1 <+> prettyTCM cmp
+                                       , prettyTCM ty2 ]
           , hsep [ text "   sorts:", prettyTCM s1, text " and ", prettyTCM s2 ]
           ]
-	cs1 <- compareSort CmpEq s1 s2 `catchError` \err -> case errError err of
+-- Andreas, 2011-4-27 should not compare sorts, but currently this is needed
+-- for solving sort and level metas
+--        let cs1 = []
+	compareSort CmpEq s1 s2 `catchError` \err -> case errError err of
                   TypeError _ _ -> do
-                    reportSDoc "tc.conv.type" 10 $ vcat
+                    reportSDoc "tc.conv.type" 30 $ vcat
                       [ text "sort comparison failed"
                       , nest 2 $ vcat
                         [ text "s1 =" <+> prettyTCM s1
@@ -379,169 +464,189 @@
                     -- Throw the original error if the above doesn't
                     -- give an error (for instance, due to pending
                     -- constraints).
+                    -- Or just ignore it... We run into this with irrelevant levels
+                    -- which may show up in sort constraints, causing them to fail.
+                    -- In any case it's not safe to ignore the error, for instance
+                    -- a1 might be Set and a2 a meta of type Set, in which case we
+                    -- really need the sort comparison to fail, instead of silently
+                    -- instantiating the meta.
                     throwError err
                   _             -> throwError err
-	cs2 <- compareTerm cmp (sort s1) a1 a2
-        cs  <- solveConstraints $ cs1 ++ cs2
-        unless (null cs) $
-          reportSDoc "tc.conv.type" 9 $
-            text "   --> " <+> prettyTCM cs
-	return cs
+	compareTerm cmp (sort s1) a1 a2
+	return ()
 
-leqType :: MonadTCM tcm => Type -> Type -> tcm Constraints
+leqType :: Type -> Type -> TCM ()
 leqType = compareType CmpLeq
 
 ---------------------------------------------------------------------------
 -- * Sorts
 ---------------------------------------------------------------------------
 
-compareSort :: MonadTCM tcm => Comparison -> Sort -> Sort -> tcm Constraints
+compareSort :: Comparison -> Sort -> Sort -> TCM ()
 compareSort CmpEq  = equalSort
-compareSort CmpLeq = leqSort
-  -- TODO: change to leqSort when we have better constraint solving
-  --       or not? might not be needed if we get universe polymorphism
-  --       leqSort is still used when checking datatype declarations though
+compareSort CmpLeq = equalSort
 
 -- | Check that the first sort is less or equal to the second.
-leqSort :: MonadTCM tcm => Sort -> Sort -> tcm Constraints
+leqSort :: Sort -> Sort -> TCM ()
 leqSort s1 s2 =
-  ifM typeInType (return []) $
+  ifM typeInType (return ()) $
     catchConstraint (SortCmp CmpLeq s1 s2) $
     do	(s1,s2) <- reduce (s1,s2)
-        reportSDoc "tc.conv.sort" 10 $
+        reportSDoc "tc.conv.sort" 30 $
           sep [ text "leqSort"
               , nest 2 $ fsep [ prettyTCM s1 <+> text "=<"
                               , prettyTCM s2 ]
               ]
 	case (s1,s2) of
 
-            -- New universe polymorphism
---             (Type a  , Type b  )             -> compareLevel CmpLeq a b
-
-	    (Type (Lit (LitLevel _ n)), Type (Lit (LitLevel _ m)))
-              | n <= m    -> return []
-	      | otherwise -> notLeq s1 s2
             (Type a, Type b) -> leqLevel a b
 
-	    (Prop    , Prop    )	     -> return []
+	    (Prop    , Prop    )	     -> return ()
 	    (Type _  , Prop    )	     -> notLeq s1 s2
-	    (Suc _   , Prop    )	     -> notLeq s1 s2
 
-	    (Prop    , Type _  )	     -> return []
-
-	    (Suc s   , Type (Lit (LitLevel _ n)))
-              | 1 <= n    -> leqSort s (mkType $ n - 1)
-	    (Suc s   , Type b  ) -> notLeq s1 s2  -- TODO
-            (Suc s1  , Suc s2  ) -> leqSort s1 s2 -- TODO: not what we want for Prop(?)
-	    (_	     , Suc _   )	     -> equalSort s1 s2
-
-	    (Lub a b , _       )	     -> liftM2 (++) (leqSort a s2) (leqSort b s2)
-	    (_	     , Lub _ _ )	     -> equalSort s1 s2
+	    (Prop    , Type _  )	     -> return ()
 
-	    (MetaS{} , _       )	     -> equalSort s1 s2
-	    (_	     , MetaS{} )	     -> equalSort s1 s2
-            (Inf     , Inf     )             -> return []
-            (Inf     , _       )             -> notLeq s1 s2
-            (_       , Inf     )             -> return []
+            (_       , Inf     )             -> return ()
+            (Inf     , _       )             -> equalSort s1 s2
             (DLub{}  , _       )             -> equalSort s1 s2
             (_       , DLub{}  )             -> equalSort s1 s2
     where
 	notLeq s1 s2 = typeError $ NotLeqSort s1 s2
 
-leqLevel :: MonadTCM tcm => Term -> Term -> tcm Constraints
+leqLevel :: Level -> Level -> TCM ()
 leqLevel a b = liftTCM $ do
-  reportSDoc "tc.conv.nat" 10 $
+  reportSDoc "tc.conv.nat" 30 $
     text "compareLevel" <+>
       sep [ prettyTCM a <+> text "=<"
           , prettyTCM b ]
-  n <- levelView a
-  m <- levelView b
-  leqView n m
+  a <- reduce a
+  b <- reduce b
+  catchConstraint (LevelCmp CmpLeq a b) $ leqView a b
   where
-    leqView n@(Max as) m@(Max bs) = do
-      reportSDoc "tc.conv.nat" 10 $
+    leqView a@(Max as) b@(Max bs) = do
+      reportSDoc "tc.conv.nat" 30 $
         text "compareLevelView" <+>
-          sep [ text (show n) <+> text "=<"
-              , text (show m) ]
-      case (as, bs) of
-        (_, [])  -> concat <$> sequence [ leqPlusView a (ClosedLevel 0) | a <- as ]
-        (_, [b]) -> concat <$> sequence [ leqPlusView a b | a <- as ]
-        _        -> do
-          -- Each a needs to be less than at least one of the b's
-          sequence [ choice [ leqPlusView a b | b <- bs ] | a <- as ]
-          return []
-    leqPlusView n m = do
-      reportSDoc "tc.conv.nat" 10 $
-        text "comparePlusView" <+>
-          sep [ text (show n) <+> text "=<"
-              , text (show m) ]
-      case (n, m) of
-        -- Both closed
-        (ClosedLevel n, ClosedLevel m)
-          | n <= m -> ok
+          sep [ text (show a) <+> text "=<"
+              , text (show b) ]
+      wrap $ case (as, bs) of
 
-        -- Both neutral
-        (Plus n (NeutralLevel a), Plus m (NeutralLevel b))
-          | n <= m -> do
-            lvl <- primLevel
-            equalTerm (El (mkType 0) lvl) a b
+        -- same term
+        _ | as == bs -> ok
 
-        -- closed ≤ any
-        (ClosedLevel n, Plus m _)
-          | n <= m -> ok
+        -- 0 ≤ any
+        ([], _) -> ok
 
-        -- Any blocked or meta
-        (Plus _ BlockedLevel{}, _) -> postpone
-        (_, Plus _ BlockedLevel{}) -> postpone
-        (Plus _ MetaLevel{}, _)    -> postpone
-        (_, Plus _ MetaLevel{})    -> postpone
+        -- as ≤ 0
+        (as, [])  -> sequence_ [ equalLevel (Max [a]) (Max []) | a <- as ]
 
-        _ -> notok
-    ok       = return []
-    notok    = typeError $ NotLeqSort (Type a) (Type b)
-    postpone = patternViolation
+        -- as ≤ [b]
+        (as@(_:_:_), [b]) -> sequence_ [ leqView (Max [a]) (Max [b]) | a <- as ]
 
-    choice []     = patternViolation
-    choice (m:ms) = noConstraints m `catchError` \_ -> choice ms
+        -- reduce constants
+        (as, bs) | minN > 0 -> leqView (Max $ map (subtr minN) as) (Max $ map (subtr minN) bs)
+          where
+            ns = map constant as
+            ms = map constant bs
+            minN = minimum (ns ++ ms)
+
+        -- remove subsumed
+        (as, bs)
+          | not $ null dups -> leqView (Max $ as \\ dups) (Max bs)
+          where
+            dups = [ a | a@(Plus m l) <- as, Just n <- [findN l], m <= n ]
+            findN a = case [ n | Plus n b <- bs, b == a ] of
+                        [n] -> Just n
+                        _   -> Nothing
+
+        -- closed ≤ bs
+        ([ClosedLevel n], bs)
+          | n <= maximum (map constant bs) -> ok
+
+        -- as ≤ neutral
+        (as, bs)
+          | neutralB && maxA > maxB -> notok
+          | neutralB && any (\a -> neutral a && not (isInB a)) as -> notok
+          | neutralB && neutralA -> maybeok $ all (\a -> constant a <= findN a) as
+          where
+            maxA = maximum $ map constant as
+            maxB = maximum $ map constant bs
+            neutralA = all neutral as
+            neutralB = all neutral bs
+            isInB a = elem (unneutral a) $ map unneutral bs
+            findN a = case [ n | b@(Plus n _) <- bs, unneutral b == unneutral a ] of
+                        [n] -> n
+                        _   -> __IMPOSSIBLE__
+
+        -- [a] ≤ [neutral]
+        ([a@(Plus n _)], [b@(Plus m NeutralLevel{})])
+          | m == n -> equalLevel (Max [a]) (Max [b])
+
+        -- anything else
+        _ -> postpone
+      where
+        ok       = return ()
+        notok    = typeError $ NotLeqSort (Type a) (Type b)
+        postpone = patternViolation
+
+        wrap m = catchError m $ \e ->
+          case errError e of
+            TypeError{} -> notok
+            _           -> throwError e
+
+        maybeok True = ok
+        maybeok False = notok
+
+        neutral (Plus _ NeutralLevel{}) = True
+        neutral _                       = False
+
+        meta (Plus _ MetaLevel{}) = True
+        meta _                    = False
+
+        unneutral (Plus _ (NeutralLevel v)) = v
+        unneutral _ = __IMPOSSIBLE__
+
+        constant (ClosedLevel n) = n
+        constant (Plus n _)      = n
+
+        subtr m (ClosedLevel n) = ClosedLevel (n - m)
+        subtr m (Plus n l)      = Plus (n - m) l
+
+--     choice []     = patternViolation
+--     choice (m:ms) = noConstraints m `catchError` \_ -> choice ms
 --       case errError e of
 --         PatternErr{} -> choice ms
 --         _            -> throwError e
 
-equalLevel :: MonadTCM tcm => Term -> Term -> tcm Constraints
+equalLevel :: Level -> Level -> TCM ()
 equalLevel a b = do
-  lvl    <- primLevel
-  Max as <- levelView a
-  Max bs <- levelView b
-  a <- unLevelView (Max as)
-  b <- unLevelView (Max bs)
-  liftTCM $ catchConstraint (ValueCmp CmpEq (El (mkType 0) lvl) a b)
-          $ check a b as bs
+  a <- reduce a
+  b <- reduce b
+  reportSLn "tc.conv.level" 50 $ "equalLevel (" ++ show a ++ ") (" ++ show b ++ ")"
+  liftTCM $ catchConstraint (LevelCmp CmpEq a b) $
+    check a b
   where
-    check a b as bs = do
-      reportSDoc "tc.conv.nat" 20 $
+    check a@(Max as) b@(Max bs) = do
+      reportSDoc "tc.conv.level" 40 $
         sep [ text "equalLevel"
-            , nest 2 $ sep [ prettyTCM a <+> text "=="
-                           , prettyTCM b
-                           ]
-            , nest 2 $ sep [ text (show (Max as)) <+> text "=="
-                           , text (show (Max bs))
-                           ]
+            , vcat [ nest 2 $ sep [ prettyTCM a <+> text "=="
+                                  , prettyTCM b
+                                  ]
+                   , nest 2 $ sep [ text (show (Max as)) <+> text "=="
+                                  , text (show (Max bs))
+                                  ]
+                   ]
             ]
       let a === b   = do
             lvl <- getLvl
             equalAtom lvl a b
-          as =!= bs = do a <- unLevelView (Max as)
-                         b <- unLevelView (Max bs)
-                         a === b
+          as =!= bs = levelTm (Max as) === levelTm (Max bs)
+      as <- return $ closed0 as
+      bs <- return $ closed0 bs
       case (as, bs) of
         _ | List.sort as == List.sort bs -> ok
           | any isBlocked (as ++ bs) -> do
               lvl <- getLvl
-              liftTCM $ useInjectivity CmpEq lvl a b
-
-        -- 0 == any
-        ([], _) -> wrap $ concat <$> sequence [ as =!= [b] | b <- bs ]
-        (_, []) -> wrap $ concat <$> sequence [ [a] =!= bs | a <- as ]
+              liftTCM $ useInjectivity CmpEq lvl (Level a) (Level b)
 
         -- closed == closed
         ([ClosedLevel n], [ClosedLevel m])
@@ -552,6 +657,14 @@
         ([ClosedLevel{}], _) | any isNeutral bs -> notok
         (_, [ClosedLevel{}]) | any isNeutral as -> notok
 
+        -- 0 == any
+        ([ClosedLevel 0], bs@(_:_:_)) -> sequence_ [ equalLevel (Max []) (Max [b]) | b <- bs ]
+        (as@(_:_:_), [ClosedLevel 0]) -> sequence_ [ equalLevel (Max [a]) (Max []) | a <- as ]
+
+        -- Same meta
+        ([Plus n (MetaLevel x _)], [Plus m (MetaLevel y _)])
+          | n == m && x == y -> ok
+
         -- meta == any
         ([Plus n (MetaLevel x as)], _)
           | any (isThisMeta x) bs -> postpone
@@ -573,16 +686,21 @@
         _ -> postpone
 
       where
-        ok       = return []
+        ok       = return ()
         notok    = typeError $ UnequalSorts (Type a) (Type b)
-        postpone = patternViolation
+        postpone = do
+          reportSLn "tc.conv.level" 30 $ "postponing: " ++ show a ++ " == " ++ show b
+          patternViolation
 
+        closed0 [] = [ClosedLevel 0]
+        closed0 as = as
+
         getLvl = El (mkType 0) <$> primLevel
 
         meta n x as bs = do
+          reportSLn "tc.meta.level" 50 $ "meta " ++ show as ++ " " ++ show bs
           bs' <- mapM (subtr n) bs
-          lvl <- getLvl
-          assignV lvl x as =<< unLevelView (Max bs')
+          assignV x as $ levelTm (Max bs')
 
         -- Make sure to give a sensible error message
         wrap m = m `catchError` \err ->
@@ -598,6 +716,7 @@
         subtr _ (Plus _ BlockedLevel{}) = postpone
         subtr _ (Plus _ MetaLevel{})    = postpone
         subtr _ (Plus _ NeutralLevel{}) = postpone
+        subtr _ (Plus _ UnreducedLevel{}) = __IMPOSSIBLE__
 
         isNeutral (Plus _ NeutralLevel{}) = True
         isNeutral _                       = False
@@ -618,81 +737,46 @@
 
 
 -- | Check that the first sort equal to the second.
-equalSort :: MonadTCM tcm => Sort -> Sort -> tcm Constraints
+equalSort :: Sort -> Sort -> TCM ()
 equalSort s1 s2 =
-  ifM typeInType (return []) $
+  ifM typeInType (return ()) $
     catchConstraint (SortCmp CmpEq s1 s2) $ do
         (s1,s2) <- reduce (s1,s2)
-        reportSDoc "tc.conv.sort" 10 $
+        reportSDoc "tc.conv.sort" 30 $
           sep [ text "equalSort"
-              , nest 2 $ fsep [ prettyTCM s1 <+> text "=="
-                              , prettyTCM s2 ]
+              , vcat [ nest 2 $ fsep [ prettyTCM s1 <+> text "=="
+                                     , prettyTCM s2 ]
+                     , nest 2 $ fsep [ text (show s1) <+> text "=="
+                                     , text (show s2) ]
+                     ]
               ]
 	case (s1,s2) of
 
-            -- New universe polymorphism
---             (Type a, Type b) -> compareLevel CmpEq a b
-
-            (Type (Lit n), Type (Lit m))
-              | n == m           -> return []
-              | otherwise        -> notEq s1 s2
             (Type a  , Type b  ) -> equalLevel a b
 
-	    (MetaS x us , MetaS y vs) -> do
-              s1 <- normalise s1
-              s2 <- normalise s2
-              if s1 == s2 then return []
-			  else do
-		[p1, p2] <- mapM getMetaPriority [x, y]
-		if p1 >= p2 then assignS x us s2
-			    else assignS y vs s1
-	    (MetaS x vs, _       ) -> assignS x vs s2
-	    (_	     , MetaS{} ) -> equalSort s2 s1
-
-	    (Prop    , Prop    ) -> return []
+	    (Prop    , Prop    ) -> return ()
 	    (Type _  , Prop    ) -> notEq s1 s2
 	    (Prop    , Type _  ) -> notEq s1 s2
 
-	    (Suc s   , Prop    ) -> notEq s1 s2
-	    (Suc s   , Type (Lit (LitLevel _ 0))) -> notEq s1 s2
-	    (Suc s   , Type (Lit (LitLevel _ 1))) -> buildConstraint (SortCmp CmpEq s1 s2)
-	    (Suc s   , Type (Lit (LitLevel _ n))) -> equalSort s (mkType $ n - 1)
-	    (Prop    , Suc s   ) -> notEq s1 s2
-	    (Type (Lit (LitLevel _ 0))  , Suc s   ) -> notEq s1 s2
-	    (Type (Lit (LitLevel _ 1))  , Suc s   ) -> buildConstraint (SortCmp CmpEq s1 s2)
-	    (Type (Lit (LitLevel _ n))  , Suc s   ) -> equalSort (mkType $ n - 1) s
-            (Suc s1  , Suc s2  ) -> equalSort s1 s2 -- TODO: not what we want for Prop(?)
-	    (_	     , Suc _   ) -> buildConstraint (SortCmp CmpEq s1 s2)
-	    (Suc _   , _       ) -> buildConstraint (SortCmp CmpEq s1 s2)
-
-            (Inf     , Inf     )             -> return []
+            (Inf     , Inf     )             -> return ()
+            (Inf     , Type (Max as@(_:_)))  -> mapM_ (isInf $ notEq s1 s2) as
+            (Type (Max as@(_:_)), Inf)       -> mapM_ (isInf $ notEq s1 s2) as
             (Inf     , _       )             -> notEq s1 s2
             (_       , Inf     )             -> notEq s1 s2
-            (s0@(Type (Lit (LitLevel _ 0))), Lub s1 s2) -> do
-              cs1 <- equalSort s0 s1
-              cs2 <- equalSort s0 s2
-              return $ cs1 ++ cs2
-            (Lub s1 s2, s0@(Type (Lit (LitLevel _ 0)))) -> do
-              cs1 <- equalSort s1 s0
-              cs2 <- equalSort s2 s0
-              return $ cs1 ++ cs2
-            (Lub{}   , Lub{}   ) -> do
-              (s1, s2) <- normalise (s1, s2)
-              if s1 == s2
-                then return []
-                else buildConstraint (SortCmp CmpEq s1 s2)
-	    (Lub _ _ , _       ) -> buildConstraint (SortCmp CmpEq s1 s2)
-	    (_	     , Lub _ _ ) -> buildConstraint (SortCmp CmpEq s1 s2)
 
-            (DLub s1 s2, s0@(Type (Lit (LitLevel _ 0)))) -> do
-              cs1 <- equalSort s1 s0
-              cs2 <- underAbstraction_ s2 $ \s2 -> equalSort s2 s0
-              return $ cs1 ++ cs2
-            (s0@(Type (Lit (LitLevel _ 0))), DLub s1 s2) -> do
-              cs1 <- equalSort s0 s1
-              cs2 <- underAbstraction_ s2 $ \s2 -> equalSort s0 s2
-              return $ cs1 ++ cs2
-            (DLub{}  , _       )             -> buildConstraint (SortCmp CmpEq s1 s2)
-            (_       , DLub{}  )             -> buildConstraint (SortCmp CmpEq s1 s2)
+            (DLub s1 s2, s0@(Type (Max []))) -> do
+              equalSort s1 s0
+              underAbstraction_ s2 $ \s2 -> equalSort s2 s0
+            (s0@(Type (Max [])), DLub s1 s2) -> do
+              equalSort s0 s1
+              underAbstraction_ s2 $ \s2 -> equalSort s0 s2
+            (DLub{}  , _       )             -> addConstraint (SortCmp CmpEq s1 s2)
+            (_       , DLub{}  )             -> addConstraint (SortCmp CmpEq s1 s2)
     where
 	notEq s1 s2 = typeError $ UnequalSorts s1 s2
+
+        isInf notok ClosedLevel{} = notok
+        isInf notok (Plus _ l) = case l of
+          MetaLevel x vs          -> assignV x vs (Sort Inf)
+          NeutralLevel (Sort Inf) -> return ()
+          _                       -> notok
diff --git a/src/full/Agda/TypeChecking/Conversion.hs-boot b/src/full/Agda/TypeChecking/Conversion.hs-boot
--- a/src/full/Agda/TypeChecking/Conversion.hs-boot
+++ b/src/full/Agda/TypeChecking/Conversion.hs-boot
@@ -4,15 +4,14 @@
 import Agda.Syntax.Internal
 import Agda.TypeChecking.Monad
 
-compareTerm :: MonadTCM tcm => Comparison -> Type -> Term -> Term -> tcm Constraints
-compareAtom :: MonadTCM tcm => Comparison -> Type -> Term -> Term -> tcm Constraints
-compareArgs :: MonadTCM tcm => [Polarity] -> Type -> Args -> Args -> tcm Constraints
-compareType :: MonadTCM tcm => Comparison -> Type -> Type -> tcm Constraints
-compareTel  :: MonadTCM tcm => Comparison -> Telescope -> Telescope -> tcm Constraints
-compareSort :: MonadTCM tcm => Comparison -> Sort -> Sort -> tcm Constraints
-equalTerm :: MonadTCM tcm => Type -> Term -> Term -> tcm Constraints
-equalArgs :: MonadTCM tcm => Type -> Args -> Args -> tcm Constraints
-equalType :: MonadTCM tcm => Type -> Type -> tcm Constraints
-equalSort :: MonadTCM tcm => Sort -> Sort -> tcm Constraints
-
-
+compareTerm  :: Comparison -> Type -> Term -> Term -> TCM ()
+compareAtom  :: Comparison -> Type -> Term -> Term -> TCM ()
+compareArgs  :: [Polarity] -> Type -> Term -> Args -> Args -> TCM ()
+compareElims :: [Polarity] -> Type -> Term -> [Elim] -> [Elim] -> TCM ()
+compareType  :: Comparison -> Type -> Type -> TCM ()
+compareTel   :: Type -> Type -> Comparison -> Telescope -> Telescope -> TCM ()
+compareSort  :: Comparison -> Sort -> Sort -> TCM ()
+equalTerm    :: Type -> Term -> Term -> TCM ()
+equalType    :: Type -> Type -> TCM ()
+equalSort    :: Sort -> Sort -> TCM ()
+leqType      :: Type -> Type -> TCM ()
diff --git a/src/full/Agda/TypeChecking/Coverage.hs b/src/full/Agda/TypeChecking/Coverage.hs
--- a/src/full/Agda/TypeChecking/Coverage.hs
+++ b/src/full/Agda/TypeChecking/Coverage.hs
@@ -33,6 +33,7 @@
 import Agda.TypeChecking.Reduce
 import Agda.TypeChecking.Primitive (constructorForm)
 import Agda.TypeChecking.Telescope
+import Agda.TypeChecking.Irrelevance
 
 import Agda.Interaction.Options
 
@@ -74,12 +75,11 @@
       pwords "Cannot pattern match on record" ++ [prettyTCM t] ++
       pwords "because it has no constructor"
     CantSplit c tel cIxs gIxs flex -> addCtxTel tel $ vcat
-      [ fsep $ pwords "Cannot pattern match on constructor" ++ [prettyTCM c <> text ","] ++
-               pwords "since the inferred indices"
+      [ fsep $ pwords "Cannot decide whether there should be a case for the constructor" ++ [prettyTCM c <> text ","] ++
+               pwords "since the unification gets stuck on unifying the inferred indices"
       , nest 2 $ prettyTCM cIxs
-      , fsep $ pwords "cannot be unified with the expected indices"
+      , fsep $ pwords "with the expected indices"
       , nest 2 $ prettyTCM gIxs
-      , fsep $ pwords "for some" ++ punctuate comma (map prettyTCM flex)
       ]
     GenericSplitError s -> fsep $
       pwords "Split failed:" ++ pwords s
@@ -106,10 +106,10 @@
   TelV gamma _ <- telView $ defType d
   let defn = theDef d
   case defn of
-    Function{ funClauses = cs'@(_:_) } -> do
-      let cs           = map translatedClause cs'
-          n            = genericLength $ clausePats $ head cs
-          gamma'       = telFromList $ genericTake n $ telToList gamma
+    Function{ funProjection = proj, funClauses = cs@(_:_) } -> do
+      let n            = genericLength $ clausePats $ head cs
+          np           = maybe 0 snd proj
+          gamma'       = telFromList $ genericTake n $ genericDrop np $ telToList gamma
           xs           = map (fmap $ const $ VarP "_") $ telToList gamma'
       reportSDoc "tc.cover.top" 10 $ vcat
         [ text "Coverage checking"
@@ -122,18 +122,17 @@
           _   ->
             setCurrentRange (getRange cs) $
               typeError $ CoverageFailure f pss
-      whenM (optUnreachableCheck <$> pragmaOptions) $
-        case Set.toList $ Set.difference (Set.fromList [0..genericLength cs - 1]) used of
-          []  -> return ()
-          is  -> do
-            let unreached = map ((cs !!) . fromIntegral) is
-            setCurrentRange (getRange unreached) $
-              typeError $ UnreachableClauses f (map clausePats unreached)
+      case Set.toList $ Set.difference (Set.fromList [0..genericLength cs - 1]) used of
+        []  -> return ()
+        is  -> do
+          let unreached = map ((cs !!) . fromIntegral) is
+          setCurrentRange (getRange unreached) $
+            typeError $ UnreachableClauses f (map clausePats unreached)
     _             -> __IMPOSSIBLE__
 
 -- | Check that the list of clauses covers the given split clause.
 --   Returns the missing cases.
-cover :: MonadTCM tcm => [Clause] -> SplitClause -> tcm (Set Nat, [[Arg Pattern]])
+cover :: [Clause] -> SplitClause -> TCM (Set Nat, [[Arg Pattern]])
 cover cs (SClause tel perm ps _) = do
   reportSDoc "tc.cover.cover" 10 $ vcat
     [ text "checking coverage of pattern:"
@@ -148,18 +147,17 @@
       let is = [ j | (j, c) <- zip [0..] (genericTake i cs), matchLits c ps perm ]
       reportSLn "tc.cover.cover"  10 $ "literal matches: " ++ show is
       return (Set.fromList (i : is), [])
-    No             -> return (Set.empty, [ps])
-    Block Nothing  -> fail $ "blocked by dot pattern"
-    Block (Just x) -> do
+    No      -> return (Set.empty, [ps])
+    Block x -> do
       r <- split Inductive tel perm ps x
       case r of
         Left err  -> case err of
-          CantSplit c _ _ _ _   -> typeError $ CoverageCantSplitOn c
-          NotADatatype a        -> typeError $ CoverageCantSplitType a
-          IrrelevantDatatype a  -> typeError $ CoverageCantSplitType a
-          CoinductiveDatatype a -> typeError $ CoverageCantSplitType a
-          NoRecordConstructor a -> typeError $ CoverageCantSplitType a
-          GenericSplitError s   -> fail $ "failed to split: " ++ s
+          CantSplit c tel us vs _ -> typeError $ CoverageCantSplitOn c tel us vs
+          NotADatatype a          -> typeError $ CoverageCantSplitType a
+          IrrelevantDatatype a    -> typeError $ CoverageCantSplitIrrelevantType a
+          CoinductiveDatatype a   -> typeError $ CoverageCantSplitType a
+          NoRecordConstructor a   -> typeError $ CoverageCantSplitType a
+          GenericSplitError s     -> fail $ "failed to split: " ++ s
         Right scs -> (Set.unions -*- concat) . unzip <$> mapM (cover cs) scs
 
 -- | Check that a type is a non-irrelevant datatype or a record with
@@ -170,15 +168,17 @@
               tcm (QName, [Arg Term], [Arg Term], [QName])
 isDatatype ind at = do
   let t = unArg at
-  t' <- normalise t
+  t' <- liftTCM $ reduce t
   case unEl t' of
     Def d args -> do
-      def <- theDef <$> getConstInfo d
+      def <- liftTCM $ theDef <$> getConstInfo d
+      splitOnIrrelevantDataAllowed <- liftTCM $ optExperimentalIrrelevance <$> pragmaOptions
       case def of
         Datatype{dataPars = np, dataCons = cs, dataInduction = i}
           | i == CoInductive && ind /= CoInductive ->
               throwException $ CoinductiveDatatype t
-          | argRelevance at == Irrelevant ->
+          -- Andreas, 2011-10-03 allow some splitting on data (if only one constr. matches)
+          | argRelevance at == Irrelevant && not splitOnIrrelevantDataAllowed ->
               throwException $ IrrelevantDatatype t
           | otherwise -> do
               let (ps, is) = genericSplitAt np args
@@ -194,16 +194,16 @@
 computeNeighbourhood delta1 delta2 perm d pars ixs hix hps con = do
 
   -- Get the type of the datatype
-  dtype <- normalise =<< (`piApply` pars) . defType <$> getConstInfo d
+  dtype <- liftTCM $ (`piApply` pars) . defType <$> getConstInfo d
 
   -- Get the real constructor name
-  Con con [] <- constructorForm =<< normalise (Con con [])
+  Con con [] <- liftTCM $ constructorForm =<< normalise (Con con [])
 
   -- Get the type of the constructor
-  ctype <- defType <$> getConstInfo con
+  ctype <- liftTCM $ defType <$> getConstInfo con
 
   -- Lookup the type of the constructor at the given parameters
-  TelV gamma (El _ (Def _ cixs)) <- telView (ctype `piApply` pars)
+  TelV gamma (El _ (Def _ cixs)) <- liftTCM $ telView (ctype `piApply` pars)
 
   debugInit con ctype pars ixs cixs delta1 delta2 gamma hps hix
 
@@ -259,7 +259,7 @@
       -- Apply the unifying substitution to Θ
       -- We get ρ' : Θ' -> Θ
       --        π  : Θ' -> Θ
-      (theta', iperm, rho', _) <- instantiateTel sub' theta
+      (theta', iperm, rho', _) <- liftTCM $ instantiateTel sub' theta
       debugTel "theta'" theta'
       debugShow "iperm" iperm
 
@@ -282,7 +282,7 @@
 
   where
     debugInit con ctype pars ixs cixs delta1 delta2 gamma hps hix =
-      reportSDoc "tc.cover.split.con" 20 $ vcat
+      liftTCM $ reportSDoc "tc.cover.split.con" 20 $ vcat
         [ text "computeNeighbourhood"
         , nest 2 $ vcat
           [ text "con    =" <+> prettyTCM con
@@ -299,34 +299,34 @@
         ]
 
     debugNoUnify =
-      reportSLn "tc.cover.split.con" 20 "  Constructor impossible!"
+      liftTCM $ reportSLn "tc.cover.split.con" 20 "  Constructor impossible!"
 
     debugCantSplit =
-      reportSLn "tc.cover.split.con" 20 "  Bad split!"
+      liftTCM $ reportSLn "tc.cover.split.con" 20 "  Bad split!"
 
     debugSubst s sub =
-      reportSDoc "tc.cover.split.con" 20 $ nest 2 $ vcat
+      liftTCM $ reportSDoc "tc.cover.split.con" 20 $ nest 2 $ vcat
         [ text (s ++ " =") <+> brackets (fsep $ punctuate comma $ map (maybe (text "_") prettyTCM) sub)
         ]
 
     debugTel s tel =
-      reportSDoc "tc.cover.split.con" 20 $ nest 2 $ vcat
+      liftTCM $ reportSDoc "tc.cover.split.con" 20 $ nest 2 $ vcat
         [ text (s ++ " =") <+> prettyTCM tel
         ]
 
     debugShow s x =
-      reportSDoc "tc.cover.split.con" 20 $ nest 2 $ vcat
+      liftTCM $ reportSDoc "tc.cover.split.con" 20 $ nest 2 $ vcat
         [ text (s ++ " =") <+> text (show x)
         ]
 
     debugPlugged ps ps' =
-      reportSDoc "tc.cover.split.con" 20 $ nest 2 $ vcat
+      liftTCM $ reportSDoc "tc.cover.split.con" 20 $ nest 2 $ vcat
         [ text "ps     =" <+> text (show ps)
         , text "ps'    =" <+> text (show ps')
         ]
 
     debugFinal tel perm ps =
-      reportSDoc "tc.cover.split.con" 20 $ nest 2 $ vcat
+      liftTCM $ reportSDoc "tc.cover.split.con" 20 $ nest 2 $ vcat
         [ text "rtel   =" <+> prettyTCM tel
         , text "rperm  =" <+> text (show perm)
         , text "rps    =" <+> text (show ps)
@@ -341,12 +341,11 @@
 splitClauseWithAbs c x =
   split' Inductive (clauseTel c) (clausePerm c) (clausePats c) x
 
-split :: MonadTCM tcm
-      => Induction
+split :: Induction
          -- ^ Coinductive constructors are allowed if this argument is
          -- 'CoInductive'.
       -> Telescope -> Permutation -> [Arg Pattern] -> Nat
-      -> tcm (Either SplitError Covering)
+      -> TCM (Either SplitError Covering)
 split ind tel perm ps x = do
   r <- split' ind tel perm ps x
   return $ case r of
@@ -354,12 +353,11 @@
     Right (Left _)  -> Right []
     Right (Right c) -> Right c
 
-split' :: MonadTCM tcm
-       => Induction
+split' :: Induction
           -- ^ Coinductive constructors are allowed if this argument is
           -- 'CoInductive'.
        -> Telescope -> Permutation -> [Arg Pattern] -> Nat
-       -> tcm (Either SplitError (Either SplitClause Covering))
+       -> TCM (Either SplitError (Either SplitClause Covering))
 split' ind tel perm ps x = liftTCM $ runExceptionT $ do
 
   debugInit tel perm x ps
@@ -370,7 +368,7 @@
     return (telFromList tel1, telFromList tel2)
 
   -- Get the type of the variable
-  t <- normalise $ typeOfVar tel x  -- Δ₁ ⊢ t
+  let t = typeOfVar tel x  -- Δ₁ ⊢ t
 
   -- Compute the one hole context of the patterns at the variable
   (hps, hix) <- do
@@ -380,16 +378,16 @@
 
     -- There is always a variable at the given hole.
     let (hix, (VarP s, hps)) = holes !! fromIntegral x
-    debugHoleAndType s hps t
+    debugHoleAndType delta1 delta2 s hps t
 
     return (hps, hix)
 
   -- Check that t is a datatype or a record
   -- Andreas, 2010-09-21, isDatatype now directly throws an exception if it fails
-  (d, pars, ixs, cons) <- isDatatype ind t
+  (d, pars, ixs, cons) <- inContextOfT $ isDatatype ind t
 
-  whenM (optWithoutK <$> pragmaOptions) $
-    Split.wellFormedIndices pars ixs
+  liftTCM $ whenM (optWithoutK <$> pragmaOptions) $
+    inContextOfT $ Split.wellFormedIndices pars ixs
 
   -- Compute the neighbourhoods for the constructors
   ns <- concat <$> mapM (computeNeighbourhood delta1 delta2 perm d pars ixs hix hps) cons
@@ -405,25 +403,36 @@
                , scSubst = [] -- not used anyway
                }
 
+    -- Andreas, 2011-10-03
+    -- if more than one constructor matches, we cannot be irrelevant
+    -- (this piece of code is unreachable if --experimental-irrelevance is off)
+    (_ : _ : _) | unusableRelevance (argRelevance t) ->
+      throwException $ IrrelevantDatatype (unArg t)
+
     _   -> return $ Right ns
 
   where
 
+    inContextOfT :: MonadTCM tcm => tcm a -> tcm a
+    inContextOfT = escapeContext (fromIntegral x + 1)
+
     -- Debug printing
     debugInit tel perm x ps =
-      reportSDoc "tc.cover.top" 10 $ vcat
+      liftTCM $ reportSDoc "tc.cover.top" 10 $ vcat
         [ text "TypeChecking.Rules.LHS.Coverage.split': split"
         , nest 2 $ vcat
-          [ text "tel  =" <+> prettyTCM tel
-          , text "perm =" <+> text (show perm)
-          , text "x    =" <+> text (show x)
-          , text "ps   =" <+> text (show ps)
+          [ text "tel     =" <+> prettyTCM tel
+          , text "perm    =" <+> text (show perm)
+          , text "x       =" <+> text (show x)
+          , text "ps      =" <+> text (show ps)
           ]
         ]
 
-    debugHoleAndType s hps t =
-      reportSDoc "tc.cover.top" 10 $ nest 2 $ vcat $
-        [ text "p   =" <+> text s
-        , text "hps =" <+> text (show hps)
-        , text "t   =" <+> prettyTCM t
+    debugHoleAndType delta1 delta2 s hps t =
+      liftTCM $ reportSDoc "tc.cover.top" 10 $ nest 2 $ vcat $
+        [ text "p      =" <+> text s
+        , text "hps    =" <+> text (show hps)
+        , text "delta1 =" <+> prettyTCM delta1
+        , text "delta2 =" <+> prettyTCM delta2
+        , text "t      =" <+> inContextOfT (prettyTCM t)
         ]
diff --git a/src/full/Agda/TypeChecking/Coverage/Match.hs b/src/full/Agda/TypeChecking/Coverage/Match.hs
--- a/src/full/Agda/TypeChecking/Coverage/Match.hs
+++ b/src/full/Agda/TypeChecking/Coverage/Match.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE CPP, DeriveFunctor #-}
 
 module Agda.TypeChecking.Coverage.Match where
 
@@ -27,7 +27,7 @@
 buildMPatterns :: Permutation -> [Arg Pattern] -> [Arg MPat]
 buildMPatterns perm ps = evalState (mapM (traverse build) ps) xs
   where
-    xs   = permute (invertP perm) $ reverse [0 .. fromIntegral (size perm) - 1]
+    xs   = permute (invertP perm) $ reverse [0 .. size perm - 1]
     tick = do x : xs <- get; put xs; return x
 
     build (VarP _)        = VarMP <$> tick
@@ -40,14 +40,9 @@
     buildT _              = return WildMP
 
 -- | If matching is inconclusive (@Block@) we want to know which
---   variable is blocking the match. If a dot pattern is blocking a match
---   we're screwed.
-data Match a = Yes a | No | Block (Maybe Nat)
-
-instance Functor Match where
-  fmap f (Yes a)   = Yes (f a)
-  fmap f No        = No
-  fmap f (Block x) = Block x
+--   variable is blocking the match.
+data Match a = Yes a | No | Block Nat
+  deriving (Functor)
 
 instance Monoid a => Monoid (Match a) where
   mempty                    = Yes mempty
@@ -110,8 +105,8 @@
 matchPat _    (DotP _) _ = Yes ()
 matchPat mlit (LitP l) q = mlit l q
 matchPat mlit (ConP c _ ps) q = case q of
-  VarMP x -> Block $ Just x
-  WildMP  -> Block Nothing
+  VarMP x -> Block x
+  WildMP  -> Yes ()
   ConMP c' qs
     | c == c'   -> matchPats mlit ps qs
     | otherwise -> No
diff --git a/src/full/Agda/TypeChecking/Datatypes.hs b/src/full/Agda/TypeChecking/Datatypes.hs
--- a/src/full/Agda/TypeChecking/Datatypes.hs
+++ b/src/full/Agda/TypeChecking/Datatypes.hs
@@ -17,7 +17,7 @@
 
 -- | Get the name of the datatype constructed by a given constructor.
 --   Precondition: The argument must refer to a constructor
-getConstructorData :: MonadTCM tcm => QName -> tcm QName
+getConstructorData :: QName -> TCM QName
 getConstructorData c = do
   def <- getConstInfo c
   case theDef def of
@@ -25,7 +25,7 @@
     _                        -> __IMPOSSIBLE__
 
 -- | Check if a name refers to a datatype or a record with a named constructor.
-isDatatype :: MonadTCM tcm => QName -> tcm Bool
+isDatatype :: QName -> TCM Bool
 isDatatype d = do
   def <- getConstInfo d
   case theDef def of
@@ -33,6 +33,15 @@
     Record{recNamedCon = namedC} -> return namedC
     _                            -> return False
 
+-- | Check if a name refers to a datatype or a record.
+isDataOrRecordType :: QName -> TCM Bool
+isDataOrRecordType d = do
+  def <- getConstInfo d
+  case theDef def of
+    Datatype{} -> return True
+    Record{}   -> return True
+    _          -> return False
+
 data DatatypeInfo = DataInfo
   { datatypeName   :: QName
   , datatypeParTel :: Telescope
@@ -43,7 +52,7 @@
 
 -- | Get the name and parameters from a type if it's a datatype or record type
 --   with a named constructor.
-getDatatypeInfo :: MonadTCM tcm => Type -> tcm (Maybe DatatypeInfo)
+getDatatypeInfo :: Type -> TCM (Maybe DatatypeInfo)
 getDatatypeInfo t = do
   t <- reduce t
   case unEl t of
diff --git a/src/full/Agda/TypeChecking/Datatypes.hs-boot b/src/full/Agda/TypeChecking/Datatypes.hs-boot
--- a/src/full/Agda/TypeChecking/Datatypes.hs-boot
+++ b/src/full/Agda/TypeChecking/Datatypes.hs-boot
@@ -4,5 +4,4 @@
 import Agda.TypeChecking.Monad.Base
 import Agda.Syntax.Internal
 
-getConstructorData :: MonadTCM tcm => QName -> tcm QName
-
+getConstructorData :: QName -> TCM QName
diff --git a/src/full/Agda/TypeChecking/DisplayForm.hs b/src/full/Agda/TypeChecking/DisplayForm.hs
--- a/src/full/Agda/TypeChecking/DisplayForm.hs
+++ b/src/full/Agda/TypeChecking/DisplayForm.hs
@@ -20,7 +20,7 @@
 displayForm :: QName -> Args -> TCM (Maybe DisplayTerm)
 displayForm c vs = do
     odfs  <- defDisplay <$> getConstInfo c
-    unless (null odfs) $ verboseS "tc.display.top" 30 $ do
+    unless (null odfs) $ verboseS "tc.display.top" 100 $ do
       n <- getContextId
       let fvs = map (\(OpenThing n _) -> n) odfs
       reportSLn "" 0 $ "displayForm: context = " ++ show n ++ ", dfs = " ++ show fvs
@@ -31,10 +31,11 @@
     let matches dfs vs = [ m | Just m <- map (flip matchDisplayForm vs) dfs, inScope scope m ]
     -- Not safe when printing non-terminating terms.
     -- (nfdfs, us) <- normalise (dfs, vs)
-    unless (null odfs) $ reportSLn "tc.display.top" 20 $ unlines
+    unless (null odfs) $ reportSLn "tc.display.top" 100 $ unlines
       [ "displayForms: " ++ show dfs
       , "arguments   : " ++ show vs
       , "matches     : " ++ show (matches dfs vs)
+      , "result      : " ++ show (foldr (const . Just) Nothing $ matches dfs vs)
       ]
     return $ foldr (const . Just) Nothing $ matches dfs vs -- ++ matches nfdfs us
   `catchError` \_ -> return Nothing
diff --git a/src/full/Agda/TypeChecking/Eliminators.hs b/src/full/Agda/TypeChecking/Eliminators.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/TypeChecking/Eliminators.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE CPP #-}
+
+module Agda.TypeChecking.Eliminators where
+
+import Control.Applicative
+import Control.Monad
+
+import Agda.Syntax.Common
+import Agda.Syntax.Internal
+import Agda.TypeChecking.Monad
+import Agda.TypeChecking.Substitute
+import Agda.Utils.Impossible
+import Agda.TypeChecking.Reduce
+
+#include "../undefined.h"
+
+data ElimView = VarElim Nat [Elim]
+              | DefElim QName [Elim]
+              | ConElim QName [Elim]
+              | MetaElim MetaId [Elim]
+              | NoElim Term
+
+elimView :: Term -> TCM ElimView
+elimView v = do
+  -- We can't assume that v has been reduced here in recursive calls,
+  -- since reducing a stuck application doesn't necessarily reduces all
+  -- the arguments.
+  v <- reduce v
+  case v of
+    Def f vs -> do
+      proj <- isProjection f
+      case proj of
+        Nothing -> DefElim f `app` vs
+        Just{}  -> do
+          case vs of
+            rv : vs' -> elim (Proj f : map Apply vs') <$> elimView (unArg rv)
+            [] -> __IMPOSSIBLE__
+              -- elimView should only be called from the conversion checker
+              -- with properly saturated applications
+    Var x vs   -> VarElim x `app` vs
+    Con c vs   -> ConElim c `app` vs
+    MetaV m vs -> MetaElim m `app` vs
+    Lam{}      -> noElim
+    Lit{}      -> noElim
+    Level{}    -> noElim
+    Sort{}     -> noElim
+    Pi{}       -> noElim
+    DontCare{} -> noElim
+    where
+      noElim = return $ NoElim v
+      app f vs = return $ f $ map Apply vs
+      elim :: [Elim] -> ElimView -> ElimView
+      elim _    NoElim{}        = __IMPOSSIBLE__
+      elim es2 (VarElim  x es1) = VarElim  x (es1 ++ es2)
+      elim es2 (DefElim  x es1) = DefElim  x (es1 ++ es2)
+      elim es2 (ConElim  x es1) = ConElim  x (es1 ++ es2)
+      elim es2 (MetaElim x es1) = MetaElim x (es1 ++ es2)
+
+-- | Only used when producing error messages.
+unElimView :: ElimView -> Term
+unElimView v = case v of
+  VarElim x es  -> unElim (Var x []) es
+  DefElim x es  -> unElim (Def x []) es
+  ConElim x es  -> unElim (Con x []) es
+  MetaElim x es -> unElim (MetaV x []) es
+  NoElim v      -> v
+
+unElim :: Term -> [Elim] -> Term
+unElim v [] = v
+unElim v (Apply u : es) = unElim (v `apply` [u]) es
+unElim v (Proj f : es)  = unElim (Def f [Arg NotHidden Relevant v]) es
diff --git a/src/full/Agda/TypeChecking/Empty.hs b/src/full/Agda/TypeChecking/Empty.hs
--- a/src/full/Agda/TypeChecking/Empty.hs
+++ b/src/full/Agda/TypeChecking/Empty.hs
@@ -10,29 +10,36 @@
 import Agda.TypeChecking.Coverage
 import Agda.TypeChecking.Constraints
 import Agda.TypeChecking.Reduce
+import Agda.TypeChecking.Substitute
 
 import Agda.Utils.Permutation
 import Agda.Utils.Size
 
 -- | Make sure that a type is empty.
-isEmptyType :: MonadTCM tcm => Type -> tcm ()
-isEmptyType t = noConstraints $ isEmptyTypeC t
+isReallyEmptyType :: Type -> TCM ()
+isReallyEmptyType t = noConstraints $ isEmptyType t
 
-isEmptyTypeC :: MonadTCM tcm => Type -> tcm Constraints
-isEmptyTypeC t = do
+isEmptyType :: Type -> TCM ()
+isEmptyType t = do
   tb <- reduceB t
   let t = ignoreBlocking tb
   case unEl <$> tb of
-    NotBlocked MetaV{} -> buildConstraint (IsEmpty t)
-    Blocked{}          -> buildConstraint (IsEmpty t)
+    -- if t is blocked or a meta, we cannot decide emptyness now. postpone
+    NotBlocked MetaV{} -> addConstraint (IsEmpty t)
+    Blocked{}          -> addConstraint (IsEmpty t)
     _                  -> do
+    -- from the current context xs:ts, create a pattern list
+    -- xs _ : ts t and try to split on _ (the last variable)
       tel0 <- getContextTelescope
-      let tel = telFromList $ telToList tel0 ++ [defaultArg ("_", t)]
-          ps  = [ Arg h r $ VarP x | Arg h r (x, _) <- telToList tel ]
+      let gamma = telToList tel0 ++ [defaultArg ("_", t)]
+          ps    = [ Arg h r $ VarP x | Arg h r (x, _) <- gamma ]
+          tel   = telFromList gamma
 
       r <- split Inductive tel (idP $ size tel) ps 0
 
       case r of
-        Left err  -> typeError $ ShouldBeEmpty t []
-        Right []  -> return []
+        Left err  -> case err of
+          CantSplit c tel us vs _ -> traceCall (CheckIsEmpty t) $ typeError $ CoverageCantSplitOn c tel us vs
+          _                       -> typeError $ ShouldBeEmpty t []
+        Right []  -> return ()
         Right cs  -> typeError $ ShouldBeEmpty t $ map (unArg . last . scPats) cs
diff --git a/src/full/Agda/TypeChecking/Empty.hs-boot b/src/full/Agda/TypeChecking/Empty.hs-boot
--- a/src/full/Agda/TypeChecking/Empty.hs-boot
+++ b/src/full/Agda/TypeChecking/Empty.hs-boot
@@ -1,9 +1,8 @@
 
 module Agda.TypeChecking.Empty where
 
-import Agda.TypeChecking.Monad (MonadTCM, Constraints)
+import Agda.TypeChecking.Monad (TCM)
 import Agda.Syntax.Internal (Type)
 
-isEmptyType :: MonadTCM tcm => Type -> tcm ()
-isEmptyTypeC :: MonadTCM tcm => Type -> tcm Constraints
-
+isReallyEmptyType :: Type -> TCM ()
+isEmptyType       :: Type -> TCM ()
diff --git a/src/full/Agda/TypeChecking/Errors.hs b/src/full/Agda/TypeChecking/Errors.hs
--- a/src/full/Agda/TypeChecking/Errors.hs
+++ b/src/full/Agda/TypeChecking/Errors.hs
@@ -39,7 +39,7 @@
 -- * Top level function
 ---------------------------------------------------------------------------
 
-prettyError :: MonadTCM tcm => TCErr -> tcm String
+prettyError :: TCErr -> TCM String
 prettyError err = liftTCM $ liftM show $
     prettyTCM err
     `catchError` \err' -> text "panic: error when printing error!" $$ prettyTCM err'
@@ -53,17 +53,17 @@
 -- * Helpers
 ---------------------------------------------------------------------------
 
-sayWhere :: (MonadTCM tcm, HasRange a) => a -> tcm Doc -> tcm Doc
+sayWhere :: HasRange a => a -> TCM Doc -> TCM Doc
 sayWhere x d = text (show $ getRange x) $$ d
 
-sayWhen :: MonadTCM tcm => Range -> Maybe (Closure Call) -> tcm Doc -> tcm Doc
+sayWhen :: Range -> Maybe (Closure Call) -> TCM Doc -> TCM Doc
 sayWhen r Nothing   m = sayWhere r m
 sayWhen r (Just cl) m = sayWhere r (m $$ prettyTCM cl)
 
-panic :: MonadTCM tcm => String -> tcm Doc
+panic :: String -> TCM Doc
 panic s = fwords $ "Panic: " ++ s
 
-nameWithBinding :: MonadTCM tcm => QName -> tcm Doc
+nameWithBinding :: QName -> TCM Doc
 nameWithBinding q =
   sep [ prettyTCM q, text "bound at", text (show r) ]
   where
@@ -75,7 +75,7 @@
     Exception r s   -> show r ++ " " ++ s
     IOException r e -> show r ++ " " ++ show e
     PatternErr _    -> "PatternErr"
-    AbortAssign _   -> "AbortAssign"
+    {- AbortAssign _   -> "AbortAssign" -- UNUSED -}
 
 errorString :: TypeError -> String
 errorString err = case err of
@@ -96,6 +96,7 @@
     ConstructorPatternInWrongDatatype{}      -> "ConstructorPatternInWrongDatatype"
     CoverageFailure{}                        -> "CoverageFailure"
     CoverageCantSplitOn{}                    -> "CoverageCantSplitOn"
+    CoverageCantSplitIrrelevantType{}        -> "CoverageCantSplitIrrelevantType"
     CoverageCantSplitType{}                  -> "CoverageCantSplitType"
     CyclicModuleDependency{}                 -> "CyclicModuleDependency"
     DataMustEndInSort{}                      -> "DataMustEndInSort"
@@ -108,6 +109,7 @@
     FieldOutsideRecord                       -> "FieldOutsideRecord"
     FileNotFound{}                           -> "FileNotFound"
     GenericError{}                           -> "GenericError"
+    IFSNoCandidateInScope{}                  -> "IFSNoCandidateInScope"
     IlltypedPattern{}                        -> "IlltypedPattern"
     IncompletePatternMatching{}              -> "IncompletePatternMatching"
     IndexFreeInParameter{}                   -> "IndexFreeInParameter"
@@ -141,10 +143,14 @@
     NotLeqSort{}                             -> "NotLeqSort"
     NotStrictlyPositive{}                    -> "NotStrictlyPositive"
     NothingAppliedToHiddenArg{}              -> "NothingAppliedToHiddenArg"
+    NothingAppliedToInstanceArg{}            -> "NothingAppliedToInstanceArg"
     OverlappingProjects {}                   -> "OverlappingProjects"
     PatternShadowsConstructor {}             -> "PatternShadowsConstructor"
     PropMustBeSingleton                      -> "PropMustBeSingleton"
     RepeatedVariablesInPattern{}             -> "RepeatedVariablesInPattern"
+    SafeFlagPostulate{}                      -> "SafeFlagPostulate"
+    SafeFlagPragma{}                         -> "SafeFlagPragma"
+    SafeFlagPrimTrustMe{}                    -> "SafeFlagPrimTrustMe"
     ShadowedModule{}                         -> "ShadowedModule"
     ShouldBeASort{}                          -> "ShouldBeASort"
     ShouldBeApplicationOf{}                  -> "ShouldBeApplicationOf"
@@ -167,6 +173,7 @@
     UnequalTerms{}                           -> "UnequalTerms"
     UnequalTypes{}                           -> "UnequalTypes"
     UnequalTelescopes{}                      -> "UnequalTelescopes"
+    HeterogeneousEquality{}                  -> "HeterogeneousEquality"
     UnexpectedWithPatterns{}                 -> "UnexpectedWithPatterns"
     UninstantiatedDotPattern{}               -> "UninstantiatedDotPattern"
     UninstantiatedModule{}                   -> "UninstantiatedModule"
@@ -177,6 +184,7 @@
     WrongHidingInApplication{}               -> "WrongHidingInApplication"
     WrongHidingInLHS{}                       -> "WrongHidingInLHS"
     WrongHidingInLambda{}                    -> "WrongHidingInLambda"
+    WrongIrrelevanceInLambda{}               -> "WrongIrrelevanceInLambda"
     WrongNumberOfConstructorArguments{}      -> "WrongNumberOfConstructorArguments"
 
 instance PrettyTCM TCErr where
@@ -190,7 +198,7 @@
 	Exception r s   -> sayWhere r $ fwords s
 	IOException r e -> sayWhere r $ fwords $ show e
 	PatternErr _    -> sayWhere err $ panic "uncaught pattern violation"
-	AbortAssign _   -> sayWhere err $ panic "uncaught aborted assignment"
+	{- AbortAssign _   -> sayWhere err $ panic "uncaught aborted assignment" -- UNUSED -}
 
 instance PrettyTCM TypeError where
     prettyTCM err = do
@@ -200,10 +208,18 @@
 	    NotSupported s -> fwords $ "Not supported: " ++ s
 	    CompilationError s -> sep [fwords "Compilation error:", text s]
 	    GenericError s   -> fwords s
-	    TerminationCheckFailed because -> fsep $
-	      pwords "Termination checking failed for the following functions:" ++
-              [ fsep (punctuate comma (map (text . show . qnameName)
-                                           (concatMap fst because))) <> text "." ]
+	    TerminationCheckFailed because ->
+              fwords "Termination checking failed for the following functions:"
+              $$ (nest 2 $
+                    fsep (punctuate comma (map (text . show . qnameName)
+                                               (concatMap termErrFunctions because))))
+              $$ fwords "Problematic calls:"
+              $$ (nest 2 $ vcat $
+                    map (\c -> let call = text (callInfoCall c) in
+                               case show (callInfoRange c) of
+                                 "" -> call
+                                 r  -> call $$ nest 2 (text "(at" <+> text r <> text ")"))
+                        (concatMap termErrCalls because))
 	    PropMustBeSingleton -> fwords
 		"Datatypes in Prop must have at most one constructor when proof irrelevance is enabled"
 	    DataMustEndInSort t -> fsep $
@@ -226,6 +242,8 @@
 		fwords "Found an implicit argument where an explicit argument was expected"
 	    WrongHidingInLambda t -> do
 		fwords "Found an implicit lambda where an explicit lambda was expected"
+	    WrongIrrelevanceInLambda t -> do
+		fwords "Found an irrelevant lambda where a relevant lambda was expected"
 	    WrongHidingInApplication t -> do
 		fwords "Found an implicit application where an explicit application was expected"
             NotInductive t -> fsep $
@@ -245,7 +263,8 @@
             ConstructorPatternInWrongDatatype c d -> fsep $
               [prettyTCM c] ++ pwords "is not a constructor of the datatype" ++ [prettyTCM d]
             IndicesNotConstructorApplications is ->
-              fsep (pwords "The following indices are not constructors applied to variables:")
+              fsep (pwords "The following indices are not constructors" ++
+                    pwords "(or literals) applied to variables:")
               $$ nest 2 (vcat $ map prettyTCM is)
             IndexVariablesNotDistinct is ->
               fsep (pwords "The variables in the following indices are not distinct:")
@@ -273,7 +292,7 @@
               pwords "The arguments to " ++ [prettyTCM m] ++ pwords "does not fit the telescope" ++
 	      [prettyTCM tel]
             ShouldBeEmpty t [] -> fsep $
-		[prettyTCM t] ++ pwords "should be empty, but it isn't obvious that it is."
+		[prettyTCM t] ++ pwords "should be empty, but that's not obvious to me"
 	    ShouldBeEmpty t ps -> fsep (
 		[prettyTCM t] ++
                 pwords "should be empty, but the following constructor patterns are valid:"
@@ -286,12 +305,12 @@
 	    NotAProperTerm ->
 		fwords "Found a malformed term"
             SplitOnIrrelevant p t -> fsep $
-                pwords "cannot pattern match" ++ [prettyA p] ++
+                pwords "Cannot pattern match" ++ [prettyA p] ++
                 pwords "against irrelevant type" ++ [prettyTCM t]
             DefinitionIsIrrelevant x -> fsep $
-                text "identifier" : prettyTCM x : pwords "is declared irrelevant, so it cannot be used here"
+                text "Identifier" : prettyTCM x : pwords "is declared irrelevant, so it cannot be used here"
             VariableIsIrrelevant x -> fsep $
-                text "variable" : prettyTCM x : pwords "is declared irrelevant, so it cannot be used here"
+                text "Variable" : prettyTCM x : pwords "is declared irrelevant, so it cannot be used here"
  	    UnequalTerms cmp s t a -> fsep $
 		[prettyTCM s, f cmp, prettyTCM t] ++ pwords "of type" ++ [prettyTCM a]
                 where
@@ -312,6 +331,10 @@
                 where
                   f CmpEq  = text "!="
                   f CmpLeq = text "!=<"
+	    HeterogeneousEquality u a v b -> fsep $
+                pwords "Refuse to solve heterogeneous constraint" ++
+                [prettyTCM u] ++ pwords ":" ++ [prettyTCM a] ++ pwords "=?=" ++
+                [prettyTCM v] ++ pwords ":" ++ [prettyTCM b]
 	    UnequalRelevance a b -> fsep $
 		[prettyTCM a] ++ pwords "!=" ++ [prettyTCM b] ++
 -- Andreas 2010-09-21 to reveal Forced annotations, print also uglily
@@ -477,6 +500,9 @@
 	    NothingAppliedToHiddenArg e	-> fsep $
 		[pretty e] ++ pwords "cannot appear by itself. It needs to be the argument to" ++
 		pwords "a function expecting an implicit argument."
+	    NothingAppliedToInstanceArg e -> fsep $
+		[pretty e] ++ pwords "cannot appear by itself. It needs to be the argument to" ++
+		pwords "a function expecting an instance argument."
 	    NoParseForApplication es -> fsep $
 		pwords "Could not parse the application" ++ [pretty $ C.RawApp noRange es]
 	    AmbiguousParseForApplication es es' -> fsep (
@@ -511,9 +537,16 @@
                       then return ps
                       else return ps  -- TODO: remove implicit arguments which aren't constructors
 
-            CoverageCantSplitOn c -> fsep $
-              pwords "Cannot split on the constructor" ++ [prettyTCM c]
+            CoverageCantSplitOn c tel cIxs gIxs -> inContext [] $ addCtxTel tel $ vcat
+              [ fsep $ pwords "Cannot decide whether there should be a case for the constructor" ++ [prettyTCM c <> text ","] ++
+                       pwords "since the unification gets stuck on unifying the inferred indices"
+              , nest 2 $ prettyTCM cIxs
+              , fsep $ pwords "with the expected indices"
+              , nest 2 $ prettyTCM gIxs ]
 
+            CoverageCantSplitIrrelevantType a -> fsep $
+              pwords "Cannot split on argument of irrelevant datatype" ++ [prettyTCM a]
+
             CoverageCantSplitType a -> fsep $
               pwords "Cannot split on argument of non-datatype" ++ [prettyTCM a]
 
@@ -543,13 +576,23 @@
 
 		    com []    = empty
 		    com (_:_) = comma
-
+            IFSNoCandidateInScope t -> fsep $
+                pwords "No variable of type" ++ [prettyTCM t] ++ pwords "was found in scope."
+            SafeFlagPostulate e -> fsep $
+                pwords "Cannot postulate" ++ [pretty e] ++ pwords "with safe flag"
+            SafeFlagPragma xs ->
+                let plural | length xs == 1 = ""
+                           | otherwise      = "s"
+                in fsep $ [fwords ("Cannot set OPTION pragma" ++ plural)]
+                          ++ map text xs ++ [fwords "with safe flag."]
+            SafeFlagPrimTrustMe -> fsep (pwords "Cannot use primTrustMe with safe flag")
           where
             mpar n args
               | n > 0 && not (null args) = parens
               | otherwise                = id
 
             showArg (Arg Hidden r x)    = braces $ showPat 0 x
+            showArg (Arg Instance r x)  = dbraces $ showPat 0 x
             showArg (Arg NotHidden r x) = showPat 1 x
 
             showPat _ (I.VarP _)        = text "_"
@@ -598,6 +641,9 @@
 	CheckPrimitive _ x e _ -> fsep $
 	    pwords "when checking that the type of the primitive function" ++
 	    [prettyTCM x] ++ pwords "is" ++ [prettyA e]
+        CheckWithFunctionType e _ -> fsep $
+            pwords "when checking that the type" ++
+            [prettyA e] ++ pwords "of the generated with function is well-formed"
         CheckDotPattern e v _ -> fsep $
             pwords "when checking that the given dot pattern" ++ [prettyA e] ++
             pwords "matches the inferred value" ++ [prettyTCM v]
@@ -607,14 +653,13 @@
 	    fsep $ pwords "when inferring the type of" ++ [prettyTCM x]
 	InferDef _ x _ ->
 	    fsep $ pwords "when inferring the type of" ++ [prettyTCM x]
+        CheckIsEmpty t _ ->
+            fsep $ pwords "when checking that" ++ [prettyTCM t] ++ pwords "has no constructors"
 	ScopeCheckExpr e _ ->
 	    fsep $ pwords "when scope checking" ++ [pretty e]
 	ScopeCheckDeclaration d _ ->
 	    fwords "when scope checking the declaration" $$
 	    nest 2 (pretty $ simpleDecl d)
-	ScopeCheckDefinition d _ ->
-	    fwords "when scope checking the definition" $$
-	    nest 2 (vcat $ map pretty $ simpleDef d)
 	ScopeCheckLHS x p _ ->
 	    fsep $ pwords "when scope checking the left-hand side" ++ [pretty p] ++
 		   pwords "in the definition of" ++ [pretty x]
@@ -622,41 +667,15 @@
 	    fsep $ pwords "when termination checking the definition of" ++ [prettyTCM f]
 	SetRange r _ ->
 	    fsep $ pwords "when doing something at" ++ [text $ show r]
-        CheckSectionApplication _ m1 ptel m2 args _ -> fsep $
+        CheckSectionApplication _ m1 modapp _ -> fsep $
           pwords "when checking the module application" ++
-          [prettyA $ A.Apply info m1 ptel m2 args Map.empty Map.empty]
+          [prettyA $ A.Apply info m1 modapp Map.empty Map.empty]
           where
             info = A.ModuleInfo noRange noRange Nothing Nothing Nothing
 
 	where
 	    hPretty a = pretty =<< abstractToConcreteCtx (hiddenArgumentCtx (argHiding a)) a
 
-	    simpleDef d = case d of
-	      D.FunDef _ ds _ _ _ _ _	 -> ds
-	      D.DataDef r fx p a d bs cs ->
-		[ C.Data r Inductive d (map bind bs) (C.Underscore noRange Nothing)
-		    $ map simpleDecl cs
-		]
-	      D.RecDef r fx p a d c bs cs ->
-		[ C.Record r d (name <$> c) (map bind bs) (C.Underscore noRange Nothing)
-		    $ map simpleDecl cs
-		]
-	      where
-		bind :: C.LamBinding -> C.TypedBindings
-		bind (C.DomainFull b) = b
-		bind (C.DomainFree h x) = C.TypedBindings r $ Arg h Relevant [C.TBind r [x] (C.Underscore r Nothing)]
-		  where r = getRange x
-
-                name (D.Axiom _ _ _ _ _ n _) = n
-                name _                     = __IMPOSSIBLE__
+	    simpleDecl d = d'
+              where [d'] = D.notSoNiceDeclarations [d]
 
-	    simpleDecl d = case d of
-		D.Axiom _ _ _ _ rel x e		       -> C.TypeSig rel x e
-		D.NiceField _ _ _ _ x e	               -> C.Field x e
-		D.PrimitiveFunction r _ _ _ x e	       -> C.Primitive r [C.TypeSig Relevant x e]
-		D.NiceDef r ds _ _		       -> C.Mutual r ds
-		D.NiceModule r _ _ x tel _	       -> C.Module r x tel []
-		D.NiceModuleMacro r _ _ x tel e op dir -> C.ModuleMacro r x tel e op dir
-		D.NiceOpen r x dir		       -> C.Open r x dir
-		D.NiceImport r x as op dir	       -> C.Import r x as op dir
-		D.NicePragma _ p		       -> C.Pragma p
diff --git a/src/full/Agda/TypeChecking/EtaContract.hs b/src/full/Agda/TypeChecking/EtaContract.hs
--- a/src/full/Agda/TypeChecking/EtaContract.hs
+++ b/src/full/Agda/TypeChecking/EtaContract.hs
@@ -26,32 +26,40 @@
   Def c xs   -> app (Def c) xs
   Con c xs   -> app (Con c) xs
   Lit _      -> noApp
+  Level _    -> noApp   -- could be an application, but let's not eta contract levels
   Lam _ _    -> noApp
   Pi _ _     -> noApp
-  Fun _ _    -> noApp
   Sort _     -> noApp
   MetaV _ _  -> noApp
-  DontCare   -> noApp
+  DontCare _ -> noApp
   where
     noApp = NoApp t
     app f [] = noApp
     app f xs = App (f $ init xs) (last xs)
 
-etaContract :: (MonadTCM tcm, TermLike a) => a -> tcm a
+etaContract :: TermLike a => a -> TCM a
 etaContract = traverseTermM etaOnce
   where
 
-etaOnce :: (MonadTCM tcm) => Term -> tcm Term
+etaOnce :: Term -> TCM Term
 etaOnce v = ignoreAbstractMode $ eta v
   where
-    eta t@(Lam h b) = do
+    eta t@(Lam h (Abs _ b)) = do  -- NoAbs can't be eta'd
       imp <- shouldEtaContractImplicit
-      case binAppView (absBody b) of
-        App u (Arg h' r (Var 0 []))
-          | allowed imp h' && not (freeIn 0 u) ->
+      case binAppView b of
+        App u (Arg h' r v)
+          | isVar0 v && allowed imp h' && not (freeIn 0 u) ->
             return $ subst __IMPOSSIBLE__ u
         _ -> return t
       where
+        isVar0 (Var 0 [])               = True
+        isVar0 (DontCare{})             = True  -- Andreas, 2011-10-01 eta-contract irrelevant functions also
+        isVar0 (Level (Max [Plus 0 l])) = case l of
+          NeutralLevel v   -> isVar0 v
+          UnreducedLevel v -> isVar0 v
+          BlockedLevel{}   -> False
+          MetaLevel{}      -> False
+        isVar0 _ = False
         allowed imp h' = h == h' && (imp || h == NotHidden)
     eta t@(Con c args) = do
       r <- getConstructorData c
diff --git a/src/full/Agda/TypeChecking/Forcing.hs b/src/full/Agda/TypeChecking/Forcing.hs
--- a/src/full/Agda/TypeChecking/Forcing.hs
+++ b/src/full/Agda/TypeChecking/Forcing.hs
@@ -42,8 +42,9 @@
     ifM (isInj d)
         (forcedArgs vs)
         (return [])
-  Fun a b -> (++) <$> forcedVariables (unEl $ unArg a)
-                  <*> forcedVariables (unEl b)
+  Pi a (NoAbs _ b) ->
+    (++) <$> forcedVariables (unEl $ unArg a)
+         <*> forcedVariables (unEl b)
   Pi a b -> (++) <$> forcedVariables (unEl $ unArg a)
                  <*> (underBinder <$> forcedVariables (unEl $ absBody b))
   -- Sorts?
@@ -56,7 +57,7 @@
       return $ case theDef def of
         Datatype{} -> True
         Record{}   -> True
-        Axiom{}    -> True
+        -- Axiom{}    -> True -- Postulates are not injective in general, right? /Olle 2011-05-05
         _          -> False
 
 force :: [Nat] -> Type -> Type
@@ -65,7 +66,6 @@
     m = maximum (-1:xs)
     aux i t | i > m = t
     aux i t = case t of
-      El s (Fun a b) -> El s $ Fun (upd a) (aux (i + 1) b)
       El s (Pi  a b) -> El s $ Pi  (upd a) (fmap (aux (i + 1)) b)
       _ -> __IMPOSSIBLE__
       where
diff --git a/src/full/Agda/TypeChecking/Free.hs b/src/full/Agda/TypeChecking/Free.hs
--- a/src/full/Agda/TypeChecking/Free.hs
+++ b/src/full/Agda/TypeChecking/Free.hs
@@ -6,12 +6,17 @@
     , Free
     , freeVars
     , allVars
-    , freeIn
+    , relevantVars
+    , rigidVars
+    , freeIn, isBinderUsed
     , freeInIgnoringSorts
+    , relevantIn
+    , Occurrence(..)
+    , occurrence
     ) where
 
-import qualified Data.Set as Set
-import Data.Set (Set)
+import qualified Agda.Utils.VarSet as Set
+import Agda.Utils.VarSet (VarSet)
 
 import Agda.Syntax.Common
 import Agda.Syntax.Internal
@@ -19,41 +24,98 @@
 #include "../undefined.h"
 import Agda.Utils.Impossible
 
-data FreeVars = FV { rigidVars	  :: Set Nat
-		   , flexibleVars :: Set Nat
-		   }
+-- | The distinction between rigid and strongly rigid occurrences comes from:
+--   Jason C. Reed, PhD thesis, 2009, page 96 (see also his LFMTP 2009 paper)
+--
+-- The main idea is that x = t(x) is unsolvable if x occurs strongly rigidly
+-- in t.  It might have a solution if the occurrence is not strongly rigid, e.g.
+--
+--   x = \f -> suc (f (x (\ y -> k)))  has  x = \f -> suc (f (suc k))
+--
+-- [Jason C. Reed, PhD thesis, page 106]
 
-allVars :: FreeVars -> Set Nat
-allVars fv = Set.union (rigidVars fv) (flexibleVars fv)
+-- | Free variables of a term, (disjointly) partitioned into strongly and
+--   and weakly rigid variables, flexible variables and irrelevant variables.
+data FreeVars = FV
+  { stronglyRigidVars :: VarSet -- ^ variables at top and under constructors
+  , weaklyRigidVars   :: VarSet -- ^ ord. rigid variables, e.g., in arguments of variables
+  , flexibleVars      :: VarSet -- ^ variables occuring in arguments of metas. These are potentially free, depending how the meta variable is instantiated.
+  , irrelevantVars    :: VarSet -- ^ variables under a @DontCare@, i.e., in irrelevant positions
+  }
 
+rigidVars :: FreeVars -> VarSet
+rigidVars fv = Set.union (stronglyRigidVars fv) (weaklyRigidVars fv)
+
+-- | @allVars fv@ includes irrelevant variables.
+allVars :: FreeVars -> VarSet
+allVars fv = Set.unions [rigidVars fv, flexibleVars fv, irrelevantVars fv]
+
+-- | All but the irrelevant variables.
+relevantVars :: FreeVars -> VarSet
+relevantVars fv = Set.unions [rigidVars fv, flexibleVars fv]
+
+data Occurrence
+  = NoOccurrence
+  | StronglyRigid
+  | WeaklyRigid
+  | Flexible
+  deriving (Eq,Show)
+
+-- | @occurrence x fv@ ignores irrelevant variables in @fv@
+occurrence :: Nat -> FreeVars -> Occurrence
+occurrence x fv
+  | x `Set.member` stronglyRigidVars fv = StronglyRigid
+  | x `Set.member` weaklyRigidVars   fv = WeaklyRigid
+  | x `Set.member` flexibleVars      fv = Flexible
+  | otherwise                           = NoOccurrence
+
+-- | Mark variables as flexible.  Useful when traversing arguments of metas.
 flexible :: FreeVars -> FreeVars
 flexible fv =
-    FV { rigidVars    = Set.empty
-       , flexibleVars = allVars fv
+    fv { stronglyRigidVars = Set.empty
+       , weaklyRigidVars   = Set.empty
+       , flexibleVars      = relevantVars fv
        }
 
+-- | Mark rigid variables as non-strongly.  Useful when traversion arguments of variables.
+weakly :: FreeVars -> FreeVars
+weakly fv = fv
+  { stronglyRigidVars = Set.empty
+  , weaklyRigidVars   = rigidVars fv
+  }
+
+-- | Mark all free variables as irrelevant.
+irrelevantly :: FreeVars -> FreeVars
+irrelevantly fv = empty { irrelevantVars = allVars fv }
+
+-- | Pointwise union.
 union :: FreeVars -> FreeVars -> FreeVars
-union (FV rv1 fv1) (FV rv2 fv2) = FV (Set.union rv1 rv2) (Set.union fv1 fv2)
+union (FV sv1 rv1 fv1 iv1) (FV sv2 rv2 fv2 iv2) =
+  FV (Set.union sv1 sv2) (Set.union rv1 rv2) (Set.union fv1 fv2) (Set.union iv1 iv2)
 
 unions :: [FreeVars] -> FreeVars
 unions = foldr union empty
 
 empty :: FreeVars
-empty = FV Set.empty Set.empty
-
-mapFV :: (Nat -> Nat) -> FreeVars -> FreeVars
-mapFV f (FV rv fv) = FV (Set.map f rv) (Set.map f fv)
+empty = FV Set.empty Set.empty Set.empty Set.empty
 
+-- | @delete x fv@ deletes variable @x@ from variable set @fv@.
 delete :: Nat -> FreeVars -> FreeVars
-delete x (FV rv fv) = FV (Set.delete x rv) (Set.delete x fv)
+delete n (FV sv rv fv iv) = FV (Set.delete n sv) (Set.delete n rv) (Set.delete n fv) (Set.delete n iv)
 
+-- | @subtractFV n fv@ subtracts $n$ from each free variable in @fv@.
+subtractFV :: Nat -> FreeVars -> FreeVars
+subtractFV n (FV sv rv fv iv) = FV (Set.subtract n sv) (Set.subtract n rv) (Set.subtract n fv) (Set.subtract n iv)
+
+-- | A single (strongly) rigid variable.
 singleton :: Nat -> FreeVars
-singleton x = FV { rigidVars	= Set.singleton x
-		 , flexibleVars = Set.empty
+singleton x = FV { stronglyRigidVars = Set.singleton x
+		 , weaklyRigidVars   = Set.empty -- WAS: Set.singleton x
+		 , flexibleVars      = Set.empty
+                 , irrelevantVars    = Set.empty
 		 }
 
--- | Doesn't go inside solved metas, but collects the variables from a
--- metavariable application @X ts@ as @flexibleVars@.
+-- * Collecting free variables.
 
 class Free a where
   freeVars' :: FreeConf -> a -> FreeVars
@@ -63,21 +125,26 @@
     -- ^ Ignore free variables in sorts.
   }
 
+-- | Doesn't go inside solved metas, but collects the variables from a
+-- metavariable application @X ts@ as @flexibleVars@.
 freeVars :: Free a => a -> FreeVars
 freeVars = freeVars' FreeConf{ fcIgnoreSorts = False }
 
 instance Free Term where
   freeVars' conf t = case t of
-    Var n ts   -> singleton n `union` freeVars' conf ts
+    Var n ts   -> singleton n `union` weakly (freeVars' conf ts)
     Lam _ t    -> freeVars' conf t
     Lit _      -> empty
-    Def _ ts   -> freeVars' conf ts
+    Def _ ts   -> weakly $ freeVars' conf ts  -- because we are not in TCM
+      -- we cannot query whether we are dealing with a data/record (strongly r.)
+      -- or a definition by pattern matching (weakly rigid)
+      -- thus, we approximate, losing that x = List x is unsolvable
     Con _ ts   -> freeVars' conf ts
     Pi a b     -> freeVars' conf (a,b)
-    Fun a b    -> freeVars' conf (a,b)
     Sort s     -> freeVars' conf s
+    Level l    -> freeVars' conf l
     MetaV _ ts -> flexible $ freeVars' conf ts
-    DontCare   -> empty
+    DontCare mt -> irrelevantly $ freeVars' conf mt
 
 instance Free Type where
   freeVars' conf (El s t) = freeVars' conf (s, t)
@@ -87,16 +154,30 @@
     | fcIgnoreSorts conf = empty
     | otherwise          = case s of
       Type a     -> freeVars' conf a
-      Suc s      -> freeVars' conf s
-      Lub s1 s2  -> freeVars' conf (s1, s2)
       Prop       -> empty
       Inf        -> empty
-      MetaS _ ts -> flexible $ freeVars' conf ts
-      DLub s1 s2 -> freeVars' conf (s1, s2)
+      DLub s1 s2 -> weakly $ freeVars' conf (s1, s2)
 
+instance Free Level where
+  freeVars' conf (Max as) = freeVars' conf as
+
+instance Free PlusLevel where
+  freeVars' conf ClosedLevel{} = empty
+  freeVars' conf (Plus _ l)    = freeVars' conf l
+
+instance Free LevelAtom where
+  freeVars' conf l = case l of
+    MetaLevel _ vs   -> flexible $ freeVars' conf vs
+    NeutralLevel v   -> freeVars' conf v
+    BlockedLevel _ v -> freeVars' conf v
+    UnreducedLevel v -> freeVars' conf v
+
 instance Free a => Free [a] where
-  freeVars' conf xs = unions $ map (freeVars' conf) xs
+  freeVars' conf = unions . map (freeVars' conf)
 
+instance Free a => Free (Maybe a) where
+  freeVars' conf = maybe empty (freeVars' conf)
+
 instance (Free a, Free b) => Free (a,b) where
   freeVars' conf (x,y) = freeVars' conf x `union` freeVars' conf y
 
@@ -104,7 +185,8 @@
   freeVars' conf = freeVars' conf . unArg
 
 instance Free a => Free (Abs a) where
-  freeVars' conf (Abs _ b) = mapFV (subtract 1) $ delete 0 $ freeVars' conf b
+  freeVars' conf (Abs   _ b) = subtractFV 1 $ delete 0 $ freeVars' conf b
+  freeVars' conf (NoAbs _ b) = freeVars' conf b
 
 instance Free a => Free (Tele a) where
   freeVars' conf EmptyTel	   = empty
@@ -113,7 +195,6 @@
 instance Free ClauseBody where
   freeVars' conf (Body t)   = freeVars' conf t
   freeVars' conf (Bind b)   = freeVars' conf b
-  freeVars' conf (NoBind b) = freeVars' conf b
   freeVars' conf  NoBody    = empty
 
 freeIn :: Free a => Nat -> a -> Bool
@@ -122,3 +203,11 @@
 freeInIgnoringSorts :: Free a => Nat -> a -> Bool
 freeInIgnoringSorts v t =
   v `Set.member` allVars (freeVars' FreeConf{ fcIgnoreSorts = True } t)
+
+relevantIn :: Free a => Nat -> a -> Bool
+relevantIn v t = v `Set.member` relevantVars (freeVars' FreeConf{ fcIgnoreSorts = True } t)
+
+-- | Is the variable bound by the abstraction actually used?
+isBinderUsed :: Free a => Abs a -> Bool
+isBinderUsed NoAbs{}   = False
+isBinderUsed (Abs _ x) = 0 `freeIn` x
diff --git a/src/full/Agda/TypeChecking/Implicit.hs b/src/full/Agda/TypeChecking/Implicit.hs
--- a/src/full/Agda/TypeChecking/Implicit.hs
+++ b/src/full/Agda/TypeChecking/Implicit.hs
@@ -8,34 +8,38 @@
 
 #include "../undefined.h"
 import Agda.Utils.Impossible
+import Control.Applicative
 
 data ImplicitInsertion
-      = ImpInsert Int	  -- ^ this many implicits have to be inserted
+      = ImpInsert [Hiding]	  -- ^ this many implicits have to be inserted
       | BadImplicits	  -- ^ hidden argument where there should have been a non-hidden arg
       | NoSuchName String -- ^ bad named argument
       | NoInsertNeeded
   deriving (Show)
 
-impInsert :: Int -> ImplicitInsertion
-impInsert 0 = NoInsertNeeded
-impInsert n = ImpInsert n
+impInsert :: [Hiding] -> ImplicitInsertion
+impInsert [] = NoInsertNeeded
+impInsert hs = ImpInsert hs
 
 -- | The list should be non-empty.
 insertImplicit :: NamedArg e -> [Arg String] -> ImplicitInsertion
 insertImplicit _ [] = __IMPOSSIBLE__
 insertImplicit a ts | argHiding a == NotHidden = impInsert $ nofHidden ts
   where
-    nofHidden :: [Arg a] -> Int
-    nofHidden = length . takeWhile ((Hidden ==) . argHiding)
-insertImplicit a ts@(t : _) =
-  case argHiding t of
-    NotHidden -> BadImplicits
-    Hidden    -> case nameOf (unArg a) of
-      Nothing -> impInsert 0
-      Just x  -> find 0 x ts
+    nofHidden :: [Arg a] -> [Hiding]
+    nofHidden = takeWhile (NotHidden /=) . map argHiding
+insertImplicit a ts =
+  case nameOf (unArg a) of
+    Nothing -> maybe BadImplicits impInsert $ upto (argHiding a) $ map argHiding ts
+    Just x  -> find [] x (argHiding a) ts
   where
-    find i x (Arg Hidden r y : ts)
-      | x == y	  = impInsert i
-      | otherwise = find (i + 1) x ts
-    find i x (Arg NotHidden _ _ : _) = NoSuchName x
-    find i x []			     = NoSuchName x
+    upto h [] = Nothing
+    upto h (NotHidden:_) = Nothing
+    upto h (h':_) | h == h' = Just []
+    upto h (h':hs) = (h':) <$> upto h hs
+    find _ x _ (Arg NotHidden _ _ : _) = NoSuchName x
+    find hs x hidingx (Arg hidingy r y : ts)
+      | x == y && hidingx == hidingy = impInsert $ reverse hs
+      | x == y && hidingx /= hidingy = BadImplicits
+      | otherwise = find (hidingy:hs) x hidingx ts
+    find i x _ []			     = NoSuchName x
diff --git a/src/full/Agda/TypeChecking/Injectivity.hs b/src/full/Agda/TypeChecking/Injectivity.hs
--- a/src/full/Agda/TypeChecking/Injectivity.hs
+++ b/src/full/Agda/TypeChecking/Injectivity.hs
@@ -35,7 +35,9 @@
 -- | Reduce simple (single clause) definitions.
 reduceHead :: Term -> TCM (Blocked Term)
 reduceHead v = ignoreAbstractMode $ do
+  -- first, possibly rewrite literal v to constructor form
   v <- constructorForm v
+  reportSDoc "tc.inj.reduce" 30 $ text "reduceHead" <+> prettyTCM v
   case v of
     Def f args -> do
       def <- theDef <$> getConstInfo f
@@ -67,12 +69,22 @@
     Con c _ -> return (Just $ ConHead c)
     Sort _  -> return (Just SortHead)
     Pi _ _  -> return (Just PiHead)
-    Fun _ _ -> return (Just PiHead)
     Lit _   -> return Nothing -- handle literal heads as well? can't think of
                               -- any examples where it would be useful...
     _       -> return Nothing
 
 checkInjectivity :: QName -> [Clause] -> TCM FunctionInverse
+checkInjectivity f cs
+  | pointLess cs = return NotInjective
+  where
+    -- Is it pointless to use injectivity for this function?
+    pointLess []      = True
+    pointLess (_:_:_) = False
+    pointLess [Clause{clausePats = ps}] = all (noMatch . unArg) ps
+      where noMatch ConP{} = False
+            noMatch LitP{} = False
+            noMatch VarP{} = True
+            noMatch DotP{} = True
 checkInjectivity f cs = do
   reportSLn "tc.inj.check" 40 $ "Checking injectivity of " ++ show f
   es <- concat <$> mapM entry cs
@@ -97,7 +109,6 @@
           h <- headSymbol v
           return [(h, c)]
 
-    rhs (NoBind b) = rhs b
     rhs (Bind b)   = underAbstraction_ b rhs
     rhs (Body v)   = return $ Just v
     rhs NoBody     = return Nothing
@@ -117,7 +128,7 @@
 data InvView = Inv QName Args (Map TermHead Clause)
              | NoInv
 
-useInjectivity :: Comparison -> Type -> Term -> Term -> TCM Constraints
+useInjectivity :: Comparison -> Type -> Term -> Term -> TCM ()
 useInjectivity cmp a u v = do
   uinv <- functionInverse u
   vinv <- functionInverse v
@@ -133,7 +144,7 @@
           , nest 2 $ text "and type" <+> prettyTCM a
           ]
         pol <- getPolarity' cmp f
-        compareArgs pol a fArgs gArgs
+        compareArgs pol a (Def f []) fArgs gArgs
       | otherwise -> fallBack
     (Inv f args inv, NoInv) -> do
       a <- defType <$> getConstInfo f
@@ -153,11 +164,12 @@
       invert v g a inv args =<< headSymbol u
     (NoInv, NoInv)          -> fallBack
   where
-    fallBack = buildConstraint $ ValueCmp cmp a u v
+    fallBack = addConstraint $ ValueCmp cmp a u v
 
+    invert :: Term -> QName -> Type -> Map TermHead Clause -> Args -> Maybe TermHead -> TCM ()
     invert _ _ a inv args Nothing  = fallBack
     invert org f ftype inv args (Just h) = case Map.lookup h inv of
-      Nothing                     -> typeError $ UnequalTerms cmp u v a
+      Nothing -> typeError $ UnequalTerms cmp u v a
       Just (Clause{ clauseTel  = tel
                   , clausePerm = perm
                   , clausePats = ps }) -> do -- instArgs args ps
@@ -186,26 +198,40 @@
           -- The clause might not give as many patterns as there
           -- are arguments (point-free style definitions).
           let args' = take (length margs) args
-          cs  <- compareArgs pol ftype margs args'
-          unless (null cs) patternViolation
+          compareArgs pol ftype org margs args'
+{- Andreas, 2011-05-09 allow unsolved constraints as long as progress
+          unless (null cs) $ do
+            reportSDoc "tc.inj.invert" 30 $
+              text "aborting inversion; remaining constraints" <+> prettyTCM cs
+            patternViolation
+-}
           -- Check that we made progress, i.e. the head symbol
           -- of the original term should be a constructor.
-          h <- headSymbol =<< reduce org
+          org <- reduce org
+          h <- headSymbol org
           case h of
             Just h  -> compareTerm cmp a u v
-            Nothing -> patternViolation
+            Nothing -> do
+             reportSDoc "tc.inj.invert" 30 $ vcat
+               [ text "aborting inversion;" <+> prettyTCM org
+               , text "plainly," <+> text (show org)
+               , text "has TermHead" <+> text (show h)
+               , text "which does not expose a constructor"
+               ]
+             patternViolation
         `catchError` \err -> case errError err of
           TypeError   {} -> throwError err
           Exception   {} -> throwError err
           IOException {} -> throwError err
           PatternErr  {} -> fallBack
-          AbortAssign {} -> fallBack
+          {- AbortAssign {} -> fallBack -- UNUSED -}
 
     nextMeta = do
       m : ms <- get
       put ms
       return m
 
+    dotP :: Monad m => Term -> StateT [Term] (ReaderT Substitution m) Term
     dotP v = do
       sub <- ask
       return $ substs sub v
diff --git a/src/full/Agda/TypeChecking/Irrelevance.hs b/src/full/Agda/TypeChecking/Irrelevance.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/TypeChecking/Irrelevance.hs
@@ -0,0 +1,161 @@
+{-# LANGUAGE CPP #-}
+
+{-| Irrelevant function types.
+-}
+module Agda.TypeChecking.Irrelevance where
+
+import Control.Applicative
+import Control.Monad.Reader
+
+import qualified Data.Map as Map
+
+import Agda.Interaction.Options
+
+import Agda.Syntax.Common
+
+import Agda.TypeChecking.Monad
+
+#include "../undefined.h"
+import Agda.Utils.Impossible
+
+-- | data 'Relevance'
+--   see 'Agda.Syntax.Common'
+
+-- | @unusableRelevance rel == True@ iff we cannot use a variable of @rel@.
+unusableRelevance :: Relevance -> Bool
+unusableRelevance rel = NonStrict `moreRelevant` rel
+
+composeRelevance :: Relevance -> Relevance -> Relevance
+composeRelevance r r' =
+  case (r, r') of
+    (Irrelevant, _) -> Irrelevant
+    (_, Irrelevant) -> Irrelevant
+    (NonStrict, _)  -> NonStrict
+    (_, NonStrict)  -> NonStrict
+    (Forced, _)     -> Forced
+    (_, Forced)     -> Forced
+    (Relevant, Relevant) -> Relevant
+
+-- | @inverseComposeRelevance r x@ returns the most irrelevant @y@
+--   such that forall @x@, @y@ we have
+--   @x `moreRelevant` (r `composeRelevance` y)@
+--   iff
+--   @(r `inverseComposeRelevance` x) `moreRelevant` y@ (Galois connection).
+inverseComposeRelevance :: Relevance -> Relevance -> Relevance
+inverseComposeRelevance r x =
+  case (r, x) of
+    (_, Forced)          -> Forced     -- preserve @Forced@
+    (Relevant, x)        -> x          -- going to relevant arg.: nothing changes
+    (Forced, Relevant)   -> Forced     -- going forced: relevants become forced
+    (Forced, x)          -> x
+    (Irrelevant, _)      -> Relevant   -- going irrelevant: every thing usable
+    (_, Irrelevant)      -> Irrelevant -- otherwise: irrelevant things remain unusable
+    (NonStrict, _)       -> Relevant   -- but @NonStrict@s become usable
+
+-- | For comparing @Relevance@ ignoring @Forced@.
+ignoreForced :: Relevance -> Relevance
+ignoreForced Forced     = Relevant
+ignoreForced Relevant   = Relevant
+ignoreForced NonStrict  = NonStrict
+ignoreForced Irrelevant = Irrelevant
+
+-- | Irrelevant function arguments may appear non-strictly in the codomain type.
+irrToNonStrict :: Relevance -> Relevance
+irrToNonStrict Irrelevant = NonStrict
+-- irrToNonStrict NonStrict  = Relevant -- TODO: is that what we want (OR: NonStrict)  -- better be more conservative
+irrToNonStrict rel        = rel
+
+nonStrictToIrr :: Relevance -> Relevance
+nonStrictToIrr NonStrict = Irrelevant
+nonStrictToIrr rel       = rel
+
+-- * Operations on 'Arg'.
+
+-- | Prepare parts of a parameter telescope for abstraction in constructors
+--   and projections.
+hideAndRelParams :: Arg a -> Arg a
+hideAndRelParams a = a
+  { argRelevance = nonStrictToIrr (argRelevance a)
+  , argHiding    = Hidden
+  }
+
+-- | @modifyArgRelevance f arg@ applies @f@ to the 'argRelevance' component of @arg@.
+modifyArgRelevance :: (Relevance -> Relevance) -> Arg a -> Arg a
+modifyArgRelevance f a = a { argRelevance = f (argRelevance a) }
+
+-- | Used to modify context when going into a @rel@ argument.
+inverseApplyRelevance :: Relevance -> Arg a -> Arg a
+inverseApplyRelevance rel = modifyArgRelevance (rel `inverseComposeRelevance`)
+-- inverseApplyRelevance rel a = a { argRelevance = rel `inverseComposeRelevance` argRelevance a }
+
+-- | Compose two relevance flags.
+--   This function is used to update the relevance information
+--   on pattern variables @a@ after a match against something @rel@.
+applyRelevance :: Relevance -> Arg a -> Arg a
+applyRelevance rel = modifyArgRelevance (rel `composeRelevance`)
+-- applyRelevance rel a = a { argRelevance = rel `composeRelevance` argRelevance a }
+
+{- Andreas, 2011-04-26: the combination Irrelevant Forced does not arise
+applyRelevance Irrelevant a | argRelevance a == Relevant =
+  a { argRelevance = Irrelevant }
+applyRelevance Forced a | argRelevance a == Relevant =
+  a { argRelevance = Forced }
+applyRelevance rel a = a -- ^ do nothing if rel == Relevant or a is
+                         -- already Forced or Irrelevant
+-}
+
+-- * Operations on 'Context'.
+
+-- | Modify the context whenever going from the l.h.s. (term side)
+--   of the typing judgement to the r.h.s. (type side).
+workOnTypes :: TCM a -> TCM a
+workOnTypes cont = do
+  allowed <- optExperimentalIrrelevance <$> pragmaOptions
+  verboseBracket "tc.irr" 20 "workOnTypes" $ workOnTypes' allowed cont
+
+-- | Call me if --experimental-irrelevance is set.
+doWorkOnTypes :: TCM a -> TCM a
+doWorkOnTypes = verboseBracket "tc.irr" 20 "workOnTypes" . workOnTypes' True
+
+-- | Internal workhorse, expects value of --experimental-irrelevance flag
+--   as argument.
+workOnTypes' :: Bool -> TCM a -> TCM a
+workOnTypes' allowed cont =
+  if allowed then
+    liftTCM $ modifyContext (modifyContextEntries $ modifyArgRelevance $ irrToNonStrict) cont
+   else cont
+
+-- | (Conditionally) wake up irrelevant variables and make them relevant.
+--   For instance,
+--   in an irrelevant function argument otherwise irrelevant variables
+--   may be used, so they are awoken before type checking the argument.
+applyRelevanceToContext :: Relevance -> TCM a -> TCM a
+applyRelevanceToContext rel =
+  case rel of
+    Relevant -> id
+    Forced   -> id
+    _        -> local $ \ e -> e
+      { envContext   = modifyContextEntries (inverseApplyRelevance rel) (envContext e)
+      , envLetBindings = Map.map
+          (fmap $ \ (t, a) -> (t, inverseApplyRelevance rel a))
+          (envLetBindings e)
+                                                  -- enable local  irr. defs
+      , envRelevance = rel                        -- enable global irr. defs
+      }
+
+-- | Wake up irrelevant variables and make them relevant.  For instance,
+--   in an irrelevant function argument otherwise irrelevant variables
+--   may be used, so they are awoken before type checking the argument.
+wakeIrrelevantVars :: TCM a -> TCM a
+wakeIrrelevantVars = applyRelevanceToContext Irrelevant
+{-
+wakeIrrelevantVars = local $ \ e -> e
+   { envContext = map wakeVar (envContext e) -- enable local  irr. defs
+   , envIrrelevant = True                    -- enable global irr. defs
+   }
+  where wakeVar ce = ce { ctxEntry = makeRelevant (ctxEntry ce) }
+
+applyRelevanceToContext :: Relevance -> TCM a -> TCM a
+applyRelevanceToContext Irrelevant cont = wakeIrrelevantVars cont
+applyRelevanceToContext _          cont = cont
+-}
diff --git a/src/full/Agda/TypeChecking/Level.hs b/src/full/Agda/TypeChecking/Level.hs
--- a/src/full/Agda/TypeChecking/Level.hs
+++ b/src/full/Agda/TypeChecking/Level.hs
@@ -17,56 +17,37 @@
 import Agda.Utils.Impossible
 #include "../undefined.h"
 
-newtype LevelView = Max [PlusView]
-  deriving (Show)
-
-data PlusView = ClosedLevel Integer
-              | Plus Integer LevelAtom
-  deriving (Show, Eq)
-
-data LevelAtom = MetaLevel MetaId Args
-             | BlockedLevel Term
-             | NeutralLevel Term
-  deriving (Show, Eq, Ord)
-
-instance Ord PlusView where
-  compare ClosedLevel{} Plus{}            = LT
-  compare Plus{} ClosedLevel{}            = GT
-  compare (ClosedLevel n) (ClosedLevel m) = compare n m
-  compare (Plus n a) (Plus m b)           = compare (a,n) (b,m)
-
-
 data LevelKit = LevelKit
-  { levelType  :: Term
-  , levelSuc   :: Term -> Term
-  , levelMax   :: Term -> Term -> Term
-  , levelZero  :: Term
+  { lvlType  :: Term
+  , lvlSuc   :: Term -> Term
+  , lvlMax   :: Term -> Term -> Term
+  , lvlZero  :: Term
   , typeName :: QName
   , sucName  :: QName
   , maxName  :: QName
   , zeroName :: QName
   }
 
-levelSucFunction :: MonadTCM tcm => tcm (Term -> Term)
+levelSucFunction :: TCM (Term -> Term)
 levelSucFunction = do
   suc <- primLevelSuc
   return $ \a -> suc `apply` [defaultArg a]
 
-builtinLevelKit :: MonadTCM tcm => tcm (Maybe LevelKit)
+builtinLevelKit :: TCM (Maybe LevelKit)
 builtinLevelKit = liftTCM $ do
     level@(Def l []) <- primLevel
-    zero@(Con z []) <- primLevelZero
-    suc@(Con s []) <- primLevelSuc
+    zero@(Def z []) <- primLevelZero
+    suc@(Def s []) <- primLevelSuc
     max@(Def m []) <- primLevelMax
     let a @@ b = a `apply` [defaultArg b]
     return $ Just $ LevelKit
-      { levelType = level
-      , levelSuc = \a -> suc @@ a
-      , levelMax = \a b -> max @@ a @@ b
-      , levelZero = zero
+      { lvlType  = level
+      , lvlSuc   = \a -> suc @@ a
+      , lvlMax   = \a b -> max @@ a @@ b
+      , lvlZero  = zero
       , typeName = l
-      , sucName = s
-      , maxName = m
+      , sucName  = s
+      , maxName  = m
       , zeroName = z
       }
   `catchError` \_ -> return Nothing
@@ -77,91 +58,76 @@
 requireLevels = do
   mKit <- builtinLevelKit
   case mKit of
-    Nothing -> typeError $ GenericError $
-      "Some or all of the LEVEL builtins have not been defined."
+    Nothing -> sequence_ [primLevel, primLevelZero, primLevelSuc, primLevelMax] >> __IMPOSSIBLE__
     Just k  -> return k
 
-unLevelAtom :: LevelAtom -> Term
-unLevelAtom (MetaLevel x as) = MetaV x as
-unLevelAtom (BlockedLevel a) = a
-unLevelAtom (NeutralLevel a) = a
-
-unLevelView :: MonadTCM tcm => LevelView -> tcm Term
-unLevelView nv = case nv of
-    Max []            -> return $ Lit $ LitLevel noRange 0
-    Max [ClosedLevel n] -> return $ Lit $ LitLevel noRange n
-    Max [Plus 0 a]    -> return $ unLevelAtom a
-    Max [a]           -> do
+reallyUnLevelView :: Level -> TCM Term
+reallyUnLevelView nv =
+  case nv of
+    Max []              -> primLevelZero
+    Max [Plus 0 a]      -> return $ unLevelAtom a
+    Max [a]             -> do
+      zer <- primLevelZero
       suc <- primLevelSuc
-      return $ unPlusV (\n -> suc `apply` [defaultArg n]) a
+      return $ unPlusV zer (\n -> suc `apply` [defaultArg n]) a
     Max as -> do
-      Just LevelKit{ levelSuc = suc, levelMax = max } <- builtinLevelKit
-      return $ case map (unPlusV suc) as of
+      LevelKit{ lvlZero = zer, lvlSuc = suc, lvlMax = max } <- requireLevels
+      return $ case map (unPlusV zer suc) as of
         [a] -> a
         []  -> __IMPOSSIBLE__
         as  -> foldr1 max as
   where
-    unPlusV suc (ClosedLevel n) = Lit (LitLevel noRange n)
-    unPlusV suc (Plus n a)    = foldr (.) id (genericReplicate n suc) (unLevelAtom a)
+    unPlusV zer suc (ClosedLevel n) = foldr (.) id (genericReplicate n suc) zer
+    unPlusV _   suc (Plus n a)      = foldr (.) id (genericReplicate n suc) (unLevelAtom a)
 
-maybePrimCon :: MonadTCM tcm => TCM Term -> tcm (Maybe QName)
+maybePrimCon :: TCM Term -> TCM (Maybe QName)
 maybePrimCon prim = liftTCM $ do
     Con c [] <- prim
     return (Just c)
   `catchError` \_ -> return Nothing
 
-maybePrimDef :: MonadTCM tcm => TCM Term -> tcm (Maybe QName)
+maybePrimDef :: TCM Term -> TCM (Maybe QName)
 maybePrimDef prim = liftTCM $ do
     Def f [] <- prim
     return (Just f)
   `catchError` \_ -> return Nothing
 
-levelView :: MonadTCM tcm => Term -> tcm LevelView
+levelView :: Term -> TCM Level
 levelView a = do
+  reportSLn "tc.level.view" 50 $ "{ levelView " ++ show a
   msuc <- maybePrimCon primLevelSuc
   mzer <- maybePrimCon primLevelZero
   mmax <- maybePrimDef primLevelMax
-  let view a =
+  let view a = do
+        a <- reduce a
         case a of
+          Level l -> return l
           Con s [arg]
             | Just s == msuc -> inc <$> view (unArg arg)
           Con z []
             | Just z == mzer -> return $ closed 0
-          Lit (LitLevel _ n)   -> return $ closed n
           Def m [arg1, arg2]
-            | Just m == mmax -> lub <$> view (unArg arg1) <*> view (unArg arg2)
+            | Just m == mmax -> levelLub <$> view (unArg arg1) <*> view (unArg arg2)
           _                  -> mkAtom a
-  view =<< normalise a
+  v <- view a
+  reportSLn "tc.level.view" 50 $ "  view: " ++ show v ++ "}"
+  return v
   where
     mkAtom a = do
       b <- reduceB a
       return $ case b of
         NotBlocked (MetaV m as) -> atom $ MetaLevel m as
         NotBlocked a            -> atom $ NeutralLevel a
-        Blocked _ a             -> atom $ BlockedLevel a
+        Blocked m a             -> atom $ BlockedLevel m a
 
     atom a = Max [Plus 0 a]
 
-    closed n = maxim [ClosedLevel n]
+    closed n = Max [ClosedLevel n | n > 0]
 
     inc (Max as) = Max $ map inc' as
       where
         inc' (ClosedLevel n) = ClosedLevel $ n + 1
         inc' (Plus n a)    = Plus (n + 1) a
 
-    maxim as = Max $ ns ++ List.sort bs
-      where
-        ns = case [ n | ClosedLevel n <- as, n > 0 ] of
-          []  -> []
-          ns  -> [ClosedLevel $ maximum ns]
-        bs = subsume [ b | b@Plus{} <- as ]
-
-        subsume (ClosedLevel{} : _) = __IMPOSSIBLE__
-        subsume [] = []
-        subsume (Plus n a : bs)
-          | not $ null ns = subsume bs
-          | otherwise     = Plus n a : subsume [ b | b@(Plus _ a') <- bs, a /= a' ]
-          where
-            ns = [ m | Plus m a'  <- bs, a == a', m > n ]
-
-    lub (Max as) (Max bs) = maxim $ as ++ bs
+levelLub :: Level -> Level -> Level
+levelLub (Max as) (Max bs) = levelMax $ as ++ bs
diff --git a/src/full/Agda/TypeChecking/Level.hs-boot b/src/full/Agda/TypeChecking/Level.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/TypeChecking/Level.hs-boot
@@ -0,0 +1,7 @@
+
+module Agda.TypeChecking.Level where
+
+import Agda.TypeChecking.Monad
+import Agda.Syntax.Internal
+
+levelView :: Term -> TCM Level
diff --git a/src/full/Agda/TypeChecking/LevelConstraints.hs b/src/full/Agda/TypeChecking/LevelConstraints.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/TypeChecking/LevelConstraints.hs
@@ -0,0 +1,34 @@
+
+module Agda.TypeChecking.LevelConstraints ( simplifyLevelConstraint ) where
+
+import Data.List
+
+import Agda.Syntax.Internal
+import Agda.TypeChecking.Monad.Base
+import Agda.TypeChecking.Substitute
+import Agda.Utils.Size
+
+simplifyLevelConstraint :: Integer -> Constraint -> Constraints -> Constraint
+simplifyLevelConstraint n new old =
+  case inequalities new of
+    [a :=< b] | elem (b' :=< a') leqs -> LevelCmp CmpEq (Max [a]) (Max [b])
+      where (a', b') = raise (-n) (a, b)
+    _ -> new
+  where
+    leqs = concatMap (inequalities . unClosure) old
+
+    -- Unclosure converts deBruijn indices to deBruijn levels to
+    -- enable comparing constraints under different contexts
+    unClosure c = raise (-size (envContext $ clEnv cl)) $ clValue cl
+      where cl = theConstraint c
+
+data Leq = PlusLevel :=< PlusLevel
+  deriving (Show, Eq)
+
+inequalities (LevelCmp CmpEq (Max [a, b]) (Max [c]))
+  | a == c = [b :=< a]
+  | b == c = [a :=< b]
+inequalities (LevelCmp CmpEq (Max [a]) (Max [b, c]))
+  | a == b = [c :=< b]
+  | a == c = [b :=< c]
+inequalities _ = []
diff --git a/src/full/Agda/TypeChecking/MetaVars.hs b/src/full/Agda/TypeChecking/MetaVars.hs
--- a/src/full/Agda/TypeChecking/MetaVars.hs
+++ b/src/full/Agda/TypeChecking/MetaVars.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP, RelaxedPolyRec #-}
+{-# LANGUAGE CPP, RelaxedPolyRec, GeneralizedNewtypeDeriving #-}
 
 module Agda.TypeChecking.MetaVars where
 
@@ -6,11 +6,9 @@
 import Control.Monad.State
 import Control.Monad.Error
 import Data.Generics
-import Data.Map (Map)
-import Data.Set (Set)
 import Data.List as List hiding (sort)
+import Data.Map (Map)
 import qualified Data.Map as Map
-import qualified Data.Set as Set
 import qualified Agda.Utils.IO.Locale as LocIO
 
 import Agda.Syntax.Common
@@ -29,17 +27,19 @@
 import Agda.TypeChecking.Free
 import Agda.TypeChecking.Records
 import Agda.TypeChecking.Pretty
+import Agda.TypeChecking.Irrelevance
 import Agda.TypeChecking.EtaContract
 
 import Agda.TypeChecking.MetaVars.Occurs
 
-import {-# SOURCE #-} Agda.TypeChecking.Conversion
+import {-# SOURCE #-} Agda.TypeChecking.Conversion -- SOURCE NECESSARY
 
 import Agda.Utils.Fresh
 import Agda.Utils.List
 import Agda.Utils.Monad
 import Agda.Utils.Size
 import Agda.Utils.Permutation
+import qualified Agda.Utils.VarSet as Set
 
 import Agda.TypeChecking.Monad.Debug
 
@@ -55,7 +55,7 @@
 findIdx vs v = findIndex (==v) (reverse vs)
 
 -- | Check whether a meta variable is a place holder for a blocked term.
-isBlockedTerm :: MonadTCM tcm => MetaId -> tcm Bool
+isBlockedTerm :: MetaId -> TCM Bool
 isBlockedTerm x = do
     reportSLn "tc.meta.blocked" 12 $ "is " ++ show x ++ " a blocked term? "
     i <- mvInstantiation <$> lookupMeta x
@@ -65,109 +65,119 @@
 	    InstV{}                        -> False
 	    InstS{}                        -> False
 	    Open{}                         -> False
+	    OpenIFS{}                      -> False
     reportSLn "tc.meta.blocked" 12 $
       if r then "  yes, because " ++ show i else "  no"
     return r
 
-isEtaExpandable :: MonadTCM tcm => MetaId -> tcm Bool
+isEtaExpandable :: MetaId -> TCM Bool
 isEtaExpandable x = do
     i <- mvInstantiation <$> lookupMeta x
     return $ case i of
       Open{}                         -> True
+      OpenIFS{}                      -> False
       InstV{}                        -> False
       InstS{}                        -> False
       BlockedConst{}                 -> False
       PostponedTypeCheckingProblem{} -> False
 
-class HasMeta t where
-    metaInstance :: MonadTCM tcm => t -> tcm MetaInstantiation
-    metaVariable :: MetaId -> Args -> t
-
-instance HasMeta Term where
-    metaInstance = return . InstV
-    metaVariable = MetaV
-
-instance HasMeta Sort where
-    metaInstance = return . InstS . Sort
-    metaVariable = MetaS
-
--- TODO
-(=:=) :: (MonadTCM tcm) => MetaId -> Term -> tcm ()
-x =:= t = do
-    reportSLn "tc.meta.assign" 70 $ show x ++ " := " ++ show t
-    store <- getMetaStore
-    modify $ \st -> st { stMetaStore = ins x (InstS $ killRange t) store }
-    etaExpandListeners x
-    wakeupConstraints
-    reportSLn "tc.meta.assign" 20 $ "completed assignment of " ++ show x
-  where
-    ins x i store = Map.adjust (inst i) x store
-    inst i mv = mv { mvInstantiation = i }
+-- * Performing the assignment
 
--- | The instantiation should not be an 'InstV' or 'InstS' and the 'MetaId'
+-- | Performing the meta variable assignment.
+--
+--   The instantiation should not be an 'InstV' or 'InstS' and the 'MetaId'
 --   should point to something 'Open' or a 'BlockedConst'.
-(=:) :: (MonadTCM tcm, HasMeta t, KillRange t, Show t) =>
-        MetaId -> t -> tcm ()
-x =: t = do
+--   Further, the meta variable may not be 'Frozen'.
+assignTerm :: MetaId -> Term -> TCM ()
+assignTerm x t = do
     reportSLn "tc.meta.assign" 70 $ show x ++ " := " ++ show t
-    i <- metaInstance (killRange t)
-    store <- getMetaStore
-    modify $ \st -> st { stMetaStore = ins x i store }
+    whenM (isFrozen x) __IMPOSSIBLE__  -- verify (new) invariant
+    let i = metaInstance (killRange t)
+    verboseS "profile.metas" 10 $ liftTCM $ tickMax "max-open-metas" . size =<< getOpenMetas
+    modifyMetaStore $ ins x i
     etaExpandListeners x
-    wakeupConstraints
+    wakeupConstraints x
     reportSLn "tc.meta.assign" 20 $ "completed assignment of " ++ show x
   where
+    metaInstance = InstV
     ins x i store = Map.adjust (inst i) x store
     inst i mv = mv { mvInstantiation = i }
 
-assignTerm :: MonadTCM tcm => MetaId -> Term -> tcm ()
-assignTerm = (=:)
-
-assignSort :: MonadTCM tcm => MetaId -> Sort -> tcm ()
-assignSort = (=:)
+-- * Creating meta variables.
 
-newSortMeta :: MonadTCM tcm => tcm Sort
+newSortMeta :: TCM Sort
 newSortMeta =
   ifM typeInType (return $ mkType 0) $
   ifM hasUniversePolymorphism (newSortMetaCtx =<< getContextArgs)
+  -- else (no universe polymorphism)
   $ do i <- createMetaInfo
-       x <- newMeta i normalMetaPriority (idP 0) (IsSort())
-       return $ MetaS x []
+       x <- newMeta i normalMetaPriority (idP 0) (IsSort () topSort)
+       return $ Type $ Max [Plus 0 $ MetaLevel x []]
 
-newSortMetaCtx :: MonadTCM tcm => Args -> tcm Sort
+newSortMetaCtx :: Args -> TCM Sort
 newSortMetaCtx vs =
   ifM typeInType (return $ mkType 0) $ do
-    i <- createMetaInfo
-    x <- newMeta i normalMetaPriority (idP 0) (IsSort ())
-    return $ MetaS x vs
+    i   <- createMetaInfo
+    tel <- getContextTelescope
+    let t = telePi_ tel topSort
+    x   <- newMeta i normalMetaPriority (idP 0) (IsSort () t)
+    reportSDoc "tc.meta.new" 50 $
+      text "new sort meta" <+> prettyTCM x <+> text ":" <+> prettyTCM t
+    return $ Type $ Max [Plus 0 $ MetaLevel x vs]
 
-newTypeMeta :: MonadTCM tcm => Sort -> tcm Type
+newTypeMeta :: Sort -> TCM Type
 newTypeMeta s = El s <$> newValueMeta (sort s)
 
-newTypeMeta_ ::  MonadTCM tcm => tcm Type
-newTypeMeta_  = newTypeMeta =<< newSortMeta
+newTypeMeta_ ::  TCM Type
+newTypeMeta_  = newTypeMeta =<< (workOnTypes $ newSortMeta)
+-- TODO: (this could be made work with new uni-poly)
+-- Andreas, 2011-04-27: If a type meta gets solved, than we do not have to check
+-- that it has a sort.  The sort comes from the solution.
+-- newTypeMeta_  = newTypeMeta Inf
 
+-- | Create a new "implicit from scope" metavariable
+newIFSMeta ::  Type -> TCM Term
+newIFSMeta t = do
+  vs  <- getContextArgs
+  tel <- getContextTelescope
+  newIFSMetaCtx (telePi_ tel t) vs
+
+-- | Create a new value meta with specific dependencies.
+newIFSMetaCtx :: Type -> Args -> TCM Term
+newIFSMetaCtx t vs = do
+  i <- createMetaInfo
+  let TelV tel _ = telView' t
+      perm = idP (size tel)
+  x <- newMeta' OpenIFS i normalMetaPriority perm (HasType () t)
+  reportSDoc "tc.meta.new" 50 $ fsep
+    [ text "new ifs meta:"
+    , nest 2 $ prettyTCM vs <+> text "|-"
+    , nest 2 $ text (show x) <+> text ":" <+> prettyTCM t
+    ]
+  solveConstraint_ $ FindInScope x
+  return (MetaV x vs)
+
 -- | Create a new metavariable, possibly η-expanding in the process.
-newValueMeta ::  MonadTCM tcm => Type -> tcm Term
+newValueMeta ::  Type -> TCM Term
 newValueMeta t = do
   vs  <- getContextArgs
   tel <- getContextTelescope
   newValueMetaCtx (telePi_ tel t) vs
 
-newValueMetaCtx :: MonadTCM tcm => Type -> Args -> tcm Term
+newValueMetaCtx :: Type -> Args -> TCM Term
 newValueMetaCtx t ctx = do
   m@(MetaV i _) <- newValueMetaCtx' t ctx
   instantiateFull m
 
 -- | Create a new value meta without η-expanding.
-newValueMeta' :: MonadTCM tcm => Type -> tcm Term
+newValueMeta' :: Type -> TCM Term
 newValueMeta' t = do
   vs  <- getContextArgs
   tel <- getContextTelescope
   newValueMetaCtx' (telePi_ tel t) vs
 
 -- | Create a new value meta with specific dependencies.
-newValueMetaCtx' :: MonadTCM tcm => Type -> Args -> tcm Term
+newValueMetaCtx' :: Type -> Args -> TCM Term
 newValueMetaCtx' t vs = do
   i <- createMetaInfo
   let TelV tel _ = telView' t
@@ -181,47 +191,47 @@
   etaExpandMetaSafe x
   return $ MetaV x vs
 
-newTelMeta :: MonadTCM tcm => Telescope -> tcm Args
+newTelMeta :: Telescope -> TCM Args
 newTelMeta tel = newArgsMeta (abstract tel $ El Prop $ Sort Prop)
 
-newArgsMeta :: MonadTCM tcm => Type -> tcm Args
+newArgsMeta :: Type -> TCM Args
 newArgsMeta t = do
   args <- getContextArgs
   tel  <- getContextTelescope
   newArgsMetaCtx t tel args
 
-newArgsMetaCtx :: MonadTCM tcm => Type -> Telescope -> Args -> tcm Args
+newArgsMetaCtx :: Type -> Telescope -> Args -> TCM Args
 newArgsMetaCtx (El s tm) tel ctx = do
   tm <- reduce tm
-  case funView tm of
-      FunV (Arg h r a) _  -> do
-	  arg  <- (Arg h r) <$>
-                   {-
-                     -- Andreas, 2010-09-24 skip irrelevant record fields when eta-expanding a meta var
-                     -- Andreas, 2010-10-11 this is WRONG, see Issue 347
-                    if r == Irrelevant then return DontCare else
-                    -}
-                     newValueMetaCtx (telePi_ tel a) ctx
-	  args <- newArgsMetaCtx (El s tm `piApply` [arg]) tel ctx
-	  return $ arg : args
-      NoFunV _    -> return []
+  case tm of
+    Pi (Arg h r a) _  -> do
+      arg  <- (Arg h r) <$>
+               {-
+                 -- Andreas, 2010-09-24 skip irrelevant record fields when eta-expanding a meta var
+                 -- Andreas, 2010-10-11 this is WRONG, see Issue 347
+                if r == Irrelevant then return DontCare else
+                -}
+                 newValueMetaCtx (telePi_ tel a) ctx
+      args <- newArgsMetaCtx (El s tm `piApply` [arg]) tel ctx
+      return $ arg : args
+    _  -> return []
 
 -- | Create a metavariable of record type. This is actually one metavariable
 --   for each field.
-newRecordMeta :: MonadTCM tcm => QName -> Args -> tcm Term
+newRecordMeta :: QName -> Args -> TCM Term
 newRecordMeta r pars = do
   args <- getContextArgs
   tel  <- getContextTelescope
   newRecordMetaCtx r pars tel args
 
-newRecordMetaCtx :: MonadTCM tcm => QName -> Args -> Telescope -> Args -> tcm Term
+newRecordMetaCtx :: QName -> Args -> Telescope -> Args -> TCM Term
 newRecordMetaCtx r pars tel ctx = do
   ftel	 <- flip apply pars <$> getRecordFieldTypes r
   fields <- newArgsMetaCtx (telePi_ ftel $ sort Prop) tel ctx
   con    <- getRecordConstructor r
   return $ Con con fields
 
-newQuestionMark :: MonadTCM tcm => Type -> tcm Term
+newQuestionMark :: Type -> TCM Term
 newQuestionMark t = do
   m@(MetaV x _) <- newValueMeta' t
   ii		<- fresh
@@ -229,31 +239,44 @@
   return m
 
 -- | Construct a blocked constant if there are constraints.
-blockTerm :: MonadTCM tcm => Type -> Term -> tcm Constraints -> tcm Term
-blockTerm t v m = do
-    cs <- solveConstraints =<< m
-    if List.null cs
-	then return v
-	else do
-	    i	  <- createMetaInfo
-	    vs	  <- getContextArgs
-	    tel   <- getContextTelescope
-	    x	  <- newMeta' (BlockedConst $ abstract tel v)
-                              i lowMetaPriority (idP $ size tel)
-                              (HasType () $ telePi_ tel t)
-			    -- we don't instantiate blocked terms
-	    c <- escapeContext (size tel) $ guardConstraint (return cs) (UnBlock x)
-            verboseS "tc.meta.blocked" 20 $ do
-                dx  <- prettyTCM (MetaV x [])
-                dv  <- escapeContext (size tel) $ prettyTCM $ abstract tel v
-                dcs <- mapM prettyTCM cs
-                liftIO $ LocIO.putStrLn $ "blocked " ++ show dx ++ " := " ++ show dv
-                liftIO $ LocIO.putStrLn $ "     by " ++ show dcs
-	    addConstraints c
-	    return $ MetaV x vs
+blockTerm :: Type -> TCM Term -> TCM Term
+blockTerm t blocker = do
+  (pid, v) <- newProblem blocker
+  blockTermOnProblem t v pid
 
--- | Auxiliary function to create a postponed type checking problem.
-unblockedTester :: MonadTCM tcm => Type -> tcm Bool
+blockTermOnProblem :: Type -> Term -> ProblemId -> TCM Term
+blockTermOnProblem t v pid =
+  ifM (isProblemSolved pid) (return v) $ do
+    i   <- createMetaInfo
+    vs  <- getContextArgs
+    tel <- getContextTelescope
+    x   <- newMeta' (BlockedConst $ abstract tel v)
+                    i lowMetaPriority (idP $ size tel)
+                    (HasType () $ telePi_ tel t)
+                    -- we don't instantiate blocked terms
+    escapeContext (size tel) $ addConstraint (Guarded (UnBlock x) pid)
+    reportSDoc "tc.meta.blocked" 20 $ vcat
+      [ text "blocked" <+> prettyTCM x <+> text ":=" <+> escapeContext (size tel) (prettyTCM $ abstract tel v)
+      , text "     by" <+> (prettyTCM =<< getConstraintsForProblem pid) ]
+    inst <- isInstantiatedMeta x
+    case inst of
+      True  -> instantiate (MetaV x vs)
+      False -> do
+        -- We don't return the blocked term instead create a fresh metavariable
+        -- that we compare against the blocked term once it's unblocked. This way
+        -- blocked terms can be instantiated before they are unblocked, thus making
+        -- constraint solving a bit more robust against instantiation order.
+        v   <- newValueMeta t
+        i   <- liftTCM (fresh :: TCM Integer)
+        -- This constraint is woken up when unblocking, so it doesn't need a problem id.
+        cmp <- buildProblemConstraint 0 (ValueCmp CmpEq t v (MetaV x vs))
+        listenToMeta (CheckConstraint i cmp) x
+        return v
+
+-- | @unblockedTester t@ returns @False@ if @t@ is a meta or a blocked term.
+--
+--   Auxiliary function to create a postponed type checking problem.
+unblockedTester :: Type -> TCM Bool
 unblockedTester t = do
   t <- reduceB $ unEl t
   case t of
@@ -261,11 +284,17 @@
     NotBlocked MetaV{} -> return False
     _                  -> return True
 
-postponeTypeCheckingProblem_ :: MonadTCM tcm => A.Expr -> Type -> tcm Term
+-- | Create a postponed type checking problem @e : t@ that waits for type @t@
+--   to unblock (become instantiated or its constraints resolved).
+postponeTypeCheckingProblem_ :: A.Expr -> Type -> TCM Term
 postponeTypeCheckingProblem_ e t = do
   postponeTypeCheckingProblem e t (unblockedTester t)
 
-postponeTypeCheckingProblem :: MonadTCM tcm => A.Expr -> Type -> TCM Bool -> tcm Term
+-- | Create a postponed type checking problem @e : t@ that waits for conditon
+--   @unblock@.  A new meta is created in the current context that has as
+--   instantiation the postponed type checking problem.  An 'UnBlock' constraint
+--   is added for this meta, which links to this meta.
+postponeTypeCheckingProblem :: A.Expr -> Type -> TCM Bool -> TCM Term
 postponeTypeCheckingProblem e t unblock = do
   i   <- createMetaInfo
   tel <- getContextTelescope
@@ -273,20 +302,33 @@
   m   <- newMeta' (PostponedTypeCheckingProblem cl)
                   i normalMetaPriority (idP (size tel))
          $ HasType () $ telePi_ tel t
-  addConstraints =<< buildConstraint (UnBlock m)
-  MetaV m <$> getContextArgs
+  -- Create the meta that we actually return
+  v   <- newValueMeta t
+  i   <- liftTCM (fresh :: TCM Integer)
+  vs  <- getContextArgs
+  cmp <- buildProblemConstraint 0 (ValueCmp CmpEq t v (MetaV m vs))
+  listenToMeta (CheckConstraint i cmp) m
+  addConstraint (UnBlock m)
+  return v
 
 -- | Eta expand metavariables listening on the current meta.
-etaExpandListeners :: MonadTCM tcm => MetaId -> tcm ()
+etaExpandListeners :: MetaId -> TCM ()
 etaExpandListeners m = do
-  ms <- getMetaListeners m
+  ls <- getMetaListeners m
   clearMetaListeners m	-- we don't really have to do this
+  mapM_ wakeupListener ls
+
+-- | Wake up a meta listener and let it do its thing
+wakeupListener :: Listener -> TCM ()
   -- Andreas 2010-10-15: do not expand record mvars, lazyness needed for irrelevance
-  mapM_ etaExpandMetaSafe ms
---  mapM_ (etaExpandMeta allMetaKinds) ms
+wakeupListener (EtaExpand x)         = etaExpandMetaSafe x
+wakeupListener (CheckConstraint _ c) = do
+  reportSDoc "tc.meta.blocked" 20 $ text "waking boxed constraint" <+> prettyTCM c
+  addAwakeConstraints [c]
+  solveAwakeConstraints
 
 -- | Do safe eta-expansions for meta (@SingletonRecords,Levels@).
-etaExpandMetaSafe :: MonadTCM tcm => MetaId -> tcm ()
+etaExpandMetaSafe :: MetaId -> TCM ()
 etaExpandMetaSafe = etaExpandMeta [SingletonRecords,Levels]
 
 -- | Various kinds of metavariables.
@@ -307,7 +349,7 @@
 
 -- | Eta expand a metavariable, if it is of the specified kind.
 --   Don't do anything if the metavariable is a blocked term.
-etaExpandMeta :: MonadTCM tcm => [MetaKind] -> MetaId -> tcm ()
+etaExpandMeta :: [MetaKind] -> MetaId -> TCM ()
 etaExpandMeta kinds m = whenM (isEtaExpandable m) $ do
   verboseBracket "tc.meta.eta" 20 ("etaExpandMeta " ++ show m) $ do
   meta       <- lookupMeta m
@@ -316,10 +358,16 @@
   let args	 = [ Arg h r $ Var i []
 		   | (i, Arg h r _) <- reverse $ zip [0..] $ reverse $ telToList tel
 		   ]
-  bb <- reduceB b
+  bb <- reduceB b  -- the target in the type @a@ of @m@
   case unEl <$> bb of
-    Blocked x _               -> listenToMeta m x
-    NotBlocked (MetaV x _)    -> listenToMeta m x
+    -- if the target type of @m@ is a meta variable @x@ itself
+    -- (@NonBlocked (MetaV{})@),
+    -- or it is blocked by a meta-variable @x@ (@Blocked@), we cannot
+    -- eta expand now, we have to postpone this.  Once @x@ is
+    -- instantiated, we can continue eta-expanding m.  This is realized
+    -- by adding @m@ to the listeners of @x@.
+    Blocked x _               -> listenToMeta (EtaExpand m) x
+    NotBlocked (MetaV x _)    -> listenToMeta (EtaExpand m) x
     NotBlocked lvl@(Def r ps) ->
       ifM (isEtaRecord r) (do
 	let expand = do
@@ -328,13 +376,13 @@
                 verboseS "tc.meta.eta" 15 $ do
                   du <- prettyTCM u
                   liftIO $ LocIO.putStrLn $ "eta expanding: " ++ show m ++ " --> " ++ show du
-                noConstraints $ assignV b m args u  -- should never produce any constraints
+                noConstraints $ assignV m args u  -- should never produce any constraints
         if Records `elem` kinds then
           expand
          else if SingletonRecords `elem` kinds then do
           singleton <- isSingletonRecord r ps
           case singleton of
-            Left x      -> listenToMeta m x
+            Left x      -> listenToMeta (EtaExpand m) x
             Right False -> return ()
             Right True  -> expand
          else
@@ -345,7 +393,7 @@
         if tt && Just lvl == mlvl
          then do
           reportSLn "tc.meta.eta" 20 $ "Expanding level meta to 0 (type-in-type)"
-          noConstraints $ assignV b m args (Lit $ LitLevel noRange 0)
+          noConstraints $ assignV m args (Level $ Max [])
          else
           return ()
     _ -> return ()
@@ -353,8 +401,7 @@
 -- | Eta expand blocking metavariables of record type, and reduce the
 -- blocked thing.
 
-etaExpandBlocked
-  :: (MonadTCM tcm, Reduce t) => Blocked t -> tcm (Blocked t)
+etaExpandBlocked :: Reduce t => Blocked t -> TCM (Blocked t)
 etaExpandBlocked t@NotBlocked{} = return t
 etaExpandBlocked (Blocked m t)  = do
   etaExpandMeta [Records] m
@@ -363,163 +410,139 @@
     Blocked m' _ | m /= m' -> etaExpandBlocked t
     _                      -> return t
 
-abortAssign :: MonadTCM tcm => tcm a
-abortAssign =
-    do	s <- get
-	liftTCM $ throwError $ TCErr Nothing $ AbortAssign s
-
-handleAbort :: MonadTCM tcm => TCM a -> TCM a -> tcm a
-handleAbort h m = liftTCM $
-    m `catchError_` \e ->
-	case errError e of
-	    AbortAssign s -> do put s; h
-            PatternErr{}  -> do
-              -- Andreas, 2010-09-17 uncommenting the reportSLn statements
-              -- breaks something.  Why?
-              -- reportSLn "tc.meta.assign" 50 "handleAbort: Pattern violation!"
-              throwError e
-	    _		  -> do
-              -- reportSLn "tc.meta.assign" 50 "handleAbort: Some exception"
-              throwError e
+-- * Solve constraint @x vs = v@.
 
--- | Assign to an open metavar.
+-- | Assign to an open metavar which may not be frozen.
 --   First check that metavar args are in pattern fragment.
 --     Then do extended occurs check on given thing.
 --
-assignV :: MonadTCM tcm => Type -> MetaId -> Args -> Term -> tcm Constraints
-assignV t x args v =
-    handleAbort handler $ do
+--   Assignment is aborted by throwing a @PatternErr@ via a call to
+--   @patternViolation@.  This error is caught by @catchConstraint@
+--   during equality checking (@compareAtom@) and leads to
+--   restoration of the original constraints.
+
+assignV :: MetaId -> Args -> Term -> TCM ()
+assignV x args v = do
 	reportSDoc "tc.meta.assign" 10 $ do
 	  text "term" <+> prettyTCM (MetaV x args) <+> text ":=" <+> prettyTCM v
+        liftTCM $ nowSolvingConstraints (assign x args v) `finally` solveAwakeConstraints
 
-        v <- normalise v
-        case v of
-          Sort Inf  -> typeError $ GenericError "Setω is not a valid type."
-          _         -> return ()
+-- | @assign sort? x vs v@
+assign :: MetaId -> Args -> Term -> TCM ()
+assign x args v = do
+        mvar <- lookupMeta x  -- information associated with meta x
 
-	-- We don't instantiate blocked terms
-	whenM (isBlockedTerm x) patternViolation	-- TODO: not so nice
+        -- Andreas, 2011-05-20 TODO!
+        -- full normalization  (which also happens during occurs check)
+        -- is too expensive! (see Issue 415)
+        -- need to do something cheaper, especially if
+        -- we are dealing with a Miller pattern that can be solved
+        -- immediately!
+        -- Ulf, 2011-08-25 DONE!
+        -- Just instantiating the top-level meta, which is cheaper. The occurs
+        -- check will first try without unfolding any definitions (treating
+        -- arguments to definitions as flexible), if that fails it tries again
+        -- with full unfolding.
+        v <- instantiate v
+        reportSLn "tc.meta.assign" 50 $ "MetaVars.assign: assigning to " ++ show v
 
-	-- Check that the arguments are distinct variables
-        -- Andreas, 2010-09-24: Herein, ignore the variables which are not
-        -- free in v
-        let fvs = allVars $ freeVars v
+        case (v, mvJudgement mvar) of
+            (Sort Inf, HasType{}) -> typeError $ GenericError "Setω is not a valid type."
+            _                     -> return ()
+
+        -- We don't instantiate frozen mvars
+        when (mvFrozen mvar == Frozen) $ do
+          reportSLn "tc.meta.assign" 25 $ "aborting: meta is frozen!"
+          patternViolation
+
+	-- We never get blocked terms here anymore. TODO: we actually do. why?
+	whenM (isBlockedTerm x) patternViolation
+
+        -- Andreas, 2010-10-15 I want to see whether rhs is blocked
+        reportSLn "tc.meta.assign" 50 $ "MetaVars.assign: I want to see whether rhs is blocked"
+        reportSDoc "tc.meta.assign" 25 $ do
+          v0 <- reduceB v
+          case v0 of
+            Blocked m0 _ -> text "r.h.s. blocked on:" <+> prettyTCM m0
+            NotBlocked{} -> text "r.h.s. not blocked"
+
+        -- Normalise and eta contract the arguments to the meta. These are
+        -- usually small, and simplifying might let us instantiate more metas.
+        args <- etaContract =<< normalise args
+
+        -- Andreas, 2011-04-21 do the occurs check first
+        -- e.g. _1 x (suc x) = suc (_2 x y)
+        -- even though the lhs is not a pattern, we can prune the y from _2
+        let varsL = freeVars args
+        let relVL = Set.toList $ relevantVars varsL
+        -- Andreas, 2011-10-06 only irrelevant vars that are direct
+        -- arguments to the meta, hence, can be abstracted over, may
+        -- appear on the rhs.  (test/fail/Issue483b)
+        -- let irrVL = Set.toList $ irrelevantVars varsL
+        let fromIrrVar (Arg h Irrelevant (Var i [])) = [i]
+            fromIrrVar (Arg h Irrelevant (DontCare (Var i []))) = [i]
+            fromIrrVar _ = []
+        let irrVL = concat $ map fromIrrVar args
         reportSDoc "tc.meta.assign" 20 $
             let pr (Var n []) = text (show n)
                 pr (Def c []) = prettyTCM c
+                pr (DontCare v) = pr v
                 pr _          = text ".."
             in vcat
                  [ text "mvar args:" <+> sep (map (pr . unArg) args)
-                 , text "fvars rhs:" <+> sep (map (text . show) $ Set.toList fvs)
+                 , text "fvars lhs (rel):" <+> sep (map (text . show) relVL)
+                 , text "fvars lhs (irr):" <+> sep (map (text . show) irrVL)
                  ]
-	ids <- checkArgs x args fvs
 
-	reportSDoc "tc.meta.assign" 15 $
-	    text "preparing to instantiate: " <+> prettyTCM v
-
-        -- Andreas, 2010-10-15 I want to see whether rhd is blocked
-        reportSDoc "tc.meta.assign" 25 $ do
-          v0 <- reduceB v
-          case v0 of
-            Blocked m0 _ -> text "blocked on:" <+> prettyTCM m0
-            NotBlocked{} -> text "not blocked"
-
-	-- Check that the x doesn't occur in the right hand side
-	v <- liftTCM $ occursCheck x (map unArg ids) v
+	-- Check that the x doesn't occur in the right hand side.
+        -- Prune mvars on rhs such that they can only depend on varsL.
+        -- Herein, distinguish relevant and irrelevant vars,
+        -- since when abstracting irrelevant lhs vars, they may only occur
+        -- irrelevantly on rhs.
+	v <- liftTCM $ occursCheck x (relVL, irrVL) v
 
-	verboseS "tc.conv.assign" 30 $ do
+	reportSLn "tc.meta.assign" 15 "passed occursCheck"
+	verboseS "tc.meta.assign" 30 $ do
 	  let n = size v
 	  when (n > 200) $ do
-	    r <- getMetaRange x
 	    d <- sep [ text "size" <+> text (show n)
-		     , nest 2 $ text "type" <+> prettyTCM t
+--		     , nest 2 $ text "type" <+> prettyTCM t
 		     , nest 2 $ text "term" <+> prettyTCM v
 		     ]
 	    liftIO $ LocIO.print d
 
-	reportSLn "tc.meta.assign" 15 "passed occursCheck"
-
-	-- Rename the variables in v to make it suitable for abstraction over ids.
-	v' <- do
-	    -- Basically, if
-	    --   Γ   = a b c d e
-	    --   ids = d b e
-	    -- then
-	    --   v' = (λ a b c d e. v) _ 1 _ 2 0
-	    tel  <- getContextTelescope
-	    args <- map defaultArg <$> getContextTerms
-	    let iargs = reverse $ zipWith (rename $ reverse $ map unArg ids) [0..] $ reverse args
-		v'    = raise (size ids) (abstract tel v) `apply` iargs
-	    return v'
-
-	let extTel (Arg h r i) m = do
-	      tel <- m
-	      t	  <- typeOfBV i
-	      x	  <- nameOfBV i
-	      return $ ExtendTel (Arg h r t) (Abs (show x) tel)
-	tel' <- foldr extTel (return EmptyTel) ids
-
-	reportSDoc "tc.meta.assign" 15 $
-	  text "final instantiation:" <+> prettyTCM (abstract tel' v')
-
-	-- Perform the assignment (and wake constraints). Metas
-	-- are top-level so we do the assignment at top-level.
-	n <- size <$> getContextTelescope
-	escapeContext n $ x =: killRange (abstract tel' v')
-	return []
-    where
-	rename ids i arg = case findIndex (==i) ids of
-	    Just j  -> fmap (const $ Var (fromIntegral j) []) arg
-	    Nothing -> fmap (const __IMPOSSIBLE__) arg	-- we will end up here, but never look at the result
-
-	handler :: MonadTCM tcm => tcm Constraints
-	handler = do
-	    reportSLn "tc.meta.assign" 10 $ "Oops. Undo " ++ show x ++ " := ..."
-	    equalTerm t (MetaV x args) v
-
--- TODO: Unify with assignV
-assignS :: MonadTCM tcm => MetaId -> Args -> Sort -> tcm Constraints
-assignS x args s =
-  ifM (not <$> hasUniversePolymorphism) (noPolyAssign x s) $
-    handleAbort handler $ do
-	reportSDoc "tc.meta.assign" 10 $ do
-	  text "sort" <+> prettyTCM (MetaS x args) <+> text ":=" <+> prettyTCM s
-
-	-- We don't instantiate blocked terms
-	whenM (isBlockedTerm x) patternViolation	-- TODO: not so nice
+	-- Check that the arguments are variables
+	ids <- checkAllVars args
 
-	-- Check that the arguments are distinct variables
+        -- Check linearity of @ids@
+        -- Andreas, 2010-09-24: Herein, ignore the variables which are not
+        -- free in v
+        -- Ulf, 2011-09-22: we need to respect irrelevant vars as well, otherwise
+        -- we'll build solutions where the irrelevant terms are not valid
+        let fvs = allVars $ freeVars v
         reportSDoc "tc.meta.assign" 20 $
-            let pr (Var n []) = text (show n)
-                pr (Def c []) = prettyTCM c
-                pr _          = text ".."
-            in
-            text "args:" <+> sep (map (pr . unArg) args)
-
-        -- TODO Hack
-        let fvs = freeVars s
-        when (any (< 0) $ Set.toList (flexibleVars fvs)) $ do
-            reportSLn "tc.meta.assign" 10 "negative variables!"
-            patternViolation
-
-	ids <- checkArgs x args (allVars fvs)
-
-	reportSDoc "tc.meta.assign" 15 $
-	    text "preparing to instantiate: " <+> prettyTCM s
+          text "fvars rhs:" <+> sep (map (text . show) $ Set.toList fvs)
 
-	-- Check that the x doesn't occur in the right hand side
-	v <- liftTCM $ occursCheck x (map unArg ids) (Sort s)
+        unless (distinct $ filter (`Set.member` fvs) ids) $ do
+          -- non-linear lhs: we cannot solve, but prune
+          killResult <- prune x args $ Set.toList fvs
+          reportSDoc "tc.meta.assign" 10 $
+            text "pruning" <+> prettyTCM x <+> (text $
+              if killResult `elem` [PrunedSomething,PrunedEverything] then "succeeded"
+               else "failed")
+          patternViolation
 
-	verboseS "tc.conv.assign" 30 $ do
-	  let n = size v
-	  when (n > 200) $ do
-	    r <- getMetaRange x
-	    d <- sep [ text "size" <+> text (show n)
-		     , nest 2 $ text "sort" <+> prettyTCM v
-		     ]
-	    liftIO $ LocIO.print d
+{- Andreas, 2011-04-21 this does not work
+        if not (distinct $ filter (`Set.member` fvs) ids) then do
+          -- non-linear lhs: we cannot solve, but prune
+          ok <- prune x args $ Set.toList fvs
+          if ok then return [] else patternViolation
 
-	reportSLn "tc.meta.assign" 15 "passed occursCheck"
+        else do
+-}
+        -- we are linear, so we can solve!
+	reportSDoc "tc.meta.assign" 25 $
+	    text "preparing to instantiate: " <+> prettyTCM v
 
 	-- Rename the variables in v to make it suitable for abstraction over ids.
 	v' <- do
@@ -528,90 +551,84 @@
 	    --   ids = d b e
 	    -- then
 	    --   v' = (λ a b c d e. v) _ 1 _ 2 0
-	    tel  <- getContextTelescope
-	    args <- map defaultArg <$> getContextTerms
-	    let iargs = reverse $ zipWith (rename $ reverse $ map unArg ids) [0..] $ reverse args
-		v'    = raise (size ids) (abstract tel v) `apply` iargs
+	    tel   <- getContextTelescope
+	    gamma <- map defaultArg <$> getContextTerms
+	    let iargs = reverse $ zipWith (rename ids) [0..] $ reverse gamma
+		v'    = raise (size args) (abstract tel v) `apply` iargs
 	    return v'
 
-	let extTel (Arg h r i) m = do
-	      tel <- m
-	      t	  <- typeOfBV i
-	      x	  <- nameOfBV i
-	      return $ ExtendTel (Arg h r t) (Abs (show x) tel)
-	tel' <- foldr extTel (return EmptyTel) ids
+        -- Andreas, 2011-04-18 to work with irrelevant parameters DontCare
+        -- we need to construct tel' from the type of the meta variable
+        -- (no longer from ids which may not be the complete variable list
+        -- any more)
+        let t = jMetaType $ mvJudgement mvar
+	reportSDoc "tc.meta.assign" 15 $ text "type of meta =" <+> prettyTCM t
+--	reportSDoc "tc.meta.assign" 30 $ text "type of meta =" <+> text (show t)
 
-	reportSDoc "tc.meta.assign" 15 $
-	  text "final instantiation:" <+> prettyTCM (abstract tel' v')
+        TelV tel0 core0 <- telViewM t
+        let n = length args
+	reportSDoc "tc.meta.assign" 30 $ text "tel0  =" <+> prettyTCM tel0
+	reportSDoc "tc.meta.assign" 30 $ text "#args =" <+> text (show n)
+        when (size tel0 < n) __IMPOSSIBLE__
+        let tel' = telFromList $ take n $ telToList tel0
 
+	reportSDoc "tc.meta.assign" 10 $
+	  text "solving" <+> prettyTCM x <+> text ":=" <+> prettyTCM (abstract tel' v')
+
 	-- Perform the assignment (and wake constraints). Metas
 	-- are top-level so we do the assignment at top-level.
 	n <- size <$> getContextTelescope
-	escapeContext n $ x =:= killRange (abstract tel' v')
-	return []
+	escapeContext n $ assignTerm x $ killRange (abstract tel' v')
+	return ()
     where
+        -- @ids@ are the lhs variables (metavar arguments)
+        -- @i@ is the variable from the context Gamma
+        rename :: [Nat] -> Nat -> Arg Term -> Arg Term
 	rename ids i arg = case findIndex (==i) ids of
 	    Just j  -> fmap (const $ Var (fromIntegral j) []) arg
-	    Nothing -> fmap (const __IMPOSSIBLE__) arg
-              -- we will end up here, but never look at the result
-
-	handler :: MonadTCM tcm => tcm Constraints
-	handler = do
-	    reportSLn "tc.meta.assign" 10 $ "Oops. Undo " ++ show x ++ " := ..."
-	    equalSort (MetaS x args) s
-
-        noPolyAssign x s =
-          handleAbort (equalSort (MetaS x []) s) $ do
-            Sort s <- occursCheck x [] (Sort s)
-            x =: s
-            return []
+	    Nothing -> fmap (const __IMPOSSIBLE__) arg	-- we will end up here, but never look at the result
 
-type FVs = Set Nat
+type FVs = Set.VarSet
 
 -- | Check that arguments to a metavar are in pattern fragment.
 --   Assumes all arguments already in whnf.
 --   Parameters are represented as @Var@s so @checkArgs@ really
---     checks that all args are unique @Var@s and returns the
---     list of corresponding indices for each arg-- done
---     to not define equality on @Term@.
+--     checks that all args are @Var@s and returns the
+--     list of corresponding indices for each arg.
+--   Linearity has to be checked separately.
 --
 --   @reverse@ is necessary because we are directly abstracting over this list @ids@.
---
-checkArgs :: MonadTCM tcm => MetaId -> Args -> FVs -> tcm [Arg Nat]
-checkArgs x args fvs = do
-  args <- instantiateFull args
-  case validParameters args fvs of
-    Just ids -> return $ reverse ids
-    Nothing  -> patternViolation
-
--- | Check that the parameters to a meta variable are distinct variables.
--- Andreas, 2010-09-24: Allow non-linear variables that do not appear in @FVs@.
-validParameters :: Monad m => Args -> FVs -> m [Arg Nat]
-validParameters args fvs
-    | all isVar args && distinct (filter (flip Set.member fvs) $ map unArg vars)
-                = return $ reverse vars
-    | otherwise	= fail "invalid parameters"
-    where
-	vars = [ Arg h r i | Arg h r (Var i []) <- args ]
-
+checkAllVars :: Args -> TCM [Nat]
+checkAllVars args =
+  case allVarOrIrrelevant args of
+    Nothing -> do
+      reportSDoc "tc.meta.assign" 15 $ vcat [ text "not all variables: " <+> prettyTCM args
+                                            , text "  aborting assignment" ]
+      patternViolation
+    Just is -> return $ map unArg is
 
-isVar :: Arg Term -> Bool
-isVar (Arg _ _ (Var _ [])) = True
-isVar _			 = False
+-- | filter out irrelevant args and check that all others are variables.
+--   Return the reversed list of variables.
+allVarOrIrrelevant :: Args -> Maybe [Arg Nat]
+allVarOrIrrelevant args = foldM isVarOrIrrelevant [] args where
+  isVarOrIrrelevant vars arg =
+    case arg of
+      Arg h r (Var i []) -> return $ Arg h r i : removeIrr i vars
+      Arg h Irrelevant (DontCare (Var i [])) -> return $ addIrrIfNotPresent h i vars
+      -- Andreas, 2011-04-27 keep irrelevant variables
+      Arg h Irrelevant _ -> return $ Arg h Irrelevant (-1) : vars -- any impossible deBruijn index will do (see Jason Reed, LFMTP 09 "_" or Nipkow "minus infinity")
+      _                  -> Nothing
+  -- in case of non-linearity make sure not to count the irrelevant vars
+  addIrrIfNotPresent h i vars
+    | any (\ (Arg _ _ j) -> j == i) vars = Arg h Irrelevant (-1) : vars
+    | otherwise                          = Arg h Irrelevant i    : vars
+  removeIrr i = map (\ a@(Arg h r j) ->
+    if r == Irrelevant && i == j then Arg h Irrelevant (-1) else a)
 
 
-updateMeta :: (MonadTCM tcm, Data a, Occurs a, Abstract a) => MetaId -> a -> tcm ()
-updateMeta mI t =
-    do	mv <- lookupMeta mI
-	withMetaInfo (getMetaInfo mv) $
-	    do	args <- getContextArgs
-		cs <- upd mI args (mvJudgement mv) t
-		unless (List.null cs) $ fail $ "failed to update meta " ++ show mI
-    where
-	upd mI args j t = (__IMPOSSIBLE__ `mkQ` updV j `extQ` updS) t
-	    where
-		updV (HasType _ t) v =
-		  assignV (t `piApply` args) mI args v
-		updV _ _	     = __IMPOSSIBLE__
-
-		updS s = assignS mI args s
+updateMeta :: MetaId -> Term -> TCM ()
+updateMeta mI v = do
+    mv <- lookupMeta mI
+    withMetaInfo (getMetaInfo mv) $ do
+      args <- getContextArgs
+      noConstraints $ assignV mI args v
diff --git a/src/full/Agda/TypeChecking/MetaVars.hs-boot b/src/full/Agda/TypeChecking/MetaVars.hs-boot
--- a/src/full/Agda/TypeChecking/MetaVars.hs-boot
+++ b/src/full/Agda/TypeChecking/MetaVars.hs-boot
@@ -1,10 +1,9 @@
 
 module Agda.TypeChecking.MetaVars where
 
-import Agda.Syntax.Internal	       ( MetaId, Term, Sort )
-import Agda.TypeChecking.Monad.Base ( MonadTCM )
-
-assignTerm :: MonadTCM tcm => MetaId -> Term -> tcm ()
-assignSort :: MonadTCM tcm => MetaId -> Sort -> tcm ()
+import Agda.Syntax.Internal	    ( MetaId, Term, Sort, Type, Args )
+import Agda.TypeChecking.Monad.Base ( TCM )
 
-etaExpandMetaSafe :: MonadTCM tcm => MetaId -> tcm ()
+assignTerm        :: MetaId -> Term -> TCM ()
+etaExpandMetaSafe :: MetaId -> TCM ()
+assignV           :: MetaId -> Args -> Term -> TCM ()
diff --git a/src/full/Agda/TypeChecking/MetaVars/Mention.hs b/src/full/Agda/TypeChecking/MetaVars/Mention.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/TypeChecking/MetaVars/Mention.hs
@@ -0,0 +1,105 @@
+
+module Agda.TypeChecking.MetaVars.Mention where
+
+import Data.Traversable
+
+import Agda.Syntax.Common
+import Agda.Syntax.Internal
+import Agda.TypeChecking.Reduce
+import Agda.TypeChecking.Monad
+
+
+class MentionsMeta t where
+  mentionsMeta :: MetaId -> t -> Bool
+
+instance MentionsMeta Term where
+  mentionsMeta x v = case v of
+    Var _ args   -> mm args
+    Lam _ b      -> mm b
+    Lit{}        -> False
+    Def _ args   -> mm args
+    Con _ args   -> mm args
+    Pi a b       -> mm (a, b)
+    Sort s       -> mm s
+    Level l      -> mm l
+    DontCare v   -> False   -- we don't have to look inside don't cares when deciding to wake constraints
+    MetaV y args -> x == y || mm args   -- TODO: we really only have to look one level deep at meta args
+    where
+      mm v = mentionsMeta x v
+
+instance MentionsMeta Level where
+  mentionsMeta x (Max as) = mentionsMeta x as
+
+instance MentionsMeta PlusLevel where
+  mentionsMeta x ClosedLevel{} = False
+  mentionsMeta x (Plus _ a) = mentionsMeta x a
+
+instance MentionsMeta LevelAtom where
+  mentionsMeta x l = case l of
+    MetaLevel m vs   -> x == m || mentionsMeta x vs
+    BlockedLevel m _ -> x == m    -- if it's blocked on a different meta it doesn't matter if it mentions the meta somewhere else
+    UnreducedLevel l -> mentionsMeta x l
+    NeutralLevel l   -> mentionsMeta x l
+
+instance MentionsMeta Type where
+    mentionsMeta x (El s t) = mentionsMeta x (s, t)
+
+instance MentionsMeta Sort where
+  mentionsMeta x s = case s of
+    Type l     -> mentionsMeta x l
+    Prop       -> False
+    Inf        -> False
+    DLub s1 s2 -> mentionsMeta x (s1, s2)
+
+instance MentionsMeta t => MentionsMeta (Abs t) where
+  mentionsMeta x = mentionsMeta x . unAbs
+
+instance MentionsMeta t => MentionsMeta (Arg t) where
+  mentionsMeta x = mentionsMeta x . unArg
+
+instance MentionsMeta t => MentionsMeta [t] where
+  mentionsMeta x = any (mentionsMeta x)
+
+instance MentionsMeta t => MentionsMeta (Maybe t) where
+  mentionsMeta x = maybe False (mentionsMeta x)
+
+instance (MentionsMeta a, MentionsMeta b) => MentionsMeta (a, b) where
+  mentionsMeta x (a, b) = mentionsMeta x a || mentionsMeta x b
+
+instance (MentionsMeta a, MentionsMeta b, MentionsMeta c) => MentionsMeta (a, b, c) where
+  mentionsMeta x (a, b, c) = mentionsMeta x a || mentionsMeta x b || mentionsMeta x c
+
+instance MentionsMeta a => MentionsMeta (Closure a) where
+  mentionsMeta x cl = mentionsMeta x (clValue cl)
+
+instance MentionsMeta Elim where
+  mentionsMeta x Proj{} = False
+  mentionsMeta x (Apply v) = mentionsMeta x v
+
+instance MentionsMeta a => MentionsMeta (Tele a) where
+  mentionsMeta x EmptyTel = False
+  mentionsMeta x (ExtendTel a b) = mentionsMeta x (a, b)
+
+instance MentionsMeta ProblemConstraint where
+  mentionsMeta x = mentionsMeta x . theConstraint
+
+instance MentionsMeta Constraint where
+  mentionsMeta x c = case c of
+    ValueCmp _ t u v    -> mm (t, u, v)
+    ElimCmp _ t v as bs -> mm ((t, v), (as, bs))
+    LevelCmp _ u v      -> mm (u, v)
+    TypeCmp _ a b       -> mm (a, b)
+    TelCmp a b _ u v    -> mm ((a, b), (u, v))
+    SortCmp _ a b       -> mm (a, b)
+    Guarded c _         -> mm c
+    UnBlock _           -> True   -- this might be a postponed typechecking
+                                  -- problem and we don't have a handle on
+                                  -- what metas it depends on
+    FindInScope m       -> True   -- this needs to be woken up for any meta
+    IsEmpty t           -> mm t
+    where
+      mm v = mentionsMeta x v
+
+-- instance (Ord k, MentionsMeta e) => MentionsMeta (Map k e) where
+--   mentionsMeta = traverse mentionsMeta
+
diff --git a/src/full/Agda/TypeChecking/MetaVars/Occurs.hs b/src/full/Agda/TypeChecking/MetaVars/Occurs.hs
--- a/src/full/Agda/TypeChecking/MetaVars/Occurs.hs
+++ b/src/full/Agda/TypeChecking/MetaVars/Occurs.hs
@@ -5,77 +5,125 @@
 import Control.Applicative
 import Control.Monad
 import Control.Monad.Error
-import qualified Data.Set as Set
+import Data.Traversable (traverse)
 
 import Agda.Syntax.Common
 import Agda.Syntax.Internal
 import Agda.TypeChecking.Monad
 import Agda.TypeChecking.Reduce
 import Agda.TypeChecking.Pretty
-import Agda.TypeChecking.Free
+import Agda.TypeChecking.Free hiding (Occurrence(..))
 import Agda.TypeChecking.Substitute
 import Agda.TypeChecking.EtaContract
+import Agda.TypeChecking.Datatypes (isDataOrRecordType)
 import {-# SOURCE #-} Agda.TypeChecking.MetaVars
 
 import Agda.Utils.Monad
 import Agda.Utils.Permutation
 import Agda.Utils.Size
+import qualified Agda.Utils.VarSet as Set
 
 import Agda.Utils.Impossible
 #include "../../undefined.h"
 
-data OccursCtx = Flex | Rigid
+data OccursCtx
+  = Flex          -- ^ we are in arguments of a meta
+  | Rigid         -- ^ we are not in arguments of a meta but a bound var
+  | StronglyRigid -- ^ we are at the start or in the arguments of a constructor
+  | Irrel         -- ^ we are in an irrelevant argument
   deriving (Eq, Show)
 
+data UnfoldStrategy = YesUnfold | NoUnfold
+  deriving (Eq, Show)
+
+defArgs :: UnfoldStrategy -> OccursCtx -> OccursCtx
+defArgs NoUnfold  _   = Flex
+defArgs YesUnfold ctx = weakly ctx
+
+unfold :: UnfoldStrategy -> Term -> TCM (Blocked Term)
+unfold NoUnfold  v = NotBlocked <$> instantiate v
+unfold YesUnfold v = reduceB v
+
+-- | Leave the strongly rigid position.
+weakly :: OccursCtx -> OccursCtx
+weakly StronglyRigid = Rigid
+weakly ctx = ctx
+
+strongly :: OccursCtx -> OccursCtx
+strongly Rigid = StronglyRigid
+strongly ctx = ctx
+
 abort :: OccursCtx -> TypeError -> TCM ()
-abort Flex  _   = patternViolation
-abort Rigid err = typeError err
+abort StronglyRigid err = typeError err -- here, throw an uncatchable error (unsolvable constraint)
+abort Flex  _ = patternViolation -- throws a PatternErr, which leads to delayed constraint
+abort Rigid _ = patternViolation
+abort Irrel _ = patternViolation
 
+-- | Distinguish relevant and irrelevant variables in occurs check.
+type Vars = ([Nat],[Nat])
+
+goIrrelevant :: Vars -> Vars
+goIrrelevant (relVs, irrVs) = (irrVs ++ relVs, [])
+
+allowedVar :: Nat -> Vars -> Bool
+allowedVar i (relVs, irrVs) = i `elem` relVs
+
+takeRelevant :: Vars -> [Nat]
+takeRelevant = fst
+
+underAbs :: Vars -> Vars
+underAbs (relVs, irrVs) = (0 : map (1+) relVs, map (1+) irrVs)
+
 -- | Extended occurs check.
 class Occurs t where
-  occurs :: OccursCtx -> MetaId -> [Nat] -> t -> TCM t
+  occurs :: UnfoldStrategy -> OccursCtx -> MetaId -> Vars -> t -> TCM t
 
 -- | When assigning @m xs := v@, check that @m@ does not occur in @v@
 --   and that the free variables of @v@ are contained in @xs@.
-occursCheck :: MonadTCM tcm => MetaId -> [Nat] -> Term -> tcm Term
+occursCheck :: MetaId -> Vars -> Term -> TCM Term
 occursCheck m xs v = liftTCM $ do
-  v <- instantiate v
-  case v of
-    -- Don't fail if trying to instantiate to just itself
-    MetaV m' _        | m == m' -> patternViolation
-    Sort (MetaS m' _) | m == m' -> patternViolation
-    _                           ->
-                              -- Produce nicer error messages
-      occurs Rigid m xs v `catchError` \err -> case errError err of
-        TypeError _ cl -> case clValue cl of
-          MetaOccursInItself{} ->
-            typeError . GenericError . show =<<
-              fsep [ text ("Refuse to construct infinite term by instantiating " ++ show m ++ " to")
-                   , prettyTCM v
-                   ]
-          MetaCannotDependOn _ _ i ->
-            ifM ((&&) <$> isSortMeta m <*> (not <$> hasUniversePolymorphism))
-            ( typeError . GenericError . show =<<
-              fsep [ text ("Cannot instantiate the metavariable " ++ show m ++ " to")
-                   , prettyTCM v
-                   , text "since universe polymorphism is not enabled"
-                   , text "(use the --universe-polymorphism flag to enable)"
-                   ]
-            )
-            ( typeError . GenericError . show =<<
-              fsep [ text ("Cannot instantiate the metavariable " ++ show m ++ " to")
-                   , prettyTCM v
-                   , text "since it contains the variable"
-                   , enterClosure cl $ \_ -> prettyTCM (Var i [])
-                   , text $ "which " ++ show m ++ " cannot depend on"
-                   ]
-            )
-          _ -> throwError err
-        _ -> throwError err
+  let bailOnSelf v = do
+        v <- instantiate v
+        case v of
+          -- Don't fail if trying to instantiate to just itself
+          MetaV m' _ | m == m' -> patternViolation
+          Level (Max [Plus 0 (MetaLevel m' _)])
+                     | m == m' -> patternViolation
+          _ -> return v
 
+  v <- bailOnSelf v
+  -- First try without normalising the term
+  occurs NoUnfold  StronglyRigid m xs v `catchError` \_ -> do
+  occurs YesUnfold StronglyRigid m xs v `catchError` \err -> case errError err of
+                          -- Produce nicer error messages
+    TypeError _ cl -> case clValue cl of
+      MetaOccursInItself{} ->
+        typeError . GenericError . show =<<
+          fsep [ text ("Refuse to construct infinite term by instantiating " ++ show m ++ " to")
+               , prettyTCM =<< instantiateFull v
+               ]
+      MetaCannotDependOn _ _ i ->
+        ifM ((&&) <$> isSortMeta m <*> (not <$> hasUniversePolymorphism))
+        ( typeError . GenericError . show =<<
+          fsep [ text ("Cannot instantiate the metavariable " ++ show m ++ " to")
+               , prettyTCM v
+               , text "since universe polymorphism is disabled"
+               ]
+        )
+        ( typeError . GenericError . show =<<
+            fsep [ text ("Cannot instantiate the metavariable " ++ show m ++ " to solution")
+                 , prettyTCM v
+                 , text "since it contains the variable"
+                 , enterClosure cl $ \_ -> prettyTCM (Var i [])
+                 , text $ "which is not in scope of the metavariable or irrelevant in the metavariable but relevant in the solution"
+                 ]
+          )
+      _ -> throwError err
+    _ -> throwError err
+
 instance Occurs Term where
-  occurs ctx m xs v = do
-    v <- reduceB v
+  occurs red ctx m xs v = do
+    v <- unfold red v
     case v of
       -- Don't fail on blocked terms or metas
       Blocked _ v  -> occurs' Flex v
@@ -83,30 +131,35 @@
     where
       occurs' ctx v = case v of
         Var i vs   -> do         -- abort Rigid turns this error into PatternErr
-          unless (i `elem` xs) $ abort ctx $ MetaCannotDependOn m xs i
-          Var i <$> occ vs
-        Lam h f	    -> Lam h <$> occ f
+          unless (i `allowedVar` xs) $ abort (strongly ctx) $ MetaCannotDependOn m (takeRelevant xs) i
+          Var i <$> occ (weakly ctx) vs
+        Lam h f	    -> Lam h <$> occ ctx f
+        Level l     -> Level <$> occ ctx l
         Lit l	    -> return v
-        DontCare    -> return v
-        Def c vs    -> Def c <$> occ vs
-        Con c vs    -> Con c <$> occ vs
-        Pi a b	    -> uncurry Pi <$> occ (a,b)
-        Fun a b	    -> uncurry Fun <$> occ (a,b)
-        Sort s	    -> Sort <$> occ s
+        DontCare v  -> DontCare <$> occurs red Irrel m (goIrrelevant xs) v
+        Def d vs    -> Def d <$> occDef d ctx vs
+        Con c vs    -> Con c <$> occ ctx vs  -- if strongly rigid, remain so
+        Pi a b	    -> uncurry Pi <$> occ ctx (a,b)
+        Sort s	    -> Sort <$> occ ctx s
         MetaV m' vs -> do
             -- Check for loop
-            when (m == m') $ abort ctx $ MetaOccursInItself m
+            --   don't fail hard on this, since we might still be on the top-level
+            --   after some killing (Issue 442)
+            when (m == m') $ patternViolation
 
-            -- The arguments are in a flexible position
-            (MetaV m' <$> occurs Flex m xs vs) `catchError` \err -> do
+            -- The arguments of a meta are in a flexible position
+            (MetaV m' <$> occurs red Flex m xs vs) `catchError` \err -> do
               reportSDoc "tc.meta.kill" 25 $ vcat
                 [ text $ "error during flexible occurs check, we are " ++ show ctx
                 , text $ show (errError err)
                 ]
               case errError err of
                 -- On pattern violations try to remove offending
-                -- flexible occurrences (if in a rigid context)
-                PatternErr{} | ctx == Rigid -> do
+                -- flexible occurrences (if not already in a flexible context)
+                PatternErr{} | ctx /= Flex -> do
+                      reportSLn "tc.meta.kill" 20 $
+                        "oops, pattern violation for " ++ show m'
+{-
                   let kills = map (hasBadRigid xs) $ map unArg vs
                   reportSLn "tc.meta.kill" 20 $
                     "oops, pattern violation for " ++ show m' ++ "\n" ++
@@ -124,76 +177,161 @@
                           ]
                         ]
                       ok <- killArgs kills m'
-                      if ok
-                        then occurs Rigid m xs =<< instantiate (MetaV m' vs)
+-}
+                      killResult <- prune m' vs (takeRelevant xs)
+                      if (killResult == PrunedEverything)
+                        -- after successful pruning, restart occurs check
+                        then occurs red ctx m xs =<< instantiate (MetaV m' vs)
                         else throwError err
                 _ -> throwError err
         where
-          occ x = occurs ctx m xs x
+          occ ctx v = occurs red ctx m xs v
+          -- a data or record type constructor propagates strong occurrences
+          -- since e.g. x = List x is unsolvable
+          occDef d ctx v = ifM (isDataOrRecordType d) (occ ctx v)
+                                 (occ (defArgs red ctx) v)
 
+instance Occurs Level where
+  occurs red ctx m xs (Max as) = Max <$> occurs red ctx m xs as
+
+instance Occurs PlusLevel where
+  occurs red ctx m xs l@ClosedLevel{} = return l
+  occurs red ctx m xs (Plus n l) = Plus n <$> occurs red ctx m xs l
+
+instance Occurs LevelAtom where
+  occurs red ctx m xs l = do
+    l <- case red of
+           YesUnfold -> reduce l
+           NoUnfold  -> instantiate l
+    case l of
+      MetaLevel m' args -> do
+        MetaV m' args <- occurs red ctx m xs (MetaV m' args)
+        return $ MetaLevel m' args
+      NeutralLevel v   -> NeutralLevel   <$> occurs red ctx m xs v
+      BlockedLevel m v -> BlockedLevel m <$> occurs red Flex m xs v
+      UnreducedLevel v -> UnreducedLevel <$> occurs red ctx m xs v
+
 instance Occurs Type where
-  occurs ctx m xs (El s v) = uncurry El <$> occurs ctx m xs (s,v)
+  occurs red ctx m xs (El s v) = uncurry El <$> occurs red ctx m xs (s,v)
 
 instance Occurs Sort where
-  occurs ctx m xs s = do
-    s' <- reduce s
+  occurs red ctx m xs s = do
+    s' <- case red of
+            YesUnfold -> reduce s
+            NoUnfold  -> instantiate s
     case s' of
-      MetaS m' args -> do
-        when (m == m') $ abort ctx $ MetaOccursInItself m
-        MetaS m' <$> occurs Flex m xs args
-      Lub s1 s2  -> uncurry Lub <$> occurs ctx m xs (s1,s2)
-      DLub s1 s2 -> uncurry DLub <$> occurs ctx m xs (s1, s2)
-      Suc s      -> Suc <$> occurs ctx m xs s
-      Type a     -> Type <$> occurs ctx m xs a
+      DLub s1 s2 -> uncurry DLub <$> occurs red (weakly ctx) m xs (s1,s2)
+      Type a     -> Type <$> occurs red ctx m xs a
       Prop       -> return s'
       Inf        -> return s'
 
 instance Occurs a => Occurs (Abs a) where
-  occurs ctx m xs (Abs s x) = Abs s <$> occurs ctx m (0 : map (1+) xs) x
+  occurs red ctx m xs (Abs   s x) = Abs   s <$> occurs red ctx m (underAbs xs) x
+  occurs red ctx m xs (NoAbs s x) = NoAbs s <$> occurs red ctx m xs x
 
 instance Occurs a => Occurs (Arg a) where
-  occurs ctx m xs (Arg h r x) = Arg h r <$> occurs ctx m xs x
+  occurs red ctx m xs (Arg h r x) = Arg h r <$> occurs red ctx m xs x
 
 instance (Occurs a, Occurs b) => Occurs (a,b) where
-  occurs ctx m xs (x,y) = (,) <$> occurs ctx m xs x <*> occurs ctx m xs y
+  occurs red ctx m xs (x,y) = (,) <$> occurs red ctx m xs x <*> occurs red ctx m xs y
 
 instance Occurs a => Occurs [a] where
-  occurs ctx m xs ys = mapM (occurs ctx m xs) ys
+  occurs red ctx m xs ys = mapM (occurs red ctx m xs) ys
 
--- Getting rid of flexible occurrences --
+-- * Getting rid of flexible occurrences
 
+-- | @prune m' vs xs@ attempts to remove all arguments from @vs@ whose
+--   free variables are not contained in @xs@.
+--   If successful, @m'@ is solved by the new, pruned meta variable and we
+--   return @True@ else @False@.
+prune :: MetaId -> Args -> [Nat] -> TCM PruneResult
+prune m' vs xs = liftTCM $ do
+  let kills = map (hasBadRigid xs) $ map unArg vs
+  reportSDoc "tc.meta.kill" 10 $ vcat
+    [ text "attempting kills"
+    , nest 2 $ vcat
+      [ text "m'    =" <+> text (show m')
+      , text "xs    =" <+> text (show xs)
+      , text "vs    =" <+> prettyList (map prettyTCM vs)
+      , text "kills =" <+> text (show kills)
+      ]
+    ]
+{- Andreas, 2011-05-11 REDUNDANT CODE
+  reportSLn "tc.meta.kill" 20 $
+    "attempting to prune meta " ++ show m' ++ "\n" ++
+    "  kills: " ++ show kills
+  if not (or kills)
+    then return False -- nothing to kill
+    else do
+-}
+  killArgs kills m'
+
+-- | @hasBadRigid xs v = True@ iff one of the rigid variables in @v@ is not in @xs@.
+--   Actually we can only prune if a bad variable is in the head. See issue 458.
 hasBadRigid :: [Nat] -> Term -> Bool
-hasBadRigid xs v =
-  not $ Set.isSubsetOf
-    (rigidVars $ freeVars v)
-    (Set.fromList xs)
+hasBadRigid xs (Var v _) = notElem v xs
+hasBadRigid xs _         = False
+  -- not $ Set.isSubsetOf
+  --   (rigidVars $ freeVars v)
+  --   (Set.fromList xs)
 
-killArgs :: [Bool] -> MetaId -> TCM Bool
+data PruneResult
+  = NothingToPrune   -- ^ the kill list is empty or only @False@s
+  | PrunedNothing    -- ^ there is no possible kill (because of type dep.)
+  | PrunedSomething  -- ^ managed to kill some args in the list
+  | PrunedEverything -- ^ all prescribed kills where performed
+    deriving (Eq, Show)
+
+-- | @killArgs [k1,...,kn] X@ prunes argument @i@ from metavar @X@ if @ki==True@.
+--   Pruning is carried out whenever > 0 arguments can be pruned.
+--   @True@ is only returned if all arguments could be pruned.
+killArgs :: [Bool] -> MetaId -> TCM PruneResult
 killArgs kills _
-  | not (or kills) = return False  -- nothing to kill
+  | not (or kills) = return NothingToPrune  -- nothing to kill
 killArgs kills m = do
   mv <- lookupMeta m
+  if mvFrozen mv == Frozen then return PrunedNothing else do
+{- Andreas 2011-04-26, allow pruning in MetaS
   case mvJudgement mv of
     IsSort _    -> return False
     HasType _ a -> do
+-}
+      let a = jMetaType $ mvJudgement mv
       TelV tel b <- telView' <$> instantiateFull a
       let args         = zip (telToList tel) (kills ++ repeat False)
           (kills', a') = killedType args b
       dbg kills' a a'
-      when (any unArg kills') $ performKill (reverse kills') m a'
-      -- Only successful if all occurrences were killed
-      return (map unArg kills' == kills)
+      -- If there is any prunable argument, perform the pruning
+      if not (any unArg kills') then return PrunedNothing else do
+        performKill (reverse kills') m a'
+        -- Only successful if all occurrences were killed
+        -- Andreas, 2011-05-09 more precisely, check that at least
+        -- the in 'kills' prescribed kills were carried out
+        -- OLD CODE: return (map unArg kills' == kills)
+        return $ if (and $ zipWith implies kills $ map unArg kills')
+                   then PrunedEverything
+                   else PrunedSomething
   where
+    implies :: Bool -> Bool -> Bool
+    implies False _ = True
+    implies True  x = x
     dbg kills' a a' =
       reportSDoc "tc.meta.kill" 10 $ vcat
         [ text "after kill analysis"
         , nest 2 $ vcat
-          [ text "kills'  =" <+> text (show kills')
+          [ text "metavar =" <+> prettyTCM m
+          , text "kills   =" <+> text (show kills)
+          , text "kills'  =" <+> text (show kills')
           , text "oldType =" <+> prettyTCM a
           , text "newType =" <+> prettyTCM a'
           ]
         ]
 
+-- | @killedType [((x1,a1),k1)..((xn,an),kn)] b = ([k'1..k'n],t')@
+--   (ignoring @Arg@).  Let @t' = (xs:as) -> b@.
+--   Invariant: @k'i == True@ iff @ki == True@ and pruning the @i@th argument from
+--   type @b@ is possible without creating unbound variables.
+--   @t'@ is type @t@ after pruning all @k'i==True@.
 killedType :: [(Arg (String, Type), Bool)] -> Type -> ([Arg Bool], Type)
 killedType [] b = ([], b)
 killedType ((arg, kill) : kills) b
@@ -208,9 +346,11 @@
 performKill :: [Arg Bool] -> MetaId -> Type -> TCM ()
 performKill kills m a = do
   mv <- lookupMeta m
+  when (mvFrozen mv == Frozen) __IMPOSSIBLE__
   let perm = Perm (size kills)
              [ i | (i, Arg _ _ False) <- zip [0..] (reverse kills) ]
-  m' <- newMeta (mvInfo mv) (mvPriority mv) perm (HasType undefined a)
+  m' <- newMeta (mvInfo mv) (mvPriority mv) perm
+                (HasType __IMPOSSIBLE__ a)
   -- Andreas, 2010-10-15 eta expand new meta variable if necessary
   etaExpandMetaSafe m'
   let vars = reverse [ Arg h r (Var i []) | (i, Arg h r False) <- zip [0..] kills ]
diff --git a/src/full/Agda/TypeChecking/Monad/Base.hs b/src/full/Agda/TypeChecking/Monad/Base.hs
--- a/src/full/Agda/TypeChecking/Monad/Base.hs
+++ b/src/full/Agda/TypeChecking/Monad/Base.hs
@@ -1,20 +1,24 @@
 {-# LANGUAGE CPP, ExistentialQuantification, FlexibleContexts, Rank2Types,
              TypeSynonymInstances, MultiParamTypeClasses, FlexibleInstances,
-             UndecidableInstances, DeriveDataTypeable, GeneralizedNewtypeDeriving
+             UndecidableInstances, DeriveDataTypeable, GeneralizedNewtypeDeriving,
+             DeriveFunctor, DeriveFoldable, DeriveTraversable
   #-}
 module Agda.TypeChecking.Monad.Base where
 
+import Control.Arrow
 import Control.Exception as E
 import Control.Monad.Error
 import Control.Monad.State
 import Control.Monad.Reader
 import Control.Applicative
+import Data.Function
 import Data.Int
 import Data.Map as Map
 import Data.Set as Set
 import Data.Generics
 import Data.Foldable
 import Data.Traversable
+import Data.IORef
 import System.Time
 
 import Agda.Syntax.Common
@@ -33,10 +37,13 @@
 import qualified Agda.Interaction.Highlighting.Range as R
 import Agda.Interaction.Highlighting.Precise (HighlightingInfo)
 
+import qualified Agda.Compiler.JS.Syntax as JS
+
 import Agda.Utils.FileName
 import Agda.Utils.Fresh
 import Agda.Utils.Monad
 import Agda.Utils.Permutation
+import Agda.Utils.Pretty
 
 #include "../../undefined.h"
 import Agda.Utils.Impossible
@@ -49,37 +56,47 @@
     TCSt { stFreshThings       :: FreshThings
 	 , stMetaStore	       :: MetaStore
 	 , stInteractionPoints :: InteractionPoints
-	 , stConstraints       :: Constraints
+	 , stAwakeConstraints    :: Constraints
+	 , stSleepingConstraints :: Constraints
 	 , stSignature	       :: Signature
 	 , stImports	       :: Signature
 	 , stImportedModules   :: Set ModuleName
          , stModuleToSource    :: ModuleToSource
 	 , stVisitedModules    :: VisitedModules
-	 , stDecodedModules    :: DecodedModules
          , stCurrentModule     :: Maybe ModuleName
            -- ^ The current module is available after it has been type
            -- checked.
 	 , stScope	       :: ScopeInfo
-	 , stPersistentOptions :: CommandLineOptions
-           -- ^ Options which apply to all files, unless overridden.
 	 , stPragmaOptions     :: PragmaOptions
            -- ^ Options applying to the current file. @OPTIONS@
            -- pragmas only affect this field.
 	 , stStatistics	       :: Statistics
+         , stExtLambdaTele     :: Map QName (Int , Int)
 	 , stMutualBlocks      :: Map MutualId (Set QName)
 	 , stLocalBuiltins     :: BuiltinThings PrimFun
          , stImportedBuiltins  :: BuiltinThings PrimFun
          , stHaskellImports    :: Set String
            -- ^ Imports that should be generated by the compiler (this
            -- includes imports from imported modules).
+         , stPersistent        :: PersistentTCState
 	 }
 
+-- | A part of the state which is not reverted when an error is thrown
+-- or the state is reset.
+
+data PersistentTCState = PersistentTCSt
+  { stDecodedModules    :: DecodedModules
+  , stPersistentOptions :: CommandLineOptions
+    -- ^ Options which apply to all files, unless overridden.
+  }
+
 data FreshThings =
 	Fresh { fMeta	     :: MetaId
 	      , fInteraction :: InteractionId
 	      , fMutual	     :: MutualId
 	      , fName	     :: NameId
 	      , fCtx	     :: CtxId
+              , fProblem     :: ProblemId
               , fInteger     :: Integer
                 -- ^ Can be used for various things.
 	      }
@@ -87,25 +104,29 @@
 
 initState :: TCState
 initState =
-    TCSt { stFreshThings       = Fresh 0 0 0 (NameId 0 0) 0 0
+    TCSt { stFreshThings       = (Fresh 0 0 0 (NameId 0 0) 0 0 0) { fProblem = 1 }
 	 , stMetaStore	       = Map.empty
 	 , stInteractionPoints = Map.empty
-	 , stConstraints       = []
+	 , stAwakeConstraints    = []
+	 , stSleepingConstraints = []
 	 , stSignature	       = emptySignature
 	 , stImports	       = emptySignature
 	 , stImportedModules   = Set.empty
          , stModuleToSource    = Map.empty
 	 , stVisitedModules    = Map.empty
-	 , stDecodedModules    = Map.empty
          , stCurrentModule     = Nothing
 	 , stScope	       = emptyScopeInfo
-	 , stPersistentOptions = defaultOptions
 	 , stPragmaOptions     = optPragmaOptions $ defaultOptions
 	 , stStatistics	       = Map.empty
+         , stExtLambdaTele     = Map.empty
 	 , stMutualBlocks      = Map.empty
 	 , stLocalBuiltins     = Map.empty
 	 , stImportedBuiltins  = Map.empty
          , stHaskellImports    = Set.empty
+         , stPersistent        = PersistentTCSt
+           { stPersistentOptions = defaultOptions
+	   , stDecodedModules    = Map.empty
+           }
 	 }
 
 stBuiltinThings :: TCState -> BuiltinThings PrimFun
@@ -141,6 +162,16 @@
 	where
 	    i = fInteger s
 
+newtype ProblemId = ProblemId Nat
+  deriving (Typeable, Data, Eq, Ord, Enum, Real, Integral, Num)
+
+instance Show ProblemId where
+  show (ProblemId n) = show n
+
+instance HasFresh ProblemId FreshThings where
+  nextFresh s = (i, s { fProblem = succ i })
+    where i = fProblem s
+
 instance HasFresh i FreshThings => HasFresh i TCState where
     nextFresh s = ((,) $! i) $! s { stFreshThings = f }
 	where
@@ -204,8 +235,8 @@
 instance HasRange a => HasRange (Closure a) where
     getRange = getRange . clValue
 
-buildClosure :: MonadTCM tcm => a -> tcm (Closure a)
-buildClosure x = liftTCM $ do
+buildClosure :: a -> TCM (Closure a)
+buildClosure x = do
     env   <- ask
     sig   <- gets stSignature
     scope <- gets stScope
@@ -215,56 +246,52 @@
 -- ** Constraints
 ---------------------------------------------------------------------------
 
-type ConstraintClosure = Closure Constraint
+type Constraints = [ProblemConstraint]
 
-data Constraint = ValueCmp Comparison Type Term Term
-                | ArgsCmp [Polarity] Type Args Args
-		| TypeCmp Comparison Type Type
-                | TelCmp Comparison Telescope Telescope
-		| SortCmp Comparison Sort Sort
-                | LevelCmp Comparison Term Term
-		| UnBlock MetaId
-		| Guarded Constraint Constraints
-                | IsEmpty Type
+data ProblemConstraint = PConstr
+  { constraintProblem :: ProblemId
+  , theConstraint     :: Closure Constraint
+  }
   deriving (Typeable, Show)
 
+data Constraint
+  = ValueCmp Comparison Type Term Term
+  | ElimCmp [Polarity] Type Term [Elim] [Elim]
+  | TypeCmp Comparison Type Type
+  | TelCmp Type Type Comparison Telescope Telescope -- ^ the two types are for the error message only
+  | SortCmp Comparison Sort Sort
+  | LevelCmp Comparison Level Level
+  | UnBlock MetaId
+  | Guarded Constraint ProblemId
+  | IsEmpty Type
+  | FindInScope MetaId
+  deriving (Typeable, Show)
+
 data Comparison = CmpEq | CmpLeq
   deriving (Eq, Typeable, Show)
 
-type Constraints = [ConstraintClosure]
-
 ---------------------------------------------------------------------------
 -- * Open things
 ---------------------------------------------------------------------------
 
 -- | A thing tagged with the context it came from.
 data Open a = OpenThing [CtxId] a
-    deriving (Typeable, Data, Show)
+    deriving (Typeable, Data, Show, Functor)
 
 ---------------------------------------------------------------------------
 -- * Judgements
+--
+-- Used exclusively for typing of meta variables.
 ---------------------------------------------------------------------------
 
 data Judgement t a
-	= HasType a t
-	| IsSort  a
-    deriving (Typeable, Data)
+	= HasType { jMetaId :: a, jMetaType :: t }
+	| IsSort  { jMetaId :: a, jMetaType :: t } -- Andreas, 2011-04-26: type needed for higher-order sort metas
+    deriving (Typeable, Data, Functor, Foldable, Traversable)
 
 instance (Show t, Show a) => Show (Judgement t a) where
     show (HasType a t) = show a ++ " : " ++ show t
-    show (IsSort  a)   = show a ++ " sort"
-
-instance Functor (Judgement t) where
-    fmap f (HasType x t) = HasType (f x) t
-    fmap f (IsSort  x)	 = IsSort (f x)
-
-instance Foldable (Judgement t) where
-    foldr f z (HasType x _) = f x z
-    foldr f z (IsSort  x)   = f x z
-
-instance Traversable (Judgement t) where
-    traverse f (HasType x t) = flip HasType t <$> f x
-    traverse f (IsSort  x)   = IsSort <$> f x
+    show (IsSort  a t) = show a ++ " :sort " ++ show t
 
 ---------------------------------------------------------------------------
 -- ** Meta variables
@@ -279,15 +306,41 @@
                   --   ones it does not depend on
 		, mvJudgement	  :: Judgement Type MetaId
 		, mvInstantiation :: MetaInstantiation
-		, mvListeners	  :: Set MetaId	  -- ^ metavariables interested in what happens to this guy
+		, mvListeners	  :: Set Listener -- ^ meta variables scheduled for eta-expansion but blocked by this one
+                , mvFrozen        :: Frozen -- ^ are we past the point where we can instantiate this meta variable?
 		}
     deriving (Typeable)
 
+data Listener = EtaExpand MetaId
+              | CheckConstraint Nat ProblemConstraint
+  deriving (Typeable)
+
+instance Eq Listener where
+  EtaExpand       x   == EtaExpand       y   = x == y
+  CheckConstraint x _ == CheckConstraint y _ = x == y
+  _ == _ = False
+
+instance Ord Listener where
+  EtaExpand       x   `compare` EtaExpand       y   = x `compare` y
+  CheckConstraint x _ `compare` CheckConstraint y _ = x `compare` y
+  EtaExpand{} `compare` CheckConstraint{} = LT
+  CheckConstraint{} `compare` EtaExpand{} = Prelude.GT
+
+-- | Frozen meta variable cannot be instantiated by unification.
+--   This serves to prevent the completion of a definition by its use
+--   outside of the current block.
+--   (See issues 118, 288, 399).
+data Frozen
+  = Frozen        -- ^ Do not instantiate.
+  | Instantiable
+    deriving (Eq, Show)
+
 data MetaInstantiation
-	= InstV Term
-	| InstS Term  -- should be Lam .. Sort s
-	| Open
-	| BlockedConst Term
+	= InstV Term         -- ^ solved by term
+	| InstS Term         -- ^ solved by @Lam .. Sort s@
+	| Open               -- ^ unsolved
+	| OpenIFS            -- ^ open, to be instantiated as "implicit from scope"
+	| BlockedConst Term  -- ^ solution blocked by unsolved constraints
         | PostponedTypeCheckingProblem (Closure (A.Expr, Type, TCM Bool))
     deriving (Typeable)
 
@@ -295,6 +348,7 @@
   show (InstV t) = "InstV (" ++ show t ++ ")"
   show (InstS s) = "InstS (" ++ show s ++ ")"
   show Open      = "Open"
+  show OpenIFS   = "OpenIFS"
   show (BlockedConst t) = "BlockedConst (" ++ show t ++ ")"
   show (PostponedTypeCheckingProblem{}) = "PostponedTypeCheckingProblem (...)"
 
@@ -310,8 +364,8 @@
     getRange m = getRange $ getMetaInfo m
 
 instance SetRange MetaVariable where
-  setRange r (MetaVar mi p perm j inst ls) =
-    MetaVar (mi {clValue = r}) p perm j inst ls
+  setRange r (MetaVar mi p perm j inst ls frozen) =
+    MetaVar (mi {clValue = r}) p perm j inst ls frozen
 
 normalMetaPriority :: MetaPriority
 normalMetaPriority = MetaPriority 0
@@ -385,6 +439,9 @@
   deriving (Typeable, Data, Show)
 
 data DisplayTerm = DWithApp [DisplayTerm] Args
+                 | DCon QName [Arg DisplayTerm]
+                 | DDef QName [Arg DisplayTerm]
+                 | DDot Term
 		 | DTerm Term
   deriving (Typeable, Data, Show)
 
@@ -392,18 +449,20 @@
 defaultDisplayForm c = []
 
 data Definition = Defn
-  { defRelevance :: Relevance -- ^ Some defs can be irrelevant (but not hidden).
-  , defName      :: QName
-  , defType      :: Type	      -- ^ Type of the lifted definition.
-  , defDisplay   :: [Open DisplayForm]
-  , defMutual    :: MutualId
-  , theDef	 :: Defn
+  { defRelevance   :: Relevance -- ^ Some defs can be irrelevant (but not hidden).
+  , defName        :: QName
+  , defType        :: Type	      -- ^ Type of the lifted definition.
+  , defDisplay     :: [Open DisplayForm]
+  , defMutual      :: MutualId
+  , defCompiledRep :: CompiledRepresentation
+  , theDef         :: Defn
   }
     deriving (Typeable, Data, Show)
 
 type HaskellCode = String
 type HaskellType = String
 type EpicCode    = String
+type JSCode      = JS.Exp
 
 data HaskellRepresentation
       = HsDefn HaskellType HaskellCode
@@ -413,17 +472,24 @@
 data Polarity = Covariant | Contravariant | Invariant
   deriving (Typeable, Data, Show, Eq)
 
+data CompiledRepresentation = CompiledRep
+  { compiledHaskell :: Maybe HaskellRepresentation
+  , compiledEpic    :: Maybe EpicCode
+  , compiledJS      :: Maybe JSCode
+  }
+  deriving (Typeable, Data, Show)
+
+noCompiledRep :: CompiledRepresentation
+noCompiledRep = CompiledRep Nothing Nothing Nothing
+
 -- | 'Positive' means strictly positive and 'Negative' means not strictly
 -- positive.
 data Occurrence = Positive | Negative | Unused
   deriving (Typeable, Data, Show, Eq, Ord)
 
 data Defn = Axiom
-            { axHsDef   :: Maybe HaskellRepresentation
-            , axEpDef   :: Maybe EpicCode
-            }
 	  | Function
-            { funClauses        :: [Clauses]
+            { funClauses        :: [Clause]
             , funCompiled       :: CompiledClauses
             , funInv            :: FunctionInverse
             , funPolarity       :: [Polarity]
@@ -431,12 +497,15 @@
             , funAbstr          :: IsAbstract
             , funDelayed        :: Delayed
               -- ^ Are the clauses of this definition delayed?
-            , funProjection     :: Maybe Int
+            , funProjection     :: Maybe (QName, Int)
               -- ^ Is it a record projection?
-              --   If yes, then return the index of the record argument.
-              --   Start counting with 1, because 0 means that it is already
-              --   applied to the record. (Can happen in module instantiation.)
-              --   This information is used in the termination checker.
+              --   If yes, then return the name of the record type and index of
+              --   the record argument.  Start counting with 1, because 0 means that
+              --   it is already applied to the record. (Can happen in module
+              --   instantiation.) This information is used in the termination
+              --   checker.
+            , funStatic         :: Bool
+              -- ^ Should calls to this function be normalised at compile-time?
             }
 	  | Datatype
             { dataPars           :: Nat           -- nof parameters
@@ -447,7 +516,6 @@
             , dataSort           :: Sort
             , dataPolarity       :: [Polarity]
             , dataArgOccurrences :: [Occurrence]
-            , dataHsType         :: Maybe HaskellType
             , dataAbstr          :: IsAbstract
             }
 	  | Record
@@ -457,7 +525,7 @@
             , recNamedCon       :: Bool
             , recConType        :: Type                 -- ^ The record constructor's type.
             , recFields         :: [Arg A.QName]
-            , recTel            :: Telescope
+            , recTel            :: Telescope            -- ^ The record field telescope
             , recPolarity       :: [Polarity]
             , recArgOccurrences :: [Occurrence]
             , recEtaEquality    :: Bool
@@ -467,20 +535,18 @@
             { conPars   :: Nat         -- nof parameters
 	    , conSrcCon :: QName       -- original constructor (this might be in a module instance)
 	    , conData   :: QName       -- name of datatype or record type
-            , conHsCode :: Maybe (HaskellType, HaskellCode) -- used by the compiler
 	    , conAbstr  :: IsAbstract
             , conInd    :: Induction   -- ^ Inductive or coinductive?
             }
-            -- ^ Note that, currently, the sharp constructor is
-            --   represented as a definition ('Def'), but if you look
-            --   up the name you will get a @Constructor@.
 	  | Primitive
             { primAbstr :: IsAbstract
             , primName  :: String
-            , primClauses :: Maybe [Clauses]
+            , primClauses :: Maybe [Clause]
               -- ^ 'Nothing' for primitive functions, @'Just'
               -- something@ for builtin functions.
             , primCompiled :: Maybe CompiledClauses
+              -- ^ 'Nothing' for primitive functions, @'Just'
+              -- something@ for builtin functions.
             }
             -- ^ Primitive or builtin functions.
     deriving (Typeable, Data, Show)
@@ -493,37 +559,39 @@
   deriving (Typeable, Data)
 
 data Reduced no yes = NoReduction no | YesReduction yes
-    deriving (Typeable)
+    deriving (Typeable, Functor)
 
 data IsReduced = NotReduced | Reduced (Blocked ())
 data MaybeReduced a = MaybeRed
   { isReduced     :: IsReduced
   , ignoreReduced :: a
   }
-
-instance Functor MaybeReduced where
-  fmap f (MaybeRed r x) = MaybeRed r (f x)
+  deriving (Functor)
 
 type MaybeReducedArgs = [MaybeReduced (Arg Term)]
 
 notReduced :: a -> MaybeReduced a
 notReduced x = MaybeRed NotReduced x
 
-reduced :: Blocked a -> MaybeReduced a
-reduced b = MaybeRed (Reduced $ fmap (const ()) b) (ignoreBlocking b)
+reduced :: Blocked (Arg Term) -> MaybeReduced (Arg Term)
+reduced b = case b of
+  NotBlocked (Arg _ _ (MetaV x _)) -> MaybeRed (Reduced $ Blocked x ()) v
+  _                                -> MaybeRed (Reduced $ () <$ b)      v
+  where
+    v = ignoreBlocking b
 
 data PrimFun = PrimFun
 	{ primFunName		:: QName
 	, primFunArity		:: Arity
-	, primFunImplementation :: MonadTCM tcm => [Arg Term] -> tcm (Reduced MaybeReducedArgs Term)
+	, primFunImplementation :: [Arg Term] -> TCM (Reduced MaybeReducedArgs Term)
 	}
     deriving (Typeable)
 
-defClauses :: Definition -> [Clauses]
+defClauses :: Definition -> [Clause]
 defClauses Defn{theDef = Function{funClauses = cs}}        = cs
 defClauses Defn{theDef = Primitive{primClauses = Just cs}} = cs
-defClauses Defn{theDef = Datatype{dataClause = Just c}}    = [Clauses Nothing c]
-defClauses Defn{theDef = Record{recClause = Just c}}       = [Clauses Nothing c]
+defClauses Defn{theDef = Datatype{dataClause = Just c}}    = [c]
+defClauses Defn{theDef = Record{recClause = Just c}}       = [c]
 defClauses _                                               = []
 
 defCompiled :: Definition -> Maybe CompiledClauses
@@ -531,6 +599,12 @@
 defCompiled Defn{theDef = Primitive{primCompiled = mcc}} = mcc
 defCompiled _ = Nothing
 
+defJSDef :: Definition -> Maybe JSCode
+defJSDef = compiledJS . defCompiledRep
+
+defEpicDef :: Definition -> Maybe EpicCode
+defEpicDef = compiledEpic . defCompiledRep
+
 -- | Used to specify whether something should be delayed.
 data Delayed = Delayed | NotDelayed
   deriving (Typeable, Data, Show, Eq)
@@ -542,14 +616,13 @@
 
 defAbstract :: Definition -> IsAbstract
 defAbstract d = case theDef d of
-    Axiom{}                   -> AbstractDef
+    Axiom{}                   -> ConcreteDef
     Function{funAbstr = a}    -> a
     Datatype{dataAbstr = a}   -> a
     Record{recAbstr = a}      -> a
     Constructor{conAbstr = a} -> a
     Primitive{primAbstr = a}  -> a
 
-
 ---------------------------------------------------------------------------
 -- ** Injectivity
 ---------------------------------------------------------------------------
@@ -574,7 +647,7 @@
 -- ** Statistics
 ---------------------------------------------------------------------------
 
-type Statistics = Map String Int
+type Statistics = Map String Integer
 
 ---------------------------------------------------------------------------
 -- ** Trace
@@ -591,18 +664,19 @@
 	  | IsType_ A.Expr (Maybe Type)
 	  | InferVar Name (Maybe (Term, Type))
 	  | InferDef Range QName (Maybe (Term, Type))
-	  | CheckArguments Range [NamedArg A.Expr] Type Type (Maybe (Args, Type, Constraints))
+	  | CheckArguments Range [NamedArg A.Expr] Type Type (Maybe (Args, Type))
 	  | CheckDataDef Range Name [A.LamBinding] [A.Constructor] (Maybe ())
 	  | CheckRecDef Range Name [A.LamBinding] [A.Constructor] (Maybe ())
 	  | CheckConstructor QName Telescope Sort A.Constructor (Maybe ())
 	  | CheckFunDef Range Name [A.Clause] (Maybe ())
 	  | CheckPragma Range A.Pragma (Maybe ())
 	  | CheckPrimitive Range Name A.Expr (Maybe ())
-          | CheckSectionApplication Range ModuleName A.Telescope ModuleName [NamedArg A.Expr] (Maybe ())
+          | CheckIsEmpty Type (Maybe ())
+          | CheckWithFunctionType A.Expr (Maybe ())
+          | CheckSectionApplication Range ModuleName A.ModuleApplication (Maybe ())
 	  | ScopeCheckExpr C.Expr (Maybe A.Expr)
 	  | ScopeCheckDeclaration D.NiceDeclaration (Maybe [A.Declaration])
 	  | ScopeCheckLHS C.Name C.Pattern (Maybe A.LHS)
-	  | ScopeCheckDefinition D.NiceDefinition (Maybe A.Definition)
 	  | forall a. TermFunDef Range Name [A.Clause] (Maybe a)
 	  | forall a. SetRange Range (Maybe a)	-- ^ used by 'setCurrentRange'
             -- actually, 'a' is Agda.Termination.TermCheck.CallGraph
@@ -633,38 +707,37 @@
     getRange (CheckFunDef i _ _ _)                 = getRange i
     getRange (CheckPragma r _ _)                   = r
     getRange (CheckPrimitive i _ _ _)              = getRange i
+    getRange CheckWithFunctionType{}               = noRange
     getRange (ScopeCheckExpr e _)                  = getRange e
     getRange (ScopeCheckDeclaration d _)           = getRange d
     getRange (ScopeCheckLHS _ p _)                 = getRange p
-    getRange (ScopeCheckDefinition d _)            = getRange d
     getRange (CheckDotPattern e _ _)               = getRange e
     getRange (CheckPatternShadowing c _)           = getRange c
     getRange (TermFunDef i _ _ _)                  = getRange i
     getRange (SetRange r _)                        = r
-    getRange (CheckSectionApplication r _ _ _ _ _) = r
+    getRange (CheckSectionApplication r _ _ _)     = r
+    getRange (CheckIsEmpty _ _)                    = noRange
 
 ---------------------------------------------------------------------------
 -- ** Builtin things
 ---------------------------------------------------------------------------
 
+data BuiltinDescriptor = BuiltinData (TCM Type) [String]
+                       | BuiltinDataCons (TCM Type)
+                       | BuiltinPrim String (Term -> TCM ())
+                       | BuiltinPostulate (TCM Type)
+                       | BuiltinUnknown (Maybe (TCM Type)) (Term -> TCM ())
+
+data BuiltinInfo =
+   BuiltinInfo { builtinName :: String
+               , builtinDesc :: BuiltinDescriptor }
+
 type BuiltinThings pf = Map String (Builtin pf)
 
 data Builtin pf
 	= Builtin Term
 	| Prim pf
-    deriving (Typeable, Data, Show)
-
-instance Functor Builtin where
-    fmap f (Builtin t) = Builtin t
-    fmap f (Prim x)    = Prim $ f x
-
-instance Foldable Builtin where
-    foldr f z (Builtin t) = z
-    foldr f z (Prim x)    = f x z
-
-instance Traversable Builtin where
-    traverse f (Builtin t) = pure $ Builtin t
-    traverse f (Prim x)    = Prim <$> f x
+    deriving (Typeable, Data, Show, Functor, Foldable, Traversable)
 
 ---------------------------------------------------------------------------
 -- * Type checking environment
@@ -677,23 +750,21 @@
           , envAnonymousModules    :: [(ModuleName, Nat)] -- ^ anonymous modules and their number of free variables
 	  , envImportPath          :: [C.TopLevelModuleName] -- ^ to detect import cycles
 	  , envMutualBlock         :: Maybe MutualId -- ^ the current (if any) mutual block
+          , envSolvingConstraints  :: Bool
+                -- ^ Are we currently in the process of solving active constraints?
+          , envActiveProblems      :: [ProblemId]
 	  , envAbstractMode        :: AbstractMode
 		-- ^ When checking the typesignature of a public definition
 		--   or the body of a non-abstract definition this is true.
 		--   To prevent information about abstract things leaking
 		--   outside the module.
-          , envIrrelevant          :: Bool
-                -- ^ Are we checking an irrelevant argument?
+          , envTopLevel            :: Bool
+                -- ^ Are we at the top level when checking a declaration?
+                --   In this case, we will freeze metas afterwards.
+          , envRelevance           :: Relevance
+                -- ^ Are we checking an irrelevant argument? (=@Irrelevant@)
                 -- Then top-level irrelevant declarations are enabled.
-          , envReplace             :: Bool
-                -- ^ Coinductive constructor applications @c args@ get
-                -- replaced by a function application @f tel@, where
-                -- tel corresponds to the current telescope and @f@ is
-                -- defined as @f tel = c args@. The initial occurrence
-                -- of @c@ in the body of @f@ should not be replaced by
-                -- yet another function application, though. To avoid
-                -- that this happens the @envReplace@ flag is set to
-                -- 'False' when @f@ is checked.
+                -- Other value: @Relevant@, then only relevant decls. are avail.
           , envDisplayFormsEnabled :: Bool
                 -- ^ Sometimes we want to disable display forms.
           , envReifyInteractionPoints :: Bool
@@ -716,9 +787,11 @@
                 , envAnonymousModules    = []
 		, envImportPath          = []
 		, envMutualBlock         = Nothing
+                , envSolvingConstraints  = False
+                , envActiveProblems      = [0]
 		, envAbstractMode        = AbstractMode
-                , envIrrelevant          = False
-                , envReplace             = True
+                , envTopLevel            = True
+                , envRelevance           = Relevant
                 , envDisplayFormsEnabled = True
                 , envReifyInteractionPoints = True
                 , envEtaContractImplicit    = True
@@ -767,18 +840,40 @@
                      , occClause   :: Int
                      , occPosition :: OccPos
                      }
+  deriving (Show)
 
 data OccPos = NonPositively | ArgumentTo Nat QName
+  deriving (Show)
 
+-- | Information about a call.
+
+data CallInfo = CallInfo
+  { callInfoRange :: Range
+    -- ^ Range of the head identifier.
+  , callInfoCall :: String
+    -- ^ Formatted representation of the call.
+    --
+    -- ('Doc' would perhaps be better here, but 'Doc' doesn't come
+    -- with an 'Ord' instance.)
+  } deriving (Eq, Ord, Typeable, Show)
+
+-- | Information about a mutual block which did not pass the
+-- termination checker.
+
+data TerminationError = TerminationError
+  { termErrFunctions :: [QName]
+    -- ^ The functions which failed to check. (May not include
+    -- automatically generated functions.)
+  , termErrCalls :: [CallInfo]
+    -- ^ The problematic call sites.
+  } deriving (Typeable, Show)
+
 data TypeError
 	= InternalError String
 	| NotImplemented String
 	| NotSupported String
         | CompilationError String
-	| TerminationCheckFailed [([QName], [R.Range])]
-          -- ^ Parameterised on functions which failed to termination
-          --   check (grouped if they are mutual), along with ranges
-          --   for problematic call sites.
+	| TerminationCheckFailed [TerminationError]
 	| PropMustBeSingleton
 	| DataMustEndInSort Term
 	| ShouldEndInApplicationOfTheDatatype Type
@@ -804,6 +899,8 @@
 	    -- ^ Expected a non-hidden function and found a hidden lambda.
 	| WrongHidingInApplication Type
 	    -- ^ A function is applied to a hidden argument where a non-hidden was expected.
+	| WrongIrrelevanceInLambda Type
+	    -- ^ Expected a relevant function and found an irrelevant lambda.
 	| NotInductive Term
           -- ^ The term does not correspond to an inductive data type.
 	| UninstantiatedDotPattern A.Expr
@@ -829,6 +926,9 @@
 	| UnequalHiding Type Type
 	    -- ^ The two function types have different hiding.
 	| UnequalSorts Sort Sort
+        | HeterogeneousEquality Term Type Term Type
+            -- ^ We ended up with an equality constraint where the terms
+            --   have different types.  This is not supported.
 	| NotLeqSort Sort Sort
 	| MetaCannotDependOn MetaId [Nat] Nat
 	    -- ^ The arguments are the meta variable, the parameters it can
@@ -856,7 +956,8 @@
 	| IncompletePatternMatching Term Args -- can only happen if coverage checking is switched off
         | CoverageFailure QName [[Arg Pattern]]
         | UnreachableClauses QName [[Arg Pattern]]
-        | CoverageCantSplitOn QName
+        | CoverageCantSplitOn QName Telescope Args Args
+        | CoverageCantSplitIrrelevantType Type
         | CoverageCantSplitType Type
     -- Positivity errors
 	| NotStrictlyPositive QName [Occ]
@@ -896,16 +997,23 @@
 	| NotAnExpression C.Expr
 	| NotAValidLetBinding D.NiceDeclaration
 	| NothingAppliedToHiddenArg C.Expr
+	| NothingAppliedToInstanceArg C.Expr
     -- Operator errors
 	| NoParseForApplication [C.Expr]
 	| AmbiguousParseForApplication [C.Expr] [C.Expr]
 	| NoParseForLHS C.Pattern
 	| AmbiguousParseForLHS C.Pattern [C.Pattern]
     -- Usage errors
-          deriving (Typeable)
+    -- Implicit From Scope errors
+        | IFSNoCandidateInScope Type
+    -- Safe flag errors
+        | SafeFlagPostulate C.Name
+        | SafeFlagPragma [String]
+        | SafeFlagPrimTrustMe
+          deriving (Typeable, Show)
 
-instance Show TypeError where
-  show _ = "<TypeError>" -- TODO: more info?
+-- instance Show TypeError where
+--   show _ = "<TypeError>" -- TODO: more info?
 
 instance Error TypeError where
     noMsg  = strMsg ""
@@ -917,7 +1025,7 @@
 	    | Exception Range String
             | IOException Range E.IOException
 	    | PatternErr  TCState -- ^ for pattern violations
-	    | AbortAssign TCState -- ^ used to abort assignment to meta when there are instantiations
+	    {- AbortAssign TCState -- ^ used to abort assignment to meta when there are instantiations -- UNUSED -}
   deriving (Typeable)
 
 -- | Type-checking errors, potentially paired with relevant syntax
@@ -943,14 +1051,14 @@
     show (Exception r s) = show r ++ ": " ++ s
     show (IOException r e) = show r ++ ": " ++ show e
     show (PatternErr _)  = "Pattern violation (you shouldn't see this)"
-    show (AbortAssign _) = "Abort assignment (you shouldn't see this)"
+    {- show (AbortAssign _) = "Abort assignment (you shouldn't see this)" -- UNUSED -}
 
 instance HasRange TCErr' where
     getRange (TypeError _ cl)  = envRange $ clEnv cl
     getRange (Exception r _)   = r
     getRange (IOException r _) = r
     getRange (PatternErr s)    = noRange
-    getRange (AbortAssign s)   = noRange
+    {- getRange (AbortAssign s)   = noRange -- UNUSED -}
 
 instance HasRange TCErr where
     getRange = getRange . errError
@@ -961,15 +1069,15 @@
 -- * Type checking monad transformer
 ---------------------------------------------------------------------------
 
-newtype TCMT m a = TCM { unTCM :: TCState -> TCEnv -> m (a, TCState) }
+newtype TCMT m a = TCM { unTCM :: IORef TCState -> TCEnv -> m a }
 
 instance MonadIO m => MonadReader TCEnv (TCMT m) where
-  ask = TCM $ \s e -> return (e, s)
+  ask = TCM $ \s e -> return e
   local f (TCM m) = TCM $ \s e -> m s (f e)
 
 instance MonadIO m => MonadState TCState (TCMT m) where
-  get   = TCM $ \s _ -> return (s, s)
-  put s = TCM $ \_ _ -> return ((), s)
+  get   = TCM $ \s _ -> liftIO (readIORef s)
+  put s = TCM $ \r _ -> liftIO (writeIORef r s)
 
 type TCM = TCMT IO
 
@@ -981,20 +1089,32 @@
 
 instance MonadError TCErr (TCMT IO) where
   throwError = liftIO . throwIO
-  catchError m h = TCM $ \s e ->
-    unTCM m s e `E.catch` \err -> unTCM (h err) s e
+  catchError m h = TCM $ \r e -> do
+    oldState <- liftIO (readIORef r)
+    unTCM m r e `E.catch` \err -> do
+      -- Reset the state, but do not forget changes to the persistent
+      -- component.
+      liftIO $ do
+        newState <- readIORef r
+        writeIORef r $ oldState { stPersistent = stPersistent newState }
+      unTCM (h err) r e
 
+-- | Preserve the state of the failing computation.
 catchError_ :: TCM a -> (TCErr -> TCM a) -> TCM a
-catchError_ m h = TCM $ \s e ->
-  unTCM m s e
-  `E.catch` \err -> unTCM (h err) (error "catchError_") e
+catchError_ m h = TCM $ \r e ->
+  unTCM m r e
+  `E.catch` \err -> unTCM (h err) r e
 
+{-# SPECIALIZE INLINE mapTCMT :: (forall a. IO a -> IO a) -> TCM a -> TCM a #-}
 mapTCMT :: (forall a. m a -> n a) -> TCMT m a -> TCMT n a
 mapTCMT f (TCM m) = TCM $ \s e -> f (m s e)
 
-pureTCM :: Monad m => (TCState -> TCEnv -> a) -> TCMT m a
-pureTCM f = TCM $ \s e -> return (f s e, s)
+pureTCM :: MonadIO m => (TCState -> TCEnv -> a) -> TCMT m a
+pureTCM f = TCM $ \r e -> do
+  s <- liftIO $ readIORef r
+  return (f s e)
 
+{-# RULES "liftTCM/id" liftTCM = id #-}
 instance MonadIO m => MonadTCM (TCMT m) where
     liftTCM = mapTCMT liftIO
 
@@ -1002,15 +1122,16 @@
   liftTCM = lift . liftTCM
 
 instance MonadTrans TCMT where
-    lift m = TCM $ \s _ -> m >>= \x -> return (x, s)
+    lift m = TCM $ \_ _ -> m
 
 -- We want a special monad implementation of fail.
 {-# SPECIALIZE instance Monad TCM #-}
 instance MonadIO m => Monad (TCMT m) where
-    return x = TCM $ \s _ -> return (x, s)
-    m >>= k = TCM $ \s e -> do
-                (x, s') <- unTCM m s e
-                unTCM (k x) s' e
+    return x = TCM $ \_ _ -> return x
+    TCM m >>= k = TCM $ \r e -> do
+        x <- m r e
+        let TCM m' = k x in m' r e
+    TCM m1 >> TCM m2 = TCM $ \r e -> m1 r e >> m2 r e
     fail    = internalError
 
 instance MonadIO m => Functor (TCMT m) where
@@ -1025,7 +1146,7 @@
               do let r = envRange e
                  liftIO $ wrap r $ do
                  x <- m
-                 x `seq` return (x, s)
+                 x `seq` return x
     where
       wrap r m = failOnException handleException
                $ E.catch m (handleIOException r)
@@ -1033,8 +1154,8 @@
       handleIOException r e = throwIO $ TCErr Nothing $ IOException r e
       handleException   r s = throwIO $ TCErr Nothing $ Exception r s
 
-patternViolation :: MonadTCM tcm => tcm a
-patternViolation = liftTCM $ do
+patternViolation :: TCM a
+patternViolation = do
     s <- get
     throwError $ TCErr Nothing $ PatternErr s
 
@@ -1051,5 +1172,13 @@
 runTCM :: TCMT IO a -> IO (Either TCErr a)
 runTCM m = (Right <$> runTCM' m) `E.catch` (return . Left)
 
-runTCM' :: Monad m => TCMT m a -> m a
-runTCM' m = liftM fst (unTCM m initState initEnv)
+runTCM' :: MonadIO m => TCMT m a -> m a
+runTCM' m = do
+  r <- liftIO $ newIORef initState
+  unTCM m r initEnv
+
+
+
+
+-- | Base name for extended lambda patterns
+extendlambdaname = ".extendedlambda"
diff --git a/src/full/Agda/TypeChecking/Monad/Builtin.hs b/src/full/Agda/TypeChecking/Monad/Builtin.hs
--- a/src/full/Agda/TypeChecking/Monad/Builtin.hs
+++ b/src/full/Agda/TypeChecking/Monad/Builtin.hs
@@ -1,6 +1,7 @@
 
 module Agda.TypeChecking.Monad.Builtin where
 
+import Data.Functor
 import Control.Monad.State
 import qualified Data.Map as Map
 
@@ -8,16 +9,17 @@
 import Agda.Syntax.Internal
 import Agda.TypeChecking.Monad.Base
 
-getBuiltinThings :: MonadTCM tcm => tcm (BuiltinThings PrimFun)
-getBuiltinThings = gets stBuiltinThings
+getBuiltinThing :: String -> TCM (Maybe (Builtin PrimFun))
+getBuiltinThing b = liftM2 mplus (Map.lookup b <$> gets stLocalBuiltins)
+                    (Map.lookup b <$> gets stImportedBuiltins)
 
-setBuiltinThings :: MonadTCM tcm => BuiltinThings PrimFun -> tcm ()
+setBuiltinThings :: BuiltinThings PrimFun -> TCM ()
 setBuiltinThings b = modify $ \s -> s { stLocalBuiltins = b }
 
-bindBuiltinName :: MonadTCM tcm => String -> Term -> tcm ()
+bindBuiltinName :: String -> Term -> TCM ()
 bindBuiltinName b x = do
-	builtin <- getBuiltinThings
-	case Map.lookup b builtin of
+	builtin <- getBuiltinThing b
+	case builtin of
 	    Just (Builtin y) -> typeError $ DuplicateBuiltinBinding b y x
 	    Just (Prim _)    -> typeError $ NoSuchBuiltinName b
 	    Nothing	     -> modify $ \st ->
@@ -25,30 +27,30 @@
                     Map.insert b (Builtin x) $ stLocalBuiltins st
                  }
 
-bindPrimitive :: MonadTCM tcm => String -> PrimFun -> tcm ()
+bindPrimitive :: String -> PrimFun -> TCM ()
 bindPrimitive b pf = do
   builtin <- gets stLocalBuiltins
   setBuiltinThings $ Map.insert b (Prim pf) builtin
 
 
-getBuiltin :: MonadTCM tcm => String -> tcm Term
+getBuiltin :: String -> TCM Term
 getBuiltin x = do
     mt <- getBuiltin' x
     case mt of
         Nothing -> typeError $ NoBindingForBuiltin x
         Just t  -> return t
 
-getBuiltin' :: MonadTCM tcm => String -> tcm (Maybe Term)
+getBuiltin' :: String -> TCM (Maybe Term)
 getBuiltin' x = do
-    builtin <- getBuiltinThings
-    case Map.lookup x builtin of
+    builtin <- getBuiltinThing x
+    case builtin of
 	Just (Builtin t) -> return $ Just (killRange t)
 	_		 -> return Nothing
 
-getPrimitive :: MonadTCM tcm => String -> tcm PrimFun
+getPrimitive :: String -> TCM PrimFun
 getPrimitive x = do
-    builtin <- getBuiltinThings
-    case Map.lookup x builtin of
+    builtin <- getBuiltinThing x
+    case builtin of
 	Just (Prim pf) -> return pf
 	_	       -> typeError $ NoSuchPrimitiveFunction x
 
@@ -66,8 +68,15 @@
     -- builtins for reflection:
     primQName, primArg, primArgArg, primAgdaTerm, primAgdaTermVar,
     primAgdaTermLam, primAgdaTermDef, primAgdaTermCon, primAgdaTermPi,
-    primAgdaTermSort, primAgdaTermUnsupported
-    :: MonadTCM tcm => tcm Term
+    primAgdaTermSort, primAgdaTermUnsupported,
+    primAgdaType, primAgdaTypeEl,
+    primHiding, primHidden, primInstance, primVisible,
+    primRelvance, primRelevant, primIrrelevant,
+    primAgdaSort, primAgdaSortSet, primAgdaSortLit, primAgdaSortUnsupported,
+    primAgdaDefinition, primAgdaDefinitionFunDef, primAgdaDefinitionDataDef, primAgdaDefinitionRecordDef,
+    primAgdaDefinitionPostulate, primAgdaDefinitionPrimitive, primAgdaDefinitionDataConstructor,
+    primAgdaFunDef, primAgdaDataDef, primAgdaRecordDef
+    :: TCM Term
 primInteger      = getBuiltin builtinInteger
 primFloat        = getBuiltin builtinFloat
 primChar         = getBuiltin builtinChar
@@ -104,6 +113,19 @@
 primQName        = getBuiltin builtinQName
 primArg          = getBuiltin builtinArg
 primArgArg       = getBuiltin builtinArgArg
+primAgdaSort     = getBuiltin builtinAgdaSort
+primAgdaType     = getBuiltin builtinAgdaType
+primAgdaTypeEl   = getBuiltin builtinAgdaTypeEl
+primHiding       = getBuiltin builtinHiding
+primHidden       = getBuiltin builtinHidden
+primInstance     = getBuiltin builtinInstance
+primVisible      = getBuiltin builtinVisible
+primRelvance     = getBuiltin builtinRelevance
+primRelevant     = getBuiltin builtinRelevant
+primIrrelevant   = getBuiltin builtinIrrelevant
+primAgdaSortSet  = getBuiltin builtinAgdaSortSet
+primAgdaSortLit  = getBuiltin builtinAgdaSortLit
+primAgdaSortUnsupported = getBuiltin builtinAgdaSortUnsupported
 primAgdaTerm         = getBuiltin builtinAgdaTerm
 primAgdaTermVar      = getBuiltin builtinAgdaTermVar
 primAgdaTermLam      = getBuiltin builtinAgdaTermLam
@@ -112,7 +134,16 @@
 primAgdaTermPi       = getBuiltin builtinAgdaTermPi
 primAgdaTermSort     = getBuiltin builtinAgdaTermSort
 primAgdaTermUnsupported     = getBuiltin builtinAgdaTermUnsupported
-
+primAgdaFunDef                    = getBuiltin builtinAgdaFunDef
+primAgdaDataDef                   = getBuiltin builtinAgdaDataDef
+primAgdaRecordDef                 = getBuiltin builtinAgdaRecordDef
+primAgdaDefinitionFunDef          = getBuiltin builtinAgdaDefinitionFunDef
+primAgdaDefinitionDataDef         = getBuiltin builtinAgdaDefinitionDataDef
+primAgdaDefinitionRecordDef       = getBuiltin builtinAgdaDefinitionRecordDef
+primAgdaDefinitionDataConstructor = getBuiltin builtinAgdaDefinitionDataConstructor
+primAgdaDefinitionPostulate       = getBuiltin builtinAgdaDefinitionPostulate
+primAgdaDefinitionPrimitive       = getBuiltin builtinAgdaDefinitionPrimitive
+primAgdaDefinition                = getBuiltin builtinAgdaDefinition
 builtinNat          = "NATURAL"
 builtinSuc          = "SUC"
 builtinZero         = "ZERO"
@@ -147,6 +178,19 @@
 builtinLevelZero    = "LEVELZERO"
 builtinLevelSuc     = "LEVELSUC"
 builtinQName        = "QNAME"
+builtinAgdaSort     = "AGDASORT"
+builtinAgdaSortSet  = "AGDASORTSET"
+builtinAgdaSortLit  = "AGDASORTLIT"
+builtinAgdaSortUnsupported = "AGDASORTUNSUPPORTED"
+builtinAgdaType     = "AGDATYPE"
+builtinAgdaTypeEl   = "AGDATYPEEL"
+builtinHiding       = "HIDING"
+builtinHidden       = "HIDDEN"
+builtinInstance     = "INSTANCE"
+builtinVisible      = "VISIBLE"
+builtinRelevance    = "RELEVANCE"
+builtinRelevant     = "RELEVANT"
+builtinIrrelevant   = "IRRELEVANT"
 builtinArg          = "ARG"
 builtinArgArg       = "ARGARG"
 builtinAgdaTerm         = "AGDATERM"
@@ -157,16 +201,13 @@
 builtinAgdaTermPi       = "AGDATERMPI"
 builtinAgdaTermSort     = "AGDATERMSORT"
 builtinAgdaTermUnsupported = "AGDATERMUNSUPPORTED"
-
-builtinTypes :: [String]
-builtinTypes =
-    [ builtinInteger
-    , builtinFloat
-    , builtinChar
-    , builtinString
-    , builtinBool
-    , builtinNat
-    , builtinLevel
-    , builtinQName
-    , builtinAgdaTerm
-    ]
+builtinAgdaFunDef                    = "AGDAFUNDEF"
+builtinAgdaDataDef                   = "AGDADATADEF"
+builtinAgdaRecordDef                 = "AGDARECORDDEF"
+builtinAgdaDefinitionFunDef          = "AGDADEFINITIONFUNDEF"
+builtinAgdaDefinitionDataDef         = "AGDADEFINITIONDATADEF"
+builtinAgdaDefinitionRecordDef       = "AGDADEFINITIONRECORDDEF"
+builtinAgdaDefinitionDataConstructor = "AGDADEFINITIONDATACONSTRUCTOR"
+builtinAgdaDefinitionPostulate       = "AGDADEFINITIONPOSTULATE"
+builtinAgdaDefinitionPrimitive       = "AGDADEFINITIONPRIMITIVE"
+builtinAgdaDefinition                = "AGDADEFINITION"
diff --git a/src/full/Agda/TypeChecking/Monad/Closure.hs b/src/full/Agda/TypeChecking/Monad/Closure.hs
--- a/src/full/Agda/TypeChecking/Monad/Closure.hs
+++ b/src/full/Agda/TypeChecking/Monad/Closure.hs
@@ -7,7 +7,7 @@
 import Agda.TypeChecking.Monad.Signature
 import Agda.TypeChecking.Monad.Trace
 
-enterClosure :: MonadTCM tcm => Closure a -> (a -> tcm b) -> tcm b
+enterClosure :: Closure a -> (a -> TCM b) -> TCM b
 enterClosure (Closure sig env scope x) k =
     withScope_ scope
     $ withEnv env
diff --git a/src/full/Agda/TypeChecking/Monad/Constraints.hs b/src/full/Agda/TypeChecking/Monad/Constraints.hs
--- a/src/full/Agda/TypeChecking/Monad/Constraints.hs
+++ b/src/full/Agda/TypeChecking/Monad/Constraints.hs
@@ -1,41 +1,131 @@
-
+{-# LANGUAGE CPP #-}
 module Agda.TypeChecking.Monad.Constraints where
 
+import Control.Arrow ((&&&))
+import Control.Applicative
 import Control.Monad.State
+import Control.Monad.Reader
 import Data.Map as Map
+import Data.List as List
 
 import Agda.TypeChecking.Monad.Base
 import Agda.TypeChecking.Monad.Signature
 import Agda.TypeChecking.Monad.Env
 import Agda.TypeChecking.Monad.State
 import Agda.TypeChecking.Monad.Closure
+import Agda.TypeChecking.Monad.Options
+import Agda.Utils.Monad
+import Agda.Utils.Impossible
 
--- | Get the constraints
-getConstraints :: MonadTCM tcm => tcm Constraints
-getConstraints = gets stConstraints
+#include "../../undefined.h"
 
-lookupConstraint :: MonadTCM tcm => Int -> tcm ConstraintClosure
-lookupConstraint i =
-    do	cs <- getConstraints
-	unless (i < length cs) $ fail $ "no such constraint: " ++ show i
-	return $ cs !! i
+-- | Get the current problem
+currentProblem :: TCM ProblemId
+currentProblem = asks $ head' . envActiveProblems
+  where
+    head' []    = {- ' -} __IMPOSSIBLE__
+    head' (x:_) = x
 
--- | Take constraints (clear all constraints).
-takeConstraints :: MonadTCM tcm => tcm Constraints
-takeConstraints =
-    do	cs <- getConstraints
-	modify $ \s -> s { stConstraints = [] }
-	return cs
+-- | Steal all constraints belonging to the given problem and add them to the current problem.
+stealConstraints :: ProblemId -> TCM ()
+stealConstraints pid = do
+  current <- currentProblem
+  reportSLn "tc.constr.steal" 50 $ "problem " ++ show current ++ " is stealing problem " ++ show pid ++ "'s constraints!"
+  let rename pc@(PConstr pid' c) | pid' == pid = PConstr current c
+                                 | otherwise   = pc
+  -- We should never steal from an active problem.
+  whenM (elem pid <$> asks envActiveProblems) __IMPOSSIBLE__
+  modify $ \s -> s { stAwakeConstraints    = List.map rename $ stAwakeConstraints s
+                   , stSleepingConstraints = List.map rename $ stSleepingConstraints s }
 
-withConstraint :: MonadTCM tcm => (Constraint -> tcm a) -> ConstraintClosure -> tcm a
-withConstraint = flip enterClosure
+solvingProblem :: ProblemId -> TCM a -> TCM a
+solvingProblem pid m = verboseBracket "tc.constr.solve" 50 ("working on problem " ++ show pid) $ do
+  x <- local (\e -> e { envActiveProblems = pid : envActiveProblems e }) m
+  ifM (isProblemSolved pid) (do
+      reportSLn "tc.constr.solve" 50 $ "problem " ++ show pid ++ " was solved!"
+      wakeConstraints (blockedOn pid . clValue . theConstraint)
+    ) (reportSLn "tc.constr.solve" 50 $ "problem " ++ show pid ++ " was not solved.")
+  return x
+  where
+    blockedOn pid (Guarded _ pid') = pid == pid'
+    blockedOn _ _ = False
 
--- | Add new constraints
-addConstraints :: MonadTCM tcm => Constraints -> tcm ()
-addConstraints cs = modify $ \st -> st { stConstraints = cs ++ stConstraints st }
+isProblemSolved :: ProblemId -> TCM Bool
+isProblemSolved pid =
+  (&&) <$> (notElem pid <$> asks envActiveProblems)
+       <*> (all ((/= pid) . constraintProblem) <$> getAllConstraints)
 
--- | Create a new constraint.
-buildConstraint :: MonadTCM tcm => Constraint -> tcm Constraints
-buildConstraint c = do
-    cl <- buildClosure c
-    return [cl]
+getConstraintsForProblem :: ProblemId -> TCM Constraints
+getConstraintsForProblem pid = List.filter ((== pid) . constraintProblem) <$> getAllConstraints
+
+-- | Get the awake constraints
+getAwakeConstraints :: TCM Constraints
+getAwakeConstraints = gets stAwakeConstraints
+
+wakeConstraints :: (ProblemConstraint-> Bool) -> TCM ()
+wakeConstraints wake = do
+  sleepers <- gets stSleepingConstraints
+  let (wakeup, sleepin) = List.partition wake sleepers
+  reportSLn "tc.constr.wake" 50 $ "waking up         " ++ show (List.map constraintProblem wakeup) ++ "\n" ++
+                                  "  still sleeping: " ++ show (List.map constraintProblem sleepin)
+  modify $ \s ->
+    s { stSleepingConstraints = sleepin
+      , stAwakeConstraints    = stAwakeConstraints s ++ wakeup
+      }
+
+takeAwakeConstraint :: TCM (Maybe ProblemConstraint)
+takeAwakeConstraint = do
+  cs <- getAwakeConstraints
+  case cs of
+    []     -> return Nothing
+    c : cs -> do
+      modify $ \s -> s { stAwakeConstraints = cs }
+      return (Just c)
+
+getAllConstraints :: TCM Constraints
+getAllConstraints = gets $ \s -> stAwakeConstraints s ++ stSleepingConstraints s
+
+withConstraint :: (Constraint -> TCM a) -> ProblemConstraint -> TCM a
+withConstraint f (PConstr pid c) = do
+  -- We should preserve the problem stack and the isSolvingConstraint flag
+  (pids, isSolving) <- asks $ envActiveProblems &&& envSolvingConstraints
+  enterClosure c $ \c ->
+    local (\e -> e { envActiveProblems = pids, envSolvingConstraints = isSolving }) $
+    solvingProblem pid (f c)
+
+buildProblemConstraint :: ProblemId -> Constraint -> TCM ProblemConstraint
+buildProblemConstraint pid c = PConstr pid <$> buildClosure c
+
+buildConstraint :: Constraint -> TCM ProblemConstraint
+buildConstraint c = flip buildProblemConstraint c =<< currentProblem
+
+-- | Add new a constraint
+addConstraint' :: Constraint -> TCM ()
+addConstraint' c = do
+    pc <- build
+    modify $ \s -> s { stSleepingConstraints = pc : stSleepingConstraints s }
+  where
+    build | isBlocking c = buildConstraint c
+          | otherwise    = buildProblemConstraint 0 c
+    isBlocking SortCmp{}     = False
+    isBlocking LevelCmp{}    = False
+    isBlocking ValueCmp{}    = True
+    isBlocking ElimCmp{}     = True
+    isBlocking TypeCmp{}     = True
+    isBlocking TelCmp{}      = True
+    isBlocking (Guarded c _) = isBlocking c
+    isBlocking UnBlock{}     = True
+    isBlocking FindInScope{} = False
+    isBlocking IsEmpty{}     = True
+
+-- | Add already awake constraints
+addAwakeConstraints :: Constraints -> TCM ()
+addAwakeConstraints cs = modify $ \s -> s { stAwakeConstraints = cs ++ stAwakeConstraints s }
+
+-- | Start solving constraints
+nowSolvingConstraints :: TCM a -> TCM a
+nowSolvingConstraints = local $ \e -> e { envSolvingConstraints = True }
+
+isSolvingConstraints :: TCM Bool
+isSolvingConstraints = asks envSolvingConstraints
+
diff --git a/src/full/Agda/TypeChecking/Monad/Context.hs b/src/full/Agda/TypeChecking/Monad/Context.hs
--- a/src/full/Agda/TypeChecking/Monad/Context.hs
+++ b/src/full/Agda/TypeChecking/Monad/Context.hs
@@ -21,13 +21,29 @@
 #include "../../undefined.h"
 import Agda.Utils.Impossible
 
+-- | Modify the 'ctxEntry' field of a 'ContextEntry'.
+modifyContextEntry :: (Arg (Name, Type) -> Arg (Name, Type)) -> ContextEntry -> ContextEntry
+modifyContextEntry f ce = ce { ctxEntry = f (ctxEntry ce) }
+
+-- | Modify all 'ContextEntry's.
+modifyContextEntries :: (Arg (Name, Type) -> Arg (Name, Type)) -> Context -> Context
+modifyContextEntries f = map (modifyContextEntry f)
+
+-- | Modify a 'Context' in a computation.
+{-# SPECIALIZE modifyContext :: (Context -> Context) -> TCM a -> TCM a #-}
+modifyContext :: MonadTCM tcm => (Context -> Context) -> tcm a -> tcm a
+modifyContext f = local $ \ e -> e { envContext = f (envContext e) }
+
+{-# SPECIALIZE mkContextEntry :: Arg (Name, Type) -> TCM ContextEntry #-}
 mkContextEntry :: MonadTCM tcm => Arg (Name, Type) -> tcm ContextEntry
 mkContextEntry x = do
   i <- fresh
   return $ Ctx i x
 
--- | add a variable to the context
+-- | @addCtx x arg cont@ add a variable to the context.
 --
+--   Chooses an unused 'Name'.
+{-# SPECIALIZE addCtx :: Name -> Arg Type -> TCM a -> TCM a #-}
 addCtx :: MonadTCM tcm => Name -> Arg Type -> tcm a -> tcm a
 addCtx x a ret = do
   ctx <- map (nameConcrete . fst . unArg) <$> getContext
@@ -38,93 +54,107 @@
   where
     notTaken xs x = isNoName (nameConcrete x) || nameConcrete x `notElem` xs
 
+-- | N-ary variant of @addCtx@.
+{-# SPECIALIZE addContext :: [Arg (Name, Type)] -> TCM a -> TCM a #-}
+addContext :: MonadTCM tcm => [Arg (Name, Type)] -> tcm a -> tcm a
+addContext ctx m =
+  foldr (\arg -> addCtx (fst $ unArg arg) (fmap snd arg)) m ctx
+
+-- | Turns the string into a name and adds it to the context.
+{-# SPECIALIZE addCtxString :: String -> Arg Type -> TCM a -> TCM a #-}
+addCtxString :: MonadTCM tcm => String -> Arg Type -> tcm a -> tcm a
+addCtxString s a m = do
+  x <- freshName_ s
+  addCtx x a m
+
 -- | Change the context
+{-# SPECIALIZE inContext :: [Arg (Name, Type)] -> TCM a -> TCM a #-}
 inContext :: MonadTCM tcm => [Arg (Name, Type)] -> tcm a -> tcm a
 inContext xs ret = do
   ctx <- mapM mkContextEntry xs
   flip local ret $ \e -> e { envContext = ctx }
 
 -- | Go under an abstraction.
-underAbstraction :: MonadTCM tcm => Arg Type -> Abs a -> (a -> tcm b) -> tcm b
+{-# SPECIALIZE underAbstraction :: Raise a => Arg Type -> Abs a -> (a -> TCM b) -> TCM b #-}
+underAbstraction :: (Raise a, MonadTCM tcm) => Arg Type -> Abs a -> (a -> tcm b) -> tcm b
+underAbstraction _ (NoAbs _ v) k = k v
 underAbstraction t a k = do
     xs <- map (nameConcrete . fst . unArg) <$> getContext
     x <- freshName_ $ realName $ absName a
     let y = head $ filter (notTaken xs) $ iterate nextName x
     addCtx y t $ k $ absBody a
   where
-    notTaken xs x = notElem (nameConcrete x) xs
+    notTaken xs x = isNoName (nameConcrete x) || notElem (nameConcrete x) xs
     realName "_" = "y"
     realName s   = s
 
 -- | Go under an abstract without worrying about the type to add to the context.
-underAbstraction_ :: MonadTCM tcm => Abs a -> (a -> tcm b) -> tcm b
+{-# SPECIALIZE underAbstraction_ :: Raise a => Abs a -> (a -> TCM b) -> TCM b #-}
+underAbstraction_ :: (Raise a, MonadTCM tcm) => Abs a -> (a -> tcm b) -> tcm b
 underAbstraction_ = underAbstraction (Arg NotHidden Relevant $ sort Prop)
 
 -- | Add a telescope to the context.
+{-# SPECIALIZE addCtxTel :: Telescope -> TCM a -> TCM a #-}
 addCtxTel :: MonadTCM tcm => Telescope -> tcm a -> tcm a
 addCtxTel EmptyTel	    ret = ret
 addCtxTel (ExtendTel t tel) ret = underAbstraction t tel $ \tel -> addCtxTel tel ret
 
 -- | Get the current context.
+{-# SPECIALIZE getContext :: TCM [Arg (Name, Type)] #-}
 getContext :: MonadTCM tcm => tcm [Arg (Name, Type)]
 getContext = asks $ map ctxEntry . envContext
 
 -- | Generate [Var n - 1, .., Var 0] for all declarations in the context.
+{-# SPECIALIZE getContextArgs :: TCM Args #-}
 getContextArgs :: MonadTCM tcm => tcm Args
 getContextArgs = do
   ctx <- getContext
   return $ reverse $ [ Arg h r $ Var i [] | (Arg h r _, i) <- zip ctx [0..] ]
 
+{-# SPECIALIZE getContextTerms :: TCM [Term] #-}
 getContextTerms :: MonadTCM tcm => tcm [Term]
 getContextTerms = map unArg <$> getContextArgs
 
 -- | Get the current context as a 'Telescope' with the specified 'Hiding'.
+{-# SPECIALIZE getContextTelescope :: TCM Telescope #-}
 getContextTelescope :: MonadTCM tcm => tcm Telescope
 getContextTelescope = foldr extTel EmptyTel . reverse <$> getContext
   where
     extTel (Arg h r (x, t)) = ExtendTel (Arg h r t) . Abs (show x)
 
 -- | add a bunch of variables with the same type to the context
+{-# SPECIALIZE addCtxs :: [Name] -> Arg Type -> TCM a -> TCM a #-}
 addCtxs :: MonadTCM tcm => [Name] -> Arg Type -> tcm a -> tcm a
 addCtxs []     _ k = k
 addCtxs (x:xs) t k = addCtx x t $ addCtxs xs (raise 1 t) k
 
 -- | Check if we are in a compatible context, i.e. an extension of the given context.
+{-# SPECIALIZE getContextId :: TCM [CtxId] #-}
 getContextId :: MonadTCM tcm => tcm [CtxId]
 getContextId = asks $ map ctxId . envContext
 
 -- | Add a let bound variable
+{-# SPECIALIZE addLetBinding :: Relevance -> Name -> Term -> Type -> TCM a -> TCM a #-}
 addLetBinding :: MonadTCM tcm => Relevance -> Name -> Term -> Type -> tcm a -> tcm a
 addLetBinding rel x v t0 ret = do
     let t = Arg NotHidden rel t0
-    vt <- makeOpen (v, t)
+    vt <- liftTCM $ makeOpen (v, t)
     flip local ret $ \e -> e { envLetBindings = Map.insert x vt $ envLetBindings e }
 
--- | Wake up irrelevant variables and make them relevant.  For instance,
---   in an irrelevant function argument otherwise irrelevant variables
---   may be used, so they are awoken before type checking the argument.
-wakeIrrelevantVars :: MonadTCM tcm => tcm a -> tcm a
-wakeIrrelevantVars = local $ \ e -> e
-   { envContext = map wakeVar (envContext e) -- enable local  irr. defs
-   , envIrrelevant = True                    -- enable global irr. defs
-   }
-  where wakeVar ce = ce { ctxEntry = makeRelevant (ctxEntry ce) }
-
-applyRelevanceToContext :: MonadTCM tcm => Relevance -> tcm a -> tcm a
-applyRelevanceToContext Irrelevant cont = wakeIrrelevantVars cont
-applyRelevanceToContext _          cont = cont
-
 -- | get type of bound variable (i.e. deBruijn index)
 --
+{-# SPECIALIZE typeOfBV' :: Nat -> TCM (Arg Type) #-}
 typeOfBV' :: MonadTCM tcm => Nat -> tcm (Arg Type)
 typeOfBV' n =
     do	ctx <- getContext
 	Arg h r (_,t) <- ctx !!! n
 	return $ Arg h r $ raise (n + 1) t
 
+{-# SPECIALIZE typeOfBV :: Nat -> TCM Type #-}
 typeOfBV :: MonadTCM tcm => Nat -> tcm Type
 typeOfBV i = unArg <$> typeOfBV' i
 
+{-# SPECIALIZE nameOfBV :: Nat -> TCM Name #-}
 nameOfBV :: MonadTCM tcm => Nat -> tcm Name
 nameOfBV n =
     do	ctx <- getContext
@@ -143,6 +173,7 @@
 -- | Get the term corresponding to a named variable. If it is a lambda bound
 --   variable the deBruijn index is returned and if it is a let bound variable
 --   its definition is returned.
+{-# SPECIALIZE getVarInfo :: Name -> TCM (Term, Arg Type) #-}
 getVarInfo :: MonadTCM tcm => Name -> tcm (Term, Arg Type)
 getVarInfo x =
     do	ctx <- getContext
@@ -154,8 +185,9 @@
 		    return (Var n [], t)
 	    _	    ->
 		case Map.lookup x def of
-		    Just vt -> getOpen vt
+		    Just vt -> liftTCM $ getOpen vt
 		    _	    -> fail $ "unbound variable " ++ show x
 
+{-# SPECIALIZE escapeContext :: Int -> TCM a -> TCM a #-}
 escapeContext :: MonadTCM tcm => Int -> tcm a -> tcm a
 escapeContext n = local $ \e -> e { envContext = drop n $ envContext e }
diff --git a/src/full/Agda/TypeChecking/Monad/Context.hs-boot b/src/full/Agda/TypeChecking/Monad/Context.hs-boot
--- a/src/full/Agda/TypeChecking/Monad/Context.hs-boot
+++ b/src/full/Agda/TypeChecking/Monad/Context.hs-boot
@@ -7,4 +7,3 @@
 
 getContext   :: MonadTCM tcm => tcm [Arg (Name, Type)]
 getContextId :: MonadTCM tcm => tcm [CtxId]
-
diff --git a/src/full/Agda/TypeChecking/Monad/Env.hs b/src/full/Agda/TypeChecking/Monad/Env.hs
--- a/src/full/Agda/TypeChecking/Monad/Env.hs
+++ b/src/full/Agda/TypeChecking/Monad/Env.hs
@@ -10,30 +10,37 @@
 import Agda.TypeChecking.Monad.Base
 
 -- | Get the name of the current module, if any.
-currentModule :: MonadTCM tcm => tcm ModuleName
+currentModule :: TCM ModuleName
 currentModule = asks envCurrentModule
 
 -- | Set the name of the current module.
-withCurrentModule :: MonadTCM tcm => ModuleName -> tcm a -> tcm a
+withCurrentModule :: ModuleName -> TCM a -> TCM a
 withCurrentModule m =
     local $ \e -> e { envCurrentModule = m }
 
 -- | Get the number of variables bound by anonymous modules.
-getAnonymousVariables :: MonadTCM tcm => ModuleName -> tcm Nat
+getAnonymousVariables :: ModuleName -> TCM Nat
 getAnonymousVariables m = do
   ms <- asks envAnonymousModules
   return $ sum [ n | (m', n) <- ms, mnameToList m' `isPrefixOf` mnameToList m ]
 
 -- | Add variables bound by an anonymous module.
-withAnonymousModule :: MonadTCM tcm => ModuleName -> Nat -> tcm a -> tcm a
+withAnonymousModule :: ModuleName -> Nat -> TCM a -> TCM a
 withAnonymousModule m n =
   local $ \e -> e { envAnonymousModules   = (m, n) : envAnonymousModules e
                   }
 
 -- | Set the current environment to the given
-withEnv :: MonadTCM tcm => TCEnv -> tcm a -> tcm a
+withEnv :: TCEnv -> TCM a -> TCM a
 withEnv env m = local (const env) m
 
 -- | Get the current environmnet
-getEnv :: MonadTCM tcm => tcm TCEnv
+getEnv :: TCM TCEnv
 getEnv = ask
+
+-- | Leave the top level to type check local things.
+leaveTopLevel :: TCM a -> TCM a
+leaveTopLevel = local $ \ env -> env { envTopLevel = False }
+
+onTopLevel :: TCM Bool
+onTopLevel = asks envTopLevel
diff --git a/src/full/Agda/TypeChecking/Monad/Exception.hs b/src/full/Agda/TypeChecking/Monad/Exception.hs
--- a/src/full/Agda/TypeChecking/Monad/Exception.hs
+++ b/src/full/Agda/TypeChecking/Monad/Exception.hs
@@ -2,6 +2,7 @@
 
 -- | Basically a copy of the ErrorT monad transformer. It's handy to slap
 --   onto TCM and still be a MonadTCM (which isn't possible with ErrorT).
+--   Also, it does not require the silly Error instance for the err type.
 
 module Agda.TypeChecking.Monad.Exception where
 
@@ -9,6 +10,7 @@
 import Control.Monad.Error
 import Control.Monad.State
 import Control.Monad.Reader
+import Control.Monad.Writer
 import Agda.TypeChecking.Monad.Base
 
 newtype ExceptionT err m a = ExceptionT { runExceptionT :: m (Either err a) }
@@ -33,6 +35,16 @@
     case r of
       Left err  -> runExceptionT $ h err
       Right x   -> return $ Right x
+
+instance (Monad m, MonadException err m) => MonadException err (ReaderT r m) where
+  throwException = lift . throwException
+  catchException m h = ReaderT $ \ r ->
+    catchException (m `runReaderT` r) (\ err -> h err `runReaderT` r)
+
+instance (Monad m, MonadException err m, Monoid w) => MonadException err (WriterT w m) where
+  throwException = lift . throwException
+  catchException m h = WriterT $
+    catchException (runWriterT m) (\ err -> runWriterT $ h err)
 
 instance MonadTrans (ExceptionT err) where
   lift = ExceptionT . liftM Right
diff --git a/src/full/Agda/TypeChecking/Monad/Imports.hs b/src/full/Agda/TypeChecking/Monad/Imports.hs
--- a/src/full/Agda/TypeChecking/Monad/Imports.hs
+++ b/src/full/Agda/TypeChecking/Monad/Imports.hs
@@ -56,28 +56,30 @@
 getVisitedModule x = gets $ Map.lookup x . stVisitedModules
 
 getDecodedModules :: TCM DecodedModules
-getDecodedModules = gets stDecodedModules
+getDecodedModules = stDecodedModules . stPersistent <$> get
 
 setDecodedModules :: DecodedModules -> TCM ()
-setDecodedModules ms = modify $ \s -> s { stDecodedModules = ms }
-
-preserveDecodedModules :: TCM a -> TCM a
-preserveDecodedModules tcm = do ms <- getDecodedModules
-                                a  <- tcm
-                                setDecodedModules ms
-                                return a
+setDecodedModules ms = modify $ \s ->
+  s { stPersistent = (stPersistent s) { stDecodedModules = ms } }
 
 getDecodedModule :: C.TopLevelModuleName -> TCM (Maybe (Interface, ClockTime))
-getDecodedModule x = gets $ Map.lookup x . stDecodedModules
+getDecodedModule x = Map.lookup x . stDecodedModules . stPersistent <$> get
 
 storeDecodedModule :: Interface -> ClockTime -> TCM ()
 storeDecodedModule i t = modify $ \s ->
-  s { stDecodedModules =
-        Map.insert (toTopLevelModuleName $ iModuleName i) (i, t) $
-          stDecodedModules s }
+  s { stPersistent =
+        (stPersistent s) { stDecodedModules =
+          Map.insert (toTopLevelModuleName $ iModuleName i) (i, t) $
+            (stDecodedModules $ stPersistent s)
+        }
+  }
 
 dropDecodedModule :: C.TopLevelModuleName -> TCM ()
-dropDecodedModule x = modify $ \s -> s { stDecodedModules = Map.delete x $ stDecodedModules s }
+dropDecodedModule x = modify $ \s ->
+  s { stPersistent = (stPersistent s) { stDecodedModules =
+                       Map.delete x $ stDecodedModules $ stPersistent s
+                     }
+  }
 
 withImportPath :: [C.TopLevelModuleName] -> TCM a -> TCM a
 withImportPath path = local $ \e -> e { envImportPath = path }
diff --git a/src/full/Agda/TypeChecking/Monad/MetaVars.hs b/src/full/Agda/TypeChecking/Monad/MetaVars.hs
--- a/src/full/Agda/TypeChecking/Monad/MetaVars.hs
+++ b/src/full/Agda/TypeChecking/Monad/MetaVars.hs
@@ -19,6 +19,7 @@
 import Agda.TypeChecking.Monad.Closure
 import Agda.TypeChecking.Monad.Open
 import Agda.TypeChecking.Substitute
+-- import Agda.TypeChecking.Pretty -- LEADS TO import cycle
 
 import Agda.Utils.Monad
 import Agda.Utils.Fresh
@@ -28,32 +29,35 @@
 import Agda.Utils.Impossible
 
 -- | Get the meta store.
-getMetaStore :: MonadTCM tcm => tcm MetaStore
+getMetaStore :: TCM MetaStore
 getMetaStore = gets stMetaStore
 
+modifyMetaStore :: (MetaStore -> MetaStore) -> TCM ()
+modifyMetaStore f = modify (\ st -> st { stMetaStore = f $ stMetaStore st })
+
 -- | Lookup a meta variable
-lookupMeta :: MonadTCM tcm => MetaId -> tcm MetaVariable
+lookupMeta :: MetaId -> TCM MetaVariable
 lookupMeta m =
     do	mmv <- Map.lookup m <$> getMetaStore
 	case mmv of
 	    Just mv -> return mv
 	    _	    -> fail $ "no such meta variable " ++ show m
 
-updateMetaVar :: MonadTCM tcm => MetaId -> (MetaVariable -> MetaVariable) -> tcm ()
+updateMetaVar :: MetaId -> (MetaVariable -> MetaVariable) -> TCM ()
 updateMetaVar m f =
   modify $ \st -> st { stMetaStore = Map.adjust f m $ stMetaStore st }
 
-getMetaPriority :: MonadTCM tcm => MetaId -> tcm MetaPriority
+getMetaPriority :: MetaId -> TCM MetaPriority
 getMetaPriority i = mvPriority <$> lookupMeta i
 
-isSortMeta :: MonadTCM tcm => MetaId -> tcm Bool
+isSortMeta :: MetaId -> TCM Bool
 isSortMeta m = do
   mv <- lookupMeta m
   return $ case mvJudgement mv of
     HasType{} -> False
     IsSort{}  -> True
 
-isInstantiatedMeta :: MonadTCM tcm => MetaId -> tcm Bool
+isInstantiatedMeta :: MetaId -> TCM Bool
 isInstantiatedMeta m = do
   mv <- lookupMeta m
   return $ case mvInstantiation mv of
@@ -61,98 +65,105 @@
     InstS{} -> True
     _       -> False
 
-createMetaInfo :: MonadTCM tcm => tcm MetaInfo
+createMetaInfo :: TCM MetaInfo
 createMetaInfo =
     do  r <- getCurrentRange
 	buildClosure r
 
-updateMetaVarRange :: MonadTCM tcm => MetaId -> Range -> tcm ()
+updateMetaVarRange :: MetaId -> Range -> TCM ()
 updateMetaVarRange mi r = updateMetaVar mi (setRange r)
 
-addInteractionPoint :: MonadTCM tcm => InteractionId -> MetaId -> tcm ()
+addInteractionPoint :: InteractionId -> MetaId -> TCM ()
 addInteractionPoint ii mi =
     modify $ \s -> s { stInteractionPoints =
 			Map.insert ii mi $ stInteractionPoints s
 		     }
 
 
-removeInteractionPoint :: MonadTCM tcm => InteractionId -> tcm ()
+removeInteractionPoint :: InteractionId -> TCM ()
 removeInteractionPoint ii =
     modify $ \s -> s { stInteractionPoints =
 			Map.delete ii $ stInteractionPoints s
 		     }
 
 
-getInteractionPoints :: MonadTCM tcm => tcm [InteractionId]
+getInteractionPoints :: TCM [InteractionId]
 getInteractionPoints = Map.keys <$> gets stInteractionPoints
 
-getInteractionMetas :: MonadTCM tcm => tcm [MetaId]
+getInteractionMetas :: TCM [MetaId]
 getInteractionMetas = Map.elems <$> gets stInteractionPoints
 
 -- | Does the meta variable correspond to an interaction point?
 
-isInteractionMeta :: MonadTCM tcm => MetaId -> tcm Bool
+isInteractionMeta :: MetaId -> TCM Bool
 isInteractionMeta m = fmap (m `elem`) getInteractionMetas
 
-lookupInteractionId :: MonadTCM tcm => InteractionId -> tcm MetaId
+lookupInteractionId :: InteractionId -> TCM MetaId
 lookupInteractionId ii =
     do  mmi <- Map.lookup ii <$> gets stInteractionPoints
 	case mmi of
 	    Just mi -> return mi
 	    _	    -> fail $ "no such interaction point: " ++ show ii
 
-judgementInteractionId :: MonadTCM tcm => InteractionId -> tcm (Judgement Type MetaId)
+judgementInteractionId :: InteractionId -> TCM (Judgement Type MetaId)
 judgementInteractionId ii =
     do  mi <- lookupInteractionId ii
         mvJudgement <$> lookupMeta mi
 
 -- | Generate new meta variable.
-newMeta :: MonadTCM tcm => MetaInfo -> MetaPriority -> Permutation -> Judgement Type a -> tcm MetaId
+newMeta :: MetaInfo -> MetaPriority -> Permutation -> Judgement Type a -> TCM MetaId
 newMeta = newMeta' Open
 
-newMeta' :: MonadTCM tcm => MetaInstantiation -> MetaInfo -> MetaPriority -> Permutation ->
-            Judgement Type a -> tcm MetaId
+-- | Generate a new meta variable with some instantiation given.
+--   For instance, the instantiation could be a 'PostponedTypeCheckingProblem'.
+newMeta' :: MetaInstantiation -> MetaInfo -> MetaPriority -> Permutation ->
+            Judgement Type a -> TCM MetaId
 newMeta' inst mi p perm j = do
   x <- fresh
-  let mv = MetaVar mi p perm (fmap (const x) j) inst Set.empty
+  let j' = fmap (const x) j  -- fill the identifier part of the judgement
+      mv = MetaVar mi p perm j' inst Set.empty Instantiable
+  -- printing not available (import cycle)
+  -- reportSDoc "tc.meta.new" 50 $ text "new meta" <+> prettyTCM j'
   modify $ \st -> st { stMetaStore = Map.insert x mv $ stMetaStore st }
   return x
 
-getInteractionRange :: MonadTCM tcm => InteractionId -> tcm Range
+getInteractionRange :: InteractionId -> TCM Range
 getInteractionRange ii = do
     mi <- lookupInteractionId ii
     getMetaRange mi
 
-getMetaRange :: MonadTCM tcm => MetaId -> tcm Range
+getMetaRange :: MetaId -> TCM Range
 getMetaRange mi = getRange <$> lookupMeta mi
 
 
-getInteractionScope :: MonadTCM tcm => InteractionId -> tcm ScopeInfo
+getInteractionScope :: InteractionId -> TCM ScopeInfo
 getInteractionScope ii =
     do mi <- lookupInteractionId ii
        mv <- lookupMeta mi
        return $ getMetaScope mv
 
-withMetaInfo :: MonadTCM tcm => MetaInfo -> tcm a -> tcm a
+withMetaInfo :: MetaInfo -> TCM a -> TCM a
 withMetaInfo mI m = enterClosure mI $ \r -> setCurrentRange r m
 
-getInstantiatedMetas :: MonadTCM tcm => tcm [MetaId]
+getInstantiatedMetas :: TCM [MetaId]
 getInstantiatedMetas = do
     store <- getMetaStore
     return [ i | (i, MetaVar{ mvInstantiation = mi }) <- Map.assocs store, isInst mi ]
     where
 	isInst Open                             = False
+	isInst OpenIFS                          = False
 	isInst (BlockedConst _)                 = False
         isInst (PostponedTypeCheckingProblem _) = False
 	isInst (InstV _)                        = True
 	isInst (InstS _)                        = True
 
-getOpenMetas :: MonadTCM tcm => tcm [MetaId]
+getOpenMetas :: TCM [MetaId]
 getOpenMetas = do
     store <- getMetaStore
     return [ i | (i, MetaVar{ mvInstantiation = mi }) <- Map.assocs store, isOpen mi ]
     where
 	isOpen Open                             = True
+	isOpen OpenIFS                          = True
 	isOpen (BlockedConst _)                 = True
         isOpen (PostponedTypeCheckingProblem _) = True
 	isOpen (InstV _)                        = False
@@ -160,19 +171,35 @@
 
 -- | @listenToMeta l m@: register @l@ as a listener to @m@. This is done
 --   when the type of l is blocked by @m@.
-listenToMeta :: MonadTCM tcm => MetaId -> MetaId -> tcm ()
+listenToMeta :: Listener -> MetaId -> TCM ()
 listenToMeta l m =
   updateMetaVar m $ \mv -> mv { mvListeners = Set.insert l $ mvListeners mv }
 
 -- | Unregister a listener.
-unlistenToMeta :: MonadTCM tcm => MetaId -> MetaId -> tcm ()
+unlistenToMeta :: Listener -> MetaId -> TCM ()
 unlistenToMeta l m =
   updateMetaVar m $ \mv -> mv { mvListeners = Set.delete l $ mvListeners mv }
 
 -- | Get the listeners to a meta.
-getMetaListeners :: MonadTCM tcm => MetaId -> tcm [MetaId]
+getMetaListeners :: MetaId -> TCM [Listener]
 getMetaListeners m = Set.toList . mvListeners <$> lookupMeta m
 
-clearMetaListeners :: MonadTCM tcm => MetaId -> tcm ()
+clearMetaListeners :: MetaId -> TCM ()
 clearMetaListeners m =
   updateMetaVar m $ \mv -> mv { mvListeners = Set.empty }
+
+-- | Freeze all meta variables.
+freezeMetas :: TCM ()
+freezeMetas = modifyMetaStore $ Map.map freeze where
+  freeze :: MetaVariable -> MetaVariable
+  freeze mvar = mvar { mvFrozen = Frozen }
+
+unfreezeMetas :: TCM ()
+unfreezeMetas = modifyMetaStore $ Map.map unfreeze where
+  unfreeze :: MetaVariable -> MetaVariable
+  unfreeze mvar = mvar { mvFrozen = Instantiable }
+
+isFrozen :: MetaId -> TCM Bool
+isFrozen x = do
+  mvar <- lookupMeta x
+  return $ mvFrozen mvar == Frozen
diff --git a/src/full/Agda/TypeChecking/Monad/Mutual.hs b/src/full/Agda/TypeChecking/Monad/Mutual.hs
--- a/src/full/Agda/TypeChecking/Monad/Mutual.hs
+++ b/src/full/Agda/TypeChecking/Monad/Mutual.hs
@@ -16,10 +16,10 @@
 
 #include "../../undefined.h"
 
-noMutualBlock :: MonadTCM tcm => tcm a -> tcm a
+noMutualBlock :: TCM a -> TCM a
 noMutualBlock = local $ \e -> e { envMutualBlock = Nothing }
 
-inMutualBlock :: MonadTCM tcm => tcm a -> tcm a
+inMutualBlock :: TCM a -> TCM a
 inMutualBlock m = do
   mi <- asks envMutualBlock
   case mi of
@@ -30,7 +30,7 @@
     Just _  -> m
 
 -- | Set the mutual block for a definition
-setMutualBlock :: MonadTCM tcm => MutualId -> QName -> tcm ()
+setMutualBlock :: MutualId -> QName -> TCM ()
 setMutualBlock i x = do
   modify $ \s -> s { stMutualBlocks = Map.insertWith Set.union i (Set.singleton x) $ stMutualBlocks s
 		   , stSignature    = (stSignature s)
@@ -41,21 +41,21 @@
     setMutId x i = flip Map.adjust x $ \defn -> defn { defMutual = i }
 
 -- | Get all mutual blocks
-getMutualBlocks :: MonadTCM tcm => tcm [Set QName]
+getMutualBlocks :: TCM [Set QName]
 getMutualBlocks = gets $ Map.elems . stMutualBlocks
 
 -- | Get the current mutual block.
-currentMutualBlock :: MonadTCM tcm => tcm MutualId
+currentMutualBlock :: TCM MutualId
 currentMutualBlock = maybe fresh return =<< asks envMutualBlock
 
-lookupMutualBlock :: MonadTCM tcm => MutualId -> tcm (Set QName)
+lookupMutualBlock :: MutualId -> TCM (Set QName)
 lookupMutualBlock mi = do
   mb <- gets stMutualBlocks
   case Map.lookup mi mb of
     Just qs -> return qs
-    Nothing -> fail $ "No such mutual block: " ++ show mi
+    Nothing -> return Set.empty -- can end up here if we ask for the current mutual block and there is none
 
-findMutualBlock :: MonadTCM tcm => QName -> tcm (Set QName)
+findMutualBlock :: QName -> TCM (Set QName)
 findMutualBlock f = do
   bs <- getMutualBlocks
   case filter (Set.member f) bs of
diff --git a/src/full/Agda/TypeChecking/Monad/Open.hs b/src/full/Agda/TypeChecking/Monad/Open.hs
--- a/src/full/Agda/TypeChecking/Monad/Open.hs
+++ b/src/full/Agda/TypeChecking/Monad/Open.hs
@@ -23,7 +23,7 @@
 import Agda.Utils.Impossible
 
 -- | Create an open term in the current context.
-makeOpen :: MonadTCM tcm => a -> tcm (Open a)
+makeOpen :: a -> TCM (Open a)
 makeOpen x = do
     ctx <- getContextId
     return $ OpenThing ctx x
@@ -35,14 +35,14 @@
 
 -- | Extract the value from an open term. Must be done in an extension of the
 --   context in which the term was created.
-getOpen :: (MonadTCM tcm, Raise a) => Open a -> tcm a
+getOpen :: Raise a => Open a -> TCM a
 getOpen (OpenThing []  x) = return x
 getOpen (OpenThing ctx x) = do
   ctx' <- getContextId
   unless (ctx `isSuffixOf` ctx') $ fail $ "thing out of context (" ++ show ctx ++ " is not a sub context of " ++ show ctx' ++ ")"
   return $ raise (genericLength ctx' - genericLength ctx) x
 
-tryOpen :: (MonadTCM tcm, Raise a) => Open a -> tcm (Maybe a)
-tryOpen o = liftTCM $
+tryOpen :: Raise a => Open a -> TCM (Maybe a)
+tryOpen o =
   (Just <$> getOpen o)
   `catchError` \_ -> return Nothing
diff --git a/src/full/Agda/TypeChecking/Monad/Options.hs b/src/full/Agda/TypeChecking/Monad/Options.hs
--- a/src/full/Agda/TypeChecking/Monad/Options.hs
+++ b/src/full/Agda/TypeChecking/Monad/Options.hs
@@ -26,24 +26,28 @@
 
 -- | Sets the pragma options.
 
-setPragmaOptions :: MonadTCM tcm => PragmaOptions -> tcm ()
+setPragmaOptions :: PragmaOptions -> TCM ()
 setPragmaOptions opts = do
   clo <- commandLineOptions
+  let unsafe = unsafePragmaOptions opts
+  when (optSafe clo && not (null unsafe)) $ typeError (SafeFlagPragma unsafe)
   case checkOpts (clo { optPragmaOptions = opts }) of
     Left err   -> __IMPOSSIBLE__
     Right opts -> do
       modify $ \s -> s { stPragmaOptions = (optPragmaOptions opts) }
+
 -- | Sets the command line options (both persistent and pragma options
 -- are updated).
 --
 -- Relative include directories are made absolute with respect to the
--- current working directory. If the include directories have changed,
--- then the state is reset.
+-- current working directory. If the include directories have changed
+-- (and were previously @'Right' something@), then the state is reset
+-- (completely) .
 --
 -- An empty list of relative include directories (@'Left' []@) is
 -- interpreted as @["."]@.
 
-setCommandLineOptions :: MonadTCM tcm => CommandLineOptions -> tcm ()
+setCommandLineOptions :: CommandLineOptions -> TCM ()
 setCommandLineOptions opts =
   case checkOpts opts of
     Left err   -> __IMPOSSIBLE__
@@ -54,24 +58,26 @@
           setIncludeDirs is CurrentDir
           getIncludeDirs
       modify $ \s ->
-        s { stPersistentOptions = opts { optIncludeDirs = Right incs }
-          , stPragmaOptions     = optPragmaOptions opts
+        s { stPersistent = (stPersistent s) {
+              stPersistentOptions = opts { optIncludeDirs = Right incs }
+            }
+          , stPragmaOptions = optPragmaOptions opts
           }
 
 -- | Returns the pragma options which are currently in effect.
 
-pragmaOptions :: MonadTCM tcm => tcm PragmaOptions
-pragmaOptions = liftTCM $ gets stPragmaOptions
+pragmaOptions :: TCM PragmaOptions
+pragmaOptions = gets stPragmaOptions
 
 -- | Returns the command line options which are currently in effect.
 
-commandLineOptions :: MonadTCM tcm => tcm CommandLineOptions
-commandLineOptions = liftTCM $ do
-  p  <- gets stPragmaOptions
-  cl <- gets stPersistentOptions
+commandLineOptions :: TCM CommandLineOptions
+commandLineOptions = do
+  p  <- stPragmaOptions <$> get
+  cl <- stPersistentOptions . stPersistent <$> get
   return $ cl { optPragmaOptions = p }
 
-setOptionsFromPragma :: MonadTCM tcm => OptionsPragma -> tcm ()
+setOptionsFromPragma :: OptionsPragma -> TCM ()
 setOptionsFromPragma ps = do
     opts <- commandLineOptions
     case parsePragmaOptions ps opts of
@@ -79,43 +85,44 @@
 	Right opts' -> setPragmaOptions opts'
 
 -- | Disable display forms.
-enableDisplayForms :: MonadTCM tcm => tcm a -> tcm a
+enableDisplayForms :: TCM a -> TCM a
 enableDisplayForms =
   local $ \e -> e { envDisplayFormsEnabled = True }
 
 -- | Disable display forms.
-disableDisplayForms :: MonadTCM tcm => tcm a -> tcm a
+disableDisplayForms :: TCM a -> TCM a
 disableDisplayForms =
   local $ \e -> e { envDisplayFormsEnabled = False }
 
 -- | Check if display forms are enabled.
-displayFormsEnabled :: MonadTCM tcm => tcm Bool
+displayFormsEnabled :: TCM Bool
 displayFormsEnabled = asks envDisplayFormsEnabled
 
 -- | Don't eta contract implicit
-dontEtaContractImplicit :: MonadTCM tcm => tcm a -> tcm a
+dontEtaContractImplicit :: TCM a -> TCM a
 dontEtaContractImplicit = local $ \e -> e { envEtaContractImplicit = False }
 
 -- | Do eta contract implicit
+{-# SPECIALIZE doEtaContractImplicit :: TCM a -> TCM a #-}
 doEtaContractImplicit :: MonadTCM tcm => tcm a -> tcm a
 doEtaContractImplicit = local $ \e -> e { envEtaContractImplicit = True }
 
-shouldEtaContractImplicit :: MonadTCM tcm => tcm Bool
+shouldEtaContractImplicit :: TCM Bool
 shouldEtaContractImplicit = asks envEtaContractImplicit
 
 -- | Don't reify interaction points
-dontReifyInteractionPoints :: MonadTCM tcm => tcm a -> tcm a
+dontReifyInteractionPoints :: TCM a -> TCM a
 dontReifyInteractionPoints =
   local $ \e -> e { envReifyInteractionPoints = False }
 
-shouldReifyInteractionPoints :: MonadTCM tcm => tcm Bool
+shouldReifyInteractionPoints :: TCM Bool
 shouldReifyInteractionPoints = asks envReifyInteractionPoints
 
 -- | Gets the include directories.
 --
 -- Precondition: 'optIncludeDirs' must be @'Right' something@.
 
-getIncludeDirs :: MonadTCM tcm => tcm [AbsolutePath]
+getIncludeDirs :: TCM [AbsolutePath]
 getIncludeDirs = do
   incs <- optIncludeDirs <$> commandLineOptions
   case incs of
@@ -135,17 +142,18 @@
 -- | Makes the given directories absolute and stores them as include
 -- directories.
 --
--- If the include directories have changed, then the state is reset.
+-- If the include directories change (and they were previously
+-- @'Right' something@), then the state is reset (completely, except
+-- for the include directories).
 --
 -- An empty list is interpreted as @["."]@.
 
 setIncludeDirs
-  :: MonadTCM tcm
-  => [FilePath]
+  :: [FilePath]
   -- ^ New include directories.
   -> RelativeTo
   -- ^ How should relative paths be interpreted?
-  -> tcm ()
+  -> TCM ()
 setIncludeDirs incs relativeTo = do
   opts <- commandLineOptions
   let oldIncs = optIncludeDirs opts
@@ -155,50 +163,59 @@
       root <- liftIO (absolute =<< getCurrentDirectory)
       return (root, return ())
     ProjectRoot f -> do
-      m <- liftTCM $ moduleName' f
-      return (projectRoot f m, liftTCM $ checkModuleName m f)
+      m <- moduleName' f
+      return (projectRoot f m, checkModuleName m f)
 
-  modify $ \s -> s { stPersistentOptions =
-    (stPersistentOptions s) { optIncludeDirs =
-      Right $ map (mkAbsolute . (filePath root </>)) $
-        case incs of
-          [] -> ["."]
-          _  -> incs } }
+  let setIncs incs = modify $ \s ->
+        s { stPersistent =
+          (stPersistent s) { stPersistentOptions =
+            (stPersistentOptions $ stPersistent s)
+              { optIncludeDirs = Right incs
+            }
+          }
+        }
 
+  setIncs (map (mkAbsolute . (filePath root </>)) $
+             case incs of
+               [] -> ["."]
+               _  -> incs)
+
   incs <- getIncludeDirs
   case oldIncs of
-    Right incs' | incs' /= incs -> resetState
+    Right incs' | incs' /= incs -> do
+      resetAllState
+      setIncs incs
     _                           -> return ()
 
   check
 
-setInputFile :: MonadTCM tcm => FilePath -> tcm ()
+setInputFile :: FilePath -> TCM ()
 setInputFile file =
     do	opts <- commandLineOptions
 	setCommandLineOptions $
           opts { optInputFile = Just file }
 
 -- | Should only be run if 'hasInputFile'.
-getInputFile :: MonadTCM tcm => tcm AbsolutePath
+getInputFile :: TCM AbsolutePath
 getInputFile =
     do	mf <- optInputFile <$> commandLineOptions
 	case mf of
 	    Just file -> liftIO $ absolute file
 	    Nothing   -> __IMPOSSIBLE__
 
-hasInputFile :: MonadTCM tcm => tcm Bool
+hasInputFile :: TCM Bool
 hasInputFile = isJust <$> optInputFile <$> commandLineOptions
 
-proofIrrelevance :: MonadTCM tcm => tcm Bool
+proofIrrelevance :: TCM Bool
 proofIrrelevance = optProofIrrelevance <$> pragmaOptions
 
-hasUniversePolymorphism :: MonadTCM tcm => tcm Bool
+hasUniversePolymorphism :: TCM Bool
 hasUniversePolymorphism = optUniversePolymorphism <$> pragmaOptions
 
-showImplicitArguments :: MonadTCM tcm => tcm Bool
+showImplicitArguments :: TCM Bool
 showImplicitArguments = optShowImplicit <$> pragmaOptions
 
-setShowImplicitArguments :: MonadTCM tcm => Bool -> tcm a -> tcm a
+setShowImplicitArguments :: Bool -> TCM a -> TCM a
 setShowImplicitArguments showImp ret = do
   opts <- pragmaOptions
   let imp = optShowImplicit opts
@@ -208,21 +225,21 @@
   setPragmaOptions $ opts { optShowImplicit = imp }
   return x
 
-ignoreInterfaces :: MonadTCM tcm => tcm Bool
+ignoreInterfaces :: TCM Bool
 ignoreInterfaces = optIgnoreInterfaces <$> commandLineOptions
 
-positivityCheckEnabled :: MonadTCM tcm => tcm Bool
+positivityCheckEnabled :: TCM Bool
 positivityCheckEnabled = not . optDisablePositivity <$> pragmaOptions
 
-typeInType :: MonadTCM tcm => tcm Bool
+typeInType :: TCM Bool
 typeInType = not . optUniverseCheck <$> pragmaOptions
 
-getVerbosity :: MonadTCM tcm => tcm (Trie String Int)
+getVerbosity :: TCM (Trie String Int)
 getVerbosity = optVerbose <$> pragmaOptions
 
 type VerboseKey = String
 
-hasVerbosity :: MonadTCM tcm => VerboseKey -> Int -> tcm Bool
+hasVerbosity :: VerboseKey -> Int -> TCM Bool
 hasVerbosity k n | n < 0     = __IMPOSSIBLE__
                  | otherwise = do
     t <- getVerbosity
@@ -231,24 +248,23 @@
     return (n <= m)
 
 -- | Precondition: The level must be non-negative.
-verboseS :: MonadTCM tcm => VerboseKey -> Int -> tcm () -> tcm ()
+verboseS :: VerboseKey -> Int -> TCM () -> TCM ()
 verboseS k n action = whenM (hasVerbosity k n) action
 
-reportS :: MonadTCM tcm => VerboseKey -> Int -> String -> tcm ()
+reportS :: VerboseKey -> Int -> String -> TCM ()
 reportS k n s = verboseS k n $ liftIO $ LocIO.putStr s
 
-reportSLn :: MonadTCM tcm => VerboseKey -> Int -> String -> tcm ()
+reportSLn :: VerboseKey -> Int -> String -> TCM ()
 reportSLn k n s = verboseS k n $ liftIO $ LocIO.putStrLn s >> LocIO.stdoutFlush
 
-reportSDoc :: MonadTCM tcm => VerboseKey -> Int -> tcm Doc -> tcm ()
+reportSDoc :: VerboseKey -> Int -> TCM Doc -> TCM ()
 reportSDoc k n d = verboseS k n $ liftIO . LocIO.print =<< d
 
-verboseBracket :: MonadTCM tcm => VerboseKey -> Int -> String -> tcm a -> tcm a
+verboseBracket :: VerboseKey -> Int -> String -> TCM a -> TCM a
 verboseBracket k n s m = do
   v <- hasVerbosity k n
   if not v then m
            else do
     liftIO $ LocIO.putStrLn $ "{ " ++ s
-    x <- m
-    liftIO $ LocIO.putStrLn "}"
+    x <- m `finally` liftIO (LocIO.putStrLn "}")
     return x
diff --git a/src/full/Agda/TypeChecking/Monad/Options.hs-boot b/src/full/Agda/TypeChecking/Monad/Options.hs-boot
--- a/src/full/Agda/TypeChecking/Monad/Options.hs-boot
+++ b/src/full/Agda/TypeChecking/Monad/Options.hs-boot
@@ -3,4 +3,4 @@
 import Agda.TypeChecking.Monad.Base
 import Agda.Utils.FileName
 
-getIncludeDirs :: MonadTCM tcm => tcm [AbsolutePath]
+getIncludeDirs :: TCM [AbsolutePath]
diff --git a/src/full/Agda/TypeChecking/Monad/Signature.hs b/src/full/Agda/TypeChecking/Monad/Signature.hs
--- a/src/full/Agda/TypeChecking/Monad/Signature.hs
+++ b/src/full/Agda/TypeChecking/Monad/Signature.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE CPP, PatternGuards #-}
 module Agda.TypeChecking.Monad.Signature where
 
+import Control.Arrow ((***))
 import Control.Monad.State
 import Control.Monad.Reader
 import Data.Set (Set)
@@ -16,15 +17,18 @@
 import Agda.Syntax.Internal
 import Agda.Syntax.Position
 
+import qualified Agda.Compiler.JS.Parser as JS
+
 import Agda.TypeChecking.Monad.Base
 import Agda.TypeChecking.Monad.Context
 import Agda.TypeChecking.Monad.Options
 import Agda.TypeChecking.Monad.Env
 import Agda.TypeChecking.Monad.Mutual
 import Agda.TypeChecking.Monad.Open
+import Agda.TypeChecking.Free (isBinderUsed)
 import Agda.TypeChecking.Substitute
 -- import Agda.TypeChecking.Pretty -- leads to cyclicity
-import Agda.TypeChecking.CompiledClause
+import {-# SOURCE #-} Agda.TypeChecking.CompiledClause.Compile
 import {-# SOURCE #-} Agda.TypeChecking.Polarity
 
 import Agda.Utils.Monad
@@ -36,25 +40,25 @@
 #include "../../undefined.h"
 import Agda.Utils.Impossible
 
-modifySignature :: MonadTCM tcm => (Signature -> Signature) -> tcm ()
+modifySignature :: (Signature -> Signature) -> TCM ()
 modifySignature f = modify $ \s -> s { stSignature = f $ stSignature s }
 
-modifyImportedSignature :: MonadTCM tcm => (Signature -> Signature) -> tcm ()
+modifyImportedSignature :: (Signature -> Signature) -> TCM ()
 modifyImportedSignature f = modify $ \s -> s { stImports = f $ stImports s }
 
-getSignature :: MonadTCM tcm => tcm Signature
-getSignature = liftTCM $ gets stSignature
+getSignature :: TCM Signature
+getSignature = gets stSignature
 
-getImportedSignature :: MonadTCM tcm => tcm Signature
-getImportedSignature = liftTCM $ gets stImports
+getImportedSignature :: TCM Signature
+getImportedSignature = gets stImports
 
-setSignature :: MonadTCM tcm => Signature -> tcm ()
+setSignature :: Signature -> TCM ()
 setSignature sig = modifySignature $ const sig
 
-setImportedSignature :: MonadTCM tcm => Signature -> tcm ()
-setImportedSignature sig = liftTCM $ modify $ \s -> s { stImports = sig }
+setImportedSignature :: Signature -> TCM ()
+setImportedSignature sig = modify $ \s -> s { stImports = sig }
 
-withSignature :: MonadTCM tcm => Signature -> tcm a -> tcm a
+withSignature :: Signature -> TCM a -> TCM a
 withSignature sig m =
     do	sig0 <- getSignature
 	setSignature sig
@@ -63,8 +67,8 @@
         return r
 
 -- | Add a constant to the signature. Lifts the definition to top level.
-addConstant :: MonadTCM tcm => QName -> Definition -> tcm ()
-addConstant q d = liftTCM $ do
+addConstant :: QName -> Definition -> TCM ()
+addConstant q d = do
   reportSLn "tc.signature" 20 $ "adding constant " ++ show q ++ " to signature"
   tel <- getContextTelescope
   let tel' = killRange $ case theDef d of
@@ -82,31 +86,114 @@
     hideTel  EmptyTel		      = EmptyTel
     hideTel (ExtendTel (Arg _ r t) tel) = ExtendTel (Arg Hidden r t) $ hideTel <$> tel
 
-addHaskellCode :: MonadTCM tcm => QName -> HaskellType -> HaskellCode -> tcm ()
+-- | Turn a definition into a projection if it looks like a projection.
+makeProjection :: QName -> TCM ()
+makeProjection x = inContext [] $ do
+  reportSLn "tc.proj.like" 30 $ "Considering " ++ show x ++ " for projection likeness"
+  defn <- getConstInfo x
+  case theDef defn of
+    -- Constructor-headed functions can't be projection-like (at the moment). The reason
+    -- for this is that invoking constructor-headedness will circumvent the inference of
+    -- the dropped arguments.
+    -- Nor can abstract definitions be projection-like since they won't reduce
+    -- outside the abstract block.
+    def@Function{funProjection = Nothing, funClauses = cls, funInv = NotInjective,
+                 funAbstr = ConcreteDef} -> do
+      ps0 <- filterM validProj (candidateArgs [] (unEl $ defType defn))
+      reportSLn "tc.proj.like" 30 $ if null ps0 then "  no candidates found"
+                                                else "  candidates: " ++ show ps0
+      ps <- return $ filter (checkOccurs cls . snd) ps0
+      when (not (null ps0) && null ps) $ reportSLn "tc.proj.like" 50 $ "  occurs check failed\n    clauses = " ++ show cls
+      case reverse ps of
+        []         -> return ()
+        (d, n) : _ -> do
+          reportSLn "tc.proj.like" 10 $ show (defName defn) ++ " is projection like in argument " ++
+                                        show n ++ " for type " ++ show d
+          let cls' = map (rewriteClause n) cls
+          cc <- compileClauses True cls'
+          reportSLn "tc.proj.like" 20 $ "  rewrote clauses to\n    " ++ show cc
+          let mapInv f NotInjective  = NotInjective
+              mapInv f (Inverse inv) = Inverse (f inv)
+              newDef = def
+                       { funProjection     = Just (d, n + 1)
+                       , funClauses        = cls'
+                       , funCompiled       = cc
+                       , funInv            = mapInv (Map.map $ rewriteClause n) $ funInv def
+                       , funArgOccurrences = drop n $ funArgOccurrences def
+                       , funPolarity       = drop n $ funPolarity def
+                       }
+          addConstant x $ defn{ theDef     = newDef
+                              , defDisplay = [] }
+    _ -> return ()
+  where
+    validProj (_, 0) = return False
+    validProj (d, _) = do
+      defn <- theDef <$> getConstInfo d
+      return $ case defn of
+        Datatype{} -> True
+        Record{}   -> True
+        Axiom{}    -> True
+        _          -> False
+
+    rewriteClause n cl@Clause{clausePerm = Perm m p} =
+      cl{ clausePerm = Perm (m - fromIntegral n) $ map (subtract $ fromIntegral n) $ drop n p
+        , clauseTel  = telFromList $ drop n $ telToList $ clauseTel cl
+        , clausePats = drop n $ clausePats cl
+        , clauseBody = dropB n $ clauseBody cl
+        }
+      where
+        dropB 0 b          = b
+        dropB _ NoBody     = NoBody
+        dropB n (Bind b)   = dropB (n - 1) (absBody b)
+        dropB n Body{}     = __IMPOSSIBLE__
+
+    checkOccurs cls n = all (nonOccur n) cls
+
+    nonOccur n Clause{clausePerm = Perm _ p, clausePats = ps, clauseBody = b} =
+      and [ take n p == [0..fromIntegral n - 1]
+          , onlyMatch n ps  -- projection-like functions are only allowed to match on the eliminatee
+                            -- otherwise we may end up projecting from constructor applications, in
+                            -- which case we can't reconstruct the dropped parameters
+          , checkBody n b ]
+
+    onlyMatch n ps = all (noMatch . unArg) $ ps0 ++ drop 1 ps1
+      where
+        (ps0, ps1) = splitAt n ps
+        noMatch ConP{} = False
+        noMatch LitP{} = False
+        noMatch VarP{} = True
+        noMatch DotP{} = True
+
+    checkBody 0 _          = True
+    checkBody _ NoBody     = True
+    checkBody n (Bind b)   = not (isBinderUsed b) && checkBody (n - 1) (unAbs b)
+    checkBody _ Body{}     = __IMPOSSIBLE__
+
+    candidateArgs vs (Pi (Arg r h (El _ (Def d us))) b)
+      | vs == map unArg us = (d, length vs) : candidateRec vs b
+    candidateArgs vs (Pi _ b) = candidateRec vs b
+    candidateArgs _ _ = []
+
+    candidateRec vs NoAbs{} = []
+    candidateRec vs b       = candidateArgs (Var (size vs) [] : vs) (unEl $ absBody b)
+
+addHaskellCode :: QName -> HaskellType -> HaskellCode -> TCM ()
 addHaskellCode q hsTy hsDef =
   -- TODO: sanity checking
   modifySignature $ \sig -> sig
   { sigDefinitions = Map.adjust addHs q $ sigDefinitions sig }
   where
-    addHs def@Defn{theDef = con@Constructor{}} =
-      def{theDef = con{conHsCode = Just (hsTy, hsDef)}}
-    addHs def@Defn{theDef = ax@Axiom{}} =
-      def{theDef = ax{axHsDef = Just $ HsDefn hsTy hsDef}}
-    addHs def = def
+    addHs def = def { defCompiledRep = (defCompiledRep def) { compiledHaskell = Just $ HsDefn hsTy hsDef } }
 
-addHaskellType :: MonadTCM tcm => QName -> HaskellType -> tcm ()
+addHaskellType :: QName -> HaskellType -> TCM ()
 addHaskellType q hsTy =
   -- TODO: sanity checking
   modifySignature $ \sig -> sig
   { sigDefinitions = Map.adjust addHs q $ sigDefinitions sig }
   where
-    addHs def@Defn{theDef = ax@Axiom{}} =
-      def{theDef = ax{axHsDef = Just $ HsType hsTy}}
-    addHs def@Defn{theDef = d@Datatype{}} =
-      def{theDef = d{dataHsType = Just hsTy}}
-    addHs def = def
+    addHs def = def { defCompiledRep = (defCompiledRep def) { compiledHaskell = Just $ HsType hsTy } }
 
-addEpicCode :: MonadTCM tcm => QName -> EpicCode -> tcm ()
+addEpicCode :: QName -> EpicCode -> TCM ()
 addEpicCode q epDef =
   -- TODO: sanity checking
   modifySignature $ \sig -> sig
@@ -114,17 +201,35 @@
   where
     --addEp def@Defn{theDef = con@Constructor{}} =
       --def{theDef = con{conHsCode = Just (hsTy, hsDef)}}
-    addEp def@Defn{theDef = ax@Axiom{}} =
-      def{theDef = ax{axEpDef = Just $ epDef}}
-    addEp def = def
+    addEp def = def { defCompiledRep = (defCompiledRep def) { compiledEpic = Just epDef } }
 
+addJSCode :: QName -> String -> TCM ()
+addJSCode q jsDef =
+  case JS.parse jsDef of
+    Left e ->
+      modifySignature $ \sig -> sig
+      { sigDefinitions = Map.adjust (addJS (Just e)) q $ sigDefinitions sig }
+    Right s ->
+      typeError (CompilationError ("Failed to parse ECMAScript (..." ++ s ++ ") for " ++ show q))
+  where
+    addJS e def = def{defCompiledRep = (defCompiledRep def){compiledJS = e}}
+
+markStatic :: QName -> TCM ()
+markStatic q =
+  modifySignature $ \sig -> sig
+  { sigDefinitions = Map.adjust mark q $ sigDefinitions sig }
+  where
+    mark def@Defn{theDef = fun@Function{}} =
+      def{theDef = fun{funStatic = True}}
+    mark def = def
+
 unionSignatures :: [Signature] -> Signature
 unionSignatures ss = foldr unionSignature emptySignature ss
   where
     unionSignature (Sig a b) (Sig c d) = Sig (Map.union a c) (Map.union b d)
 
 -- | Add a section to the signature.
-addSection :: MonadTCM tcm => ModuleName -> Nat -> tcm ()
+addSection :: ModuleName -> Nat -> TCM ()
 addSection m fv = do
   tel <- getContextTelescope
   let sec = Section tel fv
@@ -132,7 +237,7 @@
 
 -- | Lookup a section. If it doesn't exist that just means that the module
 --   wasn't parameterised.
-lookupSection :: MonadTCM tcm => ModuleName -> tcm Telescope
+lookupSection :: ModuleName -> TCM Telescope
 lookupSection m = do
   sig  <- sigSections <$> getSignature
   isig <- sigSections <$> getImportedSignature
@@ -145,15 +250,20 @@
   add args x x []
   where
     add args top x ps = do
-      cs <- map originalClause . defClauses <$> getConstInfo x
+      def <- getConstInfo x
+      let cs = defClauses def
+          n  = case theDef def of
+                 Function{ funProjection = Just (_, n) } -> n
+                 _ -> 0
       case cs of
 	[ Clause{ clauseBody = b } ]
-	  | Just (m, Def y vs) <- strip b
-	  , m == length args && args `isPrefixOf` vs -> do
+	  | Just (m, Def y vs) <- strip b -> do
 	      let ps' = raise 1 (map unArg vs) ++ ps
-	      reportSLn "tc.section.apply.display" 20 $ "adding display form " ++ show y ++ " --> " ++ show top
-	      addDisplayForm y (Display 0 ps' $ DTerm $ Def top args)
-	      add args top y $ drop (length args) ps'
+                  df  = Display 0 ps' $ DTerm $ Def top (drop (n - 1) args)
+	      reportSLn "tc.display.section" 20 $ "adding display form " ++ show y ++ " --> " ++ show top
+                                                ++ "\n  " ++ show df
+	      addDisplayForm y df
+	      add args top y ps'
 	_ -> do
 	      let reason = case cs of
 		    []    -> "no clauses"
@@ -163,28 +273,20 @@
 		      Just (m, Def y vs)
 			| m < length args -> "too few args"
 			| m > length args -> "too many args"
-			| otherwise	      -> "args=" ++ unwords (map var args) ++ " vs=" ++ unwords (map var vs)
-			  where
-			    var (Arg h r x) = hid h $ case x of
-			      Var i []	-> show i
-			      MetaV _ _	-> "?"
-			      _		-> "_"
-			    hid NotHidden s = s
-			    hid Hidden    s = "{" ++ s ++ "}"
+			| otherwise	      -> "args=" ++ show args ++ " vs=" ++ show vs
 		      Just (m, v) -> "not a def body"
-	      reportSLn "tc.section.apply.display" 30 $ "no display form from" ++ show x ++ " because " ++ reason
+	      reportSLn "tc.display.section" 30 $ "no display form from" ++ show x ++ " because " ++ reason
 	      return ()
     strip (Body v)   = return (0, v)
     strip  NoBody    = Nothing
-    strip (NoBind b) = Nothing
     strip (Bind b)   = do
       (n, v) <- strip $ absBody b
       return (n + 1, v)
 
 applySection ::
-  MonadTCM tcm => ModuleName -> Telescope -> ModuleName -> Args ->
-  Map QName QName -> Map ModuleName ModuleName -> tcm ()
-applySection new ptel old ts rd rm = liftTCM $ do
+  ModuleName -> Telescope -> ModuleName -> Args ->
+  Map QName QName -> Map ModuleName ModuleName -> TCM ()
+applySection new ptel old ts rd rm = do
   sig  <- getSignature
   isig <- getImportedSignature
   let ss = getOld partOfOldM sigSections    [sig, isig]
@@ -203,6 +305,7 @@
     ]
   mapM_ (copyDef ts) ds
   mapM_ (copySec ts) ss
+  mapM_ computePolarity (Map.elems rd)
   where
     getOld partOfOld fromSig sigs =
       Map.toList $ Map.filterKeys partOfOld $ Map.unions $ map fromSig sigs
@@ -217,51 +320,68 @@
 	Nothing -> return ()  -- if it's not in the renaming it was private and
 			      -- we won't need it
 	Just y	-> do
-	  addConstant y (nd y)
-          computePolarity y  -- AA: Polarity.sizePolarity needs also constructor names
+	  addConstant y =<< nd y
+          makeProjection y
 	  -- Set display form for the old name if it's not a constructor.
 	  unless (isCon || size ptel > 0) $ do
 	    addDisplayForms y
       where
 	t  = defType d `apply` ts
 	-- the name is set by the addConstant function
-	nd y = Defn (defRelevance d) y t [] (-1) def  -- TODO: mutual block?
+	nd y = Defn (defRelevance d) y t [] (-1) noCompiledRep <$> def  -- TODO: mutual block?
         oldDef = theDef d
 	isCon = case oldDef of
 	  Constructor{} -> True
 	  _		-> False
-        -- TODO: compute polarity for the new definition
+        getOcc d = case d of
+          Function { funArgOccurrences  = os } -> os
+          Datatype { dataArgOccurrences = os } -> os
+          Record   { recArgOccurrences  = os } -> os
+          _ -> []
+        oldOcc = getOcc oldDef
 	def  = case oldDef of
-                Constructor{ conPars = np, conData = d } ->
+                Constructor{ conPars = np, conData = d } -> return $
                   oldDef { conPars = np - size ts, conData = copyName d }
-                Datatype{ dataPars = np, dataCons = cs } ->
-                  oldDef { dataPars = np - size ts, dataClause = Just cl, dataCons = map copyName cs }
-                Record{ recPars = np, recConType = t, recTel = tel } ->
+                Datatype{ dataPars = np, dataCons = cs } -> return $
+                  oldDef { dataPars = np - size ts, dataClause = Just cl, dataCons = map copyName cs
+                         , dataArgOccurrences = drop (length ts) oldOcc }
+                Record{ recPars = np, recConType = t, recTel = tel } -> return $
                   oldDef { recPars = np - size ts, recClause = Just cl
                          , recConType = apply t ts, recTel = apply tel ts
+                         , recArgOccurrences = drop (length ts) oldOcc
                          }
-		_ ->
-                  Function { funClauses        = [cl2]
-                           , funCompiled       = cc
-                           , funDelayed        = NotDelayed
-                           , funInv            = NotInjective
-                           , funPolarity       = []
-                           , funArgOccurrences = []
-                           , funAbstr          = ConcreteDef
-                           , funProjection     = fmap (nonNeg . \ n -> n - size ts) maybeNum
-                           }
-                  where maybeNum = case oldDef of
-                                     Function { funProjection = mn } -> mn
-                                     _                               -> Nothing
-                        nonNeg n = if n >= 0 then n else __IMPOSSIBLE__
+		_ -> do
+                  cc <- compileClauses True [cl]
+                  let newDef = Function
+                        { funClauses        = [cl]
+                        , funCompiled       = cc
+                        , funDelayed        = NotDelayed
+                        , funInv            = NotInjective
+                        , funPolarity       = []
+                        , funArgOccurrences = drop (length ts') oldOcc
+                        , funAbstr          = ConcreteDef
+                        , funProjection     = proj
+                        , funStatic         = False
+                        }
+                  reportSLn "tc.mod.apply" 80 $ "new def for " ++ show x ++ "\n  " ++ show newDef
+                  return newDef
+                  where
+                    proj = case oldDef of
+                      Function{funProjection = Just (r, n)}
+                        | size ts < n -> Just (r, n - size ts)
+                      _ -> Nothing
+        ts' | null ts   = []
+            | otherwise = case oldDef of
+                Function{funProjection = Just (_, n)}
+                  | n == 0       -> __IMPOSSIBLE__
+                  | otherwise    -> drop (n - 1) ts
+                _ -> ts
 	cl = Clause { clauseRange = getRange $ defClauses d
                     , clauseTel   = EmptyTel
                     , clausePerm  = idP 0
                     , clausePats  = []
-                    , clauseBody  = Body $ Def x ts
+                    , clauseBody  = Body $ Def x ts'
                     }
-        cl2 = Clauses Nothing cl
-        cc  = compileClauses [cl2]
 
     copySec :: Args -> (ModuleName, Section) -> TCM ()
     copySec ts (x, sec) = case Map.lookup x rm of
@@ -272,7 +392,7 @@
       where
 	tel = secTelescope sec
 
-addDisplayForm :: MonadTCM tcm => QName -> DisplayForm -> tcm ()
+addDisplayForm :: QName -> DisplayForm -> TCM ()
 addDisplayForm x df = do
   d <- makeOpen df
   modifyImportedSignature (add d)
@@ -283,7 +403,7 @@
 	addDf def = def { defDisplay = df : defDisplay def }
 	defs	  = sigDefinitions sig
 
-canonicalName :: MonadTCM tcm => QName -> tcm QName
+canonicalName :: QName -> TCM QName
 canonicalName x = do
   def <- theDef <$> getConstInfo x
   case def of
@@ -292,15 +412,14 @@
     Datatype{dataClause = Just (Clause{ clauseBody = body })} -> canonicalName $ extract body
     _                                                         -> return x
   where
-    extract NoBody	     = __IMPOSSIBLE__
+    extract NoBody           = __IMPOSSIBLE__
     extract (Body (Def x _)) = x
-    extract (Body _)	     = __IMPOSSIBLE__
-    extract (Bind (Abs _ b)) = extract b
-    extract (NoBind b)	     = extract b
+    extract (Body _)         = __IMPOSSIBLE__
+    extract (Bind b)         = extract (unAbs b)
 
 -- | Can be called on either a (co)datatype, a record type or a
 --   (co)constructor.
-whatInduction :: MonadTCM tcm => QName -> tcm Induction
+whatInduction :: QName -> TCM Induction
 whatInduction c = do
   def <- theDef <$> getConstInfo c
   case def of
@@ -327,6 +446,7 @@
 
 -- | Lookup the definition of a name. The result is a closed thing, all free
 --   variables have been abstracted over.
+{-# SPECIALIZE getConstInfo :: QName -> TCM Definition #-}
 getConstInfo :: MonadTCM tcm => QName -> tcm Definition
 getConstInfo q = liftTCM $ join $ pureTCM $ \st env ->
   let defs  = sigDefinitions $ stSignature st
@@ -359,8 +479,8 @@
         init' xs = init xs
 
 -- | Look up the polarity of a definition.
-getPolarity :: MonadTCM tcm => QName -> tcm [Polarity]
-getPolarity q = liftTCM $ do
+getPolarity :: QName -> TCM [Polarity]
+getPolarity q = do
   defn <- theDef <$> getConstInfo q
   case defn of
     Function{ funPolarity  = p } -> return p
@@ -368,13 +488,13 @@
     Record{ recPolarity    = p } -> return p
     _                            -> return []
 
-getPolarity' :: MonadTCM tcm => Comparison -> QName -> tcm [Polarity]
+getPolarity' :: Comparison -> QName -> TCM [Polarity]
 getPolarity' CmpEq _  = return []
 getPolarity' CmpLeq q = getPolarity q
 
 -- | Set the polarity of a definition.
-setPolarity :: MonadTCM tcm => QName -> [Polarity] -> tcm ()
-setPolarity q pol = liftTCM $ do
+setPolarity :: QName -> [Polarity] -> TCM ()
+setPolarity q pol = do
   modifySignature setP
   where
     setP sig = sig { sigDefinitions = Map.adjust setPx q defs }
@@ -387,7 +507,7 @@
           _          -> d
 	defs	  = sigDefinitions sig
 
-getArgOccurrence :: MonadTCM tcm => QName -> Nat -> tcm Occurrence
+getArgOccurrence :: QName -> Nat -> TCM Occurrence
 getArgOccurrence d i = do
   def <- theDef <$> getConstInfo d
   return $ case def of
@@ -399,8 +519,8 @@
   where
     look i os = (os ++ repeat Negative) !! fromIntegral i
 
-setArgOccurrences :: MonadTCM tcm => QName -> [Occurrence] -> tcm ()
-setArgOccurrences d os = liftTCM $
+setArgOccurrences :: QName -> [Occurrence] -> TCM ()
+setArgOccurrences d os =
   modifySignature setO
   where
     setO sig = sig { sigDefinitions = Map.adjust setOx d defs }
@@ -416,7 +536,7 @@
 
 -- | Look up the number of free variables of a section. This is equal to the
 --   number of parameters if we're currently inside the section and 0 otherwise.
-getSecFreeVars :: MonadTCM tcm => ModuleName -> tcm Nat
+getSecFreeVars :: ModuleName -> TCM Nat
 getSecFreeVars m = do
   sig  <- sigSections <$> getSignature
   isig <- sigSections <$> getImportedSignature
@@ -427,23 +547,23 @@
 
 -- | Compute the number of free variables of a module. This is the sum of
 --   the free variables of its sections.
-getModuleFreeVars :: MonadTCM tcm => ModuleName -> tcm Nat
+getModuleFreeVars :: ModuleName -> TCM Nat
 getModuleFreeVars m = sum <$> ((:) <$> getAnonymousVariables m <*> mapM getSecFreeVars ms)
   where
     ms = map mnameFromList . inits . mnameToList $ m
 
 -- | Compute the number of free variables of a defined name. This is the sum of
 --   the free variables of the sections it's contained in.
-getDefFreeVars :: MonadTCM tcm => QName -> tcm Nat
+getDefFreeVars :: QName -> TCM Nat
 getDefFreeVars q = getModuleFreeVars (qnameModule q)
 
 -- | Compute the context variables to apply a definition to.
-freeVarsToApply :: MonadTCM tcm => QName -> tcm Args
+freeVarsToApply :: QName -> TCM Args
 freeVarsToApply x = genericTake <$> getDefFreeVars x <*> getContextArgs
 
 -- | Instantiate a closed definition with the correct part of the current
 --   context.
-instantiateDef :: MonadTCM tcm => Definition -> tcm Definition
+instantiateDef :: Definition -> TCM Definition
 instantiateDef d = do
   vs  <- freeVarsToApply $ defName d
   verboseS "tc.sig.inst" 30 $ do
@@ -458,27 +578,27 @@
 makeAbstract d = do def <- makeAbs $ theDef d
 		    return d { theDef = def }
     where
-	makeAbs Datatype   {dataAbstr = AbstractDef} = Just $ Axiom Nothing Nothing
-	makeAbs Function   {funAbstr  = AbstractDef} = Just $ Axiom Nothing Nothing
+	makeAbs Datatype   {dataAbstr = AbstractDef} = Just Axiom
+	makeAbs Function   {funAbstr  = AbstractDef} = Just Axiom
 	makeAbs Constructor{conAbstr  = AbstractDef} = Nothing
 	makeAbs d                                    = Just d
 
 -- | Enter abstract mode. Abstract definition in the current module are transparent.
-inAbstractMode :: MonadTCM tcm => tcm a -> tcm a
+inAbstractMode :: TCM a -> TCM a
 inAbstractMode = local $ \e -> e { envAbstractMode = AbstractMode }
 
 -- | Not in abstract mode. All abstract definitions are opaque.
-inConcreteMode :: MonadTCM tcm => tcm a -> tcm a
+inConcreteMode :: TCM a -> TCM a
 inConcreteMode = local $ \e -> e { envAbstractMode = ConcreteMode }
 
 -- | Ignore abstract mode. All abstract definitions are transparent.
-ignoreAbstractMode :: MonadTCM tcm => tcm a -> tcm a
+ignoreAbstractMode :: TCM a -> TCM a
 ignoreAbstractMode = local $ \e -> e { envAbstractMode = IgnoreAbstractMode }
 
 -- | Check whether a name might have to be treated abstractly (either if we're
 --   'inAbstractMode' or it's not a local name). Returns true for things not
 --   declared abstract as well, but for those 'makeAbstract' will have no effect.
-treatAbstractly :: MonadTCM tcm => QName -> tcm Bool
+treatAbstractly :: QName -> TCM Bool
 treatAbstractly q = treatAbstractly' q <$> ask
 
 treatAbstractly' :: QName -> TCEnv -> Bool
@@ -491,15 +611,15 @@
     m	    = qnameModule q
 
 -- | get type of a constant
-typeOfConst :: MonadTCM tcm => QName -> tcm Type
+typeOfConst :: QName -> TCM Type
 typeOfConst q = defType <$> (instantiateDef =<< getConstInfo q)
 
 -- | get relevance of a constant
-relOfConst :: MonadTCM tcm => QName -> tcm Relevance
+relOfConst :: QName -> TCM Relevance
 relOfConst q = defRelevance <$> getConstInfo q
 
 -- | The name must be a datatype.
-sortOfConst :: MonadTCM tcm => QName -> tcm Sort
+sortOfConst :: QName -> TCM Sort
 sortOfConst q =
     do	d <- theDef <$> getConstInfo q
 	case d of
@@ -507,7 +627,7 @@
 	    _			   -> fail $ "Expected " ++ show q ++ " to be a datatype."
 
 -- | Is it the name of a record projection?
-isProjection :: MonadTCM tcm => QName -> tcm (Maybe Int)
+isProjection :: QName -> TCM (Maybe (QName, Int))
 isProjection qn = do
   def <- theDef <$> getConstInfo qn
   case def of
diff --git a/src/full/Agda/TypeChecking/Monad/SizedTypes.hs b/src/full/Agda/TypeChecking/Monad/SizedTypes.hs
--- a/src/full/Agda/TypeChecking/Monad/SizedTypes.hs
+++ b/src/full/Agda/TypeChecking/Monad/SizedTypes.hs
@@ -1,6 +1,7 @@
 
 module Agda.TypeChecking.Monad.SizedTypes where
 
+import Control.Applicative
 import Control.Monad.Error
 
 import Agda.Interaction.Options
@@ -13,7 +14,12 @@
 import Agda.Utils.Monad
 
 -- | Check if a type is the 'primSize' type. The argument should be 'reduce'd.
-isSizeType :: MonadTCM tcm => Type -> tcm Bool
+
+isSizeType :: Type -> TCM Bool
+isSizeType v = isSizeTypeTest <*> pure v
+
+{- ORIGINAL CODE
+isSizeType :: Type -> TCM Bool
 isSizeType (El _ v) = liftTCM $
   ifM (not . optSizedTypes <$> pragmaOptions) (return False) $
   case v of
@@ -22,11 +28,26 @@
       return $ x == size
     _ -> return False
   `catchError` \_ -> return False
+-}
 
-sizeType :: MonadTCM tcm => tcm Type
+isSizeNameTest :: TCM (QName -> Bool)
+isSizeNameTest = liftTCM $
+  ifM (not . optSizedTypes <$> pragmaOptions) (return $ const False) $ do
+    Def size [] <- primSize
+    return (size ==)
+  `catchError` \_ -> return $ const False
+
+isSizeTypeTest :: TCM (Type -> Bool)
+isSizeTypeTest = do
+  testName <- isSizeNameTest
+  let testType (El _ (Def d [])) = testName d
+      testType _                 = False
+  return testType
+
+sizeType :: TCM Type
 sizeType = El (mkType 0) <$> primSize
 
-sizeSuc :: MonadTCM tcm => tcm (Maybe QName)
+sizeSuc :: TCM (Maybe QName)
 sizeSuc = liftTCM $
   ifM (not . optSizedTypes <$> pragmaOptions) (return Nothing) $ do
     Def x [] <- primSizeSuc
@@ -38,7 +59,7 @@
 
 -- | Compute the size view of a term. The argument should be 'reduce'd.
 --   Precondition: sized types are enabled.
-sizeView :: MonadTCM tcm => Term -> tcm SizeView
+sizeView :: Term -> TCM SizeView
 sizeView v = do
   Def inf [] <- primSizeInf
   Def suc [] <- primSizeSuc
@@ -48,7 +69,7 @@
     _                    -> return $ OtherSize v
 
 -- | Turn a size view into a term.
-unSizeView :: MonadTCM tcm => SizeView -> tcm Term
+unSizeView :: SizeView -> TCM Term
 unSizeView SizeInf       = primSizeInf
 unSizeView (SizeSuc v)   = flip apply [Arg NotHidden Relevant v] <$> primSizeSuc
 unSizeView (OtherSize v) = return v
diff --git a/src/full/Agda/TypeChecking/Monad/State.hs b/src/full/Agda/TypeChecking/Monad/State.hs
--- a/src/full/Agda/TypeChecking/Monad/State.hs
+++ b/src/full/Agda/TypeChecking/Monad/State.hs
@@ -4,6 +4,7 @@
 import Control.Applicative
 import Control.Monad.State
 import Data.Set (Set)
+import Data.Map
 import qualified Data.Set as Set
 
 import Agda.Syntax.Common
@@ -15,30 +16,45 @@
 
 import Agda.Utils.Hash
 
--- | Resets the type checking state. The persistent command line
--- options are preserved.
+-- | Resets the non-persistent part of the type checking state.
 
-resetState :: MonadTCM tcm => tcm ()
-resetState = liftTCM $ do
-    opts <- stPersistentOptions <$> get
-    put $ initState { stPersistentOptions = opts }
+resetState :: TCM ()
+resetState = do
+    pers <- stPersistent <$> get
+    put $ initState { stPersistent = pers }
 
+-- | Resets all of the type checking state.
+
+resetAllState :: TCM ()
+resetAllState = put initState
+
 -- | Set the current scope.
-setScope :: MonadTCM tcm => ScopeInfo -> tcm ()
-setScope scope = liftTCM $ modify $ \s -> s { stScope = scope }
+setScope :: ScopeInfo -> TCM ()
+setScope scope = modify $ \s -> s { stScope = scope }
 
 -- | Get the current scope.
-getScope :: MonadTCM tcm => tcm ScopeInfo
-getScope = liftTCM $ gets stScope
+getScope :: TCM ScopeInfo
+getScope = gets stScope
 
+-- | Sets stExtLambdaTele .
+setExtLambdaTele :: Map QName (Int , Int) -> TCM ()
+setExtLambdaTele tele = modify $ \s -> s { stExtLambdaTele = tele }
+
+-- | Get stExtLambdaTele.
+getExtLambdaTele :: TCM (Map QName (Int , Int))
+getExtLambdaTele = gets stExtLambdaTele
+
+addExtLambdaTele :: QName -> (Int , Int) -> TCM ()
+addExtLambdaTele id x = getExtLambdaTele >>= setExtLambdaTele . (insert id x)
+
 -- | Modify the current scope.
-modifyScope :: MonadTCM tcm => (ScopeInfo -> ScopeInfo) -> tcm ()
+modifyScope :: (ScopeInfo -> ScopeInfo) -> TCM ()
 modifyScope f = do
   s <- getScope
   setScope $ f s
 
 -- | Run a computation in a local scope.
-withScope :: MonadTCM tcm => ScopeInfo -> tcm a -> tcm (a, ScopeInfo)
+withScope :: ScopeInfo -> TCM a -> TCM (a, ScopeInfo)
 withScope s m = do
   s' <- getScope
   setScope s
@@ -48,11 +64,11 @@
   return (x, s'')
 
 -- | Same as 'withScope', but discard the scope from the computation.
-withScope_ :: MonadTCM tcm => ScopeInfo -> tcm a -> tcm a
+withScope_ :: ScopeInfo -> TCM a -> TCM a
 withScope_ s m = fst <$> withScope s m
 
 -- | Discard any changes to the scope by a computation.
-localScope :: MonadTCM tcm => tcm a -> tcm a
+localScope :: TCM a -> TCM a
 localScope m = do
   scope <- getScope
   x <- m
@@ -61,7 +77,11 @@
 
 -- | Set the top-level module. This affects the global module id of freshly
 --   generated names.
-setTopLevelModule :: MonadTCM tcm => C.QName -> tcm ()
+
+-- TODO: Is the hash-function collision-free? If not, then the
+-- implementation of 'setTopLevelModule' should be changed.
+
+setTopLevelModule :: C.QName -> TCM ()
 setTopLevelModule x =
   modify $ \s -> s
     { stFreshThings = (stFreshThings s)
@@ -71,7 +91,7 @@
 
 -- | Use a different top-level module for a computation. Used when generating
 --   names for imported modules.
-withTopLevelModule :: MonadTCM tcm => C.QName -> tcm a -> tcm a
+withTopLevelModule :: C.QName -> TCM a -> TCM a
 withTopLevelModule x m = do
   next <- gets $ fName . stFreshThings
   setTopLevelModule x
@@ -80,10 +100,10 @@
   return y
 
 -- | Tell the compiler to import the given Haskell module.
-addHaskellImport :: MonadTCM tcm => String -> tcm ()
+addHaskellImport :: String -> TCM ()
 addHaskellImport i =
   modify $ \s -> s { stHaskellImports = Set.insert i $ stHaskellImports s }
 
 -- | Get the Haskell imports.
-getHaskellImports :: MonadTCM tcm => tcm (Set String)
+getHaskellImports :: TCM (Set String)
 getHaskellImports = gets stHaskellImports
diff --git a/src/full/Agda/TypeChecking/Monad/Statistics.hs b/src/full/Agda/TypeChecking/Monad/Statistics.hs
--- a/src/full/Agda/TypeChecking/Monad/Statistics.hs
+++ b/src/full/Agda/TypeChecking/Monad/Statistics.hs
@@ -1,7 +1,6 @@
 
 module Agda.TypeChecking.Monad.Statistics
-    ( tick
-    , getStatistics
+    ( tick, tickN, tickMax, getStatistics
     ) where
 
 import Control.Monad.State
@@ -10,13 +9,22 @@
 import Agda.TypeChecking.Monad.Base
 
 tick :: String -> TCM ()
-tick x = modify $ \s ->
-  let st' = inc $ stStatistics s in
+tick x = tickN x 1
+
+tickN :: String -> Integer -> TCM ()
+tickN s n = tick' s (n +)
+
+tick' :: String -> (Integer -> Integer) -> TCM ()
+tick' x f = modify $ \s ->
+  let st' = upd $ stStatistics s in
   force st' `seq` s { stStatistics = st' }
   where
     -- We need to be strict in the map
     force m = sum (Map.elems m)
-    inc = Map.insertWith (\_ n -> n + 1) x 1
+    upd = Map.insertWith (\_ m -> f m) x (f 0)
+
+tickMax :: String -> Integer -> TCM ()
+tickMax s n = tick' s (max n)
 
 getStatistics :: TCM Statistics
 getStatistics = gets stStatistics
diff --git a/src/full/Agda/TypeChecking/Monad/Trace.hs b/src/full/Agda/TypeChecking/Monad/Trace.hs
--- a/src/full/Agda/TypeChecking/Monad/Trace.hs
+++ b/src/full/Agda/TypeChecking/Monad/Trace.hs
@@ -21,31 +21,35 @@
     _			      -> True
 
 -- | Record a function call in the trace.
+{-# SPECIALIZE traceCall :: (Maybe r -> Call) -> TCM a -> TCM a #-}
 traceCall :: MonadTCM tcm => (Maybe r -> Call) -> tcm a -> tcm a
 traceCall mkCall m = do
   let call = mkCall Nothing
       r | getRange call /= noRange = const $ getRange call
         | otherwise                = id
-  cl <- buildClosure call
+  cl <- liftTCM $ buildClosure call
   let trace | interestingCall cl = local $ \e -> e { envRange = r (envRange e)
                                                    , envCall  = Just cl }
             | otherwise          = local $ \e -> e { envRange = r (envRange e) }
   trace m
 
+{-# SPECIALIZE traceCall_ :: (Maybe () -> Call) -> TCM r -> TCM r #-}
 traceCall_ :: MonadTCM tcm => (Maybe () -> Call) -> tcm r -> tcm r
 traceCall_ mkCall = traceCall (mkCall . fmap (const ()))
 
+{-# SPECIALIZE traceCallCPS :: (Maybe r -> Call) -> (r -> TCM a) -> ((r -> TCM a) -> TCM b) -> TCM b #-}
 traceCallCPS :: MonadTCM tcm => (Maybe r -> Call) -> (r -> tcm a) -> ((r -> tcm a) -> tcm b) -> tcm b
 traceCallCPS mkCall ret cc = traceCall mkCall (cc ret)
 
+{-# SPECIALIZE traceCallCPS_ :: (Maybe () -> Call) -> TCM a -> (TCM a -> TCM b) -> TCM b #-}
 traceCallCPS_ :: MonadTCM tcm => (Maybe () -> Call) -> tcm a -> (tcm a -> tcm b) -> tcm b
 traceCallCPS_ mkCall ret cc =
     traceCallCPS mkCall (const ret) (\k -> cc $ k ())
 
-getCurrentRange :: MonadTCM tcm => tcm Range
+getCurrentRange :: TCM Range
 getCurrentRange = envRange <$> ask
 
-setCurrentRange :: MonadTCM tcm => Range -> tcm a -> tcm a
+setCurrentRange :: Range -> TCM a -> TCM a
 setCurrentRange r
   | r == noRange = id
   | otherwise    = traceCall (SetRange r)
diff --git a/src/full/Agda/TypeChecking/Patterns/Match.hs b/src/full/Agda/TypeChecking/Patterns/Match.hs
--- a/src/full/Agda/TypeChecking/Patterns/Match.hs
+++ b/src/full/Agda/TypeChecking/Patterns/Match.hs
@@ -41,7 +41,7 @@
     -- equivalence to case-trees.
     DontKnow m `mappend` _		  = DontKnow m
 
-matchPatterns :: MonadTCM tcm => [Arg Pattern] -> [Arg Term] -> tcm (Match, [Arg Term])
+matchPatterns :: [Arg Pattern] -> [Arg Term] -> TCM (Match, [Arg Term])
 matchPatterns ps vs = do
     reportSDoc "tc.match" 50 $
       vcat [ text "matchPatterns"
@@ -52,7 +52,7 @@
     (ms,vs) <- unzip <$> zipWithM' matchPattern ps vs
     return (mconcat ms, vs)
 
-matchPattern :: MonadTCM tcm => Arg Pattern -> Arg Term -> tcm (Match, Arg Term)
+matchPattern :: Arg Pattern -> Arg Term -> TCM (Match, Arg Term)
 matchPattern (Arg h' _  (VarP _)) arg@(Arg _ _ v) = return (Yes [v], arg)
 matchPattern (Arg _  _  (DotP _)) arg@(Arg _ _ v) = return (Yes [v], arg)
 matchPattern (Arg h' r' (LitP l)) arg@(Arg h r v) = do
@@ -71,7 +71,7 @@
           -- something irrelevant will just continue matching against
           -- irrelevant stuff
 		(m, vs) <- matchPatterns ps $
-                  repeat $ Arg NotHidden Irrelevant $ Sort Prop
+                  repeat $ Arg NotHidden Irrelevant $ DontCare __IMPOSSIBLE__
 		return (m, Arg h Irrelevant $ Con c vs)
 
 matchPattern (Arg h' r' (ConP c _ ps))     (Arg h r v) =
diff --git a/src/full/Agda/TypeChecking/Patterns/Match.hs-boot b/src/full/Agda/TypeChecking/Patterns/Match.hs-boot
--- a/src/full/Agda/TypeChecking/Patterns/Match.hs-boot
+++ b/src/full/Agda/TypeChecking/Patterns/Match.hs-boot
@@ -7,5 +7,4 @@
 
 data Match = Yes [Term] | No | DontKnow (Maybe MetaId)
 
-matchPatterns :: MonadTCM tcm => [Arg Pattern] -> [Arg Term] -> tcm (Match, [Arg Term])
-
+matchPatterns :: [Arg Pattern] -> [Arg Term] -> TCM (Match, [Arg Term])
diff --git a/src/full/Agda/TypeChecking/Polarity.hs b/src/full/Agda/TypeChecking/Polarity.hs
--- a/src/full/Agda/TypeChecking/Polarity.hs
+++ b/src/full/Agda/TypeChecking/Polarity.hs
@@ -27,7 +27,7 @@
   def <- theDef <$> getConstInfo x
   case def of
     Axiom{}                                 -> return 0
-    Function{ funClauses = c : _ }          -> return $ genericLength (clausePats $ translatedClause c)
+    Function{ funClauses = c : _ }          -> return $ genericLength (clausePats c)
     Function{ funClauses = [] }             -> return 0
     Datatype{ dataPars = np, dataIxs = ni } -> return np
     Record{ recPars = n }                   -> return n
@@ -136,7 +136,8 @@
   polarities i = polarities i . unArg
 
 instance HasPolarity a => HasPolarity (Abs a) where
-  polarities i = polarities (i + 1) . absBody
+  polarities i (Abs   _ b) = polarities (i + 1) b
+  polarities i (NoAbs _ v) = polarities i v
 
 instance HasPolarity a => HasPolarity [a] where
   polarities i xs = concat <$> mapM (polarities i) xs
@@ -153,13 +154,27 @@
               | otherwise -> polarities i ts
     Lam _ t    -> polarities i t
     Lit _      -> return []
+    Level l    -> polarities i l
     Def x ts   -> do
       pols <- getPolarity x
       let compose p ps = map (composePol p) ps
       concat . zipWith compose (pols ++ repeat Invariant) <$> mapM (polarities i) ts
     Con _ ts   -> polarities i ts
     Pi a b     -> (++) <$> (map neg <$> polarities i a) <*> polarities i b
-    Fun a b    -> (++) <$> (map neg <$> polarities i a) <*> polarities i b
     Sort _     -> return []
     MetaV _ ts -> map (const Invariant) <$> polarities i ts
-    DontCare   -> return []
+    DontCare _ -> return []
+
+instance HasPolarity Level where
+  polarities i (Max as) = polarities i as
+
+instance HasPolarity PlusLevel where
+  polarities i ClosedLevel{} = return []
+  polarities i (Plus _ l) = polarities i l
+
+instance HasPolarity LevelAtom where
+  polarities i l = case l of
+    MetaLevel _ vs   -> map (const Invariant) <$> polarities i l
+    BlockedLevel _ v -> polarities i v
+    NeutralLevel v   -> polarities i v
+    UnreducedLevel v -> polarities i v
diff --git a/src/full/Agda/TypeChecking/Polarity.hs-boot b/src/full/Agda/TypeChecking/Polarity.hs-boot
--- a/src/full/Agda/TypeChecking/Polarity.hs-boot
+++ b/src/full/Agda/TypeChecking/Polarity.hs-boot
@@ -5,4 +5,3 @@
 import Agda.TypeChecking.Monad.Base
 
 computePolarity :: QName -> TCM ()
-
diff --git a/src/full/Agda/TypeChecking/Positivity.hs b/src/full/Agda/TypeChecking/Positivity.hs
--- a/src/full/Agda/TypeChecking/Positivity.hs
+++ b/src/full/Agda/TypeChecking/Positivity.hs
@@ -35,6 +35,7 @@
   qs <- lookupMutualBlock mi
   reportSDoc "tc.pos.tick" 100 $ text "positivity of" <+> prettyTCM (Set.toList qs)
   g  <- buildOccurrenceGraph qs
+  let gstar = Graph.transitiveClosure $ fmap occ g
   reportSDoc "tc.pos.tick" 100 $ text "constructed graph"
   reportSLn "tc.pos.graph" 5 $ "Positivity graph: N=" ++ show (size $ Graph.nodes g) ++
                                " E=" ++ show (length $ Graph.edges g)
@@ -42,7 +43,7 @@
     [ text "positivity graph for" <+> prettyTCM (Set.toList qs)
     , nest 2 $ prettyGraph g
     ]
-  mapM_ (setArgs g) $ Set.toList qs
+  mapM_ (setArgs gstar) $ Set.toList qs
   reportSDoc "tc.pos.tick" 100 $ text "set args"
   whenM positivityCheckEnabled $
     mapM_ (checkPos g) $ Set.toList qs
@@ -60,6 +61,7 @@
             [prettyTCM how]
           setCurrentRange (getRange q) $ typeError $ GenericError (show err)
 
+    occ (Edge o _) = o
     isNegative (Edge o _) = o == Negative
 
     isDatatype q = do
@@ -69,25 +71,18 @@
         Record  {recClause  = Nothing} -> True
         _ -> False
 
-    getArity q = do
-      def <- theDef <$> getConstInfo q
-      return $ case def of
-        Function{ funClauses = c : _ } -> size $ clausePats $ translatedClause c
-        Datatype{ dataPars = n }       -> n
-        Record{ recPars = n }          -> n
-        _                              -> 0
-
     -- Set the polarity of the arguments to a definition
     setArgs g q = do
       reportSDoc "tc.pos.args" 5 $ text "checking args of" <+> prettyTCM q
-      n <- getArity q
+      n <- getDefArity =<< getConstInfo q
       let nArgs = maximum $ n :
                     [ i + 1 | (ArgNode q1 i) <- Set.toList $ Graph.nodes g
                     , q1 == q ]
-          findOcc i = case Graph.allPaths isNegative (ArgNode q i) (DefNode q) g of
-            []                     -> Unused -- Unused is not good for datatypes (why not? let's do it anyway!)
-            es | any isNegative es -> Negative
-               | otherwise         -> Positive
+          findOcc i = case Graph.lookup (ArgNode q i) (DefNode q) g of
+              Nothing -> Unused
+              Just Negative -> Negative
+              Just Positive -> Positive
+              Just Unused   -> Unused
           args = map findOcc [0..nArgs - 1]
       reportSDoc "tc.pos.args" 10 $ sep
         [ text "args of" <+> prettyTCM q <+> text "="
@@ -95,6 +90,14 @@
         ]
       setArgOccurrences q args
 
+getDefArity def = case theDef def of
+  Function{ funClauses = cs, funProjection = proj } -> do
+    let dropped = maybe 0 (fromIntegral . subtract 1 . snd) proj
+    subtract dropped . arity <$> instantiateFull (defType def)
+  Datatype{ dataPars = n } -> return n
+  Record{ recPars = n }    -> return n
+  _                        -> return 0
+
 -- Specification of occurrences -------------------------------------------
 
 instance SemiRing Occurrence where
@@ -229,16 +232,12 @@
 
 instance ComputeOccurrences Clause where
   occurrences vars (Clause{ clausePats = ps, clauseBody = body }) =
-    -- We don't treat pattern matching as something dangerous
-    -- concatOccurs (zipWith match [0..] ps) >+<
     walk vars (patItems ps) body
     where
       walk _    _         NoBody     = Map.empty
       walk vars []        (Body v)   = occurrences vars v
       walk vars (i : pis) (Bind b)   = walk (i : vars) pis $ absBody b
-      walk vars (_ : pis) (NoBind b) = walk vars pis b
       walk _    []        Bind{}     = __IMPOSSIBLE__
-      walk _    []        NoBind{}   = __IMPOSSIBLE__
       walk _    (_ : _)   Body{}     = __IMPOSSIBLE__
 
       match i (Arg _ _ VarP{}) = Map.empty
@@ -246,7 +245,9 @@
 
       patItems ps = concat $ zipWith patItem [0..] $ map unArg ps
       patItem i (VarP _) = [Just (AnArg i)]
-      patItem i p        = replicate (nVars p) (Just (AnArg i)) -- Nothing
+      patItem i p        = replicate (nVars p) (Just (AnArg i))
+        -- if we're pattern matching it's not something the positivity checker needs to worry about
+        -- Actually it is: see issue 464
 
       nVars p = case p of
         VarP{}      -> 1
@@ -257,7 +258,7 @@
 instance ComputeOccurrences Term where
   occurrences vars v = case v of
     Var i args ->
-      maybe Map.empty here (vars ! fromIntegral i)
+      maybe Map.empty here (index vars $ fromIntegral i)
       >+< occursAs VarArg (occurrences vars args)
     Def d args   ->
       here (ADef d) >+<
@@ -266,19 +267,32 @@
     MetaV _ args -> occursAs MetaArg $ occurrences vars args
     Pi a b       -> occursAs LeftOfArrow (occurrences vars a) >+<
                     occurrences vars b
-    Fun a b      -> occursAs LeftOfArrow (occurrences vars a) >+<
-                    occurrences vars b
     Lam _ b      -> occurrences vars b
+    Level l      -> occurrences vars l
     Lit{}        -> Map.empty
     Sort{}       -> Map.empty
-    DontCare     -> Map.empty
+    DontCare _   -> Map.empty -- Andreas, 2011-09-09: do we need to check for negative occurrences in irrelevant positions?
     where
       -- Apparently some development version of GHC chokes if the
       -- following line is replaced by vs ! i.
-      (!) vs i
+      index vs i
         | i < length vs = vs !! i
-        | otherwise     = error $ show vs ++ " ! " ++ show i ++ "  (" ++ show v ++ ")"
+        | otherwise     = __IMPOSSIBLE__
 
+instance ComputeOccurrences Level where
+  occurrences vars (Max as) = occurrences vars as
+
+instance ComputeOccurrences PlusLevel where
+  occurrences vars ClosedLevel{} = Map.empty
+  occurrences vars (Plus _ l) = occurrences vars l
+
+instance ComputeOccurrences LevelAtom where
+  occurrences vars l = case l of
+    MetaLevel _ vs   -> occursAs MetaArg $ occurrences vars vs
+    BlockedLevel _ v -> occurrences vars v
+    NeutralLevel v   -> occurrences vars v
+    UnreducedLevel v -> occurrences vars v
+
 instance ComputeOccurrences Type where
   occurrences vars (El _ v) = occurrences vars v
 
@@ -287,7 +301,8 @@
   occurrences vars (ExtendTel a b) = occurrences vars (a, b)
 
 instance ComputeOccurrences a => ComputeOccurrences (Abs a) where
-  occurrences vars = occurrences (Nothing : vars) . absBody
+  occurrences vars (Abs   _ b) = occurrences (Nothing : vars) b
+  occurrences vars (NoAbs _ b) = occurrences vars b
 
 instance ComputeOccurrences a => ComputeOccurrences (Arg a) where
   occurrences vars = occurrences vars . unArg
@@ -304,9 +319,8 @@
   def <- getConstInfo q
   occursAs (InDefOf q) <$> case theDef def of
     Function{funClauses = cs} -> do
-      n  <- arity <$> instantiateFull (defType def)
-      cs <- map (etaExpandClause n) <$>
-              instantiateFull (map translatedClause cs)
+      n  <- getDefArity def
+      cs <- map (etaExpandClause n) <$> instantiateFull cs
       return
         $ concatOccurs
         $ zipWith (occursAs . InClause) [0..]
@@ -350,7 +364,6 @@
     vars = reverse [ defaultArg $ Var i [] | i <- [0..m - 1] ]
 
     liftBody m (Bind b)   = Bind $ fmap (liftBody m) b
-    liftBody m (NoBind b) = NoBind $ liftBody m b
     liftBody m NoBody     = bind m NoBody
     liftBody m (Body v)   = bind m $ Body $ raise m v `apply` vars
 
diff --git a/src/full/Agda/TypeChecking/Pretty.hs b/src/full/Agda/TypeChecking/Pretty.hs
--- a/src/full/Agda/TypeChecking/Pretty.hs
+++ b/src/full/Agda/TypeChecking/Pretty.hs
@@ -1,4 +1,5 @@
-{-# LANGUAGE CPP, TypeSynonymInstances, UndecidableInstances #-}
+{-# LANGUAGE CPP, TypeSynonymInstances, FlexibleInstances,
+             UndecidableInstances #-}
 module Agda.TypeChecking.Pretty where
 
 import Control.Applicative hiding (empty)
@@ -13,6 +14,7 @@
 import qualified Agda.Syntax.Concrete.Pretty as P
 
 import Agda.TypeChecking.Monad
+import Agda.TypeChecking.Eliminators
 
 import qualified Agda.Utils.Pretty as P
 import Agda.Utils.Impossible
@@ -25,24 +27,28 @@
 
 type Doc = P.Doc
 
-empty, comma :: MonadTCM tcm => tcm Doc
+empty, comma :: TCM Doc
 
 empty	   = return P.empty
 comma	   = return P.comma
 pretty x   = return $ P.pretty x
 prettyA x  = P.prettyA x
+text :: String -> TCM Doc
 text s	   = return $ P.text s
 pwords s   = map return $ P.pwords s
 fwords s   = return $ P.fwords s
+sep, fsep, hsep, vcat :: [TCM Doc] -> TCM Doc
 sep ds	   = P.sep <$> sequence ds
 fsep ds    = P.fsep <$> sequence ds
 hsep ds    = P.hsep <$> sequence ds
 vcat ds    = P.vcat <$> sequence ds
+($$), (<>), (<+>) :: TCM Doc -> TCM Doc -> TCM Doc
 d1 $$ d2   = (P.$$) <$> d1 <*> d2
 d1 <> d2   = (P.<>) <$> d1 <*> d2
 d1 <+> d2  = (P.<+>) <$> d1 <*> d2
 nest n d   = P.nest n <$> d
 braces d   = P.braces <$> d
+dbraces d  = P.dbraces <$> d
 brackets d = P.brackets <$> d
 parens d   = P.parens <$> d
 
@@ -58,7 +64,7 @@
 ---------------------------------------------------------------------------
 
 class PrettyTCM a where
-    prettyTCM :: MonadTCM tcm => a -> tcm Doc
+    prettyTCM :: a -> TCM Doc
 
 instance PrettyTCM a => PrettyTCM (Closure a) where
     prettyTCM cl = enterClosure cl prettyTCM
@@ -71,6 +77,7 @@
 instance PrettyTCM Sort where prettyTCM x = prettyA =<< reify x
 instance PrettyTCM DisplayTerm where prettyTCM x = prettyA =<< reify x
 instance PrettyTCM NamedClause where prettyTCM x = prettyA =<< reify x
+instance PrettyTCM Level where prettyTCM x = prettyA =<< reify (Level x)
 
 instance PrettyTCM ClauseBody where
   prettyTCM b = do
@@ -79,16 +86,13 @@
     where
       walk NoBody = return ([], P.text "()")
       walk (Body v) = (,) [] <$> prettyTCM v
-      walk (NoBind b) = do
-        (bs, v) <- walk b
-        return (text "." : bs, v)
       walk (Bind b) = do
         (bs, v) <- underAbstraction_ b walk
         return (text (absName b) : bs, v)
 
 instance (PrettyTCM a, PrettyTCM b) => PrettyTCM (Judgement a b) where
   prettyTCM (HasType a t) = prettyTCM a <+> text ":" <+> prettyTCM t
-  prettyTCM (IsSort a)    = text "Sort" <+> prettyTCM a
+  prettyTCM (IsSort  a t) = text "Sort" <+> prettyTCM a <+> text ":" <+> prettyTCM t
 
 instance PrettyTCM MetaId where
   prettyTCM = text . show
@@ -100,11 +104,16 @@
 instance (Reify a e, ToConcrete e c, P.Pretty c) => PrettyTCM (Arg a) where
     prettyTCM x = prettyA =<< reify x
 
+instance PrettyTCM Elim where
+  prettyTCM (Apply v) = text "$" <+> prettyTCM v
+  prettyTCM (Proj f)  = text "." <> prettyTCM f
+
 instance PrettyTCM A.Expr where
     prettyTCM = prettyA
 
 instance PrettyTCM Relevance where
   prettyTCM Irrelevant = text "."
+  prettyTCM NonStrict  = text ".."
   prettyTCM Relevant   = empty
   prettyTCM Forced     = empty
 
@@ -112,6 +121,9 @@
   prettyTCM CmpEq  = text "=="
   prettyTCM CmpLeq = text "=<"
 
+instance PrettyTCM ProblemConstraint where
+  prettyTCM (PConstr pid c) = brackets (text $ show pid) <+> prettyTCM c
+
 instance PrettyTCM Constraint where
     prettyTCM c = case c of
 	ValueCmp cmp ty s t ->
@@ -120,15 +132,11 @@
 		      ]
 		, nest 2 $ text ":" <+> prettyTCM ty
 		]
-        ArgsCmp cmps t us vs ->
-          sep [ prettyList
-                [ sep [ prettyTCM u
-                      , nest 2 $ text "~~" <+> prettyTCM v
-                      , nest 2 $ text (show cmp)
-                      ] | (cmp, u, v) <- zip3 cmps us vs
-                ]
-              , nest 2 $ text ":" <+> prettyTCM t
-              ]
+        ElimCmp cmps t v us vs ->
+          sep [ sep [ prettyTCM us
+                    , nest 2 $ text "~~" <+> prettyTCM vs
+                    ]
+              , text ":" <+> prettyTCM t ]
 	LevelCmp cmp a b ->
 	    sep [ prettyTCM a
 		, prettyTCM cmp <+> prettyTCM b
@@ -137,17 +145,17 @@
 	    sep [ prettyTCM a
 		, prettyTCM cmp <+> prettyTCM b
 		]
-	TelCmp cmp a b ->
-	    sep [ prettyTCM a
-		, prettyTCM cmp <+> prettyTCM b
+	TelCmp a b cmp tela telb ->
+	    sep [ prettyTCM tela
+		, prettyTCM cmp <+> prettyTCM telb
 		]
 	SortCmp cmp s1 s2 ->
 	    sep [ prettyTCM s1
 		, prettyTCM cmp <+> prettyTCM s2
 		]
-	Guarded c cs ->
+	Guarded c pid ->
 	    sep [ prettyTCM c
-		, nest 2 $ brackets $ sep $ punctuate comma $ map prettyTCM cs
+		, nest 2 $ brackets $ text "blocked on problem" <+> text (show pid)
 		]
 	UnBlock m   -> do
 	    -- BlockedConst t <- mvInstantiation <$> lookupMeta m
@@ -159,13 +167,15 @@
                     ]
               PostponedTypeCheckingProblem cl -> enterClosure cl $ \(e, a, _) ->
                 sep [ text (show m) <+> text ":="
-                    , nest 2 $ sep [ prettyA e <+> text ":"
+                    , nest 2 $ sep [ prettyA e <+> text ":?"
                                    , prettyTCM a
                                    ]
                     ]
               Open{}  -> __IMPOSSIBLE__
+              OpenIFS{}  -> __IMPOSSIBLE__
               InstS{} -> __IMPOSSIBLE__
               InstV{} -> __IMPOSSIBLE__
+	FindInScope m   -> sep [ text $ "Find in scope " ++ (show m) ]
         IsEmpty t ->
             sep [ text "Is empty:", nest 2 $ prettyTCM t ]
 
@@ -201,11 +211,7 @@
             where
               par NotHidden = P.parens
               par Hidden    = P.braces
-{-
-              rel Irrelevant x = P.text "." P.<> x
-              rel Relevant x   = x
-              rel Forced   x   = x
--}
+              par Instance  = P.dbraces
 
 instance PrettyTCM Context where
   prettyTCM = prettyTCM . PrettyContext
diff --git a/src/full/Agda/TypeChecking/Pretty.hs-boot b/src/full/Agda/TypeChecking/Pretty.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/TypeChecking/Pretty.hs-boot
@@ -0,0 +1,26 @@
+module Agda.TypeChecking.Pretty where
+
+import Agda.Syntax.Common
+import Agda.Syntax.Internal
+import Agda.Syntax.Literal
+
+import Agda.TypeChecking.Monad
+import Agda.Utils.Pretty (Doc)
+import qualified Agda.Utils.Pretty as P
+
+text                  :: String             -> TCM Doc
+sep, fsep, hsep, vcat :: [TCM Doc]          -> TCM Doc
+($$), (<>), (<+>)     :: TCM Doc -> TCM Doc -> TCM Doc
+
+class PrettyTCM a where
+    prettyTCM :: a -> TCM Doc
+
+instance PrettyTCM a => PrettyTCM (Closure a) where
+instance PrettyTCM a => PrettyTCM [a] where
+
+instance PrettyTCM Name where
+instance PrettyTCM QName where
+instance PrettyTCM Term where
+instance PrettyTCM Type where
+instance PrettyTCM Sort where
+instance PrettyTCM DisplayTerm where
diff --git a/src/full/Agda/TypeChecking/Primitive.hs b/src/full/Agda/TypeChecking/Primitive.hs
--- a/src/full/Agda/TypeChecking/Primitive.hs
+++ b/src/full/Agda/TypeChecking/Primitive.hs
@@ -12,6 +12,8 @@
 import qualified Data.Map as Map
 import Data.Char
 
+import Agda.Interaction.Options
+
 import Agda.Syntax.Position
 import Agda.Syntax.Common hiding (Nat)
 import Agda.Syntax.Internal
@@ -25,9 +27,11 @@
 import Agda.TypeChecking.Reduce
 import Agda.TypeChecking.Substitute
 import Agda.TypeChecking.Errors
+import Agda.TypeChecking.Quote (quoteType, quotingKit)
 import Agda.TypeChecking.Pretty ()  -- instances only
 import {-# SOURCE #-} Agda.TypeChecking.Conversion
 import Agda.TypeChecking.Constraints
+import Agda.TypeChecking.Level
 
 import Agda.Utils.Monad
 import Agda.Utils.Pretty (pretty)
@@ -36,17 +40,20 @@
 import Agda.Utils.Impossible
 
 -- | Rewrite a literal to constructor form if possible.
-constructorForm :: MonadTCM tcm => Term -> tcm Term
+constructorForm :: Term -> TCM Term
 constructorForm v = case v of
-    Lit (LitInt r n)   -> cons primZero primSuc (LitInt r) n
-    Lit (LitLevel r n) -> cons primLevelZero primLevelSuc (LitLevel r) n
-    _                  -> return v
+-- Andreas, 2011-10-03, the following line restores IrrelevantLevel
+    DontCare v                  -> constructorForm v
+    Lit (LitInt r n)            -> cons primZero primSuc (Lit . LitInt r) n
+--     Level (Max [])              -> primLevelZero
+--     Level (Max [ClosedLevel n]) -> cons primLevelZero primLevelSuc (Level . Max . (:[]) . ClosedLevel) n
+    _                           -> return v
   where
     cons pZero pSuc lit n
       | n == 0  = pZero
       | n > 0   = do
         s <- pSuc
-        return $ s `apply` [defaultArg $ Lit $ lit $ n - 1]
+        return $ s `apply` [defaultArg $ lit $ n - 1]
       | otherwise	= return v
 
 ---------------------------------------------------------------------------
@@ -73,7 +80,7 @@
     show = show . unNat
 
 class PrimType a where
-    primType :: MonadTCM tcm => a -> tcm Type
+    primType :: a -> TCM Type
 
 instance (PrimType a, PrimType b) => PrimTerm (a -> b) where
     primTerm _ = unEl <$> (primType (undefined :: a) --> primType (undefined :: b))
@@ -81,7 +88,7 @@
 instance PrimTerm a => PrimType a where
     primType _ = el $ primTerm (undefined :: a)
 
-class	 PrimTerm a	  where primTerm :: MonadTCM tcm => a -> tcm Term
+class	 PrimTerm a	  where primTerm :: a -> TCM Term
 instance PrimTerm Integer where primTerm _ = primInteger
 instance PrimTerm Bool	  where primTerm _ = primBool
 instance PrimTerm Char	  where primTerm _ = primChar
@@ -90,6 +97,7 @@
 instance PrimTerm Nat	  where primTerm _ = primNat
 instance PrimTerm Lvl     where primTerm _ = primLevel
 instance PrimTerm QName   where primTerm _ = primQName
+instance PrimTerm Type    where primTerm _ = primAgdaType
 
 instance PrimTerm a => PrimTerm [a] where
     primTerm _ = list (primTerm (undefined :: a))
@@ -100,11 +108,11 @@
 -- From Agda term to Haskell value
 
 class ToTerm a where
-    toTerm :: MonadTCM tcm => tcm (a -> Term)
+    toTerm :: TCM (a -> Term)
 
 instance ToTerm Integer where toTerm = return $ Lit . LitInt noRange
 instance ToTerm Nat	where toTerm = return $ Lit . LitInt noRange . unNat
-instance ToTerm Lvl	where toTerm = return $ Lit . LitLevel noRange . unLvl
+instance ToTerm Lvl	where toTerm = return $ Level . Max . (:[]) . ClosedLevel . unLvl
 instance ToTerm Double  where toTerm = return $ Lit . LitFloat noRange
 instance ToTerm Char	where toTerm = return $ Lit . LitChar noRange
 instance ToTerm Str	where toTerm = return $ Lit . LitString noRange . unStr
@@ -116,9 +124,12 @@
 	false <- primFalse
 	return $ \b -> if b then true else false
 
+instance ToTerm Type where
+    toTerm = snd <$> quotingKit
+
 -- | @buildList A ts@ builds a list of type @List A@. Assumes that the terms
 --   @ts@ all have type @A@.
-buildList :: MonadTCM tcm => tcm ([Term] -> Term)
+buildList :: TCM ([Term] -> Term)
 buildList = do
     nil'  <- primNil
     cons' <- primCons
@@ -137,7 +148,7 @@
 type FromTermFunction a = Arg Term -> TCM (Reduced (MaybeReduced (Arg Term)) a)
 
 class FromTerm a where
-    fromTerm :: MonadTCM tcm => tcm (FromTermFunction a)
+    fromTerm :: TCM (FromTermFunction a)
 
 instance FromTerm Integer where
     fromTerm = fromLiteral $ \l -> case l of
@@ -150,9 +161,9 @@
 	_	   -> Nothing
 
 instance FromTerm Lvl where
-    fromTerm = fromLiteral $ \l -> case l of
-	LitLevel _ n -> Just $ Lvl n
-	_	     -> Nothing
+    fromTerm = fromReducedTerm $ \l -> case l of
+	Level (Max [ClosedLevel n]) -> Just $ Lvl n
+	_                           -> Nothing
 
 instance FromTerm Double where
     fromTerm = fromLiteral $ \l -> case l of
@@ -223,47 +234,121 @@
           _ -> return $ NoReduction (reduced b)
 
 -- | Conceptually: @redBind m f k = either (return . Left . f) k =<< m@
-redBind :: MonadTCM tcm => tcm (Reduced a a') -> (a -> b) ->
-	     (a' -> tcm (Reduced b b')) -> tcm (Reduced b b')
+redBind :: TCM (Reduced a a') -> (a -> b) ->
+	     (a' -> TCM (Reduced b b')) -> TCM (Reduced b b')
 redBind ma f k = do
     r <- ma
     case r of
 	NoReduction x	-> return $ NoReduction $ f x
 	YesReduction y	-> k y
 
-redReturn :: MonadTCM tcm => a -> tcm (Reduced a' a)
+redReturn :: a -> TCM (Reduced a' a)
 redReturn = return . YesReduction
 
-fromReducedTerm :: MonadTCM tcm => (Term -> Maybe a) -> tcm (FromTermFunction a)
+fromReducedTerm :: (Term -> Maybe a) -> TCM (FromTermFunction a)
 fromReducedTerm f = return $ \t -> do
     b <- reduceB t
     case f $ unArg (ignoreBlocking b) of
 	Just x	-> return $ YesReduction x
 	Nothing	-> return $ NoReduction (reduced b)
 
-fromLiteral :: MonadTCM tcm => (Literal -> Maybe a) -> tcm (FromTermFunction a)
+fromLiteral :: (Literal -> Maybe a) -> TCM (FromTermFunction a)
 fromLiteral f = fromReducedTerm $ \t -> case t of
     Lit lit -> f lit
     _	    -> Nothing
 
--- trustMe : {A : Set}{a b : A} -> a ≡ b
-primTrustMe :: MonadTCM tcm => tcm PrimitiveImpl
+-- trustMe : {a : Level} {A : Set a} {x y : A} -> x ≡ y
+primTrustMe :: TCM PrimitiveImpl
 primTrustMe = do
-  refl <- primRefl
-  t    <- hPi "A" tset $ hPi "a" (el $ var 0) $ hPi "b" (el $ var 1) $
-          el (primEquality <#> var 2 <@> var 1 <@> var 0)
-  return $ PrimImpl t $ PrimFun __IMPOSSIBLE__ 3 $ \ts ->
+  clo <- commandLineOptions
+  when (optSafe clo) (typeError SafeFlagPrimTrustMe)
+  t    <- hPi "a" (el primLevel) $
+          hPi "A" (return $ sort $ varSort 0) $
+          hPi "x" (El (varSort 1) <$> var 0) $
+          hPi "y" (El (varSort 2) <$> var 1) $
+          El (varSort 3) <$>
+            primEquality <#> var 3 <#> var 2 <@> var 1 <@> var 0
+  Con rf [] <- primRefl
+  n         <- conPars . theDef <$> getConstInfo rf
+  let refl x | n == 2    = Con rf [Arg Hidden Forced x]
+             | n == 3    = Con rf []
+             | otherwise = __IMPOSSIBLE__
+  return $ PrimImpl t $ PrimFun __IMPOSSIBLE__ 4 $ \ts ->
       case ts of
-        [t, a, b] -> liftTCM $ do
-              noConstraints $ equalTerm (El (mkType 0) $ unArg t) (unArg a) (unArg b)
-              rf <- return refl -- <#> return (unArg t) <#> return (unArg a)
-              redReturn rf
-            `catchError` \_ -> return (NoReduction $ map notReduced [t, a, b])
+        [a, t, x, y] -> liftTCM $ do
+              noConstraints $
+                equalTerm (El (Type $ lvlView $ unArg a) (unArg t))
+                          (unArg x) (unArg y)
+              redReturn (refl $ unArg x)
+            `catchError` \_ -> return (NoReduction $ map notReduced [a, t, x, y])
         _ -> __IMPOSSIBLE__
 
+primQNameType :: TCM PrimitiveImpl
+primQNameType = mkPrimFun1TCM (el primQName --> el primAgdaType) typeOfConst
+
+primQNameDefinition :: TCM PrimitiveImpl
+primQNameDefinition = do
+  let argQName qn = [defaultArg (Lit (LitQName noRange qn))]
+      app mt xs = do t <- mt
+                     return $ apply t xs
+
+      con qn Function{}    = app primAgdaDefinitionFunDef    (argQName qn)
+      con qn Datatype{}    = app primAgdaDefinitionDataDef   (argQName qn)
+      con qn Record{}      = app primAgdaDefinitionRecordDef (argQName qn)
+      con _  Axiom{}       = app primAgdaDefinitionPostulate []
+      con _  Primitive{}   = app primAgdaDefinitionPrimitive []
+      con _  Constructor{} = app primAgdaDefinitionDataConstructor []
+
+  unquoteQName <- fromTerm
+  t <- el primQName --> el primAgdaDefinition
+  return $ PrimImpl t $ PrimFun __IMPOSSIBLE__ 1 $ \ts ->
+    case ts of
+      [v] -> liftTCM $
+        redBind (unquoteQName v)
+            (\v' -> [v']) $ \x ->
+        redReturn =<< con x . theDef =<< getConstInfo x
+      _ -> __IMPOSSIBLE__
+
+primDataConstructors :: TCM PrimitiveImpl
+primDataConstructors = mkPrimFun1TCM (el primAgdaDataDef --> el (list primQName))
+                                     (fmap (dataCons . theDef) . getConstInfo)
+
+mkPrimLevelZero :: TCM PrimitiveImpl
+mkPrimLevelZero = do
+  t <- primType (undefined :: Lvl)
+  return $ PrimImpl t $ PrimFun __IMPOSSIBLE__ 0 $ \_ -> redReturn $ Level $ Max []
+
+mkPrimLevelSuc :: TCM PrimitiveImpl
+mkPrimLevelSuc = do
+  t <- primType (id :: Lvl -> Lvl)
+  return $ PrimImpl t $ PrimFun __IMPOSSIBLE__ 1 $ \ ~[a] -> liftTCM $ do
+    l <- levelView $ unArg a
+    redReturn $ Level $ levelSuc l
+
+mkPrimLevelMax :: TCM PrimitiveImpl
+mkPrimLevelMax = do
+  t <- primType (max :: Op Lvl)
+  return $ PrimImpl t $ PrimFun __IMPOSSIBLE__ 2 $ \ ~[a, b] -> liftTCM $ do
+    Max as <- levelView $ unArg a
+    Max bs <- levelView $ unArg b
+    redReturn $ Level $ levelMax $ as ++ bs
+
+mkPrimFun1TCM :: (FromTerm a, ToTerm b) => TCM Type -> (a -> TCM b) -> TCM PrimitiveImpl
+mkPrimFun1TCM mt f = do
+    toA   <- fromTerm
+    fromB <- toTerm
+    t     <- mt
+    return $ PrimImpl t $ PrimFun __IMPOSSIBLE__ 1 $ \ts ->
+      case ts of
+        [v] -> liftTCM $
+          redBind (toA v)
+              (\v' -> [v']) $ \x ->
+          redReturn . fromB =<< f x
+        _ -> __IMPOSSIBLE__
+
 -- Tying the knot
-mkPrimFun1 :: (MonadTCM tcm, PrimType a, PrimType b, FromTerm a, ToTerm b) =>
-	      (a -> b) -> tcm PrimitiveImpl
+mkPrimFun1 :: (PrimType a, PrimType b, FromTerm a, ToTerm b) =>
+	      (a -> b) -> TCM PrimitiveImpl
 mkPrimFun1 f = do
     toA   <- fromTerm
     fromB <- toTerm
@@ -276,8 +361,8 @@
           redReturn $ fromB $ f x
         _ -> __IMPOSSIBLE__
 
-mkPrimFun2 :: (MonadTCM tcm, PrimType a, PrimType b, PrimType c, FromTerm a, ToTerm a, FromTerm b, ToTerm c) =>
-	      (a -> b -> c) -> tcm PrimitiveImpl
+mkPrimFun2 :: (PrimType a, PrimType b, PrimType c, FromTerm a, ToTerm a, FromTerm b, ToTerm c) =>
+	      (a -> b -> c) -> TCM PrimitiveImpl
 mkPrimFun2 f = do
     toA   <- fromTerm
     fromA <- toTerm
@@ -295,13 +380,12 @@
           redReturn $ fromC $ f x y
         _ -> __IMPOSSIBLE__
 
-mkPrimFun4 :: ( MonadTCM tcm
-              , PrimType a, FromTerm a, ToTerm a
+mkPrimFun4 :: ( PrimType a, FromTerm a, ToTerm a
               , PrimType b, FromTerm b, ToTerm b
               , PrimType c, FromTerm c, ToTerm c
               , PrimType d, FromTerm d
               , PrimType e, ToTerm e) =>
-	      (a -> b -> c -> d -> e) -> tcm PrimitiveImpl
+	      (a -> b -> c -> d -> e) -> TCM PrimitiveImpl
 mkPrimFun4 f = do
     (toA, fromA) <- (,) <$> fromTerm <*> toTerm
     (toB, fromB) <- (,) <$> fromTerm <*> toTerm
@@ -334,48 +418,49 @@
 -- Type combinators
 infixr 4 -->
 
-(-->) :: MonadTCM tcm => tcm Type -> tcm Type -> tcm Type
+(-->) :: TCM Type -> TCM Type -> TCM Type
 a --> b = do
     a' <- a
     b' <- b
-    return $ El (getSort a' `sLub` getSort b') $ Fun (defaultArg a') b'
+    return $ El (getSort a' `sLub` getSort b') $ Pi (defaultArg a') (NoAbs "_" b')
 
-gpi :: MonadTCM tcm => Hiding -> Relevance -> String -> tcm Type -> tcm Type -> tcm Type
+gpi :: Hiding -> Relevance -> String -> TCM Type -> TCM Type -> TCM Type
 gpi h r name a b = do
-    a' <- a
-    x  <- freshName_ name
-    b' <- addCtx x (Arg h r a') b
-    return $ El (getSort a' `sLub` getSort b') $ Pi (Arg h r a') (Abs name b')
+  a <- a
+  x <- freshName_ name
+  b <- addCtx x (Arg h r a) b
+  return $ El (getSort a `dLub` Abs name (getSort b))
+              (Pi (Arg h r a) (Abs name b))
 
-hPi, nPi :: MonadTCM tcm => String -> tcm Type -> tcm Type -> tcm Type
+hPi, nPi :: String -> TCM Type -> TCM Type -> TCM Type
 hPi = gpi Hidden Relevant
 nPi = gpi NotHidden Relevant
 
-var :: MonadTCM tcm => Integer -> tcm Term
+var :: Integer -> TCM Term
 var n = return $ Var n []
 
 infixl 9 <@>, <#>
 
-gApply :: MonadTCM tcm => Hiding -> tcm Term -> tcm Term -> tcm Term
+gApply :: Hiding -> TCM Term -> TCM Term -> TCM Term
 gApply h a b = do
     x <- a
     y <- b
     return $ x `apply` [Arg h Relevant y]
 
-(<@>),(<#>) :: MonadTCM tcm => tcm Term -> tcm Term -> tcm Term
+(<@>),(<#>) :: TCM Term -> TCM Term -> TCM Term
 (<@>) = gApply NotHidden
 (<#>) = gApply Hidden
 
-list :: MonadTCM tcm => tcm Term -> tcm Term
+list :: TCM Term -> TCM Term
 list t = primList <@> t
 
-io :: MonadTCM tcm => tcm Term -> tcm Term
+io :: TCM Term -> TCM Term
 io t = primIO <@> t
 
-el :: MonadTCM tcm => tcm Term -> tcm Type
+el :: TCM Term -> TCM Type
 el t = El (mkType 0) <$> t
 
-tset :: MonadTCM tcm => tcm Type
+tset :: TCM Type
 tset = return $ sort (mkType 0)
 
 -- | Abbreviation: @argN = 'Arg' 'NotHidden' 'Relevant'@.
@@ -422,7 +507,9 @@
         in mkPrimFun4 aux
     , "primNatEquality"	    |-> mkPrimFun2 ((==)		    :: Rel Nat)
     , "primNatLess"	    |-> mkPrimFun2 ((<)			    :: Rel Nat)
-    , "primLevelMax"	    |-> mkPrimFun2 (max			    :: Op Lvl)
+    , "primLevelZero"	    |-> mkPrimLevelZero
+    , "primLevelSuc"	    |-> mkPrimLevelSuc
+    , "primLevelMax"	    |-> mkPrimLevelMax
 
     -- Floating point functions
     , "primIntegerToFloat"  |-> mkPrimFun1 (fromIntegral :: Integer -> Double)
@@ -462,6 +549,11 @@
     , "primStringEquality"  |-> mkPrimFun2 ((==) :: Rel Str)
     , "primShowString"	    |-> mkPrimFun1 (Str . show . pretty . LitString noRange . unStr)
 
+    -- Reflection
+    , "primQNameType"       |-> primQNameType
+    , "primQNameDefinition" |-> primQNameDefinition
+    , "primDataConstructors"|-> primDataConstructors
+
     -- Other stuff
     , "primTrustMe"         |-> primTrustMe
     , "primQNameEquality"  |-> mkPrimFun2 ((==) :: Rel QName)
@@ -469,7 +561,7 @@
     where
 	(|->) = (,)
 
-lookupPrimitiveFunction :: MonadTCM tcm => String -> tcm PrimitiveImpl
+lookupPrimitiveFunction :: String -> TCM PrimitiveImpl
 lookupPrimitiveFunction x =
     case Map.lookup x primitiveFunctions of
 	Just p	-> liftTCM p
@@ -477,7 +569,7 @@
 
 -- | Rebind a primitive. Assumes everything is type correct. Used when
 --   importing a module with primitives.
-rebindPrimitive :: MonadTCM tcm => String -> tcm PrimFun
+rebindPrimitive :: String -> TCM PrimFun
 rebindPrimitive x = do
     PrimImpl _ pf <- lookupPrimitiveFunction x
     bindPrimitive x pf
diff --git a/src/full/Agda/TypeChecking/Quote.hs b/src/full/Agda/TypeChecking/Quote.hs
--- a/src/full/Agda/TypeChecking/Quote.hs
+++ b/src/full/Agda/TypeChecking/Quote.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 
 module Agda.TypeChecking.Quote where
 
@@ -10,13 +11,20 @@
 
 import Agda.TypeChecking.Monad
 import Agda.TypeChecking.Monad.Builtin
+import Agda.TypeChecking.Reduce
 import Agda.TypeChecking.Pretty
 import Agda.TypeChecking.Substitute
 
-quoteTerm :: Term -> TCM Term
-quoteTerm v = do
-  false <- primFalse
-  true <- primTrue
+#include "../undefined.h"
+import Agda.Utils.Impossible
+
+quotingKit :: TCM ((Term -> Term), (Type -> Term))
+quotingKit = do
+  hidden <- primHidden
+  instanceH <- primInstance
+  visible <- primVisible
+  relevant <- primRelevant
+  irrelevant <- primIrrelevant
   nil <- primNil
   cons <- primCons
   arg <- primArgArg
@@ -26,39 +34,215 @@
   con <- primAgdaTermCon
   pi <- primAgdaTermPi
   sort <- primAgdaTermSort
+  set <- primAgdaSortSet
+  setLit <- primAgdaSortLit
+  unsupportedSort <- primAgdaSortUnsupported
+  sucLevel <- primLevelSuc
+  lub <- primLevelMax
+  el <- primAgdaTypeEl
   Con z _ <- primZero
   Con s _ <- primSuc
   unsupported <- primAgdaTermUnsupported
   let t @@ u = apply t [defaultArg u]
-      quoteHiding Hidden = true
-      quoteHiding NotHidden = false
+      quoteHiding Hidden    = hidden
+      quoteHiding Instance  = instanceH
+      quoteHiding NotHidden = visible
+      quoteRelevance Relevant   = relevant
+      quoteRelevance Irrelevant = irrelevant
+      quoteRelevance NonStrict  = relevant
+      quoteRelevance Forced     = relevant
+      quoteLit (LitInt   _ n)   = iterate suc zero !! fromIntegral n
+      quoteLit _                = unsupported
+      -- We keep no ranges in the quoted term, so the equality on terms
+      -- is only on the structure.
+      quoteSortLevelTerm (Max [])              = setLit @@ Lit (LitInt noRange 0)
+      quoteSortLevelTerm (Max [ClosedLevel n]) = setLit @@ Lit (LitInt noRange n)
+      quoteSortLevelTerm (Max [Plus 0 (NeutralLevel v)]) = set @@ quote v
+      quoteSortLevelTerm _                     = unsupported
+      quoteSort (Type t)    = quoteSortLevelTerm t
+      quoteSort Prop        = unsupportedSort
+      quoteSort Inf         = unsupportedSort
+      quoteSort DLub{}      = unsupportedSort
+      quoteType (El s t) = el @@ quoteSort s @@ quote t
       list [] = nil
       list (a : as) = cons @@ a @@ list as
       zero = con @@ quoteName z @@ nil
-      suc n = con @@ quoteName s @@ list [n]
-      quoteArg (Arg h r t) = arg @@ quoteHiding h @@ quote t
-      quoteArgs ts = list (map quoteArg ts)
+      suc n = con @@ quoteName s @@ list [arg @@ visible @@ relevant @@ n]
+      quoteArg q (Arg h r t) = arg @@ quoteHiding h @@ quoteRelevance r @@ q t
+      quoteArgs ts = list (map (quoteArg quote) ts)
       quote (Var n ts) = var @@ Lit (LitInt noRange n) @@ quoteArgs ts
       quote (Lam h t) = lam @@ quoteHiding h @@ quote (absBody t)
       quote (Def x ts) = def @@ quoteName x @@ quoteArgs ts
       quote (Con x ts) = con @@ quoteName x @@ quoteArgs ts
-      quote (Pi t u) = pi @@ quoteArg (fmap unEl t)
-                          @@ quote (unEl (absBody u))
-      quote (Fun t u) = pi @@ quoteArg (fmap unEl t)
-                           @@ quote (raise 1 (unEl u))
-      quote (Lit (LitInt _ n)) = iterate suc zero !! fromIntegral n
-      quote (Sort _) = sort
-      quote _ = unsupported
-  return (quote v)
+      quote (Pi t u) = pi @@ quoteArg quoteType t
+                          @@ quoteType (absBody u)
+      quote (Level _) = unsupported
+      quote (Lit lit) = quoteLit lit
+      quote (Sort s)  = sort @@ quoteSort s
+      quote MetaV{}   = unsupported
+      quote DontCare{} = unsupported -- could be exposed at some point but we have to take care
+  return (quote, quoteType)
 
 quoteName :: QName -> Term
 quoteName x = Lit (LitQName noRange x)
 
+quoteTerm :: Term -> TCM Term
+quoteTerm v = ($v) . fst <$> quotingKit
+
 quoteType :: Type -> TCM Term
-quoteType (El _ v) = quoteTerm v
+quoteType v = ($v) . snd <$> quotingKit
 
 agdaTermType :: TCM Type
 agdaTermType = El (mkType 0) <$> primAgdaTerm
 
 qNameType :: TCM Type
 qNameType = El (mkType 0) <$> primQName
+
+isCon :: QName -> TCM Term -> TCM Bool
+isCon con tm = do t <- tm
+                  case t of
+                    Con con' _ -> return (con == con')
+                    _ -> return False
+
+unquoteFailedGeneric :: String -> TCM a
+unquoteFailedGeneric msg = typeError . GenericError $ "Unable to unquote the " ++ msg
+
+unquoteFailed :: String -> String -> Term -> TCM a
+unquoteFailed kind msg t = do doc <- prettyTCM t
+                              unquoteFailedGeneric $ "term (" ++ show doc ++ ") of type " ++ kind ++ ".\nReason: " ++ msg ++ "."
+
+class Unquote a where
+  unquote :: Term -> TCM a
+
+unquoteH :: Unquote a => Arg Term -> TCM a
+unquoteH (Arg Hidden Relevant x) = unquote x
+unquoteH _                       = unquoteFailedGeneric "argument. It should be `hidden'."
+
+unquoteN :: Unquote a => Arg Term -> TCM a
+unquoteN (Arg NotHidden Relevant x) = unquote x
+unquoteN _                          = unquoteFailedGeneric "argument. It should be `visible'"
+
+choice :: Monad m => [(m Bool, m a)] -> m a -> m a
+choice [] dflt = dflt
+choice ((mb, mx) : mxs) dflt = do b <- mb
+                                  if b then mx else choice mxs dflt
+
+instance Unquote a => Unquote (Arg a) where
+  unquote t = do
+    t <- reduce t
+    case t of
+      Con c [hid,rel,x] -> do
+        choice
+          [(c `isCon` primArgArg, Arg <$> unquoteN hid <*> unquoteN rel <*> unquoteN x)]
+          (unquoteFailed "Arg" "arity 3 and not the `arg' constructor" t)
+      _ -> unquoteFailed "Arg" "not of arity 3" t
+
+instance Unquote Integer where
+  unquote t = do
+    t <- reduce t
+    case t of
+      Lit (LitInt _ n) -> return n
+      _ -> unquoteFailed "Integer" "not a literal integer" t
+
+instance Unquote a => Unquote [a] where
+  unquote t = do
+    t <- reduce t
+    case t of
+      Con c [x,xs] -> do
+        choice
+          [(c `isCon` primCons, (:) <$> unquoteN x <*> unquoteN xs)]
+          (unquoteFailed "List" "arity 2 and not the `∷' constructor" t)
+      Con c [] -> do
+        choice
+          [(c `isCon` primNil, return [])]
+          (unquoteFailed "List" "arity 0 and not the `[]' constructor" t)
+      _ -> unquoteFailed "List" "neither `[]' nor `∷'" t
+
+instance Unquote Hiding where
+  unquote t = do
+    t <- reduce t
+    case t of
+      Con c [] -> do
+        choice
+          [(c `isCon` primHidden,  return Hidden)
+          ,(c `isCon` primInstance, return Instance)
+          ,(c `isCon` primVisible, return NotHidden)]
+          (unquoteFailed "Hiding" "neither `hidden' nor `visible'" t)
+      _ -> unquoteFailed "Hiding" "arity is not 0" t
+
+instance Unquote Relevance where
+  unquote t = do
+    t <- reduce t
+    case t of
+      Con c [] -> do
+        choice
+          [(c `isCon` primRelevant,   return Relevant)
+          ,(c `isCon` primIrrelevant, return Irrelevant)]
+          (unquoteFailed "Relevance" "neither `relevant' or `irrelevant'" t)
+      _ -> unquoteFailed "Relevance" "arity is not 0" t
+
+instance Unquote QName where
+  unquote t = do
+    t <- reduce t
+    case t of
+      Lit (LitQName _ x) -> return x
+      _                  -> unquoteFailed "QName" "not a literal qname value" t
+
+instance Unquote a => Unquote (Abs a) where
+  unquote t = do x <- freshNoName_
+                 Abs (show x) <$> unquote t
+
+instance Unquote Sort where
+  unquote t = do
+    t <- reduce t
+    case t of
+      Con c [] -> do
+        choice
+          [(c `isCon` primAgdaSortUnsupported, unquoteFailed "Sort" "unsupported sort" t)]
+          (unquoteFailed "Sort" "arity 0 and not the `unsupported' constructor" t)
+      Con c [u] -> do
+        choice
+          [(c `isCon` primAgdaSortSet, Type <$> unquoteN u)
+          ,(c `isCon` primAgdaSortLit, Type . levelMax . (:[]) . ClosedLevel <$> unquoteN u)]
+          (unquoteFailed "Sort" "arity 1 and not the `set' or the `lit' constructors" t)
+      _ -> unquoteFailed "Sort" "not of arity 0 nor 1" t
+
+instance Unquote Level where
+  unquote l = Max . (:[]) . Plus 0 . UnreducedLevel <$> unquote l
+
+instance Unquote Type where
+  unquote t = do
+    t <- reduce t
+    case t of
+      Con c [s, u] -> do
+        choice
+          [(c `isCon` primAgdaTypeEl, El <$> unquoteN s <*> unquoteN u)]
+          (unquoteFailed "Type" "arity 2 and not the `el' constructor" t)
+      _ -> unquoteFailed "Type" "not of arity 2" t
+
+instance Unquote Term where
+  unquote t = do
+    t <- reduce t
+    case t of
+      Con c [] ->
+        choice
+          [(c `isCon` primAgdaTermUnsupported, unquoteFailed "Term" "unsupported term" t)]
+          (unquoteFailed "Term" "arity 0 and not the `unsupported' constructor" t)
+
+      Con c [x] -> do
+        choice
+          [(c `isCon` primAgdaTermSort, Sort <$> unquoteN x)]
+          (unquoteFailed "Term" "arity 1 and not the `sort' constructor" t)
+
+      Con c [x,y] ->
+        choice
+          [(c `isCon` primAgdaTermVar, Var <$> unquoteN x <*> unquoteN y)
+          ,(c `isCon` primAgdaTermCon, Con <$> unquoteN x <*> unquoteN y)
+          ,(c `isCon` primAgdaTermDef, Def <$> unquoteN x <*> unquoteN y)
+          ,(c `isCon` primAgdaTermLam, Lam <$> unquoteN x <*> unquoteN y)
+          ,(c `isCon` primAgdaTermPi,  Pi  <$> unquoteN x <*> unquoteN y)]
+          (unquoteFailed "Term" "arity 2 and none of Var, Con, Def, Lam, Pi" t)
+
+      Con{} -> unquoteFailed "Term" "neither arity 0 nor 1 nor 2" t
+      Lit{} -> unquoteFailed "Term" "unexpected literal" t
+      _ -> unquoteFailed "Term" "not a constructor" t
diff --git a/src/full/Agda/TypeChecking/Rebind.hs b/src/full/Agda/TypeChecking/Rebind.hs
--- a/src/full/Agda/TypeChecking/Rebind.hs
+++ b/src/full/Agda/TypeChecking/Rebind.hs
@@ -13,18 +13,5 @@
 
 -- | Change 'Bind's to 'NoBind' if the variable is not used in the body.
 --   Also normalises the body in the process. Or not. Disabled.
-rebindClause :: Clauses -> TCM Clauses
+rebindClause :: Clause -> TCM Clause
 rebindClause = return
-{-
-rebindClause (Clause tel perm ps rec b) = return $ Clause tel perm ps rec b
-  do
-    b <- instantiateFull b
-    return $ Clause ps $ rebind b
-    where
-	rebind (Body t) = Body t
-	rebind (Bind b)
-	    | 0 `freeIn` absBody b  = Bind $ fmap rebind b
-	    | otherwise		    = NoBind $ b `absApp` __IMPOSSIBLE__
-	rebind (NoBind b) = NoBind $ rebind b
-	rebind  NoBody	  = NoBody
--}
diff --git a/src/full/Agda/TypeChecking/RecordPatterns.hs b/src/full/Agda/TypeChecking/RecordPatterns.hs
--- a/src/full/Agda/TypeChecking/RecordPatterns.hs
+++ b/src/full/Agda/TypeChecking/RecordPatterns.hs
@@ -19,7 +19,7 @@
 import Agda.TypeChecking.Monad
 import Agda.TypeChecking.Pretty
 import Agda.TypeChecking.Reduce
-import Agda.TypeChecking.Substitute hiding (Subst)
+import Agda.TypeChecking.Substitute
 import Agda.TypeChecking.Telescope
 import Agda.Utils.Either
 import Agda.Utils.List
@@ -33,17 +33,23 @@
 -- projection functions. Does not remove record constructor patterns
 -- which have sub-patterns containing non-record constructor or
 -- literal patterns.
+--
+-- If the input clause contains dot patterns inside record patterns,
+-- then the translation may yield clauses which are not type-correct.
+-- However, we believe that it is safe to use the output as input to
+-- 'Agda.TypeChecking.CompiledClause.Compile.compileClauses'. Perhaps
+-- it would be better to perform record pattern translation on the
+-- compiled clauses instead, but the code below has already been
+-- implemented and seems to work.
 
-translateRecordPatterns :: MonadTCM tcm => Clause -> tcm Clauses
+translateRecordPatterns :: Clause -> TCM Clause
 translateRecordPatterns clause = do
   -- ps: New patterns, in left-to-right order, in the context of the
   -- old RHS.
 
   -- s: Partial substitution taking the old pattern variables
   -- (including dot patterns; listed from left to right) to terms in
-  -- the context of the new RHS. The terms are functions expecting a
-  -- substitution taking things in the old telescope's context to the
-  -- context of the new RHS.
+  -- the context of the new RHS.
 
   -- cs: List of changes, with types in the context of the old
   -- telescope.
@@ -53,15 +59,20 @@
   let -- Number of variables + dot patterns in new clause.
       noNewPatternVars = size cs
 
+      s'   = reverse s
+      rest = [ Var i [] | i <- [noNewPatternVars..] ]
+
       -- Substitution used to convert terms in the old RHS's
       -- context to terms in the new RHS's context.
-      rhsSubst = map (\t -> t rhsSubst') (reverse s) ++
-                 [ Var i [] | i <- [noNewPatternVars..] ]
+      rhsSubst = s' ++ rest
 
       -- Substitution used to convert terms in the old telescope's
       -- context to terms in the new RHS's context.
-      rhsSubst' = permute (reverseP $ clausePerm clause) init ++ rest
-        where (init, rest) = genericSplitAt (size s) rhsSubst
+      rhsSubst' = permute (reverseP $ clausePerm clause) s' ++ rest
+      -- TODO: Is it OK to replace the definition above with the
+      -- following one?
+      --
+      --   rhsSubst' = permute (clausePerm clause) s ++ rest
 
       -- The old telescope, flattened and in textual left-to-right
       -- order (i.e. the type signature for the variable which occurs
@@ -83,7 +94,7 @@
       -- Permutation taking the new variable and dot patterns to the
       -- new telescope.
       newPerm = adjustForDotPatterns $
-                  reorderTel $ map (maybe dummy snd) newTel'
+                  reorderTel_ $ map (maybe dummy snd) newTel'
         where
         -- It is important that dummy does not mention any variable
         -- (see the definition of reorderTel).
@@ -132,10 +143,7 @@
         ]
       ]
 
-  return $ Clauses { translatedClause    = c
-                   , maybeOriginalClause =
-                       if all isLeft cs then Nothing else Just clause
-                   }
+  return c
 
 ------------------------------------------------------------------------
 -- Record pattern monad
@@ -154,8 +162,8 @@
 
 -- | Runs a computation in the 'RecPatM' monad.
 
-runRecPatM :: MonadTCM tcm => RecPatM a -> tcm a
-runRecPatM (RecPatM m) = liftTCM $
+runRecPatM :: RecPatM a -> TCM a
+runRecPatM (RecPatM m) =
   mapTCMT (\m -> do
              (x, noVars) <- mfix $ \ ~(_, noVars) ->
                               runStateT (runReaderT m noVars) 0
@@ -180,14 +188,6 @@
 data Kind = VarPat | DotPat
   deriving Eq
 
--- | Substitutions (with a twist).
---
--- Some parts of the terms building up the substitution need to have a
--- substitution applied to them (in fact, a variant of the
--- substitution itself), so a functional representation is used.
-
-type Subst = [Substitution -> Term]
-
 -- | @'Left' p@ means that a variable (corresponding to the pattern
 -- @p@, a variable or dot pattern) should be kept unchanged. @'Right'
 -- (n, x, t)@ means that @n 'VarPat'@ variables, and @n 'DotPat'@ dot
@@ -202,59 +202,44 @@
   = Leaf Pattern
     -- ^ Corresponds to variable and dot patterns; contains the
     -- original pattern.
-  | RecCon (Arg Type) [(Substitution -> Term -> Term, RecordTree)]
+  | RecCon (Arg Type) [(Term -> Term, RecordTree)]
     -- ^ @RecCon t args@ stands for a record constructor application:
     -- @t@ is the type of the application, and the list contains a
-    -- projection function (parametrised on a substitution) and a tree
-    -- for every argument.
+    -- projection function and a tree for every argument.
 
 ------------------------------------------------------------------------
 -- Record pattern trees
 
--- | @projections t@ returns a projection (parametrised on a
--- substitution) for every non-dot leaf pattern in @t@. The term is
--- the composition of the projection functions from the leaf to the
--- root. The substitution is used to build the individual projection
--- functions.
+-- | @projections t@ returns a projection for every non-dot leaf
+-- pattern in @t@. The term is the composition of the projection
+-- functions from the leaf to the root.
 --
 -- Every term is tagged with its origin: a variable pattern or a dot
 -- pattern.
 
-projections :: RecordTree -> [(Substitution -> Term -> Term, Kind)]
-projections (Leaf (DotP{})) = [(flip const, DotPat)]
-projections (Leaf (VarP{})) = [(flip const, VarPat)]
+projections :: RecordTree -> [(Term -> Term, Kind)]
+projections (Leaf (DotP{})) = [(id, DotPat)]
+projections (Leaf (VarP{})) = [(id, VarPat)]
 projections (Leaf _)        = __IMPOSSIBLE__
 projections (RecCon _ args) =
-  concatMap (\(p, t) -> map (\(t, k) -> (\s -> t s . p s, k))
+  concatMap (\(p, t) -> map (\(p', k) -> (p' . p, k))
                             (projections t))
             args
 
 -- | Converts a record tree to a single pattern along with information
 -- about the deleted pattern variables.
---
--- Raises an error if the tree contains dot patterns inside record
--- patterns.
 
-removeTree :: RecordTree -> RecPatM (Pattern, Subst, Changes)
+removeTree :: RecordTree -> RecPatM (Pattern, Substitution, Changes)
 removeTree tree = do
   (pat, x) <- nextVar
   let ps = projections tree
-      s  = map (\(p, _) -> \s -> p s x) ps
+      s  = map (\(p, _) -> p x) ps
 
       count k = genericLength $ filter ((== k) . snd) ps
 
-      dotPatternInside = case tree of
-        Leaf {}   -> False
-        RecCon {} -> any ((== DotPat) . snd) ps
-
-  if dotPatternInside then
-    typeError $ NotSupported $
-      "Dot patterns inside record patterns, " ++
-      "unless accompanied by data type patterns"
-   else
-    return $ case tree of
-      Leaf p     -> (p,   s, [Left p])
-      RecCon t _ -> (pat, s, [Right (count, "r", t)])
+  return $ case tree of
+    Leaf p     -> (p,   s, [Left p])
+    RecCon t _ -> (pat, s, [Right (count, "r", t)])
 
 ------------------------------------------------------------------------
 -- Translation of patterns
@@ -282,7 +267,7 @@
 --
 -- This function assumes that literals are never of record type.
 
-translatePattern :: Pattern -> RecPatM (Pattern, Subst, Changes)
+translatePattern :: Pattern -> RecPatM (Pattern, Substitution, Changes)
 translatePattern (ConP c Nothing ps) = do
   (ps, s, cs) <- translatePatterns ps
   return (ConP c Nothing ps, s, cs)
@@ -298,7 +283,7 @@
 -- | 'translatePattern' lifted to lists of arguments.
 
 translatePatterns ::
-  [Arg Pattern] -> RecPatM ([Arg Pattern], Subst, Changes)
+  [Arg Pattern] -> RecPatM ([Arg Pattern], Substitution, Changes)
 translatePatterns ps = do
   (ps', ss, cs) <- unzip3 <$> mapM (translatePattern . unArg) ps
   return (ps' `withArgsFrom` ps, concat ss, concat cs)
@@ -319,7 +304,7 @@
 
 recordTree ::
   Pattern ->
-  RecPatM (Either (RecPatM (Pattern, Subst, Changes)) RecordTree)
+  RecPatM (Either (RecPatM (Pattern, Substitution, Changes)) RecordTree)
 recordTree p@(ConP _ Nothing _) = return $ Left $ translatePattern p
 recordTree (ConP c (Just t) ps) = do
   rs <- mapM (recordTree . unArg) ps
@@ -329,15 +314,14 @@
         (ps', ss, cs) <- unzip3 <$> mapM (either id removeTree) rs
         return (ConP c (Just t) (ps' `withArgsFrom` ps),
                 concat ss, concat cs)
-    Right ts -> do
+    Right ts -> liftTCM $ do
       t <- reduce t
       case t of
-        Arg { unArg = El _ (Def r args) } -> do
+        Arg { unArg = El _ (Def r _) } -> do
           rDef <- theDef <$> getConstInfo r
           case rDef of
             Record { recFields = fields } -> do
-              let proj p = \s t ->
-                    Def (unArg p) (substs s (map hide args) ++ [defaultArg t])
+              let proj p = \t -> Def (unArg p) [defaultArg t]
               return $ Right $ RecCon t $ zip (map proj fields) ts
             _ -> __IMPOSSIBLE__
         _ -> __IMPOSSIBLE__
@@ -378,7 +362,6 @@
   Bind $ Abs x $ translateBody rest s $ dropBinds n' b
   where n' = sum $ map n [VarPat, DotPat]
 translateBody (Left _ : rest) s (Bind b)   = Bind $ fmap (translateBody rest s) b
-translateBody (Left _ : rest) s (NoBind b) = NoBind $ translateBody rest s b
 translateBody []              s (Body t)   = Body $ substs s t
 translateBody _               _ _          = __IMPOSSIBLE__
 
@@ -395,14 +378,11 @@
     Nothing -> __IMPOSSIBLE__
     Just k  -> Var k []
 
--- | @dropBinds n b@ drops the initial @n@ occurrences of 'Bind' or
--- 'NoBind' from @b@.
+-- | @dropBinds n b@ drops the initial @n@ occurrences of 'Bind' from @b@.
 --
--- Precondition: @b@ has to start with @n@ occurrences of 'Bind' or
--- 'NoBind'.
+-- Precondition: @b@ has to start with @n@ occurrences of 'Bind'.
 
 dropBinds :: Nat -> ClauseBody -> ClauseBody
 dropBinds n b          | n == 0 = b
 dropBinds n (Bind b)   | n > 0  = dropBinds (pred n) (absBody b)
-dropBinds n (NoBind b) | n > 0  = dropBinds (pred n) b
 dropBinds _ _                   = __IMPOSSIBLE__
diff --git a/src/full/Agda/TypeChecking/Records.hs b/src/full/Agda/TypeChecking/Records.hs
--- a/src/full/Agda/TypeChecking/Records.hs
+++ b/src/full/Agda/TypeChecking/Records.hs
@@ -6,6 +6,9 @@
 import Control.Arrow ((***))
 import Control.Monad
 import Data.List
+import qualified Data.Map as Map
+import qualified Data.Set as Set
+import Data.Function
 
 import Agda.Syntax.Common
 import qualified Agda.Syntax.Concrete.Name as C
@@ -26,7 +29,7 @@
 
 -- | Order the fields of a record construction.
 --   Use the second argument for missing fields.
-orderFields :: MonadTCM tcm => QName -> a -> [C.Name] -> [(C.Name, a)] -> tcm [a]
+orderFields :: QName -> a -> [C.Name] -> [(C.Name, a)] -> TCM [a]
 orderFields r def xs fs = do
   shouldBeNull (ys \\ nub ys) $ DuplicateFields . nub
   shouldBeNull (ys \\ xs)     $ TooManyFields r
@@ -53,7 +56,7 @@
 
 -- | Get the definition for a record. Throws an exception if the name
 --   does not refer to a record.
-getRecordDef :: MonadTCM tcm => QName -> tcm Defn
+getRecordDef :: QName -> TCM Defn
 getRecordDef r = do
   def <- theDef <$> getConstInfo r
   case def of
@@ -61,25 +64,37 @@
     _        -> typeError $ ShouldBeRecordType (El Prop $ Def r [])
 
 -- | Get the field names of a record.
-getRecordFieldNames :: MonadTCM tcm => QName -> tcm [Arg C.Name]
+getRecordFieldNames :: QName -> TCM [Arg C.Name]
 getRecordFieldNames r =
   map (fmap (nameConcrete . qnameName)) . recFields <$> getRecordDef r
 
+-- | Find all records with at least the given fields.
+findPossibleRecords :: [C.Name] -> TCM [QName]
+findPossibleRecords fields = do
+  defs <- (Map.union `on` sigDefinitions) <$> getSignature <*> getImportedSignature
+  let possible def = case theDef def of
+        Record{ recFields = fs } -> Set.isSubsetOf given inrecord
+          where inrecord = Set.fromList $ map (nameConcrete . qnameName . unArg) fs
+        _ -> False
+  return [ defName d | d <- Map.elems defs, possible d ]
+  where
+    given = Set.fromList fields
+
 -- | Get the field types of a record.
-getRecordFieldTypes :: MonadTCM tcm => QName -> tcm Telescope
+getRecordFieldTypes :: QName -> TCM Telescope
 getRecordFieldTypes r = recTel <$> getRecordDef r
 
 -- | Get the type of the record constructor.
-getRecordConstructorType :: MonadTCM tcm => QName -> tcm Type
+getRecordConstructorType :: QName -> TCM Type
 getRecordConstructorType r = recConType <$> getRecordDef r
 
 -- | Returns the given record type's constructor name (with an empty
 -- range).
-getRecordConstructor :: MonadTCM tcm => QName -> tcm QName
+getRecordConstructor :: QName -> TCM QName
 getRecordConstructor r = killRange <$> recCon <$> getRecordDef r
 
 -- | Check if a name refers to a record.
-isRecord :: MonadTCM tcm => QName -> tcm Bool
+isRecord :: QName -> TCM Bool
 isRecord r = do
   def <- theDef <$> getConstInfo r
   return $ case def of
@@ -87,15 +102,20 @@
     _        -> False
 
 -- | Check if a name refers to an eta expandable record.
-isEtaRecord :: MonadTCM tcm => QName -> tcm Bool
+isEtaRecord :: QName -> TCM Bool
 isEtaRecord r = do
   def <- theDef <$> getConstInfo r
   return $ case def of
     Record{recEtaEquality = eta} -> eta
     _                            -> False
 
+-- | Check if a type is an eta expandable record and return the record identifier and the parameters.
+isEtaRecordType :: Type -> TCM (Maybe (QName, Args))
+isEtaRecordType (El _ (Def d ps)) = ifM (isEtaRecord d) (return $ Just (d, ps)) (return Nothing)
+isEtaRecordType _ = return Nothing
+
 -- | Check if a name refers to a record constructor.
-isRecordConstructor :: MonadTCM tcm => QName -> tcm Bool
+isRecordConstructor :: QName -> TCM Bool
 isRecordConstructor c = do
   def <- theDef <$> getConstInfo c
   case def of
@@ -103,7 +123,7 @@
     _                          -> return False
 
 -- | Check if a constructor name is the internally generated record constructor.
-isGeneratedRecordConstructor :: MonadTCM tcm => QName -> tcm Bool
+isGeneratedRecordConstructor :: QName -> TCM Bool
 isGeneratedRecordConstructor c = do
   def <- theDef <$> getConstInfo c
   case def of
@@ -121,7 +141,7 @@
 
     and @r : R@, @etaExpand R [] r@ is @[R.x r, R.y r, DontCare]@
 -}
-etaExpandRecord :: MonadTCM tcm => QName -> Args -> Term -> tcm (Telescope, Args)
+etaExpandRecord :: QName -> Args -> Term -> TCM (Telescope, Args)
 etaExpandRecord r pars u = do
   Record{ recFields = xs, recTel = tel } <- getRecordDef r
   let tel' = apply tel pars
@@ -131,9 +151,9 @@
       -- irrelevant fields are expanded to DontCare
       -- this is sound because etaExpandRecord is only called during conversion
       -- WARNING: do not use etaExpandRecord to expand MetaVars!!
-      let proj (Arg h Irrelevant _) = Arg h Irrelevant DontCare
+      let proj (Arg h Irrelevant x) = Arg h Irrelevant $ DontCare (Def x [defaultArg u])
           proj (Arg h rel x)        = Arg h rel $
-            Def x $ map hide pars ++ [defaultArg u]
+            Def x [defaultArg u]
       reportSDoc "tc.record.eta" 20 $ vcat
         [ text "eta expanding" <+> prettyTCM u <+> text ":" <+> prettyTCM r
         , nest 2 $ vcat
@@ -146,18 +166,18 @@
     hide a = a { argHiding = Hidden }
 
 -- | The fields should be eta contracted already.
-etaContractRecord :: MonadTCM tcm => QName -> QName -> Args -> tcm Term
+etaContractRecord :: QName -> QName -> Args -> TCM Term
 etaContractRecord r c args = do
   Record{ recPars = npars, recFields = xs } <- getRecordDef r
   let check a ax = do
       -- @a@ is the constructor argument, @ax@ the corr. record field name
         -- skip irrelevant record fields by returning DontCare
         case (argRelevance a, unArg a) of
-          (Irrelevant, _) -> return $ Just DontCare
-          -- if @a@ is the record field name applied to (npars+1) args,
+          (Irrelevant, v) -> return $ Just $ DontCare __IMPOSSIBLE__ -- thrown out later
+          -- if @a@ is the record field name applied to a single argument
           -- then it passes the check
-          (_, Def y args) | unArg ax == y && genericLength args == npars + 1
-                         -> return (Just $ unArg $ last args)
+          (_, Def y [arg]) | unArg ax == y
+                         -> return (Just $ unArg arg)
           _              -> return Nothing
       fallBack = return (Con c args)
   case compare (length args) (length xs) of
@@ -166,7 +186,7 @@
     EQ -> do
       as <- zipWithM check args xs
       case sequence as of
-        Just as -> case filter (DontCare /=) as of
+        Just as -> case filter notDontCare as of
           (a:as) ->
             if all (a ==) as
               then do
@@ -178,6 +198,8 @@
               else fallBack
           _ -> fallBack -- just DontCares
         _ -> fallBack  -- a Nothing
+  where notDontCare (DontCare _) = False
+        notDontCare _            = True
 
 -- | Is the type a hereditarily singleton record type? May return a
 -- blocking metavariable.
@@ -185,12 +207,19 @@
 -- Precondition: The name should refer to a record type, and the
 -- arguments should be the parameters to the type.
 
-isSingletonRecord ::
-  MonadTCM tcm => QName -> Args -> tcm (Either MetaId Bool)
-isSingletonRecord r ps =
+isSingletonRecord :: QName -> Args -> TCM (Either MetaId Bool)
+isSingletonRecord = isSingletonRecord' False
+
+isSingletonRecordModuloRelevance :: QName -> Args -> TCM (Either MetaId Bool)
+isSingletonRecordModuloRelevance = isSingletonRecord' True
+
+isSingletonRecord' :: Bool -> QName -> Args -> TCM (Either MetaId Bool)
+isSingletonRecord' regardIrrelevance r ps =
   check =<< ((`apply` ps) <$> getRecordFieldTypes r)
   where
   check EmptyTel            = return (Right True)
+  check (ExtendTel arg tel) | regardIrrelevance && argRelevance arg == Irrelevant =
+    underAbstraction arg tel check
   check (ExtendTel arg tel) = do
     TelV _ t <- telView $ unArg arg
     t <- reduceB $ unEl t
@@ -199,7 +228,7 @@
       NotBlocked (MetaV m _) -> return (Left m)
       NotBlocked (Def r ps)  ->
         ifM (not <$> isRecord r) (return $ Right False) $ do
-          isRec <- isSingletonRecord r ps
+          isRec <- isSingletonRecord' regardIrrelevance r ps
           case isRec of
             Left _      -> return isRec
             Right False -> return isRec
diff --git a/src/full/Agda/TypeChecking/Records.hs-boot b/src/full/Agda/TypeChecking/Records.hs-boot
--- a/src/full/Agda/TypeChecking/Records.hs-boot
+++ b/src/full/Agda/TypeChecking/Records.hs-boot
@@ -7,8 +7,8 @@
 import qualified Agda.Syntax.Concrete.Name as C
 import Agda.TypeChecking.Monad
 
-isRecord :: MonadTCM tcm => QName -> tcm Bool
-isEtaRecord :: MonadTCM tcm => QName -> tcm Bool
-getRecordFieldNames :: MonadTCM tcm => QName -> tcm [Arg C.Name]
-etaContractRecord :: MonadTCM tcm => QName -> QName -> Args -> tcm Term
-isGeneratedRecordConstructor :: MonadTCM tcm => QName -> tcm Bool
+isRecord :: QName -> TCM Bool
+isEtaRecord :: QName -> TCM Bool
+getRecordFieldNames :: QName -> TCM [Arg C.Name]
+etaContractRecord :: QName -> QName -> Args -> TCM Term
+isGeneratedRecordConstructor :: QName -> TCM Bool
diff --git a/src/full/Agda/TypeChecking/Reduce.hs b/src/full/Agda/TypeChecking/Reduce.hs
--- a/src/full/Agda/TypeChecking/Reduce.hs
+++ b/src/full/Agda/TypeChecking/Reduce.hs
@@ -1,4 +1,5 @@
-{-# LANGUAGE CPP, PatternGuards, TypeSynonymInstances #-}
+{-# LANGUAGE CPP, PatternGuards,
+             TypeSynonymInstances, FlexibleInstances #-}
 
 module Agda.TypeChecking.Reduce where
 
@@ -26,7 +27,9 @@
 import Agda.TypeChecking.Free
 import Agda.TypeChecking.EtaContract
 import Agda.TypeChecking.CompiledClause
+import {-# SOURCE #-} Agda.TypeChecking.Pretty
 
+import {-# SOURCE #-} Agda.TypeChecking.Level
 import {-# SOURCE #-} Agda.TypeChecking.Patterns.Match
 import {-# SOURCE #-} Agda.TypeChecking.CompiledClause.Match
 
@@ -35,14 +38,14 @@
 #include "../undefined.h"
 import Agda.Utils.Impossible
 
-traceFun :: MonadTCM tcm => String -> tcm a -> tcm a
+traceFun :: String -> TCM a -> TCM a
 traceFun s m = do
   reportSLn "tc.inst" 100 $ "[ " ++ s
   x <- m
   reportSLn "tc.inst" 100 $ "]"
   return x
 
-traceFun' :: (Show a, MonadTCM tcm) => String -> tcm a -> tcm a
+traceFun' :: Show a => String -> TCM a -> TCM a
 traceFun' s m = do
   reportSLn "tc.inst" 100 $ "[ " ++ s
   x <- m
@@ -54,7 +57,7 @@
 --   Doesn't do any reduction, and preserves blocking tags (when blocking meta
 --   is uninstantiated).
 class Instantiate t where
-    instantiate :: MonadTCM tcm => t -> tcm t
+    instantiate :: t -> TCM t
 
 instance Instantiate Term where
   instantiate t@(MetaV x args) = do
@@ -62,12 +65,31 @@
     case mi of
       InstV a                        -> instantiate $ a `apply` args
       Open                           -> return t
+      OpenIFS                        -> return t
       BlockedConst _                 -> return t
       PostponedTypeCheckingProblem _ -> return t
       InstS _                        -> __IMPOSSIBLE__
-  instantiate (Sort s) = Sort <$> instantiate s
+  instantiate (Level l) = levelTm <$> instantiate l
+  instantiate (Sort s) = sortTm <$> instantiate s
   instantiate t = return t
 
+instance Instantiate Level where
+  instantiate (Max as) = levelMax <$> instantiate as
+
+instance Instantiate PlusLevel where
+  instantiate l@ClosedLevel{} = return l
+  instantiate (Plus n a) = Plus n <$> instantiate a
+
+instance Instantiate LevelAtom where
+  instantiate l = case l of
+    MetaLevel m vs -> do
+      v <- instantiate (MetaV m vs)
+      case v of
+        MetaV m vs -> return $ MetaLevel m vs
+        _          -> return $ UnreducedLevel v
+    UnreducedLevel l -> UnreducedLevel <$> instantiate l
+    _ -> return l
+
 instance Instantiate a => Instantiate (Blocked a) where
   instantiate v@NotBlocked{} = return v
   instantiate v@(Blocked x u) = do
@@ -75,6 +97,7 @@
     case mi of
       InstV _                        -> notBlocked <$> instantiate u
       Open                           -> return v
+      OpenIFS                        -> return v
       BlockedConst _                 -> return v
       PostponedTypeCheckingProblem _ -> return v
       InstS _                        -> __IMPOSSIBLE__
@@ -83,21 +106,14 @@
     instantiate (El s t) = El <$> instantiate s <*> instantiate t
 
 instance Instantiate Sort where
-    instantiate s = case s of
-	MetaS x as -> do
-	    mi <- mvInstantiation <$> lookupMeta x
-	    case mi of
-		InstS s'                       -> do
-                  v <- instantiate (s' `apply` as)
-                  case v of
-                    Sort s -> return s
-                    _      -> __IMPOSSIBLE__
-		Open                           -> return s
-		InstV{}                        -> __IMPOSSIBLE__
-		BlockedConst{}                 -> __IMPOSSIBLE__
-                PostponedTypeCheckingProblem{} -> __IMPOSSIBLE__
-        _ -> return s
+  instantiate s = case s of
+    Type l -> levelSort <$> instantiate l
+    _      -> return s
 
+instance Instantiate Elim where
+  instantiate (Apply v) = Apply <$> instantiate v
+  instantiate (Proj f)  = pure $ Proj f
+
 instance Instantiate t => Instantiate (Abs t) where
   instantiate = traverse instantiate
 
@@ -126,15 +142,15 @@
   instantiate (ValueCmp cmp t u v) = do
     (t,u,v) <- instantiate (t,u,v)
     return $ ValueCmp cmp t u v
-  instantiate (ArgsCmp cmp t as bs) = do
-    (t, as, bs) <- instantiate (t, as, bs)
-    return $ ArgsCmp cmp t as bs
+  instantiate (ElimCmp cmp t v as bs) =
+    ElimCmp cmp <$> instantiate t <*> instantiate v <*> instantiate as <*> instantiate bs
   instantiate (LevelCmp cmp u v)   = uncurry (LevelCmp cmp) <$> instantiate (u,v)
   instantiate (TypeCmp cmp a b)    = uncurry (TypeCmp cmp) <$> instantiate (a,b)
-  instantiate (TelCmp cmp a b)     = uncurry (TelCmp cmp)  <$> instantiate (a,b)
+  instantiate (TelCmp a b cmp tela telb) = uncurry (TelCmp a b cmp)  <$> instantiate (tela,telb)
   instantiate (SortCmp cmp a b)    = uncurry (SortCmp cmp) <$> instantiate (a,b)
-  instantiate (Guarded c cs)       = uncurry Guarded <$> instantiate (c,cs)
+  instantiate (Guarded c pid)      = Guarded <$> instantiate c <*> pure pid
   instantiate (UnBlock m)          = return $ UnBlock m
+  instantiate (FindInScope m)      = return $ FindInScope m
   instantiate (IsEmpty t)          = IsEmpty <$> instantiate t
 
 instance (Ord k, Instantiate e) => Instantiate (Map k e) where
@@ -146,54 +162,65 @@
 --
 
 class Reduce t where
-    reduce  :: MonadTCM tcm => t -> tcm t
-    reduceB :: MonadTCM tcm => t -> tcm (Blocked t)
+    reduce  :: t -> TCM t
+    reduceB :: t -> TCM (Blocked t)
 
     reduce  t = ignoreBlocking <$> reduceB t
     reduceB t = notBlocked <$> reduce t
 
 instance Reduce Type where
-    reduce (El s t) = El <$> reduce s <*> reduce t
-    reduceB (El s t) = do
-      s <- reduce s
-      t <- reduceB t
-      return (El s <$> t)
+    reduce  (El s t) = El s <$> reduce t
+    reduceB (El s t) = fmap (El s) <$> reduceB t
 
 instance Reduce Sort where
     reduce s = {-# SCC "reduce<Sort>" #-}
-      ifM (not <$> hasUniversePolymorphism) (red sSuc sLub s)
-      $ liftTCM $ do
-        suc  <- do sc <- primLevelSuc
-                   return $ \x -> case x of
-                                    Type n -> Type (sc `apply` [Arg NotHidden Relevant n])
-                                    _      -> sSuc x
-          `catchError` \_ -> return sSuc
-        lub <- do mx <- primLevelMax
-                  return $ \x y -> case (x, y) of
-                    (Type n, Type m) -> Type (mx `apply` List.map (Arg NotHidden Relevant) [n, m])
-                    _                -> sLub x y
-          `catchError` \_ -> return sLub
-        -- need to instantiate all meta to know if we need a DLub or a Lub
-        red suc lub =<< instantiateFull s
+      ifM (not <$> hasUniversePolymorphism) (red s)
+      $ red =<< instantiateFull s
       where
-        red suc lub s = do
+        red s = do
           s <- instantiate s
           case s of
-            Suc s'     -> suc <$> reduce s'
-            Lub s1 s2  -> lub <$> reduce s1 <*> reduce s2
             DLub s1 s2 -> do
               s <- dLub <$> reduce s1 <*> reduce s2
               case s of
                 DLub{}  -> return s
                 _       -> reduce s   -- TODO: not so nice
             Prop       -> return s
-            Type s'    -> Type <$> reduce s'
-            MetaS m as -> MetaS m <$> reduce as
+            Type s'    -> levelSort <$> reduce s'
             Inf        -> return Inf
 
-instance Reduce t => Reduce (Abs t) where
-  reduce b = Abs (absName b) <$> underAbstraction_ b reduce
+instance Reduce Elim where
+  reduce (Apply v) = Apply <$> reduce v
+  reduce (Proj f)  = pure $ Proj f
 
+instance Reduce Level where
+  reduce  (Max as) = levelMax <$> mapM reduce as
+  reduceB (Max as) = fmap levelMax . traverse id <$> traverse reduceB as
+
+instance Reduce PlusLevel where
+  reduceB l@ClosedLevel{} = return $ notBlocked l
+  reduceB (Plus n l) = fmap (Plus n) <$> reduceB l
+
+instance Reduce LevelAtom where
+  reduceB l = case l of
+    MetaLevel m vs   -> fromTm (MetaV m vs)
+    NeutralLevel v   -> return $ NotBlocked $ NeutralLevel v
+    BlockedLevel m v ->
+      ifM (isInstantiatedMeta m) (fromTm v) (return $ Blocked m $ BlockedLevel m v)
+    UnreducedLevel v -> fromTm v
+    where
+      fromTm v = do
+        bv <- reduceB v
+        case bv of
+          Blocked m v             -> return $ Blocked m  $ BlockedLevel m v
+          NotBlocked (MetaV m vs) -> return $ NotBlocked $ MetaLevel m vs
+          NotBlocked v            -> return $ NotBlocked $ NeutralLevel v
+
+
+instance (Raise t, Reduce t) => Reduce (Abs t) where
+  reduce b@(Abs x _) = Abs x <$> underAbstraction_ b reduce
+  reduce (NoAbs x v) = NoAbs x <$> reduce v
+
 -- Lists are never blocked
 instance Reduce t => Reduce [t] where
     reduce = traverse reduce
@@ -210,52 +237,46 @@
     reduce (x,y,z) = (,,) <$> reduce x <*> reduce y <*> reduce z
 
 instance Reduce Term where
-    reduceB v =
-	{-# SCC "reduce<Term>" #-}
-	do  v <- instantiate v
-	    case v of
-		MetaV x args -> notBlocked . MetaV x <$> reduce args
-		Def f args   -> unfoldDefinition False reduceB (Def f []) f args
-		Con c args   -> do
-                    -- Constructors can reduce when they come from an
-                    -- instantiated module.
-		    v <- unfoldDefinition False reduceB (Con c []) c args
-		    traverse reduceNat v
-		Sort s	   -> fmap Sort <$> reduceB s
-		Pi _ _	   -> return $ notBlocked v
-		Fun _ _    -> return $ notBlocked v
-		Lit _	   -> return $ notBlocked v
-		Var _ _    -> return $ notBlocked v
-		Lam _ _    -> return $ notBlocked v
-		DontCare   -> return $ notBlocked v
-	where
-            -- NOTE: reduceNat can traverse the entire term.
-	    reduceNat v@(Con c []) = do
-		mz  <- getBuiltin' builtinZero
-                mlz <- getBuiltin' builtinLevelZero
-		case v of
-                  _ | Just v == mz  -> return $ Lit $ LitInt (getRange c) 0
-                    | Just v == mlz -> return $ Lit $ LitLevel (getRange c) 0
-		  _		    -> return v
-	    reduceNat v@(Con c [Arg NotHidden Relevant w]) = do
-		ms  <- getBuiltin' builtinSuc
-                mls <- getBuiltin' builtinLevelSuc
-		case v of
-                  _ | Just (Con c []) == ms ||
-                      Just (Con c []) == mls -> inc <$> reduce w
-		  _	                     -> return v
-                  where
-                    inc w = case w of
-                      Lit (LitInt r n) -> Lit (LitInt (fuseRange c r) $ n + 1)
-                      Lit (LitLevel r n) -> Lit (LitLevel (fuseRange c r) $ n + 1)
-                      _                  -> Con c [Arg NotHidden Relevant w]
-	    reduceNat v = return v
+  reduceB v = {-# SCC "reduce<Term>" #-} do
+    v <- instantiate v
+    case v of
+      MetaV x args -> notBlocked . MetaV x <$> reduce args
+      Def f args   -> unfoldDefinition False reduceB (Def f []) f args
+      Con c args   -> do
+          -- Constructors can reduce when they come from an
+          -- instantiated module.
+          v <- unfoldDefinition False reduceB (Con c []) c args
+          traverse reduceNat v
+      Sort s   -> fmap sortTm <$> reduceB s
+      Level l  -> fmap levelTm <$> reduceB l
+      Pi _ _   -> return $ notBlocked v
+      Lit _    -> return $ notBlocked v
+      Var _ _  -> return $ notBlocked v
+      Lam _ _  -> return $ notBlocked v
+      DontCare _ -> return $ notBlocked v
+    where
+      -- NOTE: reduceNat can traverse the entire term.
+      reduceNat v@(Con c []) = do
+        mz  <- getBuiltin' builtinZero
+        case v of
+          _ | Just v == mz  -> return $ Lit $ LitInt (getRange c) 0
+          _		    -> return v
+      reduceNat v@(Con c [Arg NotHidden Relevant w]) = do
+        ms  <- getBuiltin' builtinSuc
+        case v of
+          _ | Just (Con c []) == ms -> inc <$> reduce w
+          _	                    -> return v
+          where
+            inc w = case w of
+              Lit (LitInt r n) -> Lit (LitInt (fuseRange c r) $ n + 1)
+              _                -> Con c [Arg NotHidden Relevant w]
+      reduceNat v = return v
 
 -- | If the first argument is 'True', then a single delayed clause may
 -- be unfolded.
-unfoldDefinition :: MonadTCM tcm =>
-  Bool -> (Term -> tcm (Blocked Term)) ->
-  Term -> QName -> Args -> tcm (Blocked Term)
+unfoldDefinition ::
+  Bool -> (Term -> TCM (Blocked Term)) ->
+  Term -> QName -> Args -> TCM (Blocked Term)
 unfoldDefinition unfoldDelayed keepGoing v0 f args =
   {-# SCC "reduceDef" #-} do
   info <- getConstInfo f
@@ -265,11 +286,9 @@
     Primitive{primAbstr = ConcreteDef, primName = x, primClauses = cls} -> do
       pf <- getPrimitive x
       reducePrimitive x v0 f args pf (defDelayed info)
-                      (maybe [] (List.map translatedClause) cls)
-                      (defCompiled info)
+                      (maybe [] id cls) (defCompiled info)
     _  -> reduceNormal v0 f (map notReduced args) (defDelayed info)
-                       (List.map translatedClause $ defClauses info)
-                       (defCompiled info)
+                       (defClauses info) (defCompiled info)
   where
     reducePrimitive x v0 f args pf delayed cls mcc
         | n < ar    = return $ notBlocked $ v0 `apply` args -- not fully applied
@@ -278,47 +297,71 @@
             r <- def args1
             case r of
               NoReduction args1' ->
-                reduceNormal v0 f (args1' ++
-                                   map notReduced args2)
-                             delayed cls mcc
+                if null cls then
+                  return $ apply (Def f []) <$> traverse id (map mredToBlocked args1' ++ map notBlocked args2)
+                else
+                  reduceNormal v0 f (args1' ++
+                                     map notReduced args2)
+                               delayed cls mcc
               YesReduction v ->
                 keepGoing $ v `apply` args2
         where
             n	= genericLength args
             ar  = primFunArity pf
             def = primFunImplementation pf
+            mredToBlocked :: MaybeReduced a -> Blocked a
+            mredToBlocked (MaybeRed NotReduced  x) = notBlocked x
+            mredToBlocked (MaybeRed (Reduced b) x) = x <$ b
 
+    -- reduceNormal :: Term -> QName -> [MaybeReduced (Arg Term)] -> Delayed -> [Clause] -> Maybe CompiledClauses -> TCM (Blocked Term)
     reduceNormal v0 f args delayed def mcc = {-# SCC "reduceNormal" #-} do
         case def of
           _ | Delayed <- delayed,
               not unfoldDelayed -> defaultResult
           [] -> defaultResult -- no definition for head
-          cls@(Clause{ clausePats = ps } : _)
-            | length ps <= length args -> do
-                let (args1,args2') = splitAt (length ps) args
-                    args2 = map ignoreReduced args2'
-                ev <- maybe (appDef' v0 cls args1)
-                            (\cc -> appDef v0 cc args1) mcc
-                case ev of
-                  NoReduction  v -> return    $ v `apply` args2
-                  YesReduction v -> keepGoing $ v `apply` args2
-            | otherwise	-> defaultResult -- partial application
+          cls -> do
+            ev <- maybe (appDef' v0 cls args)
+                        (\cc -> appDef v0 cc args) mcc
+            case ev of
+              NoReduction v -> do
+                reportSDoc "tc.reduce" 90 $ vcat
+                  [ text "*** tried to reduce " <+> prettyTCM f
+                  , text "    args    " <+> prettyTCM (map (unArg . ignoreReduced) args)
+                  , text "    stuck on" <+> prettyTCM (ignoreBlocking v) ]
+                return v
+              YesReduction v -> do
+                reportSDoc "tc.reduce" 90 $ vcat
+                  [ text "*** reduced definition: " <+> prettyTCM f
+                  ]
+                reportSDoc "tc.reduce" 100 $ text "    result" <+> prettyTCM v
+                keepGoing v
       where defaultResult = return $ notBlocked $ v0 `apply` (map ignoreReduced args)
 
     -- Apply a defined function to it's arguments.
     --   The original term is the first argument applied to the third.
-    appDef :: MonadTCM tcm => Term -> CompiledClauses -> MaybeReducedArgs -> tcm (Reduced (Blocked Term) Term)
+    appDef :: Term -> CompiledClauses -> MaybeReducedArgs -> TCM (Reduced (Blocked Term) Term)
     appDef v cc args = liftTCM $ do
       r <- matchCompiled cc args
       case r of
         YesReduction t    -> return $ YesReduction t
         NoReduction args' -> return $ NoReduction $ fmap (apply v) args'
 
-    appDef' :: MonadTCM tcm => Term -> [Clause] -> MaybeReducedArgs -> tcm (Reduced (Blocked Term) Term)
-    appDef' v cls args = {-# SCC "appDef" #-} do
-      goCls cls (map ignoreReduced args) where
+    appDef' :: Term -> [Clause] -> MaybeReducedArgs -> TCM (Reduced (Blocked Term) Term)
+    appDef' _ [] _ = {- ' -} __IMPOSSIBLE__
+    appDef' v cls@(Clause {clausePats = ps} : _) args
+      | m < n     = return $ NoReduction $ notBlocked $ v `apply` map ignoreReduced args
+      | otherwise = do
+        let (args0, args1) = splitAt n args
+        r <- goCls cls (map ignoreReduced args0)
+        case r of
+          YesReduction u -> return $ YesReduction $ u `apply` map ignoreReduced args1
+          NoReduction v  -> return $ NoReduction $ (`apply` map ignoreReduced args1) <$> v
+      where
 
-        goCls :: MonadTCM tcm => [Clause] -> Args -> tcm (Reduced (Blocked Term) Term)
+        n = genericLength ps
+        m = genericLength args
+
+        goCls :: [Clause] -> Args -> TCM (Reduced (Blocked Term) Term)
         goCls [] args = typeError $ IncompletePatternMatching v args
         goCls (cl@(Clause { clausePats = pats
                           , clauseBody = body }) : cls) args = do
@@ -334,18 +377,15 @@
                       app args' body)
                   | otherwise	  -> return $ NoReduction $ notBlocked $ v `apply` args
 
-        hasBody (Body _)	 = True
-        hasBody NoBody		 = False
-        hasBody (Bind (Abs _ b)) = hasBody b
-        hasBody (NoBind b)	 = hasBody b
+        hasBody (Body _) = True
+        hasBody NoBody   = False
+        hasBody (Bind b) = hasBody (unAbs b)
 
-        app []		 (Body v')	     = v'
-        app (arg : args) (Bind (Abs _ body)) = {-# SCC "instRHS" #-} app args $ subst arg body -- CBN
-        app (_   : args) (NoBind body)	     = app args body
-        app  _		  NoBody	     = __IMPOSSIBLE__
-        app (_ : _)	 (Body _)	     = __IMPOSSIBLE__
-        app []		 (Bind _)	     = __IMPOSSIBLE__
-        app []		 (NoBind _)	     = __IMPOSSIBLE__
+        app []		 (Body v') = v'
+        app (arg : args) (Bind b)  = app args $ absApp b arg -- CBN
+        app  _		  NoBody   = __IMPOSSIBLE__
+        app (_ : _)	 (Body _)  = __IMPOSSIBLE__
+        app []		 (Bind _)  = __IMPOSSIBLE__
 
 
 instance Reduce a => Reduce (Closure a) where
@@ -360,15 +400,15 @@
   reduce (ValueCmp cmp t u v) = do
     (t,u,v) <- reduce (t,u,v)
     return $ ValueCmp cmp t u v
-  reduce (ArgsCmp cmp t us vs) = do
-    (t,us,vs) <- reduce (t,us,vs)
-    return $ ArgsCmp cmp t us vs
+  reduce (ElimCmp cmp t v as bs) =
+    ElimCmp cmp <$> reduce t <*> reduce v <*> reduce as <*> reduce bs
   reduce (LevelCmp cmp u v)   = uncurry (LevelCmp cmp) <$> reduce (u,v)
   reduce (TypeCmp cmp a b)    = uncurry (TypeCmp cmp) <$> reduce (a,b)
-  reduce (TelCmp  cmp a b)    = uncurry (TelCmp cmp)  <$> reduce (a,b)
+  reduce (TelCmp a b cmp tela telb) = uncurry (TelCmp a b cmp)  <$> reduce (tela,telb)
   reduce (SortCmp cmp a b)    = uncurry (SortCmp cmp) <$> reduce (a,b)
-  reduce (Guarded c cs)       = uncurry Guarded <$> reduce (c,cs)
+  reduce (Guarded c pid)      = Guarded <$> reduce c <*> pure pid
   reduce (UnBlock m)          = return $ UnBlock m
+  reduce (FindInScope m)      = return $ FindInScope m
   reduce (IsEmpty t)          = IsEmpty <$> reduce t
 
 instance (Ord k, Reduce e) => Reduce (Map k e) where
@@ -379,18 +419,15 @@
 ---------------------------------------------------------------------------
 
 class Normalise t where
-    normalise :: MonadTCM tcm => t -> tcm t
+    normalise :: t -> TCM t
 
 instance Normalise Sort where
     normalise s = do
       s <- reduce s
       case s of
-        Suc s'     -> sSuc <$> normalise s'
-        Lub s1 s2  -> sLub <$> normalise s1 <*> normalise s2
         DLub s1 s2 -> dLub <$> normalise s1 <*> normalise s2
         Prop       -> return s
-        Type s'    -> Type <$> normalise s'
-        MetaS m as -> MetaS m <$> normalise as
+        Type s     -> levelSort <$> normalise s
         Inf        -> return Inf
 
 instance Normalise Type where
@@ -405,20 +442,40 @@
 		Def f vs    -> Def f <$> normalise vs
 		MetaV x vs  -> MetaV x <$> normalise vs
 		Lit _	    -> return v
+                Level l     -> levelTm <$> normalise l
 		Lam h b	    -> Lam h <$> normalise b
-		Sort s	    -> Sort <$> normalise s
+		Sort s	    -> sortTm <$> normalise s
 		Pi a b	    -> uncurry Pi <$> normalise (a,b)
-		Fun a b     -> uncurry Fun <$> normalise (a,b)
-                DontCare    -> return v
+                DontCare _  -> return v
 
+instance Normalise Elim where
+  normalise (Apply v) = Apply <$> normalise v
+  normalise (Proj f)  = pure $ Proj f
+
+instance Normalise Level where
+  normalise (Max as) = levelMax <$> normalise as
+
+instance Normalise PlusLevel where
+  normalise l@ClosedLevel{} = return l
+  normalise (Plus n l) = Plus n <$> normalise l
+
+instance Normalise LevelAtom where
+  normalise l = do
+    l <- reduce l
+    case l of
+      MetaLevel m vs   -> MetaLevel m <$> normalise vs
+      BlockedLevel m v -> BlockedLevel m <$> normalise v
+      NeutralLevel v   -> NeutralLevel <$> normalise v
+      UnreducedLevel{} -> __IMPOSSIBLE__    -- I hope
+
 instance Normalise ClauseBody where
     normalise (Body   t) = Body   <$> normalise t
     normalise (Bind   b) = Bind   <$> normalise b
-    normalise (NoBind b) = NoBind <$> normalise b
     normalise  NoBody	 = return NoBody
 
-instance Normalise t => Normalise (Abs t) where
-    normalise a = Abs (absName a) <$> underAbstraction_ a normalise
+instance (Raise t, Normalise t) => Normalise (Abs t) where
+    normalise a@(Abs x _) = Abs x <$> underAbstraction_ a normalise
+    normalise (NoAbs x v) = NoAbs x <$> normalise v
 
 instance Normalise t => Normalise (Arg t) where
     normalise = traverse normalise
@@ -439,23 +496,26 @@
 	x <- enterClosure cl normalise
 	return $ cl { clValue = x }
 
-instance Normalise a => Normalise (Tele a) where
+instance (Raise a, Normalise a) => Normalise (Tele a) where
   normalise EmptyTel        = return EmptyTel
   normalise (ExtendTel a b) = uncurry ExtendTel <$> normalise (a, b)
 
+instance Normalise ProblemConstraint where
+  normalise (PConstr pid c) = PConstr pid <$> normalise c
+
 instance Normalise Constraint where
   normalise (ValueCmp cmp t u v) = do
     (t,u,v) <- normalise (t,u,v)
     return $ ValueCmp cmp t u v
-  normalise (ArgsCmp cmp t u v) = do
-    (t,u,v) <- normalise (t,u,v)
-    return $ ArgsCmp cmp t u v
+  normalise (ElimCmp cmp t v as bs) =
+    ElimCmp cmp <$> normalise t <*> normalise v <*> normalise as <*> normalise bs
   normalise (LevelCmp cmp u v)   = uncurry (LevelCmp cmp) <$> normalise (u,v)
   normalise (TypeCmp cmp a b)    = uncurry (TypeCmp cmp) <$> normalise (a,b)
-  normalise (TelCmp cmp a b)     = uncurry (TelCmp cmp)  <$> normalise (a,b)
+  normalise (TelCmp a b cmp tela telb) = uncurry (TelCmp a b cmp) <$> normalise (tela,telb)
   normalise (SortCmp cmp a b)    = uncurry (SortCmp cmp) <$> normalise (a,b)
-  normalise (Guarded c cs)       = uncurry Guarded <$> normalise (c,cs)
+  normalise (Guarded c pid)      = Guarded <$> normalise c <*> pure pid
   normalise (UnBlock m)          = return $ UnBlock m
+  normalise (FindInScope m)      = return $ FindInScope m
   normalise (IsEmpty t)          = IsEmpty <$> normalise t
 
 instance Normalise Pattern where
@@ -482,7 +542,7 @@
 -- How can we express this? We need higher order classes!
 
 class InstantiateFull t where
-    instantiateFull :: MonadTCM tcm => t -> tcm t
+    instantiateFull :: t -> TCM t
 
 instance InstantiateFull Name where
     instantiateFull = return
@@ -491,11 +551,8 @@
     instantiateFull s = do
 	s <- instantiate s
 	case s of
-	    MetaS x as -> MetaS x <$> instantiateFull as
-	    Type n     -> Type <$> instantiateFull n
+	    Type n     -> levelSort <$> instantiateFull n
 	    Prop       -> return s
-	    Suc s      -> sSuc <$> instantiateFull s
-	    Lub s1 s2  -> sLub <$> instantiateFull s1 <*> instantiateFull s2
 	    DLub s1 s2 -> dLub <$> instantiateFull s1 <*> instantiateFull s2
             Inf        -> return s
 
@@ -513,12 +570,33 @@
           Def f vs    -> Def f <$> instantiateFull vs
           MetaV x vs  -> MetaV x <$> instantiateFull vs
           Lit _	      -> return v
+          Level l     -> levelTm <$> instantiateFull l
           Lam h b     -> Lam h <$> instantiateFull b
-          Sort s      -> Sort <$> instantiateFull s
+          Sort s      -> sortTm <$> instantiateFull s
           Pi a b      -> uncurry Pi <$> instantiateFull (a,b)
-          Fun a b     -> uncurry Fun <$> instantiateFull (a,b)
-          DontCare    -> return v
+          DontCare v  -> DontCare <$> instantiateFull v
 
+instance InstantiateFull Level where
+  instantiateFull (Max as) = levelMax <$> instantiateFull as
+
+instance InstantiateFull PlusLevel where
+  instantiateFull l@ClosedLevel{} = return l
+  instantiateFull (Plus n l) = Plus n <$> instantiateFull l
+
+instance InstantiateFull LevelAtom where
+  instantiateFull l = case l of
+    MetaLevel m vs -> do
+      v <- instantiateFull (MetaV m vs)
+      case v of
+        MetaV m vs -> return $ MetaLevel m vs
+        _          -> return $ UnreducedLevel v
+    NeutralLevel v -> NeutralLevel <$> instantiateFull v
+    BlockedLevel m v ->
+      ifM (isInstantiatedMeta m)
+          (UnreducedLevel <$> instantiateFull v)
+          (BlockedLevel m <$> instantiateFull v)
+    UnreducedLevel v -> UnreducedLevel <$> instantiateFull v
+
 instance InstantiateFull Pattern where
     instantiateFull v@VarP{}       = return v
     instantiateFull (DotP t)       = DotP <$> instantiateFull t
@@ -528,11 +606,11 @@
 instance InstantiateFull ClauseBody where
     instantiateFull (Body   t) = Body   <$> instantiateFull t
     instantiateFull (Bind   b) = Bind   <$> instantiateFull b
-    instantiateFull (NoBind b) = NoBind <$> instantiateFull b
     instantiateFull  NoBody    = return NoBody
 
-instance InstantiateFull t => InstantiateFull (Abs t) where
-    instantiateFull a = Abs (absName a) <$> underAbstraction_ a instantiateFull
+instance (Raise t, InstantiateFull t) => InstantiateFull (Abs t) where
+    instantiateFull a@(Abs x _) = Abs x <$> underAbstraction_ a instantiateFull
+    instantiateFull (NoAbs x a) = NoAbs x <$> instantiateFull a
 
 instance InstantiateFull t => InstantiateFull (Arg t) where
     instantiateFull = traverse instantiateFull
@@ -553,22 +631,29 @@
 	x <- enterClosure cl instantiateFull
 	return $ cl { clValue = x }
 
+instance InstantiateFull ProblemConstraint where
+  instantiateFull (PConstr p c) = PConstr p <$> instantiateFull c
+
 instance InstantiateFull Constraint where
   instantiateFull c = case c of
     ValueCmp cmp t u v -> do
       (t,u,v) <- instantiateFull (t,u,v)
       return $ ValueCmp cmp t u v
-    ArgsCmp cmp t u v -> do
-      (t,u,v) <- instantiateFull (t,u,v)
-      return $ ArgsCmp cmp t u v
+    ElimCmp cmp t v as bs ->
+      ElimCmp cmp <$> instantiateFull t <*> instantiateFull v <*> instantiateFull as <*> instantiateFull bs
     LevelCmp cmp u v   -> uncurry (LevelCmp cmp) <$> instantiateFull (u,v)
     TypeCmp cmp a b    -> uncurry (TypeCmp cmp) <$> instantiateFull (a,b)
-    TelCmp cmp a b     -> uncurry (TelCmp cmp)  <$> instantiateFull (a,b)
+    TelCmp a b cmp tela telb -> uncurry (TelCmp a b cmp) <$> instantiateFull (tela,telb)
     SortCmp cmp a b    -> uncurry (SortCmp cmp) <$> instantiateFull (a,b)
-    Guarded c cs       -> uncurry Guarded <$> instantiateFull (c,cs)
+    Guarded c pid      -> Guarded <$> instantiateFull c <*> pure pid
     UnBlock m          -> return $ UnBlock m
+    FindInScope m      -> return $ FindInScope m
     IsEmpty t          -> IsEmpty <$> instantiateFull t
 
+instance InstantiateFull Elim where
+  instantiateFull (Apply v) = Apply <$> instantiateFull v
+  instantiateFull (Proj f)  = pure $ Proj f
+
 instance (Ord k, InstantiateFull e) => InstantiateFull (Map k e) where
     instantiateFull = traverse instantiateFull
 
@@ -584,7 +669,7 @@
 instance InstantiateFull Section where
   instantiateFull (Section tel n) = flip Section n <$> instantiateFull tel
 
-instance InstantiateFull a => InstantiateFull (Tele a) where
+instance (Raise a, InstantiateFull a) => InstantiateFull (Tele a) where
   instantiateFull EmptyTel = return EmptyTel
   instantiateFull (ExtendTel a b) = uncurry ExtendTel <$> instantiateFull (a, b)
 
@@ -592,9 +677,9 @@
     instantiateFull = return
 
 instance InstantiateFull Definition where
-    instantiateFull (Defn rel x t df i d) = do
+    instantiateFull (Defn rel x t df i c d) = do
       (t, (df, d)) <- instantiateFull (t, (df, d))
-      return $ Defn rel x t df i d
+      return $ Defn rel x t df i c d
 
 instance InstantiateFull a => InstantiateFull (Open a) where
   instantiateFull (OpenThing n a) = OpenThing n <$> instantiateFull a
@@ -604,6 +689,9 @@
 
 instance InstantiateFull DisplayTerm where
   instantiateFull (DTerm v)	   = DTerm <$> instantiateFull v
+  instantiateFull (DDot  v)	   = DDot  <$> instantiateFull v
+  instantiateFull (DCon c vs)	   = DCon c <$> instantiateFull vs
+  instantiateFull (DDef c vs)	   = DDef c <$> instantiateFull vs
   instantiateFull (DWithApp vs ws) = uncurry DWithApp <$> instantiateFull (vs, ws)
 
 instance InstantiateFull Defn where
@@ -641,10 +729,6 @@
   instantiateFull (Done m t)  = Done m <$> instantiateFull t
   instantiateFull (Case n bs) = Case n <$> instantiateFull bs
 
-instance InstantiateFull Clauses where
-    instantiateFull (Clauses c tc) =
-       Clauses <$> instantiateFull c <*> instantiateFull tc
-
 instance InstantiateFull Clause where
     instantiateFull (Clause r tel perm ps b) =
        Clause r <$> instantiateFull tel
@@ -669,12 +753,13 @@
 instance InstantiateFull a => InstantiateFull (Maybe a) where
   instantiateFull = mapM instantiateFull
 
-telViewM :: MonadTCM tcm => Type -> tcm TelView
+-- | @telViewM t@ is like @telView' t@, but it reduces @t@ to expose
+--   function type constructors.
+telViewM :: Type -> TCM TelView
 telViewM t = do
-  t <- reduce t
+  t <- reduce t -- also instantiates meta if in head position
   case unEl t of
-    Pi a (Abs x b) -> absV a x <$> telViewM b
-    Fun a b	   -> absV a "_" <$> telViewM (raise 1 b)
-    _		   -> return $ TelV EmptyTel t
+    Pi a b -> absV a (absName b) <$> telViewM (absBody b)
+    _      -> return $ TelV EmptyTel t
   where
     absV a x (TelV tel t) = TelV (ExtendTel a (Abs x tel)) t
diff --git a/src/full/Agda/TypeChecking/Rules/Builtin.hs b/src/full/Agda/TypeChecking/Rules/Builtin.hs
--- a/src/full/Agda/TypeChecking/Rules/Builtin.hs
+++ b/src/full/Agda/TypeChecking/Rules/Builtin.hs
@@ -1,15 +1,17 @@
 {-# LANGUAGE PatternGuards, CPP #-}
-module Agda.TypeChecking.Rules.Builtin where
+module Agda.TypeChecking.Rules.Builtin (bindBuiltin, bindPostulatedName) where
 
 import Control.Applicative
 import Control.Monad
 import Control.Monad.Error
 import Data.Maybe
+import Data.List (find)
 
 import qualified Agda.Syntax.Abstract as A
 import Agda.Syntax.Internal
 import Agda.Syntax.Common
 
+import Agda.TypeChecking.EtaContract
 import Agda.TypeChecking.Monad
 import Agda.TypeChecking.Monad.Builtin
 import Agda.TypeChecking.Conversion
@@ -19,7 +21,7 @@
 import Agda.TypeChecking.Reduce
 import Agda.TypeChecking.Pretty
 
-import Agda.TypeChecking.Rules.Term ( checkExpr )
+import Agda.TypeChecking.Rules.Term ( checkExpr , inferExpr )
 import {-# SOURCE #-} Agda.TypeChecking.Rules.Builtin.Coinduction
 
 import Agda.Utils.Size
@@ -31,158 +33,117 @@
 -- * Checking builtin pragmas
 ---------------------------------------------------------------------------
 
--- Buitin datatypes and the number of constructors
-builtinDatatypes :: [(String, Int)]
-builtinDatatypes =
-  [ (builtinList, 2)
-  , (builtinBool, 2)
-  , (builtinNat, 2)
-  , (builtinLevel, 2)
+coreBuiltins :: [BuiltinInfo]
+coreBuiltins = map (\(x,z) -> BuiltinInfo x z)
+  [ (builtinList               |-> BuiltinData (tset --> tset) [builtinNil, builtinCons])
+  , (builtinArg                |-> BuiltinData (tset --> tset) [builtinArgArg])
+  , (builtinBool               |-> BuiltinData tset [builtinTrue, builtinFalse])
+  , (builtinNat                |-> BuiltinData tset [builtinZero, builtinSuc])
+  , (builtinLevel              |-> BuiltinPostulate tset)
+  , (builtinInteger            |-> BuiltinPostulate tset)
+  , (builtinFloat              |-> BuiltinPostulate tset)
+  , (builtinChar               |-> BuiltinPostulate tset)
+  , (builtinString             |-> BuiltinPostulate tset)
+  , (builtinQName              |-> BuiltinPostulate tset)
+  , (builtinIO                 |-> BuiltinPostulate (tset --> tset))
+  , (builtinAgdaSort           |-> BuiltinData tset [builtinAgdaSortSet, builtinAgdaSortLit, builtinAgdaSortUnsupported])
+  , (builtinAgdaType           |-> BuiltinData tset [builtinAgdaTypeEl])
+  , (builtinAgdaTerm           |-> BuiltinData tset
+                                     [builtinAgdaTermVar, builtinAgdaTermLam
+                                     ,builtinAgdaTermDef, builtinAgdaTermCon
+                                     ,builtinAgdaTermPi, builtinAgdaTermSort
+                                     ,builtinAgdaTermUnsupported])
+  , (builtinEquality           |-> BuiltinData (hPi "a" (el primLevel) $
+                                                hPi "A" (return $ sort $ varSort 0) $
+                                                (El (varSort 1) <$> var 0) -->
+                                                (El (varSort 1) <$> var 0) -->
+                                                return (sort $ varSort 1))
+                                               [builtinRefl])
+  , (builtinHiding             |-> BuiltinData tset [builtinHidden, builtinInstance, builtinVisible])
+  , (builtinRelevance          |-> BuiltinData tset [builtinRelevant, builtinIrrelevant])
+  , (builtinRefl               |-> BuiltinDataCons (hPi "a" (el primLevel) $ hPi "A" (return $ sort $ varSort 0) $
+                                                    hPi "x" (El (varSort 1) <$> var 0) $
+                                                    El (varSort 2) <$> primEquality <#> var 2 <#> var 1 <@> var 0 <@> var 0))
+  , (builtinNil                |-> BuiltinDataCons (hPi "A" tset (el (list v0))))
+  , (builtinCons               |-> BuiltinDataCons (hPi "A" tset (tv0 --> el (list v0) --> el (list v0))))
+  , (builtinZero               |-> BuiltinDataCons tnat)
+  , (builtinSuc                |-> BuiltinDataCons (tnat --> tnat))
+  , (builtinTrue               |-> BuiltinDataCons tbool)
+  , (builtinFalse              |-> BuiltinDataCons tbool)
+  , (builtinArgArg             |-> BuiltinDataCons (hPi "A" tset (thiding --> trelevance --> tv0 --> targ tv0)))
+  , (builtinAgdaTypeEl         |-> BuiltinDataCons (tsort --> tterm --> ttype))
+  , (builtinAgdaTermVar        |-> BuiltinDataCons (tnat --> targs --> tterm))
+  , (builtinAgdaTermLam        |-> BuiltinDataCons (thiding --> tterm --> tterm))
+  , (builtinAgdaTermDef        |-> BuiltinDataCons (tqname --> targs --> tterm))
+  , (builtinAgdaTermCon        |-> BuiltinDataCons (tqname --> targs --> tterm))
+  , (builtinAgdaTermPi         |-> BuiltinDataCons (targ ttype --> ttype --> tterm))
+  , (builtinAgdaTermSort       |-> BuiltinDataCons (tsort --> tterm))
+  , (builtinAgdaTermUnsupported|-> BuiltinDataCons tterm)
+  , (builtinHidden             |-> BuiltinDataCons thiding)
+  , (builtinInstance           |-> BuiltinDataCons thiding)
+  , (builtinVisible            |-> BuiltinDataCons thiding)
+  , (builtinRelevant           |-> BuiltinDataCons trelevance)
+  , (builtinIrrelevant         |-> BuiltinDataCons trelevance)
+  , (builtinSize               |-> BuiltinPostulate tset)
+  , (builtinSizeSuc            |-> BuiltinPostulate (tsize --> tsize))
+  , (builtinSizeInf            |-> BuiltinPostulate tsize)
+  , (builtinAgdaSortSet        |-> BuiltinDataCons (tterm --> tsort))
+  , (builtinAgdaSortLit        |-> BuiltinDataCons (tnat --> tsort))
+  , (builtinAgdaSortUnsupported|-> BuiltinDataCons tsort)
+  , (builtinNatPlus            |-> BuiltinPrim "primNatPlus" verifyPlus)
+  , (builtinNatMinus           |-> BuiltinPrim "primNatMinus" verifyMinus)
+  , (builtinNatTimes           |-> BuiltinPrim "primNatTimes" verifyTimes)
+  , (builtinNatDivSucAux       |-> BuiltinPrim "primNatDivSucAux" verifyDivSucAux)
+  , (builtinNatModSucAux       |-> BuiltinPrim "primNatModSucAux" verifyModSucAux)
+  , (builtinNatEquals          |-> BuiltinPrim "primNatEquality" verifyEquals)
+  , (builtinNatLess            |-> BuiltinPrim "primNatLess" verifyLess)
+  , (builtinLevelZero          |-> BuiltinPrim "primLevelZero" (const $ return ()))
+  , (builtinLevelSuc           |-> BuiltinPrim "primLevelSuc" (const $ return ()))
+  , (builtinLevelMax           |-> BuiltinPrim "primLevelMax" verifyMax)
+  , (builtinAgdaFunDef                |-> BuiltinPostulate tset) -- internally this is QName
+  , (builtinAgdaDataDef               |-> BuiltinPostulate tset) -- internally this is QName
+  , (builtinAgdaRecordDef             |-> BuiltinPostulate tset) -- internally this is QName
+  , (builtinAgdaDefinition            |-> BuiltinData tset [builtinAgdaDefinitionFunDef
+                                                           ,builtinAgdaDefinitionDataDef
+                                                           ,builtinAgdaDefinitionDataConstructor
+                                                           ,builtinAgdaDefinitionRecordDef
+                                                           ,builtinAgdaDefinitionPostulate
+                                                           ,builtinAgdaDefinitionPrimitive])
+  , (builtinAgdaDefinitionFunDef          |-> BuiltinDataCons (tfun --> tdefn))
+  , (builtinAgdaDefinitionDataDef         |-> BuiltinDataCons (tdtype --> tdefn))
+  , (builtinAgdaDefinitionDataConstructor |-> BuiltinDataCons tdefn)
+  , (builtinAgdaDefinitionRecordDef       |-> BuiltinDataCons (trec --> tdefn))
+  , (builtinAgdaDefinitionPostulate       |-> BuiltinDataCons tdefn)
+  , (builtinAgdaDefinitionPrimitive       |-> BuiltinDataCons tdefn)
   ]
-
-inductiveCheck :: String -> Term -> TCM ()
-inductiveCheck b t =
-  case lookup b builtinDatatypes of
-    Nothing -> return ()
-    Just n  -> do
-      t <- normalise t
-      let err = typeError (NotInductive t)
-      case t of
-        Def t _ -> do
-          t <- theDef <$> getConstInfo t
-          case t of
-            Datatype { dataInduction = Inductive
-                     , dataCons      = cs
-                     }
-              | length cs == n -> return ()
-              | otherwise ->
-                typeError $ GenericError $ unwords
-                            [ "The builtin", b
-                            , "must be a datatype with", show n
-                            , "constructors" ]
-            _ -> err
-        _ -> err
-
-bindBuiltinType :: String -> A.Expr -> TCM ()
-bindBuiltinType b e = do
-    let s = sort $ mkType 0
-    reportSDoc "tc.builtin" 20 $ text "checking builtin type" <+> prettyA e <+> text ":" <+> text (show s)
-    t <- checkExpr e (sort $ mkType 0)
-    inductiveCheck b t
-    bindBuiltinName b t
-
-    -- NAT and LEVEL must be different. (Why?)
-    when (b `elem` [builtinNat, builtinLevel]) $ do
-      nat   <- getBuiltin' builtinNat
-      level <- getBuiltin' builtinLevel
-      case (nat, level) of
-        (Just nat, Just level) -> do
-          Def nat   _ <- normalise nat
-          Def level _ <- normalise level
-          when (nat == level) $ typeError $ GenericError $
-            builtinNat ++ " and " ++ builtinLevel ++
-            " have to be different types."
-        _ -> return ()
-
-bindBuiltinBool :: String -> A.Expr -> TCM Term
-bindBuiltinBool b e = do
-    bool <- primBool
-    checkExpr e $ El (mkType 0) bool
-
--- | Bind something of type @Set -> Set@.
-bindBuiltinType1 :: String -> A.Expr -> TCM ()
-bindBuiltinType1 thing e = do
-    let set      = sort (mkType 0)
-        setToSet = El (mkType 1) $ Fun (defaultArg set) set
-    f <- checkExpr e setToSet
-    inductiveCheck thing f
-    bindBuiltinName thing f
-
-bindBuiltinZero' :: String -> TCM Term -> A.Expr -> TCM Term
-bindBuiltinZero' bZero pNat e = do
-    nat  <- pNat
-    checkExpr e (El (mkType 0) nat)
-
-bindBuiltinSuc' :: String -> TCM Term -> A.Expr -> TCM Term
-bindBuiltinSuc' bSuc pNat e = do
-    nat  <- pNat
-    let nat' = El (mkType 0) nat
-        natToNat = El (mkType 0) $ Fun (defaultArg nat') nat'
-    checkExpr e natToNat
-
-bindBuiltinZero e = bindBuiltinZero' builtinZero primNat e
-bindBuiltinSuc  e = bindBuiltinSuc'  builtinSuc primNat e
-
-bindBuiltinLevelZero e = bindBuiltinZero' builtinLevelZero primLevel e
-bindBuiltinLevelSuc  e = bindBuiltinSuc'  builtinLevelSuc  primLevel e
-
-typeOfSizeInf :: TCM Type
-typeOfSizeInf = do
-    sz  <- primSize
-    return $ (El (mkType 0) sz)
-
-typeOfSizeSuc :: TCM Type
-typeOfSizeSuc = do
-    sz  <- primSize
-    let sz' = El (mkType 0) sz
-    return $ El (mkType 0) $ Fun (defaultArg sz') sz'
-
--- | Built-in nil should have type @{A:Set} -> List A@
-bindBuiltinNil :: A.Expr -> TCM Term
-bindBuiltinNil e = do
-    list' <- primList
-    let set     = sort (mkType 0)
-        list a  = El (mkType 0) (list' `apply` [defaultArg a])
-        nilType = telePi (telFromList [Arg Hidden Relevant ("A",set)]) $ list (Var 0 [])
-    checkExpr e nilType
-
--- | Built-in cons should have type @{A:Set} -> A -> List A -> List A@
-bindBuiltinCons :: A.Expr -> TCM Term
-bindBuiltinCons e = do
-    list' <- primList
-    let set       = sort (mkType 0)
-        el        = El (mkType 0)
-        a         = Var 0 []
-        list x    = el $ list' `apply` [defaultArg x]
-        hPi x a b = telePi (telFromList [Arg Hidden Relevant (x,a)]) b
-        fun a b   = el $ Fun (defaultArg a) b
-        consType  = hPi "A" set $ el a `fun` (list a `fun` list a)
-    checkExpr e consType
-
-bindBuiltinPrimitive :: String -> String -> A.Expr -> (Term -> TCM ()) -> TCM ()
-bindBuiltinPrimitive name builtin (A.ScopedExpr scope e) verify = do
-  setScope scope
-  bindBuiltinPrimitive name builtin e verify
-bindBuiltinPrimitive name builtin e@(A.Def qx) verify = do
-    PrimImpl t pf <- lookupPrimitiveFunction name
-    v <- checkExpr e t
+  where
+        (|->) = (,)
 
-    verify v
+        v0 = var 0
+        v1 = var 1
 
-    info <- getConstInfo qx
-    let cls = defClauses info
-        a   = defAbstract info
-        mcc = defCompiled info
-    bindPrimitive name $ pf { primFunName = qx }
-    addConstant qx $ info { theDef = Primitive a name (Just cls) mcc }
+        tv0,tv1 :: TCM Type
+        tv0 = el v0
+        tv1 = el v1
 
-    -- needed? yes, for checking equations for mul
-    bindBuiltinName builtin v
-bindBuiltinPrimitive _ b _ _ = typeError $ GenericError $ "Builtin " ++ b ++ " must be bound to a function"
+        arg :: TCM Term -> TCM Term
+        arg t = primArg <@> t
 
-builtinPrimitives :: [ (String, (String, Term -> TCM ())) ]
-builtinPrimitives =
-    [ "NATPLUS"       |-> ("primNatPlus", verifyPlus)
-    , "NATMINUS"      |-> ("primNatMinus", verifyMinus)
-    , "NATTIMES"      |-> ("primNatTimes", verifyTimes)
-    , "NATDIVSUCAUX"  |-> ("primNatDivSucAux", verifyDivSucAux)
-    , "NATMODSUCAUX"  |-> ("primNatModSucAux", verifyModSucAux)
-    , "NATEQUALS"     |-> ("primNatEquality", verifyEquals)
-    , "NATLESS"       |-> ("primNatLess", verifyLess)
-    , builtinLevelMax |-> ("primLevelMax", verifyMax)
-    ]
-    where
-        (|->) = (,)
+        targ x     = el (arg (fmap unEl x))
+        targs      = el (list (arg primAgdaTerm))
+        tterm      = el primAgdaTerm
+        tqname     = el primQName
+        tnat       = el primNat
+        tsize      = el primSize
+        tbool      = el primBool
+        thiding    = el primHiding
+        trelevance = el primRelvance
+        ttype      = el primAgdaType
+        tsort      = el primAgdaSort
+        tdefn      = el primAgdaDefinition
+        tfun       = el primAgdaFunDef
+        tdtype     = el primAgdaDataDef
+        trec       = el primAgdaRecordDef
 
         verifyPlus plus =
             verify ["n","m"] $ \(@@) zero suc (==) choice -> do
@@ -276,16 +237,7 @@
             (suc n < suc m) === (n < m)
             (zero  < suc m) === true
 
-        verifyMax maxV =
-            verify' primLevel primLevelZero primLevelSuc ["n","m"] $
-              \(@@) zero suc (==) choice -> do
-                let m = Var 0 []
-                    n = Var 1 []
-                    max x y = maxV @@ x @@ y
-
-                max zero (suc n)    == suc n
-                max (suc n) zero    == suc n
-                max (suc n) (suc m) == suc (max n m)
+        verifyMax maxV = return ()  -- TODO: make max a postulate
 
         verify xs = verify' primNat primZero primSuc xs
 
@@ -304,35 +256,26 @@
             xs <- mapM freshName_ xs
             addCtxs xs (defaultArg nat) $ f (@@) zero suc (==) choice
 
-bindBuiltinEquality :: A.Expr -> TCM ()
-bindBuiltinEquality e = do
-  let set       = sort (mkType 0)
-      el        = El (mkType 0)
-      a         = Var 0 []
-      hPi x a b = telePi (telFromList [Arg Hidden Relevant (x,a)]) b
-      fun a b   = El (mkType 1) $ Fun (defaultArg a) b
-      eqType    = hPi "A" set $ el a `fun` (el a `fun` set)
-  eq <- checkExpr e eqType
-  bindBuiltinName builtinEquality eq
 
-
-bindBuiltinRefl :: A.Expr -> TCM Term
-bindBuiltinRefl e = do
-  eq' <- primEquality
-  let set       = sort (mkType 0)
-      el        = El (mkType 0)
-      v0        = Var 0 []
-      v1        = Var 1 []
-      hPi x a b = telePi (telFromList [Arg Hidden Relevant (x, a)]) b
-      fun a b   = el $ Fun (defaultArg a) b
-      eq a b c  = el $ eq' `apply` [Arg Hidden Relevant a, defaultArg b, defaultArg c]
-      reflType  = hPi "A" set $ hPi "x" (el v0) $ eq v1 v0 v0
-  checkExpr e reflType
-
-bindBuiltinDummyConstructor :: A.Expr -> TCM Term
-bindBuiltinDummyConstructor (A.ScopedExpr _ e) = bindBuiltinDummyConstructor e
-bindBuiltinDummyConstructor (A.Con (AmbQ [c])) = return (Con c [])
-bindBuiltinDummyConstructor e = typeError $ GenericError "bad BUILTIN"
+inductiveCheck :: String -> Int -> Term -> TCM ()
+inductiveCheck b n t = do
+    t <- etaContract =<< normalise t
+    let err = typeError (NotInductive t)
+    case t of
+      Def t _ -> do
+        t <- theDef <$> getConstInfo t
+        case t of
+          Datatype { dataInduction = Inductive
+                   , dataCons      = cs
+                   }
+            | length cs == n -> return ()
+            | otherwise ->
+              typeError $ GenericError $ unwords
+                          [ "The builtin", b
+                          , "must be a datatype with", show n
+                          , "constructors" ]
+          _ -> err
+      _ -> err
 
 -- | @bindPostulatedName builtin e m@ checks that @e@ is a postulated
 -- name @q@, and binds the builtin @builtin@ to the term @m q def@,
@@ -355,57 +298,81 @@
   getName (A.ScopedExpr _ e) = getName e
   getName _                  = err
 
--- | Builtin constructors
-builtinConstructors :: [(String, A.Expr -> TCM Term)]
-builtinConstructors =
-  [ (builtinNil,       bindBuiltinNil               )
-  , (builtinCons,      bindBuiltinCons              )
-  , (builtinZero,      bindBuiltinZero              )
-  , (builtinSuc,       bindBuiltinSuc               )
-  , (builtinTrue,      bindBuiltinBool builtinTrue  )
-  , (builtinFalse,     bindBuiltinBool builtinFalse )
-  , (builtinRefl,      bindBuiltinRefl              )
-  , (builtinLevelZero, bindBuiltinLevelZero         )
-  , (builtinLevelSuc,  bindBuiltinLevelSuc          )
-  , (builtinArgArg,    bindBuiltinDummyConstructor  )
-  , (builtinAgdaTermVar,    bindBuiltinDummyConstructor  )
-  , (builtinAgdaTermLam,    bindBuiltinDummyConstructor  )
-  , (builtinAgdaTermDef,    bindBuiltinDummyConstructor  )
-  , (builtinAgdaTermCon,    bindBuiltinDummyConstructor  )
-  , (builtinAgdaTermPi,     bindBuiltinDummyConstructor  )
-  , (builtinAgdaTermSort,    bindBuiltinDummyConstructor  )
-  , (builtinAgdaTermUnsupported,    bindBuiltinDummyConstructor  )
-  ]
+bindBuiltinInfo :: BuiltinInfo -> A.Expr -> TCM ()
+bindBuiltinInfo i (A.ScopedExpr scope e) = setScope scope >> bindBuiltinInfo i e
+bindBuiltinInfo (BuiltinInfo s d) e = do
+    case d of
+      BuiltinData t cs -> do
+                           e' <- checkExpr e =<< t
+                           let n = length cs
+                           inductiveCheck s n e'
+                           bindBuiltinName s e'
+                           -- NAT and LEVEL must be different. (Why?)
+                           when (s `elem` [builtinNat, builtinLevel]) $ do
+                             nat   <- getBuiltin' builtinNat
+                             level <- getBuiltin' builtinLevel
+                             case (nat, level) of
+                               (Just nat, Just level) -> do
+                                  Def nat   _ <- normalise nat
+                                  Def level _ <- normalise level
+                                  when (nat == level) $ typeError $ GenericError $
+                                    builtinNat ++ " and " ++ builtinLevel ++
+                                    " have to be different types."
+                               _ -> return ()
 
--- | Builtin postulates
-builtinPostulates :: [(String, TCM Type)]
-builtinPostulates =
-  [ (builtinSize,    return $ sort $ mkType 0 )
-  , (builtinSizeSuc, typeOfSizeSuc            )
-  , (builtinSizeInf, typeOfSizeInf            )
-  ]
 
--- | Bind a builtin constructor. Pre-condition: argument is an element of
---   'builtinConstructors'.
-bindConstructor :: String -> (A.Expr -> TCM Term) -> A.Expr -> TCM ()
-bindConstructor s check (A.ScopedExpr scope e) = do
-  setScope scope
-  bindConstructor s check e
-bindConstructor s check e@(A.Con _) = do
-  t <- check e
-  -- The constructor might have been eta expanded during type checking
-  let name (Lam h b) = name (absBody b)
-      name (Con c _) = Con c []
-      name _         = __IMPOSSIBLE__
-  bindBuiltinName s (name t)
-bindConstructor s _ e               = typeError $ BuiltinMustBeConstructor s e
+      BuiltinDataCons t -> do
 
--- | Bind a builtin postulate. Pre-condition: argument is an element of
---   'builtinPostulates'.
-bindPostulate :: String -> TCM Type -> A.Expr -> TCM ()
-bindPostulate builtin typ e = bindPostulatedName builtin e $ \q _ ->
-  checkExpr (A.Def q) =<< typ
+        let name (Lam h b) = name (absBody b)
+            name (Con c _) = Con c []
+            name _         = __IMPOSSIBLE__
 
+        e' <- checkExpr e =<< t
+
+        case e of
+          A.Con _ -> return ()
+          _       -> typeError $ BuiltinMustBeConstructor s e
+
+        bindBuiltinName s (name e')
+
+      BuiltinPrim pfname axioms -> do
+	case e of
+	  A.Def qx -> do
+
+            PrimImpl t pf <- lookupPrimitiveFunction pfname
+            v <- checkExpr e t
+
+            axioms v
+
+            info <- getConstInfo qx
+            let cls = defClauses info
+                a   = defAbstract info
+                mcc = defCompiled info
+            bindPrimitive pfname $ pf { primFunName = qx }
+            addConstant qx $ info { theDef = Primitive a pfname (Just cls) mcc }
+
+            -- needed? yes, for checking equations for mul
+            bindBuiltinName s v
+
+	  _ -> typeError $ GenericError $ "Builtin " ++ s ++ " must be bound to a function"
+
+      BuiltinPostulate t -> do
+        e' <- checkExpr e =<< t
+        let err = typeError $ GenericError $
+                    "The argument to BUILTIN " ++ s ++ " must be a postulated name"
+        case e of
+          A.Def q -> do
+            def <- ignoreAbstractMode $ getConstInfo q
+            case theDef def of
+              Axiom {} -> bindBuiltinName s e'
+              _        -> err
+          _ -> err
+
+      BuiltinUnknown mt f -> do
+        e' <- maybe (fst <$> inferExpr e) (checkExpr e =<<) mt
+        f e'
+        bindBuiltinName s e'
+
 -- | Bind a builtin thing to an expression.
 bindBuiltin :: String -> A.Expr -> TCM ()
 bindBuiltin b e = do
@@ -414,13 +381,8 @@
     bind b e
     where
         bind b e
-            | elem b builtinTypes                        = bindBuiltinType b e
-            | elem b [builtinList,builtinArg]            = bindBuiltinType1 b e
-            | b == builtinEquality                       = bindBuiltinEquality e
-            | b == builtinInf                            = bindBuiltinInf e
-            | b == builtinSharp                          = bindBuiltinSharp e
-            | b == builtinFlat                           = bindBuiltinFlat e
-            | Just bind  <- lookup b builtinConstructors = bindConstructor b bind e
-            | Just (s,v) <- lookup b builtinPrimitives   = bindBuiltinPrimitive s b e v
-            | Just typ   <- lookup b builtinPostulates   = bindPostulate b typ e
-            | otherwise                                  = typeError $ NoSuchBuiltinName b
+            | b == builtinInf                                   = bindBuiltinInf e
+            | b == builtinSharp                                 = bindBuiltinSharp e
+            | b == builtinFlat                                  = bindBuiltinFlat e
+            | Just i <- find ((==b) . builtinName) coreBuiltins = bindBuiltinInfo i e
+            | otherwise                                         = typeError $ NoSuchBuiltinName b
diff --git a/src/full/Agda/TypeChecking/Rules/Builtin/Coinduction.hs b/src/full/Agda/TypeChecking/Rules/Builtin/Coinduction.hs
--- a/src/full/Agda/TypeChecking/Rules/Builtin/Coinduction.hs
+++ b/src/full/Agda/TypeChecking/Rules/Builtin/Coinduction.hs
@@ -34,51 +34,24 @@
 -- | The type of @&#x221e@.
 
 typeOfInf :: TCM Type
-typeOfInf = do
-  kit <- requireLevels
-  return $
-    El Inf (Pi (argH $ El (Type (Lit (LitLevel noRange 0))) (levelType kit))
-               (Abs "a" $ El (Type (levelSuc kit (Var 0 [])))
-                             (Pi (argN $ El (Type (levelSuc kit (Var 0 [])))
-                                            (Sort (Type (Var 0 []))))
-                                 (Abs "A" $ El (Type (levelSuc kit (Var 1 [])))
-                                               (Sort (Type (Var 1 [])))))))
+typeOfInf = hPi "a" (el primLevel) $
+            (return . sort $ varSort 0) --> (return . sort $ varSort 0)
 
 -- | The type of @&#x266f_@.
 
 typeOfSharp :: TCM Type
-typeOfSharp = do
-  kit <- requireLevels
-  inf <- (\t -> case t of
-                  Def q _ -> q
-                  _       -> __IMPOSSIBLE__)
-         <$> primInf
-  return $
-    El Inf (Pi (argH $ El (Type (Lit (LitLevel noRange 0))) (levelType kit))
-               (Abs "a" $ El (Lub (Type (levelSuc kit (Var 0 []))) (Type (Var 0 [])))
-                             (Pi (argH $ El (Type (levelSuc kit (Var 0 []))) (Sort (Type (Var 0 []))))
-                                 (Abs "A" $ El (Type (Var 1 []))
-                                               (Pi (argN $ El (Type (Var 1 [])) (Var 0 []))
-                                                   (Abs "x" $ El (Type (Var 2 []))
-                                                                 (Def inf [argH (Var 2 []), argN (Var 1 [])])))))))
+typeOfSharp = hPi "a" (el primLevel) $
+              hPi "A" (return . sort $ varSort 0) $
+              (El (varSort 1) <$> var 0) -->
+              (El (varSort 1) <$> primInf <#> var 1 <@> var 0)
 
 -- | The type of @&#x266d@.
 
 typeOfFlat :: TCM Type
-typeOfFlat = do
-  kit <- requireLevels
-  inf <- (\t -> case t of
-                  Def q _ -> q
-                  _       -> __IMPOSSIBLE__)
-         <$> primInf
-  return $
-    El Inf (Pi (argH $ El (Type (Lit (LitLevel noRange 0))) (levelType kit))
-               (Abs "a" $ El (Lub (Type (levelSuc kit (Var 0 []))) (Type (Var 0 [])))
-                             (Pi (argH $ El (Type (levelSuc kit (Var 0 []))) (Sort (Type (Var 0 []))))
-                                 (Abs "A" $ El (Type (Var 1 []))
-                                               (Fun (argN $ El (Type (Var 1 []))
-                                                               (Def inf [argH (Var 1 []), argN (Var 0 [])]))
-                                                    (El (Type (Var 1 [])) (Var 0 [])))))))
+typeOfFlat = hPi "a" (el primLevel) $
+             hPi "A" (return . sort $ varSort 0) $
+             (El (varSort 1) <$> primInf <#> var 1 <@> var 0) -->
+             (El (varSort 1) <$> var 0)
 
 -- | Binds the INFINITY builtin, but does not change the type's
 -- definition.
@@ -110,10 +83,9 @@
                   , dataInduction      = CoInductive
                   , dataClause         = Nothing
                   , dataCons           = [sharp]
-                  , dataSort           = Type (Var 1 [])
+                  , dataSort           = varSort 1
                   , dataPolarity       = [Invariant, Invariant]
                   , dataArgOccurrences = [Unused, Positive]
-                  , dataHsType         = Nothing
                   , dataAbstr          = ConcreteDef
                   }
               }
@@ -122,7 +94,6 @@
                     { conPars   = 2
                     , conSrcCon = sharp
                     , conData   = defName infDefn
-                    , conHsCode = Nothing
                     , conAbstr  = ConcreteDef
                     , conInd    = CoInductive
                     }
@@ -146,10 +117,9 @@
               <$> primSharp
     kit    <- requireLevels
     let clause = Clause { clauseRange = noRange
-                        , clauseTel   = ExtendTel (argH (El (Type (Lit (LitLevel noRange 0))) (Def (typeName kit) [])))
-                                                  (Abs "a" (ExtendTel (argH (El (Type (Con (sucName kit) [argN (Var 0 [])]))
-                                                                                (Sort (Type (Var 0 [])))))
-                                                                      (Abs "A" (ExtendTel (argN (El (Type (Var 1 [])) (Var 0 [])))
+                        , clauseTel   = ExtendTel (argH (El (mkType 0) (Def (typeName kit) [])))
+                                                  (Abs "a" (ExtendTel (argH $ sort $ varSort 0)
+                                                                      (Abs "A" (ExtendTel (argN (El (varSort 1) (Var 0 [])))
                                                                                           (Abs "x" EmptyTel)))))
                         , clausePerm  = idP 3
                         , clausePats  = [ argH (VarP "a")
@@ -162,10 +132,14 @@
                         }
     addConstant flat $
       flatDefn { theDef = Function
-                   { funClauses        = [Clauses Nothing clause]
-                   , funCompiled       = Case 2 (Branches (Map.singleton sharp (Done 3 (Var 0 [])))
-                                                          Map.empty
-                                                          Nothing)
+                   { funClauses        = [clause]
+                   , funCompiled       =
+                      let hid   = Arg Hidden Relevant
+                          nohid = defaultArg in
+                      Case 2 (Branches (Map.singleton sharp
+                                 (Done [hid "a", hid "A", nohid "x"] (Var 0 [])))
+                               Map.empty
+                               Nothing)
                    , funInv            = NotInjective
                    , funPolarity       = [Invariant, Invariant, Invariant]
                    , funArgOccurrences = [Unused, Unused, Positive]
@@ -175,6 +149,7 @@
                      {- flat is a projection, but in the termination checker
                         it destroys the (inductive) structural ordering.
                         Thus, we do not register it as a projection. -}
+                   , funStatic         = False
                    }
                 }
     return flatE
diff --git a/src/full/Agda/TypeChecking/Rules/Data.hs b/src/full/Agda/TypeChecking/Rules/Data.hs
--- a/src/full/Agda/TypeChecking/Rules/Data.hs
+++ b/src/full/Agda/TypeChecking/Rules/Data.hs
@@ -22,6 +22,8 @@
 import Agda.TypeChecking.Polarity
 import Agda.TypeChecking.Free
 import Agda.TypeChecking.Forcing
+import Agda.TypeChecking.Irrelevance
+import Agda.TypeChecking.Telescope
 
 import Agda.TypeChecking.Rules.Term ( isType_ )
 
@@ -43,7 +45,11 @@
 checkDataDef :: Info.DefInfo -> QName -> [A.LamBinding] -> [A.Constructor] -> TCM ()
 checkDataDef i name ps cs =
     traceCall (CheckDataDef (getRange i) (qnameName name) ps cs) $ do -- TODO!! (qnameName)
-	let npars = size ps
+	let countPars A.DomainFree{} = 1
+            countPars (A.DomainFull (A.TypedBindings _ (Arg _ _ b))) = case b of
+              A.TNoBind{}   -> 1
+              A.TBind _ xs _ -> size xs
+            npars = sum $ map countPars ps
 
         -- Add the datatype module
         addSection (qnameToMName name) 0
@@ -51,6 +57,10 @@
 	-- Look up the type of the datatype.
 	t <- instantiateFull =<< typeOfConst name
 
+        -- Make sure the shape of the type is visible
+        let unTelV (TelV tel a) = telePi tel a
+        t <- unTelV <$> telView t
+
 	-- The parameters are in scope when checking the constructors.
 	dataDef <- bindParameters ps t $ \tel t0 -> do
 
@@ -59,7 +69,7 @@
 
 	    -- The type we get from bindParameters is Θ -> s where Θ is the type of
 	    -- the indices. We count the number of indices and return s.
-            (nofIxs, s) <- splitType =<< normalise t0
+            (nofIxs, s) <- splitType t0
 
             when (any (`freeIn` s) [0..nofIxs - 1]) $ do
               err <- fsep [ text "The sort of" <+> prettyTCM name
@@ -73,9 +83,11 @@
             reportSDoc "tc.data.sort" 20 $ vcat
               [ text "checking datatype" <+> prettyTCM name
               , nest 2 $ vcat
-                [ text "type:   " <+> prettyTCM t0
+                [ text "type (parameters instantiated):   " <+> prettyTCM t0
+                , text "type (full):   " <+> prettyTCM t
                 , text "sort:   " <+> prettyTCM s
                 , text "indices:" <+> text (show nofIxs)
+                , text "params:"  <+> text (show ps)
                 ]
               ]
 
@@ -86,14 +98,13 @@
                                    , dataClause         = Nothing
                                    , dataCons           = []     -- Constructors are added later
 				   , dataSort           = s
-                                   , dataHsType         = Nothing
                                    , dataAbstr          = Info.defAbstract i
                                    , dataPolarity       = []
                                    , dataArgOccurrences = []
                                    }
 
 	    escapeContext (size tel) $ do
-	      addConstant name ( Defn Relevant name t (defaultDisplayForm name) 0 dataDef )
+	      addConstant name ( Defn Relevant name t (defaultDisplayForm name) 0 noCompiledRep dataDef )
 
 	    -- Check the types of the constructors
 	    mapM_ (checkConstructor name tel' nofIxs s) cs
@@ -117,7 +128,7 @@
 
 	-- Add the datatype to the signature with its constructors. It was previously
 	-- added without them.
-	addConstant name (Defn Relevant name t (defaultDisplayForm name) 0 $
+	addConstant name (Defn Relevant name t (defaultDisplayForm name) 0 noCompiledRep $
                             dataDef { dataCons = map cname cs }
 			 )
         computePolarity name
@@ -127,12 +138,14 @@
 	cname _			   = __IMPOSSIBLE__ -- constructors are axioms
 
 	hideTel  EmptyTel		  = EmptyTel
-	hideTel (ExtendTel (Arg _ r t) tel) = ExtendTel (Arg Hidden r t) $ hideTel <$> tel
+	hideTel (ExtendTel a tel) = ExtendTel (hideAndRelParams a) $ hideTel <$> tel
 
 	splitType (El _ (Pi _ b))  = ((+ 1) -*- id) <$> splitType (absBody b)
-	splitType (El _ (Fun _ b)) = ((+ 1) -*- raise 1) <$> splitType b
 	splitType (El _ (Sort s))  = return (0, s)
-	splitType (El _ t)	   = typeError $ DataMustEndInSort t
+	splitType a                = do
+          s <- newSortMeta
+          equalType a (sort s)
+          return (0, s)
 
 -- | Type check a constructor declaration. Checks that the constructor targets
 --   the datatype and that it fits inside the declared sort.
@@ -143,19 +156,34 @@
   checkConstructor d tel nofIxs s con
 checkConstructor d tel nofIxs s con@(A.Axiom i _ c e) =
     traceCall (CheckConstructor d tel s con) $ do
+{- WRONG
+      -- Andreas, 2011-04-26: the following happens to the right of ':'
+      -- we may use irrelevant arguments in a non-strict way in types
+      t' <- workOnTypes $ do
+-}
+        -- check that the type of the constructor is well-formed
         debugEnter c e
 	t <- isType_ e
+        -- check that the type of the constructor ends in the data type
 	n <- size <$> getContextTelescope
         debugEndsIn t d n
 	constructs n t d
+        -- check that the sort (universe level) of the constructor type
+        -- is contained in the sort of the data type
+        -- (to avoid impredicative existential types)
         debugFitsIn s
 	t `fitsIn` s
+        -- check which constructor arguments are determined by the type ('forcing')
         t' <- addForcingAnnotations t
         debugAdd c t'
-	escapeContext (size tel)
+{-
+        return t'
+-}
+        -- add parameters to constructor type and put into signature
+        escapeContext (size tel)
 	    $ addConstant c
-	    $ Defn Relevant c (telePi tel t') (defaultDisplayForm c) 0
-	    $ Constructor (size tel) c d Nothing (Info.defAbstract i) Inductive
+	    $ Defn Relevant c (telePi tel t') (defaultDisplayForm c) 0 noCompiledRep
+	    $ Constructor (size tel) c d (Info.defAbstract i) Inductive
   where
     debugEnter c e =
       reportSDoc "tc.data.con" 5 $ vcat
@@ -181,23 +209,22 @@
 checkConstructor _ _ _ _ _ = __IMPOSSIBLE__ -- constructors are axioms
 
 
--- | Bind the parameters of a datatype. The bindings should be domain free.
+-- | Bind the parameters of a datatype.
 bindParameters :: [A.LamBinding] -> Type -> (Telescope -> Type -> TCM a) -> TCM a
 bindParameters [] a ret = ret EmptyTel a
-bindParameters (A.DomainFree h x : ps) (El _ (Pi (Arg h' Relevant a) b)) ret
-    | h /= h'	=
+bindParameters (A.DomainFull (A.TypedBindings _ (Arg h rel (A.TBind _ xs _))) : bs) a ret =
+  bindParameters ([ A.DomainFree h rel x | x <- xs ] ++ bs) a ret
+bindParameters (A.DomainFull (A.TypedBindings _ (Arg h rel (A.TNoBind _))) : bs) a ret = do
+  x <- freshNoName_
+  bindParameters (A.DomainFree h rel x : bs) a ret
+bindParameters (A.DomainFree h rel x : ps) (El _ (Pi (Arg h' rel' a) b)) ret
+  -- Andreas, 2011-04-07 ignore relevance information in binding?!
+    | h /= h' =
 	__IMPOSSIBLE__
     | otherwise = addCtx x arg $ bindParameters ps (absBody b) $ \tel s ->
 		    ret (ExtendTel arg $ Abs (show x) tel) s
   where
-    arg = Arg h Relevant a
-bindParameters (A.DomainFree h x : ps) (El _ (Fun (Arg h' Relevant a) b)) ret
-    | h /= h'	=
-	__IMPOSSIBLE__
-    | otherwise = addCtx x arg $ bindParameters ps (raise 1 b) $ \tel s ->
-		    ret (ExtendTel arg $ Abs (show x) tel) s
-  where
-    arg = Arg h Relevant a
+    arg = Arg h rel' a
 bindParameters _ _ _ = __IMPOSSIBLE__
 
 
@@ -215,11 +242,10 @@
   -- The line below would be simpler, but doesn't allow datatypes
   -- to be indexed by the universe level.
 --   noConstraints $ s' `leqSort` s
-  case funView $ unEl t of
-    FunV arg@(Arg h r a) _ -> do
+  case unEl t of
+    Pi arg@(Arg h r a) _ -> do
       let s' = getSort a
-      cs <- s' `leqSort` s
-      addConstraints cs
+      s' `leqSort` s
       x <- freshName_ (argName t)
       let v  = Arg h r $ Var 0 []
           t' = piApply (raise 1 t) [v]
@@ -232,14 +258,16 @@
 constructs :: Int -> Type -> QName -> TCM ()
 constructs nofPars t q = constrT 0 t
     where
+        constrT :: Nat -> Type -> TCM ()
 	constrT n (El s v) = constr n s v
 
+        constr :: Nat -> Sort -> Term -> TCM ()
 	constr n s v = do
 	    v <- reduce v
 	    case v of
+		Pi _ (NoAbs _ b) -> constrT n b
 		Pi a b	-> underAbstraction a b $ \t ->
 			   constrT (n + 1) t
-		Fun _ b -> constrT n b
 		Def d vs
 		    | d == q -> checkParams n =<< reduce (take nofPars vs)
 						    -- we only check the parameters
@@ -247,17 +275,19 @@
 
 	bad t = typeError $ ShouldEndInApplicationOfTheDatatype t
 
-	checkParams n vs = zipWithM_ sameVar (map unArg vs) ps
+	checkParams n vs = zipWithM_ sameVar vs ps
 	    where
 		ps = reverse [ i | (i,_) <- zip [n..] vs ]
 
-		sameVar v i = do
+		sameVar arg i
+                  -- skip irrelevant parameters
+                  | argRelevance arg == Irrelevant = return ()
+		  | otherwise = do
 		    t <- typeOfBV i
-		    addConstraints =<< equalTerm t v (Var i [])
-
+		    equalTerm t (unArg arg) (Var i [])
 
 -- | Force a type to be a specific datatype.
-forceData :: MonadTCM tcm => QName -> Type -> tcm Type
+forceData :: QName -> Type -> TCM Type
 forceData d (El s0 t) = liftTCM $ do
     t' <- reduce t
     d  <- canonicalName d
@@ -266,7 +296,7 @@
 	    | d == d'   -> return $ El s0 t'
 	    | otherwise	-> fail $ "wrong datatype " ++ show d ++ " != " ++ show d'
 	MetaV m vs	    -> do
-	    Defn _ _ t _ _ Datatype{dataSort = s} <- getConstInfo d
+	    Defn {defType = t, theDef = Datatype{dataSort = s}} <- getConstInfo d
 	    ps <- newArgsMeta t
 	    noConstraints $ leqType (El s0 t') (El s (Def d ps)) -- TODO: need equalType?
 	    reduce $ El s0 t'
@@ -275,7 +305,7 @@
 -- | Is the type coinductive? Returns 'Nothing' if the answer cannot
 -- be determined.
 
-isCoinductive :: MonadTCM tcm => Type -> tcm (Maybe Bool)
+isCoinductive :: Type -> TCM (Maybe Bool)
 isCoinductive t = do
   El _ t <- normalise t
   case t of
@@ -292,9 +322,9 @@
     Var   {} -> return Nothing
     Lam   {} -> __IMPOSSIBLE__
     Lit   {} -> __IMPOSSIBLE__
+    Level {} -> __IMPOSSIBLE__
     Con   {} -> __IMPOSSIBLE__
     Pi    {} -> return (Just False)
-    Fun   {} -> return (Just False)
     Sort  {} -> return (Just False)
     MetaV {} -> return Nothing
-    DontCare -> __IMPOSSIBLE__
+    DontCare{} -> __IMPOSSIBLE__
diff --git a/src/full/Agda/TypeChecking/Rules/Decl.hs b/src/full/Agda/TypeChecking/Rules/Decl.hs
--- a/src/full/Agda/TypeChecking/Rules/Decl.hs
+++ b/src/full/Agda/TypeChecking/Rules/Decl.hs
@@ -8,6 +8,7 @@
 import Data.Map (Map)
 import qualified Agda.Utils.IO.Locale as LocIO
 
+import Agda.Syntax.Abstract (AnyAbstract(..))
 import qualified Agda.Syntax.Abstract as A
 import Agda.Syntax.Internal
 import qualified Agda.Syntax.Info as Info
@@ -25,13 +26,14 @@
 import Agda.TypeChecking.Substitute
 import Agda.TypeChecking.Reduce
 import Agda.TypeChecking.SizedTypes
+import Agda.TypeChecking.Telescope
 import Agda.TypeChecking.Forcing
 
 import Agda.TypeChecking.Rules.Term
 import Agda.TypeChecking.Rules.Data    ( checkDataDef )
 import Agda.TypeChecking.Rules.Record  ( checkRecDef )
 import Agda.TypeChecking.Rules.Def     ( checkFunDef )
-import Agda.TypeChecking.Rules.Builtin ( bindBuiltin, bindBuiltinType1 )
+import Agda.TypeChecking.Rules.Builtin ( bindBuiltin )
 
 import Agda.Compiler.HaskellTypes
 
@@ -43,31 +45,61 @@
 
 -- | Type check a sequence of declarations.
 checkDecls :: [A.Declaration] -> TCM ()
-checkDecls ds = mapM_ checkDecl ds
-
+checkDecls ds = do
+  mapM_ checkDecl ds
+  -- Andreas, 2011-05-30, unfreezing moved to Interaction/Imports
+  -- whenM onTopLevel unfreezeMetas
 
 -- | Type check a single declaration.
 checkDecl :: A.Declaration -> TCM ()
 checkDecl d = do
-    case d of
-	A.Axiom i rel x e            -> checkAxiom i rel x e
-        A.Field{}                    -> typeError FieldOutsideRecord
-	A.Primitive i x e	     -> checkPrimitive i x e
-	A.Definition i ts ds	     -> checkMutual i ts ds
-	A.Section i x tel ds	     -> checkSection i x tel ds
-	A.Apply i x tel m args rd rm -> checkSectionApplication i x tel m args rd rm
-	A.Import i x		     -> checkImport i x
-	A.Pragma i p		     -> checkPragma i p
-	A.ScopedDecl scope ds	     -> setScope scope >> checkDecls ds
-        A.Open _ _                   -> return ()
+    -- Issue 418 fix: freeze metas before checking an abstract things
+    when isAbstract freezeMetas
+    leaveTopLevelConditionally d $ case d of
+	A.Axiom i rel x e        -> checkAxiom i rel x e
+        A.Field{}                -> typeError FieldOutsideRecord
+	A.Primitive i x e        -> checkPrimitive i x e
+	A.Mutual i ds            -> checkMutual i ds
+	A.Section i x tel ds     -> checkSection i x tel ds
+	A.Apply i x modapp rd rm -> checkSectionApplication i x modapp rd rm
+	A.Import i x             -> checkImport i x
+	A.Pragma i p             -> checkPragma i p
+	A.ScopedDecl scope ds    -> setScope scope >> checkDecls ds
+        A.FunDef i x cs          -> check x i $ checkFunDef NotDelayed i x cs
+        A.DataDef i x ps cs      -> check x i $ checkDataDef i x ps cs
+        A.RecDef i x c ps tel cs -> check x i $ checkRecDef i x c ps tel cs
+        A.DataSig i x ps t       -> checkAxiom i Relevant x (A.Pi (Info.ExprRange (fuseRange ps t)) ps t)
+        A.RecSig i x ps t        -> checkAxiom i Relevant x (A.Pi (Info.ExprRange (fuseRange ps t)) ps t)
+        A.Open _ _               -> return ()
+    top <- onTopLevel
+    when top $ solveSizeConstraints >> freezeMetas
+    where
+        unScope (A.ScopedDecl scope ds) = setScope scope >> unScope d
+        unScope d = return d
+
+        check x i m = do
+          reportSDoc "tc.decl" 5 $ text "Checking" <+> prettyTCM x <> text "."
+          r <- abstract (Info.defAbstract i) m
+          reportSDoc "tc.decl" 5 $ text "Checked" <+> prettyTCM x <> text "."
+          return r
+
+        isAbstract = fmap Info.defAbstract (A.getDefInfo d) == Just AbstractDef
+
+        -- Concrete definitions cannot use information about abstract things.
+        abstract ConcreteDef = inConcreteMode
+        abstract AbstractDef = inAbstractMode
 	    -- open is just an artifact from the concrete syntax
             -- retained for highlighting purposes
-    solveSizeConstraints
 
+        leaveTopLevelConditionally d =
+          case d of
+            A.Section{}    -> id
+            A.ScopedDecl{} -> id
+            _              -> leaveTopLevel
 
 -- | Type check an axiom.
 checkAxiom :: Info.DefInfo -> Relevance -> QName -> A.Expr -> TCM ()
-checkAxiom _ rel x e = do
+checkAxiom i rel x e = do
   t <- isType_ e
   reportSDoc "tc.decl.ax" 10 $ sep
     [ text "checked axiom"
@@ -75,9 +107,10 @@
     ]
   -- Not safe. See Issue 330
   -- t <- addForcingAnnotations t
-  addConstant x (Defn rel x t (defaultDisplayForm x) 0 $ Axiom Nothing Nothing)
+  addConstant x (Defn rel x t (defaultDisplayForm x) 0 noCompiledRep Axiom)
   solveSizeConstraints
-
+  -- Andreas, 2011-05-31, that freezing below is probably wrong:
+  -- when (Info.defAbstract i == AbstractDef) $ freezeMetas
 
 -- | Type check a primitive function declaration.
 checkPrimitive :: Info.DefInfo -> QName -> A.Expr -> TCM ()
@@ -88,7 +121,7 @@
     noConstraints $ equalType t t'
     let s  = show $ nameConcrete $ qnameName x
     bindPrimitive s $ pf { primFunName = x }
-    addConstant x (Defn Relevant x t (defaultDisplayForm x) 0 $
+    addConstant x (Defn Relevant x t (defaultDisplayForm x) 0 noCompiledRep $
                 Primitive (Info.defAbstract i) s Nothing Nothing)
     where
 	nameString (Name _ x _ _) = show x
@@ -105,9 +138,6 @@
             Axiom{} -> addHaskellType x hs
             _       -> typeError $ GenericError
                         "COMPILED_TYPE directive only works on postulates."
-          -- TODO: hack
-          when (hs == builtinIO) $
-            bindBuiltinType1 builtinIO (A.Def x)
         A.CompiledDataPragma x hs hcs -> do
           def <- getConstInfo x
           -- Check that the pragma appears in the same module
@@ -139,8 +169,8 @@
                           underPars n a = do
                             a <- reduce a
                             case unEl a of
+                              Pi a (NoAbs _ b) -> underPars (n - 1) b
                               Pi a b  -> underAbstraction a b $ underPars (n - 1)
-                              Fun a b -> underPars (n - 1) b
                               _       -> __IMPOSSIBLE__
                       ty <- underPars np $ defType def
                       reportSLn "tc.pragma.compile" 10 $ "Haskell type for " ++ show c ++ ": " ++ ty
@@ -164,6 +194,14 @@
               --reportSLn "tc.pragma.compile" 10 $ "Haskell type for " ++ show x ++ ": " ++ ty
               addEpicCode x ep
             _   -> typeError $ GenericError "COMPILED_EPIC directive only works on postulates."
+        A.CompiledJSPragma x ep ->
+          addJSCode x ep
+        A.StaticPragma x -> do
+            def <- getConstInfo x
+            case theDef def of
+                Function{} -> do
+                    markStatic x
+                _ -> typeError $ GenericError "STATIC directive only works on functions."
 	A.OptionsPragma _   -> __IMPOSSIBLE__	-- not allowed here
         A.EtaPragma r -> modifySignature eta
           where
@@ -176,11 +214,17 @@
                 defs	  = sigDefinitions sig
 
 -- | Type check a bunch of mutual inductive recursive definitions.
-checkMutual :: Info.DeclInfo -> [A.TypeSignature] -> [A.Definition] -> TCM ()
-checkMutual i ts ds = inMutualBlock $ do
-  mapM_ checkTypeSignature ts
-  mapM_ checkDefinition ds
+checkMutual :: Info.DeclInfo -> [A.Declaration] -> TCM ()
+checkMutual i ds = inMutualBlock $ do
+  mapM_ checkDecl ds
+
   checkStrictlyPositive =<< currentMutualBlock
+  let unScope (A.ScopedDecl _ ds) = concatMap unScope ds
+      unScope d = [d]
+  case concatMap unScope ds of
+    -- Non-mutual definitions can be considered for projection likeness
+    [A.Axiom _ _ x _, A.FunDef _ y _] | x == y -> makeProjection x
+    _   -> return ()
 
 
 -- | Type check the type signature of an inductive or recursive definition.
@@ -192,24 +236,9 @@
     case Info.defAccess i of
 	PublicAccess  -> inConcreteMode $ checkAxiom i rel x e
 	PrivateAccess -> inAbstractMode $ checkAxiom i rel x e
+        OnlyQualified -> __IMPOSSIBLE__
 checkTypeSignature _ = __IMPOSSIBLE__	-- type signatures are always axioms
 
-
--- | Check an inductive or recursive definition. Assumes the type has has been
---   checked and added to the signature.
-checkDefinition :: A.Definition -> TCM ()
-checkDefinition d =
-    case d of
-	A.FunDef i x cs          -> abstract (Info.defAbstract i) $ checkFunDef NotDelayed i x cs
-	A.DataDef i x ps cs      -> abstract (Info.defAbstract i) $ checkDataDef i x ps cs
-	A.RecDef i x c ps tel cs -> abstract (Info.defAbstract i) $ checkRecDef i x c ps tel cs
-        A.ScopedDef scope d      -> setScope scope >> checkDefinition d
-    where
-	-- Concrete definitions cannot use information about abstract things.
-	abstract ConcreteDef = inConcreteMode
-	abstract AbstractDef = inAbstractMode
-
-
 -- | Type check a module.
 checkSection :: Info.ModuleInfo -> ModuleName -> A.Telescope -> [A.Declaration] -> TCM ()
 checkSection i x tel ds =
@@ -230,22 +259,38 @@
 
     check eta []             = return eta
     check EmptyTel (_:_)     = bad
-    check (ExtendTel (Arg h _ _) (Abs y tel)) args0@(Arg h' _ (Named name _) : args) =
+    check (ExtendTel (Arg h _ _) btel) args0@(Arg h' _ (Named name _) : args) =
+      let y   = absName btel
+          tel = absBody btel in
       case (h, h', name) of
+        (Instance, NotHidden, _) -> check tel args0
+        (Instance, Hidden, _) -> bad
+        (Instance, Instance, Nothing) -> check tel args
+        (Instance, Instance, Just x)
+          | x == y                -> check tel args
+          | otherwise             -> check tel args0
         (Hidden, NotHidden, _)    -> check tel args0
+        (Hidden, Instance, _)    -> bad
         (Hidden, Hidden, Nothing) -> check tel args
         (Hidden, Hidden, Just x)
           | x == y                -> check tel args
           | otherwise             -> check tel args0
         (NotHidden, NotHidden, _) -> check tel args
         (NotHidden, Hidden, _)    -> bad
+        (NotHidden, Instance, _)    -> bad
 
 -- | Check an application of a section.
 checkSectionApplication ::
-  Info.ModuleInfo -> ModuleName -> A.Telescope -> ModuleName -> [NamedArg A.Expr] ->
+  Info.ModuleInfo -> ModuleName -> A.ModuleApplication ->
   Map QName QName -> Map ModuleName ModuleName -> TCM ()
-checkSectionApplication i m1 ptel m2 args rd rm =
-  traceCall (CheckSectionApplication (getRange i) m1 ptel m2 args) $
+checkSectionApplication i m1 modapp rd rm =
+  traceCall (CheckSectionApplication (getRange i) m1 modapp) $
+  checkSectionApplication' i m1 modapp rd rm
+
+checkSectionApplication' ::
+  Info.ModuleInfo -> ModuleName -> A.ModuleApplication ->
+  Map QName QName -> Map ModuleName ModuleName -> TCM ()
+checkSectionApplication' i m1 (A.SectionApp ptel m2 args) rd rm =
   checkTelescope_ ptel $ \ptel -> do
   tel <- lookupSection m2
   vs  <- freeVarsToApply $ qnameFromList $ mnameToList m2
@@ -261,8 +306,7 @@
     , nest 2 $ text "tel''=" <+> prettyTCM tel''
     , nest 2 $ text "eta  =" <+> prettyTCM etaTel
     ]
-  (ts, cs)  <- checkArguments_ DontExpandLast (getRange i) args tel''
-  noConstraints $ return cs
+  ts <- noConstraints $ checkArguments_ DontExpandLast (getRange i) args tel''
   reportSDoc "tc.section.apply" 20 $ vcat
     [ sep [ text "applySection", prettyTCM m1, text "=", prettyTCM m2, fsep $ map prettyTCM (vs ++ ts) ]
     , nest 2 $ text "  defs:" <+> text (show rd)
@@ -270,6 +314,32 @@
     ]
   args <- instantiateFull $ vs ++ ts
   applySection m1 ptel m2 args rd rm
+checkSectionApplication' i m1 (A.RecordModuleIFS x) rd rm = do
+  let name = mnameToQName x
+  tel' <- lookupSection x
+  vs <- freeVarsToApply name
+  let tel = tel' `apply` vs
+  case tel of
+    EmptyTel -> typeError $ GenericError $ show name ++ " is not a parameterised section."
+    _ -> return ()
+  let telInst :: Telescope
+      telInst = instFinal tel
+      instFinal :: Telescope -> Telescope
+      instFinal (ExtendTel _ NoAbs{}) = __IMPOSSIBLE__
+      instFinal (ExtendTel (Arg h r t) (Abs n EmptyTel)) = ExtendTel (Arg Instance r t) (Abs n EmptyTel)
+      instFinal (ExtendTel arg (Abs n tel)) = ExtendTel arg (Abs n (instFinal tel))
+      instFinal EmptyTel = __IMPOSSIBLE__
+      args = teleArgs tel
+  reportSDoc "tc.section.apply" 20 $ vcat
+    [ sep [ text "applySection", prettyTCM name, text "{{...}}" ]
+    , nest 2 $ text "tel:" <+> prettyTCM tel
+    , nest 2 $ text "telInst:" <+> prettyTCM telInst
+    , nest 2 $ text "args:" <+> text (show args)
+    ]
+
+  addCtxTel telInst $ do
+    vs <- freeVarsToApply name
+    applySection m1 telInst x (vs ++ args) rd rm
 
 -- | Type check an import declaration. Actually doesn't do anything, since all
 --   the work is done when scope checking.
diff --git a/src/full/Agda/TypeChecking/Rules/Decl.hs-boot b/src/full/Agda/TypeChecking/Rules/Decl.hs-boot
--- a/src/full/Agda/TypeChecking/Rules/Decl.hs-boot
+++ b/src/full/Agda/TypeChecking/Rules/Decl.hs-boot
@@ -3,12 +3,11 @@
 
 import Data.Map           (Map)
 import Agda.Syntax.Info        (ModuleInfo)
-import Agda.Syntax.Common      (NamedArg)
-import Agda.Syntax.Abstract    (QName, Expr, Declaration, ModuleName, Telescope)
+import Agda.Syntax.Abstract    (QName, Expr, Declaration, ModuleName, ModuleApplication)
 import Agda.TypeChecking.Monad (TCM)
 
 checkDecls :: [Declaration] -> TCM ()
 checkDecl  :: Declaration -> TCM ()
 checkSectionApplication ::
-  ModuleInfo -> ModuleName -> Telescope -> ModuleName -> [NamedArg Expr] ->
+  ModuleInfo -> ModuleName -> ModuleApplication ->
   Map QName QName -> Map ModuleName ModuleName -> TCM ()
diff --git a/src/full/Agda/TypeChecking/Rules/Def.hs b/src/full/Agda/TypeChecking/Rules/Def.hs
--- a/src/full/Agda/TypeChecking/Rules/Def.hs
+++ b/src/full/Agda/TypeChecking/Rules/Def.hs
@@ -3,9 +3,11 @@
 module Agda.TypeChecking.Rules.Def where
 
 import Prelude hiding (mapM)
+import Control.Arrow ((***), (&&&))
 import Control.Applicative
 import Control.Monad.State hiding (mapM)
 import Control.Monad.Reader hiding (mapM)
+import Control.Monad.Error hiding (mapM)
 import Control.Monad hiding (mapM)
 import Data.List hiding (sort)
 import Data.Traversable
@@ -40,9 +42,9 @@
 import Agda.TypeChecking.Coverage
 import Agda.TypeChecking.Injectivity
 import Agda.TypeChecking.Polarity
+import Agda.TypeChecking.Irrelevance
 import Agda.TypeChecking.SizedTypes
-import Agda.TypeChecking.RecordPatterns
-import Agda.TypeChecking.CompiledClause
+import Agda.TypeChecking.CompiledClause.Compile
 
 import Agda.TypeChecking.Rules.Term                ( checkExpr, inferExpr, checkTelescope_, isType_ )
 import Agda.TypeChecking.Rules.LHS                 ( checkLeftHandSide )
@@ -65,16 +67,19 @@
 -- * Definitions by pattern matching
 ---------------------------------------------------------------------------
 
--- | Type check a definition by pattern matching. The first argument
--- specifies whether the clauses are delayed or not.
 checkFunDef :: Delayed -> Info.DefInfo -> QName -> [A.Clause] -> TCM ()
-checkFunDef delayed i name cs =
-
-    traceCall (CheckFunDef (getRange i) (qnameName name) cs) $ do   -- TODO!! (qnameName)
+checkFunDef delayed i name cs = do
         -- Get the type and relevance of the function
         t    <- typeOfConst name
         rel  <- relOfConst name
+        checkFunDef' t rel delayed i name cs
 
+-- | Type check a definition by pattern matching. The first argument
+-- specifies whether the clauses are delayed or not.
+checkFunDef' :: Type -> Relevance -> Delayed -> Info.DefInfo -> QName -> [A.Clause] -> TCM ()
+checkFunDef' t rel delayed i name cs =
+
+    traceCall (CheckFunDef (getRange i) (qnameName name) cs) $ do   -- TODO!! (qnameName)
         reportSDoc "tc.def.fun" 10 $
           sep [ text "checking body of" <+> prettyTCM name
               , nest 2 $ text ":" <+> prettyTCM t
@@ -89,12 +94,11 @@
         cs <- mapM check cs
 
         -- Check that all clauses have the same number of arguments
-        unless (allEqual $ map (npats . translatedClause) cs) $
-               typeError DifferentArities
+        unless (allEqual $ map npats cs) $ typeError DifferentArities
 
         reportSDoc "tc.cc" 15 $ do
           sep [ text "clauses before rebindClause"
-              , nest 2 $ prettyTCM (map (NamedClause name . translatedClause) cs)
+              , nest 2 $ prettyTCM (map (NamedClause name) cs)
               ]
 
         -- Annotate the clauses with which arguments are actually used.
@@ -106,15 +110,15 @@
         -- possibly due to missing eta-contraction!?
 
         -- Check if the function is injective
-        inv <- checkInjectivity name $ map translatedClause cs
+        inv <- checkInjectivity name cs
 
         reportSDoc "tc.cc" 15 $ do
           sep [ text "clauses before compilation"
-              , nest 2 $ prettyTCM (map (NamedClause name . translatedClause) cs)
+              , nest 2 $ prettyTCM (map (NamedClause name) cs)
               ]
 
         -- Compile the clauses
-        let cc = compileClauses cs
+        cc <- compileClauses True cs
 
         reportSDoc "tc.cc" 10 $ do
           sep [ text "compiled clauses of" <+> prettyTCM name
@@ -122,7 +126,7 @@
               ]
 
         -- Add the definition
-        addConstant name $ Defn rel name t (defaultDisplayForm name) 0
+        addConstant name $ Defn rel name t (defaultDisplayForm name) 0 noCompiledRep
                          $ Function
                             { funClauses        = cs
                             , funCompiled       = cc
@@ -132,6 +136,7 @@
                             , funPolarity       = []
                             , funArgOccurrences = []
                             , funProjection     = Nothing
+                            , funStatic         = False
                             }
         computePolarity name
         reportSDoc "tc.def.fun" 10 $ do
@@ -170,10 +175,11 @@
                      Type           -- type of the right hand side
                      [Arg Pattern]  -- parent patterns
                      Permutation    -- permutation reordering the variables in the parent pattern
+                     Permutation    -- final permutation (including permutation for the parent clause)
                      [A.Clause]     -- the given clauses for the with function
 
 -- | Type check a function clause.
-checkClause :: Type -> A.Clause -> TCM Clauses
+checkClause :: Type -> A.Clause -> TCM Clause
 checkClause t c@(A.Clause (A.LHS i x aps []) rhs0 wh) =
     traceCall (CheckClause t c) $
     checkLeftHandSide c aps t $ \gamma delta sub xs ps t' perm -> do
@@ -198,19 +204,18 @@
                 A.RewriteRHS (qname:names) (eq:eqs) rhs wh -> do
                      (proof,t) <- inferExpr eq
                      t' <- reduce =<< instantiateFull t
-                     equality <- primEquality >>= \eq -> return $ case eq of
-                        Lam Hidden (Abs _ (Def equality _)) -> equality
-                        Def equality _                      -> equality
-                        _                                   -> __IMPOSSIBLE__
+                     equality <- primEquality >>= \eq ->
+                      let lamV (Lam h b) = ((h:) *** id) $ lamV (unAbs b)
+                          lamV v         = ([], v) in
+                      return $ case lamV eq of
+                        ([Hidden, Hidden], Def equality _) -> equality
+                        ([Hidden],         Def equality _) -> equality
+                        ([],               Def equality _) -> equality
+                        _                                  -> __IMPOSSIBLE__
                      reflCon <- primRefl >>= \refl -> return $ case refl of
                          Con reflCon [] -> reflCon
                          _              -> __IMPOSSIBLE__
                      (rewriteType,rewriteFrom,rewriteTo) <- case t' of
-                         El _Set0 (Def equality' [Arg Hidden Relevant rewriteType,
-                                                  Arg NotHidden Relevant rewriteFrom, Arg NotHidden Relevant rewriteTo])
-                            | equality' == equality ->
-                              return (rewriteType, rewriteFrom, rewriteTo)
-                         -- Universe polymorphic equality
                          El _Set0 (Def equality' [_level, Arg Hidden Relevant rewriteType,
                                                   Arg NotHidden Relevant rewriteFrom, Arg NotHidden Relevant rewriteTo])
                             | equality' == equality ->
@@ -247,7 +252,7 @@
                   reportSDoc "tc.with.top" 5 $
                     text "TC.Rules.Def.checkclause reached A.WithRHS"
                   reportSDoc "tc.with.top" 30 $
-                    text (show c)
+                    prettyA c
                   -- Infer the types of the with expressions
                   vas <- mapM inferExpr es
                   (vs0, as) <- instantiateFull (unzip vas)
@@ -269,25 +274,32 @@
                     , text "delta2 =" <+> addCtxTel delta1 (prettyTCM delta2)
                     , text "vs     =" <+> prettyTCM vs
                     , text "as     =" <+> prettyTCM as
+                    , text "perm'  =" <+> text (show perm')
+                    , text "perm   =" <+> text (show perm)
+                    , text "fPerm  =" <+> text (show finalPerm)
                     ]
 
                   -- Create the body of the original function
                   ctx <- getContextTelescope
                   let n    = size ctx
                       m    = size delta
+                      -- All the context variables
                       us   = [ Arg h r (Var i []) | (i, Arg h r _) <- zip [n - 1,n - 2..0] $ telToList ctx ]
+                      -- First the variables bound outside this definition
                       (us0, us1') = genericSplitAt (n - m) us
+                      -- Then permute the rest and grab those needed to for the with arguments
                       (us1, us2)  = genericSplitAt (size delta1) $ permute perm' us1'
+                      -- Now stuff the with arguments in between and finish with the remaining variables
                       v    = Def aux $ us0 ++ us1 ++ (map defaultArg vs0) ++ us2
 
                   -- We need Δ₁Δ₂ ⊢ t'
-                  t' <- return $ rename (reverseP perm') t'
+                  t' <- return $ renameP (reverseP perm') t'
                   -- and Δ₁ ⊢ vs : as
                   (vs, as) <- do
                     let var = flip Var []
                         -- We know that as does not depend on Δ₂
                         rho = replicate (size delta2) __IMPOSSIBLE__ ++ map var [0..]
-                    return $ substs rho $ rename (reverseP perm') (vs, as)
+                    return $ substs rho $ renameP (reverseP perm') (vs, as)
 
                   reportSDoc "tc.with.top" 20 $ vcat
                     [ text "    with arguments" <+> prettyList (map prettyTCM vs)
@@ -299,7 +311,7 @@
                     , text "              body" <+> (addCtxTel delta $ prettyTCM $ mkBody v)
                     ]
 
-                  return (mkBody v, WithFunction x aux gamma delta1 delta2 vs as t' ps finalPerm cs)
+                  return (mkBody v, WithFunction x aux gamma delta1 delta2 vs as t' ps perm' finalPerm cs)
           in handleRHS rhs0
       escapeContext (size delta) $ checkWithFunction with
 
@@ -314,7 +326,7 @@
           ]
         ]
 
-      translateRecordPatterns $
+      return $
         Clause { clauseRange = getRange i
                , clauseTel   = killRange delta
                , clausePerm  = perm
@@ -326,7 +338,7 @@
 
 checkWithFunction :: WithFunctionProblem -> TCM ()
 checkWithFunction NoWithFunction = return ()
-checkWithFunction (WithFunction f aux gamma delta1 delta2 vs as b qs perm cs) = do
+checkWithFunction (WithFunction f aux gamma delta1 delta2 vs as b qs perm' perm cs) = do
 
   reportSDoc "tc.with.top" 10 $ vcat
     [ text "checkWithFunction"
@@ -338,6 +350,7 @@
       , text "vs     =" <+> addCtxTel delta1 (prettyTCM vs)
       , text "b      =" <+> prettyTCM b
       , text "qs     =" <+> text (show qs)
+      , text "perm'  =" <+> text (show perm')
       , text "perm   =" <+> text (show perm)
       ]
     ]
@@ -345,7 +358,7 @@
   -- Add the type of the auxiliary function to the signature
 
   -- With display forms are closed
-  df <- makeClosed <$> withDisplayForm f aux delta1 delta2 (size as) qs perm
+  df <- makeClosed <$> withDisplayForm f aux delta1 delta2 (size as) qs perm'
 
   reportSLn "tc.with.top" 20 "created with display form"
 
@@ -361,7 +374,10 @@
          , nest 2 $ prettyTCM absAuxType
          ]
   -- The ranges in the generated type are completely bogus, so we kill them.
-  auxType <- setCurrentRange (getRange cs) $ isType_ $ killRange absAuxType
+  auxType <- setCurrentRange (getRange cs) (isType_ $ killRange absAuxType)
+    `catchError` \err -> case errError err of
+      TypeError _ e -> enterClosure e $ traceCall (CheckWithFunctionType absAuxType) . typeError
+      _             -> throwError err
 
   case df of
     OpenThing _ (Display n ts dt) -> reportSDoc "tc.with.top" 20 $ text "Display" <+> fsep
@@ -369,7 +385,7 @@
       , prettyList $ map prettyTCM ts
       , prettyTCM dt
       ]
-  addConstant aux (Defn Relevant aux auxType [df] 0 $ Axiom Nothing Nothing)
+  addConstant aux (Defn Relevant aux auxType [df] 0 noCompiledRep Axiom)
   solveSizeConstraints
 
   reportSDoc "tc.with.top" 10 $ sep
@@ -655,7 +671,7 @@
             liftIO $ LocIO.putStr $ unlines $ reverse ds
 -}
 
-actualConstructor :: MonadTCM tcm => QName -> tcm QName
+actualConstructor :: QName -> TCM QName
 actualConstructor c = do
     v <- constructorForm =<< normalise (Con c [])
     case v of
diff --git a/src/full/Agda/TypeChecking/Rules/Def.hs-boot b/src/full/Agda/TypeChecking/Rules/Def.hs-boot
--- a/src/full/Agda/TypeChecking/Rules/Def.hs-boot
+++ b/src/full/Agda/TypeChecking/Rules/Def.hs-boot
@@ -1,7 +1,10 @@
 module Agda.TypeChecking.Rules.Def where
 
 import Agda.Syntax.Abstract
+import Agda.Syntax.Common
 import Agda.Syntax.Info
 import Agda.TypeChecking.Monad
+import qualified Agda.Syntax.Internal as I
 
 checkFunDef :: Delayed -> DefInfo -> QName -> [Clause] -> TCM ()
+checkFunDef' :: I.Type -> Relevance -> Delayed -> DefInfo -> QName -> [Clause] -> TCM ()
diff --git a/src/full/Agda/TypeChecking/Rules/LHS.hs b/src/full/Agda/TypeChecking/Rules/LHS.hs
--- a/src/full/Agda/TypeChecking/Rules/LHS.hs
+++ b/src/full/Agda/TypeChecking/Rules/LHS.hs
@@ -23,8 +23,9 @@
 import Agda.TypeChecking.Telescope
 import Agda.TypeChecking.Conversion
 import Agda.TypeChecking.Constraints
+import Agda.TypeChecking.Irrelevance
 import Agda.TypeChecking.Primitive (constructorForm)
-import {-# SOURCE #-} Agda.TypeChecking.Empty (isEmptyType)
+import {-# SOURCE #-} Agda.TypeChecking.Empty (isReallyEmptyType)
 import Agda.TypeChecking.Telescope (renamingR, teleArgs)
 
 import Agda.TypeChecking.Rules.Term (checkExpr)
@@ -61,6 +62,7 @@
 
 instance Raise AsBinding where
   raiseFrom m k (AsB x v a) = uncurry (AsB x) $ raiseFrom m k (v, a)
+  renameFrom m k (AsB x v a) = uncurry (AsB x) $ renameFrom m k (v, a)
 
 instance PrettyTCM AsBinding where
   prettyTCM (AsB x v a) =
@@ -194,7 +196,6 @@
           Primitive   {} -> __IMPOSSIBLE__
       Var   {} -> return ()
       Pi    {} -> return ()
-      Fun   {} -> return ()
       Sort  {} -> return ()
       MetaV {} -> return ()
       -- TODO: If the type is a meta-variable, should the test be
@@ -204,11 +205,12 @@
       -- error in code which has already passed the type checker.
       Lam   {} -> __IMPOSSIBLE__
       Lit   {} -> __IMPOSSIBLE__
+      Level {} -> __IMPOSSIBLE__
       Con   {} -> __IMPOSSIBLE__
-      DontCare -> __IMPOSSIBLE__
+      DontCare{} -> __IMPOSSIBLE__
 
 -- | Check that a dot pattern matches it's instantiation.
-checkDotPattern :: DotPatternInst -> TCM Constraints
+checkDotPattern :: DotPatternInst -> TCM ()
 checkDotPattern (DPI e v a) =
   traceCall (CheckDotPattern e v) $ do
   reportSDoc "tc.lhs.dot" 15 $
@@ -220,7 +222,6 @@
   u <- checkExpr e a
   -- Should be ok to do noConstraints here
   noConstraints $ equalTerm a u v
-  return []
 
 -- | Bind the variables in a left hand side. Precondition: the patterns should
 --   all be 'A.VarP', 'A.WildP', or 'A.ImplicitP' and the telescope should have
@@ -235,7 +236,7 @@
     A.WildP _     -> bindDummy (absName tel)
     A.ImplicitP _ -> bindDummy (absName tel)
     A.AbsurdP _   -> do
-      isEmptyType $ unArg a
+      isReallyEmptyType $ unArg a
       bindDummy (absName tel)
     _             -> __IMPOSSIBLE__
     where
@@ -327,8 +328,7 @@
     reportSDoc "tc.lhs.top" 10 $ nest 2 $ text "type  = " <+> prettyTCM b'
 
     -- Check dot patterns
-    cs <- concat <$> mapM checkDotPattern dpi
-    noConstraints $ solveConstraints cs
+    mapM_ checkDotPattern dpi
 
     let rho = renamingR perm -- I'm not certain about this...
         Perm n _ = perm
@@ -413,8 +413,7 @@
               ]
 
             Con c' [] <- constructorForm =<< normalise (Con c [])
-            c <- return $ c' `withRangeOf` c
-
+            c  <- return $ c' `withRangeOf` c
             ca <- defType <$> getConstInfo c
 
             reportSDoc "tc.lhs.top" 20 $ nest 2 $ vcat
@@ -423,7 +422,7 @@
               ]
 
             -- Lookup the type of the constructor at the given parameters
-            a <- (`piApply` vs) . defType <$> getConstInfo c
+            let a = ca `piApply` vs
 
             -- It will end in an application of the datatype
             TelV gamma' ca@(El _ (Def d' us)) <- telView a
@@ -438,7 +437,7 @@
 -}
 
             -- Andreas 2010-09-07  propagate relevance info to new vars
-            gamma' <- return $ fmap (\a -> a { argRelevance = rel }) gamma'
+            gamma' <- return $ fmap (applyRelevance rel) gamma'
 {-
             reportSDoc "tc.lhs.top" 20 $ nest 2 $ vcat
               [ text "gamma' =" <+> text (show gamma')
@@ -608,10 +607,7 @@
 
 -- Ensures that we are not performing pattern matching on codata.
 
-noPatternMatchingOnCodata
-  :: MonadTCM tcm
-  => [Arg Pattern]
-  -> tcm ()
+noPatternMatchingOnCodata :: [Arg Pattern] -> TCM ()
 noPatternMatchingOnCodata = mapM_ (check . unArg)
   where
   check (VarP {})   = return ()
diff --git a/src/full/Agda/TypeChecking/Rules/LHS/Implicit.hs b/src/full/Agda/TypeChecking/Rules/LHS/Implicit.hs
--- a/src/full/Agda/TypeChecking/Rules/LHS/Implicit.hs
+++ b/src/full/Agda/TypeChecking/Rules/LHS/Implicit.hs
@@ -38,13 +38,14 @@
   [] -> do
     i <- insImp dummy tel
     case i of
-      Just n	-> return $ replicate n implicitP
+      Just []   -> __IMPOSSIBLE__
+      Just hs	-> return $ implicitPs hs
       Nothing	-> return []
   p : ps -> do
     i <- insImp p tel
     case i of
-      Just 0	-> __IMPOSSIBLE__
-      Just n	-> insertImplicitPatterns (replicate n implicitP ++ p : ps) tel
+      Just []	-> __IMPOSSIBLE__
+      Just hs	-> insertImplicitPatterns (implicitPs hs ++ p : ps) tel
       Nothing	-> (p :) <$> insertImplicitPatterns ps (absBody tel')
   where
     dummy = defaultArg $ unnamed ()
@@ -55,4 +56,5 @@
       ImpInsert n    -> return $ Just n
       NoInsertNeeded -> return Nothing
 
-    implicitP = Arg Hidden Relevant . unnamed . A.ImplicitP . PatRange $ noRange
+    implicitPs [] = []
+    implicitPs (h : hs) = (Arg h Relevant $ unnamed $ A.ImplicitP $ PatRange $ noRange) : implicitPs hs
diff --git a/src/full/Agda/TypeChecking/Rules/LHS/Instantiate.hs b/src/full/Agda/TypeChecking/Rules/LHS/Instantiate.hs
--- a/src/full/Agda/TypeChecking/Rules/LHS/Instantiate.hs
+++ b/src/full/Agda/TypeChecking/Rules/LHS/Instantiate.hs
@@ -25,7 +25,7 @@
 -- | Instantiate a telescope with a substitution. Might reorder the telescope.
 --   @instantiateTel (Γ : Tel)(σ : Γ --> Γ) = Γσ~@
 --   Monadic only for debugging purposes.
-instantiateTel :: MonadTCM tcm => Substitution -> Telescope -> tcm (Telescope, Permutation, [Term], [Type])
+instantiateTel :: Substitution -> Telescope -> TCM (Telescope, Permutation, [Term], [Type])
 instantiateTel s tel = liftTCM $ do
 
   tel <- normalise tel
@@ -49,7 +49,7 @@
     ]
 
   -- s' : Substitution Γσ
-  let s' = rename psR s
+  let s' = renameP psR s
 
   reportSDoc "tc.lhs.inst" 15 $ nest 2 $
     text "s'   =" <+> fsep (punctuate comma $ map (maybe (text "_") prettyTCM) s')
@@ -80,7 +80,16 @@
     text "tel3 =" <+> brackets (fsep $ punctuate comma $ map prettyTCM tel3)
 
   -- p : Permutation (Γσ -> Γσ~)
-  let p = reorderTel tel3
+  p <- case reorderTel tel3 of
+    Nothing -> inContext [] $ do
+      xs <- mapM freshName_ names3
+      addCtxs xs (Arg NotHidden Relevant prop) $ do
+        err <- sep [ text "Recursive telescope in left hand side:"
+                   , fsep [ parens (prettyTCM x <+> text ":" <+> prettyTCM t)
+                          | (x, t) <- zip xs tel3 ]
+                   ]
+        typeError $ GenericError $ show err
+    Just p  -> return p
 
   reportSLn "tc.lhs.inst" 10 $ "p   = " ++ show p
 
diff --git a/src/full/Agda/TypeChecking/Rules/LHS/Problem.hs b/src/full/Agda/TypeChecking/Rules/LHS/Problem.hs
--- a/src/full/Agda/TypeChecking/Rules/LHS/Problem.hs
+++ b/src/full/Agda/TypeChecking/Rules/LHS/Problem.hs
@@ -41,6 +41,10 @@
 
 type ProblemPart = Problem' ()
 
+instance Raise (Problem' p) where
+  raiseFrom  m k p = p { problemTel = raiseFrom  m k $  problemTel p }
+  renameFrom m k p = p { problemTel = renameFrom m k $  problemTel p }
+
 -- | The permutation should permute @allHoles@ of the patterns to correspond to
 --   the abstract patterns in the problem.
 type Problem	 = Problem' (Permutation, [Arg Pattern])
diff --git a/src/full/Agda/TypeChecking/Rules/LHS/Split.hs b/src/full/Agda/TypeChecking/Rules/LHS/Split.hs
--- a/src/full/Agda/TypeChecking/Rules/LHS/Split.hs
+++ b/src/full/Agda/TypeChecking/Rules/LHS/Split.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE CPP, PatternGuards #-}
 
 module Agda.TypeChecking.Rules.LHS.Split where
 
@@ -21,12 +21,15 @@
 import Agda.TypeChecking.Monad
 import Agda.TypeChecking.Pretty
 import Agda.TypeChecking.Reduce
+import Agda.TypeChecking.Substitute
 import Agda.TypeChecking.Constraints
 import Agda.TypeChecking.Conversion
 import Agda.TypeChecking.Rules.LHS.Problem
 import Agda.TypeChecking.Rules.Term
 import Agda.TypeChecking.Monad.Builtin
 import Agda.TypeChecking.Free
+import Agda.TypeChecking.Irrelevance
+import Agda.TypeChecking.MetaVars
 
 import Agda.Utils.List
 import Agda.Utils.Monad
@@ -76,15 +79,18 @@
     splitP []	     _		  _			 = throwError $ NothingToSplit
     splitP ps	    []		  EmptyTel		 = __IMPOSSIBLE__
     splitP (p : ps) ((i, q) : qs) tel0@(ExtendTel a tel) = do
+      let tryAgain = splitP (p : ps) ((i, q) : qs) tel0
       p <- lift $ expandLitPattern p
       case asView $ namedThing $ unArg p of
+
+        -- Case: literal pattern
 	(xs, p@(A.LitP lit))  -> do
           -- Note that, in the presence of --without-K, this branch is
           -- based on the assumption that the types of literals are
           -- not indexed.
 
           -- Andreas, 2010-09-07 cannot split on irrelevant args
-          when (argRelevance a == Irrelevant) $
+          when (unusableRelevance $ argRelevance a) $
             typeError $ SplitOnIrrelevant p a
 	  b <- lift $ litType lit
 	  ok <- lift $ do
@@ -98,14 +104,35 @@
 		    (fmap (LitFocus lit q i) a)
 		    (fmap (Problem ps ()) tel)
 	    else keepGoing
+
+        -- Case: constructor pattern
 	(xs, p@(A.ConP _ (A.AmbQ cs) args)) -> do
-	  a' <- reduce $ unArg a
+	  a' <- liftTCM $ reduce $ unArg a
 	  case unEl a' of
+
+            -- Type is a meta and constructor is unambiguous,
+            -- in this case try to instantiate the meta.
+            MetaV{} | [c] <- cs -> do
+              ok <- lift $ do
+                Constructor{ conData = d } <- theDef <$> getConstInfo c
+                dt            <- defType <$> getConstInfo d
+                vs            <- newArgsMeta dt
+                El _ (Sort s) <- reduce $ apply dt vs
+                (True <$ noConstraints (equalType a' (El s $ Def d vs)))
+                  `catchError` \_ -> return False
+              if not ok then keepGoing else
+                tryAgain
+
+            -- Subcase: split type is a Def
 	    Def d vs	-> do
-	      def <- theDef <$> getConstInfo d
+	      def <- liftTCM $ theDef <$> getConstInfo d
               unless (defIsRecord def) $
-                when (argRelevance a == Irrelevant) $
-                  typeError $ SplitOnIrrelevant p a
+                -- cannot split on irrelevant or non-strict things
+                when (unusableRelevance $ argRelevance a) $ do
+                  -- Andreas, 2011-10-04 unless allowed by option
+                  allowed <- liftTCM $ optExperimentalIrrelevance <$> pragmaOptions
+                  unless allowed $ typeError $ SplitOnIrrelevant p a
+
               let mp = case def of
                         Datatype{dataPars = np} -> Just np
                         Record{recPars = np}    -> Just np
@@ -113,7 +140,7 @@
               case mp of
                 Nothing -> keepGoing
                 Just np ->
-		  traceCall (CheckPattern p EmptyTel (unArg a)) $ do  -- TODO: wrong telescope
+		  liftTCM $ traceCall (CheckPattern p EmptyTel (unArg a)) $ do  -- TODO: wrong telescope
                   -- Check that we construct something in the right datatype
                   c <- do
                       cs' <- mapM canonicalName cs
@@ -124,9 +151,13 @@
                             _                       -> __IMPOSSIBLE__
                       cs0 <- cons <$> getConstInfo d'
                       case [ c | (c, c') <- zip cs cs', elem c' cs0 ] of
-                        c : _ -> return c   -- if there are more than one they will
-                                            -- all have the same canonical form
+                        [c]   -> return c
                         []    -> typeError $ ConstructorPatternInWrongDatatype (head cs) d
+                        cs    -> -- if there are more than one we give up (they might have different types)
+                          typeError $ GenericError $
+                            "Can't resolve overloaded constructors targeting the same datatype (" ++ show d ++ "):" ++
+                            unwords (map show cs)
+
 		  let (pars, ixs) = genericSplitAt np vs
 		  reportSDoc "tc.lhs.split" 10 $
 		    vcat [ sep [ text "splitting on"
@@ -143,7 +174,9 @@
 				 xs
 				 (fmap (Focus c args (getRange p) q i d pars ixs) a)
 				 (fmap (Problem ps ()) tel)
+            -- Subcase: split type is not a Def
 	    _	-> keepGoing
+        -- Case: neither literal nor constructor pattern
 	p -> keepGoing
       where
 	keepGoing = do
@@ -151,14 +184,13 @@
 	  Split p1 xs foc p2 <- underAbstraction a tel $ \tel -> splitP ps qs tel
 	  return $ Split (mappend p0 p1) xs foc p2
 
--- | Checks that the indices are constructors applied to distinct
--- variables which do not occur free in the parameters.
+-- | Checks that the indices are constructors (or literals) applied to
+-- distinct variables which do not occur free in the parameters.
 
 wellFormedIndices
-  :: MonadTCM tcm
-  => [Arg Term] -- ^ Parameters.
+  :: [Arg Term] -- ^ Parameters.
   -> [Arg Term] -- ^ Indices.
-  -> tcm ()
+  -> TCM ()
 wellFormedIndices pars ixs = do
   pars <- normalise pars
   ixs  <- normalise ixs
@@ -171,12 +203,13 @@
     []          -> return ()
     (v , _) : _ -> typeError $ IndexFreeInParameter v pars
   where
-  -- | If the term consists solely of constructors applied to
-  -- variables, then the variables are returned, and otherwise
-  -- nothing.
+  -- | If the term consists solely of constructors (or literals)
+  -- applied to variables, then the variables are returned, and
+  -- otherwise nothing.
   constructorApplication :: Term -> Maybe [Nat]
   constructorApplication (Var x [])   = Just [x]
   constructorApplication (Con c args) = constructorApplications args
+  constructorApplication (Lit {})     = Just []
   constructorApplication _            = Nothing
 
   constructorApplications :: [Arg Term] -> Maybe [Nat]
diff --git a/src/full/Agda/TypeChecking/Rules/LHS/Unify.hs b/src/full/Agda/TypeChecking/Rules/LHS/Unify.hs
--- a/src/full/Agda/TypeChecking/Rules/LHS/Unify.hs
+++ b/src/full/Agda/TypeChecking/Rules/LHS/Unify.hs
@@ -1,25 +1,34 @@
-{-# LANGUAGE CPP, MultiParamTypeClasses, GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE CPP, MultiParamTypeClasses, FlexibleInstances, TupleSections,
+    GeneralizedNewtypeDeriving,
+    DeriveDataTypeable, DeriveFunctor, DeriveFoldable, DeriveTraversable #-}
 
 module Agda.TypeChecking.Rules.LHS.Unify where
 
-import Control.Applicative
+import Control.Arrow ((***), (&&&))
+import Control.Applicative hiding (empty)
 import Control.Monad.State
 import Control.Monad.Reader
 import Control.Monad.Error
+import Control.Monad.Writer
 
 import Data.Map (Map)
 import qualified Data.Map as Map
 import Data.List hiding (sort)
-import Data.Traversable (traverse)
 
+import Data.Generics (Typeable, Data)
+import Data.Foldable (Foldable)
+import Data.Traversable (Traversable,traverse)
+
 import Agda.Syntax.Common
 import Agda.Syntax.Internal
+import Agda.Syntax.Literal
 import Agda.Syntax.Position
 
 import Agda.TypeChecking.Monad
 import Agda.TypeChecking.Monad.Exception
-import Agda.TypeChecking.Conversion
+import Agda.TypeChecking.Conversion -- equalTerm
 import Agda.TypeChecking.Constraints
+import Agda.TypeChecking.Level (reallyUnLevelView)
 import Agda.TypeChecking.Reduce
 import Agda.TypeChecking.Pretty
 import Agda.TypeChecking.Substitute hiding (Substitution)
@@ -35,15 +44,79 @@
 
 #include "../../../undefined.h"
 import Agda.Utils.Impossible
+import Agda.Utils.Size
 
-newtype Unify a = U { unUnify :: ExceptionT UnifyException (StateT UnifyState TCM) a }
-  deriving (Monad, MonadIO, Functor, Applicative, MonadReader TCEnv, MonadException UnifyException)
+newtype Unify a = U { unUnify :: ReaderT UnifyEnv (WriterT UnifyOutput (ExceptionT UnifyException (StateT UnifyState TCM))) a }
+  deriving (Monad, MonadIO, Functor, Applicative, MonadException UnifyException, MonadWriter UnifyOutput)
 
-data Equality = Equal Type Term Term
+instance MonadReader TCEnv Unify where
+  ask = U $ ReaderT $ \ _ -> ask
+  local cont (U (ReaderT f)) = U $ ReaderT $ \ a -> local cont (f a)
+
+data UnifyMayPostpone = MayPostpone | MayNotPostpone
+
+type UnifyEnv = UnifyMayPostpone
+emptyUEnv   = MayPostpone
+
+noPostponing :: Unify a -> Unify a
+noPostponing (U (ReaderT f)) = U . ReaderT . const $ f MayNotPostpone
+
+askPostpone :: Unify UnifyMayPostpone
+askPostpone = U . ReaderT $ return
+
+-- | Output the result of unification (success or maybe).
+type UnifyOutput = Unifiable
+
+emptyUOutput :: UnifyOutput
+emptyUOutput = mempty
+
+-- | Were two terms unifiable or did we have to postpone some equation such that we are not sure?
+data Unifiable
+  = Definitely  -- ^ Unification succeeded.
+  | Possibly    -- ^ Unification did not fail, but we had to postpone a part.
+
+-- | Conjunctive monoid.
+instance Monoid Unifiable where
+  mempty = Definitely
+  mappend Definitely Definitely = Definitely
+  mappend _ _ = Possibly
+
+-- | Tell that something could not be unified right now,
+--   so the unification succeeds only 'Possibly'.
+reportPostponing :: Unify ()
+reportPostponing = tell Possibly
+
+{-
+-- | Check whether unification proceeded without postponement.
+listenResult :: Unify () -> Unify UnifyOutput
+listenResult m = snd <$> listen m
+-}
+
+-- | Check whether unification proceeded without postponement.
+ifClean :: Unify () -> Unify a -> Unify a -> Unify a
+ifClean m t e = do
+  ok <- snd <$> listen m
+  case ok of
+    Definitely -> t
+    Possibly ->   e
+
+{-
+-- | Check whether unification proceeded without postponement.
+ifClean :: Unify a -> (a -> Unify b) -> (a -> Unify b) -> Unify b
+ifClean m t e = do
+  (ok, a) <- listen m
+  case ok of
+    Definitely -> t a
+    Possibly ->   e a
+-}
+
+data Equality = Equal TypeHH Term Term
 type Sub = Map Nat Term
 
-data UnifyException = ConstructorMismatch Type Term Term
-                    | GenericUnifyException String
+data UnifyException
+  = ConstructorMismatch Type Term Term
+  | StronglyRigidOccurrence Type Term Term
+  | GenericUnifyException String
 
 instance Error UnifyException where
   noMsg  = strMsg ""
@@ -58,19 +131,35 @@
 constructorMismatch :: Type -> Term -> Term -> Unify a
 constructorMismatch a u v = throwException $ ConstructorMismatch a u v
 
+constructorMismatchHH :: TypeHH -> Term -> Term -> Unify a
+constructorMismatchHH aHH = constructorMismatch (leftHH aHH)
+  -- do not report heterogenity
+{-
+constructorMismatchHH (Hom a) u v = constructorMismatch a u v
+constructorMismatchHH (Het a1 a2) u v = constructorMismatch a1 u v
+-}
+
+{-
+instance MonadReader TCEnv Unify where
+  ask           = U . lift  $ ask
+  local k (U m) = U . lift . lift . lift $ local k m
+-}
+
 instance MonadState TCState Unify where
-  get = U . lift . lift $ get
-  put = U . lift . lift . put
+  get = U . lift . lift . lift . lift $ get
+  put = U . lift . lift . lift . lift . put
 
 instance MonadTCM Unify where
-  liftTCM = U . lift . lift
+  liftTCM = U . lift . lift . lift . lift
 
 instance Subst Equality where
   substs us	 (Equal a s t) = Equal (substs us a)	  (substs us s)	     (substs us t)
   substUnder n u (Equal a s t) = Equal (substUnder n u a) (substUnder n u s) (substUnder n u t)
 
+{- UNUSED
 getSub :: Unify Sub
 getSub = U $ gets uniSub
+-}
 
 onSub :: (Sub -> a) -> Unify a
 onSub f = U $ gets $ f . uniSub
@@ -79,13 +168,73 @@
 modSub f = U $ modify $ \s -> s { uniSub = f $ uniSub s }
 
 checkEqualities :: [Equality] -> TCM ()
-checkEqualities eqs = noConstraints $ concat <$> mapM checkEq eqs
+checkEqualities eqs = noConstraints $ mapM_ checkEq eqs
   where
-    checkEq (Equal a s t) = equalTerm a s t
+    checkEq (Equal (Hom a) s t) = equalTerm a s t
+    checkEq (Equal (Het a1 a2) s t) = typeError $ HeterogeneousEquality s a1 t a2
 
+-- | Force equality now instead of postponing it using 'addEquality'.
+checkEquality :: Type -> Term -> Term -> TCM ()
+checkEquality a u v = noConstraints $ equalTerm a u v
+
+-- | Try equality.  If constraints remain, postpone (enter unsafe mode).
+--   Heterogeneous equalities cannot be tried nor reawakened,
+--   so we can throw them away and flag "dirty".
+checkEqualityHH :: TypeHH -> Term -> Term -> Unify ()
+checkEqualityHH (Hom a) u v = do
+    ok <- liftTCM $ noConstraints (True <$ equalTerm a u v)  -- no constraints left
+            `catchError` \ err -> return False
+    if ok then return () else addEquality a u v
+checkEqualityHH aHH@(Het a1 a2) u v = -- reportPostponing -- enter "dirty" mode
+    addEqualityHH aHH u v -- postpone, enter "dirty" mode
+{-
+checkEqualityHH (Het a1 a2) u v = noConstraints $ do
+  equalType a1 a2
+  equalTerm a1 u v
+-}
+{-
+checkEqualityHH :: MonadTCM tcm => TypeHH -> Term -> Term -> tcm ()
+checkEqualityHH aHH u v = do
+  a  <- forceHom aHH
+  cs <- equalTerm a u v
+  if null cs then return () else addEquality a u v
+-}
+
+
+-- | Check whether heterogeneous situation is really homogeneous.
+--   If not, give up.
+forceHom :: TypeHH -> TCM Type
+forceHom (Hom a) = return a
+forceHom (Het a1 a2) = do
+  noConstraints $ equalType a1 a2
+  return a1
+
 addEquality :: Type -> Term -> Term -> Unify ()
-addEquality a u v = U $ modify $ \s -> s { uniConstr = Equal a u v : uniConstr s }
+addEquality a = addEqualityHH (Hom a)
 
+addEqualityHH :: TypeHH -> Term -> Term -> Unify ()
+addEqualityHH aHH u v = do
+  reportPostponing
+  U $ modify $ \s -> s { uniConstr = Equal aHH u v : uniConstr s }
+
+{-
+addEquality :: Type -> Term -> Term -> Unify ()
+addEquality a u v = do
+  reportPostponing
+  U $ modify $ \s -> s { uniConstr = Equal a u v : uniConstr s }
+-}
+
+{-
+addEquality :: Type -> Term -> Term -> Unify ()
+addEquality a u v = do
+   p <- askPostpone
+   case p of
+     MayPostpone ->  do
+       reportPostponing
+       U $ modify $ \s -> s { uniConstr = Equal a u v : uniConstr s }
+     MayNotPostpone -> checkEquality a u v
+-}
+
 takeEqualities :: Unify [Equality]
 takeEqualities = U $ do
   s <- get
@@ -95,16 +244,28 @@
 -- | Includes flexible occurrences, metas need to be solved. TODO: relax?
 --   TODO: later solutions may remove flexible occurences
 occursCheck :: Nat -> Term -> Type -> Unify ()
-occursCheck i u a
-  | i `freeIn` u = do
-    reportSDoc "tc.lhs.unify" 20 $ prettyTCM (Var i []) <+> text "occurs in" <+> prettyTCM u
-    typeError $ UnequalTerms CmpEq (Var i []) u a
-  | otherwise	 = return ()
+occursCheck i u a = do
+  let fv = freeVars u
+      v  = Var i []
+  case occurrence i fv of
+    -- Andreas, 2011-04-14
+    -- a strongly rigid recursive occurrences signals unsolvability
+    StronglyRigid -> do
+      liftTCM $ reportSDoc "tc.lhs.unify" 20 $ prettyTCM v <+> text "occurs strongly rigidly in" <+> prettyTCM u
+      throwException $ StronglyRigidOccurrence a v u
 
+    NoOccurrence  -> return ()  -- this includes irrelevant occurrences!
+
+    -- any other recursive occurrence leads to unclear situation
+    _             -> do
+      liftTCM $ reportSDoc "tc.lhs.unify" 20 $ prettyTCM v <+> text "occurs in" <+> prettyTCM u
+      typeError $ UnequalTerms CmpEq v u a
+
+-- | Assignment with preceding occurs check.
 (|->) :: Nat -> (Term, Type) -> Unify ()
 i |-> (u, a) = do
   occursCheck i u a
-  reportSDoc "tc.lhs.unify" 15 $ prettyTCM (Var i []) <+> text ":=" <+> prettyTCM u
+  liftTCM $ reportSDoc "tc.lhs.unify" 15 $ prettyTCM (Var i []) <+> text ":=" <+> prettyTCM u
   modSub $ Map.insert i (killRange u)
 
 makeSubstitution :: Sub -> [Term]
@@ -113,11 +274,32 @@
     val i = maybe (Var i []) id $ Map.lookup i sub
 
 -- | Apply the current substitution on a term and reduce to weak head normal form.
-ureduce :: Term -> Unify Term
-ureduce u = doEtaContractImplicit $ do
-  rho <- onSub makeSubstitution
-  liftTCM $ etaContract =<< reduce (substs rho u)
+class UReduce t where
+  ureduce :: t -> Unify t
 
+instance UReduce Term where
+  ureduce u = doEtaContractImplicit $ do
+    rho <- onSub makeSubstitution
+    liftTCM $ etaContract =<< normalise (substs rho u)
+-- Andreas, 2011-06-22, fix related to issue 423
+-- To make eta contraction work better, I switched reduce to normalise.
+-- I hope the performance penalty is not big (since we are dealing with
+-- l.h.s. terms only).
+-- A systematic solution would make unification type-directed and
+-- eta-insensitive...
+--   liftTCM $ etaContract =<< reduce (substs rho u)
+
+instance UReduce Type where
+  ureduce (El s t) = El s <$> ureduce t
+
+instance UReduce t => UReduce (HomHet t) where
+  ureduce (Hom t)     = Hom <$> ureduce t
+  ureduce (Het t1 t2) = Het <$> ureduce t1 <*> ureduce t2
+
+instance UReduce t => UReduce (Maybe t) where
+  ureduce Nothing = return Nothing
+  ureduce (Just t) = Just <$> ureduce t
+
 -- | Take a substitution σ and ensure that no variables from the domain appear
 --   in the targets. The context of the targets is not changed.
 --   TODO: can this be expressed using makeSubstitution and substs?
@@ -139,6 +321,104 @@
 
 data UnificationResult = Unifies Substitution | NoUnify Type Term Term | DontKnow TCErr
 
+-- | Are we in a homogeneous (one type) or heterogeneous (two types) situation?
+data HomHet a
+  = Hom a    -- ^ homogeneous
+  | Het a a  -- ^ heterogeneous
+  deriving (Typeable, Data, Show, Eq, Ord, Functor, Foldable, Traversable)
+
+isHom :: HomHet a -> Bool
+isHom Hom{} = True
+isHom Het{} = False
+
+fromHom :: HomHet a -> a
+fromHom (Hom a) = a
+fromHom (Het{}) = __IMPOSSIBLE__
+
+leftHH :: HomHet a -> a
+leftHH (Hom a) = a
+leftHH (Het a1 a2) = a1
+
+rightHH :: HomHet a -> a
+rightHH (Hom a) = a
+rightHH (Het a1 a2) = a2
+
+instance (Raise a) => Raise (HomHet a) where
+  raiseFrom n m  = fmap (raiseFrom n m)
+  renameFrom n f = fmap (renameFrom n f)
+
+instance (Subst a) => Subst (HomHet a) where
+  substUnder n u = fmap (substUnder n u)
+  substs us      = fmap (substs us)
+
+instance (PrettyTCM a) => PrettyTCM (HomHet a) where
+  prettyTCM (Hom a) = prettyTCM a
+  prettyTCM (Het a1 a2) = prettyTCM a1 <+> text "||" <+> prettyTCM a2
+
+type TermHH    = HomHet Term
+type TypeHH    = HomHet Type
+--type FunViewHH = FunV TypeHH
+type TelHH     = Tele (Arg TypeHH)
+type TelViewHH = TelV TypeHH
+
+absAppHH :: SubstHH t tHH => Abs t -> TermHH -> tHH
+absAppHH (Abs   _ t) u = substHH u t
+absAppHH (NoAbs _ t) u = trivialHH t
+
+class ApplyHH t where
+  applyHH :: t -> HomHet Args -> HomHet t
+
+instance ApplyHH Term where
+  applyHH t = fmap (apply t)
+
+instance ApplyHH Type where
+  applyHH t = fmap (apply t)
+
+substHH :: SubstHH t tHH => TermHH -> t -> tHH
+substHH = substUnderHH 0
+
+-- | @substHH u t@ substitutes @u@ for the 0th variable in @t@.
+class SubstHH t tHH where
+  substUnderHH :: Nat -> TermHH -> t -> tHH
+  trivialHH    :: t -> tHH
+
+instance (Free a, Subst a) => SubstHH (HomHet a) (HomHet a) where
+  substUnderHH n (Hom u) t = fmap (substUnder n u) t
+  substUnderHH n (Het u1 u2) (Hom t) =
+    if n `relevantIn` t then Het (substUnder n u1 t) (substUnder n u2 t)
+     else Hom (substUnder n u1 t)
+  substUnderHH n (Het u1 u2) (Het t1 t2) = Het (substUnder n u1 t1) (substUnder n u2 t2)
+  trivialHH = id
+
+instance SubstHH Term (HomHet Term) where
+  substUnderHH n uHH t = fmap (\ u -> substUnder n u t) uHH
+  trivialHH = Hom
+
+instance SubstHH Type (HomHet Type) where
+  substUnderHH n uHH (El s t) = fmap (\ u -> El s $ substUnder n u t) uHH
+-- fmap $ fmap (\ (El s v) -> El s $ substUnderHH n u v)
+  -- we ignore sorts in substitution, since they do not contain
+  -- terms we can match on
+  trivialHH = Hom
+
+instance SubstHH a b => SubstHH (Arg a) (Arg b) where
+  substUnderHH n u = fmap $ substUnderHH n u
+  trivialHH = fmap trivialHH
+
+instance SubstHH a b => SubstHH (Abs a) (Abs b) where
+  substUnderHH n u (Abs   x v) = Abs x $ substUnderHH (n + 1) u v
+  substUnderHH n u (NoAbs x v) = NoAbs x $ substUnderHH n u v
+  trivialHH = fmap trivialHH
+
+instance (SubstHH a a', SubstHH b b') => SubstHH (a,b) (a',b') where
+    substUnderHH n u (x,y) = (substUnderHH n u x, substUnderHH n u y)
+    trivialHH = trivialHH *** trivialHH
+
+instance SubstHH a b => SubstHH (Tele a) (Tele b) where
+  substUnderHH n u  EmptyTel         = EmptyTel
+  substUnderHH n u (ExtendTel t tel) = uncurry ExtendTel $ substUnderHH n u (t, tel)
+  trivialHH = fmap trivialHH
+
 -- | Unify indices.
 unifyIndices_ :: MonadTCM tcm => FlexibleVars -> Type -> [Arg Term] -> [Arg Term] -> tcm Substitution
 unifyIndices_ flex a us vs = liftTCM $ do
@@ -150,6 +430,7 @@
 
 unifyIndices :: MonadTCM tcm => FlexibleVars -> Type -> [Arg Term] -> [Arg Term] -> tcm UnificationResult
 unifyIndices flex a us vs = liftTCM $ do
+    a <- reduce a
     reportSDoc "tc.lhs.unify" 10 $
       sep [ text "unifyIndices"
           , nest 2 $ text (show flex)
@@ -158,13 +439,19 @@
           , nest 2 $ prettyList $ map prettyTCM vs
           , nest 2 $ text "context: " <+> (prettyTCM =<< getContextTelescope)
           ]
-    (r, USt s eqs) <- flip runStateT emptyUState . runExceptionT . unUnify $
-                      unifyArgs a us vs >> recheckConstraints
+    (r, USt s eqs) <- flip runStateT emptyUState . runExceptionT . runWriterT . flip runReaderT emptyUEnv . unUnify $ do
+        ifClean (unifyConstructorArgs (Hom a) us vs)
+          -- clean: continue unifying
+          recheckConstraints
+          -- dirty: just check equalities to trigger error message
+          recheckEqualities
 
     case r of
-      Left (ConstructorMismatch a u v)  -> return $ NoUnify a u v
-      Left (GenericUnifyException err)  -> fail err
-      Right _                           -> do
+      Left (ConstructorMismatch     a u v)  -> return $ NoUnify a u v
+      -- Andreas 2011-04-14:
+      Left (StronglyRigidOccurrence a u v)  -> return $ NoUnify a u v
+      Left (GenericUnifyException     err)  -> fail err
+      Right _                               -> do
         checkEqualities $ substs (makeSubstitution s) eqs
         let n = maximum $ (-1) : flex
         return $ Unifies $ flattenSubstitution [ Map.lookup i s | i <- [0..n] ]
@@ -172,30 +459,125 @@
   where
     flexible i = i `elem` flex
 
+    flexibleTerm (Var i []) = flexible i
+    flexibleTerm _          = False
+
+    {- Andreas, 2011-09-12
+       We unify constructors in heterogeneous situations, as long
+       as the two types have the same shape (construct the same datatype).
+     -}
+
+    unifyConstructorArgs ::
+         TypeHH  -- ^ The ureduced type of the constructor, instantiated to the parameters.
+                 --   Possibly heterogeneous, since pars of lhs and rhs might differ.
+      -> [Arg Term]  -- ^ the arguments of the constructor (lhs)
+      -> [Arg Term]  -- ^ the arguments of the constructor (rhs)
+      -> Unify ()
+    unifyConstructorArgs a12 [] [] = return ()
+    unifyConstructorArgs a12 vs1 vs2 = do
+      liftTCM $ reportSDoc "tc.lhs.unify" 15 $ sep
+        [ text "unifyConstructorArgs"
+	-- , nest 2 $ parens (prettyTCM tel0)
+	, nest 2 $ prettyList $ map prettyTCM vs1
+	, nest 2 $ prettyList $ map prettyTCM vs2
+        , nest 2 $ text "constructor type:" <+> prettyTCM a12
+        ]
+      let n = genericLength vs1
+      -- since c vs1 and c vs2 have same-shaped type
+      -- vs1 and vs2 must have same length
+      when (n /= genericLength vs2) $ __IMPOSSIBLE__
+      TelV tel12 _ <- telViewUpToHH n a12
+      -- if the length of tel12 is not n, then something is wrong
+      -- e.g. a12 is not a same-shaped pair of types
+      when (n /= size tel12) $ __IMPOSSIBLE__
+      unifyConArgs tel12 vs1 vs2
+
+    unifyConArgs ::
+         TelHH  -- ^ The telescope(s) of the constructor args    [length = n].
+      -> [Arg Term]  -- ^ the arguments of the constructor (lhs) [length = n].
+      -> [Arg Term]  -- ^ the arguments of the constructor (rhs) [length = n].
+      -> Unify ()
+    unifyConArgs _ (_ : _) [] = __IMPOSSIBLE__
+    unifyConArgs _ [] (_ : _) = __IMPOSSIBLE__
+    unifyConArgs _ []      [] = return ()
+    unifyConArgs EmptyTel _ _ = __IMPOSSIBLE__
+    unifyConArgs tel0@(ExtendTel a@(Arg _ rel bHH) tel) us0@(arg@(Arg _ _ u) : us) vs0@(Arg _ _ v : vs) = do
+      liftTCM $ reportSDoc "tc.lhs.unify" 15 $ sep
+        [ text "unifyConArgs"
+	-- , nest 2 $ parens (prettyTCM tel0)
+	, nest 2 $ prettyList $ map prettyTCM us0
+	, nest 2 $ prettyList $ map prettyTCM vs0
+	, nest 2 $ text "at telescope" <+> prettyTCM bHH <+> text "..."
+        ]
+      liftTCM $ reportSDoc "tc.lhs.unify" 25 $
+        (text $ "tel0 = " ++ show tel0)
+
+
+      -- Andreas, Ulf, 2011-09-08 (AIM XVI)
+      -- in case of dependent function type, we cannot postpone
+      -- unification of u and v, otherwise us or vs might be ill-typed
+      -- skip irrelevant parts
+      uHH <- if (rel == Irrelevant) then return $ Hom u else
+               ifClean (unifyHH bHH u v) (return $ Hom u) (return $ Het u v)
+
+      liftTCM $ reportSDoc "tc.lhs.unify" 25 $
+        (text "uHH (before ureduce) =" <+> prettyTCM uHH)
+
+      uHH <- traverse ureduce uHH
+
+      liftTCM $ reportSDoc "tc.lhs.unify" 25 $
+        (text "uHH (after  ureduce) =" <+> prettyTCM uHH)
+
+      unifyConArgs (tel `absAppHH` uHH) us vs
+
+
+{-
     unifyArgs :: Type -> [Arg Term] -> [Arg Term] -> Unify ()
+    unifyArgs a = unifyArgsHH (Hom a)
+-}
+
+    -- | Used for arguments of a 'Def', not 'Con'.
+    unifyArgs :: Type -> [Arg Term] -> [Arg Term] -> Unify ()
     unifyArgs _ (_ : _) [] = __IMPOSSIBLE__
     unifyArgs _ [] (_ : _) = __IMPOSSIBLE__
     unifyArgs _ [] [] = return ()
     unifyArgs a us0@(arg@(Arg _ _ u) : us) vs0@(Arg _ _ v : vs) = do
-      reportSDoc "tc.lhs.unify" 15 $ sep
+      liftTCM $ reportSDoc "tc.lhs.unify" 15 $ sep
         [ text "unifyArgs"
 	, nest 2 $ parens (prettyTCM a)
 	, nest 2 $ prettyList $ map prettyTCM us0
 	, nest 2 $ prettyList $ map prettyTCM vs0
         ]
-      a <- reduce a
-      case funView $ unEl a of
-	FunV b _  -> do
-	  unify (unArg b) u v
+      a <- ureduce a  -- Q: reduce sufficient?
+      case unEl a of
+	Pi b _  -> do
+          -- Andreas, Ulf, 2011-09-08 (AIM XVI)
+          -- in case of dependent function type, we cannot postpone
+          -- unification of u and v, otherwise us or vs might be ill-typed
+          let dep = dependent $ unEl a
+          -- skip irrelevant parts
+	  unless (argRelevance b == Irrelevant) $
+            (if dep then noPostponing else id) $
+              unify (unArg b) u v
           arg <- traverse ureduce arg
 	  unifyArgs (a `piApply` [arg]) us vs
 	_	  -> __IMPOSSIBLE__
+      where dependent (Pi _ NoAbs{}) = False
+            dependent (Pi b c)       = 0 `relevantIn` absBody c
+            dependent _              = False
 
+    -- | Check using conversion check.
+    recheckEqualities :: Unify ()
+    recheckEqualities = do
+      eqs <- takeEqualities
+      liftTCM $ checkEqualities eqs
+
+    -- | Check using unifier.
     recheckConstraints :: Unify ()
     recheckConstraints = mapM_ unifyEquality =<< takeEqualities
 
     unifyEquality :: Equality -> Unify ()
-    unifyEquality (Equal a u v) = unify a u v
+    unifyEquality (Equal aHH u v) = unifyHH aHH u v
 
     i |->> x = do
       i |-> x
@@ -203,17 +585,151 @@
 
     unifySizes :: Term -> Term -> Unify ()
     unifySizes u v = do
-      sz <- sizeType
-      su <- sizeView u
-      sv <- sizeView v
+      sz <- liftTCM sizeType
+      su <- liftTCM $ sizeView u
+      sv <- liftTCM $ sizeView v
       case (su, sv) of
         (SizeSuc u, SizeSuc v) -> unify sz u v
         (SizeSuc u, SizeInf) -> unify sz u v
         (SizeInf, SizeSuc v) -> unify sz u v
         _                    -> unifyAtom sz u v
 
-    -- TODO: eta for records here
+    -- | Possibly heterogeneous unification (but at same-shaped types).
+    --   In het. situations, we only search for a mismatch!
+    --
+    -- TODO: eta for records!
+    unifyHH ::
+        TypeHH  -- ^ one or two types, need not be in (u)reduced form
+     -> Term -> Term -> Unify ()
+    unifyHH aHH u v = do
+      u <- liftTCM . constructorForm =<< ureduce u
+      v <- liftTCM . constructorForm =<< ureduce v
+      liftTCM $ reportSDoc "tc.lhs.unify" 15 $
+	sep [ text "unifyHH"
+	    , nest 2 $ parens $ prettyTCM u
+	    , nest 2 $ parens $ prettyTCM v
+	    , nest 2 $ text ":" <+> prettyTCM aHH
+	    ]
+      -- obtain the (== Size) function
+      isSizeName <- liftTCM isSizeNameTest
+
+      -- check whether types have the same shape
+      (aHH, sh) <- shapeViewHH =<< ureduce aHH
+      case sh of
+        ElseSh  -> checkEqualityHH aHH u v -- not a type or not same types
+
+        DefSh d -> if isSizeName d then unifySizes u v
+                                   else unifyAtomHH aHH u v
+        _ -> unifyAtomHH aHH u v
+
+    unifyAtomHH ::
+         TypeHH -- ^ in ureduced form
+      -> Term -> Term -> Unify ()
+    unifyAtomHH aHH0 u v = do
+      let (aHH, homogeneous, a) = case aHH0 of
+            Hom a                -> (aHH0, True, a)
+            Het a1 a2 | a1 == a2 -> (Hom a1, True, a1) -- BRITTLE: just checking syn.eq.
+            _                    -> (aHH0, False, __IMPOSSIBLE__)
+           -- use @a@ only if 'homogeneous' holds!
+
+          fallback = checkEqualityHH aHH u v
+
+      liftTCM $ reportSDoc "tc.lhs.unify" 15 $
+	sep [ text "unifyAtom"
+	    , nest 2 $ prettyTCM u <> if flexibleTerm u then text " (flexible)" else empty
+            , nest 2 $ text "=?="
+	    , nest 2 $ prettyTCM v <> if flexibleTerm v then text " (flexible)" else empty
+	    , nest 2 $ text ":" <+> prettyTCM aHH
+	    ]
+      case (u, v) of
+        -- Ulf, 2011-06-19
+        -- We don't want to worry about levels here.
+        (Level l, v) -> do
+            u <- liftTCM $ reallyUnLevelView l
+            unifyAtomHH aHH u v
+        (u, Level l) -> do
+            v <- liftTCM $ reallyUnLevelView l
+            unifyAtomHH aHH u v
+	(Var i us, Var j vs) | i == j  -> checkEqualityHH aHH u v
+	(Var i [], v) | homogeneous && flexible i -> i |->> (v, a)
+	(u, Var j []) | homogeneous && flexible j -> j |->> (u, a)
+	(Con c us, Con c' vs)
+          | c == c' -> do
+              r <- ureduce =<< liftTCM (dataOrRecordTypeHH c aHH)
+              case r of
+                Just a'HH -> unifyConstructorArgs a'HH us vs
+                Nothing   -> checkEqualityHH aHH u v
+          | otherwise -> constructorMismatchHH aHH u v
+        -- Definitions are ok as long as they can't reduce (i.e. datatypes/axioms)
+	(Def d us, Def d' vs)
+          | d == d' -> do
+              -- d must be a data, record or axiom
+              def <- getConstInfo d
+              let ok = case theDef def of
+                    Datatype{} -> True
+                    Record{}   -> True
+                    Axiom{}    -> True
+                    _          -> False
+              inj <- liftTCM $ optInjectiveTypeConstructors <$> pragmaOptions
+              if inj && ok
+                then unifyArgs (defType def) us vs
+                else checkEqualityHH aHH u v
+          -- Andreas, 2011-05-30: if heads disagree, abort
+          -- but do not raise "mismatch" because otherwise type constructors
+          -- would be distinct
+          | otherwise -> checkEqualityHH aHH u v -- typeError $ UnequalTerms CmpEq u v a
+        (Lit l1, Lit l2)
+          | l1 == l2  -> return ()
+          | otherwise -> constructorMismatchHH aHH u v
+
+        -- We can instantiate metas if the other term is inert (constructor application)
+        -- Andreas, 2011-09-13: test/succeed/IndexInference needs this feature.
+        (MetaV m us, v) | homogeneous -> do
+            ok <- liftTCM $ instMeta a m us v
+            liftTCM $ reportSDoc "tc.lhs.unify" 40 $
+              vcat [ fsep [ text "inst meta", text $ if ok then "(ok)" else "(not ok)" ]
+                   , nest 2 $ sep [ prettyTCM u, text ":=", prettyTCM =<< normalise u ]
+                   ]
+            if ok then unify a u v
+                  else addEquality a u v
+        (u, MetaV m vs) | homogeneous -> do
+            ok <- liftTCM $ instMeta a m vs u
+            liftTCM $ reportSDoc "tc.lhs.unify" 40 $
+              vcat [ fsep [ text "inst meta", text $ if ok then "(ok)" else "(not ok)" ]
+                   , nest 2 $ sep [ prettyTCM v, text ":=", prettyTCM =<< normalise v ]
+                   ]
+            if ok then unify a u v
+                  else addEquality a u v
+
+	(Con c us, _) -> do
+           md <- isEtaRecordTypeHH aHH
+           case md of
+             Just (d, parsHH) -> do
+               (tel, vs) <- liftTCM $ etaExpandRecord d (rightHH parsHH) v
+               b <- liftTCM $ getRecordConstructorType d
+               bHH <- ureduce (b `applyHH` parsHH)
+               unifyConstructorArgs bHH us vs
+             Nothing -> fallback
+
+	(_, Con c vs) -> do
+           md <- isEtaRecordTypeHH aHH
+           case md of
+             Just (d, parsHH) -> do
+               (tel, us) <- liftTCM $ etaExpandRecord d (leftHH parsHH) u
+               b <- liftTCM $ getRecordConstructorType d
+               bHH <- ureduce (b `applyHH` parsHH)
+               unifyConstructorArgs bHH us vs
+             Nothing -> fallback
+
+        -- Andreas, 2011-05-30: If I put checkEquality below, then Issue81 fails
+        -- because there are definitions blocked by flexibles that need postponement
+	_  -> fallback
+
+
     unify :: Type -> Term -> Term -> Unify ()
+    unify a = unifyHH (Hom a)
+{-
+    unify :: Type -> Term -> Term -> Unify ()
     unify a u v = do
       u <- constructorForm =<< ureduce u
       v <- constructorForm =<< ureduce v
@@ -226,11 +742,33 @@
       isSize <- isSizeType a
       if isSize then unifySizes u v
                 else unifyAtom a u v
+-}
 
     unifyAtom :: Type -> Term -> Term -> Unify ()
-    unifyAtom a u v =
+    unifyAtom a = unifyAtomHH (Hom a)
+
+{-
+    unifyAtom :: Type -> Term -> Term -> Unify ()
+    unifyAtom a u v = do
+      reportSDoc "tc.lhs.unify" 15 $
+	sep [ text "unifyAtom"
+	    , nest 2 $ prettyTCM u <> if flexibleTerm u then text " (flexible)" else empty
+            , nest 2 $ text "=?="
+	    , nest 2 $ prettyTCM v <> if flexibleTerm v then text " (flexible)" else empty
+	    , nest 2 $ text ":" <+> prettyTCM a
+	    ]
       case (u, v) of
-	(Var i us, Var j vs) | i == j  -> addEquality a u v
+        -- Ulf, 2011-06-19
+        -- We don't want to worry about levels here.
+        (Level l, v) -> do
+            u <- liftTCM $ reallyUnLevelView l
+            unifyAtom a u v
+        (u, Level l) -> do
+            v <- liftTCM $ reallyUnLevelView l
+            unifyAtom a u v
+        -- Andreas, 2011-05-30
+        -- Force equality now rather than postponing it with addEquality
+	(Var i us, Var j vs) | i == j  -> checkEquality a u v
 	(Var i [], v) | flexible i -> i |->> (v, a)
 	(u, Var j []) | flexible j -> j |->> (u, a)
 	(Con c us, Con c' vs)
@@ -252,6 +790,17 @@
               if inj && ok
                 then unifyArgs (defType def) us vs
                 else addEquality a u v
+{- Andreas: checkEquality breaks Data.Vec.Equality
+   we need an injectivity test for data types, Vec A n is injective!
+                else checkEquality a u v
+                -- Andreas: force equality now instead of postponing
+                -- We do not want to end up in a heterogeneous situation,
+                -- where u and v have different types
+-}
+          -- Andreas, 2011-05-30: if heads disagree, abort
+          -- but do not raise "mismatch" because otherwise type constructors
+          -- would be distinct
+          | otherwise -> typeError $ UnequalTerms CmpEq u v a
         (Lit l1, Lit l2)
           | l1 == l2  -> return ()
           | otherwise -> constructorMismatch a u v
@@ -273,8 +822,10 @@
                    ]
             if ok then unify a u v
                   else addEquality a u v
+        -- Andreas, 2011-05-30: If I put checkEquality below, then Issue81 fails
+        -- because there are definitions blocked by flexibles that need postponement
 	_  -> addEquality a u v
-
+-}
     -- The contexts are transient when unifying, so we should just instantiate to
     -- constructor heads and generate fresh metas for the arguments. Beware of
     -- constructors that aren't fully applied.
@@ -301,16 +852,19 @@
                 tel <- getContextTelescope
                 -- important: create the meta in the same environment as the original meta
                 newArgsMetaCtx b' tel us
-            noConstraints $ assignV a m us (v' `apply` margs)
+            noConstraints $ assignV m us (v' `apply` margs)
             return True
           `catchError` \_ -> return False
 
     inertApplication :: Type -> Term -> TCM (Maybe (Term, Type, Args))
     inertApplication a v =
       case v of
+        Con c vs -> fmap (\ b -> (Con c [], b, vs)) <$> dataOrRecordType c a
+{-
         Con c vs -> do
           b <- dataOrRecordType c a
           return $ Just (Con c [], b, vs)
+-}
         Def d vs -> do
           def <- getConstInfo d
           let ans = Just (Def d [], defType def, vs)
@@ -327,16 +881,157 @@
 --
 -- Precondition: The type has to correspond to an application of the
 -- given constructor.
+dataOrRecordType
+  :: QName -- ^ Constructor name.
+  -> Type  -- ^ Type of constructor application (must end in data/record).
+  -> TCM (Maybe Type) -- ^ Type of constructor, applied to pars.
+dataOrRecordType c a = fmap (\ (d, b, args) -> b `apply` args) <$> dataOrRecordType' c a
 
+dataOrRecordType' ::
+     QName -- ^ Constructor name.
+  -> Type  -- ^ Type of constructor application (must end in data/record).
+  -> TCM (Maybe (QName, Type, Args))
+           -- ^ Name of data/record type,
+           --   type of constructor to be applied, and
+           --   data/record parameters
+dataOrRecordType' c a = do
+  -- The telescope ends with a datatype or a record.
+  TelV _ (El _ (Def d args)) <- telView a
+  def <- theDef <$> getConstInfo d
+  r <- case def of
+    Datatype{dataPars = n} -> Just . ((,) n) . defType <$> getConstInfo c
+    Record  {recPars  = n} -> Just . ((,) n) <$> getRecordConstructorType d
+    _		           -> return Nothing
+  return $ fmap (\ (n, a') -> (d, a', genericTake n args)) r
+
+-- | Heterogeneous situation.
+--   @a1@ and @a2@ need to end in same datatype/record.
+dataOrRecordTypeHH ::
+     QName      -- ^ Constructor name.
+  -> TypeHH     -- ^ Type(s) of constructor application (must end in same data/record).
+  -> TCM (Maybe TypeHH) -- ^ Type of constructor, instantiated possibly heterogeneously to parameters.
+dataOrRecordTypeHH c (Hom a) = fmap Hom <$> dataOrRecordType c a
+dataOrRecordTypeHH c (Het a1 a2) = do
+  r1 <- dataOrRecordType' c a1
+  r2 <- dataOrRecordType' c a2  -- b2 may have different parameters than b1!
+  return $ case (r1, r2) of
+    (Just (d1, b1, pars1), Just (d2, b2, pars2)) | d1 == d2 -> Just $
+        -- Andreas, 2011-09-15 if no parameters, we can stay homogeneous
+        if null pars1 && null pars2 then Hom b1
+         -- if parameters, go heterogeneous
+         -- TODO: make this smarter, because parameters could be equal!
+         else Het (b1 `apply` pars1) (b2 `apply` pars2)
+    _ -> Nothing
+
+-- | Return record type identifier if argument is a record type.
+isEtaRecordTypeHH :: MonadTCM tcm => TypeHH -> tcm (Maybe (QName, HomHet Args))
+isEtaRecordTypeHH (Hom a) = fmap (\ (d, ps) -> (d, Hom ps)) <$> liftTCM (isEtaRecordType a)
+isEtaRecordTypeHH (Het a1 a2) = do
+  m1 <- liftTCM $ isEtaRecordType a1
+  m2 <- liftTCM $ isEtaRecordType a2
+  case (m1, m2) of
+    (Just (d1, as1), Just (d2, as2)) | d1 == d2 -> return $ Just (d1, Het as1 as2)
+    _ -> return Nothing
+
+
+{-
 dataOrRecordType :: MonadTCM tcm
-                 => QName -- ^ Constructor name.
-                 -> Type -> tcm Type
-dataOrRecordType c a = do
+  => QName -- ^ Constructor name.
+  -> Type  -- ^ Type of constructor application (must end in data/record).
+  -> tcm (Maybe Type) -- ^ Type of constructor, applied to pars.
+dataOrRecordType c a = fmap snd <$> dataOrRecordType' c a
+
+dataOrRecordType' :: MonadTCM tcm
+  => QName -- ^ Constructor name.
+  -> Type  -- ^ Type of constructor application (must end in data/record).
+  -> tcm (Maybe (QName, -- ^ Name of data/record type.
+                 Type))  -- ^ Type of constructor, applied to pars.
+dataOrRecordType' c a = do
   -- The telescope ends with a datatype or a record.
   TelV _ (El _ (Def d args)) <- telView a
   def <- theDef <$> getConstInfo d
-  (n, a')  <- case def of
-    Datatype{dataPars = n} -> ((,) n) . defType <$> getConstInfo c
-    Record  {recPars  = n} -> ((,) n) <$> getRecordConstructorType d
-    _		           -> __IMPOSSIBLE__
-  return (a' `apply` genericTake n args)
+  r <- case def of
+    Datatype{dataPars = n} -> Just . ((,) n) . defType <$> getConstInfo c
+    Record  {recPars  = n} -> Just . ((,) n) <$> getRecordConstructorType d
+    _		           -> return Nothing
+  return $ fmap (\ (n, a') -> (d, a' `apply` genericTake n args)) r
+
+-- | Heterogeneous situation.
+--   @a1@ and @a2@ need to end in same datatype/record.
+dataOrRecordTypeHH :: MonadTCM tcm
+  => QName      -- ^ Constructor name.
+  -> TypeHH     -- ^ Type(s) of constructor application (must end in same data/record).
+  -> tcm (Maybe TypeHH) -- ^ Type of constructor, instantiated possibly heterogeneously to parameters.
+dataOrRecordTypeHH c (Hom a) = fmap Hom <$> dataOrRecordType c a
+dataOrRecordTypeHH c (Het a1 a2) = do
+  r1 <- dataOrRecordType' c a1
+  r2 <- dataOrRecordType' c a2  -- b2 may have different parameters than b1!
+  return $ case (r1, r2) of
+    (Just (d1, b1), Just (d2, b2)) | d1 == d2 -> Just $ Het b1 b2
+    _ -> Nothing
+-}
+
+-- | Views an expression (pair) as type shape.  Fails if not same shape.
+data ShapeView a
+  = PiSh (Arg a) (Abs a)
+  | FunSh (Arg a) a
+  | DefSh QName   -- ^ data/record
+  | VarSh Nat     -- ^ neutral type
+  | LitSh Literal -- ^ built-in type
+  | SortSh
+  | MetaSh        -- ^ some meta
+  | ElseSh        -- ^ not a type or not definitely same shape
+  deriving (Typeable, Data, Show, Eq, Ord, Functor)
+
+-- | Return the type and its shape.  Expects input in (u)reduced form.
+shapeView :: Type -> Unify (Type, ShapeView Type)
+shapeView t = do
+--  t <- liftTCM $ reduce t  -- DO NOT REDUCE!
+-- --  t <- ureduce t  -- BUG!! substitutes bound variables in telescope!
+  return . (t,) $ case unEl t of
+    Pi a (NoAbs _ b) -> FunSh a b
+    Pi a (Abs x b) -> PiSh a (Abs x b)
+    Def d vs       -> DefSh d
+    Var x vs       -> VarSh x
+    Lit l          -> LitSh l
+    Sort s         -> SortSh
+    MetaV m vs     -> MetaSh
+    _              -> ElseSh
+
+-- | Return the reduced type(s) and the common shape.
+shapeViewHH :: TypeHH -> Unify (TypeHH, ShapeView TypeHH)
+shapeViewHH (Hom a) = do
+  (a, sh) <- shapeView a
+  return (Hom a, fmap Hom sh)
+shapeViewHH (Het a1 a2) = do
+  (a1, sh1) <- shapeView a1
+  (a2, sh2) <- shapeView a2
+  return . (Het a1 a2,) $ case (sh1, sh2) of
+
+    (PiSh (Arg h1 r1 a1) b1, PiSh (Arg h2 r2 a2) b2)
+      | h1 == h2 ->
+      PiSh (Arg h1 (min r1 r2) (Het a1 a2)) (Abs (absName b1) (Het (absBody b1) (absBody b2)))
+
+    (FunSh (Arg h1 r1 a1) b1, FunSh (Arg h2 r2 a2) b2)
+      | h1 == h2 ->
+      FunSh (Arg h1 (min r1 r2) (Het a1 a2)) (Het b1 b2)
+
+    (DefSh d1, DefSh d2) | d1 == d2 -> DefSh d1
+    (VarSh x1, VarSh x2) | x1 == x2 -> VarSh x1
+    (LitSh l1, LitSh l2) | l1 == l2 -> LitSh l1
+    (SortSh, SortSh)                -> SortSh
+    _ -> ElseSh  -- not types, or metas, or not same shape
+
+
+-- | @telViewUpToHH n t@ takes off the first @n@ function types of @t@.
+-- Takes off all if $n < 0$.
+telViewUpToHH :: Int -> TypeHH -> Unify TelViewHH
+telViewUpToHH 0 t = return $ TelV EmptyTel t
+telViewUpToHH n t = do
+  (t, sh) <- shapeViewHH =<< liftTCM (traverse reduce t)
+  case sh of
+    PiSh a b  -> absV a (absName b) <$> telViewUpToHH (n-1) (absBody b)
+    FunSh a b -> absV a "_" <$> telViewUpToHH (n-1) (raise 1 b)
+    _         -> return $ TelV EmptyTel t
+  where
+    absV a x (TelV tel t) = TelV (ExtendTel a (Abs x tel)) t
diff --git a/src/full/Agda/TypeChecking/Rules/Record.hs b/src/full/Agda/TypeChecking/Rules/Record.hs
--- a/src/full/Agda/TypeChecking/Rules/Record.hs
+++ b/src/full/Agda/TypeChecking/Rules/Record.hs
@@ -17,7 +17,8 @@
 import Agda.TypeChecking.Reduce
 import Agda.TypeChecking.Pretty
 import Agda.TypeChecking.Polarity
-import Agda.TypeChecking.CompiledClause
+import Agda.TypeChecking.Irrelevance
+import Agda.TypeChecking.CompiledClause.Compile
 
 import Agda.TypeChecking.Rules.Data ( bindParameters, fitsIn )
 import Agda.TypeChecking.Rules.Term ( isType_ )
@@ -33,7 +34,19 @@
 -- * Records
 ---------------------------------------------------------------------------
 
-checkRecDef :: Info.DefInfo -> QName -> Maybe A.Constructor ->
+-- | @checkRecDef i name con ps contel fields@
+--
+--     [@name@]    Record type identifier.
+--
+--     [@con@]     Maybe constructor name and info.
+--
+--     [@ps@]      Record parameters.
+--
+--     [@contel@]  Approximate type of constructor (@fields@ -> Set).
+--
+--     [@fields@]  List of field signatures.
+--
+checkRecDef :: Info.DefInfo -> QName -> Maybe A.QName -> --Maybe A.Constructor ->
                [A.LamBinding] -> A.Expr -> [A.Constructor] -> TCM ()
 checkRecDef i name con ps contel fields =
   traceCall (CheckRecDef (getRange i) (qnameName name) ps fields) $ do
@@ -41,49 +54,76 @@
       [ text "checking record def" <+> prettyTCM name
       , nest 2 $ text "ps ="     <+> prettyList (map prettyA ps)
       , nest 2 $ text "contel =" <+> prettyA contel
-      , nest 2 $ text "fields =" <+> prettyA fields
+      , nest 2 $ text "fields =" <+> prettyA (map Constr fields)
       ]
     -- get type of record
     t <- instantiateFull =<< typeOfConst name
     bindParameters ps t $ \tel t0 -> do
+
+      -- Generate type of constructor from field telescope @contel@,
+      -- which is the approximate constructor type (target missing).
+
+      -- Check and evaluate field types.
+      reportSDoc "tc.rec" 15 $ text "checking fields"
+      -- WRONG: contype <- workOnTypes $ killRange <$> (instantiateFull =<< isType_ contel)
+      contype <- killRange <$> (instantiateFull =<< isType_ contel)
+
+      -- compute the field telescope
+      let TelV ftel _ = telView' contype
+
+          -- A record is irrelevant if all of its fields are.
+          -- In this case, the associated module parameter will be irrelevant.
+          -- See issue 392.
+          recordRelevance = minimum $ Irrelevant : (map argRelevance $ telToList ftel)
+
+      -- Compute correct type of constructor
+
       -- t = tel -> t0 where t0 must be a sort s
       t0' <- normalise t0
       s <- case unEl t0' of
 	Sort s	-> return s
 	_	-> typeError $ ShouldBeASort t0
       gamma <- getContextTelescope
-      let m = qnameToMName name
-	  htel		 = map hide $ telToList tel
-	  rect		 = El s $ Def name $ reverse
-			   [ Arg h r (Var i [])
-			   | (i, Arg h r _) <- zip [0..] $ reverse $ telToList gamma
-			   ]
-	  tel'		 = telFromList $ htel ++ [defaultArg ("r", rect)]
-          extWithR ret   = underAbstraction (defaultArg rect) (Abs "r" ()) $ \_ -> ret
-          ext (Arg h r (x, t)) = addCtx x (Arg h r t)
-
-      let getName :: A.Declaration -> [Arg QName]
-          getName (A.Field _ x arg)    = [fmap (const x) arg]
-	  getName (A.ScopedDecl _ [f]) = getName f
-	  getName _		       = []
-
-      ctx <- (reverse . map hide . take (size tel)) <$> getContext
+      let m               = qnameToMName name
+          -- make record parameters hidden and non-stricts irrelevant
+	  htel		  = map hideAndRelParams $ telToList tel
+          -- record type (name applied to parameters)
+	  rect		  = El s $ Def name $ reverse
+			    [ Arg h r (Var i [])
+			    | (i, Arg h r _) <- zip [0..] $ reverse $ telToList gamma
+			    ]
+	  telh' h	  = telFromList $ htel ++ [Arg h recordRelevance ("r", rect)]
+	  tel'		  = telh' NotHidden
+	  telIFS	  = telh' Instance
+          extWithRH h ret = underAbstraction (Arg h recordRelevance rect) (Abs "" ()) $ \_ -> ret
+          extWithR        = extWithRH NotHidden
+          ext     (Arg h r (x, t)) = addCtx x (Arg h r t)
+{- UNUSED
+          extHide (Arg h r (x, t)) = addCtx x (Arg Hidden r t)
+-}
 
-      -- We have to rebind the parameters to make them hidden
-      -- Check the field telescope
-      contype <- killRange <$> (instantiateFull =<< isType_ contel)
-      let TelV ftel _ = telView' contype
-      let contype = telePi ftel (raise (size ftel) rect)
+      -- Put in @rect@ as correct target of constructor type.
+      -- Andreas, 2011-05-10 use telePi_ instead of telePi to preserve
+      -- even names of non-dependent fields in constructor type (Issue 322).
+      let contype = telePi_ ftel (raise (size ftel) rect)
 
+      -- Obtain name of constructor (if present).
       (hasNamedCon, conName, conInfo) <- case con of
-        Just (A.Axiom i _ c _) -> return (True, c, i)
-        Just _                 -> __IMPOSSIBLE__
-        Nothing                -> do
+        Just c  -> return (True, c, i)
+        Nothing -> do
           m <- killRange <$> currentModule
           c <- qualify m <$> freshName_ "recCon-NOT-PRINTED"
           return (False, c, i)
 
-      addConstant name $ Defn Relevant name t0 (defaultDisplayForm name) 0
+      -- Add record type to signature.
+      reportSDoc "tc.rec" 15 $ text "adding record type to signature"
+
+      let getName :: A.Declaration -> [Arg QName]
+          getName (A.Field _ x arg)    = [fmap (const x) arg]
+	  getName (A.ScopedDecl _ [f]) = getName f
+	  getName _		       = []
+
+      addConstant name $ Defn Relevant name t0 (defaultDisplayForm name) 0 noCompiledRep
 		       $ Record { recPars           = 0
                                 , recClause         = Nothing
                                 , recCon            = conName
@@ -97,21 +137,37 @@
                                 , recArgOccurrences = []
                                 }
 
+      -- Add record constructor to signature
+      -- Andreas, 2011-05-19 moved this here, it was below the record module
+      --   creation
       addConstant conName $
-        Defn Relevant conName contype (defaultDisplayForm conName) 0 $
+        Defn Relevant conName contype (defaultDisplayForm conName) 0 noCompiledRep $
              Constructor { conPars   = 0
                          , conSrcCon = conName
                          , conData   = name
-                         , conHsCode = Nothing
                          , conAbstr  = Info.defAbstract conInfo
                          , conInd    = Inductive
                          }
 
+      -- Check that the fields fit inside the sort
+      let dummy = Var 0 []  -- We're only interested in the sort here
+      telePi ftel (El s dummy) `fitsIn` s
+
+      {- Andreas, 2011-04-27 WRONG because field types are checked again
+         and then non-stricts should not yet be irrelevant
+
+      -- make record parameters hidden and non-stricts irrelevant
+      -- ctx <- (reverse . map hideAndRelParams . take (size tel)) <$> getContext
+      -}
+
+      -- make record parameters hidden
+      ctx <- (reverse . map hide . take (size tel)) <$> getContext
+
       escapeContext (size tel) $ flip (foldr ext) ctx $ extWithR $ do
 	reportSDoc "tc.rec.def" 10 $ sep
 	  [ text "record section:"
 	  , nest 2 $ sep
-            [ prettyTCM m <+> (prettyTCM =<< getContextTelescope)
+            [ prettyTCM m <+> (inContext [] . prettyTCM =<< getContextTelescope)
             , fsep $ punctuate comma $ map (text . show . getName) fields
             ]
 	  ]
@@ -123,30 +179,32 @@
         -- Check the types of the fields
         -- ftel <- checkRecordFields m name tel s [] (size fields) fields
         withCurrentModule m $
-          checkRecordProjections m conName tel' (raise 1 ftel) fields
+          checkRecordProjections m name conName tel' (raise 1 ftel) fields
 
-      -- Check that the fields fit inside the sort
-      let dummy = Var 0 []  -- We're only interested in the sort here
-      telePi ftel (El s dummy) `fitsIn` s
+      -- Andreas, 2011-05-19 here was the code "Add record constr..."
 
       computePolarity name
 
       return ()
 
-{-| @checkRecordProjections q tel ftel s vs n fs@:
-    @m@: name of the generated module
-    @q@: name of the record
-    @tel@: parameters
-    @s@: sort of the record
-    @ftel@: telescope of fields
-    @vs@: values of previous fields (should have one free variable, which is
-	  the record)
-    @fs@: the fields to be checked
+{-| @checkRecordProjections m r q tel ftel fs@.
+
+    [@m@    ]  name of the generated module
+
+    [@r@    ]  name of the record type
+
+    [@q@    ]  name of the record constructor
+
+    [@tel@  ]  parameters
+
+    [@ftel@ ]  telescope of fields
+
+    [@fs@   ]  the fields to be checked
 -}
 checkRecordProjections ::
-  ModuleName -> QName -> Telescope -> Telescope ->
+  ModuleName -> QName -> QName -> Telescope -> Telescope ->
   [A.Declaration] -> TCM ()
-checkRecordProjections m q tel ftel fs = checkProjs EmptyTel ftel fs
+checkRecordProjections m r q tel ftel fs = checkProjs EmptyTel ftel fs
   where
 
     checkProjs :: Telescope -> Telescope -> [A.Declaration] -> TCM ()
@@ -162,15 +220,16 @@
       reportSDoc "tc.rec.proj" 5 $ sep
 	[ text "checking projection"
 	, nest 2 $ vcat
-	  [ text "top   =" <+> (prettyTCM =<< getContextTelescope)
+	  [ text "top   =" <+> (inContext [] . prettyTCM =<< getContextTelescope)
 	  , text "ftel1 =" <+> prettyTCM ftel1
 	  , text "ftel2 =" <+> addCtxTel ftel1 (underAbstraction_ ftel2 prettyTCM)
 	  , text "t     =" <+> prettyTCM t
 	  ]
 	]
+      -- Andreas, 2011-04-27 work on rhs of ':'
+      -- WRONG: t <- workOnTypes $ isType_ t
       t <- isType_ t
 
-
       -- Andreas, 2010-09-09 The following comments are misleading, TODO: update
       -- in fact, tel includes the variable of record type as last one
       -- e.g. for cartesion product it is
@@ -197,17 +256,19 @@
 
       reportSDoc "tc.rec.proj" 10 $ sep
 	[ text "adding projection"
-	, nest 2 $ prettyTCM projname <+> text ":" <+> prettyTCM finalt
+	, nest 2 $ prettyTCM projname <+> text ":" <+> inContext [] (prettyTCM finalt)
 	]
 
       -- The body should be
       --  P.xi {tel} (r _ .. x .. _) = x
+      -- Ulf, 2011-08-22: actually we're dropping the parameters from the
+      -- projection functions so the body is now
+      --  P.xi (r _ .. x .. _) = x
 
       let -- Andreas, 2010-09-09: comment for existing code
           -- split the telescope into parameters (ptel) and the type or the record
           -- (rt) which should be  R ptel
           (ptel,[rt]) = splitAt (size tel - 1) $ telToList tel
-          hps	 = map (fmap $ VarP . fst) $ ptel
 	  conp	 = defaultArg
 		 $ ConP q (Just (fmap snd rt))
                    $ zipWith3 Arg
@@ -216,37 +277,42 @@
 			      [ VarP "x" | _ <- [1..size ftel] ]
 	  nobind 0 = id
 	  nobind n = Bind . Abs "_" . nobind (n - 1)
-	  body	 = nobind (size ptel)
-		 $ nobind (size ftel1)
+	  body	 = nobind (size ftel1)
 		 $ Bind . Abs "x"
 		 $ nobind (size ftel2)
 		 $ Body $ Var (size ftel2) []
-          cltel  = (telFromList ptel) `abstract` ftel
+          cltel  = ftel
 	  clause = Clause { clauseRange = getRange info
                           , clauseTel   = killRange cltel
-                          , clausePerm  = idP $ size ptel + size ftel
-                          , clausePats  = hps ++ [conp]
+                          , clausePerm  = idP $ size ftel
+                          , clausePats  = [conp]
                           , clauseBody  = body
                           }
-          clause2 = Clauses Nothing clause
-          cc      = compileClauses [clause2]
 
+            -- Record patterns should /not/ be translated when the
+            -- projection functions are defined. Record pattern
+            -- translation is defined in terms of projection
+            -- functions.
+      cc <- compileClauses False [clause]
+
       reportSDoc "tc.cc" 10 $ do
         sep [ text "compiled clauses of " <+> prettyTCM projname
             , nest 2 $ text (show cc)
             ]
 
       escapeContext (size tel) $ do
-	addConstant projname $ Defn rel projname (killRange finalt) (defaultDisplayForm projname) 0
-          $ Function { funClauses        = [clause2]
+	addConstant projname $ Defn rel projname (killRange finalt) (defaultDisplayForm projname) 0 noCompiledRep
+          $ Function { funClauses        = [clause]
                      , funCompiled       = cc
                      , funDelayed        = NotDelayed
                      , funInv            = NotInjective
                      , funAbstr          = ConcreteDef
                      , funPolarity       = []
-                     , funArgOccurrences = map (const Unused) hps ++ [Negative]
-                     , funProjection     = Just (size hps + 1)
-                       -- index of the record argument, start counting with 1
+                     , funArgOccurrences = [Negative]
+                     , funProjection     = Just (r, size ptel + 1)
+                       -- name of the record type and
+                       -- index of the record argument (in the type), start counting with 1
+                     , funStatic         = False
                      }
         computePolarity projname
 
diff --git a/src/full/Agda/TypeChecking/Rules/Term.hs b/src/full/Agda/TypeChecking/Rules/Term.hs
--- a/src/full/Agda/TypeChecking/Rules/Term.hs
+++ b/src/full/Agda/TypeChecking/Rules/Term.hs
@@ -12,12 +12,18 @@
 import qualified Agda.Utils.IO.Locale as LocIO
 import qualified Data.Map as Map
 import qualified Data.Set as Set
+import Data.Traversable (traverse)
 
+import Agda.Interaction.Options
+
 import qualified Agda.Syntax.Abstract as A
 import qualified Agda.Syntax.Abstract.Views as A
 import qualified Agda.Syntax.Info as A
 import Agda.Syntax.Concrete.Pretty () -- only Pretty instances
+import qualified Agda.Syntax.Concrete.Name as C
 import Agda.Syntax.Common
+import Agda.Syntax.Translation.AbstractToConcrete
+import Agda.Syntax.Concrete.Pretty
 import Agda.Syntax.Fixity
 import Agda.Syntax.Internal
 import Agda.Syntax.Internal.Generic
@@ -25,6 +31,7 @@
 import Agda.Syntax.Literal
 import Agda.Syntax.Abstract.Views
 import Agda.Syntax.Scope.Base (emptyScopeInfo)
+import Agda.Syntax.Translation.InternalToAbstract (reify)
 
 import Agda.TypeChecking.Monad
 import Agda.TypeChecking.Monad.Builtin
@@ -39,18 +46,20 @@
 import Agda.TypeChecking.Free
 import Agda.TypeChecking.Telescope
 import Agda.TypeChecking.Datatypes
+import Agda.TypeChecking.Irrelevance
 import Agda.TypeChecking.EtaContract
 import Agda.TypeChecking.Quote
 import Agda.TypeChecking.CompiledClause
+import Agda.TypeChecking.Level
 import {-# SOURCE #-} Agda.TypeChecking.Rules.Builtin.Coinduction
 
 import Agda.Utils.Fresh
 import Agda.Utils.Tuple
 import Agda.Utils.Permutation
 
-import {-# SOURCE #-} Agda.TypeChecking.Empty (isEmptyTypeC)
+import {-# SOURCE #-} Agda.TypeChecking.Empty (isEmptyType)
 import {-# SOURCE #-} Agda.TypeChecking.Rules.Decl (checkSectionApplication)
-import {-# SOURCE #-} Agda.TypeChecking.Rules.Def (checkFunDef)
+import {-# SOURCE #-} Agda.TypeChecking.Rules.Def (checkFunDef,checkFunDef')
 
 import Agda.Utils.Monad
 import Agda.Utils.Size
@@ -72,19 +81,56 @@
 -- | Check that an expression is a type without knowing the sort.
 isType_ :: A.Expr -> TCM Type
 isType_ e =
-    traceCall (IsType_ e) $ do
-    s <- newSortMeta
-    isType e s
+  traceCall (IsType_ e) $
+  case e of
+    A.Fun i a b -> do
+      a <- traverse isType_ a
+      b <- isType_ b
+      return $ El (sLub (getSort $ unArg a) (getSort b)) (Pi a (NoAbs "_" b))
+    A.Pi _ tel e -> do
+      checkTelescope_ tel $ \tel -> do
+        t   <- instantiateFull =<< isType_ e
+        tel <- instantiateFull tel
+        return $ telePi tel t
+    A.Set _ n    -> do
+      n <- ifM typeInType (return 0) (return n)
+      return $ sort (mkType n)
+    A.App i s (Arg NotHidden r l)
+      | A.Set _ 0 <- unScope s ->
+      ifM (not <$> hasUniversePolymorphism)
+          (typeError $ GenericError "Use --universe-polymorphism to enable level arguments to Set")
+      $ do
+        lvl <- primLevel
+        -- allow NonStrict variables when checking level
+        --   Set : (NonStrict) Level -> Set\omega
+        n   <- levelView =<< applyRelevanceToContext NonStrict
+                              (checkExpr (namedThing l) (El (mkType 0) lvl))
+        return $ sort (Type n)
+    _ -> do
+      s <- workOnTypes $ newSortMeta
+      isType e s
 
+-- | Check that an expression is a type which is equal to a given type.
+isTypeEqualTo :: A.Expr -> Type -> TCM Type
+isTypeEqualTo e t = case e of
+  A.ScopedExpr _ e -> isTypeEqualTo e t
+  A.Underscore i | A.metaNumber i == Nothing -> return t
+  e -> do
+    t' <- isType e (getSort t)
+    t' <$ leqType_ t t'
+
+leqType_ :: Type -> Type -> TCM ()
+leqType_ t t' = workOnTypes $ leqType t t'
+
+{- UNUSED
 -- | Force a type to be a Pi. Instantiates if necessary. The 'Hiding' is only
 --   used when instantiating a meta variable.
 
-forcePi :: MonadTCM tcm => Hiding -> String -> Type -> tcm (Type, Constraints)
+forcePi :: Hiding -> String -> Type -> TCM (Type, Constraints)
 forcePi h name (El s t) =
     do	t' <- reduce t
 	case t' of
 	    Pi _ _	-> return (El s t', [])
-	    Fun _ _	-> return (El s t', [])
             _           -> do
                 sa <- newSortMeta
                 sb <- newSortMeta
@@ -98,12 +144,13 @@
                 cs <- equalType (El s t') ty
                 ty' <- reduce ty
                 return (ty', cs)
-
+-}
 
 ---------------------------------------------------------------------------
 -- * Telescopes
 ---------------------------------------------------------------------------
 
+{- UNUSED
 -- | Type check a telescope. Binds the variables defined by the telescope.
 checkTelescope :: A.Telescope -> Sort -> (Telescope -> TCM a) -> TCM a
 checkTelescope [] s ret = ret EmptyTel
@@ -115,21 +162,21 @@
 -- | Check a typed binding and extends the context with the bound variables.
 --   The telescope passed to the continuation is valid in the original context.
 checkTypedBindings :: A.TypedBindings -> Sort -> (Telescope -> TCM a) -> TCM a
-checkTypedBindings (A.TypedBindings i (Arg h rel bs)) s ret =
-    thread (checkTypedBinding h s) bs $ \bss ->
-    ret $ foldr (\(x,t) -> ExtendTel (Arg h rel t) . Abs x) EmptyTel (concat bss)
+checkTypedBindings (A.TypedBindings i (Arg h rel b)) s ret =
+    checkTypedBinding h rel s b $ \bs ->
+    ret $ foldr (\(x,t) -> ExtendTel (Arg h rel t) . Abs x) EmptyTel bs
 
-checkTypedBinding :: Hiding -> Sort -> A.TypedBinding -> ([(String,Type)] -> TCM a) -> TCM a
-checkTypedBinding h s (A.TBind i xs e) ret = do
+checkTypedBinding :: Hiding -> Relevance -> Sort -> A.TypedBinding -> ([(String,Type)] -> TCM a) -> TCM a
+checkTypedBinding h rel s (A.TBind i xs e) ret = do
     t <- isType e s
-    addCtxs xs (Arg h Relevant t) $ ret $ mkTel xs t
+    addCtxs xs (Arg h rel t) $ ret $ mkTel xs t
     where
 	mkTel [] t     = []
 	mkTel (x:xs) t = (show $ nameConcrete x,t) : mkTel xs (raise 1 t)
-checkTypedBinding h s (A.TNoBind e) ret = do
+checkTypedBinding h rel s (A.TNoBind e) ret = do
     t <- isType e s
     ret [("_",t)]
-
+-}
 
 -- | Type check a telescope. Binds the variables defined by the telescope.
 checkTelescope_ :: A.Telescope -> (Telescope -> TCM a) -> TCM a
@@ -139,39 +186,110 @@
     checkTelescope_ tel   $ \tel2 ->
 	ret $ abstract tel1 tel2
 
-
 -- | Check a typed binding and extends the context with the bound variables.
 --   The telescope passed to the continuation is valid in the original context.
 checkTypedBindings_ :: A.TypedBindings -> (Telescope -> TCM a) -> TCM a
-checkTypedBindings_ (A.TypedBindings i (Arg h rel bs)) ret =
-    thread (checkTypedBinding_ h) bs $ \bss ->
-    ret $ foldr (\(x,t) -> ExtendTel (Arg h rel t) . Abs x) EmptyTel (concat bss)
+checkTypedBindings_ = checkTypedBindings PiNotLam
 
-checkTypedBinding_ :: Hiding -> A.TypedBinding -> ([(String,Type)] -> TCM a) -> TCM a
-checkTypedBinding_ h (A.TBind i xs e) ret = do
-    t <- isType_ e
-    addCtxs xs (Arg h Relevant t) $ ret $ mkTel xs t
+data LamOrPi = LamNotPi | PiNotLam deriving (Eq,Show)
+
+-- | Check a typed binding and extends the context with the bound variables.
+--   The telescope passed to the continuation is valid in the original context.
+--
+--   Parametrized by a flag wether we check a typed lambda or a Pi. This flag
+--   is needed for irrelevance.
+checkTypedBindings :: LamOrPi -> A.TypedBindings -> (Telescope -> TCM a) -> TCM a
+checkTypedBindings lamOrPi (A.TypedBindings i (Arg h rel b)) ret =
+    checkTypedBinding lamOrPi h rel b $ \bs ->
+    ret $ foldr (\(x,t) -> ExtendTel (Arg h rel t) . Abs x) EmptyTel bs
+
+checkTypedBinding :: LamOrPi -> Hiding -> Relevance -> A.TypedBinding -> ([(String,Type)] -> TCM a) -> TCM a
+checkTypedBinding lamOrPi h rel (A.TBind i xs e) ret = do
+    -- Andreas, 2011-04-26 irrelevant function arguments may appear
+    -- non-strictly in the codomain type
+    -- 2011-10-04 if flag --experimental-irrelevance is set
+    allowed <- optExperimentalIrrelevance <$> pragmaOptions
+    t <- modEnv lamOrPi allowed $ isType_ e
+    addCtxs xs (Arg h (modRel lamOrPi allowed rel) t) $ ret $ mkTel xs t
     where
+        -- if we are checking a typed lambda, we resurrect before we check the
+        -- types, but do not modify the new context entries
+        -- otherwise, if we are checking a pi, we do not resurrect, but
+        -- modify the new context entries
+        modEnv LamNotPi True = doWorkOnTypes
+        modEnv _        _    = id
+        modRel PiNotLam True = irrToNonStrict
+        modRel _        _    = id
 	mkTel [] t     = []
 	mkTel (x:xs) t = (show $ nameConcrete x,t) : mkTel xs (raise 1 t)
-checkTypedBinding_ h (A.TNoBind e) ret = do
+checkTypedBinding lamOrPi h rel (A.TNoBind e) ret = do
     t <- isType_ e
     ret [("_",t)]
 
+-- | Type check a lambda expression.
+checkLambda :: Arg A.TypedBinding -> A.Expr -> Type -> TCM Term
+checkLambda (Arg _ _ A.TNoBind{}) _ _ = __IMPOSSIBLE__
+checkLambda (Arg h r (A.TBind _ xs typ)) body target = do
+  TelV tel btyp <- telViewUpTo (length xs) target
+  if size tel < size xs || length xs /= 1
+    then dontUseTargetType
+    else useTargetType tel btyp
+  where
+    dontUseTargetType = do
+      -- Checking λ (xs : argsT) → body : target
+      verboseS "tc.term.lambda" 5 $ tick "lambda-no-target-type"
 
+      -- First check that argsT is a valid type
+      argsT <- workOnTypes $ Arg h r <$> isType_ typ
+
+      -- In order to have as much type information as possible when checking
+      -- body, we first unify (xs : argsT) → ?t₁ with the target type. If this
+      -- is inconclusive we need to block the resulting term so we create a
+      -- fresh problem for the check.
+      t1 <- addCtxs xs argsT $ workOnTypes newTypeMeta_
+      let tel = telFromList $ mkTel xs argsT
+      pid <- newProblem_ $ leqType (telePi tel t1) target
+
+      -- Now check body : ?t₁
+      v <- addCtxs xs argsT $ checkExpr body t1
+
+      -- Block on the type comparison
+      blockTermOnProblem target (teleLam tel v) pid
+
+    useTargetType tel@(ExtendTel arg (Abs _ EmptyTel)) btyp = do
+        verboseS "tc.term.lambda" 5 $ tick "lambda-with-target-type"
+        unless (argHiding    arg == h) $ typeError $ WrongHidingInLambda target
+        -- Andreas, 2011-10-01 ignore relevance in lambda if not explicitly given
+        let r' = argRelevance arg -- relevance of function type
+        when (r == Irrelevant && r' /= r) $ typeError $ WrongIrrelevanceInLambda target
+--        unless (argRelevance arg == r) $ typeError $ WrongIrrelevanceInLambda target
+        -- We only need to block the final term on the argument type
+        -- comparison. The body will be blocked if necessary. We still want to
+        -- compare the argument types first, so we spawn a new problem for that
+        -- check.
+        (pid, argT) <- newProblem $ isTypeEqualTo typ (unArg arg)
+        v <- addCtx x (Arg h r' argT) $ checkExpr body btyp
+        blockTermOnProblem target (Lam h $ Abs (show $ nameConcrete x) v) pid
+      where
+        [x] = xs
+    useTargetType _ _ = __IMPOSSIBLE__
+
+
+    mkTel []       t = []
+    mkTel (x : xs) t = ((,) s <$> t) : mkTel xs (raise 1 t)
+      where s = show $ nameConcrete x
+
 ---------------------------------------------------------------------------
 -- * Literal
 ---------------------------------------------------------------------------
 
 checkLiteral :: Literal -> Type -> TCM Term
 checkLiteral lit t = do
-    t' <- litType lit
-    v  <- blockTerm t (Lit lit) $ leqType t' t
-    return v
+  t' <- litType lit
+  blockTerm t $ Lit lit <$ leqType_ t' t
 
 litType :: Literal -> TCM Type
 litType l = case l of
-    LitLevel _ _  -> el <$> primLevel
     LitInt _ _	  -> el <$> primNat
     LitFloat _ _  -> el <$> primFloat
     LitChar _ _   -> el <$> primChar
@@ -185,7 +303,7 @@
 ---------------------------------------------------------------------------
 
 -- TODO: move somewhere suitable
-reduceCon :: MonadTCM tcm => QName -> tcm QName
+reduceCon :: QName -> TCM QName
 reduceCon c = do
   Con c [] <- constructorForm =<< reduce (Con c [])
   return c
@@ -194,15 +312,24 @@
 -- If it succeeds, it continues @k@ with the returned results.  If it fails,
 -- it registers a postponed typechecking problem and returns the resulting new
 -- meta variable.
+--
+-- Checks @e := ((_ : t0) args) : t@.
 checkArguments' ::
   ExpandHidden -> Range -> [NamedArg A.Expr] -> Type -> Type -> A.Expr ->
-  (Args -> Type -> Constraints -> TCM Term) -> TCM Term
+  (Args -> Type -> TCM Term) -> TCM Term
 checkArguments' exph r args t0 t e k = do
   z <- runErrorT $ checkArguments exph r args t0 t
   case z of
-    Right (vs, t1, cs) -> k vs t1 cs
+    Right (vs, t1) -> k vs t1
+      -- vs = evaluated args
+      -- t1 = remaining type (needs to be subtype of t)
+      -- cs = new constraints
     Left t0            -> postponeTypeCheckingProblem e t (unblockedTester t0)
+      -- if unsuccessful, postpone checking e : t until t0 unblocks
 
+unScope (A.ScopedExpr scope e) = unScope e
+unScope e                      = e
+
 -- | Type check an expression.
 checkExpr :: A.Expr -> Type -> TCM Term
 checkExpr e t =
@@ -213,6 +340,8 @@
 	  [ fsep [ prettyTCM e, text ":", prettyTCM t ]
 	  , nest 2 $ text "at " <+> (text . show =<< getCurrentRange)
 	  ]
+    reportSDoc "tc.term.expr.top.detailed" 80 $
+      text "Checking" <+> fsep [ prettyTCM e, text ":", text (show t) ]
     t <- reduce t
     reportSDoc "tc.term.expr.top" 15 $
         text "    --> " <+> prettyTCM t
@@ -224,95 +353,52 @@
 
     e <- scopedExpr e
     case e of
-
 	-- Insert hidden lambda if appropriate
-	_   | not (hiddenLambdaOrHole e)
-	    , FunV (Arg Hidden _ _) _ <- funView (unEl t) -> do
+	_   | Pi (Arg h rel _) _ <- unEl t
+            , not (hiddenLambdaOrHole h e)
+            , h /= NotHidden                          -> do
 		x <- freshName r (argName t)
                 reportSLn "tc.term.expr.impl" 15 $ "Inserting implicit lambda"
-		checkExpr (A.Lam (A.ExprRange $ getRange e) (A.DomainFree Hidden x) e) t
+		checkExpr (A.Lam (A.ExprRange $ getRange e) (domainFree h rel x) e) t
 	    where
 		r = case rStart $ getRange e of
                       Nothing  -> noRange
                       Just pos -> posToRange pos pos
 
-                hiddenLambdaOrHole (A.AbsurdLam _ Hidden)                                  = True
-		hiddenLambdaOrHole (A.Lam _ (A.DomainFree Hidden _) _)			   = True
-		hiddenLambdaOrHole (A.Lam _ (A.DomainFull (A.TypedBindings _ (Arg Hidden _ _))) _) = True
-		hiddenLambdaOrHole (A.QuestionMark _)					   = True
-		hiddenLambdaOrHole _							   = False
-
-	-- Variable or constant application
-           -- Subcase: ambiguous constructor
-	_   | Application (HeadCon cs@(_:_:_)) args <- appView e -> do
-                -- First we should figure out which constructor we want.
-                reportSLn "tc.check.term" 40 $ "Ambiguous constructor: " ++ show cs
-
-                -- Get the datatypes of the various constructors
-                let getData Constructor{conData = d} = d
-                    getData _                        = __IMPOSSIBLE__
-                reportSLn "tc.check.term" 40 $ "  ranges before: " ++ show (getRange cs)
-                -- We use the reduced constructor when disambiguating, but
-                -- the original constructor for type checking. This is important
-                -- since they may have different types (different parameters).
-                -- See issue 279.
-                cs  <- zip cs . zipWith setRange (map getRange cs) <$> mapM reduceCon cs
-                reportSLn "tc.check.term" 40 $ "  ranges after: " ++ show (getRange cs)
-                reportSLn "tc.check.term" 40 $ "  reduced: " ++ show cs
-                dcs <- mapM (\(c0, c1) -> (getData /\ const c0) . theDef <$> getConstInfo c1) cs
-
-                -- Type error
-                let badCon t = typeError $ DoesNotConstructAnElementOf
-                                            (fst $ head cs) t
+                hiddenLambdaOrHole h (A.AbsurdLam _ h') | h == h'                      = True
+                hiddenLambdaOrHole h (A.ExtendedLam _ _ _ [])                          = False
+                hiddenLambdaOrHole h (A.ExtendedLam _ _ _ cls)                         = any hiddenLHS cls
+		hiddenLambdaOrHole h (A.Lam _ (A.DomainFree h' _ _) _) | h == h'       = True
+		hiddenLambdaOrHole h (A.Lam _ (A.DomainFull (A.TypedBindings _ (Arg h' _ _))) _)
+                  | h == h'                                                            = True
+		hiddenLambdaOrHole _ (A.QuestionMark _)				       = True
+		hiddenLambdaOrHole _ _						       = False
 
-                -- Lets look at the target type at this point
-                let getCon = do
-                      TelV _ t1 <- telView t
-                      t1 <- reduceB $ unEl t1
-                      reportSDoc "tc.check.term.con" 40 $ nest 2 $
-                        text "target type: " <+> prettyTCM t1
-                      case t1 of
-                        NotBlocked (Def d _) -> do
-                          let dataOrRec = case [ c | (d', c) <- dcs, d == d' ] of
-                                c:_ -> do
-                                  reportSLn "tc.check.term" 40 $ "  decided on: " ++ show c
-                                  return (Just c)
-                                []  -> badCon (Def d [])
-                          defn <- theDef <$> getConstInfo d
-                          case defn of
-                            Datatype{} -> dataOrRec
-                            Record{}   -> dataOrRec
-                            _ -> badCon (ignoreBlocking t1)
-                        NotBlocked (MetaV _ _)  -> return Nothing
-                        Blocked{} -> return Nothing
-                        _ -> badCon (ignoreBlocking t1)
-                let unblock = isJust <$> getCon
-                mc <- getCon
-                case mc of
-                  Just c  -> checkConstructorApplication e t c args
-                  Nothing -> postponeTypeCheckingProblem e t unblock
+                hiddenLHS (A.Clause (A.LHS _ _ (a : _) _) _ _) = elem (argHiding a) [Hidden, Instance]
+                hiddenLHS _ = False
 
-              -- Subcase: non-ambiguous constructor
-            | Application (HeadCon [c]) args <- appView e ->
-                checkConstructorApplication e t c args
-              -- Subcase: defined symbol or variable.
-            | Application hd args <- appView e ->
-                checkHeadApplication e t hd args
+        -- a meta variable without arguments: type check directly for efficiency
+	A.QuestionMark i -> checkMeta newQuestionMark t i
+	A.Underscore i   -> checkMeta newValueMeta t i
 
 	A.WithApp _ e es -> typeError $ NotImplemented "type checking of with application"
 
+        -- check |- Set l : t  (requires universe polymorphism)
         A.App i s (Arg NotHidden r l)
           | A.Set _ 0 <- unScope s ->
           ifM (not <$> hasUniversePolymorphism)
               (typeError $ GenericError "Use --universe-polymorphism to enable level arguments to Set")
           $ do
             lvl <- primLevel
-            suc <- do s <- primLevelSuc
-                      return $ \x -> s `apply` [defaultArg x]
-            n   <- checkExpr (namedThing l) (El (mkType 0) lvl)
+            -- allow NonStrict variables when checking level
+            --   Set : (NonStrict) Level -> Set\omega
+            n   <- levelView =<< applyRelevanceToContext NonStrict
+                                  (checkExpr (namedThing l) (El (mkType 0) lvl))
+            -- check that Set (l+1) <= t
             reportSDoc "tc.univ.poly" 10 $
-              text "checking Set " <+> prettyTCM n <+> text "against" <+> prettyTCM t
-            blockTerm t (Sort $ Type n) $ leqType (sort $ Type $ suc n) t
+              text "checking Set " <+> prettyTCM n <+>
+              text "against" <+> prettyTCM t
+            blockTerm t $ Sort (Type n) <$ leqType_ (sort $ sSuc $ Type n) t
 
         A.App i q (Arg NotHidden r e)
           | A.Quote _ <- unScope q -> do
@@ -323,48 +409,54 @@
               quoted _                  = typeError $ GenericError $ "quote: not a defined name"
           x <- quoted (namedThing e)
           ty <- qNameType
-          blockTerm t (quoteName x) $ leqType ty t
+          blockTerm t $ quoteName x <$ leqType_ ty t
 
-        A.Quote _ -> typeError $ GenericError "quote must be applied to a defined name"
+          | A.QuoteTerm _ <- unScope q ->
+             do (et, _) <- inferExpr (namedThing e)
+                q <- quoteTerm =<< normalise et
+                ty <- el primAgdaTerm
+                blockTerm t $ q <$ leqType_ ty t
 
-	A.App i e arg -> do
-	    (v0, t0)	 <- inferExpr e
-	    checkArguments' ExpandLast (getRange e) [arg] t0 t e $ \vs t1 cs ->
-	      blockTerm t (apply v0 vs) $ (cs ++) <$> leqType t1 t
+	  | A.Unquote _ <- unScope q ->
+	     do e1 <- checkExpr (namedThing e) =<< el primAgdaTerm
+	        e2 <- unquote e1
+                checkTerm e2 t
+        A.Quote _ -> typeError $ GenericError "quote must be applied to a defined name"
+        A.QuoteTerm _ -> typeError $ GenericError "quoteTerm must be applied to a term"
+        A.Unquote _ -> typeError $ GenericError "unquote must be applied to a term"
 
         A.AbsurdLam i h -> do
           t <- reduceB =<< instantiateFull t
           case t of
             Blocked{}                 -> postponeTypeCheckingProblem_ e $ ignoreBlocking t
             NotBlocked (El _ MetaV{}) -> postponeTypeCheckingProblem_ e $ ignoreBlocking t
-            NotBlocked t' -> case funView $ unEl t' of
-              FunV (Arg h' _ a) _
+            NotBlocked t' -> case unEl t' of
+              Pi (Arg h' _ a) _
                 | h == h' && not (null $ foldTerm metas a) ->
                     postponeTypeCheckingProblem e (ignoreBlocking t) $
                       null . foldTerm metas <$> instantiateFull a
-                | h == h' -> do
-                  cs' <- isEmptyTypeC a
+                | h == h' -> blockTerm t' $ do
+                  isEmptyType a
                   -- Add helper function
                   top <- currentModule
                   let name = "absurd"
                   aux <- qualify top <$> freshName (getRange i) name
                   -- if we are in irrelevant position, the helper function
                   -- is added as irrelevant
-                  rel <- irrelevant <$> asks envIrrelevant
+                  rel <- asks envRelevance
                   reportSDoc "tc.term.absurd" 10 $ vcat
                     [ text "Adding absurd function" <+> prettyTCM rel <> prettyTCM aux
                     , nest 2 $ text "of type" <+> prettyTCM t'
                     ]
-                  addConstant aux $ Defn rel aux t' (defaultDisplayForm aux) 0
+                  addConstant aux $ Defn rel aux t' (defaultDisplayForm aux) 0 noCompiledRep
                                   $ Function
                                     { funClauses        =
-                                        [Clauses Nothing
-                                                 (Clause { clauseRange = getRange e
-                                                         , clauseTel   = EmptyTel
-                                                         , clausePerm  = Perm 0 []
-                                                         , clausePats  = [Arg h Relevant $ VarP "()"]
-                                                         , clauseBody  = NoBody
-                                                         })
+                                        [Clause { clauseRange = getRange e
+                                                , clauseTel   = EmptyTel
+                                                , clausePerm  = Perm 0 []
+                                                , clausePats  = [Arg h Relevant $ VarP "()"]
+                                                , clauseBody  = NoBody
+                                                }
                                         ]
                                     , funCompiled       = Fail
                                     , funDelayed        = NotDelayed
@@ -373,48 +465,76 @@
                                     , funPolarity       = [Covariant]
                                     , funArgOccurrences = [Unused]
                                     , funProjection     = Nothing
+                                    , funStatic         = False
                                     }
-                  blockTerm t' (Def aux []) $ return cs'
+                  return (Def aux [])
                 | otherwise -> typeError $ WrongHidingInLambda t'
               _ -> typeError $ ShouldBePi t'
           where
             metas (MetaV m _) = [m]
             metas _           = []
+        A.ExtendedLam i di qname cs -> do
+             t <- reduceB =<< instantiateFull t
+             case t of
+               Blocked{}                 -> postponeTypeCheckingProblem_ e $ ignoreBlocking t
+               NotBlocked (El _ MetaV{}) -> postponeTypeCheckingProblem_ e $ ignoreBlocking t
+               NotBlocked t -> do
+                 j   <- currentMutualBlock
+                 rel <- asks envRelevance
+                 addConstant qname (Defn rel qname t (defaultDisplayForm qname) j noCompiledRep Axiom)
+                 reportSDoc "tc.term.exlam" 50 $ text "extended lambda's implementation \"" <> prettyTCM qname <>
+                                                 text "\" has type: " $$ prettyTCM t -- <+>
+--                                                 text " where clauses: " <+> text (show cs)
+                 abstract (A.defAbstract di) $ checkFunDef' t rel NotDelayed di qname cs
+                 tel <- getContextTelescope
+                 addExtLambdaTele qname (counthidden tel , countnothidden tel)
+                 reduce $ (Def qname [] `apply` (mkArgs tel))
+          where
+	    -- Concrete definitions cannot use information about abstract things.
+	    abstract ConcreteDef = inConcreteMode
+	    abstract AbstractDef = inAbstractMode
+            mkArgs :: Telescope -> Args
+            mkArgs tel = map arg [n - 1, n - 2..0]
+              where
+                n     = size tel
+                arg i = defaultArg (Var i [])
 
+            metas (MetaV m _) = [m]
+            metas _           = []
+
+            counthidden :: Telescope -> Int
+            counthidden t = length $ filter (\ (Arg h r a) -> h == Hidden ) $ teleArgs t
+
+            countnothidden :: Telescope -> Int
+            countnothidden t = length $ filter (\ (Arg h r a) -> h == NotHidden ) $ teleArgs t
+
+
+{- Andreas, 2011-04-27 DOES NOT WORK
+   -- a telescope is not for type checking abstract syn
+
 	A.Lam i (A.DomainFull b) e -> do
-	    (v, cs) <- checkTypedBindings_ b $ \tel -> do
-	        t1 <- newTypeMeta_
-                cs <- escapeContext (size tel) $ leqType (telePi tel t1) t
-                v <- checkExpr e t1
-                return (teleLam tel v, cs)
+            -- check the types, get the telescope with unchanged relevance
+	    (tel, t1, cs) <- workOnTypes $ checkTypedBindings_ b $ \tel -> do
+	       t1 <- newTypeMeta_
+               cs <- escapeContext (size tel) $ leqType (telePi tel t1) t
+               return (tel, t1, cs)
+            -- check the body under the unchanged telescope
+            v <- addCtxTel tel $ do teleLam tel <$> checkExpr e t1
 	    blockTerm t v (return cs)
+-}
+	A.Lam i (A.DomainFull (A.TypedBindings _ b)) e -> checkLambda b e t
 
-	A.Lam i (A.DomainFree h x) e0 -> do
-	    -- (t',cs) <- forcePi h (show x) t
-            t <- reduceB t
-            case t of
-              Blocked{}                 -> postponeTypeCheckingProblem_ e $ ignoreBlocking t
-              NotBlocked (El _ MetaV{}) -> postponeTypeCheckingProblem_ e $ ignoreBlocking t
-              NotBlocked t' -> case funView $ unEl t' of
-		FunV arg0@(Arg h' r a) _
-		    | h == h' -> do
-			v <- addCtx x arg0 $ do
-                              let arg = Arg h r (Var 0 [])
-                                  tb  = raise 1 t' `piApply` [arg]
-                              v <- checkExpr e0 tb
-                              return $ Lam h $ Abs (show x) v
-			-- blockTerm t v (return cs)
-                        return v
-		    | otherwise ->
-			typeError $ WrongHidingInLambda t'
-		_   -> typeError $ ShouldBePi t'
+        -- 	A.Lam i (A.DomainFull b) e -> do
+        -- 	    (v, cs) <- checkTypedBindings LamNotPi b $ \tel -> do
+        --         (t1, cs) <- workOnTypes $ do
+        -- 	          t1 <- newTypeMeta_
+        --           cs <- escapeContext (size tel) $ leqType (telePi tel t1) t
+        --           return (t1, cs)
+        --         v <- checkExpr e t1
+        --         return (teleLam tel v, cs)
+        -- 	    blockTerm t v (return cs)
 
-	A.QuestionMark i -> do
-	    setScope (A.metaScope i)
-	    newQuestionMark  t
-	A.Underscore i   -> do
-	    setScope (A.metaScope i)
-	    newValueMeta t
+	A.Lam i (A.DomainFree h rel x) e0 -> checkExpr (A.Lam i (domainFree h rel x) e0) t
 
 	A.Lit lit    -> checkLiteral lit t
 	A.Let i ds e -> checkLetBindings ds $ checkExpr e t
@@ -422,26 +542,26 @@
 	    t' <- checkTelescope_ tel $ \tel -> do
                     t   <- instantiateFull =<< isType_ e
                     tel <- instantiateFull tel
-                    return $ telePi_ tel t
-            s  <- return $ getSort t'
+                    return $ telePi tel t
+            let s = getSort t'
             when (s == Inf) $ reportSDoc "tc.term.sort" 20 $
               vcat [ text ("reduced to omega:")
                    , nest 2 $ text "t   =" <+> prettyTCM t'
                    , nest 2 $ text "cxt =" <+> (prettyTCM =<< getContextTelescope)
                    ]
-	    blockTerm t (unEl t') $ leqType (sort s) t
+	    blockTerm t $ unEl t' <$ leqType_ (sort s) t
 	A.Fun _ (Arg h r a) b -> do
 	    a' <- isType_ a
 	    b' <- isType_ b
-	    let s = getSort a' `sLub` getSort b'
-	    blockTerm t (Fun (Arg h r a') b') $ leqType (sort s) t
+	    s <- reduce $ getSort a' `sLub` getSort b'
+	    blockTerm t $ Pi (Arg h r a') (NoAbs "_" b') <$ leqType_ (sort s) t
 	A.Set _ n    -> do
           n <- ifM typeInType (return 0) (return n)
-	  blockTerm t (Sort (mkType n)) $ leqType (sort $ mkType $ n + 1) t
+	  blockTerm t $ Sort (mkType n) <$ leqType_ (sort $ mkType $ n + 1) t
 	A.Prop _     -> do
           typeError $ GenericError "Prop is no longer supported"
           -- s <- ifM typeInType (return $ mkType 0) (return Prop)
-	  -- blockTerm t (Sort Prop) $ leqType (sort $ mkType 1) t
+	  -- blockTerm t (Sort Prop) $ leqType_ (sort $ mkType 1) t
 
 	A.Rec _ fs  -> do
 	  t <- reduce t
@@ -452,31 +572,88 @@
 	      ftel   <- getRecordFieldTypes r
               con    <- getRecordConstructor r
               scope  <- getScope
+              let arg x e =
+                    case [ a | a <- axs, unArg a == x ] of
+                      [a] -> unnamed e <$ a
+                      _   -> defaultArg $ unnamed e -- we only end up here if the field names are bad
               let meta = A.Underscore $ A.MetaInfo (getRange e) scope Nothing
-	      es   <- orderFields r meta xs fs
+                  missingExplicits = [ (unArg a, [unnamed meta <$ a])
+                                     | a <- axs, argHiding a == NotHidden
+                                     , notElem (unArg a) (map fst fs) ]
+              -- In es omitted explicit fields are replaced by underscores
+              -- (from missingExplicits). Omitted implicit or instance fields
+              -- are still left out and inserted later by checkArguments_.
+	      es   <- concat <$> orderFields r [] xs ([ (x, [arg x e]) | (x, e) <- fs ] ++
+                                                      missingExplicits)
 	      let tel = ftel `apply` vs
-	      (args, cs) <- checkArguments_ ExpandLast (getRange e)
-			      (zipWith (\ax e -> fmap (const (unnamed e)) ax) axs es)
-                              tel
-	      blockTerm t (Con con args) $ return cs
+              args <- checkArguments_ ExpandLast (getRange e)
+                        es -- (zipWith (\ax e -> fmap (const (unnamed e)) ax) axs es)
+                        tel
+              -- Don't need to block here!
+	      return $ Con con args
             MetaV _ _ -> do
-              reportSDoc "tc.term.expr.rec" 10 $ sep
-                [ text "Postponing type checking of"
-                , nest 2 $ prettyA e <+> text ":" <+> prettyTCM t
-                ]
-              postponeTypeCheckingProblem_ e t
+              let fields = map fst fs
+              rs <- findPossibleRecords fields
+              case rs of
+                  -- If there are no records with the right fields we might as well fail right away.
+                [] -> case fs of
+                  []       -> typeError $ GenericError "There are no records in scope"
+                  [(f, _)] -> typeError $ GenericError $ "There is no known record with the field " ++ show f
+                  _        -> typeError $ GenericError $ "There is no known record with the fields " ++ unwords (map show fields)
+                  -- If there's only one record with the appropriate fields, go with that.
+                [r] -> do
+                  def <- getConstInfo r
+                  vs  <- newArgsMeta (defType def)
+                  let target = piApply (defType def) vs
+                      s      = case unEl target of
+                                 Level l -> Type l
+                                 Sort s  -> s
+                                 _       -> __IMPOSSIBLE__
+                      inferred = El s $ Def r vs
+                  v <- checkExpr e inferred
+                  blockTerm t $ v <$ leqType_ t inferred
+                  -- If there are more than one possible record we postpone
+                _:_:_ -> do
+                  reportSDoc "tc.term.expr.rec" 10 $ sep
+                    [ text "Postponing type checking of"
+                    , nest 2 $ prettyA e <+> text ":" <+> prettyTCM t
+                    ]
+                  postponeTypeCheckingProblem_ e t
 	    _         -> typeError $ ShouldBeRecordType t
 
-	A.Var _    -> __IMPOSSIBLE__
-	A.Def _    -> __IMPOSSIBLE__
-	A.Con _    -> __IMPOSSIBLE__
-
-        A.ETel _   -> __IMPOSSIBLE__
-
-	A.DontCare -> -- can happen in the context of with functions
-                      return DontCare
-                      -- __IMPOSSIBLE__
+        A.RecUpdate ei recexpr fs -> do
+          case unEl t of
+            Def r vs  -> do
+              rec <- checkExpr recexpr t
+              name <- freshNoName (getRange recexpr)
+              addLetBinding Relevant name rec t $ do
+                projs <- recFields <$> getRecordDef r
+                axs <- getRecordFieldNames r
+                scope <- getScope
+                let xs = map unArg axs
+                es <- orderFields r Nothing xs $ map (\(x, e) -> (x, Just e)) fs
+                let es' = zipWith (replaceFields name ei) projs es
+                checkExpr (A.Rec ei [ (x, e) | (x, Just e) <- zip xs es' ]) t
+            MetaV _ _ -> do
+              inferred <- inferExpr recexpr >>= reduce . snd
+              case unEl inferred of
+                MetaV _ _ -> postponeTypeCheckingProblem_ e t
+                _         -> do
+                  v <- checkExpr e inferred
+                  blockTerm t $ v <$ leqType_ t inferred
+            _         -> typeError $ ShouldBeRecordType t
+          where
+            replaceFields :: Name -> A.ExprInfo -> Arg A.QName -> Maybe A.Expr -> Maybe A.Expr
+            replaceFields n ei (Arg NotHidden _ p) Nothing  = Just $ A.App ei (A.Def p) $ defaultArg (unnamed $ A.Var n)
+            replaceFields _ _  (Arg _         _ _) Nothing  = Nothing
+            replaceFields _ _  _                   (Just e) = Just $ e
 
+	A.DontCare e -> -- can happen in the context of with functions
+          checkExpr e t
+{- Andreas, 2011-10-03 why do I get an internal error for Issue337?
+                        -- except that should be fixed now (issue 337)
+                        __IMPOSSIBLE__
+-}
 	A.ScopedExpr scope e -> setScope scope >> checkExpr e t
 
         e0@(A.QuoteGoal _ x e) -> do
@@ -488,22 +665,134 @@
           case metas of
             _:_ -> postponeTypeCheckingProblem e0 t' $ and <$> mapM isInstantiatedMeta metas
             []  -> do
-              quoted <- quoteType t'
+              quoted <- quoteTerm (unEl t')
               tmType <- agdaTermType
-              (v,ty) <- addLetBinding Relevant x quoted tmType (inferExpr e)
-              blockTerm t' v $ leqType ty t'
+              (v, ty) <- addLetBinding Relevant x quoted tmType (inferExpr e)
+              blockTerm t' $ v <$ leqType_ ty t'
 
+        A.ETel _   -> __IMPOSSIBLE__
+
+	-- Application
+          -- Subcase: ambiguous constructor
+	_   | Application (A.Con (AmbQ cs@(_:_:_))) args <- appView e -> do
+                -- First we should figure out which constructor we want.
+                reportSLn "tc.check.term" 40 $ "Ambiguous constructor: " ++ show cs
+
+                -- Get the datatypes of the various constructors
+                let getData Constructor{conData = d} = d
+                    getData _                        = __IMPOSSIBLE__
+                reportSLn "tc.check.term" 40 $ "  ranges before: " ++ show (getRange cs)
+                -- We use the reduced constructor when disambiguating, but
+                -- the original constructor for type checking. This is important
+                -- since they may have different types (different parameters).
+                -- See issue 279.
+                cs  <- zip cs . zipWith setRange (map getRange cs) <$> mapM reduceCon cs
+                reportSLn "tc.check.term" 40 $ "  ranges after: " ++ show (getRange cs)
+                reportSLn "tc.check.term" 40 $ "  reduced: " ++ show cs
+                dcs <- mapM (\(c0, c1) -> (getData /\ const c0) . theDef <$> getConstInfo c1) cs
+
+                -- Type error
+                let badCon t = typeError $ DoesNotConstructAnElementOf
+                                            (fst $ head cs) t
+
+                -- Lets look at the target type at this point
+                let getCon = do
+                      TelV _ t1 <- telView t
+                      t1 <- reduceB $ unEl t1
+                      reportSDoc "tc.check.term.con" 40 $ nest 2 $
+                        text "target type: " <+> prettyTCM t1
+                      case t1 of
+                        NotBlocked (Def d _) -> do
+                          let dataOrRec = case [ c | (d', c) <- dcs, d == d' ] of
+                                [c] -> do
+                                  reportSLn "tc.check.term" 40 $ "  decided on: " ++ show c
+                                  return (Just c)
+                                []  -> badCon (Def d [])
+                                cs  -> typeError $ GenericError $
+                                        "Can't resolve overloaded constructors targeting the same datatype (" ++ show d ++
+                                        "): " ++ unwords (map show cs)
+                          defn <- theDef <$> getConstInfo d
+                          case defn of
+                            Datatype{} -> dataOrRec
+                            Record{}   -> dataOrRec
+                            _ -> badCon (ignoreBlocking t1)
+                        NotBlocked (MetaV _ _)  -> return Nothing
+                        Blocked{} -> return Nothing
+                        _ -> badCon (ignoreBlocking t1)
+                let unblock = isJust <$> getCon
+                mc <- getCon
+                case mc of
+                  Just c  -> checkConstructorApplication e t c args
+                  Nothing -> postponeTypeCheckingProblem e t unblock
+
+              -- Subcase: non-ambiguous constructor
+            | Application (A.Con (AmbQ [c])) args <- appView e ->
+                checkConstructorApplication e t c args
+              -- Subcase: defined symbol or variable.
+            | Application hd args <- appView e ->
+                checkHeadApplication e t hd args
+
+domainFree h rel x =
+  A.DomainFull $ A.TypedBindings r $ Arg h rel $ A.TBind r [x] $ A.Underscore info
+  where
+    r = getRange x
+    info = A.MetaInfo{ A.metaRange = r, A.metaScope = emptyScopeInfo, A.metaNumber = Nothing }
+
+checkMeta :: (Type -> TCM Term) -> Type -> A.MetaInfo -> TCM Term
+checkMeta newMeta t i = do
+  case A.metaNumber i of
+    Nothing -> do
+      setScope (A.metaScope i)
+      newMeta t
+    -- Rechecking an existing metavariable
+    Just n -> do
+      let v = MetaV (MetaId n) []
+      t' <- jMetaType . mvJudgement <$> lookupMeta (MetaId n)
+      blockTerm t $ v <$ leqType t' t
+
+inferMeta :: (Type -> TCM Term) -> A.MetaInfo -> TCM (Args -> Term, Type)
+inferMeta newMeta i =
+  case A.metaNumber i of
+    Nothing -> do
+      setScope (A.metaScope i)
+      t <- workOnTypes $ newTypeMeta_
+      v <- newMeta t
+      return (apply v, t)
+    -- Rechecking an existing metavariable
+    Just n -> do
+      let v = MetaV (MetaId n)
+      t' <- jMetaType . mvJudgement <$> lookupMeta (MetaId n)
+      return (v, t')
+
 -- | Infer the type of a head thing (variable, function symbol, or constructor)
-inferHead :: Head -> TCM (Args -> Term, Type)
-inferHead (HeadVar x) = do -- traceCall (InferVar x) $ do
+inferHead :: A.Expr -> TCM (Args -> Term, Type)
+inferHead (A.Var x) = do -- traceCall (InferVar x) $ do
   (u, a) <- getVarInfo x
-  when (argRelevance a == Irrelevant) $
+  when (unusableRelevance $ argRelevance a) $
     typeError $ VariableIsIrrelevant x
   return (apply u, unArg a)
-inferHead (HeadDef x) = do
-  (u, a) <- inferDef Def x
-  return (apply u, a)
-inferHead (HeadCon [c]) = do
+inferHead (A.Def x) = do
+  proj <- isProjection x
+  case proj of
+    Nothing -> do
+      (u, a) <- inferDef Def x
+      return (apply u, a)
+    Just{} -> do
+      Just (r, n) <- funProjection . theDef <$> getConstInfo x
+      cxt <- size <$> freeVarsToApply x
+      m <- getDefFreeVars x
+      reportSDoc "tc.term.proj" 10 $ sep
+        [ text "building projection" <+> prettyTCM x
+        , nest 2 $ parens (text "ctx =" <+> text (show cxt))
+        , nest 2 $ parens (text "n =" <+> text (show n))
+        , nest 2 $ parens (text "m =" <+> text (show m)) ]
+      let hs | n == 0    = __IMPOSSIBLE__
+             | otherwise = genericReplicate (n - 1) NotHidden -- TODO: hiding
+          names = [ s ++ [c] | s <- "" : names, c <- ['a'..'z'] ]
+          eta   = foldr (\(h, s) -> Lam h . NoAbs s) (Def x []) (zip hs names)
+      (u, a) <- inferDef (\f vs -> eta `apply` vs) x
+      return (apply u, a)
+inferHead (A.Con (AmbQ [c])) = do
 
   -- Constructors are polymorphic internally so when building the constructor
   -- term we should throw away arguments corresponding to parameters.
@@ -520,16 +809,25 @@
 
   -- So when applying the constructor throw away the parameters.
   return (apply u . genericDrop n, a)
-inferHead (HeadCon _) = __IMPOSSIBLE__  -- inferHead will only be called on unambiguous constructors
+inferHead (A.Con _) = __IMPOSSIBLE__  -- inferHead will only be called on unambiguous constructors
+inferHead (A.QuestionMark i)  = inferMeta newQuestionMark i
+inferHead (A.Underscore i) = inferMeta newValueMeta i
+inferHead e = do (term, t) <- inferExpr e
+                 return (apply term, t)
 
 inferDef :: (QName -> Args -> Term) -> QName -> TCM (Term, Type)
 inferDef mkTerm x =
     traceCall (InferDef (getRange x) x) $ do
     d  <- instantiateDef =<< getConstInfo x
     -- irrelevant defs are only allowed in irrelevant position
-    when (defRelevance d == Irrelevant) $ do
-      irr <- asks envIrrelevant
-      unless irr $ typeError $ DefinitionIsIrrelevant x
+    let drel = defRelevance d
+    when (drel /= Relevant) $ do
+      rel <- asks envRelevance
+      reportSDoc "tc.irr" 50 $ vcat
+        [ text "declaration relevance =" <+> text (show drel)
+        , text "context     relevance =" <+> text (show rel)
+        ]
+      unless (drel `moreRelevant` rel) $ typeError $ DefinitionIsIrrelevant x
     vs <- freeVarsToApply x
     verboseS "tc.term.def" 10 $ do
       ds <- mapM prettyTCM vs
@@ -542,84 +840,43 @@
 --   a general application since the implicit arguments can be inserted
 --   without looking at the arguments to the constructor.
 checkConstructorApplication :: A.Expr -> Type -> QName -> [NamedArg A.Expr] -> TCM Term
-checkConstructorApplication org t c args = do
-  checkHead t args
-{-
-  TelV gamma d <- telView t
-
-  -- Eta expand the constructor applications so it's fully applied
-  let realName "_" = "carg"
-      realName  x  = x
-      gamma' = telToList gamma
-
-    -- Generate fresh names for eta expansion variables
-  vars <- sequence [ Arg h <$> freshName_ (realName x)
-                   | Arg h (x, _) <- gamma' ]
-
-    -- Compute the context of the variables
-  let cxt = [ (unArg x, fmap snd t) | (x, t) <- zip vars gamma' ]
-      extendCxt cxt m = foldr (uncurry addCtx) m cxt
-      etaExpansion t = foldr lam t gamma'
-        where lam (Arg h (x, _)) t = Lam h (Abs x t)
-
-  -- Go inside the lambdas generated by the expansion
-  extendCxt cxt $ do
-
-  -- Make sure to shadow some things we shouldn't use
-  t        <- return d
-  args     <- return $ args ++ map (fmap (unnamed . A.Var)) vars
-  fallback <- return $ etaExpansion <$> checkHead t args
-
-  -- Make sure we're checking against the right datatype
-  d   <- getConstructorData c
-  mdi <- getDatatypeInfo t
-  case mdi of
-    Nothing -> fallback
-    Just dinfo@DataInfo{ datatypeName   = d'
-                       , datatypeParTel = parTel
-                       , datatypePars   = dpars
-                       , datatypeIxTel  = ixTel
-                       , datatypeIxs    = indices
-                       }
-      | d /= d'   -> fallback
-      | otherwise -> do
-
-      -- Split the given arguments into explicitly given parameters and normal
-      -- arguments
-      (pars, args) <- return $ splitArgs (map (fst . unArg) $ telToList parTel)
-                                         args
-
-      reportSDoc "tc.term.con" 30 $ vcat
-        [ text "checking constructor application"
-        , nest 2 $ vcat
-          [ text "c      =" <+> prettyTCM c
-          , text "A.pars =" <+> prettyList (map prettyA pars)
-          , text "A.args =" <+> prettyList (map prettyA args)
-          , text "ptel   =" <+> prettyTCM parTel
-          , text "itel   =" <+> addCtxTel parTel (prettyTCM ixTel)
-          , text "pars   =" <+> prettyTCM dpars
-          , text "ixs    =" <+> prettyTCM indices
-          ]
-        ]
-
-      -- Check the parameters. Just means checking that any given
-      -- parameters are equal to the expected parameters.
-      -- checkParams pars parTel $ do
-
-      fallback
-
-  -- Plan
-  --  * Check the parameters
-  --    + if they're present type check and compare to the parameters to the
-  --      datatype, otherwise just continue
-  --  * Insert implicit constructor arguments (not counting parameters)
-  --  * Check the arguments
-  --  * Compare the computed indices from the constructor with the given
-  --    indices
--}
+checkConstructorApplication org t c args
+  | hiddenArg = fallback
+  | otherwise = do
+    cdef  <- getConstInfo c
+    let Constructor{conData = d} = theDef cdef
+    case unEl t of -- Only fully applied constructors get special treatment
+      Def d' vs | d' == d -> do
+        def <- theDef <$> getConstInfo d
+        let npars = case def of
+                      Datatype{ dataPars = n } -> Just n
+                      Record{ recPars = n }    -> Just n
+                      _                        -> Nothing
+        flip (maybe fallback) npars $ \n -> do
+        let ps    = genericTake n vs
+            ctype = defType cdef
+        reportSDoc "tc.term.con" 20 $ vcat
+          [ text "special checking of constructor application of" <+> prettyTCM c
+          , nest 2 $ vcat [ text "ps     =" <+> prettyTCM ps
+                          , text "ctype  =" <+> prettyTCM ctype ] ]
+        let ctype' = ctype `piApply` ps
+        reportSDoc "tc.term.con" 20 $ nest 2 $ text "ctype' =" <+> prettyTCM ctype'
+        checkArguments' ExpandLast (getRange c) args ctype' t org $ \us t' -> do
+          reportSDoc "tc.term.con" 20 $ nest 2 $ vcat
+            [ text "us     =" <+> prettyTCM us
+            , text "t'     =" <+> prettyTCM t' ]
+          blockTerm t $ Con c us <$ leqType_ t' t
+      _ -> fallback
   where
-    checkHead t args = checkHeadApplication org t (HeadCon [c]) args
+    fallback = checkHeadApplication org t (A.Con (AmbQ [c])) args
 
+    -- Check if there are explicitly given hidden arguments,
+    -- in which case we fall back to default type checking.
+    -- We could work harder, but let's not for now.
+    hiddenArg = case args of
+      Arg Hidden _ _ : _ -> True
+      _                  -> False
+
     -- Split the arguments to a constructor into those corresponding
     -- to parameters and those that don't. Dummy underscores are inserted
     -- for parameters that are not given explicitly.
@@ -638,38 +895,6 @@
 
     dummyUnderscore = Arg Hidden Relevant (unnamed $ A.Underscore $ A.MetaInfo noRange emptyScopeInfo Nothing)
 
---   TelV _ (El _ (Def d dargs)) <- telView t
---   condef  <- getConstInfo c
---   let pars = map unArg $ genericTake (conPars $ theDef condef) dargs
---   (_, contype) <- inferHead (HeadCon [c])
---   TelV contel _ <- telView contype
---   let args' = insertParams contel pars args
---   reportSDoc "tc.term.con" 10 $ vcat
---     [ text "Checking constructor application"
---     , nest 2 $ vcat
---       [ text "args  =" <+> prettyList (map prettyA args)
---       , text "args' =" <+> prettyList (map prettyA args')
---       ]
---     ]
---   checkHeadApplication org t (HeadCon [c]) args'
---   where
---     insertParams :: Telescope -> [Term] -> [NamedArg A.Expr] -> [NamedArg A.Expr]
---     insertParams _ [] args = args
---     insertParams (ExtendTel a tel) (p:ps) (arg:args)
---       | argHiding arg == NotHidden ||
---         notElem argname [Nothing, telname] =
---           Arg Hidden (unnamed $ A.TypeChecked p) :
---           insertParams (absBody tel) ps (arg:args)
---       | otherwise =
---           arg : insertParams (absBody tel) ps args
---       where
---         argname = nameOf (unArg arg)
---         telname = Just (absName tel)
---     insertParams (ExtendTel a tel) (p:ps) [] =
---           Arg Hidden (unnamed $ A.TypeChecked p) :
---           insertParams (absBody tel) ps []
---     insertParams EmptyTel (_:_) _ = __IMPOSSIBLE__
-
 -- | @checkHeadApplication e t hd args@ checks that @e@ has type @t@,
 -- assuming that @e@ has the form @hd args@. The corresponding
 -- type-checked term is returned.
@@ -681,42 +906,43 @@
 --
 -- Precondition: The head @hd@ has to be unambiguous, and there should
 -- not be any need to insert hidden lambdas.
-checkHeadApplication :: A.Expr -> Type -> A.Head -> [NamedArg A.Expr] -> TCM Term
+checkHeadApplication :: A.Expr -> Type -> A.Expr -> [NamedArg A.Expr] -> TCM Term
 checkHeadApplication e t hd args = do
-  replacing <- envReplace <$> ask
   kit       <- coinductionKit
-  if not replacing
-   then local (\e -> e { envReplace = True }) defaultResult
-   else case hd of
-    HeadCon [c] -> do
+  case hd of
+    A.Con (AmbQ [c]) | Just c == (nameOfSharp <$> kit) -> do
+      -- Type checking # generated #-wrapper. The # that the user can write will be a Def,
+      -- but the sharp we generate in the body of the wrapper is a Con.
+      defaultResult
+    A.Con (AmbQ [c]) -> do
       (f, t0) <- inferHead hd
       reportSDoc "tc.term.con" 5 $ vcat
         [ text "checkHeadApplication inferred" <+>
           prettyTCM c <+> text ":" <+> prettyTCM t0
         ]
-      checkArguments' ExpandLast (getRange hd) args t0 t e $ \vs t1 cs -> do
+      checkArguments' ExpandLast (getRange hd) args t0 t e $ \vs t1 -> do
         TelV eTel eType <- telView t
         -- If the expected type @eType@ is a metavariable we have to make
         -- sure it's instantiated to the proper pi type
         TelV fTel fType <- telViewUpTo (size eTel) t1
-        blockTerm t (f vs) $ (cs ++) <$> do
-          -- We know that the target type of the constructor (fType)
-          -- does not depend on fTel so we can compare fType and eType
-          -- first.
-
-          when (size eTel > size fTel) $
-            compareTel CmpLeq eTel fTel >> return () -- This will fail!
+        -- We know that the target type of the constructor (fType)
+        -- does not depend on fTel so we can compare fType and eType
+        -- first.
 
-          reportSDoc "tc.term.con" 10 $ vcat
-            [ text "checking" <+>
-              prettyTCM fType <+> text "?<=" <+> prettyTCM eType
-            ]
-          cs1 <- addCtxTel eTel $ leqType fType eType
+        when (size eTel > size fTel) $
+          typeError $ UnequalTypes CmpLeq t1 t -- switch because of contravariance
+          -- Andreas, 2011-05-10 report error about types rather  telescopes
+          -- compareTel CmpLeq eTel fTel >> return () -- This will fail!
 
-          cs2 <- compareTel CmpLeq eTel fTel
-          return $ cs1 ++ cs2
+        reportSDoc "tc.term.con" 10 $ vcat
+          [ text "checking" <+>
+            prettyTCM fType <+> text "?<=" <+> prettyTCM eType
+          ]
+        blockTerm t $ f vs <$ workOnTypes (do
+          addCtxTel eTel $ leqType fType eType
+          compareTel t t1 CmpLeq eTel fTel)
 
-    HeadDef c | Just c == (nameOfSharp <$> kit) -> do
+    (A.Def c) | Just c == (nameOfSharp <$> kit) -> do
       -- TODO: Handle coinductive constructors under lets.
       lets <- envLetBindings <$> ask
       unless (Map.null lets) $
@@ -726,7 +952,7 @@
       -- The name of the fresh function.
       i <- fresh :: TCM Integer
       let name = filter (/= '_') (show $ A.qnameName c) ++ "-" ++ show i
-      c' <- liftM2 qualify currentModule (freshName_ name)
+      c' <- liftM2 qualify (killRange <$> currentModule) (freshName_ name)
 
       -- The application of the fresh function to the relevant
       -- arguments.
@@ -738,8 +964,8 @@
       tel <- getContextTelescope
       -- If we are in irrelevant position, add definition irrelevantly.
       -- TODO: is this sufficient?
-      rel <- irrelevant <$> asks envIrrelevant
-      addConstant c' (Defn rel c' t (defaultDisplayForm c') i $ Axiom Nothing Nothing)
+      rel <- asks envRelevance
+      addConstant c' (Defn rel c' t (defaultDisplayForm c') i noCompiledRep $ Axiom)
 
       -- Define and type check the fresh function.
       ctx <- getContext
@@ -748,7 +974,7 @@
           pats   = map (fmap $ \(n, _) -> Named Nothing (A.VarP n)) $
                        reverse ctx
           clause = A.Clause (A.LHS (A.LHSRange noRange) c' pats [])
-                            (A.RHS $ unAppView (A.Application hd args))
+                            (A.RHS $ unAppView (A.Application (A.Con (AmbQ [c])) args))
                             []
 
       reportSDoc "tc.term.expr.coind" 15 $ vcat $
@@ -762,8 +988,7 @@
           , nest 2 $ prettyA clause <> text "."
           ]
 
-      local (\e -> e { envReplace = False }) $
-        escapeContext (size ctx) $ checkFunDef Delayed info c' [clause]
+      escapeContext (size ctx) $ checkFunDef Delayed info c' [clause]
 
       reportSDoc "tc.term.expr.coind" 15 $ do
         def <- theDef <$> getConstInfo c'
@@ -771,14 +996,13 @@
           text "."
 
       return e'
-    HeadCon _  -> __IMPOSSIBLE__
-    HeadVar {} -> defaultResult
-    HeadDef {} -> defaultResult
+    A.Con _  -> __IMPOSSIBLE__
+    _ -> defaultResult
   where
   defaultResult = do
     (f, t0) <- inferHead hd
-    checkArguments' ExpandLast (getRange hd) args t0 t e $ \vs t1 cs ->
-      blockTerm t (f vs) $ (cs ++) <$> leqType t1 t
+    checkArguments' ExpandLast (getRange hd) args t0 t e $ \vs t1 ->
+      blockTerm t $ f vs <$ leqType_ t1 t
 
 data ExpandHidden = ExpandLast | DontExpandLast
 
@@ -799,27 +1023,34 @@
 
 -- | Check a list of arguments: @checkArgs args t0 t1@ checks that
 --   @t0 = Delta -> t0'@ and @args : Delta@. Inserts hidden arguments to
---   make this happen. Returns @t0'@ and any constraints that have to be
---   solve for everything to be well-formed.
+--   make this happen.  Returns the evaluated arguments @vs@, the remaining
+--   type @t0'@ (which should be a subtype of @t1@) and any constraints @cs@
+--   that have to be solved for everything to be well-formed.
+--
 --   TODO: doesn't do proper blocking of terms
 checkArguments :: ExpandHidden -> Range -> [NamedArg A.Expr] -> Type -> Type ->
-                  ErrorT Type TCM (Args, Type, Constraints)
-checkArguments DontExpandLast _ [] t0 t1 = return ([], t0, [])
+                  ErrorT Type TCM (Args, Type)
+checkArguments DontExpandLast _ [] t0 t1 = return ([], t0)
 checkArguments exh r [] t0 t1 =
     traceCallE (CheckArguments r [] t0 t1) $ do
 	t0' <- lift $ reduce t0
 	t1' <- lift $ reduce t1
-	case funView $ unEl t0' of -- TODO: clean
-	    FunV (Arg Hidden rel a) _ | notHPi $ unEl t1'  -> do
+	case unEl t0' of
+	    Pi (Arg Hidden rel a) _ | notHPi Hidden $ unEl t1'  -> do
 		v  <- lift $ applyRelevanceToContext rel $ newValueMeta a
 		let arg = Arg Hidden rel v
-		(vs, t0'',cs) <- checkArguments exh r [] (piApply t0' [arg]) t1'
-		return (arg : vs, t0'',cs)
-	    _ -> return ([], t0', [])
+		(vs, t0'') <- checkArguments exh r [] (piApply t0' [arg]) t1'
+		return (arg : vs, t0'')
+	    Pi (Arg Instance rel a) _ | notHPi Instance $ unEl t1'  -> do
+                lift $ reportSLn "tc.term.args.ifs" 15 $ "inserting implicit meta for type " ++ show a
+		v <- lift $ applyRelevanceToContext rel $ newIFSMeta a
+		let arg = Arg Instance rel v
+		(vs, t0'') <- checkArguments exh r [] (piApply t0' [arg]) t1'
+		return (arg : vs, t0'')
+	    _ -> return ([], t0')
     where
-	notHPi (Pi  (Arg Hidden _ _) _) = False
-	notHPi (Fun (Arg Hidden _ _) _) = False
-	notHPi _		        = True
+	notHPi h (Pi  (Arg h' _ _) _) | h == h' = False
+	notHPi _ _		        = True
 
 checkArguments exh r args0@(Arg h _ e : args) t0 t1 =
     traceCallE (CheckArguments r args0 t0 t1) $ do
@@ -830,23 +1061,28 @@
         NotBlocked t0' -> do
           -- (t0', cs) <- forcePi h (name e) t0
           e' <- return $ namedThing e
-          case (h, funView $ unEl t0') of
-              (NotHidden, FunV (Arg Hidden rel a) _) -> insertUnderscore rel
-              (Hidden, FunV (Arg Hidden rel a) _)
-                  | not $ sameName (nameOf e) (nameInPi $ unEl t0') -> insertUnderscore rel
-              (_, FunV (Arg h' rel a) _) | h == h' -> do
+          case unEl t0' of
+              Pi (Arg h' rel a) _ |
+                h == h' && (h == NotHidden || sameName (nameOf e) (nameInPi $ unEl t0')) -> do
                   u  <- lift $ applyRelevanceToContext rel $ checkExpr e' a
                   let arg = Arg h rel u  -- save relevance info in argument
-                  (us, t0'', cs') <- checkArguments exh (fuseRange r e) args (piApply t0' [arg]) t1
-                  return (nukeIfIrrelevant arg : us, t0'', cs')
+                  (us, t0'') <- checkArguments exh (fuseRange r e) args (piApply t0' [arg]) t1
+                  return (nukeIfIrrelevant arg : us, t0'')
                          where nukeIfIrrelevant arg =
                                  if argRelevance arg == Irrelevant then
-                                   arg { unArg = DontCare }
+   -- Andreas, 2011-09-09 keep irr. args. until after termination checking
+                                   arg { unArg = DontCare $ unArg arg }
                                   else arg
-              (Hidden, FunV (Arg NotHidden _ _) _) ->
-                  lift $ typeError $ WrongHidingInApplication t0'
+              Pi (Arg Instance rel a) _ -> insertIFSUnderscore rel a
+              Pi (Arg Hidden rel a) _   -> insertUnderscore rel
+              Pi (Arg NotHidden _ _) _  -> lift $ typeError $ WrongHidingInApplication t0'
               _ -> lift $ typeError $ ShouldBePi t0'
     where
+	insertIFSUnderscore rel a = do v <- lift $ applyRelevanceToContext rel $ newIFSMeta a
+                                       lift $ reportSLn "tc.term.args.ifs" 15 $ "inserting implicit meta (2) for type " ++ show a
+                                       let arg = Arg Instance rel v
+                                       (vs, t0'') <- checkArguments exh r args0 (piApply t0 [arg]) t1
+                                       return (arg : vs, t0'')
 	insertUnderscore rel = do
 	  scope <- lift $ getScope
 	  let m = A.Underscore $ A.MetaInfo
@@ -864,27 +1100,31 @@
 	sameName n1	 n2 = n1 == n2
 
 	nameInPi (Pi _ b)  = Just $ absName b
-	nameInPi (Fun _ _) = Nothing
 	nameInPi _	   = __IMPOSSIBLE__
 
 
 -- | Check that a list of arguments fits a telescope.
-checkArguments_ :: ExpandHidden -> Range -> [NamedArg A.Expr] -> Telescope -> TCM (Args, Constraints)
+checkArguments_ :: ExpandHidden -> Range -> [NamedArg A.Expr] -> Telescope -> TCM Args
 checkArguments_ exh r args tel = do
     z <- runErrorT $ checkArguments exh r args (telePi tel $ sort Prop) (sort Prop)
     case z of
-      Right (args, _, cs) -> return (args, cs)
-      Left _              -> __IMPOSSIBLE__
+      Right (args, _) -> return args
+      Left _          -> __IMPOSSIBLE__
 
 
--- | Infer the type of an expression. Implemented by checking agains a meta
+-- | Infer the type of an expression. Implemented by checking against a meta
 --   variable.
 inferExpr :: A.Expr -> TCM (Term, Type)
 inferExpr e = do
-    t <- newTypeMeta_
+    -- Andreas, 2011-04-27
+    t <- workOnTypes $ newTypeMeta_
     v <- checkExpr e t
     return (v,t)
 
+checkTerm :: Term -> Type -> TCM Term
+checkTerm tm ty = do atm <- reify tm
+                     checkExpr atm ty
+
 ---------------------------------------------------------------------------
 -- * Let bindings
 ---------------------------------------------------------------------------
@@ -898,20 +1138,20 @@
     t <- isType_ t
     v <- applyRelevanceToContext rel $ checkExpr e t
     addLetBinding rel x v t ret
-checkLetBinding (A.LetApply i x tel m args rd rm) ret = do
+checkLetBinding (A.LetApply i x modapp rd rm) ret = do
   -- Any variables in the context that doesn't belong to the current
   -- module should go with the new module.
   -- fv   <- getDefFreeVars =<< (qnameFromList . mnameToList) <$> currentModule
   fv   <- getModuleFreeVars =<< currentModule
   n    <- size <$> getContext
   let new = n - fv
-  reportSLn "tc.term.let.apply" 10 $ "Applying " ++ show m ++ " with " ++ show new ++ " free variables"
+  reportSLn "tc.term.let.apply" 10 $ "Applying " ++ show modapp ++ " with " ++ show new ++ " free variables"
   reportSDoc "tc.term.let.apply" 20 $ vcat
     [ text "context =" <+> (prettyTCM =<< getContextTelescope)
     , text "module  =" <+> (prettyTCM =<< currentModule)
     , text "fv      =" <+> (text $ show fv)
     ]
-  checkSectionApplication i x tel m args rd rm
+  checkSectionApplication i x modapp rd rm
   withAnonymousModule x new ret
 -- LetOpen is only used for highlighting and has no semantics
 checkLetBinding A.LetOpen{} ret = ret
diff --git a/src/full/Agda/TypeChecking/Rules/Term.hs-boot b/src/full/Agda/TypeChecking/Rules/Term.hs-boot
--- a/src/full/Agda/TypeChecking/Rules/Term.hs-boot
+++ b/src/full/Agda/TypeChecking/Rules/Term.hs-boot
@@ -6,4 +6,3 @@
 import Agda.TypeChecking.Monad.Base
 
 checkExpr :: A.Expr -> Type -> TCM Term
-
diff --git a/src/full/Agda/TypeChecking/Serialise.hs b/src/full/Agda/TypeChecking/Serialise.hs
--- a/src/full/Agda/TypeChecking/Serialise.hs
+++ b/src/full/Agda/TypeChecking/Serialise.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE OverlappingInstances,
              TypeSynonymInstances,
+             FlexibleInstances,
              IncoherentInstances,
              ExistentialQuantification,
              ScopedTypeVariables,
@@ -23,6 +24,7 @@
   )
   where
 
+import Control.Applicative
 import qualified Control.Exception as E
 import Control.Monad
 import Control.Monad.Reader
@@ -32,8 +34,8 @@
 import Data.Bits (shiftR)
 import Data.Word
 import Data.ByteString.Lazy as L
-import Data.HashTable (HashTable)
-import qualified Data.HashTable as H
+import Data.Hashable
+import qualified Data.HashTable.IO as H
 import Data.Int (Int32, Int64)
 import Data.IORef
 import Data.Map (Map)
@@ -47,6 +49,8 @@
 import Data.Typeable
 import qualified Codec.Compression.GZip as G
 
+import qualified Agda.Compiler.Epic.Interface as Epic
+
 import Agda.Syntax.Common
 import Agda.Syntax.Concrete.Name as C
 import Agda.Syntax.Abstract.Name as A
@@ -58,6 +62,7 @@
 import Agda.Syntax.Fixity
 import Agda.Syntax.Notation
 import Agda.Syntax.Literal
+import qualified Agda.Compiler.JS.Syntax as JS
 import qualified Agda.Interaction.Highlighting.Range   as HR
 import qualified Agda.Interaction.Highlighting.Precise as HP
 import Agda.Interaction.FindFile
@@ -77,10 +82,21 @@
 -- 32-bit machines). Word64 does not have these problems.
 
 currentInterfaceVersion :: Word64
-currentInterfaceVersion = 20110217 * 10 + 0
+currentInterfaceVersion = 20111026 * 10 + 0
 
-type Node = [Int32] -- constructor tag (maybe omitted) and arg indices
+-- | Constructor tag (maybe omitted) and argument indices.
 
+type Node = [Int32]
+
+-- | The type of hashtables used in this module.
+--
+-- A very limited amount of testing indicates that 'H.CuckooHashTable'
+-- is somewhat slower than 'H.BasicHashTable', and that
+-- 'H.LinearHashTable' and the hashtables from "Data.Hashtable" are
+-- much slower.
+
+type HashTable k v = H.BasicHashTable k v
+
 data Dict = Dict{ nodeD     :: !(HashTable Node    Int32)
                 , stringD   :: !(HashTable String  Int32)
                 , integerD  :: !(HashTable Integer Int32)
@@ -93,8 +109,18 @@
                 }
 
 data U    = forall a . Typeable a => U !a
-type Memo = HashTable (Int32, Int32) U    -- (node index, type rep key)
+type Memo = HashTable (Int32, TypeRep') U    -- (node index, type rep)
 
+-- | A newtype is used to avoid introducing an orphan instance of
+-- Hashable.
+newtype TypeRep' = TypeRep' { unTypeRep' :: TypeRep }
+  deriving Eq
+
+-- | With direct access to the internals of 'TypeRep' this instance
+-- could presumably be improved.
+instance Hashable TypeRep' where
+  hash = hash . show . unTypeRep'
+
 data St = St
   { nodeE     :: !(Array Int32 Node)
   , stringE   :: !(Array Int32 String)
@@ -141,7 +167,8 @@
       nL <- l nD; sL <- l sD; iL <- l iD; dL <- l dD
       return $ B.encode currentInterfaceVersion `L.append`
                G.compress (B.encode (root, nL, sL, iL, dL))
-  where l = fmap (List.map fst . List.sortBy (compare `on` snd)) . H.toList
+  where
+  l h = List.map fst . List.sortBy (compare `on` snd) <$> H.toList h
 
 -- | Decodes something. The result depends on the include path.
 --
@@ -173,7 +200,7 @@
        else do
 
         st <- St (ar nL) (ar sL) (ar iL) (ar dL)
-                <$> liftIO (H.new (==) hashInt2)
+                <$> liftIO H.new
                 <*> return mf <*> return incs
         (r, st) <- runStateT (runErrorT (value r)) st
         return (Just (modFile st), case r of
@@ -235,6 +262,11 @@
   icode   = icodeX doubleD doubleC
   value i = (! i) `fmap` gets doubleE
 
+instance EmbPrj () where
+  icode () = icode0'
+  value = vcase valu where valu [] = valu0 ()
+                           valu _  = malformed
+
 instance (EmbPrj a, EmbPrj b) => EmbPrj (a, b) where
   icode (a, b) = icode2' a b
   value = vcase valu where valu [a, b] = valu2 (,) a b
@@ -253,10 +285,10 @@
                            valu _   = malformed
 
 instance EmbPrj Bool where
-  icode True  = icode0 0
-  icode False = icode0 1
-  value = vcase valu where valu [0] = valu0 True
-                           valu [1] = valu0 False
+  icode True  = icode0'
+  icode False = icode0 0
+  value = vcase valu where valu []  = valu0 True
+                           valu [0] = valu0 False
                            valu _   = malformed
 
 instance EmbPrj AbsolutePath where
@@ -289,7 +321,7 @@
 
 instance EmbPrj a => EmbPrj [a] where
   icode xs = icodeN =<< mapM icode xs
-  value = vcase $ mapM value
+  value = vcase (mapM value)
 --   icode []       = icode0'
 --   icode (x : xs) = icode2' x xs
 --   value = vcase valu where valu []      = valu0 []
@@ -321,10 +353,10 @@
 
 instance EmbPrj C.Name where
   icode (C.NoName a b) = icode2 0 a b
-  icode (C.Name r xs)  = icode2 1 r xs
-  value = vcase valu where valu [0, a, b]  = valu2 C.NoName a b
-                           valu [1, r, xs] = valu2 C.Name   r xs
-                           valu _          = malformed
+  icode (C.Name r xs)  = icode2' r xs
+  value = vcase valu where valu [0, a, b] = valu2 C.NoName a b
+                           valu [r, xs]   = valu2 C.Name   r xs
+                           valu _         = malformed
 
 instance EmbPrj NamePart where
   icode Hole   = icode0'
@@ -341,15 +373,28 @@
                            valu _      = malformed
 
 instance EmbPrj Scope where
-  icode (Scope a b c d e f) = icode6' a b c d e f
-  value = vcase valu where valu [a, b, c, d, e, f] = valu6 Scope a b c d e f
-                           valu _                  = malformed
+  icode (Scope a b c d) = icode4' a b c d
+  value = vcase valu where valu [a, b, c, d] = valu4 Scope a b c d
+                           valu _            = malformed
 
+instance EmbPrj NameSpaceId where
+  icode PublicNS        = icode0'
+  icode PrivateNS       = icode0 1
+  icode ImportedNS      = icode0 2
+  icode OnlyQualifiedNS = icode0 3
+  value = vcase valu where valu []  = valu0 PublicNS
+                           valu [1] = valu0 PrivateNS
+                           valu [2] = valu0 ImportedNS
+                           valu [3] = valu0 OnlyQualifiedNS
+                           valu _   = malformed
+
 instance EmbPrj Access where
   icode PrivateAccess = icode0 0
-  icode PublicAccess  = icode0 1
+  icode PublicAccess  = icode0'
+  icode OnlyQualified = icode0 2
   value = vcase valu where valu [0] = valu0 PrivateAccess
-                           valu [1] = valu0 PublicAccess
+                           valu []  = valu0 PublicAccess
+                           valu [2] = valu0 OnlyQualified
                            valu _   = malformed
 
 instance EmbPrj NameSpace where
@@ -367,19 +412,19 @@
   value n = AbsModule `fmap` value n
 
 instance EmbPrj KindOfName where
-  icode DefName = icode0 0
+  icode DefName = icode0'
   icode ConName = icode0 1
-  value = vcase valu where valu [0] = valu0 DefName
+  value = vcase valu where valu []  = valu0 DefName
                            valu [1] = valu0 ConName
                            valu _   = malformed
 
 instance EmbPrj Agda.Syntax.Fixity.Fixity where
   icode (LeftAssoc  a b) = icode2 0 a b
   icode (RightAssoc a b) = icode2 1 a b
-  icode (NonAssoc   a b) = icode2 2 a b
+  icode (NonAssoc   a b) = icode2' a b
   value = vcase valu where valu [0, a, b] = valu2 LeftAssoc  a b
                            valu [1, a, b] = valu2 RightAssoc a b
-                           valu [2, a, b] = valu2 NonAssoc   a b
+                           valu [a, b]    = valu2 NonAssoc   a b
                            valu _         = malformed
 
 instance EmbPrj Agda.Syntax.Fixity.Fixity' where
@@ -390,10 +435,10 @@
 instance EmbPrj GenPart where
     icode (BindHole a)   = icode1 0 a
     icode (NormalHole a) = icode1 1 a
-    icode (IdPart a)     = icode1 2 a
+    icode (IdPart a)     = icode1' a
     value = vcase valu where valu [0, a] = valu1 BindHole a
                              valu [1, a] = valu1 NormalHole a
-                             valu [2, a] = valu1 IdPart a
+                             valu [a]    = valu1 IdPart a
                              valu _      = malformed
 
 instance EmbPrj A.QName where
@@ -443,26 +488,30 @@
                            valu _         = malformed
 
 instance EmbPrj Agda.Syntax.Common.Induction where
-  icode Inductive   = icode0 0
+  icode Inductive   = icode0'
   icode CoInductive = icode0 1
-  value = vcase valu where valu [0] = valu0 Inductive
+  value = vcase valu where valu []  = valu0 Inductive
                            valu [1] = valu0 CoInductive
                            valu _   = malformed
 
 instance EmbPrj Agda.Syntax.Common.Hiding where
   icode Hidden    = icode0 0
-  icode NotHidden = icode0 1
+  icode NotHidden = icode0'
+  icode Instance  = icode0 2
   value = vcase valu where valu [0] = valu0 Hidden
-                           valu [1] = valu0 NotHidden
+                           valu []  = valu0 NotHidden
+                           valu [2] = valu0 Instance
                            valu _   = malformed
 
 instance EmbPrj Agda.Syntax.Common.Relevance where
-  icode Relevant   = icode0 0
+  icode Relevant   = icode0'
   icode Irrelevant = icode0 1
   icode Forced     = icode0 2
-  value = vcase valu where valu [0] = valu0 Relevant
+  icode NonStrict  = icode0 3
+  value = vcase valu where valu []  = valu0 Relevant
                            valu [1] = valu0 Irrelevant
                            valu [2] = valu0 Forced
+                           valu [3] = valu0 NonStrict
                            valu _   = malformed
 
 instance EmbPrj I.Type where
@@ -471,9 +520,11 @@
                            valu _      = malformed
 
 instance (EmbPrj a) => EmbPrj (I.Abs a) where
-  icode (Abs a b) = icode2' a b
-  value = vcase valu where valu [a, b] = valu2 Abs a b
-                           valu _      = malformed
+  icode (NoAbs a b) = icode2 0 a b
+  icode (Abs a b)   = icode2' a b
+  value = vcase valu where valu [a, b]    = valu2 Abs a b
+                           valu [0, a, b] = valu2 NoAbs a b
+                           valu _         = malformed
 
 instance EmbPrj I.Term where
   icode (Var      a b) = icode2 0 a b
@@ -482,49 +533,62 @@
   icode (Def      a b) = icode2 3 a b
   icode (Con      a b) = icode2 4 a b
   icode (Pi       a b) = icode2 5 a b
-  icode (Fun      a b) = icode2 6 a b
   icode (Sort     a  ) = icode1 7 a
   icode (MetaV    a b) = __IMPOSSIBLE__
-  icode (DontCare    ) = icode0 8
+  icode (DontCare a  ) = icode1 8 a
+  icode (Level    a  ) = icode1 9 a
   value = vcase valu where valu [0, a, b] = valu2 Var   a b
                            valu [1, a, b] = valu2 Lam   a b
                            valu [2, a]    = valu1 Lit   a
                            valu [3, a, b] = valu2 Def   a b
                            valu [4, a, b] = valu2 Con   a b
                            valu [5, a, b] = valu2 Pi    a b
-                           valu [6, a, b] = valu2 Fun   a b
                            valu [7, a]    = valu1 Sort  a
-                           valu [8]       = valu0 DontCare
+                           valu [8, a]    = valu1 DontCare a
+                           valu [9, a]    = valu1 Level a
                            valu _         = malformed
 
+instance EmbPrj Level where
+  icode (Max a) = icode1' a
+  value = vcase valu where valu [a] = valu1 Max a
+                           valu _   = malformed
+
+instance EmbPrj PlusLevel where
+  icode (ClosedLevel a) = icode1' a
+  icode (Plus a b)      = icode2' a b
+  value = vcase valu where valu [a]    = valu1 ClosedLevel a
+                           valu [a, b] = valu2 Plus a b
+                           valu _      = malformed
+
+instance EmbPrj LevelAtom where
+  icode (NeutralLevel a)   = icode1' a
+  icode (UnreducedLevel a) = icode1 1 a
+  icode MetaLevel{}        = __IMPOSSIBLE__
+  icode BlockedLevel{}     = __IMPOSSIBLE__
+  value = vcase valu where valu [a]    = valu1 NeutralLevel a
+                           valu [1, a] = valu1 UnreducedLevel a
+                           valu _      = malformed
+
 instance EmbPrj I.Sort where
-  icode (Type  a  ) = icode1 0 a
-  icode Prop        = icode0 1
-  icode (Lub   a b) = icode2 2 a b
-  icode (Suc   a  ) = icode1 3 a
-  icode (MetaS a b) = __IMPOSSIBLE__
-  icode Inf         = icode0 4
-  icode (DLub a b)  = icode2 5 a b
-  value = vcase valu where valu [0, a]    = valu1 Type  a
-                           valu [1]       = valu0 Prop
-                           valu [2, a, b] = valu2 Lub   a b
-                           valu [3, a]    = valu1 Suc   a
-                           valu [4]       = valu0 Inf
-                           valu [5, a, b] = valu2 DLub a b
-                           valu _         = malformed
+  icode (Type  a  ) = icode1' a
+  icode Prop        = icode1 1 ()
+  icode Inf         = icode1 4 ()
+  icode (DLub a b)  = __IMPOSSIBLE__
+  value = vcase valu where valu [a]    = valu1 Type  a
+                           valu [1, _] = valu0 Prop
+                           valu [4, _] = valu0 Inf
+                           valu _      = malformed
 
 instance EmbPrj Agda.Syntax.Literal.Literal where
-  icode (LitInt    a b) = icode2 0 a b
+  icode (LitInt    a b) = icode2' a b
   icode (LitFloat  a b) = icode2 1 a b
   icode (LitString a b) = icode2 2 a b
   icode (LitChar   a b) = icode2 3 a b
-  icode (LitLevel  a b) = icode2 4 a b
   icode (LitQName  a b) = icode2 5 a b
-  value = vcase valu where valu [0, a, b] = valu2 LitInt    a b
+  value = vcase valu where valu [a, b]    = valu2 LitInt    a b
                            valu [1, a, b] = valu2 LitFloat  a b
                            valu [2, a, b] = valu2 LitString a b
                            valu [3, a, b] = valu2 LitChar   a b
-                           valu [4, a, b] = valu2 LitLevel  a b
                            valu [5, a, b] = valu2 LitQName  a b
                            valu _         = malformed
 
@@ -544,64 +608,122 @@
 
 instance EmbPrj DisplayTerm where
   icode (DTerm    a  ) = icode1' a
-  icode (DWithApp a b) = icode2' a b
-  value = vcase valu where valu [a]    = valu1 DTerm a
-                           valu [a, b] = valu2 DWithApp a b
-                           valu _      = malformed
+  icode (DDot     a  ) = icode1 1 a
+  icode (DCon     a b) = icode2 2 a b
+  icode (DDef     a b) = icode2 3 a b
+  icode (DWithApp a b) = icode2 4 a b
+  value = vcase valu where valu [a]       = valu1 DTerm a
+                           valu [1, a]    = valu1 DDot a
+                           valu [2, a, b] = valu2 DCon a b
+                           valu [3, a, b] = valu2 DDef a b
+                           valu [4, a, b] = valu2 DWithApp a b
+                           valu _         = malformed
 
 instance EmbPrj MutualId where
   icode (MutId a) = icode a
   value n = MutId `fmap` value n
 
 instance EmbPrj Definition where
-  icode (Defn rel a b c d e) = icode6' rel a b c d e
-  value = vcase valu where valu [rel, a, b, c, d, e] = valu6 Defn rel a b c d e
-                           valu _                    = malformed
+  icode (Defn rel a b c d e f) = icode7' rel a b c d e f
+  value = vcase valu where valu [rel, a, b, c, d, e, f] = valu7 Defn rel a b c d e f
+                           valu _                       = malformed
 
 instance EmbPrj HaskellRepresentation where
-  icode (HsType a)   = icode1 0 a
-  icode (HsDefn a b) = icode2 1 a b
+  icode (HsType a)   = icode1' a
+  icode (HsDefn a b) = icode2' a b
 
   value = vcase valu where
-    valu [0, a]    = valu1 HsType a
-    valu [1, a, b] = valu2 HsDefn a b
-    valu _         = malformed
+    valu [a]    = valu1 HsType a
+    valu [a, b] = valu2 HsDefn a b
+    valu _      = malformed
 
+instance EmbPrj JS.Exp where
+  icode (JS.Self)         = icode0 0
+  icode (JS.Local i)      = icode1 1 i
+  icode (JS.Global i)     = icode1 2 i
+  icode (JS.Undefined)    = icode0 3
+  icode (JS.String s)     = icode1 4 s
+  icode (JS.Char c)       = icode1 5 c
+  icode (JS.Integer n)    = icode1 6 n
+  icode (JS.Double d)     = icode1 7 d
+  icode (JS.Lambda n e)   = icode2 8 n e
+  icode (JS.Object o)     = icode1 9 o
+  icode (JS.Apply e es)   = icode2 10 e es
+  icode (JS.Lookup e l)   = icode2 11 e l
+  icode (JS.If e f g)     = icode3 12 e f g
+  icode (JS.BinOp e op f) = icode3 13 e op f
+  icode (JS.PreOp op e)   = icode2 14 op e
+  icode (JS.Const i)      = icode1 15 i
+  value = vcase valu where valu [0]           = valu0 JS.Self
+                           valu [1,  a]       = valu1 JS.Local a
+                           valu [2,  a]       = valu1 JS.Global a
+                           valu [3]           = valu0 JS.Undefined
+                           valu [4,  a]       = valu1 JS.String a
+                           valu [5,  a]       = valu1 JS.Char a
+                           valu [6,  a]       = valu1 JS.Integer a
+                           valu [7,  a]       = valu1 JS.Double a
+                           valu [8,  a, b]    = valu2 JS.Lambda a b
+                           valu [9,  a]       = valu1 JS.Object a
+                           valu [10, a, b]    = valu2 JS.Apply a b
+                           valu [11, a, b]    = valu2 JS.Lookup a b
+                           valu [12, a, b, c] = valu3 JS.If a b c
+                           valu [13, a, b, c] = valu3 JS.BinOp a b c
+                           valu [14, a, b]    = valu2 JS.PreOp a b
+                           valu [15, a]       = valu1 JS.Const a
+                           valu _             = malformed
+
+instance EmbPrj JS.LocalId where
+  icode (JS.LocalId l) = icode l
+  value n = JS.LocalId `fmap` value n
+
+instance EmbPrj JS.GlobalId where
+  icode (JS.GlobalId l) = icode l
+  value n = JS.GlobalId `fmap` value n
+
+instance EmbPrj JS.MemberId where
+  icode (JS.MemberId l) = icode l
+  value n = JS.MemberId `fmap` value n
+
 instance EmbPrj Polarity where
-  icode Covariant     = icode0 0
+  icode Covariant     = icode0'
   icode Contravariant = icode0 1
   icode Invariant     = icode0 2
 
   value = vcase valu where
-    valu [0] = valu0 Covariant
+    valu []  = valu0 Covariant
     valu [1] = valu0 Contravariant
     valu [2] = valu0 Invariant
     valu _   = malformed
 
 instance EmbPrj Occurrence where
-  icode Positive = icode0 0
+  icode Positive = icode0'
   icode Negative = icode0 1
   icode Unused   = icode0 2
 
   value = vcase valu where
-    valu [0] = valu0 Positive
+    valu []  = valu0 Positive
     valu [1] = valu0 Negative
     valu [2] = valu0 Unused
     valu _   = malformed
 
+instance EmbPrj CompiledRepresentation where
+  icode (CompiledRep a b c) = icode3' a b c
+  value = vcase valu where valu [a, b, c] = valu3 CompiledRep a b c
+                           valu _         = malformed
+
 instance EmbPrj Defn where
-  icode (Axiom       a b)                   = icode2 0 a b
-  icode (Function    a b c d e f g h)       = icode8 1 a b c d e f g h
-  icode (Datatype    a b c d e f g h i j)   = icode10 2 a b c d e f g h i j
+  icode Axiom                               = icode0 0
+  icode (Function    a b c d e f g h i)     = icode9 1 a b c d e f g h i
+  icode (Datatype    a b c d e f g h i)     = icode9 2 a b c d e f g h i
   icode (Record      a b c d e f g h i j k) = icode11 3 a b c d e f g h i j k
-  icode (Constructor a b c d e f)           = icode6 4 a b c d e f
+  icode (Constructor a b c d e)             = icode5 4 a b c d e
   icode (Primitive   a b c d)               = icode4 5 a b c d
   value = vcase valu where
-    valu [0, a, b]                            = valu2 Axiom       a b
-    valu [1, a, b, c, d, e, f, g, h]          = valu8 Function    a b c d e f g h
-    valu [2, a, b, c, d, e, f, g, h, i, j]    = valu10 Datatype   a b c d e f g h i j
+    valu [0]                                  = valu0 Axiom
+    valu [1, a, b, c, d, e, f, g, h, i]       = valu9 Function    a b c d e f g h i
+    valu [2, a, b, c, d, e, f, g, h, i]       = valu9 Datatype    a b c d e f g h i
     valu [3, a, b, c, d, e, f, g, h, i, j, k] = valu11 Record     a b c d e f g h i j k
-    valu [4, a, b, c, d, e, f]                = valu6 Constructor a b c d e f
+    valu [4, a, b, c, d, e]                   = valu5 Constructor a b c d e
     valu [5, a, b, c, d]                      = valu4 Primitive   a b c d
     valu _                                    = malformed
 
@@ -613,13 +735,13 @@
     valu _         = malformed
 
 instance EmbPrj CompiledClauses where
-  icode Fail       = icode0 0
-  icode (Done a b) = icode2 1 a b
+  icode Fail       = icode0'
+  icode (Done a b) = icode2' a b
   icode (Case a b) = icode2 2 a b
 
   value = vcase valu where
-    valu [0]       = valu0 Fail
-    valu [1, a, b] = valu2 Done a b
+    valu []        = valu0 Fail
+    valu [a, b]    = valu2 Done a b
     valu [2, a, b] = valu2 Case a b
     valu _         = malformed
 
@@ -631,26 +753,21 @@
                            valu _   = malformed
 
 instance EmbPrj TermHead where
-  icode SortHead    = icode0 0
+  icode SortHead    = icode0'
   icode PiHead      = icode0 1
   icode (ConHead a) = icode1 2 a
-  value = vcase valu where valu [0]    = return SortHead
-                           valu [1]    = return PiHead
+  value = vcase valu where valu []     = valu0 SortHead
+                           valu [1]    = valu0 PiHead
                            valu [2, a] = valu1 ConHead a
                            valu _      = malformed
 
 instance EmbPrj Agda.Syntax.Common.IsAbstract where
   icode AbstractDef = icode0 0
-  icode ConcreteDef = icode0 1
+  icode ConcreteDef = icode0'
   value = vcase valu where valu [0] = valu0 AbstractDef
-                           valu [1] = valu0 ConcreteDef
+                           valu []  = valu0 ConcreteDef
                            valu _   = malformed
 
-instance EmbPrj I.Clauses where
-  icode (Clauses a b) = icode2' a b
-  value = vcase valu where valu [a, b] = valu2 Clauses a b
-                           valu _      = malformed
-
 instance EmbPrj I.Clause where
   icode (Clause a b c d e) = icode5' a b c d e
   value = vcase valu where valu [a, b, c, d, e] = valu5 Clause a b c d e
@@ -658,42 +775,40 @@
 
 instance EmbPrj I.ClauseBody where
   icode (Body   a) = icode1 0 a
-  icode (Bind   a) = icode1 1 a
-  icode (NoBind a) = icode1 2 a
+  icode (Bind   a) = icode1' a
   icode NoBody     = icode0'
   value = vcase valu where valu [0, a] = valu1 Body   a
-                           valu [1, a] = valu1 Bind   a
-                           valu [2, a] = valu1 NoBind a
+                           valu [a]    = valu1 Bind   a
                            valu []     = valu0 NoBody
                            valu _      = malformed
 
 instance EmbPrj Delayed where
   icode Delayed    = icode0 0
-  icode NotDelayed = icode0 1
+  icode NotDelayed = icode0'
   value = vcase valu where valu [0] = valu0 Delayed
-                           valu [1] = valu0 NotDelayed
+                           valu []  = valu0 NotDelayed
                            valu _   = malformed
 
 instance EmbPrj I.Pattern where
-  icode (VarP a    ) = icode1 0 a
-  icode (ConP a b c) = icode3 1 a b c
+  icode (VarP a    ) = icode1' a
+  icode (ConP a b c) = icode3' a b c
   icode (LitP a    ) = icode1 2 a
   icode (DotP a    ) = icode1 3 a
-  value = vcase valu where valu [0, a]       = valu1 VarP a
-                           valu [1, a, b, c] = valu3 ConP a b c
-                           valu [2, a]       = valu1 LitP a
-                           valu [3, a]       = valu1 DotP a
-                           valu _            = malformed
+  value = vcase valu where valu [a]       = valu1 VarP a
+                           valu [a, b, c] = valu3 ConP a b c
+                           valu [2, a]    = valu1 LitP a
+                           valu [3, a]    = valu1 DotP a
+                           valu _         = malformed
 
 instance EmbPrj a => EmbPrj (Builtin a) where
-  icode (Prim    a) = icode1 0 a
+  icode (Prim    a) = icode1' a
   icode (Builtin a) = icode1 1 a
-  value = vcase valu where valu [0, a] = valu1 Prim    a
+  value = vcase valu where valu [a]    = valu1 Prim    a
                            valu [1, a] = valu1 Builtin a
                            valu _      = malformed
 
 instance EmbPrj HP.NameKind where
-  icode HP.Bound           = icode0 0
+  icode HP.Bound           = icode0'
   icode (HP.Constructor a) = icode1 1 a
   icode HP.Datatype        = icode0 2
   icode HP.Field           = icode0 3
@@ -704,7 +819,7 @@
   icode HP.Record          = icode0 8
 
   value = vcase valu where
-    valu [0]     = valu0 HP.Bound
+    valu []      = valu0 HP.Bound
     valu [1 , a] = valu1 HP.Constructor a
     valu [2]     = valu0 HP.Datatype
     valu [3]     = valu0 HP.Field
@@ -720,7 +835,7 @@
   icode HP.Keyword       = icode0 1
   icode HP.String        = icode0 2
   icode HP.Number        = icode0 3
-  icode HP.Symbol        = icode0 4
+  icode HP.Symbol        = icode0'
   icode HP.PrimitiveType = icode0 5
   icode (HP.Name mk b)   = icode2 6 mk b
 
@@ -729,21 +844,21 @@
     valu [1]        = valu0 HP.Keyword
     valu [2]        = valu0 HP.String
     valu [3]        = valu0 HP.Number
-    valu [4]        = valu0 HP.Symbol
+    valu []         = valu0 HP.Symbol
     valu [5]        = valu0 HP.PrimitiveType
     valu [6, mk, b] = valu2 HP.Name mk b
     valu _          = malformed
 
 instance EmbPrj HP.OtherAspect where
   icode HP.Error              = icode0 0
-  icode HP.DottedPattern      = icode0 1
+  icode HP.DottedPattern      = icode0'
   icode HP.UnsolvedMeta       = icode0 2
   icode HP.TerminationProblem = icode0 3
   icode HP.IncompletePattern  = icode0 4
 
   value = vcase valu where
     valu [0] = valu0 HP.Error
-    valu [1] = valu0 HP.DottedPattern
+    valu []  = valu0 HP.DottedPattern
     valu [2] = valu0 HP.UnsolvedMeta
     valu [3] = valu0 HP.TerminationProblem
     valu [4] = valu0 HP.IncompletePattern
@@ -757,7 +872,7 @@
     valu _            = malformed
 
 instance EmbPrj Precedence where
-  icode TopCtx                 = icode0 0
+  icode TopCtx                 = icode0'
   icode FunctionSpaceDomainCtx = icode0 1
   icode (LeftOperandCtx a)     = icode1 2 a
   icode (RightOperandCtx a)    = icode1 3 a
@@ -769,7 +884,7 @@
   icode DotPatternCtx          = icode0 9
   value = vcase valu
     where
-    valu [0]    = valu0 TopCtx
+    valu []     = valu0 TopCtx
     valu [1]    = valu0 FunctionSpaceDomainCtx
     valu [2, a] = valu1 LeftOperandCtx a
     valu [3, a] = valu1 RightOperandCtx a
@@ -791,45 +906,77 @@
   value = vcase valu where valu [a, b, c, d, e, f, g, h, i] = valu9 Interface a b c d e f g h i
                            valu _                           = malformed
 
+-- This is used for the Epic compiler backend
+instance EmbPrj Epic.EInterface where
+  icode (Epic.EInterface a b c d e f g h) = icode8' a b c d e f g h
+  value = vcase valu where
+    valu [a, b, c, d, e, f, g, h] = valu8 Epic.EInterface a b c d e f g h
+    valu _                        = malformed
 
+instance EmbPrj Epic.InjectiveFun where
+  icode (Epic.InjectiveFun a b) = icode2' a b
+  value = vcase valu where
+     valu [a,b] = valu2 Epic.InjectiveFun a b
+     valu _     = malformed
 
-icodeX :: (Dict -> HashTable k Int32) -> (Dict -> IORef Int32) ->
+instance EmbPrj Epic.Relevance where
+  icode Epic.Irr      = icode0 0
+  icode Epic.Rel      = icode0 1
+  value = vcase valu where valu [0] = valu0 Epic.Irr
+                           valu [1] = valu0 Epic.Rel
+                           valu _   = malformed
+
+instance EmbPrj Epic.Forced where
+  icode Epic.Forced    = icode0 0
+  icode Epic.NotForced = icode0 1
+  value = vcase valu where valu [0] = valu0 Epic.Forced
+                           valu [1] = valu0 Epic.NotForced
+                           valu _   = malformed
+
+instance EmbPrj Epic.Tag where
+  icode (Epic.Tag a)     = icode1 0 a
+  icode (Epic.PrimTag a) = icode1 1 a
+  value = vcase valu
+    where
+    valu [0, a] = valu1 Epic.Tag a
+    valu [1, a] = valu1 Epic.PrimTag a
+    valu _      = malformed
+
+{-# SPECIALIZE icodeX :: (Dict -> HashTable [Int32] Int32) ->
+                         (Dict -> IORef Int32) -> [Int32] -> S Int32 #-}
+icodeX :: (Eq k, Hashable k) =>
+          (Dict -> HashTable k Int32) -> (Dict -> IORef Int32) ->
           k -> S Int32
 icodeX dict counter key = do
-  d     <- asks dict
-  c     <- asks counter
-  fresh <- lift $ readIORef c
-  mi    <- lift $ H.lookup d key
+  d <- asks dict
+  c <- asks counter
+  liftIO $ do
+  mi    <- H.lookup d key
   case mi of
     Just i  -> return i
-    Nothing -> do lift $ H.insert d key fresh
-                  lift $ writeIORef c (fresh + 1)
-                  return fresh
+    Nothing -> do
+      fresh <- readIORef c
+      H.insert d key fresh
+      writeIORef c $! fresh + 1
+      return fresh
 
+icodeN :: [Int32] -> S Int32
 icodeN = icodeX nodeD nodeC
 
+{-# INLINE vcase #-}
 vcase :: forall a . EmbPrj a => (Node -> R a) -> Int32 -> R a
-vcase valu ix = do
+vcase valu = \ix -> do
     memo <- gets nodeMemo
     (aTyp, maybeU) <- liftIO $ do
-      aTyp   <- typeRepKey $ typeOf (undefined :: a)
-      -- The following tests try to ensure that conversion to Int32
-      -- won't truncate the key. The tests can perhaps give erroneous
-      -- results if Int is "larger" than Int64.
-      when ((convert aTyp :: Int64) > convert (maxBound :: Int32)) __IMPOSSIBLE__
-      when ((convert aTyp :: Int64) < convert (minBound :: Int32)) __IMPOSSIBLE__
-      let aTyp' = convert aTyp :: Int32
-      maybeU <- H.lookup memo (ix, aTyp')
-      return (aTyp', maybeU)
+      let aTyp = TypeRep' $ typeOf (undefined :: a)
+      maybeU <- H.lookup memo (ix, aTyp)
+      return (aTyp, maybeU)
     case maybeU of
       Just (U u) -> maybe malformed return (cast u)
       Nothing    -> do
           v <- valu . (! ix) =<< gets nodeE
           liftIO $ H.insert memo (ix, aTyp) (U v)
           return v
-    where
-    convert :: (Integral b, Integral c) => b -> c
-    convert = fromInteger . toInteger
 
 icode0  tag                       = icodeN [tag]
 icode1  tag a                     = icodeN . (tag :) =<< sequence [icode a]
@@ -843,6 +990,7 @@
 icode9  tag a b c d e f g h i     = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i]
 icode10 tag a b c d e f g h i j   = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j]
 icode11 tag a b c d e f g h i j k = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k]
+icode12 tag a b c d e f g h i j k l = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l]
 
 icode0'                        = icodeN []
 icode1'  a                     = icodeN =<< sequence [icode a]
@@ -856,19 +1004,21 @@
 icode9'  a b c d e f g h i     = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i]
 icode10' a b c d e f g h i j   = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j]
 icode11' a b c d e f g h i j k = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k]
+icode12' a b c d e f g h i j k l = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l]
 
-valu0  z                       = return z
-valu1  z a                     = valu0 z                      `ap` value a
-valu2  z a b                   = valu1 z a                    `ap` value b
-valu3  z a b c                 = valu2 z a b                  `ap` value c
-valu4  z a b c d               = valu3 z a b c                `ap` value d
-valu5  z a b c d e             = valu4 z a b c d              `ap` value e
-valu6  z a b c d e f           = valu5 z a b c d e            `ap` value f
-valu7  z a b c d e f g         = valu6 z a b c d e f          `ap` value g
-valu8  z a b c d e f g h       = valu7 z a b c d e f g        `ap` value h
-valu9  z a b c d e f g h i     = valu8 z a b c d e f g h      `ap` value i
-valu10 z a b c d e f g h i j   = valu9 z a b c d e f g h i    `ap` value j
-valu11 z a b c d e f g h i j k = valu10 z a b c d e f g h i j `ap` value k
+valu0  z                         = return z
+valu1  z a                       = valu0 z                        `ap` value a
+valu2  z a b                     = valu1 z a                      `ap` value b
+valu3  z a b c                   = valu2 z a b                    `ap` value c
+valu4  z a b c d                 = valu3 z a b c                  `ap` value d
+valu5  z a b c d e               = valu4 z a b c d                `ap` value e
+valu6  z a b c d e f             = valu5 z a b c d e              `ap` value f
+valu7  z a b c d e f g           = valu6 z a b c d e f            `ap` value g
+valu8  z a b c d e f g h         = valu7 z a b c d e f g          `ap` value h
+valu9  z a b c d e f g h i       = valu8 z a b c d e f g h        `ap` value i
+valu10 z a b c d e f g h i j     = valu9 z a b c d e f g h i      `ap` value j
+valu11 z a b c d e f g h i j k   = valu10 z a b c d e f g h i j   `ap` value k
+valu12 z a b c d e f g h i j k l = valu11 z a b c d e f g h i j k `ap` value l
 
 -- | Creates an empty dictionary.
 
@@ -878,27 +1028,12 @@
              -- later encountered.
           -> IO Dict
 emptyDict fileMod = Dict
-  <$> H.new (==) hashNode
-  <*> H.new (==) H.hashString
-  <*> H.new (==) (H.hashInt . fromIntegral)
-  <*> H.new (==) (H.hashInt . floor)
+  <$> H.new
+  <*> H.new
+  <*> H.new
+  <*> H.new
   <*> newIORef 0
   <*> newIORef 0
   <*> newIORef 0
   <*> newIORef 0
   <*> return fileMod
-
-hashNode :: Node -> Int32
-hashNode is = List.foldl' f golden is
-   where f m c = fromIntegral c * magic + hashInt32 m
-         magic  = 0xdeadbeef
-         golden :: Int32
-         golden = 1013904242
-         hashInt32 x = mulHi x golden + x
-         mulHi :: Int32 -> Int32 -> Int32
-         mulHi a b = fromIntegral (r `shiftR` 32)
-             where r :: Int64
-                   r = fromIntegral a * fromIntegral b
-
-hashInt2 :: (Int32, Int32) -> Int32
-hashInt2 (ix, rep) = hashNode [ix , rep]
diff --git a/src/full/Agda/TypeChecking/SizedTypes.hs b/src/full/Agda/TypeChecking/SizedTypes.hs
--- a/src/full/Agda/TypeChecking/SizedTypes.hs
+++ b/src/full/Agda/TypeChecking/SizedTypes.hs
@@ -17,6 +17,7 @@
 import Agda.TypeChecking.Substitute
 import Agda.TypeChecking.Telescope
 import {-# SOURCE #-} Agda.TypeChecking.Conversion
+import Agda.TypeChecking.Constraints
 import qualified Agda.Utils.Warshall as W
 import Agda.Utils.List
 import Agda.Utils.Monad
@@ -26,7 +27,7 @@
 #include "../undefined.h"
 
 -- | Compare two sizes. Only with --sized-types.
-compareSizes :: MonadTCM tcm => Comparison -> Term -> Term -> tcm Constraints
+compareSizes :: Comparison -> Term -> Term -> TCM ()
 compareSizes cmp u v = do
   reportSDoc "tc.conv.size" 10 $ vcat
     [ text "Comparing sizes"
@@ -44,18 +45,18 @@
   s2   <- sizeView v
   size <- sizeType
   case (cmp, s1, s2) of
-    (CmpLeq, _,         SizeInf)   -> return []
+    (CmpLeq, _,         SizeInf)   -> return ()
     (CmpLeq, SizeInf,   _)         -> compareSizes CmpEq u v
     (CmpEq,  SizeSuc u, SizeInf)   -> compareSizes CmpEq u v
     (_,      SizeInf,   SizeSuc v) -> compareSizes CmpEq u v
     (_,      SizeSuc u, SizeSuc v) -> compareSizes cmp u v
     (CmpLeq, _,         _)         ->
-      ifM (trivial u v) (return []) $
-        buildConstraint $ ValueCmp CmpLeq size u v
-    _                              -> compareAtom cmp size u v
+      ifM (trivial u v) (return ()) $
+        addConstraint $ ValueCmp CmpLeq size u v
+    _ -> compareAtom cmp size u v
 
-trivial :: MonadTCM tcm => Term -> Term -> tcm Bool
-trivial u v = liftTCM $ do
+trivial :: Term -> Term -> TCM Bool
+trivial u v = do
     a <- sizeExpr u
     b <- sizeExpr v
     reportSDoc "tc.conv.size" 15 $
@@ -68,19 +69,17 @@
   `catchError` \_ -> return False
 
 -- | Find the size constraints.
-getSizeConstraints :: MonadTCM tcm => tcm [SizeConstraint]
+getSizeConstraints :: TCM [SizeConstraint]
 getSizeConstraints = do
-  cs   <- getConstraints
+  cs   <- getAllConstraints
   size <- sizeType
   let sizeConstraints cl@(Closure{ clValue = ValueCmp CmpLeq s _ _ })
         | s == size = [cl]
-      sizeConstraints cl@(Closure{ clValue = Guarded _ cs }) =
-        concatMap sizeConstraints cs
       sizeConstraints _ = []
-  scs <- mapM computeSizeConstraint $ concatMap sizeConstraints cs
+  scs <- mapM computeSizeConstraint $ concatMap (sizeConstraints . theConstraint) cs
   return [ c | Just c <- scs ]
 
-getSizeMetas :: MonadTCM tcm => tcm [(MetaId, Int)]
+getSizeMetas :: TCM [(MetaId, Int)]
 getSizeMetas = do
   ms <- getOpenMetas
   sz <- sizeType
@@ -111,8 +110,8 @@
     | n > 0     = show a ++ " =< " ++ show b ++ " + " ++ show n
     | otherwise = show a ++ " + " ++ show (-n) ++ " =< " ++ show b
 
-computeSizeConstraint :: MonadTCM tcm => ConstraintClosure -> tcm (Maybe SizeConstraint)
-computeSizeConstraint cl = liftTCM $
+computeSizeConstraint :: Closure Constraint -> TCM (Maybe SizeConstraint)
+computeSizeConstraint cl =
   enterClosure cl $ \c ->
     case c of
       ValueCmp CmpLeq _ u v -> do
@@ -125,7 +124,7 @@
       _ -> __IMPOSSIBLE__
 
 -- | Throws a 'patternViolation' if the term isn't a proper size expression.
-sizeExpr :: MonadTCM tcm => Term -> tcm (SizeExpr, Int)
+sizeExpr :: Term -> TCM (SizeExpr, Int)
 sizeExpr u = do
   u <- reduce u -- Andreas, 2009-02-09.
                 -- This is necessary to surface the solutions of metavariables.
@@ -154,15 +153,15 @@
     flex (Rigid _)       = []
     flex (SizeMeta m xs) = [(m, xs)]
 
-haveSizedTypes :: MonadTCM tcm => tcm Bool
-haveSizedTypes = liftTCM $ do
+haveSizedTypes :: TCM Bool
+haveSizedTypes = do
     Def _ [] <- primSize
     Def _ [] <- primSizeInf
     Def _ [] <- primSizeSuc
     optSizedTypes <$> pragmaOptions
   `catchError` \_ -> return False
 
-solveSizeConstraints :: MonadTCM tcm => tcm ()
+solveSizeConstraints :: TCM ()
 solveSizeConstraints = whenM haveSizedTypes $ do
   cs <- getSizeConstraints
   ms <- getSizeMetas
@@ -194,9 +193,7 @@
   verboseS "tc.size.solve" 20 $ do
     let meta (m, _) = do
           j <- mvJudgement <$> lookupMeta m
-          reportSDoc "" 0 $ case j of
-            HasType _ t -> text (show m) <+> text ":" <+> prettyTCM t
-            IsSort _    -> text (show m) <+> text "sort"
+          reportSDoc "" 0 $ prettyTCM j
     mapM_ meta metas
 
   case W.solve $ map mkFlex metas ++ map mkConstr cs of
@@ -232,7 +229,7 @@
               , nest 2 $ prettyTCM v
               ]
 
-            m =: v
+            assignTerm m v
 
       mapM_ inst $ Map.toList sol
 
diff --git a/src/full/Agda/TypeChecking/Substitute.hs b/src/full/Agda/TypeChecking/Substitute.hs
--- a/src/full/Agda/TypeChecking/Substitute.hs
+++ b/src/full/Agda/TypeChecking/Substitute.hs
@@ -1,9 +1,15 @@
-{-# LANGUAGE CPP, TypeSynonymInstances #-}
+{-# LANGUAGE CPP, TypeSynonymInstances, FlexibleInstances,
+    DeriveDataTypeable, DeriveFunctor, StandaloneDeriving #-}
 module Agda.TypeChecking.Substitute where
 
 import Control.Monad.Identity
 import Control.Monad.Reader
+import Control.Arrow ((***))
+
+import Data.Generics (Typeable, Data)
 import Data.List hiding (sort)
+import qualified Data.List as List
+import Data.Function
 import Data.Map (Map)
 import qualified Data.Map as Map
 import qualified Data.Set as Set
@@ -36,11 +42,12 @@
             Con c args'   -> Con c (args' ++ args)
             Lam _ u       -> absApp u (unArg a) `apply` args0
             MetaV x args' -> MetaV x (args' ++ args)
-            Lit l         -> __IMPOSSIBLE__
+            Lit{}         -> __IMPOSSIBLE__
+            Level{}       -> __IMPOSSIBLE__
             Pi _ _        -> __IMPOSSIBLE__
-            Fun _ _       -> __IMPOSSIBLE__
             Sort _        -> __IMPOSSIBLE__
-            DontCare      -> __IMPOSSIBLE__
+            DontCare mv   -> DontCare $ mv `apply` args  -- Andreas, 2011-10-02
+              -- need to go under DontCare, since "with" might resurrect irrelevant term
 
 instance Apply Type where
   apply = piApply
@@ -55,23 +62,41 @@
   apply (ExtendTel _ tel) (t : ts) = absApp tel (unArg t) `apply` ts
 
 instance Apply Definition where
-    apply (Defn rel x t df m d) args = Defn rel x (piApply t args) df m (apply d args)
+    apply (Defn rel x t df m c d) args = Defn rel x (piApply t args) df m c (apply d args)
 
 instance Apply Defn where
+  apply d [] = d
   apply d args = case d of
     Axiom{} -> d
     Function{ funClauses = cs, funCompiled = cc, funInv = inv
-            , funProjection = mn } ->
+            , funProjection = Nothing, funArgOccurrences = occ } ->
       d { funClauses    = apply cs args
         , funCompiled   = apply cc args
         , funInv        = apply inv args
-        , funProjection = fmap (nonNeg . \ n -> n - size args) mn
-        } where nonNeg n = if n >= 0 then n else __IMPOSSIBLE__
-    Datatype{ dataPars = np, dataClause = cl } ->
-      d { dataPars = np - size args, dataClause = apply cl args }
-    Record{ recPars = np, recConType = t, recClause = cl, recTel = tel } ->
+        , funArgOccurrences = drop (length args) occ
+        }
+    Function{ funClauses = cs, funCompiled = cc, funInv = inv
+            , funProjection = Just (r, n), funArgOccurrences = occ }
+      | m < n  -> d { funProjection = Just (r, n - m) }
+      | otherwise ->
+        d { funClauses        = apply cs args'
+          , funCompiled       = apply cc args'
+          , funInv            = apply inv args'
+          , funProjection     = Just (r, 0)
+          , funArgOccurrences = drop 1 occ
+          }
+      where args' = [last args]
+            m = size args
+    Datatype{ dataPars = np, dataClause = cl
+            , dataArgOccurrences = occ } ->
+      d { dataPars = np - size args, dataClause = apply cl args
+        , dataArgOccurrences = drop (length args) occ
+        }
+    Record{ recPars = np, recConType = t, recClause = cl, recTel = tel
+          , recArgOccurrences = occ } ->
       d { recPars = np - size args, recConType = apply t args
         , recClause = apply cl args, recTel = apply tel args
+        , recArgOccurrences = drop (length args) occ
         }
     Constructor{ conPars = np } ->
       d { conPars = np - size args }
@@ -81,10 +106,6 @@
 instance Apply PrimFun where
     apply (PrimFun x ar def) args   = PrimFun x (ar - size args) $ \vs -> def (args ++ vs)
 
-instance Apply Clauses where
-    apply (Clauses c tc) args =
-      Clauses (apply c args) (apply tc args)
-
 instance Apply Clause where
     apply (Clause r tel perm ps b) args =
       Clause r (apply tel args) (apply perm args)
@@ -93,10 +114,11 @@
 instance Apply CompiledClauses where
   apply cc args = case cc of
     Fail     -> Fail
-    Done m t
-      | m >= len  -> Done (m - len) (substs ([ Var (fromIntegral i) []
-                                             | i <- [0..m - len - 1]] ++
-                                             map unArg args) t)
+    Done hs t
+      | length hs >= len -> Done (drop len hs)
+                                 (substs ([ Var (fromIntegral i) []
+                                          | i <- [0..length hs - len - 1]] ++
+                                          map unArg args) t)
       | otherwise -> __IMPOSSIBLE__
     Case n bs
       | n >= len  -> Case (n - len) (apply bs args)
@@ -113,14 +135,17 @@
   apply (Inverse inv) args = Inverse $ apply inv args
 
 instance Apply ClauseBody where
-    apply  b               []       = b
-    apply (Bind (Abs _ b)) (a:args) = subst (unArg a) b `apply` args
-    apply (NoBind b)       (_:args) = b `apply` args
-    apply (Body _)         (_:_)    = __IMPOSSIBLE__
-    apply  NoBody           _       = NoBody
+    apply  b                 []       = b
+    apply (Bind (Abs   _ b)) (a:args) = subst (unArg a) b `apply` args
+    apply (Bind (NoAbs _ b)) (_:args) = b `apply` args
+    apply (Body _)           (_:_)    = __IMPOSSIBLE__
+    apply  NoBody             _       = NoBody
 
 instance Apply DisplayTerm where
   apply (DTerm v)          args = DTerm $ apply v args
+  apply (DDot v)           args = DDot  $ apply v args
+  apply (DCon c vs)        args = DCon c $ vs ++ map (fmap DTerm) args
+  apply (DDef c vs)        args = DDef c $ vs ++ map (fmap DTerm) args
   apply (DWithApp v args') args = DWithApp v $ args' ++ args
 
 instance Apply t => Apply [t] where
@@ -157,7 +182,6 @@
 piApply :: Type -> Args -> Type
 piApply t []                      = t
 piApply (El _ (Pi  _ b)) (a:args) = absApp b (unArg a) `piApply` args
-piApply (El _ (Fun _ b)) (_:args) = b `piApply` args
 piApply _ _                       = __IMPOSSIBLE__
 
 -- | @(abstract args v) args --> v[args]@.
@@ -179,23 +203,29 @@
   abstract (ExtendTel arg tel') tel = ExtendTel arg $ fmap (`abstract` tel) tel'
 
 instance Abstract Definition where
-    abstract tel (Defn rel x t df m d) = Defn rel x (abstract tel t) df m (abstract tel d)
+    abstract tel (Defn rel x t df m c d) = Defn rel x (abstract tel t) df m c (abstract tel d)
 
 instance Abstract Defn where
   abstract tel d = case d of
     Axiom{} -> d
     Function{ funClauses = cs, funCompiled = cc, funInv = inv
-            , funProjection = mn } ->
+            , funProjection = Nothing, funArgOccurrences = occ } ->
       d { funClauses = abstract tel cs, funCompiled = abstract tel cc
         , funInv = abstract tel inv
-        , funProjection = fmap ((+) (size tel)) mn
-          -- index of record arg shifts back by number of new args
+        , funArgOccurrences = replicate (size tel) Negative ++ occ -- TODO: check occurrence
         }
-    Datatype{ dataPars = np, dataClause = cl } ->
-      d { dataPars = np + size tel, dataClause = abstract tel cl }
-    Record{ recPars = np, recConType = t, recClause = cl, recTel = tel' } ->
+    Function{ funClauses = cs, funCompiled = cc, funInv = inv
+            , funProjection = Just (r, n), funArgOccurrences = occ } ->
+      d { funProjection = Just (r, n + size tel) }
+    Datatype{ dataPars = np, dataClause = cl, dataArgOccurrences = occ } ->
+      d { dataPars = np + size tel, dataClause = abstract tel cl
+        , dataArgOccurrences = replicate (size tel) Negative ++ occ -- TODO: check occurrence
+        }
+    Record{ recPars = np, recConType = t, recClause = cl, recTel = tel'
+          , recArgOccurrences = occ } ->
       d { recPars = np + size tel, recConType = abstract tel t
         , recClause = abstract tel cl, recTel = abstract tel tel'
+        , recArgOccurrences = replicate (size tel) Negative ++ occ -- TODO: check occurrence
         }
     Constructor{ conPars = np } ->
       d { conPars = np + size tel }
@@ -206,10 +236,6 @@
     abstract tel (PrimFun x ar def) = PrimFun x (ar + n) $ \ts -> def $ genericDrop n ts
         where n = size tel
 
-instance Abstract Clauses where
-  abstract tel (Clauses c tc) =
-    Clauses (abstract tel c) (abstract tel tc)
-
 instance Abstract Clause where
   abstract tel (Clause r tel' perm ps b) =
     Clause r (abstract tel tel') (abstract tel perm)
@@ -217,7 +243,7 @@
 
 instance Abstract CompiledClauses where
   abstract tel Fail = Fail
-  abstract tel (Done m t) = Done (m + fromIntegral (size tel)) t
+  abstract tel (Done xs t) = Done (map (fmap fst) (telToList tel) ++ xs) t
   abstract tel (Case n bs) =
     Case (n + fromIntegral (size tel)) (abstract tel bs)
 
@@ -226,7 +252,7 @@
     Branches (abstract tel cs) (abstract tel ls) (abstract tel m)
 
 telVars EmptyTel                    = []
-telVars (ExtendTel arg (Abs x tel)) = fmap (const $ VarP x) arg : telVars tel
+telVars (ExtendTel arg tel) = fmap (const $ VarP $ absName tel) arg : telVars (unAbs tel)
 
 instance Abstract FunctionInverse where
   abstract tel NotInjective  = NotInjective
@@ -271,16 +297,16 @@
 instance Subst Term where
     substs us t =
         case t of
-            Var i vs   -> (us !!! i) `apply` substs us vs
-            Lam h m    -> Lam h $ substs us m
-            Def c vs   -> Def c $ substs us vs
-            Con c vs   -> Con c $ substs us vs
-            MetaV x vs -> MetaV x $ substs us vs
-            Lit l      -> Lit l
-            Pi a b     -> uncurry Pi $ substs us (a,b)
-            Fun a b    -> uncurry Fun $ substs us (a,b)
-            Sort s     -> Sort $ substs us s
-            DontCare   -> DontCare
+            Var i vs    -> (us !!! i) `apply` substs us vs
+            Lam h m     -> Lam h $ substs us m
+            Def c vs    -> Def c $ substs us vs
+            Con c vs    -> Con c $ substs us vs
+            MetaV x vs  -> MetaV x $ substs us vs
+            Lit l       -> Lit l
+            Level l     -> levelTm $ substs us l
+            Pi a b      -> uncurry Pi $ substs us (a,b)
+            Sort s      -> sortTm $ substs us s
+            DontCare mv -> DontCare $ substs us mv
         where
             []     !!! n = __IMPOSSIBLE__
             (x:xs) !!! 0 = x
@@ -295,11 +321,11 @@
             Def c vs   -> Def c $ substUnder n u vs
             Con c vs   -> Con c $ substUnder n u vs
             MetaV x vs -> MetaV x $ substUnder n u vs
+            Level l    -> levelTm $ substUnder n u l
             Lit l      -> Lit l
             Pi a b     -> uncurry Pi $ substUnder n u (a,b)
-            Fun a b    -> uncurry Fun $ substUnder n u (a,b)
-            Sort s     -> Sort $ substUnder n u s
-            DontCare   -> DontCare
+            Sort s     -> sortTm $ substUnder n u s
+            DontCare mv -> DontCare $ substUnder n u mv
 
 instance Subst Type where
     substs us (El s t) = substs us s `El` substs us t
@@ -307,25 +333,39 @@
 
 instance Subst Sort where
     substs us s = case s of
-      Type n     -> Type $ sub n
+      Type n     -> levelSort $ sub n
       Prop       -> Prop
-      Suc s      -> Suc $ sub s
-      Lub s1 s2  -> Lub (sub s1) (sub s2)
-      MetaS m as -> MetaS m (sub as)
       Inf        -> Inf
       DLub s1 s2 -> DLub (sub s1) (sub s2)
       where sub x = substs us x
 
     substUnder n u s = case s of
-      Type n     -> Type $ sub n
+      Type n     -> levelSort $ sub n
       Prop       -> Prop
-      Suc s      -> Suc $ sub s
-      Lub s1 s2  -> Lub (sub s1) (sub s2)
-      MetaS m as -> MetaS m (sub as)
       Inf        -> Inf
       DLub s1 s2 -> DLub (sub s1) (sub s2)
       where sub x = substUnder n u x
 
+instance Subst Level where
+  substs us (Max as) = Max $ substs us as
+  substUnder n u (Max as) = Max $ substUnder n u as
+
+instance Subst PlusLevel where
+  substs us l@ClosedLevel{} = l
+  substs us (Plus n l) = Plus n $ substs us l
+  substUnder n u l@ClosedLevel{} = l
+  substUnder n u (Plus m l) = Plus m $ substUnder n u l
+
+instance Subst LevelAtom where
+  substs us      (MetaLevel m vs)   = MetaLevel m    $ substs us vs
+  substs us      (BlockedLevel m v) = BlockedLevel m $ substs us v
+  substs us      (NeutralLevel v)   = UnreducedLevel $ substs us v
+  substs us      (UnreducedLevel v) = UnreducedLevel $ substs us v
+  substUnder n u (MetaLevel m vs)   = MetaLevel m    $ substUnder n u vs
+  substUnder n u (BlockedLevel m v) = BlockedLevel m $ substUnder n u v
+  substUnder n u (NeutralLevel v)   = UnreducedLevel $ substUnder n u v
+  substUnder n u (UnreducedLevel v) = UnreducedLevel $ substUnder n u v
+
 instance Subst Pattern where
   substs us p = case p of
     VarP s       -> VarP s
@@ -344,8 +384,14 @@
 
 instance Subst DisplayTerm where
   substs us      (DTerm v)        = DTerm $ substs us v
+  substs us      (DDot v)         = DDot  $ substs us v
+  substs us      (DCon c vs)      = DCon c $ substs us vs
+  substs us      (DDef c vs)      = DDef c $ substs us vs
   substs us      (DWithApp vs ws) = uncurry DWithApp $ substs us (vs, ws)
   substUnder n u (DTerm v)        = DTerm $ substUnder n u v
+  substUnder n u (DDot  v)        = DDot  $ substUnder n u v
+  substUnder n u (DCon c vs)      = DCon c $ substUnder n u vs
+  substUnder n u (DDef c vs)      = DDef c $ substUnder n u vs
   substUnder n u (DWithApp vs ws) = uncurry DWithApp $ substUnder n u (vs, ws)
 
 instance Subst a => Subst (Tele a) where
@@ -355,8 +401,10 @@
   substUnder n u (ExtendTel t tel) = uncurry ExtendTel $ substUnder n u (t, tel)
 
 instance Subst a => Subst (Abs a) where
-    substs us      (Abs x t) = Abs x $ substs (Var 0 [] : raise 1 us) t
-    substUnder n u (Abs x t) = Abs x $ substUnder (n + 1) u t
+    substs us      (Abs   x t) = Abs   x $ substs (Var 0 [] : raise 1 us) t
+    substs us      (NoAbs x t) = NoAbs x $ substs us t
+    substUnder n u (Abs   x t) = Abs   x $ substUnder (n + 1) u t
+    substUnder n u (NoAbs x t) = NoAbs x $ substUnder n u t
 
 instance Subst a => Subst (Arg a) where
     substs us      = fmap (substs us)
@@ -377,21 +425,20 @@
 instance Subst ClauseBody where
     substs us (Body t)        = Body $ substs us t
     substs us (Bind b)        = Bind $ substs us b
-    substs us (NoBind b)      = NoBind $ substs us b
     substs _   NoBody         = NoBody
     substUnder n u (Body t)   = Body $ substUnder n u t
     substUnder n u (Bind b)   = Bind $ substUnder n u b
-    substUnder n u (NoBind b) = NoBind $ substUnder n u b
     substUnder _ _   NoBody   = NoBody
 
--- | Instantiate an abstraction
-absApp :: Subst t => Abs t -> Term -> t
-absApp (Abs _ v) u = subst u v
-
 -- | Add @k@ to index of each open variable in @x@.
 class Raise t where
     raiseFrom :: Nat -> Nat -> t -> t
+    renameFrom :: Nat -> (Nat -> Nat) -> t -> t
 
+instance Raise () where
+  raiseFrom  _ _ _ = ()
+  renameFrom _ _ _ = ()
+
 instance Raise Term where
     raiseFrom m k v =
         case v of
@@ -402,28 +449,120 @@
             Def c vs        -> Def c $ rf vs
             Con c vs        -> Con c $ rf vs
             MetaV x vs      -> MetaV x $ rf vs
+            Level l         -> Level $ rf l
             Lit l           -> Lit l
             Pi a b          -> uncurry Pi $ rf (a,b)
-            Fun a b         -> uncurry Fun $ rf (a,b)
             Sort s          -> Sort $ rf s
-            DontCare        -> DontCare
+            DontCare mv     -> DontCare $ rf mv
         where
             rf x = raiseFrom m k x
 
+    renameFrom m k v =
+        case v of
+            Var i vs
+                | i < m     -> Var i $ rf vs
+                | otherwise -> Var (k (i - m) + m) $ rf vs
+            Lam h m         -> Lam h $ rf m
+            Def c vs        -> Def c $ rf vs
+            Con c vs        -> Con c $ rf vs
+            MetaV x vs      -> MetaV x $ rf vs
+            Level l         -> Level $ rf l
+            Lit l           -> Lit l
+            Pi a b          -> uncurry Pi $ rf (a,b)
+            Sort s          -> Sort $ rf s
+            DontCare mv     -> DontCare $ rf mv
+        where
+            rf x = renameFrom m k x
+
 instance Raise Type where
     raiseFrom m k (El s t) = raiseFrom m k s `El` raiseFrom m k t
+    renameFrom m k (El s t) = renameFrom m k s `El` renameFrom m k t
 
 instance Raise Sort where
     raiseFrom m k s = case s of
       Type n     -> Type $ rf n
       Prop       -> Prop
-      Suc s      -> Suc $ rf s
-      Lub s1 s2  -> Lub (rf s1) (rf s2)
-      MetaS m as -> MetaS m (rf as)
       Inf        -> Inf
       DLub s1 s2 -> DLub (rf s1) (rf s2)
       where rf x = raiseFrom m k x
 
+    renameFrom m k s = case s of
+      Type n     -> Type $ rf n
+      Prop       -> Prop
+      Inf        -> Inf
+      DLub s1 s2 -> DLub (rf s1) (rf s2)
+      where rf x = renameFrom m k x
+
+instance Raise Level where
+  raiseFrom m k (Max as) = Max $ raiseFrom m k as
+  renameFrom m k (Max as) = Max $ renameFrom m k as
+
+instance Raise PlusLevel where
+  raiseFrom m k l@ClosedLevel{} = l
+  raiseFrom m k (Plus n l) = Plus n $ raiseFrom m k l
+  renameFrom m k l@ClosedLevel{} = l
+  renameFrom m k (Plus n l) = Plus n $ renameFrom m k l
+
+instance Raise LevelAtom where
+  raiseFrom m k l = case l of
+    MetaLevel n vs   -> MetaLevel n $ raiseFrom m k vs
+    NeutralLevel v   -> NeutralLevel $ raiseFrom m k v
+    BlockedLevel n v -> BlockedLevel n $ raiseFrom m k v
+    UnreducedLevel v -> UnreducedLevel $ raiseFrom m k v
+  renameFrom m k l = case l of
+    MetaLevel n vs   -> MetaLevel n $ renameFrom m k vs
+    NeutralLevel v   -> NeutralLevel $ renameFrom m k v
+    BlockedLevel n v -> BlockedLevel n $ renameFrom m k v
+    UnreducedLevel v -> UnreducedLevel $ renameFrom m k v
+
+instance Raise Constraint where
+  raiseFrom m k c = case c of
+    ValueCmp cmp a u v       -> ValueCmp cmp (rf a) (rf u) (rf v)
+    ElimCmp ps a v e1 e2     -> ElimCmp ps (rf a) (rf v) (rf e1) (rf e2)
+    TypeCmp cmp a b          -> TypeCmp cmp (rf a) (rf b)
+    TelCmp a b cmp tel1 tel2 -> TelCmp (rf a) (rf b) cmp (rf tel1) (rf tel2)
+    SortCmp cmp s1 s2        -> SortCmp cmp (rf s1) (rf s2)
+    LevelCmp cmp l1 l2       -> LevelCmp cmp (rf l1) (rf l2)
+    Guarded c cs             -> Guarded (rf c) cs
+    IsEmpty a                -> IsEmpty (rf a)
+    FindInScope{}            -> c
+    UnBlock{}                -> c
+    where
+      rf x = raiseFrom m k x
+  renameFrom m k c = case c of
+    ValueCmp cmp a u v       -> ValueCmp cmp (rf a) (rf u) (rf v)
+    ElimCmp ps a v e1 e2     -> ElimCmp ps (rf a) (rf v) (rf e1) (rf e2)
+    TypeCmp cmp a b          -> TypeCmp cmp (rf a) (rf b)
+    TelCmp a b cmp tel1 tel2 -> TelCmp (rf a) (rf b) cmp (rf tel1) (rf tel2)
+    SortCmp cmp s1 s2        -> SortCmp cmp (rf s1) (rf s2)
+    LevelCmp cmp l1 l2       -> LevelCmp cmp (rf l1) (rf l2)
+    Guarded c cs             -> Guarded (rf c) cs
+    IsEmpty a                -> IsEmpty (rf a)
+    FindInScope{}            -> c
+    UnBlock{}                -> c
+    where
+      rf x = renameFrom m k x
+
+instance Raise Elim where
+  raiseFrom m k e = case e of
+    Apply v -> Apply (raiseFrom m k v)
+    Proj{}  -> e
+  renameFrom m k e = case e of
+    Apply v -> Apply (renameFrom m k v)
+    Proj{}  -> e
+
+instance Raise ClauseBody where
+  raiseFrom m k b = case b of
+    Body v   -> Body $ rf v
+    NoBody   -> NoBody
+    Bind b   -> Bind $ rf b
+    where rf x = raiseFrom m k x
+  renameFrom m k b = case b of
+    Body v   -> Body $ rf v
+    NoBody   -> NoBody
+    Bind b   -> Bind $ rf b
+    where rf x = renameFrom m k x
+
 -- Andreas, 2010-09-09 raise dot patterns and type info embedded in a pattern
 instance Raise Pattern where
     raiseFrom m k p = case p of
@@ -431,66 +570,101 @@
       ConP c mt ps -> ConP c (raiseFrom m k mt) (raiseFrom m k ps)
       VarP x -> p
       LitP l -> p
+    renameFrom m k p = case p of
+      DotP t -> DotP $ renameFrom m k t
+      ConP c mt ps -> ConP c (renameFrom m k mt) (renameFrom m k ps)
+      VarP x -> p
+      LitP l -> p
 
 instance Raise a => Raise (Tele a) where
     raiseFrom m k EmptyTel          = EmptyTel
     raiseFrom m k (ExtendTel a tel) = uncurry ExtendTel $ raiseFrom m k (a, tel)
+    renameFrom m k EmptyTel          = EmptyTel
+    renameFrom m k (ExtendTel a tel) = uncurry ExtendTel $ renameFrom m k (a, tel)
 
 instance Raise DisplayForm where
   raiseFrom m k (Display n ps v) = Display n (raiseFrom (m + 1) k ps)
                                              (raiseFrom (m + n) k v)
+  renameFrom m k (Display n ps v) = Display n (renameFrom (m + 1) k ps)
+                                             (renameFrom (m + n) k v)
 
 instance Raise DisplayTerm where
   raiseFrom m k (DWithApp xs ys) = uncurry DWithApp $ raiseFrom m k (xs, ys)
   raiseFrom m k (DTerm v)        = DTerm $ raiseFrom m k v
+  raiseFrom m k (DDot  v)        = DDot  $ raiseFrom m k v
+  raiseFrom m k (DCon c vs)      = DCon c $ raiseFrom m k vs
+  raiseFrom m k (DDef c vs)      = DDef c $ raiseFrom m k vs
+  renameFrom m k (DWithApp xs ys) = uncurry DWithApp $ renameFrom m k (xs, ys)
+  renameFrom m k (DTerm v)        = DTerm $ renameFrom m k v
+  renameFrom m k (DDot  v)        = DDot  $ renameFrom m k v
+  renameFrom m k (DCon c vs)      = DCon c $ renameFrom m k vs
+  renameFrom m k (DDef c vs)      = DDef c $ renameFrom m k vs
 
 instance Raise t => Raise (Abs t) where
-    raiseFrom m k = fmap (raiseFrom (m + 1) k)
+    raiseFrom m k (Abs x v)   = Abs x $ raiseFrom (m + 1) k v
+    raiseFrom m k (NoAbs x v) = NoAbs x $ raiseFrom m k v
+    renameFrom m k (Abs x v)   = Abs x $ renameFrom (m + 1) k v
+    renameFrom m k (NoAbs x v) = NoAbs x $ renameFrom m k v
 
 instance Raise t => Raise (Arg t) where
     raiseFrom m k = fmap (raiseFrom m k)
+    renameFrom m k = fmap (renameFrom m k)
 
 instance Raise t => Raise (Blocked t) where
     raiseFrom m k = fmap (raiseFrom m k)
+    renameFrom m k = fmap (renameFrom m k)
 
 instance Raise t => Raise [t] where
     raiseFrom m k = fmap (raiseFrom m k)
+    renameFrom m k = fmap (renameFrom m k)
 
 instance Raise t => Raise (Maybe t) where
     raiseFrom m k = fmap (raiseFrom m k)
+    renameFrom m k = fmap (renameFrom m k)
 
 instance Raise v => Raise (Map k v) where
     raiseFrom m k = fmap (raiseFrom m k)
+    renameFrom m k = fmap (renameFrom m k)
 
 instance (Raise a, Raise b) => Raise (a,b) where
     raiseFrom m k (x,y) = (raiseFrom m k x, raiseFrom m k y)
+    renameFrom m k (x,y) = (renameFrom m k x, renameFrom m k y)
 
 raise :: Raise t => Nat -> t -> t
 raise = raiseFrom 0
 
-data TelView = TelV Telescope Type
+rename :: Raise t => (Nat -> Nat) -> t -> t
+rename = renameFrom 0
 
+data TelV a = TelV (Tele (Arg a)) a
+  deriving (Typeable, Data, Show, Eq, Ord, Functor)
+
+type TelView = TelV Type
+-- data TelView = TelV Telescope Type
+
+telFromList :: [Arg (String, Type)] -> Telescope
+telFromList = foldr (\(Arg h r (x, a)) -> ExtendTel (Arg h r a) . Abs x) EmptyTel
+
+telToList :: Telescope -> [Arg (String, Type)]
+telToList EmptyTel = []
+telToList (ExtendTel arg tel) = fmap ((,) $ absName tel) arg : telToList (absBody tel)
+
 telView' :: Type -> TelView
 telView' t = case unEl t of
-  Pi a (Abs x b)  -> absV a x $ telView' b
-  Fun a b         -> absV a "_" $ telView' (raise 1 b)
-  _               -> TelV EmptyTel t
+  Pi a b  -> absV a (absName b) $ telView' (absBody b)
+  _       -> TelV EmptyTel t
   where
     absV a x (TelV tel t) = TelV (ExtendTel a (Abs x tel)) t
 
 telePi :: Telescope -> Type -> Type
 telePi  EmptyTel         t = t
-telePi (ExtendTel u tel) t = el $ fn u b
+telePi (ExtendTel u tel) t = el $ Pi u (reAbs b)
   where
     el = El (dLub s1 s2)
     b = fmap (flip telePi t) tel
     s1 = getSort $ unArg u
     s2 = fmap getSort b
 
-    fn a b
-      | 0 `freeIn` absBody b = Pi a b
-      | otherwise            = Fun a $ absApp b __IMPOSSIBLE__
-
 -- | Everything will be a pi.
 telePi_ :: Telescope -> Type -> Type
 telePi_  EmptyTel        t = t
@@ -501,12 +675,174 @@
     s1 = getSort $ unArg u
     s2 = fmap getSort b
 
+teleLam :: Telescope -> Term -> Term
+teleLam  EmptyTel	  t = t
+teleLam (ExtendTel u tel) t = Lam (argHiding u) $ flip teleLam t <$> tel
+
+-- | Dependent least upper bound, to assign a level to expressions
+--   like @forall i -> Set i@.
+--
+--   @dLub s1 \i.s2 = \omega@ if @i@ appears in the rigid variables of @s2@.
 dLub :: Sort -> Abs Sort -> Sort
-dLub s1 s2
-  | 0 `Set.member` rv = Inf
-  | 0 `Set.member` fv = DLub s1 s2
-  | otherwise         = sLub s1 (absApp s2 __IMPOSSIBLE__)
+dLub s1 (NoAbs _ s2) = sLub s1 s2
+dLub s1 b@(Abs _ s2) = case occurrence 0 $ freeVars s2 of
+  Flexible      -> DLub s1 b
+  NoOccurrence  -> sLub s1 (absApp b __IMPOSSIBLE__)
+  StronglyRigid -> Inf
+  WeaklyRigid   -> Inf
+
+-- Functions on abstractions ----------------------------------------------
+--   and things we couldn't do before we could define 'absBody'
+
+-- | Instantiate an abstraction
+absApp :: Subst t => Abs t -> Term -> t
+absApp (Abs   _ v) u = subst u v
+absApp (NoAbs _ v) _ = v
+
+absBody :: Raise t => Abs t -> t
+absBody (Abs   _ v) = v
+absBody (NoAbs _ v) = raise 1 v
+
+mkAbs :: (Raise a, Free a) => String -> a -> Abs a
+mkAbs x v | 0 `freeIn` v = Abs x v
+          | otherwise    = NoAbs x (raise (-1) v)
+
+reAbs :: (Raise a, Free a) => Abs a -> Abs a
+reAbs (NoAbs x v) = NoAbs x v
+reAbs (Abs x v)   = mkAbs x v
+
+deriving instance (Raise a, Eq a) => Eq (Tele a)
+deriving instance (Raise a, Ord a) => Ord (Tele a)
+
+deriving instance Eq Sort
+deriving instance Ord Sort
+deriving instance Eq Type
+deriving instance Ord Type
+deriving instance Ord Term
+deriving instance Eq Level
+deriving instance Ord Level
+deriving instance Eq PlusLevel
+deriving instance Ord LevelAtom
+deriving instance Eq Elim
+deriving instance Ord Elim
+
+deriving instance Eq Constraint
+
+instance Ord PlusLevel where
+  compare ClosedLevel{} Plus{}            = LT
+  compare Plus{} ClosedLevel{}            = GT
+  compare (ClosedLevel n) (ClosedLevel m) = compare n m
+  -- Compare on the atom first. Makes most sense for levelMax.
+  compare (Plus n a) (Plus m b)           = compare (a,n) (b,m)
+
+instance Eq LevelAtom where
+  (==) = (==) `on` unLevelAtom
+
+-- | Syntactic equality, ignores stuff below @DontCare@.
+instance Eq Term where
+  Var x vs   == Var x' vs'   = x == x' && vs == vs'
+  Lam h v    == Lam h' v'    = h == h' && v  == v'
+  Lit l      == Lit l'       = l == l'
+  Def x vs   == Def x' vs'   = x == x' && vs == vs'
+  Con x vs   == Con x' vs'   = x == x' && vs == vs'
+  Pi a b     == Pi a' b'     = a == a' && b == b'
+  Sort s     == Sort s'      = s == s'
+  Level l    == Level l'     = l == l'
+  MetaV m vs == MetaV m' vs' = m == m' && vs == vs'
+  DontCare _ == DontCare _   = True
+  _          == _            = False
+
+instance (Raise a, Eq a) => Eq (Abs a) where
+  NoAbs _ a == NoAbs _ b = a == b
+  Abs   _ a == Abs   _ b = a == b
+  a         == b         = absBody a == absBody b
+
+instance (Raise a, Ord a) => Ord (Abs a) where
+  NoAbs _ a `compare` NoAbs _ b = a `compare` b
+  Abs   _ a `compare` Abs   _ b = a `compare` b
+  a         `compare` b         = absBody a `compare` absBody b
+
+-- Level stuff ------------------------------------------------------------
+
+sLub :: Sort -> Sort -> Sort
+sLub s Prop = s
+sLub Prop s = s
+sLub Inf _ = Inf
+sLub _ Inf = Inf
+sLub (Type (Max as)) (Type (Max bs)) = Type $ levelMax (as ++ bs)
+sLub (DLub a b) c = DLub (sLub a c) b
+sLub a (DLub b c) = DLub (sLub a b) c
+
+lvlView :: Term -> Level
+lvlView (Level l)       = l
+lvlView (Sort (Type l)) = l
+lvlView v               = Max [Plus 0 $ UnreducedLevel v]
+
+levelMax :: [PlusLevel] -> Level
+levelMax as0 = Max $ ns ++ List.sort bs
   where
-    vs = freeVars (absBody s2)
-    fv = flexibleVars vs
-    rv = rigidVars vs
+    as = Prelude.concatMap expand as0
+    ns = case [ n | ClosedLevel n <- as, n > 0 ] of
+      []  -> []
+      ns  -> [ ClosedLevel n | n <- [Prelude.maximum ns], n > leastB ]
+    bs = subsume [ b | b@Plus{} <- as ]
+    leastB | null bs   = 0
+           | otherwise = Prelude.minimum [ n | Plus n _ <- bs ]
+
+    expand l@ClosedLevel{} = [l]
+    expand (Plus n l) = map (plus n) $ expand0 $ expandAtom l
+
+    expand0 [] = [ClosedLevel 0]
+    expand0 as = as
+
+    expandAtom (BlockedLevel _ (Level (Max as)))       = as
+    expandAtom (NeutralLevel   (Level (Max as)))       = as
+    expandAtom (UnreducedLevel (Level (Max as)))       = as
+    expandAtom (BlockedLevel _ (Sort (Type (Max as)))) = as
+    expandAtom (NeutralLevel   (Sort (Type (Max as)))) = as
+    expandAtom (UnreducedLevel (Sort (Type (Max as)))) = as
+    expandAtom l                                       = [Plus 0 l]
+
+    plus n (ClosedLevel m) = ClosedLevel (n + m)
+    plus n (Plus m l)      = Plus (n + m) l
+
+    subsume (ClosedLevel{} : _) = __IMPOSSIBLE__
+    subsume [] = []
+    subsume (Plus n a : bs)
+      | not $ null ns = subsume bs
+      | otherwise     = Plus n a : subsume [ b | b@(Plus _ a') <- bs, a /= a' ]
+      where
+        ns = [ m | Plus m a'  <- bs, a == a', m > n ]
+
+sortTm :: Sort -> Term
+sortTm (Type l) = Sort $ levelSort l
+sortTm s        = Sort s
+
+levelSort :: Level -> Sort
+levelSort (Max as)
+  | List.any isInf as = Inf
+  where
+    isInf ClosedLevel{}        = False
+    isInf (Plus _ l)           = infAtom l
+    infAtom (NeutralLevel a)   = infTm a
+    infAtom (UnreducedLevel a) = infTm a
+    infAtom MetaLevel{}        = False
+    infAtom BlockedLevel{}     = False
+    infTm (Sort Inf)           = True
+    infTm _                    = False
+levelSort l =
+  case levelTm l of
+    Sort s -> s
+    _      -> Type l
+
+levelTm :: Level -> Term
+levelTm l =
+  case l of
+    Max [Plus 0 l] -> unLevelAtom l
+    _              -> Level l
+
+unLevelAtom (MetaLevel x vs)   = MetaV x vs
+unLevelAtom (NeutralLevel v)   = v
+unLevelAtom (UnreducedLevel v) = v
+unLevelAtom (BlockedLevel _ v) = v
+
diff --git a/src/full/Agda/TypeChecking/Telescope.hs b/src/full/Agda/TypeChecking/Telescope.hs
--- a/src/full/Agda/TypeChecking/Telescope.hs
+++ b/src/full/Agda/TypeChecking/Telescope.hs
@@ -3,8 +3,6 @@
 module Agda.TypeChecking.Telescope where
 
 import Control.Applicative
-import Data.Set (Set)
-import qualified Data.Set as Set
 import Data.List
 
 import Agda.Syntax.Common
@@ -18,13 +16,16 @@
 import Agda.Utils.Permutation
 import Agda.Utils.Size
 import Agda.Utils.Tuple
+import Agda.Utils.VarSet (VarSet)
+import qualified Agda.Utils.VarSet as Set
 
 #include "../undefined.h"
 import Agda.Utils.Impossible
 
+-- TODO: use rename instead of substs
 -- | The permutation should permute the corresponding telescope. (left-to-right list)
-rename :: Subst t => Permutation -> t -> t
-rename p = substs (renaming p)
+renameP :: Subst t => Permutation -> t -> t
+renameP p = substs (renaming p)
 
 -- | If @permute π : [a]Γ -> [a]Δ@, then @substs (renaming π) : Term Γ -> Term Δ@
 renaming :: Permutation -> [Term]
@@ -48,14 +49,17 @@
 
 -- | Order a flattened telescope in the correct dependeny order: Γ ->
 --   Permutation (Γ -> Γ~)
-reorderTel :: [Arg Type] -> Permutation
-reorderTel tel = case topoSort comesBefore tel' of
-  Nothing -> __IMPOSSIBLE__
-  Just p  -> p
+reorderTel :: [Arg Type] -> Maybe Permutation
+reorderTel tel = topoSort comesBefore tel'
   where
     tel' = reverse $ zip [0..] $ reverse tel
     (i, _) `comesBefore` (_, a) = i `freeIn` unEl (unArg a) -- a tiny bit unsafe
 
+reorderTel_ :: [Arg Type] -> Permutation
+reorderTel_ tel = case reorderTel tel of
+  Nothing -> __IMPOSSIBLE__
+  Just p  -> p
+
 -- | Unflatten: turns a flattened telescope into a proper telescope. Must be
 --   properly ordered.
 unflattenTel :: [String] -> [Arg Type] -> Telescope
@@ -89,7 +93,7 @@
 
 -- | Split a telescope into the part that defines the given variables and the
 --   part that doesn't.
-splitTelescope :: Set Nat -> Telescope -> SplitTel
+splitTelescope :: VarSet -> Telescope -> SplitTel
 splitTelescope fv tel = SplitTel tel1 tel2 perm
   where
     names = teleNames tel
@@ -103,11 +107,11 @@
     isC   = [0..n - 1] \\ is
     perm0 = Perm n $ is ++ isC
 
-    permuteTel p ts = rename (reverseP p) (permute p ts)
+    permuteTel p ts = renameP (reverseP p) (permute p ts)
 
     ts1   = permuteTel perm0 ts0
 
-    perm1 = reorderTel ts1
+    perm1 = reorderTel_ ts1
 
     ts2   = permuteTel perm1 ts1
 
@@ -119,43 +123,27 @@
     m         = genericLength $ takeWhile (`notElem` is) (reverse js)
     (tel1, tel2) = telFromList -*- telFromList $ genericSplitAt (n - m) $ telToList tel'
 
-{- Andreas 2010-10-01: this comment seems stale.  Where is the unsafe variant?
--- | A safe variant of telView.
-
-OLD CODE:
-telView :: MonadTCM tcm => Type -> tcm TelView
-telView t = do
-  t <- reduce t
-  case unEl t of
-    Pi a (Abs x b) -> absV a x   <$> telView b
-    Fun a b	   -> absV a "_" <$> telView (raise 1 b)
-    _		   -> return $ TelV EmptyTel t
-  where
-    absV a x (TelV tel t) = TelV (ExtendTel a (Abs x tel)) t
--}
-telView :: MonadTCM tcm => Type -> tcm TelView
+telView :: Type -> TCM TelView
 telView = telViewUpTo (-1)
 
 -- | @telViewUpTo n t@ takes off the first @n@ function types of @t@.
 -- Takes off all if $n < 0$.
-telViewUpTo :: MonadTCM tcm => Int -> Type -> tcm TelView
+telViewUpTo :: Int -> Type -> TCM TelView
 telViewUpTo 0 t = return $ TelV EmptyTel t
 telViewUpTo n t = do
   t <- reduce t
   case unEl t of
-    Pi a (Abs x b) -> absV a x   <$> telViewUpTo (n-1) b
-    Fun a b	   -> absV a "_" <$> telViewUpTo (n-1) (raise 1 b)
-    _		   -> return $ TelV EmptyTel t
+    Pi a b -> absV a (absName b) <$> telViewUpTo (n - 1) (absBody b)
+    _      -> return $ TelV EmptyTel t
   where
     absV a x (TelV tel t) = TelV (ExtendTel a (Abs x tel)) t
 
 -- | A safe variant of piApply.
 
-piApplyM :: MonadTCM tcm => Type -> Args -> tcm Type
+piApplyM :: Type -> Args -> TCM Type
 piApplyM t []           = return t
 piApplyM t (arg : args) = do
   t <- reduce t
   case (t, arg) of
     (El _ (Pi  _ b), arg) -> absApp b (unArg arg) `piApplyM` args
-    (El _ (Fun _ b), _  ) -> b `piApplyM` args
     _                     -> __IMPOSSIBLE__
diff --git a/src/full/Agda/TypeChecking/Test/Generators.hs b/src/full/Agda/TypeChecking/Test/Generators.hs
--- a/src/full/Agda/TypeChecking/Test/Generators.hs
+++ b/src/full/Agda/TypeChecking/Test/Generators.hs
@@ -8,7 +8,6 @@
 import Control.Applicative
 import Control.Monad
 import Control.Monad.State
-import qualified Data.Set as Set
 import qualified Data.List as List (sort, nub)
 import Agda.Utils.QuickCheck hiding (Args)
 
@@ -23,6 +22,7 @@
 import Agda.Utils.TestHelpers
 import Agda.Utils.Monad
 import Agda.Utils.QuickCheck hiding (Args)
+import qualified Agda.Utils.VarSet as Set
 
 #include "../../undefined.h"
 import Agda.Utils.Impossible
@@ -252,7 +252,6 @@
 	, (sortF, Sort <$> genC conf)
 	, (lamF,  genLam)
 	, (piF,	  genPi)
-	, (funF,  genFun)
 	]
     where
       defs    = tcDefinedNames conf
@@ -276,7 +275,6 @@
 	    | otherwise = freq (lamFreq  . termFreqs)
       sortF = freq (sortFreq . termFreqs)
       piF   = freq (piFreq   . termFreqs)
-      funF  = freq (funFreq  . termFreqs)
 
       genLam :: Gen Term
       genLam = Lam <$> genC conf <*> genC (isntTypeConf $ decrConf conf)
@@ -284,9 +282,6 @@
       genPi :: Gen Term
       genPi = uncurry Pi <$> genC conf
 
-      genFun :: Gen Term
-      genFun = uncurry Fun <$> genC conf
-
       genVar, genDef, genCon :: Gen Args -> Gen Term
       genVar args = Var <$> elements vars <*> args
       genDef args = Def <$> elements defs <*> args
@@ -383,7 +378,6 @@
 instance ShrinkC Literal Literal where
   shrinkC _ (LitInt _ 0) = []
   shrinkC conf l	 = LitInt noRange 0 : case l of
-      LitLevel  r n -> LitLevel  r <$> shrink n
       LitInt    r n -> LitInt    r <$> shrink n
       LitString r s -> LitString r <$> shrinkC conf s
       LitChar   r c -> LitChar   r <$> shrinkC conf c
@@ -398,11 +392,13 @@
 
 instance ShrinkC Hiding Hiding where
   shrinkC _ Hidden    = [NotHidden]
+  shrinkC _ Instance  = [Instance]
   shrinkC _ NotHidden = []
   noShrink = id
 
 instance ShrinkC a b => ShrinkC (Abs a) (Abs b) where
-  shrinkC conf (Abs s x) = Abs s <$> shrinkC (extendConf conf) x
+  shrinkC conf (NoAbs s x) = NoAbs s <$> shrinkC conf x
+  shrinkC conf (Abs   s x) = Abs s <$> shrinkC (extendConf conf) x
   noShrink = fmap noShrink
 
 instance ShrinkC a b => ShrinkC (Arg a) (Arg b) where
@@ -419,10 +415,7 @@
 instance ShrinkC Sort Sort where
   shrinkC conf Prop = []
   shrinkC conf s = Prop : case s of
-    Type n     -> Type <$> shrinkC conf n
-    Lub s1 s2  -> s1 : s2 : (uncurry Lub <$> shrinkC conf (s1, s2))
-    Suc s      -> s : (Suc <$> shrinkC conf s)
-    MetaS m _  -> []
+    Type n     -> [] -- No Level instance yet -- Type <$> shrinkC conf n
     Prop       -> __IMPOSSIBLE__
     Inf        -> []
     DLub s1 s2 -> __IMPOSSIBLE__
@@ -439,9 +432,9 @@
   noShrink = id
 
 instance ShrinkC Term Term where
-  shrinkC conf (DontCare)  = []
+  shrinkC conf (DontCare _)  = []
   shrinkC conf (Sort Prop) = []
-  shrinkC conf t	   = filter validType $ DontCare : case t of
+  shrinkC conf t	   = filter validType $ case t of
     Var i args   -> map unArg args ++
 		    (uncurry Var <$> shrinkC conf (VarName i, NoType args))
     Def d args   -> map unArg args ++
@@ -449,14 +442,13 @@
     Con d args   -> map unArg args ++
 		    (uncurry Con <$> shrinkC conf (ConName d, NoType args))
     Lit l	 -> Lit <$> shrinkC conf l
+    Level l      -> [] -- TODO
     Lam h b      -> killAbs b : (uncurry Lam <$> shrinkC conf (h, b))
     Pi a b       -> unEl (unArg a) : unEl (killAbs b) :
 		    (uncurry Pi <$> shrinkC conf (a, b))
-    Fun a b      -> unEl (unArg a) : unEl b :
-		    (uncurry Fun <$> shrinkC conf (a, b))
     Sort s       -> Sort <$> shrinkC conf s
     MetaV m args -> map unArg args ++ (MetaV m <$> shrinkC conf (NoType args))
-    DontCare     -> __IMPOSSIBLE__
+    DontCare _   -> []
     where
       validType t
 	| not (tcIsType conf) = True
@@ -468,25 +460,26 @@
   noShrink = id
 
 killAbs :: KillVar a => Abs a -> a
-killAbs (Abs _ x) = killVar 0 x
+killAbs (Abs   _ x) = killVar 0 x
+killAbs (NoAbs _ x) = x
 
 class KillVar a where
   killVar :: Nat -> a -> a
 
 instance KillVar Term where
   killVar i t = case t of
-    Var j args | j == i	   -> DontCare
+    Var j args | j == i	   -> DontCare (Var j [])
 	       | j >  i	   -> Var (j - 1) $ killVar i args
 	       | otherwise -> Var j	  $ killVar i args
     Def c args		   -> Def c	  $ killVar i args
     Con c args		   -> Con c	  $ killVar i args
     Lit l		   -> Lit l
+    Level l                -> Level l -- TODO
     Sort s		   -> Sort s
     Lam h b		   -> Lam h	  $ killVar i b
     Pi a b		   -> uncurry Pi  $ killVar i (a, b)
-    Fun a b		   -> uncurry Fun $ killVar i (a, b)
     MetaV m args	   -> MetaV m	  $ killVar i args
-    DontCare               -> DontCare
+    DontCare mv            -> DontCare    $ killVar i mv
 
 instance KillVar Type where
   killVar i (El s t) = El s $ killVar i t
@@ -503,6 +496,9 @@
 
 instance KillVar a => KillVar [a] where
   killVar i = map (killVar i)
+
+instance KillVar a => KillVar (Maybe a) where
+  killVar i = fmap (killVar i)
 
 instance (KillVar a, KillVar b) => KillVar (a, b) where
   killVar i (x, y) = (killVar i x, killVar i y)
diff --git a/src/full/Agda/TypeChecking/Tests.hs b/src/full/Agda/TypeChecking/Tests.hs
--- a/src/full/Agda/TypeChecking/Tests.hs
+++ b/src/full/Agda/TypeChecking/Tests.hs
@@ -1,6 +1,6 @@
 module Agda.TypeChecking.Tests where
 
-import qualified Data.Set as Set
+import qualified Agda.Utils.VarSet as Set
 import Agda.Utils.QuickCheck
 
 import Agda.Syntax.Internal
@@ -41,7 +41,7 @@
 prop_reorderTelStable :: TermConfiguration -> Property
 prop_reorderTelStable conf =
   forAll (genC conf) $ \tel ->
-  reorderTel (flattenTel tel) == idP (size tel)
+  reorderTel (flattenTel tel) == Just (idP (size tel))
 
 -- | The result of splitting a telescope is well-scoped.
 prop_splitTelescopeScope :: TermConfiguration -> Property
diff --git a/src/full/Agda/TypeChecking/UniversePolymorphism.hs b/src/full/Agda/TypeChecking/UniversePolymorphism.hs
--- a/src/full/Agda/TypeChecking/UniversePolymorphism.hs
+++ b/src/full/Agda/TypeChecking/UniversePolymorphism.hs
@@ -13,76 +13,17 @@
 import Agda.TypeChecking.Pretty
 import Agda.TypeChecking.Reduce
 import Agda.TypeChecking.Monad.Builtin
+import Agda.TypeChecking.Conversion
 import qualified Agda.Utils.Warshall as W
 
 import Agda.Utils.Impossible
 
 #include "../undefined.h"
 
-mlevel :: MonadTCM tcm => tcm (Maybe Term)
-mlevel = liftTCM $ (Just <$> primLevel) `catchError` \_ -> return Nothing
-
-compareLevel :: MonadTCM tcm => Comparison -> Term -> Term -> tcm Constraints
-compareLevel cmp u v = do
-  reportSDoc "tc.conv.level" 10 $ vcat
-    [ text "Comparing levels"
-    , nest 2 $ sep [ prettyTCM u <+> prettyTCM cmp
-                   , prettyTCM v
-                   ]
-    ]
-  u <- reduce u
-  v <- reduce v
-  reportSDoc "tc.conv.level" 15 $
-      nest 2 $ sep [ text (show u) <+> prettyTCM cmp
-                   , text (show v)
-                   ]
-  let unMax (Max [a]) = a
-      unMax _         = __IMPOSSIBLE__
-  l1' <- unMax <$> levelView u
-  l2' <- unMax <$> levelView v
-
-  let bad = typeError $ UnequalLevel cmp u v
-
-  let c  = min (constant l1') (constant l2')
-      l1 = minus l1 c
-      l2 = minus l2 c
-
-  case (cmp, l1, l2) of
-    (cmp, ClosedLevel n, ClosedLevel m) ->
-      case cmp of
-        CmpEq  | n == m -> return []
-        CmpLeq | n <= m -> return []
-        _               -> bad
-    (CmpLeq, ClosedLevel 0, _) -> return []
-    _ -> buildConstraint $ LevelCmp cmp u v
-  where
-    constant (ClosedLevel n) = n
-    constant (Plus n _)      = n
-
-    minus (ClosedLevel n) m = ClosedLevel (n - m)
-    minus (Plus n l) m      = Plus (n - m) l
+compareLevel :: Comparison -> Level -> Level -> TCM ()
+compareLevel CmpLeq u v = leqLevel u v
+compareLevel CmpEq  u v = equalLevel u v
 
 isLevelConstraint LevelCmp{} = True
 isLevelConstraint _          = False
 
-warshallConstraint :: Constraint -> TCM [W.Constraint]
-warshallConstraint (LevelCmp cmp a b) = do
-  -- produce constraints
-  return []
-warshallConstraint _ = __IMPOSSIBLE__
-
-solveLevelConstraints :: TCM ()
-solveLevelConstraints = do
-  cs <- takeConstraints
-  let (lcs, rest) = partition (isLevelConstraint . clValue) cs
-
-  lcs <- concat <$> mapM warshallConstraint (map clValue lcs)
-
-  let msol = W.solve lcs
-
-  case msol of
-    Nothing  -> typeError $ GenericError "Bad universe levels! No further information provided. You suck!"
-    Just sol -> do
-      -- do something interesting with the solution
-      addConstraints rest
-      return ()
diff --git a/src/full/Agda/TypeChecking/UniversePolymorphism.hs-boot b/src/full/Agda/TypeChecking/UniversePolymorphism.hs-boot
--- a/src/full/Agda/TypeChecking/UniversePolymorphism.hs-boot
+++ b/src/full/Agda/TypeChecking/UniversePolymorphism.hs-boot
@@ -4,5 +4,4 @@
 import Agda.Syntax.Internal
 import Agda.TypeChecking.Monad
 
-compareLevel :: MonadTCM tcm => Comparison -> Term -> Term -> tcm Constraints
-
+compareLevel :: Comparison -> Level -> Level -> TCM ()
diff --git a/src/full/Agda/TypeChecking/With.hs b/src/full/Agda/TypeChecking/With.hs
--- a/src/full/Agda/TypeChecking/With.hs
+++ b/src/full/Agda/TypeChecking/With.hs
@@ -42,6 +42,14 @@
     vs <- etaContract =<< normalise vs
     as <- etaContract =<< normalise as
     b  <- etaContract =<< normalise (telePi_ delta2 b)
+    reportSDoc "tc.with.abstract" 40 $
+      sep [ text "abstracting"
+          , nest 2 $ vcat $
+            [ text "vs = " <+> prettyTCM vs
+            , text "as = " <+> prettyTCM as
+            , text "b  = " <+> prettyTCM b ]
+          ]
+    reportSLn "tc.with.abstract" 50 $ "  raw vs = " ++ show vs ++ "\n  raw b  = " ++ show b
     return (zip vs as, b)
   return $ telePi_ delta1 $ foldr (uncurry piAbstractTerm) b vas
 
@@ -150,7 +158,7 @@
 
             -- Compute the argument telescope for the constructor
             Con c []    <- constructorForm =<< normalise (Con c [])
-            Defn _ _ ct _ _ Constructor{conPars = np}  <- getConstInfo c
+            Defn {defType = ct, theDef = Constructor{conPars = np}}  <- getConstInfo c
             let ct' = ct `apply` genericTake np us
             TelV tel' _ <- telView ct'
 
@@ -194,16 +202,19 @@
 --   applications of the with function as applications to the original function.
 --   For instance, @aux a b c@ as @f (suc a) (suc b) | c@
 withDisplayForm :: QName -> QName -> Telescope -> Telescope -> Nat -> [Arg Pattern] -> Permutation -> TCM DisplayForm
-withDisplayForm f aux delta1 delta2 n qs perm = do
+withDisplayForm f aux delta1 delta2 n qs perm@(Perm m _) = do
   topArgs <- raise (n + size delta1 + size delta2) <$> getContextArgs
   x <- freshNoName_
   let wild = Def (qualify (mnameFromList []) x) []
 
   let top = genericLength topArgs
-      vs = topArgs ++ raiseFrom (size delta2) n (substs (sub wild) $ patsToTerms qs)
-      dt = DWithApp (map DTerm $ Def f vs : withArgs) []
+      vs = map (fmap DTerm) topArgs ++ (substs (sub ys wild) $ patsToTerms qs)
+      dt = DWithApp (DDef f vs : map DTerm withArgs) []
       withArgs = reverse $ map var [size delta2..size delta2 + n - 1]
       pats = genericReplicate (n + size delta1 + size delta2 + top) (Var 0 [])
+      -- Building the arguments to the with function
+      (ys0, ys1) = splitAt (size delta1) (permute perm $ map Just [m - 1, m - 2..0])
+      ys = reverse $ ys0 ++ genericReplicate n Nothing ++ ys1
 
   let display = Display (n + size delta1 + size delta2 + top) pats dt
 
@@ -214,43 +225,33 @@
       , text "aux    =" <+> text (show aux)
       , text "delta1 =" <+> prettyTCM delta1
       , text "delta2 =" <+> prettyTCM delta2
+      , text "n      =" <+> text (show n)
       , text "perm   =" <+> text (show perm)
+      , text "top    =" <+> prettyTCM topArgs
+      , text "qs     =" <+> text (show qs)
       , text "dt     =" <+> prettyTCM dt
+      , text "ys     =" <+> text (show ys)
       , text "raw    =" <+> text (show display)
       , text "qsToTm =" <+> prettyTCM (patsToTerms qs)
-      , text "sub qs =" <+> prettyTCM (substs (sub wild) $ patsToTerms qs)
+      , text "sub qs =" <+> prettyTCM (substs (sub ys wild) $ patsToTerms qs)
       ]
     ]
 
   return display
   where
     var i = Var i []
-    sub wild = map term [0..] -- m - 1]
+    sub rho wild = map term [0..] -- m - 1]
       where
-        Perm m xs = reverseP perm
-        -- Perm m xs = perm    -- thinking required.. but ignored
-                            -- dropping the reverse seems to work better
-                            -- Andreas, 2010-09-09: I DISAGREE.
-        term i = case findIndex (i ==) xs of
+        -- thinking required.. but ignored
+        -- dropping the reverse seems to work better
+        -- Andreas, 2010-09-09: I DISAGREE.
+        -- Ulf, 2011-09-02: Thinking done. Neither was correct.
+        -- We had the wrong permutation and we used it incorrectly. Should work now.
+        term i = case findIndex (Just i ==) rho of
           Nothing -> wild
           Just j  -> Var (fromIntegral j) []
 
-{- example (test/fail/Issue295.agda)
-
-  aux  = aux d w a b c
-  delta1 = d
-  delta2 = a b c
-  perm = x0,x1,x2,x3 -> x3,x0,x1,x2
-  perm = a,b,c,d -> d,a,b,c
-WIHOUT reverseP IS:
-  dt   = (@0 ⟶ @4) ﹔ (@2 ⟶ @1) | @3
-  dt   = (c ⟶ d) ﹔ (a ⟶ b) | w
-WITH reverseP IS, AS IT SHOULD:
-  dt   = (a ⟶ b) ﹔ (c ⟶ d) | w
-  dt   = (@2 ⟶ @1) ﹔ (@0 ⟶ @4) | @3
--}
-
-patsToTerms :: [Arg Pattern] -> [Arg Term]
+patsToTerms :: [Arg Pattern] -> [Arg DisplayTerm]
 patsToTerms ps = evalState (toTerms ps) 0
   where
     mapMr f xs = reverse <$> mapM f (reverse xs)
@@ -261,31 +262,15 @@
       put (i + 1)
       return i
 
-    toTerms :: [Arg Pattern] -> State Nat [Arg Term]
+    toTerms :: [Arg Pattern] -> State Nat [Arg DisplayTerm]
     toTerms ps = mapMr toArg ps
 
-    toArg :: Arg Pattern -> State Nat (Arg Term)
+    toArg :: Arg Pattern -> State Nat (Arg DisplayTerm)
     toArg = T.mapM toTerm
 
-    toTerm :: Pattern -> State Nat Term
+    toTerm :: Pattern -> State Nat DisplayTerm
     toTerm p = case p of
-      VarP _      -> var >>= \i -> return $ Var i []
-      DotP t      -> return t
-      ConP c _ ps -> Con c <$> toTerms ps
-      LitP l      -> return $ Lit l
-
-data ConPos = Here
-            | ArgPat Int ConPos
-
-updateWithConstructorRanges ::
-  [Telescope] -> [Arg Pattern] -> A.RHS -> [Arg Pattern]
-updateWithConstructorRanges tel ps A.RHS{}            = ps
-updateWithConstructorRanges tel ps A.AbsurdRHS{}      = ps
-updateWithConstructorRanges tel ps (A.WithRHS _ _ cs) = ps
-updateWithConstructorRanges tel ps A.RewriteRHS{}     = ps
-
-constructorsInClauses :: ConPos -> [A.Clause] -> [Range]
-constructorsInClauses pos cs = concatMap (constructorsInClause pos) cs
-
-constructorsInClause :: ConPos -> A.Clause -> [Range]
-constructorsInClause pos (A.Clause (A.LHS _ _ ps wps) rhs _) = []
+      VarP _      -> var >>= \i -> return $ DTerm (Var i [])
+      DotP t      -> return $ DDot t
+      ConP c _ ps -> DCon c <$> toTerms ps
+      LitP l      -> return $ DTerm (Lit l)
diff --git a/src/full/Agda/Utils/FileName.hs b/src/full/Agda/Utils/FileName.hs
--- a/src/full/Agda/Utils/FileName.hs
+++ b/src/full/Agda/Utils/FileName.hs
@@ -100,7 +100,7 @@
 instance Arbitrary AbsolutePath where
   arbitrary = mk . take 3 . map (take 2) <$>
                 listOf (listOf1 (elements "a1"))
-    where mk ps = AbsolutePath (joinPath $ rootPath : ps)
+    where mk ps = mkAbsolute (joinPath $ rootPath : ps)
 
 ------------------------------------------------------------------------
 -- All tests
diff --git a/src/full/Agda/Utils/Generics.hs b/src/full/Agda/Utils/Generics.hs
--- a/src/full/Agda/Utils/Generics.hs
+++ b/src/full/Agda/Utils/Generics.hs
@@ -1,9 +1,20 @@
 {-# LANGUAGE Rank2Types #-}
-{-| Contains some generic utility functions.
+{-| Contains some generic utility functions and reexports certain
+    definitions from "Data.Generics".
 -}
-module Agda.Utils.Generics where
+module Agda.Utils.Generics
+  ( module Data.Generics
+  , isString
+  , everythingBut
+  , everywhereBut'
+  , everywhereButM'
+  ) where
 
+-- The explicit import list is included in order to support several
+-- versions of syb; one version of syb contains a definition named
+-- everythingBut.
 import Data.Generics
+  (GenericQ, mkQ, extQ, gmapQ, GenericT, gmapT, GenericM, gmapM)
 
 isString :: GenericQ Bool
 isString = mkQ False (const True :: String -> Bool)
diff --git a/src/full/Agda/Utils/Graph.hs b/src/full/Agda/Utils/Graph.hs
--- a/src/full/Agda/Utils/Graph.hs
+++ b/src/full/Agda/Utils/Graph.hs
@@ -1,4 +1,4 @@
-
+{-# LANGUAGE DeriveFunctor #-}
 module Agda.Utils.Graph where
 
 import qualified Data.Map as Map
@@ -10,6 +10,7 @@
 
 -- Only one edge between any two nodes.
 newtype Graph n e = Graph { unGraph :: Map n (Map n e) }
+  deriving (Eq, Functor)
 
 edges :: Ord n => Graph n e -> [(n, n, e)]
 edges g = concatMap onNode $ Map.assocs $ unGraph g
@@ -53,9 +54,14 @@
         Just es -> Graph $ Map.singleton a $ Map.map (otimes w) es
         Nothing -> empty
 
-transitiveClosure :: (SemiRing e, Ord n) => Graph n e -> Graph n e
-transitiveClosure g = iterate growGraph g !! n
-  where n = Set.size $ nodes g
+transitiveClosure :: (Eq e, SemiRing e, Ord n) => Graph n e -> Graph n e
+transitiveClosure g = loop g
+  where -- n = Set.size $ nodes g
+    loop g | g == g'   = g
+           | otherwise = loop g'
+      where
+        g' = growGraph g
+
 
 findPath :: (SemiRing e, Ord n) => (e -> Bool) -> n -> n -> Graph n e -> Maybe e
 findPath good a b g = case filter good $ allPaths good a b g of
diff --git a/src/full/Agda/Utils/IO/UTF8.hs b/src/full/Agda/Utils/IO/UTF8.hs
--- a/src/full/Agda/Utils/IO/UTF8.hs
+++ b/src/full/Agda/Utils/IO/UTF8.hs
@@ -4,6 +4,7 @@
 
 module Agda.Utils.IO.UTF8
   ( readTextFile
+  , Agda.Utils.IO.UTF8.hPutStr
   , Agda.Utils.IO.UTF8.writeFile
   ) where
 
@@ -30,14 +31,26 @@
   UTF8.readFile file
 #endif
 
+-- | Writes UTF8-encoded text to the handle, which should be opened
+-- for writing and in text mode. The native convention for line
+-- endings is used.
+
+hPutStr :: IO.Handle -> String -> IO ()
+#if MIN_VERSION_base(4,2,0)
+hPutStr h s = do
+  IO.hSetEncoding h IO.utf8
+  IO.hPutStr h s
+#else
+hPutStr = UTF8.hPutStr
+#endif
+
 -- | Writes a UTF8-encoded text file. The native convention for line
 -- endings is used.
 
 writeFile :: FilePath -> String -> IO ()
 #if MIN_VERSION_base(4,2,0)
 writeFile file s = IO.withFile file IO.WriteMode $ \h -> do
-  IO.hSetEncoding h IO.utf8
-  IO.hPutStr h s
+  hPutStr h s
 #else
 writeFile = UTF8.writeFile
 #endif
diff --git a/src/full/Agda/Utils/List.hs b/src/full/Agda/Utils/List.hs
--- a/src/full/Agda/Utils/List.hs
+++ b/src/full/Agda/Utils/List.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 
 {-| Utitlity functions on lists.
 -}
@@ -13,10 +14,22 @@
 import Data.Maybe
 import qualified Data.Set as Set
 
+#include "../undefined.h"
+import Agda.Utils.Impossible
+
+-- | Head function (safe).
 mhead :: [a] -> Maybe a
 mhead []    = Nothing
 mhead (x:_) = Just x
 
+-- | Sublist relation.
+isSublistOf :: Eq a => [a] -> [a] -> Bool
+isSublistOf []       ys = True
+isSublistOf (x : xs) ys =
+  case dropWhile (x /=) ys of
+    []     -> False
+    (_:ys) -> isSublistOf xs ys
+
 type Prefix a = [a]
 type Suffix a = [a]
 
@@ -142,6 +155,32 @@
   classify (x `elem` xs) "members" $
     genericElemIndex x xs == elemIndex x xs
 
+-- | Requires both lists to have the same length.
+
+zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c]
+zipWith' f []        []      = []
+zipWith' f (x : xs) (y : ys) = f x y : zipWith' f xs ys
+zipWith' f []       (_ : _)  = {- ' -} __IMPOSSIBLE__
+zipWith' f (_ : _)  []       = {- ' -} __IMPOSSIBLE__
+
+prop_zipWith' :: (Integer -> Integer -> Integer) -> Property
+prop_zipWith' f =
+  forAll natural $ \n ->
+    forAll (two $ vector n) $ \(xs, ys) ->
+      zipWith' f xs ys == zipWith f xs ys
+
+-- | Efficient version of nub that sorts the list first. The tag function is
+--   assumed to be cheap. If it isn't pair up the elements with their tags and
+--   call uniqBy fst (or snd).
+uniqBy :: Ord b => (a -> b) -> [a] -> [a]
+uniqBy tag =
+  map head
+  . groupBy ((==) `on` tag)
+  . sortBy (compare `on` tag)
+
+prop_uniqBy :: [Integer] -> Bool
+prop_uniqBy xs = sort (nub xs) == uniqBy id xs
+
 ------------------------------------------------------------------------
 -- All tests
 
@@ -151,4 +190,6 @@
   , quickCheck' prop_groupBy'
   , quickCheck' prop_extractNthElement
   , quickCheck' prop_genericElemIndex
+  , quickCheck' prop_zipWith'
+  , quickCheck' prop_uniqBy
   ]
diff --git a/src/full/Agda/Utils/Monad.hs b/src/full/Agda/Utils/Monad.hs
--- a/src/full/Agda/Utils/Monad.hs
+++ b/src/full/Agda/Utils/Monad.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE FlexibleContexts, CPP #-}
+{-# LANGUAGE FlexibleContexts #-}
 
 module Agda.Utils.Monad
     ( module Agda.Utils.Monad
@@ -14,12 +14,11 @@
 import qualified Control.Monad.State.Strict as SS
 import Control.Monad.Writer
 import Control.Applicative
-import Data.Traversable
+import Data.Traversable hiding (sequence)
 import Data.Foldable
 import Data.Monoid
 
-#include "../undefined.h"
-import Agda.Utils.Impossible
+import Agda.Utils.List
 
 -- Monads -----------------------------------------------------------------
 
@@ -69,10 +68,7 @@
 
 -- | Requires both lists to have the same lengths.
 zipWithM' :: Monad m => (a -> b -> m c) -> [a] -> [b] -> m [c]
-zipWithM' f []	     []	      = return []
-zipWithM' f (x : xs) (y : ys) = liftM2 (:) (f x y) (zipWithM' f xs ys)
-zipWithM' f []	     (_ : _)  = {- ' -} __IMPOSSIBLE__
-zipWithM' f (_ : _)  []	      = {- ' -} __IMPOSSIBLE__
+zipWithM' f xs ys = sequence (zipWith' f xs ys)
 
 -- | Finally for the 'Error' class. Errors in the finally part take
 -- precedence over prior errors.
diff --git a/src/full/Agda/Utils/ReadP.hs b/src/full/Agda/Utils/ReadP.hs
--- a/src/full/Agda/Utils/ReadP.hs
+++ b/src/full/Agda/Utils/ReadP.hs
@@ -6,7 +6,7 @@
 -- The changes are:
 
 --  1) ReadP is parameterised over the token type (hard-wired to 'Char' in the library).
---  2) Added a 'parse' function to run a parser.
+--  2) Added the functions 'parse' and 'parse'' which run parsers.
 --  3) Removed Read instances.
 
 -- Module      :  "Text.ParserCombinators.ReadP"
@@ -39,6 +39,7 @@
 
   -- * Parse
   parse,      -- :: ReadP tok a -> [tok] -> [a]
+  parse',     -- :: ReadP tok a -> [tok] -> Either a [tok]
 
   -- * Other operations
   pfail,      -- :: ReadP a
@@ -394,6 +395,20 @@
 --   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']))
+
+-- ---------------------------------------------------------------------------
+-- A variant on parse which returns either a result, or the unparseable text.
+
+run' :: P t a -> [t] -> Either a [t]
+run' (Get f)           (c:s) = run' (f c) s
+run' (Look f)          s     = run' (f s) s
+run' (Result x _)      _     = Left x
+run' (Final ((x,_):_)) _     = Left x
+run' _                 s     = Right s
+
+parse' :: ReadP t a -> [t] -> Either a [t]
+parse' p ts = case complete p of
+    R f	-> run' (f return) ts
 
 -- ---------------------------------------------------------------------------
 -- QuickCheck properties that hold for the combinators
diff --git a/src/full/Agda/Utils/Size.hs b/src/full/Agda/Utils/Size.hs
--- a/src/full/Agda/Utils/Size.hs
+++ b/src/full/Agda/Utils/Size.hs
@@ -18,3 +18,7 @@
 
 instance Sized (Set a) where
   size = fromIntegral . Set.size
+
+instance Sized a => Sized (Maybe a) where
+  size Nothing  = 1
+  size (Just a) = size a
diff --git a/src/full/Agda/Utils/String.hs b/src/full/Agda/Utils/String.hs
--- a/src/full/Agda/Utils/String.hs
+++ b/src/full/Agda/Utils/String.hs
@@ -33,7 +33,7 @@
 -- | Shows a non-negative integer using the characters ₀-₉ instead of
 -- 0-9.
 
-showIndex :: Integral i => i -> String
+showIndex :: (Show i, Integral i) => i -> String
 showIndex n =
   showIntAtBase 10 (\i -> toEnum (i + fromEnum '\x2080')) n ""
 
diff --git a/src/full/Agda/Utils/VarSet.hs b/src/full/Agda/Utils/VarSet.hs
new file mode 100644
--- /dev/null
+++ b/src/full/Agda/Utils/VarSet.hs
@@ -0,0 +1,54 @@
+
+-- | Var field implementation of sets of (small) natural numbers.
+module Agda.Utils.VarSet
+  ( VarSet
+  , union, unions, member, empty, delete, singleton, fromList, toList, isSubsetOf
+  , Agda.Utils.VarSet.subtract
+  )
+  where
+
+import Data.Set as Set
+
+type VarSet = Set Integer
+
+subtract :: Integer -> VarSet -> VarSet
+subtract n s = Set.mapMonotonic (Prelude.subtract n) s
+
+{-
+import Data.Bits
+
+type VarSet = Integer
+type Var    = Integer
+
+union :: VarSet -> VarSet -> VarSet
+union = (.|.)
+
+member :: Var -> VarSet -> Bool
+member b s = testVar s (fromIntegral b)
+
+empty :: VarSet
+empty = 0
+
+delete :: Var -> VarSet -> VarSet
+delete b s = clearVar s (fromIntegral b)
+
+singleton :: Var -> VarSet
+singleton = bit
+
+subtract :: Int -> VarSet -> VarSet
+subtract n s = shiftR s n
+
+fromList :: [Var] -> VarSet
+fromList = foldr (union . singleton . fromIntegral) empty
+
+isSubsetOf :: VarSet -> VarSet -> Bool
+isSubsetOf s1 s2 = 0 == (s1 .&. complement s2)
+
+toList :: VarSet -> [Var]
+toList s = loop 0 s
+  where
+    loop i 0 = []
+    loop i n
+      | testVar n 0 = fromIntegral i : (loop $! i + 1) (shiftR n 1)
+      | otherwise   = (loop $! i + 1) (shiftR n 1)
+-}
