diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,7 @@
+**Clafer Version 0.3.8 released on Jan 27, 2015**
+
+[Release](https://github.com/gsdlab/clafer/pull/60)
+
 **Clafer Version 0.3.7 released on Oct 23, 2014**
 
 [Release](https://github.com/gsdlab/clafer/pull/53)
@@ -14,31 +18,19 @@
 
 [Release](https://github.com/gsdlab/clafer/pull/44)
 
-[New features and bug fixes](http://gsd.uwaterloo.ca:8888/questions/scope:all/sort:activity-desc/tags:v0.3.5,clafer/page:1/)
-
 **Clafer Version 0.3.4 released on September 20, 2013**
 
-[New features and bug fixes](http://gsd.uwaterloo.ca:8888/questions/scope:all/sort:activity-desc/tags:v0.3.4,clafer/page:1/)
-
 **Clafer Version 0.3.3 released on August 14, 2013**
 
 [Release](https://github.com/gsdlab/clafer/pull/35)
 
-[New features and bug fixes](http://gsd.uwaterloo.ca:8888/questions/scope:all/sort:activity-desc/tags:v0.3.3,clafer/page:1/)
-
 **Clafer Version 0.3.2 released on April 11, 2013**
 
-[New features and bug fixes](http://gsd.uwaterloo.ca:8888/questions/scope:all/sort:activity-desc/tags:v0.3.2,clafer/page:1/)
-
 **Clafer Version 0.3.1 released on October 17, 2012**
 
-[New features and bug fixes](http://gsd.uwaterloo.ca:8888/questions/scope:all/sort:activity-desc/tags:v0.3.1,clafer/page:1/)
-
 **Clafer Version 0.3 released on July 17, 2012**
 
 This was the first release of Clafer and included all code since the beginning of the project.
-
-[New features and bug fixes](http://gsd.uwaterloo.ca:8888/questions/scope:all/sort:activity-desc/tags:v0.3,clafer/page:1/)
 
 Basic features - See the `README.md`.
 
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -17,18 +17,17 @@
 	cabal sandbox init --sandbox=../.clafertools-cabal-sandbox
 	cabal install --only-dependencies $(GPLK_LIBS_INCLUDES) $(MAC_USR_LIB) --enable-tests
 
-build: 
+build:
 	$(MAKE) -C $(TOOL_DIR)
 	cabal configure
 	cabal build
 
-install:  
+install:
 	mkdir -p $(to)
 	mkdir -p $(to)/tools
 	cp -f README.md $(to)/clafer-README.md
 	cp -f LICENSE $(to)/
 	cp -f CHANGES.md $(to)/clafer-CHANGES.md
-	cp -f tools/alloy4.jar $(to)/tools
 	cp -f tools/alloy4.2.jar $(to)/tools
 	cp -f tools/XsdCheck.class $(to)/tools
 	cp -f tools/ecore2clafer.jar $(to)/tools
@@ -40,7 +39,7 @@
 	make clean
 	ghc-pkg unregister clafer --package-db=../.clafertools-cabal-sandbox/x86_64-windows-ghc-7.8.3
 	rm `which clafer`
-	make 
+	make
 
 # regenerate grammar, call after clafer.cf changed
 grammar:
@@ -66,7 +65,7 @@
 .PHONY : test
 
 test:
-	cabal test	
+	cabal test
 	$(MAKE) -C $(TEST_DIR) test
 
 generateAlloyJSPythonXMLXHTMLDot:
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 Clafer
 ======
 
-v0.3.7
+v0.3.8
 
 [Clafer](http://clafer.org) is a general-purpose lightweight structural modeling language developed by 
 [GSD Lab](http://gsd.uwaterloo.ca/), [University of Waterloo](http://uwaterloo.ca), and 
@@ -95,7 +95,7 @@
 
 ### Installation from binaries
 
-Binary distributions of the release 0.3.7 of Clafer Tools for Windows, Mac, and Linux, 
+Binary distributions of the release 0.3.8 of Clafer Tools for Windows, Mac, and Linux, 
 can be downloaded from 
 [Clafer Tools - Binary Distributions](http://http://gsd.uwaterloo.ca/clafer-tools-binary-distributions). 
 
@@ -109,11 +109,11 @@
 * [The Haskell Platform](http://hackage.haskell.org/platform/) v2014.2.0.0 64bit
   * on Windows, use 32bit
 
-Clafer is now available on [Hackage](http://hackage.haskell.org/package/clafer-0.3.7/) and it can be installed using
+Clafer is now available on [Hackage](http://hackage.haskell.org/package/clafer-0.3.8/) and it can be installed using
 
 1. `cabal update`
 2. `cabal install clafer`
-3. `cd <cabal's lib or share folder>`  (`C:\Users\<user>\AppData\Roaming\cabal\x86_64-windows-ghc-7.8.3\clafer-0.3.7` on Windows or `.cabal/share/x86_64-linux-ghc-7.8.3/clafer-0.3.7/` on Linux)
+3. `cd <cabal's lib or share folder>`  (`C:\Users\<user>\AppData\Roaming\cabal\x86_64-windows-ghc-7.8.3\clafer-0.3.8` on Windows or `.cabal/share/x86_64-linux-ghc-7.8.3/clafer-0.3.8/` on Linux)
 4. to automatically download Alloy jars
   * execute `make` in `tools` 
 
@@ -191,15 +191,15 @@
 (As printed by `clafer --help`)
 
 ```
-Clafer 0.3.7
+Clafer 0.3.8
 
 clafer [OPTIONS] [FILE]
 
 Common flags:
   -m --mode=CLAFERMODE                    Generated output type. Available
                                           CLAFERMODEs are: 'alloy' (Alloy 4.1);
-                                          'alloy42' (default, Alloy 4.2);
-                                          'xml' (intermediate representation of
+                                          'alloy42' (default, Alloy 4.2); 'xml'
+                                          (intermediate representation of
                                           Clafer model); 'clafer' (analyzed and
                                           desugared clafer model); 'html'
                                           (original model in HTML); 'graph'
@@ -273,6 +273,7 @@
                                           ('.cfr-scope').
   -? --help                               Display help message
   -V --version                            Print version information
+     --numeric-version                    Print just the version number
 ```
 
 The dependencies among the command line arguments are described on the [model wiki](http://t3-necsis.cs.uwaterloo.ca:8091/ClaferTools/CommandLineArguments).
@@ -323,4 +324,4 @@
   * Try a live instance of [ClaferMooVisualizer](http://t3-necsis.cs.uwaterloo.ca:8092)
 * Take a look at (incomplete) [Clafer by examples wiki](https://github.com/gsdlab/clafer/wiki)
 * Browse example models in the [test suite](https://github.com/gsdlab/clafer/tree/master/test/positive) and [MOO examples](https://github.com/gsdlab/clafer/tree/master/spl_configurator/dataset)
-* Post questions, report bugs, suggest improvements [GSD Lab Bug Tracker](http://gsd.uwaterloo.ca:8888/questions/). Tag your entries with `clafer` (so that we know what they are related to) and with `jimmy-liang` or `michal` (so that Jimmy or Michał gets a notification).
+* Post questions, report bugs, suggest improvements [GSD Lab Bug Tracker](http://gsd.uwaterloo.ca:8888/questions/). Tag your entries with `clafer` (so that we know what they are related to) and with `jimmy-liang` or `michal` (so that Jimmy or Michał gets a notification).
diff --git a/clafer.cabal b/clafer.cabal
--- a/clafer.cabal
+++ b/clafer.cabal
@@ -1,5 +1,5 @@
 Name:               clafer
-Version:            0.3.7
+Version:            0.3.8
 Synopsis:           clafer compiles Clafer models to other formats, such as Alloy, XML, HTML, Dot.
 Description:        Clafer is a general purpose, lightweight, structural modeling language developed at GSD Lab, University of Waterloo. Lightweight modeling aims at improving the understanding of the problem domain in the early stages of software development and determining the requirements with fewer defects. Clafer's goal is to make modeling more accessible to a wider range of users and domains. The tool provides a reference language implementation. It translates models to other formats (e.g. Alloy, XML) to allow for reasoning with existing tools.
 Homepage:           http://clafer.org
@@ -24,7 +24,7 @@
     location:       git://github.com/gsdlab/clafer.git
 Executable clafer
     build-tools:    ghc >= 7.6.3
-    default-language: 
+    default-language:
                     Haskell2010
     default-extensions:
                     DeriveDataTypeable,
@@ -37,10 +37,10 @@
                     process >= 1.1.0.2,
 
                     mtl >= 2.1.2,
-                    cmdargs >= 0.10.7, 
-                    split >= 0.2.2, 
+                    cmdargs >= 0.10.7,
+                    split >= 0.2.2,
 
-                    clafer == 0.3.7
+                    clafer == 0.3.8
     if os(windows)
         build-depends: HaXml == 1.24
     else
@@ -48,10 +48,10 @@
 
     other-modules: Paths_clafer
 
-library 
+library
     build-tools:    ghc >= 7.6.3
-    default-language: 
-                    Haskell2010    
+    default-language:
+                    Haskell2010
     default-extensions:
                     DeriveDataTypeable,
                     RankNTypes
@@ -61,6 +61,9 @@
                     directory >= 1.2.0.1,
                     filepath >= 1.3.0.1,
                     process >= 1.1.0.2,
+                    network < 2.6,
+                    HTTP,
+                    bytestring,
 
                     mtl >= 2.1.2,
                     parsec >= 3.1.3,
@@ -71,11 +74,11 @@
                     json-builder >= 0.3,
                     lens >= 4.1.1 && < 4.4,
                     string-conversions >= 0.3.0.2,
-                    cmdargs >= 0.10.7, 
-                    executable-path >= 0.0.3, 
+                    cmdargs >= 0.10.7,
+                    executable-path >= 0.0.3,
                     glpk-hs >= 0.3.4,
                     MaybeT >= 0.1.2,
-                    split >= 0.2.2, 
+                    split >= 0.2.2,
                     text >= 0.11.3.1
 
     if os(windows)
@@ -85,7 +88,7 @@
 
     hs-source-dirs:  src
     ghc-options:     -Wall -fno-warn-unused-do-bind -fno-warn-orphans
-    exposed-modules: 
+    exposed-modules:
                      Language.Clafer,
                      Language.ClaferT,
                      Language.Clafer.ClaferArgs,
@@ -102,13 +105,14 @@
                      Language.Clafer.Front.Printclafer,
                      Language.Clafer.Generator.Alloy,
                      Language.Clafer.Generator.Choco,
+                     Language.Clafer.Generator.Concat,
                      Language.Clafer.Generator.Graph,
                      Language.Clafer.Generator.Html,
                      Language.Clafer.Generator.Python,
                      Language.Clafer.Generator.Schema,
                      Language.Clafer.Generator.Stats,
                      Language.Clafer.Generator.Xml,
-                     Language.Clafer.Intermediate.Analysis,                     
+                     Language.Clafer.Intermediate.Analysis,
                      Language.Clafer.Intermediate.Desugarer,
                      Language.Clafer.Intermediate.Intclafer,
                      Language.Clafer.Intermediate.Resolver,
@@ -123,15 +127,17 @@
                      Language.Clafer.Intermediate.Transformer,
                      Language.Clafer.Optimizer.Optimizer,
                      Language.Clafer.SplitJoin
-    other-modules: Paths_clafer
+    other-modules: Paths_clafer,
+                   GetURL
+
 Test-Suite test-suite
     build-tools:    ghc >= 7.6.3
-    default-language: 
-                    Haskell2010    
-    type:           exitcode-stdio-1.0  
+    default-language:
+                    Haskell2010
+    type:           exitcode-stdio-1.0
     main-is:        test-suite.hs
     hs-source-dirs: test
-    build-depends:  
+    build-depends:
                     base >= 4.6.0.1 && < 5,
                     containers >= 0.5.0.0,
                     directory >= 1.2.0.1,
@@ -139,25 +145,24 @@
 
                     HUnit >= 1.2.5.2,
                     mtl >= 2.1.2,
-                    QuickCheck >= 2.6, 
+                    QuickCheck >= 2.6,
 
                     lens >= 4.1.1 && < 4.4,
                     tasty >= 0.10,
                     tasty-hunit >= 0.9,
                     tasty-th >= 0.1.2,
 
-                    clafer == 0.3.7
+                    clafer == 0.3.8
 
     if os(windows)
         build-depends: HaXml == 1.24
     else
         build-depends: HaXml >= 1.24
 
-    ghc-options:    -Wall -fno-warn-unused-do-bind -fno-warn-orphans -threaded
+    ghc-options:    -Wall -fno-warn-unused-do-bind -fno-warn-orphans
 
     other-modules:  Paths_clafer,
                     Functions,
-                    Suite.Example,
                     Suite.Positive,
                     Suite.Negative,
                     Suite.SimpleScopeAnalyser
diff --git a/dist/build/Language/Clafer/Front/Lexclafer.hs b/dist/build/Language/Clafer/Front/Lexclafer.hs
--- a/dist/build/Language/Clafer/Front/Lexclafer.hs
+++ b/dist/build/Language/Clafer/Front/Lexclafer.hs
@@ -29,18 +29,18 @@
 import GlaExts
 #endif
 alex_base :: AlexAddr
-alex_base = AlexA# "\xf8\xff\xff\xff\x4c\x00\x00\x00\x22\x01\x00\x00\xa2\x01\x00\x00\x22\x02\x00\x00\x22\x03\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x13\x03\x00\x00\x13\x04\x00\x00\x34\x00\x00\x00\xd3\x03\x00\x00\xa9\x04\x00\x00\x00\x00\x00\x00\x15\x04\x00\x00\x29\x05\x00\x00\x9e\x05\x00\x00\xd9\xff\xff\xff\x4d\x00\x00\x00\x61\x00\x00\x00\x9e\x06\x00\x00\x5e\x06\x00\x00\x00\x00\x00\x00\x54\x07\x00\x00\x00\x00\x00\x00\x2a\x08\x00\x00\x7e\x00\x00\x00\xed\xff\xff\xff\xdc\xff\xff\xff\x4f\x00\x00\x00\xcb\xff\xff\xff\xd6\xff\xff\xff\x00\x00\x00\x00\x99\xff\xff\xff\xd8\xff\xff\xff\x3d\x00\x00\x00\xef\xff\xff\xff\xf9\xff\xff\xff\x79\x00\x00\x00\x2f\x07\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x03\x09\x00\x00"#
+alex_base = AlexA# "\xf8\xff\xff\xff\x4c\x00\x00\x00\x22\x01\x00\x00\xa2\x01\x00\x00\x22\x02\x00\x00\x22\x03\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x13\x03\x00\x00\x13\x04\x00\x00\x34\x00\x00\x00\xd3\x03\x00\x00\xa9\x04\x00\x00\x00\x00\x00\x00\x15\x04\x00\x00\x29\x05\x00\x00\x9e\x05\x00\x00\xd9\xff\xff\xff\x4d\x00\x00\x00\x61\x00\x00\x00\xe1\xff\xff\xff\x9e\x06\x00\x00\x5e\x06\x00\x00\x00\x00\x00\x00\x54\x07\x00\x00\x00\x00\x00\x00\x2a\x08\x00\x00\x7e\x00\x00\x00\xed\xff\xff\xff\xdd\xff\xff\xff\x4f\x00\x00\x00\xd6\xff\xff\xff\xd7\xff\xff\xff\x00\x00\x00\x00\x9a\xff\xff\xff\xdf\xff\xff\xff\x3d\x00\x00\x00\xf1\xff\xff\xff\x0e\x00\x00\x00\x79\x00\x00\x00\x2f\x07\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x03\x09\x00\x00"#
 
 alex_table :: AlexAddr
-alex_table = AlexA# "\x00\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x13\x00\x20\x00\x20\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x20\x00\x20\x00\x20\x00\x20\x00\x0c\x00\x1a\x00\x1e\x00\x10\x00\x20\x00\x17\x00\x20\x00\x25\x00\x20\x00\x20\x00\x20\x00\x20\x00\x1c\x00\x20\x00\x1d\x00\x24\x00\x1b\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x1f\x00\x20\x00\x23\x00\x22\x00\x1f\x00\x20\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x20\x00\x20\x00\x20\x00\x10\x00\x00\x00\x20\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x20\x00\x21\x00\x20\x00\x02\x00\x20\x00\x00\x00\x20\x00\x22\x00\x18\x00\x20\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x00\x00\x22\x00\x00\x00\x00\x00\x10\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x10\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x00\x06\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\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x00\x06\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\x14\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x03\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\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\x0e\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x15\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x00\x06\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\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x29\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x0b\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x14\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x15\x00\x03\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0e\x00\x04\x00\x07\x00\x07\x00\x07\x00\x08\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x00\x06\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\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x13\x00\x21\x00\x21\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x21\x00\x21\x00\x21\x00\x21\x00\x0c\x00\x1b\x00\x1f\x00\x10\x00\x21\x00\x18\x00\x21\x00\x14\x00\x21\x00\x21\x00\x21\x00\x26\x00\x1d\x00\x21\x00\x1e\x00\x25\x00\x1c\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x20\x00\x21\x00\x24\x00\x23\x00\x20\x00\x21\x00\x21\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x21\x00\x21\x00\x21\x00\x10\x00\x00\x00\x21\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x21\x00\x22\x00\x21\x00\x02\x00\x21\x00\x00\x00\x21\x00\x23\x00\x19\x00\x21\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x00\x00\x23\x00\x00\x00\x00\x00\x10\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x10\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x00\x06\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\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x00\x06\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\x15\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x03\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\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\x0e\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x16\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x00\x06\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\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\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x0b\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x15\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x16\x00\x03\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0e\x00\x04\x00\x07\x00\x07\x00\x07\x00\x08\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x00\x06\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\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x2b\x00\x3d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3d\x00\x3e\x00\x7c\x00\x3e\x00\x2a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x2f\x00\x2e\x00\x26\x00\x26\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\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x22\x00\xff\xff\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\x2a\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x2f\x00\x2d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x3e\x00\xff\xff\xff\xff\x5c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x74\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc3\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2f\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\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\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\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\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2a\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\x22\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\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\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\x5c\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\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\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\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\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\x65\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\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2a\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\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\xc3\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"#
+alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x26\x00\x2b\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3d\x00\x3d\x00\x3e\x00\x7c\x00\x2a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x2f\x00\x3e\x00\x26\x00\x2e\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\x2a\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\x22\x00\xff\xff\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\x2a\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x2f\x00\x2d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x3e\x00\xff\xff\xff\xff\x5c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x74\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc3\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2f\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\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\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\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\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2a\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\x22\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\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\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\x5c\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\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\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\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\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\x65\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\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2a\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\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\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\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\xc3\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"#
 
 alex_deflt :: AlexAddr
-alex_deflt = AlexA# "\xff\xff\x0c\x00\x0c\x00\xff\xff\xff\xff\x0c\x00\x0c\x00\x0d\x00\x0d\x00\x10\x00\xff\xff\x10\x00\x0c\x00\x16\x00\x16\x00\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\x17\x00\x17\x00\x17\x00\x17\x00\xff\xff\x0c\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"#
+alex_deflt = AlexA# "\xff\xff\x0c\x00\x0c\x00\xff\xff\xff\xff\x0c\x00\x0c\x00\x0d\x00\x0d\x00\x10\x00\xff\xff\x10\x00\x0c\x00\x17\x00\x17\x00\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\x18\x00\x18\x00\x18\x00\x18\x00\xff\xff\x0c\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"#
 
-alex_accept = listArray (0::Int,42) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAccSkip,AlexAccSkip,AlexAccSkip,AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_4),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_6),AlexAcc (alex_action_7)]
+alex_accept = listArray (0::Int,43) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAccSkip,AlexAccSkip,AlexAccSkip,AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_4),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_6),AlexAcc (alex_action_7)]
 {-# LINE 42 "src\Language\Clafer\Front\Lexclafer.x" #-}
 
 
@@ -101,7 +101,7 @@
                               | s > a  = treeFind right
                               | s == a = t
 
-resWords = b ">=" 31 (b "." 16 (b "*" 8 (b "&" 4 (b "!=" 2 (b "!" 1 N N) (b "#" 3 N N)) (b "(" 6 (b "&&" 5 N N) (b ")" 7 N N))) (b "-" 12 (b "++" 10 (b "+" 9 N N) (b "," 11 N N)) (b "->" 14 (b "--" 13 N N) (b "->>" 15 N N)))) (b "<:" 24 (b ":=" 20 (b "/" 18 (b ".." 17 N N) (b ":" 19 N N)) (b ";" 22 (b ":>" 21 N N) (b "<" 23 N N))) (b "=" 28 (b "<=" 26 (b "<<" 25 N N) (b "<=>" 27 N N)) (b ">" 30 (b "=>" 29 N N) N)))) (b "min" 47 (b "all" 39 (b "\\" 35 (b "?" 33 (b ">>" 32 N N) (b "[" 34 N N)) (b "`" 37 (b "]" 36 N N) (b "abstract" 38 N N))) (b "if" 43 (b "else" 41 (b "disj" 40 N N) (b "enum" 42 N N)) (b "lone" 45 (b "in" 44 N N) (b "max" 46 N N)))) (b "sum" 55 (b "one" 51 (b "no" 49 (b "mux" 48 N N) (b "not" 50 N N)) (b "or" 53 (b "opt" 52 N N) (b "some" 54 N N))) (b "|" 59 (b "xor" 57 (b "then" 56 N N) (b "{" 58 N N)) (b "}" 61 (b "||" 60 N N) N))))
+resWords = b ">>" 32 (b "." 16 (b "**" 8 (b "&&" 4 (b "!=" 2 (b "!" 1 N N) (b "#" 3 N N)) (b ")" 6 (b "(" 5 N N) (b "*" 7 N N))) (b "-" 12 (b "++" 10 (b "+" 9 N N) (b "," 11 N N)) (b "->" 14 (b "--" 13 N N) (b "->>" 15 N N)))) (b "<:" 24 (b ":=" 20 (b "/" 18 (b ".." 17 N N) (b ":" 19 N N)) (b ";" 22 (b ":>" 21 N N) (b "<" 23 N N))) (b "=" 28 (b "<=" 26 (b "<<" 25 N N) (b "<=>" 27 N N)) (b ">" 30 (b "=>" 29 N N) (b ">=" 31 N N))))) (b "min" 48 (b "assert" 40 (b "]" 36 (b "[" 34 (b "?" 33 N N) (b "\\" 35 N N)) (b "abstract" 38 (b "`" 37 N N) (b "all" 39 N N))) (b "if" 44 (b "else" 42 (b "disj" 41 N N) (b "enum" 43 N N)) (b "lone" 46 (b "in" 45 N N) (b "max" 47 N N)))) (b "sum" 56 (b "one" 52 (b "no" 50 (b "mux" 49 N N) (b "not" 51 N N)) (b "or" 54 (b "opt" 53 N N) (b "some" 55 N N))) (b "|" 60 (b "xor" 58 (b "then" 57 N N) (b "{" 59 N N)) (b "}" 62 (b "||" 61 N N) N))))
    where b s n = let bs = id s
                   in B bs (TS bs n)
 
@@ -162,7 +162,7 @@
 alexInputPrevChar :: AlexInput -> Char
 alexInputPrevChar (p, c, bs, s) = c
 
--- | Encode a Haskell String to a list of Word8 values, in UTF8 format.
+  -- | Encode a Haskell String to a list of Word8 values, in UTF8 format.
 utf8Encode :: Char -> [Word8]
 utf8Encode = map fromIntegral . go . ord
  where
diff --git a/dist/build/Language/Clafer/Front/Parclafer.hs b/dist/build/Language/Clafer/Front/Parclafer.hs
--- a/dist/build/Language/Clafer/Front/Parclafer.hs
+++ b/dist/build/Language/Clafer/Front/Parclafer.hs
@@ -17,1685 +17,1705 @@
 #else
 type HappyAny = forall a . a
 #endif
-happyIn4 :: (PosInteger) -> (HappyAbsSyn )
-happyIn4 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn4 #-}
-happyOut4 :: (HappyAbsSyn ) -> (PosInteger)
-happyOut4 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut4 #-}
-happyIn5 :: (PosDouble) -> (HappyAbsSyn )
-happyIn5 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn5 #-}
-happyOut5 :: (HappyAbsSyn ) -> (PosDouble)
-happyOut5 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut5 #-}
-happyIn6 :: (PosString) -> (HappyAbsSyn )
-happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn6 #-}
-happyOut6 :: (HappyAbsSyn ) -> (PosString)
-happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut6 #-}
-happyIn7 :: (PosIdent) -> (HappyAbsSyn )
-happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn7 #-}
-happyOut7 :: (HappyAbsSyn ) -> (PosIdent)
-happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut7 #-}
-happyIn8 :: (Module) -> (HappyAbsSyn )
-happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn8 #-}
-happyOut8 :: (HappyAbsSyn ) -> (Module)
-happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut8 #-}
-happyIn9 :: (Declaration) -> (HappyAbsSyn )
-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn9 #-}
-happyOut9 :: (HappyAbsSyn ) -> (Declaration)
-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut9 #-}
-happyIn10 :: (Clafer) -> (HappyAbsSyn )
-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn10 #-}
-happyOut10 :: (HappyAbsSyn ) -> (Clafer)
-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut10 #-}
-happyIn11 :: (Constraint) -> (HappyAbsSyn )
-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn11 #-}
-happyOut11 :: (HappyAbsSyn ) -> (Constraint)
-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut11 #-}
-happyIn12 :: (SoftConstraint) -> (HappyAbsSyn )
-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn12 #-}
-happyOut12 :: (HappyAbsSyn ) -> (SoftConstraint)
-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut12 #-}
-happyIn13 :: (Goal) -> (HappyAbsSyn )
-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn13 #-}
-happyOut13 :: (HappyAbsSyn ) -> (Goal)
-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut13 #-}
-happyIn14 :: (Abstract) -> (HappyAbsSyn )
-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn14 #-}
-happyOut14 :: (HappyAbsSyn ) -> (Abstract)
-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut14 #-}
-happyIn15 :: (Elements) -> (HappyAbsSyn )
-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn15 #-}
-happyOut15 :: (HappyAbsSyn ) -> (Elements)
-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut15 #-}
-happyIn16 :: (Element) -> (HappyAbsSyn )
-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn16 #-}
-happyOut16 :: (HappyAbsSyn ) -> (Element)
-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut16 #-}
-happyIn17 :: (Super) -> (HappyAbsSyn )
-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn17 #-}
-happyOut17 :: (HappyAbsSyn ) -> (Super)
-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut17 #-}
-happyIn18 :: (SuperHow) -> (HappyAbsSyn )
-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn18 #-}
-happyOut18 :: (HappyAbsSyn ) -> (SuperHow)
-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut18 #-}
-happyIn19 :: (Init) -> (HappyAbsSyn )
-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn19 #-}
-happyOut19 :: (HappyAbsSyn ) -> (Init)
-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut19 #-}
-happyIn20 :: (InitHow) -> (HappyAbsSyn )
-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn20 #-}
-happyOut20 :: (HappyAbsSyn ) -> (InitHow)
-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut20 #-}
-happyIn21 :: (GCard) -> (HappyAbsSyn )
-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn21 #-}
-happyOut21 :: (HappyAbsSyn ) -> (GCard)
-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut21 #-}
-happyIn22 :: (Card) -> (HappyAbsSyn )
-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn22 #-}
-happyOut22 :: (HappyAbsSyn ) -> (Card)
-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut22 #-}
-happyIn23 :: (NCard) -> (HappyAbsSyn )
-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn23 #-}
-happyOut23 :: (HappyAbsSyn ) -> (NCard)
-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut23 #-}
-happyIn24 :: (ExInteger) -> (HappyAbsSyn )
-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn24 #-}
-happyOut24 :: (HappyAbsSyn ) -> (ExInteger)
-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut24 #-}
-happyIn25 :: (Name) -> (HappyAbsSyn )
-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn25 #-}
-happyOut25 :: (HappyAbsSyn ) -> (Name)
-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut25 #-}
-happyIn26 :: (Exp) -> (HappyAbsSyn )
-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn26 #-}
-happyOut26 :: (HappyAbsSyn ) -> (Exp)
-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut26 #-}
-happyIn27 :: (Exp) -> (HappyAbsSyn )
-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn27 #-}
-happyOut27 :: (HappyAbsSyn ) -> (Exp)
-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut27 #-}
-happyIn28 :: (Exp) -> (HappyAbsSyn )
-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn28 #-}
-happyOut28 :: (HappyAbsSyn ) -> (Exp)
-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut28 #-}
-happyIn29 :: (Exp) -> (HappyAbsSyn )
-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn29 #-}
-happyOut29 :: (HappyAbsSyn ) -> (Exp)
-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut29 #-}
-happyIn30 :: (Exp) -> (HappyAbsSyn )
-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn30 #-}
-happyOut30 :: (HappyAbsSyn ) -> (Exp)
-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut30 #-}
-happyIn31 :: (Exp) -> (HappyAbsSyn )
-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn31 #-}
-happyOut31 :: (HappyAbsSyn ) -> (Exp)
-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut31 #-}
-happyIn32 :: (Exp) -> (HappyAbsSyn )
-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn32 #-}
-happyOut32 :: (HappyAbsSyn ) -> (Exp)
-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut32 #-}
-happyIn33 :: (Exp) -> (HappyAbsSyn )
-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn33 #-}
-happyOut33 :: (HappyAbsSyn ) -> (Exp)
-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut33 #-}
-happyIn34 :: (Exp) -> (HappyAbsSyn )
-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn34 #-}
-happyOut34 :: (HappyAbsSyn ) -> (Exp)
-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut34 #-}
-happyIn35 :: (Exp) -> (HappyAbsSyn )
-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn35 #-}
-happyOut35 :: (HappyAbsSyn ) -> (Exp)
-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut35 #-}
-happyIn36 :: (Exp) -> (HappyAbsSyn )
-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn36 #-}
-happyOut36 :: (HappyAbsSyn ) -> (Exp)
-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut36 #-}
-happyIn37 :: (Exp) -> (HappyAbsSyn )
-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn37 #-}
-happyOut37 :: (HappyAbsSyn ) -> (Exp)
-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut37 #-}
-happyIn38 :: (Exp) -> (HappyAbsSyn )
-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn38 #-}
-happyOut38 :: (HappyAbsSyn ) -> (Exp)
-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut38 #-}
-happyIn39 :: (Exp) -> (HappyAbsSyn )
-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn39 #-}
-happyOut39 :: (HappyAbsSyn ) -> (Exp)
-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut39 #-}
-happyIn40 :: (SetExp) -> (HappyAbsSyn )
-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn40 #-}
-happyOut40 :: (HappyAbsSyn ) -> (SetExp)
-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut40 #-}
-happyIn41 :: (SetExp) -> (HappyAbsSyn )
-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn41 #-}
-happyOut41 :: (HappyAbsSyn ) -> (SetExp)
-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut41 #-}
-happyIn42 :: (SetExp) -> (HappyAbsSyn )
-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn42 #-}
-happyOut42 :: (HappyAbsSyn ) -> (SetExp)
-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut42 #-}
-happyIn43 :: (SetExp) -> (HappyAbsSyn )
-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn43 #-}
-happyOut43 :: (HappyAbsSyn ) -> (SetExp)
-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut43 #-}
-happyIn44 :: (SetExp) -> (HappyAbsSyn )
-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn44 #-}
-happyOut44 :: (HappyAbsSyn ) -> (SetExp)
-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut44 #-}
-happyIn45 :: (SetExp) -> (HappyAbsSyn )
-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn45 #-}
-happyOut45 :: (HappyAbsSyn ) -> (SetExp)
-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut45 #-}
-happyIn46 :: (SetExp) -> (HappyAbsSyn )
-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn46 #-}
-happyOut46 :: (HappyAbsSyn ) -> (SetExp)
-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut46 #-}
-happyIn47 :: (Decl) -> (HappyAbsSyn )
-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn47 #-}
-happyOut47 :: (HappyAbsSyn ) -> (Decl)
-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut47 #-}
-happyIn48 :: (Quant) -> (HappyAbsSyn )
-happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn48 #-}
-happyOut48 :: (HappyAbsSyn ) -> (Quant)
-happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut48 #-}
-happyIn49 :: (EnumId) -> (HappyAbsSyn )
-happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn49 #-}
-happyOut49 :: (HappyAbsSyn ) -> (EnumId)
-happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut49 #-}
-happyIn50 :: (ModId) -> (HappyAbsSyn )
-happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn50 #-}
-happyOut50 :: (HappyAbsSyn ) -> (ModId)
-happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut50 #-}
-happyIn51 :: (LocId) -> (HappyAbsSyn )
-happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn51 #-}
-happyOut51 :: (HappyAbsSyn ) -> (LocId)
-happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut51 #-}
-happyIn52 :: ([Declaration]) -> (HappyAbsSyn )
-happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn52 #-}
-happyOut52 :: (HappyAbsSyn ) -> ([Declaration])
-happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut52 #-}
-happyIn53 :: ([EnumId]) -> (HappyAbsSyn )
-happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn53 #-}
-happyOut53 :: (HappyAbsSyn ) -> ([EnumId])
-happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut53 #-}
-happyIn54 :: ([Element]) -> (HappyAbsSyn )
-happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn54 #-}
-happyOut54 :: (HappyAbsSyn ) -> ([Element])
-happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut54 #-}
-happyIn55 :: ([Exp]) -> (HappyAbsSyn )
-happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn55 #-}
-happyOut55 :: (HappyAbsSyn ) -> ([Exp])
-happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut55 #-}
-happyIn56 :: ([LocId]) -> (HappyAbsSyn )
-happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn56 #-}
-happyOut56 :: (HappyAbsSyn ) -> ([LocId])
-happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut56 #-}
-happyIn57 :: ([ModId]) -> (HappyAbsSyn )
-happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn57 #-}
-happyOut57 :: (HappyAbsSyn ) -> ([ModId])
-happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut57 #-}
-happyInTok :: (Token) -> (HappyAbsSyn )
-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyInTok #-}
-happyOutTok :: (HappyAbsSyn ) -> (Token)
-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOutTok #-}
-
-
-happyActOffsets :: HappyAddr
-happyActOffsets = HappyA# "\x00\x00\x1b\x01\x00\x00\x17\x01\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\x00\x00\x16\x01\x3a\x01\x00\x00\x00\x00\x09\x00\x32\x01\x00\x00\x54\x00\x1d\x00\x01\x00\x41\x01\x0f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x2a\x01\xf3\x00\xf7\x00\x29\x01\x00\x00\x8d\x05\x00\x00\xb6\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x20\x01\x28\x01\x10\x01\x11\x01\x13\x01\x00\x00\xb4\x00\x8a\x00\xfb\xff\x70\x00\x00\x00\xfb\xff\xde\xff\xfb\xff\x00\x00\xa7\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x07\x01\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x00\xfb\xff\xd4\x00\xb2\x00\x00\x00\xb1\x00\xcc\x00\xce\x00\xa8\x00\x00\x00\xcf\x00\x0c\x00\x00\x00\x8d\x05\x76\x00\x00\x00\xa0\x00\x94\x00\xfd\xff\xfd\xff\xfd\xff\xfd\xff\xfd\xff\xfd\xff\xfd\xff\xc0\x00\xc0\x00\xc0\x00\xc0\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x9b\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x09\x00\xfd\xff\x00\x00\x00\x00\x00\x00\x0f\x00\xfd\xff\xfc\xff\xa1\x00\x89\x00\x80\x00\xaf\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x00\x00\x00\x00\xab\x00\xab\x00\xa5\x00\x82\x00\x8f\x00\x7f\x00\x00\x00\x5d\x00\x70\x00\x00\x00\x00\x00\x56\x00\xfd\xff\x4d\x00\x70\x00\xfb\xff\xbe\x00\x4d\x00\x00\x00\x00\x00\x00\x00\x55\x00\x00\x00\x00\x00\x0f\x00\x70\x00\x00\x00\x70\x00\x00\x00\x36\x00\x70\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x00\x00"#
-
-happyGotoOffsets :: HappyAddr
-happyGotoOffsets = HappyA# "\x05\x00\x00\x00\x00\x00\x00\x00\x7c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x44\x00\x3c\x00\x1e\x00\x18\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x07\x02\x07\x02\x07\x02\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x04\x7f\x03\x5d\x05\xd8\x01\x00\x00\x43\x05\xf6\x00\x2d\x05\x00\x00\x94\x02\x65\x02\x00\x00\x00\x00\x00\x00\x00\x00\x13\x05\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\xff\x00\x00\x00\x00\x00\x00\xfd\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x4f\x00\x18\x06\x02\x06\xf9\x05\xea\x05\xe1\x05\xcb\x05\xcd\x04\xb3\x04\x9d\x04\x6e\x04\x3f\x04\x27\x04\x0f\x04\xf7\x03\xdf\x03\xc7\x03\xaf\x03\x00\x00\x50\x03\x21\x03\xf2\x02\xc3\x02\x36\x02\x00\x00\x00\x00\x00\x00\x0a\x00\xb5\x05\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x05\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\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\xa9\x01\x00\x00\x00\x00\x00\x00\x89\x05\x46\x00\x7a\x01\xe3\x04\xc7\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x01\x00\x00\x1c\x01\x00\x00\xfa\xff\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x05\x00\x00\x00\x00"#
-
-happyDefActions :: HappyAddr
-happyDefActions = HappyA# "\x8a\xff\x00\x00\xfe\xff\x00\x00\xf3\xff\x89\xff\xef\xff\xed\xff\xeb\xff\xec\xff\xe1\xff\xf8\xff\x84\xff\x84\xff\x84\xff\x00\x00\xf2\xff\x00\x00\x00\x00\xfb\xff\x8c\xff\xdb\xff\x80\xff\xd2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdc\xff\xde\xff\xdd\xff\xdf\xff\xe0\xff\xea\xff\x00\x00\xa7\xff\xa6\xff\xa5\xff\x95\xff\x83\xff\xcd\xff\xc9\xff\xc7\xff\xc5\xff\xc3\xff\xc1\xff\xbf\xff\xb6\xff\xb4\xff\xb1\xff\xae\xff\xaa\xff\xa8\xff\xa4\xff\xa0\xff\x9e\xff\x9c\xff\x9a\xff\x98\xff\x96\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf5\xff\x00\x00\x00\x00\x00\x00\x90\xff\x00\x00\x00\x00\x92\xff\x91\xff\x8f\xff\x8e\xff\x00\x00\xfd\xff\xfc\xff\xf4\xff\xf6\xff\x00\x00\xd7\xff\xf1\xff\xd6\xff\xd8\xff\xd9\xff\xda\xff\x00\x00\x8d\xff\x88\xff\xf9\xff\xee\xff\x86\xff\x7f\xff\xad\xff\xcb\xff\x00\x00\xcc\xff\x00\x00\x8b\xff\x00\x00\x82\xff\x00\x00\x00\x00\xab\xff\x00\x00\xa4\xff\xac\xff\xc0\xff\x8c\xff\xb5\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\xff\xd5\xff\xd4\xff\xdb\xff\x00\x00\xe7\xff\xe6\xff\xe8\xff\xe9\xff\x00\x00\xe5\xff\xca\xff\xc8\xff\xc6\xff\xc4\xff\xc2\xff\x00\x00\xb8\xff\xba\xff\xbd\xff\xbc\xff\xbb\xff\xbe\xff\xb9\xff\xb2\xff\xb3\xff\xaf\xff\xb0\xff\xa1\xff\xa2\xff\x9f\xff\x9d\xff\x9b\xff\x99\xff\x97\xff\x00\x00\x00\x00\x94\xff\xa3\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\xff\x00\x00\x87\xff\x85\xff\xf0\xff\x00\x00\xd0\xff\x81\xff\x93\xff\x00\x00\xce\xff\x00\x00\xb7\xff\xf1\xff\x00\x00\xe2\xff\xe3\xff\x00\x00\xe4\xff\xf7\xff\xcf\xff\xd1\xff\x00\x00\xa9\xff"#
-
-happyCheck :: HappyAddr
-happyCheck = HappyA# "\xff\xff\x06\x00\x01\x00\x06\x00\x03\x00\x0b\x00\x28\x00\x06\x00\x07\x00\x04\x00\x00\x00\x08\x00\x32\x00\x0c\x00\x00\x00\x08\x00\x14\x00\x08\x00\x09\x00\x07\x00\x00\x00\x12\x00\x0a\x00\x0b\x00\x1c\x00\x0a\x00\x0b\x00\x03\x00\x12\x00\x13\x00\x01\x00\x41\x00\x03\x00\x0b\x00\x14\x00\x06\x00\x03\x00\x11\x00\x2b\x00\x13\x00\x27\x00\x0c\x00\x21\x00\x03\x00\x2b\x00\x15\x00\x2d\x00\x2e\x00\x2f\x00\x06\x00\x31\x00\x32\x00\x33\x00\x30\x00\x03\x00\x36\x00\x37\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x20\x00\x41\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x06\x00\x27\x00\x3e\x00\x2e\x00\x3e\x00\x2b\x00\x03\x00\x2d\x00\x2e\x00\x2f\x00\x35\x00\x31\x00\x32\x00\x33\x00\x33\x00\x03\x00\x36\x00\x37\x00\x01\x00\x19\x00\x03\x00\x0f\x00\x10\x00\x06\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x22\x00\x0c\x00\x2e\x00\x25\x00\x26\x00\x15\x00\x0d\x00\x0e\x00\x2a\x00\x35\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x0e\x00\x0f\x00\x33\x00\x3a\x00\x01\x00\x13\x00\x03\x00\x03\x00\x2f\x00\x06\x00\x33\x00\x24\x00\x2a\x00\x34\x00\x27\x00\x0c\x00\x2e\x00\x29\x00\x2b\x00\x43\x00\x2d\x00\x2e\x00\x2f\x00\x35\x00\x31\x00\x32\x00\x33\x00\x03\x00\x13\x00\x36\x00\x37\x00\x16\x00\x03\x00\x41\x00\x10\x00\x06\x00\x3b\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x0c\x00\x27\x00\x3b\x00\x00\x00\x18\x00\x2b\x00\x2b\x00\x2d\x00\x2e\x00\x2f\x00\x2f\x00\x31\x00\x32\x00\x33\x00\x15\x00\x34\x00\x36\x00\x37\x00\x01\x00\x04\x00\x03\x00\x12\x00\x13\x00\x06\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x2d\x00\x0c\x00\x05\x00\x2b\x00\x31\x00\x2d\x00\x0d\x00\x39\x00\x06\x00\x31\x00\x32\x00\x33\x00\x1d\x00\x09\x00\x36\x00\x37\x00\x0c\x00\x03\x00\x06\x00\x3c\x00\x06\x00\x2c\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x0c\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x2b\x00\x0c\x00\x2d\x00\x41\x00\x07\x00\x19\x00\x31\x00\x32\x00\x33\x00\x3b\x00\x28\x00\x36\x00\x37\x00\x2b\x00\x22\x00\x13\x00\x16\x00\x25\x00\x26\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x41\x00\x38\x00\x2b\x00\x3b\x00\x00\x00\x01\x00\x02\x00\x03\x00\x1d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x3b\x00\x37\x00\x03\x00\x03\x00\x41\x00\x3d\x00\x3a\x00\x03\x00\x3e\x00\x3f\x00\x40\x00\x41\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\x11\x00\x2c\x00\x41\x00\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\x2b\x00\x2b\x00\x35\x00\x10\x00\x2f\x00\x2f\x00\x15\x00\x2d\x00\x18\x00\x34\x00\x34\x00\x31\x00\x04\x00\x0d\x00\x05\x00\x3c\x00\x39\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\x1d\x00\x2c\x00\x1b\x00\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\x30\x00\x41\x00\x35\x00\x11\x00\x34\x00\x35\x00\x23\x00\x1c\x00\x41\x00\x39\x00\x3e\x00\x43\x00\xff\xff\xff\xff\x3e\x00\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x0c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x15\x00\xff\xff\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x34\x00\x35\x00\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\xff\xff\x02\x00\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\x17\x00\xff\xff\xff\xff\x1a\x00\x35\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\x32\x00\xff\xff\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\x03\x00\xff\xff\xff\xff\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\xff\xff\x03\x00\xff\xff\xff\xff\x15\x00\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x03\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\x15\x00\x2e\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\x35\x00\x15\x00\x2e\x00\xff\xff\xff\xff\x03\x00\xff\xff\xff\xff\xff\xff\x35\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x15\x00\x35\x00\xff\xff\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\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"#
-
-happyTable :: HappyAddr
-happyTable = HappyA# "\x00\x00\x41\x00\x3f\x00\x94\x00\x40\x00\xc9\x00\x69\x00\x41\x00\x42\x00\x03\x00\x52\x00\x7a\x00\xb6\x00\x43\x00\x8a\x00\x8d\x00\xc6\x00\x56\x00\x57\x00\xb0\x00\x1b\x00\x7b\x00\x78\x00\x79\x00\xc7\x00\x78\x00\x79\x00\x14\x00\x94\x00\x54\x00\x3f\x00\x14\x00\x40\x00\x5c\x00\x8b\x00\x41\x00\x22\x00\x1c\x00\x45\x00\x1d\x00\x44\x00\x43\x00\x58\x00\x12\x00\x45\x00\x15\x00\x46\x00\x47\x00\x48\x00\x41\x00\x49\x00\x4a\x00\x4b\x00\x04\x00\x14\x00\x4c\x00\x4d\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x50\x00\x14\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x0d\x00\x44\x00\x03\x00\x16\x00\x03\x00\x45\x00\x64\x00\x46\x00\x47\x00\x48\x00\x17\x00\x49\x00\x4a\x00\x4b\x00\x18\x00\x14\x00\x4c\x00\x4d\x00\x3f\x00\x0e\x00\x40\x00\xc3\x00\xc4\x00\x41\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x0f\x00\x43\x00\x16\x00\x10\x00\x11\x00\x27\x00\x8d\x00\x8e\x00\x12\x00\x5e\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x90\x00\x91\x00\x19\x00\x5e\x00\x3f\x00\x92\x00\x40\x00\x64\x00\x66\x00\x41\x00\x1a\x00\x51\x00\xac\x00\xbd\x00\x44\x00\x43\x00\x16\x00\xcd\x00\x45\x00\xfa\xff\x46\x00\x47\x00\x48\x00\x17\x00\x49\x00\x4a\x00\x4b\x00\x59\x00\x8b\xff\x4c\x00\x4d\x00\x8b\xff\x40\x00\x14\x00\x73\x00\x41\x00\xc0\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x43\x00\x44\x00\xc2\x00\x52\x00\x75\x00\x45\x00\xad\x00\x46\x00\x47\x00\x48\x00\x66\x00\x49\x00\x4a\x00\x4b\x00\x74\x00\x67\x00\x4c\x00\x4d\x00\x3f\x00\x76\x00\x40\x00\x53\x00\x54\x00\x41\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x5a\x00\x43\x00\x86\x00\x45\x00\xb8\x00\x46\x00\x77\x00\x87\x00\x41\x00\x49\x00\x4a\x00\x4b\x00\x89\x00\x7c\x00\x4c\x00\x4d\x00\x7d\x00\x40\x00\x0d\x00\x88\x00\x41\x00\x9b\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x43\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x45\x00\xb9\x00\x46\x00\x14\x00\xb1\x00\x0e\x00\x49\x00\x4a\x00\x4b\x00\xaf\x00\x72\x00\x4c\x00\x4d\x00\x45\x00\x0f\x00\xb3\x00\xb4\x00\x10\x00\x11\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x14\x00\xb6\x00\x45\x00\xb5\x00\x24\x00\x25\x00\x26\x00\x14\x00\x89\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\xb8\x00\x4d\x00\x64\x00\x64\x00\x14\x00\xbb\x00\x5e\x00\x59\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x27\x00\xc8\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\x24\x00\x3d\x00\x14\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\xb1\x00\x65\x00\x17\x00\x73\x00\x66\x00\x66\x00\x74\x00\x5a\x00\x75\x00\x67\x00\x67\x00\x5b\x00\x76\x00\x77\x00\x86\x00\x88\x00\x87\x00\x27\x00\xca\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\x89\x00\x3d\x00\x8a\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x1f\x00\x14\x00\x17\x00\x24\x00\x20\x00\x21\x00\x52\x00\x59\x00\x14\x00\x22\x00\x03\x00\xff\xff\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x27\x00\xcb\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\x00\x00\x3d\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\xbc\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\x00\x00\x3d\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\xc0\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\x00\x00\x3d\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x6a\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\x6b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x3d\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x3d\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x95\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\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\x00\x00\x61\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x60\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\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\x00\x00\x61\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x62\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\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\x00\x00\x61\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x96\x00\x2c\x00\x2d\x00\x2e\x00\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\x00\x00\x61\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x2d\x00\x2e\x00\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\x00\x00\x61\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x2e\x00\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\x00\x00\x61\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\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\x00\x00\x61\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x6d\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\xc2\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x9b\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x9c\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x9d\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x9e\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x9f\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\xa0\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x6e\x00\x00\x00\x17\x00\xa1\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\x00\x00\x61\x00\x27\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x70\x00\x27\x00\x00\x00\x16\x00\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x00\x17\x00\x00\x00\xa2\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\xa4\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x16\x00\x27\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\x00\x00\xbb\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x16\x00\x27\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\x00\x00\x5f\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x16\x00\x27\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\x00\x00\x69\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x16\x00\x27\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x14\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\xcd\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x14\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x80\x00\x17\x00\x81\x00\x00\x00\x82\x00\x83\x00\xbe\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x14\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x85\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\xa6\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x27\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\xa7\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x27\x00\x16\x00\xa8\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x17\x00\x27\x00\x16\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x17\x00\xa9\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\xaa\x00\x3b\x00\x3c\x00\x27\x00\x17\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\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 (1, 128) [
-	(1 , happyReduce_1),
-	(2 , happyReduce_2),
-	(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)
-	]
-
-happy_n_terms = 68 :: Int
-happy_n_nonterms = 54 :: Int
-
-happyReduce_1 = happySpecReduce_1  0# happyReduction_1
-happyReduction_1 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn4
-		 (PosInteger (mkPosToken happy_var_1)
-	)}
-
-happyReduce_2 = happySpecReduce_1  1# happyReduction_2
-happyReduction_2 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn5
-		 (PosDouble (mkPosToken happy_var_1)
-	)}
-
-happyReduce_3 = happySpecReduce_1  2# happyReduction_3
-happyReduction_3 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn6
-		 (PosString (mkPosToken happy_var_1)
-	)}
-
-happyReduce_4 = happySpecReduce_1  3# happyReduction_4
-happyReduction_4 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn7
-		 (PosIdent (mkPosToken happy_var_1)
-	)}
-
-happyReduce_5 = happySpecReduce_1  4# happyReduction_5
-happyReduction_5 happy_x_1
-	 =  case happyOut52 happy_x_1 of { happy_var_1 -> 
-	happyIn8
-		 (Module ((mkCatSpan happy_var_1)) (reverse happy_var_1)
-	)}
-
-happyReduce_6 = happyReduce 4# 5# happyReduction_6
-happyReduction_6 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut7 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	case happyOut53 happy_x_4 of { happy_var_4 -> 
-	happyIn9
-		 (EnumDecl ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_4
-	) `HappyStk` happyRest}}}}
-
-happyReduce_7 = happySpecReduce_1  5# happyReduction_7
-happyReduction_7 happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	happyIn9
-		 (ElementDecl ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_8 = happyReduce 7# 6# happyReduction_8
-happyReduction_8 (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 happyOut14 happy_x_1 of { happy_var_1 -> 
-	case happyOut21 happy_x_2 of { happy_var_2 -> 
-	case happyOut7 happy_x_3 of { happy_var_3 -> 
-	case happyOut17 happy_x_4 of { happy_var_4 -> 
-	case happyOut22 happy_x_5 of { happy_var_5 -> 
-	case happyOut19 happy_x_6 of { happy_var_6 -> 
-	case happyOut15 happy_x_7 of { happy_var_7 -> 
-	happyIn10
-		 (Clafer ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkCatSpan happy_var_4) >- (mkCatSpan happy_var_5) >- (mkCatSpan happy_var_6) >- (mkCatSpan happy_var_7)) happy_var_1 happy_var_2 happy_var_3 happy_var_4 happy_var_5 happy_var_6 happy_var_7
-	) `HappyStk` happyRest}}}}}}}
-
-happyReduce_9 = happySpecReduce_3  7# happyReduction_9
-happyReduction_9 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut55 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	happyIn11
-		 (Constraint ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2)
-	)}}}
-
-happyReduce_10 = happySpecReduce_3  8# happyReduction_10
-happyReduction_10 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut55 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	happyIn12
-		 (SoftConstraint ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2)
-	)}}}
-
-happyReduce_11 = happySpecReduce_3  9# happyReduction_11
-happyReduction_11 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut55 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	happyIn13
-		 (Goal ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2)
-	)}}}
-
-happyReduce_12 = happySpecReduce_0  10# happyReduction_12
-happyReduction_12  =  happyIn14
-		 (AbstractEmpty noSpan
-	)
-
-happyReduce_13 = happySpecReduce_1  10# happyReduction_13
-happyReduction_13 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn14
-		 (Abstract ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_14 = happySpecReduce_0  11# happyReduction_14
-happyReduction_14  =  happyIn15
-		 (ElementsEmpty noSpan
-	)
-
-happyReduce_15 = happySpecReduce_3  11# happyReduction_15
-happyReduction_15 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut54 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (ElementsList ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2)
-	)}}}
-
-happyReduce_16 = happySpecReduce_1  12# happyReduction_16
-happyReduction_16 happy_x_1
-	 =  case happyOut10 happy_x_1 of { happy_var_1 -> 
-	happyIn16
-		 (Subclafer ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_17 = happyReduce 4# 12# happyReduction_17
-happyReduction_17 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut25 happy_x_2 of { happy_var_2 -> 
-	case happyOut22 happy_x_3 of { happy_var_3 -> 
-	case happyOut15 happy_x_4 of { happy_var_4 -> 
-	happyIn16
-		 (ClaferUse ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_3 happy_var_4
-	) `HappyStk` happyRest}}}}
-
-happyReduce_18 = happySpecReduce_1  12# happyReduction_18
-happyReduction_18 happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	happyIn16
-		 (Subconstraint ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_19 = happySpecReduce_1  12# happyReduction_19
-happyReduction_19 happy_x_1
-	 =  case happyOut13 happy_x_1 of { happy_var_1 -> 
-	happyIn16
-		 (Subgoal ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_20 = happySpecReduce_1  12# happyReduction_20
-happyReduction_20 happy_x_1
-	 =  case happyOut12 happy_x_1 of { happy_var_1 -> 
-	happyIn16
-		 (Subsoftconstraint ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_21 = happySpecReduce_0  13# happyReduction_21
-happyReduction_21  =  happyIn17
-		 (SuperEmpty noSpan
-	)
-
-happyReduce_22 = happySpecReduce_2  13# happyReduction_22
-happyReduction_22 happy_x_2
-	happy_x_1
-	 =  case happyOut18 happy_x_1 of { happy_var_1 -> 
-	case happyOut40 happy_x_2 of { happy_var_2 -> 
-	happyIn17
-		 (SuperSome ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_1 happy_var_2
-	)}}
-
-happyReduce_23 = happySpecReduce_1  14# happyReduction_23
-happyReduction_23 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn18
-		 (SuperColon ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_24 = happySpecReduce_1  14# happyReduction_24
-happyReduction_24 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn18
-		 (SuperArrow ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_25 = happySpecReduce_1  14# happyReduction_25
-happyReduction_25 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn18
-		 (SuperMArrow ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_26 = happySpecReduce_0  15# happyReduction_26
-happyReduction_26  =  happyIn19
-		 (InitEmpty noSpan
-	)
-
-happyReduce_27 = happySpecReduce_2  15# happyReduction_27
-happyReduction_27 happy_x_2
-	happy_x_1
-	 =  case happyOut20 happy_x_1 of { happy_var_1 -> 
-	case happyOut26 happy_x_2 of { happy_var_2 -> 
-	happyIn19
-		 (InitSome ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_1 happy_var_2
-	)}}
-
-happyReduce_28 = happySpecReduce_1  16# happyReduction_28
-happyReduction_28 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn20
-		 (InitHow_1 ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_29 = happySpecReduce_1  16# happyReduction_29
-happyReduction_29 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn20
-		 (InitHow_2 ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_30 = happySpecReduce_0  17# happyReduction_30
-happyReduction_30  =  happyIn21
-		 (GCardEmpty noSpan
-	)
-
-happyReduce_31 = happySpecReduce_1  17# happyReduction_31
-happyReduction_31 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn21
-		 (GCardXor ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_32 = happySpecReduce_1  17# happyReduction_32
-happyReduction_32 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn21
-		 (GCardOr ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_33 = happySpecReduce_1  17# happyReduction_33
-happyReduction_33 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn21
-		 (GCardMux ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_34 = happySpecReduce_1  17# happyReduction_34
-happyReduction_34 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn21
-		 (GCardOpt ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_35 = happySpecReduce_1  17# happyReduction_35
-happyReduction_35 happy_x_1
-	 =  case happyOut23 happy_x_1 of { happy_var_1 -> 
-	happyIn21
-		 (GCardInterval ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_36 = happySpecReduce_0  18# happyReduction_36
-happyReduction_36  =  happyIn22
-		 (CardEmpty noSpan
-	)
-
-happyReduce_37 = happySpecReduce_1  18# happyReduction_37
-happyReduction_37 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn22
-		 (CardLone ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_38 = happySpecReduce_1  18# happyReduction_38
-happyReduction_38 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn22
-		 (CardSome ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_39 = happySpecReduce_1  18# happyReduction_39
-happyReduction_39 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn22
-		 (CardAny ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_40 = happySpecReduce_1  18# happyReduction_40
-happyReduction_40 happy_x_1
-	 =  case happyOut4 happy_x_1 of { happy_var_1 -> 
-	happyIn22
-		 (CardNum ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_41 = happySpecReduce_1  18# happyReduction_41
-happyReduction_41 happy_x_1
-	 =  case happyOut23 happy_x_1 of { happy_var_1 -> 
-	happyIn22
-		 (CardInterval ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_42 = happySpecReduce_3  19# happyReduction_42
-happyReduction_42 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut4 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut24 happy_x_3 of { happy_var_3 -> 
-	happyIn23
-		 (NCard ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_43 = happySpecReduce_1  20# happyReduction_43
-happyReduction_43 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn24
-		 (ExIntegerAst ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_44 = happySpecReduce_1  20# happyReduction_44
-happyReduction_44 happy_x_1
-	 =  case happyOut4 happy_x_1 of { happy_var_1 -> 
-	happyIn24
-		 (ExIntegerNum ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_45 = happySpecReduce_1  21# happyReduction_45
-happyReduction_45 happy_x_1
-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
-	happyIn25
-		 (Path ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_46 = happyReduce 5# 22# happyReduction_46
-happyReduction_46 (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 { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut47 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { happy_var_4 -> 
-	case happyOut26 happy_x_5 of { happy_var_5 -> 
-	happyIn26
-		 (DeclAllDisj ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4) >- (mkCatSpan happy_var_5)) happy_var_3 happy_var_5
-	) `HappyStk` happyRest}}}}}
-
-happyReduce_47 = happyReduce 4# 22# happyReduction_47
-happyReduction_47 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut47 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	case happyOut26 happy_x_4 of { happy_var_4 -> 
-	happyIn26
-		 (DeclAll ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_4
-	) `HappyStk` happyRest}}}}
-
-happyReduce_48 = happyReduce 5# 22# happyReduction_48
-happyReduction_48 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut48 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut47 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { happy_var_4 -> 
-	case happyOut26 happy_x_5 of { happy_var_5 -> 
-	happyIn26
-		 (DeclQuantDisj ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4) >- (mkCatSpan happy_var_5)) happy_var_1 happy_var_3 happy_var_5
-	) `HappyStk` happyRest}}}}}
-
-happyReduce_49 = happyReduce 4# 22# happyReduction_49
-happyReduction_49 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut48 happy_x_1 of { happy_var_1 -> 
-	case happyOut47 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	case happyOut26 happy_x_4 of { happy_var_4 -> 
-	happyIn26
-		 (DeclQuant ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_1 happy_var_2 happy_var_4
-	) `HappyStk` happyRest}}}}
-
-happyReduce_50 = happySpecReduce_1  22# happyReduction_50
-happyReduction_50 happy_x_1
-	 =  case happyOut27 happy_x_1 of { happy_var_1 -> 
-	happyIn26
-		 (happy_var_1
-	)}
-
-happyReduce_51 = happySpecReduce_2  23# happyReduction_51
-happyReduction_51 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut28 happy_x_2 of { happy_var_2 -> 
-	happyIn27
-		 (EGMax ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_52 = happySpecReduce_2  23# happyReduction_52
-happyReduction_52 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut28 happy_x_2 of { happy_var_2 -> 
-	happyIn27
-		 (EGMin ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_53 = happySpecReduce_3  23# happyReduction_53
-happyReduction_53 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut27 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut28 happy_x_3 of { happy_var_3 -> 
-	happyIn27
-		 (EIff ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_54 = happySpecReduce_1  23# happyReduction_54
-happyReduction_54 happy_x_1
-	 =  case happyOut28 happy_x_1 of { happy_var_1 -> 
-	happyIn27
-		 (happy_var_1
-	)}
-
-happyReduce_55 = happySpecReduce_3  24# happyReduction_55
-happyReduction_55 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut28 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut29 happy_x_3 of { happy_var_3 -> 
-	happyIn28
-		 (EImplies ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_56 = happySpecReduce_1  24# happyReduction_56
-happyReduction_56 happy_x_1
-	 =  case happyOut29 happy_x_1 of { happy_var_1 -> 
-	happyIn28
-		 (happy_var_1
-	)}
-
-happyReduce_57 = happySpecReduce_3  25# happyReduction_57
-happyReduction_57 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut29 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut30 happy_x_3 of { happy_var_3 -> 
-	happyIn29
-		 (EOr ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_58 = happySpecReduce_1  25# happyReduction_58
-happyReduction_58 happy_x_1
-	 =  case happyOut30 happy_x_1 of { happy_var_1 -> 
-	happyIn29
-		 (happy_var_1
-	)}
-
-happyReduce_59 = happySpecReduce_3  26# happyReduction_59
-happyReduction_59 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut30 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut31 happy_x_3 of { happy_var_3 -> 
-	happyIn30
-		 (EXor ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_60 = happySpecReduce_1  26# happyReduction_60
-happyReduction_60 happy_x_1
-	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
-	happyIn30
-		 (happy_var_1
-	)}
-
-happyReduce_61 = happySpecReduce_3  27# happyReduction_61
-happyReduction_61 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut32 happy_x_3 of { happy_var_3 -> 
-	happyIn31
-		 (EAnd ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_62 = happySpecReduce_1  27# happyReduction_62
-happyReduction_62 happy_x_1
-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> 
-	happyIn31
-		 (happy_var_1
-	)}
-
-happyReduce_63 = happySpecReduce_2  28# happyReduction_63
-happyReduction_63 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut33 happy_x_2 of { happy_var_2 -> 
-	happyIn32
-		 (ENeg ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_64 = happySpecReduce_1  28# happyReduction_64
-happyReduction_64 happy_x_1
-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
-	happyIn32
-		 (happy_var_1
-	)}
-
-happyReduce_65 = happySpecReduce_3  29# happyReduction_65
-happyReduction_65 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut34 happy_x_3 of { happy_var_3 -> 
-	happyIn33
-		 (ELt ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_66 = happySpecReduce_3  29# happyReduction_66
-happyReduction_66 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut34 happy_x_3 of { happy_var_3 -> 
-	happyIn33
-		 (EGt ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_67 = happySpecReduce_3  29# happyReduction_67
-happyReduction_67 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut34 happy_x_3 of { happy_var_3 -> 
-	happyIn33
-		 (EEq ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_68 = happySpecReduce_3  29# happyReduction_68
-happyReduction_68 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut34 happy_x_3 of { happy_var_3 -> 
-	happyIn33
-		 (ELte ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_69 = happySpecReduce_3  29# happyReduction_69
-happyReduction_69 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut34 happy_x_3 of { happy_var_3 -> 
-	happyIn33
-		 (EGte ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_70 = happySpecReduce_3  29# happyReduction_70
-happyReduction_70 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut34 happy_x_3 of { happy_var_3 -> 
-	happyIn33
-		 (ENeq ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_71 = happySpecReduce_3  29# happyReduction_71
-happyReduction_71 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut34 happy_x_3 of { happy_var_3 -> 
-	happyIn33
-		 (EIn ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_72 = happyReduce 4# 29# happyReduction_72
-happyReduction_72 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut33 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	case happyOut34 happy_x_4 of { happy_var_4 -> 
-	happyIn33
-		 (ENin ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_1 happy_var_4
-	) `HappyStk` happyRest}}}}
-
-happyReduce_73 = happySpecReduce_1  29# happyReduction_73
-happyReduction_73 happy_x_1
-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
-	happyIn33
-		 (happy_var_1
-	)}
-
-happyReduce_74 = happySpecReduce_2  30# happyReduction_74
-happyReduction_74 happy_x_2
-	happy_x_1
-	 =  case happyOut48 happy_x_1 of { happy_var_1 -> 
-	case happyOut38 happy_x_2 of { happy_var_2 -> 
-	happyIn34
-		 (QuantExp ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_1 happy_var_2
-	)}}
-
-happyReduce_75 = happySpecReduce_1  30# happyReduction_75
-happyReduction_75 happy_x_1
-	 =  case happyOut35 happy_x_1 of { happy_var_1 -> 
-	happyIn34
-		 (happy_var_1
-	)}
-
-happyReduce_76 = happySpecReduce_3  31# happyReduction_76
-happyReduction_76 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut35 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut36 happy_x_3 of { happy_var_3 -> 
-	happyIn35
-		 (EAdd ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_77 = happySpecReduce_3  31# happyReduction_77
-happyReduction_77 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut35 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut36 happy_x_3 of { happy_var_3 -> 
-	happyIn35
-		 (ESub ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_78 = happySpecReduce_1  31# happyReduction_78
-happyReduction_78 happy_x_1
-	 =  case happyOut36 happy_x_1 of { happy_var_1 -> 
-	happyIn35
-		 (happy_var_1
-	)}
-
-happyReduce_79 = happySpecReduce_3  32# happyReduction_79
-happyReduction_79 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut36 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut37 happy_x_3 of { happy_var_3 -> 
-	happyIn36
-		 (EMul ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_80 = happySpecReduce_3  32# happyReduction_80
-happyReduction_80 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut36 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut37 happy_x_3 of { happy_var_3 -> 
-	happyIn36
-		 (EDiv ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_81 = happySpecReduce_1  32# happyReduction_81
-happyReduction_81 happy_x_1
-	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
-	happyIn36
-		 (happy_var_1
-	)}
-
-happyReduce_82 = happySpecReduce_2  33# happyReduction_82
-happyReduction_82 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut38 happy_x_2 of { happy_var_2 -> 
-	happyIn37
-		 (ESumSetExp ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_83 = happySpecReduce_2  33# happyReduction_83
-happyReduction_83 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut38 happy_x_2 of { happy_var_2 -> 
-	happyIn37
-		 (ECSetExp ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_84 = happySpecReduce_2  33# happyReduction_84
-happyReduction_84 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut38 happy_x_2 of { happy_var_2 -> 
-	happyIn37
-		 (EMinExp ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
-	)}}
-
-happyReduce_85 = happySpecReduce_1  33# happyReduction_85
-happyReduction_85 happy_x_1
-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
-	happyIn37
-		 (happy_var_1
-	)}
-
-happyReduce_86 = happyReduce 6# 34# happyReduction_86
-happyReduction_86 (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 { happy_var_1 -> 
-	case happyOut38 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { happy_var_3 -> 
-	case happyOut38 happy_x_4 of { happy_var_4 -> 
-	case happyOutTok happy_x_5 of { happy_var_5 -> 
-	case happyOut39 happy_x_6 of { happy_var_6 -> 
-	happyIn38
-		 (EImpliesElse ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4) >- (mkTokenSpan happy_var_5) >- (mkCatSpan happy_var_6)) happy_var_2 happy_var_4 happy_var_6
-	) `HappyStk` happyRest}}}}}}
-
-happyReduce_87 = happySpecReduce_1  34# happyReduction_87
-happyReduction_87 happy_x_1
-	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
-	happyIn38
-		 (happy_var_1
-	)}
-
-happyReduce_88 = happySpecReduce_1  35# happyReduction_88
-happyReduction_88 happy_x_1
-	 =  case happyOut4 happy_x_1 of { happy_var_1 -> 
-	happyIn39
-		 (EInt ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_89 = happySpecReduce_1  35# happyReduction_89
-happyReduction_89 happy_x_1
-	 =  case happyOut5 happy_x_1 of { happy_var_1 -> 
-	happyIn39
-		 (EDouble ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_90 = happySpecReduce_1  35# happyReduction_90
-happyReduction_90 happy_x_1
-	 =  case happyOut6 happy_x_1 of { happy_var_1 -> 
-	happyIn39
-		 (EStr ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_91 = happySpecReduce_1  35# happyReduction_91
-happyReduction_91 happy_x_1
-	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
-	happyIn39
-		 (ESetExp ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_92 = happySpecReduce_3  35# happyReduction_92
-happyReduction_92 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut26 happy_x_2 of { happy_var_2 -> 
-	happyIn39
-		 (happy_var_2
-	)}
-
-happyReduce_93 = happySpecReduce_3  36# happyReduction_93
-happyReduction_93 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn40
-		 (Union ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_94 = happySpecReduce_3  36# happyReduction_94
-happyReduction_94 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn40
-		 (UnionCom ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_95 = happySpecReduce_1  36# happyReduction_95
-happyReduction_95 happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	happyIn40
-		 (happy_var_1
-	)}
-
-happyReduce_96 = happySpecReduce_3  37# happyReduction_96
-happyReduction_96 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut42 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (Difference ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_97 = happySpecReduce_1  37# happyReduction_97
-happyReduction_97 happy_x_1
-	 =  case happyOut42 happy_x_1 of { happy_var_1 -> 
-	happyIn41
-		 (happy_var_1
-	)}
-
-happyReduce_98 = happySpecReduce_3  38# happyReduction_98
-happyReduction_98 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut42 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut43 happy_x_3 of { happy_var_3 -> 
-	happyIn42
-		 (Intersection ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_99 = happySpecReduce_1  38# happyReduction_99
-happyReduction_99 happy_x_1
-	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
-	happyIn42
-		 (happy_var_1
-	)}
-
-happyReduce_100 = happySpecReduce_3  39# happyReduction_100
-happyReduction_100 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut44 happy_x_3 of { happy_var_3 -> 
-	happyIn43
-		 (Domain ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_101 = happySpecReduce_1  39# happyReduction_101
-happyReduction_101 happy_x_1
-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
-	happyIn43
-		 (happy_var_1
-	)}
-
-happyReduce_102 = happySpecReduce_3  40# happyReduction_102
-happyReduction_102 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut45 happy_x_3 of { happy_var_3 -> 
-	happyIn44
-		 (Range ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_103 = happySpecReduce_1  40# happyReduction_103
-happyReduction_103 happy_x_1
-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
-	happyIn44
-		 (happy_var_1
-	)}
-
-happyReduce_104 = happySpecReduce_3  41# happyReduction_104
-happyReduction_104 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut46 happy_x_3 of { happy_var_3 -> 
-	happyIn45
-		 (Join ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_105 = happySpecReduce_1  41# happyReduction_105
-happyReduction_105 happy_x_1
-	 =  case happyOut46 happy_x_1 of { happy_var_1 -> 
-	happyIn45
-		 (happy_var_1
-	)}
-
-happyReduce_106 = happySpecReduce_1  42# happyReduction_106
-happyReduction_106 happy_x_1
-	 =  case happyOut25 happy_x_1 of { happy_var_1 -> 
-	happyIn46
-		 (ClaferId ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_107 = happySpecReduce_3  42# happyReduction_107
-happyReduction_107 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut40 happy_x_2 of { happy_var_2 -> 
-	happyIn46
-		 (happy_var_2
-	)}
-
-happyReduce_108 = happySpecReduce_3  43# happyReduction_108
-happyReduction_108 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut56 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut40 happy_x_3 of { happy_var_3 -> 
-	happyIn47
-		 (Decl ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
-	)}}}
-
-happyReduce_109 = happySpecReduce_1  44# happyReduction_109
-happyReduction_109 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn48
-		 (QuantNo ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_110 = happySpecReduce_1  44# happyReduction_110
-happyReduction_110 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn48
-		 (QuantNot ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_111 = happySpecReduce_1  44# happyReduction_111
-happyReduction_111 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn48
-		 (QuantLone ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_112 = happySpecReduce_1  44# happyReduction_112
-happyReduction_112 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn48
-		 (QuantOne ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_113 = happySpecReduce_1  44# happyReduction_113
-happyReduction_113 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn48
-		 (QuantSome ((mkTokenSpan happy_var_1))
-	)}
-
-happyReduce_114 = happySpecReduce_1  45# happyReduction_114
-happyReduction_114 happy_x_1
-	 =  case happyOut7 happy_x_1 of { happy_var_1 -> 
-	happyIn49
-		 (EnumIdIdent ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_115 = happySpecReduce_1  46# happyReduction_115
-happyReduction_115 happy_x_1
-	 =  case happyOut7 happy_x_1 of { happy_var_1 -> 
-	happyIn50
-		 (ModIdIdent ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_116 = happySpecReduce_1  47# happyReduction_116
-happyReduction_116 happy_x_1
-	 =  case happyOut7 happy_x_1 of { happy_var_1 -> 
-	happyIn51
-		 (LocIdIdent ((mkCatSpan happy_var_1)) happy_var_1
-	)}
-
-happyReduce_117 = happySpecReduce_0  48# happyReduction_117
-happyReduction_117  =  happyIn52
-		 ([]
-	)
-
-happyReduce_118 = happySpecReduce_2  48# happyReduction_118
-happyReduction_118 happy_x_2
-	happy_x_1
-	 =  case happyOut52 happy_x_1 of { happy_var_1 -> 
-	case happyOut9 happy_x_2 of { happy_var_2 -> 
-	happyIn52
-		 (flip (:)  happy_var_1 happy_var_2
-	)}}
-
-happyReduce_119 = happySpecReduce_1  49# happyReduction_119
-happyReduction_119 happy_x_1
-	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
-	happyIn53
-		 ((:[])  happy_var_1
-	)}
-
-happyReduce_120 = happySpecReduce_3  49# happyReduction_120
-happyReduction_120 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
-	case happyOut53 happy_x_3 of { happy_var_3 -> 
-	happyIn53
-		 ((:)  happy_var_1 happy_var_3
-	)}}
-
-happyReduce_121 = happySpecReduce_0  50# happyReduction_121
-happyReduction_121  =  happyIn54
-		 ([]
-	)
-
-happyReduce_122 = happySpecReduce_2  50# happyReduction_122
-happyReduction_122 happy_x_2
-	happy_x_1
-	 =  case happyOut54 happy_x_1 of { happy_var_1 -> 
-	case happyOut16 happy_x_2 of { happy_var_2 -> 
-	happyIn54
-		 (flip (:)  happy_var_1 happy_var_2
-	)}}
-
-happyReduce_123 = happySpecReduce_0  51# happyReduction_123
-happyReduction_123  =  happyIn55
-		 ([]
-	)
-
-happyReduce_124 = happySpecReduce_2  51# happyReduction_124
-happyReduction_124 happy_x_2
-	happy_x_1
-	 =  case happyOut55 happy_x_1 of { happy_var_1 -> 
-	case happyOut26 happy_x_2 of { happy_var_2 -> 
-	happyIn55
-		 (flip (:)  happy_var_1 happy_var_2
-	)}}
-
-happyReduce_125 = happySpecReduce_1  52# happyReduction_125
-happyReduction_125 happy_x_1
-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
-	happyIn56
-		 ((:[])  happy_var_1
-	)}
-
-happyReduce_126 = happySpecReduce_3  52# happyReduction_126
-happyReduction_126 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
-	case happyOut56 happy_x_3 of { happy_var_3 -> 
-	happyIn56
-		 ((:)  happy_var_1 happy_var_3
-	)}}
-
-happyReduce_127 = happySpecReduce_1  53# happyReduction_127
-happyReduction_127 happy_x_1
-	 =  case happyOut50 happy_x_1 of { happy_var_1 -> 
-	happyIn57
-		 ((:[])  happy_var_1
-	)}
-
-happyReduce_128 = happySpecReduce_3  53# happyReduction_128
-happyReduction_128 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut50 happy_x_1 of { happy_var_1 -> 
-	case happyOut57 happy_x_3 of { happy_var_3 -> 
-	happyIn57
-		 ((:)  happy_var_1 happy_var_3
-	)}}
-
-happyNewToken action sts stk [] =
-	happyDoAction 67# notHappyAtAll action sts stk []
-
-happyNewToken action sts stk (tk:tks) =
-	let cont i = happyDoAction i tk action sts stk tks in
-	case tk of {
-	PT _ (TS _ 1) -> cont 1#;
-	PT _ (TS _ 2) -> cont 2#;
-	PT _ (TS _ 3) -> cont 3#;
-	PT _ (TS _ 4) -> cont 4#;
-	PT _ (TS _ 5) -> cont 5#;
-	PT _ (TS _ 6) -> cont 6#;
-	PT _ (TS _ 7) -> cont 7#;
-	PT _ (TS _ 8) -> cont 8#;
-	PT _ (TS _ 9) -> cont 9#;
-	PT _ (TS _ 10) -> cont 10#;
-	PT _ (TS _ 11) -> cont 11#;
-	PT _ (TS _ 12) -> cont 12#;
-	PT _ (TS _ 13) -> cont 13#;
-	PT _ (TS _ 14) -> cont 14#;
-	PT _ (TS _ 15) -> cont 15#;
-	PT _ (TS _ 16) -> cont 16#;
-	PT _ (TS _ 17) -> cont 17#;
-	PT _ (TS _ 18) -> cont 18#;
-	PT _ (TS _ 19) -> cont 19#;
-	PT _ (TS _ 20) -> cont 20#;
-	PT _ (TS _ 21) -> cont 21#;
-	PT _ (TS _ 22) -> cont 22#;
-	PT _ (TS _ 23) -> cont 23#;
-	PT _ (TS _ 24) -> cont 24#;
-	PT _ (TS _ 25) -> cont 25#;
-	PT _ (TS _ 26) -> cont 26#;
-	PT _ (TS _ 27) -> cont 27#;
-	PT _ (TS _ 28) -> cont 28#;
-	PT _ (TS _ 29) -> cont 29#;
-	PT _ (TS _ 30) -> cont 30#;
-	PT _ (TS _ 31) -> cont 31#;
-	PT _ (TS _ 32) -> cont 32#;
-	PT _ (TS _ 33) -> cont 33#;
-	PT _ (TS _ 34) -> cont 34#;
-	PT _ (TS _ 35) -> cont 35#;
-	PT _ (TS _ 36) -> cont 36#;
-	PT _ (TS _ 37) -> cont 37#;
-	PT _ (TS _ 38) -> cont 38#;
-	PT _ (TS _ 39) -> cont 39#;
-	PT _ (TS _ 40) -> cont 40#;
-	PT _ (TS _ 41) -> cont 41#;
-	PT _ (TS _ 42) -> cont 42#;
-	PT _ (TS _ 43) -> cont 43#;
-	PT _ (TS _ 44) -> cont 44#;
-	PT _ (TS _ 45) -> cont 45#;
-	PT _ (TS _ 46) -> cont 46#;
-	PT _ (TS _ 47) -> cont 47#;
-	PT _ (TS _ 48) -> cont 48#;
-	PT _ (TS _ 49) -> cont 49#;
-	PT _ (TS _ 50) -> cont 50#;
-	PT _ (TS _ 51) -> cont 51#;
-	PT _ (TS _ 52) -> cont 52#;
-	PT _ (TS _ 53) -> cont 53#;
-	PT _ (TS _ 54) -> cont 54#;
-	PT _ (TS _ 55) -> cont 55#;
-	PT _ (TS _ 56) -> cont 56#;
-	PT _ (TS _ 57) -> cont 57#;
-	PT _ (TS _ 58) -> cont 58#;
-	PT _ (TS _ 59) -> cont 59#;
-	PT _ (TS _ 60) -> cont 60#;
-	PT _ (TS _ 61) -> cont 61#;
-	PT _ (T_PosInteger _) -> cont 62#;
-	PT _ (T_PosDouble _) -> cont 63#;
-	PT _ (T_PosString _) -> cont 64#;
-	PT _ (T_PosIdent _) -> cont 65#;
-	_ -> cont 66#;
-	_ -> happyError' (tk:tks)
-	}
-
-happyError_ 67# tk tks = happyError' tks
-happyError_ _ tk tks = happyError' (tk:tks)
-
-happyThen :: () => Err a -> (a -> Err b) -> Err b
-happyThen = (thenM)
-happyReturn :: () => a -> Err a
-happyReturn = (returnM)
-happyThen1 m k tks = (thenM) m (\a -> k a tks)
-happyReturn1 :: () => a -> b -> Err a
-happyReturn1 = \a tks -> (returnM) a
-happyError' :: () => [(Token)] -> Err a
-happyError' = happyError
-
-pModule tks = happySomeParser where
-  happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut8 x))
+happyIn8 :: (PosInteger) -> (HappyAbsSyn )
+happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn8 #-}
+happyOut8 :: (HappyAbsSyn ) -> (PosInteger)
+happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut8 #-}
+happyIn9 :: (PosDouble) -> (HappyAbsSyn )
+happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn9 #-}
+happyOut9 :: (HappyAbsSyn ) -> (PosDouble)
+happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut9 #-}
+happyIn10 :: (PosString) -> (HappyAbsSyn )
+happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn10 #-}
+happyOut10 :: (HappyAbsSyn ) -> (PosString)
+happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut10 #-}
+happyIn11 :: (PosIdent) -> (HappyAbsSyn )
+happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn11 #-}
+happyOut11 :: (HappyAbsSyn ) -> (PosIdent)
+happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut11 #-}
+happyIn12 :: (Module) -> (HappyAbsSyn )
+happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn12 #-}
+happyOut12 :: (HappyAbsSyn ) -> (Module)
+happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut12 #-}
+happyIn13 :: (Declaration) -> (HappyAbsSyn )
+happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn13 #-}
+happyOut13 :: (HappyAbsSyn ) -> (Declaration)
+happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut13 #-}
+happyIn14 :: (Clafer) -> (HappyAbsSyn )
+happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn14 #-}
+happyOut14 :: (HappyAbsSyn ) -> (Clafer)
+happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut14 #-}
+happyIn15 :: (Constraint) -> (HappyAbsSyn )
+happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn15 #-}
+happyOut15 :: (HappyAbsSyn ) -> (Constraint)
+happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut15 #-}
+happyIn16 :: (SoftConstraint) -> (HappyAbsSyn )
+happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn16 #-}
+happyOut16 :: (HappyAbsSyn ) -> (SoftConstraint)
+happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut16 #-}
+happyIn17 :: (Goal) -> (HappyAbsSyn )
+happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn17 #-}
+happyOut17 :: (HappyAbsSyn ) -> (Goal)
+happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut17 #-}
+happyIn18 :: (Abstract) -> (HappyAbsSyn )
+happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn18 #-}
+happyOut18 :: (HappyAbsSyn ) -> (Abstract)
+happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut18 #-}
+happyIn19 :: (Elements) -> (HappyAbsSyn )
+happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn19 #-}
+happyOut19 :: (HappyAbsSyn ) -> (Elements)
+happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut19 #-}
+happyIn20 :: (Element) -> (HappyAbsSyn )
+happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn20 #-}
+happyOut20 :: (HappyAbsSyn ) -> (Element)
+happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut20 #-}
+happyIn21 :: (Super) -> (HappyAbsSyn )
+happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn21 #-}
+happyOut21 :: (HappyAbsSyn ) -> (Super)
+happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut21 #-}
+happyIn22 :: (Reference) -> (HappyAbsSyn )
+happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn22 #-}
+happyOut22 :: (HappyAbsSyn ) -> (Reference)
+happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut22 #-}
+happyIn23 :: (Init) -> (HappyAbsSyn )
+happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn23 #-}
+happyOut23 :: (HappyAbsSyn ) -> (Init)
+happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut23 #-}
+happyIn24 :: (InitHow) -> (HappyAbsSyn )
+happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn24 #-}
+happyOut24 :: (HappyAbsSyn ) -> (InitHow)
+happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut24 #-}
+happyIn25 :: (GCard) -> (HappyAbsSyn )
+happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn25 #-}
+happyOut25 :: (HappyAbsSyn ) -> (GCard)
+happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut25 #-}
+happyIn26 :: (Card) -> (HappyAbsSyn )
+happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn26 #-}
+happyOut26 :: (HappyAbsSyn ) -> (Card)
+happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut26 #-}
+happyIn27 :: (NCard) -> (HappyAbsSyn )
+happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn27 #-}
+happyOut27 :: (HappyAbsSyn ) -> (NCard)
+happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut27 #-}
+happyIn28 :: (ExInteger) -> (HappyAbsSyn )
+happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn28 #-}
+happyOut28 :: (HappyAbsSyn ) -> (ExInteger)
+happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut28 #-}
+happyIn29 :: (Name) -> (HappyAbsSyn )
+happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn29 #-}
+happyOut29 :: (HappyAbsSyn ) -> (Name)
+happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut29 #-}
+happyIn30 :: (Exp) -> (HappyAbsSyn )
+happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn30 #-}
+happyOut30 :: (HappyAbsSyn ) -> (Exp)
+happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut30 #-}
+happyIn31 :: (Exp) -> (HappyAbsSyn )
+happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn31 #-}
+happyOut31 :: (HappyAbsSyn ) -> (Exp)
+happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut31 #-}
+happyIn32 :: (Exp) -> (HappyAbsSyn )
+happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn32 #-}
+happyOut32 :: (HappyAbsSyn ) -> (Exp)
+happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut32 #-}
+happyIn33 :: (Exp) -> (HappyAbsSyn )
+happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn33 #-}
+happyOut33 :: (HappyAbsSyn ) -> (Exp)
+happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut33 #-}
+happyIn34 :: (Exp) -> (HappyAbsSyn )
+happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn34 #-}
+happyOut34 :: (HappyAbsSyn ) -> (Exp)
+happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut34 #-}
+happyIn35 :: (Exp) -> (HappyAbsSyn )
+happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn35 #-}
+happyOut35 :: (HappyAbsSyn ) -> (Exp)
+happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut35 #-}
+happyIn36 :: (Exp) -> (HappyAbsSyn )
+happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn36 #-}
+happyOut36 :: (HappyAbsSyn ) -> (Exp)
+happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut36 #-}
+happyIn37 :: (Exp) -> (HappyAbsSyn )
+happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn37 #-}
+happyOut37 :: (HappyAbsSyn ) -> (Exp)
+happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut37 #-}
+happyIn38 :: (Exp) -> (HappyAbsSyn )
+happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn38 #-}
+happyOut38 :: (HappyAbsSyn ) -> (Exp)
+happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut38 #-}
+happyIn39 :: (Exp) -> (HappyAbsSyn )
+happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn39 #-}
+happyOut39 :: (HappyAbsSyn ) -> (Exp)
+happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut39 #-}
+happyIn40 :: (Exp) -> (HappyAbsSyn )
+happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn40 #-}
+happyOut40 :: (HappyAbsSyn ) -> (Exp)
+happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut40 #-}
+happyIn41 :: (Exp) -> (HappyAbsSyn )
+happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn41 #-}
+happyOut41 :: (HappyAbsSyn ) -> (Exp)
+happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut41 #-}
+happyIn42 :: (Exp) -> (HappyAbsSyn )
+happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn42 #-}
+happyOut42 :: (HappyAbsSyn ) -> (Exp)
+happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut42 #-}
+happyIn43 :: (Exp) -> (HappyAbsSyn )
+happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn43 #-}
+happyOut43 :: (HappyAbsSyn ) -> (Exp)
+happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut43 #-}
+happyIn44 :: (SetExp) -> (HappyAbsSyn )
+happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn44 #-}
+happyOut44 :: (HappyAbsSyn ) -> (SetExp)
+happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut44 #-}
+happyIn45 :: (SetExp) -> (HappyAbsSyn )
+happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn45 #-}
+happyOut45 :: (HappyAbsSyn ) -> (SetExp)
+happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut45 #-}
+happyIn46 :: (SetExp) -> (HappyAbsSyn )
+happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn46 #-}
+happyOut46 :: (HappyAbsSyn ) -> (SetExp)
+happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut46 #-}
+happyIn47 :: (SetExp) -> (HappyAbsSyn )
+happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn47 #-}
+happyOut47 :: (HappyAbsSyn ) -> (SetExp)
+happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut47 #-}
+happyIn48 :: (SetExp) -> (HappyAbsSyn )
+happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn48 #-}
+happyOut48 :: (HappyAbsSyn ) -> (SetExp)
+happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut48 #-}
+happyIn49 :: (SetExp) -> (HappyAbsSyn )
+happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn49 #-}
+happyOut49 :: (HappyAbsSyn ) -> (SetExp)
+happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut49 #-}
+happyIn50 :: (SetExp) -> (HappyAbsSyn )
+happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn50 #-}
+happyOut50 :: (HappyAbsSyn ) -> (SetExp)
+happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut50 #-}
+happyIn51 :: (Decl) -> (HappyAbsSyn )
+happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn51 #-}
+happyOut51 :: (HappyAbsSyn ) -> (Decl)
+happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut51 #-}
+happyIn52 :: (Quant) -> (HappyAbsSyn )
+happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn52 #-}
+happyOut52 :: (HappyAbsSyn ) -> (Quant)
+happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut52 #-}
+happyIn53 :: (EnumId) -> (HappyAbsSyn )
+happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn53 #-}
+happyOut53 :: (HappyAbsSyn ) -> (EnumId)
+happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut53 #-}
+happyIn54 :: (ModId) -> (HappyAbsSyn )
+happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn54 #-}
+happyOut54 :: (HappyAbsSyn ) -> (ModId)
+happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut54 #-}
+happyIn55 :: (LocId) -> (HappyAbsSyn )
+happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn55 #-}
+happyOut55 :: (HappyAbsSyn ) -> (LocId)
+happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut55 #-}
+happyIn56 :: ([Declaration]) -> (HappyAbsSyn )
+happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn56 #-}
+happyOut56 :: (HappyAbsSyn ) -> ([Declaration])
+happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut56 #-}
+happyIn57 :: ([EnumId]) -> (HappyAbsSyn )
+happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn57 #-}
+happyOut57 :: (HappyAbsSyn ) -> ([EnumId])
+happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut57 #-}
+happyIn58 :: ([Element]) -> (HappyAbsSyn )
+happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn58 #-}
+happyOut58 :: (HappyAbsSyn ) -> ([Element])
+happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut58 #-}
+happyIn59 :: ([Exp]) -> (HappyAbsSyn )
+happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn59 #-}
+happyOut59 :: (HappyAbsSyn ) -> ([Exp])
+happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut59 #-}
+happyIn60 :: ([LocId]) -> (HappyAbsSyn )
+happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn60 #-}
+happyOut60 :: (HappyAbsSyn ) -> ([LocId])
+happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut60 #-}
+happyIn61 :: ([ModId]) -> (HappyAbsSyn )
+happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn61 #-}
+happyOut61 :: (HappyAbsSyn ) -> ([ModId])
+happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut61 #-}
+happyInTok :: (Token) -> (HappyAbsSyn )
+happyInTok x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyInTok #-}
+happyOutTok :: (HappyAbsSyn ) -> (Token)
+happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOutTok #-}
+
+
+happyActOffsets :: HappyAddr
+happyActOffsets = HappyA# "\x00\x00\x71\x01\x5d\x01\x58\x01\x65\x01\x3e\x01\x00\x00\x38\x01\x00\x00\x38\x01\x57\x01\x2d\x01\x00\x00\x2d\x01\x10\x01\x00\x00\x2d\x01\x8b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x01\x39\x01\x5f\x01\x28\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x01\x34\x01\x13\x01\x14\x01\x49\x01\x00\x00\xc4\x05\x00\x00\x72\x00\x03\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x3f\x01\x43\x01\x31\x01\x33\x01\x37\x01\x00\x00\xb1\x00\x21\x01\x00\x00\xa4\x00\x26\x00\x6c\x00\x26\x00\x00\x00\xd8\xff\x26\x00\x00\x00\x8d\x00\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x2f\x01\x14\x00\x05\x01\xfc\xff\x11\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x0c\x00\x00\x00\x00\x00\x03\x01\x26\x00\x03\x01\xe6\x00\x00\x00\xe1\x00\x08\x01\x07\x01\xd7\x00\x00\x00\x12\x01\xb8\x00\x00\x00\xc4\x05\xd3\x00\x11\x00\x00\x00\xd0\x00\xc8\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x06\x00\x06\x00\x06\x00\x06\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xc2\x00\x8d\x00\x8d\x00\x8d\x00\x8d\x00\x8d\x00\xd1\x00\xb0\x00\xb2\x00\xe5\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x00\x00\x00\x00\xda\x00\x0c\x00\xda\x00\xe0\x00\xc6\x00\xc4\x00\xc5\x00\x00\x00\x95\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x81\x00\x0c\x00\x89\x00\x6c\x00\x26\x00\x59\x00\xfc\xff\x0c\x00\x0c\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\xee\xff\x84\x00\x59\x00\x59\x00\xfb\xff\x90\x00\x00\x00\x00\x00\x59\x00\x6c\x00\x00\x00\x6c\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x35\x00\x67\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+
+happyGotoOffsets :: HappyAddr
+happyGotoOffsets = HappyA# "\x32\x00\x20\x00\x7b\x00\x7e\x00\x77\x00\x00\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x6e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x6b\x00\x00\x00\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x02\x28\x00\x28\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\x78\x04\x00\x00\x00\x00\xa0\x03\x7e\x05\xf9\x01\x64\x05\x00\x00\xe8\x00\x4e\x05\x00\x00\xb5\x02\x86\x02\x00\x00\x00\x00\x00\x00\x00\x00\x34\x05\x00\x00\x00\x00\x00\x00\xca\x01\x00\x00\x3d\x00\x08\x00\x00\x00\xb5\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x29\x00\x02\x06\x00\x00\x00\x00\x00\x00\x1e\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x88\x00\xac\x05\x7c\x00\x4f\x06\x46\x06\x37\x06\x2e\x06\x18\x06\xee\x04\xd4\x04\xbe\x04\x8f\x04\x60\x04\x48\x04\x30\x04\x18\x04\x00\x04\xe8\x03\xd0\x03\x00\x00\x71\x03\x42\x03\x13\x03\xe4\x02\x57\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\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\xec\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x01\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x05\x3c\x00\x6c\x01\x04\x05\x00\x00\x57\x00\xc0\x05\xaa\x05\x00\x00\x00\x00\x00\x00\x00\x00\xda\xff\x9c\x01\x70\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x01\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x94\x05\x18\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+
+happyDefActions :: HappyAddr
+happyDefActions = HappyA# "\x86\xff\xef\xff\x00\x00\x00\x00\x00\x00\x00\x00\xfa\xff\x00\x00\x80\xff\x00\x00\x00\x00\x00\x00\x80\xff\x00\x00\xdd\xff\xee\xff\x00\x00\xef\xff\x85\xff\xeb\xff\xe9\xff\xe7\xff\xe8\xff\xf4\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xff\xda\xff\xd9\xff\xdb\xff\xdc\xff\x00\x00\x80\xff\x00\x00\xa3\xff\xa2\xff\xa1\xff\x88\xff\x91\xff\x7f\xff\xc9\xff\xc5\xff\xc3\xff\xc1\xff\xbf\xff\xbd\xff\xbb\xff\xb2\xff\xb0\xff\xad\xff\xaa\xff\xa6\xff\xa4\xff\xa0\xff\x9c\xff\x9a\xff\x98\xff\x96\xff\x94\xff\x92\xff\x00\x00\x7c\xff\xce\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xff\x00\x00\x00\x00\x8c\xff\x00\x00\x00\x00\x8e\xff\x8d\xff\x8b\xff\x8a\xff\x00\x00\xf9\xff\xf8\xff\xf7\xff\x00\x00\xf2\xff\xe6\xff\x00\x00\x00\x00\xd7\xff\xd3\xff\xed\xff\xd2\xff\xd4\xff\xd5\xff\xd6\xff\x00\x00\xcf\xff\xd1\xff\xd0\xff\xe4\xff\x00\x00\xf1\xff\xa9\xff\xc7\xff\x00\x00\xc8\xff\x00\x00\x87\xff\x00\x00\x7e\xff\x00\x00\x00\x00\xa7\xff\x00\x00\xa0\xff\xa8\xff\xbc\xff\x00\x00\x88\xff\xb1\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xff\xc4\xff\xc2\xff\xc0\xff\xbe\xff\x00\x00\xb4\xff\xb6\xff\xb9\xff\xb8\xff\xb7\xff\xba\xff\xb5\xff\xae\xff\xaf\xff\xab\xff\xac\xff\x9d\xff\x00\x00\x9e\xff\x9b\xff\x99\xff\x97\xff\x95\xff\x93\xff\x00\x00\x00\x00\x7b\xff\x90\xff\x9f\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xff\xd7\xff\x00\x00\x00\x00\x89\xff\x84\xff\xf5\xff\xea\xff\x82\xff\xef\xff\x00\x00\xe2\xff\xe3\xff\xe1\xff\x00\x00\xcc\xff\x7d\xff\x8f\xff\x00\x00\xca\xff\x00\x00\x00\x00\xb3\xff\xcb\xff\xcd\xff\x00\x00\xed\xff\x00\x00\xde\xff\xdf\xff\x83\xff\x81\xff\xec\xff\xe0\xff\xf3\xff\xa5\xff"#
+
+happyCheck :: HappyAddr
+happyCheck = HappyA# "\xff\xff\x29\x00\x01\x00\x07\x00\x03\x00\x09\x00\x05\x00\x19\x00\x00\x00\x03\x00\x07\x00\x05\x00\x32\x00\x0c\x00\x00\x00\x14\x00\x22\x00\x05\x00\x0c\x00\x25\x00\x26\x00\x12\x00\x28\x00\x1c\x00\x0f\x00\x10\x00\x42\x00\x07\x00\x14\x00\x21\x00\x01\x00\x11\x00\x03\x00\x13\x00\x05\x00\x0b\x00\x13\x00\x24\x00\x06\x00\x16\x00\x27\x00\x0c\x00\x0a\x00\x05\x00\x3e\x00\x2c\x00\x03\x00\x2e\x00\x2f\x00\x30\x00\x2c\x00\x32\x00\x33\x00\x34\x00\x04\x00\x0e\x00\x37\x00\x38\x00\x05\x00\x3f\x00\x0b\x00\x20\x00\x38\x00\x03\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x27\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x2c\x00\x0d\x00\x2e\x00\x2f\x00\x30\x00\x42\x00\x32\x00\x33\x00\x34\x00\x2c\x00\x3f\x00\x37\x00\x38\x00\x01\x00\x00\x00\x03\x00\x2e\x00\x05\x00\x33\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x35\x00\x0c\x00\x30\x00\x0a\x00\x0b\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x12\x00\x13\x00\x2f\x00\x03\x00\x01\x00\x03\x00\x03\x00\x34\x00\x05\x00\x33\x00\x03\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x0c\x00\x24\x00\x33\x00\x09\x00\x27\x00\x03\x00\x0c\x00\x03\x00\x09\x00\x2c\x00\x07\x00\x2e\x00\x2f\x00\x30\x00\x08\x00\x32\x00\x33\x00\x34\x00\x03\x00\x03\x00\x37\x00\x38\x00\x01\x00\x15\x00\x03\x00\x15\x00\x05\x00\x27\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x2c\x00\x0c\x00\x2e\x00\x2f\x00\x30\x00\x2d\x00\x32\x00\x33\x00\x34\x00\x31\x00\x3b\x00\x37\x00\x38\x00\x29\x00\x2a\x00\x03\x00\x2e\x00\x05\x00\x2e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x35\x00\x0c\x00\x35\x00\x3c\x00\x2b\x00\x2d\x00\x00\x00\x05\x00\x2f\x00\x31\x00\x2c\x00\x2a\x00\x2e\x00\x34\x00\x3c\x00\x06\x00\x32\x00\x33\x00\x34\x00\x0a\x00\x0b\x00\x37\x00\x38\x00\x42\x00\x12\x00\x13\x00\x0e\x00\x0f\x00\x42\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x2c\x00\x3c\x00\x2e\x00\x0a\x00\x0b\x00\x10\x00\x32\x00\x33\x00\x34\x00\x15\x00\x29\x00\x37\x00\x38\x00\x2c\x00\x18\x00\x00\x00\x01\x00\x02\x00\x03\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x0d\x00\x08\x00\x04\x00\x03\x00\x03\x00\x3a\x00\x3d\x00\x1d\x00\x2d\x00\x3f\x00\x40\x00\x41\x00\x42\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\x42\x00\x2c\x00\x3c\x00\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\x2b\x00\x2b\x00\x35\x00\x42\x00\x2f\x00\x2f\x00\x06\x00\x42\x00\x13\x00\x34\x00\x34\x00\x3c\x00\x16\x00\x39\x00\x1d\x00\x1c\x00\x11\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\x42\x00\x2c\x00\x3b\x00\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\x31\x00\x13\x00\x35\x00\x23\x00\x35\x00\x36\x00\x10\x00\x15\x00\x18\x00\x3a\x00\x08\x00\x0d\x00\x04\x00\x3a\x00\x3f\x00\x3d\x00\x1d\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\x1b\x00\x2c\x00\x42\x00\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\x11\x00\x44\x00\x35\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x22\x00\x0c\x00\x42\x00\x44\x00\x3f\x00\x19\x00\x22\x00\x28\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\x26\x00\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x0c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\x19\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x15\x00\x2b\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\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\xff\xff\x2c\x00\x15\x00\x2e\x00\x44\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x15\x00\xff\xff\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x34\x00\x35\x00\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\x03\x00\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\x15\x00\x2e\x00\x03\x00\xff\xff\xff\xff\x02\x00\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\x2a\x00\xff\xff\x2e\x00\x03\x00\x2e\x00\x17\x00\xff\xff\xff\xff\x1a\x00\x35\x00\x1c\x00\x35\x00\x1e\x00\x1f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\x33\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\x03\x00\xff\xff\xff\xff\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\xff\xff\x03\x00\xff\xff\xff\xff\x15\x00\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x03\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\x15\x00\x2e\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\x35\x00\x15\x00\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\xff\xff\x35\x00\xff\xff\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\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"#
+
+happyTable :: HappyAddr
+happyTable = HappyA# "\x00\x00\x70\x00\x42\x00\x5d\x00\x43\x00\x5e\x00\x44\x00\x09\x00\x60\x00\x43\x00\x82\x00\x44\x00\xbe\x00\x45\x00\x1a\x00\xd2\x00\x0d\x00\xa5\x00\x45\x00\x19\x00\x10\x00\x83\x00\x0b\x00\xd3\x00\xcf\x00\xd0\x00\x53\x00\x63\x00\x61\x00\x5f\x00\x42\x00\x1b\x00\x43\x00\x1c\x00\x44\x00\xd7\x00\x87\xff\x66\x00\x0d\x00\x87\xff\x47\x00\x45\x00\x0e\x00\x44\x00\xd6\x00\x48\x00\x27\x00\x49\x00\x4a\x00\x4b\x00\x48\x00\x4c\x00\x4d\x00\x4e\x00\x10\x00\xb6\x00\x4f\x00\x50\x00\x44\x00\x07\x00\xbc\x00\x46\x00\x50\x00\x6b\x00\x07\x00\x51\x00\x52\x00\x53\x00\x47\x00\x07\x00\x51\x00\x52\x00\x53\x00\x48\x00\x63\x00\x49\x00\x4a\x00\x4b\x00\x53\x00\x4c\x00\x4d\x00\x4e\x00\x48\x00\x07\x00\x4f\x00\x50\x00\x42\x00\x59\x00\x43\x00\x3f\x00\x44\x00\x53\x00\x07\x00\x51\x00\x52\x00\x53\x00\xad\x00\x45\x00\x11\x00\x80\x00\x81\x00\x07\x00\x51\x00\x52\x00\x53\x00\xc2\x00\x5b\x00\x6d\x00\x55\x00\x42\x00\x57\x00\x43\x00\xc5\x00\x44\x00\x21\x00\xb9\x00\x07\x00\x51\x00\x52\x00\x53\x00\x45\x00\x55\x00\x23\x00\x84\x00\x47\x00\x27\x00\x85\x00\x27\x00\x07\x00\x48\x00\x0b\x00\x49\x00\x4a\x00\x4b\x00\x09\x00\x4c\x00\x4d\x00\x4e\x00\xb9\x00\x6b\x00\x4f\x00\x50\x00\x42\x00\x58\x00\x43\x00\x28\x00\x44\x00\x47\x00\x07\x00\x51\x00\x52\x00\x53\x00\x48\x00\x45\x00\x49\x00\x4a\x00\x4b\x00\xba\x00\x4c\x00\x4d\x00\x4e\x00\xd3\x00\xbe\x00\x4f\x00\x50\x00\xa9\x00\x3d\x00\x43\x00\x3f\x00\x44\x00\x3f\x00\x07\x00\x51\x00\x52\x00\x53\x00\x40\x00\x45\x00\x40\x00\xc0\x00\xab\x00\xba\x00\x59\x00\x44\x00\x6d\x00\xbb\x00\x48\x00\xcf\x00\x49\x00\x6e\x00\xc8\x00\xaf\x00\x4c\x00\x4d\x00\x4e\x00\x80\x00\x81\x00\x4f\x00\x50\x00\x53\x00\x5a\x00\x5b\x00\xb8\x00\xb9\x00\x53\x00\x07\x00\x51\x00\x52\x00\x53\x00\x48\x00\xca\x00\x49\x00\x80\x00\x81\x00\x7b\x00\x4c\x00\x4d\x00\x4e\x00\x7c\x00\x7a\x00\x4f\x00\x50\x00\x48\x00\x7d\x00\x24\x00\x25\x00\x26\x00\x27\x00\x07\x00\x51\x00\x52\x00\x53\x00\x7f\x00\x7e\x00\x8e\x00\x6b\x00\x6b\x00\x8f\x00\x90\x00\x91\x00\x98\x00\x07\x00\x51\x00\x52\x00\x53\x00\x28\x00\xd6\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\x53\x00\x3e\x00\xad\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\xb0\x00\x6c\x00\x40\x00\x53\x00\x6d\x00\x6d\x00\xb0\x00\x53\x00\xb2\x00\x6e\x00\x6e\x00\xb4\x00\xb3\x00\xb5\x00\x91\x00\x60\x00\x57\x00\x28\x00\xcc\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\x53\x00\x3e\x00\xbe\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x1e\x00\x65\x00\x40\x00\x76\x00\x1f\x00\x20\x00\x7b\x00\x7c\x00\x7d\x00\x21\x00\x7e\x00\x7f\x00\x8e\x00\x8f\x00\x07\x00\x90\x00\x91\x00\x28\x00\xcd\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\x92\x00\x3e\x00\x53\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x57\x00\xff\xff\x40\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0e\x00\x23\x00\x17\x00\x53\x00\xff\xff\x07\x00\x09\x00\x0d\x00\x0b\x00\x28\x00\xc4\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\x10\x00\x3e\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0e\x00\x00\x00\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\xc8\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\x00\x00\x3e\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x3e\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x71\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\x72\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x3e\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x3e\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x92\x00\x2c\x00\x2d\x00\x2e\x00\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\x00\x00\x68\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x67\x00\x2c\x00\x2d\x00\x2e\x00\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\x00\x00\x68\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x69\x00\x2c\x00\x2d\x00\x2e\x00\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\x00\x00\x68\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x93\x00\x2d\x00\x2e\x00\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\x00\x00\x68\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x2e\x00\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\x00\x00\x68\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\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\x00\x00\x68\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\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\x00\x00\x68\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x09\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00\x00\x00\x19\x00\x10\x00\x00\x00\x0b\x00\x00\x00\x28\x00\x1a\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x74\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\x00\x00\x68\x00\x28\x00\x3f\x00\xf6\xff\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\xcb\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\x00\x00\x68\x00\x28\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x98\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\x00\x00\x68\x00\x28\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x99\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\x00\x00\x68\x00\x28\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x9a\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\x00\x00\x68\x00\x28\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x9b\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\x00\x00\x68\x00\x28\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x9c\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\x00\x00\x68\x00\x28\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x9d\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\x00\x00\x68\x00\x28\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x76\x00\x00\x00\x40\x00\x9e\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\x00\x00\x68\x00\x28\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x78\x00\x28\x00\x00\x00\x3f\x00\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x00\x40\x00\x00\x00\x9f\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\xa1\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x28\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\x00\x00\xc3\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x28\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\x00\x00\x66\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x28\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\x00\x00\x70\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x28\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x27\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x28\x00\x3f\x00\x27\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\xaa\x00\x00\x00\x3f\x00\x27\x00\x3f\x00\x87\x00\x00\x00\x00\x00\x88\x00\x40\x00\x89\x00\x40\x00\x8a\x00\x8b\x00\xc1\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x27\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x8d\x00\x00\x00\x00\x00\xc6\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\xa3\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x28\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\xa5\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x28\x00\x3f\x00\xa6\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x40\x00\x28\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\xa7\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x00\x00\xa8\x00\x3c\x00\x3d\x00\x00\x00\x40\x00\x00\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\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 (5, 132) [
+	(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)
+	]
+
+happy_n_terms = 69 :: Int
+happy_n_nonterms = 54 :: Int
+
+happyReduce_5 = happySpecReduce_1  0# happyReduction_5
+happyReduction_5 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn8
+		 (PosInteger (mkPosToken happy_var_1)
+	)}
+
+happyReduce_6 = happySpecReduce_1  1# happyReduction_6
+happyReduction_6 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn9
+		 (PosDouble (mkPosToken happy_var_1)
+	)}
+
+happyReduce_7 = happySpecReduce_1  2# happyReduction_7
+happyReduction_7 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn10
+		 (PosString (mkPosToken happy_var_1)
+	)}
+
+happyReduce_8 = happySpecReduce_1  3# happyReduction_8
+happyReduction_8 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn11
+		 (PosIdent (mkPosToken happy_var_1)
+	)}
+
+happyReduce_9 = happySpecReduce_1  4# happyReduction_9
+happyReduction_9 happy_x_1
+	 =  case happyOut56 happy_x_1 of { happy_var_1 -> 
+	happyIn12
+		 (Module ((mkCatSpan happy_var_1)) (reverse happy_var_1)
+	)}
+
+happyReduce_10 = happyReduce 4# 5# happyReduction_10
+happyReduction_10 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut11 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	case happyOut57 happy_x_4 of { happy_var_4 -> 
+	happyIn13
+		 (EnumDecl ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_4
+	) `HappyStk` happyRest}}}}
+
+happyReduce_11 = happySpecReduce_1  5# happyReduction_11
+happyReduction_11 happy_x_1
+	 =  case happyOut20 happy_x_1 of { happy_var_1 -> 
+	happyIn13
+		 (ElementDecl ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_12 = happyReduce 8# 6# happyReduction_12
+happyReduction_12 (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 happyOut18 happy_x_1 of { happy_var_1 -> 
+	case happyOut25 happy_x_2 of { happy_var_2 -> 
+	case happyOut11 happy_x_3 of { happy_var_3 -> 
+	case happyOut21 happy_x_4 of { happy_var_4 -> 
+	case happyOut22 happy_x_5 of { happy_var_5 -> 
+	case happyOut26 happy_x_6 of { happy_var_6 -> 
+	case happyOut23 happy_x_7 of { happy_var_7 -> 
+	case happyOut19 happy_x_8 of { happy_var_8 -> 
+	happyIn14
+		 (Clafer ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkCatSpan happy_var_4) >- (mkCatSpan happy_var_5) >- (mkCatSpan happy_var_6) >- (mkCatSpan happy_var_7) >- (mkCatSpan happy_var_8)) happy_var_1 happy_var_2 happy_var_3 happy_var_4 happy_var_5 happy_var_6 happy_var_7 happy_var_8
+	) `HappyStk` happyRest}}}}}}}}
+
+happyReduce_13 = happySpecReduce_3  7# happyReduction_13
+happyReduction_13 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut59 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	happyIn15
+		 (Constraint ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2)
+	)}}}
+
+happyReduce_14 = happyReduce 4# 8# happyReduction_14
+happyReduction_14 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut59 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { happy_var_4 -> 
+	happyIn16
+		 (SoftConstraint ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4)) (reverse happy_var_3)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_15 = happySpecReduce_3  9# happyReduction_15
+happyReduction_15 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut59 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	happyIn17
+		 (Goal ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2)
+	)}}}
+
+happyReduce_16 = happySpecReduce_0  10# happyReduction_16
+happyReduction_16  =  happyIn18
+		 (AbstractEmpty noSpan
+	)
+
+happyReduce_17 = happySpecReduce_1  10# happyReduction_17
+happyReduction_17 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn18
+		 (Abstract ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_18 = happySpecReduce_0  11# happyReduction_18
+happyReduction_18  =  happyIn19
+		 (ElementsEmpty noSpan
+	)
+
+happyReduce_19 = happySpecReduce_3  11# happyReduction_19
+happyReduction_19 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut58 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	happyIn19
+		 (ElementsList ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2)
+	)}}}
+
+happyReduce_20 = happySpecReduce_1  12# happyReduction_20
+happyReduction_20 happy_x_1
+	 =  case happyOut14 happy_x_1 of { happy_var_1 -> 
+	happyIn20
+		 (Subclafer ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_21 = happyReduce 4# 12# happyReduction_21
+happyReduction_21 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut29 happy_x_2 of { happy_var_2 -> 
+	case happyOut26 happy_x_3 of { happy_var_3 -> 
+	case happyOut19 happy_x_4 of { happy_var_4 -> 
+	happyIn20
+		 (ClaferUse ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_3 happy_var_4
+	) `HappyStk` happyRest}}}}
+
+happyReduce_22 = happySpecReduce_1  12# happyReduction_22
+happyReduction_22 happy_x_1
+	 =  case happyOut15 happy_x_1 of { happy_var_1 -> 
+	happyIn20
+		 (Subconstraint ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_23 = happySpecReduce_1  12# happyReduction_23
+happyReduction_23 happy_x_1
+	 =  case happyOut17 happy_x_1 of { happy_var_1 -> 
+	happyIn20
+		 (Subgoal ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_24 = happySpecReduce_1  12# happyReduction_24
+happyReduction_24 happy_x_1
+	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
+	happyIn20
+		 (Subsoftconstraint ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_25 = happySpecReduce_0  13# happyReduction_25
+happyReduction_25  =  happyIn21
+		 (SuperEmpty noSpan
+	)
+
+happyReduce_26 = happySpecReduce_2  13# happyReduction_26
+happyReduction_26 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_2 of { happy_var_2 -> 
+	happyIn21
+		 (SuperSome ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_27 = happySpecReduce_0  14# happyReduction_27
+happyReduction_27  =  happyIn22
+		 (ReferenceEmpty noSpan
+	)
+
+happyReduce_28 = happySpecReduce_2  14# happyReduction_28
+happyReduction_28 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_2 of { happy_var_2 -> 
+	happyIn22
+		 (ReferenceSet ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_29 = happySpecReduce_2  14# happyReduction_29
+happyReduction_29 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_2 of { happy_var_2 -> 
+	happyIn22
+		 (ReferenceBag ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_30 = happySpecReduce_0  15# happyReduction_30
+happyReduction_30  =  happyIn23
+		 (InitEmpty noSpan
+	)
+
+happyReduce_31 = happySpecReduce_2  15# happyReduction_31
+happyReduction_31 happy_x_2
+	happy_x_1
+	 =  case happyOut24 happy_x_1 of { happy_var_1 -> 
+	case happyOut30 happy_x_2 of { happy_var_2 -> 
+	happyIn23
+		 (InitSome ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_1 happy_var_2
+	)}}
+
+happyReduce_32 = happySpecReduce_1  16# happyReduction_32
+happyReduction_32 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn24
+		 (InitConstant ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_33 = happySpecReduce_1  16# happyReduction_33
+happyReduction_33 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn24
+		 (InitDefault ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_34 = happySpecReduce_0  17# happyReduction_34
+happyReduction_34  =  happyIn25
+		 (GCardEmpty noSpan
+	)
+
+happyReduce_35 = happySpecReduce_1  17# happyReduction_35
+happyReduction_35 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn25
+		 (GCardXor ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_36 = happySpecReduce_1  17# happyReduction_36
+happyReduction_36 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn25
+		 (GCardOr ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_37 = happySpecReduce_1  17# happyReduction_37
+happyReduction_37 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn25
+		 (GCardMux ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_38 = happySpecReduce_1  17# happyReduction_38
+happyReduction_38 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn25
+		 (GCardOpt ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_39 = happySpecReduce_1  17# happyReduction_39
+happyReduction_39 happy_x_1
+	 =  case happyOut27 happy_x_1 of { happy_var_1 -> 
+	happyIn25
+		 (GCardInterval ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_40 = happySpecReduce_0  18# happyReduction_40
+happyReduction_40  =  happyIn26
+		 (CardEmpty noSpan
+	)
+
+happyReduce_41 = happySpecReduce_1  18# happyReduction_41
+happyReduction_41 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn26
+		 (CardLone ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_42 = happySpecReduce_1  18# happyReduction_42
+happyReduction_42 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn26
+		 (CardSome ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_43 = happySpecReduce_1  18# happyReduction_43
+happyReduction_43 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn26
+		 (CardAny ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_44 = happySpecReduce_1  18# happyReduction_44
+happyReduction_44 happy_x_1
+	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
+	happyIn26
+		 (CardNum ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_45 = happySpecReduce_1  18# happyReduction_45
+happyReduction_45 happy_x_1
+	 =  case happyOut27 happy_x_1 of { happy_var_1 -> 
+	happyIn26
+		 (CardInterval ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_46 = happySpecReduce_3  19# happyReduction_46
+happyReduction_46 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut28 happy_x_3 of { happy_var_3 -> 
+	happyIn27
+		 (NCard ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_47 = happySpecReduce_1  20# happyReduction_47
+happyReduction_47 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn28
+		 (ExIntegerAst ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_48 = happySpecReduce_1  20# happyReduction_48
+happyReduction_48 happy_x_1
+	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
+	happyIn28
+		 (ExIntegerNum ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_49 = happySpecReduce_1  21# happyReduction_49
+happyReduction_49 happy_x_1
+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
+	happyIn29
+		 (Path ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_50 = happyReduce 5# 22# happyReduction_50
+happyReduction_50 (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 { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut51 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { happy_var_4 -> 
+	case happyOut30 happy_x_5 of { happy_var_5 -> 
+	happyIn30
+		 (DeclAllDisj ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4) >- (mkCatSpan happy_var_5)) happy_var_3 happy_var_5
+	) `HappyStk` happyRest}}}}}
+
+happyReduce_51 = happyReduce 4# 22# happyReduction_51
+happyReduction_51 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut51 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	case happyOut30 happy_x_4 of { happy_var_4 -> 
+	happyIn30
+		 (DeclAll ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_4
+	) `HappyStk` happyRest}}}}
+
+happyReduce_52 = happyReduce 5# 22# happyReduction_52
+happyReduction_52 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut52 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut51 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { happy_var_4 -> 
+	case happyOut30 happy_x_5 of { happy_var_5 -> 
+	happyIn30
+		 (DeclQuantDisj ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4) >- (mkCatSpan happy_var_5)) happy_var_1 happy_var_3 happy_var_5
+	) `HappyStk` happyRest}}}}}
+
+happyReduce_53 = happyReduce 4# 22# happyReduction_53
+happyReduction_53 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut52 happy_x_1 of { happy_var_1 -> 
+	case happyOut51 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	case happyOut30 happy_x_4 of { happy_var_4 -> 
+	happyIn30
+		 (DeclQuant ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_1 happy_var_2 happy_var_4
+	) `HappyStk` happyRest}}}}
+
+happyReduce_54 = happySpecReduce_1  22# happyReduction_54
+happyReduction_54 happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	happyIn30
+		 (happy_var_1
+	)}
+
+happyReduce_55 = happySpecReduce_2  23# happyReduction_55
+happyReduction_55 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut32 happy_x_2 of { happy_var_2 -> 
+	happyIn31
+		 (EGMax ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_56 = happySpecReduce_2  23# happyReduction_56
+happyReduction_56 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut32 happy_x_2 of { happy_var_2 -> 
+	happyIn31
+		 (EGMin ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_57 = happySpecReduce_3  23# happyReduction_57
+happyReduction_57 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut32 happy_x_3 of { happy_var_3 -> 
+	happyIn31
+		 (EIff ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_58 = happySpecReduce_1  23# happyReduction_58
+happyReduction_58 happy_x_1
+	 =  case happyOut32 happy_x_1 of { happy_var_1 -> 
+	happyIn31
+		 (happy_var_1
+	)}
+
+happyReduce_59 = happySpecReduce_3  24# happyReduction_59
+happyReduction_59 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut32 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut33 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (EImplies ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_60 = happySpecReduce_1  24# happyReduction_60
+happyReduction_60 happy_x_1
+	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
+	happyIn32
+		 (happy_var_1
+	)}
+
+happyReduce_61 = happySpecReduce_3  25# happyReduction_61
+happyReduction_61 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut34 happy_x_3 of { happy_var_3 -> 
+	happyIn33
+		 (EOr ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_62 = happySpecReduce_1  25# happyReduction_62
+happyReduction_62 happy_x_1
+	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
+	happyIn33
+		 (happy_var_1
+	)}
+
+happyReduce_63 = happySpecReduce_3  26# happyReduction_63
+happyReduction_63 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut35 happy_x_3 of { happy_var_3 -> 
+	happyIn34
+		 (EXor ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_64 = happySpecReduce_1  26# happyReduction_64
+happyReduction_64 happy_x_1
+	 =  case happyOut35 happy_x_1 of { happy_var_1 -> 
+	happyIn34
+		 (happy_var_1
+	)}
+
+happyReduce_65 = happySpecReduce_3  27# happyReduction_65
+happyReduction_65 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut35 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut36 happy_x_3 of { happy_var_3 -> 
+	happyIn35
+		 (EAnd ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_66 = happySpecReduce_1  27# happyReduction_66
+happyReduction_66 happy_x_1
+	 =  case happyOut36 happy_x_1 of { happy_var_1 -> 
+	happyIn35
+		 (happy_var_1
+	)}
+
+happyReduce_67 = happySpecReduce_2  28# happyReduction_67
+happyReduction_67 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut37 happy_x_2 of { happy_var_2 -> 
+	happyIn36
+		 (ENeg ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_68 = happySpecReduce_1  28# happyReduction_68
+happyReduction_68 happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	happyIn36
+		 (happy_var_1
+	)}
+
+happyReduce_69 = happySpecReduce_3  29# happyReduction_69
+happyReduction_69 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut38 happy_x_3 of { happy_var_3 -> 
+	happyIn37
+		 (ELt ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_70 = happySpecReduce_3  29# happyReduction_70
+happyReduction_70 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut38 happy_x_3 of { happy_var_3 -> 
+	happyIn37
+		 (EGt ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_71 = happySpecReduce_3  29# happyReduction_71
+happyReduction_71 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut38 happy_x_3 of { happy_var_3 -> 
+	happyIn37
+		 (EEq ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_72 = happySpecReduce_3  29# happyReduction_72
+happyReduction_72 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut38 happy_x_3 of { happy_var_3 -> 
+	happyIn37
+		 (ELte ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_73 = happySpecReduce_3  29# happyReduction_73
+happyReduction_73 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut38 happy_x_3 of { happy_var_3 -> 
+	happyIn37
+		 (EGte ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_74 = happySpecReduce_3  29# happyReduction_74
+happyReduction_74 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut38 happy_x_3 of { happy_var_3 -> 
+	happyIn37
+		 (ENeq ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_75 = happySpecReduce_3  29# happyReduction_75
+happyReduction_75 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut38 happy_x_3 of { happy_var_3 -> 
+	happyIn37
+		 (EIn ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_76 = happyReduce 4# 29# happyReduction_76
+happyReduction_76 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	case happyOut38 happy_x_4 of { happy_var_4 -> 
+	happyIn37
+		 (ENin ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_1 happy_var_4
+	) `HappyStk` happyRest}}}}
+
+happyReduce_77 = happySpecReduce_1  29# happyReduction_77
+happyReduction_77 happy_x_1
+	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
+	happyIn37
+		 (happy_var_1
+	)}
+
+happyReduce_78 = happySpecReduce_2  30# happyReduction_78
+happyReduction_78 happy_x_2
+	happy_x_1
+	 =  case happyOut52 happy_x_1 of { happy_var_1 -> 
+	case happyOut42 happy_x_2 of { happy_var_2 -> 
+	happyIn38
+		 (QuantExp ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_1 happy_var_2
+	)}}
+
+happyReduce_79 = happySpecReduce_1  30# happyReduction_79
+happyReduction_79 happy_x_1
+	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
+	happyIn38
+		 (happy_var_1
+	)}
+
+happyReduce_80 = happySpecReduce_3  31# happyReduction_80
+happyReduction_80 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut40 happy_x_3 of { happy_var_3 -> 
+	happyIn39
+		 (EAdd ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_81 = happySpecReduce_3  31# happyReduction_81
+happyReduction_81 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut40 happy_x_3 of { happy_var_3 -> 
+	happyIn39
+		 (ESub ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_82 = happySpecReduce_1  31# happyReduction_82
+happyReduction_82 happy_x_1
+	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
+	happyIn39
+		 (happy_var_1
+	)}
+
+happyReduce_83 = happySpecReduce_3  32# happyReduction_83
+happyReduction_83 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut41 happy_x_3 of { happy_var_3 -> 
+	happyIn40
+		 (EMul ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_84 = happySpecReduce_3  32# happyReduction_84
+happyReduction_84 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut41 happy_x_3 of { happy_var_3 -> 
+	happyIn40
+		 (EDiv ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_85 = happySpecReduce_1  32# happyReduction_85
+happyReduction_85 happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	happyIn40
+		 (happy_var_1
+	)}
+
+happyReduce_86 = happySpecReduce_2  33# happyReduction_86
+happyReduction_86 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut42 happy_x_2 of { happy_var_2 -> 
+	happyIn41
+		 (ESumSetExp ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_87 = happySpecReduce_2  33# happyReduction_87
+happyReduction_87 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut42 happy_x_2 of { happy_var_2 -> 
+	happyIn41
+		 (ECSetExp ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_88 = happySpecReduce_2  33# happyReduction_88
+happyReduction_88 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut42 happy_x_2 of { happy_var_2 -> 
+	happyIn41
+		 (EMinExp ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2
+	)}}
+
+happyReduce_89 = happySpecReduce_1  33# happyReduction_89
+happyReduction_89 happy_x_1
+	 =  case happyOut42 happy_x_1 of { happy_var_1 -> 
+	happyIn41
+		 (happy_var_1
+	)}
+
+happyReduce_90 = happyReduce 6# 34# happyReduction_90
+happyReduction_90 (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 { happy_var_1 -> 
+	case happyOut42 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	case happyOut42 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { happy_var_5 -> 
+	case happyOut43 happy_x_6 of { happy_var_6 -> 
+	happyIn42
+		 (EImpliesElse ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4) >- (mkTokenSpan happy_var_5) >- (mkCatSpan happy_var_6)) happy_var_2 happy_var_4 happy_var_6
+	) `HappyStk` happyRest}}}}}}
+
+happyReduce_91 = happySpecReduce_1  34# happyReduction_91
+happyReduction_91 happy_x_1
+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
+	happyIn42
+		 (happy_var_1
+	)}
+
+happyReduce_92 = happySpecReduce_1  35# happyReduction_92
+happyReduction_92 happy_x_1
+	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
+	happyIn43
+		 (EInt ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_93 = happySpecReduce_1  35# happyReduction_93
+happyReduction_93 happy_x_1
+	 =  case happyOut9 happy_x_1 of { happy_var_1 -> 
+	happyIn43
+		 (EDouble ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_94 = happySpecReduce_1  35# happyReduction_94
+happyReduction_94 happy_x_1
+	 =  case happyOut10 happy_x_1 of { happy_var_1 -> 
+	happyIn43
+		 (EStr ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_95 = happySpecReduce_1  35# happyReduction_95
+happyReduction_95 happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	happyIn43
+		 (ESetExp ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_96 = happySpecReduce_3  35# happyReduction_96
+happyReduction_96 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut30 happy_x_2 of { happy_var_2 -> 
+	happyIn43
+		 (happy_var_2
+	)}
+
+happyReduce_97 = happySpecReduce_3  36# happyReduction_97
+happyReduction_97 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut45 happy_x_3 of { happy_var_3 -> 
+	happyIn44
+		 (Union ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_98 = happySpecReduce_3  36# happyReduction_98
+happyReduction_98 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut45 happy_x_3 of { happy_var_3 -> 
+	happyIn44
+		 (UnionCom ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_99 = happySpecReduce_1  36# happyReduction_99
+happyReduction_99 happy_x_1
+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
+	happyIn44
+		 (happy_var_1
+	)}
+
+happyReduce_100 = happySpecReduce_3  37# happyReduction_100
+happyReduction_100 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut46 happy_x_3 of { happy_var_3 -> 
+	happyIn45
+		 (Difference ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_101 = happySpecReduce_1  37# happyReduction_101
+happyReduction_101 happy_x_1
+	 =  case happyOut46 happy_x_1 of { happy_var_1 -> 
+	happyIn45
+		 (happy_var_1
+	)}
+
+happyReduce_102 = happySpecReduce_3  38# happyReduction_102
+happyReduction_102 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut46 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut47 happy_x_3 of { happy_var_3 -> 
+	happyIn46
+		 (Intersection ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_103 = happySpecReduce_1  38# happyReduction_103
+happyReduction_103 happy_x_1
+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
+	happyIn46
+		 (happy_var_1
+	)}
+
+happyReduce_104 = happySpecReduce_3  39# happyReduction_104
+happyReduction_104 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut48 happy_x_3 of { happy_var_3 -> 
+	happyIn47
+		 (Domain ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_105 = happySpecReduce_1  39# happyReduction_105
+happyReduction_105 happy_x_1
+	 =  case happyOut48 happy_x_1 of { happy_var_1 -> 
+	happyIn47
+		 (happy_var_1
+	)}
+
+happyReduce_106 = happySpecReduce_3  40# happyReduction_106
+happyReduction_106 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut48 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut49 happy_x_3 of { happy_var_3 -> 
+	happyIn48
+		 (Range ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_107 = happySpecReduce_1  40# happyReduction_107
+happyReduction_107 happy_x_1
+	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
+	happyIn48
+		 (happy_var_1
+	)}
+
+happyReduce_108 = happySpecReduce_3  41# happyReduction_108
+happyReduction_108 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut50 happy_x_3 of { happy_var_3 -> 
+	happyIn49
+		 (Join ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_109 = happySpecReduce_1  41# happyReduction_109
+happyReduction_109 happy_x_1
+	 =  case happyOut50 happy_x_1 of { happy_var_1 -> 
+	happyIn49
+		 (happy_var_1
+	)}
+
+happyReduce_110 = happySpecReduce_1  42# happyReduction_110
+happyReduction_110 happy_x_1
+	 =  case happyOut29 happy_x_1 of { happy_var_1 -> 
+	happyIn50
+		 (ClaferId ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_111 = happySpecReduce_3  42# happyReduction_111
+happyReduction_111 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_2 of { happy_var_2 -> 
+	happyIn50
+		 (happy_var_2
+	)}
+
+happyReduce_112 = happySpecReduce_3  43# happyReduction_112
+happyReduction_112 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut60 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut44 happy_x_3 of { happy_var_3 -> 
+	happyIn51
+		 (Decl ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3
+	)}}}
+
+happyReduce_113 = happySpecReduce_1  44# happyReduction_113
+happyReduction_113 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn52
+		 (QuantNo ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_114 = happySpecReduce_1  44# happyReduction_114
+happyReduction_114 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn52
+		 (QuantNot ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_115 = happySpecReduce_1  44# happyReduction_115
+happyReduction_115 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn52
+		 (QuantLone ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_116 = happySpecReduce_1  44# happyReduction_116
+happyReduction_116 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn52
+		 (QuantOne ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_117 = happySpecReduce_1  44# happyReduction_117
+happyReduction_117 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn52
+		 (QuantSome ((mkTokenSpan happy_var_1))
+	)}
+
+happyReduce_118 = happySpecReduce_1  45# happyReduction_118
+happyReduction_118 happy_x_1
+	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
+	happyIn53
+		 (EnumIdIdent ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_119 = happySpecReduce_1  46# happyReduction_119
+happyReduction_119 happy_x_1
+	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
+	happyIn54
+		 (ModIdIdent ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_120 = happySpecReduce_1  47# happyReduction_120
+happyReduction_120 happy_x_1
+	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
+	happyIn55
+		 (LocIdIdent ((mkCatSpan happy_var_1)) happy_var_1
+	)}
+
+happyReduce_121 = happySpecReduce_0  48# happyReduction_121
+happyReduction_121  =  happyIn56
+		 ([]
+	)
+
+happyReduce_122 = happySpecReduce_2  48# happyReduction_122
+happyReduction_122 happy_x_2
+	happy_x_1
+	 =  case happyOut56 happy_x_1 of { happy_var_1 -> 
+	case happyOut13 happy_x_2 of { happy_var_2 -> 
+	happyIn56
+		 (flip (:)  happy_var_1 happy_var_2
+	)}}
+
+happyReduce_123 = happySpecReduce_1  49# happyReduction_123
+happyReduction_123 happy_x_1
+	 =  case happyOut53 happy_x_1 of { happy_var_1 -> 
+	happyIn57
+		 ((:[])  happy_var_1
+	)}
+
+happyReduce_124 = happySpecReduce_3  49# happyReduction_124
+happyReduction_124 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut53 happy_x_1 of { happy_var_1 -> 
+	case happyOut57 happy_x_3 of { happy_var_3 -> 
+	happyIn57
+		 ((:)  happy_var_1 happy_var_3
+	)}}
+
+happyReduce_125 = happySpecReduce_0  50# happyReduction_125
+happyReduction_125  =  happyIn58
+		 ([]
+	)
+
+happyReduce_126 = happySpecReduce_2  50# happyReduction_126
+happyReduction_126 happy_x_2
+	happy_x_1
+	 =  case happyOut58 happy_x_1 of { happy_var_1 -> 
+	case happyOut20 happy_x_2 of { happy_var_2 -> 
+	happyIn58
+		 (flip (:)  happy_var_1 happy_var_2
+	)}}
+
+happyReduce_127 = happySpecReduce_0  51# happyReduction_127
+happyReduction_127  =  happyIn59
+		 ([]
+	)
+
+happyReduce_128 = happySpecReduce_2  51# happyReduction_128
+happyReduction_128 happy_x_2
+	happy_x_1
+	 =  case happyOut59 happy_x_1 of { happy_var_1 -> 
+	case happyOut30 happy_x_2 of { happy_var_2 -> 
+	happyIn59
+		 (flip (:)  happy_var_1 happy_var_2
+	)}}
+
+happyReduce_129 = happySpecReduce_1  52# happyReduction_129
+happyReduction_129 happy_x_1
+	 =  case happyOut55 happy_x_1 of { happy_var_1 -> 
+	happyIn60
+		 ((:[])  happy_var_1
+	)}
+
+happyReduce_130 = happySpecReduce_3  52# happyReduction_130
+happyReduction_130 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut55 happy_x_1 of { happy_var_1 -> 
+	case happyOut60 happy_x_3 of { happy_var_3 -> 
+	happyIn60
+		 ((:)  happy_var_1 happy_var_3
+	)}}
+
+happyReduce_131 = happySpecReduce_1  53# happyReduction_131
+happyReduction_131 happy_x_1
+	 =  case happyOut54 happy_x_1 of { happy_var_1 -> 
+	happyIn61
+		 ((:[])  happy_var_1
+	)}
+
+happyReduce_132 = happySpecReduce_3  53# happyReduction_132
+happyReduction_132 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut54 happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_3 of { happy_var_3 -> 
+	happyIn61
+		 ((:)  happy_var_1 happy_var_3
+	)}}
+
+happyNewToken action sts stk [] =
+	happyDoAction 68# notHappyAtAll action sts stk []
+
+happyNewToken action sts stk (tk:tks) =
+	let cont i = happyDoAction i tk action sts stk tks in
+	case tk of {
+	PT _ (TS _ 1) -> cont 1#;
+	PT _ (TS _ 2) -> cont 2#;
+	PT _ (TS _ 3) -> cont 3#;
+	PT _ (TS _ 4) -> cont 4#;
+	PT _ (TS _ 5) -> cont 5#;
+	PT _ (TS _ 6) -> cont 6#;
+	PT _ (TS _ 7) -> cont 7#;
+	PT _ (TS _ 8) -> cont 8#;
+	PT _ (TS _ 9) -> cont 9#;
+	PT _ (TS _ 10) -> cont 10#;
+	PT _ (TS _ 11) -> cont 11#;
+	PT _ (TS _ 12) -> cont 12#;
+	PT _ (TS _ 13) -> cont 13#;
+	PT _ (TS _ 14) -> cont 14#;
+	PT _ (TS _ 15) -> cont 15#;
+	PT _ (TS _ 16) -> cont 16#;
+	PT _ (TS _ 17) -> cont 17#;
+	PT _ (TS _ 18) -> cont 18#;
+	PT _ (TS _ 19) -> cont 19#;
+	PT _ (TS _ 20) -> cont 20#;
+	PT _ (TS _ 21) -> cont 21#;
+	PT _ (TS _ 22) -> cont 22#;
+	PT _ (TS _ 23) -> cont 23#;
+	PT _ (TS _ 24) -> cont 24#;
+	PT _ (TS _ 25) -> cont 25#;
+	PT _ (TS _ 26) -> cont 26#;
+	PT _ (TS _ 27) -> cont 27#;
+	PT _ (TS _ 28) -> cont 28#;
+	PT _ (TS _ 29) -> cont 29#;
+	PT _ (TS _ 30) -> cont 30#;
+	PT _ (TS _ 31) -> cont 31#;
+	PT _ (TS _ 32) -> cont 32#;
+	PT _ (TS _ 33) -> cont 33#;
+	PT _ (TS _ 34) -> cont 34#;
+	PT _ (TS _ 35) -> cont 35#;
+	PT _ (TS _ 36) -> cont 36#;
+	PT _ (TS _ 37) -> cont 37#;
+	PT _ (TS _ 38) -> cont 38#;
+	PT _ (TS _ 39) -> cont 39#;
+	PT _ (TS _ 40) -> cont 40#;
+	PT _ (TS _ 41) -> cont 41#;
+	PT _ (TS _ 42) -> cont 42#;
+	PT _ (TS _ 43) -> cont 43#;
+	PT _ (TS _ 44) -> cont 44#;
+	PT _ (TS _ 45) -> cont 45#;
+	PT _ (TS _ 46) -> cont 46#;
+	PT _ (TS _ 47) -> cont 47#;
+	PT _ (TS _ 48) -> cont 48#;
+	PT _ (TS _ 49) -> cont 49#;
+	PT _ (TS _ 50) -> cont 50#;
+	PT _ (TS _ 51) -> cont 51#;
+	PT _ (TS _ 52) -> cont 52#;
+	PT _ (TS _ 53) -> cont 53#;
+	PT _ (TS _ 54) -> cont 54#;
+	PT _ (TS _ 55) -> cont 55#;
+	PT _ (TS _ 56) -> cont 56#;
+	PT _ (TS _ 57) -> cont 57#;
+	PT _ (TS _ 58) -> cont 58#;
+	PT _ (TS _ 59) -> cont 59#;
+	PT _ (TS _ 60) -> cont 60#;
+	PT _ (TS _ 61) -> cont 61#;
+	PT _ (TS _ 62) -> cont 62#;
+	PT _ (T_PosInteger _) -> cont 63#;
+	PT _ (T_PosDouble _) -> cont 64#;
+	PT _ (T_PosString _) -> cont 65#;
+	PT _ (T_PosIdent _) -> cont 66#;
+	_ -> cont 67#;
+	_ -> happyError' (tk:tks)
+	}
+
+happyError_ 68# tk tks = happyError' tks
+happyError_ _ tk tks = happyError' (tk:tks)
+
+happyThen :: () => Err a -> (a -> Err b) -> Err b
+happyThen = (thenM)
+happyReturn :: () => a -> Err a
+happyReturn = (returnM)
+happyThen1 m k tks = (thenM) m (\a -> k a tks)
+happyReturn1 :: () => a -> b -> Err a
+happyReturn1 = \a tks -> (returnM) a
+happyError' :: () => [(Token)] -> Err a
+happyError' = happyError
+
+pModule tks = happySomeParser where
+  happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut12 x))
+
+pClafer tks = happySomeParser where
+  happySomeParser = happyThen (happyParse 1# tks) (\x -> happyReturn (happyOut14 x))
+
+pConstraint tks = happySomeParser where
+  happySomeParser = happyThen (happyParse 2# tks) (\x -> happyReturn (happyOut15 x))
+
+pSoftConstraint tks = happySomeParser where
+  happySomeParser = happyThen (happyParse 3# tks) (\x -> happyReturn (happyOut16 x))
+
+pGoal tks = happySomeParser where
+  happySomeParser = happyThen (happyParse 4# tks) (\x -> happyReturn (happyOut17 x))
 
 happySeq = happyDontSeq
 
diff --git a/src-cmd/clafer.hs b/src-cmd/clafer.hs
--- a/src-cmd/clafer.hs
+++ b/src-cmd/clafer.hs
@@ -23,189 +23,29 @@
 module Main where
 
 import Prelude hiding (writeFile, readFile, print, putStrLn)
-import qualified Data.Map as Map
-import qualified Data.List as List
-import Data.List.Split
-import Data.Maybe
-import Control.Monad.State
+
 import System.IO
-import System.Process
-import System.Exit
 import System.Timeout
-import System.FilePath (dropExtension,takeBaseName)
-import System.Process (readProcessWithExitCode)
+import System.Process (system)
 
-import Paths_clafer
 import Language.Clafer
-import Language.ClaferT
-import Language.Clafer.Css
 import Language.Clafer.ClaferArgs
-import Language.Clafer.JSONMetaData
-import Language.Clafer.QNameUID
-import Language.Clafer.Intermediate.Intclafer
-import Language.Clafer.Generator.Html (highlightErrors)
-import Language.Clafer.Generator.Graph (genSimpleGraph)
 
-putStrV :: VerbosityL -> String -> IO ()
-putStrV v s = if v > 1 then putStrLn s else return ()
-
-run :: VerbosityL -> ClaferArgs -> InputModel -> IO ()
-run _ args' input =
-  do
-    result <- runClaferT args' $
-      do
-        addFragments $ fragments input
-        parse
-        compile
-        fs <- save args'
-        when (validate args') $ forM_ fs (liftIO . runValidate args' )
-    if Html `elem` (mode args')
-      then htmlCatch result args' input
-      else return ()
-    result `cth` handleErrs
-  where
-  cth (Left err) f = f err
-  cth (Right r)  _ = return r
-  addFragments []     = return ()
-  addFragments (x:xs) = addModuleFragment x >> addFragments xs
-  fragments model = map unlines $ fragments' $ lines model
-  fragments' []                  = []
-  fragments' ("//# FRAGMENT":xs) = fragments' xs
-  fragments' model               = takeWhile (/= "//# FRAGMENT") model : fragments' (dropWhile (/= "//# FRAGMENT") model)
---  htmlCatch :: Either ClaferErr CompilerResult -> ClaferArgs -> String -> IO(CompilerResult)
-  htmlCatch (Right r) _ _ = return r
-  htmlCatch (Left err) args'' model =
-    do let f = (dropExtension $ file args'') ++ ".html"
-       let result = (if (self_contained args'') then header ++ "<style>" ++ css ++ "</style>" ++ "</head>\n<body>\n<pre>\n" else "") ++ highlightErrors model err ++
-                                                               (if (self_contained args'') then "\n</pre>\n</html>" else "")
-       liftIO $ if console_output args'' then putStrLn result else writeFile f result
-  
-  handleErrs = mapM_ handleErr
-  
-  handleErr (ClaferErr mesg) =
-    do
-      putStrLn "\nError...\n"
-      putStrLn mesg
-      exitFailure
-  -- We only use one fragment. Fragment id and position is not useful to us. We
-  -- only care about the position relative to 
-  handleErr (ParseErr ErrPos{modelPos = Pos l c} mesg) =
-    do
-      putStrLn $ "\nParse failed at line " ++ show l ++ " column " ++ show c ++ "..."
-      putStrLn mesg
-      exitFailure
-  handleErr (SemanticErr ErrPos{modelPos = Pos l c} mesg) =
-    do
-      putStrLn $ "\nCompile error at line " ++ show l ++ " column " ++ show c ++ "..."
-      putStrLn mesg
-      exitFailure
-
-save :: MonadIO m => ClaferArgs -> ClaferT m [ String ]
-save args'=
-  do
-    resultsMap <- generate
-    let results = snd $ List.unzip $ Map.toList resultsMap
-    -- print stats only once
-    when (not $ no_stats args') $ liftIO $ printStats results
-    -- save the outputs
-    (iModule, _, _) <- getIr
-    forM results $ saveResult iModule resultsMap
-  where
-    -- saveResult :: MonadIO m => CompilerResult -> IModule -> (Map.Map ClaferMode CompilerResult) -> ClaferT m String
-    saveResult iModule' resultsMap' result@CompilerResult { extension } = do
-      result' <- if (add_graph args') && (Html `elem` (mode args') && ("dot" `List.isSuffixOf` (extension))) 
-            then do
-                   ast' <- getAst
-                   (_, graph, _) <- liftIO $ readProcessWithExitCode "dot"  ["-Tsvg"] $ genSimpleGraph ast' iModule' (takeBaseName $ file args') (show_references args')
-                   return $ summary graph result
-            else return result
-      let f = dropExtension $ file args'
-      let f' = f ++ "." ++ extension
-      liftIO $ if console_output args' then putStrLn (outputCode result') else writeFile f' (outputCode result')
-      liftIO $ when (alloy_mapping args') $ writeFile (f ++ ".map") $ show (mappingToAlloy result')
-      let 
-        qNameMaps :: QNameMaps
-        qNameMaps = deriveQNameMaps iModule'
-      liftIO $ when (meta_data args') $ writeFile (f ++ ".cfr-map") $ generateJSONnameUIDMap qNameMaps
-      liftIO $ when (meta_data args' && inScopeModes) $ writeFile (f ++ ".cfr-scope") $ generateJSONScopes qNameMaps $ getScopesList resultsMap'
-      return f'  
-    saveResult _ _ NoCompilerResult { reason } = do 
-      liftIO $ putStrLn reason
-      return ""
-    printStats :: [CompilerResult] -> IO ()
-    printStats []         = putStrLn "No compiler output."
-    printStats (r:rs) = case r of
-      CompilerResult { statistics } -> putStrLn statistics
-      (NoCompilerResult _) -> printStats rs
-
-    inScopeModes :: Bool
-    inScopeModes = 
-      Alloy `elem` mode args' ||
-      Alloy42 `elem` mode args' ||
-      Choco `elem` mode args'
-
-    getScopesList :: (Map.Map ClaferMode CompilerResult) -> [(UID, Integer)]
-    getScopesList    resultsMap =
-        let
-           alloyResult = Map.lookup Alloy resultsMap
-           alloy42Result = Map.lookup Alloy42 resultsMap
-           chocoResult = Map.lookup Choco resultsMap
-        in 
-           if (isNothing alloyResult)
-           then if (isNothing alloy42Result)
-                then if (isNothing chocoResult)
-                     then []
-                     else scopesList $ fromJust chocoResult
-                else scopesList $ fromJust alloy42Result
-           else scopesList $ fromJust alloyResult
-
-summary :: String -> CompilerResult -> CompilerResult
-summary graph result = result{outputCode=unlines $ summary' graph ("<pre>" ++ statistics result ++ "</pre>") (lines $ outputCode result)}
-
-summary' :: String -> String -> [String] -> [String]
-summary' _ _ [] = []
-summary' graph stats ("<!-- # SUMMARY /-->":xs) = graph:stats:summary' graph stats xs
-summary' graph stats ("<!-- # STATS /-->":xs) = stats:summary' graph stats xs
-summary' graph stats ("<!-- # GRAPH /-->":xs) = graph:summary' graph stats xs
-summary' graph stats ("<!-- # CVLGRAPH /-->":xs) = graph:summary' graph stats xs
-summary' graph stats (x:xs) = x:summary' graph stats xs
-
-conPutStrLn :: ClaferArgs -> String -> IO ()
-conPutStrLn args' s = when (not $ console_output args') $ putStrLn s
-
-runValidate :: ClaferArgs -> String -> IO ()
-runValidate args' fo = do
-  let path = (tooldir args') ++ "/"
-  liftIO $ putStrLn ("Validating '" ++ fo ++"'")
-  let modes = mode args' 
-  when (Xml `elem` modes && "xml" `List.isSuffixOf` fo) $ do
-      writeFile "ClaferIR.xsd" claferIRXSD
-      voidf $ system $ "java -classpath " ++ path ++ " XsdCheck ClaferIR.xsd " ++ fo
-  when (Alloy `elem` modes && "als41" `List.isSuffixOf` fo) $ do
-    voidf $ system $ validateAlloy path "4" ++ fo
-  when (Alloy42 `elem` modes && "als" `List.isSuffixOf` fo) $ do
-    voidf $ system $ validateAlloy path "4.2" ++ fo
-  when (Clafer `elem` modes && "des.cfr" `List.isSuffixOf` fo) $ do  
-    voidf $ system $ "../dist/build/clafer/clafer -s -m=clafer " ++ fo
-
-validateAlloy :: String -> String -> String
-validateAlloy path version = "java -cp " ++ path ++ "alloy" ++ version ++ ".jar edu.mit.csail.sdg.alloy4whole.ExampleUsingTheCompiler "
-
 main :: IO ()
 main = do
   (args', model) <- mainArgs
   let timeInSec = (timeout_analysis args') * 10^(6::Integer)
   if timeInSec > 0
-    then timeout timeInSec $ start 2 args' model
-    else Just `liftM` start 2 args' model
+    then timeout timeInSec $ start args' model
+    else Just `fmap` start args' model
   return ()
 
-start :: VerbosityL -> ClaferArgs -> InputModel-> IO ()
-start v args' model = if schema args'
+start :: ClaferArgs -> InputModel-> IO ()
+start args' model = if schema args'
   then putStrLn claferIRXSD
   else if ecore2clafer args'
     then runEcore2Clafer (file args') $ (tooldir args')
-    else run v args' model
+    else runCompiler Nothing args' model
 
 runEcore2Clafer :: FilePath -> FilePath -> IO ()
 runEcore2Clafer    ecoreFile toolPath
diff --git a/src/GetURL.hs b/src/GetURL.hs
new file mode 100644
--- /dev/null
+++ b/src/GetURL.hs
@@ -0,0 +1,24 @@
+-- (c) Simon Marlow 2011, see the file LICENSE for copying terms.
+
+-- Simple wrapper around HTTP, allowing proxy use
+
+module GetURL (getURL) where
+
+import Network.HTTP
+import Network.Browser
+import Network.URI
+
+getURL :: String -> IO String
+getURL url = do
+  Network.Browser.browse $ do
+    setCheckForProxy True
+    setDebugLog Nothing
+    setOutHandler (const (return ()))
+    (_, rsp) <- request (getRequest' (escapeURIString isUnescapedInURI url))
+    return (rspBody rsp)
+  where
+   getRequest' :: String -> Request String
+   getRequest' urlString =
+    case parseURI urlString of
+      Nothing -> error ("getRequest: Not a valid URL - " ++ urlString)
+      Just u  -> mkRequest GET u
diff --git a/src/Language/Clafer.hs b/src/Language/Clafer.hs
--- a/src/Language/Clafer.hs
+++ b/src/Language/Clafer.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DeriveDataTypeable, NamedFieldPuns #-}
 {-
  Copyright (C) 2012-2014 Kacper Bak, Jimmy Liang, Michal Antkiewicz <http://gsd.uwaterloo.ca>
 
@@ -63,9 +64,11 @@
 
 Use "catchErrs" to catch the errors.
 -}
-module Language.Clafer (addModuleFragment,
+module Language.Clafer (runCompiler,
+                        addModuleFragment,
                         compile,
                         parse,
+                        desugar,
                         generate,
                         generateHtml,
                         generateFragments,
@@ -76,7 +79,6 @@
                         putEnv,
                         CompilerResult(..),
                         claferIRXSD,
-                        VerbosityL,
                         InputModel,
                         Token,
                         Module,
@@ -100,10 +102,13 @@
 import qualified Data.Map as Map
 import Data.Ord
 import Control.Monad
+import Control.Monad.State
 import Control.Lens.Plated
-import System.FilePath (takeBaseName)
+import System.Exit
+import System.FilePath (dropExtension,takeBaseName)
+import System.Process (readProcessWithExitCode, system)
 
-import Language.ClaferT 
+import Language.ClaferT
 import Language.Clafer.Common
 import Language.Clafer.Front.ErrM
 import Language.Clafer.ClaferArgs hiding (Clafer)
@@ -113,7 +118,7 @@
 import Language.Clafer.Front.Lexclafer
 import Language.Clafer.Front.Parclafer
 import Language.Clafer.Front.Printclafer
-import Language.Clafer.Front.Absclafer 
+import Language.Clafer.Front.Absclafer
 import Language.Clafer.Front.LayoutResolver
 import Language.Clafer.Intermediate.Tracing
 import Language.Clafer.Intermediate.Intclafer
@@ -125,16 +130,172 @@
 import Language.Clafer.Optimizer.Optimizer
 import Language.Clafer.Generator.Alloy
 import Language.Clafer.Generator.Choco
+import Language.Clafer.Generator.Concat
 import Language.Clafer.Generator.Xml
 import Language.Clafer.Generator.Python
 import Language.Clafer.Generator.Schema
 import Language.Clafer.Generator.Stats
 import Language.Clafer.Generator.Html
 import Language.Clafer.Generator.Graph
+import Language.Clafer.JSONMetaData
+import Language.Clafer.QNameUID
 
-type VerbosityL = Int
 type InputModel = String
 
+-- | Run the Clafer compiler.
+-- mURL = Nothing means compile the top-level module
+-- mURL = Just url means compile an imported module from the given url
+runCompiler :: Maybe URL -> ClaferArgs -> InputModel -> IO ()
+runCompiler    mURL         args'         inputModel =
+  do
+    result <- runClaferT args' $
+      do
+        forM_ (fragments inputModel) addModuleFragment
+        parse
+        iModule <- desugar mURL
+        {- need to runCompiler on imports
+        liftIO $ do
+          forM_ (_mModules iModule) $ \url -> do
+            -- use the same args just change the file name
+            importedModel <- retrieveModelFromURL url
+            runCompiler (Just url) (args' { file = getFileName url }) importedModel
+        -}
+        compile iModule
+        fs <- save args'
+        when (validate args') $ forM_ fs (liftIO . runValidate args' )
+    if Html `elem` (mode args')
+      then htmlCatch result args' inputModel
+      else return ()
+    result `cth` handleErrs
+  where
+  cth (Left err) f = f err
+  cth (Right r)  _ = return r
+  fragments model = map unlines $ fragments' $ lines model
+  fragments' []                  = []
+  fragments' ("//# FRAGMENT":xs) = fragments' xs
+  fragments' model               = takeWhile (/= "//# FRAGMENT") model : fragments' (dropWhile (/= "//# FRAGMENT") model)
+--  htmlCatch :: Either ClaferErr CompilerResult -> ClaferArgs -> String -> IO(CompilerResult)
+  htmlCatch (Right r) _ _ = return r
+  htmlCatch (Left err) args'' model =
+    do let f = (dropExtension $ file args'') ++ ".html"
+       let result = (if (self_contained args'')
+                     then Css.header ++ "<style>" ++ Css.css ++ "</style>" ++ "</head>\n<body>\n<pre>\n"
+                     else "")
+                     ++ highlightErrors model err ++
+                     (if (self_contained args'')
+                      then "\n</pre>\n</html>"
+                      else "")
+       liftIO $ if console_output args'' then putStrLn result else writeFile f result
+
+  handleErrs = mapM_ handleErr
+
+  handleErr (ClaferErr mesg) =
+    do
+      putStrLn "\nError...\n"
+      putStrLn mesg
+      exitFailure
+  -- We only use one fragment. Fragment id and position is not useful to us. We
+  -- only care about the position relative to
+  handleErr (ParseErr ErrPos{modelPos = Pos l c} mesg) =
+    do
+      putStrLn $ "\nParse failed at line " ++ show l ++ " column " ++ show c ++ "..."
+      putStrLn mesg
+      exitFailure
+  handleErr (SemanticErr ErrPos{modelPos = Pos l c} mesg) =
+    do
+      putStrLn $ "\nCompile error at line " ++ show l ++ " column " ++ show c ++ "..."
+      putStrLn mesg
+      exitFailure
+
+save :: MonadIO m => ClaferArgs -> ClaferT m [ String ]
+save args'=
+  do
+    resultsMap <- generate
+    let results = snd $ unzip $ Map.toList resultsMap
+    -- print stats only once
+    when (not $ no_stats args') $ liftIO $ printStats results
+    -- save the outputs
+    (iModule, _, _) <- getIr
+    forM results $ saveResult iModule resultsMap
+  where
+    -- saveResult :: MonadIO m => CompilerResult -> IModule -> (Map.Map ClaferMode CompilerResult) -> ClaferT m String
+    saveResult iModule' resultsMap' result@CompilerResult { extension } = do
+      result' <- if (add_graph args') && (Html `elem` (mode args') && ("dot" `isSuffixOf` (extension)))
+            then do
+                   ast' <- getAst
+                   (_, graph, _) <- liftIO $ readProcessWithExitCode "dot"  ["-Tsvg"] $ genSimpleGraph ast' iModule' (takeBaseName $ file args') (show_references args')
+                   return $ summary graph result
+            else return result
+      let f = dropExtension $ file args'
+      let f' = f ++ "." ++ extension
+      liftIO $ if console_output args' then putStrLn (outputCode result') else writeFile f' (outputCode result')
+      liftIO $ when (alloy_mapping args') $ writeFile (f ++ ".map") $ show (mappingToAlloy result')
+      let
+        qNameMaps :: QNameMaps
+        qNameMaps = deriveQNameMaps iModule'
+      liftIO $ when (meta_data args') $ writeFile (f ++ ".cfr-map") $ generateJSONnameUIDMap qNameMaps
+      liftIO $ when (meta_data args' && inScopeModes) $ writeFile (f ++ ".cfr-scope") $ generateJSONScopes qNameMaps $ getScopesList resultsMap'
+      return f'
+    saveResult _ _ NoCompilerResult { reason } = do
+      liftIO $ putStrLn reason
+      return ""
+    printStats :: [CompilerResult] -> IO ()
+    printStats []         = putStrLn "No compiler output."
+    printStats (r:rs) = case r of
+      CompilerResult { statistics } -> putStrLn statistics
+      (NoCompilerResult _) -> printStats rs
+
+    inScopeModes :: Bool
+    inScopeModes =
+      Alloy `elem` mode args' ||
+      Alloy42 `elem` mode args' ||
+      Choco `elem` mode args'
+
+    getScopesList :: (Map.Map ClaferMode CompilerResult) -> [(UID, Integer)]
+    getScopesList    resultsMap =
+        let
+           alloyResult = Map.lookup Alloy resultsMap
+           alloy42Result = Map.lookup Alloy42 resultsMap
+           chocoResult = Map.lookup Choco resultsMap
+        in
+           if (isNothing alloyResult)
+           then if (isNothing alloy42Result)
+                then if (isNothing chocoResult)
+                     then []
+                     else scopesList $ fromJust chocoResult
+                else scopesList $ fromJust alloy42Result
+           else scopesList $ fromJust alloyResult
+
+summary :: String -> CompilerResult -> CompilerResult
+summary graph result = result{outputCode=unlines $ summary' graph ("<pre>" ++ statistics result ++ "</pre>") (lines $ outputCode result)}
+
+summary' :: String -> String -> [String] -> [String]
+summary' _ _ [] = []
+summary' graph stats ("<!-- # SUMMARY /-->":xs) = graph:stats:summary' graph stats xs
+summary' graph stats ("<!-- # STATS /-->":xs) = stats:summary' graph stats xs
+summary' graph stats ("<!-- # GRAPH /-->":xs) = graph:summary' graph stats xs
+summary' graph stats ("<!-- # CVLGRAPH /-->":xs) = graph:summary' graph stats xs
+summary' graph stats (x:xs) = x:summary' graph stats xs
+
+runValidate :: ClaferArgs -> String -> IO ()
+runValidate args' fo = do
+  let path = (tooldir args') ++ "/"
+  liftIO $ putStrLn ("Validating '" ++ fo ++"'")
+  let modes = mode args'
+  when (Xml `elem` modes && "xml" `isSuffixOf` fo) $ do
+      writeFile "ClaferIR.xsd" claferIRXSD
+      voidf $ system $ "java -classpath " ++ path ++ " XsdCheck ClaferIR.xsd " ++ fo
+  when (Alloy `elem` modes && "als41" `isSuffixOf` fo) $ do
+    voidf $ system $ validateAlloy path "4" ++ fo
+  when (Alloy42 `elem` modes && "als" `isSuffixOf` fo) $ do
+    voidf $ system $ validateAlloy path "4.2" ++ fo
+  when (Mode.Clafer `elem` modes && "des.cfr" `isSuffixOf` fo) $ do
+    voidf $ system $ "../dist/build/clafer/clafer -s -m=clafer " ++ fo
+
+validateAlloy :: String -> String -> String
+validateAlloy path version = "java -cp " ++ path ++ "alloy" ++ version ++ ".jar edu.mit.csail.sdg.alloy4whole.ExampleUsingTheCompiler "
+
+
 -- | Add a new fragment to the model. Fragments should be added in order.
 addModuleFragment :: Monad m => InputModel -> ClaferT m ()
 addModuleFragment i =
@@ -162,7 +323,7 @@
           "" -> []
           ('\n' : r) -> lines' r
           x -> error $ "linesing " ++ x -- How can it be nonempty and not start with a newline after the break? Should never happen.
-      
+
 -- | Converts the Err monads (created by the BNFC parser generator) to ClaferT
 liftParseErrs :: Monad m => [Err a] -> ClaferT m [a]
 liftParseErrs e =
@@ -178,7 +339,7 @@
       -- Bad maps to ParseErr
       return $ Left $ ParseErr (ErrFragPos frgId p) s
 
--- | Converts one Err. liftParseErrs is better if you want to report multiple errors. 
+-- | Converts one Err. liftParseErrs is better if you want to report multiple errors.
 -- | This method will only report one before ceasing execution.
 liftParseErr :: Monad m => Err a -> ClaferT m a
 liftParseErr e = head `liftM` liftParseErrs [e]
@@ -219,34 +380,35 @@
         completeAst <- (parseFrag $ args env) completeModel
         liftParseErr completeAst
 
-    let env' = env{ cAst = Just ast, astModuleTrace = traceAstModule ast }
-    putEnv env'
+    putEnv env{ cAst = Just ast, astModuleTrace = traceAstModule ast }
   where
   parseFrag :: (Monad m) => ClaferArgs -> String -> ClaferT m (Err Module)
   parseFrag args' =
     (>>= (return . pModule)) .
-    (if not 
+    (if not
       ((new_layout args') ||
       (no_layout args'))
-    then 
-       resolveLayout 
-    else 
-       return) 
+    then
+       resolveLayout
+    else
+       return)
     . myLexer .
     (if (not $ no_layout args') &&
         (new_layout args')
-     then 
-       resLayout 
-     else 
+     then
+       resLayout
+     else
        id)
 
--- | Compiles the AST into IR.    
-compile :: Monad m => ClaferT m ()
-compile =
-  do
+desugar :: Monad m => Maybe URL -> ClaferT m IModule
+desugar mURL = do
+  ast' <- getAst
+  return $ desugarModule mURL ast'
+
+-- | Compiles the AST into IR.
+compile :: Monad m => IModule -> ClaferT m ()
+compile desugaredMod = do
     env <- getEnv
-    ast' <- getAst
-    let desugaredMod = desugar ast'
     let clafersWithKeyWords = foldMapIR isKeyWord desugaredMod
     when (""/=clafersWithKeyWords) $ throwErr (ClaferErr $ ("The model contains clafers with keywords as names in the following places:\n"++) $ clafersWithKeyWords :: CErr Span)
     ir <- analyze (args env) desugaredMod
@@ -254,13 +416,13 @@
 
     let spanList = foldMapIR gt1 imodule
     when ((afm $ args env) && spanList/="") $ throwErr (ClaferErr $ ("The model is not an attributed feature model.\nThe following places contain cardinality larger than 1:\n"++) $ spanList :: CErr Span)
-    putEnv $ env{ cIr = Just ir, irModuleTrace = traceIrModule imodule }
+    putEnv $ env{ cIr = Just ir }
     where
       isKeyWord :: Ir -> String
-      isKeyWord (IRClafer IClafer{_cinPos = (Span (Pos l c) _) ,_ident=i}) = if (i `elem` keyWords) then ("Line " ++ show l ++ " column " ++ show c ++ "\n") else ""
+      isKeyWord (IRClafer IClafer{_cinPos = (Span (Pos l c) _) ,_ident=i}) = if (i `elem` keywordIdents) then ("Line " ++ show l ++ " column " ++ show c ++ "\n") else ""
       isKeyWord _ = ""
       gt1 :: Ir -> String
-      gt1 (IRClafer (IClafer (Span (Pos l c) _) False _ _ _ _ (Just (_, m)) _ _)) = if (m > 1 || m < 0) then ("Line " ++ show l ++ " column " ++ show c ++ "\n") else ""
+      gt1 (IRClafer (IClafer (Span (Pos l c) _) False _ _ _ _ _ _ (Just (_, m)) _ _)) = if (m > 1 || m < 0) then ("Line " ++ show l ++ " column " ++ show c ++ "\n") else ""
       gt1 _ = ""
 
 -- | Splits the IR into their fragments, and generates the output for each fragment.
@@ -272,15 +434,15 @@
     env <- getEnv
     (iModule, _, _) <- getIr
     fragElems <- fragment (sortBy (comparing rnge) $ _mDecls iModule) (frags env)
-    
+
     -- Assumes output mode is Alloy for now
-    
+
     return $ map (generateFragment $ args env) fragElems
   where
   rnge (IEClafer IClafer{_cinPos = p}) = p
   rnge IEConstraint{_cpexp = PExp{_inPos = p}} = p
   rnge IEGoal{_cpexp = PExp{_inPos = p}} = p
-  
+
   -- Groups IElements by their fragments.
   --   elems must be sorted by range.
   fragment :: (Monad m) => [IElement] -> [Pos] -> ClaferT m [[IElement]]
@@ -290,7 +452,7 @@
     where
     (curFrag, restFrags) = span (`beforePos` frag) elems
   fragment _ [] = throwErr $ (ClaferErr $ "Unexpected fragment." :: CErr Span) -- Should not happen. Bug.
-  
+
   beforePos ele p =
     case rnge ele of
       Span _ e -> e <= p
@@ -299,9 +461,9 @@
     flatten $ cconcat $ map (genDeclaration args') frag
 
 -- | Splits the AST into their fragments, and generates the output for each fragment.
-generateHtml :: ClaferEnv -> Module -> String
-generateHtml env ast' =
-    let Module _ decls' = ast';
+generateHtml :: ClaferEnv -> String
+generateHtml env =
+    let (Just (Module _ decls')) = cAst env;
         cargs = args env;
         irMap = irModuleTrace env;
         comments = if add_comments cargs then getComments $ unlines $ modelFrags env else [];
@@ -330,7 +492,7 @@
 
 noReals :: IModule -> Bool
 noReals iModule = reals == []
-  where 
+  where
     iexps :: [ IExp ]
     iexps = universeOn biplate iModule
     reals = filter isIDouble iexps
@@ -344,27 +506,27 @@
     env <- getEnv
     ast' <- getAst
     (iModule, genv, au) <- getIr
-    let 
+    let
       hasNoReals = noReals iModule
       cargs = args env
       modes = mode cargs
       stats = showStats au $ statsModule iModule
       scopes = getScopeStrategy (scope_strategy cargs) iModule
 
-    return $ Map.fromList ( 
+    return $ Map.fromList (
         -- result for Alloy
         (if (Alloy `elem` modes)
           then if (hasNoReals)
-                then 
-                  let 
+                then
+                  let
                     (imod,strMap) = astrModule iModule
                     alloyCode = genModule cargs{mode = [Alloy]} (imod, genv) scopes
-                    addCommentStats = if no_stats cargs then const else addStats 
-                  in 
-                    [ (Alloy, 
-                      CompilerResult { 
-                       extension = "als41", 
-                       outputCode = addCommentStats (fst alloyCode) stats, 
+                    addCommentStats = if no_stats cargs then const else addStats
+                  in
+                    [ (Alloy,
+                      CompilerResult {
+                       extension = "als41",
+                       outputCode = addCommentStats (fst alloyCode) stats,
                        statistics = stats,
                        claferEnv  = env,
                        mappingToAlloy = fromMaybe [] (Just $ snd alloyCode),
@@ -372,27 +534,27 @@
                        scopesList = scopes
                       })
                     ]
-                else [ (Alloy, 
-                        NoCompilerResult { 
-                         reason = "Alloy output unavailable because the model contains real numbers." 
+                else [ (Alloy,
+                        NoCompilerResult {
+                         reason = "Alloy output unavailable because the model contains real numbers."
                         })
                      ]
           else []
-        ) 
+        )
         ++
         -- result for Alloy42
         (if (Alloy42 `elem` modes)
           then if (hasNoReals)
                 then
-                   let 
+                   let
                       (imod,strMap) = astrModule iModule
                       alloyCode = genModule cargs{mode = [Alloy42]} (imod, genv) scopes
-                      addCommentStats = if no_stats cargs then const else addStats 
-                   in 
-                      [ (Alloy42, 
-                        CompilerResult { 
-                         extension = "als", 
-                         outputCode = addCommentStats (fst alloyCode) stats, 
+                      addCommentStats = if no_stats cargs then const else addStats
+                   in
+                      [ (Alloy42,
+                        CompilerResult {
+                         extension = "als",
+                         outputCode = addCommentStats (fst alloyCode) stats,
                          statistics = stats,
                          claferEnv  = env,
                          mappingToAlloy = fromMaybe [] (Just $ snd alloyCode),
@@ -400,19 +562,19 @@
                          scopesList = scopes
                         })
                       ]
-                else [ (Alloy, 
-                        NoCompilerResult { 
-                         reason = "Alloy output unavailable because the model contains real numbers." 
+                else [ (Alloy,
+                        NoCompilerResult {
+                         reason = "Alloy output unavailable because the model contains real numbers."
                         })
                      ]
           else []
-        )   
-        -- result for XML    
+        )
+        -- result for XML
         ++ (if (Xml `elem` modes)
           then [ (Xml,
-                  CompilerResult { 
-                   extension = "xml", 
-                   outputCode = genXmlModule iModule, 
+                  CompilerResult {
+                   extension = "xml",
+                   outputCode = genXmlModule iModule,
                    statistics = stats,
                    claferEnv  = env,
                    mappingToAlloy = [],
@@ -424,9 +586,9 @@
         -- result for Clafer
         ++ (if (Mode.Clafer `elem` modes)
           then [ (Mode.Clafer,
-                  CompilerResult { 
-                   extension = "des.cfr", 
-                   outputCode = printTree $ sugarModule iModule, 
+                  CompilerResult {
+                   extension = "des.cfr",
+                   outputCode = printTree $ sugarModule iModule,
                    statistics = stats,
                    claferEnv  = env,
                    mappingToAlloy = [],
@@ -435,12 +597,12 @@
                   }) ]
           else []
         )
-        -- result for Html    
+        -- result for Html
         ++ (if (Html `elem` modes)
           then [ (Html,
-                  CompilerResult { 
-                   extension = "html", 
-                   outputCode = generateHtml env ast', 
+                  CompilerResult {
+                   extension = "html",
+                   outputCode = generateHtml env,
                    statistics = stats,
                    claferEnv  = env,
                    mappingToAlloy = [],
@@ -451,9 +613,9 @@
         )
         ++ (if (Graph `elem` modes)
           then [ (Graph,
-                  CompilerResult { 
-                     extension = "dot", 
-                     outputCode = genSimpleGraph ast' iModule (takeBaseName $ file cargs) (show_references cargs), 
+                  CompilerResult {
+                     extension = "dot",
+                     outputCode = genSimpleGraph ast' iModule (takeBaseName $ file cargs) (show_references cargs),
                      statistics = stats,
                      claferEnv  = env,
                      mappingToAlloy = [],
@@ -464,9 +626,9 @@
         )
         ++ (if (CVLGraph `elem` modes)
           then [ (CVLGraph,
-                  CompilerResult { 
-                       extension = "cvl.dot", 
-                       outputCode = genCVLGraph ast' iModule (takeBaseName $ file cargs), 
+                  CompilerResult {
+                       extension = "cvl.dot",
+                       outputCode = genCVLGraph ast' iModule (takeBaseName $ file cargs),
                        statistics = stats,
                        claferEnv  = env,
                        mappingToAlloy = [],
@@ -475,11 +637,11 @@
                   }) ]
           else []
         )
-        -- result for Python    
+        -- result for Python
         ++ (if (Python `elem` modes)
-          then [ (Python, 
-                  CompilerResult { 
-                   extension = "py", 
+          then [ (Python,
+                  CompilerResult {
+                   extension = "py",
                    outputCode = genPythonModule iModule,
                    statistics = stats,
                    claferEnv  = env,
@@ -489,15 +651,15 @@
                   }) ]
           else []
         )
-        -- result for Choco    
+        -- result for Choco
         ++ (if (Choco `elem` modes)
-          then let 
+          then let
                   imod = iModule
                in
-                  [ (Choco, 
-                     CompilerResult { 
-                         extension = "js", 
-                         outputCode = genCModule cargs (imod, genv) scopes, 
+                  [ (Choco,
+                     CompilerResult {
+                         extension = "js",
+                         outputCode = genCModule cargs (imod, genv) scopes,
                          statistics = stats,
                          claferEnv  = env,
                          mappingToAlloy = [],
@@ -506,37 +668,34 @@
                       }) ]
           else []
         ))
-    
+
 -- | Result of generation for a given mode
 data CompilerResult = CompilerResult {
                             -- | output file extension
-                            extension :: String, 
+                            extension :: String,
                             -- | output text
-                            outputCode :: String, 
+                            outputCode :: String,
                             statistics :: String,
                             -- | the final environment of the compiler
                             claferEnv :: ClaferEnv,
                             -- | Maps source constraint spans in Alloy to the spans in the IR
-                            mappingToAlloy :: [(Span, IrTrace)], 
+                            mappingToAlloy :: [(Span, IrTrace)],
                             -- | Map back from Ints used to represent Strings
                             stringMap :: (Map.Map Int String),
                             -- | scopes generated by scope inference
                             scopesList :: [(UID, Integer)]
-                            } 
+                            }
                       | NoCompilerResult {
                             reason :: String
                       } deriving Show
 
-desugar :: Module -> IModule  
-desugar iModule = desugarModule iModule
-
 liftError :: (Monad m, Language.ClaferT.Throwable t) => Either t a -> ClaferT m a
 liftError = either throwErr return
 
 analyze :: Monad m => ClaferArgs -> IModule -> ClaferT m (IModule, GEnv, Bool)
 analyze args' iModule = do
   liftError $ findDupModule args' iModule
-  let 
+  let
     au = allUnique iModule
   let args'' = args'{skip_resolver = au && (skip_resolver args')}
   (rTree, genv) <- liftError $ resolveModule args'' iModule
@@ -548,9 +707,9 @@
 
 showStats :: Bool -> Stats -> String
 showStats au (Stats na nr nc nconst ngoals sgl) =
-  unlines [ "All clafers: " ++ (show (na + nr + nc)) ++ " | Abstract: " ++ (show na) ++ " | Concrete: " ++ (show nc) ++ " | References: " ++ (show nr)
+  unlines [ "All clafers: " ++ (show (na + nc)) ++ " | Abstract: " ++ (show na) ++ " | Concrete: " ++ (show nc) ++ " | References: " ++ (show nr)
           , "Constraints: " ++ show nconst
-          , "Goals: " ++ show ngoals  
+          , "Goals: " ++ show ngoals
           , "Global scope: " ++ showInterval sgl
           , "Can skip resolver: " ++ if au then "yes" else "no" ]
 
@@ -561,7 +720,3 @@
 -- | The XML Schema of the IR
 claferIRXSD :: String
 claferIRXSD = Language.Clafer.Generator.Schema.xsd
-
--- | reserved keywords
-keyWords :: [String]
-keyWords = ["ref","parent","abstract", "else", "in", "no", "opt", "xor", "all", "enum", "lone", "not", "or", "disj", "extends", "mux", "one", "some"]
diff --git a/src/Language/Clafer/ClaferArgs.hs b/src/Language/Clafer/ClaferArgs.hs
--- a/src/Language/Clafer/ClaferArgs.hs
+++ b/src/Language/Clafer/ClaferArgs.hs
@@ -35,6 +35,8 @@
 import Paths_clafer (version)
 import Data.Version (showVersion)
 
+import GetURL
+
 -- | Type of output to be generated at the end of compilation
 data ClaferMode = Alloy42 | Alloy | Xml | Clafer | Html | Graph | CVLGraph | Python | Choco
   deriving (Eq, Show, Ord, Data, Typeable)
@@ -105,24 +107,24 @@
  } &= summary ("Clafer " ++ showVersion Paths_clafer.version) &= program "clafer"
 
 mergeArgs :: ClaferArgs -> ClaferArgs -> ClaferArgs
-mergeArgs a1 a2  = ClaferArgs (mode a1) (coMergeArg) 
-  (mergeArg flatten_inheritance) (mergeArg timeout_analysis) 
-  (mergeArg no_layout) (mergeArg new_layout) 
-  (mergeArg check_duplicates) (mergeArg skip_resolver) 
+mergeArgs a1 a2  = ClaferArgs (mode a1) (coMergeArg)
+  (mergeArg flatten_inheritance) (mergeArg timeout_analysis)
+  (mergeArg no_layout) (mergeArg new_layout)
+  (mergeArg check_duplicates) (mergeArg skip_resolver)
   (mergeArg keep_unused) (mergeArg no_stats) (mergeArg schema)
-  (mergeArg validate) (mergeArg noalloyruncommand) (toolMergeArg) 
-  (mergeArg alloy_mapping) (mergeArg self_contained) 
-  (mergeArg add_graph) (mergeArg show_references) 
-  (mergeArg add_comments) (mergeArg ecore2clafer) 
-  (mergeArg scope_strategy) (mergeArg afm) (mergeArg skip_goals) 
+  (mergeArg validate) (mergeArg noalloyruncommand) (toolMergeArg)
+  (mergeArg alloy_mapping) (mergeArg self_contained)
+  (mergeArg add_graph) (mergeArg show_references)
+  (mergeArg add_comments) (mergeArg ecore2clafer)
+  (mergeArg scope_strategy) (mergeArg afm) (mergeArg skip_goals)
   (mergeArg meta_data) (mergeArg file)
   where
     coMergeArg :: Bool
-    coMergeArg = if (r1 /= False) then r1 else 
+    coMergeArg = if (r1 /= False) then r1 else
       if (r2 /= False) then r2 else (null $ file a1)
          where r1 = console_output a1;r2 = console_output a2
     toolMergeArg :: String
-    toolMergeArg = if (r1 /= "") then r1 else 
+    toolMergeArg = if (r1 /= "") then r1 else
       if (r2 /= "") then r2 else "/tools"
       where r1 = tooldir a1;r2 = tooldir a2
     mergeArg :: (Default a, Eq a) => (ClaferArgs -> a) -> a
@@ -130,22 +132,29 @@
 
 mainArgs :: IO (ClaferArgs, String)
 mainArgs = do
-  args' <- cmdArgs clafer 
-  model <- case file args' of
-             "" -> hGetContents stdin
-             f  -> readFile f
+  args' <- cmdArgs clafer
+  model <- retrieveModelFromURL $ file args'
   let args'' = argsWithOPTIONS args' model
   -- Alloy42 should be the default mode but only if nothing else was specified
-  -- cannot use [ Alloy42 ] as the default in the definition of `clafer :: ClaferArgs` since 
+  -- cannot use [ Alloy42 ] as the default in the definition of `clafer :: ClaferArgs` since
   -- Alloy42 will always be a mode in addition to the other specified modes (it will become mandatory)
   let args''' = if null $ mode args''
                 then args''{mode = [ Alloy42 ]}
                 else args''
   return $ (args''', model)
 
+retrieveModelFromURL :: String -> IO String
+retrieveModelFromURL url = do
+  case url of
+    "" -> hGetContents stdin -- this is the pre-module system behavior
+    ('f':'i':'l':'e':':':'/':'/':n) -> readFile n
+    ('h':'t':'t':'p':':':'/':'/':_) -> getURL url
+    ('f':'t':'p':':':'/':'/':_) -> getURL url
+    n -> readFile n -- this is the pre-module system behavior
+
 argsWithOPTIONS :: ClaferArgs -> String -> ClaferArgs
 argsWithOPTIONS    args'         model   =
-  let 
+  let
     firstLine = case lines model of
                  [] -> ""
                  (s:_) -> s
diff --git a/src/Language/Clafer/Comments.hs b/src/Language/Clafer/Comments.hs
--- a/src/Language/Clafer/Comments.hs
+++ b/src/Language/Clafer/Comments.hs
@@ -70,14 +70,14 @@
 
 readLine :: String -> Pos -> [(Span, String)]
 readLine    [] _                   = []
-readLine    xs start@(Pos row col) = let comment = takeWhile (/= '\n') xs in 
+readLine    xs start@(Pos row col) = let comment = takeWhile (/= '\n') xs in
                                                    ((Span start (Pos row (col + toInteger (length comment)))),
                                                     comment): getComments' (drop (length comment + 1) xs) (row + 1) 1
 
 
-readBlock :: String -> Pos -> [(Span, String)]  
+readBlock :: String -> Pos -> [(Span, String)]
 readBlock   xs start@(Pos row col) = let (end@(Pos row' col'), comment, rest) = readBlock' xs row col id in
-                                      ((Span start end), comment):getComments' rest row' col'                                    
+                                      ((Span start end), comment):getComments' rest row' col'
 readBlock' :: String -> Integer
               -> Integer -> (String -> String)
               -> (Pos, String,String)
diff --git a/src/Language/Clafer/Common.hs b/src/Language/Clafer/Common.hs
--- a/src/Language/Clafer/Common.hs
+++ b/src/Language/Clafer/Common.hs
@@ -22,11 +22,16 @@
 -}
 module Language.Clafer.Common where
 
-import Data.Tree
-import Data.Maybe
-import Data.Char
-import Data.List
+import           Control.Applicative ((<$>))
+import           Control.Lens (universeOn)
+import           Data.Char
+import           Data.Data.Lens (biplate)
+import           Data.List
 import qualified Data.Map as Map
+import           Data.Maybe
+import           Data.StringMap (StringMap)
+import qualified Data.StringMap as SMap
+import           Data.Tree
 
 import Language.Clafer.Front.Absclafer
 import Language.Clafer.Intermediate.Intclafer
@@ -35,9 +40,8 @@
 -- basic functions shared by desugarer, analyzer and code generator
 type Result = String
 
-transIdent :: PosIdent -> Result
-transIdent x = case x of
-  PosIdent str  -> snd str
+transIdent :: PosIdent -> String
+transIdent (PosIdent (_, str)) = str
 
 mkIdent :: String -> PosIdent
 mkIdent str = PosIdent ((0, 0), str)
@@ -47,29 +51,35 @@
 
 type Ident = PosIdent
 
-getSuper :: IClafer -> String
-getSuper = getSuperId._supers._super
+-- | Returns only [] or [_]
+getSuper :: IClafer -> [String]
+getSuper claf = case getSuperId <$> _super claf of
+    Nothing       -> []
+    Just "clafer" -> error "Bug: The identifier 'clafer' should never be returned as super type"
+    Just x        -> [x]
 
-getSuperNoArr :: IClafer -> String
+-- | Returns only [] or [_]
+getReference :: IClafer -> [String]
+getReference c = case getSuperId <$> _ref <$> _reference c of
+    Nothing -> []
+    Just x  -> [x]
 
-getSuperNoArr clafer
-  | _isOverlapping $ _super clafer = "clafer"
-  | otherwise                    = getSuper clafer
+-- | Returns only [] or [_] or [_, _]
+getSuperAndReference :: IClafer -> [String]
+getSuperAndReference c = (getSuper c) ++ (getReference c)
 
-getSuperId :: [PExp] -> String
-getSuperId = _sident . Language.Clafer.Intermediate.Intclafer._exp . head
+getSuperId :: PExp -> String
+getSuperId (PExp _ _ _ (IClaferId{ _sident = s})) = s
+getSuperId pexp' = error $ "Bug: getSuperId called not on '[PExp (IClaferId)]' but instead on '" ++ show pexp' ++ "'"
 
 isEqClaferId :: String -> IClafer -> Bool
-isEqClaferId = flip $ (==)._uid
+isEqClaferId    uid'      claf'    = _uid claf' == uid'
 
 idToPExp :: String -> Span -> String -> String -> Bool -> PExp
-idToPExp pid' pos modids id' isTop' = PExp (Just $ TClafer [id']) pid' pos (IClaferId modids id' isTop')
-
-mkLClaferId :: String -> Bool -> IExp
-mkLClaferId = IClaferId ""
+idToPExp pid' pos modids id' isTop' = PExp (Just $ TClafer [id']) pid' pos (IClaferId modids id' isTop' Nothing)
 
-mkPLClaferId :: String -> Bool -> PExp
-mkPLClaferId id' isTop' = pExpDefPidPos $ mkLClaferId id' isTop'
+mkPLClaferId :: CName -> Bool -> ClaferBinding -> PExp
+mkPLClaferId id' isTop' bind' = pExpDefPidPos $ IClaferId "" id' isTop' bind'
 
 pExpDefPidPos :: IExp -> PExp
 pExpDefPidPos = pExpDefPid noSpan
@@ -81,22 +91,26 @@
 pExpDef = PExp Nothing
 
 isParent :: PExp -> Bool
-isParent (PExp _ _ _ (IClaferId _ id' _)) = id' == parent
+isParent (PExp _ _ _ (IClaferId _ id' _ _)) = id' == parentIdent
 isParent _ = False
 
 isClaferName :: PExp -> Bool
-isClaferName (PExp _ _ _ (IClaferId _ id' _)) =
-  id' `notElem` ([this, parent, children, ref] ++ primitiveTypes)
+isClaferName (PExp _ _ _ (IClaferId _ id' _ _)) =
+  id' `notElem` (specialNames ++ primitiveTypes)
 isClaferName _ = False
 
 isClaferName' :: PExp -> Bool
-isClaferName' (PExp _ _ _ (IClaferId _ _ _)) = True
+isClaferName' (PExp _ _ _ (IClaferId _ _ _ _)) = True
 isClaferName' _ = False
 
 getClaferName :: PExp -> String
-getClaferName (PExp _ _ _ (IClaferId _ id' _)) = id'
+getClaferName (PExp _ _ _ (IClaferId _ id' _ _)) = id'
 getClaferName _ = ""
 
+isTopLevel :: IClafer -> Bool
+isTopLevel IClafer{_parentUID=puid} = puid == rootIdent  -- for concrete clafers
+                                   || puid == baseClafer -- for abstract clafers
+
 -- -----------------------------------------------------------------------------
 -- conversions
 elemToClafer :: IElement -> Maybe IClafer
@@ -110,7 +124,7 @@
 -- -----------------------------------------------------------------------------
 -- finds hierarchy and transforms each element
 mapHierarchy :: (IClafer -> b)
-                -> (IClafer -> String)
+                -> (IClafer -> [String])
                 -> [IClafer]
                 -> IClafer
                 -> [b]
@@ -119,20 +133,32 @@
 
 -- returns inheritance hierarchy of a clafer
 
-findHierarchy :: (IClafer -> String)
+findHierarchy :: (IClafer -> [String])
                             -> [IClafer]
                             -> IClafer
                             -> [IClafer]
-findHierarchy sFun clafers clafer
-  | sFun clafer == "clafer"      = [clafer]
-  | otherwise                    = if clafer `elem` superClafers
-                                   then error $ "Inheritance hierarchy contains a cycle: line " ++ (show $ _cinPos clafer)
-                                   else clafer : superClafers
+findHierarchy sFun clafers clafer = case sFun clafer of
+  []           -> [clafer]  -- no super and no reference
+  supersOrRefs -> let
+                    superOrRefClafers = (concatMap findSuper supersOrRefs)
+                  in
+                    clafer : superOrRefClafers ++ concatMap (findHierarchy sFun clafers) superOrRefClafers
   where
-  superClafers = unfoldr (\c -> find (isEqClaferId $ sFun c) clafers >>=
-                          Just . (apply id)) clafer
+    findSuper superUid = filter (\c -> _uid c == superUid) clafers
 
 -- -----------------------------------------------------------------------------
+-- map construction functions
+
+createUidIClaferMap :: IModule -> StringMap IClafer
+createUidIClaferMap    iModule  = foldl' (\accumMap' claf -> SMap.insert (_uid claf) claf accumMap') SMap.empty allClafers
+  where
+    allClafers :: [ IClafer ]
+    allClafers = universeOn biplate iModule
+
+findIClafer :: StringMap IClafer -> UID -> Maybe IClafer
+findIClafer    uidIClaferMap        uid' = SMap.lookup uid' uidIClaferMap
+
+-- -----------------------------------------------------------------------------
 -- generic functions
 
 apply :: forall t t1. (t -> t1) -> t -> (t, t1)
@@ -290,7 +316,7 @@
 
 -- ternary operators
 iIfThenElse :: String
-iIfThenElse   = "=>else"
+iIfThenElse   = "ifthenelse"
 
 mkIFunExp :: String -> [IExp] -> IExp
 mkIFunExp _ (x:[]) = x
@@ -303,24 +329,33 @@
 -- -----------------------------------------------------------------------------
 -- Constants
 
-this :: String
-this = "this"
+rootIdent :: String
+rootIdent = "root"
 
-parent :: String
-parent = "parent"
+rootUID :: String
+rootUID = "root"
 
-children :: String
-children = "children"
+thisIdent :: String
+thisIdent = "this"
 
-ref :: String
-ref = "ref"
+parentIdent :: String
+parentIdent = "parent"
 
+refIdent :: String
+refIdent = "ref"
+
+childrenIdent :: String
+childrenIdent = "children"
+
 specialNames :: [String]
-specialNames = [this, parent, children, ref]
+specialNames = [thisIdent, parentIdent, refIdent, rootIdent, childrenIdent]
 
-strType :: String
-strType = "string"
+isSpecial :: String -> Bool
+isSpecial = flip elem specialNames
 
+stringType :: String
+stringType = "string"
+
 intType :: String
 intType = "int"
 
@@ -330,6 +365,9 @@
 realType :: String
 realType = "real"
 
+booleanType :: String
+booleanType = "boolean"
+
 baseClafer :: String
 baseClafer = "clafer"
 
@@ -337,11 +375,24 @@
 modSep = "\\"
 
 primitiveTypes :: [String]
-primitiveTypes = [strType, intType, integerType, realType]
+primitiveTypes = [stringType, intType, integerType, realType]
 
 isPrimitive :: String -> Bool
 isPrimitive = flip elem primitiveTypes
 
+-- | reserved keywords which cannot be used as clafer identifiers
+keywordIdents :: [String]
+keywordIdents =
+  baseClafer :
+  specialNames ++
+  primitiveTypes ++
+  [ iGMax, iGMin, iSumSet ] ++ -- unary operators
+  [ iXor, iIn ] ++ -- binary operators
+  [ "if", "then", "else" ] ++ -- ternary operators
+  [ "no", "not", "some", "one", "all", "disj" ] ++ -- quantifiers
+  [ "opt", "mux", "or", "lone" ] ++ -- group cardinalities
+  [ "abstract", "enum" ] -- keywords
+
 data GEnv = GEnv {
   identCountMap :: Map.Map String Int,
   expCount :: Int,
@@ -352,4 +403,8 @@
 voidf :: Monad m => m t -> m ()
 voidf f = do
   _ <- f
-  return ()
+  return ()
+
+safeTail :: [a] -> [a]
+safeTail [] = []
+safeTail (_:xs) = xs
diff --git a/src/Language/Clafer/Css.hs b/src/Language/Clafer/Css.hs
--- a/src/Language/Clafer/Css.hs
+++ b/src/Language/Clafer/Css.hs
@@ -25,7 +25,7 @@
 header = "<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\">\n"
 
 css :: String
-css = unlines [ 
+css = unlines [
   ".identifier{}",
   ".keyword{font-weight:bold}",
   ".reference{}",
diff --git a/src/Language/Clafer/Front/Absclafer.hs b/src/Language/Clafer/Front/Absclafer.hs
--- a/src/Language/Clafer/Front/Absclafer.hs
+++ b/src/Language/Clafer/Front/Absclafer.hs
@@ -44,7 +44,7 @@
   deriving (Eq,Ord,Show,Read,Data,Typeable,Generic)
 
 data Clafer =
-   Clafer Span Abstract GCard PosIdent Super Card Init Elements
+   Clafer Span Abstract GCard PosIdent Super Reference Card Init Elements
   deriving (Eq,Ord,Show,Read,Data,Typeable,Generic)
 
 data Constraint =
@@ -79,13 +79,13 @@
 
 data Super =
    SuperEmpty Span
- | SuperSome Span SuperHow SetExp
+ | SuperSome Span SetExp
   deriving (Eq,Ord,Show,Read,Data,Typeable,Generic)
 
-data SuperHow =
-   SuperColon Span
- | SuperArrow Span
- | SuperMArrow Span
+data Reference =
+   ReferenceEmpty Span
+ | ReferenceSet Span SetExp
+ | ReferenceBag Span SetExp
   deriving (Eq,Ord,Show,Read,Data,Typeable,Generic)
 
 data Init =
@@ -94,8 +94,8 @@
   deriving (Eq,Ord,Show,Read,Data,Typeable,Generic)
 
 data InitHow =
-   InitHow_1 Span
- | InitHow_2 Span
+   InitConstant Span
+ | InitDefault Span
   deriving (Eq,Ord,Show,Read,Data,Typeable,Generic)
 
 data GCard =
@@ -208,7 +208,7 @@
   getSpan ( ElementDecl s _ ) = s
 
 instance Spannable Clafer where
-  getSpan ( Clafer s _ _ _ _ _ _ _ ) = s
+  getSpan ( Clafer s _ _ _ _ _ _ _ _ ) = s
 
 instance Spannable Constraint where
   getSpan ( Constraint s _ ) = s
@@ -236,20 +236,20 @@
 
 instance Spannable Super where
   getSpan ( SuperEmpty s ) = s
-  getSpan ( SuperSome s _ _ ) = s
+  getSpan ( SuperSome s _ ) = s
 
-instance Spannable SuperHow where
-  getSpan ( SuperColon s ) = s
-  getSpan ( SuperArrow s ) = s
-  getSpan ( SuperMArrow s ) = s
+instance Spannable Reference where
+  getSpan ( ReferenceEmpty s ) = s
+  getSpan ( ReferenceSet s _ ) = s
+  getSpan ( ReferenceBag s _ ) = s
 
 instance Spannable Init where
   getSpan ( InitEmpty s ) = s
   getSpan ( InitSome s _ _ ) = s
 
 instance Spannable InitHow where
-  getSpan ( InitHow_1 s ) = s
-  getSpan ( InitHow_2 s ) = s
+  getSpan ( InitConstant s ) = s
+  getSpan ( InitDefault s ) = s
 
 instance Spannable GCard where
   getSpan ( GCardEmpty s ) = s
diff --git a/src/Language/Clafer/Front/LayoutResolver.hs b/src/Language/Clafer/Front/LayoutResolver.hs
--- a/src/Language/Clafer/Front/LayoutResolver.hs
+++ b/src/Language/Clafer/Front/LayoutResolver.hs
@@ -234,7 +234,7 @@
     t = tokenLookup s
 
 resLayout :: String -> String
-resLayout input' = 
+resLayout input' =
   reverse $ output $ execState resolveLayout' $ LayEnv 0 [] input'' [] 0
   where
   input'' = unlines $ filter (/= "") $ lines input'
@@ -293,7 +293,7 @@
 
 emitIndent :: MonadState LayEnv m => Int -> m ()
 emitIndent n = do
-  lev <- gets level  
+  lev <- gets level
   when (n > lev) $ do
     ctr <- gets brCtr
     when (ctr < 1) $ do
@@ -322,7 +322,7 @@
   return c
 
 revertLayout :: String -> String
-revertLayout input' = unlines $ revertLayout' (lines input') 0 
+revertLayout input' = unlines $ revertLayout' (lines input') 0
 
 revertLayout' :: [String] -> Int -> [String]
 revertLayout' []             _ = []
@@ -331,4 +331,4 @@
                                     where i' = i + 2
 revertLayout' (('}':xs):xss) i = (replicate i' ' ' ++ xs):revertLayout' xss i'
                                     where i' = i - 2
-revertLayout' (xs:xss)       i = (replicate i ' ' ++ xs):revertLayout' xss i
+revertLayout' (xs:xss)       i = (replicate i ' ' ++ xs):revertLayout' xss i
diff --git a/src/Language/Clafer/Front/Lexclafer.x b/src/Language/Clafer/Front/Lexclafer.x
--- a/src/Language/Clafer/Front/Lexclafer.x
+++ b/src/Language/Clafer/Front/Lexclafer.x
@@ -20,7 +20,7 @@
 $u = [\0-\255]          -- universal: any character
 
 @rsyms =    -- symbols and non-identifier-like reserved words
-   \= | \[ | \] | \( | \) | \< \< | \> \> | \{ | \} | \` | \: | \- \> | \- \> \> | \: \= | \? | \+ | \* | \. \. | \| | \< \= \> | \= \> | \| \| | \& \& | \! | \< | \> | \< \= | \> \= | \! \= | \- | \/ | \# | \+ \+ | \, | \- \- | \& | \< \: | \: \> | \. | \; | \\
+   \= | \[ | \] | \< \< | \> \> | \{ | \} | \` | \: | \- \> | \- \> \> | \: \= | \? | \+ | \* | \. \. | \| | \< \= \> | \= \> | \| \| | \& \& | \! | \< | \> | \< \= | \> \= | \! \= | \- | \/ | \# | \+ \+ | \, | \- \- | \* \* | \< \: | \: \> | \. | \; | \\ | \( | \)
 
 :-
 "//" [.]* ; -- Toss single line comments
@@ -98,7 +98,7 @@
                               | s > a  = treeFind right
                               | s == a = t
 
-resWords = b ">=" 31 (b "." 16 (b "*" 8 (b "&" 4 (b "!=" 2 (b "!" 1 N N) (b "#" 3 N N)) (b "(" 6 (b "&&" 5 N N) (b ")" 7 N N))) (b "-" 12 (b "++" 10 (b "+" 9 N N) (b "," 11 N N)) (b "->" 14 (b "--" 13 N N) (b "->>" 15 N N)))) (b "<:" 24 (b ":=" 20 (b "/" 18 (b ".." 17 N N) (b ":" 19 N N)) (b ";" 22 (b ":>" 21 N N) (b "<" 23 N N))) (b "=" 28 (b "<=" 26 (b "<<" 25 N N) (b "<=>" 27 N N)) (b ">" 30 (b "=>" 29 N N) N)))) (b "min" 47 (b "all" 39 (b "\\" 35 (b "?" 33 (b ">>" 32 N N) (b "[" 34 N N)) (b "`" 37 (b "]" 36 N N) (b "abstract" 38 N N))) (b "if" 43 (b "else" 41 (b "disj" 40 N N) (b "enum" 42 N N)) (b "lone" 45 (b "in" 44 N N) (b "max" 46 N N)))) (b "sum" 55 (b "one" 51 (b "no" 49 (b "mux" 48 N N) (b "not" 50 N N)) (b "or" 53 (b "opt" 52 N N) (b "some" 54 N N))) (b "|" 59 (b "xor" 57 (b "then" 56 N N) (b "{" 58 N N)) (b "}" 61 (b "||" 60 N N) N))))
+resWords = b ">>" 32 (b "." 16 (b "**" 8 (b "&&" 4 (b "!=" 2 (b "!" 1 N N) (b "#" 3 N N)) (b ")" 6 (b "(" 5 N N) (b "*" 7 N N))) (b "-" 12 (b "++" 10 (b "+" 9 N N) (b "," 11 N N)) (b "->" 14 (b "--" 13 N N) (b "->>" 15 N N)))) (b "<:" 24 (b ":=" 20 (b "/" 18 (b ".." 17 N N) (b ":" 19 N N)) (b ";" 22 (b ":>" 21 N N) (b "<" 23 N N))) (b "=" 28 (b "<=" 26 (b "<<" 25 N N) (b "<=>" 27 N N)) (b ">" 30 (b "=>" 29 N N) (b ">=" 31 N N))))) (b "min" 48 (b "assert" 40 (b "]" 36 (b "[" 34 (b "?" 33 N N) (b "\\" 35 N N)) (b "abstract" 38 (b "`" 37 N N) (b "all" 39 N N))) (b "if" 44 (b "else" 42 (b "disj" 41 N N) (b "enum" 43 N N)) (b "lone" 46 (b "in" 45 N N) (b "max" 47 N N)))) (b "sum" 56 (b "one" 52 (b "no" 50 (b "mux" 49 N N) (b "not" 51 N N)) (b "or" 54 (b "opt" 53 N N) (b "some" 55 N N))) (b "|" 60 (b "xor" 58 (b "then" 57 N N) (b "{" 59 N N)) (b "}" 62 (b "||" 61 N N) N))))
    where b s n = let bs = id s
                   in B bs (TS bs n)
 
@@ -159,7 +159,7 @@
 alexInputPrevChar :: AlexInput -> Char
 alexInputPrevChar (p, c, bs, s) = c
 
--- | Encode a Haskell String to a list of Word8 values, in UTF8 format.
+  -- | Encode a Haskell String to a list of Word8 values, in UTF8 format.
 utf8Encode :: Char -> [Word8]
 utf8Encode = map fromIntegral . go . ord
  where
diff --git a/src/Language/Clafer/Front/Parclafer.y b/src/Language/Clafer/Front/Parclafer.y
--- a/src/Language/Clafer/Front/Parclafer.y
+++ b/src/Language/Clafer/Front/Parclafer.y
@@ -9,6 +9,10 @@
 }
 
 %name pModule Module
+%name pClafer Clafer
+%name pConstraint Constraint
+%name pSoftConstraint SoftConstraint
+%name pGoal Goal
 
 -- no lexer declaration
 %monad { Err } { thenM } { returnM }
@@ -18,11 +22,11 @@
  '!' { PT _ (TS _ 1) }
  '!=' { PT _ (TS _ 2) }
  '#' { PT _ (TS _ 3) }
- '&' { PT _ (TS _ 4) }
- '&&' { PT _ (TS _ 5) }
- '(' { PT _ (TS _ 6) }
- ')' { PT _ (TS _ 7) }
- '*' { PT _ (TS _ 8) }
+ '&&' { PT _ (TS _ 4) }
+ '(' { PT _ (TS _ 5) }
+ ')' { PT _ (TS _ 6) }
+ '*' { PT _ (TS _ 7) }
+ '**' { PT _ (TS _ 8) }
  '+' { PT _ (TS _ 9) }
  '++' { PT _ (TS _ 10) }
  ',' { PT _ (TS _ 11) }
@@ -54,28 +58,29 @@
  '`' { PT _ (TS _ 37) }
  'abstract' { PT _ (TS _ 38) }
  'all' { PT _ (TS _ 39) }
- 'disj' { PT _ (TS _ 40) }
- 'else' { PT _ (TS _ 41) }
- 'enum' { PT _ (TS _ 42) }
- 'if' { PT _ (TS _ 43) }
- 'in' { PT _ (TS _ 44) }
- 'lone' { PT _ (TS _ 45) }
- 'max' { PT _ (TS _ 46) }
- 'min' { PT _ (TS _ 47) }
- 'mux' { PT _ (TS _ 48) }
- 'no' { PT _ (TS _ 49) }
- 'not' { PT _ (TS _ 50) }
- 'one' { PT _ (TS _ 51) }
- 'opt' { PT _ (TS _ 52) }
- 'or' { PT _ (TS _ 53) }
- 'some' { PT _ (TS _ 54) }
- 'sum' { PT _ (TS _ 55) }
- 'then' { PT _ (TS _ 56) }
- 'xor' { PT _ (TS _ 57) }
- '{' { PT _ (TS _ 58) }
- '|' { PT _ (TS _ 59) }
- '||' { PT _ (TS _ 60) }
- '}' { PT _ (TS _ 61) }
+ 'assert' { PT _ (TS _ 40) }
+ 'disj' { PT _ (TS _ 41) }
+ 'else' { PT _ (TS _ 42) }
+ 'enum' { PT _ (TS _ 43) }
+ 'if' { PT _ (TS _ 44) }
+ 'in' { PT _ (TS _ 45) }
+ 'lone' { PT _ (TS _ 46) }
+ 'max' { PT _ (TS _ 47) }
+ 'min' { PT _ (TS _ 48) }
+ 'mux' { PT _ (TS _ 49) }
+ 'no' { PT _ (TS _ 50) }
+ 'not' { PT _ (TS _ 51) }
+ 'one' { PT _ (TS _ 52) }
+ 'opt' { PT _ (TS _ 53) }
+ 'or' { PT _ (TS _ 54) }
+ 'some' { PT _ (TS _ 55) }
+ 'sum' { PT _ (TS _ 56) }
+ 'then' { PT _ (TS _ 57) }
+ 'xor' { PT _ (TS _ 58) }
+ '{' { PT _ (TS _ 59) }
+ '|' { PT _ (TS _ 60) }
+ '||' { PT _ (TS _ 61) }
+ '}' { PT _ (TS _ 62) }
 
 L_PosInteger { PT _ (T_PosInteger _) }
 L_PosDouble { PT _ (T_PosDouble _) }
@@ -101,7 +106,7 @@
 
 
 Clafer :: { Clafer }
-Clafer : Abstract GCard PosIdent Super Card Init Elements { Clafer ((mkCatSpan $1) >- (mkCatSpan $2) >- (mkCatSpan $3) >- (mkCatSpan $4) >- (mkCatSpan $5) >- (mkCatSpan $6) >- (mkCatSpan $7)) $1 $2 $3 $4 $5 $6 $7 } 
+Clafer : Abstract GCard PosIdent Super Reference Card Init Elements { Clafer ((mkCatSpan $1) >- (mkCatSpan $2) >- (mkCatSpan $3) >- (mkCatSpan $4) >- (mkCatSpan $5) >- (mkCatSpan $6) >- (mkCatSpan $7) >- (mkCatSpan $8)) $1 $2 $3 $4 $5 $6 $7 $8 } 
 
 
 Constraint :: { Constraint }
@@ -109,7 +114,7 @@
 
 
 SoftConstraint :: { SoftConstraint }
-SoftConstraint : '(' ListExp ')' { SoftConstraint ((mkTokenSpan $1) >- (mkCatSpan $2) >- (mkTokenSpan $3)) (reverse $2) } 
+SoftConstraint : 'assert' '[' ListExp ']' { SoftConstraint ((mkTokenSpan $1) >- (mkTokenSpan $2) >- (mkCatSpan $3) >- (mkTokenSpan $4)) (reverse $3) } 
 
 
 Goal :: { Goal }
@@ -136,13 +141,13 @@
 
 Super :: { Super }
 Super : {- empty -} { SuperEmpty noSpan } 
-  | SuperHow SetExp { SuperSome ((mkCatSpan $1) >- (mkCatSpan $2)) $1 $2 }
+  | ':' SetExp { SuperSome ((mkTokenSpan $1) >- (mkCatSpan $2)) $2 }
 
 
-SuperHow :: { SuperHow }
-SuperHow : ':' { SuperColon ((mkTokenSpan $1)) } 
-  | '->' { SuperArrow ((mkTokenSpan $1)) }
-  | '->>' { SuperMArrow ((mkTokenSpan $1)) }
+Reference :: { Reference }
+Reference : {- empty -} { ReferenceEmpty noSpan } 
+  | '->' SetExp { ReferenceSet ((mkTokenSpan $1) >- (mkCatSpan $2)) $2 }
+  | '->>' SetExp { ReferenceBag ((mkTokenSpan $1) >- (mkCatSpan $2)) $2 }
 
 
 Init :: { Init }
@@ -151,8 +156,8 @@
 
 
 InitHow :: { InitHow }
-InitHow : '=' { InitHow_1 ((mkTokenSpan $1)) } 
-  | ':=' { InitHow_2 ((mkTokenSpan $1)) }
+InitHow : '=' { InitConstant ((mkTokenSpan $1)) } 
+  | ':=' { InitDefault ((mkTokenSpan $1)) }
 
 
 GCard :: { GCard }
@@ -287,7 +292,7 @@
 
 
 SetExp2 :: { SetExp }
-SetExp2 : SetExp2 '&' SetExp3 { Intersection ((mkCatSpan $1) >- (mkTokenSpan $2) >- (mkCatSpan $3)) $1 $3 } 
+SetExp2 : SetExp2 '**' SetExp3 { Intersection ((mkCatSpan $1) >- (mkTokenSpan $2) >- (mkCatSpan $3)) $1 $3 } 
   | SetExp3 {  $1 }
 
 
diff --git a/src/Language/Clafer/Front/Printclafer.hs b/src/Language/Clafer/Front/Printclafer.hs
--- a/src/Language/Clafer/Front/Printclafer.hs
+++ b/src/Language/Clafer/Front/Printclafer.hs
@@ -3,9 +3,9 @@
 
 -- pretty-printer generated by the BNF converter
 
-import Prelude hiding (exp, init)
 import Language.Clafer.Front.Absclafer
 import Data.Char
+import Prelude hiding (exp, init)
 
 
 -- the top-level printing method
@@ -113,7 +113,7 @@
 
 instance Print Clafer where
   prt i e = case e of
-   Clafer _ abstract gcard posident super card init elements -> prPrec i 0 (concatD [prt 0 abstract , prt 0 gcard , prt 0 posident , prt 0 super , prt 0 card , prt 0 init , prt 0 elements])
+   Clafer _ abstract gcard posident super reference card init elements -> prPrec i 0 (concatD [prt 0 abstract , prt 0 gcard , prt 0 posident , prt 0 super , prt 0 reference , prt 0 card , prt 0 init , prt 0 elements])
 
 
 instance Print Constraint where
@@ -123,7 +123,7 @@
 
 instance Print SoftConstraint where
   prt i e = case e of
-   SoftConstraint _ exps -> prPrec i 0 (concatD [doc (showString "(") , prt 0 exps , doc (showString ")")])
+   SoftConstraint _ exps -> prPrec i 0 (concatD [doc (showString "assert") , doc (showString "[") , prt 0 exps , doc (showString "]")])
 
 
 instance Print Goal where
@@ -158,14 +158,14 @@
 instance Print Super where
   prt i e = case e of
    SuperEmpty _  -> prPrec i 0 (concatD [])
-   SuperSome _ superhow setexp -> prPrec i 0 (concatD [prt 0 superhow , prt 0 setexp])
+   SuperSome _ setexp -> prPrec i 0 (concatD [doc (showString ":") , prt 0 setexp])
 
 
-instance Print SuperHow where
+instance Print Reference where
   prt i e = case e of
-   SuperColon _  -> prPrec i 0 (concatD [doc (showString ":")])
-   SuperArrow _  -> prPrec i 0 (concatD [doc (showString "->")])
-   SuperMArrow _  -> prPrec i 0 (concatD [doc (showString "->>")])
+   ReferenceEmpty _  -> prPrec i 0 (concatD [])
+   ReferenceSet _ setexp -> prPrec i 0 (concatD [doc (showString "->") , prt 0 setexp])
+   ReferenceBag _ setexp -> prPrec i 0 (concatD [doc (showString "->>") , prt 0 setexp])
 
 
 instance Print Init where
@@ -176,8 +176,8 @@
 
 instance Print InitHow where
   prt i e = case e of
-   InitHow_1 _  -> prPrec i 0 (concatD [doc (showString "=")])
-   InitHow_2 _  -> prPrec i 0 (concatD [doc (showString ":=")])
+   InitConstant _  -> prPrec i 0 (concatD [doc (showString "=")])
+   InitDefault _  -> prPrec i 0 (concatD [doc (showString ":=")])
 
 
 instance Print GCard where
@@ -261,7 +261,7 @@
    Union _ setexp0 setexp -> prPrec i 0 (concatD [prt 0 setexp0 , doc (showString "++") , prt 1 setexp])
    UnionCom _ setexp0 setexp -> prPrec i 0 (concatD [prt 0 setexp0 , doc (showString ",") , prt 1 setexp])
    Difference _ setexp0 setexp -> prPrec i 1 (concatD [prt 1 setexp0 , doc (showString "--") , prt 2 setexp])
-   Intersection _ setexp0 setexp -> prPrec i 2 (concatD [prt 2 setexp0 , doc (showString "&") , prt 3 setexp])
+   Intersection _ setexp0 setexp -> prPrec i 2 (concatD [prt 2 setexp0 , doc (showString "**") , prt 3 setexp])
    Domain _ setexp0 setexp -> prPrec i 3 (concatD [prt 3 setexp0 , doc (showString "<:") , prt 4 setexp])
    Range _ setexp0 setexp -> prPrec i 4 (concatD [prt 4 setexp0 , doc (showString ":>") , prt 5 setexp])
    Join _ setexp0 setexp -> prPrec i 5 (concatD [prt 5 setexp0 , doc (showString ".") , prt 6 setexp])
diff --git a/src/Language/Clafer/Generator/Alloy.hs b/src/Language/Clafer/Generator/Alloy.hs
--- a/src/Language/Clafer/Generator/Alloy.hs
+++ b/src/Language/Clafer/Generator/Alloy.hs
@@ -23,6 +23,7 @@
 -- | Generates Alloy4.1 or 4.2 code for a Clafer model
 module Language.Clafer.Generator.Alloy where
 
+import Control.Applicative ((<$>))
 import Control.Lens hiding (elements, mapping)
 import Control.Monad.State
 import Data.List
@@ -31,88 +32,35 @@
 import Language.Clafer.Common
 import Language.Clafer.ClaferArgs
 import Language.Clafer.Front.Absclafer
+import Language.Clafer.Generator.Concat
 import Language.Clafer.Intermediate.Intclafer hiding (exp)
--- import qualified Language.Clafer.Intermediate.Intclafer as I (exp)
 
--- | representation of strings in chunks (for line/column numbering)
-data Concat = CString String | Concat {
-  srcPos :: IrTrace,
-  nodes  :: [Concat]
-  } deriving (Eq, Show)
-type Position = ((LineNo, ColNo), (LineNo, ColNo))
-
-data IrTrace =
-    IrPExp {pUid::String} |
-    LowerCard {pUid::String, isGroup::Bool} |
-    UpperCard {pUid::String, isGroup::Bool} |
-    ExactCard {pUid::String, isGroup::Bool} |
-    NoTrace
-    deriving (Eq, Show)
-
-mkConcat :: IrTrace -> String -> Concat
-mkConcat pos str = Concat pos [CString str]
-
-iscPrimitive :: Concat -> Bool
-iscPrimitive x = isPrimitive $ flatten x
-
-flatten :: Concat -> String
-flatten (CString x)      = x
-flatten (Concat _ nodes') = nodes' >>= flatten
-
-(+++) :: Concat -> Concat -> Concat
-(+++) (CString x)     (CString y)     = CString $ x ++ y
-(+++) (CString "")    y@Concat{}      = y
-(+++) x               y@(Concat src ys)
-    | src == NoTrace = Concat NoTrace $ x : ys
-    | otherwise      = Concat NoTrace $ [x, y]
-(+++) x@Concat{}      (CString "")     = x
-(+++) x@(Concat src xs)  y
-    | src == NoTrace = Concat NoTrace $ xs ++ [y]
-    | otherwise      = Concat NoTrace $ [x, y]
-  
-cconcat :: [Concat] -> Concat  
-cconcat = foldr (+++) (CString "")
-
-cintercalate :: Concat -> [Concat] -> Concat
-cintercalate xs xss = cconcat (intersperse xs xss)
-
-filterNull :: [Concat] -> [Concat]
-filterNull = filter (not.isNull)
-
-isNull :: Concat -> Bool
-isNull (CString "")  = True
-isNull (Concat _ []) = True
-isNull _ = False
-
-cunlines :: [Concat] -> Concat
-cunlines xs = cconcat $ map (+++ (CString "\n")) xs
-
 -- | Alloy code generation
--- 07th Mayo 2012 Rafael Olaechea 
+-- 07th Mayo 2012 Rafael Olaechea
 --      Added Logic to print a goal block in case there is at least one goal.
 genModule :: ClaferArgs -> (IModule, GEnv) -> [(UID, Integer)] -> (Result, [(Span, IrTrace)])
 genModule    claferargs    (imodule, _)       scopes           = (flatten output, filter ((/= NoTrace) . snd) $ mapLineCol output)
   where
-  output = header claferargs scopes +++ (cconcat $ map (genDeclaration claferargs) (_mDecls imodule)) +++ 
-       if ((not $ skip_goals claferargs) && length goals_list > 0) then 
-                CString "objectives o_global {\n" +++   (cintercalate (CString ",\n") goals_list) +++   CString "\n}" 
-       else  
-                CString "" 
-       where 
+  output = header claferargs scopes +++ (cconcat $ map (genDeclaration claferargs) (_mDecls imodule)) +++
+       if ((not $ skip_goals claferargs) && length goals_list > 0) then
+                CString "objectives o_global {\n" +++   (cintercalate (CString ",\n") goals_list) +++   CString "\n}"
+       else
+                CString ""
+       where
                 goals_list = filterNull (map (genDeclarationGoalsOnly claferargs) (_mDecls imodule))
 
 header :: ClaferArgs -> [(UID, Integer)] -> Concat
 header    args          scopes       = CString $ unlines
     [ "open util/integer"
     , "pred show {}"
-    , if (validate args) ||  (noalloyruncommand args)  
-      then "" 
+    , if (validate args) ||  (noalloyruncommand args)
+      then ""
       else "run show for 1" ++ genScopes scopes
     , ""]
     where
     genScopes [] = ""
     genScopes scopes' = " but " ++ intercalate ", " (map genScope scopes')
-    
+
 genScope :: (UID, Integer) -> String
 genScope    (uid', scope)       = show scope ++ " " ++ uid'
 
@@ -123,33 +71,34 @@
 genDeclarationGoalsOnly    claferargs    x         = case x of
   IEClafer _  -> CString ""
   IEConstraint _ _  -> CString ""
-  IEGoal _ (PExp _ _ _ innerexp) -> case innerexp of 
-        IFunExp op'  exps' ->  if  op' == iGMax || op' == iGMin then  
-                        mkMetric op' $ genPExp claferargs [] (head exps') 
-                else 
+  IEGoal _ (PExp _ _ _ innerexp) -> case innerexp of
+        IFunExp op'  exps' ->  if  op' == iGMax || op' == iGMin then
+                        mkMetric op' $ genPExp claferargs [] (head exps')
+                else
                         error "unary operator  distinct from (min/max) at the topmost level of a goal element"
         _ ->  error "no unary operator (min/max) at the topmost level of a goal element."
 
 -- 07th Mayo 2012 Rafael Olaechea
--- Removed goal from this function as they will now  all be collected into a single block.       
+-- Removed goal from this function as they will now  all be collected into a single block.
 genDeclaration :: ClaferArgs -> IElement -> Concat
 genDeclaration claferargs x = case x of
-  IEClafer clafer'  -> genClafer claferargs [] clafer'
+  IEClafer clafer'  -> (genClafer claferargs [] clafer') +++ (mkFact $ cconcat $ genSetUniquenessConstraint clafer')
   IEConstraint _ pexp  -> mkFact $ genPExp claferargs [] pexp
-  IEGoal _ (PExp _ _ _ innerexp) -> case innerexp of 
-        IFunExp op'  _ ->  if  op' == iGMax || op' == iGMin then  
+  IEGoal _ (PExp _ _ _ innerexp) -> case innerexp of
+        IFunExp op'  _ ->  if  op' == iGMax || op' == iGMin then
                        CString ""
-                else 
+                else
                         error "unary operator  distinct from (min/max) at the topmost level of a goal element"
         _ ->  error "no unary operator (min/max) at the topmost level of a goal element."
 
 mkFact :: Concat -> Concat
-mkFact  xs = cconcat [CString "fact ", mkSet xs, CString "\n"]
+mkFact x@(CString "") = x
+mkFact xs = cconcat [CString "fact ", mkSet xs, CString "\n"]
 
 mkMetric :: String -> Concat -> Concat
 mkMetric goalopname xs = cconcat [ if goalopname == iGMax then CString "maximize" else  CString "minimize", CString " ", xs, CString " "]
 
-mkSet :: Concat -> Concat                                               
+mkSet :: Concat -> Concat
 mkSet xs = cconcat [CString "{ ", xs, CString " }"]
 
 showSet :: Concat -> [Concat] -> Concat
@@ -165,13 +114,18 @@
 -- optimization: top level cardinalities
 -- optimization: if only boolean parents, then set card is known
 genClafer :: ClaferArgs -> [String] -> IClafer -> Concat
-genClafer claferargs resPath oClafer = (cunlines $ filterNull
-  [ cardFact +++ claferDecl clafer'
-        ((showSet (CString "\n, ") $ genRelations claferargs clafer') +++
-        (optShowSet $ filterNull $ genConstraints claferargs resPath clafer'))
-  ]) +++ CString "\n" +++ children'
+genClafer claferargs resPath clafer'
+  = (cunlines $ filterNull
+      [   cardFact
+      +++ claferDecl clafer' (
+          (showSet (CString "\n, ") $ genRelations claferargs clafer')
+          +++ (optShowSet $ filterNull $ genConstraints claferargs resPath clafer')
+        )
+      ]
+    )
+  +++ CString "\n"
+  +++ children'
   where
-  clafer' = transPrimitive oClafer
   children' = cconcat $ filterNull $ map
              (genClafer claferargs ((_uid clafer') : resPath)) $
              getSubclafers $ _elements clafer'
@@ -182,22 +136,17 @@
           c -> mkFact c
     | otherwise = CString ""
 
-transPrimitive :: IClafer -> IClafer
-transPrimitive = super %~ toOverlapping
-  where
-    toOverlapping x@(ISuper _ [PExp _ _ _ (IClaferId _ id' _)])
-      | isPrimitive id' = x{_isOverlapping = True}
-      | otherwise      = x
-    toOverlapping x = x
-
 claferDecl :: IClafer -> Concat -> Concat
-claferDecl    c     rest    = cconcat [genOptCard c,
-  CString $ genAbstract $ _isAbstract c, CString "sig ",
-  Concat NoTrace [CString $ _uid c, genExtends $ _super c, CString "\n", rest]]
+claferDecl    c     rest    = cconcat
+  [ genOptCard c
+  , CString $ genAbstract $ _isAbstract c
+  , CString "sig "
+  , Concat NoTrace [CString $ _uid c, genExtends $ _super c, CString "\n", rest]
+  ]
   where
   genAbstract isAbs = if isAbs then "abstract " else ""
-  genExtends (ISuper False [PExp _ _ _ (IClaferId _ "clafer" _)]) = CString ""
-  genExtends (ISuper False [PExp _ _ _ (IClaferId _ i _)]) = CString " " +++ Concat NoTrace [CString $ "extends " ++ i]
+  genExtends Nothing = CString ""
+  genExtends (Just (PExp _ _ _ (IClaferId _ i _ _))) = CString " " +++ Concat NoTrace [CString $ "extends " ++ i]
   -- todo: handle multiple inheritance
   genExtends _ = CString ""
 
@@ -207,8 +156,8 @@
   | otherwise                              = CString ""
   where
   glCard' = genIntervalCrude $ _glCard c
-    
 
+
 -- -----------------------------------------------------------------------------
 -- overlapping inheritance is a new clafer with val (unlike only relation)
 -- relations: overlapping inheritance (val rel), children
@@ -217,12 +166,12 @@
 genRelations :: ClaferArgs -> IClafer -> [Concat]
 genRelations claferargs c = maybeToList r ++ (map mkRel $ getSubclafers $ _elements c)
   where
-  r = if _isOverlapping $ _super c 
+  r = if isJust $ _reference c
                 then
                         Just $ Concat NoTrace [CString $ genRel (if (noalloyruncommand claferargs) then  (_uid c ++ "_ref") else "ref")
-                         c {_card = Just (1, 1)} $ 
-                         flatten $ refType claferargs c] 
-                else 
+                         c {_card = Just (1, 1)} $
+                         flatten $ refType claferargs c]
+                else
                         Nothing
   mkRel c' = Concat NoTrace [CString $ genRel (genRelName $ _uid c') c' $ _uid c']
 
@@ -238,7 +187,7 @@
 genAlloyRel name card' rType = concat [name, " : ", card', " ", rType]
 
 refType :: ClaferArgs -> IClafer -> Concat
-refType claferargs c = cintercalate (CString " + ") $ map ((genType claferargs).getTarget) $ _supers $ _super c
+refType claferargs c = fromMaybe (CString "") $ fmap ((genType claferargs).getTarget) $ _ref <$> _reference c
 
 
 getTarget :: PExp -> PExp
@@ -247,27 +196,51 @@
   _ -> x
 
 genType :: ClaferArgs -> PExp                              -> Concat
-genType    claferargs    x@(PExp _ _ _ y@(IClaferId _ _ _)) = genPExp claferargs []
+genType    claferargs    x@(PExp _ _ _ y@(IClaferId _ _ _ _)) = genPExp claferargs []
   x{_exp = y{_isTop = True}}
 genType m x = genPExp m [] x
 
 
 -- -----------------------------------------------------------------------------
 -- constraints
--- user constraints + parent + group constraints + reference
+-- parent + group constraints + reference + user constraints
 -- a = NUMBER do all x : a | x = NUMBER (otherwise alloy sums a set)
 genConstraints :: ClaferArgs -> [String]      -> IClafer -> [Concat]
-genConstraints    cargs    resPath c = (genParentConst resPath c) :
-  (genGroupConst c) : genPathConst cargs  (if (noalloyruncommand cargs) then  (_uid c ++ "_ref") else "ref") resPath c : constraints 
+genConstraints    cargs    resPath c
+  = (genParentConst resPath c)
+  : (genGroupConst c)
+  : genPathConst cargs  (if (noalloyruncommand cargs) then  (_uid c ++ "_ref") else "ref") resPath c
+  : constraints
   where
-  constraints = map genConst $ _elements c
+  constraints = concat $ map genConst $ _elements c
   genConst x = case x of
-    IEConstraint _ pexp  -> genPExp cargs ((_uid c) : resPath) pexp
+    IEConstraint _ pexp  -> [ genPExp cargs ((_uid c) : resPath) pexp ]
     IEClafer c' ->
-        if genCardCrude (_card c') `elem` ["one", "lone", "some"]
-        then CString "" else mkCard ({- do not use the genRelName as the constraint name -} _uid c') False (genRelName $ _uid c') $ fromJust (_card c')
+        (if genCardCrude (_card c') `elem` ["one", "lone", "some"]
+         then CString ""
+         else mkCard ({- do not use the genRelName as the constraint name -} _uid c') False (genRelName $ _uid c') $ fromJust (_card c')
+        ) : genSetUniquenessConstraint c'
     IEGoal _ _ -> error "getConst function from Alloy generator was given a Goal, this function should only be given a Constrain or Clafer" -- This should never happen
 
+
+genSetUniquenessConstraint :: IClafer -> [Concat]
+genSetUniquenessConstraint c =
+    (case _reference c of
+      Just (IReference True _) ->
+        (case _card c of
+            Just (lb,  ub) -> if (lb > 1 || ub > 1 || ub == -1)
+              then [ CString $ (
+                        (case isTopLevel c of
+                          False -> "all disj x, y : this.@" ++ (genRelName $ _uid c)
+                          True  -> " all disj x, y : "       ++ (_uid c)))
+                      ++ " | (x.@ref) != (y.@ref) "
+                   ]
+              else []
+            _ -> [])
+      _ -> []
+    )
+
+
 -- optimization: if only boolean features then the parent is unique
 genParentConst :: [String] -> IClafer -> Concat
 genParentConst [] _     = CString ""
@@ -306,21 +279,19 @@
 -- generates expression for references that point to expressions (not single clafers)
 genPathConst :: ClaferArgs -> String -> [String] -> IClafer -> Concat
 genPathConst    claferargs    name      resPath     c
-  | isRefPath c = cconcat [CString name, CString " = ",
-                                cintercalate (CString " + ") $
-                                map ((brArg id).(genPExp claferargs resPath)) $
-                                _supers $ _super c]
+  | isRefPath (c ^. reference) = cconcat [CString name, CString " = ",
+                                fromMaybe (error "genPathConst: impossible.") $
+                                fmap ((brArg id).(genPExp claferargs resPath)) $
+                                _ref <$> _reference c]
   | otherwise        = CString ""
 
-isRefPath :: IClafer -> Bool
-isRefPath c = (c ^. super . isOverlapping) &&
-                   ((length s > 1) || (not $ isSimplePath s))
-  where
-  s = _supers $ _super c
+isRefPath :: Maybe IReference -> Bool
+isRefPath    Nothing = False
+isRefPath    (Just IReference{_ref=s}) = not $ isSimplePath s
 
-isSimplePath :: [PExp] -> Bool
-isSimplePath    [PExp _ _ _ (IClaferId _ _ _)] = True
-isSimplePath    [PExp _ _ _ (IFunExp op' _)] = op' == iUnion
+isSimplePath :: PExp -> Bool
+isSimplePath    (PExp _ _ _ (IClaferId _ _ _ _)) = True
+isSimplePath    (PExp _ _ _ (IFunExp op' _)) = op'  == iUnion
 isSimplePath    _ = False
 
 -- -----------------------------------------------------------------------------
@@ -355,7 +326,9 @@
       (Nothing, Just c2) -> c2
       (Nothing, Nothing) -> undefined
     where
-    s1 = if n == 0 then Nothing else Just $ cardLowerConcat constraintName group' [CString $ concat [show n, " <= #",  element']]
+    s1 = if n == 0
+         then Nothing
+         else Just $ cardLowerConcat constraintName group' [CString $ concat [show n, " <= #",  element']]
     s2 =
         do
             result <- genExInteger element' x exinteger
@@ -395,8 +368,8 @@
     where
     optBar [] = ""
     optBar _  = " | "
-  IClaferId _ "ref" _ -> CString "@ref"
-  IClaferId _ sid istop -> CString $
+  IClaferId _ "ref" _ _ -> CString "@ref"
+  IClaferId _ sid istop _ -> CString $
       if head sid == '~' then sid else
       if isNothing iType' then sid' else case fromJust $ iType' of
     TInteger -> vsident
@@ -406,7 +379,7 @@
     where
     sid' = (if istop then "" else '@' : genRelName "") ++ sid
     -- 29/March/2012  Rafael Olaechea: ref is now prepended with clafer name to be able to refer to it from partial instances.
-    -- 30/March/2012 Rafael Olaechea added referredClaferUniqeuid to fix problems when having this.x > number  (e.g test/positive/i10.cfr )     
+    -- 30/March/2012 Rafael Olaechea added referredClaferUniqeuid to fix problems when having this.x > number  (e.g test/positive/i10.cfr )
     vsident = if (noalloyruncommand claferargs) then sid' ++  ".@"  ++ referredClaferUniqeuid ++ "_ref"  else  sid'  ++ ".@ref"
         where referredClaferUniqeuid = if sid == "this" then (head resPath) else sid
   IFunExp _ _ -> case exp'' of
@@ -429,16 +402,16 @@
 transformExp    x@(IFunExp op' exps'@(e1:e2:_))
   | op' == iXor = IFunExp iNot [PExp (Just TBoolean) "" noSpan (IFunExp iIff exps')]
   | op' == iJoin && isClaferName' e1 && isClaferName' e2 &&
-    getClaferName e1 == this && head (getClaferName e2) == '~' =
+    getClaferName e1 == thisIdent && head (getClaferName e2) == '~' =
         IFunExp op' [e1{_iType = Just $ TClafer []}, e2]
   | otherwise  = x
 transformExp x = x
 
 genIFunExp :: String -> ClaferArgs -> [String] -> IExp             -> Concat
-genIFunExp    pid'       claferargs    resPath     (IFunExp op' exps') = 
-  if (op' == iSumSet) 
-    then genIFunExp pid' claferargs resPath (IFunExp iSumSet' [(removeright (head exps')), (getRight $ head exps')]) 
-    else if (op' == iSumSet') 
+genIFunExp    pid'       claferargs    resPath     (IFunExp op' exps') =
+  if (op' == iSumSet)
+    then genIFunExp pid' claferargs resPath (IFunExp iSumSet' [(removeright (head exps')), (getRight $ head exps')])
+    else if (op' == iSumSet')
       then Concat (IrPExp pid') $ intl exps'' (map CString $ genOp (Alloy42 `elem` (mode claferargs)) iSumSet)
       else Concat (IrPExp pid') $ intl exps'' (map CString $ genOp (Alloy42 `elem` (mode claferargs)) op')
   where
@@ -454,17 +427,17 @@
 optBrArg    claferargs    resPath     x     = brFun (genPExp' claferargs resPath) x
   where
   brFun = case x of
-    PExp _ _ _ (IClaferId _ _ _) -> ($)
+    PExp _ _ _ (IClaferId _ _ _ _) -> ($)
     PExp _ _ _ (IInt _) -> ($)
     _  -> brArg
-    
+
 interleave :: [Concat] -> [Concat] -> [Concat]
 interleave [] [] = []
 interleave (x:xs) [] = x:xs
 interleave [] (x:xs) = x:xs
 interleave (x:xs) ys = x : interleave ys xs
 
-brArg :: (a -> Concat) -> a -> Concat 
+brArg :: (a -> Concat) -> a -> Concat
 brArg f arg = cconcat [CString "(", f arg, CString ")"]
 
 --     isAlloy42
@@ -494,19 +467,19 @@
 adjustPExp :: [String] -> PExp -> PExp
 adjustPExp resPath (PExp t pid' pos x) = PExp t pid' pos $ adjustIExp resPath x
 
-adjustIExp :: [String] -> IExp -> IExp 
+adjustIExp :: [String] -> IExp -> IExp
 adjustIExp resPath x = case x of
   IDeclPExp q d pexp -> IDeclPExp q d $ adjustPExp resPath pexp
   IFunExp op' exps' -> adjNav $ IFunExp op' $ map adjExps exps'
     where
     (adjNav, adjExps) = if op' == iJoin then (aNav, id)
                         else (id, adjustPExp resPath)
-  IClaferId _ _ _ -> aNav x
+  IClaferId _ _ _ _ -> aNav x
   _  -> x
   where
   aNav = fst.(adjustNav resPath)
 
-adjustNav :: [String] -> IExp -> (IExp, [String]) 
+adjustNav :: [String] -> IExp -> (IExp, [String])
 adjustNav resPath x@(IFunExp op' (pexp0:pexp:_))
   | op' == iJoin = (IFunExp iJoin
                    [pexp0{_exp = iexp0},
@@ -515,8 +488,8 @@
   where
   (iexp0, path) = adjustNav resPath (_exp pexp0)
   (iexp, path') = adjustNav path    (_exp pexp)
-adjustNav resPath x@(IClaferId _ id' _)
-  | id' == parent = (x{_sident = "~@" ++ (genRelName $ head resPath)}, tail resPath)
+adjustNav resPath x@(IClaferId _ id' _ _)
+  | id' == parentIdent = (x{_sident = "~@" ++ (genRelName $ head resPath)}, tail resPath)
   | otherwise    = (x, resPath)
 adjustNav _ _ = error "Function adjustNav Expect a IFunExp or IClaferID as one of it's argument but it was given a differnt IExp" --This should never happen
 
@@ -550,7 +523,7 @@
 mapLineCol :: Concat -> [(Span, IrTrace)]
 mapLineCol code = mapping $ execState (mapLineCol' code) (AlloyEnv (firstLine, firstCol) [])
 
-addCode :: MonadState AlloyEnv m => String -> m () 
+addCode :: MonadState AlloyEnv m => String -> m ()
 addCode str = modify (\s -> s {lineCol = lineno (lineCol s) str})
 
 mapLineCol' :: MonadState AlloyEnv m => Concat -> m ()
@@ -571,7 +544,7 @@
    -    (((#((this.@r_c2_Finger).@r_c3_Pinky)).add[(#((this.@r_c2_Finger).@r_c4_Index))]).add[(#((this.@r_c2_Finger).@r_c5_Middle))]) = 0
    - But the actual constraint in the API is
    -    #((this.@r_c2_Finger).@r_c3_Pinky)).add[(#((this.@r_c2_Finger).@r_c4_Index))]).add[(#((this.@r_c2_Finger).@r_c5_Middle))]) = 0
-   - 
+   -
    - Seems unintuitive since the brackets are now unbalanced but that's how they work in Alloy. The next
    - few lines of code is counting the beginning and ending parenthesis's and subtracting them from the
    - positions in the map file.
@@ -603,7 +576,7 @@
 firstLine = 1 :: LineNo
 
 removeright :: PExp -> PExp
-removeright (PExp _ _ _ (IFunExp _ (x : (PExp _ _ _ (IClaferId _ _ _)) : _))) = x
+removeright (PExp _ _ _ (IFunExp _ (x : (PExp _ _ _ (IClaferId _ _ _ _)) : _))) = x
 removeright (PExp t id' pos (IFunExp o (x1:x2:xs))) = (PExp t id' pos (IFunExp o (x1:(removeright x2):xs)))
 removeright (PExp _ _ _ _) = error "Function removeright from the AlloyGenerator expects a PExp with a IFunExp inside, was given something else" --This should never happen
 
diff --git a/src/Language/Clafer/Generator/Choco.hs b/src/Language/Clafer/Generator/Choco.hs
--- a/src/Language/Clafer/Generator/Choco.hs
+++ b/src/Language/Clafer/Generator/Choco.hs
@@ -30,8 +30,8 @@
     ++ (genGoal =<< _mDecls)
     where
     root :: IClafer
-    root = IClafer noSpan False Nothing "root" "root" (ISuper False [PExp Nothing "" noSpan $ IClaferId "clafer" "clafer" True]) (Just (1, 1)) (0, 0) _mDecls
-    
+    root = IClafer noSpan False Nothing rootIdent rootIdent "" Nothing Nothing (Just (1, 1)) (0, 0) _mDecls
+
     toplevelClafers = mapMaybe iclafer _mDecls
     -- The sort is so that we encounter sub clafers before super clafers when abstract clafers extend other abstract clafers
     abstractClafers = sortBy (comparing $ length . supersOf . _uid) $ filter _isAbstract toplevelClafers
@@ -39,183 +39,112 @@
     clafers = snd <$> parentChildMap
     claferUids = _uid <$> clafers
     concreteClafers = filter isNotAbstract clafers
---    minusRoot = filter ((/= "root") . uid)
-    
+
     claferWithUid u = fromMaybe (error $ "claferWithUid: \"" ++ u ++ "\" is not a clafer") $ find ((== u) . _uid) clafers
-    
-    prims = ["int", "integer", "string", "real"]
-    
+
     -- All abstract clafers u inherits
     supersOf :: String -> [String]
     supersOf u =
         case superOf u of
              Just su -> su : supersOf su
              Nothing -> []
-        
---    superHierarchyOf u = u : supersOf u
-            
+
     superOf u =
         case _super $ claferWithUid u of
-            ISuper False [PExp{_exp = IClaferId{_sident}}]
-                | _sident == "clafer"  -> Nothing
-                | _sident `elem` prims -> Nothing
-                | otherwise           -> Just _sident
+            Just (PExp{_exp = IClaferId{_sident}})
+                | _sident == baseClafer -> Nothing
+                | isPrimitive _sident   -> Nothing
+                | otherwise             -> Just _sident
             _ -> Nothing
 
-{-    superWithRef u =
-        case mapMaybe refOf $ supersOf u of
-             r : _ -> r
-             _      -> u ++ " does not inherit a ref" -}
-            
-    refOf u =
-        case _super $ claferWithUid u of
-            ISuper True [PExp{_exp = IClaferId{_sident}}] -> Just _sident
-            ISuper False [PExp{_exp = IClaferId{_sident}}]
-                | _sident == "int"     -> Just "integer"
-                | _sident `elem` prims -> Just _sident
+{-    refOf u =
+        case _reference $ claferWithUid u of
+            Just (IReference{_ref=PExp{_exp = IClaferId{_sident}}})
+                | _sident == "int"    -> Just "integer"
+                | isPrimitive _sident -> Just _sident
                 | otherwise           -> Nothing
             _ -> Nothing
-            
-    -- All clafers that inherit u
-{-    subOf :: String -> [String]
-    subOf u = [uid | IClafer{_uid} <- clafers, Just u == superOf uid]
-    subClaferOf :: String -> [IClafer]
-    subClaferOf = map claferWithUid . subOf
-    
-    subOffsets :: [(String, String, Integer)]
-    subOffsets = [(uid, sub, off) | IClafer{_uid} <- clafers, let subs = subOf uid, (sub, off) <- zip subs $ offsets subs]
-    
-    subOffsetOf :: String -> Integer
-    subOffsetOf sub = trd3 $ fromMaybe (error $ "subOffsetOf: " ++ sub) $ find ((== sub) . snd3) subOffsets
-    
-    offsets :: [String] -> [Integer]
-    offsets = scanl (flip $ (+) . scopeOf) 0
--}        
-
+-}
     parentOf u = fst $ fromMaybe (error $ "parentOf: \"" ++ u ++ "\" is not a clafer") $ find ((== u) . _uid . snd) parentChildMap
-{-    parentClaferOf = claferWithUid . parentOf
-    -- Direct childrens
-    childrenOf = map uid . childrenClaferOf
-    childrenClaferOf u = [c | (p, c) <- parentChildMap, p == u] 
-    
-    -- Indirect childrens
-    indirectChildrenOf u = childrenOf =<< supersOf u
-    indirectChildrenClaferOf u = childrenClaferOf =<< supersOf u  
-    
-    isBounded :: Interval -> Bool
-    isBounded (0, -1) = False
-    isBounded _       = True
--}    
+
     genCard :: Interval -> Maybe String
     genCard (0, -1) = Nothing
     genCard (low, -1) = return $ show low
     genCard (low, high) = return $ show low ++ ", " ++ show high
-    
-    
+
+
     genScopes :: Result
     genScopes =
         (if null scopeMap then "" else "scope({" ++ intercalate ", " scopeMap ++ "});\n")
         ++ "defaultScope(1);\n"
-        ++ "intRange(-" ++ show (2 ^ (bitwidth - 1)) ++ ", " ++ show (2 ^ (bitwidth - 1) - 1) ++ ");\n"
+        ++ "intRange(-" ++ show largestPositiveInt ++ ", " ++ show (largestPositiveInt - 1) ++ ");\n"
         ++ "stringLength(" ++ show longestString ++ ");\n"
         where
+            largestPositiveInt :: Integer
+            largestPositiveInt = 2 ^ (bitwidth - 1)
             scopeMap = [uid' ++ ":" ++ show scope | (uid', scope) <- scopes, uid' /= "int"]
-
-    exps' :: [IExp]
-    exps' = universeOn biplate imodule
+    exprs :: [IExp]
+    exprs = universeOn biplate imodule
 
     stringLength :: IExp -> Maybe Int
     stringLength (IStr string) = Just $ length string
     stringLength _ = Nothing
 
     longestString :: Int
-    longestString = maximum $ 16 : mapMaybe stringLength exps'
-                
+    longestString = maximum $ 16 : mapMaybe stringLength exprs
+
     genConcreteClafer :: IClafer -> Result
     genConcreteClafer IClafer{_uid, _card = Just _card, _gcard = Just (IGCard _ _gcard)} =
             _uid ++ " = " ++ constructor ++ "(\"" ++ _uid ++ "\")" ++ prop "withCard" (genCard _card) ++ prop "withGroupCard" (genCard _gcard) ++ prop "extending" (superOf _uid) ++ ";\n"
         where
-            constructor = 
+            constructor =
                 case parentOf _uid of
                      "root" -> "Clafer"
                      puid   -> puid ++ ".addChild"
-    genConcreteClafer (IClafer _ _ Nothing _ _ _ _ _ _) = error "Choco.getConcreteClafer undefined"
-    genConcreteClafer (IClafer _ _ (Just (IGCard _ _)) _ _ _ Nothing _ _) = error "Choco.getConcreteClafer undefined"
+    genConcreteClafer (IClafer _ _ Nothing _ _ _ _ _ _ _ _) = error "Choco.getConcreteClafer undefined"
+    genConcreteClafer (IClafer _ _ (Just (IGCard _ _)) _ _ _ _ _ Nothing _ _) = error "Choco.getConcreteClafer undefined"
 
     prop name value =
         case value of
                 Just value' -> "." ++ name ++ "(" ++ value' ++ ")"
                 Nothing     -> ""
-                
-                
+
+
     genRefClafer :: IClafer -> Result
-    genRefClafer IClafer{_uid} =
-        case (refOf _uid, _uid `elem` uniqueRefs) of
-             (Just target, True)  -> _uid ++ ".refToUnique(" ++ genTarget target ++ ");\n"
-             (Just target, False) -> _uid ++ ".refTo(" ++ genTarget target ++ ");\n"
-             _                    -> ""
+    genRefClafer c@IClafer{_uid, _reference, _card} =
+        case (getReference c, _reference, _card) of
+             ([target], Just (IReference True _), Just (lb, ub))  -> if (lb > 1 || ub > 1 || lb == -1 || ub == -1)
+                then _uid ++ ".refToUnique(" ++ genTarget target ++ ");\n"
+                else _uid ++ ".refTo(" ++ genTarget target ++ ");\n"
+             ([target], Just (IReference _ _), _) -> _uid ++ ".refTo(" ++ genTarget target ++ ");\n"
+             _ -> ""
         where
             genTarget "integer" = "Int"
+            genTarget "int" = "Int"
             genTarget target = target
-        
+
     genAbstractClafer :: IClafer -> Result
     genAbstractClafer IClafer{_uid, _card = Just _} =
-        _uid ++ " = Abstract(\"" ++ _uid ++ "\")" ++ prop "extending" (superOf _uid) ++ ";\n"  
+        _uid ++ " = Abstract(\"" ++ _uid ++ "\")" ++ prop "extending" (superOf _uid) ++ ";\n"
     genAbstractClafer IClafer{_uid, _card = Nothing} =
-        _uid ++ " = Abstract(\"" ++ _uid ++ "\")" ++ prop "extending" (superOf _uid) ++ ";\n" 
+        _uid ++ " = Abstract(\"" ++ _uid ++ "\")" ++ prop "extending" (superOf _uid) ++ ";\n"
 
-    -- Is a uniqueness constraint? If so, return the name of unique clafer
-    isUniqueConstraint :: IExp -> Maybe String
-    isUniqueConstraint (IDeclPExp IAll [IDecl True [x, y] PExp{_exp = IClaferId{_sident}}]
-        PExp{_exp = IFunExp "!=" [
-            PExp{_exp = IFunExp "." [PExp{_exp = IClaferId{_sident = xident}}, PExp{_exp = IClaferId{_sident = "ref"}}]},
-            PExp{_exp = IFunExp "." [PExp{_exp = IClaferId{_sident = yident}}, PExp{_exp = IClaferId{_sident = "ref"}}]}]})
-                | x == xident && y == yident = return _sident
-                | otherwise                  = mzero
-    isUniqueConstraint  (IDeclPExp IAll [IDecl True [x, y] PExp{_exp = IFunExp "." [PExp{_exp = IClaferId{_sident = "this"}}, PExp{_exp = IClaferId{_sident}}]}]
-        PExp{_exp = IFunExp "!=" [
-            PExp{_exp = IFunExp "." [PExp{_exp = IClaferId{_sident = xident}}, PExp{_exp = IClaferId{_sident = "ref"}}]},
-            PExp{_exp = IFunExp "." [PExp{_exp = IClaferId{_sident = yident}}, PExp{_exp = IClaferId{_sident = "ref"}}]}]})
-                | x == xident && y == yident = return _sident
-                | otherwise                  = mzero
-    isUniqueConstraint _ = mzero
-    
-    uniqueRefs :: [String]
-    uniqueRefs = mapMaybe isUniqueConstraint $ map _exp $ mapMaybe iconstraint $ _mDecls ++ (clafers >>= _elements)
-    
+
     genTopConstraint :: IElement -> Result
-    genTopConstraint (IEConstraint _ pexp)
-        | isNothing $ isUniqueConstraint $ _exp pexp = "Constraint(" ++ genConstraintPExp pexp ++ ");\n"
-        | otherwise                                 = ""
+    genTopConstraint (IEConstraint _ pexp) = "Constraint(" ++ genConstraintPExp pexp ++ ");\n"
     genTopConstraint _ = ""
-    
+
     genConstraint :: IClafer -> Result
     genConstraint IClafer{_uid, _elements} =
         unlines [_uid ++ ".addConstraint(" ++ genConstraintPExp c ++ ");"
-            | c <- filter (isNothing . isUniqueConstraint . _exp) $ mapMaybe iconstraint _elements]
-            
+            | c <- mapMaybe iconstraint _elements]
+
     genGoal :: IElement -> Result
     genGoal (IEGoal _ PExp{_exp = IFunExp{_op="max", _exps=[expr]}})  = "max(" ++ genConstraintPExp expr ++ ");\n"
     genGoal (IEGoal _ PExp{_exp = IFunExp{_op="min", _exps=[expr]}})  = "min(" ++ genConstraintPExp expr ++ ");\n"
     genGoal (IEGoal _ _) = error $ "Unknown objective"
     genGoal _ = ""
-            
-{-    nameOfType TInteger = "integer"
-    nameOfType (TClafer [t]) = t
-    
-    namesOfType TInteger = ["integer"]
-    namesOfType (TClafer ts) = ts
 
-    getCard uid =
-        case card $ claferWithUid uid of
-                Just (low, -1)   -> (low, scope)
-                Just (low, high) -> (low, high)
-        where
-            scope = scopeOf uid
-    
-    (l1, h1) <*> (l2, h2) = (l1 * l2, h1 * h2)
-    scopeCap scope (l, h) = (min scope l, min scope h)
--}    
     rewrite :: PExp -> PExp
     -- Rearrange right joins to left joins.
     rewrite p1@PExp{_iType = Just _, _exp = IFunExp "." [p2, p3@PExp{_exp = IFunExp "." _}]} =
@@ -227,10 +156,10 @@
         -- in the backend will treat the pre-rewritten expression the same.
         p1{_exp = IInt (-i)}
     rewrite p = p
-    
+
     genConstraintPExp :: PExp -> String
     genConstraintPExp = genConstraintExp . _exp . rewrite
-            
+
     genConstraintExp :: IExp -> String
     genConstraintExp (IDeclPExp quant' [] body') =
         mapQuant quant' ++ "(" ++ genConstraintPExp body' ++ ")"
@@ -239,9 +168,9 @@
         where
             genDecl (IDecl isDisj' locals body'') =
                 (if isDisj' then "disjDecl" else "decl") ++ "([" ++ intercalate ", " (map genLocal locals) ++ "], " ++ genConstraintPExp body'' ++ ")"
-            genLocal local = 
+            genLocal local =
                 local ++ " = local(\"" ++ local ++ "\")"
-             
+
     genConstraintExp (IFunExp "." [e1, PExp{_exp = IClaferId{_sident = "ref"}}]) =
         "joinRef(" ++ genConstraintPExp e1 ++ ")"
     genConstraintExp (IFunExp "." [e1, PExp{_exp = IClaferId{_sident = "parent"}}]) =
@@ -271,13 +200,13 @@
     genConstraintExp (IInt val) = "constant(" ++ show val ++ ")"
     genConstraintExp (IStr val) = "constant(" ++ show val ++ ")"
     genConstraintExp (IDouble val) = "constant(" ++ show val ++ ")"
-                
+
     mapQuant INo = "none"
     mapQuant ISome = "some"
     mapQuant IAll = "all"
     mapQuant IOne = "one"
     mapQuant ILone = "lone"
-                
+
     mapFunc "!" = "not"
     mapFunc "#" = "card"
     mapFunc "<=>" = "ifOnlyIf"
@@ -298,16 +227,16 @@
     mapFunc "/" = "div"
     mapFunc "++" = "union"
     mapFunc "--" = "diff"
-    mapFunc "&" = "inter"
-    mapFunc "=>else" = "ifThenElse"
+    mapFunc "**" = "inter"
+    mapFunc "ifthenelse" = "ifThenElse"
     mapFunc op' = error $ "Choco: Unknown op: " ++ op'
-    
+
 {-    sidentOf u = ident $ claferWithUid u
     scopeOf "integer" = undefined
     scopeOf "int" = undefined
     scopeOf i = fromMaybe 1 $ lookup i scopes -}
     bitwidth = fromMaybe 4 $ lookup "int" scopes :: Integer
-    
+
 -- isQuant PExp{_exp = IDeclPExp{}} = True
 -- isQuant _ = False
 
diff --git a/src/Language/Clafer/Generator/Concat.hs b/src/Language/Clafer/Generator/Concat.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Clafer/Generator/Concat.hs
@@ -0,0 +1,84 @@
+{-
+ Copyright (C) 2012-2013 Kacper Bak <http://gsd.uwaterloo.ca>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+-}
+module Language.Clafer.Generator.Concat where
+
+import Data.List
+import Language.Clafer.Common
+import Language.Clafer.Intermediate.Intclafer hiding (exp)
+
+-- | representation of strings in chunks (for line/column numbering)
+data Concat = CString String | Concat {
+  srcPos :: IrTrace,
+  nodes  :: [Concat]
+  } deriving (Eq, Show)
+type Position = ((LineNo, ColNo), (LineNo, ColNo))
+
+data IrTrace =
+    IrPExp {pUid::String} |
+    LowerCard {pUid::String, isGroup::Bool} |
+    UpperCard {pUid::String, isGroup::Bool} |
+    ExactCard {pUid::String, isGroup::Bool} |
+    NoTrace
+    deriving (Eq, Show)
+
+mkConcat :: IrTrace -> String -> Concat
+mkConcat pos str = Concat pos [CString str]
+
+mapToCStr :: [String] -> [Concat]
+mapToCStr xs = map CString xs
+
+iscPrimitive :: Concat -> Bool
+iscPrimitive x = isPrimitive $ flatten x
+
+flatten :: Concat -> String
+flatten (CString x)      = x
+flatten (Concat _ nodes') = nodes' >>= flatten
+
+infixr 5 +++
+(+++) :: Concat -> Concat -> Concat
+(+++) (CString x)     (CString y)     = CString $ x ++ y
+(+++) (CString "")    y@Concat{}      = y
+(+++) x               y@(Concat src ys)
+    | src == NoTrace = Concat NoTrace $ x : ys
+    | otherwise      = Concat NoTrace $ [x, y]
+(+++) x@Concat{}      (CString "")     = x
+(+++) x@(Concat src xs)  y
+    | src == NoTrace = Concat NoTrace $ xs ++ [y]
+    | otherwise      = Concat NoTrace $ [x, y]
+
+cconcat :: [Concat] -> Concat
+cconcat = foldr (+++) (CString "")
+
+cintercalate :: Concat -> [Concat] -> Concat
+cintercalate xs xss = cconcat (intersperse xs xss)
+
+filterNull :: [Concat] -> [Concat]
+filterNull = filter (not.isNull)
+
+isNull :: Concat -> Bool
+isNull (CString "")  = True
+isNull (Concat _ []) = True
+isNull _ = False
+
+cunlines :: [Concat] -> Concat
+cunlines xs = cconcat $ map (+++ (CString "\n")) xs
+
diff --git a/src/Language/Clafer/Generator/Graph.hs b/src/Language/Clafer/Generator/Graph.hs
--- a/src/Language/Clafer/Generator/Graph.hs
+++ b/src/Language/Clafer/Generator/Graph.hs
@@ -27,6 +27,7 @@
 import Language.Clafer.Intermediate.Tracing
 import Language.Clafer.Intermediate.Intclafer
 import Language.Clafer.Generator.Html(genTooltip)
+import Control.Applicative ((<$>))
 import qualified Data.Map as Map
 import Data.Maybe
 import Prelude hiding (exp)
@@ -37,12 +38,12 @@
                            where b = graphSimpleModule m (traceIrModule ir) showRefs
 
 -- | Generate a graph in CVL variability abstraction notation
-genCVLGraph :: Module -> IModule -> String -> String                          
+genCVLGraph :: Module -> IModule -> String -> String
 genCVLGraph m ir name = cleanOutput $ "digraph \"" ++ name ++ "\"\n{\nrankdir=BT;\nranksep=0.1;\nnodesep=0.1;\nnode [shape=box margin=\"0.025,0.025\"];\nedge [arrowhead=none];\n" ++ b ++ "}"
                        where b = graphCVLModule m $ traceIrModule ir
 
 -- Simplified Notation Printer --
---toplevel: (Top_level (Boolean), Maybe Topmost parent, Maybe immediate parent)         
+--toplevel: (Top_level (Boolean), Maybe Topmost parent, Maybe immediate parent)
 graphSimpleModule :: Module -> Map.Map Span [Ir] -> Bool -> String
 graphSimpleModule (Module _ [])                _     _        = ""
 graphSimpleModule (Module s (x:xs))            irMap showRefs = graphSimpleDeclaration x (True, Nothing, Nothing) irMap showRefs ++ graphSimpleModule (Module s xs) irMap showRefs
@@ -76,36 +77,122 @@
                       -> (Bool, Maybe String, Maybe String)
                       -> Map.Map Span [Ir]
                       -> Bool
-                      -> String 
-graphSimpleClafer (Clafer s abstract gCard id' super' crd init' es) topLevel irMap showRefs
-  | fst3 topLevel == True = let {tooltip = genTooltip (Module s [ElementDecl s (Subclafer s (Clafer s abstract gCard id' super' crd init' es))]) irMap;
-                               uid' = getDivId s irMap} in
-                             "\"" ++ uid' ++ "\" [label=\"" ++ (head $ lines tooltip) ++ "\" URL=\"#" ++ uid' ++ "\" tooltip=\"" ++ htmlNewlines tooltip ++ "\"];\n"
-                             ++ graphSimpleSuper super' (True, Just uid', Just uid') irMap showRefs ++ graphSimpleElements es (False, Just uid', Just uid') irMap showRefs
-  | otherwise             = let (PosIdent (_,ident')) = id' in
-                             graphSimpleSuper super' (fst3 topLevel, snd3 topLevel, Just ident') irMap showRefs ++ graphSimpleElements es (fst3 topLevel, snd3 topLevel, Just ident') irMap showRefs
+                      -> String
+-- top-level abstract and concrete
+graphSimpleClafer (Clafer s abstract gCard id' super' reference' crd init' es) (True, _, _) irMap showRefs =
+  let
+    tooltip = genTooltip (Module s [ElementDecl s (Subclafer s (Clafer s abstract gCard id' super' reference' crd init' es))]) irMap
+    uid' = getDivId s irMap
+  in
+     "\"" ++
+      uid' ++
+      "\" [label=\"" ++
+      (head $ lines tooltip) ++
+      "\" URL=\"#" ++
+      uid' ++
+      "\" tooltip=\"" ++
+      htmlChars tooltip ++
+      "\"];\n" ++
+      graphSimpleSuper super' (True, Just uid', Just uid') irMap showRefs ++
+      graphSimpleReference reference' (True, Just uid', Just uid') irMap showRefs ++
+      graphSimpleElements es (False, Just uid', Just uid') irMap showRefs
+-- nested abstract
+graphSimpleClafer (Clafer s abstract@(Abstract _) gCard id' super' reference' crd init' es) (False, _, _) irMap showRefs =
+  let
+    tooltip = genTooltip (Module s [ElementDecl s (Subclafer s (Clafer s abstract gCard id' super' reference' crd init' es))]) irMap
+    uid' = getDivId s irMap
+  in
+     "\"" ++
+      uid' ++
+      "\" [label=\"" ++
+      (head $ lines tooltip) ++
+      "\" URL=\"#" ++
+      uid' ++
+      "\" tooltip=\"" ++
+      htmlChars tooltip ++
+      "\"];\n" ++
+      graphSimpleSuper super' (False, Just uid', Just uid') irMap showRefs ++
+      graphSimpleReference reference' (False, Just uid', Just uid') irMap showRefs ++
+      graphSimpleElements es (False, Just uid', Just uid') irMap showRefs
+-- nested concrete
+graphSimpleClafer (Clafer _ _ _ id' super' reference' _ _ es) topLevel irMap showRefs =
+  let
+    (PosIdent (_,ident')) = id'
+  in
+    graphSimpleSuper super' (fst3 topLevel, snd3 topLevel, Just ident') irMap showRefs ++
+    graphSimpleReference reference' (fst3 topLevel, snd3 topLevel, Just ident') irMap showRefs ++
+    graphSimpleElements es (fst3 topLevel, snd3 topLevel, Just ident') irMap showRefs
 
 graphSimpleSuper :: Super
                   -> (Bool, Maybe String, Maybe String)
                   -> Map.Map Span [Ir]
                   -> Bool
                   -> String
-graphSimpleSuper (SuperEmpty _) _ _ _ = ""
-graphSimpleSuper (SuperSome _ superHow setExp) topLevel irMap showRefs = let {parent [] = "error";
-                                                            parent (uid'@('c':xs):xss) = if '_' `elem` xs then uid' else parent xss;
-                                                            parent (_:xss) = parent xss;
-                                                            super' = parent $ graphSimpleSetExp setExp topLevel irMap} in
-                                                            if super' == "error" then "" else "\"" ++ fromJust (snd3 topLevel) ++ "\" -> \"" ++ parent (graphSimpleSetExp setExp topLevel irMap) ++ "\"" ++ graphSimpleSuperHow superHow topLevel irMap showRefs
 
-graphSimpleSuperHow :: SuperHow -> (Bool, Maybe String, Maybe String) -> Map.Map Span [Ir] -> Bool -> String
-graphSimpleSuperHow (SuperColon _) topLevel _ _ = " [" ++ if fst3 topLevel == True 
-                                                                 then "arrowhead=onormal constraint=true weight=100];\n" 
-                                                                 else "arrowhead=vee arrowtail=diamond dir=both style=solid weight=10 color=gray arrowsize=0.6 minlen=2 penwidth=0.5 constraint=true];\n"
-graphSimpleSuperHow (SuperArrow _) topLevel _ showRefs = " [arrowhead=vee arrowsize=0.6 penwidth=0.5 constraint=true weight=10 color=" ++ refColour showRefs ++ " fontcolor=" ++ refColour showRefs ++ (if fst3 topLevel == True then "" else " label=" ++ (fromJust $ trd3 topLevel)) ++ "];\n"
-graphSimpleSuperHow (SuperMArrow _) topLevel _ showRefs = " [arrowhead=veevee arrowsize=0.6 minlen=1.5 penwidth=0.5 constraint=true weight=10 color=" ++ refColour showRefs ++ " fontcolor=" ++ refColour showRefs ++ (if fst3 topLevel == True then "" else " label=" ++ (fromJust $ trd3 topLevel)) ++ "];\n"
+parent :: [String] -> String
+parent [] = "error"
+parent (uid'@('c':xs):xss) = if '_' `elem` xs then uid' else parent xss
+parent (_:xss) = parent xss
 
-refColour :: Bool -> String 
-refColour True = "lightgray" 
+graphSimpleSuper (SuperEmpty _) _ _ _ = ""
+graphSimpleSuper (SuperSome _ setExp) topLevel irMap _ =
+  let
+    super' = parent $ graphSimpleSetExp setExp topLevel irMap
+  in
+    if super' == "error"
+      then ""
+      else "\"" ++
+           fromJust (snd3 topLevel) ++
+           "\" -> \"" ++
+           parent (graphSimpleSetExp setExp topLevel irMap) ++
+           "\"" ++
+           " [" ++ if fst3 topLevel == True
+             then "arrowhead=onormal constraint=true weight=100];\n"
+             else "arrowhead=vee arrowtail=diamond dir=both style=solid weight=10 color=gray arrowsize=0.6 minlen=2 penwidth=0.5 constraint=true];\n"
+
+graphSimpleReference :: Reference -> (Bool, Maybe String, Maybe String) -> Map.Map Span [Ir] -> Bool -> String
+graphSimpleReference (ReferenceEmpty _) _ _ _ = ""
+graphSimpleReference (ReferenceSet _ setExp) topLevel irMap showRefs =
+  case graphSimpleSetExp setExp topLevel irMap of
+    ["integer"] -> ""
+    ["int"] -> ""
+    ["real"] -> ""
+    ["string"] -> ""
+    [target] ->
+       "\"" ++
+       fromJust (snd3 topLevel) ++
+       "\" -> \"" ++
+       target ++
+       "\"" ++
+       " [arrowhead=vee arrowsize=0.6 penwidth=0.5 constraint=true weight=10 color=" ++
+       refColour showRefs ++
+       " fontcolor=" ++
+       refColour showRefs ++
+       (if fst3 topLevel == True then "" else " label=" ++
+       (fromJust $ trd3 topLevel)) ++
+       "];\n"
+    _ -> ""
+graphSimpleReference (ReferenceBag _ setExp) topLevel irMap showRefs =
+  case graphSimpleSetExp setExp topLevel irMap of
+    ["integer"] -> ""
+    ["int"] -> ""
+    ["real"] -> ""
+    ["string"] -> ""
+    [target] ->
+      ("\"" ++
+        fromJust (snd3 topLevel) ++
+        "\" -> \"" ++
+        target ++
+        "\"" ++
+        " [arrowhead=veevee arrowsize=0.6 minlen=1.5 penwidth=0.5 constraint=true weight=10 color=" ++
+        refColour showRefs ++
+        " fontcolor=" ++
+        refColour showRefs ++
+        (if fst3 topLevel == True then "" else " label=" ++
+        (fromJust $ trd3 topLevel)) ++ "];\n")
+    _ -> ""
+refColour :: Bool -> String
+refColour True = "lightgray"
 refColour False = "transparent"
 
 graphSimpleName :: Name -> (Bool, Maybe String, Maybe String) -> Map.Map Span [Ir] -> String
@@ -152,44 +239,45 @@
 graphCVLModule (Module s (x:xs)) irMap = graphCVLDeclaration x Nothing irMap ++ graphCVLModule (Module s xs) irMap
 
 graphCVLDeclaration :: Declaration -> Maybe String -> Map.Map Span [Ir] -> String
-graphCVLDeclaration (ElementDecl _ element)      parent irMap = graphCVLElement element parent irMap
+graphCVLDeclaration (ElementDecl _ element)      parent' irMap = graphCVLElement element parent' irMap
 graphCVLDeclaration _                          _        _     = ""
 
 graphCVLElement :: Element -> Maybe String -> Map.Map Span [Ir] -> String
-graphCVLElement (Subclafer _ clafer)  parent irMap = graphCVLClafer clafer parent irMap
---graphCVLElement (ClaferUse _ name _ _) parent irMap = if parent == Nothing then "" else "?" ++ " -> " ++ graphCVLName name parent irMap ++ " [arrowhead = onormal style = dashed constraint = false];\n"
-graphCVLElement (ClaferUse s _ _ _) parent irMap = if parent == Nothing then "" else "?" ++ " -> " ++ getUseId s irMap ++ " [arrowhead = onormal style = dashed constraint = false];\n"
-graphCVLElement (Subconstraint _ constraint) parent irMap = graphCVLConstraint constraint parent irMap
-graphCVLElement (Subgoal _ constraint) parent irMap = graphCVLGoal constraint parent irMap
-graphCVLElement (Subsoftconstraint _ constraint) parent irMap = graphCVLSoftConstraint constraint parent irMap
+graphCVLElement (Subclafer _ clafer)  parent' irMap = graphCVLClafer clafer parent' irMap
+--graphCVLElement (ClaferUse _ name _ _) parent' irMap = if parent' == Nothing then "" else "?" ++ " -> " ++ graphCVLName name parent' irMap ++ " [arrowhead = onormal style = dashed constraint = false];\n"
+graphCVLElement (ClaferUse s _ _ _) parent' irMap = if parent' == Nothing then "" else "?" ++ " -> " ++ getUseId s irMap ++ " [arrowhead = onormal style = dashed constraint = false];\n"
+graphCVLElement (Subconstraint _ constraint) parent' irMap = graphCVLConstraint constraint parent' irMap
+graphCVLElement (Subgoal _ constraint) parent' irMap = graphCVLGoal constraint parent' irMap
+graphCVLElement (Subsoftconstraint _ constraint) parent' irMap = graphCVLSoftConstraint constraint parent' irMap
 
 graphCVLElements :: Elements -> Maybe String -> Map.Map Span [Ir] -> String
 graphCVLElements (ElementsEmpty _) _ _ = ""
-graphCVLElements (ElementsList _ es) parent irMap = concatMap (\x -> graphCVLElement x parent irMap  ++ "\n") es
+graphCVLElements (ElementsList _ es) parent' irMap = concatMap (\x -> graphCVLElement x parent' irMap  ++ "\n") es
 
 graphCVLClafer :: Clafer -> Maybe String -> Map.Map Span [Ir] -> String
-graphCVLClafer (Clafer s _ gCard _ super' crd _ es) parent irMap
+graphCVLClafer (Clafer s _ gCard _ super' reference' crd _ es) parent' irMap
    = let {{-tooltip = genTooltip (Module [ElementDecl (Subclafer (Clafer abstract gCard id' super' crd init' es))]) irMap;-}
           uid' = getDivId s irMap;
-          gcrd = graphCVLGCard gCard parent irMap;
-          super'' = graphCVLSuper super' parent irMap} in
-     "\"" ++ uid' ++ "\" [URL=\"#" ++ uid' ++ "\" label=\"" ++ dropUid uid' ++ super'' ++ (if choiceCard crd then "\" style=rounded"  else " [" ++ graphCVLCard crd parent irMap ++ "]\"")
+          gcrd = graphCVLGCard gCard parent' irMap;
+          super'' = graphCVLSuper super' parent' irMap;
+          reference'' = graphCVLReference reference' parent' irMap} in
+     "\"" ++ uid' ++ "\" [URL=\"#" ++ uid' ++ "\" label=\"" ++ dropUid uid' ++ super'' ++ reference'' ++ (if choiceCard crd then "\" style=rounded"  else " [" ++ graphCVLCard crd parent' irMap ++ "]\"")
      ++ (if super'' == "" then "" else " shape=oval") ++ "];\n"
      ++ (if gcrd == "" then "" else "g" ++ uid' ++ " [label=\"" ++ gcrd ++ "\" fontsize=10 shape=triangle];\ng" ++ uid' ++ " -> " ++ uid' ++ " [weight=10];\n")
-     ++ (if parent==Nothing then "" else uid' ++ " -> " ++ fromJust parent ++ (if lowerCard crd == "0" then " [style=dashed]" else "") ++ ";\n")
+     ++ (if parent'==Nothing then "" else uid' ++ " -> " ++ fromJust parent' ++ (if lowerCard crd == "0" then " [style=dashed]" else "") ++ ";\n")
      ++ graphCVLElements es (if gcrd == "" then (Just uid') else (Just $ "g" ++ uid')) irMap
 
 graphCVLSuper :: Super -> Maybe String -> Map.Map Span [Ir] -> String
 graphCVLSuper (SuperEmpty _) _ _ = ""
-graphCVLSuper (SuperSome _ superHow setExp) parent irMap = graphCVLSuperHow superHow ++ concat (graphCVLSetExp setExp parent irMap)
+graphCVLSuper (SuperSome _ setExp) parent' irMap = ":" ++ concat (graphCVLSetExp setExp parent' irMap)
 
-graphCVLSuperHow :: SuperHow -> String
-graphCVLSuperHow (SuperColon _)  = ":"
-graphCVLSuperHow (SuperArrow _)  = "->"
-graphCVLSuperHow (SuperMArrow _) = "->>"
+graphCVLReference :: Reference -> Maybe String -> Map.Map Span [Ir] -> String
+graphCVLReference (ReferenceEmpty _) _ _ = ""
+graphCVLReference (ReferenceSet _ setExp) parent' irMap = "->" ++ concat (graphCVLSetExp setExp parent' irMap)
+graphCVLReference (ReferenceBag _ setExp) parent' irMap = "->>" ++ concat (graphCVLSetExp setExp parent' irMap)
 
 graphCVLName :: Name -> Maybe String -> Map.Map Span [Ir] -> String
-graphCVLName (Path _ modids) parent irMap = unwords $ map (\x -> graphCVLModId x parent irMap) modids
+graphCVLName (Path _ modids) parent' irMap = unwords $ map (\x -> graphCVLModId x parent' irMap) modids
 
 graphCVLModId :: ModId -> Maybe String -> Map.Map Span [Ir] -> String
 graphCVLModId (ModIdIdent _ posident) _ irMap = graphCVLPosIdent posident irMap
@@ -198,22 +286,22 @@
 graphCVLPosIdent (PosIdent (pos, id')) irMap = getUid (PosIdent (pos, id')) irMap
 
 graphCVLConstraint :: Constraint -> Maybe String -> Map.Map Span [Ir] -> String
-graphCVLConstraint (Constraint s exps') parent irMap = let body' = htmlNewlines $ genTooltip (Module s [ElementDecl s (Subconstraint s (Constraint s exps'))]) irMap;
+graphCVLConstraint (Constraint s exps') parent' irMap = let body' = htmlChars $ genTooltip (Module s [ElementDecl s (Subconstraint s (Constraint s exps'))]) irMap;
                                                                        uid' = "\"" ++ getExpId s irMap ++ "\""
                                                                     in uid' ++ " [label=\"" ++ body' ++ "\" shape=parallelogram];\n" ++
-                                                                      if parent == Nothing then "" else uid' ++ " -> \"" ++ fromJust parent ++ "\";\n"
+                                                                      if parent' == Nothing then "" else uid' ++ " -> \"" ++ fromJust parent' ++ "\";\n"
 
 graphCVLSoftConstraint :: SoftConstraint -> Maybe String -> Map.Map Span [Ir] -> String
-graphCVLSoftConstraint (SoftConstraint s exps') parent irMap = let body' = htmlNewlines $ genTooltip (Module s [ElementDecl s (Subsoftconstraint s (SoftConstraint s exps'))]) irMap;
+graphCVLSoftConstraint (SoftConstraint s exps') parent' irMap = let body' = htmlChars $ genTooltip (Module s [ElementDecl s (Subsoftconstraint s (SoftConstraint s exps'))]) irMap;
                                                                        uid' = "\"" ++ getExpId s irMap ++ "\""
                                                                     in uid' ++ " [label=\"" ++ body' ++ "\" shape=parallelogram];\n" ++
-                                                                      if parent == Nothing then "" else uid' ++ " -> \"" ++ fromJust parent ++ "\";\n"
+                                                                      if parent' == Nothing then "" else uid' ++ " -> \"" ++ fromJust parent' ++ "\";\n"
 
 graphCVLGoal :: Goal -> Maybe String -> Map.Map Span [Ir] -> String
-graphCVLGoal (Goal s exps') parent irMap = let body' = htmlNewlines $ genTooltip (Module s [ElementDecl s (Subgoal s (Goal s exps'))]) irMap;
+graphCVLGoal (Goal s exps') parent' irMap = let body' = htmlChars $ genTooltip (Module s [ElementDecl s (Subgoal s (Goal s exps'))]) irMap;
                                                                        uid' = "\"" ++ getExpId s irMap ++ "\""
                                                                     in uid' ++ " [label=\"" ++ body' ++ "\" shape=parallelogram];\n" ++
-                                                                      if parent == Nothing then "" else uid' ++ " -> \"" ++ fromJust parent ++ "\";\n"                                                                      
+                                                                      if parent' == Nothing then "" else uid' ++ " -> \"" ++ fromJust parent' ++ "\";\n"
 
 graphCVLCard :: Card -> Maybe String -> Map.Map Span [Ir] -> String
 graphCVLCard  (CardEmpty _) _ _ = "1..1"
@@ -221,17 +309,17 @@
 graphCVLCard  (CardSome _) _ _ =  "1..*"
 graphCVLCard  (CardAny _) _ _ =    "0..*"
 graphCVLCard  (CardNum _ (PosInteger (_, n))) _ _ = n ++ ".." ++ n
-graphCVLCard  (CardInterval _ ncard) parent irMap = graphCVLNCard ncard parent irMap
+graphCVLCard  (CardInterval _ ncard) parent' irMap = graphCVLNCard ncard parent' irMap
 
-graphCVLNCard :: NCard -> Maybe String -> Map.Map Span [Ir] -> String 
-graphCVLNCard (NCard _ (PosInteger (_, num)) exInteger) parent irMap = num ++ ".." ++ graphCVLExInteger exInteger parent irMap
+graphCVLNCard :: NCard -> Maybe String -> Map.Map Span [Ir] -> String
+graphCVLNCard (NCard _ (PosInteger (_, num)) exInteger) parent' irMap = num ++ ".." ++ graphCVLExInteger exInteger parent' irMap
 
 graphCVLExInteger :: ExInteger -> Maybe String -> Map.Map Span [Ir] -> String
 graphCVLExInteger (ExIntegerAst _) _ _ = "*"
 graphCVLExInteger (ExIntegerNum _ (PosInteger(_, num))) _ _ = num
 
 graphCVLGCard :: GCard -> Maybe String -> Map.Map Span [Ir] -> String
-graphCVLGCard (GCardInterval _ ncard) parent irMap = graphCVLNCard ncard parent irMap
+graphCVLGCard (GCardInterval _ ncard) parent' irMap = graphCVLNCard ncard parent' irMap
 graphCVLGCard (GCardEmpty _) _ _ = ""
 graphCVLGCard (GCardXor _) _ _ = "1..1"
 graphCVLGCard (GCardOr _) _ _ = "1..*"
@@ -249,14 +337,14 @@
 graphCVLAbstract _ _ _ = ""-}
 
 graphCVLSetExp :: SetExp -> Maybe String -> Map.Map Span [Ir] -> [String]
-graphCVLSetExp (ClaferId _ name) parent irMap = [graphCVLName name parent irMap]
-graphCVLSetExp (Union _ set1 set2) parent irMap = graphCVLSetExp set1 parent irMap ++ graphCVLSetExp set2 parent irMap
-graphCVLSetExp (UnionCom _ set1 set2) parent irMap = graphCVLSetExp set1 parent irMap ++ graphCVLSetExp set2 parent irMap
-graphCVLSetExp (Difference _ set1 set2) parent irMap = graphCVLSetExp set1 parent irMap ++ graphCVLSetExp set2 parent irMap
-graphCVLSetExp (Intersection _ set1 set2) parent irMap = graphCVLSetExp set1 parent irMap ++ graphCVLSetExp set2 parent irMap
-graphCVLSetExp (Domain _ set1 set2) parent irMap = graphCVLSetExp set1 parent irMap ++ graphCVLSetExp set2 parent irMap
-graphCVLSetExp (Range _ set1 set2) parent irMap = graphCVLSetExp set1 parent irMap ++ graphCVLSetExp set2 parent irMap
-graphCVLSetExp (Join _ set1 set2) parent irMap = graphCVLSetExp set1 parent irMap ++ graphCVLSetExp set2 parent irMap
+graphCVLSetExp (ClaferId _ name) parent' irMap = [graphCVLName name parent' irMap]
+graphCVLSetExp (Union _ set1 set2) parent' irMap = graphCVLSetExp set1 parent' irMap ++ graphCVLSetExp set2 parent' irMap
+graphCVLSetExp (UnionCom _ set1 set2) parent' irMap = graphCVLSetExp set1 parent' irMap ++ graphCVLSetExp set2 parent' irMap
+graphCVLSetExp (Difference _ set1 set2) parent' irMap = graphCVLSetExp set1 parent' irMap ++ graphCVLSetExp set2 parent' irMap
+graphCVLSetExp (Intersection _ set1 set2) parent' irMap = graphCVLSetExp set1 parent' irMap ++ graphCVLSetExp set2 parent' irMap
+graphCVLSetExp (Domain _ set1 set2) parent' irMap = graphCVLSetExp set1 parent' irMap ++ graphCVLSetExp set2 parent' irMap
+graphCVLSetExp (Range _ set1 set2) parent' irMap = graphCVLSetExp set1 parent' irMap ++ graphCVLSetExp set2 parent' irMap
+graphCVLSetExp (Join _ set1 set2) parent' irMap = graphCVLSetExp set1 parent' irMap ++ graphCVLSetExp set2 parent' irMap
 
 {-graphCVLEnumId (EnumIdIdent posident) _ irMap = graphCVLPosIdent posident irMap
 graphCVLEnumId (PosEnumIdIdent _ posident) parent irMap = graphCVLEnumId (EnumIdIdent posident) parent irMap-}
@@ -289,13 +377,13 @@
                           findUid id' $ getIdentPExp pexp
                           where {getIdentPExp (PExp _ _ _ exp') = getIdentIExp exp';
                                  getIdentIExp (IFunExp _ exps') = concatMap getIdentPExp exps';
-                                 getIdentIExp (IClaferId _ id'' _) = [id''];
+                                 getIdentIExp (IClaferId _ id'' _ _) = [id''];
                                  getIdentIExp (IDeclPExp _ _ pexp) = getIdentPExp pexp;
                                  getIdentIExp _ = [];
                                  findUid name (x:xs) = if name == dropUid x then x else findUid name xs;
                                  findUid name []     = name}
 
-getDivId :: Span -> Map.Map Span [Ir] -> String                  
+getDivId :: Span -> Map.Map Span [Ir] -> String
 getDivId s irMap = if Map.lookup s irMap == Nothing
                       then "Uid not Found"
                       else let IRClafer iClaf = head $ fromJust $ Map.lookup s irMap in
@@ -310,8 +398,10 @@
 getUseId :: Span -> Map.Map Span [Ir] -> String
 getUseId s irMap = if Map.lookup s irMap == Nothing
                       then "Uid not Found"
-                      else let IRClafer iClaf = head $ fromJust $ Map.lookup s irMap in
-                        _sident $ _exp $ head $ _supers $ _super iClaf
+                      else let
+                            IRClafer iClaf = head $ fromJust $ Map.lookup s irMap
+                           in
+                            fromMaybe "" $ _sident <$> _exp <$> _super iClaf
 
 getExpId :: Span -> Map.Map Span [Ir] -> String
 getExpId s irMap = if Map.lookup s irMap == Nothing
@@ -321,10 +411,12 @@
 {-while :: Bool -> [IExp] -> [IExp]
 while bool exp' = if bool then exp' else []-}
 
-htmlNewlines :: String -> String
-htmlNewlines "" = ""
-htmlNewlines ('\n':xs) = "&#10;" ++ htmlNewlines xs
-htmlNewlines (x:xs) = x:htmlNewlines xs
+htmlChars :: String -> String
+htmlChars "" = ""
+htmlChars ('\n':xs) = "&#10;" ++ htmlChars xs
+htmlChars ('-':'>':'>':xs) = "-&gt;&gt;" ++ htmlChars xs
+htmlChars ('-':'>':xs) = "-&gt;" ++ htmlChars xs
+htmlChars (x:xs) = x:htmlChars xs
 
 cleanOutput :: String -> String
 cleanOutput "" = ""
diff --git a/src/Language/Clafer/Generator/Html.hs b/src/Language/Clafer/Generator/Html.hs
--- a/src/Language/Clafer/Generator/Html.hs
+++ b/src/Language/Clafer/Generator/Html.hs
@@ -41,6 +41,8 @@
 import Language.Clafer.Front.LayoutResolver(revertLayout)
 import Language.Clafer.Intermediate.Tracing
 import Language.Clafer.Intermediate.Intclafer
+
+import Control.Applicative ((<$>))
 import Data.List (intersperse,genericSplitAt)
 import qualified Data.Map as Map
 import Data.Maybe
@@ -69,7 +71,7 @@
   | row == row' = case take 3 comment of
         '/':'/':'#':[] -> (cs,"<!-- " ++ trim' (drop 2 comment) ++ " /-->\n")
         '/':'/':_:[]   -> if col' == 1
-                          then (cs, printStandaloneComment comment ++ "\n") 
+                          then (cs, printStandaloneComment comment ++ "\n")
                           else (cs, printInlineComment comment ++ "\n")
         '/':'*':_:[]   -> (cs, printStandaloneComment comment ++ "\n")
         _      -> (cs, "Improper form of comment.")-- Should not happen. Bug.
@@ -83,7 +85,7 @@
 -- | Generate the model as HTML document
 genHtml :: Module -> IModule -> String
 genHtml x ir = cleanOutput $ revertLayout $ printModule x (traceIrModule ir) True
--- | Generate the model as plain text 
+-- | Generate the model as plain text
 -- | This is used by the graph generator for tooltips
 genText :: Module -> IModule -> String
 genText x ir = cleanOutput $ revertLayout $ printModule x (traceIrModule ir) False
@@ -95,13 +97,13 @@
 printModule (Module s (x:xs)) irMap html = (printDeclaration x 0 irMap html []) ++ printModule (Module s xs) irMap html
 
 printDeclaration :: Declaration -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String
-printDeclaration (EnumDecl s posIdent enumIds)  indent irMap html comments = 
+printDeclaration (EnumDecl s posIdent enumIds)  indent irMap html comments =
     preComments ++
     printIndentId 0 html ++
-    (while html "<span class=\"keyword\">") ++ "enum" ++ (while html "</span>") ++ 
-    " " ++ 
-    (printPosIdent posIdent (Just uid') html) ++ 
-    " = " ++ 
+    (while html "<span class=\"keyword\">") ++ "enum" ++ (while html "</span>") ++
+    " " ++
+    (printPosIdent posIdent (Just uid') html) ++
+    " = " ++
     (concat $ intersperse " | " (map (\x -> printEnumId x indent irMap html comments) enumIds)) ++
     comment ++
     printIndentEnd html
@@ -114,50 +116,50 @@
 printElement :: Element -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String
 printElement (Subclafer _ clafer) indent irMap html comments = printClafer clafer indent irMap html comments
 
-printElement (ClaferUse s name crd es) indent irMap html comments = 
-  preComments ++ 
+printElement (ClaferUse s name crd es) indent irMap html comments =
+  preComments ++
   printIndentId indent html ++
-  "`" ++ (while html ("<a href=\"#" ++ superId ++ "\"><span class=\"reference\">")) ++ 
+  "`" ++ (while html ("<a href=\"#" ++ superId ++ "\"><span class=\"reference\">")) ++
   printName name indent irMap False [] --trick the printer into only printing the name
-  ++ (while html "</span></a>") ++ 
-  printCard crd ++ 
-  comment ++ 
-  printIndentEnd html ++ 
+  ++ (while html "</span></a>") ++
+  printCard crd ++
+  comment ++
+  printIndentEnd html ++
   printElements es indent irMap html comments''
   where
     (_, superId) = getUseId s irMap;
     (comments', preComments) = printPreComment s comments;
-    (comments'', comment) = printComment s comments' 
+    (comments'', comment) = printComment s comments'
 
-printElement (Subgoal s goal) indent irMap html comments = 
-  preComments ++ 
+printElement (Subgoal s goal) indent irMap html comments =
+  preComments ++
   printIndent 0 html ++
   printGoal goal indent irMap html comments'' ++
-  comment ++ 
+  comment ++
   printIndentEnd html
   where
-   (comments', preComments) = printPreComment s comments; 
-   (comments'', comment) = printComment s comments' 
+   (comments', preComments) = printPreComment s comments;
+   (comments'', comment) = printComment s comments'
 
 printElement (Subconstraint s constraint) indent irMap html comments =
     preComments ++
-    printIndent indent html ++ 
+    printIndent indent html ++
     printConstraint constraint indent irMap html comments'' ++
     comment ++
-    printIndentEnd html  
+    printIndentEnd html
   where
     (comments', preComments) = printPreComment s comments;
-    (comments'', comment) = printComment s comments' 
+    (comments'', comment) = printComment s comments'
 
 printElement (Subsoftconstraint s constraint) indent irMap html comments =
-    preComments ++ 
-    printIndent indent html ++ 
+    preComments ++
+    printIndent indent html ++
     printSoftConstraint constraint indent irMap html comments'' ++
     comment ++
-    printIndentEnd html  
+    printIndentEnd html
   where
     (comments', preComments) = printPreComment s comments;
-    (comments'', comment) = printComment s comments' 
+    (comments'', comment) = printComment s comments'
 
 printElements :: Elements -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String
 printElements (ElementsEmpty _) _ _ _ _ = ""
@@ -174,11 +176,11 @@
           span' (Subsoftconstraint s _) = s
 
 printClafer :: Clafer -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String
-printClafer (Clafer s abstract gCard id' super' crd init' es) indent irMap html comments =
-  preComments ++ 
-  printIndentId indent html ++ 
-  claferDeclaration ++ 
-  comment ++ 
+printClafer (Clafer s abstract gCard id' super' reference' crd init' es) indent irMap html comments =
+  preComments ++
+  printIndentId indent html ++
+  claferDeclaration ++
+  comment ++
   printElements es indent irMap html comments'' ++
   printIndentEnd html
   where
@@ -186,18 +188,19 @@
     (comments', preComments) = printPreComment s comments;
     (comments'', comment) = printComment s comments'
     claferDeclaration = concat [
-      printAbstract abstract html, 
+      printAbstract abstract html,
       printGCard gCard html,
-      printPosIdent id' (Just uid') html, 
-      printSuper super' indent irMap html comments, 
-      printCard crd, 
+      printPosIdent id' (Just uid') html,
+      printSuper super' indent irMap html comments,
+      printReference reference' indent irMap html comments,
+      printCard crd,
       printInit init' indent irMap html comments]
 
-printGoal :: Goal -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String               
-printGoal (Goal _ exps') indent irMap html comments = 
-  (if html then "&lt;&lt;" else "<<") ++ 
-  concatMap (\x -> printExp x indent irMap html comments) exps' ++ 
-  if html then "&gt;&gt;" else ">>" 
+printGoal :: Goal -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String
+printGoal (Goal _ exps') indent irMap html comments =
+  (if html then "&lt;&lt;" else "<<") ++
+  concatMap (\x -> printExp x indent irMap html comments) exps' ++
+  if html then "&gt;&gt;" else ">>"
 
 printAbstract :: Abstract -> Bool -> String
 printAbstract (Abstract _) html   = (while html "<span class=\"keyword\">") ++ "abstract" ++ (while html "</span>") ++ " "
@@ -214,8 +217,8 @@
 
 printNCard :: NCard -> String
 printNCard (NCard _ (PosInteger (_, num)) exInteger) = num ++ ".." ++ printExInteger exInteger ++ " "
-  
-printExInteger :: ExInteger -> String    
+
+printExInteger :: ExInteger -> String
 printExInteger (ExIntegerAst _) = "*"
 printExInteger (ExIntegerNum _ (PosInteger(_, num))) = num
 
@@ -236,44 +239,45 @@
 
 printSuper :: Super -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String
 printSuper (SuperEmpty _) _ _ _ _ = ""
-printSuper (SuperSome _ superHow setExp) indent irMap html comments = printSuperHow superHow indent irMap html comments ++ printSetExp setExp indent irMap html comments
+printSuper (SuperSome _ setExp) indent irMap html comments = (while html "<span class=\"keyword\">") ++ " : " ++ (while html "</span>") ++ printSetExp setExp indent irMap html comments
 
-printSuperHow :: SuperHow -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String
-printSuperHow (SuperColon _)  _ _ html _ = (while html "<span class=\"keyword\">") ++ " :" ++ (while html "</span>") ++ " "
-printSuperHow (SuperArrow _) _ _ html _ = (while html "<span class=\"keyword\">") ++ " ->" ++ (while html "</span>") ++ " "
-printSuperHow (SuperMArrow _) _ _ html _ = (while html "<span class=\"keyword\">") ++ " ->>" ++ (while html "</span>") ++ " "
+printReference :: Reference -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String
+printReference (ReferenceEmpty _) _ _ _ _ = ""
+printReference (ReferenceSet _ setExp) indent irMap html comments = (while html "<span class=\"keyword\">") ++ " -> " ++ (while html "</span>") ++ printSetExp setExp indent irMap html comments
+printReference (ReferenceBag _ setExp) indent irMap html comments = (while html "<span class=\"keyword\">") ++ " ->> " ++ (while html "</span>") ++ printSetExp setExp indent irMap html comments
 
+
 printCard :: Card -> String
 printCard (CardEmpty _) = ""
 printCard (CardLone _)  = " ?"
 printCard (CardSome _)  = " +"
 printCard (CardAny _)   = " *"
-printCard (CardNum _ (PosInteger (_,num))) = " " ++ num 
+printCard (CardNum _ (PosInteger (_,num))) = " " ++ num
 printCard (CardInterval _ nCard) = " " ++ printNCard nCard
 
 printConstraint ::  Constraint -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String
 printConstraint (Constraint _ exps') indent irMap html comments = (concatMap (\x -> printConstraint' x indent irMap html comments) exps')
 
 printConstraint' :: Exp -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String
-printConstraint' exp' indent irMap html comments = 
+printConstraint' exp' indent irMap html comments =
     while html "<span class=\"keyword\">" ++ "[" ++ while html "</span>" ++
-    " " ++ 
-    printExp exp' indent irMap html comments ++ 
-    " " ++ 
+    " " ++
+    printExp exp' indent irMap html comments ++
+    " " ++
     while html "<span class=\"keyword\">" ++ "]" ++ while html "</span>"
 
 printSoftConstraint :: SoftConstraint -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String
 printSoftConstraint (SoftConstraint _ exps') indent irMap html comments = concatMap (\x -> printSoftConstraint' x indent irMap html comments) exps'
 printSoftConstraint' :: Exp -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String
-printSoftConstraint' exp' indent' irMap html comments = 
-    while html "<span class=\"keyword\">" ++ "(" ++ while html "</span>" ++ 
+printSoftConstraint' exp' indent' irMap html comments =
+    while html "<span class=\"keyword\">" ++ "(" ++ while html "</span>" ++
     " " ++
-    printExp exp' indent' irMap html comments ++ 
-    " " ++ 
+    printExp exp' indent' irMap html comments ++
+    " " ++
     while html "<span class=\"keyword\">" ++ ")" ++ while html "</span>"
 
 printDecl :: Decl-> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String
-printDecl (Decl _ locids setExp) indent irMap html comments = 
+printDecl (Decl _ locids setExp) indent irMap html comments =
   (concat $ intersperse "; " $ map printLocId locids) ++
   (while html "<span class=\"keyword\">") ++ " : " ++ (while html "</span>") ++ printSetExp setExp indent irMap html comments
   where
@@ -285,8 +289,8 @@
 printInit (InitSome _ initHow exp') indent irMap html comments = printInitHow initHow  ++ printExp exp' indent irMap html comments
 
 printInitHow :: InitHow -> String
-printInitHow (InitHow_1 _) = " = "
-printInitHow (InitHow_2 _) = " := "
+printInitHow (InitConstant _) = " = "
+printInitHow (InitDefault _) = " := "
 
 printExp :: Exp -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String
 printExp (DeclAllDisj _ decl exp') indent irMap html comments = "all disj " ++ (printDecl decl indent irMap html comments) ++ " | " ++ (printExp exp' indent irMap html comments)
@@ -358,9 +362,9 @@
 printIndentEnd html = (while html "</div>") ++ "\n"
 
 dropUid :: String -> String
-dropUid uid' = let id' = rest $ dropWhile (/= '_') uid' 
-              in if id' == "" 
-                then uid' 
+dropUid uid' = let id' = rest $ dropWhile (/= '_') uid'
+              in if id' == ""
+                then uid'
                 else id'
 
 --so it fails more gracefully on empty lists
@@ -372,14 +376,17 @@
 rest (_:xs) = xs
 
 getUid :: PosIdent -> Map.Map Span [Ir] -> String
-getUid posIdent@(PosIdent (_, id')) irMap = 
+getUid posIdent@(PosIdent (_, id')) irMap =
     if Map.lookup (getSpan posIdent) irMap == Nothing
     then "Lookup failed"
-    else let IRPExp pexp = head $ fromJust $ Map.lookup (getSpan posIdent) irMap in
-      findUid id' $ getIdentPExp pexp
-      where {getIdentPExp (PExp _ _ _ exp') = getIdentIExp exp';
+    else let wrappedResult = head $ fromJust $ Map.lookup (getSpan posIdent) irMap in
+      findUid id' $ unwrap wrappedResult
+      where {unwrap (IRPExp pexp')       = getIdentPExp pexp';
+             unwrap (IRClafer iClafer') = [ _uid iClafer' ];
+             unwrap x = error $ "Html:getUid:unwrap called on: " ++ show x;
+             getIdentPExp (PExp _ _ _ exp') = getIdentIExp exp';
              getIdentIExp (IFunExp _ exps') = concatMap getIdentPExp exps';
-             getIdentIExp (IClaferId _ id'' _) = [id''];
+             getIdentIExp (IClaferId _ id'' _ _) = [id''];
              getIdentIExp (IDeclPExp _ _ pexp) = getIdentPExp pexp;
              getIdentIExp _ = [];
              findUid name (x:xs) = if name == dropUid x then x else findUid name xs;
@@ -400,7 +407,7 @@
 getUseId s irMap = if Map.lookup s irMap == Nothing
                       then ("Uid not Found", "Uid not Found")
                       else let IRClafer iClaf = head $ fromJust $ Map.lookup s irMap in
-                        (_uid iClaf, _sident $ _exp $ head $ _supers $ _super iClaf)
+                        (_uid iClaf, fromMaybe "" $ _sident <$> _exp <$> _super iClaf)
 
 while :: Bool -> String -> String
 while bool exp' = if bool then exp' else ""
@@ -421,7 +428,7 @@
 	where
 		replace _ _ []     = []
 		replace x y (z:zs) = (if x == z then y else z):replace x y zs
-		
+
 highlightErrors' :: [String] -> [ClaferErr] -> [String]
 highlightErrors' model' [] = model'
 highlightErrors' model' ((ClaferErr _):es) = highlightErrors' model' es
@@ -430,8 +437,8 @@
       newLine = fst (genericSplitAt (c - 1) $ last ls) ++ "<span class=\"error\" title=\"Parsing failed at line " ++ show l ++ " column " ++ show c ++
 				   "...\n" ++ msg' ++ "\">" ++ (if snd (genericSplitAt (c - 1) $ last ls) == "" then "&nbsp;" else snd (genericSplitAt (c - 1) $ last ls)) ++ "</span>"
   in highlightErrors' (init ls ++ [newLine] ++ lss) es
-highlightErrors' model' ((SemanticErr ErrPos{modelPos = Pos l c, fragId = n} msg'):es) = 
+highlightErrors' model' ((SemanticErr ErrPos{modelPos = Pos l c, fragId = n} msg'):es) =
   let (ls, lss) = genericSplitAt (l + toInteger n) model'
       newLine = fst (genericSplitAt (c - 1) $ last ls) ++ "<span class=\"error\" title=\"Compiling failed at line " ++ show l ++ " column " ++ show c ++
 				   "...\n" ++ msg' ++ "\">" ++ (if snd (genericSplitAt (c - 1) $ last ls) == "" then "&nbsp;" else snd (genericSplitAt (c - 1) $ last ls)) ++ "</span>"
-  in highlightErrors' (init ls ++ [newLine] ++ lss) es
+  in highlightErrors' (init ls ++ [newLine] ++ lss) es
diff --git a/src/Language/Clafer/Generator/Python.hs b/src/Language/Clafer/Generator/Python.hs
--- a/src/Language/Clafer/Generator/Python.hs
+++ b/src/Language/Clafer/Generator/Python.hs
@@ -22,10 +22,12 @@
 -- | Generates Python representation of IR for the <https://github.com/gsdlab/ClaferZ3 ClaferZ3>.
 module Language.Clafer.Generator.Python where
 
+import Data.Char
+import Data.Maybe (fromMaybe)
+
 import Language.Clafer.Common
 import Language.Clafer.Front.Absclafer
 import Language.Clafer.Intermediate.Intclafer
-import Data.Char
 
 tag:: String -> String -> String
 tag name exp' = concat ["<", name, ">", exp', "</", name, ">\n"]
@@ -60,7 +62,7 @@
 
 genPythonIntPair :: (Integer, Integer) -> String
 genPythonIntPair (x, y) = concat
-  [ "(", genPythonInteger x 
+  [ "(", genPythonInteger x
   , ","
   , genPythonInteger y, ")"]
 
@@ -93,13 +95,15 @@
 
 genPythonClafer :: IClafer -> Result
 genPythonClafer x = case x of
-  IClafer pos' abstract' gcard' id' uid' super' card' glcard' elements'  ->
-    concat [ "\t", genPythonPosition pos', "\n" 
+  IClafer pos' abstract' gcard' id' uid' puid' super' refrence' card' glcard' elements'  ->
+    concat [ "\t", genPythonPosition pos', "\n"
            , "\t", genPythonAbstract abstract', "\n"
            , "\t", maybe "" genPythonGCard gcard', "\n"
            , "\t", genPythonId id', "\n"
            , "\t", genPythonUid uid', "\n"
+           , "\t", genPythonParentUid puid', "\n"
            , "\t", genPythonSuper super', "\n"
+           , "\t", genPythonReference refrence', "\n"
            , "\t", maybe "" genPythonCard card', "\n"
            , "\t", genPythonGlCard glcard', "\n"
            , "\tcurrClafer = Clafer.Clafer(pos=pos, isAbstract=isAbstract, gcard=groupCard, ident=id, uid=uid, my_supers=my_supers, card=card, glCard=globalCard)\n"
@@ -107,18 +111,18 @@
            , "\tstack.append(currClafer)\n"
            , concatMap genPythonElement elements'
            , "\tstack.pop()\n"]
-  
+
 genPythonAbstract :: Bool -> String
 genPythonAbstract isAbstract' = concat [ genPythonBoolean "isAbstract" isAbstract']
 
 genPythonGCard :: IGCard -> String
-genPythonGCard (IGCard isKeyword' interval') = concat 
-		[ "groupCard = GCard.GCard(", genPythonBoolean "isKeyword" isKeyword', ", " 
+genPythonGCard (IGCard isKeyword' interval') = concat
+		[ "groupCard = GCard.GCard(", genPythonBoolean "isKeyword" isKeyword', ", "
     	, "interval=" , genPythonInterval interval' , ")"]
 
 genPythonInterval :: (Integer, Integer) -> String
 genPythonInterval (nMin, nMax) = concat
-  [ "(", genPythonInteger nMin 
+  [ "(", genPythonInteger nMin
   , ",", genPythonInteger nMax
   , ")"]
 
@@ -128,12 +132,27 @@
 genPythonUid :: String -> String
 genPythonUid uid' = concat [ "uid=\"", uid', "\""]
 
-genPythonSuper :: ISuper -> String
+genPythonParentUid :: String -> String
+genPythonParentUid uid' = concat [ "parentUid=\"", uid', "\""]
+
+genPythonSuper :: Maybe PExp -> String
 genPythonSuper x = case x of
-  ISuper isOverlapping' pexps' -> concat
-    [ "my_supers = Supers.Supers(", genPythonBoolean "isOverlapping" isOverlapping', ", elements=["
-    , concatMap (genPythonPExp "Super") pexps' , "])"]
+  Nothing                      -> ""
+  Just pexp' -> concat
+    [ "my_Super = "
+    , genPythonPExp "Super" pexp'
+    ]
 
+genPythonReference :: Maybe IReference -> String
+genPythonReference x = case x of
+  Nothing                        -> ""
+  Just (IReference isSet' pexp') -> concat
+    [ "my_Reference = Reference.Reference("
+    , genPythonBoolean "isSet" isSet'
+    , ", "
+    , genPythonPExp "Ref" pexp'
+    , ")" ]
+
 genPythonCard :: (Integer, Integer) -> String
 genPythonCard interval' = concat [ "card=" , genPythonInterval interval']
 
@@ -147,12 +166,12 @@
                          [ "##### constraint #####\n", "\tconstraint = IRConstraint.IRConstraint(" , genPythonBoolean "isHard" isHard' , " ,"
                          , " exp=", genPythonPExp "ParentExp" pexp' , ")\n"
                          , "\tstack[-1].addElement(constraint)\n"]
-  IEGoal isMaximize' pexp' -> concat 
+  IEGoal isMaximize' pexp' -> concat
                          [ "##### goal #####\n" ,"\tgoal = Goal.Goal(" , genPythonBoolean "isMaximize" isMaximize'
                          , ", exp=", genPythonPExp "ParentExp" pexp' , ")\n"
                          , "\tstack[-1].addElement(goal)\n"]
-                         
-                                                         
+
+
 {-genPythonAnyOp ft f xs = concatMap
   (\(tname, texp) -> tagType tname (ft texp) $ f texp) xs -}
 
@@ -162,9 +181,9 @@
   [ "\n\t\tExp.Exp","(expType=\"", tagName, "\", ", maybe "exptype=\"\"" genPythonIType iType'
   , ", parentId=\"", pid', "\""
   , ", " , genPythonPosition pos'
-  , ", iExpType=\"" , genPythonIExpType iexp' , "\"" 
+  , ", iExpType=\"" , genPythonIExpType iexp' , "\""
   , ", iExp=[" , genPythonIExp iexp' ,"])"]
-  
+
 genPythonPosition :: Span -> String
 genPythonPosition (Span (Pos s1 s2) (Pos e1 e2)) = concat
   [ "pos=(", genPythonIntPair (s1, s2), ", ", genPythonIntPair (e1, e2), ")"]
@@ -176,7 +195,7 @@
   IInt _ -> "IIntExp"
   IDouble _ -> "IDoubleExp"
   IStr _ -> "IStringExp"
-  IClaferId _ _ _ -> "IClaferId"
+  IClaferId _ _ _ _ -> "IClaferId"
 
 
 declHelper :: [IDecl] -> String
@@ -201,11 +220,12 @@
     escape x    = [x] -}
   IInt n -> genPythonInteger n
   IDouble n ->  concat [ "DoubleLiteral.DoubleLiteral(", show n, ")"] --DoubleLiteral
-  IStr str -> genPythonString str  
-  IClaferId modName' sident' isTop' -> concat
+  IStr str -> genPythonString str
+  IClaferId modName' sident' isTop' bind' -> concat
     [ "ClaferId.ClaferId(moduleName=\"", modName' , "\", "
     , "my_id=\"", sident' , "\", "
-    , genPythonBoolean "isTop" isTop', ")"]
+    , genPythonBoolean "isTop" isTop' , ", "
+    , "my_bind=\"", fromMaybe "" bind' , "\")"]
 
 
 genPythonDecl :: IDecl -> String
diff --git a/src/Language/Clafer/Generator/Schema.hs b/src/Language/Clafer/Generator/Schema.hs
--- a/src/Language/Clafer/Generator/Schema.hs
+++ b/src/Language/Clafer/Generator/Schema.hs
@@ -47,11 +47,12 @@
   , "\n"
   , "  <!-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->\n"
   , "  <!--\n"
-  , "    data IType = TBoolean\n"
-  , "                 | TString\n"
-  , "                 | TInteger\n"
-  , "                 | TReal\n"
-  , "                 | TClafer\n"
+  , "data IType\n"
+  , "  = TBoolean\n"
+  , "  | TString\n"
+  , "  | TInteger\n"
+  , "  | TReal\n"
+  , "  | TClafer [UID]\n"
   , "  -->\n"
   , "  <xs:complexType name=\"IType\" abstract=\"true\"/>\n"
   , "  <xs:element name=\"Type\" type=\"cl:IType\"/>\n"
@@ -73,7 +74,7 @@
   , "          <xs:extension base=\"cl:IType\"/>\n"
   , "      </xs:complexContent>\n"
   , "  </xs:complexType>\n"
-  , "  \n"
+  , "\n"
   , "  <xs:complexType name=\"IReal\">\n"
   , "      <xs:complexContent>\n"
   , "          <xs:extension base=\"cl:IType\"/>\n"
@@ -87,9 +88,11 @@
   , "  </xs:complexType>\n"
   , "\n"
   , "  <!-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->\n"
-  , "  <!-- data IModule = IModule {\n"
-  , "      mName :: String,\n"
-  , "      mDecls :: [IElement]\n"
+  , "  <!--\n"
+  , "data IModule\n"
+  , "  = IModule\n"
+  , "    { _mName :: String\n"
+  , "    , _mDecls :: [IElement]\n"
   , "    }\n"
   , "  -->\n"
   , "\n"
@@ -103,17 +106,20 @@
   , "  <xs:element name=\"Module\" type=\"cl:IModule\"/>\n"
   , "\n"
   , "  <!-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->\n"
-  , "  <!-- data IClafer =\n"
-  , "       IClafer {\n"
-  , "          isAbstract :: Bool,     - determines whether it's abstract\n"
-  , "          gcard :: Maybe IGCard,  - group cardinality\n"
-  , "          ident :: String,        - name\n"
-  , "          uid :: String,          - (o) unique identifier\n"
-  , "          super:: ISuper,         - superclafers\n"
-  , "          card :: Maybe Interval, - cardinality\n"
-  , "          glCard :: Interval,     - (o) global cardinality\n"
-  , "          elements :: [IElement]  - subclafers or constraints specified in the context of given clafer\n"
-  , "        }\n"
+  , "  <!--\n"
+  , "data IClafer\n"
+  , "  = IClafer\n"
+  , "    { _cinPos :: Span\n"
+  , "    , _isAbstract :: Bool\n"
+  , "    , _gcard :: Maybe IGCard\n"
+  , "    , _ident :: CName\n"
+  , "    , _uid :: UID\n"
+  , " , _parentUID :: UID\n"
+  , "    , _super:: ISuper\n"
+  , "    , _card :: Maybe Interval\n"
+  , "    , _glCard :: Interval\n"
+  , "    , _elements :: [IElement]\n"
+  , "    }\n"
   , "  -->\n"
   , "  <xs:complexType name=\"IClafer\">\n"
   , "      <xs:complexContent>\n"
@@ -143,6 +149,7 @@
   , "                <xs:element name=\"GroupCard\"  type=\"cl:IGroupCard\" minOccurs=\"0\" maxOccurs=\"1\"/>\n"
   , "                <xs:element name=\"Id\"         type=\"xs:string\"/>\n"
   , "                <xs:element name=\"UniqueId\"   type=\"xs:string\"/>\n"
+  , "                <xs:element name=\"ParentUniqueId\" type=\"xs:string\"/>\n"
   , "                <xs:element name=\"Supers\"     type=\"cl:ISuper\"/>\n"
   , "                <xs:element name=\"Card\"       type=\"cl:IInterval\" minOccurs=\"0\" maxOccurs=\"1\"/>\n"
   , "                <xs:element name=\"GlobalCard\" type=\"cl:IInterval\"/>\n"
@@ -153,16 +160,20 @@
   , "  </xs:complexType>\n"
   , "\n"
   , "  <!-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->\n"
-  , "  <!-- data IElement =\n"
-  , "       IEClafer IClafer\n"
-  , "     | IEConstraint {\n"
-  , "          isHard :: Bool,\n"
-  , "          cpexp :: PExp\n"
-  , "        }\n"
-  , "     | IEGoal {\n"
-  , "       isMaximize :: Bool,\n"
-  , "       cpexp :: PExp\n"
-  , "       }\n"
+  , "  <!--\n"
+  , "data IElement\n"
+  , "  = IEClafer\n"
+  , "    { _iClafer :: IClafer\n"
+  , "    }\n"
+  , "  | IEConstraint\n"
+  , "    { _isHard :: Bool\n"
+  , "    , _cpexp :: PExp\n"
+  , "    }\n"
+  , "  -- | Goal (optimization objective)\n"
+  , "  | IEGoal\n"
+  , "    { _isMaximize :: Bool\n"
+  , "    , _cpexp :: PExp\n"
+  , "    }\n"
   , "   -->\n"
   , "\n"
   , "  <xs:complexType name=\"IElement\" abstract=\"true\"/>\n"
@@ -197,11 +208,12 @@
   , "  </xs:complexType>\n"
   , "\n"
   , "  <!-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->\n"
-  , "  <!-- data ISuper =\n"
-  , "       ISuper {\n"
-  , "          isOverlapping :: Bool,\n"
-  , "          supers :: [PExp]\n"
-  , "        }\n"
+  , "  <!--\n"
+  , "data ISuper\n"
+  , "  = ISuper\n"
+  , "    { _isOverlapping :: Bool\n"
+  , "    , _supers :: [PExp]\n"
+  , "    }\n"
   , "  -->\n"
   , "  <xs:complexType name=\"ISuper\">\n"
   , "    <xs:sequence>\n"
@@ -211,11 +223,12 @@
   , "  </xs:complexType>\n"
   , "\n"
   , "  <!-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->\n"
-  , "  <!-- data IGCard =\n"
-  , "      IGCard {\n"
-  , "          isKeyword :: Bool,\n"
-  , "          interval :: Interval\n"
-  , "        }\n"
+  , "  <!--\n"
+  , "data IGCard\n"
+  , "  = IGCard\n"
+  , "    { _isKeyword :: Bool\n"
+  , "    , _interval :: Interval\n"
+  , "    }\n"
   , "  -->\n"
   , "\n"
   , "  <xs:complexType name=\"IGroupCard\">\n"
@@ -248,10 +261,13 @@
   , "  </xs:complexType>\n"
   , "\n"
   , "  <!-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->\n"
-  , "  <!-- data PExp = PExp {\n"
-  , "      iType :: Maybe IType,\n"
-  , "      pid :: String,\n"
-  , "      exp :: IExp\n"
+  , "  <!--\n"
+  , "data PExp\n"
+  , "  = PExp\n"
+  , "    { _iType :: Maybe IType\n"
+  , "    , _pid :: String\n"
+  , "    , _inPos :: Span\n"
+  , "    , _exp :: IExp\n"
   , "    }\n"
   , "  -->\n"
   , "\n"
@@ -286,18 +302,31 @@
   , "\n"
   , "  <!-- ......................................................................-->\n"
   , "  <!--\n"
-  , "    data IExp =\n"
-  , "       - quantified expression  declarations\n"
-  , "       IDeclPExp {quant :: IQuant, oDecls :: [IDecl], bpexp :: PExp}\n"
-  , "     | IFunExp {op :: String, exps :: [PExp]}\n"
-  , "     | IInt Integer                  - integer number\n"
-  , "     | IDouble Double                - real number\n"
-  , "     | IStr String                   - string\n"
-  , "     | IClaferId {                   - clafer name\n"
-  , "          modName :: String,         - module name\n"
-  , "          sident :: String,          - name\n"
-  , "          isTop :: Bool              - identifier refers to a top-level definition\n"
-  , "        }\n"
+  , "data IExp\n"
+  , "  = IDeclPExp\n"
+  , "    { _quant :: IQuant\n"
+  , "    , _oDecls :: [IDecl]\n"
+  , "    , _bpexp :: PExp\n"
+  , "    }\n"
+  , "  | IFunExp\n"
+  , "    { _op :: String\n"
+  , "    , _exps :: [PExp]\n"
+  , "    }\n"
+  , "  | IInt\n"
+  , "    { _iint :: Integer\n"
+  , "    }\n"
+  , "  | IDouble\n"
+  , "    { _idouble :: Double\n"
+  , "    }\n"
+  , "  | IStr\n"
+  , "    { _istr :: String\n"
+  , "    }\n"
+  , "  | IClaferId\n"
+  , "    { _modName :: String\n"
+  , "    , _sident :: CName\n"
+  , "    , _isTop :: Bool\n"
+  , "    , _binding :: ClaferBinding\n"
+  , "    }\n"
   , "   -->\n"
   , "  <xs:complexType name=\"IExp\" abstract=\"true\"/>\n"
   , "\n"
@@ -362,18 +391,20 @@
   , "                  <xs:element name=\"ModuleName\" type=\"xs:string\" minOccurs=\"0\" maxOccurs=\"1\"/>\n"
   , "                  <xs:element name=\"Id\"         type=\"xs:string\" />\n"
   , "                  <xs:element name=\"IsTop\"      type=\"xs:boolean\"/>\n"
+  , "                  <xs:element name=\"Bind\"       type=\"xs:string\" />\n"
   , "              </xs:sequence>\n"
   , "          </xs:extension>\n"
   , "      </xs:complexContent>\n"
   , "  </xs:complexType>\n"
   , "\n"
   , "  <!-- ......................................................................-->\n"
-  , "  <!-- data IDecl =\n"
-  , "       IDecl {\n"
-  , "          isDisj :: Bool,     - is disjunct\n"
-  , "          decls :: [String],  - a list of local names\n"
-  , "          body :: PExp        - set to which local names refer to\n"
-  , "        }\n"
+  , "  <!--\n"
+  , "data IDecl\n"
+  , "  = IDecl\n"
+  , "    { _isDisj :: Bool    -- ^ is disjunct\n"
+  , "    , _decls :: [CName]  -- ^ a list of local names\n"
+  , "    , _body :: PExp      -- ^ set to which local names refer to\n"
+  , "    }\n"
   , "    -->\n"
   , "\n"
   , "   <xs:complexType name=\"IDeclaration\">\n"
@@ -385,12 +416,13 @@
   , "   </xs:complexType>\n"
   , "\n"
   , "  <!-- ......................................................................-->\n"
-  , "  <!-- data IQuant =\n"
-  , "        INo\n"
-  , "        | ILone\n"
-  , "        | IOne\n"
-  , "        | ISome\n"
-  , "        | IAll\n"
+  , "  <!--\n"
+  , "data IQuant\n"
+  , "  = INo\n"
+  , "  | ILone\n"
+  , "  | IOne\n"
+  , "  | ISome\n"
+  , "  | IAll\n"
   , "   -->\n"
   , "\n"
   , "   <xs:complexType name=\"IQuantifier\" abstract=\"true\"/>\n"
diff --git a/src/Language/Clafer/Generator/Stats.hs b/src/Language/Clafer/Generator/Stats.hs
--- a/src/Language/Clafer/Generator/Stats.hs
+++ b/src/Language/Clafer/Generator/Stats.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-
- Copyright (C) 2012 Kacper Bak <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012 Kacper Bak, Michal Antkiewicz <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
@@ -23,6 +23,8 @@
 module Language.Clafer.Generator.Stats where
 
 import Control.Monad.State
+import Data.Maybe (isJust)
+
 import Language.Clafer.Intermediate.Intclafer
 
 data Stats = Stats {
@@ -42,11 +44,11 @@
 statsClafer :: MonadState Stats m => IClafer -> m ()
 statsClafer claf = do
   if _isAbstract claf
-    then modify (\e -> e {naClafers = naClafers e + 1})
-    else
-      if _isOverlapping $ _super claf
-        then modify (\e -> e {nrClafers = nrClafers e + 1})
-        else modify (\e -> e {ncClafers = ncClafers e + 1})
+  then modify (\e -> e {naClafers = naClafers e + 1})
+  else modify (\e -> e {ncClafers = ncClafers e + 1})
+
+  when (isJust $ _reference claf) $
+    modify (\e -> e {nrClafers = nrClafers e + 1})
   sglCard' <- gets sglCard
   modify (\e -> e {sglCard = statsCard sglCard' $ _glCard claf})
   mapM_ statsElement $ _elements claf
@@ -61,4 +63,4 @@
 statsElement x = case x of
   IEClafer clafer -> statsClafer clafer
   IEConstraint _ _ -> modify (\e -> e {nConstraints = nConstraints e + 1})
-  IEGoal _ _ -> modify (\e -> e {nGoals = nGoals e + 1})
+  IEGoal _ _ -> modify (\e -> e {nGoals = nGoals e + 1})
diff --git a/src/Language/Clafer/Generator/Xml.hs b/src/Language/Clafer/Generator/Xml.hs
--- a/src/Language/Clafer/Generator/Xml.hs
+++ b/src/Language/Clafer/Generator/Xml.hs
@@ -24,6 +24,8 @@
 
 -- import Text.XML.HaXml.XmlContent.Haskell hiding (Result)
 
+import Data.Maybe (fromMaybe)
+
 import Language.Clafer.Common
 import Language.Clafer.Front.Absclafer
 import Language.Clafer.Intermediate.Intclafer
@@ -71,13 +73,15 @@
 
 genXmlClafer :: IClafer -> Result
 genXmlClafer x = case x of
-  IClafer pos abstract gcrd id' uid' super' crd glcard es  ->
+  IClafer pos abstract gcrd id' uid' puid' super' reference' crd glcard es  ->
     concat [ tag "Position" $ genXmlPosition pos
            , genXmlAbstract abstract
            , optTag gcrd genXmlGCard
            , genXmlId id'
            , genXmlUid uid'
+           , genXmlParentUid puid'
            , genXmlSuper super'
+           , genXmlReference reference'
            , optTag crd genXmlCard
            , genXmlGlCard glcard
            , concatMap genXmlElement es]
@@ -101,12 +105,21 @@
 genXmlUid :: String -> String
 genXmlUid uid' = tag "UniqueId" uid'
 
-genXmlSuper :: ISuper -> String
+genXmlParentUid :: String -> String
+genXmlParentUid uid' = tag "ParentUniqueId" uid'
+
+genXmlSuper :: Maybe PExp -> String
 genXmlSuper x = case x of
-  ISuper isOverlapping' pexps -> tag "Supers" $ concat
-    [ genXmlBoolean "IsOverlapping" isOverlapping'
-    , concatMap (genXmlPExp "Super") pexps]
+  Nothing                 -> ""
+  Just pexp' -> genXmlPExp "Super" pexp'
 
+genXmlReference :: Maybe IReference -> String
+genXmlReference x = case x of
+  Nothing                 -> ""
+  Just (IReference isSet' pexp') -> tag "Reference" $ concat
+    [ genXmlBoolean "IsSet" isSet'
+    , genXmlPExp "Ref" pexp']
+
 genXmlCard :: (Integer, Integer) -> String
 genXmlCard interval' = tag "Card" $ genXmlInterval interval'
 
@@ -119,12 +132,12 @@
   IEConstraint isHard' pexp  -> tagType "Declaration" "IConstraint" $ concat
                          [ genXmlBoolean "IsHard" isHard'
                          , genXmlPExp "ParentExp" pexp]
-  IEGoal isMaximize' pexp -> tagType "Declaration" "IGoal" $ concat 
+  IEGoal isMaximize' pexp -> tagType "Declaration" "IGoal" $ concat
                          [ genXmlBoolean "IsMaximize" isMaximize'
                          , genXmlPExp "ParentExp" pexp]
-                         
 
-genXmlAnyOp :: (a -> String) -> (a -> String) -> [(String, a)] -> String                                                    
+
+genXmlAnyOp :: (a -> String) -> (a -> String) -> [(String, a)] -> String
 genXmlAnyOp ft f xs = concatMap
   (\(tname, texp) -> tagType tname (ft texp) $ f texp) xs
 
@@ -147,7 +160,7 @@
   IInt _ -> "IIntExp"
   IDouble _ -> "IDoubleExp"
   IStr _ -> "IStringExp"
-  IClaferId _ _ _ -> "IClaferId"
+  IClaferId _ _ _ _ -> "IClaferId"
 
 genXmlIExp :: IExp -> String
 genXmlIExp x = case x of
@@ -167,11 +180,12 @@
     escape y    = [y]
   IInt n -> genXmlInteger n
   IDouble n -> tag "DoubleLiteral" $ show n
-  IStr str -> genXmlString str  
-  IClaferId modName' sident' isTop' -> concat
+  IStr str -> genXmlString str
+  IClaferId modName' sident' isTop' bind' -> concat
     [ tag "ModuleName" modName'
     , tag "Id" sident'
-    , genXmlBoolean "IsTop" isTop']
+    , genXmlBoolean "IsTop" isTop'
+    , tag "Bind" $ fromMaybe "" bind' ]
 
 genXmlDecl :: IDecl -> String
 genXmlDecl (IDecl disj locids pexp) = tag "Declaration" $ concat
diff --git a/src/Language/Clafer/Intermediate/Analysis.hs b/src/Language/Clafer/Intermediate/Analysis.hs
--- a/src/Language/Clafer/Intermediate/Analysis.hs
+++ b/src/Language/Clafer/Intermediate/Analysis.hs
@@ -31,6 +31,8 @@
 import qualified Language.Clafer.Intermediate.Intclafer as I
 import Language.Clafer.Intermediate.Desugarer
 import Language.Clafer.Front.Printclafer
+import Language.Clafer.Common
+
 import Control.Applicative
 import Control.Monad.LPMonad.Supply
 import Control.Monad.Error
@@ -48,27 +50,27 @@
 
 newtype AnalysisT m a = AnalysisT (ReaderT Info m a)
   deriving (Monad, Functor, MonadReader Info, MonadState s, MonadTrans, MonadPlus, MonadError e, Applicative, Alternative)
-  
+
 type Analysis = AnalysisT Identity
 
 class (Monad m, Functor m) => MonadAnalysis m where
   clafers :: m [SClafer]
   withClafers :: [SClafer] -> m a -> m a
-  
+
 withExtraClafers :: MonadAnalysis m => [SClafer] -> m a -> m a
 withExtraClafers cs a =
     do
         c <- clafers
         withClafers (cs ++ c) a
-  
+
 instance (Monad m, Functor m) => MonadAnalysis (AnalysisT m) where
   clafers = AnalysisT $ asks sclafers
   withClafers cs = local (const $ Info cs)
-    
+
 instance (Error e, MonadAnalysis m) => MonadAnalysis (ErrorT e m) where
   clafers = lift clafers
   withClafers = mapErrorT . withClafers
-  
+
 instance MonadAnalysis m => MonadAnalysis (ListT m) where
   clafers = lift clafers
   withClafers = mapListT . withClafers
@@ -84,27 +86,26 @@
 instance (Monoid w, MonadAnalysis m) => MonadAnalysis (WriterT w m) where
   clafers = lift clafers
   withClafers = mapWriterT . withClafers
-  
+
 instance MonadAnalysis m => MonadAnalysis (VSupplyT m) where
   clafers = lift clafers
   withClafers = mapVSupplyT . withClafers
-  
+
 isConcrete :: SClafer -> Bool
 isConcrete = not . isAbstract
 
 isBase :: SClafer -> Bool
-isBase = (`elem` ["clafer", "string", "real", "int", "integer", "boolean"]) . uid
+isBase = (`elem` (baseClafer : primitiveTypes)) . uid
 
 isDerived :: SClafer -> Bool
 isDerived = not . isBase
- 
 
-data SSuper = Ref String | Colon String deriving Show
+
 -- | Easier to work with. IClafers have links from parents to children. SClafers have links from children to parent.
-data SClafer = SClafer {uid::String, origUid::String, isAbstract::Bool, low::Integer, high::Integer, groupLow::Integer, groupHigh::Integer, parent::Maybe String, super::Maybe SSuper, constraints::[I.PExp]} deriving Show
-  
-data Info = Info{sclafers :: [SClafer]} deriving Show 
+data SClafer = SClafer {uid::String, origUid::String, isAbstract::Bool, low::Integer, high::Integer, groupLow::Integer, groupHigh::Integer, parent::Maybe String, super::Maybe String, reference::Maybe String, constraints::[I.PExp]} deriving Show
 
+data Info = Info{sclafers :: [SClafer]} deriving Show
+
 runAnalysis :: Analysis a -> Info -> a
 runAnalysis r info = runIdentity $ runAnalysisT r info
 
@@ -118,13 +119,13 @@
     case find ((==) u . uid) c of
       Just c' -> return c'
       Nothing -> error $ "claferWithUid: Unknown uid " ++ u
-      
+
 parentUid :: Monad m => SClafer -> m String
 parentUid clafer =
   case parent clafer of
     Just p  -> return p
     Nothing -> fail $ "No parent uid for " ++ show clafer
-    
+
 parentOf :: (Uidable c, MonadAnalysis m) => c -> m c
 parentOf clafer = fromUid =<< parentUid =<< toClafer clafer
 
@@ -156,14 +157,14 @@
 topNonRootAncestor clafer =
   do
     uid' <- toUid clafer
-    when (uid' == rootUid) $ error "Root does not have a non root ancestor."
+    when (uid' == rootIdent) $ error "Root does not have a non root ancestor."
     (head . tail . reverse) <$> ancestorsOf clafer
 
 refUid :: Monad m => SClafer -> m String
 refUid clafer =
-  case super clafer of
-    Just (Ref u)  -> return u
-    _             -> fail $ "No ref uid for " ++ show clafer
+  case reference clafer of
+    Just u  -> return u
+    _       -> fail $ "No ref uid for " ++ show clafer
 
 refOf :: (Uidable c, MonadAnalysis m) => c -> m c
 refOf clafer = fromUid =<< refUid =<< toClafer clafer
@@ -181,8 +182,8 @@
   do
     clafer <- toClafer c
     case super clafer of
-      Just (Colon u)  -> return u
-      _               -> fail $ "No colon uid for " ++ show clafer
+      Just u -> return u
+      _      -> fail $ "No colon uid for " ++ show clafer
 
 colonOf :: (Uidable c, MonadAnalysis m) => c -> m c
 colonOf clafer = fromUid =<< colonUid =<< toClafer clafer
@@ -202,8 +203,8 @@
         (sub, _) <- foreach $ anything |: clafer
         fromClafer =<< (return sub `mplus` foreach ( colonsTo sub))
 
-    
 
+
 hierarchy :: (Uidable c, MonadAnalysis m) => c -> m [c]
 hierarchy t = (t :) <$> colonsOf t
 
@@ -215,7 +216,7 @@
  -}
 isDirectChild :: (Uidable c, MonadAnalysis m) => c -> c -> m Bool
 isDirectChild c p = (not . null) <$> (c |^ p)
- 
+
 {-
  - C is an direct child of B.
  -
@@ -235,19 +236,19 @@
 isChild :: (Uidable c, MonadAnalysis m) => c -> c -> m Bool
 isChild child parent =
   liftM2 (||) (isDirectChild child parent) (isIndirectChild child parent)
-  
+
 class Matchable c => Uidable c where
   toClafer :: MonadAnalysis m => c -> m SClafer
   fromClafer :: MonadAnalysis m => SClafer -> m c
   toUid :: MonadAnalysis m => c -> m String
   fromUid :: MonadAnalysis m => String -> m c
-  
+
 instance Uidable SClafer where
   toClafer = return
   fromClafer = return
   toUid = return . uid
   fromUid = claferWithUid
-  
+
 instance Uidable String where
   toClafer = claferWithUid
   fromClafer = return . uid
@@ -258,13 +259,13 @@
 
 class Matchable u where
   matches :: u -> SClafer -> Bool
-  
+
 instance Matchable String where
   matches s c = s == uid c
-  
+
 instance Matchable Anything where
   matches _ _ = True
-  
+
 instance Matchable SClafer where
   matches c1 c2 = uid c1 == uid c2
 
@@ -279,16 +280,16 @@
     guard $ matches lower clafer
     parent <- parentOf clafer
     guard $ matches upper parent
-    return (clafer , parent) 
+    return (clafer , parent)
 
--- a -> b    
+-- a -> b
 (|->) :: (MonadAnalysis m, Matchable a, Matchable b) => a -> b -> m [(SClafer, SClafer)]
 lower |-> upper = runListT $ do
     clafer <- foreach clafers
     guard $ matches lower clafer
     super  <- refOf clafer
     guard $ matches upper super
-    return (clafer, super) 
+    return (clafer, super)
 
 -- a : b
 (|:) :: (MonadAnalysis m, Matchable a, Matchable b) => a -> b -> m [(SClafer, SClafer)]
@@ -297,7 +298,7 @@
     guard $ matches lower clafer
     super  <- colonOf clafer
     guard $ matches upper super
-    return (clafer, super) 
+    return (clafer, super)
 
 -- constraints under
 constraintsUnder :: (MonadAnalysis m, Matchable a) => a -> m [(SClafer, I.PExp)]
@@ -306,30 +307,25 @@
     clafers' <- filter (matches under) <$> clafers
     return [(clafer, constraint) | clafer <- clafers', constraint <- constraints clafer]
 
-
-rootUid :: String
-rootUid = "_root"
-
-
 -- Converts IClafer to SClafer
 convertClafer :: I.IClafer -> [SClafer]
-convertClafer = 
+convertClafer =
   convertClafer' Nothing
   where
   convertElement' parent (I.IEClafer clafer) = Just $ Left $ convertClafer' parent clafer
   convertElement' _ (I.IEConstraint _ pexp)   = Just $ Right $ pexp
   convertElement' _ _ = Nothing
-  
+
   convertClafer' parent clafer =
     sclafer : concat children
     where
     sclafer
       | maybe 1 groupLow parent == 0 && maybe 1 groupHigh parent /= -1 =
-          SClafer (I._uid clafer) (I._uid clafer) (I._isAbstract clafer) 1   high gLow gHigh (uid <$> parent) super constraints
+          SClafer (I._uid clafer) (I._uid clafer) (I._isAbstract clafer) 1   high gLow gHigh (uid <$> parent) super reference constraints
       | otherwise =
-          SClafer (I._uid clafer) (I._uid clafer) (I._isAbstract clafer) low high gLow gHigh (uid <$> parent) super constraints
+          SClafer (I._uid clafer) (I._uid clafer) (I._isAbstract clafer) low high gLow gHigh (uid <$> parent) super reference constraints
     (children, constraints) = partitionEithers $ mapMaybe (convertElement' $ Just $ sclafer) (I._elements clafer)
-    
+
     Just (low, high) = I._card clafer
     (gLow, gHigh) =
       case I._gcard clafer of
@@ -339,30 +335,30 @@
         Just (I.IGCard _ i)    -> i
     super =
       case I._super clafer of
-        I.ISuper True [I.PExp{I._exp = I.IClaferId{I._sident = superUid}}]  -> Just $ Ref superUid
-        I.ISuper False [I.PExp{I._exp = I.IClaferId{I._sident = superUid}}] ->
-          if superUid `elem` ["string", "real", "int", "integer", "boolean"]
-            then Just $ Ref superUid
-            else Just $ Colon superUid
+        Just (I.PExp{I._exp = I.IClaferId{I._sident = superUid}})  -> Just superUid
         _ -> Nothing
+    reference =
+      case I._reference clafer of
+        Just (I.IReference _ I.PExp{I._exp = I.IClaferId{I._sident = refUid'}})  -> Just refUid'
+        _ -> Nothing
 
 gatherInfo :: I.IModule -> Info
 gatherInfo imodule =
   Info $ sClafer : sInteger : sInt : sReal : sString : sBoolean : convertClafer root
   where
-  sClafer = SClafer "clafer" "clafer" False 0 (-1) 0 (-1) Nothing Nothing []
-  sInteger = SClafer "integer" "integer" False 0 (-1) 0 (-1) Nothing Nothing []
-  sInt     = SClafer "int" "int" False 0 (-1) 0 (-1) Nothing Nothing []
-  sReal    = SClafer "real" "real" False 0 (-1) 0 (-1) Nothing Nothing []
-  sString  = SClafer "string" "string" False 0 (-1) 0 (-1) Nothing Nothing []
-  sBoolean = SClafer "boolean" "boolean" False 0 (-1) 0 (-1) Nothing Nothing []
-  
-  root = I.IClafer noSpan False Nothing rootUid rootUid (I.ISuper False [I.PExp Nothing "" noSpan $ I.IClaferId "clafer" "clafer" True]) (Just (1, 1)) (0, 0) $ I._mDecls imodule
+  sClafer = SClafer baseClafer baseClafer False 0 (-1) 0 (-1) Nothing Nothing Nothing []
+  sInteger = SClafer integerType integerType False 0 (-1) 0 (-1) Nothing Nothing Nothing []
+  sInt     = SClafer "int" "int" False 0 (-1) 0 (-1) Nothing Nothing Nothing []
+  sReal    = SClafer realType realType False 0 (-1) 0 (-1) Nothing Nothing Nothing []
+  sString  = SClafer stringType stringType False 0 (-1) 0 (-1) Nothing Nothing Nothing []
+  sBoolean = SClafer booleanType booleanType False 0 (-1) 0 (-1) Nothing Nothing Nothing []
 
+  root = I.IClafer noSpan False Nothing rootIdent rootIdent "" Nothing Nothing (Just (1, 1)) (0, 0) $ I._mDecls imodule
 
 
 
 
+
 {-
  -
  - Utility functions
@@ -373,7 +369,7 @@
 
 liftList :: Monad m => [a] -> ListT m a
 liftList = ListT . return
- 
+
 runListT_ :: Monad m => ListT m a -> m ()
 runListT_ l = runListT l >> return ()
 
diff --git a/src/Language/Clafer/Intermediate/Desugarer.hs b/src/Language/Clafer/Intermediate/Desugarer.hs
--- a/src/Language/Clafer/Intermediate/Desugarer.hs
+++ b/src/Language/Clafer/Intermediate/Desugarer.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE RankNTypes #-}
 {-
- Copyright (C) 2012 Kacper Bak, Jimmy Liang <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2014 Kacper Bak, Jimmy Liang, Michal Antkiewicz, Paulius Juodisius <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
@@ -20,39 +20,51 @@
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  SOFTWARE.
 -}
-{- | Transforms an Abstract Syntax Tree (AST) from "Language.Clafer.Front.Absclafer" 
+{- | Transforms an Abstract Syntax Tree (AST) from "Language.Clafer.Front.Absclafer"
 into Intermediate representation (IR) from "Language.Clafer.Intermediate.Intclafer" of a Clafer model.
 -}
 module Language.Clafer.Intermediate.Desugarer where
 
 import Language.Clafer.Common
+import Data.Maybe (fromMaybe)
 import Language.Clafer.Front.Absclafer
 import Language.Clafer.Intermediate.Intclafer
 
 -- | Transform the AST into the intermediate representation (IR)
-desugarModule :: Module -> IModule
-desugarModule (Module _ declarations) = IModule "" $
-      declarations >>= desugarEnums >>= desugarDeclaration
---      [ImoduleFragment $ declarations >>= desugarEnums >>= desugarDeclaration]
+desugarModule :: Maybe String -> Module -> IModule
+desugarModule mURL (Module _ declarations) = IModule
+  (fromMaybe "" mURL)
+  (declarations >>= desugarEnums >>= desugarDeclaration)
 
 sugarModule :: IModule -> Module
 sugarModule x = Module noSpan $ map sugarDeclaration $ _mDecls x -- (fragments x >>= mDecls)
 
 -- | desugars enumeration to abstract and global singleton features
 desugarEnums :: Declaration -> [Declaration]
-desugarEnums (EnumDecl s id' enumids) = (absEnum s) : map (mkEnum s) enumids
+desugarEnums (EnumDecl (Span p1 p2) id' enumids) = absEnum : map mkEnum enumids
     where
-    oneToOne = (CardInterval noSpan $ NCard noSpan (PosInteger ((0,0), "1")) (ExIntegerNum noSpan $ PosInteger ((0,0), "1")))
-    absEnum s1 = ElementDecl s1 $ Subclafer s1 $ Clafer s1 (Abstract s1) (GCardEmpty s1) id' (SuperEmpty s1) (CardEmpty s1) (InitEmpty s1) (ElementsList s1 [])
-    mkEnum s2 (EnumIdIdent _ eId) = ElementDecl s2 $ 
-                                   Subclafer s2 $ 
-                                   Clafer s2 (AbstractEmpty s2) (GCardEmpty s2) eId ((SuperSome s2) (SuperColon s2) (ClaferId s2 $ Path s2 [ModIdIdent s2 id'])) oneToOne (InitEmpty s2) (ElementsList s2 [])
+    p2' = case enumids of
+      -- the abstract enum clafer should end before the first literal begins
+      ((EnumIdIdent (Span (Pos y' x') _) _):_) -> Pos y' (x'-3) -- cutting the ' = '
+      [] -> p2 -- should never happen - cannot have enum without any literals. Return the original end pos.
+    oneToOne pos' = (CardInterval noSpan $
+                  NCard noSpan (PosInteger (pos', "1")) (ExIntegerNum noSpan $ PosInteger (pos', "1")))
+    absEnum = let
+        s1 = Span p1 p2'
+      in
+        ElementDecl s1 $
+          Subclafer s1 $
+            Clafer s1 (Abstract s1) (GCardEmpty s1) id' (SuperEmpty s1) (ReferenceEmpty s1) (CardEmpty s1) (InitEmpty s1) (ElementsList s1 [])
+    mkEnum (EnumIdIdent s2 eId) = -- each concrete clafer must fit within the original span of the literal
+      ElementDecl s2 $
+        Subclafer s2 $
+          Clafer s2 (AbstractEmpty s2) (GCardEmpty s2) eId ((SuperSome s2) (ClaferId s2 $ Path s2 [ModIdIdent s2 id'])) (ReferenceEmpty s2) (oneToOne (0, 0)) (InitEmpty s2) (ElementsList s2 [])
 desugarEnums x = [x]
 
 
 desugarDeclaration :: Declaration -> [IElement]
 desugarDeclaration (ElementDecl _ element) = desugarElement element
-desugarDeclaration _ = error "desugared"
+desugarDeclaration _ = error "Desugarer.desugarDeclaration: enum declarations should have already been converted to clafers. BUG."
 
 
 sugarDeclaration :: IElement -> Declaration
@@ -65,36 +77,50 @@
 
 
 desugarClafer :: Clafer -> [IElement]
-desugarClafer (Clafer s abstract gcrd id' super' crd init' es)  = 
-    (IEClafer $ IClafer s (desugarAbstract abstract) (desugarGCard gcrd) (transIdent id')
-            "" (desugarSuper super') (desugarCard crd) (0, -1)
-            (desugarElements es)) : (desugarInit id' init')
+desugarClafer claf@(Clafer s abstract gcrd' id' super' reference' crd' init' elements') =
+  case (super', reference') of
+    (SuperSome ss setExp, ReferenceEmpty _) -> if isPrimitive $ getPExpClaferIdent setExp
+      then desugarClafer (Clafer s abstract gcrd' id' (SuperEmpty s) (ReferenceSet ss setExp) crd' init' elements')
+      else desugarClafer' claf
+    (SuperSome _ setExp, ReferenceSet _ _) -> if isPrimitive $ getPExpClaferIdent setExp
+      then error "Desugarer: cannot rewrite : with primitive type into -> because a reference is also present. Using : with primitive types is discouraged."
+      else desugarClafer' claf
+    (SuperSome _ setExp, ReferenceBag _ _) -> if isPrimitive $ getPExpClaferIdent setExp
+      then error "Desugarer: cannot rewrite : with primitive type into -> because a reference is also present. Using : with primitive types is discouraged."
+      else desugarClafer' claf
+    _ -> desugarClafer' claf
+    where
+      desugarClafer' claf@(Clafer s abstract gcrd' id' super' reference' crd' init' elements') =
+        (IEClafer $ IClafer s (desugarAbstract abstract) (desugarGCard gcrd') (transIdent id')
+            "" "" (desugarSuper super') (desugarReference reference') (desugarCard crd') (0, -1)
+            (desugarElements elements')) : (desugarInit id' init')
 
+getPExpClaferIdent :: SetExp -> String
+getPExpClaferIdent (ClaferId _ (Path _ [ (ModIdIdent _ (PosIdent (_, ident'))) ] )) = ident'
+getPExpClaferIdent _ = error "Desugarer:getPExpClaferIdent not given a ClaferId PExp"
 
 sugarClafer :: IClafer -> Clafer
-sugarClafer (IClafer s abstract gcard' _ uid' super' crd _ es) = 
+sugarClafer (IClafer s abstract gcard' _ uid' _ super' reference' crd' _ elements') =
     Clafer s (sugarAbstract abstract) (sugarGCard gcard') (mkIdent uid')
-      (sugarSuper super') (sugarCard crd) (InitEmpty s) (sugarElements es)
-
-
-desugarSuper :: Super -> ISuper
-desugarSuper (SuperEmpty s) =
-      ISuper False [PExp (Just $ TClafer []) "" s $ mkLClaferId baseClafer True]
-desugarSuper (SuperSome _ superhow setexp) =
-      ISuper (desugarSuperHow superhow) [desugarSetExp setexp]
+      (sugarSuper super') (sugarReference reference') (sugarCard crd') (InitEmpty s) (sugarElements elements')
 
 
-desugarSuperHow :: SuperHow -> Bool
-desugarSuperHow (SuperColon _) = False
-desugarSuperHow _  = True
+desugarSuper :: Super -> Maybe PExp
+desugarSuper (SuperEmpty _) = Nothing
+desugarSuper (SuperSome _ (ClaferId _ (Path _ [ (ModIdIdent _ (PosIdent (_, "clafer"))) ] ))) = Nothing
+desugarSuper (SuperSome _ setexp) = Just $ desugarSetExp setexp
 
+desugarReference :: Reference -> Maybe IReference
+desugarReference (ReferenceEmpty _) = Nothing
+desugarReference (ReferenceSet _ setexp) = Just $ IReference True $ desugarSetExp setexp
+desugarReference (ReferenceBag _ setexp) = Just $ IReference False $ desugarSetExp setexp
 
 desugarInit :: PosIdent -> Init -> [IElement]
 desugarInit _ (InitEmpty _) = []
 desugarInit id' (InitSome s inithow exp') = [ IEConstraint (desugarInitHow inithow) (pExpDefPid s implIExp) ]
-  where 
+  where
     cId :: PExp
-    cId = mkPLClaferId (snd $ getIdent id') False
+    cId = mkPLClaferId (snd $ getIdent id') False Nothing
     -- <id> = <exp'>
     assignIExp :: IExp
     assignIExp = (IFunExp "=" [cId, desugarExp exp'])
@@ -104,14 +130,14 @@
     getIdent (PosIdent y) = y
 
 desugarInitHow :: InitHow -> Bool
-desugarInitHow (InitHow_1 _) = True
-desugarInitHow (InitHow_2 _ )= False
+desugarInitHow (InitConstant _) = True
+desugarInitHow (InitDefault _ )= False
 
 
 desugarName :: Name -> IExp
 desugarName (Path _ path) =
       IClaferId (concatMap ((++ modSep).desugarModId) (init path))
-                (desugarModId $ last path) True
+                (desugarModId $ last path) True Nothing
 
 desugarModId :: ModId -> Result
 desugarModId (ModIdIdent _ id') = transIdent id'
@@ -119,19 +145,21 @@
 sugarModId :: String -> ModId
 sugarModId modid = ModIdIdent noSpan $ mkIdent modid
 
-sugarSuper :: ISuper -> Super
-sugarSuper (ISuper _ []) = SuperEmpty noSpan
-sugarSuper (ISuper isOverlapping' [pexp]) = SuperSome noSpan (sugarSuperHow isOverlapping') (sugarSetExp pexp)
-sugarSuper _ = error "Function sugarSuper from Desugarer expects an ISuper with a list of length one, but it was given one with a list larger than one" -- Should never happen
+sugarSuper :: Maybe PExp -> Super
+sugarSuper Nothing = SuperEmpty noSpan
+sugarSuper (Just pexp'@(PExp _ _ _ (IClaferId _ _ _ _))) = SuperSome noSpan (sugarSetExp pexp')
+sugarSuper (Just pexp') = error $ "Function sugarSuper from Desugarer expects a PExp (IClaferId) but instead was given: " ++ show pexp' -- Should never happen
 
-sugarSuperHow :: Bool -> SuperHow
-sugarSuperHow False = SuperColon noSpan
-sugarSuperHow True  = SuperMArrow noSpan
+sugarReference :: Maybe IReference -> Reference
+sugarReference Nothing = ReferenceEmpty noSpan
+sugarReference (Just (IReference True (pexp'@(PExp _ _ _ (IClaferId _ _ _ _))))) = ReferenceSet noSpan (sugarSetExp pexp')
+sugarReference (Just (IReference False (pexp'@(PExp _ _ _ (IClaferId _ _ _ _))))) = ReferenceBag noSpan (sugarSetExp pexp')
+sugarReference (Just (IReference _ pexp')) = error $ "Function sugarReference from Desugarer expects a IReference (PExp (IClaferId)) but instead was given: " ++ show pexp' -- Should never happen
 
 
 sugarInitHow :: Bool -> InitHow
-sugarInitHow True  = InitHow_1 noSpan
-sugarInitHow False = InitHow_2 noSpan
+sugarInitHow True  = InitConstant noSpan
+sugarInitHow False = InitDefault noSpan
 
 
 desugarConstraint :: Constraint -> PExp
@@ -176,18 +204,17 @@
 
 desugarElement :: Element -> [IElement]
 desugarElement x = case x of
-  Subclafer _ claf  ->
-      (desugarClafer claf) ++
-      (mkArrowConstraint claf >>= desugarElement)
+  Subclafer _ claf  -> (desugarClafer claf)
   ClaferUse s name crd es  -> desugarClafer $ Clafer s
       (AbstractEmpty s) (GCardEmpty s) (mkIdent $ _sident $ desugarName name)
-      ((SuperSome s) (SuperColon s) (ClaferId s name)) crd (InitEmpty s) es
+      (SuperSome s (ClaferId s name)) (ReferenceEmpty s) crd (InitEmpty s) es
   Subconstraint _ constraint  ->
       [IEConstraint True $ desugarConstraint constraint]
   Subsoftconstraint _ softconstraint ->
       [IEConstraint False $ desugarSoftConstraint softconstraint]
   Subgoal _ goal -> [IEGoal True $ desugarGoal goal]
 
+
 sugarElement :: IElement -> Element
 sugarElement x = case x of
   IEClafer claf  -> Subclafer noSpan $ sugarClafer claf
@@ -195,26 +222,6 @@
   IEConstraint False softconstraint -> Subsoftconstraint noSpan $ sugarSoftConstraint softconstraint
   IEGoal _ goal -> Subgoal noSpan $ sugarGoal goal
 
-mkArrowConstraint :: Clafer -> [Element]
-mkArrowConstraint (Clafer s _ _ ident' super' _ _ _) = 
-  if isSuperSomeArrow super' then  [Subconstraint s $
-       Constraint s [DeclAllDisj s
-       (Decl s [LocIdIdent s $ mkIdent "x", LocIdIdent s $ mkIdent "y"]
-             (ClaferId s $ Path s [ModIdIdent s ident']))
-       (ENeq s (ESetExp s $ Join s (ClaferId s $ Path s [ModIdIdent s $ mkIdent "x"])
-                             (ClaferId s $ Path s [ModIdIdent s $ mkIdent "ref"]))
-             (ESetExp s $ Join s (ClaferId s $ Path s [ModIdIdent s $ mkIdent "y"])
-                             (ClaferId s $ Path s [ModIdIdent s $ mkIdent "ref"])))]]
-  else []
-
-isSuperSomeArrow :: Super -> Bool
-isSuperSomeArrow (SuperSome _ arrow _) = isSuperArrow arrow
-isSuperSomeArrow _ = False
-
-isSuperArrow :: SuperHow -> Bool
-isSuperArrow (SuperArrow _) = True
-isSuperArrow _ = False
-
 desugarGCard :: GCard -> Maybe IGCard
 desugarGCard x = case x of
   GCardEmpty _  -> Nothing
@@ -298,9 +305,9 @@
   EDiv _ exp0 exp'  -> dop iDiv [exp0, exp']
   ECSetExp _ exp'   -> dop iCSet [exp']
   ESumSetExp _ exp' -> dop iSumSet [exp']
-  EMinExp _ exp'    -> dop iMin [exp']  
+  EMinExp _ exp'    -> dop iMin [exp']
   EGMax _ exp' -> dop iGMax [exp']
-  EGMin _ exp' -> dop iGMin [exp']  
+  EGMin _ exp' -> dop iGMin [exp']
   EInt _ n  -> IInt $ mkInteger n
   EDouble _ (PosDouble n) -> IDouble $ read $ snd n
   EStr _ (PosString str)  -> IStr $ snd str
@@ -310,7 +317,7 @@
   dpe = desugarPath.desugarExp
 
 desugarOp :: (a -> PExp) -> String -> [a] -> IExp
-desugarOp f op' exps' = 
+desugarOp f op' exps' =
     if (op' == iIfThenElse)
       then IFunExp op' $ (desugarPath $ head mappedList) : (map reducePExp $ tail mappedList)
       else IFunExp op' $ map (trans.f) exps'
@@ -340,7 +347,7 @@
 
 
 sugarExp :: PExp -> Exp
-sugarExp x = sugarExp' $ Language.Clafer.Intermediate.Intclafer._exp x
+sugarExp x = sugarExp' $ _exp x
 
 
 sugarExp' :: IExp -> Exp
@@ -364,7 +371,7 @@
   IInt n -> EInt noSpan $ PosInteger ((0, 0), show n)
   IDouble n -> EDouble noSpan $ PosDouble ((0, 0), show n)
   IStr str -> EStr noSpan $ PosString ((0, 0), str)
-  IClaferId _ _ _ -> ESetExp noSpan $ sugarSetExp' x
+  IClaferId _ _ _ _ -> ESetExp noSpan $ sugarSetExp' x
   _ -> error "Function sugarExp' from Desugarer was given an invalid argument" -- This should never happen
   where
   sugarUnOp op''
@@ -408,32 +415,32 @@
     where
     exps'' = map sugarSetExp exps'
     sugarOp op''
-      | op'' == iUnion         = Union noSpan 
-      | op'' == iDifference    = Difference noSpan 
-      | op'' == iIntersection  = Intersection noSpan 
-      | op'' == iDomain        = Domain noSpan 
-      | op'' == iRange         = Range noSpan 
-      | op'' == iJoin          = Join noSpan 
+      | op'' == iUnion         = Union noSpan
+      | op'' == iDifference    = Difference noSpan
+      | op'' == iIntersection  = Intersection noSpan
+      | op'' == iDomain        = Domain noSpan
+      | op'' == iRange         = Range noSpan
+      | op'' == iJoin          = Join noSpan
       | otherwise              = error "Invalid argument given to function sygarSetExp' in Desugarer"
-sugarSetExp' (IClaferId "" id' _) = ClaferId noSpan $ Path noSpan [ModIdIdent noSpan $ mkIdent id']
-sugarSetExp' (IClaferId modName' id' _) = ClaferId noSpan $ Path noSpan $ (sugarModId modName') : [sugarModId id']
+sugarSetExp' (IClaferId "" id' _ _) = ClaferId noSpan $ Path noSpan [ModIdIdent noSpan $ mkIdent id']
+sugarSetExp' (IClaferId modName' id' _ _) = ClaferId noSpan $ Path noSpan $ (sugarModId modName') : [sugarModId id']
 sugarSetExp' _ = error "IDecelPexp, IInt, IDobule, and IStr can not be sugared into a setExp!" --This should never happen
 
 desugarPath :: PExp -> PExp
 desugarPath (PExp iType' pid' pos' x) = reducePExp $ PExp iType' pid' pos' result
   where
   result
-    | isSet x     = IDeclPExp ISome [] (pExpDefPid pos' x)
-    | isNegSome x = IDeclPExp INo   [] $ _bpexp $ Language.Clafer.Intermediate.Intclafer._exp $ head $ _exps x
+    | isSetExp x     = IDeclPExp ISome [] (pExpDefPid pos' x)
+    | isNegSome x = IDeclPExp INo   [] $ _bpexp $ _exp $ head $ _exps x
     | otherwise   =  x
   isNegSome (IFunExp op' [PExp _ _ _ (IDeclPExp ISome [] _)]) = op' == iNot
   isNegSome _ = False
 
 
-isSet :: IExp -> Bool
-isSet (IClaferId _ _ _)  = True
-isSet (IFunExp op' _) = op' `elem` setBinOps
-isSet _ = False
+isSetExp :: IExp -> Bool
+isSetExp (IClaferId _ _ _ _)  = True
+isSetExp (IFunExp op' _) = op' `elem` setBinOps
+isSetExp _ = False
 
 
 -- reduce parent
@@ -444,14 +451,14 @@
 reduceIExp (IDeclPExp quant' decls' pexp) = IDeclPExp quant' decls' $ reducePExp pexp
 reduceIExp (IFunExp op' exps') = redNav $ IFunExp op' $ map redExps exps'
     where
-    (redNav, redExps) = if op' == iJoin then (reduceNav, id) else (id, reducePExp) 
+    (redNav, redExps) = if op' == iJoin then (reduceNav, id) else (id, reducePExp)
 reduceIExp x = x
 
 reduceNav :: IExp -> IExp
-reduceNav x@(IFunExp op' exps'@((PExp _ _ _ iexp@(IFunExp _ (pexp0:pexp:_))):pPexp:_)) = 
+reduceNav x@(IFunExp op' exps'@((PExp _ _ _ iexp@(IFunExp _ (pexp0:pexp:_))):pPexp:_)) =
   if op' == iJoin && isParent pPexp && isClaferName pexp
-  then reduceNav $ Language.Clafer.Intermediate.Intclafer._exp pexp0
-  else x{_exps = (head exps'){Language.Clafer.Intermediate.Intclafer._exp = reduceIExp iexp} :
+  then reduceNav $ _exp pexp0
+  else x{_exps = (head exps'){_exp = reduceIExp iexp} :
                 tail exps'}
 reduceNav x = x
 
diff --git a/src/Language/Clafer/Intermediate/GLPKScopeAnalyzer.hs b/src/Language/Clafer/Intermediate/GLPKScopeAnalyzer.hs
--- a/src/Language/Clafer/Intermediate/GLPKScopeAnalyzer.hs
+++ b/src/Language/Clafer/Intermediate/GLPKScopeAnalyzer.hs
@@ -27,6 +27,7 @@
 import qualified Language.Clafer.Intermediate.Intclafer as I
 import Language.Clafer.Intermediate.Analysis
 import Language.Clafer.Intermediate.ResolverType
+import Language.Clafer.Common
 
 import Control.Applicative (Applicative(..), (<$>))
 import Control.Monad
@@ -60,8 +61,8 @@
   where
   intScope = if bitwidth > 4 then return ("int", bitwidth) else fail "Bitwidth less than default."
   bitwidth = bitwidthAnalysis (constants ++ map snd scopes)
-  
-  scopes = 
+
+  scopes =
       removeZeroes $ removeRoot $ removeAux $
       -- unsafePerformIO should be safe (?)
       -- We aren't modifying any global state.
@@ -70,21 +71,21 @@
       case unsafePerformIO solution of
         (Success, Just (_, s)) -> Map.toList $ Map.map round s
         _ -> [] -- No solution
-  
+
   ((_, constants), analysis) = runScopeAnalysis run $ gatherInfo imodule
-  
+
   run =
     do
       setConstraints
       abstracts' <- clafers `suchThat` isAbstract
       constants' <- constantsAnalysis
       return (abstracts', constants')
-  
+
   solution = {-trace (show $ unsafePerformIO $ writeLP "TESTTT" analysis) $-} glpSolveVars mipDefaults{msgLev = MsgOff} $ analysis
   -- Any scope that is 0 will take the global scope of 1 instead.
   removeZeroes = filter ((/= 0) . snd)
   -- The root is implied and not and not part of the actual solution.
-  removeRoot = filter ((/= rootUid) . fst)
+  removeRoot = filter ((/= rootIdent) . fst)
   -- Auxilary variables are only part of the computation, not the solution.
   removeAux = filter (not . (uniqNameSpace `isPrefixOf`) . fst)
   -- The scope for abstract clafers are removed. Alloy doesn't need it. Makes
@@ -100,18 +101,18 @@
   within a (minB, maxB) = a >= minB && a <= maxB
   bitRange = [(-2^i, 2^i-1) | i <- ([0..]::[Integer])]
 
-  
+
 -- Returns all constant literals
 constantsAnalysis :: ScopeAnalysis [Integer]
 constantsAnalysis =
   do
     cons <- constraintsUnder anything `select` snd
     return $ mapMaybe integerConstant [I._exp sub | con <- cons, sub <- subexpressions con]
-  where  
+  where
   integerConstant (I.IInt i) = Just i
   integerConstant _ = Nothing
-  
 
+
 -- (-1) for infinity
 data Between =
     Between Integer Integer
@@ -129,7 +130,7 @@
     minn (-1) b = b
     minn a (-1) = a
     minn a b = min a b
-    
+
     maxx (-1) _ = -1
     maxx _ (-1) = -1
     maxx a b = max a b
@@ -140,8 +141,8 @@
         a' <- a
         b' <- b
         overlap a' b'
--} 
-    
+-}
+
 -- Multiplies two positive integers where -1=infinity
 mult :: Integer -> Integer -> Integer
 mult (-1) _ = -1
@@ -153,7 +154,7 @@
 simpleAnalysis :: ScopeAnalysis [(String, Between)]
 simpleAnalysis =
     do
-        root <- claferWithUid rootUid
+        root <- claferWithUid rootIdent
         analysis <- simpleAnalysis' root (Between 1 1)
         --moreAnalysis <- simpleConstraintAnalysis analysis
         return analysis
@@ -165,13 +166,13 @@
                  | groupLow cur == 0 && groupHigh cur == -1 = Between (low child * l) (high child `mult` h)
                  | otherwise                                = Between 0 (-1)
             foreach (simpleAnalysis' child b)
-{-    
+{-
     mergeAnalysis analysis =
         [(n, fromJust x) | (n, b) <- combine analysis, let x = foldr1 overlapM $ map Just b, isJust x]
-  
+
     simpleConstraintAnalysis :: [(String, Between)] -> ScopeAnalysis [(String, Between)]
     simpleConstraintAnalysis analysis = mergeAnalysis <$> simpleConstraintAnalysis' analysis
-    
+
     simpleConstraintAnalysis' analysis =
         runListT $ do
             (curThis, cons) <- foreach $ constraintsUnder anything
@@ -194,9 +195,9 @@
                 let parentBetween = fromMaybe (error $ "Missing parent " ++ parent) $ lookup parent analysis
                 guard $ atLeastOne parentBetween
                 return (step, Between 1 $ -1)
--}       
-    
+-}
 
+
 setConstraints :: ScopeAnalysis ()
 setConstraints =
   do
@@ -209,7 +210,7 @@
         parentConstraints
         constraintConstraints
 
-    (var rootUid) `equalTo` 1
+    (var rootIdent) `equalTo` 1
 
 
 optFormula :: ScopeAnalysis ()
@@ -228,7 +229,7 @@
 
     let uchild = uid child
     let uparent = uid parent
-    
+
     if low child == high child
         -- Saves us one constraint
         then do
@@ -279,29 +280,29 @@
 
 
 
-flatten :: ScopeAnalysis [SClafer]        
+flatten :: ScopeAnalysis [SClafer]
 flatten =
     runListT $ do
         abs' <- clafers `suchThat` isAbstract
         (c, s) <- foreach $ anything |: anything
         ListT $ runReaderT (addChildren (map uid abs') (Part [uid c, uid s]) (Part [])) []
-        
-addChildren :: MonadAnalysis m => [String] -> Part -> Part -> m [SClafer]        
+
+addChildren :: MonadAnalysis m => [String] -> Part -> Part -> m [SClafer]
 addChildren abs' (Part steps) ss@(Part supSteps) =
     do
         let parBase = last steps
-        
+
         chis <- directChildrenOf parBase
         achis <- forM chis $
             \chi -> do
                 let chiP = Part $ init steps ++ [chi]
                 let par  = Part steps
                 let supP = Part $ supSteps ++ [chi]
-                
+
                 chiC <- claferWithUid chi
-                let s = SClafer (reifyPartName chiP) chi False (low chiC) (high chiC) (groupLow chiC) (groupHigh chiC) (Just $ reifyPartName par) (Just $ Colon $ reifyPartName supP) (constraints chiC)
+                let s = SClafer (reifyPartName chiP) chi False (low chiC) (high chiC) (groupLow chiC) (groupHigh chiC) (Just $ reifyPartName par) (Just $ reifyPartName supP) Nothing (constraints chiC)
                 return s <:> addChildren abs' chiP ss
-        
+
         col <- runMaybeT $ colonOf parBase
         case col of
             Just col' -> do
@@ -313,7 +314,7 @@
     reifyPartName (Part (t : target)) = reifyPartName' $ t : filter notAbs target
     reifyPartName (Part []) = error "Function reifyPartName from GLPKScopeAnalyzer expects a non empty Part, but was given one!" -- This should never happen
     reifyPartName' [target] = target
-    reifyPartName' target   = uniqNameSpace ++ "reify_" ++ intercalate "_" target        
+    reifyPartName' target   = uniqNameSpace ++ "reify_" ++ intercalate "_" target
 
 
 data Path =
@@ -357,7 +358,7 @@
 {-isConst :: Expr -> Bool
 isConst Const{} = True
 isConst _ = False-}
-    
+
 parentOfPart :: MonadAnalysis m => Part -> m Part
 parentOfPart (Part s) =
   do
@@ -373,7 +374,7 @@
  -
  -  [ A in List
  -    B in List ]
- - 
+ -
  - to
  -
  -  [ A, B in List ]
@@ -388,12 +389,12 @@
     inPExp a b = I.PExp (Just I.TBoolean) "" noSpan $ I.IFunExp "in" [a, b]
     unionPExpAll es = foldr1 unionPExp es
     unionPExp a b = I.PExp (liftM2 (+++) (I._iType a) (I._iType b)) "" noSpan $ I.IFunExp "++" [a, b]
-    
+
     partitionConstraint I.PExp{I._exp = I.IFunExp {I._op = "in", I._exps = [exp1, exp2]}} = return $ Right (exp1, exp2)
     partitionConstraint I.PExp{I._exp = I.IFunExp {I._op = "&&", I._exps = [exp1, exp2]}} = partitionConstraint exp1 `mplus` partitionConstraint exp2
     partitionConstraint e = return $ Left e
 
-    testing'   f a b = f a == f b    
+    testing'   f a b = f a == f b
     comparing' f a b = f a `compare` f b
 
 
@@ -417,16 +418,16 @@
             return (under, rename decl bpexp)
     partitionConstraint I.PExp{I._exp = I.IFunExp {I._op = "&&", I._exps = [exp1, exp2]}} = partitionConstraint exp1 `mplus` partitionConstraint exp2
     partitionConstraint e = return (curThis, e)
-    
+
     rename :: String -> I.PExp -> I.PExp
     rename f p@I.PExp{I._exp = exp'} =
         p{I._exp = renameIExp exp'}
         where
         renameIExp (I.IFunExp op exps) = I.IFunExp op $ map (rename f) exps
         renameIExp (I.IDeclPExp quant oDecls bpexp) = I.IDeclPExp quant (map renameDecl oDecls) $ rename f bpexp
-        renameIExp (I.IClaferId modName sident isTop)
-            | f == sident = I.IClaferId modName "this" isTop
-            | otherwise   = I.IClaferId modName sident isTop
+        renameIExp (I.IClaferId modName sident isTop bind)
+            | f == sident = I.IClaferId modName "this" isTop bind
+            | otherwise   = I.IClaferId modName sident isTop bind
         renameIExp i = i
         renameDecl (I.IDecl isDisj decls body)
             | f `elem` decls = I.IDecl isDisj decls body -- Not a free variable
@@ -450,7 +451,7 @@
     runListT_ $ do
       clafer <- foreach clafers
       (supThis, cons) <- foreach $ optConstraintsUnder clafer
-      
+
       con <- foreachM cons
       curThis <-
           if isAbstract supThis
@@ -463,10 +464,10 @@
       oneConstraint curThis constraint
   where
   --base (Part steps) = last steps
-  
+
   oneConstraint c (e1, con, e2) =
     void $ runMaybeT $ oneConstraintOneWay c e1 con e2 `mplus` oneConstraintOneWay c e2 (reverseCon con) e1
-  
+
   oneConstraintOneWay c@SClafer{uid} e1 con e2 =
     oneConstraint' e1 e2
     where
@@ -515,7 +516,7 @@
           let frac = (1 / fromInteger multiplier) * fromInteger constant :: Double
           (reifyVar part) `comp` return (frac *^ var pos)
           mult multiplier <$> prod part
-        
+
     oneConstraint' (This (Path parts1) _) (This (Path parts2) _) =
       reifyVar (last parts1) `comp` reifyVar (last parts2)
     oneConstraint' (Global (Path parts1) _) (Global (Path parts2) _) =
@@ -536,13 +537,13 @@
           then reifyVar (last parts) `comp` reifyVars [last p | This (Path p) _ <- exprs]
           else mzero
     oneConstraint' _ _ = mzero
-    
+
     constantCard SClafer{low, high}
       | low == high = return low
       | otherwise   = mzero
-    
+
     prod (Part steps) = foldr1 mult <$> mapM (return . high <=< claferWithUid) steps
-    
+
     comp x y =
       do
         x' <- x
@@ -568,7 +569,7 @@
   reifyVars p = return (varSum $ map reifyVarName p)
   reifyVarName (Part [target]) = target
   reifyVarName (Part target)   = uniqNameSpace ++ "reify_" ++ intercalate "_" target
-{- 
+{-
   isAbstractPart (Part [_]) = False
   isAbstractPart _ = True
 
@@ -580,7 +581,7 @@
       if isNothing sss
         then return $ Part $ reverse $ b : rest
         else return $ Part $ reverse $ b : ss : rest
-  
+
   -- TODO: correct?
 
   siblingParts (Part (conc : abst)) =
@@ -593,20 +594,20 @@
             (sub, _) <- foreach $ anything |: sup'
             return $ Part $ uid sub : abst
   siblingParts [] = error "Function siblingParts from GLpkScopeAnalyzer expects a non empty list, given an empty one!" -- This should never happen
-  
+
   reifyPart (Part steps) =
     do
       as <- claferWithUid (last steps) >>= nonTopAncestors
       forM as $
         \a -> return $ Part $ init steps ++ [uid a]
-  
+
   nonTopAncestors child =
     do
       parent <- parentOf child
-      if uid parent == rootUid
+      if uid parent == rootIdent
         then return []
         else (++ [child]) `fmap` nonTopAncestors parent
- -} 
+ -}
 
 data Con = EQU | LTH | LEQ | GTH | GEQ deriving (Eq, Ord, Show)
 
@@ -643,7 +644,7 @@
     | _op == "<=>" = (exp1 `implies` exp2) `mplus` (exp2 `implies` exp1)
     | _op == "=>" = exp1 `implies` exp2
   scopeConstraint' _ = mzero
-  
+
   implies exp1 exp2 =
     do
       e1 <- scopeConstraint' $ I._exp exp1
@@ -675,7 +676,7 @@
         (Exact e1, AtLeast e2) -> return e1 `lessThanEqual` return e2
         _ -> mzero
   equalConstraint2 exp1 exp2 = scopeConstraintNum exp1 `eqTo` scopeConstraintNum exp2
-  
+
   -- exp1 in exp2
   inConstraint1 exp1 exp2 =
     do
@@ -696,7 +697,7 @@
         then return $ AtLeast $ lExpr l1'
         else return $ combineDisjoint l1' l2'
   scopeConstraintSet x = Exact <$> parsePath curThis x
-  
+
   combineDisjoint (Exact e1) (Exact e2) =
     Exact (Concat ([e1, e2] >>= flattenConcat) $ eType e1 +++ eType e2)
   combineDisjoint l1 l2 =
@@ -704,11 +705,11 @@
     where
     e1 = lExpr l1
     e2 = lExpr l2
-    
 
+
   flattenConcat (Concat es _) = es >>= flattenConcat
   flattenConcat e = [e]
-  
+
   scopeConstraintNum I.PExp {I._exp = I.IInt const'} = constant const'
   scopeConstraintNum I.PExp {I._exp = I.IFunExp {I._op = "#", I._exps = [path]}} = parsePath curThis path
   scopeConstraintNum _ = mzero
@@ -726,7 +727,7 @@
 {-
  - We use the stack to push every abstraction we traverse through.
  - For example:
- - 
+ -
  -  abstract A
  -    B ?
  -      C : D ?
@@ -751,17 +752,17 @@
  -
  - Solving the minimization should have scope_E = 2 in its solution.
  - The (*) equation is set in constraintConstraints
- -}      
+ -}
 parsePath :: MonadScope m => SClafer -> I.PExp -> m Expr
 parsePath start pexp =
     do
         start' <- claferWithUid (origUid start)
         parsePath2 start' pexp
- 
+
 parsePath2 :: MonadScope m => SClafer -> I.PExp -> m Expr
 parsePath2 start pexp =
   do
-    root <- claferWithUid rootUid
+    root <- claferWithUid rootIdent
     case unfoldJoins pexp of
         Just unfold -> do
             match <- patternMatch parsePath' (ParseState root []) unfold
@@ -770,14 +771,14 @@
   where
   asPath :: [[String]] -> Path
   asPath parts = Path [Part part | part <- parts, not $ null part]
-  
+
   parsePath' = (This <$> (asPath <$> parseThisPath) <*> getThisType) <|> (Global <$> (asPath <$> parseNonthisPath) <*> getThisType)
-  
+
   getThisType =
     do
         t <- getThis
         return $ fromJust $ fromUnionType [uid t]
-  
+
   parseThisPath =
     do
       t <- _this_
@@ -788,22 +789,22 @@
   parseNonthisPath =
     do
       paths <- many (step >>= follow)
-      
+
       lifo <- popStack
       let end = if null paths then [] else [last paths]
       let result = reverse $ end ++ map uid lifo
-      
+
       do
         _ref_ >>= follow
         -- recurse
         rec <- parseNonthisPath
         return $ result : rec
         <|> return [result]
-      
+
   -- Step handles non-this token.
   step :: MonadScope m => ParseT m String
   step = _parent_ <|> _directChild_ <|> try (pushThis >> _indirectChild_)
-  
+
   -- Update the state of where "this" is.
   -- Path is one step away from where "this" is.
   follow :: MonadScope m => String -> ParseT m String
@@ -819,8 +820,8 @@
 
 
 
-      
-      
+
+
 {------------------------------------------------------------
  ---------- Internals ---------------------------------------
  ------------------------------------------------------------}
@@ -879,7 +880,7 @@
     var aux `leqTo` 1
     setVarKind aux IntVar
     return aux
-    
+
 {-
  - Create a new variable "aux". If
  -   all v == 0 -> aux == 0
@@ -894,7 +895,7 @@
     auxs <- mapM testPositive vs
     aux <- uniqVar
     (length vs *^ var aux) `equal` varSum auxs
-    
+
     a <- uniqVar
     (var a ^-^ var aux) `geqTo` (-0.9999) -- Buffer for floating point inaccuracies
     (var a ^-^ var aux) `leqTo` 0.0001    -- Buffer for floating point inaccuracies
@@ -936,7 +937,7 @@
 
 -- Update where "this" refers to.
 putThis :: MonadScope m => SClafer -> ParseT m ()
-putThis newThis = 
+putThis newThis =
   do
     state' <- getState
     putState $ state'{psThis = newThis}
@@ -990,9 +991,9 @@
     clafer <- _child_ >>= lift . claferWithUid
     check <- lift $ isIndirectChild clafer curThis
     when (not check) $ unexpected $ (uid clafer) ++ " is not an indirect child of " ++ (uid curThis)
-    return $ uid clafer    
-    
+    return $ uid clafer
 
+
 satisfy :: MonadScope m => (String -> Bool) -> ParseT m String
 satisfy f = tLexeme <$> tokenPrim (tLexeme)
                                   (\_ c _ -> tPos c)
@@ -1011,7 +1012,7 @@
  - Utility functions
  -
  -}
- 
+
 subexpressions :: I.PExp -> [I.PExp]
 subexpressions p@I.PExp{I._exp = exp'} =
   p : subexpressions' exp'
@@ -1023,7 +1024,7 @@
 
 instance MonadSupply s m => MonadSupply s (ListT m) where
   supplyNew = lift supplyNew
-  
+
 instance MonadSupply s m => MonadSupply s (MaybeT m) where
   supplyNew = lift supplyNew
 
diff --git a/src/Language/Clafer/Intermediate/Intclafer.hs b/src/Language/Clafer/Intermediate/Intclafer.hs
--- a/src/Language/Clafer/Intermediate/Intclafer.hs
+++ b/src/Language/Clafer/Intermediate/Intclafer.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE TemplateHaskell, DeriveDataTypeable #-}
 {-
- Copyright (C) 2012-2014 Kacper Bak, Jimmy Liang, Luke Michael Brown <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012-2014 Kacper Bak, Jimmy Liang, Michal Antkiewicz, Luke Michael Brown <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
@@ -24,166 +24,156 @@
 module Language.Clafer.Intermediate.Intclafer where
 
 import Language.Clafer.Front.Absclafer
+
 import Control.Lens
 import Data.Data
 import Data.Monoid
 import Data.Foldable (foldMap)
 
 -- | unique identifier of a clafer
-type UID = String    
+type UID = String
 -- | clafer name as declared in the source model
-type CName = String  
+type CName = String
+-- | file:// ftp:// or http:// prefixed URL
+type URL = String
 
 -- | A "supertype" of all IR types
-data Ir =
-  IRIModule IModule | 
-  IRIElement IElement |
-  IRIType IType |
-  IRClafer IClafer |
-  IRIExp IExp |
-  IRPExp PExp |
-  IRISuper ISuper |
-  IRIQuant IQuant |
-  IRIDecl IDecl |
-  IRIGCard IGCard
+data Ir
+  = IRIModule IModule
+  | IRIElement IElement
+  | IRIType IType
+  | IRClafer IClafer
+  | IRIExp IExp
+  | IRPExp PExp
+  | IRIReference (Maybe IReference)
+  | IRIQuant IQuant
+  | IRIDecl IDecl
+  | IRIGCard (Maybe IGCard)
   deriving (Eq, Show)
 
-data IType = TBoolean
-           | TString
-           | TInteger
-           | TReal
-           | TClafer [String]
+data IType
+  = TBoolean
+  | TString
+  | TInteger
+  | TReal
+  -- | the type is an intersection of the listed clafers
+  -- supports having paths in the inheritance hierarchy
+  -- supports multiple inheritance
+  | TClafer [UID]
   deriving (Eq,Ord,Show,Data,Typeable)
 
 -- | each file contains exactly one mode. A module is a list of declarations
-data IModule = IModule {
-      -- | always empty for now because we don't have syntax for declaring modules
-      _mName :: String,    
-      -- | List of top-level elements
-      _mDecls :: [IElement]
+data IModule
+  = IModule
+    { _mName :: String -- ^ always empty (no syntax for declaring modules)
+    , _mDecls :: [IElement] -- ^ List of top-level elements
     }
   deriving (Eq,Ord,Show,Data,Typeable)
 
 -- | Clafer has a list of fields that specify its properties. Some fields, marked as (o) are for generating optimized code
-data IClafer =
-   IClafer {
-      -- | the position of the syntax in source code
-      _cinPos :: Span,         
-      -- | whether abstract or not (i.e., concrete)
-      _isAbstract :: Bool,     
-      -- | group cardinality
-      _gcard :: Maybe IGCard,  
-      -- | name declared in the model
-      _ident :: CName,         
-      -- | a unique identifier
-      _uid :: UID,             
-      -- | superclafers
-      _super:: ISuper,         
-      -- | clafer cardinality
-      _card :: Maybe Interval,
-       -- | (o) global cardinality 
-      _glCard :: Interval,    
-      -- | nested elements
-      _elements :: [IElement]  
+data IClafer
+  = IClafer
+    { _cinPos :: Span         -- ^ the position of the syntax in source code
+    , _isAbstract :: Bool     -- ^ whether abstract or not (i.e., concrete)
+    , _gcard :: Maybe IGCard  -- ^ group cardinality
+    , _ident :: CName         -- ^ name declared in the model
+    , _uid :: UID             -- ^ a unique identifier
+    , _parentUID :: UID       -- ^ "root" if top-level, "" if unresolved or for root clafer, otherwise UID of the parent clafer
+    , _super :: Maybe PExp    -- ^ superclafer - only allowed PExp is IClaferId. Nothing = default super "clafer"
+    , _reference :: Maybe IReference -- ^ reference type, bag or set
+    , _card :: Maybe Interval -- ^ clafer cardinality
+    , _glCard :: Interval     -- ^ (o) global cardinality
+    , _elements :: [IElement] -- ^ nested elements
     }
   deriving (Eq,Ord,Show,Data,Typeable)
 
 -- | Clafer's subelement is either a clafer, a constraint, or a goal (objective)
 --   This is a wrapper type needed to have polymorphic lists of elements
-data IElement =
-   IEClafer { 
-      -- | the actual clafer 
-      _iClafer :: IClafer
+data IElement
+  = IEClafer
+    { _iClafer :: IClafer  -- ^ the actual clafer
     }
- | IEConstraint {
-      -- | whether hard or not (soft)
-      _isHard :: Bool,     
-      -- | the container of the actual expression
-      _cpexp :: PExp       
+  | IEConstraint
+    { _isHard :: Bool      -- ^ whether hard constraint or assertion
+    , _cpexp :: PExp       -- ^ the container of the actual expression
     }
   -- | Goal (optimization objective)
- | IEGoal {
-   -- | whether maximize or minimize
-   _isMaximize :: Bool,    
-   -- | the expression
-   _cpexp :: PExp          
-   }
+  | IEGoal
+    { _isMaximize :: Bool     -- ^ whether maximize or minimize
+    , _cpexp :: PExp          -- ^ the expression
+    }
   deriving (Eq,Ord,Show,Data,Typeable)
 
--- | A list of superclafers.  
---   ->    overlaping unique (set)
---   ->>   overlapping non-unique (bag)
---   :     non overlapping (disjoint)
-data ISuper =
-   ISuper {
-      _isOverlapping :: Bool,  -- whether overlapping or disjoint with other clafers extending given list of superclafers
-      _supers :: [PExp]
+-- | A type of reference.
+--   ->    values unique (set)
+--   ->>   values non-unique (bag)
+data IReference
+  = IReference
+    { _isSet :: Bool -- ^ whether set or bag
+    , _ref :: PExp  -- ^ the only allowed reference expressions are IClafer and set expr. (++, **, --s)
     }
   deriving (Eq,Ord,Show,Data,Typeable)
 
 -- | Group cardinality is specified as an interval. It may also be given by a keyword.
 --   xor    1..1 isKeyword = True
 --   1..1   1..1 isKeyword = False
-data IGCard =
-  IGCard {
-      _isKeyword :: Bool,    -- whether given by keyword: or, xor, mux
-      _interval :: Interval
-    }
-  deriving (Eq,Ord,Show,Data,Typeable)
+data IGCard
+  = IGCard
+    { _isKeyword :: Bool    -- ^ whether given by keyword: or, xor, mux
+    , _interval :: Interval
+    } deriving (Eq,Ord,Show,Data,Typeable)
 
 -- | (Min, Max) integer interval. -1 denotes *
 type Interval = (Integer, Integer)
 
--- | This is expression container (parent). 
+-- | This is expression container (parent).
 --   It has meta information about an actual expression 'exp'
-data PExp = PExp {
-      -- | the inferred type
-      _iType :: Maybe IType,  
-      -- | non-empty unique id for expressions with span, \"\" for noSpan
-      _pid :: String,         
-      -- | position in the input Clafer file
-      _inPos :: Span,         
-      -- | the actual expression
-      _exp :: IExp            
+data PExp
+  = PExp
+    { _iType :: Maybe IType   -- ^ the inferred type
+    , _pid :: String          -- ^ non-empty unique id for expressions with span, \"\" for noSpan
+    , _inPos :: Span          -- ^ position in the input Clafer file
+    , _exp :: IExp            -- ^ the actual expression
     }
   deriving (Eq,Ord,Show,Data,Typeable)
 
-data IExp = 
-   -- | quantified expression with declarations
-   --   e.g., [ all x1; x2 : X | x1.ref != x2.ref ]
-   IDeclPExp {
-      _quant :: IQuant, 
-      _oDecls :: [IDecl], 
-      _bpexp :: PExp
+-- | Embedes reference to a resolved Clafer
+type ClaferBinding = Maybe UID
+
+data IExp
+    -- | quantified expression with declarations
+    --   e.g., [ all x1; x2 : X | x1.ref != x2.ref ]
+  = IDeclPExp
+    { _quant :: IQuant
+    , _oDecls :: [IDecl]
+    , _bpexp :: PExp
     }
-   -- | expression with a
-   --   unary function, e.g., -1
-   --   binary function, e.g., 2 + 3
-   --   ternary function, e.g., if x then 4 else 5
- | IFunExp {
-      _op :: String, 
-      _exps :: [PExp]
+    -- | expression with a
+    --   unary function, e.g., -1
+    --   binary function, e.g., 2 + 3
+    --   ternary function, e.g., if x then 4 else 5
+  | IFunExp
+    { _op :: String
+    , _exps :: [PExp]
     }
- -- | integer number
- | IInt {
-      _iint :: Integer
+    -- | integer number
+  | IInt
+    { _iint :: Integer
     }
- -- | real number
- | IDouble {
-      _idouble :: Double
+    -- | real number
+  | IDouble
+    { _idouble :: Double
     }
- -- | string
- | IStr {
-      _istr :: String
+    -- | string
+  | IStr
+    { _istr :: String
     }
- -- | a reference to a clafer name
- | IClaferId {                   
-      -- | module name - currently not used and empty since we have no module system
-      _modName :: String,         
-      -- | name of the clafer being referred to
-      _sident :: CName,          
-      -- | identifier refers to a top-level definition
-      _isTop :: Bool
+    -- | a reference to a clafer name
+  | IClaferId
+    { _modName :: String         -- ^ module name - currently not used and empty since we have no module system
+    , _sident :: CName           -- ^ name of the clafer being referred to
+    , _isTop :: Bool             -- ^ identifier refers to a top-level definition
+    , _binding :: ClaferBinding  -- ^ the UID of the bound IClafer, if resolved
     }
   deriving (Eq,Ord,Show,Data,Typeable)
 
@@ -225,30 +215,22 @@
 
 -- | Local declaration
 --   disj x1; x2 : X ++ Y
---   y1 : Y 
-data IDecl =
-   IDecl {
-      -- | is disjunct
-      _isDisj :: Bool,    
-      -- | a list of local names 
-      _decls :: [CName],  
-      -- | set to which local names refer to
-      _body :: PExp        
+--   y1 : Y
+data IDecl
+  = IDecl
+    { _isDisj :: Bool    -- ^ is disjunct
+    , _decls :: [CName]  -- ^ a list of local names
+    , _body :: PExp      -- ^ set to which local names refer to
     }
   deriving (Eq,Ord,Show,Data,Typeable)
 
 -- | quantifier
-data IQuant =
- -- | does not exist
-   INo    
- -- | less than one
- | ILone  
- -- | exactly one
- | IOne   
- -- | at least one (i.e., exists)
- | ISome  
- -- | for all
- | IAll   
+data IQuant
+  = INo    -- ^ does not exist
+  | ILone  -- ^ less than one
+  | IOne   -- ^ exactly one
+  | ISome  -- ^ at least one (i.e., exists)
+  | IAll   -- ^ for all
   deriving (Eq,Ord,Show,Data,Typeable)
 
 type LineNo = Integer
@@ -260,12 +242,12 @@
 
 -- | map over IR
 mapIR :: (Ir -> Ir) -> IModule -> IModule -- fmap/map for IModule
-mapIR f (IModule name decls') = 
+mapIR f (IModule name decls') =
   unWrapIModule $ f $ IRIModule $ IModule name $ map (unWrapIElement . iMap f . IRIElement) decls'
 
 -- | foldMap over IR
 foldMapIR :: (Monoid m) => (Ir -> m) -> IModule -> m -- foldMap for IModule
-foldMapIR f i@(IModule _ decls') = 
+foldMapIR f i@(IModule _ decls') =
   (f $ IRIModule i) `mappend` foldMap (iFoldMap f . IRIElement) decls'
 
 -- | fold the IR
@@ -273,34 +255,35 @@
 foldIR f e m = appEndo (foldMapIR (Endo . f) m) e
 
 {-
-Note: even though the above functions take an IModule, 
-the functions they use take an Ir (wrapped version see top of module). 
+Note: even though the above functions take an IModule,
+the functions they use take an Ir (wrapped version see top of module).
 Also the bellow functions are just helpers for the above, you may use
 them if you wish to start from somewhere other than IModule.
 -}
 
-iMap :: (Ir -> Ir) -> Ir -> Ir 
-iMap f (IRIElement (IEClafer c)) = 
+iMap :: (Ir -> Ir) -> Ir -> Ir
+iMap f (IRIElement (IEClafer c)) =
   f $ IRIElement $ IEClafer $ unWrapIClafer $ iMap f $ IRClafer c
 iMap f (IRIElement (IEConstraint h pexp)) =
   f $ IRIElement $ IEConstraint h $ unWrapPExp $ iMap f $ IRPExp pexp
 iMap f (IRIElement (IEGoal m pexp)) =
-  f $ IRIElement $ IEGoal m $ unWrapPExp $ iMap f $ IRPExp pexp 
-iMap f (IRClafer (IClafer p a (Just grc) i u s c goc elems)) =
-  f $ IRClafer $ IClafer p a (Just $ unWrapIGCard $ iMap f $ IRIGCard grc) i u (unWrapISuper $ iMap f $ IRISuper s) c goc $ map (unWrapIElement . iMap f . IRIElement) elems
-iMap f (IRClafer (IClafer p a Nothing i u s c goc elems)) =
-  f $ IRClafer $ IClafer p a Nothing i u (unWrapISuper $ iMap f $ IRISuper s) c goc $ map (unWrapIElement . iMap f . IRIElement) elems
+  f $ IRIElement $ IEGoal m $ unWrapPExp $ iMap f $ IRPExp pexp
+iMap f (IRClafer (IClafer p a grc i u pu Nothing  r c goc elems)) =
+  f $ IRClafer $ IClafer p a (unWrapIGCard $ iMap f $ IRIGCard grc) i u pu Nothing                            (unWrapIReference $ iMap f $ IRIReference r) c goc $ map (unWrapIElement . iMap f . IRIElement) elems
+iMap f (IRClafer (IClafer p a grc i u pu (Just s) r c goc elems)) =
+  f $ IRClafer $ IClafer p a (unWrapIGCard $ iMap f $ IRIGCard grc) i u pu (Just $ unWrapPExp $ iMap f $ IRPExp s) (unWrapIReference $ iMap f $ IRIReference r) c goc $ map (unWrapIElement . iMap f . IRIElement) elems
 iMap f (IRIExp (IDeclPExp q decs p)) =
   f $ IRIExp $ IDeclPExp (unWrapIQuant $ iMap f $ IRIQuant q) (map (unWrapIDecl . iMap f . IRIDecl) decs) $ unWrapPExp $ iMap f $ IRPExp p
-iMap f (IRIExp (IFunExp o pexps)) = 
+iMap f (IRIExp (IFunExp o pexps)) =
   f $ IRIExp $ IFunExp o $ map (unWrapPExp . iMap f . IRPExp) pexps
 iMap f (IRPExp (PExp (Just iType') pID p iExp)) =
   f $ IRPExp $ PExp (Just $ unWrapIType $ iMap f $ IRIType iType') pID p $ unWrapIExp $ iMap f $ IRIExp iExp
 iMap f (IRPExp (PExp Nothing pID p iExp)) =
   f $ IRPExp $ PExp Nothing pID p $ unWrapIExp $ iMap f $ IRIExp iExp
-iMap f (IRISuper (ISuper o pexps)) =
-  f $ IRISuper $ ISuper o $ map (unWrapPExp . iMap f . IRPExp) pexps
-iMap f (IRIDecl (IDecl i d body')) = 
+iMap _ x@(IRIReference Nothing) = x
+iMap f (IRIReference (Just (IReference is ref))) =
+ f $ IRIReference $ Just $ IReference is $ (unWrapPExp . iMap f . IRPExp) ref
+iMap f (IRIDecl (IDecl i d body')) =
   f $ IRIDecl $ IDecl i d $ unWrapPExp $ iMap f $ IRPExp body'
 iMap f i = f i
 
@@ -309,21 +292,22 @@
   f i `mappend` (iFoldMap f $ IRPExp pexp)
 iFoldMap f i@(IRIElement (IEGoal _ pexp)) =
   f i `mappend` (iFoldMap f $ IRPExp pexp)
-iFoldMap f i@(IRClafer (IClafer _ _ Nothing _ _ s _ _ elems)) =
-  f i `mappend` (iFoldMap f $ IRISuper s) `mappend` foldMap (iFoldMap f . IRIElement) elems
-iFoldMap f i@(IRClafer (IClafer _ _ (Just grc) _ _ s _ _ elems)) =
-  f i `mappend` (iFoldMap f $ IRISuper s) `mappend` (iFoldMap f $ IRIGCard grc) `mappend` foldMap (iFoldMap f . IRIElement) elems
+iFoldMap f i@(IRClafer (IClafer _ _ grc _ _ _ Nothing r _ _ elems)) =
+  f i `mappend` (iFoldMap f $ IRIReference r) `mappend` (iFoldMap f $ IRIGCard grc) `mappend` foldMap (iFoldMap f . IRIElement) elems
+iFoldMap f i@(IRClafer (IClafer _ _ grc _ _ _ (Just s) r _ _ elems)) =
+  f i `mappend` (iFoldMap f $ IRPExp s) `mappend` (iFoldMap f $ IRIReference r) `mappend` (iFoldMap f $ IRIGCard grc) `mappend` foldMap (iFoldMap f . IRIElement) elems
 iFoldMap f i@(IRIExp (IDeclPExp q decs p)) =
   f i `mappend` (iFoldMap f $ IRIQuant q) `mappend` (iFoldMap f $ IRPExp p) `mappend` foldMap (iFoldMap f . IRIDecl) decs
-iFoldMap f i@(IRIExp (IFunExp _ pexps)) = 
+iFoldMap f i@(IRIExp (IFunExp _ pexps)) =
   f i `mappend` foldMap (iFoldMap f . IRPExp) pexps
 iFoldMap f i@(IRPExp (PExp (Just iType') _ _ iExp)) =
   f i `mappend` (iFoldMap f $ IRIType iType') `mappend` (iFoldMap f $ IRIExp iExp)
 iFoldMap f i@(IRPExp (PExp Nothing _ _ iExp)) =
   f i `mappend` (iFoldMap f $ IRIExp iExp)
-iFoldMap f i@(IRISuper (ISuper _ pexps)) =
-  f i `mappend` foldMap (iFoldMap f . IRPExp) pexps
-iFoldMap f i@(IRIDecl (IDecl _ _ body')) = 
+iFoldMap f i@(IRIReference Nothing) = f i
+iFoldMap f i@(IRIReference (Just (IReference _ ref))) =
+  f i `mappend` (iFoldMap f . IRPExp) ref
+iFoldMap f i@(IRIDecl (IDecl _ _ body')) =
   f i `mappend` (iFoldMap f $ IRPExp body')
 iFoldMap f (IRIElement (IEClafer c)) = iFoldMap f $ IRClafer c
 iFoldMap f i = f i
@@ -350,16 +334,16 @@
 unWrapPExp :: Ir -> PExp
 unWrapPExp (IRPExp x) = x
 unWrapPExp x = error $ "Can't call unWarpPExp on " ++ show x
-unWrapISuper :: Ir -> ISuper
-unWrapISuper (IRISuper x) = x
-unWrapISuper x = error $ "Can't call unWarpISuper on " ++ show x
+unWrapIReference :: Ir -> Maybe IReference
+unWrapIReference (IRIReference x) = x
+unWrapIReference x = error $ "Can't call unWarpIReference on " ++ show x
 unWrapIQuant :: Ir -> IQuant
 unWrapIQuant (IRIQuant x) = x
 unWrapIQuant x = error $ "Can't call unWarpIQuant on " ++ show x
 unWrapIDecl :: Ir -> IDecl
 unWrapIDecl (IRIDecl x) = x
 unWrapIDecl x = error $ "Can't call unWarpIDecl on " ++ show x
-unWrapIGCard :: Ir -> IGCard
+unWrapIGCard :: Ir -> Maybe IGCard
 unWrapIGCard (IRIGCard x) = x
 unWrapIGCard x = error $ "Can't call unWarpIGcard on " ++ show x
 
@@ -374,7 +358,7 @@
 
 makeLenses ''IElement
 
-makeLenses ''ISuper
+makeLenses ''IReference
 
 makeLenses ''IGCard
 
@@ -382,4 +366,4 @@
 
 makeLenses ''IExp
 
-makeLenses ''IDecl
+makeLenses ''IDecl
diff --git a/src/Language/Clafer/Intermediate/Resolver.hs b/src/Language/Clafer/Intermediate/Resolver.hs
--- a/src/Language/Clafer/Intermediate/Resolver.hs
+++ b/src/Language/Clafer/Intermediate/Resolver.hs
@@ -35,9 +35,9 @@
 
 -- | Run the various resolvers
 resolveModule :: ClaferArgs -> IModule -> Resolve (IModule, GEnv)
-resolveModule args' declarations =
+resolveModule    args'         imodule =
   do
-    r <- resolveNModule $ nameModule (skip_resolver args') declarations
+    r <- resolveNModule $ nameModule (skip_resolver args') imodule
     resolveNamesModule args' =<< (rom' $ rem' r)
   where
   rem' = if flatten_inheritance args' then resolveEModule else id
@@ -48,19 +48,19 @@
 nameModule :: Bool -> IModule -> (IModule, GEnv)
 nameModule skipResolver imodule = (imodule{_mDecls = decls'}, genv')
   where
-  (decls', genv') = runState (mapM (nameElement skipResolver) $ _mDecls imodule) $ GEnv Map.empty 0 Map.empty []
+  (decls', genv') = runState (mapM (nameElement skipResolver "root") $ _mDecls imodule) $ GEnv Map.empty 0 Map.empty []
 
-nameElement :: MonadState GEnv m => Bool -> IElement -> m IElement
-nameElement skipResolver x = case x of
-  IEClafer claf -> IEClafer `liftM` (nameClafer skipResolver claf)
+nameElement :: MonadState GEnv m => Bool -> UID -> IElement -> m IElement
+nameElement skipResolver puid x = case x of
+  IEClafer claf -> IEClafer `liftM` (nameClafer skipResolver puid claf)
   IEConstraint isHard' pexp -> IEConstraint isHard' `liftM` (namePExp pexp)
   IEGoal isMaximize' pexp -> IEGoal isMaximize' `liftM` (namePExp pexp)
 
 
-nameClafer :: MonadState GEnv m => Bool -> IClafer -> m IClafer
-nameClafer skipResolver claf = do
-  claf' <- if skipResolver then return claf{_uid = _ident claf} else (renameClafer (not skipResolver)) claf
-  elements' <- mapM (nameElement skipResolver) $ _elements claf
+nameClafer :: MonadState GEnv m => Bool -> UID -> IClafer -> m IClafer
+nameClafer skipResolver puid claf = do
+  claf' <- if skipResolver then return claf{_uid = _ident claf, _parentUID = puid} else renameClafer True puid claf
+  elements' <- mapM (nameElement skipResolver (_uid claf')) $ _elements claf
   return $ claf' {_elements = elements'}
 
 
@@ -69,7 +69,7 @@
   n <- gets expCount
   modify (\e -> e {expCount = 1 + n})
   exp'' <- nameIExp exp'
-  return $ pexp {_pid = concat [ "e", show n, "_"], Language.Clafer.Intermediate.Intclafer._exp = exp''}
+  return $ pexp {_pid = concat [ "e", show n, "_"], _exp = exp''}
 
 nameIExp :: MonadState GEnv m => IExp -> m IExp
 nameIExp x = case x of
@@ -85,9 +85,9 @@
 
 -- -----------------------------------------------------------------------------
 resolveNamesModule :: ClaferArgs -> (IModule, GEnv) -> Resolve (IModule, GEnv)
-resolveNamesModule args' (declarations, genv') =
+resolveNamesModule args' (imodule, genv') =
   do
-    res <- foldM (flip ($)) declarations $ map (\f -> flip (curry f) genv') funs
+    res <- foldM (flip ($)) imodule $ map (\f -> flip (curry f) genv') funs
     return (res, genv')
   where
   funs :: [(IModule, GEnv) -> Resolve IModule]
diff --git a/src/Language/Clafer/Intermediate/ResolverInheritance.hs b/src/Language/Clafer/Intermediate/ResolverInheritance.hs
--- a/src/Language/Clafer/Intermediate/ResolverInheritance.hs
+++ b/src/Language/Clafer/Intermediate/ResolverInheritance.hs
@@ -34,7 +34,6 @@
 
 import Language.ClaferT
 import Language.Clafer.Common
-import Language.Clafer.Front.Absclafer
 import Language.Clafer.Intermediate.Intclafer
 import Language.Clafer.Intermediate.ResolverName
 
@@ -46,9 +45,9 @@
     let decls' = _mDecls imodule
     decls'' <- mapM (resolveNElement decls') decls'
     return (imodule{_mDecls = decls''}, genv' {sClafers = bfs toNodeShallow $ toClafers decls''})
-    
 
 
+
 resolveNClafer :: [IElement] -> IClafer -> Resolve IClafer
 resolveNClafer declarations clafer =
   do
@@ -58,18 +57,18 @@
             _elements = elements'}
 
 
-resolveNSuper :: [IElement] -> ISuper -> Resolve ISuper
-resolveNSuper declarations x = case x of
-  ISuper False [PExp _ pid' pos' (IClaferId _ id' isTop')] ->
-    if isPrimitive id' || id' == "clafer"
-      then return x
+resolveNSuper :: [IElement] -> Maybe PExp -> Resolve (Maybe PExp)
+resolveNSuper _ Nothing = return Nothing
+resolveNSuper declarations (Just (PExp _ pid' pos' (IClaferId _ id' _ _))) =
+    if isPrimitive id'
+      then throwError $ SemanticErr pos' $ "Primitive types are not allowed as super types: " ++ id'
       else do
         r <- resolveN pos' declarations id'
-        id'' <- case r of
+        (id'', [superClafer']) <- case r of
           Nothing -> throwError $ SemanticErr pos' $ "No superclafer found: " ++ id'
-          Just m  -> return $ fst m
-        return $ ISuper False [idToPExp pid' pos' "" id'' isTop']
-  _ -> return x
+          Just m  -> return m
+        return $ Just $ idToPExp pid' pos' "" id'' $ isTopLevel superClafer'
+resolveNSuper _ x = return x
 
 
 resolveNElement :: [IElement] -> IElement -> Resolve IElement
@@ -95,18 +94,14 @@
 resolveOClafer :: SEnv -> IClafer -> Resolve IClafer
 resolveOClafer env clafer =
   do
-    super' <- resolveOSuper env {context = Just clafer} $ _super clafer
+    reference' <- resolveOReference env {context = Just clafer} $ _reference clafer
     elements' <- mapM (resolveOElement env {context = Just clafer}) $ _elements clafer
-    return $ clafer {_super = super', _elements = elements'}
+    return $ clafer {_reference = reference', _elements = elements'}
 
 
-resolveOSuper :: SEnv -> ISuper -> Resolve ISuper
-resolveOSuper env x = case x of
-  ISuper True exps' -> do
-    exps''     <- mapM (resolvePExp env) exps'
-    let isOverlap = not (length exps'' == 1 && isPrimitive (getSuperId exps''))
-    return $ ISuper isOverlap  exps''
-  _ -> return x
+resolveOReference :: SEnv -> Maybe IReference -> Resolve (Maybe IReference)
+resolveOReference _   Nothing                      = return Nothing
+resolveOReference env (Just (IReference is' exp')) = Just <$> IReference is' <$> resolvePExp env exp'
 
 
 resolveOElement :: SEnv -> IElement -> Resolve IElement
@@ -114,8 +109,8 @@
   IEClafer clafer  -> IEClafer <$> resolveOClafer env clafer
   IEConstraint _ _ -> return x
   IEGoal _ _ -> return x
-  
 
+
 -- | Resolve inherited and default cardinalities
 analyzeModule :: (IModule, GEnv) -> IModule
 analyzeModule (imodule, genv') =
@@ -138,9 +133,8 @@
 analyzeGCard env clafer = gcard' `mplus` (Just $ IGCard False (0, -1))
   where
   gcard'
-    | _isOverlapping $ _super clafer = _gcard clafer
-    | otherwise                    = listToMaybe $ mapMaybe _gcard $
-                                     findHierarchy getSuper (clafers env) clafer
+    | isNothing $ _super clafer = _gcard clafer
+    | otherwise                 = listToMaybe $ mapMaybe _gcard $ findHierarchy getSuper (clafers env) clafer
 
 
 analyzeCard :: SEnv -> IClafer -> Maybe Interval
@@ -148,11 +142,10 @@
   where
   card'
     | _isAbstract clafer = (0, -1)
-    | (isJust $ context env) && pGcard == (0, -1) 
-      || (isTopLevel $ _cinPos clafer) = (1, 1) 
+    | (isJust $ context env) && pGcard == (0, -1)
+      || (isTopLevel clafer) = (1, 1)
     | otherwise = (0, 1)
   pGcard = _interval $ fromJust $ _gcard $ fromJust $ context env
-  isTopLevel (Span (Pos _ c) _) = c==1
 
 analyzeElement :: SEnv -> IElement -> IElement
 analyzeElement env x = case x of
@@ -183,10 +176,7 @@
   IEGoal _ _ -> Nothing
 
 unrollableClafer :: IClafer -> [String]
-unrollableClafer clafer
-  | _isOverlapping $ _super clafer = []
-  | getSuper clafer == "clafer"  = deps
-  | otherwise                    = getSuper clafer : deps
+unrollableClafer clafer = (getSuper clafer) ++ deps
   where
   deps = (toClafers $ _elements clafer) >>= unrollableClafer
 
@@ -203,7 +193,7 @@
 resolveEClafer :: MonadState GEnv m => [String] -> [String] -> Bool -> [IElement] -> IClafer -> m IClafer
 resolveEClafer predecessors unrollables absAncestor declarations clafer = do
   sClafers' <- gets sClafers
-  clafer' <- renameClafer absAncestor clafer
+  clafer' <- renameClafer absAncestor (_parentUID clafer) clafer
   let predecessors' = _uid clafer' : predecessors
   (sElements, super', superList) <-
       resolveEInheritance predecessors' unrollables absAncestor declarations
@@ -217,33 +207,32 @@
             $ _elements clafer
   return $ clafer' {_super = super', _elements = elements' ++ sElements}
 
-renameClafer :: MonadState GEnv m => Bool -> IClafer -> m IClafer
-renameClafer False clafer = return clafer
-renameClafer True  clafer = renameClafer' clafer
+renameClafer :: MonadState GEnv m => Bool -> UID -> IClafer -> m IClafer
+renameClafer False _ clafer = return clafer
+renameClafer True  puid clafer = renameClafer' puid clafer
 
-renameClafer' :: MonadState GEnv m => IClafer -> m IClafer
-renameClafer' clafer = do
-  let claferIdent = _ident clafer 
+renameClafer' :: MonadState GEnv m => UID -> IClafer -> m IClafer
+renameClafer' puid clafer = do
+  let claferIdent = _ident clafer
   identCountMap' <- gets identCountMap
   let count = Map.findWithDefault 0 claferIdent identCountMap'
   modify (\e -> e { identCountMap = Map.alter (\_ -> Just (count+1)) claferIdent identCountMap' } )
-  return $ clafer { _uid = genId claferIdent count }
+  return $ clafer { _uid = genId claferIdent count, _parentUID = puid }
 
 genId :: String -> Int -> String
 genId id' count = concat ["c", show count, "_",  id']
 
-resolveEInheritance :: MonadState GEnv m => [String] -> [String] -> Bool -> [IElement] -> [IClafer]  -> m ([IElement], ISuper, [IClafer])
-resolveEInheritance predecessors unrollables absAncestor declarations allSuper
-  | _isOverlapping $ _super clafer = return ([], _super clafer, [clafer])
-  | otherwise = do
+resolveEInheritance :: MonadState GEnv m => [String] -> [String] -> Bool -> [IElement] -> [IClafer]  -> m ([IElement], Maybe PExp, [IClafer])
+resolveEInheritance predecessors unrollables absAncestor declarations allSuper = do
     let superList = (if absAncestor then id else tail) allSuper
     let unrollSuper = filter (\s -> _uid s `notElem` unrollables) $ tail allSuper
     elements' <-
         mapM (resolveEElement predecessors unrollables True declarations) $
              unrollSuper >>= _elements
-    let super' = if (getSuper clafer `elem` unrollables)
-                 then _super clafer
-                 else ISuper False [idToPExp "" noSpan "" "clafer" False]
+
+    let super' = case (`elem` unrollables) <$> getSuper clafer of
+                    [True] -> _super clafer
+                    _      ->  Nothing
     return (elements', super', superList)
   where
   clafer = head allSuper
diff --git a/src/Language/Clafer/Intermediate/ResolverName.hs b/src/Language/Clafer/Intermediate/ResolverName.hs
--- a/src/Language/Clafer/Intermediate/ResolverName.hs
+++ b/src/Language/Clafer/Intermediate/ResolverName.hs
@@ -1,7 +1,7 @@
 {-# LANGUAGE FlexibleContexts #-}
 
 {-
- Copyright (C) 2012 Kacper Bak, Jimmy Liang <http://gsd.uwaterloo.ca>
+ Copyright (C) 2012 Kacper Bak, Jimmy Liang, Michal Antkiewicz <http://gsd.uwaterloo.ca>
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
@@ -37,7 +37,7 @@
 import Language.Clafer.Intermediate.Intclafer
 import qualified Language.Clafer.Intermediate.Intclafer as I
 
--- | this environment is created for each clafer 
+-- | this environment is created for each clafer
 data SEnv = SEnv {
   clafers :: [IClafer],                 -- (constant) top level clafers
   context :: Maybe IClafer,             -- context of a constraint
@@ -51,25 +51,17 @@
   } deriving Show
 
 -- | How a given name was resolved
-data HowResolved =
-  -- | "this", "parent", "children"
-    Special     
-  -- | primitive type: integer, string
-  | TypeSpecial 
-  -- | local variable (in constraints)
-  | Binding     
-  -- | clafer's descendant
-  | Subclafers  
-  -- | resolved by a reference
-  | Reference   
-  -- | clafer's ancestor
-  | Ancestor    
-  -- | abstract clafer
-  | AbsClafer   
-  -- | non-abstract top-level clafer
-  | TopClafer   
+data HowResolved
+  = Special     -- ^ "this", "parent", "children", and "root"
+  | TypeSpecial -- ^ primitive type: "integer", "string"
+  | Binding     -- ^ local variable (in constraints)
+  | Subclafers  -- ^ clafer's descendant
+  | Reference   -- ^ resolved by a reference
+  | Ancestor    -- ^ clafer's ancestor
+  | AbsClafer   -- ^ abstract clafer
+  | TopClafer   -- ^ non-abstract top-level clafer
   deriving (Eq, Show)
-  
+
 type Resolve = Either ClaferSErr
 
 -- initialize the cache (env)
@@ -85,7 +77,7 @@
 checkDuplicateSiblings tree = let duplicate = checkDuplicateSiblings' $ _mDecls tree
                               in if (isJust duplicate) then let Just(name,pos') = duplicate in throwError $ SemanticErr pos' $ ("Duplicate name: " ++ name) --error
                                  else return $ _mDecls tree
-                                      
+
 checkDuplicateSiblings' :: [IElement] -> Maybe (String,Span)
 checkDuplicateSiblings' tree =if (isJust check) then check
                               else checkForJust $ map checkDuplicateSiblings' elementsList
@@ -100,7 +92,7 @@
                           h
                         else
                           checkForJust rest
-                          
+
 checkListDuplicates :: [(String, Span)] -> Maybe (String,Span)
 checkListDuplicates list = checkListDuplicates' $ sortBy (compare `on` fst) list
 
@@ -111,16 +103,17 @@
                                     Just (a,b)
                                   else
                                     checkListDuplicates' ((c,d):rest)
-                                    
+
 isIEClafer :: IElement -> Bool
 isIEClafer (IEClafer _) = True
 isIEClafer _            = False
 
 resolveModuleNames :: (IModule, GEnv) -> Resolve IModule
-resolveModuleNames (imodule, genv') =
+resolveModuleNames    (imodule, genv') =
   do
     decls' <- checkDuplicateSiblings imodule
-    mDecls' <- mapM (resolveElement (defSEnv genv' decls')) decls'
+    let defaultSEnv = defSEnv genv' decls'
+    mDecls' <- mapM (resolveElement defaultSEnv) decls'
     return $ imodule{_mDecls = mDecls'}
 
 resolveClafer :: SEnv -> IClafer -> Resolve IClafer
@@ -143,14 +136,14 @@
 resolveElement env x = case x of
   IEClafer clafer  -> IEClafer <$> resolveClafer env clafer
   IEConstraint isHard' pexp  -> IEConstraint isHard' <$> resolvePExp env pexp
-  IEGoal isMaximize' pexp  -> IEGoal isMaximize' <$> resolvePExp env pexp  
+  IEGoal isMaximize' pexp  -> IEGoal isMaximize' <$> resolvePExp env pexp
 
 
 resolvePExp :: SEnv -> PExp -> Resolve PExp
 resolvePExp env pexp =
   do
-    exp' <- resolveIExp (_inPos pexp) env $ Language.Clafer.Intermediate.Intclafer._exp pexp
-    return $ pexp {Language.Clafer.Intermediate.Intclafer._exp = exp'}
+    exp' <- resolveIExp (_inPos pexp) env $ _exp pexp
+    return $ pexp {_exp = exp'}
 
 resolveIExp :: Span -> SEnv -> IExp -> Resolve IExp
 resolveIExp pos' env x = case x of
@@ -158,13 +151,12 @@
     let (decls'', env') = runState (runErrorT $ (mapM (ErrorT . processDecl) decls')) env
     IDeclPExp quant' <$> decls'' <*> resolvePExp env' pexp
 
-  IFunExp op' exps' -> if op' == iJoin then resNav else IFunExp op' <$> mapM res exps'
+  IFunExp op' exps' -> if op' == iJoin then resNav else IFunExp op' <$> mapM (resolvePExp env) exps'
   IInt _ -> return x
   IDouble _ -> return x
   IStr _ -> return x
-  IClaferId _ _ _ -> resNav
+  IClaferId _ _ _ _ -> resNav
   where
-  res = resolvePExp env
   resNav = fst <$> resolveNav pos' env x True
 
 liftError :: Monad m => Either e a -> ErrorT e m a
@@ -184,44 +176,57 @@
     (exp', path') <- resolveNav (_inPos pexp) env {context = listToMaybe path, resPath = path}
                      (I._exp pexp) False
     return (IFunExp iJoin [pexp0{I._exp=exp0'}, pexp{I._exp=exp'}], path')
-  IClaferId modName' id' _ -> out
+  IClaferId modName' id' _ _-> out
     where
     out
       | isFirst   = mkPath env <$> resolveName pos' env id'
       | otherwise = mkPath' modName' <$> resolveImmName pos' env id'
-  y -> throwError $ SemanticErr pos' $ "Cannot resolve nav of " ++ show y 
+  y -> throwError $ SemanticErr pos' $ "Cannot resolve nav of " ++ show y
 
 -- depending on how resolved construct a path
 mkPath :: SEnv -> (HowResolved, String, [IClafer]) -> (IExp, [IClafer])
 mkPath env (howResolved, id', path) = case howResolved of
-  Binding -> (mkLClaferId id' True, path)
+  Binding -> (IClaferId "" id' True Nothing, path)
   Special -> (specIExp, path)
-  TypeSpecial -> (mkLClaferId id' True, path)
-  Subclafers -> (toNav $ tail $ reverse $ map _uid path, path)
-  Ancestor -> (toNav' $ adjustAncestor (reverse $ map _uid $ resPath env)
-                                       (reverse $ map _uid path), path)
-  _ -> (toNav' $ reverse $ map _uid path, path)
+  TypeSpecial -> (IClaferId "" id' True (Just id'), path)
+  Subclafers -> (toNav $ tail $ reverse $ map toTuple path, path)
+  Ancestor -> (toNav' $ adjustAncestor (fromJust $ context env)
+                                       (reverse $ map toTuple $ resPath env)
+                                       (reverse $ map toTuple path), path)
+  _ -> (toNav' $ reverse $ map toTuple path, path)
   where
-  toNav = foldl
-          (\exp' id'' -> IFunExp iJoin [pExpDefPidPos exp', mkPLClaferId id'' False])
-          (mkLClaferId this True)
-  specIExp = if id' /= this then toNav [id'] else mkLClaferId id' True
+  toNav = foldl'
+          (\exp' (id'', c) -> IFunExp iJoin [pExpDefPidPos exp', mkPLClaferId id'' False $ _uid <$> c])
+          (IClaferId "" thisIdent True (_uid <$> context env))
+  specIExp = if id' /= thisIdent && id' /= rootIdent
+              then toNav [(id', Just $ head path)]
+              else if id' == thisIdent
+                then IClaferId "" thisIdent True (_uid <$> context env)
+                else IClaferId "" rootIdent True (Just rootIdent)
 
-toNav' :: [String] -> IExp
-toNav' p = (mkIFunExp iJoin $ map (\c -> mkLClaferId c False) p) :: IExp
+toTuple :: IClafer->(String, Maybe IClafer)
+toTuple c = (_uid c, Just c)
 
+toNav' :: [(String, Maybe IClafer)] -> IExp
+toNav' p = (mkIFunExp iJoin $ map (\(id', cbind) -> IClaferId "" id' False (_uid <$> cbind)) p) :: IExp
 
-adjustAncestor :: [String] -> [String] -> [String]
-adjustAncestor cPath rPath = this : parents ++ (fromJust $ stripPrefix prefix rPath)
+
+adjustAncestor :: IClafer -> [(String, Maybe IClafer)] -> [(String, Maybe IClafer)] -> [(String, Maybe IClafer)]
+adjustAncestor ctx cPath rPath = (thisIdent, Just ctx) : parents ++ (fromJust $ stripPrefix prefix rPath)
   where
-  parents = replicate (length $ fromJust $ stripPrefix prefix cPath) parent
-  prefix  = fst $ unzip $ takeWhile (uncurry (==)) $ zip cPath rPath
+  parents = replicate (length $ fromJust $ stripPrefix prefix cPath) (parentIdent, Nothing)
+  prefix = fst $ unzip $ takeWhile (uncurry eqIds) $ zip cPath rPath
+  eqIds a b = (fst a) == (fst b)
 
 
 mkPath' :: String -> (HowResolved, String, [IClafer]) -> (IExp, [IClafer])
 mkPath' modName' (howResolved, id', path) = case howResolved of
-  Reference  -> (toNav' ["ref", id'], path)
-  _ -> (IClaferId modName' id' False, path)
+  Reference -> (toNav' (zip ["ref", id'] (map Just path)), path)
+  _ -> (IClaferId modName' id' False (_uid <$> bind), path)
+  where
+  bind = case path of
+    [] -> Nothing
+    c:_ -> Just c
 
 -- -----------------------------------------------------------------------------
 
@@ -243,18 +248,23 @@
 -- reports error if clafer not found
 resolveNone :: Span -> SEnv -> String -> Resolve t
 resolveNone pos' env id' =
-  throwError $ SemanticErr pos' $ "resolver: " ++ id' ++ " not found" ++
-  " within " ++ (showPath $ map _uid $ resPath env)
+  throwError $ SemanticErr pos' $ concat
+    [ "Name resolver: '"
+    , id'
+    , "' not found within paths:"
+    , showPath $ map _uid $ resPath env
+    , "in context of '"
+    , show $ fromMaybe "none" (_uid <$> context env)
+    , "'" ]
 
 
 -- checks if ident is one of special identifiers
 resolveSpecial :: SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer]))
 resolveSpecial env id'
-  | id' `elem` [this, children, ref] =
-      return $ Just (Special, id', resPath env)
-  | id' == parent   = return $ Just (Special, id', tail $ resPath env)
-  | isPrimitive id' = return $ Just (TypeSpecial, id', [])
-  | otherwise      = return Nothing 
+  | id' == parentIdent = return $ Just (Special, id', safeTail $ resPath env)
+  | isSpecial id'      = return $ Just (Special, id', resPath env)
+  | isPrimitive id'    = return $ Just (TypeSpecial, id', [])
+  | otherwise          = return Nothing
 
 
 -- checks if ident is bound locally
@@ -278,10 +288,10 @@
 resolveReference pos' env id' = resolveChildren' pos' env id' allChildren Reference
 
 resolveChildren' :: Span -> SEnv -> String -> (SEnv -> [IClafer]) -> HowResolved -> Either ClaferSErr (Maybe (HowResolved, String, [IClafer]))
-resolveChildren' pos' env id' f label =
+resolveChildren' pos' env id' getChildrenF label =
   runMaybeT $ do
     liftMaybe $ context env
-    u <- MaybeT $ findUnique pos' id' $ map (\x -> (x, [x,fromJust $ context env])) $ f env
+    u <- MaybeT $ findUnique pos' id' $ map (\x -> (x, [x,fromJust $ context env])) $ getChildrenF env
     liftMaybe $ toMTriple label u
 
 liftMaybe :: Maybe a -> MaybeT (Either ClaferSErr) a
@@ -312,17 +322,17 @@
   where
   result = (clafer, resPath env)
   clafer = fromJust $ context env
-  
 
+
 -- return children and inherited children but no children of reference targets
 allInhChildren :: SEnv -> [IClafer]
-allInhChildren = selectChildren getSuperNoArr
+allInhChildren = selectChildren getSuper
 
 -- return all children including inherited children children of reference targets
 allChildren :: SEnv -> [IClafer]
-allChildren = selectChildren getSuper
+allChildren = selectChildren getSuperAndReference
 
-selectChildren :: (IClafer -> String) -> SEnv -> [IClafer]
+selectChildren :: (IClafer -> [String]) -> SEnv -> [IClafer]
 selectChildren f env = getSubclafers $ concat $
                        mapHierarchy _elements f (sClafers $ genv env)
                        (fromJust $ context env)
@@ -337,7 +347,7 @@
       xs''   = map ((map _uid).snd) xs'
       errMsg = (if isNamespaceConflict xs''
                then "cannot be defined because the name should be unique in the same namespace.\n"
-               else "is not unique. ") ++ 
+               else "is not unique. ") ++
                "Available paths:\n" ++ (xs'' >>= showPath)
 
 findFirst :: String -> [(IClafer, [IClafer])] -> Maybe (String, [IClafer])
diff --git a/src/Language/Clafer/Intermediate/ResolverType.hs b/src/Language/Clafer/Intermediate/ResolverType.hs
--- a/src/Language/Clafer/Intermediate/ResolverType.hs
+++ b/src/Language/Clafer/Intermediate/ResolverType.hs
@@ -44,7 +44,7 @@
 
 newtype TypeAnalysis a = TypeAnalysis (ReaderT TypeInfo (Either ClaferSErr) a)
   deriving (MonadError ClaferSErr, Monad, Functor, MonadReader TypeInfo, Applicative)
-  
+
 typeOfUid :: MonadTypeAnalysis m => String -> m IType
 typeOfUid uid = (fromMaybe (TClafer [uid]) . lookup uid) <$> typeDecls
 
@@ -52,11 +52,11 @@
   -- What "this" refers to
   curThis :: m SClafer
   localCurThis :: SClafer -> m a -> m a
-  
+
   -- The next path is a child of curPath (or Nothing)
   curPath :: m (Maybe IType)
   localCurPath :: IType -> m a -> m a
-  
+
   -- Extra declarations
   typeDecls :: m TypeDecls
   localDecls :: TypeDecls -> m a -> m a
@@ -67,19 +67,19 @@
     TypeAnalysis $ local setCurThis d
     where
     setCurThis t = t{iCurThis = newThis}
-    
+
   curPath = TypeAnalysis $ asks iCurPath
   localCurPath newPath (TypeAnalysis d) =
     TypeAnalysis $ local setCurPath d
     where
     setCurPath t = t{iCurPath = Just newPath}
-    
+
   typeDecls = TypeAnalysis $ asks iTypeDecls
   localDecls extra (TypeAnalysis d) =
     TypeAnalysis $ local addTypeDecls d
     where
     addTypeDecls t@TypeInfo{iTypeDecls = c} = t{iTypeDecls = extra ++ c}
-    
+
 instance MonadTypeAnalysis m => MonadTypeAnalysis (ListT m) where
   curThis = lift $ curThis
   localCurThis = mapListT . localCurThis
@@ -87,7 +87,7 @@
   localCurPath = mapListT . localCurPath
   typeDecls = lift typeDecls
   localDecls = mapListT . localDecls
-  
+
 instance MonadTypeAnalysis m => MonadTypeAnalysis (ErrorT ClaferSErr m) where
   curThis = lift $ curThis
   localCurThis = mapErrorT . localCurThis
@@ -95,8 +95,8 @@
   localCurPath = mapErrorT . localCurPath
   typeDecls = lift typeDecls
   localDecls = mapErrorT . localDecls
-      
 
+
 instance MonadAnalysis TypeAnalysis where
   clafers = asks (sclafers . iInfo)
   withClafers cs r =
@@ -109,10 +109,10 @@
 runTypeAnalysis (TypeAnalysis tc) imodule = runReaderT tc $ TypeInfo [] (gatherInfo imodule) undefined Nothing
 
 unionType :: IType -> [String]
-unionType TString  = ["string"]
-unionType TReal    = ["real"]
-unionType TInteger = ["integer"]
-unionType TBoolean = ["boolean"]
+unionType TString  = [stringType]
+unionType TReal    = [realType]
+unionType TInteger = [integerType]
+unionType TBoolean = [booleanType]
 unionType (TClafer u) = u
 
 (+++) :: IType -> IType -> IType
@@ -133,7 +133,7 @@
 closure ut = concat <$> mapM hierarchy ut
 
 intersection :: MonadAnalysis m => IType -> IType -> m (Maybe IType)
-intersection t1 t2 = 
+intersection t1 t2 =
   do
     h1 <- mapM hierarchy $ unionType t1
     h2 <- mapM hierarchy $ unionType t2
@@ -173,7 +173,7 @@
 -- C : A
 -- Outputs:
 -- the resulting type is: A, and the type combination is valid
-getIfThenElseType t1 t2 = 
+getIfThenElseType t1 t2 =
   do
     h1 <- mapM hierarchy $ unionType t1
     h2 <- mapM hierarchy $ unionType t2
@@ -181,15 +181,15 @@
     return $ fromUnionType ut
   where
   commonHierarchy h1 h2 = filterClafer $ commonHierarchy' (reverse h1) (reverse h2) Nothing
-  commonHierarchy' (x:xs) (y:ys) accumulator = 
-    if (x == y) 
-      then 
-        if (null xs || null ys) 
+  commonHierarchy' (x:xs) (y:ys) accumulator =
+    if (x == y)
+      then
+        if (null xs || null ys)
           then Just x
-          else commonHierarchy' xs ys $ Just x 
+          else commonHierarchy' xs ys $ Just x
       else accumulator
-  commonHierarchy' _ _ _ = error "Function commonHierarchy' from ResolverType expects two non empty lists but was given at least one empty list!" -- Should never happen    
-  filterClafer value = 
+  commonHierarchy' _ _ _ = error "Function commonHierarchy' from ResolverType expects two non empty lists but was given at least one empty list!" -- Should never happen
+  filterClafer value =
     if (value == Just "clafer") then Nothing else value
 
 resolveTModule :: (IModule, GEnv) -> Either ClaferSErr IModule
@@ -198,7 +198,7 @@
     Right mDecls' -> return imodule{_mDecls = mDecls'}
     Left err      -> throwError err
   where
-  analysis decls1 = mapM (resolveTElement $ rootUid) decls1
+  analysis decls1 = mapM (resolveTElement rootIdent) decls1
 
 resolveTElement :: String -> IElement -> TypeAnalysis IElement
 resolveTElement _ (IEClafer iclafer) =
@@ -217,14 +217,14 @@
   IEGoal isMaximize' <$> resolveTConstraint parent' pexp'
 
 resolveTConstraint :: String -> PExp -> TypeAnalysis PExp
-resolveTConstraint curThis' constraint = 
+resolveTConstraint curThis' constraint =
   do
     curThis'' <- claferWithUid curThis'
     head <$> (localCurThis curThis'' $ (resolveTPExp constraint :: TypeAnalysis [PExp]))
-    
 
+
 resolveTPExp :: PExp -> TypeAnalysis [PExp]
-resolveTPExp p = 
+resolveTPExp p =
   do
     x <- resolveTPExp' p
     case partitionEithers x of
@@ -258,7 +258,7 @@
           addRef result -- Case 2: Dereference the sident 1..* times
       Nothing -> throwError $ SemanticErr _inPos "Cannot parent at the start of a path"
 resolveTPExp' p@PExp{_exp = IClaferId{_sident = "integer"}} = runListT $ runErrorT $ return $ p `withType` TInteger
-resolveTPExp' p@PExp{_inPos, _exp = IClaferId{_sident}} = 
+resolveTPExp' p@PExp{_inPos, _exp = IClaferId{_sident}} =
   runListT $ runErrorT $ do
     curPath' <- curPath
     sident' <- if _sident == "this" then uid <$> curThis else return _sident
@@ -269,8 +269,8 @@
     return result -- Case 1: Use the sident
       <++>
       addRef result -- Case 2: Dereference the sident 1..* times
-  
-  
+
+
 resolveTPExp' p@PExp{_inPos, _exp} =
   runListT $ runErrorT $ do
     (iType', exp') <- ErrorT $ ListT $ resolveTExp _exp
@@ -304,7 +304,7 @@
         localCurPath (typeOf arg1') $ do
             arg2' <- liftError $ lift $ ListT $ resolveTPExp arg2
             return (fromJust $ _iType arg2', e{_exps = [arg1', arg2']})
-      
+
   resolveTExp e@IFunExp {_op = "++", _exps = [arg1, arg2]} =
     do
       arg1s' <- resolveTPExp arg1
@@ -346,7 +346,7 @@
       result' <- result
       return (result', e{_exps = [arg1', arg2']})
 
-  resolveTExp e@(IFunExp "=>else" [arg1, arg2, arg3]) =
+  resolveTExp e@(IFunExp "ifthenelse" [arg1, arg2, arg3]) =
     runListT $ runErrorT $ do
       arg1' <- lift $ ListT $ resolveTPExp arg1
       arg2' <- lift $ ListT $ resolveTPExp arg2
@@ -366,7 +366,7 @@
         Nothing  -> throwError $ SemanticErr _inPos ("Function '=>else' cannot be performed on if '" ++ str t1 ++ "' then '" ++ str t2 ++ "' else '" ++ str t3 ++ "'")
 
       return (t, e{_exps = [arg1', arg2', arg3']})
-      
+
   resolveTExp e@IDeclPExp{_oDecls, _bpexp} =
     runListT $ runErrorT $ do
       oDecls' <- mapM resolveTDecl _oDecls
@@ -379,7 +379,7 @@
       do
         body' <- lift $ ListT $ resolveTPExp _body
         return $ d{_body = body'}
-        
+
   resolveTExp e = error $ "Unknown iexp: " ++ show e
 
 -- Adds "refs" at the end, effectively dereferencing Clafers when needed.
@@ -387,12 +387,12 @@
 addRef pexp =
   do
     localCurPath (typeOf pexp) $ do
-      deref <- (ErrorT $ ListT $ resolveTPExp' $ newPExp $ IClaferId "" "ref" False) `catchError` const (lift mzero)
+      deref <- (ErrorT $ ListT $ resolveTPExp' $ newPExp $ IClaferId "" "ref" False Nothing) `catchError` const (lift mzero)
       let result = (newPExp $ IFunExp "." [pexp, deref]) `withType` typeOf deref
       return result <++> addRef result
   where
   newPExp = PExp Nothing "" $ _inPos pexp
-  
+
 typeOf :: PExp -> IType
 typeOf pexp = fromMaybe (error "No type") $ _iType pexp
 
diff --git a/src/Language/Clafer/Intermediate/ScopeAnalysis.hs b/src/Language/Clafer/Intermediate/ScopeAnalysis.hs
--- a/src/Language/Clafer/Intermediate/ScopeAnalysis.hs
+++ b/src/Language/Clafer/Intermediate/ScopeAnalysis.hs
@@ -26,8 +26,8 @@
 import Language.Clafer.Intermediate.GLPKScopeAnalyzer
 import Language.Clafer.Intermediate.SimpleScopeAnalyzer
 
--- | Return an appropriate scope analysis for a given strategy 
+-- | Return an appropriate scope analysis for a given strategy
 getScopeStrategy :: ScopeStrategy -> IModule -> [(String, Integer)]
 getScopeStrategy Simple = simpleScopeAnalysis
-getScopeStrategy Full   = glpkScopeAnalysis 
-getScopeStrategy _             = const []
+getScopeStrategy Full   = glpkScopeAnalysis
+getScopeStrategy _             = const []
diff --git a/src/Language/Clafer/Intermediate/SimpleScopeAnalyzer.hs b/src/Language/Clafer/Intermediate/SimpleScopeAnalyzer.hs
--- a/src/Language/Clafer/Intermediate/SimpleScopeAnalyzer.hs
+++ b/src/Language/Clafer/Intermediate/SimpleScopeAnalyzer.hs
@@ -21,7 +21,7 @@
 -}
 module Language.Clafer.Intermediate.SimpleScopeAnalyzer (simpleScopeAnalysis) where
 
-import Language.Clafer.Common
+import Control.Applicative ((<$>))
 import Control.Lens hiding (elements, assign)
 import Data.Graph
 import Data.List
@@ -30,36 +30,26 @@
 import Data.Maybe
 import Data.Ord
 import Data.Ratio
-import Language.Clafer.Intermediate.Intclafer
 import Prelude hiding (exp)
 
-
-isReference :: IClafer -> Bool
-isReference = _isOverlapping . _super
-isConcrete :: IClafer -> Bool
-isConcrete = not . isReference
-isSuperest :: [IClafer] -> IClafer -> Bool
-isSuperest clafers clafer = isNothing $ directSuper clafers clafer
-
+import Language.Clafer.Common
+import Language.Clafer.Intermediate.Intclafer
 
 -- | Collects the global cardinality and hierarchy information into proper, not necessarily lower, bounds.
 simpleScopeAnalysis :: IModule -> [(String, Integer)]
-simpleScopeAnalysis IModule{_mDecls = decls'} =
-    [(a, b) | (a, b) <- finalAnalysis, isReferenceOrSuper a, b /= 1]
+simpleScopeAnalysis iModule@IModule{_mDecls = decls'} =
+    [(a, b) | (a, b) <- finalAnalysis, b /= 1]
     where
+    uidClaferMap = createUidIClaferMap iModule
+    findClafer :: UID -> IClafer
+    findClafer uid' = fromJust $ findIClafer uidClaferMap uid'
+
     finalAnalysis = Map.toList $ foldl analyzeComponent supersAndRefsAnalysis connectedComponents
-    
-    isReferenceOrSuper uid' =
-        isConcrete clafer || isReference clafer || isSuperest clafers clafer
-        where
-        clafer = findClafer uid'
-        
-    isConcrete' uid' = isConcrete $ findClafer uid'
-    
+
     upperCards u =
         Map.findWithDefault (error $ "No upper cardinality for clafer named \"" ++ u ++ "\".") u upperCardsMap
     upperCardsMap = Map.fromList [(_uid c, snd $ fromJust $ _card c) | c <- clafers]
-    
+
     supersAnalysis = foldl (analyzeSupers clafers) Map.empty decls'
     supersAndRefsAnalysis = foldl (analyzeRefs clafers) supersAnalysis decls'
     constraintAnalysis = analyzeConstraints constraints upperCards
@@ -67,20 +57,19 @@
     connectedComponents = analyzeDependencies clafers
     clafers = concatMap findClafers decls'
     constraints = concatMap findConstraints decls'
-    findClafer uid' = fromJust $ find (isEqClaferId uid') clafers
-    
+
     lowerOrUpperFixedCard analysis' clafer =
         maximum [cardLb, cardUb, lowFromConstraints, oneForStar, targetScopeForStar ]
         where
         Just (cardLb, cardUb) = _card clafer
         oneForStar = if (cardLb == 0 && cardUb == -1) then 1 else 0
-        targetScopeForStar = if (isReference clafer && cardUb == -1) 
-            then case (directSuper clafers clafer) of
-                    (Just targetClafer) -> Map.findWithDefault 0 (_uid targetClafer) analysis'
-                    Nothing -> 0
+        targetScopeForStar = if ((isJust $ _reference clafer) && cardUb == -1)
+            then case getReference clafer of
+                [ref'] -> Map.findWithDefault 1 (fromMaybe "unknown" $ _uid <$> findIClafer uidClaferMap ref' ) analysis'
+                _      -> 0
             else 0
         lowFromConstraints = Map.findWithDefault 0 (_uid clafer) constraintAnalysis
-    
+
     analyzeComponent analysis' component =
         case flattenSCC component of
             [uid'] -> analyzeSingleton uid' analysis'
@@ -91,7 +80,7 @@
                 assume = foldr (`Map.insert` 1) analysis' uids
         where
         analyzeSingleton uid' analysis'' = analyze analysis'' $ findClafer uid'
-    
+
     analyze :: Map String Integer -> IClafer -> Map String Integer
     analyze analysis' clafer =
         -- Take the max between the supers and references analysis and this analysis
@@ -100,8 +89,8 @@
         scope
             | _isAbstract clafer  = sum subclaferScopes
             | otherwise          = parentScope * (lowerOrUpperFixedCard analysis' clafer)
-        
-        subclaferScopes = map (findOrError " subclafer scope not found" analysis') $ filter isConcrete' subclafers
+
+        subclaferScopes = map (findOrError " subclafer scope not found" analysis') subclafers
         parentScope  =
             case parentMaybe of
                 Just parent'' -> findOrError " parent scope not found" analysis' parent''
@@ -110,33 +99,33 @@
         parentMaybe = Map.lookup (_uid clafer) parentMap
         rootScope = 1
         findOrError message m key = Map.findWithDefault (error $ key ++ message) key m
-        
-analyzeSupers :: [IClafer] -> Map String Integer -> IElement -> Map String Integer    
+
+analyzeSupers :: [IClafer] -> Map String Integer -> IElement -> Map String Integer
 analyzeSupers clafers analysis (IEClafer clafer) =
     foldl (analyzeSupers clafers) analysis' (_elements clafer)
     where
     (Just (cardLb, cardUb)) = _card clafer
     lowerOrFixedUpperBound = maximum [1, cardLb, cardUb ]
-    analysis' = if (isReference clafer) 
+    analysis' = if (isJust $ _reference clafer)
                 then analysis
                 else case (directSuper clafers clafer) of
                   (Just c) -> Map.alter (incLB lowerOrFixedUpperBound) (_uid c) analysis
-                  Nothing -> analysis                     
+                  Nothing -> analysis
     incLB lb' Nothing = Just lb'
     incLB lb' (Just lb) = Just (lb + lb')
 analyzeSupers _ analysis _ = analysis
 
-analyzeRefs :: [IClafer] -> Map String Integer -> IElement -> Map String Integer    
+analyzeRefs :: [IClafer] -> Map String Integer -> IElement -> Map String Integer
 analyzeRefs clafers analysis (IEClafer clafer) =
     foldl (analyzeRefs clafers) analysis' (_elements clafer)
     where
     (Just (cardLb, cardUb)) = _card clafer
     lowerOrFixedUpperBound = maximum [1, cardLb, cardUb]
-    analysis' = if (isReference clafer) 
+    analysis' = if (isJust $ _reference clafer)
                 then case (directSuper clafers clafer) of
                     (Just c) -> Map.alter (maxLB lowerOrFixedUpperBound) (_uid c) analysis
                     Nothing -> analysis
-                else analysis                     
+                else analysis
     maxLB lb' Nothing = Just lb'
     maxLB lb' (Just lb) = Just (max lb lb')
 analyzeRefs _ analysis _ = analysis
@@ -152,7 +141,7 @@
             ISome -> True
             _     -> False
     isOneOrSomeConstraint _ = False
-    
+
     -- Only considers how quantifiers affect scope. Other types of constraints are not considered.
     -- Constraints of the type [some path1.path2] or [no path1.path2], etc.
     analyzeConstraint PExp{_exp = IDeclPExp{_oDecls = [], _bpexp = bpexp'}} analysis =
@@ -160,7 +149,7 @@
         where
         path' = dropThisAndParent $ unfoldJoins bpexp'
         atLeastOne = Map.insertWith max `flip` 1
-        
+
     -- Constraints of the type [all disj a : path1.path2] or [some b : path3.path4], etc.
     analyzeConstraint PExp{_exp = IDeclPExp{_oDecls = decls'}} analysis =
         foldr analyzeDecl analysis decls'
@@ -175,9 +164,9 @@
         -- "disj a;b;c" implies at least 3 whereas "a;b;c" implies at least one.
         minScope = if isDisj' then fromIntegral $ length decls' else 1
         insert' = Map.insertWith max
-        
+
         scores = assign path' minScope
-        
+
         {-
          - abstract Z
          -   C *
@@ -193,7 +182,7 @@
          -- b) Make the effective lower cardinality of C=1 and D=4
          -- c) Some other combination.
          -- Choose b, a greedy algorithm that starts from the lowest child progressing upwards.
-         
+
         {-
          - abstract Z
          -   C *
@@ -219,9 +208,9 @@
         pDesireScore = ceiling (score % psScore)
         pMaxScore = upperCards p
         pScore = min' pDesireScore pMaxScore
-        
+
     min' a b = if b == -1 then a else min a b
-        
+
     -- The each child has at most one parent. No matter what the path in a quantifier
     -- looks like, we ignore the parent parts.
     dropThisAndParent = dropWhile (== "parent") . dropWhile (== "this")
@@ -242,7 +231,7 @@
      -- clafers with no dependencies will not appear in the result.
     selfDependency = (_uid clafer, _uid clafer)
     superDependency
-        | isReference clafer = Nothing
+        | isNothing $ _super clafer = Nothing
         | otherwise =
             do
                 super' <- directSuper clafers clafer
@@ -250,21 +239,21 @@
                 return (_uid super', _uid clafer)
     -- Need to analyze clafer before its children
     childDependencies = [(_uid child, _uid clafer) | child <- childClafers clafer]
-        
 
+
 analyzeHierarchy :: [IClafer] -> (Map String [String], Map String String)
 analyzeHierarchy clafers =
     foldl hierarchy (Map.empty, Map.empty) clafers
     where
     hierarchy (subclaferMap, parentMap) clafer = (subclaferMap', parentMap')
         where
-            subclaferMap' = 
+            subclaferMap' =
                 case super' of
                     Just super'' -> Map.insertWith (++) (_uid super'') [_uid clafer] subclaferMap
                     Nothing     -> subclaferMap
             super' = directSuper clafers clafer
             parentMap' = foldr (flip Map.insert $ _uid clafer) parentMap (map _uid $ childClafers clafer)
-    
+
 directSuper :: [IClafer] -> IClafer -> Maybe IClafer
 directSuper clafers clafer =
     second $ findHierarchy getSuper clafers clafer
@@ -272,8 +261,8 @@
     second [] = Nothing
     second [_] = Nothing
     second (_:x:_) = Just x
-    
 
+
 -- Finds all ancestors
 findClafers :: IElement -> [IClafer]
 findClafers (IEClafer clafer) = clafer : concatMap findClafers (_elements clafer)
@@ -289,7 +278,7 @@
 -- Finds all the direct ancestors (ie. children)
 childClafers :: IClafer -> [IClafer]
 childClafers clafer = clafer ^.. elements.traversed.iClafer
-    
+
 -- Unfold joins
 -- If the expression is a tree of only joins, then this function will flatten
 -- the joins into a list.
diff --git a/src/Language/Clafer/Intermediate/StringAnalyzer.hs b/src/Language/Clafer/Intermediate/StringAnalyzer.hs
--- a/src/Language/Clafer/Intermediate/StringAnalyzer.hs
+++ b/src/Language/Clafer/Intermediate/StringAnalyzer.hs
@@ -41,8 +41,8 @@
 
 
 astrClafer :: MonadState (Map.Map String Int) m => IClafer -> m IClafer
-astrClafer (IClafer s isAbs gcrd ident' uid' super' crd gCard es) =
-    IClafer s isAbs gcrd ident' uid' super' crd gCard `liftM` mapM astrElement es
+astrClafer (IClafer s isAbs gcrd' ident' uid' puid' super' reference' crd' gCard es) =
+    IClafer s isAbs gcrd' ident' uid' puid' super' reference' crd' gCard `liftM` mapM astrElement es
 
 
 -- astrs single subclafer
@@ -68,4 +68,4 @@
     modify (\e -> Map.insertWith (flip const) str (Map.size e) e)
     st <- get
     return $  (IInt $ toInteger $ (Map.!) st str)
-  _ -> return x
+  _ -> return x
diff --git a/src/Language/Clafer/Intermediate/Tracing.hs b/src/Language/Clafer/Intermediate/Tracing.hs
--- a/src/Language/Clafer/Intermediate/Tracing.hs
+++ b/src/Language/Clafer/Intermediate/Tracing.hs
@@ -27,7 +27,7 @@
 import Language.Clafer.Intermediate.Intclafer
 
 traceIrModule :: IModule -> Map Span [Ir] --Map Span [Union (IRClafer IClafer) (IRPExp PExp)]
-traceIrModule = foldMapIR getMap 
+traceIrModule = foldMapIR getMap
   where
     insert :: Span -> Ir -> Map Span [Ir] -> Map Span [Ir]
     insert k a = Map.insertWith (++) k [a]
@@ -54,7 +54,7 @@
   i (AstElements a) = getSpan a
   i (AstElement a) = getSpan a
   i (AstSuper a) = getSpan a
-  i (AstSuperHow a) = getSpan a
+  i (AstReference a) = getSpan a
   i (AstInit a) = getSpan a
   i (AstInitHow a) = getSpan a
   i (AstGCard a) = getSpan a
@@ -71,17 +71,17 @@
   i (AstLocId a) = getSpan a
 
 traverseModule :: Module -> [Ast]
-traverseModule x@(Module _ d) = AstModule x : concatMap traverseDeclaration d 
+traverseModule x@(Module _ d) = AstModule x : concatMap traverseDeclaration d
 
 traverseDeclaration :: Declaration -> [Ast]
 traverseDeclaration x =
   AstDeclaration x :
     case x of
-    EnumDecl _ _ e -> concatMap traverseEnumId e  
-    ElementDecl _ e -> traverseElement e          
+    EnumDecl _ _ e -> concatMap traverseEnumId e
+    ElementDecl _ e -> traverseElement e
 
 traverseClafer :: Clafer -> [Ast]
-traverseClafer x@(Clafer _ a b _ d e f g) = AstClafer x : (traverseAbstract a ++ traverseGCard b ++ traverseSuper d ++ traverseCard e ++ traverseInit f ++ traverseElements g)
+traverseClafer x@(Clafer _ a b _ d r e f g) = AstClafer x : (traverseAbstract a ++ traverseGCard b ++ traverseSuper d ++ traverseReference r ++ traverseCard e ++ traverseInit f ++ traverseElements g)
 
 traverseConstraint :: Constraint -> [Ast]
 traverseConstraint x@(Constraint _ e) = AstConstraint x : concatMap traverseExp e
@@ -118,11 +118,15 @@
   AstSuper x :
     case x of
     SuperEmpty _ -> []
-    SuperSome _ sh se -> traverseSuperHow sh ++ traverseSetExp se
+    SuperSome _ se -> traverseSetExp se
 
-traverseSuperHow :: SuperHow -> [Ast]
-traverseSuperHow x =
-  AstSuperHow x : [{- no other children -}]
+traverseReference :: Reference -> [Ast]
+traverseReference x =
+  AstReference x :
+    case x of
+    ReferenceEmpty _ -> []
+    ReferenceSet _ se -> traverseSetExp se
+    ReferenceBag _ se -> traverseSetExp se
 
 traverseInit :: Init -> [Ast]
 traverseInit x =
@@ -203,7 +207,7 @@
     EDouble _ _ -> []
     EStr _ _ -> []
     ESetExp _ s -> traverseSetExp s
-    _ -> error "Invalid argument given to function traverseExp from Tracing" 
+    _ -> error "Invalid argument given to function traverseExp from Tracing"
 
 traverseSetExp :: SetExp -> [Ast]
 traverseSetExp x =
@@ -217,7 +221,7 @@
     Range _ s1 s2 -> traverseSetExp s1 ++ traverseSetExp s2
     Join _ s1 s2 -> traverseSetExp s1 ++ traverseSetExp s2
     ClaferId _ n -> traverseName n
-    
+
 traverseDecl :: Decl -> [Ast]
 traverseDecl x@(Decl _ l s) =
   AstDecl x : (concatMap traverseLocId l ++ traverseSetExp s)
@@ -234,7 +238,7 @@
 
 traverseLocId :: LocId -> [Ast]
 traverseLocId _ = []
-  
+
 data Ast =
   AstModule Module |
   AstDeclaration Declaration |
@@ -246,7 +250,7 @@
   AstElements Elements |
   AstElement Element |
   AstSuper Super |
-  AstSuperHow SuperHow |
+  AstReference Reference |
   AstInit Init |
   AstInitHow InitHow |
   AstGCard GCard |
@@ -261,4 +265,4 @@
   AstEnumId EnumId |
   AstModId ModId |
   AstLocId LocId
-  deriving (Eq, Show)
+  deriving (Eq, Show)
diff --git a/src/Language/Clafer/Intermediate/Transformer.hs b/src/Language/Clafer/Intermediate/Transformer.hs
--- a/src/Language/Clafer/Intermediate/Transformer.hs
+++ b/src/Language/Clafer/Intermediate/Transformer.hs
@@ -34,10 +34,10 @@
 transElement :: IElement -> IElement
 transElement (IEClafer clafer)           = IEClafer $ transClafer clafer
 transElement (IEConstraint isHard' pexp) = IEConstraint isHard' $ transPExp False pexp
-transElement (IEGoal isMaximize' pexp)   = IEGoal isMaximize' $ transPExp False pexp  
+transElement (IEGoal isMaximize' pexp)   = IEGoal isMaximize' $ transPExp False pexp
 
 transClafer :: IClafer -> IClafer
-transClafer = I.elements . traversed %~ transElement 
+transClafer = I.elements . traversed %~ transElement
 
 transPExp :: Bool -> PExp -> PExp
 transPExp True  pexp'@(PExp iType' _ _ _) = desugarPath $ I.exp %~ transIExp (fromJust $ iType') $ pexp'
@@ -47,7 +47,7 @@
 transIExp _ idpe@(IDeclPExp _ _ _) = bpexp            %~ transPExp False $ idpe
 transIExp iType' ife@(IFunExp op' _)    = exps . traversed %~ transPExp cond  $ ife
   where
-    cond = op' == iIfThenElse && 
+    cond = op' == iIfThenElse &&
            iType' `elem` [TBoolean, TClafer []]
 transIExp _      iexp' = iexp'
 
diff --git a/src/Language/Clafer/JSONMetaData.hs b/src/Language/Clafer/JSONMetaData.hs
--- a/src/Language/Clafer/JSONMetaData.hs
+++ b/src/Language/Clafer/JSONMetaData.hs
@@ -28,7 +28,7 @@
   writeCfrScopeFile,
   readCfrScopeFile
 )
-        
+
 where
 
 import Control.Lens hiding (element)
@@ -46,16 +46,16 @@
 -- | Generate a JSON list of triples containing a fully-qualified-, least-partially-qualified name, and unique id.
 -- | Both the FQNames and UIDs are brittle. LPQNames are the least brittle.
 generateJSONnameUIDMap :: QNameMaps -> String
-generateJSONnameUIDMap    qNameMaps     = 
-    prettyPrintJSON $ convertString $ toJsonBS $ foldl generateQNameUIDArrayEntry mempty sortedTriples 
+generateJSONnameUIDMap    qNameMaps     =
+    prettyPrintJSON $ convertString $ toJsonBS $ foldl generateQNameUIDArrayEntry mempty sortedTriples
     where
       sortedTriples :: [(FQName, PQName, UID)]
       sortedTriples = List.sortBy (\(fqName1, _, _) (fqName2, _, _) -> compare fqName1 fqName2) $ getQNameUIDTriples qNameMaps
 
 generateQNameUIDArrayEntry :: Array -> (FQName, PQName, UID) -> Array
-generateQNameUIDArrayEntry    array    (fqName, lpqName, uid) = 
-    mappend array $ element $ mconcat [ 
-        row ("fqName" :: String) fqName, 
+generateQNameUIDArrayEntry    array    (fqName, lpqName, uid) =
+    mappend array $ element $ mconcat [
+        row ("fqName" :: String) fqName,
         row ("lpqName" :: String) lpqName,
         row ("uid" :: String) uid ]
 
@@ -70,8 +70,8 @@
 
 
 generateLpqNameScopeArrayEntry :: Array -> (PQName, Integer)   -> Array
-generateLpqNameScopeArrayEntry    array    (lpqName, scope) = 
-    mappend array $ element $ mconcat [ 
+generateLpqNameScopeArrayEntry    array    (lpqName, scope) =
+    mappend array $ element $ mconcat [
         row ("lpqName" :: String) lpqName,
         row ("scope" :: String) scope ]
 
@@ -87,21 +87,21 @@
 prettyPrintJSON (c:line) =  c:(prettyPrintJSON line)
 prettyPrintJSON ""         = ""
 
--- | given the QNameMaps, parse the JSON scopes and return list of scopes 
+-- | given the QNameMaps, parse the JSON scopes and return list of scopes
 parseJSONScopes :: QNameMaps -> String    -> [ (UID, Integer) ]
-parseJSONScopes    qNameMaps    scopesJSON = 
+parseJSONScopes    qNameMaps    scopesJSON =
     foldl (\uidScopes qScope -> (qNameToUIDs qScope) ++ uidScopes) [] decodedScopes
     where
-      --                  QName 
+      --                  QName
       decodedScopes :: [ (T.Text, Integer) ]
-      decodedScopes = scopesJSON ^.. _Array . traverse 
+      decodedScopes = scopesJSON ^.. _Array . traverse
                                        . to (\o -> ( o ^?! key "lpqName" . _String
                                                    , o ^?! key "scope"  . _Integer)
                                             )
       -- a QName may resolve to potentially multiple UIDs
       qNameToUIDs :: (T.Text, Integer) -> [ (UID, Integer) ]
       qNameToUIDs   (qName, scope)  = if T.null qName
-                                       then [ ("", scope) ] 
+                                       then [ ("", scope) ]
                                        else [ (uid, scope) | uid <- getUIDs qNameMaps $ convertString qName]
 
 -- | Write a .cfr-scope file
@@ -117,7 +117,7 @@
     let
         cfrScopeFileName = replaceExtension modelName ".cfr-scope"
     exists <- doesFileExist cfrScopeFileName
-    if exists 
+    if exists
     then do
         scopesInJSON <- readFile cfrScopeFileName
         return $ Just $ parseJSONScopes qNameMaps scopesInJSON
diff --git a/src/Language/Clafer/Optimizer/Optimizer.hs b/src/Language/Clafer/Optimizer/Optimizer.hs
--- a/src/Language/Clafer/Optimizer/Optimizer.hs
+++ b/src/Language/Clafer/Optimizer/Optimizer.hs
@@ -24,6 +24,7 @@
 
 import Data.Maybe
 import Data.List
+import Control.Applicative ((<$>))
 import Control.Lens hiding (elements, children, un)
 import Control.Monad.State
 import Data.Data.Lens (biplate)
@@ -71,7 +72,7 @@
   where
   unusedAbs = map IEClafer $ findUnusedAbs clafers $ map _uid $
               filter (not._isAbstract) clafers
-  clafers   = toClafers decls' 
+  clafers   = toClafers decls'
   getIClafer (IEClafer c) = c
   getIClafer _ = error "Function makeZeroUnusedAbs from Optimizer expected paramter of type IClafer got a differnt IElement" --This should never happen
 
@@ -98,7 +99,7 @@
 getExtended c =
   sName ++ ((getSubclafers $ _elements c) >>= getExtended)
   where
-  sName = if not $ _isOverlapping $ _super c then [getSuper c] else []
+  sName = getSuper c
 
 -- -----------------------------------------------------------------------------
 -- inheritance  expansions
@@ -108,15 +109,12 @@
 
 expClafer :: MonadState GEnv m => IClafer -> m IClafer
 expClafer claf = do
-  super' <- expSuper $ _super claf
+  super' <- case _super claf of
+    Nothing      -> return Nothing
+    (Just pexp') -> Just `liftM` expPExp pexp'
   elements' <- mapM expElement $ _elements claf
   return $ claf {_super = super', _elements = elements'}
 
-expSuper :: MonadState GEnv m => ISuper -> m ISuper
-expSuper x = case x of
-  ISuper False _ -> return x
-  ISuper True pexps -> ISuper True `liftM` mapM expPExp pexps
-
 expElement :: MonadState GEnv m => IElement -> m IElement
 expElement x = case x of
   IEClafer claf  -> IEClafer `liftM` expClafer claf
@@ -134,7 +132,7 @@
     return $ IDeclPExp quant' decls'' pexp'
   IFunExp op' exps' -> if op' == iJoin
                      then expNav x else IFunExp op' `liftM` mapM expPExp exps'
-  IClaferId _ _ _ -> expNav x
+  IClaferId _ _ _ _ -> expNav x
   _ -> return x
 
 expDecl :: MonadState GEnv m => IDecl -> m IDecl
@@ -148,12 +146,12 @@
   return $ mkIFunExp iUnion $ map fst xs'
 
 expNav' :: MonadState GEnv m => String -> IExp -> m (IExp, String)
-expNav' context (IFunExp _ (p0:p:_)) = do    
+expNav' context (IFunExp _ (p0:p:_)) = do
   (exp0', context') <- expNav' context  $ _exp p0
   (exp', context'') <- expNav' context' $ _exp p
   return (IFunExp iJoin [ p0 {_exp = exp0'}
                         , p  {_exp = exp'}], context'')
-expNav' context x@(IClaferId modName' id' isTop') = do
+expNav' context x@(IClaferId modName' id' isTop' bind' ) = do
   st <- gets stable
   if Map.member id' st
     then do
@@ -161,48 +159,40 @@
       let (impls', context') = maybe (impls, "")
            (\y -> ([[head y]], head y)) $
            find (\z -> context == (head.tail) z) impls
-      return (mkIFunExp iUnion $ map (\u -> IClaferId modName' u isTop') $
+      return (mkIFunExp iUnion $ map (\u -> IClaferId modName' u isTop' bind') $
               map head impls', context')
     else do
       return (x, id')
 expNav' _ _ = error "Function expNav' from Optimizer expects an argument of type ClaferId or IFunExp but was given another IExp"
 
-split' :: MonadState GEnv m => IExp -> (IExp -> m IExp) -> m [IExp] 
+split' :: MonadState GEnv m => IExp -> (IExp -> m IExp) -> m [IExp]
 split'(IFunExp _ (p:pexp:_)) f =
     split' (_exp p) (\s -> f $ IFunExp iJoin
       [p {_exp = s}, pexp])
-split' (IClaferId modName' id' isTop') f = do
+split' (IClaferId modName' id' isTop' bind') f = do
     st <- gets stable
-    mapM f $ map (\y -> IClaferId modName' y isTop') $ maybe [id'] (map head) $ Map.lookup id' st
+    mapM f $ map (\y -> IClaferId modName' y isTop' bind') $ maybe [id'] (map head) $ Map.lookup id' st
 split' _ _ = error "Function split' from Optimizer expects an argument of type ClaferId or IFunExp but was given another IExp"
 
 -- -----------------------------------------------------------------------------
 -- checking if all clafers have unique names and don't extend other clafers
 
 allUnique :: IModule -> Bool
-allUnique imodule = and un && (null $
-  filter (\xs -> 1 < length xs) $ group $ sort $ concat idents) && identsOk
-  where
-  (un, idents) = unzip $ map allUniqueElement $ _mDecls imodule
-  identsOk     = and $ map (checkConstraintElement (concat idents)) $ _mDecls imodule
-
-allUniqueClafer :: IClafer -> (Bool, [String])
-allUniqueClafer claf =
-  (getSuper claf `elem` "clafer" : primitiveTypes  && and un,
-   _ident claf : concat idents)
+allUnique iModule = dontExtend && identsUnique
   where
-  (un, idents) = unzip $ map allUniqueElement $ _elements claf
+    allClafers :: [ IClafer ]
+    allClafers = universeOn biplate iModule
 
-allUniqueElement :: IElement -> (Bool, [String])
-allUniqueElement x = case x of
-  IEClafer claf -> allUniqueClafer claf
-  IEConstraint _ _ -> (True, [])
-  IEGoal _ _ -> (True, [])
+    -- True when getSuper always returns Nothing and therefore concatMap returned []
+    dontExtend = null $ concatMap getSuper allClafers
+    allIdents = map _ident allClafers
+    -- all idents are unique when nub cannot remove any duplicates
+    identsUnique = (length allIdents) == (length $ nub allIdents)
 
 checkConstraintElement :: [String] -> IElement -> Bool
 checkConstraintElement idents x = case x of
   IEClafer claf -> and $ map (checkConstraintElement idents) $ _elements claf
-  IEConstraint _ pexp -> checkConstraintPExp idents pexp 
+  IEConstraint _ pexp -> checkConstraintPExp idents pexp
   IEGoal _ _ ->  True
 
 checkConstraintPExp :: [String] -> PExp -> Bool
@@ -212,7 +202,7 @@
 checkConstraintIExp idents x = case x of
    IDeclPExp _ oDecls' pexp ->
      checkConstraintPExp ((oDecls' >>= (checkConstraintIDecl idents)) ++ idents) pexp
-   IClaferId _ ident' _ -> if ident' `elem` (specialNames ++ idents) then True
+   IClaferId _ ident' _ _ -> if ident' `elem` (specialNames ++ (rootIdent : idents)) then True
                           else error $ "optimizer: " ++ ident' ++ " not found"
    _ -> True
 
@@ -226,7 +216,7 @@
 findDupModule args iModule = if check_duplicates args && (not $ null dups)
   then Left $ ClaferErr $ "--check-duplicates: Duplicate clafer names: " ++ (intercalate ", " dups)
   else Right iModule
-  where 
+  where
     allClafers :: [ IClafer ]
     allClafers = universeOn biplate iModule
     dups = findDuplicates allClafers
@@ -240,20 +230,16 @@
 
 markTopModule :: [IElement] -> [IElement]
 markTopModule decls' = map (markTopElement (
-      [this, parent, children, strType, intType, integerType] ++
+      specialNames ++ primitiveTypes ++
       (map _uid $ toClafers decls'))) decls'
 
 
 markTopClafer :: [String] -> IClafer -> IClafer
 markTopClafer clafers c =
-  c {_super = markTopSuper clafers $ _super c, 
+  c {_super = markTopPExp clafers <$> _super c,
      _elements = map (markTopElement clafers) $ _elements c}
 
 
-markTopSuper :: [String] -> ISuper -> ISuper
-markTopSuper clafers x = x{_supers = map (markTopPExp clafers) $ _supers x}
-
-
 markTopElement :: [String] -> IElement -> IElement
 markTopElement clafers x = case x of
   IEClafer c  -> IEClafer $ markTopClafer clafers c
@@ -270,8 +256,8 @@
   IDeclPExp quant' decl pexp -> IDeclPExp quant' (map (markTopDecl clafers) decl)
                                 (markTopPExp ((decl >>= _decls) ++ clafers) pexp)
   IFunExp op' exps' -> IFunExp op' $ map (markTopPExp clafers) exps'
-  IClaferId modName' sident' _ ->
-    IClaferId modName' sident' $ sident' `elem` clafers
+  IClaferId modName' sident' _ bind'->
+    IClaferId modName' sident' (sident' `elem` clafers) bind'
   _ -> x
 
 
diff --git a/src/Language/Clafer/QNameUID.hs b/src/Language/Clafer/QNameUID.hs
--- a/src/Language/Clafer/QNameUID.hs
+++ b/src/Language/Clafer/QNameUID.hs
@@ -23,16 +23,16 @@
 module Language.Clafer.QNameUID (
         QName,
         FQName,
-        PQName, 
+        PQName,
         QNameMaps,
         UID,
         deriveQNameMaps,
         getUIDs,
         getFQName,
         getLPQName,
-        getQNameUIDTriples 
+        getQNameUIDTriples
 )
-        
+
 where
 
 import Data.Maybe
@@ -54,7 +54,7 @@
 
 -- | partially-qualified name, must not begin with ::
 -- | e.g., `Person::name`, `chair`
-type PQName = String    
+type PQName = String
 
 -- a map from reversed FQName (FQKey) to UID
 type FQNameUIDMap = SMap.StringMap UID
@@ -71,19 +71,19 @@
 
 -- | get the fully-qualified name of a clafer given its UID
 getFQName :: QNameMaps                 -> UID -> Maybe FQName
-getFQName    (QNameMaps _ uidFqNameMap _) uid' = Map.lookup uid' uidFqNameMap 
+getFQName    (QNameMaps _ uidFqNameMap _) uid' = Map.lookup uid' uidFqNameMap
 
 -- | get the least-partially-qualified name of a clafer given its UID
 getLPQName :: QNameMaps                 -> UID -> Maybe PQName
-getLPQName    (QNameMaps _ _ uidLpqNameMap) uid' = Map.lookup uid' uidLpqNameMap 
+getLPQName    (QNameMaps _ _ uidLpqNameMap) uid' = Map.lookup uid' uidLpqNameMap
 
 -- | derive maps between fully-, partially-qualified names, and UIDs
 deriveQNameMaps :: IModule -> QNameMaps
-deriveQNameMaps    iModule = 
+deriveQNameMaps    iModule =
     let
         (fqNameUIDMap, uidFqNameMap) = deriveFQNameUIDMaps iModule
         uidLpqNameMap = deriveUidLpqNameMap fqNameUIDMap
-    in 
+    in
         QNameMaps fqNameUIDMap uidFqNameMap uidLpqNameMap
 
 deriveFQNameUIDMaps :: IModule -> (FQNameUIDMap, UIDFqNameMap)
@@ -93,22 +93,22 @@
 addElements    path        elems         maps                         = foldl (addClafer path) maps elems
 
 addClafer :: [String] -> (FQNameUIDMap, UIDFqNameMap) -> IElement          -> (FQNameUIDMap, UIDFqNameMap)
-addClafer    path        (fqNameUIDMap, uidFqNameMap)    (IEClafer iClaf) = 
-    let 
-        newPath = (_ident iClaf) : path 
+addClafer    path        (fqNameUIDMap, uidFqNameMap)    (IEClafer iClaf) =
+    let
+        newPath = (_ident iClaf) : path
         fqKey :: FQKey
         fqKey = concat newPath
         fqName :: FQName
         fqName = getQNameFromKey fqKey
         fqNameUIDMap' = SMap.insert fqKey (_uid iClaf) fqNameUIDMap
         uidFqNameMap' = Map.insert (_uid iClaf) fqName uidFqNameMap
-    in 
+    in
         addElements ("::" : newPath) (_elements iClaf) (fqNameUIDMap', uidFqNameMap')
 addClafer    _           maps                            _                  = maps
 
 findUIDsByFQName :: FQNameUIDMap -> FQName            -> [ UID ]
 findUIDsByFQName    fqNameUIDMap    fqName@(':':':':_) = SMap.lookup (getFQKey fqName) fqNameUIDMap
-findUIDsByFQName    fqNameUIDMap    fqName             = SMap.prefixFind (getFQKey fqName) fqNameUIDMap 
+findUIDsByFQName    fqNameUIDMap    fqName             = SMap.prefixFind (getFQKey fqName) fqNameUIDMap
 
 reverseOnQualifier :: FQName -> FQName
 reverseOnQualifier fqName = concat $ reverse $ split (onSublist "::") fqName
@@ -120,11 +120,11 @@
 getQNameFromKey = reverseOnQualifier
 
 deriveUidLpqNameMap :: FQNameUIDMap ->  UIDLpqNameMap
-deriveUidLpqNameMap    fqNameUIDMap = 
+deriveUidLpqNameMap    fqNameUIDMap =
     SMap.foldrWithKey (generateUIDLpqMapEntry fqNameUIDMap) Map.empty fqNameUIDMap
 
 generateUIDLpqMapEntry :: FQNameUIDMap ->  SMap.Key -> UID -> UIDLpqNameMap -> UIDLpqNameMap
-generateUIDLpqMapEntry    fqNameUIDMap     fqKey       uid'   uidLpqNameMap = 
+generateUIDLpqMapEntry    fqNameUIDMap     fqKey       uid'   uidLpqNameMap =
     Map.insert uid' lpqName uidLpqNameMap
     where
       -- need to reverse the key to get a fully qualified name
@@ -145,12 +145,12 @@
       -- handle partially qualified name case
       findLeastQualifiedName pqName fqNameUIDMap' =
          let
-            -- remove one segment of qualification 
+            -- remove one segment of qualification
             lessQName =  concat $ drop 2 $ split (onSublist "::") pqName
-         in 
+         in
             if (length (findUIDsByFQName fqNameUIDMap' lessQName) > 1)
               then pqName
-              else findLeastQualifiedName lessQName fqNameUIDMap'      
+              else findLeastQualifiedName lessQName fqNameUIDMap'
 
 getQNameUIDTriples :: QNameMaps -> [(FQName, PQName, UID)]
 getQNameUIDTriples qNameMaps@(QNameMaps _ uidFqNameMap _) =
diff --git a/src/Language/Clafer/SplitJoin.hs b/src/Language/Clafer/SplitJoin.hs
--- a/src/Language/Clafer/SplitJoin.hs
+++ b/src/Language/Clafer/SplitJoin.hs
@@ -50,4 +50,4 @@
         f Quot ('\"':xs) = f Norm xs
         f Norm (x:xs) | isSpace x = Nothing : f Init xs
         f m (x:xs) = Just x : f m xs
-        f _ [] = []
+        f _ [] = []
diff --git a/src/Language/ClaferT.hs b/src/Language/ClaferT.hs
--- a/src/Language/ClaferT.hs
+++ b/src/Language/ClaferT.hs
@@ -25,41 +25,47 @@
 This is in a separate module from the module "Language.Clafer" so that other modules that require
 ClaferEnv can just import this module without all the parsing/compiline/generating functionality.
  -}
-module Language.ClaferT (
-                         ClaferEnv(..), 
-                         makeEnv, 
-                         getAst, 
-                         getIr, 
-                         ClaferM, 
-                         ClaferT, 
-                         CErr(..), 
-                         CErrs(..), 
-                         ClaferErr, 
-                         ClaferErrs, 
-                         ClaferSErr, 
-                         ClaferSErrs, 
-                         ErrPos(..), 
-                         PartialErrPos(..), 
-                         throwErrs, 
-                         throwErr, 
-                         catchErrs, 
-                         getEnv, 
-                         getsEnv, 
-                         modifyEnv, 
-                         putEnv, 
-                         runClafer, 
-                         runClaferT, 
-                         Throwable(..), 
-                         Span(..), 
-                         Pos(..)
-) where
+module Language.ClaferT
+  ( ClaferEnv(..)
+  , irModuleTrace
+  , uidIClaferMap
+  , parentIClaferMap
+  , makeEnv
+  , getAst
+  , getIr
+  , ClaferM
+  , ClaferT
+  , CErr(..)
+  , CErrs(..)
+  , ClaferErr
+  , ClaferErrs
+  , ClaferSErr
+  , ClaferSErrs
+  , ErrPos(..)
+  , PartialErrPos(..)
+  , throwErrs
+  , throwErr
+  , catchErrs
+  , getEnv
+  , getsEnv
+  , modifyEnv
+  , putEnv
+  , runClafer
+  , runClaferT
+  , Throwable(..)
+  , Span(..)
+  , Pos(..)
+  ) where
 
 import Control.Monad.Error
 import Control.Monad.State
 import Control.Monad.Identity
+import Data.Data.Lens (biplate)
+import Control.Lens ((^..), traversed, universeOn)
 import Data.List
-import Data.Map (Map)
 import qualified Data.Map as Map
+import           Data.StringMap (StringMap)
+import qualified Data.StringMap as SMap
 
 import Language.Clafer.Common
 import Language.Clafer.Front.Absclafer
@@ -101,10 +107,44 @@
                             cAst :: Maybe Module,
                             cIr :: Maybe (IModule, GEnv, Bool),
                             frags :: [Pos],    -- line numbers of fragment markers
-                            irModuleTrace :: Map Span [Ir],
-                            astModuleTrace :: Map Span [Ast]
+                            astModuleTrace :: Map.Map Span [Ast]  -- can keep the Ast map since it never changes
                             } deriving Show
 
+-- | This simulates a field in the ClaferEnv that will always recompute the map,
+--   since the IR always changes and the map becomes obsolete
+irModuleTrace :: ClaferEnv -> Map.Map Span [Ir]
+irModuleTrace env = traceIrModule $ getIModule $ cIr env
+  where
+    getIModule (Just (imodule, _, _)) = imodule
+    getIModule Nothing                = error "BUG: irModuleTrace: cannot request IR map before desugaring."
+
+-- | This simulates a field in the ClaferEnv that will always recompute the map,
+--   since the IR always changes and the map becomes obsolete
+--   maps from a UID to an IClafer with the given UID
+uidIClaferMap :: ClaferEnv -> StringMap IClafer
+uidIClaferMap env = createUidIClaferMap $ getIModule $ cIr env
+  where
+    getIModule (Just (iModule, _, _)) = iModule
+    getIModule Nothing                = error "BUG: uidIClaferMap: cannot request IClafer map before desugaring."
+
+-- | This simulates a field in the ClaferEnv that will always recompute the map,
+--   since the IR always changes and the map becomes obsolete
+--   maps to an IClafer which is the parent of the clafer with the given UID
+parentIClaferMap :: ClaferEnv -> StringMap IClafer
+parentIClaferMap env = foldl' (\accumMap' claf -> (addChildren accumMap' claf)) SMap.empty allClafers
+  where
+    getIModule (Just (iModule, _, _)) = iModule
+    getIModule Nothing                = error "BUG: parentIClaferMap: cannot request IClafer map before desugaring."
+
+    allClafers :: [ IClafer ]
+    allClafers = universeOn biplate $ getIModule $ cIr env
+
+    addChildren :: StringMap IClafer -> IClafer     -> StringMap IClafer
+    addChildren    accumMap''               parentClafer =
+      -- insert the parentClafer as a value for the uid of each child
+      foldl' (\accumMap''' uid' -> SMap.insert uid' parentClafer accumMap''') accumMap'' (parentClafer ^.. elements.traversed.iClafer.uid)
+
+
 getAst :: (Monad m) => ClaferT m Module
 getAst = do
   env <- getEnv
@@ -119,15 +159,14 @@
     (Just i) -> return i
     _ -> throwErr (ClaferErr "No IR. Did you forget to compile?" :: CErr Span) -- Indicates a bug in the Clafer translator.
 
-makeEnv :: ClaferArgs -> ClaferEnv                                                                            
+makeEnv :: ClaferArgs -> ClaferEnv
 makeEnv args' = ClaferEnv { args = args'',
                            modelFrags = [],
                            cAst = Nothing,
                            cIr = Nothing,
                            frags = [],
-                           irModuleTrace = Map.empty,
                            astModuleTrace = Map.empty}
-               where 
+               where
                   args'' = if (CVLGraph `elem` (mode args') ||
                                Html `elem` (mode args') ||
                                Graph `elem` (mode args'))
@@ -150,22 +189,22 @@
 -- | Generate errors using throwErr/throwErrs:
 data CErr p =
   -- | Generic error
-  ClaferErr {  
+  ClaferErr {
     msg :: String
   } |
   -- | Error generated by the parser
-  ParseErr {   
+  ParseErr {
     -- | Position of the error
-    pos :: p,  
+    pos :: p,
     msg :: String
   } |
   -- | Error generated by semantic analysis
-  SemanticErr { 
+  SemanticErr {
     pos :: p,
     msg :: String
   }
   deriving Show
-  
+
 -- | Clafer keeps track of multiple errors.
 data CErrs p =
   ClaferErrs {errs :: [CErr p]}
@@ -173,10 +212,10 @@
 
 instance Error (CErr p) where
   strMsg = ClaferErr
-  
+
 instance Error (CErrs p) where
   strMsg m = ClaferErrs [strMsg m]
-  
+
 data ErrPos =
   ErrPos {
     -- | The fragment where the error occurred.
@@ -188,8 +227,8 @@
     modelPos :: Pos
   }
   deriving Show
-  
 
+
 -- | The full ErrPos requires lots of information that needs to be consistent. Every time we throw an error,
 -- | we need BOTH the (fragId, fragPos) AND modelPos. This makes it easier for developers using ClaferT so they
 -- | only need to provide part of the information and the rest is automatically calculated. The code using
@@ -225,16 +264,16 @@
     pModelSpan :: Span
   }
   deriving Show
-  
+
 class ClaferErrPos p where
   toErrPos :: Monad m => p -> ClaferT m ErrPos
-  
+
 instance ClaferErrPos Span where
   toErrPos = toErrPos . ErrModelSpan
-  
+
 instance ClaferErrPos ErrPos where
   toErrPos = return . id
-  
+
 instance ClaferErrPos PartialErrPos where
   toErrPos (ErrFragPos frgId frgPos) =
     do
@@ -248,7 +287,7 @@
       let fragSpans = zipWith Span (Pos 1 1 : f) f
       case findFrag modelPos' fragSpans of
         Just (frgId, Span fragStart _) -> return $ ErrPos frgId (modelPos' `minusPos` fragStart) modelPos'
-        Nothing -> error $ show modelPos' ++ " not within any frag spans: " ++ show fragSpans -- Indicates a bug in the Clafer translator
+        Nothing -> return $ ErrPos 1 noPos noPos -- error $ show modelPos' ++ " not within any frag spans: " ++ show fragSpans -- Indicates a bug in the Clafer translator
     where
     findFrag pos'' spans =
       find (inSpan pos'' . snd) (zip [0..] spans)
@@ -256,14 +295,14 @@
 
 class Throwable t where
   toErr :: t -> Monad m => ClaferT m ClaferErr
-  
+
 instance ClaferErrPos p => Throwable (CErr p) where
   toErr (ClaferErr mesg) = return $ ClaferErr mesg
   toErr err =
     do
       pos' <- toErrPos $ pos err
       return $ err{pos = pos'}
-  
+
 -- | Throw many errors.
 throwErrs :: (Monad m, Throwable t) => [t] -> ClaferT m a
 throwErrs throws =
diff --git a/test/Functions.hs b/test/Functions.hs
--- a/test/Functions.hs
+++ b/test/Functions.hs
@@ -38,14 +38,15 @@
 checkClaferExt file' = if ((eman == "")) then False else (txe == "rfc") && (takeWhile (/='.') (tail eman) /= "esd")
 	where (txe, eman) = span (/='.') (reverse file')
 
-				
+
 compileOneFragment :: ClaferArgs -> InputModel -> Either [ClaferErr] (Map.Map ClaferMode CompilerResult)
 compileOneFragment args' model =
- 	runClafer (argsWithOPTIONS args' model) $  
+ 	runClafer (argsWithOPTIONS args' model) $
 		do
 			addModuleFragment model
 			parse
-			compile
+			iModule <- desugar Nothing
+			compile iModule
 			generate
 
 compiledCheck :: Either a b -> Bool
@@ -61,4 +62,4 @@
 fromRight (Left _) = error "Function fromLeft expects argument of the form 'Right b'"
 
 andMap :: (a -> Bool) -> [a] -> Bool
-andMap f lst = and $ map f lst
+andMap f lst = and $ map f lst
diff --git a/test/Suite/Example.hs b/test/Suite/Example.hs
deleted file mode 100644
--- a/test/Suite/Example.hs
+++ /dev/null
@@ -1,110 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
-{-
- Copyright (C) 2013 Luke Brown <http://gsd.uwaterloo.ca>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the "Software"), to deal in
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is furnished to do
- so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
--}
-module Suite.Example (tg_Test_Suite_Example) where
-
-import qualified Data.List as List
-import qualified Data.Map as Map
-import Data.Monoid
-import Control.Monad
-import Language.Clafer
-import Language.Clafer.Css
-import Test.Framework
-import Test.Framework.TH
-import Test.Framework.Providers.HUnit
-import Test.Framework.Providers.QuickCheck2
-import Test.HUnit
-import Test.QuickCheck
-import Language.Clafer.ClaferArgs
-import Control.Monad
-import System.Directory
-import System.IO
-import Functions
-
-tg_Test_Suite_Example = $(testGroupGenerator)
-
-case_1 :: Assertion
-case_1 = assertEqual "for luckynumber" "WIN!" (luckynumber 42)
-
-case_2 :: Assertion
-case_2 =
-	do 
-		let a = luckynumber 7
-		assertEqual "for luckynumber" "WIN!" a
-		let b = (luckynumber 2) == (luckynumber 4)
-		assertBool ("Falied! Lucky number must be either 2 or 4") b
-
-case_3 = assertString "This will always fail :("
-
-prop_4 :: [Int] -> Bool
-prop_4 xs = reverse (reverse xs) == xs
-
-prop_5 :: [Int] -> Property 
-prop_5 xs = (length xs) >= 5 ==> (length (take 5 xs)) == 5 
-	where types = (xs :: [Int])
-
-case_6 :: Assertion
-case_6 = List.sort [1,8,6,5,3,9,0,2,4,10] @?= [0..9]
-
-case_7 = 
-	do
-		False @? "Always fails =("
-		True @? "You will never see this msg =D"
-		[0..9] @=? List.sort [1,8,6,5,3,9,0,2,4,10]
-
-case_8 = assertString ""
-
-prop_9 x = 	x >= 5 ==>
-			x <= 10 ==>
-			luckynumber x == "LOSE!"
-	where types = (x :: Int)
-
-
-case_10 :: Assertion
-case_10 = do 
-	let e1 = fromRight $ fmap claferEnv $ compileOneFragment defaultClaferArgs "A"
-	let e2 = fromRight $ fmap claferEnv $ compileOneFragment defaultClaferArgs "B"
-	assertBool ("This shouldn't fail") (e1 == e1)
-	assertBool ("This should fail") (e1 == e2)
-
-case_11 :: Assertion
-case_11 = do
-			clafers <- positiveClafers
-			getAll (List.foldr (\x -> mappend (All $ x==x)) (All True) clafers) @? "Error in one of clafers"
-
---Example of generator
-newtype ArbitraryClafer = ArbitraryClafer {getModel :: String} deriving Show
-
-instance Arbitrary ArbitraryClafer where
-	arbitrary = do 
-					clafers <- getClafers "positive"
-					clafer <- elements clafers
-					return $ ArbitraryClafer clafer
-
-
-prop_12 :: ArbitraryClafer -> Bool
-prop_12 model = (getModel model) == (getModel model)
-
-
-luckynumber :: Int -> Bool
-luckynumber 7 = True
-luckynumber _ = False
diff --git a/test/Suite/Negative.hs b/test/Suite/Negative.hs
--- a/test/Suite/Negative.hs
+++ b/test/Suite/Negative.hs
@@ -38,17 +38,17 @@
 	return $ filter ((`notElem` crashModels) . fst ) claferModels
 	where
 		crashModels = ["i127-loop.cfr", "i141-constraints.cfr"]
-{-Put models in the list above that completly crash 
+{-Put models in the list above that completly crash
   the compiler, this will avoid crashing the test suite
-  Note: If the model is giving an unexpected error it 
+  Note: If the model is giving an unexpected error it
   should be located in failing/negative not here!-}
 
 case_failTest :: Assertion
-case_failTest = do 
+case_failTest = do
 	claferModels <- negativeClaferModels
-	let compiledClafers = map (\(file', model) -> 
+	let compiledClafers = map (\(file', model) ->
 		(file', compileOneFragment defaultClaferArgs model)) claferModels
-	forM_ compiledClafers (\(file', compiled) -> 
+	forM_ compiledClafers (\(file', compiled) ->
 		when (compiledCheck compiled) $ putStrLn (file' ++ " compiled when it should not have."))
-	(andMap (not . compiledCheck . snd) compiledClafers 
-		@? "test/negative fail: The above clafer models compiled.")
+	(andMap (not . compiledCheck . snd) compiledClafers
+		@? "test/negative fail: The above clafer models compiled.")
diff --git a/test/Suite/Positive.hs b/test/Suite/Positive.hs
--- a/test/Suite/Positive.hs
+++ b/test/Suite/Positive.hs
@@ -36,28 +36,28 @@
 
 tg_Test_Suite_Positive :: TestTree
 tg_Test_Suite_Positive = $(testGroupGenerator)
- 
+
 positiveClaferModels :: IO [(String, String)]
 positiveClaferModels = getClafers "test/positive"
 
 case_compileTest :: Assertion
-case_compileTest = do 
+case_compileTest = do
 	claferModels <- positiveClaferModels
-	let compiledClafers = map (\(file', model) -> 
+	let compiledClafers = map (\(file', model) ->
 		(file', compileOneFragment defaultClaferArgs model)) claferModels
-	forM_ compiledClafers (\(file', compiled) -> 
+	forM_ compiledClafers (\(file', compiled) ->
 		when (not $ compiledCheck compiled) $ putStrLn (file' ++ " Error: " ++ (show $ fromLeft compiled)))
-	(andMap (compiledCheck . snd) compiledClafers 
+	(andMap (compiledCheck . snd) compiledClafers
 		@? "test/positive fail: The above claferModels did not compile.")
 
 case_reference_Unused_Abstract_Clafer :: Assertion
 case_reference_Unused_Abstract_Clafer = do
 	model <- readFile "test/positive/i235.cfr"
-	let compiledClafers = 
+	let compiledClafers =
 		[("None", compileOneFragment defaultClaferArgs{scope_strategy = None} model), ("Simple", compileOneFragment defaultClaferArgs{scope_strategy = Simple} model)]
-	forM_ compiledClafers (\(ss, compiled) -> 
+	forM_ compiledClafers (\(ss, compiled) ->
 		when (not $ compiledCheck compiled) $ putStrLn ("i235.cfr failed for scope_strategy = " ++ ss))
-	(andMap (compiledCheck . snd) compiledClafers 
+	(andMap (compiledCheck . snd) compiledClafers
 		@? "reference_Unused_Abstract_Clafer (i235) failed, error for referencing unused abstract clafer")
 
 case_nonempty_cards :: Assertion
@@ -70,7 +70,7 @@
 	(andMap ((==[]) . foldMapIR isEmptyCard . snd) compiledClafeIrs
 		@? "nonempty card test failed. Files contain empty cardinalities after fully compiling")
 	where
-		getIR (file', (Right (resultMap))) = 
+		getIR (file', (Right (resultMap))) =
 			case Map.lookup Alloy resultMap of
 				Just CompilerResult{claferEnv = ClaferEnv{cIr = Just (iMod, _, _)}} -> [(file', iMod)]
 				_ -> []
@@ -80,5 +80,5 @@
 
 case_stringEqual :: Assertion
 case_stringEqual = do
-	let strMap = stringMap $ fromJust $ Map.lookup Alloy $ fromRight $ compileOneFragment defaultClaferArgs "A\n    text1 : string = \"some text\"\n    text2 : string = \"some text\""
-	(Map.size strMap) == 1 @? "Error: same string assigned to differnet numbers!"
+	let strMap = stringMap $ fromJust $ Map.lookup Alloy $ fromRight $ compileOneFragment defaultClaferArgs "A\n    text1 -> string = \"some text\"\n    text2 -> string = \"some text\""
+	(Map.size strMap) == 1 @? "Error: same string assigned to differnet numbers!"
diff --git a/test/Suite/SimpleScopeAnalyser.hs b/test/Suite/SimpleScopeAnalyser.hs
--- a/test/Suite/SimpleScopeAnalyser.hs
+++ b/test/Suite/SimpleScopeAnalyser.hs
@@ -37,9 +37,9 @@
 
 tg_Test_Suite_SimpleScopeAnalyser :: TestTree
 tg_Test_Suite_SimpleScopeAnalyser = $(testGroupGenerator)
- 
+
 model :: String
-model = unlines 
+model = unlines
 			[ "a 0..0"
 			, "b ?"
 			, "c"
@@ -64,10 +64,18 @@
 			, "abstract F : H"
 			, "f1 : F 2..5"
 			, "    m 0"
+			, "i1 -> integer 2..4"
+			, "i2 ->> integer ?"
+			, "i3 -> integer *"
+			, "i4 ->> integer *"
+			, "s1 -> string 2..*"
+			, "s2 ->> string"
+			, "s3 -> string +"
+			, "s4 ->> string +"
 			]
 
 expectedScopesSet :: M.Map UID Integer
-expectedScopesSet = M.fromList $ [ ("c0_a", 0) 
+expectedScopesSet = M.fromList $ [ ("c0_a", 0)
 							--	 , ("c0_b", 1)	-- uses global scope
 							--	 , ("c0_c", 1)	-- uses global scope
 							--	 , ("c0_d", 1) 	-- uses global scope
@@ -79,24 +87,32 @@
 								 , ("c0_i", 22)
 								 , ("c0_j", 22)
 								 , ("c0_k", 44)
-								 , ("c0_Hs", 16)  -- not sure where the 16 comes from
+								 , ("c0_Hs", 16)
 								 , ("c0_H1", 2)
 								 , ("c0_H12", 4)
 								 , ("c0_H2", 4)
 								 , ("c0_H3", 2)
 								 , ("c0_H4", 5)
-								 , ("c0_Hs2", 16)  -- not sure where the 16 comes from
+								 , ("c0_Hs2", 16)
 								 , ("c0_Hs3", 8)
 								 , ("c0_l", 8)
 								 , ("c0_F", 5)
 								 , ("c0_f1", 5)
 								 , ("c0_m", 0)
+								 , ("c0_i1", 4)
+							--	 , ("c0_i2", 1)	-- uses global scope
+							--	 , ("c0_i3", 1)	-- uses global scope
+							--	 , ("c0_i4", 1)	-- uses global scope
+								 , ("c0_s1", 2)
+							--	 , ("c0_s2", 1)	-- uses global scope
+							--	 , ("c0_s3", 1)	-- uses global scope
+							--	 , ("c0_s4", 1)	-- uses global scope
 								 ]
 
 
 -- aggregates a difference
 aggregateDifference :: UID -> Integer -> Integer -> Maybe String
-aggregateDifference k computedV expectedV = 
+aggregateDifference k computedV expectedV =
 	if computedV == expectedV
 	then Nothing
 	else Just $ k ++ " | computed: " ++ show computedV ++ " | expected: " ++ show expectedV ++ " |"
@@ -104,37 +120,37 @@
 -- prints only computed scopes missing in expected
 onlyComputed :: M.Map UID Integer -> M.Map UID String
 onlyComputed = M.mapWithKey (\k v -> k ++ " | computed: " ++ show v ++ " | no expected |")
-	
 
+
 -- prints only expected scopes missing in computed
 onlyExpected :: M.Map UID Integer -> M.Map UID String
 onlyExpected = M.mapWithKey (\k v -> k ++ " | no computed | expected: " ++ show v ++ " |")
 
 case_ScopeTest :: Assertion
-case_ScopeTest = do 
-	let 
-		-- use simple scope inference 
+case_ScopeTest = do
+	let
+		-- use simple scope inference
 		(Right compilerResultMap) = compileOneFragment defaultClaferArgs model
 		(Just compilerResult) = M.lookup Alloy compilerResultMap
 		computedScopesSet :: M.Map UID Integer
 		computedScopesSet = M.fromList $ scopesList compilerResult
 
-		differences = M.mergeWithKey aggregateDifference onlyComputed onlyExpected computedScopesSet expectedScopesSet  
+		differences = M.mergeWithKey aggregateDifference onlyComputed onlyExpected computedScopesSet expectedScopesSet
 
-	(M.size differences) == 0 @? 
+	(M.size differences) == 0 @?
 		"Computed scopes different from expected:\n" ++ (unlines $ M.foldl (\acc v -> v:acc) [] differences)
 
 
 case_ReadScopesJSON :: Assertion
 case_ReadScopesJSON = do
 	let
-		-- use simple scope inference 
+		-- use simple scope inference
 		(Right compilerResultMap) = compileOneFragment defaultClaferArgs model
 		(Just compilerResult) = M.lookup Alloy compilerResultMap
 		Just (iModule, _, _) = cIr $ claferEnv compilerResult
-		
+
 		qNameMaps = deriveQNameMaps iModule
-		
+
 		computedScopes :: [ (UID, Integer) ]
 		computedScopes = scopesList compilerResult
 
@@ -143,5 +159,5 @@
 
 		differences = M.mergeWithKey aggregateDifference onlyComputed onlyExpected (M.fromList computedScopes) (M.fromList decodedScopes)
 
-	(M.size differences) == 0 @? 
-		"Parsed scopes different from original:\n" ++ (unlines $ M.foldl (\acc v -> v:acc) [] differences)
+	(M.size differences) == 0 @?
+		"Parsed scopes different from original:\n" ++ (unlines $ M.foldl (\acc v -> v:acc) [] differences)
diff --git a/test/test-suite.hs b/test/test-suite.hs
--- a/test/test-suite.hs
+++ b/test/test-suite.hs
@@ -80,7 +80,7 @@
 	[ "c3_b" ] == getUIDs qNameMaps "::d::b"  @? "UID for `::d::b` different from `c3_d`"
 	null ([ "c0_b", "c1_b", "c2_b", "c3_b" ] \\ (getUIDs qNameMaps "b" )) @? "UIDs for `b` different from `c0_b`, `c1_b`, `c2_b`, `c3_b` "
 	null ([ "c2_b", "c3_b" ] \\ (getUIDs qNameMaps "d::b" )) @? "UIDs for `d::b` different from `c2_b`, `c3_b` "
-	null ([ "c0_d", "c1_d" ] \\ (getUIDs qNameMaps "d" )) @? "UIDs for `d` different from `c0_d`, `c1_d` "	
+	null ([ "c0_d", "c1_d" ] \\ (getUIDs qNameMaps "d" )) @? "UIDs for `d` different from `c0_d`, `c1_d` "
 	null (getUIDs qNameMaps "x") @? "UID for `x` different from []"
 	null (getUIDs qNameMaps "::x") @? "UID for `::x` different from []"
 
@@ -91,4 +91,4 @@
 		allClafers :: [ IClafer ]
 		allClafers = universeOn biplate iModule
 		allClafersUids = map _uid allClafers
-	allClafersUids == [ "c0_a", "c0_b", "c1_b", "c0_c", "c0_d", "c2_b", "c1_d", "c3_b"] @? "All clafers\n" ++ show allClafersUids
+	allClafersUids == [ "c0_a", "c0_b", "c1_b", "c0_c", "c0_d", "c2_b", "c1_d", "c3_b"] @? "All clafers\n" ++ show allClafersUids
diff --git a/tools/Makefile b/tools/Makefile
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -11,17 +11,12 @@
 endif
 
 all:
-	@if test ! -f "alloy4.jar"; then \
-		echo "[WARNING] Missing alloy4.jar. Downloading...";  \
-		$(WGET_COMMAND) http://alloy.mit.edu/alloy/downloads/alloy4.jar; \
-	fi
-
 	@if test ! -f "alloy4.2.jar"; then \
 		echo "[WARNING] Missing alloy4.2.jar. Downloading...";  \
 		$(WGET_COMMAND) http://alloy.mit.edu/alloy/downloads/alloy4.2_2014-05-16.jar; \
 		mv alloy4.2_2014-05-16.jar alloy4.2.jar; \
 	fi
 
-	javac -source 1.6 -target 1.6 XsdCheck.java
+	javac  XsdCheck.java
 clean:
-	find . -type f -name '*.class' -print0 | xargs -0 rm -f
+	find . -type f -name '*.class' -print0 | xargs -0 rm -f
diff --git a/tools/XsdCheck.class b/tools/XsdCheck.class
Binary files a/tools/XsdCheck.class and b/tools/XsdCheck.class differ
